Whamcloud - gitweb
partial merge of b_unify into b_devel (20030722_0202)
authorphil <phil>
Tue, 22 Jul 2003 14:05:20 +0000 (14:05 +0000)
committerphil <phil>
Tue, 22 Jul 2003 14:05:20 +0000 (14:05 +0000)
lustre/kernel_patches/patches/2.6.0-test1-mm2.patch [new file with mode: 0644]
lustre/kernel_patches/patches/kexec-2.6.0-full.patch [new file with mode: 0644]
lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch [new file with mode: 0644]
lustre/kernel_patches/patches/vfs_intent_2.6.0-test1.patch [new file with mode: 0644]
lustre/kernel_patches/pc/2.6.0-test1-mm2.pc [new file with mode: 0644]
lustre/kernel_patches/pc/kexec-2.6.0-full.pc [new file with mode: 0644]
lustre/kernel_patches/pc/lkcd-kernel-changes-2.6.0-test1.pc [new file with mode: 0644]
lustre/kernel_patches/pc/vfs_intent_2.6.0-test1.pc [new file with mode: 0644]
lustre/kernel_patches/series/kgdb_2.6.0_test1 [new file with mode: 0644]

diff --git a/lustre/kernel_patches/patches/2.6.0-test1-mm2.patch b/lustre/kernel_patches/patches/2.6.0-test1-mm2.patch
new file mode 100644 (file)
index 0000000..9f476e0
--- /dev/null
@@ -0,0 +1,179799 @@
+--- linux-2.6.0-test1/arch/alpha/kernel/irq.c  2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/alpha/kernel/irq.c 2003-07-19 17:03:49.000000000 -0700
+@@ -601,7 +601,7 @@ handle_irq(int irq, struct pt_regs * reg
+       if ((unsigned) irq > ACTUAL_NR_IRQS && illegal_count < MAX_ILLEGAL_IRQS ) {
+               irq_err_count++;
+               illegal_count++;
+-              printk(KERN_CRIT "device_interrupt: illegal interrupt %d\n",
++              printk(KERN_CRIT "device_interrupt: invalid interrupt %d\n",
+                      irq);
+               return;
+       }
+--- linux-2.6.0-test1/arch/alpha/kernel/smp.c  2003-06-14 12:18:05.000000000 -0700
++++ 25/arch/alpha/kernel/smp.c 2003-07-19 17:04:06.000000000 -0700
+@@ -71,7 +71,7 @@ static int smp_secondary_alive __initdat
+ /* Which cpus ids came online.  */
+ unsigned long cpu_present_mask;
+-volatile unsigned long cpu_online_map;
++cpumask_t cpu_online_map;
+ /* cpus reported in the hwrpb */
+ static unsigned long hwrpb_cpu_present_mask __initdata = 0;
+@@ -132,7 +132,7 @@ smp_callin(void)
+ {
+       int cpuid = hard_smp_processor_id();
+-      if (test_and_set_bit(cpuid, &cpu_online_map)) {
++      if (cpu_test_and_set(cpuid, cpu_online_map)) {
+               printk("??, cpu 0x%x already present??\n", cpuid);
+               BUG();
+       }
+@@ -575,8 +575,8 @@ smp_prepare_boot_cpu(void)
+       /*
+        * Mark the boot cpu (current cpu) as both present and online
+        */ 
+-      set_bit(smp_processor_id(), &cpu_present_mask);
+-      set_bit(smp_processor_id(), &cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_present_mask);
++      cpu_set(smp_processor_id(), cpu_online_map);
+ }
+ int __devinit
+--- linux-2.6.0-test1/arch/alpha/mm/init.c     2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/alpha/mm/init.c    2003-07-19 17:03:49.000000000 -0700
+@@ -20,9 +20,6 @@
+ #include <linux/init.h>
+ #include <linux/bootmem.h> /* max_low_pfn */
+ #include <linux/vmalloc.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+-#endif
+ #include <asm/system.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/arch/alpha/mm/remap.c    2003-06-14 12:17:56.000000000 -0700
++++ 25/arch/alpha/mm/remap.c   2003-07-19 17:07:16.000000000 -0700
+@@ -73,7 +73,7 @@ __alpha_remap_area_pages(unsigned long a
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(&init_mm, dir, address);
++              pmd = pmd_alloc_kernel(&init_mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+--- linux-2.6.0-test1/arch/arm26/kernel/setup.c        2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/arm26/kernel/setup.c       2003-07-19 17:03:49.000000000 -0700
+@@ -14,7 +14,7 @@
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+ #include <linux/utsname.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/console.h>
+ #include <linux/bootmem.h>
+ #include <linux/seq_file.h>
+--- linux-2.6.0-test1/arch/arm26/mm/init.c     2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/arm26/mm/init.c    2003-07-19 17:03:49.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <linux/init.h>
+ #include <linux/initrd.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/segment.h>
+ #include <asm/mach-types.h>
+--- linux-2.6.0-test1/arch/arm26/mm/mm-memc.c  2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/arm26/mm/mm-memc.c 2003-07-19 17:07:16.000000000 -0700
+@@ -79,7 +79,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+               goto no_pgd;
+       /*
+-       * This lock is here just to satisfy pmd_alloc and pte_lock
++       * This lock is here just to satisfy pmd_alloc_kernel() and pte_lock
+          * FIXME: I bet we could avoid taking it pretty much altogether
+        */
+       spin_lock(&mm->page_table_lock);
+@@ -88,7 +88,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+        * On ARM, first page must always be allocated since it contains
+        * the machine vectors.
+        */
+-      new_pmd = pmd_alloc(mm, new_pgd, 0);
++      new_pmd = pmd_alloc_kernel(mm, new_pgd, 0);
+       if (!new_pmd)
+               goto no_pmd;
+--- linux-2.6.0-test1/arch/arm/mach-arc/mm.c   2003-06-14 12:18:08.000000000 -0700
++++ 25/arch/arm/mach-arc/mm.c  2003-07-19 17:07:16.000000000 -0700
+@@ -66,7 +66,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+               goto no_pgd;
+       /*
+-       * This lock is here just to satisfy pmd_alloc and pte_lock
++       * This lock is here just to satisfy pmd_alloc_map() and pte_lock
+        */
+       spin_lock(&mm->page_table_lock);
+@@ -74,13 +74,15 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+        * On ARM, first page must always be allocated since it contains
+        * the machine vectors.
+        */
+-      new_pmd = pmd_alloc(mm, new_pgd, 0);
++      new_pmd = pmd_alloc_map(mm, new_pgd, 0);
+       if (!new_pmd)
+               goto no_pmd;
+-      new_pte = pte_alloc_map(mm, new_pmd, 0);
+-      if (!new_pte)
++      new_pte = pte_alloc_map(mm, new_pgd, &new_pmd, 0);
++      if (!new_pte) {
++              pmd_unmap(new_pmd);
+               goto no_pte;
++      }
+       init_pgd = pgd_offset_k(0);
+       init_pmd = pmd_offset(init_pgd, 0);
+@@ -88,6 +90,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+       set_pte(new_pte, *init_pte);
+       pte_unmap_nested(init_pte);
+       pte_unmap(new_pte);
++      pmd_unmap(new_pmd);
+       /*
+        * most of the page table entries are zeroed
+--- linux-2.6.0-test1/arch/arm/mach-clps711x/autcpu12.c        2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/arm/mach-clps711x/autcpu12.c       2003-07-19 17:03:49.000000000 -0700
+@@ -21,7 +21,6 @@
+ #include <linux/init.h>
+ #include <linux/types.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/mm.h>
+ #include <asm/hardware.h>
+--- linux-2.6.0-test1/arch/arm/mm/consistent.c 2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/arm/mm/consistent.c        2003-07-19 17:07:16.000000000 -0700
+@@ -325,7 +325,7 @@ static int __init consistent_init(void)
+       do {
+               pgd = pgd_offset(&init_mm, CONSISTENT_BASE);
+-              pmd = pmd_alloc(&init_mm, pgd, CONSISTENT_BASE);
++              pmd = pmd_alloc_kernel(&init_mm, pgd, CONSISTENT_BASE);
+               if (!pmd) {
+                       printk(KERN_ERR "consistent_init: out of pmd tables\n");
+                       return -ENOMEM;
+--- linux-2.6.0-test1/arch/arm/mm/ioremap.c    2003-06-14 12:18:24.000000000 -0700
++++ 25/arch/arm/mm/ioremap.c   2003-07-19 17:07:16.000000000 -0700
+@@ -95,7 +95,7 @@ static int remap_area_pages(unsigned lon
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(&init_mm, dir, address);
++              pmd = pmd_alloc_kernel(&init_mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+--- linux-2.6.0-test1/arch/arm/mm/minicache.c  2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/arm/mm/minicache.c 2003-07-19 17:07:16.000000000 -0700
+@@ -57,7 +57,7 @@ static int __init minicache_init(void)
+       pmd_t *pmd;
+       pgd = pgd_offset_k(minicache_address);
+-      pmd = pmd_alloc(&init_mm, pgd, minicache_address);
++      pmd = pmd_alloc_kernel(&init_mm, pgd, minicache_address);
+       if (!pmd)
+               BUG();
+       minicache_pte = pte_alloc_kernel(&init_mm, pmd, minicache_address);
+--- linux-2.6.0-test1/arch/arm/mm/mm-armv.c    2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/arm/mm/mm-armv.c   2003-07-19 17:07:16.000000000 -0700
+@@ -131,7 +131,7 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+       if (vectors_base() == 0) {
+               /*
+-               * This lock is here just to satisfy pmd_alloc and pte_lock
++               * This lock is here just to satisfy pmd_alloc_map() and pte_lock
+                */
+               spin_lock(&mm->page_table_lock);
+@@ -139,20 +139,22 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
+                * On ARM, first page must always be allocated since it
+                * contains the machine vectors.
+                */
+-              new_pmd = pmd_alloc(mm, new_pgd, 0);
++              new_pmd = pmd_alloc_map(mm, new_pgd, 0);
+               if (!new_pmd)
+                       goto no_pmd;
+-              new_pte = pte_alloc_map(mm, new_pmd, 0);
+-              if (!new_pte)
++              new_pte = pte_alloc_map(mm, new_pgd, &new_pmd, 0);
++              if (!new_pte) {
++                      pmd_unmap(new_pmd);
+                       goto no_pte;
++              }
+               init_pmd = pmd_offset(init_pgd, 0);
+               init_pte = pte_offset_map_nested(init_pmd, 0);
+               set_pte(new_pte, *init_pte);
+               pte_unmap_nested(init_pte);
+               pte_unmap(new_pte);
+-
++              pmd_unmap(new_pmd);
+               spin_unlock(&mm->page_table_lock);
+       }
+--- linux-2.6.0-test1/arch/cris/mm/ioremap.c   2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/cris/mm/ioremap.c  2003-07-19 17:07:16.000000000 -0700
+@@ -78,7 +78,7 @@ static int remap_area_pages(unsigned lon
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(&init_mm, dir, address);
++              pmd = pmd_alloc_kernel(&init_mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+--- linux-2.6.0-test1/arch/h8300/kernel/setup.c        2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/h8300/kernel/setup.c       2003-07-19 17:03:49.000000000 -0700
+@@ -35,7 +35,6 @@
+ #include <asm/irq.h>
+ #ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+ #include <asm/pgtable.h>
+ #endif
+--- linux-2.6.0-test1/arch/h8300/mm/init.c     2003-06-14 12:18:21.000000000 -0700
++++ 25/arch/h8300/mm/init.c    2003-07-19 17:03:49.000000000 -0700
+@@ -23,9 +23,6 @@
+ #include <linux/errno.h>
+ #include <linux/string.h>
+ #include <linux/types.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <linux/ptrace.h>
+ #include <linux/mman.h>
+ #include <linux/mm.h>
+--- linux-2.6.0-test1/arch/i386/Kconfig        2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/i386/Kconfig       2003-07-19 17:07:16.000000000 -0700
+@@ -438,9 +438,9 @@ config SMP
+         If you don't know what to do here, say N.
+ config NR_CPUS
+-      int "Maximum number of CPUs (2-32)"
++      int "Maximum number of CPUs (2-255)"
+       depends on SMP
+-      default "32"
++      default "8"
+       help
+         This allows you to specify the maximum number of CPUs which this
+         kernel will support.  The maximum supported value is 32 and the
+@@ -723,6 +723,16 @@ config HIGHPTE
+         low memory.  Setting this option will put user-space page table
+         entries in high memory.
++config HIGHPMD
++      bool "Allocate 2nd-level pagetables from highmem"
++      depends on HIGHMEM64G && HIGHPTE
++      help
++        The VM uses one lowmem-allocated pmd entry for each pagetable
++        page of physical memory allocated, and preallocates them all
++        for 12KB of per-process lowmem overhead. For systems with
++        extreme amounts of highmem, this cannot be tolerated. Setting
++        this option will put userspace 2nd-level pagetables in highmem.
++
+ config MATH_EMULATION
+       bool "Math emulation"
+       ---help---
+@@ -1347,6 +1357,15 @@ config DEBUG_PAGEALLOC
+         This results in a large slowdown, but helps to find certain types
+         of memory corruptions.
++config SPINLINE
++      bool "Spinlock inlining"
++      depends on DEBUG_KERNEL
++      help
++        This will change spinlocks from out of line to inline, making them
++        account cost to the callers in readprofile, rather than the lock
++        itself (as ".text.lock.filename"). This can be helpful for finding
++        the callers of locks.
++
+ config DEBUG_HIGHMEM
+       bool "Highmem debugging"
+       depends on DEBUG_KERNEL && HIGHMEM
+@@ -1354,20 +1373,207 @@ config DEBUG_HIGHMEM
+         This options enables addition error checking for high memory systems.
+         Disable for production systems.
++config LOCKMETER
++      bool "Kernel lock metering"
++      depends on SMP && !PREEMPT
++      help
++        Say Y to enable kernel lock metering, which adds overhead to SMP locks,
++        but allows you to see various statistics using the lockstat command.
++
+ config DEBUG_SPINLOCK_SLEEP
+       bool "Sleep-inside-spinlock checking"
+       help
+         If you say Y here, various routines which may sleep will become very
+         noisy if they are called with a spinlock held.        
++config KGDB
++      bool "Include kgdb kernel debugger"
++      depends on DEBUG_KERNEL
++      help  
++        If you say Y here, the system will be compiled with the debug
++        option (-g) and a debugging stub will be included in the
++        kernel.  This stub communicates with gdb on another (host)
++        computer via a serial port.  The host computer should have
++        access to the kernel binary file (vmlinux) and a serial port
++        that is connected to the target machine.  Gdb can be made to
++        configure the serial port or you can use stty and setserial to
++        do this. See the 'target' command in gdb. This option also
++        configures in the ability to request a breakpoint early in the
++        boot process.  To request the breakpoint just include 'kgdb'
++        as a boot option when booting the target machine.  The system
++        will then break as soon as it looks at the boot options.  This
++        option also installs a breakpoint in panic and sends any
++        kernel faults to the debugger. For more information see the
++        Documentation/i386/kgdb.txt file.
++
++choice
++      depends on KGDB
++      prompt "Debug serial port BAUD" 
++      default KGDB_115200BAUD
++      help  
++        Gdb and the kernel stub need to agree on the baud rate to be
++        used.  Some systems (x86 family at this writing) allow this to
++        be configured.
++
++config KGDB_9600BAUD
++      bool "9600"
++
++config KGDB_19200BAUD
++      bool "19200"
++
++config KGDB_38400BAUD
++      bool "38400"
++
++config KGDB_57600BAUD
++      bool "57600"
++
++config KGDB_115200BAUD
++      bool "115200"
++endchoice
++
++config KGDB_PORT
++      hex "hex I/O port address of the debug serial port"
++      depends on KGDB
++      default  3f8
++      help  
++        Some systems (x86 family at this writing) allow the port
++        address to be configured.  The number entered is assumed to be
++        hex, don't put 0x in front of it.  The standard address are:
++        COM1 3f8 , irq 4 and COM2 2f8 irq 3.  Setserial /dev/ttySx
++        will tell you what you have.  It is good to test the serial
++        connection with a live system before trying to debug.
++
++config KGDB_IRQ
++      int "IRQ of the debug serial port"
++      depends on KGDB
++      default 4
++      help  
++        This is the irq for the debug port.  If everything is working
++        correctly and the kernel has interrupts on a control C to the
++        port should cause a break into the kernel debug stub.
++
++config DEBUG_INFO
++      bool
++      default y
++
++config KGDB_MORE
++      bool "Add any additional compile options"
++      depends on KGDB
++      default n
++      help  
++        Saying yes here turns on the ability to enter additional
++        compile options.
++
++
++config KGDB_OPTIONS
++      depends on KGDB_MORE
++      string "Additional compile arguments"
++      default "-O1"
++      help  
++        This option allows you enter additional compile options for
++        the whole kernel compile.  Each platform will have a default
++        that seems right for it.  For example on PPC "-ggdb -O1", and
++        for i386 "-O1".  Note that by configuring KGDB "-g" is already
++        turned on.  In addition, on i386 platforms
++        "-fomit-frame-pointer" is deleted from the standard compile
++        options.
++
++config NO_KGDB_CPUS
++      int "Number of CPUs"
++      depends on KGDB && SMP
++      default NR_CPUS
++      help
++        
++        This option sets the number of cpus for kgdb ONLY.  It is used
++        to prune some internal structures so they look "nice" when
++        displayed with gdb.  This is to overcome possibly larger
++        numbers that may have been entered above.  Enter the real
++        number to get nice clean kgdb_info displays.
++
++config KGDB_TS
++      bool "Enable kgdb time stamp macros?"
++      depends on KGDB
++      default n
++      help      
++        Kgdb event macros allow you to instrument your code with calls
++        to the kgdb event recording function.  The event log may be
++        examined with gdb at a break point.  Turning on this
++        capability also allows you to choose how many events to
++        keep. Kgdb always keeps the lastest events.
++
++choice 
++      depends on KGDB_TS
++      prompt "Max number of time stamps to save?"
++      default KGDB_TS_128
++
++config KGDB_TS_64
++      bool "64"
++
++config KGDB_TS_128
++      bool "128"
++
++config KGDB_TS_256
++      bool "256"
++
++config KGDB_TS_512
++      bool "512"
++
++config KGDB_TS_1024
++      bool "1024"
++
++endchoice
++
++config STACK_OVERFLOW_TEST
++      bool "Turn on kernel stack overflow testing?"
++      depends on KGDB
++      default n
++      help  
++        This option enables code in the front line interrupt handlers
++        to check for kernel stack overflow on interrupts and system
++        calls.  This is part of the kgdb code on x86 systems.
++
++config KGDB_CONSOLE
++      bool "Enable serial console thru kgdb port"
++      depends on KGDB
++      default n
++      help
++        This option enables the command line "console=kgdb" option.
++        When the system is booted with this option in the command line
++        all kernel printk output is sent to gdb (as well as to other
++        consoles).  For this to work gdb must be connected.  For this
++        reason, this command line option will generate a breakpoint if
++        gdb has not yet connected.  After the gdb continue command is
++        given all pent up console output will be printed by gdb on the
++        host machine.  Neither this option, nor KGDB require the
++        serial driver to be configured.
++
++config KGDB_SYSRQ
++      bool "Turn on SysRq 'G' command to do a break?"
++      depends on KGDB
++      default y
++      help
++        This option includes an option in the SysRq code that allows
++        you to enter SysRq G which generates a breakpoint to the KGDB
++        stub.  This will work if the keyboard is alive and can
++        interrupt the system.  Because of constraints on when the
++        serial port interrupt can be enabled, this code may allow you
++        to interrupt the system before the serial port control C is
++        available.  Just say yes here.
++
+ config FRAME_POINTER
+       bool "Compile the kernel with frame pointers"
++      default KGDB
+       help
+         If you say Y here the resulting kernel image will be slightly larger
+         and slower, but it will give very useful debugging information.
+         If you don't debug the kernel, you can say N, but we may not be able
+         to solve problems without frame pointers.
++config MAGIC_SYSRQ
++      bool
++      depends on KGDB_SYSRQ
++      default y
++
+ config X86_EXTRA_IRQS
+       bool
+       depends on X86_LOCAL_APIC || X86_VOYAGER
+--- linux-2.6.0-test1/arch/i386/kernel/apic.c  2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/apic.c 2003-07-19 17:04:06.000000000 -0700
+@@ -1137,7 +1137,7 @@ int __init APIC_init_uniprocessor (void)
+       connect_bsp_APIC();
+-      phys_cpu_present_map = 1 << boot_cpu_physical_apicid;
++      phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
+       setup_local_APIC();
+--- linux-2.6.0-test1/arch/i386/kernel/apm.c   2003-06-14 12:17:57.000000000 -0700
++++ 25/arch/i386/kernel/apm.c  2003-07-19 17:04:06.000000000 -0700
+@@ -508,16 +508,16 @@ static void apm_error(char *str, int err
+  
+ #ifdef CONFIG_SMP
+-static unsigned long apm_save_cpus(void)
++static cpumask_t apm_save_cpus(void)
+ {
+-      unsigned long x = current->cpus_allowed;
++      cpumask_t x = current->cpus_allowed;
+       /* Some bioses don't like being called from CPU != 0 */
+-      set_cpus_allowed(current, 1UL << 0);
++      set_cpus_allowed(current, cpumask_of_cpu(0));
+       BUG_ON(smp_processor_id() != 0);
+       return x;
+ }
+-static inline void apm_restore_cpus(unsigned long mask)
++static inline void apm_restore_cpus(cpumask_t mask)
+ {
+       set_cpus_allowed(current, mask);
+ }
+@@ -528,7 +528,7 @@ static inline void apm_restore_cpus(unsi
+  *    No CPU lockdown needed on a uniprocessor
+  */
+  
+-#define apm_save_cpus()       0
++#define apm_save_cpus()               (current->cpus_allowed)
+ #define apm_restore_cpus(x)   (void)(x)
+ #endif
+@@ -593,7 +593,7 @@ static u8 apm_bios_call(u32 func, u32 eb
+ {
+       APM_DECL_SEGS
+       unsigned long           flags;
+-      unsigned long           cpus;
++      cpumask_t               cpus;
+       int                     cpu;
+       struct desc_struct      save_desc_40;
+@@ -635,7 +635,7 @@ static u8 apm_bios_call_simple(u32 func,
+       u8                      error;
+       APM_DECL_SEGS
+       unsigned long           flags;
+-      unsigned long           cpus;
++      cpumask_t               cpus;
+       int                     cpu;
+       struct desc_struct      save_desc_40;
+@@ -913,7 +913,7 @@ static void apm_power_off(void)
+        */
+ #ifdef CONFIG_SMP
+       /* Some bioses don't like being called from CPU != 0 */
+-      set_cpus_allowed(current, 1UL << 0);
++      set_cpus_allowed(current, cpumask_of_cpu(0));
+       BUG_ON(smp_processor_id() != 0);
+ #endif
+       if (apm_info.realmode_power_off)
+@@ -1704,7 +1704,7 @@ static int apm(void *unused)
+        * Some bioses don't like being called from CPU != 0.
+        * Method suggested by Ingo Molnar.
+        */
+-      set_cpus_allowed(current, 1UL << 0);
++      set_cpus_allowed(current, cpumask_of_cpu(0));
+       BUG_ON(smp_processor_id() != 0);
+ #endif
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c       2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c      2003-07-19 17:04:06.000000000 -0700
+@@ -53,10 +53,9 @@ static int stock_freq;
+ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
+ {
+       u32 l, h;
+-      unsigned long cpus_allowed;
++      cpumask_t cpus_allowed, affected_cpu_map;
+       struct cpufreq_freqs freqs;
+       int hyperthreading = 0;
+-      int affected_cpu_map = 0;
+       int sibling = 0;
+       if (!cpu_online(cpu) || (newstate > DC_DISABLE) || 
+@@ -67,16 +66,16 @@ static int cpufreq_p4_setdc(unsigned int
+       cpus_allowed = current->cpus_allowed;
+       /* only run on CPU to be set, or on its sibling */
+-      affected_cpu_map = 1 << cpu;
++       affected_cpu_map = cpumask_of_cpu(cpu);
+ #ifdef CONFIG_X86_HT
+       hyperthreading = ((cpu_has_ht) && (smp_num_siblings == 2));
+       if (hyperthreading) {
+               sibling = cpu_sibling_map[cpu];
+-              affected_cpu_map |= (1 << sibling);
++                cpu_set(sibling, affected_cpu_map);
+       }
+ #endif
+       set_cpus_allowed(current, affected_cpu_map);
+-      BUG_ON(!(affected_cpu_map & (1 << smp_processor_id())));
++        BUG_ON(!cpu_isset(smp_processor_id(), affected_cpu_map));
+       /* get current state */
+       rdmsr(MSR_IA32_THERM_CONTROL, l, h);
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c        2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c       2003-07-19 17:05:02.000000000 -0700
+@@ -156,14 +156,15 @@ static struct cpufreq_frequency_table op
+ };
+ #undef OP
+-#define CPU(max)      \
+-      { "Intel(R) Pentium(R) M processor " #max "MHz", (max)*1000, op_##max }
++#define _CPU(max, name)       \
++      { "Intel(R) Pentium(R) M processor " name "MHz", (max)*1000, op_##max }
++#define CPU(max)      _CPU(max, #max)
+ /* CPU models, their operating frequency range, and freq/voltage
+    operating points */
+ static const struct cpu_model models[] = 
+ {
+-      CPU( 900),
++       _CPU( 900, " 900"),
+       CPU(1100),
+       CPU(1200),
+       CPU(1300),
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c     2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c    2003-07-19 17:08:59.000000000 -0700
+@@ -77,15 +77,17 @@ static void speedstep_set_state (unsigne
+       u8                      value;
+       unsigned long           flags;
+       struct cpufreq_freqs    freqs;
++      int                     newfreq;
+       if (!speedstep_chipset_dev || (state > 0x1))
+               return;
+       freqs.old = speedstep_get_processor_frequency(speedstep_processor);
+-      freqs.new = speedstep_freqs[SPEEDSTEP_LOW].frequency;
++      freqs.new = speedstep_freqs[state].frequency;
+       freqs.cpu = 0; /* speedstep.c is UP only driver */
+       
+-      if (notify)
++      /* make sure we've initialized before calling notify */
++      if (notify && (freqs.new != 0))
+               cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+       /* get PMBASE */
+@@ -136,13 +138,16 @@ static void speedstep_set_state (unsigne
+       dprintk(KERN_DEBUG "cpufreq: read at pmbase 0x%x + 0x50 returned 0x%x\n", pmbase, value);
++      /* freqs.new may not be set yet - need local copy */
++      newfreq = speedstep_get_processor_frequency(speedstep_processor);
+       if (state == (value & 0x1)) {
+-              dprintk (KERN_INFO "cpufreq: change to %u MHz succeeded\n", (freqs.new / 1000));
++              dprintk (KERN_INFO "cpufreq: change to %u MHz succeeded\n", (newfreq / 1000));
+       } else {
+               printk (KERN_ERR "cpufreq: change failed - I/O error\n");
+       }
+-      if (notify)
++      /* Make sure we're initialized before calling notify */
++      if (notify && (freqs.new != 0))
+               cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+       return;
+@@ -295,7 +300,7 @@ static int speedstep_cpu_init(struct cpu
+               return -EIO;
+       dprintk(KERN_INFO "cpufreq: currently at %s speed setting - %i MHz\n", 
+-              (speed == speedstep_low_freq) ? "low" : "high",
++              (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high",
+               (speed / 1000));
+       /* cpuinfo and default policy values */
+--- linux-2.6.0-test1/arch/i386/kernel/cpuid.c 2003-06-14 12:17:55.000000000 -0700
++++ 25/arch/i386/kernel/cpuid.c        2003-07-19 17:04:06.000000000 -0700
+@@ -136,7 +136,7 @@ static int cpuid_open(struct inode *inod
+   int cpu = minor(file->f_dentry->d_inode->i_rdev);
+   struct cpuinfo_x86 *c = &(cpu_data)[cpu];
+-  if ( !(cpu_online_map & (1UL << cpu)) )
++  if (!cpu_online(cpu))
+     return -ENXIO;            /* No such CPU */
+   if ( c->cpuid_level < 0 )
+     return -EIO;              /* CPUID not supported */
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/mtrr/cyrix.c        2003-06-14 12:18:22.000000000 -0700
++++ 25/arch/i386/kernel/cpu/mtrr/cyrix.c       2003-07-19 17:03:49.000000000 -0700
+@@ -330,16 +330,16 @@ cyrix_arr_init(void)
+       set_mtrr_done(&ctxt);   /* flush cache and disable MAPEN */
+       if (ccrc[5])
+-              printk("mtrr: ARR usage was not enabled, enabled manually\n");
++              printk(KERN_INFO "mtrr: ARR usage was not enabled, enabled manually\n");
+       if (ccrc[3])
+-              printk("mtrr: ARR3 cannot be changed\n");
++              printk(KERN_INFO "mtrr: ARR3 cannot be changed\n");
+ /*
+     if ( ccrc[1] & 0x80) printk ("mtrr: SMM memory access through ARR3 disabled\n");
+     if ( ccrc[1] & 0x04) printk ("mtrr: SMM memory access disabled\n");
+     if ( ccrc[1] & 0x02) printk ("mtrr: SMM mode disabled\n");
+ */
+       if (ccrc[6])
+-              printk("mtrr: ARR3 was write protected, unprotected\n");
++              printk(KERN_INFO "mtrr: ARR3 was write protected, unprotected\n");
+ }
+ static struct mtrr_ops cyrix_mtrr_ops = {
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/mtrr/main.c 2003-06-26 22:07:22.000000000 -0700
++++ 25/arch/i386/kernel/cpu/mtrr/main.c        2003-07-19 17:04:57.000000000 -0700
+@@ -64,7 +64,7 @@ __initdata char *mtrr_if_name[] = {
+ static void set_mtrr(unsigned int reg, unsigned long base,
+                    unsigned long size, mtrr_type type);
+-static unsigned int arr3_protected;
++extern int arr3_protected;
+ void set_mtrr_ops(struct mtrr_ops * ops)
+ {
+@@ -75,23 +75,25 @@ void set_mtrr_ops(struct mtrr_ops * ops)
+ /*  Returns non-zero if we have the write-combining memory type  */
+ static int have_wrcomb(void)
+ {
+-      struct pci_dev *dev = NULL;
+-
+-      /* WTF is this?
+-       * Someone, please shoot me.
+-       */
+-
+-      /* ServerWorks LE chipsets have problems with write-combining 
+-         Don't allow it and leave room for other chipsets to be tagged */
+-
++      struct pci_dev *dev;
++      
+       if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) {
+-              if ((dev->vendor == PCI_VENDOR_ID_SERVERWORKS) &&
+-                  (dev->device == PCI_DEVICE_ID_SERVERWORKS_LE)) {
+-                      printk(KERN_INFO
+-                             "mtrr: Serverworks LE detected. Write-combining disabled.\n");
++              /* ServerWorks LE chipsets have problems with write-combining 
++                 Don't allow it and leave room for other chipsets to be tagged */
++              if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
++                  dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) {
++                      printk(KERN_INFO "mtrr: Serverworks LE detected. Write-combining disabled.\n");
+                       return 0;
+               }
+-      }
++              /* Intel 450NX errata # 23. Non ascending cachline evictions to
++                 write combining memory may resulting in data corruption */
++              if (dev->vendor == PCI_VENDOR_ID_INTEL &&
++                  dev->device == PCI_DEVICE_ID_INTEL_82451NX)
++              {
++                      printk(KERN_INFO "mtrr: Intel 450NX MMC detected. Write-combining disabled.\n");
++                      return 0;
++              }
++      }               
+       return (mtrr_if->have_wrcomb ? mtrr_if->have_wrcomb() : 0);
+ }
+@@ -121,7 +123,7 @@ static void init_table(void)
+       max = num_var_ranges;
+       if ((usage_table = kmalloc(max * sizeof *usage_table, GFP_KERNEL))
+           == NULL) {
+-              printk("mtrr: could not allocate\n");
++              printk(KERN_ERR "mtrr: could not allocate\n");
+               return;
+       }
+       for (i = 0; i < max; i++)
+@@ -310,7 +312,7 @@ int mtrr_add_page(unsigned long base, un
+               return error;
+       if (type >= MTRR_NUM_TYPES) {
+-              printk("mtrr: type: %u illegal\n", type);
++              printk(KERN_WARNING "mtrr: type: %u invalid\n", type);
+               return -EINVAL;
+       }
+@@ -322,7 +324,7 @@ int mtrr_add_page(unsigned long base, un
+       }
+       if (base & size_or_mask || size & size_or_mask) {
+-              printk("mtrr: base or size exceeds the MTRR width\n");
++              printk(KERN_WARNING "mtrr: base or size exceeds the MTRR width\n");
+               return -EINVAL;
+       }
+@@ -348,7 +350,7 @@ int mtrr_add_page(unsigned long base, un
+               if (ltype != type) {
+                       if (type == MTRR_TYPE_UNCACHABLE)
+                               continue;
+-                      printk ("mtrr: type mismatch for %lx000,%lx000 old: %s new: %s\n",
++                      printk (KERN_WARNING "mtrr: type mismatch for %lx000,%lx000 old: %s new: %s\n",
+                            base, size, attrib_to_str(ltype),
+                            attrib_to_str(type));
+                       goto out;
+@@ -364,7 +366,7 @@ int mtrr_add_page(unsigned long base, un
+               set_mtrr(i, base, size, type);
+               usage_table[i] = 1;
+       } else
+-              printk("mtrr: no more MTRRs available\n");
++              printk(KERN_INFO "mtrr: no more MTRRs available\n");
+       error = i;
+  out:
+       up(&main_lock);
+@@ -412,8 +414,8 @@ mtrr_add(unsigned long base, unsigned lo
+        char increment)
+ {
+       if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
+-              printk("mtrr: size and base must be multiples of 4 kiB\n");
+-              printk("mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
++              printk(KERN_WARNING "mtrr: size and base must be multiples of 4 kiB\n");
++              printk(KERN_DEBUG "mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
+               return -EINVAL;
+       }
+       return mtrr_add_page(base >> PAGE_SHIFT, size >> PAGE_SHIFT, type,
+@@ -458,28 +460,28 @@ int mtrr_del_page(int reg, unsigned long
+                       }
+               }
+               if (reg < 0) {
+-                      printk("mtrr: no MTRR for %lx000,%lx000 found\n", base,
++                      printk(KERN_DEBUG "mtrr: no MTRR for %lx000,%lx000 found\n", base,
+                              size);
+                       goto out;
+               }
+       }
+       if (reg >= max) {
+-              printk("mtrr: register: %d too big\n", reg);
++              printk(KERN_WARNING "mtrr: register: %d too big\n", reg);
+               goto out;
+       }
+       if (is_cpu(CYRIX) && !use_intel()) {
+               if ((reg == 3) && arr3_protected) {
+-                      printk("mtrr: ARR3 cannot be changed\n");
++                      printk(KERN_WARNING "mtrr: ARR3 cannot be changed\n");
+                       goto out;
+               }
+       }
+       mtrr_if->get(reg, &lbase, &lsize, &ltype);
+       if (lsize < 1) {
+-              printk("mtrr: MTRR %d not used\n", reg);
++              printk(KERN_WARNING "mtrr: MTRR %d not used\n", reg);
+               goto out;
+       }
+       if (usage_table[reg] < 1) {
+-              printk("mtrr: reg: %d has count=0\n", reg);
++              printk(KERN_WARNING "mtrr: reg: %d has count=0\n", reg);
+               goto out;
+       }
+       if (--usage_table[reg] < 1)
+@@ -508,8 +510,8 @@ int
+ mtrr_del(int reg, unsigned long base, unsigned long size)
+ {
+       if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
+-              printk("mtrr: size and base must be multiples of 4 kiB\n");
+-              printk("mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
++              printk(KERN_INFO "mtrr: size and base must be multiples of 4 kiB\n");
++              printk(KERN_DEBUG "mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
+               return -EINVAL;
+       }
+       return mtrr_del_page(reg, base >> PAGE_SHIFT, size >> PAGE_SHIFT);
+@@ -677,7 +679,7 @@ static int __init mtrr_init(void)
+                       break;
+               }
+       }
+-      printk("mtrr: v%s\n",MTRR_VERSION);
++      printk(KERN_INFO "mtrr: v%s\n",MTRR_VERSION);
+       if (mtrr_if) {
+               set_num_var_ranges();
+@@ -701,5 +703,5 @@ char *mtrr_strings[MTRR_NUM_TYPES] =
+     "write-back",               /* 6 */
+ };
+-subsys_initcall(mtrr_init);
++core_initcall(mtrr_init);
+--- linux-2.6.0-test1/arch/i386/kernel/cpu/proc.c      2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/i386/kernel/cpu/proc.c     2003-07-19 17:04:06.000000000 -0700
+@@ -60,7 +60,7 @@ static int show_cpuinfo(struct seq_file 
+       int fpu_exception;
+ #ifdef CONFIG_SMP
+-      if (!(cpu_online_map & (1<<n)))
++      if (!cpu_online(n))
+               return 0;
+ #endif
+       seq_printf(m, "processor\t: %d\n"
+--- linux-2.6.0-test1/arch/i386/kernel/entry.S 2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/i386/kernel/entry.S        2003-07-19 17:06:37.000000000 -0700
+@@ -48,6 +48,18 @@
+ #include <asm/smp.h>
+ #include <asm/page.h>
+ #include "irq_vectors.h"
++        /* We do not recover from a stack overflow, but at least
++         * we know it happened and should be able to track it down.
++         */
++#ifdef CONFIG_STACK_OVERFLOW_TEST
++#define STACK_OVERFLOW_TEST \
++        testl $7680,%esp;    \
++        jnz   10f;            \
++        call  stack_overflow; \
++10:
++#else
++#define STACK_OVERFLOW_TEST
++#endif
+ EBX           = 0x00
+ ECX           = 0x04
+@@ -98,7 +110,8 @@ TSS_ESP0_OFFSET = (4 - 0x200)
+       pushl %ebx; \
+       movl $(__USER_DS), %edx; \
+       movl %edx, %ds; \
+-      movl %edx, %es;
++      movl %edx, %es; \
++        STACK_OVERFLOW_TEST
+ #define RESTORE_INT_REGS \
+       popl %ebx;      \
+@@ -298,6 +311,19 @@ syscall_exit:
+       testw $_TIF_ALLWORK_MASK, %cx   # current->work
+       jne syscall_exit_work
+ restore_all:
++#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
++      movl EFLAGS(%esp), %eax         # mix EFLAGS and CS
++      movb CS(%esp), %al
++      testl $(VM_MASK | 3), %eax
++      jz resume_kernelX               # returning to kernel or vm86-space
++
++      cmpl $0,TI_PRE_COUNT(%ebx)      # non-zero preempt_count ?
++      jz resume_kernelX
++        
++        int $3
++        
++resume_kernelX:
++#endif
+       RESTORE_ALL
+       # perform work that needs to be done immediately before resumption
+@@ -878,5 +904,6 @@ ENTRY(sys_call_table)
+       .long sys_fstatfs64     
+       .long sys_tgkill        /* 270 */
+       .long sys_utimes
+- 
++      .long sys_mknod64
++
+ nr_syscalls=(.-sys_call_table)/4
+--- linux-2.6.0-test1/arch/i386/kernel/io_apic.c       2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/kernel/io_apic.c      2003-07-19 17:04:06.000000000 -0700
+@@ -249,14 +249,14 @@ static void clear_IO_APIC (void)
+                       clear_IO_APIC_pin(apic, pin);
+ }
+-static void set_ioapic_affinity (unsigned int irq, unsigned long cpu_mask)
++static void set_ioapic_affinity(unsigned int irq, cpumask_t cpumask)
+ {
+       unsigned long flags;
+       int pin;
+       struct irq_pin_list *entry = irq_2_pin + irq;
+       unsigned int apicid_value;
+       
+-      apicid_value = cpu_mask_to_apicid(cpu_mask);
++      apicid_value = cpu_mask_to_apicid(mk_cpumask_const(cpumask));
+       /* Prepare to do the io_apic_write */
+       apicid_value = apicid_value << 24;
+       spin_lock_irqsave(&ioapic_lock, flags);
+@@ -286,9 +286,9 @@ static void set_ioapic_affinity (unsigne
+ #  define Dprintk(x...) 
+ # endif
+-extern unsigned long irq_affinity[NR_IRQS];
++extern cpumask_t irq_affinity[NR_IRQS];
+-static int __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
++static cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
+ #define IRQBALANCE_CHECK_ARCH -999
+ static int irqbalance_disabled = IRQBALANCE_CHECK_ARCH;
+@@ -307,8 +307,7 @@ struct irq_cpu_info {
+ #define IDLE_ENOUGH(cpu,now) \
+               (idle_cpu(cpu) && ((now) - irq_stat[(cpu)].idle_timestamp > 1))
+-#define IRQ_ALLOWED(cpu,allowed_mask) \
+-              ((1 << cpu) & (allowed_mask))
++#define IRQ_ALLOWED(cpu, allowed_mask)        cpu_isset(cpu, allowed_mask)
+ #define CPU_TO_PACKAGEINDEX(i) \
+               ((physical_balance && i > cpu_sibling_map[i]) ? cpu_sibling_map[i] : i)
+@@ -320,7 +319,7 @@ struct irq_cpu_info {
+ long balanced_irq_interval = MAX_BALANCED_IRQ_INTERVAL;
+-static unsigned long move(int curr_cpu, unsigned long allowed_mask,
++static unsigned long move(int curr_cpu, cpumask_t allowed_mask,
+                       unsigned long now, int direction)
+ {
+       int search_idle = 1;
+@@ -350,20 +349,20 @@ inside:
+ static inline void balance_irq(int cpu, int irq)
+ {
+       unsigned long now = jiffies;
+-      unsigned long allowed_mask;
++      cpumask_t allowed_mask;
+       unsigned int new_cpu;
+               
+       if (irqbalance_disabled)
+               return; 
+-      allowed_mask = cpu_online_map & irq_affinity[irq];
++      cpus_and(allowed_mask, cpu_online_map, irq_affinity[irq]);
+       new_cpu = move(cpu, allowed_mask, now, 1);
+       if (cpu != new_cpu) {
+               irq_desc_t *desc = irq_desc + irq;
+               unsigned long flags;
+               spin_lock_irqsave(&desc->lock, flags);
+-              pending_irq_balance_cpumask[irq] = 1 << new_cpu;
++              pending_irq_balance_cpumask[irq] = cpumask_of_cpu(new_cpu);
+               spin_unlock_irqrestore(&desc->lock, flags);
+       }
+ }
+@@ -399,8 +398,7 @@ static void do_irq_balance(void)
+       int tmp_loaded, first_attempt = 1;
+       unsigned long tmp_cpu_irq;
+       unsigned long imbalance = 0;
+-      unsigned long allowed_mask;
+-      unsigned long target_cpu_mask;
++      cpumask_t allowed_mask, target_cpu_mask, tmp;
+       for (i = 0; i < NR_CPUS; i++) {
+               int package_index;
+@@ -549,10 +547,11 @@ tryanotherirq:
+                                       CPU_IRQ(cpu_sibling_map[min_loaded]))
+               min_loaded = cpu_sibling_map[min_loaded];
+-      allowed_mask = cpu_online_map & irq_affinity[selected_irq];
+-      target_cpu_mask = 1 << min_loaded;
++      cpus_and(allowed_mask, cpu_online_map, irq_affinity[selected_irq]);
++      target_cpu_mask = cpumask_of_cpu(min_loaded);
++      cpus_and(tmp, target_cpu_mask, allowed_mask);
+-      if (target_cpu_mask & allowed_mask) {
++      if (!cpus_empty(tmp)) {
+               irq_desc_t *desc = irq_desc + selected_irq;
+               unsigned long flags;
+@@ -560,7 +559,8 @@ tryanotherirq:
+                               selected_irq, min_loaded);
+               /* mark for change destination */
+               spin_lock_irqsave(&desc->lock, flags);
+-              pending_irq_balance_cpumask[selected_irq] = 1 << min_loaded;
++              pending_irq_balance_cpumask[selected_irq] =
++                                      cpumask_of_cpu(min_loaded);
+               spin_unlock_irqrestore(&desc->lock, flags);
+               /* Since we made a change, come back sooner to 
+                * check for more variation.
+@@ -591,8 +591,9 @@ int balanced_irq(void *unused)
+       daemonize("kirqd");
+       
+       /* push everything to CPU 0 to give us a starting point.  */
+-      for (i = 0 ; i < NR_IRQS ; i++)
+-              pending_irq_balance_cpumask[i] = 1;
++      for (i = 0 ; i < NR_IRQS ; i++) {
++              pending_irq_balance_cpumask[i] = cpumask_of_cpu(0);
++      }
+ repeat:
+       set_current_state(TASK_INTERRUPTIBLE);
+@@ -611,7 +612,9 @@ static int __init balanced_irq_init(void
+ {
+       int i;
+       struct cpuinfo_x86 *c;
++      cpumask_t tmp;
++      cpus_shift_right(tmp, cpu_online_map, 2);
+         c = &boot_cpu_data;
+       /* When not overwritten by the command line ask subarchitecture. */
+       if (irqbalance_disabled == IRQBALANCE_CHECK_ARCH)
+@@ -628,7 +631,7 @@ static int __init balanced_irq_init(void
+        * Enable physical balance only if more than 1 physical processor
+        * is present
+        */
+-      if (smp_num_siblings > 1 && cpu_online_map >> 2)
++      if (smp_num_siblings > 1 && !cpus_empty(tmp))
+               physical_balance = 1;
+       for (i = 0; i < NR_CPUS; i++) {
+@@ -667,14 +670,14 @@ static int __init irqbalance_disable(cha
+ __setup("noirqbalance", irqbalance_disable);
+-static void set_ioapic_affinity (unsigned int irq, unsigned long mask);
++static void set_ioapic_affinity(unsigned int irq, cpumask_t mask);
+ static inline void move_irq(int irq)
+ {
+       /* note - we hold the desc->lock */
+-      if (unlikely(pending_irq_balance_cpumask[irq])) {
++      if (unlikely(!cpus_empty(pending_irq_balance_cpumask[irq]))) {
+               set_ioapic_affinity(irq, pending_irq_balance_cpumask[irq]);
+-              pending_irq_balance_cpumask[irq] = 0;
++              cpus_clear(pending_irq_balance_cpumask[irq]);
+       }
+ }
+@@ -682,6 +685,21 @@ __initcall(balanced_irq_init);
+ #else /* !SMP */
+ static inline void move_irq(int irq) { }
++
++void send_IPI_self(int vector)
++{
++      unsigned int cfg;
++
++      /*
++       * Wait for idle.
++       */
++      apic_wait_icr_idle();
++      cfg = APIC_DM_FIXED | APIC_DEST_SELF | vector | APIC_DEST_LOGICAL;
++      /*
++       * Send the IPI. The write to APIC_ICR fires this off.
++       */
++      apic_write_around(APIC_ICR, cfg);
++}
+ #endif /* defined(CONFIG_SMP) */
+@@ -822,7 +840,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, 
+  * we need to reprogram the ioredtbls to cater for the cpus which have come online
+  * so mask in all cases should simply be TARGET_CPUS
+  */
+-void __init setup_ioapic_dest (unsigned long mask)
++void __init setup_ioapic_dest(cpumask_t mask)
+ {
+       int pin, ioapic, irq, irq_entry;
+@@ -1598,7 +1616,7 @@ void disable_IO_APIC(void)
+ static void __init setup_ioapic_ids_from_mpc(void)
+ {
+       union IO_APIC_reg_00 reg_00;
+-      unsigned long phys_id_present_map;
++      physid_mask_t phys_id_present_map;
+       int apic;
+       int i;
+       unsigned char old_id;
+@@ -1608,6 +1626,10 @@ static void __init setup_ioapic_ids_from
+               /* This gets done during IOAPIC enumeration for ACPI. */
+               return;
++      /*
++       * This is broken; anything with a real cpu count has to
++       * circumvent this idiocy regardless.
++       */
+       phys_id_present_map = ioapic_phys_id_map(phys_cpu_present_map);
+       /*
+@@ -1639,18 +1661,20 @@ static void __init setup_ioapic_ids_from
+                                       mp_ioapics[apic].mpc_apicid)) {
+                       printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
+                               apic, mp_ioapics[apic].mpc_apicid);
+-                      for (i = 0; i < 0xf; i++)
+-                              if (!(phys_id_present_map & (1 << i)))
++                      for (i = 0; i < APIC_BROADCAST_ID; i++)
++                              if (!physid_isset(i, phys_id_present_map))
+                                       break;
+-                      if (i >= 0xf)
++                      if (i >= APIC_BROADCAST_ID)
+                               panic("Max APIC ID exceeded!\n");
+                       printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
+                               i);
+-                      phys_id_present_map |= 1 << i;
++                      physid_set(i, phys_id_present_map);
+                       mp_ioapics[apic].mpc_apicid = i;
+               } else {
++                      physid_mask_t tmp;
++                      tmp = apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
+                       printk("Setting %d in the phys_id_present_map\n", mp_ioapics[apic].mpc_apicid);
+-                      phys_id_present_map |= apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
++                      physids_or(phys_id_present_map, phys_id_present_map, tmp);
+               }
+@@ -2220,7 +2244,8 @@ late_initcall(io_apic_bug_finalize);
+ int __init io_apic_get_unique_id (int ioapic, int apic_id)
+ {
+       union IO_APIC_reg_00 reg_00;
+-      static unsigned long apic_id_map = 0;
++      static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
++      physid_mask_t tmp;
+       unsigned long flags;
+       int i = 0;
+@@ -2233,8 +2258,8 @@ int __init io_apic_get_unique_id (int io
+        *      advantage of new APIC bus architecture.
+        */
+-      if (!apic_id_map)
+-              apic_id_map = phys_cpu_present_map;
++      if (physids_empty(apic_id_map))
++              apic_id_map = ioapic_phys_id_map(phys_cpu_present_map);
+       spin_lock_irqsave(&ioapic_lock, flags);
+       reg_00.raw = io_apic_read(ioapic, 0);
+@@ -2266,7 +2291,8 @@ int __init io_apic_get_unique_id (int io
+               apic_id = i;
+       } 
+-      apic_id_map |= apicid_to_cpu_present(apic_id);
++      tmp = apicid_to_cpu_present(apic_id);
++      physids_or(apic_id_map, apic_id_map, tmp);
+       if (reg_00.bits.ID != apic_id) {
+               reg_00.bits.ID = apic_id;
+--- linux-2.6.0-test1/arch/i386/kernel/irq.c   2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/kernel/irq.c  2003-07-19 17:04:06.000000000 -0700
+@@ -45,8 +45,6 @@
+ #include <asm/desc.h>
+ #include <asm/irq.h>
+-
+-
+ /*
+  * Linux has a controller-independent x86 interrupt architecture.
+  * every controller has a 'controller-template', that is used
+@@ -889,13 +887,13 @@ int setup_irq(unsigned int irq, struct i
+ static struct proc_dir_entry * root_irq_dir;
+ static struct proc_dir_entry * irq_dir [NR_IRQS];
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+-static unsigned int parse_hex_value (const char __user *buffer,
+-              unsigned long count, unsigned long *ret)
++static unsigned int parse_hex_value(const char __user *buffer,
++              unsigned long count, cpumask_t *ret)
+ {
+-      unsigned char hexnum [HEX_DIGITS];
+-      unsigned long value;
++      unsigned char hexnum[HEX_DIGITS];
++      cpumask_t value = CPU_MASK_NONE;
+       int i;
+       if (!count)
+@@ -909,10 +907,10 @@ static unsigned int parse_hex_value (con
+        * Parse the first 8 characters as a hex string, any non-hex char
+        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+        */
+-      value = 0;
+       for (i = 0; i < count; i++) {
+               unsigned int c = hexnum[i];
++              int k;
+               switch (c) {
+                       case '0' ... '9': c -= '0'; break;
+@@ -921,7 +919,10 @@ static unsigned int parse_hex_value (con
+               default:
+                       goto out;
+               }
+-              value = (value << 4) | c;
++              cpus_shift_left(value, value, 4);
++              for (k = 0; k < 4; ++k)
++                      if (test_bit(k, (unsigned long *)&c))
++                              cpu_set(k, value);
+       }
+ out:
+       *ret = value;
+@@ -930,22 +931,35 @@ out:
+ #ifdef CONFIG_SMP
+-static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
++static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
++
++cpumask_t irq_affinity[NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+-unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
+-static int irq_affinity_read_proc (char *page, char **start, off_t off,
++static int irq_affinity_read_proc(char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
++      int k, len;
++      cpumask_t tmp = irq_affinity[(long)data];
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
++
++      len = 0;
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+-static int irq_affinity_write_proc (struct file *file, const char __user *buffer,
++static int irq_affinity_write_proc(struct file *file, const char __user *buffer,
+                                       unsigned long count, void *data)
+ {
+-      int irq = (long) data, full_count = count, err;
+-      unsigned long new_value;
++      int irq = (long)data, full_count = count, err;
++      cpumask_t new_value, tmp;
+       if (!irq_desc[irq].handler->set_affinity)
+               return -EIO;
+@@ -957,11 +971,13 @@ static int irq_affinity_write_proc (stru
+        * way to make the system unusable accidentally :-) At least
+        * one online CPU still has to be targeted.
+        */
+-      if (!(new_value & cpu_online_map))
++      cpus_and(tmp, new_value, cpu_online_map);
++      if (cpus_empty(tmp))
+               return -EINVAL;
+       irq_affinity[irq] = new_value;
+-      irq_desc[irq].handler->set_affinity(irq, new_value);
++      irq_desc[irq].handler->set_affinity(irq,
++                                      cpumask_of_cpu(first_cpu(new_value)));
+       return full_count;
+ }
+@@ -980,8 +996,9 @@ static int prof_cpu_mask_read_proc (char
+ static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
+                                       unsigned long count, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t *mask = (cpumask_t *)data;
++      unsigned long full_count = count, err;
++      cpumask_t new_value;
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/i386/kernel/kgdb_stub.c    2003-07-19 17:04:14.000000000 -0700
+@@ -0,0 +1,2215 @@
++/*
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2, or (at your option) any
++ * later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the GNU
++ * General Public License for more details.
++ *
++ */
++
++/*
++ * Copyright (c) 2000 VERITAS Software Corporation.
++ * 
++ */
++/****************************************************************************
++ *  Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
++ *
++ *  Module name: remcom.c $
++ *  Revision: 1.34 $
++ *  Date: 91/03/09 12:29:49 $
++ *  Contributor:     Lake Stevens Instrument Division$
++ *
++ *  Description:     low level support for gdb debugger. $
++ *
++ *  Considerations:  only works on target hardware $
++ *
++ *  Written by:            Glenn Engel $
++ *  Updated by:            David Grothe <dave@gcom.com>
++ *  ModuleState:     Experimental $
++ *
++ *  NOTES:         See Below $
++ *
++ *  Modified for 386 by Jim Kingdon, Cygnus Support.
++ *  Compatibility with 2.1.xx kernel by David Grothe <dave@gcom.com>
++ *
++ *  Changes to allow auto initilization.  All that is needed is that it
++ *  be linked with the kernel and a break point (int 3) be executed.
++ *  The header file <asm/kgdb.h> defines BREAKPOINT to allow one to do
++ *  this. It should also be possible, once the interrupt system is up, to
++ *  call putDebugChar("+").  Once this is done, the remote debugger should
++ *  get our attention by sending a ^C in a packet. George Anzinger 
++ *  <george@mvista.com>
++ *  Integrated into 2.2.5 kernel by Tigran Aivazian <tigran@sco.com>
++ *  Added thread support, support for multiple processors,
++ *    support for ia-32(x86) hardware debugging.
++ *    Amit S. Kale ( akale@veritas.com )
++ *
++ *
++ *  To enable debugger support, two things need to happen.  One, a
++ *  call to set_debug_traps() is necessary in order to allow any breakpoints
++ *  or error conditions to be properly intercepted and reported to gdb.
++ *  Two, a breakpoint needs to be generated to begin communication.  This
++ *  is most easily accomplished by a call to breakpoint().  Breakpoint()
++ *  simulates a breakpoint by executing an int 3.
++ *
++ *************
++ *
++ *    The following gdb commands are supported:
++ *
++ * command        function                               Return value
++ *
++ *    g                   return the value of the CPU registers  hex data or ENN
++ *    G                   set the value of the CPU registers     OK or ENN
++ *
++ *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA    hex data or ENN
++ *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA    OK or ENN
++ *
++ *    c                   Resume at current address              SNN   ( signal NN)
++ *    cAA..AA     Continue at address AA..AA             SNN
++ *
++ *    s                   Step one instruction                   SNN
++ *    sAA..AA     Step one instruction from AA..AA       SNN
++ *
++ *    k                   kill
++ *
++ *    ?                   What was the last sigval ?             SNN   (signal NN)
++ *
++ * All commands and responses are sent with a packet which includes a
++ * checksum.  A packet consists of
++ *
++ * $<packet info>#<checksum>.
++ *
++ * where
++ * <packet info> :: <characters representing the command or response>
++ * <checksum>  :: < two hex digits computed as modulo 256 sum of <packetinfo>>
++ *
++ * When a packet is received, it is first acknowledged with either '+' or '-'.
++ * '+' indicates a successful transfer.        '-' indicates a failed transfer.
++ *
++ * Example:
++ *
++ * Host:                Reply:
++ * $m0,10#2a             +$00010203040506070809101112131415#42
++ *
++ ****************************************************************************/
++#define KGDB_VERSION "<20030530.0126.22>"
++#include <linux/config.h>
++#include <linux/types.h>
++#include <asm/string.h>               /* for strcpy */
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <asm/vm86.h>
++#include <asm/system.h>
++#include <asm/ptrace.h>               /* for linux pt_regs struct */
++#include <asm/kgdb_local.h>
++#include <linux/list.h>
++#include <asm/atomic.h>
++#include <asm/processor.h>
++#include <linux/irq.h>
++#include <asm/desc.h>
++
++/************************************************************************
++ *
++ * external low-level support routines
++ */
++typedef void (*Function) (void);      /* pointer to a function */
++
++/* Thread reference */
++typedef unsigned char threadref[8];
++
++extern void putDebugChar(int);        /* write a single character      */
++extern int getDebugChar(void);        /* read and return a single char */
++
++/************************************************************************/
++/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
++/* at least NUMREGBYTES*2 are needed for register packets */
++/* Longer buffer is needed to list all threads */
++#define BUFMAX 1024
++
++char *kgdb_version = KGDB_VERSION;
++
++/*  debug >  0 prints ill-formed commands in valid packets & checksum errors */
++int debug_regs = 0;           /* set to non-zero to print registers */
++
++/* filled in by an external module */
++char *gdb_module_offsets;
++
++static const char hexchars[] = "0123456789abcdef";
++
++/* Number of bytes of registers.  */
++#define NUMREGBYTES 64
++/*
++ * Note that this register image is in a different order than
++ * the register image that Linux produces at interrupt time.
++ *
++ * Linux's register image is defined by struct pt_regs in ptrace.h.
++ * Just why GDB uses a different order is a historical mystery.
++ */
++enum regnames { _EAX,         /* 0 */
++      _ECX,                   /* 1 */
++      _EDX,                   /* 2 */
++      _EBX,                   /* 3 */
++      _ESP,                   /* 4 */
++      _EBP,                   /* 5 */
++      _ESI,                   /* 6 */
++      _EDI,                   /* 7 */
++      _PC /* 8 also known as eip */ ,
++      _PS /* 9 also known as eflags */ ,
++      _CS,                    /* 10 */
++      _SS,                    /* 11 */
++      _DS,                    /* 12 */
++      _ES,                    /* 13 */
++      _FS,                    /* 14 */
++      _GS                     /* 15 */
++};
++
++/***************************  ASSEMBLY CODE MACROS *************************/
++/*
++ * Put the error code here just in case the user cares.       
++ * Likewise, the vector number here (since GDB only gets the signal
++ * number through the usual means, and that's not very specific). 
++ * The called_from is the return address so he can tell how we entered kgdb.
++ * This will allow him to seperate out the various possible entries. 
++ */
++#define REMOTE_DEBUG 0                /* set != to turn on printing (also available in info) */
++
++#define PID_MAX PID_MAX_DEFAULT
++
++#ifdef CONFIG_SMP
++void smp_send_nmi_allbutself(void);
++#define IF_SMP(x) x
++#undef MAX_NO_CPUS
++#ifndef CONFIG_NO_KGDB_CPUS
++#define CONFIG_NO_KGDB_CPUS 2
++#endif
++#if CONFIG_NO_KGDB_CPUS > NR_CPUS
++#define MAX_NO_CPUS NR_CPUS
++#else
++#define MAX_NO_CPUS CONFIG_NO_KGDB_CPUS
++#endif
++#define hold_init hold_on_sstep: 1,
++#define MAX_CPU_MASK (unsigned long)((1LL << MAX_NO_CPUS) - 1LL)
++#define NUM_CPUS num_online_cpus()
++#else
++#define IF_SMP(x)
++#define hold_init
++#undef MAX_NO_CPUS
++#define MAX_NO_CPUS 1
++#define NUM_CPUS 1
++#endif
++#define NOCPU (struct task_struct *)0xbad1fbad
++/* *INDENT-OFF*        */
++struct kgdb_info {
++      int used_malloc;
++      void *called_from;
++      long long entry_tsc;
++      int errcode;
++      int vector;
++      int print_debug_info;
++#ifdef CONFIG_SMP
++      int hold_on_sstep;
++      struct {
++              volatile struct task_struct *task;
++              int pid;
++              int hold;
++              struct pt_regs *regs;
++      } cpus_waiting[MAX_NO_CPUS];
++#endif
++} kgdb_info = {hold_init print_debug_info:REMOTE_DEBUG, vector:-1};
++
++/* *INDENT-ON*        */
++
++#define used_m kgdb_info.used_malloc
++/*
++ * This is little area we set aside to contain the stack we 
++ * need to build to allow gdb to call functions.  We use one
++ * per cpu to avoid locking issues.  We will do all this work
++ * with interrupts off so that should take care of the protection
++ * issues.
++ */
++#define LOOKASIDE_SIZE 200    /* should be more than enough */
++#define MALLOC_MAX   200      /* Max malloc size */
++struct {
++      unsigned int esp;
++      int array[LOOKASIDE_SIZE];
++} fn_call_lookaside[MAX_NO_CPUS];
++
++static int trap_cpu;
++static unsigned int OLD_esp;
++
++#define END_OF_LOOKASIDE  &fn_call_lookaside[trap_cpu].array[LOOKASIDE_SIZE]
++#define IF_BIT 0x200
++#define TF_BIT 0x100
++
++#define MALLOC_ROUND 8-1
++
++static char malloc_array[MALLOC_MAX];
++IF_SMP(static void to_gdb(const char *mess));
++void *
++malloc(int size)
++{
++
++      if (size <= (MALLOC_MAX - used_m)) {
++              int old_used = used_m;
++              used_m += ((size + MALLOC_ROUND) & (~MALLOC_ROUND));
++              return &malloc_array[old_used];
++      } else {
++              return NULL;
++      }
++}
++
++/*
++ * Gdb calls functions by pushing agruments, including a return address 
++ * on the stack and the adjusting EIP to point to the function.        The 
++ * whole assumption in GDB is that we are on a different stack than the
++ * one the "user" i.e. code that hit the break point, is on.  This, of
++ * course is not true in the kernel.  Thus various dodges are needed to
++ * do the call without directly messing with EIP (which we can not change
++ * as it is just a location and not a register.        To adjust it would then
++ * require that we move every thing below EIP up or down as needed.  This
++ * will not work as we may well have stack relative pointer on the stack
++ * (such as the pointer to regs, for example).
++
++ * So here is what we do:
++ * We detect gdb attempting to store into the stack area and instead, store
++ * into the fn_call_lookaside.array at the same relative location as if it 
++ * were the area ESP pointed at.  We also trap ESP modifications
++ * and uses these to adjust fn_call_lookaside.esp.  On entry 
++ * fn_call_lookaside.esp will be set to point at the last entry in
++ * fn_call_lookaside.array.  This allows us to check if it has changed, and 
++ * if so, on exit, we add the registers we will use to do the move and a
++ * trap/ interrupt return exit sequence.  We then adjust the eflags in the
++ * regs array (remember we now have a copy in the fn_call_lookaside.array) to
++ * kill the interrupt bit, AND we change EIP to point at our set up stub.
++ * As part of the register set up we preset the registers to point at the
++ * begining and end of the fn_call_lookaside.array, so all the stub needs to
++ * do is move words from the array to the stack until ESP= the desired value
++ * then do the rti.  This will then transfer to the desired function with 
++ * all the correct registers.  Nifty huh?
++ */
++extern asmlinkage void fn_call_stub(void);
++extern asmlinkage void fn_rtn_stub(void);
++/*                                       *INDENT-OFF*  */
++__asm__("fn_rtn_stub:\n\t"
++      "movl %eax,%esp\n\t"
++      "fn_call_stub:\n\t"
++      "1:\n\t"
++      "addl $-4,%ebx\n\t"
++      "movl (%ebx), %eax\n\t"
++      "pushl %eax\n\t"
++      "cmpl %esp,%ecx\n\t"
++      "jne  1b\n\t"
++      "popl %eax\n\t" 
++      "popl %ebx\n\t" 
++      "popl %ecx\n\t" 
++      "iret \n\t");
++/*                                         *INDENT-ON*  */
++#define gdb_i386vector        kgdb_info.vector
++#define gdb_i386errcode kgdb_info.errcode
++#define waiting_cpus  kgdb_info.cpus_waiting
++#define remote_debug  kgdb_info.print_debug_info
++#define hold_cpu(cpu) kgdb_info.cpus_waiting[cpu].hold
++/* gdb locks */
++
++#ifdef CONFIG_SMP
++static int in_kgdb_called;
++static spinlock_t waitlocks[MAX_NO_CPUS] =
++    {[0 ... MAX_NO_CPUS - 1] = SPIN_LOCK_UNLOCKED };
++/*
++ * The following array has the thread pointer of each of the "other"
++ * cpus.  We make it global so it can be seen by gdb.
++ */
++volatile int in_kgdb_entry_log[MAX_NO_CPUS];
++volatile struct pt_regs *in_kgdb_here_log[MAX_NO_CPUS];
++/*
++static spinlock_t continuelocks[MAX_NO_CPUS];
++*/
++spinlock_t kgdb_spinlock = SPIN_LOCK_UNLOCKED;
++/* waiters on our spinlock plus us */
++static atomic_t spinlock_waiters = ATOMIC_INIT(1);
++static int spinlock_count = 0;
++static int spinlock_cpu = 0;
++/*
++ * Note we use nested spin locks to account for the case where a break
++ * point is encountered when calling a function by user direction from
++ * kgdb. Also there is the memory exception recursion to account for.
++ * Well, yes, but this lets other cpus thru too.  Lets add a
++ * cpu id to the lock.
++ */
++#define KGDB_SPIN_LOCK(x) if( spinlock_count == 0 || \
++                            spinlock_cpu != smp_processor_id()){\
++                                    atomic_inc(&spinlock_waiters); \
++                                    while (! spin_trylock(x)) {\
++                                          in_kgdb(&regs);\
++                                    }\
++                                    atomic_dec(&spinlock_waiters); \
++                                    spinlock_count = 1; \
++                                    spinlock_cpu = smp_processor_id(); \
++                        }else{  \
++                                    spinlock_count++; \
++                        }
++#define KGDB_SPIN_UNLOCK(x) if( --spinlock_count == 0) spin_unlock(x)
++#else
++unsigned kgdb_spinlock = 0;
++#define KGDB_SPIN_LOCK(x) --*x
++#define KGDB_SPIN_UNLOCK(x) ++*x
++#endif
++
++int
++hex(char ch)
++{
++      if ((ch >= 'a') && (ch <= 'f'))
++              return (ch - 'a' + 10);
++      if ((ch >= '0') && (ch <= '9'))
++              return (ch - '0');
++      if ((ch >= 'A') && (ch <= 'F'))
++              return (ch - 'A' + 10);
++      return (-1);
++}
++
++/* scan for the sequence $<data>#<checksum>   */
++void
++getpacket(char *buffer)
++{
++      unsigned char checksum;
++      unsigned char xmitcsum;
++      int i;
++      int count;
++      char ch;
++
++      do {
++              /* wait around for the start character, ignore all other characters */
++              while ((ch = (getDebugChar() & 0x7f)) != '$') ;
++              checksum = 0;
++              xmitcsum = -1;
++
++              count = 0;
++
++              /* now, read until a # or end of buffer is found */
++              while (count < BUFMAX) {
++                      ch = getDebugChar() & 0x7f;
++                      if (ch == '#')
++                              break;
++                      checksum = checksum + ch;
++                      buffer[count] = ch;
++                      count = count + 1;
++              }
++              buffer[count] = 0;
++
++              if (ch == '#') {
++                      xmitcsum = hex(getDebugChar() & 0x7f) << 4;
++                      xmitcsum += hex(getDebugChar() & 0x7f);
++                      if ((remote_debug) && (checksum != xmitcsum)) {
++                              printk
++                                  ("bad checksum.     My count = 0x%x, sent=0x%x. buf=%s\n",
++                                   checksum, xmitcsum, buffer);
++                      }
++
++                      if (checksum != xmitcsum)
++                              putDebugChar('-');      /* failed checksum */
++                      else {
++                              putDebugChar('+');      /* successful transfer */
++                              /* if a sequence char is present, reply the sequence ID */
++                              if (buffer[2] == ':') {
++                                      putDebugChar(buffer[0]);
++                                      putDebugChar(buffer[1]);
++                                      /* remove sequence chars from buffer */
++                                      count = strlen(buffer);
++                                      for (i = 3; i <= count; i++)
++                                              buffer[i - 3] = buffer[i];
++                              }
++                      }
++              }
++      } while (checksum != xmitcsum);
++
++      if (remote_debug)
++              printk("R:%s\n", buffer);
++}
++
++/* send the packet in buffer.  */
++
++void
++putpacket(char *buffer)
++{
++      unsigned char checksum;
++      int count;
++      char ch;
++
++      /*  $<packet info>#<checksum>. */
++      do {
++              if (remote_debug)
++                      printk("T:%s\n", buffer);
++              putDebugChar('$');
++              checksum = 0;
++              count = 0;
++
++              while ((ch = buffer[count])) {
++                      putDebugChar(ch);
++                      checksum += ch;
++                      count += 1;
++              }
++
++              putDebugChar('#');
++              putDebugChar(hexchars[checksum >> 4]);
++              putDebugChar(hexchars[checksum % 16]);
++
++      } while ((getDebugChar() & 0x7f) != '+');
++
++}
++
++static char remcomInBuffer[BUFMAX];
++static char remcomOutBuffer[BUFMAX];
++static short error;
++
++void
++debug_error(char *format, char *parm)
++{
++      if (remote_debug)
++              printk(format, parm);
++}
++
++static void
++print_regs(struct pt_regs *regs)
++{
++      printk("EAX=%08lx ", regs->eax);
++      printk("EBX=%08lx ", regs->ebx);
++      printk("ECX=%08lx ", regs->ecx);
++      printk("EDX=%08lx ", regs->edx);
++      printk("\n");
++      printk("ESI=%08lx ", regs->esi);
++      printk("EDI=%08lx ", regs->edi);
++      printk("EBP=%08lx ", regs->ebp);
++      printk("ESP=%08lx ", (long) &regs->esp);
++      printk("\n");
++      printk(" DS=%08x ", regs->xds);
++      printk(" ES=%08x ", regs->xes);
++      printk(" SS=%08x ", __KERNEL_DS);
++      printk(" FL=%08lx ", regs->eflags);
++      printk("\n");
++      printk(" CS=%08x ", regs->xcs);
++      printk(" IP=%08lx ", regs->eip);
++#if 0
++      printk(" FS=%08x ", regs->fs);
++      printk(" GS=%08x ", regs->gs);
++#endif
++      printk("\n");
++
++}                             /* print_regs */
++
++#define NEW_esp fn_call_lookaside[trap_cpu].esp
++
++static void
++regs_to_gdb_regs(int *gdb_regs, struct pt_regs *regs)
++{
++      gdb_regs[_EAX] = regs->eax;
++      gdb_regs[_EBX] = regs->ebx;
++      gdb_regs[_ECX] = regs->ecx;
++      gdb_regs[_EDX] = regs->edx;
++      gdb_regs[_ESI] = regs->esi;
++      gdb_regs[_EDI] = regs->edi;
++      gdb_regs[_EBP] = regs->ebp;
++      gdb_regs[_DS] = regs->xds;
++      gdb_regs[_ES] = regs->xes;
++      gdb_regs[_PS] = regs->eflags;
++      gdb_regs[_CS] = regs->xcs;
++      gdb_regs[_PC] = regs->eip;
++      /* Note, as we are a debugging the kernel, we will always 
++       * trap in kernel code, this means no priviledge change,
++       * and so the pt_regs structure is not completely valid.  In a non
++       * privilege change trap, only EFLAGS, CS and EIP are put on the stack,
++       * SS and ESP are not stacked, this means that the last 2 elements of
++       * pt_regs is not valid (they would normally refer to the user stack)
++       * also, using regs+1 is no good because you end up will a value that is 
++       * 2 longs (8) too high.  This used to cause stepping over functions
++       * to fail, so my fix is to use the address of regs->esp, which 
++       * should point at the end of the stack frame.  Note I have ignored
++       * completely exceptions that cause an error code to be stacked, such
++       * as double fault.  Stuart Hughes, Zentropix.
++       * original code: gdb_regs[_ESP] =  (int) (regs + 1) ; 
++
++       * this is now done on entry and moved to OLD_esp (as well as NEW_esp).
++       */
++      gdb_regs[_ESP] = NEW_esp;
++      gdb_regs[_SS] = __KERNEL_DS;
++      gdb_regs[_FS] = 0xFFFF;
++      gdb_regs[_GS] = 0xFFFF;
++}                             /* regs_to_gdb_regs */
++
++static void
++gdb_regs_to_regs(int *gdb_regs, struct pt_regs *regs)
++{
++      regs->eax = gdb_regs[_EAX];
++      regs->ebx = gdb_regs[_EBX];
++      regs->ecx = gdb_regs[_ECX];
++      regs->edx = gdb_regs[_EDX];
++      regs->esi = gdb_regs[_ESI];
++      regs->edi = gdb_regs[_EDI];
++      regs->ebp = gdb_regs[_EBP];
++      regs->xds = gdb_regs[_DS];
++      regs->xes = gdb_regs[_ES];
++      regs->eflags = gdb_regs[_PS];
++      regs->xcs = gdb_regs[_CS];
++      regs->eip = gdb_regs[_PC];
++      NEW_esp = gdb_regs[_ESP];       /* keep the value */
++#if 0                         /* can't change these */
++      regs->esp = gdb_regs[_ESP];
++      regs->xss = gdb_regs[_SS];
++      regs->fs = gdb_regs[_FS];
++      regs->gs = gdb_regs[_GS];
++#endif
++
++}                             /* gdb_regs_to_regs */
++extern void scheduling_functions_start_here(void);
++extern void scheduling_functions_end_here(void);
++#define first_sched   ((unsigned long) scheduling_functions_start_here)
++#define last_sched    ((unsigned long) scheduling_functions_end_here)
++
++int thread_list = 0;
++
++void
++get_gdb_regs(struct task_struct *p, struct pt_regs *regs, int *gdb_regs)
++{
++      unsigned long stack_page;
++      int count = 0;
++      IF_SMP(int i);
++      if (!p || p == current) {
++              regs_to_gdb_regs(gdb_regs, regs);
++              return;
++      }
++#ifdef CONFIG_SMP
++      for (i = 0; i < MAX_NO_CPUS; i++) {
++              if (p == kgdb_info.cpus_waiting[i].task) {
++                      regs_to_gdb_regs(gdb_regs,
++                                       kgdb_info.cpus_waiting[i].regs);
++                      gdb_regs[_ESP] =
++                          (int) &kgdb_info.cpus_waiting[i].regs->esp;
++
++                      return;
++              }
++      }
++#endif
++      memset(gdb_regs, 0, NUMREGBYTES);
++      gdb_regs[_ESP] = p->thread.esp;
++      gdb_regs[_PC] = p->thread.eip;
++      gdb_regs[_EBP] = *(int *) gdb_regs[_ESP];
++      gdb_regs[_EDI] = *(int *) (gdb_regs[_ESP] + 4);
++      gdb_regs[_ESI] = *(int *) (gdb_regs[_ESP] + 8);
++
++/*
++ * This code is to give a more informative notion of where a process 
++ * is waiting.        It is used only when the user asks for a thread info
++ * list.  If he then switches to the thread, s/he will find the task
++ * is in schedule, but a back trace should show the same info we come
++ * up with.  This code was shamelessly purloined from process.c.  It was
++ * then enhanced to provide more registers than simply the program 
++ * counter.
++ */
++
++      if (!thread_list) {
++              return;
++      }
++
++      if (p->state == TASK_RUNNING)
++              return;
++      stack_page = (unsigned long) p->thread_info;
++      if (gdb_regs[_ESP] < stack_page || gdb_regs[_ESP] > 8188 + stack_page)
++              return;
++      /* include/asm-i386/system.h:switch_to() pushes ebp last. */
++      do {
++              if (gdb_regs[_EBP] < stack_page ||
++                  gdb_regs[_EBP] > 8184 + stack_page)
++                      return;
++              gdb_regs[_PC] = *(unsigned long *) (gdb_regs[_EBP] + 4);
++              gdb_regs[_ESP] = gdb_regs[_EBP] + 8;
++              gdb_regs[_EBP] = *(unsigned long *) gdb_regs[_EBP];
++              if (gdb_regs[_PC] < first_sched || gdb_regs[_PC] >= last_sched)
++                      return;
++      } while (count++ < 16);
++      return;
++}
++
++/* Indicate to caller of mem2hex or hex2mem that there has been an
++   error.  */
++static volatile int mem_err = 0;
++static volatile int mem_err_expected = 0;
++static volatile int mem_err_cnt = 0;
++static int garbage_loc = -1;
++
++int
++get_char(char *addr)
++{
++      return *addr;
++}
++
++void
++set_char(char *addr, int val, int may_fault)
++{
++      /*
++       * This code traps references to the area mapped to the kernel
++       * stack as given by the regs and, instead, stores to the
++       * fn_call_lookaside[cpu].array
++       */
++      if (may_fault &&
++          (unsigned int) addr < OLD_esp &&
++          ((unsigned int) addr > (OLD_esp - (unsigned int) LOOKASIDE_SIZE))) {
++              addr = (char *) END_OF_LOOKASIDE - ((char *) OLD_esp - addr);
++      }
++      *addr = val;
++}
++
++/* convert the memory pointed to by mem into hex, placing result in buf */
++/* return a pointer to the last char put in buf (null) */
++/* If MAY_FAULT is non-zero, then we should set mem_err in response to
++   a fault; if zero treat a fault like any other fault in the stub.  */
++char *
++mem2hex(char *mem, char *buf, int count, int may_fault)
++{
++      int i;
++      unsigned char ch;
++
++      if (may_fault) {
++              mem_err_expected = 1;
++              mem_err = 0;
++      }
++      for (i = 0; i < count; i++) {
++              /* printk("%lx = ", mem) ; */
++
++              ch = get_char(mem++);
++
++              /* printk("%02x\n", ch & 0xFF) ; */
++              if (may_fault && mem_err) {
++                      if (remote_debug)
++                              printk("Mem fault fetching from addr %lx\n",
++                                     (long) (mem - 1));
++                      *buf = 0;       /* truncate buffer */
++                      return (buf);
++              }
++              *buf++ = hexchars[ch >> 4];
++              *buf++ = hexchars[ch % 16];
++      }
++      *buf = 0;
++      if (may_fault)
++              mem_err_expected = 0;
++      return (buf);
++}
++
++/* convert the hex array pointed to by buf into binary to be placed in mem */
++/* return a pointer to the character AFTER the last byte written */
++/* NOTE: We use the may fault flag to also indicate if the write is to
++ * the registers (0) or "other" memory (!=0) 
++ */
++char *
++hex2mem(char *buf, char *mem, int count, int may_fault)
++{
++      int i;
++      unsigned char ch;
++
++      if (may_fault) {
++              mem_err_expected = 1;
++              mem_err = 0;
++      }
++      for (i = 0; i < count; i++) {
++              ch = hex(*buf++) << 4;
++              ch = ch + hex(*buf++);
++              set_char(mem++, ch, may_fault);
++
++              if (may_fault && mem_err) {
++                      if (remote_debug)
++                              printk("Mem fault storing to addr %lx\n",
++                                     (long) (mem - 1));
++                      return (mem);
++              }
++      }
++      if (may_fault)
++              mem_err_expected = 0;
++      return (mem);
++}
++
++/**********************************************/
++/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
++/* RETURN NUMBER OF CHARS PROCESSED         */
++/**********************************************/
++int
++hexToInt(char **ptr, int *intValue)
++{
++      int numChars = 0;
++      int hexValue;
++
++      *intValue = 0;
++
++      while (**ptr) {
++              hexValue = hex(**ptr);
++              if (hexValue >= 0) {
++                      *intValue = (*intValue << 4) | hexValue;
++                      numChars++;
++              } else
++                      break;
++
++              (*ptr)++;
++      }
++
++      return (numChars);
++}
++
++#define stubhex(h) hex(h)
++
++static int
++stub_unpack_int(char *buff, int fieldlength)
++{
++      int nibble;
++      int retval = 0;
++
++      while (fieldlength) {
++              nibble = stubhex(*buff++);
++              retval |= nibble;
++              fieldlength--;
++              if (fieldlength)
++                      retval = retval << 4;
++      }
++      return retval;
++}
++
++static char *
++pack_hex_byte(char *pkt, int byte)
++{
++      *pkt++ = hexchars[(byte >> 4) & 0xf];
++      *pkt++ = hexchars[(byte & 0xf)];
++      return pkt;
++}
++
++#define BUF_THREAD_ID_SIZE 16
++
++static char *
++pack_threadid(char *pkt, threadref * id)
++{
++      char *limit;
++      unsigned char *altid;
++
++      altid = (unsigned char *) id;
++      limit = pkt + BUF_THREAD_ID_SIZE;
++      while (pkt < limit)
++              pkt = pack_hex_byte(pkt, *altid++);
++      return pkt;
++}
++
++static char *
++unpack_byte(char *buf, int *value)
++{
++      *value = stub_unpack_int(buf, 2);
++      return buf + 2;
++}
++
++static char *
++unpack_threadid(char *inbuf, threadref * id)
++{
++      char *altref;
++      char *limit = inbuf + BUF_THREAD_ID_SIZE;
++      int x, y;
++
++      altref = (char *) id;
++
++      while (inbuf < limit) {
++              x = stubhex(*inbuf++);
++              y = stubhex(*inbuf++);
++              *altref++ = (x << 4) | y;
++      }
++      return inbuf;
++}
++
++void
++int_to_threadref(threadref * id, int value)
++{
++      unsigned char *scan;
++
++      scan = (unsigned char *) id;
++      {
++              int i = 4;
++              while (i--)
++                      *scan++ = 0;
++      }
++      *scan++ = (value >> 24) & 0xff;
++      *scan++ = (value >> 16) & 0xff;
++      *scan++ = (value >> 8) & 0xff;
++      *scan++ = (value & 0xff);
++}
++
++static int
++threadref_to_int(threadref * ref)
++{
++      int i, value = 0;
++      unsigned char *scan;
++
++      scan = (char *) ref;
++      scan += 4;
++      i = 4;
++      while (i-- > 0)
++              value = (value << 8) | ((*scan++) & 0xff);
++      return value;
++}
++
++#if 1                         /* this is a hold over from 2.4 where O(1) was "sometimes" */
++extern struct task_struct *kgdb_get_idle(int cpu);
++#define idle_task(cpu) kgdb_get_idle(cpu)
++#else
++#define idle_task(cpu) init_tasks[cpu]
++#endif
++
++struct task_struct *
++getthread(int pid)
++{
++      struct task_struct *thread;
++      if (pid >= PID_MAX && pid <= (PID_MAX + MAX_NO_CPUS)) {
++
++              return idle_task(pid - PID_MAX);
++      } else {
++              /*
++               * find_task_by_pid is relatively safe all the time
++               * Other pid functions require lock downs which imply
++               * that we may be interrupting them (as we get here
++               * in the middle of most any lock down)
++               */
++              thread = find_task_by_pid(pid);
++              if (thread) {
++                      return thread;
++              }
++      }
++      return NULL;
++}
++/* *INDENT-OFF*        */
++struct hw_breakpoint {
++      unsigned enabled;
++      unsigned type;
++      unsigned len;
++      unsigned addr;
++} breakinfo[4] = { {enabled:0}, 
++                 {enabled:0}, 
++                 {enabled:0}, 
++                 {enabled:0}};
++/* *INDENT-ON*        */
++unsigned hw_breakpoint_status;
++void
++correct_hw_break(void)
++{
++      int breakno;
++      int correctit;
++      int breakbit;
++      unsigned dr7;
++
++      asm volatile ("movl %%db7, %0\n":"=r" (dr7)
++                    :);
++      /* *INDENT-OFF*  */
++      do {
++              unsigned addr0, addr1, addr2, addr3;
++              asm volatile ("movl %%db0, %0\n"
++                            "movl %%db1, %1\n"
++                            "movl %%db2, %2\n"
++                            "movl %%db3, %3\n"
++                            :"=r" (addr0), "=r"(addr1),
++                            "=r"(addr2), "=r"(addr3)
++                            :);
++      } while (0);
++      /* *INDENT-ON*  */
++      correctit = 0;
++      for (breakno = 0; breakno < 3; breakno++) {
++              breakbit = 2 << (breakno << 1);
++              if (!(dr7 & breakbit) && breakinfo[breakno].enabled) {
++                      correctit = 1;
++                      dr7 |= breakbit;
++                      dr7 &= ~(0xf0000 << (breakno << 2));
++                      dr7 |= (((breakinfo[breakno].len << 2) |
++                               breakinfo[breakno].type) << 16) <<
++                          (breakno << 2);
++                      switch (breakno) {
++                      case 0:
++                              asm volatile ("movl %0, %%dr0\n"::"r"
++                                            (breakinfo[breakno].addr));
++                              break;
++
++                      case 1:
++                              asm volatile ("movl %0, %%dr1\n"::"r"
++                                            (breakinfo[breakno].addr));
++                              break;
++
++                      case 2:
++                              asm volatile ("movl %0, %%dr2\n"::"r"
++                                            (breakinfo[breakno].addr));
++                              break;
++
++                      case 3:
++                              asm volatile ("movl %0, %%dr3\n"::"r"
++                                            (breakinfo[breakno].addr));
++                              break;
++                      }
++              } else if ((dr7 & breakbit) && !breakinfo[breakno].enabled) {
++                      correctit = 1;
++                      dr7 &= ~breakbit;
++                      dr7 &= ~(0xf0000 << (breakno << 2));
++              }
++      }
++      if (correctit) {
++              asm volatile ("movl %0, %%db7\n"::"r" (dr7));
++      }
++}
++
++int
++remove_hw_break(unsigned breakno)
++{
++      if (!breakinfo[breakno].enabled) {
++              return -1;
++      }
++      breakinfo[breakno].enabled = 0;
++      return 0;
++}
++
++int
++set_hw_break(unsigned breakno, unsigned type, unsigned len, unsigned addr)
++{
++      if (breakinfo[breakno].enabled) {
++              return -1;
++      }
++      breakinfo[breakno].enabled = 1;
++      breakinfo[breakno].type = type;
++      breakinfo[breakno].len = len;
++      breakinfo[breakno].addr = addr;
++      return 0;
++}
++
++#ifdef CONFIG_SMP
++static int in_kgdb_console = 0;
++
++int
++in_kgdb(struct pt_regs *regs)
++{
++      unsigned flags;
++      int cpu = smp_processor_id();
++      in_kgdb_called = 1;
++      if (!spin_is_locked(&kgdb_spinlock)) {
++              if (in_kgdb_here_log[cpu] ||    /* we are holding this cpu */
++                  in_kgdb_console) {  /* or we are doing slow i/o */
++                      return 1;
++              }
++              return 0;
++      }
++
++      /* As I see it the only reason not to let all cpus spin on
++       * the same spin_lock is to allow selected ones to proceed.
++       * This would be a good thing, so we leave it this way.
++       * Maybe someday....  Done !
++
++       * in_kgdb() is called from an NMI so we don't pretend
++       * to have any resources, like printk() for example.  
++       */
++
++      kgdb_local_irq_save(flags);     /* only local here, to avoid hanging */
++      /*
++       * log arival of this cpu
++       * The NMI keeps on ticking.  Protect against recurring more
++       * than once, and ignor the cpu that has the kgdb lock
++       */
++      in_kgdb_entry_log[cpu]++;
++      in_kgdb_here_log[cpu] = regs;
++      if (cpu == spinlock_cpu || waiting_cpus[cpu].task) {
++              goto exit_in_kgdb;
++      }
++      /*
++       * For protection of the initilization of the spin locks by kgdb
++       * it locks the kgdb spinlock before it gets the wait locks set
++       * up.  We wait here for the wait lock to be taken.  If the
++       * kgdb lock goes away first??  Well, it could be a slow exit
++       * sequence where the wait lock is removed prior to the kgdb lock
++       * so if kgdb gets unlocked, we just exit.
++       */
++      while (spin_is_locked(&kgdb_spinlock) &&
++             !spin_is_locked(waitlocks + cpu)) ;
++      if (!spin_is_locked(&kgdb_spinlock)) {
++              goto exit_in_kgdb;
++      }
++      waiting_cpus[cpu].task = current;
++      waiting_cpus[cpu].pid = (current->pid) ? : (PID_MAX + cpu);
++      waiting_cpus[cpu].regs = regs;
++
++      spin_unlock_wait(waitlocks + cpu);
++      /*
++       * log departure of this cpu
++       */
++      waiting_cpus[cpu].task = 0;
++      waiting_cpus[cpu].pid = 0;
++      waiting_cpus[cpu].regs = 0;
++      correct_hw_break();
++      exit_in_kgdb:
++      in_kgdb_here_log[cpu] = 0;
++      kgdb_local_irq_restore(flags);
++      return 1;
++      /*
++         spin_unlock(continuelocks + smp_processor_id());
++       */
++}
++
++void
++smp__in_kgdb(struct pt_regs regs)
++{
++      ack_APIC_irq();
++      in_kgdb(&regs);
++}
++#else
++int
++in_kgdb(struct pt_regs *regs)
++{
++      return (kgdb_spinlock);
++}
++#endif
++
++void
++printexceptioninfo(int exceptionNo, int errorcode, char *buffer)
++{
++      unsigned dr6;
++      int i;
++      switch (exceptionNo) {
++      case 1:         /* debug exception */
++              break;
++      case 3:         /* breakpoint */
++              sprintf(buffer, "Software breakpoint");
++              return;
++      default:
++              sprintf(buffer, "Details not available");
++              return;
++      }
++      asm volatile ("movl %%db6, %0\n":"=r" (dr6)
++                    :);
++      if (dr6 & 0x4000) {
++              sprintf(buffer, "Single step");
++              return;
++      }
++      for (i = 0; i < 4; ++i) {
++              if (dr6 & (1 << i)) {
++                      sprintf(buffer, "Hardware breakpoint %d", i);
++                      return;
++              }
++      }
++      sprintf(buffer, "Unknown trap");
++      return;
++}
++
++/*
++ * This function does all command procesing for interfacing to gdb.
++ *
++ * NOTE:  The INT nn instruction leaves the state of the interrupt
++ *      enable flag UNCHANGED.  That means that when this routine
++ *      is entered via a breakpoint (INT 3) instruction from code
++ *      that has interrupts enabled, then interrupts will STILL BE
++ *      enabled when this routine is entered.  The first thing that
++ *      we do here is disable interrupts so as to prevent recursive
++ *      entries and bothersome serial interrupts while we are
++ *      trying to run the serial port in polled mode.
++ *
++ * For kernel version 2.1.xx the kgdb_cli() actually gets a spin lock so
++ * it is always necessary to do a restore_flags before returning
++ * so as to let go of that lock.
++ */
++int
++kgdb_handle_exception(int exceptionVector,
++                    int signo, int err_code, struct pt_regs *linux_regs)
++{
++      struct task_struct *usethread = NULL;
++      struct task_struct *thread_list_start = 0, *thread = NULL;
++      int addr, length;
++      int breakno, breaktype;
++      char *ptr;
++      int newPC;
++      threadref thref;
++      int threadid;
++      int thread_min = PID_MAX + MAX_NO_CPUS;
++      int maxthreads;
++      int nothreads;
++      unsigned long flags;
++      int gdb_regs[NUMREGBYTES / 4];
++      int dr6;
++      IF_SMP(int entry_state = 0);    /* 0, ok, 1, no nmi, 2 sync failed */
++#define NO_NMI 1
++#define NO_SYNC 2
++#define       regs    (*linux_regs)
++#define NUMREGS NUMREGBYTES/4
++      /*
++       * If the entry is not from the kernel then return to the Linux
++       * trap handler and let it process the interrupt normally.
++       */
++      if ((linux_regs->eflags & VM_MASK) || (3 & linux_regs->xcs)) {
++              printk("ignoring non-kernel exception\n");
++              print_regs(&regs);
++              return (0);
++      }
++
++      kgdb_local_irq_save(flags);
++
++      /* Get kgdb spinlock */
++
++      KGDB_SPIN_LOCK(&kgdb_spinlock);
++      rdtscll(kgdb_info.entry_tsc);
++      /*
++       * We depend on this spinlock and the NMI watch dog to control the 
++       * other cpus.  They will arrive at "in_kgdb()" as a result of the
++       * NMI and will wait there for the following spin locks to be 
++       * released.
++       */
++#ifdef CONFIG_SMP
++
++#if 0
++      if (cpu_callout_map & ~MAX_CPU_MASK) {
++              printk("kgdb : too many cpus, possibly not mapped"
++                     " in contiguous space, change MAX_NO_CPUS"
++                     " in kgdb_stub and make new kernel.\n"
++                     " cpu_callout_map is %lx\n", cpu_callout_map);
++              goto exit_just_unlock;
++      }
++#endif
++      if (spinlock_count == 1) {
++              int time, end_time, dum;
++              int i;
++              int cpu_logged_in[MAX_NO_CPUS] = {[0 ... MAX_NO_CPUS - 1] = (0)
++              };
++              if (remote_debug) {
++                      printk("kgdb : cpu %d entry, syncing others\n",
++                             smp_processor_id());
++              }
++              for (i = 0; i < MAX_NO_CPUS; i++) {
++                      /*
++                       * Use trylock as we may already hold the lock if
++                       * we are holding the cpu.  Net result is all
++                       * locked.
++                       */
++                      spin_trylock(&waitlocks[i]);
++              }
++              for (i = 0; i < MAX_NO_CPUS; i++)
++                      cpu_logged_in[i] = 0;
++              /*
++               * Wait for their arrival.  We know the watch dog is active if 
++               * in_kgdb() has ever been called, as it is always called on a 
++               * watchdog tick.
++               */
++              rdtsc(dum, time);
++              end_time = time + 2;    /* Note: we use the High order bits! */
++              i = 1;
++              if (num_online_cpus() > 1) {
++                      int me_in_kgdb = in_kgdb_entry_log[smp_processor_id()];
++                      smp_send_nmi_allbutself();
++                      while (i < num_online_cpus() && time != end_time) {
++                              int j;
++                              for (j = 0; j < MAX_NO_CPUS; j++) {
++                                      if (waiting_cpus[j].task &&
++                                          !cpu_logged_in[j]) {
++                                              i++;
++                                              cpu_logged_in[j] = 1;
++                                              if (remote_debug) {
++                                                      printk
++                                                          ("kgdb : cpu %d arrived at kgdb\n",
++                                                           j);
++                                              }
++                                              break;
++                                      } else if (!waiting_cpus[j].task &&
++                                                 !cpu_online(j)) {
++                                              waiting_cpus[j].task = NOCPU;
++                                              cpu_logged_in[j] = 1;
++                                              waiting_cpus[j].hold = 1;
++                                              break;
++                                      }
++                                      if (!waiting_cpus[j].task &&
++                                          in_kgdb_here_log[j]) {
++
++                                              int wait = 100000;
++                                              while (wait--) ;
++                                              if (!waiting_cpus[j].task &&
++                                                  in_kgdb_here_log[j]) {
++                                                      printk
++                                                          ("kgdb : cpu %d stall"
++                                                           " in in_kgdb\n",
++                                                           j);
++                                                      i++;
++                                                      cpu_logged_in[j] = 1;
++                                                      waiting_cpus[j].task =
++                                                          (struct task_struct
++                                                           *) 1;
++                                              }
++                                      }
++                              }
++
++                              if (in_kgdb_entry_log[smp_processor_id()] >
++                                  (me_in_kgdb + 10)) {
++                                      break;
++                              }
++
++                              rdtsc(dum, time);
++                      }
++                      if (i < num_online_cpus()) {
++                              printk
++                                  ("kgdb : time out, proceeding without sync\n");
++#if 0
++                              printk("kgdb : Waiting_cpus: 0 = %d, 1 = %d\n",
++                                     waiting_cpus[0].task != 0,
++                                     waiting_cpus[1].task != 0);
++                              printk("kgdb : Cpu_logged in: 0 = %d, 1 = %d\n",
++                                     cpu_logged_in[0], cpu_logged_in[1]);
++                              printk
++                                  ("kgdb : in_kgdb_here_log in: 0 = %d, 1 = %d\n",
++                                   in_kgdb_here_log[0] != 0,
++                                   in_kgdb_here_log[1] != 0);
++#endif
++                              entry_state = NO_SYNC;
++                      } else {
++#if 0
++                              int ent =
++                                  in_kgdb_entry_log[smp_processor_id()] -
++                                  me_in_kgdb;
++                              printk("kgdb : sync after %d entries\n", ent);
++#endif
++                      }
++              } else {
++                      if (remote_debug) {
++                              printk
++                                  ("kgdb : %d cpus, but watchdog not active\n"
++                                   "proceeding without locking down other cpus\n",
++                                   num_online_cpus());
++                              entry_state = NO_NMI;
++                      }
++              }
++      }
++#endif
++
++      if (remote_debug) {
++              unsigned long *lp = (unsigned long *) &linux_regs;
++
++              printk("handle_exception(exceptionVector=%d, "
++                     "signo=%d, err_code=%d, linux_regs=%p)\n",
++                     exceptionVector, signo, err_code, linux_regs);
++              if (debug_regs) {
++                      print_regs(&regs);
++                      printk("Stk: %8lx %8lx %8lx %8lx"
++                             "  %8lx %8lx %8lx %8lx\n",
++                             lp[0], lp[1], lp[2], lp[3],
++                             lp[4], lp[5], lp[6], lp[7]);
++                      printk("     %8lx %8lx %8lx %8lx"
++                             "  %8lx %8lx %8lx %8lx\n",
++                             lp[8], lp[9], lp[10], lp[11],
++                             lp[12], lp[13], lp[14], lp[15]);
++                      printk("     %8lx %8lx %8lx %8lx  "
++                             "%8lx %8lx %8lx %8lx\n",
++                             lp[16], lp[17], lp[18], lp[19],
++                             lp[20], lp[21], lp[22], lp[23]);
++                      printk("     %8lx %8lx %8lx %8lx  "
++                             "%8lx %8lx %8lx %8lx\n",
++                             lp[24], lp[25], lp[26], lp[27],
++                             lp[28], lp[29], lp[30], lp[31]);
++              }
++      }
++
++      /* Disable hardware debugging while we are in kgdb */
++      /* Get the debug register status register */
++/*                                   *INDENT-OFF*  */
++      __asm__("movl %0,%%db7"
++            : /* no output */
++            :"r"(0));
++
++      asm volatile ("movl %%db6, %0\n"
++                    :"=r" (hw_breakpoint_status)
++                    :);
++
++/*                                   *INDENT-ON*  */
++      switch (exceptionVector) {
++      case 0:         /* divide error */
++      case 1:         /* debug exception */
++      case 2:         /* NMI */
++      case 3:         /* breakpoint */
++      case 4:         /* overflow */
++      case 5:         /* bounds check */
++      case 6:         /* invalid opcode */
++      case 7:         /* device not available */
++      case 8:         /* double fault (errcode) */
++      case 10:                /* invalid TSS (errcode) */
++      case 12:                /* stack fault (errcode) */
++      case 16:                /* floating point error */
++      case 17:                /* alignment check (errcode) */
++      default:                /* any undocumented */
++              break;
++      case 11:                /* segment not present (errcode) */
++      case 13:                /* general protection (errcode) */
++      case 14:                /* page fault (special errcode) */
++      case 19:                /* cache flush denied */
++              if (mem_err_expected) {
++                      /*
++                       * This fault occured because of the
++                       * get_char or set_char routines.  These
++                       * two routines use either eax of edx to
++                       * indirectly reference the location in
++                       * memory that they are working with.
++                       * For a page fault, when we return the
++                       * instruction will be retried, so we
++                       * have to make sure that these
++                       * registers point to valid memory. 
++                       */
++                      mem_err = 1;    /* set mem error flag */
++                      mem_err_expected = 0;
++                      mem_err_cnt++;  /* helps in debugging */
++                      /* make valid address */
++                      regs.eax = (long) &garbage_loc;
++                      /* make valid address */
++                      regs.edx = (long) &garbage_loc;
++                      if (remote_debug)
++                              printk("Return after memory error: "
++                                     "mem_err_cnt=%d\n", mem_err_cnt);
++                      if (debug_regs)
++                              print_regs(&regs);
++                      goto exit_kgdb;
++              }
++              break;
++      }
++      if (remote_debug)
++              printk("kgdb : entered kgdb on cpu %d\n", smp_processor_id());
++
++      gdb_i386vector = exceptionVector;
++      gdb_i386errcode = err_code;
++      kgdb_info.called_from = __builtin_return_address(0);
++#ifdef CONFIG_SMP
++      /*
++       * OK, we can now communicate, lets tell gdb about the sync.
++       * but only if we had a problem.
++       */
++      switch (entry_state) {
++      case NO_NMI:
++              to_gdb("NMI not active, other cpus not stopped\n");
++              break;
++      case NO_SYNC:
++              to_gdb("Some cpus not stopped, see 'kgdb_info' for details\n");
++      default:;
++      }
++
++#endif
++/*
++ * Set up the gdb function call area.
++ */
++      trap_cpu = smp_processor_id();
++      OLD_esp = NEW_esp = (int) (&linux_regs->esp);
++
++      IF_SMP(once_again:)
++          /* reply to host that an exception has occurred */
++          remcomOutBuffer[0] = 'S';
++      remcomOutBuffer[1] = hexchars[signo >> 4];
++      remcomOutBuffer[2] = hexchars[signo % 16];
++      remcomOutBuffer[3] = 0;
++
++      putpacket(remcomOutBuffer);
++
++      while (1 == 1) {
++              error = 0;
++              remcomOutBuffer[0] = 0;
++              getpacket(remcomInBuffer);
++              switch (remcomInBuffer[0]) {
++              case '?':
++                      remcomOutBuffer[0] = 'S';
++                      remcomOutBuffer[1] = hexchars[signo >> 4];
++                      remcomOutBuffer[2] = hexchars[signo % 16];
++                      remcomOutBuffer[3] = 0;
++                      break;
++              case 'd':
++                      remote_debug = !(remote_debug); /* toggle debug flag */
++                      printk("Remote debug %s\n",
++                             remote_debug ? "on" : "off");
++                      break;
++              case 'g':       /* return the value of the CPU registers */
++                      get_gdb_regs(usethread, &regs, gdb_regs);
++                      mem2hex((char *) gdb_regs,
++                              remcomOutBuffer, NUMREGBYTES, 0);
++                      break;
++              case 'G':       /* set the value of the CPU registers - return OK */
++                      hex2mem(&remcomInBuffer[1],
++                              (char *) gdb_regs, NUMREGBYTES, 0);
++                      if (!usethread || usethread == current) {
++                              gdb_regs_to_regs(gdb_regs, &regs);
++                              strcpy(remcomOutBuffer, "OK");
++                      } else {
++                              strcpy(remcomOutBuffer, "E00");
++                      }
++                      break;
++
++              case 'P':{      /* set the value of a single CPU register - 
++                                 return OK */
++                              /*
++                               * For some reason, gdb wants to talk about psudo
++                               * registers (greater than 15).  These may have
++                               * meaning for ptrace, but for us it is safe to
++                               * ignor them.  We do this by dumping them into
++                               * _GS which we also ignor, but do have memory for.
++                               */
++                              int regno;
++
++                              ptr = &remcomInBuffer[1];
++                              regs_to_gdb_regs(gdb_regs, &regs);
++                              if ((!usethread || usethread == current) &&
++                                  hexToInt(&ptr, &regno) &&
++                                  *ptr++ == '=' && (regno >= 0)) {
++                                      regno =
++                                          (regno >= NUMREGS ? _GS : regno);
++                                      hex2mem(ptr, (char *) &gdb_regs[regno],
++                                              4, 0);
++                                      gdb_regs_to_regs(gdb_regs, &regs);
++                                      strcpy(remcomOutBuffer, "OK");
++                                      break;
++                              }
++                              strcpy(remcomOutBuffer, "E01");
++                              break;
++                      }
++
++                      /* mAA..AA,LLLL  Read LLLL bytes at address AA..AA */
++              case 'm':
++                      /* TRY TO READ %x,%x.  IF SUCCEED, SET PTR = 0 */
++                      ptr = &remcomInBuffer[1];
++                      if (hexToInt(&ptr, &addr) &&
++                          (*(ptr++) == ',') && (hexToInt(&ptr, &length))) {
++                              ptr = 0;
++                              /*
++                               * hex doubles the byte count
++                               */
++                              if (length > (BUFMAX / 2))
++                                      length = BUFMAX / 2;
++                              mem2hex((char *) addr,
++                                      remcomOutBuffer, length, 1);
++                              if (mem_err) {
++                                      strcpy(remcomOutBuffer, "E03");
++                                      debug_error("memory fault\n", NULL);
++                              }
++                      }
++
++                      if (ptr) {
++                              strcpy(remcomOutBuffer, "E01");
++                              debug_error
++                                  ("malformed read memory command: %s\n",
++                                   remcomInBuffer);
++                      }
++                      break;
++
++                      /* MAA..AA,LLLL: 
++                         Write LLLL bytes at address AA.AA return OK */
++              case 'M':
++                      /* TRY TO READ '%x,%x:'.  IF SUCCEED, SET PTR = 0 */
++                      ptr = &remcomInBuffer[1];
++                      if (hexToInt(&ptr, &addr) &&
++                          (*(ptr++) == ',') &&
++                          (hexToInt(&ptr, &length)) && (*(ptr++) == ':')) {
++                              hex2mem(ptr, (char *) addr, length, 1);
++
++                              if (mem_err) {
++                                      strcpy(remcomOutBuffer, "E03");
++                                      debug_error("memory fault\n", NULL);
++                              } else {
++                                      strcpy(remcomOutBuffer, "OK");
++                              }
++
++                              ptr = 0;
++                      }
++                      if (ptr) {
++                              strcpy(remcomOutBuffer, "E02");
++                              debug_error
++                                  ("malformed write memory command: %s\n",
++                                   remcomInBuffer);
++                      }
++                      break;
++
++                      /* cAA..AA  Continue at address AA..AA(optional) */
++                      /* sAA..AA  Step one instruction from AA..AA(optional) */
++                      /* D        detach, reply OK and then continue */
++              case 'c':
++              case 's':
++              case 'D':
++
++                      /* try to read optional parameter, 
++                         pc unchanged if no parm */
++                      ptr = &remcomInBuffer[1];
++                      if (hexToInt(&ptr, &addr)) {
++                              if (remote_debug)
++                                      printk("Changing EIP to 0x%x\n", addr);
++
++                              regs.eip = addr;
++                      }
++
++                      newPC = regs.eip;
++
++                      /* clear the trace bit */
++                      regs.eflags &= 0xfffffeff;
++
++                      /* set the trace bit if we're stepping */
++                      if (remcomInBuffer[0] == 's')
++                              regs.eflags |= 0x100;
++
++                      /* detach is a friendly version of continue. Note that
++                         debugging is still enabled (e.g hit control C)
++                         until the process that issued an ioctl TIOCGDB
++                         terminates
++                       */
++                      if (remcomInBuffer[0] == 'D') {
++                              strcpy(remcomOutBuffer, "OK");
++                              putpacket(remcomOutBuffer);
++                      }
++
++                      if (remote_debug) {
++                              printk("Resuming execution\n");
++                              print_regs(&regs);
++                      }
++                      asm volatile ("movl %%db6, %0\n":"=r" (dr6)
++                                    :);
++                      if (!(dr6 & 0x4000)) {
++                              for (breakno = 0; breakno < 4; ++breakno) {
++                                      if (dr6 & (1 << breakno) &&
++                                          (breakinfo[breakno].type == 0)) {
++                                              /* Set restore flag */
++                                              regs.eflags |= 0x10000;
++                                              break;
++                                      }
++                              }
++                      }
++                      correct_hw_break();
++                      asm volatile ("movl %0, %%db6\n"::"r" (0));
++                      goto exit_kgdb;
++
++                      /* kill the program */
++              case 'k':       /* do nothing */
++                      break;
++
++                      /* query */
++              case 'q':
++                      switch (remcomInBuffer[1]) {
++                      case 'L':
++                              /* List threads */
++                              thread_list = 2;
++                              thread_list_start = (usethread ? : current);
++                              unpack_byte(remcomInBuffer + 3, &maxthreads);
++                              unpack_threadid(remcomInBuffer + 5, &thref);
++                              do {
++                                      int buf_thread_limit =
++                                          (BUFMAX - 22) / BUF_THREAD_ID_SIZE;
++                                      if (maxthreads > buf_thread_limit) {
++                                              maxthreads = buf_thread_limit;
++                                      }
++                              } while (0);
++                              remcomOutBuffer[0] = 'q';
++                              remcomOutBuffer[1] = 'M';
++                              remcomOutBuffer[4] = '0';
++                              pack_threadid(remcomOutBuffer + 5, &thref);
++
++                              threadid = threadref_to_int(&thref);
++                              for (nothreads = 0;
++                                   nothreads < maxthreads &&
++                                   threadid < PID_MAX + MAX_NO_CPUS;
++                                   threadid++) {
++                                      thread = getthread(threadid);
++                                      if (thread) {
++                                              int_to_threadref(&thref,
++                                                               threadid);
++                                              pack_threadid(remcomOutBuffer +
++                                                            21 +
++                                                            nothreads * 16,
++                                                            &thref);
++                                              nothreads++;
++                                              if (thread_min > threadid)
++                                                      thread_min = threadid;
++                                      }
++                              }
++
++                              if (threadid == PID_MAX + MAX_NO_CPUS) {
++                                      remcomOutBuffer[4] = '1';
++                              }
++                              pack_hex_byte(remcomOutBuffer + 2, nothreads);
++                              remcomOutBuffer[21 + nothreads * 16] = '\0';
++                              break;
++
++                      case 'C':
++                              /* Current thread id */
++                              remcomOutBuffer[0] = 'Q';
++                              remcomOutBuffer[1] = 'C';
++                              threadid = current->pid;
++                              if (!threadid) {
++                                      /*
++                                       * idle thread
++                                       */
++                                      for (threadid = PID_MAX;
++                                           threadid < PID_MAX + MAX_NO_CPUS;
++                                           threadid++) {
++                                              if (current ==
++                                                  idle_task(threadid -
++                                                            PID_MAX))
++                                                      break;
++                                      }
++                              }
++                              int_to_threadref(&thref, threadid);
++                              pack_threadid(remcomOutBuffer + 2, &thref);
++                              remcomOutBuffer[18] = '\0';
++                              break;
++
++                      case 'E':
++                              /* Print exception info */
++                              printexceptioninfo(exceptionVector,
++                                                 err_code, remcomOutBuffer);
++                              break;
++                      }
++                      break;
++
++                      /* task related */
++              case 'H':
++                      switch (remcomInBuffer[1]) {
++                      case 'g':
++                              ptr = &remcomInBuffer[2];
++                              hexToInt(&ptr, &threadid);
++                              thread = getthread(threadid);
++                              if (!thread) {
++                                      remcomOutBuffer[0] = 'E';
++                                      remcomOutBuffer[1] = '\0';
++                                      break;
++                              }
++                              /*
++                               * Just in case I forget what this is all about,
++                               * the "thread info" command to gdb causes it
++                               * to ask for a thread list.  It then switches
++                               * to each thread and asks for the registers.
++                               * For this (and only this) usage, we want to
++                               * fudge the registers of tasks not on the run
++                               * list (i.e. waiting) to show the routine that
++                               * called schedule. Also, gdb, is a minimalist
++                               * in that if the current thread is the last
++                               * it will not re-read the info when done.
++                               * This means that in this case we must show
++                               * the real registers. So here is how we do it:
++                               * Each entry we keep track of the min
++                               * thread in the list (the last that gdb will)
++                               * get info for.  We also keep track of the
++                               * starting thread.
++                               * "thread_list" is cleared when switching back
++                               * to the min thread if it is was current, or
++                               * if it was not current, thread_list is set 
++                               * to 1.  When the switch to current comes,
++                               * if thread_list is 1, clear it, else do 
++                               * nothing.
++                               */
++                              usethread = thread;
++                              if ((thread_list == 1) &&
++                                  (thread == thread_list_start)) {
++                                      thread_list = 0;
++                              }
++                              if (thread_list && (threadid == thread_min)) {
++                                      if (thread == thread_list_start) {
++                                              thread_list = 0;
++                                      } else {
++                                              thread_list = 1;
++                                      }
++                              }
++                              /* follow through */
++                      case 'c':
++                              remcomOutBuffer[0] = 'O';
++                              remcomOutBuffer[1] = 'K';
++                              remcomOutBuffer[2] = '\0';
++                              break;
++                      }
++                      break;
++
++                      /* Query thread status */
++              case 'T':
++                      ptr = &remcomInBuffer[1];
++                      hexToInt(&ptr, &threadid);
++                      thread = getthread(threadid);
++                      if (thread) {
++                              remcomOutBuffer[0] = 'O';
++                              remcomOutBuffer[1] = 'K';
++                              remcomOutBuffer[2] = '\0';
++                              if (thread_min > threadid)
++                                      thread_min = threadid;
++                      } else {
++                              remcomOutBuffer[0] = 'E';
++                              remcomOutBuffer[1] = '\0';
++                      }
++                      break;
++
++              case 'Y':
++                      ptr = &remcomInBuffer[1];
++                      hexToInt(&ptr, &breakno);
++                      ptr++;
++                      hexToInt(&ptr, &breaktype);
++                      ptr++;
++                      hexToInt(&ptr, &length);
++                      ptr++;
++                      hexToInt(&ptr, &addr);
++                      if (set_hw_break(breakno & 0x3,
++                                       breaktype & 0x3,
++                                       length & 0x3, addr) == 0) {
++                              strcpy(remcomOutBuffer, "OK");
++                      } else {
++                              strcpy(remcomOutBuffer, "ERROR");
++                      }
++                      break;
++
++                      /* Remove hardware breakpoint */
++              case 'y':
++                      ptr = &remcomInBuffer[1];
++                      hexToInt(&ptr, &breakno);
++                      if (remove_hw_break(breakno & 0x3) == 0) {
++                              strcpy(remcomOutBuffer, "OK");
++                      } else {
++                              strcpy(remcomOutBuffer, "ERROR");
++                      }
++                      break;
++
++              case 'r':       /* reboot */
++                      strcpy(remcomOutBuffer, "OK");
++                      putpacket(remcomOutBuffer);
++                      /*to_gdb("Rebooting\n"); */
++                      /* triplefault   no return from here */
++                      {
++                              static long no_idt[2];
++                              __asm__ __volatile__("lidt %0"::"m"(no_idt));
++                              BREAKPOINT;
++                      }
++
++              }               /* switch */
++
++              /* reply to the request */
++              putpacket(remcomOutBuffer);
++      }                       /* while(1==1) */
++      /*
++       *  reached by goto only.
++       */
++      exit_kgdb:
++      /*
++       * Here is where we set up to trap a gdb function call.  NEW_esp
++       * will be changed if we are trying to do this.  We handle both
++       * adding and subtracting, thus allowing gdb to put grung on 
++       * the stack which it removes later.
++       */
++      if (NEW_esp != OLD_esp) {
++              int *ptr = END_OF_LOOKASIDE;
++              if (NEW_esp < OLD_esp)
++                      ptr -= (OLD_esp - NEW_esp) / sizeof (int);
++              *--ptr = linux_regs->eflags;
++              *--ptr = linux_regs->xcs;
++              *--ptr = linux_regs->eip;
++              *--ptr = linux_regs->ecx;
++              *--ptr = linux_regs->ebx;
++              *--ptr = linux_regs->eax;
++              linux_regs->ecx = NEW_esp - (sizeof (int) * 6);
++              linux_regs->ebx = (unsigned int) END_OF_LOOKASIDE;
++              if (NEW_esp < OLD_esp) {
++                      linux_regs->eip = (unsigned int) fn_call_stub;
++              } else {
++                      linux_regs->eip = (unsigned int) fn_rtn_stub;
++                      linux_regs->eax = NEW_esp;
++              }
++              linux_regs->eflags &= ~(IF_BIT | TF_BIT);
++      }
++#ifdef CONFIG_SMP
++      /*
++       * Release gdb wait locks 
++       * Sanity check time.  Must have at least one cpu to run.  Also single
++       * step must not be done if the current cpu is on hold.
++       */
++      if (spinlock_count == 1) {
++              int ss_hold = (regs.eflags & 0x100) && kgdb_info.hold_on_sstep;
++              int cpu_avail = 0;
++              int i;
++
++              for (i = 0; i < MAX_NO_CPUS; i++) {
++                      if (!cpu_online(i))
++                              break;
++                      if (!hold_cpu(i)) {
++                              cpu_avail = 1;
++                      }
++              }
++              /*
++               * Early in the bring up there will be NO cpus on line...
++               */
++              if (!cpu_avail && !cpus_empty(cpu_online_map)) {
++                      to_gdb("No cpus unblocked, see 'kgdb_info.hold_cpu'\n");
++                      goto once_again;
++              }
++              if (hold_cpu(smp_processor_id()) && (regs.eflags & 0x100)) {
++                      to_gdb
++                          ("Current cpu must be unblocked to single step\n");
++                      goto once_again;
++              }
++              if (!(ss_hold)) {
++                      int i;
++                      for (i = 0; i < MAX_NO_CPUS; i++) {
++                              if (!hold_cpu(i)) {
++                                      spin_unlock(&waitlocks[i]);
++                              }
++                      }
++              } else {
++                      spin_unlock(&waitlocks[smp_processor_id()]);
++              }
++              /* Release kgdb spinlock */
++              KGDB_SPIN_UNLOCK(&kgdb_spinlock);
++              /*
++               * If this cpu is on hold, this is where we
++               * do it.  Note, the NMI will pull us out of here,
++               * but will return as the above lock is not held.
++               * We will stay here till another cpu releases the lock for us.
++               */
++              spin_unlock_wait(waitlocks + smp_processor_id());
++              kgdb_local_irq_restore(flags);
++              return (0);
++      }
++#if 0
++exit_just_unlock:
++#endif
++#endif
++      /* Release kgdb spinlock */
++      KGDB_SPIN_UNLOCK(&kgdb_spinlock);
++      kgdb_local_irq_restore(flags);
++      return (0);
++}
++
++/* this function is used to set up exception handlers for tracing and
++ * breakpoints. 
++ * This function is not needed as the above line does all that is needed.
++ * We leave it for backward compatitability...
++ */
++void
++set_debug_traps(void)
++{
++      /*
++       * linux_debug_hook is defined in traps.c.  We store a pointer
++       * to our own exception handler into it.
++
++       * But really folks, every hear of labeled common, an old Fortran
++       * concept.  Lots of folks can reference it and it is define if 
++       * anyone does.  Only one can initialize it at link time.  We do 
++       * this with the hook.  See the statement above.  No need for any
++       * executable code and it is ready as soon as the kernel is
++       * loaded.  Very desirable in kernel debugging.
++
++       linux_debug_hook = handle_exception ;
++       */
++
++      /* In case GDB is started before us, ack any packets (presumably
++         "$?#xx") sitting there. 
++         putDebugChar ('+');
++
++         initialized = 1;
++       */
++}
++
++/* This function will generate a breakpoint exception.        It is used at the
++   beginning of a program to sync up with a debugger and can be used
++   otherwise as a quick means to stop program execution and "break" into
++   the debugger. */
++/* But really, just use the BREAKPOINT macro.  We will handle the int stuff
++ */
++
++#ifdef later
++/*
++ * possibly we should not go thru the traps.c code at all?  Someday.
++ */
++void
++do_kgdb_int3(struct pt_regs *regs, long error_code)
++{
++      kgdb_handle_exception(3, 5, error_code, regs);
++      return;
++}
++#endif
++#undef regs
++#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
++asmlinkage void
++bad_sys_call_exit(int stuff)
++{
++      struct pt_regs *regs = (struct pt_regs *) &stuff;
++      printk("Sys call %d return with %x preempt_count\n",
++             (int) regs->orig_eax, preempt_count());
++}
++#endif
++#ifdef CONFIG_STACK_OVERFLOW_TEST
++#include <asm/kgdb.h>
++asmlinkage void
++stack_overflow(void)
++{
++#ifdef BREAKPOINT
++      BREAKPOINT;
++#else
++      printk("Kernel stack overflow, looping forever\n");
++#endif
++      while (1) {
++      }
++}
++#endif
++
++#if defined(CONFIG_SMP) || defined(CONFIG_KGDB_CONSOLE)
++char gdbconbuf[BUFMAX];
++
++static void
++kgdb_gdb_message(const char *s, unsigned count)
++{
++      int i;
++      int wcount;
++      char *bufptr;
++      /*
++       * This takes care of NMI while spining out chars to gdb
++       */
++      IF_SMP(in_kgdb_console = 1);
++      gdbconbuf[0] = 'O';
++      bufptr = gdbconbuf + 1;
++      while (count > 0) {
++              if ((count << 1) > (BUFMAX - 2)) {
++                      wcount = (BUFMAX - 2) >> 1;
++              } else {
++                      wcount = count;
++              }
++              count -= wcount;
++              for (i = 0; i < wcount; i++) {
++                      bufptr = pack_hex_byte(bufptr, s[i]);
++              }
++              *bufptr = '\0';
++              s += wcount;
++
++              putpacket(gdbconbuf);
++
++      }
++      IF_SMP(in_kgdb_console = 0);
++}
++#endif
++#ifdef CONFIG_SMP
++static void
++to_gdb(const char *s)
++{
++      int count = 0;
++      while (s[count] && (count++ < BUFMAX)) ;
++      kgdb_gdb_message(s, count);
++}
++#endif
++#ifdef CONFIG_KGDB_CONSOLE
++#include <linux/console.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <asm/uaccess.h>
++#include <asm/semaphore.h>
++
++void
++kgdb_console_write(struct console *co, const char *s, unsigned count)
++{
++
++      if (gdb_i386vector == -1) {
++              /*
++               * We have not yet talked to gdb.  What to do...
++               * lets break, on continue we can do the write.
++               * But first tell him whats up. Uh, well no can do,
++               * as this IS the console.  Oh well...
++               * We do need to wait or the messages will be lost.
++               * Other option would be to tell the above code to
++               * ignore this breakpoint and do an auto return, 
++               * but that might confuse gdb.  Also this happens 
++               * early enough in boot up that we don't have the traps
++               * set up yet, so...
++               */
++              breakpoint();
++      }
++      kgdb_gdb_message(s, count);
++}
++
++/*
++ * ------------------------------------------------------------
++ * Serial KGDB driver 
++ * ------------------------------------------------------------
++ */
++
++static struct console kgdbcons = {
++      name:"kgdb",
++      write:kgdb_console_write,
++#ifdef CONFIG_KGDB_USER_CONSOLE
++      device:kgdb_console_device,
++#endif
++      flags:CON_PRINTBUFFER | CON_ENABLED,
++      index:-1,
++};
++
++/*
++ * The trick here is that this file gets linked before printk.o
++ * That means we get to peer at the console info in the command
++ * line before it does.        If we are up, we register, otherwise,
++ * do nothing.        By returning 0, we allow printk to look also.
++ */
++static int kgdb_console_enabled;
++
++int __init
++kgdb_console_init(char *str)
++{
++      if ((strncmp(str, "kgdb", 4) == 0) || (strncmp(str, "gdb", 3) == 0)) {
++              register_console(&kgdbcons);
++              kgdb_console_enabled = 1;
++      }
++      return 0;               /* let others look at the string */
++}
++
++__setup("console=", kgdb_console_init);
++
++#ifdef CONFIG_KGDB_USER_CONSOLE
++static kdev_t kgdb_console_device(struct console *c);
++/* This stuff sort of works, but it knocks out telnet devices  
++ * we are leaving it here in case we (or you) find time to figure it out
++ * better..
++ */
++
++/*
++ * We need a real char device as well for when the console is opened for user
++ * space activities.
++ */
++
++static int
++kgdb_consdev_open(struct inode *inode, struct file *file)
++{
++      return 0;
++}
++
++static ssize_t
++kgdb_consdev_write(struct file *file, const char *buf,
++                 size_t count, loff_t * ppos)
++{
++      int size, ret = 0;
++      static char kbuf[128];
++      static DECLARE_MUTEX(sem);
++
++      /* We are not reentrant... */
++      if (down_interruptible(&sem))
++              return -ERESTARTSYS;
++
++      while (count > 0) {
++              /* need to copy the data from user space */
++              size = count;
++              if (size > sizeof (kbuf))
++                      size = sizeof (kbuf);
++              if (copy_from_user(kbuf, buf, size)) {
++                      ret = -EFAULT;
++                      break;;
++              }
++              kgdb_console_write(&kgdbcons, kbuf, size);
++              count -= size;
++              ret += size;
++              buf += size;
++      }
++
++      up(&sem);
++
++      return ret;
++}
++
++struct file_operations kgdb_consdev_fops = {
++      open:kgdb_consdev_open,
++      write:kgdb_consdev_write
++};
++static kdev_t
++kgdb_console_device(struct console *c)
++{
++      return MKDEV(TTYAUX_MAJOR, 1);
++}
++
++/*
++ * This routine gets called from the serial stub in the i386/lib 
++ * This is so it is done late in bring up (just before the console open).
++ */
++void
++kgdb_console_finit(void)
++{
++      if (kgdb_console_enabled) {
++              char *cptr = cdevname(MKDEV(TTYAUX_MAJOR, 1));
++              char *cp = cptr;
++              while (*cptr && *cptr != '(')
++                      cptr++;
++              *cptr = 0;
++              unregister_chrdev(TTYAUX_MAJOR, cp);
++              register_chrdev(TTYAUX_MAJOR, "kgdb", &kgdb_consdev_fops);
++      }
++}
++#endif
++#endif
++#ifdef CONFIG_KGDB_TS
++#include <asm/msr.h>          /* time stamp code */
++#include <asm/hardirq.h>      /* in_interrupt */
++#ifdef CONFIG_KGDB_TS_64
++#define DATA_POINTS 64
++#endif
++#ifdef CONFIG_KGDB_TS_128
++#define DATA_POINTS 128
++#endif
++#ifdef CONFIG_KGDB_TS_256
++#define DATA_POINTS 256
++#endif
++#ifdef CONFIG_KGDB_TS_512
++#define DATA_POINTS 512
++#endif
++#ifdef CONFIG_KGDB_TS_1024
++#define DATA_POINTS 1024
++#endif
++#ifndef DATA_POINTS
++#define DATA_POINTS 128               /* must be a power of two */
++#endif
++#define INDEX_MASK (DATA_POINTS - 1)
++#if (INDEX_MASK & DATA_POINTS)
++#error "CONFIG_KGDB_TS_COUNT must be a power of 2"
++#endif
++struct kgdb_and_then_struct {
++#ifdef CONFIG_SMP
++      int on_cpu;
++#endif
++      struct task_struct *task;
++      long long at_time;
++      int from_ln;
++      char *in_src;
++      void *from;
++      int *with_shpf;
++      int data0;
++      int data1;
++};
++struct kgdb_and_then_struct2 {
++#ifdef CONFIG_SMP
++      int on_cpu;
++#endif
++      struct task_struct *task;
++      long long at_time;
++      int from_ln;
++      char *in_src;
++      void *from;
++      int *with_shpf;
++      struct task_struct *t1;
++      struct task_struct *t2;
++};
++struct kgdb_and_then_struct kgdb_data[DATA_POINTS];
++
++struct kgdb_and_then_struct *kgdb_and_then = &kgdb_data[0];
++int kgdb_and_then_count;
++
++void
++kgdb_tstamp(int line, char *source, int data0, int data1)
++{
++      static spinlock_t ts_spin = SPIN_LOCK_UNLOCKED;
++      int flags;
++      kgdb_local_irq_save(flags);
++      spin_lock(&ts_spin);
++      rdtscll(kgdb_and_then->at_time);
++#ifdef CONFIG_SMP
++      kgdb_and_then->on_cpu = smp_processor_id();
++#endif
++      kgdb_and_then->task = current;
++      kgdb_and_then->from_ln = line;
++      kgdb_and_then->in_src = source;
++      kgdb_and_then->from = __builtin_return_address(0);
++      kgdb_and_then->with_shpf = (int *) (((flags & IF_BIT) >> 9) |
++                                          (preempt_count() << 8));
++      kgdb_and_then->data0 = data0;
++      kgdb_and_then->data1 = data1;
++      kgdb_and_then = &kgdb_data[++kgdb_and_then_count & INDEX_MASK];
++      spin_unlock(&ts_spin);
++      kgdb_local_irq_restore(flags);
++#ifdef CONFIG_PREEMPT
++
++#endif
++      return;
++}
++#endif
++typedef int gdb_debug_hook(int exceptionVector,
++                         int signo, int err_code, struct pt_regs *linux_regs);
++gdb_debug_hook *linux_debug_hook = &kgdb_handle_exception;    /* histerical reasons... */
+--- linux-2.6.0-test1/arch/i386/kernel/ldt.c   2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/i386/kernel/ldt.c  2003-07-19 17:04:06.000000000 -0700
+@@ -56,9 +56,11 @@ static int alloc_ldt(mm_context_t *pc, i
+       if (reload) {
+ #ifdef CONFIG_SMP
++              cpumask_t mask;
+               preempt_disable();
+               load_LDT(pc);
+-              if (current->mm->cpu_vm_mask != (1 << smp_processor_id()))
++              mask = cpumask_of_cpu(smp_processor_id());
++              if (!cpus_equal(current->mm->cpu_vm_mask, mask))
+                       smp_call_function(flush_ldt, 0, 1, 1);
+               preempt_enable();
+ #else
+--- linux-2.6.0-test1/arch/i386/kernel/Makefile        2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/Makefile       2003-07-19 17:04:02.000000000 -0700
+@@ -14,6 +14,7 @@ obj-y                                += timers/
+ obj-$(CONFIG_ACPI)            += acpi/
+ obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o
+ obj-$(CONFIG_MCA)             += mca.o
++obj-$(CONFIG_KGDB)            += kgdb_stub.o 
+ obj-$(CONFIG_X86_MSR)         += msr.o
+ obj-$(CONFIG_X86_CPUID)               += cpuid.o
+ obj-$(CONFIG_MICROCODE)               += microcode.o
+--- linux-2.6.0-test1/arch/i386/kernel/mpparse.c       2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/i386/kernel/mpparse.c      2003-07-19 17:04:06.000000000 -0700
+@@ -71,7 +71,7 @@ unsigned int boot_cpu_logical_apicid = -
+ static unsigned int __initdata num_processors;
+ /* Bitmask of physically existing CPUs */
+-unsigned long phys_cpu_present_map;
++physid_mask_t phys_cpu_present_map;
+ u8 bios_cpu_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
+@@ -106,6 +106,7 @@ static struct mpc_config_translation *tr
+ void __init MP_processor_info (struct mpc_config_processor *m)
+ {
+       int ver, apicid;
++      physid_mask_t tmp;
+       
+       if (!(m->mpc_cpuflag & CPU_ENABLED))
+               return;
+@@ -176,7 +177,8 @@ void __init MP_processor_info (struct mp
+       }
+       ver = m->mpc_apicver;
+-      phys_cpu_present_map |= apicid_to_cpu_present(apicid);
++      tmp = apicid_to_cpu_present(apicid);
++      physids_or(phys_cpu_present_map, phys_cpu_present_map, tmp);
+       
+       /*
+        * Validate version
+--- linux-2.6.0-test1/arch/i386/kernel/msr.c   2003-06-14 12:18:08.000000000 -0700
++++ 25/arch/i386/kernel/msr.c  2003-07-19 17:04:06.000000000 -0700
+@@ -242,7 +242,7 @@ static int msr_open(struct inode *inode,
+   int cpu = minor(file->f_dentry->d_inode->i_rdev);
+   struct cpuinfo_x86 *c = &(cpu_data)[cpu];
+   
+-  if ( !(cpu_online_map & (1UL << cpu)) )
++  if (!cpu_online(cpu))
+     return -ENXIO;            /* No such CPU */
+   if ( !cpu_has(c, X86_FEATURE_MSR) )
+     return -EIO;              /* MSR not supported */
+--- linux-2.6.0-test1/arch/i386/kernel/nmi.c   2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/kernel/nmi.c  2003-07-19 17:04:02.000000000 -0700
+@@ -31,7 +31,17 @@
+ #include <asm/mpspec.h>
+ #include <asm/nmi.h>
++#ifdef CONFIG_KGDB
++#include <asm/kgdb.h>
++#ifdef CONFIG_SMP
++unsigned int nmi_watchdog = NMI_IO_APIC;
++#else
++unsigned int nmi_watchdog = NMI_LOCAL_APIC;
++#endif
++#else
+ unsigned int nmi_watchdog = NMI_NONE;
++#endif
++
+ static unsigned int nmi_hz = HZ;
+ unsigned int nmi_perfctr_msr; /* the MSR to reset in NMI handler */
+ extern void show_registers(struct pt_regs *regs);
+@@ -396,6 +406,9 @@ void touch_nmi_watchdog (void)
+       for (i = 0; i < NR_CPUS; i++)
+               alert_counter[i] = 0;
+ }
++#ifdef CONFIG_KGDB
++int tune_watchdog = 5*HZ;
++#endif
+ void nmi_watchdog_tick (struct pt_regs * regs)
+ {
+@@ -409,12 +422,24 @@ void nmi_watchdog_tick (struct pt_regs *
+       sum = irq_stat[cpu].apic_timer_irqs;
++#ifdef CONFIG_KGDB
++      if (! in_kgdb(regs) && last_irq_sums[cpu] == sum ) {
++  
++#else
+       if (last_irq_sums[cpu] == sum) {
++#endif
+               /*
+                * Ayiee, looks like this CPU is stuck ...
+                * wait a few IRQs (5 seconds) before doing the oops ...
+                */
+               alert_counter[cpu]++;
++#ifdef CONFIG_KGDB
++                if (alert_counter[cpu] == tune_watchdog) {                      
++                        kgdb_handle_exception(2, SIGPWR, 0, regs);
++                        last_irq_sums[cpu] = sum;
++                        alert_counter[cpu] = 0;
++                }
++#endif
+               if (alert_counter[cpu] == 5*nmi_hz) {
+                       spin_lock(&nmi_print_lock);
+                       /*
+--- linux-2.6.0-test1/arch/i386/kernel/reboot.c        2003-06-14 12:18:06.000000000 -0700
++++ 25/arch/i386/kernel/reboot.c       2003-07-19 17:04:06.000000000 -0700
+@@ -226,7 +226,7 @@ void machine_restart(char * __unused)
+                  if its not, default to the BSP */
+               if ((reboot_cpu == -1) ||  
+                     (reboot_cpu > (NR_CPUS -1))  || 
+-                    !(phys_cpu_present_map & (1<<cpuid))) 
++                    !cpu_isset(cpuid, phys_cpu_present_map))
+                       reboot_cpu = boot_cpu_physical_apicid;
+               reboot_smp = 0;  /* use this as a flag to only go through this once*/
+--- linux-2.6.0-test1/arch/i386/kernel/setup.c 2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/i386/kernel/setup.c        2003-07-19 17:03:49.000000000 -0700
+@@ -42,6 +42,7 @@
+ #include <asm/edd.h>
+ #include <asm/setup.h>
+ #include <asm/arch_hooks.h>
++#include <asm/sections.h>
+ #include "setup_arch_pre.h"
+ #include "mach_resources.h"
+@@ -100,7 +101,7 @@ extern void early_cpu_init(void);
+ extern void dmi_scan_machine(void);
+ extern void generic_apic_probe(char *);
+ extern int root_mountflags;
+-extern char _text, _etext, _edata, _end;
++extern char _end[];
+ unsigned long saved_videomode;
+@@ -520,7 +521,7 @@ static void __init parse_cmdline_early (
+                       acpi_disabled = 1;
+               /* "acpismp=force" turns on ACPI again */
+-              else if (!memcmp(from, "acpismp=force", 14))
++              if (c == ' ' && !memcmp(from, "acpismp=force", 13))
+                       acpi_disabled = 0;
+               /*
+@@ -676,7 +677,7 @@ static unsigned long __init setup_memory
+        * partially used pages are not usable - thus
+        * we are rounding upwards:
+        */
+-      start_pfn = PFN_UP(__pa(&_end));
++      start_pfn = PFN_UP(__pa(_end));
+       find_max_pfn();
+@@ -947,15 +948,15 @@ void __init setup_arch(char **cmdline_p)
+       if (!MOUNT_ROOT_RDONLY)
+               root_mountflags &= ~MS_RDONLY;
+-      init_mm.start_code = (unsigned long) &_text;
+-      init_mm.end_code = (unsigned long) &_etext;
+-      init_mm.end_data = (unsigned long) &_edata;
+-      init_mm.brk = (unsigned long) &_end;
+-
+-      code_resource.start = virt_to_phys(&_text);
+-      code_resource.end = virt_to_phys(&_etext)-1;
+-      data_resource.start = virt_to_phys(&_etext);
+-      data_resource.end = virt_to_phys(&_edata)-1;
++      init_mm.start_code = (unsigned long) _text;
++      init_mm.end_code = (unsigned long) _etext;
++      init_mm.end_data = (unsigned long) _edata;
++      init_mm.brk = (unsigned long) _end;
++
++      code_resource.start = virt_to_phys(_text);
++      code_resource.end = virt_to_phys(_etext)-1;
++      data_resource.start = virt_to_phys(_etext);
++      data_resource.end = virt_to_phys(_edata)-1;
+       parse_cmdline_early(cmdline_p);
+@@ -977,7 +978,7 @@ void __init setup_arch(char **cmdline_p)
+       generic_apic_probe(*cmdline_p);
+ #endif        
+-#ifdef CONFIG_ACPI_BOOT
++#ifdef CONFIG_ACPI
+       /*
+        * Parse the ACPI tables for possible boot-time SMP configuration.
+        */
+--- linux-2.6.0-test1/arch/i386/kernel/smpboot.c       2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/kernel/smpboot.c      2003-07-19 17:04:06.000000000 -0700
+@@ -61,12 +61,12 @@ static int __initdata smp_b_stepping;
+ int smp_num_siblings = 1;
+ int phys_proc_id[NR_CPUS]; /* Package ID of each logical CPU */
+-/* Bitmask of currently online CPUs */
+-unsigned long cpu_online_map;
++/* bitmap of online cpus */
++cpumask_t cpu_online_map;
+-static volatile unsigned long cpu_callin_map;
+-volatile unsigned long cpu_callout_map;
+-static unsigned long smp_commenced_mask;
++static cpumask_t cpu_callin_map;
++cpumask_t cpu_callout_map;
++static cpumask_t smp_commenced_mask;
+ /* Per CPU bogomips and other parameters */
+ struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
+@@ -268,7 +268,7 @@ static void __init synchronize_tsc_bp (v
+       sum = 0;
+       for (i = 0; i < NR_CPUS; i++) {
+-              if (test_bit(i, &cpu_callout_map)) {
++              if (cpu_isset(i, cpu_callout_map)) {
+                       t0 = tsc_values[i];
+                       sum += t0;
+               }
+@@ -277,7 +277,7 @@ static void __init synchronize_tsc_bp (v
+       sum = 0;
+       for (i = 0; i < NR_CPUS; i++) {
+-              if (!test_bit(i, &cpu_callout_map))
++              if (!cpu_isset(i, cpu_callout_map))
+                       continue;
+               delta = tsc_values[i] - avg;
+               if (delta < 0)
+@@ -353,7 +353,7 @@ void __init smp_callin(void)
+        */
+       phys_id = GET_APIC_ID(apic_read(APIC_ID));
+       cpuid = smp_processor_id();
+-      if (test_bit(cpuid, &cpu_callin_map)) {
++      if (cpu_isset(cpuid, cpu_callin_map)) {
+               printk("huh, phys CPU#%d, CPU#%d already present??\n",
+                                       phys_id, cpuid);
+               BUG();
+@@ -376,7 +376,7 @@ void __init smp_callin(void)
+               /*
+                * Has the boot CPU finished it's STARTUP sequence?
+                */
+-              if (test_bit(cpuid, &cpu_callout_map))
++              if (cpu_isset(cpuid, cpu_callout_map))
+                       break;
+               rep_nop();
+       }
+@@ -417,7 +417,7 @@ void __init smp_callin(void)
+       /*
+        * Allow the master to continue.
+        */
+-      set_bit(cpuid, &cpu_callin_map);
++      cpu_set(cpuid, cpu_callin_map);
+       /*
+        *      Synchronize the TSC with the BP
+@@ -442,7 +442,7 @@ int __init start_secondary(void *unused)
+        */
+       cpu_init();
+       smp_callin();
+-      while (!test_bit(smp_processor_id(), &smp_commenced_mask))
++      while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
+               rep_nop();
+       setup_secondary_APIC_clock();
+       if (nmi_watchdog == NMI_IO_APIC) {
+@@ -456,7 +456,7 @@ int __init start_secondary(void *unused)
+        * the local TLBs too.
+        */
+       local_flush_tlb();
+-      set_bit(smp_processor_id(), &cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
+       wmb();
+       return cpu_idle();
+ }
+@@ -499,16 +499,16 @@ static struct task_struct * __init fork_
+ #ifdef CONFIG_NUMA
+ /* which logical CPUs are on which nodes */
+-volatile unsigned long node_2_cpu_mask[MAX_NR_NODES] = 
+-                                              { [0 ... MAX_NR_NODES-1] = 0 };
++cpumask_t node_2_cpu_mask[MAX_NR_NODES] =
++                              { [0 ... MAX_NR_NODES-1] = CPU_MASK_NONE };
+ /* which node each logical CPU is on */
+-volatile int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 };
++int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 };
+ /* set up a mapping between cpu and node. */
+ static inline void map_cpu_to_node(int cpu, int node)
+ {
+       printk("Mapping cpu %d to node %d\n", cpu, node);
+-      node_2_cpu_mask[node] |= (1 << cpu);
++      cpu_set(cpu, node_2_cpu_mask[node]);
+       cpu_2_node[cpu] = node;
+ }
+@@ -519,7 +519,7 @@ static inline void unmap_cpu_to_node(int
+       printk("Unmapping cpu %d from all nodes\n", cpu);
+       for (node = 0; node < MAX_NR_NODES; node ++)
+-              node_2_cpu_mask[node] &= ~(1 << cpu);
++              cpu_clear(cpu, node_2_cpu_mask[node]);
+       cpu_2_node[cpu] = -1;
+ }
+ #else /* !CONFIG_NUMA */
+@@ -529,7 +529,7 @@ static inline void unmap_cpu_to_node(int
+ #endif /* CONFIG_NUMA */
+-volatile u8 cpu_2_logical_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
++u8 cpu_2_logical_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
+ void map_cpu_to_logical_apicid(void)
+ {
+@@ -770,7 +770,7 @@ wakeup_secondary_cpu(int phys_apicid, un
+ }
+ #endif        /* WAKE_SECONDARY_VIA_INIT */
+-extern unsigned long cpu_initialized;
++extern cpumask_t cpu_initialized;
+ static int __init do_boot_cpu(int apicid)
+ /*
+@@ -836,19 +836,19 @@ static int __init do_boot_cpu(int apicid
+                * allow APs to start initializing.
+                */
+               Dprintk("Before Callout %d.\n", cpu);
+-              set_bit(cpu, &cpu_callout_map);
++              cpu_set(cpu, cpu_callout_map);
+               Dprintk("After Callout %d.\n", cpu);
+               /*
+                * Wait 5s total for a response
+                */
+               for (timeout = 0; timeout < 50000; timeout++) {
+-                      if (test_bit(cpu, &cpu_callin_map))
++                      if (cpu_isset(cpu, cpu_callin_map))
+                               break;  /* It has booted */
+                       udelay(100);
+               }
+-              if (test_bit(cpu, &cpu_callin_map)) {
++              if (cpu_isset(cpu, cpu_callin_map)) {
+                       /* number CPUs logically, starting from 1 (BSP is 0) */
+                       Dprintk("OK.\n");
+                       printk("CPU%d: ", cpu);
+@@ -869,8 +869,8 @@ static int __init do_boot_cpu(int apicid
+       if (boot_error) {
+               /* Try to put things back the way they were before ... */
+               unmap_cpu_to_logical_apicid(cpu);
+-              clear_bit(cpu, &cpu_callout_map); /* was set here (do_boot_cpu()) */
+-              clear_bit(cpu, &cpu_initialized); /* was set by cpu_init() */
++              cpu_clear(cpu, cpu_callout_map); /* was set here (do_boot_cpu()) */
++              cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */
+               cpucount--;
+       }
+@@ -957,7 +957,7 @@ static void __init smp_boot_cpus(unsigne
+       if (!smp_found_config) {
+               printk(KERN_NOTICE "SMP motherboard not detected.\n");
+               smpboot_clear_io_apic_irqs();
+-              phys_cpu_present_map = 1;
++              phys_cpu_present_map = physid_mask_of_physid(0);
+               if (APIC_init_uniprocessor())
+                       printk(KERN_NOTICE "Local APIC not detected."
+                                          " Using dummy APIC emulation.\n");
+@@ -973,7 +973,7 @@ static void __init smp_boot_cpus(unsigne
+       if (!check_phys_apicid_present(boot_cpu_physical_apicid)) {
+               printk("weird, boot CPU (#%d) not listed by the BIOS.\n",
+                               boot_cpu_physical_apicid);
+-              phys_cpu_present_map |= (1 << hard_smp_processor_id());
++              cpu_set(hard_smp_processor_id(), phys_cpu_present_map);
+       }
+       /*
+@@ -984,7 +984,7 @@ static void __init smp_boot_cpus(unsigne
+                       boot_cpu_physical_apicid);
+               printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n");
+               smpboot_clear_io_apic_irqs();
+-              phys_cpu_present_map = 1;
++              phys_cpu_present_map = physid_mask_of_physid(0);
+               return;
+       }
+@@ -997,7 +997,7 @@ static void __init smp_boot_cpus(unsigne
+               smp_found_config = 0;
+               printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n");
+               smpboot_clear_io_apic_irqs();
+-              phys_cpu_present_map = 1;
++              phys_cpu_present_map = physid_mask_of_physid(0);
+               return;
+       }
+@@ -1017,10 +1017,10 @@ static void __init smp_boot_cpus(unsigne
+        * bits 0-3 are quad0, 4-7 are quad1, etc. A perverse twist on the 
+        * clustered apic ID.
+        */
+-      Dprintk("CPU present map: %lx\n", phys_cpu_present_map);
++      Dprintk("CPU present map: %lx\n", cpus_coerce(phys_cpu_present_map));
+       kicked = 1;
+-      for (bit = 0; kicked < NR_CPUS && bit < BITS_PER_LONG; bit++) {
++      for (bit = 0; kicked < NR_CPUS && bit < MAX_APICS; bit++) {
+               apicid = cpu_present_to_apicid(bit);
+               /*
+                * Don't even attempt to start the boot CPU!
+@@ -1055,7 +1055,7 @@ static void __init smp_boot_cpus(unsigne
+       } else {
+               unsigned long bogosum = 0;
+               for (cpu = 0; cpu < NR_CPUS; cpu++)
+-                      if (cpu_callout_map & (1<<cpu))
++                      if (cpu_isset(cpu, cpu_callout_map))
+                               bogosum += cpu_data[cpu].loops_per_jiffy;
+               printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
+                       cpucount+1,
+@@ -1087,10 +1087,11 @@ static void __init smp_boot_cpus(unsigne
+               
+               for (cpu = 0; cpu < NR_CPUS; cpu++) {
+                       int     i;
+-                      if (!test_bit(cpu, &cpu_callout_map)) continue;
++                      if (!cpu_isset(cpu, cpu_callout_map))
++                              continue;
+                       for (i = 0; i < NR_CPUS; i++) {
+-                              if (i == cpu || !test_bit(i, &cpu_callout_map))
++                              if (i == cpu || !cpu_isset(i, cpu_callout_map))
+                                       continue;
+                               if (phys_proc_id[cpu] == phys_proc_id[i]) {
+                                       cpu_sibling_map[cpu] = i;
+@@ -1125,28 +1126,28 @@ void __init smp_prepare_cpus(unsigned in
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
+-      set_bit(smp_processor_id(), &cpu_callout_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_callout_map);
+ }
+ int __devinit __cpu_up(unsigned int cpu)
+ {
+       /* This only works at boot for x86.  See "rewrite" above. */
+-      if (test_bit(cpu, &smp_commenced_mask)) {
++      if (cpu_isset(cpu, smp_commenced_mask)) {
+               local_irq_enable();
+               return -ENOSYS;
+       }
+       /* In case one didn't come up */
+-      if (!test_bit(cpu, &cpu_callin_map)) {
++      if (!cpu_isset(cpu, cpu_callin_map)) {
+               local_irq_enable();
+               return -EIO;
+       }
+       local_irq_enable();
+       /* Unleash the CPU! */
+-      set_bit(cpu, &smp_commenced_mask);
+-      while (!test_bit(cpu, &cpu_online_map))
++      cpu_set(cpu, smp_commenced_mask);
++      while (!cpu_isset(cpu, cpu_online_map))
+               mb();
+       return 0;
+ }
+@@ -1154,7 +1155,8 @@ int __devinit __cpu_up(unsigned int cpu)
+ void __init smp_cpus_done(unsigned int max_cpus)
+ {
+ #ifdef CONFIG_X86_IO_APIC
+-      setup_ioapic_dest(TARGET_CPUS);
++      cpumask_t targets = CPU_MASK_ALL;
++      setup_ioapic_dest(targets);
+ #endif
+       zap_low_mappings();
+ }
+--- linux-2.6.0-test1/arch/i386/kernel/smp.c   2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/kernel/smp.c  2003-07-19 17:04:06.000000000 -0700
+@@ -155,8 +155,12 @@ void send_IPI_self(int vector)
+       __send_IPI_shortcut(APIC_DEST_SELF, vector);
+ }
+-inline void send_IPI_mask_bitmask(int mask, int vector)
++/*
++ * This is only used on smaller machines.
++ */
++inline void send_IPI_mask_bitmask(cpumask_t cpumask, int vector)
+ {
++      unsigned long mask = cpus_coerce(cpumask);
+       unsigned long cfg;
+       unsigned long flags;
+@@ -186,10 +190,10 @@ inline void send_IPI_mask_bitmask(int ma
+       local_irq_restore(flags);
+ }
+-inline void send_IPI_mask_sequence(int mask, int vector)
++inline void send_IPI_mask_sequence(cpumask_t mask, int vector)
+ {
+       unsigned long cfg, flags;
+-      unsigned int query_cpu, query_mask;
++      unsigned int query_cpu;
+       /*
+        * Hack. The clustered APIC addressing mode doesn't allow us to send 
+@@ -200,8 +204,7 @@ inline void send_IPI_mask_sequence(int m
+       local_irq_save(flags);
+       for (query_cpu = 0; query_cpu < NR_CPUS; ++query_cpu) {
+-              query_mask = 1 << query_cpu;
+-              if (query_mask & mask) {
++              if (cpu_isset(query_cpu, mask)) {
+               
+                       /*
+                        * Wait for idle.
+@@ -238,7 +241,7 @@ inline void send_IPI_mask_sequence(int m
+  *    Optimizations Manfred Spraul <manfred@colorfullife.com>
+  */
+-static volatile unsigned long flush_cpumask;
++static cpumask_t flush_cpumask;
+ static struct mm_struct * flush_mm;
+ static unsigned long flush_va;
+ static spinlock_t tlbstate_lock = SPIN_LOCK_UNLOCKED;
+@@ -255,7 +258,7 @@ static inline void leave_mm (unsigned lo
+ {
+       if (cpu_tlbstate[cpu].state == TLBSTATE_OK)
+               BUG();
+-      clear_bit(cpu, &cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
++      cpu_clear(cpu, cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
+       load_cr3(swapper_pg_dir);
+ }
+@@ -265,7 +268,7 @@ static inline void leave_mm (unsigned lo
+  * [cpu0: the cpu that switches]
+  * 1) switch_mm() either 1a) or 1b)
+  * 1a) thread switch to a different mm
+- * 1a1) clear_bit(cpu, &old_mm->cpu_vm_mask);
++ * 1a1) cpu_clear(cpu, old_mm->cpu_vm_mask);
+  *    Stop ipi delivery for the old mm. This is not synchronized with
+  *    the other cpus, but smp_invalidate_interrupt ignore flush ipis
+  *    for the wrong mm, and in the worst case we perform a superflous
+@@ -275,7 +278,7 @@ static inline void leave_mm (unsigned lo
+  *    was in lazy tlb mode.
+  * 1a3) update cpu_tlbstate[].active_mm
+  *    Now cpu0 accepts tlb flushes for the new mm.
+- * 1a4) set_bit(cpu, &new_mm->cpu_vm_mask);
++ * 1a4) cpu_set(cpu, new_mm->cpu_vm_mask);
+  *    Now the other cpus will send tlb flush ipis.
+  * 1a4) change cr3.
+  * 1b) thread switch without mm change
+@@ -311,7 +314,7 @@ asmlinkage void smp_invalidate_interrupt
+       cpu = get_cpu();
+-      if (!test_bit(cpu, &flush_cpumask))
++      if (!cpu_isset(cpu, flush_cpumask))
+               goto out;
+               /* 
+                * This was a BUG() but until someone can quote me the
+@@ -332,15 +335,17 @@ asmlinkage void smp_invalidate_interrupt
+                       leave_mm(cpu);
+       }
+       ack_APIC_irq();
+-      clear_bit(cpu, &flush_cpumask);
+-
++      smp_mb__before_clear_bit();
++      cpu_clear(cpu, flush_cpumask);
++      smp_mb__after_clear_bit();
+ out:
+       put_cpu_no_resched();
+ }
+-static void flush_tlb_others (unsigned long cpumask, struct mm_struct *mm,
++static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
+                                               unsigned long va)
+ {
++      cpumask_t tmp;
+       /*
+        * A couple of (to be removed) sanity checks:
+        *
+@@ -348,14 +353,12 @@ static void flush_tlb_others (unsigned l
+        * - current CPU must not be in mask
+        * - mask must exist :)
+        */
+-      if (!cpumask)
+-              BUG();
+-      if ((cpumask & cpu_online_map) != cpumask)
+-              BUG();
+-      if (cpumask & (1 << smp_processor_id()))
+-              BUG();
+-      if (!mm)
+-              BUG();
++      BUG_ON(cpus_empty(cpumask));
++
++      cpus_and(tmp, cpumask, cpu_online_map);
++      BUG_ON(!cpus_equal(cpumask, tmp));
++      BUG_ON(cpu_isset(smp_processor_id(), cpumask));
++      BUG_ON(!mm);
+       /*
+        * i'm not happy about this global shared spinlock in the
+@@ -367,15 +370,26 @@ static void flush_tlb_others (unsigned l
+       
+       flush_mm = mm;
+       flush_va = va;
++#if NR_CPUS <= BITS_PER_LONG
+       atomic_set_mask(cpumask, &flush_cpumask);
++#else
++      {
++              int k;
++              unsigned long *flush_mask = (unsigned long *)&flush_cpumask;
++              unsigned long *cpu_mask = (unsigned long *)&cpumask;
++              for (k = 0; k < BITS_TO_LONGS(NR_CPUS); ++k)
++                      atomic_set_mask(cpu_mask[k], &flush_mask[k]);
++      }
++#endif
+       /*
+        * We have to send the IPI only to
+        * CPUs affected.
+        */
+       send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);
+-      while (flush_cpumask)
+-              /* nothing. lockup detection does not belong here */;
++      while (!cpus_empty(flush_cpumask))
++              /* nothing. lockup detection does not belong here */
++              mb();
+       flush_mm = NULL;
+       flush_va = 0;
+@@ -385,23 +399,25 @@ static void flush_tlb_others (unsigned l
+ void flush_tlb_current_task(void)
+ {
+       struct mm_struct *mm = current->mm;
+-      unsigned long cpu_mask;
++      cpumask_t cpu_mask;
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++      cpu_mask = mm->cpu_vm_mask;
++      cpu_clear(smp_processor_id(), cpu_mask);
+       local_flush_tlb();
+-      if (cpu_mask)
++      if (!cpus_empty(cpu_mask))
+               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+       preempt_enable();
+ }
+ void flush_tlb_mm (struct mm_struct * mm)
+ {
+-      unsigned long cpu_mask;
++      cpumask_t cpu_mask;
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++      cpu_mask = mm->cpu_vm_mask;
++      cpu_clear(smp_processor_id(), cpu_mask);
+       if (current->active_mm == mm) {
+               if (current->mm)
+@@ -409,7 +425,7 @@ void flush_tlb_mm (struct mm_struct * mm
+               else
+                       leave_mm(smp_processor_id());
+       }
+-      if (cpu_mask)
++      if (!cpus_empty(cpu_mask))
+               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+       preempt_enable();
+@@ -418,10 +434,11 @@ void flush_tlb_mm (struct mm_struct * mm
+ void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
+ {
+       struct mm_struct *mm = vma->vm_mm;
+-      unsigned long cpu_mask;
++      cpumask_t cpu_mask;
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++      cpu_mask = mm->cpu_vm_mask;
++      cpu_clear(smp_processor_id(), cpu_mask);
+       if (current->active_mm == mm) {
+               if(current->mm)
+@@ -430,7 +447,7 @@ void flush_tlb_page(struct vm_area_struc
+                       leave_mm(smp_processor_id());
+       }
+-      if (cpu_mask)
++      if (!cpus_empty(cpu_mask))
+               flush_tlb_others(cpu_mask, mm, va);
+       preempt_enable();
+@@ -457,9 +474,19 @@ void flush_tlb_all(void)
+  */
+ void smp_send_reschedule(int cpu)
+ {
+-      send_IPI_mask(1 << cpu, RESCHEDULE_VECTOR);
++      send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
+ }
+-
++#ifdef CONFIG_KGDB
++/*
++ * By using the NMI code instead of a vector we just sneak thru the 
++ * word generator coming out with just what we want.  AND it does
++ * not matter if clustered_apic_mode is set or not.
++ */
++void smp_send_nmi_allbutself(void)
++{
++      send_IPI_allbutself(APIC_DM_NMI);
++}
++#endif
+ /*
+  * Structure and data for smp_call_function(). This is designed to minimise
+  * static memory requirements. It also looks cleaner.
+@@ -533,7 +560,7 @@ static void stop_this_cpu (void * dummy)
+       /*
+        * Remove this CPU:
+        */
+-      clear_bit(smp_processor_id(), &cpu_online_map);
++      cpu_clear(smp_processor_id(), cpu_online_map);
+       local_irq_disable();
+       disable_local_APIC();
+       if (cpu_data[smp_processor_id()].hlt_works_ok)
+--- linux-2.6.0-test1/arch/i386/kernel/traps.c 2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/i386/kernel/traps.c        2003-07-19 17:06:40.000000000 -0700
+@@ -90,6 +90,42 @@ asmlinkage void alignment_check(void);
+ asmlinkage void spurious_interrupt_bug(void);
+ asmlinkage void machine_check(void);
++#ifdef CONFIG_KGDB
++extern void sysenter_entry(void);
++#include <asm/kgdb.h>
++#include <linux/init.h>
++extern void int3(void);
++extern void debug(void);
++void set_intr_gate(unsigned int n, void *addr);
++static void set_intr_usr_gate(unsigned int n, void *addr);
++/*
++ * Should be able to call this breakpoint() very early in
++ * bring up.  Just hard code the call where needed.
++ * The breakpoint() code is here because set_?_gate() functions
++ * are local (static) to trap.c.  They need be done only once,
++ * but it does not hurt to do them over.
++ */
++void breakpoint(void)
++{
++        set_intr_usr_gate(3,&int3); /* disable ints on trap */
++      set_intr_gate(1,&debug);
++      set_intr_gate(14,&page_fault);
++       
++        BREAKPOINT;
++}
++#define       CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)            \
++    {                                                                 \
++      if (!user_mode(regs)  ) \
++      {                                                               \
++              kgdb_handle_exception(trapnr, signr, error_code, regs); \
++              after;                                                  \
++      } else if ((trapnr == 3) && (regs->eflags &0x200)) local_irq_enable(); \
++    }
++#else
++#define       CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)    
++#endif
++
++
+ static int kstack_depth_to_print = 24;
+ void show_trace(struct task_struct *task, unsigned long * stack)
+@@ -172,8 +208,9 @@ void show_registers(struct pt_regs *regs
+               ss = regs->xss & 0xffff;
+       }
+       print_modules();
+-      printk("CPU:    %d\nEIP:    %04x:[<%08lx>]    %s\nEFLAGS: %08lx\n",
+-              smp_processor_id(), 0xffff & regs->xcs, regs->eip, print_tainted(), regs->eflags);
++      printk("CPU:    %d\nEIP:    %04x:[<%08lx>]    %s VLI\nEFLAGS: %08lx\n",
++              smp_processor_id(), 0xffff & regs->xcs,
++              regs->eip, print_tainted(), regs->eflags);
+       print_symbol("EIP is at %s\n", regs->eip);
+       printk("eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
+@@ -189,23 +226,25 @@ void show_registers(struct pt_regs *regs
+        * time of the fault..
+        */
+       if (in_kernel) {
++              u8 *eip;
+               printk("\nStack: ");
+               show_stack(NULL, (unsigned long*)esp);
+               printk("Code: ");
+-              if(regs->eip < PAGE_OFFSET)
+-                      goto bad;
+-              for(i=0;i<20;i++)
+-              {
++              eip = (u8 *)regs->eip - 43;
++              for (i = 0; i < 64; i++, eip++) {
+                       unsigned char c;
+-                      if(__get_user(c, &((unsigned char*)regs->eip)[i])) {
+-bad:
++
++                      if (eip < (u8 *)PAGE_OFFSET || __get_user(c, eip)) {
+                               printk(" Bad EIP value.");
+                               break;
+                       }
+-                      printk("%02x ", c);
++                      if (eip == (u8 *)regs->eip)
++                              printk("<%02x> ", c);
++                      else
++                              printk("%02x ", c);
+               }
+       }
+       printk("\n");
+@@ -252,12 +291,36 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED
+ void die(const char * str, struct pt_regs * regs, long err)
+ {
+       static int die_counter;
++      int nl = 0;
+       console_verbose();
+       spin_lock_irq(&die_lock);
+       bust_spinlocks(1);
+       handle_BUG(regs);
+       printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
++#ifdef CONFIG_PREEMPT
++      printk("PREEMPT ");
++      nl = 1;
++#endif
++#ifdef CONFIG_SMP
++      printk("SMP ");
++      nl = 1;
++#endif
++#ifdef CONFIG_DEBUG_PAGEALLOC
++      printk("DEBUG_PAGEALLOC");
++      nl = 1;
++#endif
++      if (nl)
++              printk("\n");
++#ifdef CONFIG_KGDB
++      /* This is about the only place we want to go to kgdb even if in 
++       * user mode.  But we must go in via a trap so within kgdb we will
++       * always be in kernel mode.
++       */
++      if (user_mode(regs))
++              BREAKPOINT;
++#endif
++      CHK_REMOTE_DEBUG(0,SIGTRAP,err,regs,)
+       show_registers(regs);
+       bust_spinlocks(0);
+       spin_unlock_irq(&die_lock);
+@@ -327,6 +390,7 @@ static inline void do_trap(int trapnr, i
+ #define DO_ERROR(trapnr, signr, str, name) \
+ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+ { \
++      CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,)\
+       do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
+ }
+@@ -344,7 +408,9 @@ asmlinkage void do_##name(struct pt_regs
+ #define DO_VM86_ERROR(trapnr, signr, str, name) \
+ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+ { \
++      CHK_REMOTE_DEBUG(trapnr, signr, error_code,regs, return)\
+       do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
++      return; \
+ }
+ #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
+@@ -387,8 +453,10 @@ gp_in_vm86:
+       return;
+ gp_in_kernel:
+-      if (!fixup_exception(regs))
++      if (!fixup_exception(regs)){
++              CHK_REMOTE_DEBUG(13,SIGSEGV,error_code,regs,)
+               die("general protection fault", regs, error_code);
++      }
+ }
+ static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
+@@ -550,8 +618,18 @@ asmlinkage void do_debug(struct pt_regs 
+                * allowing programs to debug themselves without the ptrace()
+                * interface.
+                */
+-              if ((regs->xcs & 3) == 0)
++#ifdef CONFIG_KGDB
++              /*
++               * I think this is the only "real" case of a TF in the kernel
++               * that really belongs to user space.  Others are
++               * "Ours all ours!"
++               */
++              if (((regs->xcs & 3) == 0) && ((void *)regs->eip == sysenter_entry))
++                      goto clear_TF_reenable;
++#else
++              if ((regs->xcs & 3) == 0)       
+                       goto clear_TF_reenable;
++#endif
+               if ((tsk->ptrace & (PT_DTRACE|PT_PTRACED)) == PT_DTRACE)
+                       goto clear_TF;
+       }
+@@ -563,6 +641,17 @@ asmlinkage void do_debug(struct pt_regs 
+       info.si_errno = 0;
+       info.si_code = TRAP_BRKPT;
+       
++#ifdef CONFIG_KGDB
++        /*
++       * If this is a kernel mode trap, we need to reset db7 to allow us
++       * to continue sanely ALSO skip the signal delivery 
++         */
++      if ((regs->xcs & 3) == 0)
++              goto clear_dr7;
++
++        /* if not kernel, allow ints but only if they were on */ 
++       if ( regs->eflags & 0x200) local_irq_enable(); 
++#endif
+       /* If this is a kernel mode trap, save the user PC on entry to 
+        * the kernel, that's what the debugger can make sense of.
+        */
+@@ -577,6 +666,7 @@ clear_dr7:
+       __asm__("movl %0,%%db7"
+               : /* no output */
+               : "r" (0));
++      CHK_REMOTE_DEBUG(1,SIGTRAP,error_code,regs,)
+       return;
+ debug_vm86:
+@@ -823,6 +913,12 @@ static void __init set_call_gate(void *a
+ {
+       _set_gate(a,12,3,addr,__KERNEL_CS);
+ }
++#ifdef CONFIG_KGDB
++void set_intr_usr_gate(unsigned int n, void *addr)
++{
++      _set_gate(idt_table+n,14,3,addr,__KERNEL_CS);
++}
++#endif
+ static void __init set_task_gate(unsigned int n, unsigned int gdt_entry)
+ {
+@@ -849,7 +945,11 @@ void __init trap_init(void)
+       set_trap_gate(0,&divide_error);
+       set_intr_gate(1,&debug);
+       set_intr_gate(2,&nmi);
++#ifndef CONFIG_KGDB
+       set_system_gate(3,&int3);       /* int3-5 can be called from all */
++#else
++      set_intr_usr_gate(3,&int3);     /* int3-5 can be called from all */
++#endif
+       set_system_gate(4,&overflow);
+       set_system_gate(5,&bounds);
+       set_trap_gate(6,&invalid_op);
+--- linux-2.6.0-test1/arch/i386/kernel/vm86.c  2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/i386/kernel/vm86.c 2003-07-19 17:07:16.000000000 -0700
+@@ -144,12 +144,14 @@ static void mark_screen_rdonly(struct ta
+               pgd_clear(pgd);
+               goto out;
+       }
+-      pmd = pmd_offset(pgd, 0xA0000);
+-      if (pmd_none(*pmd))
++      pmd = pmd_offset_map(pgd, 0xA0000);
++      if (pmd_none(*pmd)) {
++              pmd_unmap(pmd);
+               goto out;
+-      if (pmd_bad(*pmd)) {
++      } else if (pmd_bad(*pmd)) {
+               pmd_ERROR(*pmd);
+               pmd_clear(pmd);
++              pmd_unmap(pmd);
+               goto out;
+       }
+       pte = mapped = pte_offset_map(pmd, 0xA0000);
+@@ -159,6 +161,7 @@ static void mark_screen_rdonly(struct ta
+               pte++;
+       }
+       pte_unmap(mapped);
++      pmd_unmap(pmd);
+ out:
+       spin_unlock(&tsk->mm->page_table_lock);
+       preempt_enable();
+--- linux-2.6.0-test1/arch/i386/lib/dec_and_lock.c     2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/lib/dec_and_lock.c    2003-07-19 17:06:40.000000000 -0700
+@@ -10,6 +10,7 @@
+ #include <linux/spinlock.h>
+ #include <asm/atomic.h>
++#ifndef ATOMIC_DEC_AND_LOCK
+ int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
+ {
+       int counter;
+@@ -38,3 +39,5 @@ slow_path:
+       spin_unlock(lock);
+       return 0;
+ }
++#endif
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/i386/lib/kgdb_serial.c     2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,485 @@
++/*
++ * Serial interface GDB stub
++ *
++ * Written (hacked together) by David Grothe (dave@gcom.com)
++ * Modified to allow invokation early in boot see also
++ * kgdb.h for instructions by George Anzinger(george@mvista.com)
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/errno.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++#include <linux/tty.h>
++#include <linux/tty_flip.h>
++#include <linux/serial.h>
++#include <linux/serial_reg.h>
++#include <linux/config.h>
++#include <linux/major.h>
++#include <linux/string.h>
++#include <linux/fcntl.h>
++#include <linux/ptrace.h>
++#include <linux/ioport.h>
++#include <linux/mm.h>
++#include <linux/init.h>
++#include <linux/highmem.h>
++#include <asm/system.h>
++#include <asm/io.h>
++#include <asm/segment.h>
++#include <asm/bitops.h>
++#include <asm/system.h>
++#include <asm/kgdb_local.h>
++#ifdef CONFIG_KGDB_USER_CONSOLE
++extern void kgdb_console_finit(void);
++#endif
++#define PRNT_off
++#define TEST_EXISTANCE
++#ifdef PRNT
++#define dbprintk(s) printk s
++#else
++#define dbprintk(s)
++#endif
++#define TEST_INTERRUPT_off
++#ifdef TEST_INTERRUPT
++#define intprintk(s) printk s
++#else
++#define intprintk(s)
++#endif
++
++#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT)
++
++#define       GDB_BUF_SIZE    512     /* power of 2, please */
++
++static char gdb_buf[GDB_BUF_SIZE];
++static int gdb_buf_in_inx;
++static atomic_t gdb_buf_in_cnt;
++static int gdb_buf_out_inx;
++
++struct async_struct *gdb_async_info;
++static int gdb_async_irq;
++
++#define outb_px(a,b) outb_p(b,a)
++
++static void program_uart(struct async_struct *info);
++static void write_char(struct async_struct *info, int chr);
++/*
++ * Get a byte from the hardware data buffer and return it
++ */
++static int
++read_data_bfr(struct async_struct *info)
++{
++      char it = inb_p(info->port + UART_LSR);
++
++      if (it & UART_LSR_DR)
++              return (inb_p(info->port + UART_RX));
++      /*
++       * If we have a framing error assume somebody messed with
++       * our uart.  Reprogram it and send '-' both ways...
++       */
++      if (it & 0xc) {
++              program_uart(info);
++              write_char(info, '-');
++              return ('-');
++      }
++      return (-1);
++
++}                             /* read_data_bfr */
++
++/*
++ * Get a char if available, return -1 if nothing available.
++ * Empty the receive buffer first, then look at the interface hardware.
++
++ * Locking here is a bit of a problem.        We MUST not lock out communication
++ * if we are trying to talk to gdb about a kgdb entry.        ON the other hand
++ * we can loose chars in the console pass thru if we don't lock.  It is also
++ * possible that we could hold the lock or be waiting for it when kgdb
++ * NEEDS to talk.  Since kgdb locks down the world, it does not need locks.
++ * We do, of course have possible issues with interrupting a uart operation,
++ * but we will just depend on the uart status to help keep that straight.
++
++ */
++static spinlock_t uart_interrupt_lock = SPIN_LOCK_UNLOCKED;
++#ifdef CONFIG_SMP
++extern spinlock_t kgdb_spinlock;
++#endif
++
++static int
++read_char(struct async_struct *info)
++{
++      int chr;
++      unsigned long flags;
++      local_irq_save(flags);
++#ifdef CONFIG_SMP
++      if (!spin_is_locked(&kgdb_spinlock)) {
++              spin_lock(&uart_interrupt_lock);
++      }
++#endif
++      if (atomic_read(&gdb_buf_in_cnt) != 0) {        /* intr routine has q'd chars */
++              chr = gdb_buf[gdb_buf_out_inx++];
++              gdb_buf_out_inx &= (GDB_BUF_SIZE - 1);
++              atomic_dec(&gdb_buf_in_cnt);
++      } else {
++              chr = read_data_bfr(info);
++      }
++#ifdef CONFIG_SMP
++      if (!spin_is_locked(&kgdb_spinlock)) {
++              spin_unlock(&uart_interrupt_lock);
++      }
++#endif
++      local_irq_restore(flags);
++      return (chr);
++}
++
++/*
++ * Wait until the interface can accept a char, then write it.
++ */
++static void
++write_char(struct async_struct *info, int chr)
++{
++      while (!(inb_p(info->port + UART_LSR) & UART_LSR_THRE)) ;
++
++      outb_p(chr, info->port + UART_TX);
++
++}                             /* write_char */
++
++/*
++ * Mostly we don't need a spinlock, but since the console goes
++ * thru here with interrutps on, well, we need to catch those
++ * chars.
++ */
++/*
++ * This is the receiver interrupt routine for the GDB stub.
++ * It will receive a limited number of characters of input
++ * from the gdb  host machine and save them up in a buffer.
++ *
++ * When the gdb stub routine getDebugChar() is called it
++ * draws characters out of the buffer until it is empty and
++ * then reads directly from the serial port.
++ *
++ * We do not attempt to write chars from the interrupt routine
++ * since the stubs do all of that via putDebugChar() which
++ * writes one byte after waiting for the interface to become
++ * ready.
++ *
++ * The debug stubs like to run with interrupts disabled since,
++ * after all, they run as a consequence of a breakpoint in
++ * the kernel.
++ *
++ * Perhaps someone who knows more about the tty driver than I
++ * care to learn can make this work for any low level serial
++ * driver.
++ */
++static irqreturn_t
++gdb_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++      struct async_struct *info;
++      unsigned long flags;
++
++      info = gdb_async_info;
++      if (!info || !info->tty || irq != gdb_async_irq)
++              return IRQ_NONE;
++
++      local_irq_save(flags);
++      spin_lock(&uart_interrupt_lock);
++      do {
++              int chr = read_data_bfr(info);
++              intprintk(("Debug char on int: %x hex\n", chr));
++              if (chr < 0)
++                      continue;
++
++              if (chr == 3) { /* Ctrl-C means remote interrupt */
++                      BREAKPOINT;
++                      continue;
++              }
++
++              if (atomic_read(&gdb_buf_in_cnt) >= GDB_BUF_SIZE) {
++                      /* buffer overflow tosses early char */
++                      read_char(info);
++              }
++              gdb_buf[gdb_buf_in_inx++] = chr;
++              gdb_buf_in_inx &= (GDB_BUF_SIZE - 1);
++      } while (inb_p(info->port + UART_IIR) & UART_IIR_RDI);
++      spin_unlock(&uart_interrupt_lock);
++      local_irq_restore(flags);
++      return IRQ_HANDLED;
++}                             /* gdb_interrupt */
++
++/*
++ * Just a NULL routine for testing.
++ */
++void
++gdb_null(void)
++{
++}                             /* gdb_null */
++
++/* These structure are filled in with values defined in asm/kgdb_local.h
++ */
++static struct serial_state state = SB_STATE;
++static struct async_struct local_info = SB_INFO;
++static int ok_to_enable_ints = 0;
++static void kgdb_enable_ints_now(void);
++
++extern char *kgdb_version;
++/*
++ * Hook an IRQ for KGDB.
++ *
++ * This routine is called from putDebugChar, below.
++ */
++static int ints_disabled = 1;
++int
++gdb_hook_interrupt(struct async_struct *info, int verb)
++{
++      struct serial_state *state = info->state;
++      unsigned long flags;
++      int port;
++#ifdef TEST_EXISTANCE
++      int scratch, scratch2;
++#endif
++
++      /* The above fails if memory managment is not set up yet. 
++       * Rather than fail the set up, just keep track of the fact
++       * and pick up the interrupt thing later.
++       */
++      gdb_async_info = info;
++      port = gdb_async_info->port;
++      gdb_async_irq = state->irq;
++      if (verb) {
++              printk("kgdb %s : port =%x, IRQ=%d, divisor =%d\n",
++                     kgdb_version,
++                     port,
++                     gdb_async_irq, gdb_async_info->state->custom_divisor);
++      }
++      local_irq_save(flags);
++#ifdef TEST_EXISTANCE
++      /* Existance test */
++      /* Should not need all this, but just in case.... */
++
++      scratch = inb_p(port + UART_IER);
++      outb_px(port + UART_IER, 0);
++      outb_px(0xff, 0x080);
++      scratch2 = inb_p(port + UART_IER);
++      outb_px(port + UART_IER, scratch);
++      if (scratch2) {
++              printk
++                  ("gdb_hook_interrupt: Could not clear IER, not a UART!\n");
++              local_irq_restore(flags);
++              return 1;       /* We failed; there's nothing here */
++      }
++      scratch2 = inb_p(port + UART_LCR);
++      outb_px(port + UART_LCR, 0xBF); /* set up for StarTech test */
++      outb_px(port + UART_EFR, 0);    /* EFR is the same as FCR */
++      outb_px(port + UART_LCR, 0);
++      outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO);
++      scratch = inb_p(port + UART_IIR) >> 6;
++      if (scratch == 1) {
++              printk("gdb_hook_interrupt: Undefined UART type!"
++                     "  Not a UART! \n");
++              local_irq_restore(flags);
++              return 1;
++      } else {
++              dbprintk(("gdb_hook_interrupt: UART type "
++                        "is %d where 0=16450, 2=16550 3=16550A\n", scratch));
++      }
++      scratch = inb_p(port + UART_MCR);
++      outb_px(port + UART_MCR, UART_MCR_LOOP | scratch);
++      outb_px(port + UART_MCR, UART_MCR_LOOP | 0x0A);
++      scratch2 = inb_p(port + UART_MSR) & 0xF0;
++      outb_px(port + UART_MCR, scratch);
++      if (scratch2 != 0x90) {
++              printk("gdb_hook_interrupt: "
++                     "Loop back test failed! Not a UART!\n");
++              local_irq_restore(flags);
++              return scratch2 + 1000; /* force 0 to fail */
++      }
++#endif                                /* test existance */
++      program_uart(info);
++      local_irq_restore(flags);
++
++      return (0);
++
++}                             /* gdb_hook_interrupt */
++
++static void
++program_uart(struct async_struct *info)
++{
++      int port = info->port;
++
++      (void) inb_p(port + UART_RX);
++      outb_px(port + UART_IER, 0);
++
++      (void) inb_p(port + UART_RX);   /* serial driver comments say */
++      (void) inb_p(port + UART_IIR);  /* this clears the interrupt regs */
++      (void) inb_p(port + UART_MSR);
++      outb_px(port + UART_LCR, UART_LCR_WLEN8 | UART_LCR_DLAB);
++      outb_px(port + UART_DLL, info->state->custom_divisor & 0xff);   /* LS */
++      outb_px(port + UART_DLM, info->state->custom_divisor >> 8);     /* MS  */
++      outb_px(port + UART_MCR, info->MCR);
++
++      outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1 | UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR);        /* set fcr */
++      outb_px(port + UART_LCR, UART_LCR_WLEN8);       /* reset DLAB */
++      outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1);    /* set fcr */
++      if (!ints_disabled) {
++              intprintk(("KGDB: Sending %d to port %x offset %d\n",
++                         gdb_async_info->IER,
++                         (int) gdb_async_info->port, UART_IER));
++              outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
++      }
++      return;
++}
++
++/*
++ * getDebugChar
++ *
++ * This is a GDB stub routine.        It waits for a character from the
++ * serial interface and then returns it.  If there is no serial
++ * interface connection then it returns a bogus value which will
++ * almost certainly cause the system to hang.  In the 
++ */
++int kgdb_in_isr = 0;
++int kgdb_in_lsr = 0;
++extern spinlock_t kgdb_spinlock;
++
++/* Caller takes needed protections */
++
++int
++getDebugChar(void)
++{
++      volatile int chr, dum, time, end_time;
++
++      dbprintk(("getDebugChar(port %x): ", gdb_async_info->port));
++
++      if (gdb_async_info == NULL) {
++              gdb_hook_interrupt(&local_info, 0);
++      }
++      /* 
++       * This trick says if we wait a very long time and get
++       * no char, return the -1 and let the upper level deal
++       * with it.
++       */
++      rdtsc(dum, time);
++      end_time = time + 2;
++      while (((chr = read_char(gdb_async_info)) == -1) &&
++             (end_time - time) > 0) {
++              rdtsc(dum, time);
++      };
++      /*
++       * This covers our butts if some other code messes with
++       * our uart, hay, it happens :o)
++       */
++      if (chr == -1)
++              program_uart(gdb_async_info);
++
++      dbprintk(("%c\n", chr > ' ' && chr < 0x7F ? chr : ' '));
++      return (chr);
++
++}                             /* getDebugChar */
++
++static int count = 3;
++static spinlock_t one_at_atime = SPIN_LOCK_UNLOCKED;
++
++static int __init
++kgdb_enable_ints(void)
++{
++      if (gdb_async_info == NULL) {
++              gdb_hook_interrupt(&local_info, 1);
++      }
++      ok_to_enable_ints = 1;
++      kgdb_enable_ints_now();
++#ifdef CONFIG_KGDB_USER_CONSOLE
++      kgdb_console_finit();
++#endif
++      return 0;
++}
++
++#ifdef CONFIG_SERIAL_8250
++void shutdown_for_kgdb(struct async_struct *gdb_async_info);
++#endif
++
++#ifdef CONFIG_DISCONTIGMEM
++static inline int kgdb_mem_init_done(void)
++{
++      return highmem_start_page != NULL;
++}
++#else
++static inline int kgdb_mem_init_done(void)
++{
++      return max_mapnr != 0;
++}
++#endif
++
++static void
++kgdb_enable_ints_now(void)
++{
++      if (!spin_trylock(&one_at_atime))
++              return;
++      if (!ints_disabled)
++              goto exit;
++      if (kgdb_mem_init_done() &&
++                      ints_disabled) {        /* don't try till mem init */
++#ifdef CONFIG_SERIAL_8250
++              /*
++               * The ifdef here allows the system to be configured
++               * without the serial driver.
++               * Don't make it a module, however, it will steal the port
++               */
++              shutdown_for_kgdb(gdb_async_info);
++#endif
++              ints_disabled = request_irq(gdb_async_info->state->irq,
++                                          gdb_interrupt,
++                                          IRQ_T(gdb_async_info),
++                                          "KGDB-stub", NULL);
++              intprintk(("KGDB: request_irq returned %d\n", ints_disabled));
++      }
++      if (!ints_disabled) {
++              intprintk(("KGDB: Sending %d to port %x offset %d\n",
++                         gdb_async_info->IER,
++                         (int) gdb_async_info->port, UART_IER));
++              outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
++      }
++      exit:
++      spin_unlock(&one_at_atime);
++}
++
++/*
++ * putDebugChar
++ *
++ * This is a GDB stub routine.        It waits until the interface is ready
++ * to transmit a char and then sends it.  If there is no serial
++ * interface connection then it simply returns to its caller, having
++ * pretended to send the char.        Caller takes needed protections.
++ */
++void
++putDebugChar(int chr)
++{
++      dbprintk(("putDebugChar(port %x): chr=%02x '%c', ints_on=%d\n",
++                gdb_async_info->port,
++                chr,
++                chr > ' ' && chr < 0x7F ? chr : ' ', ints_disabled ? 0 : 1));
++
++      if (gdb_async_info == NULL) {
++              gdb_hook_interrupt(&local_info, 0);
++      }
++
++      write_char(gdb_async_info, chr);        /* this routine will wait */
++      count = (chr == '#') ? 0 : count + 1;
++      if ((count == 2)) {     /* try to enable after */
++              if (ints_disabled & ok_to_enable_ints)
++                      kgdb_enable_ints_now(); /* try to enable after */
++
++              /* We do this a lot because, well we really want to get these
++               * interrupts.  The serial driver will clear these bits when it
++               * initializes the chip.  Every thing else it does is ok, 
++               * but this.
++               */
++              if (!ints_disabled) {
++                      outb_px(gdb_async_info->port + UART_IER,
++                              gdb_async_info->IER);
++              }
++      }
++
++}                             /* putDebugChar */
++
++module_init(kgdb_enable_ints);
+--- linux-2.6.0-test1/arch/i386/lib/Makefile   2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/lib/Makefile  2003-07-19 17:04:02.000000000 -0700
+@@ -9,4 +9,5 @@ lib-y = checksum.o delay.o \
+ lib-$(CONFIG_X86_USE_3DNOW) += mmx.o
+ lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
++lib-$(CONFIG_KGDB) += kgdb_serial.o
+ lib-$(CONFIG_DEBUG_IOVIRT)  += iodebug.o
+--- linux-2.6.0-test1/arch/i386/mach-generic/bigsmp.c  2003-06-14 12:18:05.000000000 -0700
++++ 25/arch/i386/mach-generic/bigsmp.c 2003-07-19 17:04:13.000000000 -0700
+@@ -3,6 +3,10 @@
+  * Drives the local APIC in "clustered mode".
+  */
+ #define APIC_DEFINITION 1
++#include <linux/config.h>
++#include <linux/threads.h>
++#include <linux/cpumask.h>
++#include <asm/mpspec.h>
+ #include <asm/genapic.h>
+ #include <asm/fixmap.h>
+ #include <asm/apicdef.h>
+--- linux-2.6.0-test1/arch/i386/mach-generic/default.c 2003-06-14 12:17:57.000000000 -0700
++++ 25/arch/i386/mach-generic/default.c        2003-07-19 17:04:13.000000000 -0700
+@@ -2,6 +2,10 @@
+  * Default generic APIC driver. This handles upto 8 CPUs.
+  */
+ #define APIC_DEFINITION 1
++#include <linux/config.h>
++#include <linux/threads.h>
++#include <linux/cpumask.h>
++#include <asm/mpspec.h>
+ #include <asm/mach-default/mach_apicdef.h>
+ #include <asm/genapic.h>
+ #include <asm/fixmap.h>
+--- linux-2.6.0-test1/arch/i386/mach-generic/probe.c   2003-06-14 12:17:57.000000000 -0700
++++ 25/arch/i386/mach-generic/probe.c  2003-07-19 17:04:13.000000000 -0700
+@@ -3,11 +3,15 @@
+  * 
+  * Generic x86 APIC driver probe layer.
+  */  
++#include <linux/config.h>
++#include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/string.h>
+ #include <linux/kernel.h>
+ #include <linux/ctype.h>
+ #include <linux/init.h>
+ #include <asm/fixmap.h>
++#include <asm/mpspec.h>
+ #include <asm/apicdef.h>
+ #include <asm/genapic.h>
+--- linux-2.6.0-test1/arch/i386/mach-generic/summit.c  2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/i386/mach-generic/summit.c 2003-07-19 17:04:13.000000000 -0700
+@@ -2,6 +2,10 @@
+  * APIC driver for the IBM "Summit" chipset.
+  */
+ #define APIC_DEFINITION 1
++#include <linux/config.h>
++#include <linux/threads.h>
++#include <linux/cpumask.h>
++#include <asm/mpspec.h>
+ #include <asm/genapic.h>
+ #include <asm/fixmap.h>
+ #include <asm/apicdef.h>
+--- linux-2.6.0-test1/arch/i386/mach-visws/mpparse.c   2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/i386/mach-visws/mpparse.c  2003-07-19 17:04:06.000000000 -0700
+@@ -26,7 +26,7 @@ unsigned int boot_cpu_physical_apicid = 
+ unsigned int boot_cpu_logical_apicid = -1U;
+ /* Bitmask of physically existing CPUs */
+-unsigned long phys_cpu_present_map;
++cpumask_t phys_cpu_present_map;
+ /*
+@@ -38,6 +38,7 @@ unsigned long phys_cpu_present_map;
+ void __init MP_processor_info (struct mpc_config_processor *m)
+ {
+       int ver, logical_apicid;
++      cpumask_t apic_cpus;
+       
+       if (!(m->mpc_cpuflag & CPU_ENABLED))
+               return;
+@@ -62,7 +63,8 @@ void __init MP_processor_info (struct mp
+       }
+       ver = m->mpc_apicver;
+-      phys_cpu_present_map |= apicid_to_cpu_present(m->mpc_apicid);
++      apic_cpus = apicid_to_cpu_present(m->mpc_apicid);
++      cpus_or(phys_cpu_present_map, phys_cpu_present_map, apic_cpus);
+       /*
+        * Validate version
+        */
+--- linux-2.6.0-test1/arch/i386/mach-voyager/voyager_smp.c     2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/i386/mach-voyager/voyager_smp.c    2003-07-19 17:04:06.000000000 -0700
+@@ -75,15 +75,15 @@ static int voyager_extended_cpus = 1;
+ int smp_found_config = 0;
+ /* Used for the invalidate map that's also checked in the spinlock */
+-volatile unsigned long smp_invalidate_needed;
++static volatile unsigned long smp_invalidate_needed;
+ /* Bitmask of currently online CPUs - used by setup.c for
+    /proc/cpuinfo, visible externally but still physical */
+-unsigned long cpu_online_map = 0;
++cpumask_t cpu_online_map = CPU_MASK_NONE;
+ /* Bitmask of CPUs present in the system - exported by i386_syms.c, used
+  * by scheduler but indexed physically */
+-unsigned long phys_cpu_present_map = 0;
++cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
+ /* estimate of time used to flush the SMP-local cache - used in
+  * processor affinity calculations */
+@@ -108,7 +108,7 @@ static void enable_local_vic_irq(unsigne
+ static void disable_local_vic_irq(unsigned int irq);
+ static void before_handle_vic_irq(unsigned int irq);
+ static void after_handle_vic_irq(unsigned int irq);
+-static void set_vic_irq_affinity(unsigned int irq, unsigned long mask);
++static void set_vic_irq_affinity(unsigned int irq, cpumask_t mask);
+ static void ack_vic_irq(unsigned int irq);
+ static void vic_enable_cpi(void);
+ static void do_boot_cpu(__u8 cpuid);
+@@ -128,13 +128,12 @@ send_one_QIC_CPI(__u8 cpu, __u8 cpi)
+ static inline void
+ send_QIC_CPI(__u32 cpuset, __u8 cpi)
+ {
+-      int mask;
+-      __u8 cpu;
++      int cpu;
+-      for_each_cpu(cpu, mask) {
++      for_each_cpu(cpu, mk_cpumask_const(cpu_online_map)) {
+               if(cpuset & (1<<cpu)) {
+ #ifdef VOYAGER_DEBUG
+-                      if(!test_bit(cpu, cpu_online_map))
++                      if(!cpu_isset(cpu, cpu_online_map))
+                               VDEBUG(("CPU%d sending cpi %d to CPU%d not in cpu_online_map\n", hard_smp_processor_id(), cpi, cpu));
+ #endif
+                       send_one_QIC_CPI(cpu, cpi - QIC_CPI_OFFSET);
+@@ -155,7 +154,7 @@ static inline void
+ send_CPI_allbutself(__u8 cpi)
+ {
+       __u8 cpu = smp_processor_id();
+-      __u32 mask = (cpu_online_map & (~(1<<cpu)));
++      __u32 mask = cpus_coerce(cpu_online_map) & ~(1 << cpu);
+       send_CPI(mask, cpi);
+ }
+@@ -243,11 +242,11 @@ static __u32 cpu_booted_map;
+ /* the synchronize flag used to hold all secondary CPUs spinning in
+  * a tight loop until the boot sequence is ready for them */
+-static unsigned long smp_commenced_mask = 0;
++static cpumask_t smp_commenced_mask = CPU_MASK_NONE;
+ /* This is for the new dynamic CPU boot code */
+-volatile unsigned long cpu_callin_map = 0;
+-volatile unsigned long cpu_callout_map = 0;
++volatile cpumask_t cpu_callin_map = CPU_MASK_NONE;
++volatile cpumask_t cpu_callout_map = CPU_MASK_NONE;
+ /* The per processor IRQ masks (these are usually kept in sync) */
+ static __u16 vic_irq_mask[NR_CPUS] __cacheline_aligned;
+@@ -395,7 +394,7 @@ find_smp_config(void)
+       for(i=0; i<NR_CPUS; i++) {
+               cpu_irq_affinity[i] = ~0;
+       }
+-      cpu_online_map = (1<<boot_cpu_id);
++      cpu_online_map = cpumask_of_cpu(boot_cpu_id);
+       /* The boot CPU must be extended */
+       voyager_extended_vic_processors = 1<<boot_cpu_id;
+@@ -404,11 +403,11 @@ find_smp_config(void)
+       /* set up everything for just this CPU, we can alter
+        * this as we start the other CPUs later */
+       /* now get the CPU disposition from the extended CMOS */
+-      phys_cpu_present_map = voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK);
+-      phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 1) << 8;
+-      phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 2) << 16;
+-      phys_cpu_present_map |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 3) << 24;
+-      printk("VOYAGER SMP: phys_cpu_present_map = 0x%lx\n", phys_cpu_present_map);
++      phys_cpu_present_map = cpus_promote(voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK));
++      cpus_coerce(phys_cpu_present_map) |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 1) << 8;
++      cpus_coerce(phys_cpu_present_map) |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 2) << 16;
++      cpus_coerce(phys_cpu_present_map) |= voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 3) << 24;
++      printk("VOYAGER SMP: phys_cpu_present_map = 0x%lx\n", cpus_coerce(phys_cpu_present_map));
+       /* Here we set up the VIC to enable SMP */
+       /* enable the CPIs by writing the base vector to their register */
+       outb(VIC_DEFAULT_CPI_BASE, VIC_CPI_BASE_REGISTER);
+@@ -509,18 +508,18 @@ start_secondary(void *unused)
+        * permission to proceed.  Without this, the new per CPU stuff
+        * in the softirqs will fail */
+       local_irq_disable();
+-      set_bit(cpuid, &cpu_callin_map);
++      cpu_set(cpuid, cpu_callin_map);
+       /* signal that we're done */
+       cpu_booted_map = 1;
+-      while (!test_bit(cpuid, &smp_commenced_mask))
++      while (!cpu_isset(cpuid, smp_commenced_mask))
+               rep_nop();
+       local_irq_enable();
+       local_flush_tlb();
+-      set_bit(cpuid, &cpu_online_map);
++      cpu_set(cpuid, cpu_online_map);
+       wmb();
+       return cpu_idle();
+ }
+@@ -674,14 +673,14 @@ do_boot_cpu(__u8 cpu)
+       free_page((unsigned long)page_table_copies);
+ #endif
+         
+-      if(cpu_booted_map) {
++      if (cpu_booted_map) {
+               VDEBUG(("CPU%d: Booted successfully, back in CPU %d\n",
+                       cpu, smp_processor_id()));
+       
+               printk("CPU%d: ", cpu);
+               print_cpu_info(&cpu_data[cpu]);
+               wmb();
+-              set_bit(cpu, &cpu_callout_map);
++              cpu_set(cpu, cpu_callout_map);
+       }
+       else {
+               printk("CPU%d FAILED TO BOOT: ", cpu);
+@@ -708,13 +707,12 @@ smp_boot_cpus(void)
+               /* now that the cat has probed the Voyager System Bus, sanity
+                * check the cpu map */
+               if( ((voyager_quad_processors | voyager_extended_vic_processors)
+-                   & phys_cpu_present_map) != phys_cpu_present_map) {
++                   & cpus_coerce(phys_cpu_present_map)) != cpus_coerce(phys_cpu_present_map)) {
+                       /* should panic */
+                       printk("\n\n***WARNING*** Sanity check of CPU present map FAILED\n");
+               }
+-      } else if(voyager_level == 4) {
+-              voyager_extended_vic_processors = phys_cpu_present_map;
+-      }
++      } else if(voyager_level == 4)
++              voyager_extended_vic_processors = cpus_coerce(phys_cpu_present_map);
+       /* this sets up the idle task to run on the current cpu */
+       voyager_extended_cpus = 1;
+@@ -740,13 +738,13 @@ smp_boot_cpus(void)
+       /* enable our own CPIs */
+       vic_enable_cpi();
+-      set_bit(boot_cpu_id, &cpu_online_map);
+-      set_bit(boot_cpu_id, &cpu_callout_map);
++      cpu_set(boot_cpu_id, cpu_online_map);
++      cpu_set(boot_cpu_id, cpu_callout_map);
+       
+       /* loop over all the extended VIC CPUs and boot them.  The 
+        * Quad CPUs must be bootstrapped by their extended VIC cpu */
+       for(i = 0; i < NR_CPUS; i++) {
+-              if( i == boot_cpu_id || ((1<<i) & (phys_cpu_present_map) ) == 0)
++              if(i == boot_cpu_id || !cpu_isset(i, phys_cpu_present_map))
+                       continue;
+               do_boot_cpu(i);
+               /* This udelay seems to be needed for the Quad boots
+@@ -758,7 +756,7 @@ smp_boot_cpus(void)
+       {
+               unsigned long bogosum = 0;
+               for (i = 0; i < NR_CPUS; i++)
+-                      if (cpu_online_map & (1<<i))
++                      if (cpu_isset(i, cpu_online_map))
+                               bogosum += cpu_data[i].loops_per_jiffy;
+               printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
+                       cpucount+1,
+@@ -865,7 +863,7 @@ leave_mm (unsigned long cpu)
+ {
+       if (cpu_tlbstate[cpu].state == TLBSTATE_OK)
+               BUG();
+-      clear_bit(cpu,  &cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
++      cpu_clear(cpu,  cpu_tlbstate[cpu].active_mm->cpu_vm_mask);
+       load_cr3(swapper_pg_dir);
+ }
+@@ -878,7 +876,7 @@ smp_invalidate_interrupt(void)
+ {
+       __u8 cpu = get_cpu();
+-      if(!test_bit(cpu, &smp_invalidate_needed))
++      if (!(smp_invalidate_needed & (1UL << cpu)))
+               goto out;
+       /* This will flood messages.  Don't uncomment unless you see
+        * Problems with cross cpu invalidation
+@@ -895,7 +893,7 @@ smp_invalidate_interrupt(void)
+               } else
+                       leave_mm(cpu);
+       }
+-      clear_bit(cpu, &smp_invalidate_needed);
++      smp_invalidate_needed |= 1UL << cpu;
+  out:
+       put_cpu_no_resched();
+ }
+@@ -912,7 +910,7 @@ flush_tlb_others (unsigned long cpumask,
+       if (!cpumask)
+               BUG();
+-      if ((cpumask & cpu_online_map) != cpumask)
++      if ((cpumask & cpus_coerce(cpu_online_map)) != cpumask)
+               BUG();
+       if (cpumask & (1 << smp_processor_id()))
+               BUG();
+@@ -954,7 +952,7 @@ flush_tlb_current_task(void)
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
++      cpu_mask = cpus_coerce(mm->cpu_vm_mask) & ~(1 << smp_processor_id());
+       local_flush_tlb();
+       if (cpu_mask)
+               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+@@ -970,7 +968,7 @@ flush_tlb_mm (struct mm_struct * mm)
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
++      cpu_mask = cpus_coerce(mm->cpu_vm_mask) & ~(1 << smp_processor_id());
+       if (current->active_mm == mm) {
+               if (current->mm)
+@@ -991,7 +989,7 @@ void flush_tlb_page(struct vm_area_struc
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1 << smp_processor_id());
++      cpu_mask = cpus_coerce(mm->cpu_vm_mask) & ~(1 << smp_processor_id());
+       if (current->active_mm == mm) {
+               if(current->mm)
+                       __flush_tlb_one(va);
+@@ -1033,7 +1031,7 @@ static void
+ smp_stop_cpu_function(void *dummy)
+ {
+       VDEBUG(("VOYAGER SMP: CPU%d is STOPPING\n", smp_processor_id()));
+-      clear_bit(smp_processor_id(), &cpu_online_map);
++      cpu_clear(smp_processor_id(), cpu_online_map);
+       local_irq_disable();
+       for(;;)
+              __asm__("hlt");
+@@ -1100,7 +1098,7 @@ smp_call_function (void (*func) (void *i
+                  int wait)
+ {
+       struct call_data_struct data;
+-      __u32 mask = cpu_online_map;
++      __u32 mask = cpus_coerce(cpu_online_map);
+       mask &= ~(1<<smp_processor_id());
+@@ -1451,8 +1449,7 @@ smp_intr_init(void)
+ static void
+ send_CPI(__u32 cpuset, __u8 cpi)
+ {
+-      int mask;
+-      __u8 cpu;
++      int cpu;
+       __u32 quad_cpuset = (cpuset & voyager_quad_processors);
+       if(cpi < VIC_START_FAKE_CPI) {
+@@ -1467,7 +1464,7 @@ send_CPI(__u32 cpuset, __u8 cpi)
+       cpuset &= 0xff;         /* only first 8 CPUs vaild for VIC CPI */
+       if(cpuset == 0)
+               return;
+-      for_each_cpu(cpu, mask) {
++      for_each_cpu(cpu, mk_cpumask_const(cpu_online_map)) {
+               if(cpuset & (1<<cpu))
+                       set_bit(cpi, &vic_cpi_mailbox[cpu]);
+       }
+@@ -1571,10 +1568,9 @@ startup_vic_irq(unsigned int irq)
+ static void
+ enable_vic_irq(unsigned int irq)
+ {
+-      int tmpmask;
+       /* linux doesn't to processor-irq affinity, so enable on
+        * all CPUs we know about */
+-      __u8 cpu = smp_processor_id(), real_cpu;
++      int cpu = smp_processor_id(), real_cpu;
+       __u16 mask = (1<<irq);
+       __u32 processorList = 0;
+       unsigned long flags;
+@@ -1582,7 +1578,7 @@ enable_vic_irq(unsigned int irq)
+       VDEBUG(("VOYAGER: enable_vic_irq(%d) CPU%d affinity 0x%lx\n",
+               irq, cpu, cpu_irq_affinity[cpu]));
+       spin_lock_irqsave(&vic_irq_lock, flags);
+-      for_each_cpu(real_cpu, tmpmask) {
++      for_each_cpu(real_cpu, mk_cpumask_const(cpu_online_map)) {
+               if(!(voyager_extended_vic_processors & (1<<real_cpu)))
+                       continue;
+               if(!(cpu_irq_affinity[real_cpu] & mask)) {
+@@ -1727,7 +1723,7 @@ after_handle_vic_irq(unsigned int irq)
+                       printk("VOYAGER SMP: CPU%d lost interrupt %d\n",
+                              cpu, irq);
+-                      for_each_cpu(real_cpu, mask) {
++                      for_each_cpu(real_cpu, mk_cpumask_const(mask)) {
+                               outb(VIC_CPU_MASQUERADE_ENABLE | real_cpu,
+                                    VIC_PROCESSOR_ID);
+@@ -1783,15 +1779,16 @@ after_handle_vic_irq(unsigned int irq)
+  * the selected processors */
+ void
+-set_vic_irq_affinity(unsigned int irq, unsigned long mask) 
++set_vic_irq_affinity(unsigned int irq, cpumask_t mask)
+ {
+       /* Only extended processors handle interrupts */
+-      unsigned long real_mask = mask & voyager_extended_vic_processors;
+-      unsigned long irq_mask = (1<<irq);
+-      int tmpmask;
+-      __u8 cpu;
++      unsigned long real_mask;
++      unsigned long irq_mask = 1 << irq;
++      int cpu;
++
++      real_mask = cpus_coerce(mask) & voyager_extended_vic_processors;
+       
+-      if(mask == 0)
++      if(cpus_coerce(mask) == 0)
+               /* can't have no cpu's to accept the interrupt -- extremely
+                * bad things will happen */
+               return;
+@@ -1811,8 +1808,8 @@ set_vic_irq_affinity(unsigned int irq, u
+                * bus) */
+               return;
+-      for_each_cpu(cpu, tmpmask) {
+-              unsigned long cpu_mask = (1<<cpu);
++      for_each_cpu(cpu, mk_cpumask_const(cpu_online_map)) {
++              unsigned long cpu_mask = 1 << cpu;
+               
+               if(cpu_mask & real_mask) {
+                       /* enable the interrupt for this cpu */
+@@ -1874,11 +1871,10 @@ vic_enable_cpi(void)
+ void
+ voyager_smp_dump()
+ {
+-      int mask;
+-      __u8 old_cpu = smp_processor_id(), cpu;
++      int old_cpu = smp_processor_id(), cpu;
+       /* dump the interrupt masks of each processor */
+-      for_each_cpu(cpu, mask) {
++      for_each_cpu(cpu, mk_cpumask_const(cpu_online_map)) {
+               __u16 imr, isr, irr;
+               unsigned long flags;
+@@ -1936,23 +1932,23 @@ smp_prepare_cpus(unsigned int max_cpus)
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
+-      set_bit(smp_processor_id(), &cpu_callout_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_callout_map);
+ }
+ int __devinit
+ __cpu_up(unsigned int cpu)
+ {
+       /* This only works at boot for x86.  See "rewrite" above. */
+-      if (test_bit(cpu, &smp_commenced_mask))
++      if (cpu_isset(cpu, smp_commenced_mask))
+               return -ENOSYS;
+       /* In case one didn't come up */
+-      if (!test_bit(cpu, &cpu_callin_map))
++      if (!cpu_isset(cpu, cpu_callin_map))
+               return -EIO;
+       /* Unleash the CPU! */
+-      set_bit(cpu, &smp_commenced_mask);
+-      while (!test_bit(cpu, &cpu_online_map))
++      cpu_set(cpu, smp_commenced_mask);
++      while (!cpu_isset(cpu, cpu_online_map))
+               mb();
+       return 0;
+ }
+--- linux-2.6.0-test1/arch/i386/Makefile       2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/Makefile      2003-07-19 17:04:05.000000000 -0700
+@@ -85,6 +85,9 @@ mcore-$(CONFIG_X86_ES7000)   := mach-es700
+ # default subarch .h files
+ mflags-y += -Iinclude/asm-i386/mach-default
++mflags-$(CONFIG_KGDB) += -ggdb
++mflags-$(CONFIG_KGDB_MORE) += $(shell echo $(CONFIG_KGDB_OPTIONS) | sed -e 's/"//g')
++
+ head-y := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
+ libs-y                                        += arch/i386/lib/
+--- linux-2.6.0-test1/arch/i386/mm/fault.c     2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/mm/fault.c    2003-07-19 17:07:16.000000000 -0700
+@@ -236,6 +236,12 @@ no_context:
+  * Oops. The kernel tried to access some bad page. We'll have to
+  * terminate things with extreme prejudice.
+  */
++#ifdef CONFIG_KGDB
++        if (!user_mode(regs)){
++                kgdb_handle_exception(14,SIGBUS, error_code, regs);
++                return;
++        }
++#endif
+       bust_spinlocks(1);
+@@ -247,6 +253,13 @@ no_context:
+       printk(" printing eip:\n");
+       printk("%08lx\n", regs->eip);
+       asm("movl %%cr3,%0":"=r" (page));
++#ifdef CONFIG_HIGHPMD /* Oh boy. Error reporting is going to blow major goats. */
++      printk(KERN_ALERT "%%cr3 = 0x%lx\n", page);
++      /* Mask off flag bits. It should end up 32B-aligned. */
++      page &= ~(PTRS_PER_PGD*sizeof(pgd_t) - 1);
++      printk(KERN_ALERT "*pdpte = 0x%Lx\n",
++                      pgd_val(((pgd_t *)__va(page))[address >> PGDIR_SHIFT]));
++#else /* !CONFIG_HIGHPMD */
+       page = ((unsigned long *) __va(page))[address >> 22];
+       printk(KERN_ALERT "*pde = %08lx\n", page);
+       /*
+@@ -262,7 +275,8 @@ no_context:
+               page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
+               printk(KERN_ALERT "*pte = %08lx\n", page);
+       }
+-#endif
++#endif /* !CONFIG_HIGHPTE */
++#endif /* CONFIG_HIGHPMD */
+       die("Oops", regs, error_code);
+       bust_spinlocks(0);
+       do_exit(SIGKILL);
+@@ -330,8 +344,8 @@ vmalloc_fault:
+                * and redundant with the set_pmd() on non-PAE.
+                */
+-              pmd = pmd_offset(pgd, address);
+-              pmd_k = pmd_offset(pgd_k, address);
++              pmd = pmd_offset_kernel(pgd, address);
++              pmd_k = pmd_offset_kernel(pgd_k, address);
+               if (!pmd_present(*pmd_k))
+                       goto no_context;
+               set_pmd(pmd, *pmd_k);
+--- linux-2.6.0-test1/arch/i386/mm/hugetlbpage.c       2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/i386/mm/hugetlbpage.c      2003-07-19 17:07:16.000000000 -0700
+@@ -87,8 +87,8 @@ static pte_t *huge_pte_alloc(struct mm_s
+       pmd_t *pmd = NULL;
+       pgd = pgd_offset(mm, addr);
+-      pmd = pmd_alloc(mm, pgd, addr);
+-      return (pte_t *) pmd;
++      pmd = pmd_alloc_map(mm, pgd, addr);
++      return (pte_t *)pmd;
+ }
+ static pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+@@ -97,8 +97,8 @@ static pte_t *huge_pte_offset(struct mm_
+       pmd_t *pmd = NULL;
+       pgd = pgd_offset(mm, addr);
+-      pmd = pmd_offset(pgd, addr);
+-      return (pte_t *) pmd;
++      pmd = pmd_offset_map_nested(pgd, addr);
++      return (pte_t *)pmd;
+ }
+ static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma, struct page *page, pte_t * page_table, int write_access)
+@@ -145,6 +145,8 @@ int copy_hugetlb_page_range(struct mm_st
+               ptepage = pte_page(entry);
+               get_page(ptepage);
+               set_pte(dst_pte, entry);
++              pmd_unmap(dst_pte);
++              pmd_unmap_nested(src_pte);
+               dst->rss += (HPAGE_SIZE / PAGE_SIZE);
+               addr += HPAGE_SIZE;
+       }
+@@ -182,6 +184,7 @@ follow_hugetlb_page(struct mm_struct *mm
+                       get_page(page);
+                       pages[i] = page;
++                      pmd_unmap_nested(pte);
+               }
+               if (vmas)
+@@ -271,6 +274,7 @@ follow_huge_pmd(struct mm_struct *mm, un
+               page += ((address & ~HPAGE_MASK) >> PAGE_SHIFT);
+               get_page(page);
+       }
++      pmd_unmap(pmd);
+       return page;
+ }
+ #endif
+@@ -314,6 +318,7 @@ void unmap_hugepage_range(struct vm_area
+               page = pte_page(*pte);
+               huge_page_release(page);
+               pte_clear(pte);
++              pmd_unmap_nested(pte);
+       }
+       mm->rss -= (end - start) >> PAGE_SHIFT;
+       flush_tlb_range(vma, start, end);
+@@ -348,8 +353,10 @@ int hugetlb_prefault(struct address_spac
+                       ret = -ENOMEM;
+                       goto out;
+               }
+-              if (!pte_none(*pte))
++              if (!pte_none(*pte)) {
++                      pmd_unmap(pte);
+                       continue;
++              }
+               idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
+                       + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
+@@ -358,16 +365,19 @@ int hugetlb_prefault(struct address_spac
+                       page = alloc_hugetlb_page();
+                       if (!page) {
+                               ret = -ENOMEM;
++                              pmd_unmap(pte);
+                               goto out;
+                       }
+                       ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
+                       unlock_page(page);
+                       if (ret) {
+                               free_huge_page(page);
++                              pmd_unmap(pte);
+                               goto out;
+                       }
+               }
+               set_huge_pte(mm, vma, page, pte, vma->vm_flags & VM_WRITE);
++              pmd_unmap(pte);
+       }
+ out:
+       spin_unlock(&mm->page_table_lock);
+--- linux-2.6.0-test1/arch/i386/mm/init.c      2003-06-26 22:07:23.000000000 -0700
++++ 25/arch/i386/mm/init.c     2003-07-19 17:07:16.000000000 -0700
+@@ -20,9 +20,6 @@
+ #include <linux/swap.h>
+ #include <linux/smp.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+-#endif
+ #include <linux/highmem.h>
+ #include <linux/pagemap.h>
+ #include <linux/bootmem.h>
+@@ -59,10 +56,10 @@ static pmd_t * __init one_md_table_init(
+ #ifdef CONFIG_X86_PAE
+       pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+       set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
+-      if (pmd_table != pmd_offset(pgd, 0)) 
++      if (pmd_table != pmd_offset_kernel(pgd, 0))
+               BUG();
+ #else
+-      pmd_table = pmd_offset(pgd, 0);
++      pmd_table = pmd_offset_kernel(pgd, 0);
+ #endif
+       return pmd_table;
+@@ -113,7 +110,7 @@ static void __init page_table_range_init
+               if (pgd_none(*pgd)) 
+                       one_md_table_init(pgd);
+-              pmd = pmd_offset(pgd, vaddr);
++              pmd = pmd_offset_kernel(pgd, vaddr);
+               for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); pmd++, pmd_idx++) {
+                       if (pmd_none(*pmd)) 
+                               one_page_table_init(pmd);
+@@ -194,7 +191,7 @@ pte_t *kmap_pte;
+ pgprot_t kmap_prot;
+ #define kmap_get_fixmap_pte(vaddr)                                    \
+-      pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr))
++      pte_offset_kernel(pmd_offset_kernel(pgd_offset_k(vaddr), (vaddr)), (vaddr))
+ void __init kmap_init(void)
+ {
+@@ -218,7 +215,7 @@ void __init permanent_kmaps_init(pgd_t *
+       page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
+       pgd = swapper_pg_dir + pgd_index(vaddr);
+-      pmd = pmd_offset(pgd, vaddr);
++      pmd = pmd_offset_kernel(pgd, vaddr);
+       pte = pte_offset_kernel(pmd, vaddr);
+       pkmap_page_table = pte; 
+ }
+@@ -512,20 +509,19 @@ void __init mem_init(void)
+ #endif
+ }
+-#ifdef CONFIG_X86_PAE
+-struct kmem_cache_s *pae_pgd_cachep;
++kmem_cache_t *pgd_cache;
+ void __init pgtable_cache_init(void)
+ {
+-        /*
+-         * PAE pgds must be 16-byte aligned:
+-         */
+-        pae_pgd_cachep = kmem_cache_create("pae_pgd", 32, 0,
+-                SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN, NULL, NULL);
+-        if (!pae_pgd_cachep)
+-                panic("init_pae(): Cannot alloc pae_pgd SLAB cache");
++      pgd_cache = kmem_cache_create("pgd",
++                              PTRS_PER_PGD*sizeof(pgd_t),
++                              0,
++                              SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
++                              pgd_ctor,
++                              PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
++      if (!pgd_cache)
++              panic("pgtable_cache_init(): Cannot create pgd cache");
+ }
+-#endif
+ /*
+  * This function cannot be __init, since exceptions don't work in that
+@@ -565,7 +561,7 @@ void free_initmem(void)
+               free_page(addr);
+               totalram_pages++;
+       }
+-      printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (&__init_end - &__init_begin) >> 10);
++      printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (__init_end - __init_begin) >> 10);
+ }
+ #ifdef CONFIG_BLK_DEV_INITRD
+--- linux-2.6.0-test1/arch/i386/mm/ioremap.c   2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/i386/mm/ioremap.c  2003-07-19 17:07:16.000000000 -0700
+@@ -82,7 +82,7 @@ static int remap_area_pages(unsigned lon
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(&init_mm, dir, address);
++              pmd = pmd_alloc_kernel(&init_mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+--- linux-2.6.0-test1/arch/i386/mm/pageattr.c  2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/mm/pageattr.c 2003-07-19 17:07:16.000000000 -0700
+@@ -23,7 +23,7 @@ static inline pte_t *lookup_address(unsi
+       pmd_t *pmd;
+       if (pgd_none(*pgd))
+               return NULL;
+-      pmd = pmd_offset(pgd, address);                
++      pmd = pmd_offset_kernel(pgd, address);
+       if (pmd_none(*pmd))
+               return NULL;
+       if (pmd_large(*pmd))
+@@ -67,19 +67,22 @@ static void flush_kernel_map(void *dummy
+ static void set_pmd_pte(pte_t *kpte, unsigned long address, pte_t pte) 
+ { 
++      struct page *page;
++      unsigned long flags;
++
+       set_pte_atomic(kpte, pte);      /* change init_mm */
+-#ifndef CONFIG_X86_PAE
+-      {
+-              struct list_head *l;
+-              spin_lock(&mmlist_lock);
+-              list_for_each(l, &init_mm.mmlist) { 
+-                      struct mm_struct *mm = list_entry(l, struct mm_struct, mmlist);
+-                      pmd_t *pmd = pmd_offset(pgd_offset(mm, address), address);
+-                      set_pte_atomic((pte_t *)pmd, pte);
+-              } 
+-              spin_unlock(&mmlist_lock);
++      if (PTRS_PER_PMD > 1)
++              return;
++
++      spin_lock_irqsave(&pgd_lock, flags);
++      list_for_each_entry(page, &pgd_list, lru) {
++              pgd_t *pgd;
++              pmd_t *pmd;
++              pgd = (pgd_t *)page_address(page) + pgd_index(address);
++              pmd = pmd_offset_kernel(pgd, address);
++              set_pte_atomic((pte_t *)pmd, pte);
+       }
+-#endif
++      spin_unlock_irqrestore(&pgd_lock, flags);
+ }
+ /* 
+@@ -89,7 +92,7 @@ static void set_pmd_pte(pte_t *kpte, uns
+ static inline void revert_page(struct page *kpte_page, unsigned long address)
+ {
+       pte_t *linear = (pte_t *) 
+-              pmd_offset(pgd_offset(&init_mm, address), address);
++              pmd_offset_kernel(pgd_offset_k(address), address);
+       set_pmd_pte(linear,  address,
+                   pfn_pte((__pa(address) & LARGE_PAGE_MASK) >> PAGE_SHIFT,
+                           PAGE_KERNEL_LARGE));
+--- linux-2.6.0-test1/arch/i386/mm/pgtable.c   2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/mm/pgtable.c  2003-07-19 17:07:16.000000000 -0700
+@@ -12,6 +12,7 @@
+ #include <linux/highmem.h>
+ #include <linux/slab.h>
+ #include <linux/pagemap.h>
++#include <linux/spinlock.h>
+ #include <asm/system.h>
+ #include <asm/pgtable.h>
+@@ -69,7 +70,7 @@ static void set_pte_pfn(unsigned long va
+               BUG();
+               return;
+       }
+-      pmd = pmd_offset(pgd, vaddr);
++      pmd = pmd_offset_kernel(pgd, vaddr);
+       if (pmd_none(*pmd)) {
+               BUG();
+               return;
+@@ -109,7 +110,7 @@ void set_pmd_pfn(unsigned long vaddr, un
+               printk ("set_pmd_pfn: pgd_none\n");
+               return; /* BUG(); */
+       }
+-      pmd = pmd_offset(pgd, vaddr);
++      pmd = pmd_offset_kernel(pgd, vaddr);
+       set_pmd(pmd, pfn_pmd(pfn, flags));
+       /*
+        * It's enough to flush this one mapping.
+@@ -151,61 +152,89 @@ struct page *pte_alloc_one(struct mm_str
+       return pte;
+ }
+-#ifdef CONFIG_X86_PAE
++/*
++ * List of all pgd's needed for non-PAE so it can invalidate entries
++ * in both cached and uncached pgd's; not needed for PAE since the
++ * kernel pmd is shared. If PAE were not to share the pmd a similar
++ * tactic would be needed. This is essentially codepath-based locking
++ * against pageattr.c; it is the unique case in which a valid change
++ * of kernel pagetables can't be lazily synchronized by vmalloc faults.
++ * vmalloc faults work because attached pagetables are never freed.
++ * If the locking proves to be non-performant, a ticketing scheme with
++ * checks at dup_mmap(), exec(), and other mmlist addition points
++ * could be used. The locking scheme was chosen on the basis of
++ * manfred's recommendations and having no core impact whatsoever.
++ * -- wli
++ */
++spinlock_t pgd_lock = SPIN_LOCK_UNLOCKED;
++LIST_HEAD(pgd_list);
+-pgd_t *pgd_alloc(struct mm_struct *mm)
++void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
+ {
+-      int i;
+-      pgd_t *pgd = kmem_cache_alloc(pae_pgd_cachep, GFP_KERNEL);
++      unsigned long flags;
+-      if (pgd) {
+-              for (i = 0; i < USER_PTRS_PER_PGD; i++) {
+-                      unsigned long pmd = __get_free_page(GFP_KERNEL);
+-                      if (!pmd)
+-                              goto out_oom;
+-                      clear_page(pmd);
+-                      set_pgd(pgd + i, __pgd(1 + __pa(pmd)));
+-              }
+-              memcpy(pgd + USER_PTRS_PER_PGD,
++      if (PTRS_PER_PMD == 1)
++              spin_lock_irqsave(&pgd_lock, flags);
++
++      memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
+                       swapper_pg_dir + USER_PTRS_PER_PGD,
+                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+-      }
+-      return pgd;
+-out_oom:
+-      for (i--; i >= 0; i--)
+-              free_page((unsigned long)__va(pgd_val(pgd[i])-1));
+-      kmem_cache_free(pae_pgd_cachep, pgd);
+-      return NULL;
++
++      if (PTRS_PER_PMD > 1)
++              return;
++
++      list_add(&virt_to_page(pgd)->lru, &pgd_list);
++      spin_unlock_irqrestore(&pgd_lock, flags);
++      memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
+ }
+-void pgd_free(pgd_t *pgd)
++/* never called when PTRS_PER_PMD > 1 */
++void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
+ {
+-      int i;
++      unsigned long flags; /* can be called from interrupt context */
+-      for (i = 0; i < USER_PTRS_PER_PGD; i++)
+-              free_page((unsigned long)__va(pgd_val(pgd[i])-1));
+-      kmem_cache_free(pae_pgd_cachep, pgd);
++      spin_lock_irqsave(&pgd_lock, flags);
++      list_del(&virt_to_page(pgd)->lru);
++      spin_unlock_irqrestore(&pgd_lock, flags);
+ }
+-#else
+-
+ pgd_t *pgd_alloc(struct mm_struct *mm)
+ {
+-      pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
++      int i;
++      pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL);
+-      if (pgd) {
+-              memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
+-              memcpy(pgd + USER_PTRS_PER_PGD,
+-                      swapper_pg_dir + USER_PTRS_PER_PGD,
+-                      (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
++      if (PTRS_PER_PMD == 1 || !pgd)
++              return pgd;
++
++      for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
++              struct page *pmd;
++#ifdef CONFIG_HIGHPMD
++              pmd = alloc_page(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT);
++#else
++              pmd = alloc_page(GFP_KERNEL|__GFP_REPEAT);
++#endif
++              if (!pmd)
++                      goto out_oom;
++              clear_highpage(pmd);
++              set_pgd(&pgd[i], __pgd(1ULL | (u64)page_to_pfn(pmd) << PAGE_SHIFT));
+       }
+       return pgd;
++
++out_oom:
++      for (i--; i >= 0; i--)
++              __free_page(pgd_page(pgd[i]));
++      kmem_cache_free(pgd_cache, pgd);
++      return NULL;
+ }
+ void pgd_free(pgd_t *pgd)
+ {
+-      free_page((unsigned long)pgd);
+-}
+-
+-#endif /* CONFIG_X86_PAE */
++      int i;
++      /* in the PAE case user pgd entries are overwritten before usage */
++      if (PTRS_PER_PMD > 1)
++              for (i = 0; i < USER_PTRS_PER_PGD; ++i)
++                      __free_page(pgd_page(pgd[i]));
++      /* in the non-PAE case, clear_page_tables() clears user pgd entries */
++      kmem_cache_free(pgd_cache, pgd);
++}
+--- linux-2.6.0-test1/arch/i386/pci/legacy.c   2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/i386/pci/legacy.c  2003-07-19 17:03:49.000000000 -0700
+@@ -24,7 +24,7 @@ static void __devinit pcibios_fixup_peer
+               for (devfn = 0; devfn < 256; devfn += 8) {
+                       if (!raw_pci_ops->read(0, n, devfn, PCI_VENDOR_ID, 2, &l) &&
+                           l != 0x0000 && l != 0xffff) {
+-                              DBG("Found device at %02x:%02x [%04x]\n", n, dev->devfn, l);
++                              DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l);
+                               printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n);
+                               pci_scan_bus(n, &pci_root_ops, NULL);
+                               break;
+--- linux-2.6.0-test1/arch/i386/pci/visws.c    2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/i386/pci/visws.c   2003-07-19 17:03:49.000000000 -0700
+@@ -17,7 +17,7 @@
+ int broken_hp_bios_irq9;
+-extern struct pci_ops pci_direct_conf1;
++extern struct pci_raw_ops pci_direct_conf1;
+ static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; }
+@@ -101,8 +101,9 @@ static int __init pcibios_init(void)
+       printk(KERN_INFO "PCI: Lithium bridge A bus: %u, "
+               "bridge B (PIIX4) bus: %u\n", pci_bus1, pci_bus0);
+-      pci_scan_bus(pci_bus0, &pci_direct_conf1, NULL);
+-      pci_scan_bus(pci_bus1, &pci_direct_conf1, NULL);
++      raw_pci_ops = &pci_direct_conf1;
++      pci_scan_bus(pci_bus0, &pci_root_ops, NULL);
++      pci_scan_bus(pci_bus1, &pci_root_ops, NULL);
+       pci_fixup_irqs(visws_swizzle, visws_map_irq);
+       pcibios_resource_survey();
+       return 0;
+--- linux-2.6.0-test1/arch/ia64/hp/sim/simscsi.c       2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/hp/sim/simscsi.c      2003-07-19 17:03:49.000000000 -0700
+@@ -9,7 +9,7 @@
+  * 99/12/18 David Mosberger   Added support for READ10/WRITE10 needed by linux v2.3.33
+  */
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/kernel.h>
+--- linux-2.6.0-test1/arch/ia64/ia32/ia32_ioctl.c      2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/ia32/ia32_ioctl.c     2003-07-19 17:03:49.000000000 -0700
+@@ -52,7 +52,7 @@
+ #include <linux/raw.h>
+ #include <linux/smb_fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/rtc.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/arch/ia64/kernel/acpi.c  2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/acpi.c 2003-07-19 17:03:49.000000000 -0700
+@@ -720,7 +720,7 @@ acpi_register_irq (u32 gsi, u32 polarity
+ {
+       int vector = 0;
+-      if (acpi_madt->flags.pcat_compat && (gsi < 16))
++      if (has_8259 && (gsi < 16))
+               return isa_irq_to_vector(gsi);
+       if (!iosapic_register_intr)
+--- linux-2.6.0-test1/arch/ia64/kernel/entry.S 2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/kernel/entry.S        2003-07-19 17:03:49.000000000 -0700
+@@ -61,7 +61,17 @@ ENTRY(ia64_execve)
+       mov out2=in2                    // envp
+       add out3=16,sp                  // regs
+       br.call.sptk.many rp=sys_execve
+-.ret0:        cmp4.ge p6,p7=r8,r0
++.ret0:
++#ifdef CONFIG_IA32_SUPPORT
++      /*
++       * Check if we're returning to ia32 mode. If so, we need to restore ia32 registers
++       * from pt_regs.
++       */
++      adds r16=PT(CR_IPSR)+16,sp
++      ;;
++      ld8 r16=[r16]
++#endif
++      cmp4.ge p6,p7=r8,r0
+       mov ar.pfs=loc1                 // restore ar.pfs
+       sxt4 r8=r8                      // return 64-bit result
+       ;;
+@@ -89,6 +99,12 @@ ENTRY(ia64_execve)
+       ldf.fill f23=[sp];      ldf.fill f24=[sp];      mov f25=f0
+       ldf.fill f26=[sp];      ldf.fill f27=[sp];      mov f28=f0
+       ldf.fill f29=[sp];      ldf.fill f30=[sp];      mov f31=f0
++#ifdef CONFIG_IA32_SUPPORT
++      tbit.nz p6,p0=r16, IA64_PSR_IS_BIT
++      movl loc0=ia64_ret_from_ia32_execve
++      ;;
++(p6)  mov rp=loc0
++#endif
+       br.ret.sptk.many rp
+ END(ia64_execve)
+@@ -688,7 +704,7 @@ GLOBAL_ENTRY(ia64_leave_syscall)
+       mov b7=r0               // clear b7
+       ;;
+ (pUStk) st1 [r14]=r3
+-      movl r17=THIS_CPU(ia64_phys_stacked_size_p8)
++      addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0
+       ;;
+       mov r16=ar.bsp          // get existing backing store pointer
+       srlz.i                  // ensure interruption collection is off
+@@ -701,6 +717,19 @@ GLOBAL_ENTRY(ia64_leave_syscall)
+       br.cond.sptk.many rbs_switch
+ END(ia64_leave_syscall)
++#ifdef CONFIG_IA32_SUPPORT
++GLOBAL_ENTRY(ia64_ret_from_ia32_execve)
++      PT_REGS_UNWIND_INFO(0)
++      adds r2=PT(R8)+16,sp                    // r2 = &pt_regs.r8
++      adds r3=PT(R10)+16,sp                   // r3 = &pt_regs.r10
++      ;;
++      .mem.offset 0,0
++      st8.spill [r2]=r8       // store return value in slot for r8 and set unat bit
++      .mem.offset 8,0
++      st8.spill [r3]=r0       // clear error indication in slot for r10 and set unat bit
++END(ia64_ret_from_ia32_execve_syscall)
++      // fall through
++#endif /* CONFIG_IA32_SUPPORT */
+ GLOBAL_ENTRY(ia64_leave_kernel)
+       PT_REGS_UNWIND_INFO(0)
+       /*
+@@ -841,7 +870,7 @@ GLOBAL_ENTRY(ia64_leave_kernel)
+       shr.u r18=r19,16        // get byte size of existing "dirty" partition
+       ;;
+       mov r16=ar.bsp          // get existing backing store pointer
+-      movl r17=THIS_CPU(ia64_phys_stacked_size_p8)
++      addl r17=THIS_CPU(ia64_phys_stacked_size_p8),r0
+       ;;
+       ld4 r17=[r17]           // r17 = cpu_data->phys_stacked_size_p8
+ (pKStk)       br.cond.dpnt skip_rbs_switch
+--- linux-2.6.0-test1/arch/ia64/kernel/fsys.S  2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/kernel/fsys.S 2003-07-19 17:03:49.000000000 -0700
+@@ -165,7 +165,7 @@ ENTRY(fsys_gettimeofday)
+       .altrp b6
+       .body
+       add r9=TI_FLAGS+IA64_TASK_SIZE,r16
+-      movl r3=THIS_CPU(cpu_info)
++      addl r3=THIS_CPU(cpu_info),r0
+       mov.m r31=ar.itc                // put time stamp into r31 (ITC) == now         (35 cyc)
+ #ifdef CONFIG_SMP
+@@ -177,7 +177,7 @@ ENTRY(fsys_gettimeofday)
+       movl r19=xtime                  // xtime is a timespec struct
+       ld8 r10=[r10]                   // r10 <- __per_cpu_offset[0]
+-      movl r21=THIS_CPU(cpu_info)
++      addl r21=THIS_CPU(cpu_info),r0
+       ;;
+       add r10=r21, r10                // r10 <- &cpu_data(time_keeper_id)
+       tbit.nz p8,p0 = r2, IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT
+--- linux-2.6.0-test1/arch/ia64/kernel/ia64_ksyms.c    2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/kernel/ia64_ksyms.c   2003-07-19 17:03:49.000000000 -0700
+@@ -64,9 +64,10 @@ EXPORT_SYMBOL(ia64_pfn_valid);
+ #endif
+ #include <asm/processor.h>
+-EXPORT_SYMBOL(cpu_info__per_cpu);
++EXPORT_SYMBOL(per_cpu__cpu_info);
+ #ifdef CONFIG_SMP
+ EXPORT_SYMBOL(__per_cpu_offset);
++EXPORT_SYMBOL(per_cpu__local_per_cpu_offset);
+ #endif
+ EXPORT_SYMBOL(kernel_thread);
+--- linux-2.6.0-test1/arch/ia64/kernel/init_task.c     2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/init_task.c    2003-07-19 17:03:49.000000000 -0700
+@@ -2,7 +2,7 @@
+  * This is where we statically allocate and initialize the initial
+  * task.
+  *
+- * Copyright (C) 1999, 2002 Hewlett-Packard Co
++ * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co
+  *    David Mosberger-Tang <davidm@hpl.hp.com>
+  */
+@@ -34,7 +34,7 @@ static union {
+               struct thread_info thread_info;
+       } s;
+       unsigned long stack[KERNEL_STACK_SIZE/sizeof (unsigned long)];
+-} init_task_mem __attribute__((section(".data.init_task"))) = {{
++} init_task_mem asm ("init_task_mem") __attribute__((section(".data.init_task"))) = {{
+       .task =         INIT_TASK(init_task_mem.s.task),
+       .thread_info =  INIT_THREAD_INFO(init_task_mem.s.task)
+ }};
+--- linux-2.6.0-test1/arch/ia64/kernel/iosapic.c       2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/iosapic.c      2003-07-19 17:04:06.000000000 -0700
+@@ -274,7 +274,7 @@ unmask_irq (unsigned int irq)
+ static void
+-iosapic_set_affinity (unsigned int irq, unsigned long mask)
++iosapic_set_affinity (unsigned int irq, cpumask_t mask)
+ {
+ #ifdef CONFIG_SMP
+       unsigned long flags;
+@@ -287,12 +287,10 @@ iosapic_set_affinity (unsigned int irq, 
+       irq &= (~IA64_IRQ_REDIRECTED);
+       vec = irq_to_vector(irq);
+-      mask &= cpu_online_map;
+-
+-      if (!mask || vec >= IA64_NUM_VECTORS)
++      if (cpus_empty(mask) || vec >= IA64_NUM_VECTORS)
+               return;
+-      dest = cpu_physical_id(ffz(~mask));
++      dest = cpu_physical_id(first_cpu(mask));
+       rte_index = iosapic_intr_info[vec].rte_index;
+       addr = iosapic_intr_info[vec].addr;
+@@ -717,6 +715,7 @@ iosapic_parse_prt (void)
+                       register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, IOSAPIC_POL_LOW,
+                                     IOSAPIC_LEVEL);
+               }
++              entry->irq = vector;
+               snprintf(pci_id, sizeof(pci_id), "%02x:%02x:%02x[%c]",
+                        entry->id.segment, entry->id.bus, entry->id.device, 'A' + entry->pin);
+--- linux-2.6.0-test1/arch/ia64/kernel/irq.c   2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/irq.c  2003-07-19 17:04:06.000000000 -0700
+@@ -898,13 +898,14 @@ int setup_irq(unsigned int irq, struct i
+ static struct proc_dir_entry * root_irq_dir;
+ static struct proc_dir_entry * irq_dir [NR_IRQS];
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+-static unsigned int parse_hex_value (const char *buffer,
+-              unsigned long count, unsigned long *ret)
++static unsigned int parse_hex_value(const char *buffer,
++              unsigned long count, cpumask_t *ret)
+ {
+-      unsigned char hexnum [HEX_DIGITS];
+-      unsigned long value, i;
++      unsigned char hexnum[HEX_DIGITS];
++      cpumask_t value = CPU_MASK_NONE;
++      unsigned long i;
+       if (!count)
+               return -EINVAL;
+@@ -917,10 +918,9 @@ static unsigned int parse_hex_value (con
+        * Parse the first 8 characters as a hex string, any non-hex char
+        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+        */
+-      value = 0;
+-
+       for (i = 0; i < count; i++) {
+               unsigned int c = hexnum[i];
++              int k;
+               switch (c) {
+                       case '0' ... '9': c -= '0'; break;
+@@ -929,7 +929,10 @@ static unsigned int parse_hex_value (con
+               default:
+                       goto out;
+               }
+-              value = (value << 4) | c;
++              cpus_shift_left(value, value, 4);
++              for (k = 0; k < 4; ++k)
++                      if (test_bit(k, (unsigned long *)&c))
++                              cpu_set(k, value);
+       }
+ out:
+       *ret = value;
+@@ -940,12 +943,15 @@ out:
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
++
+ static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 };
+ void set_irq_affinity_info (unsigned int irq, int hwid, int redir)
+ {
+-      unsigned long mask = 1UL<<cpu_logical_id(hwid);
++      cpumask_t mask = CPU_MASK_NONE;
++
++      cpu_set(cpu_logical_id(hwid), mask);
+       if (irq < NR_IRQS) {
+               irq_affinity[irq] = mask;
+@@ -956,10 +962,21 @@ void set_irq_affinity_info (unsigned int
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
+-      if (count < HEX_DIGITS+3)
++      int k, len;
++      cpumask_t tmp = irq_affinity[(long)data];
++
++      if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%s%08lx\n", irq_redir[(unsigned long)data] ? "r " : "",
+-                      irq_affinity[(unsigned long)data]);
++
++      len = 0;
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int irq_affinity_write_proc (struct file *file, const char *buffer,
+@@ -967,7 +984,7 @@ static int irq_affinity_write_proc (stru
+ {
+       unsigned int irq = (unsigned long) data;
+       int full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t new_value, tmp;
+       const char *buf = buffer;
+       irq_desc_t *desc = irq_descp(irq);
+       int redir;
+@@ -991,7 +1008,8 @@ static int irq_affinity_write_proc (stru
+        * way to make the system unusable accidentally :-) At least
+        * one online CPU still has to be targeted.
+        */
+-      if (!(new_value & cpu_online_map))
++      cpus_and(tmp, new_value, cpu_online_map);
++      if (cpus_empty(tmp))
+               return -EINVAL;
+       desc->handler->set_affinity(irq | (redir? IA64_IRQ_REDIRECTED : 0), new_value);
+@@ -1003,18 +1021,28 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data;
++      cpumask_t *mask = (cpumask_t *)data;
++      int k, len = 0;
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", *mask);
++
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(unsigned long); ++k) {
++              int j = sprintf(page, "%04hx", (u16)cpus_coerce(*mask));
++              len += j;
++              page += j;
++              cpus_shift_right(*mask, *mask, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data;
+-      int full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t *mask = (cpumask_t *)data;
++      unsigned long full_count = count, err;
++      cpumask_t new_value;
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+@@ -1058,7 +1086,7 @@ static void register_irq_proc (unsigned 
+ #endif
+ }
+-unsigned long prof_cpu_mask = -1;
++cpumask_t prof_cpu_mask = CPU_MASK_ALL;
+ void init_irq_proc (void)
+ {
+--- linux-2.6.0-test1/arch/ia64/kernel/module.c        2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/kernel/module.c       2003-07-19 17:03:49.000000000 -0700
+@@ -164,7 +164,7 @@ static int
+ apply_imm64 (struct module *mod, struct insn *insn, uint64_t val)
+ {
+       if (slot(insn) != 2) {
+-              printk(KERN_ERR "%s: illegal slot number %d for IMM64\n",
++              printk(KERN_ERR "%s: invalid slot number %d for IMM64\n",
+                      mod->name, slot(insn));
+               return 0;
+       }
+@@ -176,7 +176,7 @@ static int
+ apply_imm60 (struct module *mod, struct insn *insn, uint64_t val)
+ {
+       if (slot(insn) != 2) {
+-              printk(KERN_ERR "%s: illegal slot number %d for IMM60\n",
++              printk(KERN_ERR "%s: invalid slot number %d for IMM60\n",
+                      mod->name, slot(insn));
+               return 0;
+       }
+--- linux-2.6.0-test1/arch/ia64/kernel/perfmon.c       2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/perfmon.c      2003-07-19 17:04:06.000000000 -0700
+@@ -221,14 +221,6 @@
+ #define PFM_REG_RETFLAG_SET(flags, val)       do { flags &= ~PFM_REG_RETFL_MASK; flags |= (val); } while(0)
+-#ifdef CONFIG_SMP
+-#define PFM_CPU_ONLINE_MAP    cpu_online_map
+-#define cpu_is_online(i)      (PFM_CPU_ONLINE_MAP & (1UL << i))
+-#else
+-#define PFM_CPU_ONLINE_MAP     1UL
+-#define cpu_is_online(i)      (i==0)
+-#endif
+-
+ /*
+  * cmp0 must be the value of pmc0
+  */
+@@ -566,7 +558,7 @@ static struct vm_operations_struct pfm_v
+ #define pfm_wait_task_inactive(t)     wait_task_inactive(t)
+-#define pfm_get_cpu_var(v)            __get_cpu_var(v)
++#define pfm_get_cpu_var(v)            __ia64_per_cpu_var(v)
+ #define pfm_get_cpu_data(a,b)         per_cpu(a, b)
+ typedef       irqreturn_t     pfm_irq_handler_t;
+ #define PFM_IRQ_HANDLER_RET(v)        do {  \
+@@ -5354,7 +5346,7 @@ pfm_proc_info(char *page)
+               p += sprintf(p, "ovfl_mask                 : 0x%lx\n", pmu_conf.ovfl_val);
+       for(i=0; i < NR_CPUS; i++) {
+-              if (cpu_is_online(i) == 0) continue;
++              if (cpu_online(i) == 0) continue;
+               p += sprintf(p, "CPU%-2d overflow intrs      : %lu\n", i, pfm_stats[i].pfm_ovfl_intr_count);
+               p += sprintf(p, "CPU%-2d overflow cycles     : %lu\n", i, pfm_stats[i].pfm_ovfl_intr_cycles);
+               p += sprintf(p, "CPU%-2d overflow min        : %lu\n", i, pfm_stats[i].pfm_ovfl_intr_cycles_min);
+@@ -5372,7 +5364,7 @@ pfm_proc_info(char *page)
+               p += sprintf(p, "CPU%-2d activations         : %lu\n", i, pfm_get_cpu_data(pmu_activation_number,i));
+       }
+-      if (hweight64(PFM_CPU_ONLINE_MAP) == 1)
++      if (num_online_cpus() == 1)
+       {
+               psr = pfm_get_psr();
+               ia64_srlz_d();
+--- linux-2.6.0-test1/arch/ia64/kernel/ptrace.c        2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/kernel/ptrace.c       2003-07-19 17:03:49.000000000 -0700
+@@ -42,7 +42,7 @@
+       (IA64_PSR_UM | IA64_PSR_DB | IA64_PSR_IS | IA64_PSR_ID | IA64_PSR_DD | IA64_PSR_RI)
+ #define IPSR_READ_MASK        IPSR_WRITE_MASK
+-#define PTRACE_DEBUG  1
++#define PTRACE_DEBUG  0
+ #if PTRACE_DEBUG
+ # define dprintk(format...)   printk(format)
+--- linux-2.6.0-test1/arch/ia64/kernel/setup.c 2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/kernel/setup.c        2003-07-19 17:04:07.000000000 -0700
+@@ -56,6 +56,7 @@ unsigned long __per_cpu_offset[NR_CPUS];
+ #endif
+ DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);
++DEFINE_PER_CPU(unsigned long, local_per_cpu_offset);
+ DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8);
+ unsigned long ia64_cycles_per_usec;
+ struct ia64_boot_param *ia64_boot_param;
+@@ -558,7 +559,7 @@ static void *
+ c_start (struct seq_file *m, loff_t *pos)
+ {
+ #ifdef CONFIG_SMP
+-      while (*pos < NR_CPUS && !(cpu_online_map & (1UL << *pos)))
++      while (*pos < NR_CPUS && !cpu_isset(*pos, cpu_online_map))
+               ++*pos;
+ #endif
+       return *pos < NR_CPUS ? cpu_data(*pos) : NULL;
+@@ -709,6 +710,8 @@ cpu_init (void)
+                       memcpy(cpu_data, __phys_per_cpu_start, __per_cpu_end - __per_cpu_start);
+                       __per_cpu_offset[cpu] = (char *) cpu_data - __per_cpu_start;
+                       cpu_data += PERCPU_PAGE_SIZE;
++
++                      per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu];
+               }
+       }
+       cpu_data = __per_cpu_start + __per_cpu_offset[smp_processor_id()];
+@@ -716,19 +719,18 @@ cpu_init (void)
+       cpu_data = __phys_per_cpu_start;
+ #endif /* !CONFIG_SMP */
+-      cpu_info = cpu_data + ((char *) &__get_cpu_var(cpu_info) - __per_cpu_start);
+-#ifdef CONFIG_NUMA
+-      cpu_info->node_data = get_node_data_ptr();
+-#endif
+-
+       get_max_cacheline_size();
+       /*
+        * We can't pass "local_cpu_data" to identify_cpu() because we haven't called
+        * ia64_mmu_init() yet.  And we can't call ia64_mmu_init() first because it
+        * depends on the data returned by identify_cpu().  We break the dependency by
+-       * accessing cpu_data() the old way, through identity mapped space.
++       * accessing cpu_data() through the canonical per-CPU address.
+        */
++      cpu_info = cpu_data + ((char *) &__ia64_per_cpu_var(cpu_info) - __per_cpu_start);
++#ifdef CONFIG_NUMA
++      cpu_info->node_data = get_node_data_ptr();
++#endif
+       identify_cpu(cpu_info);
+ #ifdef CONFIG_MCKINLEY
+--- linux-2.6.0-test1/arch/ia64/kernel/smpboot.c       2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/kernel/smpboot.c      2003-07-19 17:04:07.000000000 -0700
+@@ -79,13 +79,13 @@ int cpucount;
+ task_t *task_for_booting_cpu;
+ /* Bitmask of currently online CPUs */
+-volatile unsigned long cpu_online_map;
+-unsigned long phys_cpu_present_map;
++cpumask_t cpu_online_map;
++cpumask_t phys_cpu_present_map;
+ /* which logical CPU number maps to which CPU (physical APIC ID) */
+ volatile int ia64_cpu_to_sapicid[NR_CPUS];
+-static volatile unsigned long cpu_callin_map;
++static volatile cpumask_t cpu_callin_map;
+ struct smp_boot_data smp_boot_data __initdata;
+@@ -282,7 +282,7 @@ smp_callin (void)
+       cpuid = smp_processor_id();
+       phys_id = hard_smp_processor_id();
+-      if (test_and_set_bit(cpuid, &cpu_online_map)) {
++      if (cpu_test_and_set(cpuid, cpu_online_map)) {
+               printk(KERN_ERR "huh, phys CPU#0x%x, CPU#0x%x already present??\n",
+                      phys_id, cpuid);
+               BUG();
+@@ -327,7 +327,7 @@ smp_callin (void)
+       /*
+        * Allow the master to continue.
+        */
+-      set_bit(cpuid, &cpu_callin_map);
++      cpu_set(cpuid, cpu_callin_map);
+       Dprintk("Stack on CPU %d at about %p\n",cpuid, &cpuid);
+ }
+@@ -391,19 +391,19 @@ do_boot_cpu (int sapicid, int cpu)
+        */
+       Dprintk("Waiting on callin_map ...");
+       for (timeout = 0; timeout < 100000; timeout++) {
+-              if (test_bit(cpu, &cpu_callin_map))
++              if (cpu_isset(cpu, cpu_callin_map))
+                       break;  /* It has booted */
+               udelay(100);
+       }
+       Dprintk("\n");
+-      if (test_bit(cpu, &cpu_callin_map)) {
++      if (cpu_isset(cpu, cpu_callin_map)) {
+               /* number CPUs logically, starting from 1 (BSP is 0) */
+               printk(KERN_INFO "CPU%d: CPU has booted.\n", cpu);
+       } else {
+               printk(KERN_ERR "Processor 0x%x/0x%x is stuck.\n", cpu, sapicid);
+               ia64_cpu_to_sapicid[cpu] = -1;
+-              clear_bit(cpu, &cpu_online_map);  /* was set in smp_callin() */
++              cpu_clear(cpu, cpu_online_map);  /* was set in smp_callin() */
+               return -EINVAL;
+       }
+       return 0;
+@@ -446,13 +446,14 @@ smp_build_cpu_map (void)
+               ia64_cpu_to_sapicid[cpu] = -1;
+       ia64_cpu_to_sapicid[0] = boot_cpu_id;
+-      phys_cpu_present_map = 1;
++      cpus_clear(phys_cpu_present_map);
++      cpu_set(0, phys_cpu_present_map);
+       for (cpu = 1, i = 0; i < smp_boot_data.cpu_count; i++) {
+               sapicid = smp_boot_data.cpu_phys_id[i];
+               if (sapicid == boot_cpu_id)
+                       continue;
+-              phys_cpu_present_map |= (1UL << cpu);
++              cpu_set(cpu, phys_cpu_present_map);
+               ia64_cpu_to_sapicid[cpu] = sapicid;
+               cpu++;
+       }
+@@ -463,7 +464,7 @@ smp_build_cpu_map (void)
+ /* on which node is each logical CPU (one cacheline even for 64 CPUs) */
+ volatile char cpu_to_node_map[NR_CPUS] __cacheline_aligned;
+ /* which logical CPUs are on which nodes */
+-volatile unsigned long node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
++volatile cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
+ /*
+  * Build cpu to node mapping and initialize the per node cpu masks.
+@@ -474,7 +475,7 @@ build_cpu_to_node_map (void)
+       int cpu, i, node;
+       for(node=0; node<MAX_NUMNODES; node++)
+-              node_to_cpu_mask[node] = 0;
++              cpus_clear(node_to_cpu_mask[node]);
+       for(cpu = 0; cpu < NR_CPUS; ++cpu) {
+               /*
+                * All Itanium NUMA platforms I know use ACPI, so maybe we
+@@ -492,7 +493,7 @@ build_cpu_to_node_map (void)
+ #endif
+               cpu_to_node_map[cpu] = node;
+               if (node >= 0)
+-                      node_to_cpu_mask[node] |= (1UL << cpu);
++                      cpu_set(cpu, node_to_cpu_mask[node]);
+       }
+ }
+@@ -515,8 +516,8 @@ smp_prepare_cpus (unsigned int max_cpus)
+       /*
+        * We have the boot CPU online for sure.
+        */
+-      set_bit(0, &cpu_online_map);
+-      set_bit(0, &cpu_callin_map);
++      cpu_set(0, cpu_online_map);
++      cpu_set(0, cpu_callin_map);
+       local_cpu_data->loops_per_jiffy = loops_per_jiffy;
+       ia64_cpu_to_sapicid[0] = boot_cpu_id;
+@@ -531,15 +532,18 @@ smp_prepare_cpus (unsigned int max_cpus)
+        */
+       if (!max_cpus) {
+               printk(KERN_INFO "SMP mode deactivated.\n");
+-              cpu_online_map = phys_cpu_present_map = 1;
++              cpus_clear(cpu_online_map);
++              cpus_clear(phys_cpu_present_map);
++              cpu_set(1, cpu_online_map);
++              cpu_set(1, phys_cpu_present_map);
+               return;
+       }
+ }
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
+-      set_bit(smp_processor_id(), &cpu_callin_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_callin_map);
+ }
+ void
+--- linux-2.6.0-test1/arch/ia64/kernel/smp.c   2003-06-14 12:18:50.000000000 -0700
++++ 25/arch/ia64/kernel/smp.c  2003-07-19 17:04:07.000000000 -0700
+@@ -72,7 +72,7 @@ static volatile struct call_data_struct 
+ #define IPI_CPU_STOP          1
+ /* This needs to be cacheline aligned because it is written to by *other* CPUs.  */
+-static DEFINE_PER_CPU(__u64, ipi_operation) ____cacheline_aligned;
++static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned;
+ static void
+ stop_this_cpu (void)
+@@ -81,7 +81,7 @@ stop_this_cpu (void)
+       /*
+        * Remove this CPU:
+        */
+-      clear_bit(smp_processor_id(), &cpu_online_map);
++      cpu_clear(smp_processor_id(), cpu_online_map);
+       max_xtp();
+       local_irq_disable();
+       cpu_halt();
+@@ -91,7 +91,7 @@ irqreturn_t
+ handle_IPI (int irq, void *dev_id, struct pt_regs *regs)
+ {
+       int this_cpu = get_cpu();
+-      unsigned long *pending_ipis = &__get_cpu_var(ipi_operation);
++      unsigned long *pending_ipis = &__ia64_per_cpu_var(ipi_operation);
+       unsigned long ops;
+       /* Count this now; we may make a call that never returns. */
+--- linux-2.6.0-test1/arch/ia64/kernel/time.c  2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/ia64/kernel/time.c 2003-07-19 17:04:07.000000000 -0700
+@@ -40,13 +40,13 @@ unsigned long last_cli_ip;
+ static void
+ do_profile (unsigned long ip)
+ {
+-      extern unsigned long prof_cpu_mask;
++      extern cpumask_t prof_cpu_mask;
+       extern char _stext;
+       if (!prof_buffer)
+               return;
+-      if (!((1UL << smp_processor_id()) & prof_cpu_mask))
++      if (!cpu_isset(smp_processor_id(), prof_cpu_mask))
+               return;
+       ip -= (unsigned long) &_stext;
+@@ -83,12 +83,11 @@ unsigned long
+ itc_get_offset (void)
+ {
+       unsigned long elapsed_cycles, lost = jiffies - wall_jiffies;
+-      unsigned long now, last_tick;
++      unsigned long now = ia64_get_itc(), last_tick;
+       last_tick = (cpu_data(TIME_KEEPER_ID)->itm_next
+                    - (lost + 1)*cpu_data(TIME_KEEPER_ID)->itm_delta);
+-      now = ia64_get_itc();
+       if (unlikely((long) (now - last_tick) < 0)) {
+               printk(KERN_ERR "CPU %d: now < last_tick (now=0x%lx,last_tick=0x%lx)!\n",
+                      smp_processor_id(), now, last_tick);
+--- linux-2.6.0-test1/arch/ia64/Makefile       2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/Makefile      2003-07-19 17:03:49.000000000 -0700
+@@ -66,8 +66,7 @@ core-$(CONFIG_IA64_SGI_SN2)  += arch/ia64
+ drivers-$(CONFIG_PCI)         += arch/ia64/pci/
+ drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/
+ drivers-$(CONFIG_IA64_HP_ZX1) += arch/ia64/hp/common/ arch/ia64/hp/zx1/
+-drivers-$(CONFIG_IA64_GENERIC)        += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ \
+-                                 arch/ia64/sn/
++drivers-$(CONFIG_IA64_GENERIC)        += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/
+ boot := arch/ia64/boot
+--- linux-2.6.0-test1/arch/ia64/mm/hugetlbpage.c       2003-06-22 12:04:43.000000000 -0700
++++ 25/arch/ia64/mm/hugetlbpage.c      2003-07-19 17:07:16.000000000 -0700
+@@ -60,9 +60,9 @@ huge_pte_alloc (struct mm_struct *mm, un
+       pte_t *pte = NULL;
+       pgd = pgd_offset(mm, taddr);
+-      pmd = pmd_alloc(mm, pgd, taddr);
++      pmd = pmd_alloc_map(mm, pgd, taddr);
+       if (pmd)
+-              pte = pte_alloc_map(mm, pmd, taddr);
++              pte = pte_alloc_map(mm, pgd, &pmd, taddr);
+       return pte;
+ }
+--- linux-2.6.0-test1/arch/ia64/mm/init.c      2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/mm/init.c     2003-07-19 17:07:16.000000000 -0700
+@@ -286,10 +286,10 @@ put_kernel_page (struct page *page, unsi
+       spin_lock(&init_mm.page_table_lock);
+       {
+-              pmd = pmd_alloc(&init_mm, pgd, address);
++              pmd = pmd_alloc_kernel(&init_mm, pgd, address);
+               if (!pmd)
+                       goto out;
+-              pte = pte_alloc_map(&init_mm, pmd, address);
++              pte = pte_alloc_map(&init_mm, pgd, &pmd, address);
+               if (!pte)
+                       goto out;
+               if (!pte_none(*pte)) {
+--- linux-2.6.0-test1/arch/ia64/pci/pci.c      2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ia64/pci/pci.c     2003-07-19 17:03:49.000000000 -0700
+@@ -124,7 +124,7 @@ subsys_initcall(pci_acpi_init);
+ /* Called by ACPI when it finds a new root bus.  */
+-static struct pci_controller *
++static struct pci_controller * __devinit
+ alloc_pci_controller (int seg)
+ {
+       struct pci_controller *controller;
+@@ -138,7 +138,7 @@ alloc_pci_controller (int seg)
+       return controller;
+ }
+-static int
++static int __devinit
+ alloc_resource (char *name, struct resource *root, unsigned long start, unsigned long end, unsigned long flags)
+ {
+       struct resource *res;
+@@ -159,7 +159,7 @@ alloc_resource (char *name, struct resou
+       return 0;
+ }
+-static u64
++static u64 __devinit
+ add_io_space (struct acpi_resource_address64 *addr)
+ {
+       u64 offset;
+@@ -190,7 +190,7 @@ add_io_space (struct acpi_resource_addre
+       return IO_SPACE_BASE(i);
+ }
+-static acpi_status
++static acpi_status __devinit
+ count_window (struct acpi_resource *resource, void *data)
+ {
+       unsigned int *windows = (unsigned int *) data;
+@@ -211,7 +211,7 @@ struct pci_root_info {
+       char *name;
+ };
+-static acpi_status
++static acpi_status __devinit
+ add_window (struct acpi_resource *res, void *data)
+ {
+       struct pci_root_info *info = (struct pci_root_info *) data;
+@@ -252,7 +252,7 @@ add_window (struct acpi_resource *res, v
+       return AE_OK;
+ }
+-struct pci_bus *
++struct pci_bus * __devinit
+ pci_acpi_scan_root (struct acpi_device *device, int domain, int bus)
+ {
+       struct pci_root_info info;
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/ia64/scripts/check-model.c 2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1 @@
++int __attribute__ ((__model__ (__small__))) x;
+--- linux-2.6.0-test1/arch/ia64/scripts/toolchain-flags        2003-07-02 14:53:12.000000000 -0700
++++ 25/arch/ia64/scripts/toolchain-flags       2003-07-19 17:03:49.000000000 -0700
+@@ -2,6 +2,7 @@
+ #
+ # Check whether linker can handle cross-segment @segrel():
+ #
++CPPFLAGS=""
+ CC=$1
+ OBJDUMP=$2
+ dir=$(dirname $0)
+@@ -11,10 +12,17 @@ $CC -nostdlib -static -Wl,-T$dir/check-s
+ res=$($OBJDUMP --full --section .rodata $out | fgrep 000 | cut -f3 -d' ')
+ rm -f $out
+ if [ $res != 00000a00 ]; then
+-    echo " -DHAVE_BUGGY_SEGREL"
++    CPPFLAGS="$CPPFLAGS -DHAVE_BUGGY_SEGREL"
+     cat >&2 <<EOF
+ warning: your linker cannot handle cross-segment segment-relative relocations.
+          please upgrade to a newer version (it is safe to use this linker, but
+          the kernel will be bigger than strictly necessary).
+ EOF
+ fi
++
++if ! $CC -c $dir/check-model.c -o $out | grep -q 'attribute directive ignored'
++then
++    CPPFLAGS="$CPPFLAGS -DHAVE_MODEL_SMALL_ATTRIBUTE"
++fi
++rm -f $out
++echo $CPPFLAGS
+--- linux-2.6.0-test1/arch/m68k/apollo/dn_ints.c       2003-06-14 12:18:24.000000000 -0700
++++ 25/arch/m68k/apollo/dn_ints.c      2003-07-19 17:03:49.000000000 -0700
+@@ -46,7 +46,7 @@ void dn_init_IRQ(void) {
+ int dn_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id) {
+   if((irq<0) || (irq>15)) {
+-    printk("Trying to request illegal IRQ\n");
++    printk("Trying to request invalid IRQ\n");
+     return -ENXIO;
+   }
+@@ -72,7 +72,7 @@ int dn_request_irq(unsigned int irq, irq
+ void dn_free_irq(unsigned int irq, void *dev_id) {
+   if((irq<0) || (irq>15)) {
+-    printk("Trying to free illegal IRQ\n");
++    printk("Trying to free invalid IRQ\n");
+     return ;
+   }
+--- linux-2.6.0-test1/arch/m68k/atari/stram.c  2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/m68k/atari/stram.c 2003-07-19 17:03:49.000000000 -0700
+@@ -37,7 +37,6 @@
+ #define MAJOR_NR    Z2RAM_MAJOR
+ #define do_z2_request do_stram_request
+ #define DEVICE_NR(device) (minor(device))
+-#include <linux/blk.h>
+ #endif
+ #undef DEBUG
+--- linux-2.6.0-test1/arch/m68k/kernel/head.S  2003-06-14 12:18:51.000000000 -0700
++++ 25/arch/m68k/kernel/head.S 2003-07-19 17:07:16.000000000 -0700
+@@ -110,7 +110,7 @@
+  * 
+  *    These routines are used by other mmu routines to get a pointer into
+  * a table, if necessary a new table is allocated. These routines are working
+- * basically like pmd_alloc() and pte_alloc() in <asm/pgtable.h>. The root
++ * basically like pmd_alloc_map() and pte_alloc_map() in <asm/pgtable.h>. The root
+  * table needs of course only to be allocated once in mmu_get_root_table_entry,
+  * so that here also some mmu specific initialization is done. The second page
+  * at the start of the kernel (the first page is unmapped later) is used for
+--- linux-2.6.0-test1/arch/m68k/mm/init.c      2003-06-14 12:18:32.000000000 -0700
++++ 25/arch/m68k/mm/init.c     2003-07-19 17:03:49.000000000 -0700
+@@ -17,9 +17,6 @@
+ #include <linux/types.h>
+ #include <linux/init.h>
+ #include <linux/bootmem.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <asm/setup.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/arch/m68k/mm/kmap.c      2003-06-14 12:18:35.000000000 -0700
++++ 25/arch/m68k/mm/kmap.c     2003-07-19 17:07:16.000000000 -0700
+@@ -189,7 +189,7 @@ void *__ioremap(unsigned long physaddr, 
+                       printk ("\npa=%#lx va=%#lx ", physaddr, virtaddr);
+ #endif
+               pgd_dir = pgd_offset_k(virtaddr);
+-              pmd_dir = pmd_alloc(&init_mm, pgd_dir, virtaddr);
++              pmd_dir = pmd_alloc_kernel(&init_mm, pgd_dir, virtaddr);
+               if (!pmd_dir) {
+                       printk("ioremap: no mem for pmd_dir\n");
+                       return NULL;
+--- linux-2.6.0-test1/arch/m68k/mm/motorola.c  2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/m68k/mm/motorola.c 2003-07-19 17:03:49.000000000 -0700
+@@ -18,9 +18,6 @@
+ #include <linux/types.h>
+ #include <linux/init.h>
+ #include <linux/bootmem.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <asm/setup.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/arch/m68k/mm/sun3mmu.c   2003-06-14 12:18:05.000000000 -0700
++++ 25/arch/m68k/mm/sun3mmu.c  2003-07-19 17:03:49.000000000 -0700
+@@ -16,9 +16,6 @@
+ #include <linux/string.h>
+ #include <linux/types.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <linux/bootmem.h>
+ #include <asm/setup.h>
+--- linux-2.6.0-test1/arch/m68knommu/kernel/setup.c    2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/m68knommu/kernel/setup.c   2003-07-19 17:03:49.000000000 -0700
+@@ -37,7 +37,6 @@
+ #include <asm/machdep.h>
+ #ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+ #include <asm/pgtable.h>
+ #endif
+--- linux-2.6.0-test1/arch/m68knommu/mm/init.c 2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/m68knommu/mm/init.c        2003-07-19 17:03:49.000000000 -0700
+@@ -27,9 +27,6 @@
+ #include <linux/mm.h>
+ #include <linux/swap.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <linux/highmem.h>
+ #include <linux/pagemap.h>
+ #include <linux/bootmem.h>
+--- linux-2.6.0-test1/arch/m68k/q40/q40ints.c  2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/m68k/q40/q40ints.c 2003-07-19 17:03:49.000000000 -0700
+@@ -171,7 +171,7 @@ void q40_free_irq(unsigned int irq, void
+         {
+         case 1: case 2: case 8: case 9:
+         case 12: case 13:
+-          printk("%s: ISA IRQ %d from %x illegal\n", __FUNCTION__, irq, (unsigned)dev_id);
++          printk("%s: ISA IRQ %d from %x invalid\n", __FUNCTION__, irq, (unsigned)dev_id);
+           return;
+         case 11: irq=10;
+         default:
+--- linux-2.6.0-test1/arch/m68k/sun3x/dvma.c   2003-06-14 12:17:59.000000000 -0700
++++ 25/arch/m68k/sun3x/dvma.c  2003-07-19 17:07:16.000000000 -0700
+@@ -102,7 +102,7 @@ inline int dvma_map_cpu(unsigned long ka
+               pmd_t *pmd;
+               unsigned long end2;
+-              if((pmd = pmd_alloc(&init_mm, pgd, vaddr)) == NULL) {
++              if((pmd = pmd_alloc_kernel(&init_mm, pgd, vaddr)) == NULL) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
+--- linux-2.6.0-test1/arch/mips64/kernel/irq.c 2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips64/kernel/irq.c        2003-07-19 17:04:07.000000000 -0700
+@@ -818,13 +818,13 @@ EXPORT_SYMBOL(probe_irq_mask);
+ static struct proc_dir_entry * root_irq_dir;
+ static struct proc_dir_entry * irq_dir [NR_IRQS];
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ static unsigned int parse_hex_value (const char *buffer,
+-              unsigned long count, unsigned long *ret)
++              unsigned long count, cpumask_t *ret)
+ {
+       unsigned char hexnum [HEX_DIGITS];
+-      unsigned long value;
++      cpumask_t value = CPU_MASK_NONE;
+       int i;
+       if (!count)
+@@ -838,10 +838,9 @@ static unsigned int parse_hex_value (con
+        * Parse the first 8 characters as a hex string, any non-hex char
+        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+        */
+-      value = 0;
+       for (i = 0; i < count; i++) {
+-              unsigned int c = hexnum[i];
++              unsigned int k, c = hexnum[i];
+               switch (c) {
+                       case '0' ... '9': c -= '0'; break;
+@@ -850,7 +849,10 @@ static unsigned int parse_hex_value (con
+               default:
+                       goto out;
+               }
+-              value = (value << 4) | c;
++              cpus_shift_left(value, value, 4);
++              for (k = 0; k < 4; ++k)
++                      if (c & (1 << k))
++                              cpu_set(k, value);
+       }
+ out:
+       *ret = value;
+@@ -861,20 +863,31 @@ out:
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
++      int k, len = 0;
++      cpumask_t tmp = irq_affinity[(long)data];
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
++
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int irq_affinity_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+       int irq = (long) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t new_value, tmp;
+       if (!irq_desc[irq].handler->set_affinity)
+               return -EIO;
+@@ -886,7 +899,8 @@ static int irq_affinity_write_proc (stru
+        * way to make the system unusable accidentally :-) At least
+        * one online CPU still has to be targeted.
+        */
+-      if (!(new_value & cpu_online_map))
++      cpus_and(tmp, new_value, cpu_online_map);
++      if (cpus_empty(tmp))
+               return -EINVAL;
+       irq_affinity[irq] = new_value;
+@@ -900,17 +914,28 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data;
++      int k, len = 0;
++      cpumask_t *mask = (cpumask_t *)data, tmp;
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", *mask);
++
++      tmp = *mask;
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-      unsigned long new_value;
++      unsigned long full_count = count, err;
++      cpumask_t new_value, *mask = (cpumask_t *)data;
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+--- linux-2.6.0-test1/arch/mips64/kernel/proc.c        2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips64/kernel/proc.c       2003-07-19 17:04:07.000000000 -0700
+@@ -81,7 +81,7 @@ static int show_cpuinfo(struct seq_file 
+       char fmt [64];
+ #ifdef CONFIG_SMP
+-      if (!CPUMASK_TSTB(cpu_online_map, n))
++      if (!cpu_isset(n, cpu_online_map))
+               return 0;
+ #endif
+--- linux-2.6.0-test1/arch/mips64/kernel/setup.c       2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips64/kernel/setup.c      2003-07-19 17:03:49.000000000 -0700
+@@ -28,9 +28,6 @@
+ #include <linux/a.out.h>
+ #include <linux/tty.h>
+ #include <linux/bootmem.h>
+-#ifdef CONFIG_BLK_DEV_RAM
+-#include <linux/blk.h>
+-#endif
+ #include <linux/major.h>
+ #include <linux/kdev_t.h>
+ #include <linux/root_dev.h>
+--- linux-2.6.0-test1/arch/mips64/kernel/smp.c 2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips64/kernel/smp.c        2003-07-19 17:04:07.000000000 -0700
+@@ -146,7 +146,7 @@ asmlinkage void start_secondary(void)
+       cpu_data[cpu].udelay_val = loops_per_jiffy;
+       prom_smp_finish();
+       printk("Slave cpu booted successfully\n");
+-      CPUMASK_SETB(cpu_online_map, cpu);
++      cpu_set(cpu, cpu_online_map);
+       atomic_inc(&cpus_booted);
+       cpu_idle();
+ }
+@@ -250,7 +250,7 @@ static void stop_this_cpu(void *dummy)
+       /*
+        * Remove this CPU:
+        */
+-      clear_bit(smp_processor_id(), &cpu_online_map);
++      cpu_clear(smp_processor_id(), cpu_online_map);
+       local_irq_enable();     /* May need to service _machine_restart IPI */
+       for (;;);               /* Wait if available. */
+ }
+--- linux-2.6.0-test1/arch/mips/kernel/irq.c   2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/kernel/irq.c  2003-07-19 17:04:07.000000000 -0700
+@@ -861,20 +861,30 @@ out:
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
++      int len, k;
++      cpumask_t tmp = irq_affinity[(long)data];
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int irq_affinity_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+       int irq = (long) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t new_value, tmp;
+       if (!irq_desc[irq].handler->set_affinity)
+               return -EIO;
+@@ -886,7 +896,8 @@ static int irq_affinity_write_proc (stru
+        * way to make the system unusable accidentally :-) At least
+        * one online CPU still has to be targeted.
+        */
+-      if (!(new_value & cpu_online_map))
++      cpus_and(tmp, tmp, cpu_online_map);
++      if (cpus_empty(tmp))
+               return -EINVAL;
+       irq_affinity[irq] = new_value;
+@@ -900,17 +911,28 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data;
++      int len, k;
++      cpumask_t *mask = (cpumask_t *)data, tmp;
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", *mask);
++      tmp = *mask;
++
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t *mask = (cpumask_t *)data, new_value;
++      unsigned long full_count = count, err;
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+--- linux-2.6.0-test1/arch/mips/kernel/proc.c  2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/kernel/proc.c 2003-07-19 17:04:07.000000000 -0700
+@@ -81,7 +81,7 @@ static int show_cpuinfo(struct seq_file 
+       char fmt [64];
+ #ifdef CONFIG_SMP
+-      if (!CPUMASK_TSTB(cpu_online_map, n))
++      if (!cpu_isset(n, cpu_online_map))
+               return 0;
+ #endif
+--- linux-2.6.0-test1/arch/mips/kernel/smp.c   2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/kernel/smp.c  2003-07-19 17:04:07.000000000 -0700
+@@ -146,7 +146,7 @@ asmlinkage void start_secondary(void)
+       cpu_data[cpu].udelay_val = loops_per_jiffy;
+       prom_smp_finish();
+       printk("Slave cpu booted successfully\n");
+-      CPUMASK_SETB(cpu_online_map, cpu);
++      cpu_set(cpu, cpu_online_map);
+       atomic_inc(&cpus_booted);
+       cpu_idle();
+ }
+@@ -250,7 +250,7 @@ static void stop_this_cpu(void *dummy)
+       /*
+        * Remove this CPU:
+        */
+-      clear_bit(smp_processor_id(), &cpu_online_map);
++      cpu_clear(smp_processor_id(), cpu_online_map);
+       local_irq_enable();     /* May need to service _machine_restart IPI */
+       for (;;);               /* Wait if available. */
+ }
+--- linux-2.6.0-test1/arch/mips/mm/fault.c     2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/mm/fault.c    2003-07-19 17:03:49.000000000 -0700
+@@ -162,7 +162,7 @@ bad_area:
+               tsk->thread.cp0_badvaddr = address;
+               tsk->thread.error_code = write;
+ #if 0
+-              printk("do_page_fault() #2: sending SIGSEGV to %s for illegal %s\n"
++              printk("do_page_fault() #2: sending SIGSEGV to %s for invalid %s\n"
+                      "%08lx (epc == %08lx, ra == %08lx)\n",
+                      tsk->comm,
+                      write ? "write access to" : "read access from",
+--- linux-2.6.0-test1/arch/mips/mm/init.c      2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/mm/init.c     2003-07-19 17:03:49.000000000 -0700
+@@ -24,7 +24,7 @@
+ #include <linux/bootmem.h>
+ #include <linux/highmem.h>
+ #include <linux/swap.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/bootinfo.h>
+ #include <asm/cacheflush.h>
+--- linux-2.6.0-test1/arch/mips/mm/ioremap.c   2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/mm/ioremap.c  2003-07-19 17:07:16.000000000 -0700
+@@ -81,7 +81,7 @@ static int remap_area_pages(unsigned lon
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(&init_mm, dir, address);
++              pmd = pmd_alloc_kernel(&init_mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+--- linux-2.6.0-test1/arch/mips/momentum/ocelot_c/setup.c      2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/momentum/ocelot_c/setup.c     2003-07-19 17:03:49.000000000 -0700
+@@ -63,7 +63,7 @@
+ #include <asm/mc146818rtc.h>
+ #include <linux/version.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/mv64340.h>
+ #include "ocelot_c_fpga.h"
+--- linux-2.6.0-test1/arch/mips/momentum/ocelot_g/setup.c      2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/momentum/ocelot_g/setup.c     2003-07-19 17:03:49.000000000 -0700
+@@ -64,7 +64,7 @@
+ #include <asm/mc146818rtc.h>
+ #include <linux/version.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "gt64240.h"
+ #include "ocelot_pld.h"
+--- linux-2.6.0-test1/arch/mips/ramdisk/Makefile       2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/ramdisk/Makefile      2003-07-19 17:03:49.000000000 -0700
+@@ -2,7 +2,7 @@
+ # Makefile for a ramdisk image
+ #
+-O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32)
++O_FORMAT = $(shell $(OBJDUMP) -i | head -n 2 | grep elf32)
+ img = $(CONFIG_EMBEDDED_RAMDISK_IMAGE)
+ ramdisk.o: $(subst ",,$(img)) ld.script
+       echo "O_FORMAT:  " $(O_FORMAT)
+--- linux-2.6.0-test1/arch/mips/sgi-ip27/ip27-init.c   2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sgi-ip27/ip27-init.c  2003-07-19 17:04:07.000000000 -0700
+@@ -481,7 +481,7 @@ static int __init do_boot_cpu(int cpu, i
+        */
+       __cpu_number_map[cpu] = num_cpus;
+       __cpu_logical_map[num_cpus] = cpu;
+-      CPUMASK_SETB(cpu_online_map, cpu);
++      cpu_set(cpu, cpu_online_map);
+       /*
+        * Wait this cpu to start up and initialize its hub,
+--- linux-2.6.0-test1/arch/mips/sibyte/cfe/setup.c     2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/cfe/setup.c    2003-07-19 17:03:49.000000000 -0700
+@@ -20,7 +20,7 @@
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/bootmem.h>
+ #include <linux/smp.h>
+--- linux-2.6.0-test1/arch/mips/sibyte/cfe/smp.c       2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/cfe/smp.c      2003-07-19 17:04:07.000000000 -0700
+@@ -63,7 +63,7 @@ void prom_setup_smp(void)
+       /* Use CFE to find out how many CPUs are available */
+       for (i=1; i<NR_CPUS; i++) {
+               if (cfe_cpu_stop(i) == 0) {
+-                      CPUMASK_SETB(cpu_online_map, i);
++                      cpu_set(i, cpu_online_map);
+               }
+       }
+       printk("Detected %i available CPU(s)\n", num_online_cpus());
+--- linux-2.6.0-test1/arch/mips/sibyte/sb1250/prom.c   2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/sb1250/prom.c  2003-07-19 17:03:49.000000000 -0700
+@@ -20,7 +20,7 @@
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/bootmem.h>
+ #include <linux/smp.h>
+--- linux-2.6.0-test1/arch/mips/sibyte/sb1250/smp.c    2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/sb1250/smp.c   2003-07-19 17:04:07.000000000 -0700
+@@ -107,8 +107,8 @@ void __init smp_boot_cpus(void)
+       current_thread_info()->cpu = 0;
+       cpu_data[0].udelay_val = loops_per_jiffy;
+       cpu_data[0].asid_cache = ASID_FIRST_VERSION;
+-      CPUMASK_CLRALL(cpu_online_map);
+-      CPUMASK_SETB(cpu_online_map, 0);
++      cpus_clear(cpu_online_map);
++      cpu_set(0, cpu_online_map);
+       atomic_set(&cpus_booted, 1);  /* Master CPU is already booted... */
+       smp_tune_scheduling();
+--- linux-2.6.0-test1/arch/mips/sibyte/swarm/setup.c   2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/sibyte/swarm/setup.c  2003-07-19 17:03:49.000000000 -0700
+@@ -23,7 +23,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/mm.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/ide.h>
+ #include <linux/console.h>
+--- linux-2.6.0-test1/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c 2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c        2003-07-19 17:03:49.000000000 -0700
+@@ -134,7 +134,7 @@ JP7 is not bus master -- do NOT use -- o
+ #include <asm/time.h>
+ #include <linux/version.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #ifdef CONFIG_RTC_DS1742
+ #include <asm/rtc_ds1742.h>
+ #endif
+--- linux-2.6.0-test1/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c       2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c      2003-07-19 17:03:49.000000000 -0700
+@@ -62,7 +62,7 @@
+ #include <asm/time.h>
+ #include <linux/version.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/console.h>
+ #ifdef CONFIG_RTC_DS1742
+ #include <asm/rtc_ds1742.h>
+--- linux-2.6.0-test1/arch/mips/vr41xx/tanbac-tb0229/setup.c   2003-07-02 14:53:13.000000000 -0700
++++ 25/arch/mips/vr41xx/tanbac-tb0229/setup.c  2003-07-19 17:03:49.000000000 -0700
+@@ -18,7 +18,7 @@
+  *  option) any later version.
+  */
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/console.h>
+ #include <linux/init.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/arch/parisc/kernel/ioctl32.c     2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/parisc/kernel/ioctl32.c    2003-07-19 17:03:49.000000000 -0700
+@@ -48,7 +48,6 @@
+ #include <linux/raw.h>
+ #include <linux/smb_fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
+ #include <linux/elevator.h>
+ #include <linux/rtc.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/arch/parisc/kernel/pci-dma.c     2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/parisc/kernel/pci-dma.c    2003-07-19 17:07:16.000000000 -0700
+@@ -133,7 +133,7 @@ static inline int map_uncached_pages(uns
+       do {
+               pmd_t *pmd;
+               
+-              pmd = pmd_alloc(NULL, dir, vaddr);
++              pmd = pmd_alloc_kernel(NULL, dir, vaddr);
+               if (!pmd)
+                       return -ENOMEM;
+               if (map_pmd_uncached(pmd, vaddr, end - vaddr, &paddr))
+--- linux-2.6.0-test1/arch/parisc/kernel/smp.c 2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/parisc/kernel/smp.c        2003-07-19 17:04:07.000000000 -0700
+@@ -62,14 +62,14 @@ volatile struct task_struct *smp_init_cu
+ static volatile int smp_commenced = 0;   /* Set when the idlers are all forked */
+ static volatile int cpu_now_booting = 0;      /* track which CPU is booting */
+-volatile unsigned long cpu_online_map = 0;   /* Bitmap of online CPUs */
+-#define IS_LOGGED_IN(cpunum) (test_bit(cpunum, (atomic_t *)&cpu_online_map))
++cpumask_t cpu_online_map = CPU_MASK_NONE;   /* Bitmap of online CPUs */
++#define IS_LOGGED_IN(cpunum) (cpu_isset(cpunum, cpu_online_map))
+ int smp_num_cpus = 1;
+ int smp_threads_ready = 0;
+ unsigned long cache_decay_ticks;
+ static int max_cpus = -1;                          /* Command line */
+-unsigned long cpu_present_mask;
++cpumask_t cpu_present_mask;
+ struct smp_call_struct {
+       void (*func) (void *info);
+@@ -139,7 +139,7 @@ halt_processor(void) 
+ #else
+       /* REVISIT : redirect I/O Interrupts to another CPU? */
+       /* REVISIT : does PM *know* this CPU isn't available? */
+-      clear_bit(smp_processor_id(), (void *)&cpu_online_map);
++      cpu_clear(smp_processor_id(), cpu_online_map);
+       local_irq_disable();
+       for (;;)
+               ;
+@@ -443,7 +443,7 @@ smp_cpu_init(int cpunum)
+       mb();
+       /* Well, support 2.4 linux scheme as well. */
+-      if (test_and_set_bit(cpunum, (unsigned long *) (&cpu_online_map)))
++      if (cpu_test_and_set(cpunum, cpu_online_map))
+       {
+               extern void machine_halt(void); /* arch/parisc.../process.c */
+@@ -624,13 +624,14 @@ void __init smp_boot_cpus(void)
+       printk(KERN_DEBUG "SMP: bootstrap CPU ID is %d\n",bootstrap_processor);
+       init_task.thread_info->cpu = bootstrap_processor; 
+       current->thread_info->cpu = bootstrap_processor;
+-      cpu_online_map = 1 << bootstrap_processor; /* Mark Boostrap processor as present */
++      /* Mark Boostrap processor as present */
++      cpu_online_map = cpumask_of_cpu(bootstrap_processor);
+       current->active_mm = &init_mm;
+ #ifdef ENTRY_SYS_CPUS
+       cpu_data[0].state = STATE_RUNNING;
+ #endif
+-      cpu_present_mask = 1UL << bootstrap_processor;
++      cpu_present_mask = cpumask_of_cpu(bootstrap_processor);
+       /* Nothing to do when told not to.  */
+       if (max_cpus == 0) {
+@@ -709,8 +710,8 @@ void __init smp_prepare_cpus(unsigned in
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
+-      set_bit(smp_processor_id(), &cpu_present_mask);
++      cpu_set(smp_processor_id(), cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_present_mask);
+ }
+ int __devinit __cpu_up(unsigned int cpu)
+--- linux-2.6.0-test1/arch/parisc/mm/ioremap.c 2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/parisc/mm/ioremap.c        2003-07-19 17:07:16.000000000 -0700
+@@ -77,7 +77,7 @@ static int remap_area_pages(unsigned lon
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(dir, address);
++              pmd = pmd_alloc_kernel(dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+--- linux-2.6.0-test1/arch/ppc64/boot/Makefile 2003-06-14 12:18:32.000000000 -0700
++++ 25/arch/ppc64/boot/Makefile        2003-07-19 17:03:49.000000000 -0700
+@@ -118,7 +118,7 @@ $(obj)/imagesize.c: vmlinux
+       ls -l vmlinux | \
+       awk '{printf "/* generated -- do not edit! */\n" \
+               "unsigned long vmlinux_filesize = %d;\n", $$5}' > $(obj)/imagesize.c
+-      $(CROSS_COMPILE)nm -n vmlinux | tail -1 | \
++      $(CROSS_COMPILE)nm -n vmlinux | tail -n 1 | \
+       awk '{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}' \
+               >> $(obj)/imagesize.c
+--- linux-2.6.0-test1/arch/ppc64/Kconfig       2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/ppc64/Kconfig      2003-07-19 17:04:07.000000000 -0700
+@@ -93,7 +93,7 @@ config IRQ_ALL_CPUS
+         CPU.
+ config NR_CPUS
+-      int "Maximum number of CPUs (2-64)"
++      int "Maximum number of CPUs (2-128)"
+       depends on SMP
+       default "32"
+--- linux-2.6.0-test1/arch/ppc64/kernel/htab.c 2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/ppc64/kernel/htab.c        2003-07-19 17:04:07.000000000 -0700
+@@ -377,6 +377,7 @@ int hash_page(unsigned long ea, unsigned
+       int ret;
+       int user_region = 0;
+       int local = 0;
++      cpumask_t tmp;
+       /* Check for invalid addresses. */
+       if (!IS_VALID_EA(ea))
+@@ -431,7 +432,8 @@ int hash_page(unsigned long ea, unsigned
+        */
+       spin_lock(&mm->page_table_lock);
+-      if (user_region && (mm->cpu_vm_mask == (1 << smp_processor_id())))
++      tmp = cpumask_of_cpu(smp_processor_id());
++      if (user_region && cpus_equal(mm->cpu_vm_mask, tmp))
+               local = 1;
+       ptep = find_linux_pte(pgdir, ea);
+--- linux-2.6.0-test1/arch/ppc64/kernel/irq.c  2003-06-14 12:18:08.000000000 -0700
++++ 25/arch/ppc64/kernel/irq.c 2003-07-19 17:04:07.000000000 -0700
+@@ -603,26 +603,37 @@ static struct proc_dir_entry * irq_dir [
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+ #ifdef CONFIG_IRQ_ALL_CPUS
+-unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = -1UL};
++cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+ #else  /* CONFIG_IRQ_ALL_CPUS */
+-unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = 0x0};
++cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_NONE };
+ #endif /* CONFIG_IRQ_ALL_CPUS */
+-#define HEX_DIGITS 16
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
++      int k, len;
++      cpumask_t tmp = irq_affinity[(long)data];
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf(page, "%16lx\n", irq_affinity[(long)data]);
++
++      for (k = 0; k < sizeof(cpumask_t) / sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static unsigned int parse_hex_value (const char *buffer,
+-              unsigned long count, unsigned long *ret)
++              unsigned long count, cpumask_t *ret)
+ {
+       unsigned char hexnum [HEX_DIGITS];
+-      unsigned long value;
++      cpumask_t value = CPU_MASK_NONE;
+       int i;
+       if (!count)
+@@ -636,10 +647,10 @@ static unsigned int parse_hex_value (con
+        * Parse the first 16 characters as a hex string, any non-hex char
+        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+        */
+-      value = 0;
+       for (i = 0; i < count; i++) {
+               unsigned int c = hexnum[i];
++              int k;
+               switch (c) {
+                       case '0' ... '9': c -= '0'; break;
+@@ -648,7 +659,11 @@ static unsigned int parse_hex_value (con
+               default:
+                       goto out;
+               }
+-              value = (value << 4) | c;
++              cpus_shift_left(value, value, 4);
++              for (k = 0; k < 4; ++k)
++                      if (test_bit(k, (unsigned long *)&c))
++                              cpu_set(k, value);
++
+       }
+ out:
+       *ret = value;
+@@ -659,7 +674,7 @@ static int irq_affinity_write_proc (stru
+                                       unsigned long count, void *data)
+ {
+       int irq = (long)data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t new_value, tmp;
+       if (!irq_desc[irq].handler->set_affinity)
+               return -EIO;
+@@ -671,7 +686,8 @@ static int irq_affinity_write_proc (stru
+        * way to make the system unusable accidentally :-) At least
+        * one online CPU still has to be targeted.
+        */
+-      if (!(new_value & cpu_online_map))
++      cpus_and(tmp, new_value, cpu_online_map);
++      if (cpus_empty(tmp))
+               return -EINVAL;
+       irq_affinity[irq] = new_value;
+@@ -692,8 +708,9 @@ static int prof_cpu_mask_read_proc (char
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t *mask = (cpumask_t *)data;
++      unsigned long full_count = count, err;
++      cpumask_t new_value;
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+--- linux-2.6.0-test1/arch/ppc64/kernel/iSeries_irq.c  2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/ppc64/kernel/iSeries_irq.c 2003-07-19 17:03:49.000000000 -0700
+@@ -29,7 +29,6 @@
+ #include <linux/param.h>
+ #include <linux/string.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
+ #include <linux/ide.h>
+ #include <linux/irq.h>
+--- linux-2.6.0-test1/arch/ppc64/kernel/open_pic.c     2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/ppc64/kernel/open_pic.c    2003-07-19 17:04:07.000000000 -0700
+@@ -46,7 +46,7 @@ static int broken_ipi_registers;
+ OpenPIC_SourcePtr ISU[OPENPIC_MAX_ISU];
+ static void openpic_end_irq(unsigned int irq_nr);
+-static void openpic_set_affinity(unsigned int irq_nr, unsigned long cpumask);
++static void openpic_set_affinity(unsigned int irq_nr, cpumask_t cpumask);
+ struct hw_interrupt_type open_pic = {
+       " OpenPIC  ",
+@@ -505,7 +505,7 @@ static void openpic_set_spurious(u_int v
+ void openpic_init_processor(u_int cpumask)
+ {
+       openpic_write(&OpenPIC->Global.Processor_Initialization,
+-                    cpumask & cpu_online_map);
++                    cpumask & cpus_coerce(cpu_online_map));
+ }
+ #ifdef CONFIG_SMP
+@@ -539,7 +539,7 @@ void openpic_cause_IPI(u_int ipi, u_int 
+       CHECK_THIS_CPU;
+       check_arg_ipi(ipi);
+       openpic_write(&OpenPIC->THIS_CPU.IPI_Dispatch(ipi),
+-                    cpumask & cpu_online_map);
++                    cpumask & cpus_coerce(cpu_online_map));
+ }
+ void openpic_request_IPIs(void)
+@@ -625,7 +625,7 @@ static void __init openpic_maptimer(u_in
+ {
+       check_arg_timer(timer);
+       openpic_write(&OpenPIC->Global.Timer[timer].Destination,
+-                    cpumask & cpu_online_map);
++                    cpumask & cpus_coerce(cpu_online_map));
+ }
+@@ -746,9 +746,12 @@ static void openpic_end_irq(unsigned int
+               openpic_eoi();
+ }
+-static void openpic_set_affinity(unsigned int irq_nr, unsigned long cpumask)
++static void openpic_set_affinity(unsigned int irq_nr, cpumask_t cpumask)
+ {
+-      openpic_mapirq(irq_nr - open_pic_irq_offset, cpumask & cpu_online_map);
++      cpumask_t tmp;
++
++      cpus_and(tmp, cpumask, cpu_online_map);
++      openpic_mapirq(irq_nr - open_pic_irq_offset, cpus_coerce(tmp));
+ }
+ #ifdef CONFIG_SMP
+--- linux-2.6.0-test1/arch/ppc64/kernel/open_pic.h     2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/ppc64/kernel/open_pic.h    2003-07-19 17:04:07.000000000 -0700
+@@ -13,6 +13,7 @@
+ #define _PPC64_KERNEL_OPEN_PIC_H
+ #include <linux/config.h>
++#include <linux/cpumask.h>
+ #define OPENPIC_SIZE  0x40000
+--- linux-2.6.0-test1/arch/ppc64/kernel/pacaData.c     2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/ppc64/kernel/pacaData.c    2003-07-19 17:04:07.000000000 -0700
+@@ -134,5 +134,71 @@ struct paca_struct paca[NR_CPUS] __page_
+       PACAINITDATA(61, 0, 0, 0, 0),
+       PACAINITDATA(62, 0, 0, 0, 0),
+       PACAINITDATA(63, 0, 0, 0, 0),
++#if NR_CPUS > 64
++      PACAINITDATA(64, 0, 0, 0, 0),
++      PACAINITDATA(65, 0, 0, 0, 0),
++      PACAINITDATA(66, 0, 0, 0, 0),
++      PACAINITDATA(67, 0, 0, 0, 0),
++      PACAINITDATA(68, 0, 0, 0, 0),
++      PACAINITDATA(69, 0, 0, 0, 0),
++      PACAINITDATA(70, 0, 0, 0, 0),
++      PACAINITDATA(71, 0, 0, 0, 0),
++      PACAINITDATA(72, 0, 0, 0, 0),
++      PACAINITDATA(73, 0, 0, 0, 0),
++      PACAINITDATA(74, 0, 0, 0, 0),
++      PACAINITDATA(75, 0, 0, 0, 0),
++      PACAINITDATA(76, 0, 0, 0, 0),
++      PACAINITDATA(77, 0, 0, 0, 0),
++      PACAINITDATA(78, 0, 0, 0, 0),
++      PACAINITDATA(79, 0, 0, 0, 0),
++      PACAINITDATA(80, 0, 0, 0, 0),
++      PACAINITDATA(81, 0, 0, 0, 0),
++      PACAINITDATA(82, 0, 0, 0, 0),
++      PACAINITDATA(83, 0, 0, 0, 0),
++      PACAINITDATA(84, 0, 0, 0, 0),
++      PACAINITDATA(85, 0, 0, 0, 0),
++      PACAINITDATA(86, 0, 0, 0, 0),
++      PACAINITDATA(87, 0, 0, 0, 0),
++      PACAINITDATA(88, 0, 0, 0, 0),
++      PACAINITDATA(89, 0, 0, 0, 0),
++      PACAINITDATA(90, 0, 0, 0, 0),
++      PACAINITDATA(91, 0, 0, 0, 0),
++      PACAINITDATA(92, 0, 0, 0, 0),
++      PACAINITDATA(93, 0, 0, 0, 0),
++      PACAINITDATA(94, 0, 0, 0, 0),
++      PACAINITDATA(95, 0, 0, 0, 0),
++      PACAINITDATA(96, 0, 0, 0, 0),
++      PACAINITDATA(97, 0, 0, 0, 0),
++      PACAINITDATA(98, 0, 0, 0, 0),
++      PACAINITDATA(99, 0, 0, 0, 0),
++      PACAINITDATA(100, 0, 0, 0, 0),
++      PACAINITDATA(101, 0, 0, 0, 0),
++      PACAINITDATA(102, 0, 0, 0, 0),
++      PACAINITDATA(103, 0, 0, 0, 0),
++      PACAINITDATA(104, 0, 0, 0, 0),
++      PACAINITDATA(105, 0, 0, 0, 0),
++      PACAINITDATA(106, 0, 0, 0, 0),
++      PACAINITDATA(107, 0, 0, 0, 0),
++      PACAINITDATA(108, 0, 0, 0, 0),
++      PACAINITDATA(109, 0, 0, 0, 0),
++      PACAINITDATA(110, 0, 0, 0, 0),
++      PACAINITDATA(111, 0, 0, 0, 0),
++      PACAINITDATA(112, 0, 0, 0, 0),
++      PACAINITDATA(113, 0, 0, 0, 0),
++      PACAINITDATA(114, 0, 0, 0, 0),
++      PACAINITDATA(115, 0, 0, 0, 0),
++      PACAINITDATA(116, 0, 0, 0, 0),
++      PACAINITDATA(117, 0, 0, 0, 0),
++      PACAINITDATA(118, 0, 0, 0, 0),
++      PACAINITDATA(119, 0, 0, 0, 0),
++      PACAINITDATA(120, 0, 0, 0, 0),
++      PACAINITDATA(121, 0, 0, 0, 0),
++      PACAINITDATA(122, 0, 0, 0, 0),
++      PACAINITDATA(123, 0, 0, 0, 0),
++      PACAINITDATA(124, 0, 0, 0, 0),
++      PACAINITDATA(125, 0, 0, 0, 0),
++      PACAINITDATA(126, 0, 0, 0, 0),
++      PACAINITDATA(127, 0, 0, 0, 0),
++#endif
+ #endif
+ };
+--- linux-2.6.0-test1/arch/ppc64/kernel/prom.c 2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/ppc64/kernel/prom.c        2003-07-19 17:04:07.000000000 -0700
+@@ -27,7 +27,6 @@
+ #include <linux/version.h>
+ #include <linux/threads.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
+ #include <linux/types.h>
+ #include <linux/pci.h>
+ #include <asm/prom.h>
+@@ -1134,7 +1133,7 @@ prom_init(unsigned long r3, unsigned lon
+       _prom->cpu = (int)(unsigned long)getprop_rval;
+       _xPaca[_prom->cpu].active = 1;
+ #ifdef CONFIG_SMP
+-      RELOC(cpu_online_map) = 1UL << _prom->cpu;
++      cpu_set(_prom->cpu, RELOC(cpu_online_map));
+ #endif
+       RELOC(boot_cpuid) = _prom->cpu;
+--- linux-2.6.0-test1/arch/ppc64/kernel/rtasd.c        2003-06-14 12:18:06.000000000 -0700
++++ 25/arch/ppc64/kernel/rtasd.c       2003-07-19 17:04:07.000000000 -0700
+@@ -225,7 +225,7 @@ repeat:
+                       continue;
+               DEBUG("scheduling on %d\n", cpu);
+-              set_cpus_allowed(current, 1UL << cpu);
++              set_cpus_allowed(current, cpumask_of_cpu(cpu));
+               DEBUG("watchdog scheduled on cpu %d\n", smp_processor_id());
+               do {
+--- linux-2.6.0-test1/arch/ppc64/kernel/semaphore.c    2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/ppc64/kernel/semaphore.c   2003-07-19 17:04:51.000000000 -0700
+@@ -21,6 +21,7 @@
+ #include <asm/semaphore.h>
+ #include <asm/errno.h>
++#if 0
+ /*
+  * Atomically update sem->count.
+  * This does the equivalent of the following:
+@@ -129,3 +130,140 @@ int __down_interruptible(struct semaphor
+       wake_up(&sem->wait);
+       return retval;
+ }
++#else
++
++static __inline__ int atomic_add_negative(int i, atomic_t *v)
++{
++      if (atomic_add_return(i, v) < 0)
++              return 1;
++      else
++              return 0;
++}
++
++void __up(struct semaphore *sem)
++{
++      wake_up(&sem->wait);
++}
++
++void __down(struct semaphore * sem)
++{
++      struct task_struct *tsk = current;
++      DECLARE_WAITQUEUE(wait, tsk);
++      unsigned long flags;
++
++      tsk->state = TASK_UNINTERRUPTIBLE;
++      spin_lock_irqsave(&sem->wait.lock, flags);
++      add_wait_queue_exclusive_locked(&sem->wait, &wait);
++
++      sem->sleepers++;
++      for (;;) {
++              int sleepers = sem->sleepers;
++
++              /*
++               * Add "everybody else" into it. They aren't
++               * playing, because we own the spinlock in
++               * the wait_queue_head.
++               */
++              if (!atomic_add_negative(sleepers - 1, &sem->count)) {
++                      sem->sleepers = 0;
++                      break;
++              }
++              sem->sleepers = 1;      /* us - see -1 above */
++              spin_unlock_irqrestore(&sem->wait.lock, flags);
++
++              schedule();
++
++              spin_lock_irqsave(&sem->wait.lock, flags);
++              tsk->state = TASK_UNINTERRUPTIBLE;
++      }
++      remove_wait_queue_locked(&sem->wait, &wait);
++      wake_up_locked(&sem->wait);
++      spin_unlock_irqrestore(&sem->wait.lock, flags);
++      tsk->state = TASK_RUNNING;
++}
++
++int __down_interruptible(struct semaphore * sem)
++{
++      int retval = 0;
++      struct task_struct *tsk = current;
++      DECLARE_WAITQUEUE(wait, tsk);
++      unsigned long flags;
++
++      tsk->state = TASK_INTERRUPTIBLE;
++      spin_lock_irqsave(&sem->wait.lock, flags);
++      add_wait_queue_exclusive_locked(&sem->wait, &wait);
++
++      sem->sleepers++;
++      for (;;) {
++              int sleepers = sem->sleepers;
++
++              /*
++               * With signals pending, this turns into
++               * the trylock failure case - we won't be
++               * sleeping, and we* can't get the lock as
++               * it has contention. Just correct the count
++               * and exit.
++               */
++              if (signal_pending(current)) {
++                      retval = -EINTR;
++                      sem->sleepers = 0;
++                      atomic_add(sleepers, &sem->count);
++                      break;
++              }
++
++              /*
++               * Add "everybody else" into it. They aren't
++               * playing, because we own the spinlock in
++               * wait_queue_head. The "-1" is because we're
++               * still hoping to get the semaphore.
++               */
++              if (!atomic_add_negative(sleepers - 1, &sem->count)) {
++                      sem->sleepers = 0;
++                      break;
++              }
++              sem->sleepers = 1;      /* us - see -1 above */
++              spin_unlock_irqrestore(&sem->wait.lock, flags);
++
++              schedule();
++
++              spin_lock_irqsave(&sem->wait.lock, flags);
++              tsk->state = TASK_INTERRUPTIBLE;
++      }
++      remove_wait_queue_locked(&sem->wait, &wait);
++      wake_up_locked(&sem->wait);
++      spin_unlock_irqrestore(&sem->wait.lock, flags);
++
++      tsk->state = TASK_RUNNING;
++      return retval;
++}
++
++/*
++ * Trylock failed - make sure we correct for
++ * having decremented the count.
++ *
++ * We could have done the trylock with a
++ * single "cmpxchg" without failure cases,
++ * but then it wouldn't work on a 386.
++ */
++int __down_trylock(struct semaphore * sem)
++{
++      int sleepers;
++      unsigned long flags;
++
++      spin_lock_irqsave(&sem->wait.lock, flags);
++      sleepers = sem->sleepers + 1;
++      sem->sleepers = 0;
++
++      /*
++       * Add "everybody else" and us into it. They aren't
++       * playing, because we own the spinlock in the
++       * wait_queue_head.
++       */
++      if (!atomic_add_negative(sleepers, &sem->count)) {
++              wake_up_locked(&sem->wait);
++      }
++
++      spin_unlock_irqrestore(&sem->wait.lock, flags);
++      return 1;
++}
++#endif
+--- linux-2.6.0-test1/arch/ppc64/kernel/setup.c        2003-06-14 12:18:09.000000000 -0700
++++ 25/arch/ppc64/kernel/setup.c       2003-07-19 17:04:07.000000000 -0700
+@@ -256,7 +256,7 @@ static int show_cpuinfo(struct seq_file 
+               return 0;
+       }
+-      if (!(cpu_online_map & (1UL << cpu_id)))
++      if (!cpu_online(cpu_id))
+               return 0;
+ #ifdef CONFIG_SMP
+--- linux-2.6.0-test1/arch/ppc64/kernel/smp.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/ppc64/kernel/smp.c 2003-07-19 17:04:07.000000000 -0700
+@@ -53,7 +53,7 @@ int smp_threads_ready;
+ unsigned long cache_decay_ticks;
+ /* initialised so it doesn't end up in bss */
+-unsigned long cpu_online_map = 0;
++cpumask_t cpu_online_map = CPU_MASK_NONE;
+ static struct smp_ops_t *smp_ops;
+@@ -570,7 +570,7 @@ void __init smp_prepare_cpus(unsigned in
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
+       /* FIXME: what about cpu_possible()? */
+ }
+@@ -631,7 +631,7 @@ int __devinit __cpu_up(unsigned int cpu)
+       if (smp_ops->give_timebase)
+               smp_ops->give_timebase();
+-      set_bit(cpu, &cpu_online_map);
++      cpu_set(cpu, cpu_online_map);
+       return 0;
+ }
+--- linux-2.6.0-test1/arch/ppc64/kernel/xics.c 2003-06-14 12:18:22.000000000 -0700
++++ 25/arch/ppc64/kernel/xics.c        2003-07-19 17:04:07.000000000 -0700
+@@ -33,7 +33,7 @@ void xics_enable_irq(u_int irq);
+ void xics_disable_irq(u_int irq);
+ void xics_mask_and_ack_irq(u_int irq);
+ void xics_end_irq(u_int irq);
+-void xics_set_affinity(unsigned int irq_nr, unsigned long cpumask);
++void xics_set_affinity(unsigned int irq_nr, cpumask_t cpumask);
+ struct hw_interrupt_type xics_pic = {
+       " XICS     ",
+@@ -508,7 +508,7 @@ nextnode:
+       ppc64_boot_msg(0x21, "XICS Done");
+ }
+-void xics_set_affinity(unsigned int virq, unsigned long cpumask)
++void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
+ {
+         irq_desc_t *desc = irq_desc + virq;
+       unsigned int irq;
+@@ -516,6 +516,8 @@ void xics_set_affinity(unsigned int virq
+       long status;
+       unsigned long xics_status[2];
+       unsigned long newmask;
++      cpumask_t allcpus = CPU_MASK_ALL;
++      cpumask_t tmp = CPU_MASK_NONE;
+       virq -= XICS_IRQ_OFFSET;
+       irq = virt_irq_to_real(virq);
+@@ -533,12 +535,13 @@ void xics_set_affinity(unsigned int virq
+       }
+       /* For the moment only implement delivery to all cpus or one cpu */
+-      if (cpumask == -1UL) {
++      if (cpus_equal(cpumask, allcpus)) {
+               newmask = default_distrib_server;
+       } else {
+-              if (!(cpumask & cpu_online_map))
++              cpus_and(tmp, cpu_online_map, cpumask);
++              if (cpus_empty(tmp))
+                       goto out;
+-              newmask = find_first_bit(&cpumask, 8*sizeof(unsigned long));
++              newmask = first_cpu(cpumask);
+       }
+       status = rtas_call(ibm_set_xive, 3, 1, NULL,
+--- linux-2.6.0-test1/arch/ppc64/kernel/XmPciLpEvent.c 2003-06-14 12:18:21.000000000 -0700
++++ 25/arch/ppc64/kernel/XmPciLpEvent.c        2003-07-19 17:03:49.000000000 -0700
+@@ -12,7 +12,6 @@
+ #include <linux/param.h>
+ #include <linux/string.h>
+ #include <linux/bootmem.h>
+-#include <linux/blk.h>
+ #include <linux/ide.h>
+ #include <asm/iSeries/HvTypes.h>
+--- linux-2.6.0-test1/arch/ppc64/mm/init.c     2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ppc64/mm/init.c    2003-07-19 17:07:16.000000000 -0700
+@@ -37,9 +37,6 @@
+ #include <linux/bootmem.h>
+ #include <linux/highmem.h>
+ #include <linux/proc_fs.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>                /* for initrd_* */
+-#endif
+ #include <asm/pgalloc.h>
+ #include <asm/page.h>
+@@ -211,7 +208,7 @@ static void map_io_page(unsigned long ea
+       if (mem_init_done) {
+               spin_lock(&ioremap_mm.page_table_lock);
+               pgdp = pgd_offset_i(ea);
+-              pmdp = pmd_alloc(&ioremap_mm, pgdp, ea);
++              pmdp = pmd_alloc_kernel(&ioremap_mm, pgdp, ea);
+               ptep = pte_alloc_kernel(&ioremap_mm, pmdp, ea);
+               pa = absolute_to_phys(pa);
+@@ -253,7 +250,7 @@ flush_tlb_mm(struct mm_struct *mm)
+               __flush_tlb_range(mm, mp->vm_start, mp->vm_end);
+       /* XXX are there races with checking cpu_vm_mask? - Anton */
+-      mm->cpu_vm_mask = 0;
++      cpus_clear(mm->cpu_vm_mask);
+       spin_unlock(&mm->page_table_lock);
+ }
+@@ -270,6 +267,7 @@ flush_tlb_page(struct vm_area_struct *vm
+       pte_t *ptep;
+       pte_t pte;
+       int local = 0;
++      cpumask_t tmp;
+       switch( REGION_ID(vmaddr) ) {
+       case VMALLOC_REGION_ID:
+@@ -283,7 +281,8 @@ flush_tlb_page(struct vm_area_struct *vm
+               context = vma->vm_mm->context;
+               /* XXX are there races with checking cpu_vm_mask? - Anton */
+-              if (vma->vm_mm->cpu_vm_mask == (1 << smp_processor_id()))
++              tmp = cpumask_of_cpu(smp_processor_id());
++              if (cpus_equal(vma->vm_mm->cpu_vm_mask, tmp))
+                       local = 1;
+               break;
+@@ -319,6 +318,7 @@ __flush_tlb_range(struct mm_struct *mm, 
+       struct ppc64_tlb_batch *batch = &ppc64_tlb_batch[smp_processor_id()];
+       unsigned long i = 0;
+       int local = 0;
++      cpumask_t tmp;
+       switch(REGION_ID(start)) {
+       case VMALLOC_REGION_ID:
+@@ -332,7 +332,8 @@ __flush_tlb_range(struct mm_struct *mm, 
+               context = mm->context;
+               /* XXX are there races with checking cpu_vm_mask? - Anton */
+-              if (mm->cpu_vm_mask == (1 << smp_processor_id()))
++              tmp = cpumask_of_cpu(smp_processor_id());
++              if (cpus_equal(mm->cpu_vm_mask, tmp))
+                       local = 1;
+               break;
+@@ -698,6 +699,7 @@ void update_mmu_cache(struct vm_area_str
+       void *pgdir;
+       pte_t *ptep;
+       int local = 0;
++      cpumask_t tmp;
+       /* handle i-cache coherency */
+       if (!(cur_cpu_spec->cpu_features & CPU_FTR_NOEXECUTE)) {
+@@ -723,7 +725,8 @@ void update_mmu_cache(struct vm_area_str
+       ptep = find_linux_pte(pgdir, ea);
+       vsid = get_vsid(vma->vm_mm->context, ea);
+-      if (vma->vm_mm->cpu_vm_mask == (1 << smp_processor_id()))
++      tmp = cpumask_of_cpu(smp_processor_id());
++      if (cpus_equal(vma->vm_mm->cpu_vm_mask, tmp))
+               local = 1;
+       __hash_page(ea, pte_val(pte) & (_PAGE_USER|_PAGE_RW), vsid, ptep,
+--- linux-2.6.0-test1/arch/ppc/kernel/irq.c    2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/ppc/kernel/irq.c   2003-07-19 17:04:07.000000000 -0700
+@@ -44,6 +44,7 @@
+ #include <linux/proc_fs.h>
+ #include <linux/random.h>
+ #include <linux/seq_file.h>
++#include <linux/cpumask.h>
+ #include <asm/uaccess.h>
+ #include <asm/bitops.h>
+@@ -420,10 +421,9 @@ void ppc_irq_dispatch_handler(struct pt_
+ {
+       int status;
+       struct irqaction *action;
+-      int cpu = smp_processor_id();
+       irq_desc_t *desc = irq_desc + irq;
+-      kstat_cpu(cpu).irqs[irq]++;
++      kstat_this_cpu.irqs[irq]++;
+       spin_lock(&desc->lock);
+       ack_irq(irq);   
+       /*
+@@ -565,29 +565,41 @@ static struct proc_dir_entry *irq_dir[NR
+ static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
+ #ifdef CONFIG_IRQ_ALL_CPUS
+-#define DEFAULT_CPU_AFFINITY 0xffffffff
++#define DEFAULT_CPU_AFFINITY CPU_MASK_ALL
+ #else
+-#define DEFAULT_CPU_AFFINITY 0x00000001
++#define DEFAULT_CPU_AFFINITY cpumask_of_cpu(0)
+ #endif
+-unsigned int irq_affinity [NR_IRQS] =
++cpumask_t irq_affinity [NR_IRQS] =
+       { [0 ... NR_IRQS-1] = DEFAULT_CPU_AFFINITY };
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
++      cpumask_t tmp = irq_affinity[(long)data];
++      int k, len = 0;
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08x\n", irq_affinity[(int)data]);
++
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static unsigned int parse_hex_value (const char __user *buffer,
+-              unsigned long count, unsigned long *ret)
++              unsigned long count, cpumask_t *ret)
+ {
+       unsigned char hexnum [HEX_DIGITS];
+-      unsigned long value;
++      cpumask_t value = CPU_MASK_NONE;
+       int i;
+       if (!count)
+@@ -601,10 +613,9 @@ static unsigned int parse_hex_value (con
+        * Parse the first 8 characters as a hex string, any non-hex char
+        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+        */
+-      value = 0;
+-
+       for (i = 0; i < count; i++) {
+               unsigned int c = hexnum[i];
++              int k;
+               switch (c) {
+                       case '0' ... '9': c -= '0'; break;
+@@ -613,7 +624,10 @@ static unsigned int parse_hex_value (con
+               default:
+                       goto out;
+               }
+-              value = (value << 4) | c;
++              cpus_shift_left(value, value, 4);
++              for (k = 0; k < 4; ++k)
++                      if (c & (1 << k))
++                              cpu_set(k, value);
+       }
+ out:
+       *ret = value;
+@@ -624,7 +638,7 @@ static int irq_affinity_write_proc (stru
+                                       unsigned long count, void *data)
+ {
+       int irq = (int) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t new_value, tmp;
+       if (!irq_desc[irq].handler->set_affinity)
+               return -EIO;
+@@ -641,7 +655,8 @@ static int irq_affinity_write_proc (stru
+        * are actually logical cpu #'s then we have no problem.
+        *  -- Cort <cort@fsmlabs.com>
+        */
+-      if (!(new_value & cpu_online_map))
++      cpus_and(tmp, new_value, cpu_online_map);
++      if (cpus_empty(tmp))
+               return -EINVAL;
+       irq_affinity[irq] = new_value;
+@@ -653,17 +668,27 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data;
++      cpumask_t mask = *(cpumask_t *)data;
++      int k, len = 0;
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", *mask);
++
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", (u16)cpus_coerce(mask));
++              len += j;
++              page += j;
++              cpus_shift_right(mask, mask, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
+                                       unsigned long count, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t *mask = (cpumask_t *)data, full_count = count, err;
++      cpumask_t new_value;
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+--- linux-2.6.0-test1/arch/ppc/kernel/misc.S   2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/ppc/kernel/misc.S  2003-07-19 17:03:49.000000000 -0700
+@@ -1375,3 +1375,8 @@ _GLOBAL(sys_call_table)
+       .long sys_clock_gettime
+       .long sys_clock_getres
+       .long sys_clock_nanosleep
++      .long sys_ni_syscall    /* reserved for swapcontext */
++      .long sys_tgkill        /* 250 */
++      .long sys_utimes
++      .long sys_statfs64
++      .long sys_fstatfs64
+--- linux-2.6.0-test1/arch/ppc/kernel/setup.c  2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/ppc/kernel/setup.c 2003-07-19 17:04:07.000000000 -0700
+@@ -159,7 +159,7 @@ int show_cpuinfo(struct seq_file *m, voi
+       }
+ #ifdef CONFIG_SMP
+-      if (!(cpu_online_map & (1 << i)))
++      if (!cpu_online(i))
+               return 0;
+       pvr = cpu_data[i].pvr;
+       lpj = cpu_data[i].loops_per_jiffy;
+--- linux-2.6.0-test1/arch/ppc/kernel/smp.c    2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/ppc/kernel/smp.c   2003-07-19 17:04:07.000000000 -0700
+@@ -47,7 +47,7 @@ atomic_t ipi_sent;
+ DEFINE_PER_CPU(unsigned int, prof_multiplier);
+ DEFINE_PER_CPU(unsigned int, prof_counter);
+ unsigned long cache_decay_ticks = HZ/100;
+-unsigned long cpu_online_map = 1UL;
++unsigned long cpu_online_map = cpumask_of_cpu(0);
+ unsigned long cpu_possible_map = 1UL;
+ int smp_hw_index[NR_CPUS];
+ struct thread_info *secondary_ti;
+@@ -361,8 +361,8 @@ void __init smp_prepare_cpus(unsigned in
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
+-      set_bit(smp_processor_id(), &cpu_possible_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_possible_map);
+ }
+ int __init setup_profiling_timer(unsigned int multiplier)
+@@ -444,7 +444,7 @@ int __cpu_up(unsigned int cpu)
+       printk("Processor %d found.\n", cpu);
+       smp_ops->give_timebase();
+-      set_bit(cpu, &cpu_online_map);
++      cpu_set(cpu, cpu_online_map);
+       return 0;
+ }
+--- linux-2.6.0-test1/arch/ppc/kernel/syscalls.c       2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/ppc/kernel/syscalls.c      2003-07-19 17:03:49.000000000 -0700
+@@ -20,7 +20,6 @@
+  *
+  */
+-#include <linux/config.h>
+ #include <linux/errno.h>
+ #include <linux/sched.h>
+ #include <linux/mm.h>
+@@ -59,10 +58,15 @@ sys_ipc (uint call, int first, int secon
+       version = call >> 16; /* hack for backward compatibility */
+       call &= 0xffff;
+-      ret = -EINVAL;
++      ret = -ENOSYS;
+       switch (call) {
+       case SEMOP:
+-              ret = sys_semop (first, (struct sembuf __user *)ptr, second);
++              ret = sys_semtimedop (first, (struct sembuf __user *)ptr,
++                                    second, NULL);
++              break;
++      case SEMTIMEDOP:
++              ret = sys_semtimedop (first, (struct sembuf __user *)ptr,
++                                    second, (const struct timespec *) fifth);
+               break;
+       case SEMGET:
+               ret = sys_semget (first, second, third);
+@@ -258,6 +262,4 @@ int sys_olduname(struct oldold_utsname _
+       return error;
+ }
+-cond_syscall(sys_pciconfig_read);
+-cond_syscall(sys_pciconfig_write);
+ cond_syscall(sys_pciconfig_iobase);
+--- linux-2.6.0-test1/arch/ppc/kernel/time.c   2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/ppc/kernel/time.c  2003-07-19 17:03:49.000000000 -0700
+@@ -244,7 +244,7 @@ int do_settimeofday(struct timespec *tv)
+       time_t wtm_sec, new_sec = tv->tv_sec;
+       long wtm_nsec, new_nsec = tv->tv_nsec;
+       unsigned long flags;
+-      int tb_delta, new_nsec, new_sec;
++      int tb_delta;
+       if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
+               return -EINVAL;
+--- linux-2.6.0-test1/arch/ppc/mm/mem_pieces.c 2003-06-14 12:17:56.000000000 -0700
++++ 25/arch/ppc/mm/mem_pieces.c        2003-07-19 17:03:49.000000000 -0700
+@@ -17,7 +17,6 @@
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/stddef.h>
+-#include <linux/blk.h>
+ #include <linux/init.h>
+ #include "mem_pieces.h"
+--- linux-2.6.0-test1/arch/ppc/platforms/4xx/beech.c   2003-06-14 12:18:22.000000000 -0700
++++ 25/arch/ppc/platforms/4xx/beech.c  2003-07-19 17:03:49.000000000 -0700
+@@ -25,7 +25,6 @@
+  *
+  */
+-#include <linux/blk.h>
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <linux/module.h>
+--- linux-2.6.0-test1/arch/ppc/platforms/4xx/sycamore.c        2003-06-14 12:18:24.000000000 -0700
++++ 25/arch/ppc/platforms/4xx/sycamore.c       2003-07-19 17:03:49.000000000 -0700
+@@ -17,7 +17,6 @@
+ #include <linux/threads.h>
+ #include <linux/param.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/pci.h>
+ #include <linux/rtc.h>
+--- linux-2.6.0-test1/arch/ppc/platforms/4xx/walnut.c  2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/ppc/platforms/4xx/walnut.c 2003-07-19 17:03:49.000000000 -0700
+@@ -19,7 +19,6 @@
+ #include <linux/threads.h>
+ #include <linux/param.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/pci.h>
+ #include <linux/rtc.h>
+--- linux-2.6.0-test1/arch/ppc/platforms/pmac_cpufreq.c        2003-06-14 12:18:23.000000000 -0700
++++ 25/arch/ppc/platforms/pmac_cpufreq.c       2003-07-19 17:03:49.000000000 -0700
+@@ -176,7 +176,7 @@ do_set_cpu_speed(int speed_mode)
+       
+       freqs.old = cur_freq;
+       freqs.new = (speed_mode == PMAC_CPU_HIGH_SPEED) ? hi_freq : low_freq;
+-      freqs.cpu = CPUFREQ_ALL_CPUS;
++      freqs.cpu = smp_processor_id();
+       cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+       if (cpufreq_uses_pmu)
+--- linux-2.6.0-test1/arch/ppc/platforms/residual.c    2003-06-14 12:18:00.000000000 -0700
++++ 25/arch/ppc/platforms/residual.c   2003-07-19 17:03:49.000000000 -0700
+@@ -36,7 +36,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/reboot.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
+ #include <linux/ioport.h>
+ #include <linux/pci.h>
+ #include <linux/ide.h>
+--- linux-2.6.0-test1/arch/s390/defconfig      2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/defconfig     2003-07-19 17:03:49.000000000 -0700
+@@ -20,6 +20,7 @@ CONFIG_SYSVIPC=y
+ CONFIG_SYSCTL=y
+ CONFIG_LOG_BUF_SHIFT=17
+ # CONFIG_EMBEDDED is not set
++# CONFIG_KALLSYMS is not set
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+@@ -169,7 +170,7 @@ CONFIG_IP_MULTICAST=y
+ # CONFIG_INET_AH is not set
+ # CONFIG_INET_ESP is not set
+ # CONFIG_INET_IPCOMP is not set
+-CONFIG_IPV6=m
++CONFIG_IPV6=y
+ # CONFIG_IPV6_PRIVACY is not set
+ # CONFIG_INET6_AH is not set
+ # CONFIG_INET6_ESP is not set
+@@ -180,7 +181,7 @@ CONFIG_IPV6=m
+ #
+ # SCTP Configuration (EXPERIMENTAL)
+ #
+-CONFIG_IPV6_SCTP__=m
++CONFIG_IPV6_SCTP__=y
+ # CONFIG_IP_SCTP is not set
+ # CONFIG_ATM is not set
+ # CONFIG_VLAN_8021Q is not set
+@@ -383,7 +384,6 @@ CONFIG_IBM_PARTITION=y
+ CONFIG_DEBUG_KERNEL=y
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_DEBUG_SLAB is not set
+-# CONFIG_KALLSYMS is not set
+ # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+ #
+--- linux-2.6.0-test1/arch/s390/kernel/compat_ioctl.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/compat_ioctl.c 2003-07-19 17:03:49.000000000 -0700
+@@ -23,7 +23,6 @@
+ #include <asm/types.h>
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/cdrom.h>
+ #include <linux/dm-ioctl.h>
+--- linux-2.6.0-test1/arch/s390/kernel/compat_linux.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/compat_linux.c 2003-07-19 17:03:49.000000000 -0700
+@@ -250,14 +250,14 @@ asmlinkage long sys32_getegid16(void)
+ static inline long get_tv32(struct timeval *o, struct compat_timeval *i)
+ {
+       return (!access_ok(VERIFY_READ, tv32, sizeof(*tv32)) ||
+-              (__get_user(o->tv_sec, &i->tv_sec) |
++              (__get_user(o->tv_sec, &i->tv_sec) ||
+                __get_user(o->tv_usec, &i->tv_usec)));
+ }
+ static inline long put_tv32(struct compat_timeval *o, struct timeval *i)
+ {
+       return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
+-              (__put_user(i->tv_sec, &o->tv_sec) |
++              (__put_user(i->tv_sec, &o->tv_sec) ||
+                __put_user(i->tv_usec, &o->tv_usec)));
+ }
+--- linux-2.6.0-test1/arch/s390/kernel/entry64.S       2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/entry64.S      2003-07-19 17:03:49.000000000 -0700
+@@ -637,6 +637,7 @@ io_sigpending:     
+ ext_int_handler:
+         SAVE_ALL __LC_EXT_OLD_PSW,0
+         GET_THREAD_INFO                # load pointer to task_struct to R9
++      brasl   %r14,do_extint
+       llgh    %r6,__LC_EXT_INT_CODE  # get interruption code
+       lgr     %r1,%r6                # calculate index = code & 0xff
+       nill    %r1,0xff
+--- linux-2.6.0-test1/arch/s390/kernel/entry.S 2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/entry.S        2003-07-19 17:03:49.000000000 -0700
+@@ -606,6 +606,8 @@ ext_int_handler:
+       SAVE_ALL_BASE
+         SAVE_ALL __LC_EXT_OLD_PSW,0
+         GET_THREAD_INFO                # load pointer to task_struct to R9
++      l       %r1,BASED(.Ldo_extint)
++      basr    %r14,%r1
+       lh      %r6,__LC_EXT_INT_CODE  # get interruption code
+       lr      %r1,%r6                # calculate index = code & 0xff
+       n       %r1,BASED(.Lc0xff)
+@@ -694,6 +696,7 @@ restart_go:
+  */
+ .Ls390_mcck:   .long  s390_do_machine_check
+ .Ldo_IRQ:      .long  do_IRQ
++.Ldo_extint:   .long  do_extint
+ .Ldo_signal:   .long  do_signal
+ .Ldo_softirq:  .long  do_softirq
+ .Lentry_base:  .long  entry_base
+--- linux-2.6.0-test1/arch/s390/kernel/s390_ext.c      2003-06-14 12:18:09.000000000 -0700
++++ 25/arch/s390/kernel/s390_ext.c     2003-07-19 17:03:49.000000000 -0700
+@@ -11,8 +11,11 @@
+ #include <linux/kernel.h>
+ #include <linux/slab.h>
+ #include <linux/errno.h>
++#include <linux/kernel_stat.h>
++
+ #include <asm/lowcore.h>
+ #include <asm/s390_ext.h>
++#include <asm/irq.h>
+ /*
+  * Simple hash strategy: index = code & 0xff;
+@@ -98,6 +101,11 @@ int unregister_early_external_interrupt(
+       return 0;
+ }
++void do_extint(void)
++{
++      kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++;
++}
++
+ EXPORT_SYMBOL(register_external_interrupt);
+ EXPORT_SYMBOL(unregister_external_interrupt);
+--- linux-2.6.0-test1/arch/s390/kernel/setup.c 2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/s390/kernel/setup.c        2003-07-19 17:04:07.000000000 -0700
+@@ -34,12 +34,15 @@
+ #include <linux/root_dev.h>
+ #include <linux/console.h>
+ #include <linux/seq_file.h>
++#include <linux/kernel_stat.h>
++
+ #include <asm/uaccess.h>
+ #include <asm/system.h>
+ #include <asm/smp.h>
+ #include <asm/mmu_context.h>
+ #include <asm/cpcmd.h>
+ #include <asm/lowcore.h>
++#include <asm/irq.h>
+ /*
+  * Machine setup..
+@@ -53,7 +56,7 @@ struct { unsigned long addr, size, type;
+ #define CHUNK_READ_WRITE 0
+ #define CHUNK_READ_ONLY 1
+ int cpus_initialized = 0;
+-unsigned long cpu_initialized = 0;
++static cpumask_t cpu_initialized;
+ volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
+ /*
+@@ -83,7 +86,7 @@ void __devinit cpu_init (void)
+         int nr = smp_processor_id();
+         int addr = hard_smp_processor_id();
+-        if (test_and_set_bit(nr,&cpu_initialized)) {
++        if (cpu_test_and_set(nr,cpu_initialized)) {
+                 printk("CPU#%d ALREADY INITIALIZED!!!!!!!!!\n", nr);
+                 for (;;) local_irq_enable();
+         }
+@@ -562,7 +565,7 @@ static int show_cpuinfo(struct seq_file 
+                              num_online_cpus(), loops_per_jiffy/(500000/HZ),
+                              (loops_per_jiffy/(5000/HZ))%100);
+       }
+-      if (cpu_online_map & (1 << n)) {
++      if (cpu_online(n)) {
+ #ifdef CONFIG_SMP
+               if (smp_processor_id() == n)
+                       cpuinfo = &S390_lowcore.cpu_data;
+@@ -600,3 +603,40 @@ struct seq_operations cpuinfo_op = {
+       .stop   = c_stop,
+       .show   = show_cpuinfo,
+ };
++
++/*
++ * show_interrupts is needed by /proc/interrupts.
++ */
++
++static const char *intrclass_names[] = {
++      "EXT",
++      "I/O",
++};
++
++int show_interrupts(struct seq_file *p, void *v)
++{
++        int i, j;
++      
++        seq_puts(p, "           ");
++      
++        for (j=0; j<NR_CPUS; j++)
++                if (cpu_online(j))
++                        seq_printf(p, "CPU%d       ",j);
++      
++        seq_putc(p, '\n');
++      
++        for (i = 0 ; i < NR_IRQS ; i++) {
++              seq_printf(p, "%s: ", intrclass_names[i]);
++#ifndef CONFIG_SMP
++              seq_printf(p, "%10u ", kstat_irqs(i));
++#else
++              for (j = 0; j < NR_CPUS; j++)
++                      if (cpu_online(j))
++                              seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
++#endif
++                seq_putc(p, '\n');
++              
++        }
++      
++        return 0;
++}
+--- linux-2.6.0-test1/arch/s390/kernel/smp.c   2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/s390/kernel/smp.c  2003-07-19 17:04:07.000000000 -0700
+@@ -51,8 +51,8 @@ struct _lowcore *lowcore_ptr[NR_CPUS];
+ cycles_t         cacheflush_time=0;
+ int              smp_threads_ready=0;      /* Set when the idlers are all forked. */
+-volatile unsigned long cpu_online_map;
+-volatile unsigned long cpu_possible_map;
++cpumask_t cpu_online_map;
++cpumask_t cpu_possible_map;
+ unsigned long    cache_decay_ticks = 0;
+ /*
+@@ -200,14 +200,14 @@ void smp_send_stop(void)
+ /*
+  * Reboot, halt and power_off routines for SMP.
+  */
+-static volatile unsigned long cpu_restart_map;
++static cpumask_t cpu_restart_map;
+ static void do_machine_restart(void * __unused)
+ {
+-      clear_bit(smp_processor_id(), &cpu_restart_map);
++      cpu_clear(smp_processor_id(), cpu_restart_map);
+       if (smp_processor_id() == 0) {
+               /* Wait for all other cpus to enter do_machine_restart. */
+-              while (cpu_restart_map != 0);
++              while (!cpus_empty(cpu_restart_map));
+               /* Store status of other cpus. */
+               do_store_status();
+               /*
+@@ -427,7 +427,7 @@ void __init smp_check_cpus(unsigned int 
+                 if (signal_processor(num_cpus, sigp_sense) ==
+                     sigp_not_operational)
+                         continue;
+-              set_bit(num_cpus, &cpu_possible_map);
++              cpu_set(num_cpus, cpu_possible_map);
+                 num_cpus++;
+         }
+         printk("Detected %d CPU's\n",(int) num_cpus);
+@@ -452,7 +452,7 @@ int __devinit start_secondary(void *cpuv
+       pfault_init();
+ #endif
+       /* Mark this cpu as online */
+-      set_bit(smp_processor_id(), &cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
+       /* Switch on interrupts */
+       local_irq_enable();
+         /* Print info about this processor */
+@@ -558,8 +558,8 @@ void __init smp_prepare_cpus(unsigned in
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
+-      set_bit(smp_processor_id(), &cpu_possible_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_possible_map);
+ }
+ void smp_cpus_done(unsigned int max_cpus)
+--- linux-2.6.0-test1/arch/s390/mm/init.c      2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/s390/mm/init.c     2003-07-19 17:03:49.000000000 -0700
+@@ -22,9 +22,6 @@
+ #include <linux/swap.h>
+ #include <linux/smp.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+-#endif
+ #include <linux/pagemap.h>
+ #include <linux/bootmem.h>
+--- linux-2.6.0-test1/arch/s390/mm/ioremap.c   2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/s390/mm/ioremap.c  2003-07-19 17:07:16.000000000 -0700
+@@ -83,7 +83,7 @@ static int remap_area_pages(unsigned lon
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(&init_mm, dir, address);
++              pmd = pmd_alloc_kernel(&init_mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+--- linux-2.6.0-test1/arch/sh/mm/init.c        2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/sh/mm/init.c       2003-07-19 17:03:49.000000000 -0700
+@@ -22,9 +22,6 @@
+ #include <linux/swap.h>
+ #include <linux/smp.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+-#endif
+ #include <linux/highmem.h>
+ #include <linux/bootmem.h>
+--- linux-2.6.0-test1/arch/sh/mm/ioremap.c     2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/sh/mm/ioremap.c    2003-07-19 17:07:16.000000000 -0700
+@@ -45,7 +45,7 @@ static inline void remap_area_pte(pte_t 
+       } while (address && (address < end));
+ }
+-static inline int remap_area_pmd(pmd_t * pmd, unsigned long address,
++static inline int remap_area_pmd(pgd_t *pgd, pmd_t * pmd, unsigned long address,
+       unsigned long size, unsigned long phys_addr, unsigned long flags)
+ {
+       unsigned long end;
+@@ -83,11 +83,11 @@ int remap_area_pages(unsigned long addre
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(&init_mm, dir, address);
++              pmd = pmd_alloc_map(&init_mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+-              if (remap_area_pmd(pmd, address, end - address,
++              if (remap_area_pmd(dir, pmd, address, end - address,
+                                       phys_addr + address, flags))
+                       break;
+               error = 0;
+--- linux-2.6.0-test1/arch/sparc64/kernel/devices.c    2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/sparc64/kernel/devices.c   2003-07-19 17:06:40.000000000 -0700
+@@ -31,6 +31,8 @@ int linux_num_cpus = 0;
+ extern void cpu_probe(void);
+ extern void central_probe(void);
++unsigned long cpu_hz;
++
+ void __init device_scan(void)
+ {
+       char node_str[128];
+@@ -68,6 +70,8 @@ void __init device_scan(void)
+                                       prom_getproperty(scan, "portid",
+                                                        (char *) &thismid, sizeof(thismid));
+                               }
++                              if (!cpu_hz)
++                                      cpu_hz = prom_getint(scan, "clock-frequency");
+                               linux_cpus[cpu_ctr].mid = thismid;
+                               printk("Found CPU %d (node=%08x,mid=%d)\n",
+                                      cpu_ctr, (unsigned) scan, thismid);
+--- linux-2.6.0-test1/arch/sparc64/kernel/head.S       2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/sparc64/kernel/head.S      2003-07-19 17:03:49.000000000 -0700
+@@ -66,7 +66,7 @@ sparc_ramdisk_image:
+ sparc_ramdisk_size:
+         .word   0
+         .xword  reboot_command
+-      .xword  bootstr_len
++      .xword  bootstr_info
+       .word   _end
+       /* We must be careful, 32-bit OpenBOOT will get confused if it
+@@ -740,8 +740,9 @@ swapper_pg_dir:
+       .data
+       .align  8
+-      .globl  prom_tba
++      .globl  prom_tba, tlb_type
+ prom_tba:     .xword  0
++tlb_type:     .word   0       /* Must NOT end up in BSS */
+       .section        ".fixup",#alloc,#execinstr
+       .globl  __ret_efault
+ __ret_efault:
+--- linux-2.6.0-test1/arch/sparc64/kernel/irq.c        2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/sparc64/kernel/irq.c       2003-07-19 17:04:07.000000000 -0700
+@@ -110,6 +110,10 @@ static void register_irq_proc (unsigned 
+               action->flags |= __irq_ino(irq) << 48;
+ #define get_ino_in_irqaction(action)  (action->flags >> 48)
++#if NR_CPUS > 64
++#error irqaction embedded smp affinity does not work with > 64 cpus, FIXME
++#endif
++
+ #define put_smpaff_in_irqaction(action, smpaff)       (action)->mask = (smpaff)
+ #define get_smpaff_in_irqaction(action)       ((action)->mask)
+@@ -658,11 +662,11 @@ static inline void redirect_intr(int cpu
+        *    Just Do It.
+        */
+       struct irqaction *ap = bp->irq_info;
+-      unsigned long cpu_mask = get_smpaff_in_irqaction(ap);
++      cpumask_t cpu_mask = { .mask[0] = get_smpaff_in_irqaction(ap) };
+       unsigned int buddy, ticks;
+-      cpu_mask &= cpu_online_map;
+-      if (cpu_mask == 0)
++      cpus_and(cpu_mask, cpu_mask, cpu_online_map);
++      if (cpus_empty(cpu_mask))
+               cpu_mask = cpu_online_map;
+       if (this_is_starfire != 0 ||
+@@ -677,7 +681,7 @@ static inline void redirect_intr(int cpu
+               buddy = 0;
+       ticks = 0;
+-      while ((cpu_mask & (1UL << buddy)) == 0) {
++      while (!cpu_isset(buddy, cpu_mask)) {
+               if (++buddy >= NR_CPUS)
+                       buddy = 0;
+               if (++ticks > NR_CPUS) {
+--- linux-2.6.0-test1/arch/sparc64/kernel/pci.c        2003-06-14 12:17:55.000000000 -0700
++++ 25/arch/sparc64/kernel/pci.c       2003-07-19 17:03:49.000000000 -0700
+@@ -804,25 +804,20 @@ int pci_mmap_page_range(struct pci_dev *
+ /* Return the domain nuber for this pci bus */
+-int pci_domain_nr(struct pci_bus *bus)
++int pci_domain_nr(struct pci_bus *pbus)
+ {
+-      struct pcidev_cookie *cookie = bus->sysdata;
++      struct pci_pbm_info *pbm = pbus->sysdata;
+       int ret;
+-      if (cookie != NULL) {
+-              struct pci_pbm_info *pbm = cookie->pbm;
+-              if (pbm == NULL || pbm->parent == NULL) {
+-                      ret = -ENXIO;
+-              } else {
+-                      struct pci_controller_info *p = pbm->parent;
+-
+-                      ret = p->index;
+-                      if (p->pbms_same_domain == 0)
+-                              ret = ((ret << 1) +
+-                                     ((pbm == &pbm->parent->pbm_B) ? 1 : 0));
+-              }
+-      } else {
++      if (pbm == NULL || pbm->parent == NULL) {
+               ret = -ENXIO;
++      } else {
++              struct pci_controller_info *p = pbm->parent;
++
++              ret = p->index;
++              if (p->pbms_same_domain == 0)
++                      ret = ((ret << 1) +
++                             ((pbm == &pbm->parent->pbm_B) ? 1 : 0));
+       }
+       return ret;
+--- linux-2.6.0-test1/arch/sparc64/kernel/setup.c      2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/sparc64/kernel/setup.c     2003-07-19 17:03:49.000000000 -0700
+@@ -24,7 +24,6 @@
+ #include <linux/kdev_t.h>
+ #include <linux/major.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/init.h>
+ #include <linux/inet.h>
+ #include <linux/console.h>
+--- linux-2.6.0-test1/arch/sparc64/kernel/smp.c        2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/sparc64/kernel/smp.c       2003-07-19 17:04:07.000000000 -0700
+@@ -46,12 +46,11 @@ cpuinfo_sparc cpu_data[NR_CPUS];
+ /* Please don't make this stuff initdata!!!  --DaveM */
+ static unsigned char boot_cpu_id;
+-atomic_t sparc64_num_cpus_online = ATOMIC_INIT(0);
+-unsigned long cpu_online_map = 0;
++cpumask_t cpu_online_map = CPU_MASK_NONE;
+ atomic_t sparc64_num_cpus_possible = ATOMIC_INIT(0);
+-unsigned long phys_cpu_present_map = 0;
+-static unsigned long smp_commenced_mask;
+-static unsigned long cpu_callout_map;
++cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
++static cpumask_t smp_commenced_mask;
++static cpumask_t cpu_callout_map;
+ void smp_info(struct seq_file *m)
+ {
+@@ -151,11 +150,10 @@ void __init smp_callin(void)
+       atomic_inc(&init_mm.mm_count);
+       current->active_mm = &init_mm;
+-      while (!test_bit(cpuid, &smp_commenced_mask))
++      while (!cpu_isset(cpuid, smp_commenced_mask))
+               membar("#LoadLoad");
+-      set_bit(cpuid, &cpu_online_map);
+-      atomic_inc(&sparc64_num_cpus_online);
++      cpu_set(cpuid, cpu_online_map);
+ }
+ void cpu_panic(void)
+@@ -334,7 +332,7 @@ static int __devinit smp_boot_one_cpu(un
+               if (linux_cpus[no].mid == cpu)
+                       break;
+       cpu_new_thread = p->thread_info;
+-      set_bit(cpu, &cpu_callout_map);
++      cpu_set(cpu, cpu_callout_map);
+       prom_startcpu(linux_cpus[no].prom_node, entry, cookie);
+       for (timeout = 0; timeout < 5000000; timeout++) {
+               if (callin_flag)
+@@ -346,7 +344,7 @@ static int __devinit smp_boot_one_cpu(un
+               ret = 0;
+       } else {
+               printk("Processor %d is stuck.\n", cpu);
+-              clear_bit(cpu, &cpu_callout_map);
++              cpu_clear(cpu, cpu_callout_map);
+               ret = -ENODEV;
+       }
+       cpu_new_thread = NULL;
+@@ -420,17 +418,17 @@ again:
+       }
+ }
+-static __inline__ void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, unsigned long mask)
++static __inline__ void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
+ {
+       u64 pstate;
+       int i;
+       __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
+       for (i = 0; i < NR_CPUS; i++) {
+-              if (mask & (1UL << i)) {
++              if (cpu_isset(i, mask)) {
+                       spitfire_xcall_helper(data0, data1, data2, pstate, i);
+-                      mask &= ~(1UL << i);
+-                      if (!mask)
++                      cpu_clear(i, mask);
++                      if (cpus_empty(mask))
+                               break;
+               }
+       }
+@@ -443,12 +441,12 @@ static __inline__ void spitfire_xcall_de
+ #if NR_CPUS > 32
+ #error Fixup cheetah_xcall_deliver Dave...
+ #endif
+-static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, unsigned long mask)
++static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
+ {
+       u64 pstate;
+       int nack_busy_id;
+-      if (!mask)
++      if (cpus_empty(mask))
+               return;
+       __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
+@@ -469,11 +467,11 @@ retry:
+       nack_busy_id = 0;
+       {
+-              unsigned long work_mask = mask;
++              cpumask_t work_mask = mask;
+               int i;
+               for (i = 0; i < NR_CPUS; i++) {
+-                      if (work_mask & (1UL << i)) {
++                      if (cpu_isset(i, work_mask)) {
+                               u64 target = (i << 14) | 0x70;
+                               target |= (nack_busy_id++ << 24);
+@@ -482,8 +480,8 @@ retry:
+                                       "membar #Sync\n\t"
+                                       : /* no outputs */
+                                       : "r" (target), "i" (ASI_INTR_W));
+-                              work_mask &= ~(1UL << i);
+-                              if (!work_mask)
++                              cpu_clear(i, work_mask);
++                              if (cpus_empty(work_mask))
+                                       break;
+                       }
+               }
+@@ -518,7 +516,7 @@ retry:
+                       printk("CPU[%d]: mondo stuckage result[%016lx]\n",
+                              smp_processor_id(), dispatch_stat);
+               } else {
+-                      unsigned long work_mask = mask;
++                      cpumask_t work_mask = mask;
+                       int i, this_busy_nack = 0;
+                       /* Delay some random time with interrupts enabled
+@@ -530,13 +528,13 @@ retry:
+                        * NACK us.
+                        */
+                       for (i = 0; i < NR_CPUS; i++) {
+-                              if (work_mask & (1UL << i)) {
++                              if (cpu_isset(i, work_mask)) {
+                                       if ((dispatch_stat &
+                                            (0x2 << this_busy_nack)) == 0)
+-                                              mask &= ~(1UL << i);
++                                              cpu_clear(i, mask);
+                                       this_busy_nack += 2;
+-                                      work_mask &= ~(1UL << i);
+-                                      if (!work_mask)
++                                      cpu_clear(i, work_mask);
++                                      if (cpus_empty(work_mask))
+                                               break;
+                               }
+                       }
+@@ -549,12 +547,12 @@ retry:
+ /* Send cross call to all processors mentioned in MASK
+  * except self.
+  */
+-static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, unsigned long mask)
++static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, cpumask_t mask)
+ {
+       u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff));
+-      mask &= cpu_online_map;
+-      mask &= ~(1UL<<smp_processor_id());
++      cpus_and(mask, mask, cpu_online_map);
++      cpu_clear(smp_processor_id(), mask);
+       if (tlb_type == spitfire)
+               spitfire_xcall_deliver(data0, data1, data2, mask);
+@@ -567,9 +565,10 @@ extern unsigned long xcall_sync_tick;
+ static void smp_start_sync_tick_client(int cpu)
+ {
++      cpumask_t mask = cpumask_of_cpu(cpu);
++
+       smp_cross_call_masked(&xcall_sync_tick,
+-                            0, 0, 0,
+-                            (1UL << cpu));
++                            0, 0, 0, mask);
+ }
+ /* Send cross call to all processors except self. */
+@@ -685,14 +684,14 @@ static __inline__ void __local_flush_dca
+ void smp_flush_dcache_page_impl(struct page *page, int cpu)
+ {
+-      unsigned long mask = 1UL << cpu;
++      cpumask_t mask = cpumask_of_cpu(cpu);
+ #ifdef CONFIG_DEBUG_DCFLUSH
+       atomic_inc(&dcpage_flushes);
+ #endif
+       if (cpu == smp_processor_id()) {
+               __local_flush_dcache_page(page);
+-      } else if ((cpu_online_map & mask) != 0) {
++      } else if (cpu_online(cpu)) {
+               u64 data0;
+               if (tlb_type == spitfire) {
+@@ -719,13 +718,14 @@ void smp_flush_dcache_page_impl(struct p
+ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
+ {
+-      unsigned long mask = cpu_online_map & ~(1UL << smp_processor_id());
++      cpumask_t mask = cpu_online_map;
++      cpu_clear(smp_processor_id(), mask);
+       u64 data0;
+ #ifdef CONFIG_DEBUG_DCFLUSH
+       atomic_inc(&dcpage_flushes);
+ #endif
+-      if (mask == 0UL)
++      if (cpus_empty(mask))
+               goto flush_self;
+       if (tlb_type == spitfire) {
+               data0 = ((u64)&xcall_flush_dcache_page_spitfire);
+@@ -750,9 +750,9 @@ void flush_dcache_page_all(struct mm_str
+ void smp_receive_signal(int cpu)
+ {
+-      unsigned long mask = 1UL << cpu;
++      cpumask_t mask = cpumask_of_cpu(cpu);
+-      if ((cpu_online_map & mask) != 0) {
++      if (cpu_online(cpu)) {
+               u64 data0 = (((u64)&xcall_receive_signal) & 0xffffffff);
+               if (tlb_type == spitfire)
+@@ -854,7 +854,7 @@ void smp_flush_tlb_mm(struct mm_struct *
+               if (atomic_read(&mm->mm_users) == 1) {
+                       /* See smp_flush_tlb_page for info about this. */
+-                      mm->cpu_vm_mask = (1UL << cpu);
++                      mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+                       goto local_flush_and_out;
+               }
+@@ -877,7 +877,7 @@ void smp_flush_tlb_range(struct mm_struc
+       end    = PAGE_ALIGN(end);
+       if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) {
+-              mm->cpu_vm_mask = (1UL << cpu);
++              mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+               goto local_flush_and_out;
+       }
+@@ -921,14 +921,16 @@ void smp_flush_tlb_page(struct mm_struct
+                        * is almost certain that all TLB entries for this
+                        * context will be replaced by the time that happens.
+                        */
+-                      mm->cpu_vm_mask = (1UL << cpu);
++                      mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+                       goto local_flush_and_out;
+               } else {
++                      cpumask_t this_cpu_mask = cpumask_of_cpu(cpu);
++
+                       /* By virtue of running under the mm->page_table_lock,
+                        * and mmu_context.h:switch_mm doing the same, the
+                        * following operation is safe.
+                        */
+-                      if (mm->cpu_vm_mask == (1UL << cpu))
++                      if (cpus_equal(mm->cpu_vm_mask, this_cpu_mask))
+                               goto local_flush_and_out;
+               }
+@@ -939,7 +941,7 @@ void smp_flush_tlb_page(struct mm_struct
+               smp_cross_call_masked(&xcall_flush_tlb_page,
+                                     ctx, page, 0,
+                                     mm->cpu_vm_mask);
+-              if (!(mm->cpu_vm_mask & (1UL << cpu)))
++              if (!cpu_isset(cpu, mm->cpu_vm_mask))
+                       return;
+       local_flush_and_out:
+@@ -1122,8 +1124,7 @@ void __init smp_tick_init(void)
+               prom_halt();
+       }
+-      atomic_inc(&sparc64_num_cpus_online);
+-      set_bit(boot_cpu_id, &cpu_online_map);
++      cpu_set(boot_cpu_id, cpu_online_map);
+       prom_cpu_nodes[boot_cpu_id] = linux_cpus[0].prom_node;
+       prof_counter(boot_cpu_id) = prof_multiplier(boot_cpu_id) = 1;
+ }
+@@ -1241,16 +1242,14 @@ void __init smp_prepare_cpus(unsigned in
+       for (i = 0; i < linux_num_cpus; i++) {
+               if (linux_cpus[i].mid < max_cpus) {
+-                      set_bit(linux_cpus[i].mid,
+-                              &phys_cpu_present_map);
++                      cpu_set(linux_cpus[i].mid, phys_cpu_present_map);
+                       atomic_inc(&sparc64_num_cpus_possible);
+               }
+       }
+       if (atomic_read(&sparc64_num_cpus_possible) > max_cpus) {
+               for (i = linux_num_cpus - 1; i >= 0; i--) {
+                       if (linux_cpus[i].mid != boot_cpu_id) {
+-                              clear_bit(linux_cpus[i].mid,
+-                                        &phys_cpu_present_map);
++                              cpu_clear(linux_cpus[i].mid, phys_cpu_present_map);
+                               atomic_dec(&sparc64_num_cpus_possible);
+                               if (atomic_read(&sparc64_num_cpus_possible) <= max_cpus)
+                                       break;
+@@ -1263,8 +1262,8 @@ void __init smp_prepare_cpus(unsigned in
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
+-      set_bit(smp_processor_id(), &phys_cpu_present_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
++      cpu_set(smp_processor_id(), phys_cpu_present_map);
+ }
+ int __devinit __cpu_up(unsigned int cpu)
+@@ -1272,10 +1271,10 @@ int __devinit __cpu_up(unsigned int cpu)
+       int ret = smp_boot_one_cpu(cpu);
+       if (!ret) {
+-              set_bit(cpu, &smp_commenced_mask);
+-              while (!test_bit(cpu, &cpu_online_map))
++              cpu_set(cpu, smp_commenced_mask);
++              while (!cpu_isset(cpu, cpu_online_map))
+                       mb();
+-              if (!test_bit(cpu, &cpu_online_map)) {
++              if (!cpu_isset(cpu, cpu_online_map)) {
+                       ret = -ENODEV;
+               } else {
+                       smp_synchronize_one_tick(cpu);
+--- linux-2.6.0-test1/arch/sparc64/kernel/sparc64_ksyms.c      2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/sparc64/kernel/sparc64_ksyms.c     2003-07-19 17:04:07.000000000 -0700
+@@ -147,7 +147,6 @@ EXPORT_SYMBOL(cpu_data);
+ /* CPU online map and active count.  */
+ EXPORT_SYMBOL(cpu_online_map);
+-EXPORT_SYMBOL(sparc64_num_cpus_online);
+ EXPORT_SYMBOL(phys_cpu_present_map);
+ EXPORT_SYMBOL(sparc64_num_cpus_possible);
+@@ -176,6 +175,8 @@ EXPORT_SYMBOL(up);
+ /* Atomic counter implementation. */
+ EXPORT_SYMBOL(__atomic_add);
+ EXPORT_SYMBOL(__atomic_sub);
++EXPORT_SYMBOL(__atomic64_add);
++EXPORT_SYMBOL(__atomic64_sub);
+ #ifdef CONFIG_SMP
+ EXPORT_SYMBOL(atomic_dec_and_lock);
+ #endif
+--- linux-2.6.0-test1/arch/sparc64/kernel/time.c       2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/sparc64/kernel/time.c      2003-07-19 17:03:49.000000000 -0700
+@@ -41,6 +41,7 @@
+ #include <asm/isa.h>
+ #include <asm/starfire.h>
+ #include <asm/smp.h>
++#include <asm/sections.h>
+ spinlock_t mostek_lock = SPIN_LOCK_UNLOCKED;
+ spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
+@@ -449,7 +450,6 @@ void sparc64_do_profile(struct pt_regs *
+               return;
+       {
+-              extern int _stext;
+               extern int rwlock_impl_begin, rwlock_impl_end;
+               extern int atomic_impl_begin, atomic_impl_end;
+               extern int __memcpy_begin, __memcpy_end;
+@@ -468,7 +468,7 @@ void sparc64_do_profile(struct pt_regs *
+                    pc < (unsigned long) &__bitops_end))
+                       pc = o7;
+-              pc -= (unsigned long) &_stext;
++              pc -= (unsigned long) _stext;
+               pc >>= prof_shift;
+               if(pc >= prof_len)
+--- linux-2.6.0-test1/arch/sparc64/kernel/us2e_cpufreq.c       2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/sparc64/kernel/us2e_cpufreq.c      2003-07-19 17:04:07.000000000 -0700
+@@ -232,15 +232,16 @@ static unsigned long estar_to_divisor(un
+ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
+ {
+-      unsigned long new_bits, new_freq, cpus_allowed;
++      unsigned long new_bits, new_freq;
+       unsigned long clock_tick, divisor, old_divisor, estar;
++      cpumask_t cpus_allowed;
+       struct cpufreq_freqs freqs;
+       if (!cpu_online(cpu))
+               return;
+       cpus_allowed = current->cpus_allowed;
+-      set_cpus_allowed(current, (1UL << cpu));
++      set_cpus_allowed(current, cpumask_of_cpu(cpu));
+       new_freq = clock_tick = sparc64_get_clock_tick(cpu);
+       new_bits = index_to_estar_mode(index);
+--- linux-2.6.0-test1/arch/sparc64/kernel/us3_cpufreq.c        2003-06-14 12:17:56.000000000 -0700
++++ 25/arch/sparc64/kernel/us3_cpufreq.c       2003-07-19 17:04:07.000000000 -0700
+@@ -78,14 +78,15 @@ static unsigned long get_current_freq(un
+ static void us3_set_cpu_divider_index(unsigned int cpu, unsigned int index)
+ {
+-      unsigned long new_bits, new_freq, reg, cpus_allowed;
++      unsigned long new_bits, new_freq, reg;
++      cpumask_t cpus_allowed;
+       struct cpufreq_freqs freqs;
+       if (!cpu_online(cpu))
+               return;
+       cpus_allowed = current->cpus_allowed;
+-      set_cpus_allowed(current, (1UL << cpu));
++      set_cpus_allowed(current, cpumask_of_cpu(cpu));
+       new_freq = sparc64_get_clock_tick(cpu);
+       switch (index) {
+--- linux-2.6.0-test1/arch/sparc64/lib/atomic.S        2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/sparc64/lib/atomic.S       2003-07-19 17:03:49.000000000 -0700
+@@ -33,4 +33,27 @@ __atomic_sub: /* %o0 = increment, %o1 = 
+        membar #StoreLoad | #StoreStore
+       retl
+        sub    %g7, %o0, %o0
++
++      .globl  __atomic64_add
++__atomic64_add: /* %o0 = increment, %o1 = atomic_ptr */
++      ldx     [%o1], %g5
++      add     %g5, %o0, %g7
++      casx    [%o1], %g5, %g7
++      cmp     %g5, %g7
++      bne,pn  %xcc, __atomic64_add
++       membar #StoreLoad | #StoreStore
++      retl
++       add    %g7, %o0, %o0
++
++      .globl  __atomic64_sub
++__atomic64_sub: /* %o0 = increment, %o1 = atomic_ptr */
++      ldx     [%o1], %g5
++      sub     %g5, %o0, %g7
++      casx    [%o1], %g5, %g7
++      cmp     %g5, %g7
++      bne,pn  %xcc, __atomic64_sub
++       membar #StoreLoad | #StoreStore
++      retl
++       sub    %g7, %o0, %o0
++
+ atomic_impl_end:
+--- linux-2.6.0-test1/arch/sparc64/lib/rwlock.S        2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/sparc64/lib/rwlock.S       2003-07-19 17:06:40.000000000 -0700
+@@ -63,5 +63,33 @@ __write_lock: /* %o0 = lock_ptr */
+       be,pt           %icc, 99b
+        membar         #StoreLoad | #StoreStore
+       ba,a,pt         %xcc, 1b
++
++      .globl  __read_trylock
++__read_trylock: /* %o0 = lock_ptr */
++      ldsw            [%o0], %g5
++      brlz,pn         %g5, 100f
++       add            %g5, 1, %g7
++      cas             [%o0], %g5, %g7
++      cmp             %g5, %g7
++      bne,pn          %icc, __read_trylock
++       membar         #StoreLoad | #StoreStore
++      retl
++       mov            1, %o0
++
++      .globl          __write_trylock
++__write_trylock: /* %o0 = lock_ptr */
++      sethi           %hi(0x80000000), %g2
++1:    lduw            [%o0], %g5
++4:    brnz,pn         %g5, 100f
++       or             %g5, %g2, %g7
++      cas             [%o0], %g5, %g7
++      cmp             %g5, %g7
++      bne,pn          %icc, 1b
++       membar         #StoreLoad | #StoreStore
++      retl
++       mov            1, %o0
++100:  retl
++       mov            0, %o0
++
+ rwlock_impl_end:
+--- linux-2.6.0-test1/arch/sparc64/mm/fault.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/sparc64/mm/fault.c 2003-07-19 17:03:49.000000000 -0700
+@@ -26,6 +26,7 @@
+ #include <asm/uaccess.h>
+ #include <asm/asi.h>
+ #include <asm/lsu.h>
++#include <asm/sections.h>
+ #define ELEMENTS(arr) (sizeof (arr)/sizeof (arr[0]))
+@@ -320,10 +321,9 @@ asmlinkage void do_sparc64_fault(struct 
+       if (regs->tstate & TSTATE_PRIV) {
+               unsigned long tpc = regs->tpc;
+-              extern unsigned int _etext;
+               /* Sanity check the PC. */
+-              if ((tpc >= KERNBASE && tpc < (unsigned long) &_etext) ||
++              if ((tpc >= KERNBASE && tpc < (unsigned long) _etext) ||
+                   (tpc >= MODULES_VADDR && tpc < MODULES_END)) {
+                       /* Valid, no problems... */
+               } else {
+--- linux-2.6.0-test1/arch/sparc64/mm/generic.c        2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/sparc64/mm/generic.c       2003-07-19 17:07:16.000000000 -0700
+@@ -85,7 +85,7 @@ static inline void io_remap_pte_range(pt
+       } while (address < end);
+ }
+-static inline int io_remap_pmd_range(pmd_t * pmd, unsigned long address, unsigned long size,
++static inline int io_remap_pmd_range(pgd_t *pgd, pmd_t * pmd, unsigned long address, unsigned long size,
+       unsigned long offset, pgprot_t prot, int space)
+ {
+       unsigned long end;
+@@ -96,7 +96,7 @@ static inline int io_remap_pmd_range(pmd
+               end = PGDIR_SIZE;
+       offset -= address;
+       do {
+-              pte_t * pte = pte_alloc_map(current->mm, pmd, address);
++              pte_t * pte = pte_alloc_map(current->mm, pgd, &pmd, address);
+               if (!pte)
+                       return -ENOMEM;
+               io_remap_pte_range(pte, address, end - address, address + offset, prot, space);
+@@ -122,11 +122,11 @@ int io_remap_page_range(struct vm_area_s
+       spin_lock(&mm->page_table_lock);
+       while (from < end) {
+-              pmd_t *pmd = pmd_alloc(current->mm, dir, from);
++              pmd_t *pmd = pmd_alloc_map(current->mm, dir, from);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+-              error = io_remap_pmd_range(pmd, from, end - from, offset + from, prot, space);
++              error = io_remap_pmd_range(pgd, pmd, from, end - from, offset + from, prot, space);
+               if (error)
+                       break;
+               from = (from + PGDIR_SIZE) & PGDIR_MASK;
+--- linux-2.6.0-test1/arch/sparc64/mm/hugetlbpage.c    2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/sparc64/mm/hugetlbpage.c   2003-07-19 17:07:16.000000000 -0700
+@@ -107,9 +107,11 @@ static pte_t *huge_pte_alloc_map(struct 
+       pgd = pgd_offset(mm, addr);
+       if (pgd) {
+-              pmd = pmd_alloc(mm, pgd, addr);
+-              if (pmd)
+-                      pte = pte_alloc_map(mm, pmd, addr);
++              pmd = pmd_alloc_map(mm, pgd, addr);
++              if (pmd) {
++                      pte = pte_alloc_map(mm, pgd, &pmd, addr);
++                      pmd_unmap(pmd);
++              }
+       }
+       return pte;
+ }
+@@ -122,9 +124,11 @@ static pte_t *huge_pte_offset_map(struct
+       pgd = pgd_offset(mm, addr);
+       if (pgd) {
+-              pmd = pmd_offset(pgd, addr);
+-              if (pmd)
++              pmd = pmd_offset_map(pgd, addr);
++              if (pmd) {
+                       pte = pte_offset_map(pmd, addr);
++                      pmd_unmap(pmd);
++              }
+       }
+       return pte;
+ }
+--- linux-2.6.0-test1/arch/sparc64/mm/init.c   2003-06-14 12:18:07.000000000 -0700
++++ 25/arch/sparc64/mm/init.c  2003-07-19 17:03:49.000000000 -0700
+@@ -35,6 +35,7 @@
+ #include <asm/starfire.h>
+ #include <asm/tlb.h>
+ #include <asm/spitfire.h>
++#include <asm/sections.h>
+ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
+@@ -48,16 +49,14 @@ unsigned long *sparc64_valid_addr_bitmap
+ unsigned long phys_base;
+ unsigned long pfn_base;
+-enum ultra_tlb_layout tlb_type = spitfire;
+-
+ /* get_new_mmu_context() uses "cache + 1".  */
+ spinlock_t ctx_alloc_lock = SPIN_LOCK_UNLOCKED;
+ unsigned long tlb_context_cache = CTX_FIRST_VERSION - 1;
+ #define CTX_BMAP_SLOTS (1UL << (CTX_VERSION_SHIFT - 6))
+ unsigned long mmu_context_bmap[CTX_BMAP_SLOTS];
+-/* References to section boundaries */
+-extern char __init_begin, __init_end, _start, _end, etext, edata;
++/* References to special section boundaries */
++extern char  _start[], _end[];
+ /* Initial ramdisk setup */
+ extern unsigned int sparc_ramdisk_image;
+@@ -1333,7 +1332,7 @@ unsigned long __init bootmem_init(unsign
+        * image.  The kernel is hard mapped below PAGE_OFFSET in a
+        * 4MB locked TLB translation.
+        */
+-      start_pfn  = PAGE_ALIGN((unsigned long) &_end) -
++      start_pfn  = PAGE_ALIGN((unsigned long) _end) -
+               ((unsigned long) KERNBASE);
+       /* Adjust up to the physical address where the kernel begins. */
+@@ -1349,7 +1348,7 @@ unsigned long __init bootmem_init(unsign
+ #ifdef CONFIG_BLK_DEV_INITRD
+       /* Now have to check initial ramdisk, so that bootmap does not overwrite it */
+       if (sparc_ramdisk_image) {
+-              if (sparc_ramdisk_image >= (unsigned long)&_end - 2 * PAGE_SIZE)
++              if (sparc_ramdisk_image >= (unsigned long)_end - 2 * PAGE_SIZE)
+                       sparc_ramdisk_image -= KERNBASE;
+               initrd_start = sparc_ramdisk_image + phys_base;
+               initrd_end = initrd_start + sparc_ramdisk_size;
+@@ -1426,7 +1425,7 @@ void __init paging_init(void)
+       set_bit(0, mmu_context_bmap);
+-      real_end = (unsigned long)&_end;
++      real_end = (unsigned long)_end;
+       if ((real_end > ((unsigned long)KERNBASE + 0x400000)))
+               bigkernel = 1;
+ #ifdef CONFIG_BLK_DEV_INITRD
+@@ -1718,7 +1717,7 @@ void __init mem_init(void)
+       memset(sparc64_valid_addr_bitmap, 0, i << 3);
+       addr = PAGE_OFFSET + phys_base;
+-      last = PAGE_ALIGN((unsigned long)&_end) -
++      last = PAGE_ALIGN((unsigned long)_end) -
+               ((unsigned long) KERNBASE);
+       last += PAGE_OFFSET + phys_base;
+       while (addr < last) {
+@@ -1745,11 +1744,11 @@ void __init mem_init(void)
+       SetPageReserved(mem_map_zero);
+       clear_page(page_address(mem_map_zero));
+-      codepages = (((unsigned long) &etext) - ((unsigned long)&_start));
++      codepages = (((unsigned long) _etext) - ((unsigned long) _start));
+       codepages = PAGE_ALIGN(codepages) >> PAGE_SHIFT;
+-      datapages = (((unsigned long) &edata) - ((unsigned long)&etext));
++      datapages = (((unsigned long) _edata) - ((unsigned long) _etext));
+       datapages = PAGE_ALIGN(datapages) >> PAGE_SHIFT;
+-      initpages = (((unsigned long) &__init_end) - ((unsigned long) &__init_begin));
++      initpages = (((unsigned long) __init_end) - ((unsigned long) __init_begin));
+       initpages = PAGE_ALIGN(initpages) >> PAGE_SHIFT;
+ #ifndef CONFIG_SMP
+@@ -1812,8 +1811,8 @@ void free_initmem (void)
+       /*
+        * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes.
+        */
+-      addr = PAGE_ALIGN((unsigned long)(&__init_begin));
+-      initend = (unsigned long)(&__init_end) & PAGE_MASK;
++      addr = PAGE_ALIGN((unsigned long)(__init_begin));
++      initend = (unsigned long)(__init_end) & PAGE_MASK;
+       for (; addr < initend; addr += PAGE_SIZE) {
+               unsigned long page;
+               struct page *p;
+--- linux-2.6.0-test1/arch/sparc64/prom/bootstr.c      2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/sparc64/prom/bootstr.c     2003-07-19 17:03:49.000000000 -0700
+@@ -15,16 +15,22 @@
+  */
+ #define BARG_LEN  256
+-int bootstr_len = BARG_LEN;
+-static int bootstr_valid = 0;
+-static char bootstr_buf[BARG_LEN] = { 0 };
++struct {
++      int bootstr_len;
++      int bootstr_valid;
++      char bootstr_buf[BARG_LEN];
++} bootstr_info = {
++      .bootstr_len = BARG_LEN,
++};
+ char * __init
+ prom_getbootargs(void)
+ {
+       /* This check saves us from a panic when bootfd patches args. */
+-      if (bootstr_valid) return bootstr_buf;
+-      prom_getstring(prom_chosen_node, "bootargs", bootstr_buf, BARG_LEN);
+-      bootstr_valid = 1;
+-      return bootstr_buf;
++      if (bootstr_info.bootstr_valid)
++              return bootstr_info.bootstr_buf;
++      prom_getstring(prom_chosen_node, "bootargs",
++                     bootstr_info.bootstr_buf, BARG_LEN);
++      bootstr_info.bootstr_valid = 1;
++      return bootstr_info.bootstr_buf;
+ }
+--- linux-2.6.0-test1/arch/sparc/kernel/process.c      2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/sparc/kernel/process.c     2003-07-19 17:03:49.000000000 -0700
+@@ -590,16 +590,20 @@ int dump_fpu (struct pt_regs * regs, elf
+               put_psr(get_psr() | PSR_EF);
+               fpsave(&current->thread.float_regs[0], &current->thread.fsr,
+                      &current->thread.fpqueue[0], &current->thread.fpqdepth);
+-              regs->psr &= ~(PSR_EF);
+-              current->flags &= ~(PF_USEDFPU);
++              if (regs != NULL) {
++                      regs->psr &= ~(PSR_EF);
++                      current->flags &= ~(PF_USEDFPU);
++              }
+       }
+ #else
+       if (current == last_task_used_math) {
+               put_psr(get_psr() | PSR_EF);
+               fpsave(&current->thread.float_regs[0], &current->thread.fsr,
+                      &current->thread.fpqueue[0], &current->thread.fpqdepth);
+-              last_task_used_math = 0;
+-              regs->psr &= ~(PSR_EF);
++              if (regs != NULL) {
++                      regs->psr &= ~(PSR_EF);
++                      last_task_used_math = 0;
++              }
+       }
+ #endif
+       memcpy(&fpregs->pr_fr.pr_regs[0],
+--- linux-2.6.0-test1/arch/sparc/kernel/setup.c        2003-06-14 12:17:56.000000000 -0700
++++ 25/arch/sparc/kernel/setup.c       2003-07-19 17:03:49.000000000 -0700
+@@ -25,7 +25,6 @@
+ #include <linux/kdev_t.h>
+ #include <linux/major.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/console.h>
+--- linux-2.6.0-test1/arch/sparc/mm/generic.c  2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/sparc/mm/generic.c 2003-07-19 17:07:16.000000000 -0700
+@@ -67,7 +67,7 @@ static inline void io_remap_pte_range(pt
+       } while (address < end);
+ }
+-static inline int io_remap_pmd_range(pmd_t * pmd, unsigned long address, unsigned long size,
++static inline int io_remap_pmd_range(pgd_t *pgd, pmd_t * pmd, unsigned long address, unsigned long size,
+       unsigned long offset, pgprot_t prot, int space)
+ {
+       unsigned long end;
+@@ -78,7 +78,7 @@ static inline int io_remap_pmd_range(pmd
+               end = PGDIR_SIZE;
+       offset -= address;
+       do {
+-              pte_t * pte = pte_alloc_map(current->mm, pmd, address);
++              pte_t * pte = pte_alloc_map(current->mm, pgd, &pmd, address);
+               if (!pte)
+                       return -ENOMEM;
+               io_remap_pte_range(pte, address, end - address, address + offset, prot, space);
+@@ -103,11 +103,11 @@ int io_remap_page_range(struct vm_area_s
+       spin_lock(&mm->page_table_lock);
+       while (from < end) {
+-              pmd_t *pmd = pmd_alloc(current->mm, dir, from);
++              pmd_t *pmd = pmd_alloc_map(current->mm, dir, from);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+-              error = io_remap_pmd_range(pmd, from, end - from, offset + from, prot, space);
++              error = io_remap_pmd_range(pgd, pmd, from, end - from, offset + from, prot, space);
+               if (error)
+                       break;
+               from = (from + PGDIR_SIZE) & PGDIR_MASK;
+--- linux-2.6.0-test1/arch/sparc/mm/srmmu.c    2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/sparc/mm/srmmu.c   2003-07-19 17:07:16.000000000 -0700
+@@ -15,7 +15,6 @@
+ #include <linux/vmalloc.h>
+ #include <linux/pagemap.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
+ #include <linux/spinlock.h>
+ #include <linux/bootmem.h>
+ #include <linux/fs.h>
+@@ -2188,7 +2187,7 @@ void __init ld_mmu_srmmu(void)
+       BTFIXUPSET_CALL(pte_pfn, srmmu_pte_pfn, BTFIXUPCALL_NORM);
+       BTFIXUPSET_CALL(pmd_page, srmmu_pmd_page, BTFIXUPCALL_NORM);
+-      BTFIXUPSET_CALL(pgd_page, srmmu_pgd_page, BTFIXUPCALL_NORM);
++      BTFIXUPSET_CALL(__pgd_page, srmmu_pgd_page, BTFIXUPCALL_NORM);
+       BTFIXUPSET_SETHI(none_mask, 0xF0000000);
+@@ -2220,7 +2219,7 @@ void __init ld_mmu_srmmu(void)
+       BTFIXUPSET_CALL(pte_alloc_one_kernel, srmmu_pte_alloc_one_kernel, BTFIXUPCALL_NORM);
+       BTFIXUPSET_CALL(pte_alloc_one, srmmu_pte_alloc_one, BTFIXUPCALL_NORM);
+       BTFIXUPSET_CALL(free_pmd_fast, srmmu_pmd_free, BTFIXUPCALL_NORM);
+-      BTFIXUPSET_CALL(pmd_alloc_one, srmmu_pmd_alloc_one, BTFIXUPCALL_NORM);
++      BTFIXUPSET_CALL(__pmd_alloc_one, srmmu_pmd_alloc_one, BTFIXUPCALL_NORM);
+       BTFIXUPSET_CALL(free_pgd_fast, srmmu_free_pgd_fast, BTFIXUPCALL_NORM);
+       BTFIXUPSET_CALL(get_pgd_fast, srmmu_get_pgd_fast, BTFIXUPCALL_NORM);
+--- linux-2.6.0-test1/arch/sparc/mm/sun4c.c    2003-06-14 12:18:29.000000000 -0700
++++ 25/arch/sparc/mm/sun4c.c   2003-07-19 17:07:16.000000000 -0700
+@@ -2211,7 +2211,7 @@ void __init ld_mmu_sun4c(void)
+       BTFIXUPSET_CALL(pte_alloc_one_kernel, sun4c_pte_alloc_one_kernel, BTFIXUPCALL_NORM);
+       BTFIXUPSET_CALL(pte_alloc_one, sun4c_pte_alloc_one, BTFIXUPCALL_NORM);
+       BTFIXUPSET_CALL(free_pmd_fast, sun4c_free_pmd_fast, BTFIXUPCALL_NOP);
+-      BTFIXUPSET_CALL(pmd_alloc_one, sun4c_pmd_alloc_one, BTFIXUPCALL_RETO0);
++      BTFIXUPSET_CALL(__pmd_alloc_one, sun4c_pmd_alloc_one, BTFIXUPCALL_RETO0);
+       BTFIXUPSET_CALL(free_pgd_fast, sun4c_free_pgd_fast, BTFIXUPCALL_NORM);
+       BTFIXUPSET_CALL(get_pgd_fast, sun4c_get_pgd_fast, BTFIXUPCALL_NORM);
+@@ -2252,5 +2252,5 @@ void __init ld_mmu_sun4c(void)
+       /* These should _never_ get called with two level tables. */
+       BTFIXUPSET_CALL(pgd_set, sun4c_pgd_set, BTFIXUPCALL_NOP);
+-      BTFIXUPSET_CALL(pgd_page, sun4c_pgd_page, BTFIXUPCALL_RETO0);
++      BTFIXUPSET_CALL(__pgd_page, sun4c_pgd_page, BTFIXUPCALL_RETO0);
+ }
+--- linux-2.6.0-test1/arch/um/drivers/ubd_kern.c       2003-06-14 12:18:20.000000000 -0700
++++ 25/arch/um/drivers/ubd_kern.c      2003-07-19 17:03:49.000000000 -0700
+@@ -15,7 +15,6 @@
+ #include "linux/config.h"
+ #include "linux/module.h"
+-#include "linux/blk.h"
+ #include "linux/blkdev.h"
+ #include "linux/hdreg.h"
+ #include "linux/init.h"
+--- linux-2.6.0-test1/arch/um/kernel/irq.c     2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/um/kernel/irq.c    2003-07-19 17:04:07.000000000 -0700
+@@ -565,9 +565,9 @@ static struct proc_dir_entry * smp_affin
+ /* These are read and written as longs, so a read won't see a partial write
+  * even during a race.
+  */
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+@@ -578,10 +578,10 @@ static int irq_affinity_read_proc (char 
+ }
+ static unsigned int parse_hex_value (const char *buffer,
+-              unsigned long count, unsigned long *ret)
++              unsigned long count, cpumask_t *ret)
+ {
+       unsigned char hexnum [HEX_DIGITS];
+-      unsigned long value;
++      cpumask_t value = CPU_MASK_NONE;
+       int i;
+       if (!count)
+@@ -595,10 +595,9 @@ static unsigned int parse_hex_value (con
+        * Parse the first 8 characters as a hex string, any non-hex char
+        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+        */
+-      value = 0;
+       for (i = 0; i < count; i++) {
+-              unsigned int c = hexnum[i];
++              unsigned int k, c = hexnum[i];
+               switch (c) {
+                       case '0' ... '9': c -= '0'; break;
+@@ -607,7 +606,10 @@ static unsigned int parse_hex_value (con
+               default:
+                       goto out;
+               }
+-              value = (value << 4) | c;
++              cpus_shift_left(value, value, 16);
++              for (k = 0; k < 4; ++k)
++                      if (c & (1 << k))
++                              cpu_set(k, value);
+       }
+ out:
+       *ret = value;
+@@ -618,7 +620,7 @@ static int irq_affinity_write_proc (stru
+                                       unsigned long count, void *data)
+ {
+       int irq = (long) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t new_value, tmp;
+       if (!irq_desc[irq].handler->set_affinity)
+               return -EIO;
+@@ -631,7 +633,8 @@ static int irq_affinity_write_proc (stru
+        * way to make the system unusable accidentally :-) At least
+        * one online CPU still has to be targeted.
+        */
+-      if (!(new_value & cpu_online_map))
++      cpus_and(tmp, new_value, cpu_online_map);
++      if (cpus_empty(tmp))
+               return -EINVAL;
+ #endif
+@@ -644,17 +647,27 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data;
++      cpumask_t tmp, *mask = (cpumask_t *) data;
++      int k, len = 0;
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", *mask);
++      tmp = *mask;
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t *mask = (cpumask_t *)data, new_value;
++      unsigned long full_count = count, err;
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+@@ -693,7 +706,7 @@ static void register_irq_proc (unsigned 
+ }
+ /* Read and written as a long */
+-unsigned long prof_cpu_mask = -1;
++cpumask_t prof_cpu_mask = CPU_MASK_ALL;
+ void __init init_irq_proc (void)
+ {
+--- linux-2.6.0-test1/arch/um/kernel/skas/process_kern.c       2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/um/kernel/skas/process_kern.c      2003-07-19 17:04:07.000000000 -0700
+@@ -152,7 +152,7 @@ static int start_kernel_proc(void *unuse
+       cpu_tasks[0].pid = pid;
+       cpu_tasks[0].task = current;
+ #ifdef CONFIG_SMP
+-      cpu_online_map = 1;
++      cpu_online_map = cpumask_of_cpu(0);
+ #endif
+       start_kernel();
+       return(0);
+--- linux-2.6.0-test1/arch/um/kernel/smp.c     2003-06-14 12:18:03.000000000 -0700
++++ 25/arch/um/kernel/smp.c    2003-07-19 17:04:07.000000000 -0700
+@@ -5,9 +5,6 @@
+ #include "linux/config.h"
+-/* CPU online map, set by smp_boot_cpus */
+-unsigned long cpu_online_map = 1;
+-
+ #ifdef CONFIG_SMP
+ #include "linux/sched.h"
+@@ -24,6 +21,9 @@ unsigned long cpu_online_map = 1;
+ #include "irq_user.h"
+ #include "os.h"
++/* CPU online map, set by smp_boot_cpus */
++unsigned long cpu_online_map = cpumask_of_cpu(0);
++
+ /* Per CPU bogomips and other parameters
+  * The only piece used here is the ipi pipe, which is set before SMP is
+  * started and never changed.
+@@ -104,8 +104,8 @@ void smp_send_stop(void)
+       printk("done\n");
+ }
+-static unsigned long smp_commenced_mask;
+-static volatile unsigned long smp_callin_map = 0;
++static cpumask_t smp_commenced_mask;
++static cpumask_t smp_callin_map = CPU_MASK_NONE;
+ static int idle_proc(void *cpup)
+ {
+@@ -120,15 +120,15 @@ static int idle_proc(void *cpup)
+                    current->thread.mode.tt.extern_pid);
+  
+       wmb();
+-      if (test_and_set_bit(cpu, &smp_callin_map)) {
++      if (cpu_test_and_set(cpu, &smp_callin_map)) {
+               printk("huh, CPU#%d already present??\n", cpu);
+               BUG();
+       }
+-      while (!test_bit(cpu, &smp_commenced_mask))
++      while (!cpu_isset(cpu, &smp_commenced_mask))
+               cpu_relax();
+-      set_bit(cpu, &cpu_online_map);
++      cpu_set(cpu, cpu_online_map);
+       default_idle();
+       return(0);
+ }
+@@ -159,8 +159,8 @@ void smp_prepare_cpus(unsigned int maxcp
+       unsigned long waittime;
+       int err, cpu;
+-      set_bit(0, &cpu_online_map);
+-      set_bit(0, &smp_callin_map);
++      cpu_set(0, cpu_online_map);
++      cpu_set(0, smp_callin_map);
+       err = os_pipe(cpu_data[0].ipi_pipe, 1, 1);
+       if(err) panic("CPU#0 failed to create IPI pipe, errno = %d", -err);
+@@ -177,10 +177,10 @@ void smp_prepare_cpus(unsigned int maxcp
+               unhash_process(idle);
+               waittime = 200000000;
+-              while (waittime-- && !test_bit(cpu, &smp_callin_map))
++              while (waittime-- && !cpu_isset(cpu, smp_callin_map))
+                       cpu_relax();
+-              if (test_bit(cpu, &smp_callin_map))
++              if (cpu_isset(cpu, smp_callin_map))
+                       printk("done\n");
+               else printk("failed\n");
+       }
+@@ -188,13 +188,13 @@ void smp_prepare_cpus(unsigned int maxcp
+ void smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
+ }
+ int __cpu_up(unsigned int cpu)
+ {
+-      set_bit(cpu, &smp_commenced_mask);
+-      while (!test_bit(cpu, &cpu_online_map))
++      cpu_set(cpu, smp_commenced_mask);
++      while (!cpu_isset(cpu, cpu_online_map))
+               mb();
+       return(0);
+ }
+@@ -271,7 +271,7 @@ int smp_call_function(void (*_func)(void
+       for (i=0;i<NR_CPUS;i++)
+               if((i != current->thread_info->cpu) && 
+-                 test_bit(i, &cpu_online_map))
++                 cpu_isset(i, cpu_online_map))
+                       write(cpu_data[i].ipi_pipe[1], "C", 1);
+       while (atomic_read(&scf_started) != cpus)
+--- linux-2.6.0-test1/arch/um/kernel/tt/process_kern.c 2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/um/kernel/tt/process_kern.c        2003-07-19 17:04:07.000000000 -0700
+@@ -419,7 +419,7 @@ static int start_kernel_proc(void *unuse
+       cpu_tasks[0].pid = pid;
+       cpu_tasks[0].task = current;
+ #ifdef CONFIG_SMP
+-      cpu_online_map = 1;
++      cpu_online_map = cpumask_of_cpu(0);
+ #endif
+       if(debug) os_stop_process(pid);
+       start_kernel();
+--- linux-2.6.0-test1/arch/um/kernel/um_arch.c 2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/um/kernel/um_arch.c        2003-07-19 17:04:07.000000000 -0700
+@@ -57,7 +57,7 @@ static int show_cpuinfo(struct seq_file 
+       index = (struct cpuinfo_um *)v - cpu_data;
+ #ifdef CONFIG_SMP
+-      if (!(cpu_online_map & (1 << index)))
++      if (!cpu_online(index))
+               return 0;
+ #endif
+--- linux-2.6.0-test1/arch/v850/Kconfig        2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/v850/Kconfig       2003-07-19 17:03:49.000000000 -0700
+@@ -48,20 +48,24 @@ menu "Processor type and features"
+    choice
+         prompt "Platform"
+         default GDB
++      config V850E_SIM
++                   bool "GDB"
+       config RTE_CB_MA1
+                    bool "RTE-V850E/MA1-CB"
+       config RTE_CB_NB85E
+                    bool "RTE-V850E/NB85E-CB"
+-      config V850E_SIM
+-                   bool "GDB"
++      config RTE_CB_ME2
++                   bool "RTE-V850E/ME2-CB"
++      config V850E_AS85EP1
++                   bool "AS85EP1"
+       config V850E2_SIM85E2C
+                    bool "sim85e2c"
++      config V850E2_SIM85E2S
++                   bool "sim85e2s"
+       config V850E2_FPGA85E2C
+                    bool "NA85E2C-FPGA"
+       config V850E2_ANNA
+                    bool "Anna"
+-      config V850E_AS85EP1
+-                   bool "AS85EP1"
+    endchoice
+@@ -78,41 +82,32 @@ menu "Processor type and features"
+         bool
+         depends RTE_CB_MA1
+         default y
+-   # Similarly for the RTE-V850E/MA1-CB - V850E/TEG
++   # Similarly for the RTE-V850E/NB85E-CB - V850E/TEG
+    config V850E_TEG
+         bool
+         depends RTE_CB_NB85E
+         default y
+-
+-   # NB85E processor core
+-   config V850E_NB85E
++   # ... and the RTE-V850E/ME2-CB - V850E/ME2
++   config V850E_ME2
+         bool
+-        depends V850E_MA1 || V850E_TEG
++        depends RTE_CB_ME2
+         default y
+-   config V850E_MA1_HIGHRES_TIMER
+-        bool "High resolution timer support"
+-        depends V850E_MA1
+-
+-   #### V850E2 processor-specific config
++   #### sim85e2-specific config
+-   # V850E2 processors
+-   config V850E2
++   config V850E2_SIM85E2
+         bool
+-        depends V850E2_SIM85E2C || V850E2_FPGA85E2C || V850E2_ANNA
++        depends V850E2_SIM85E2C || V850E2_SIM85E2S
+         default y
+-   # Processors based on the NA85E2A core
+-   config V850E2_NA85E2A
+-        bool
+-        depends V850E2_ANNA
+-        default y
+-   # Processors based on the NA85E2C core
+-   config V850E2_NA85E2C
++   #### V850E2 processor-specific config
++
++   # V850E2 processors
++   config V850E2
+         bool
+-        depends V850E2_SIM85E2C || V850E2_FPGA85E2C
++        depends V850E2_SIM85E2 || V850E2_FPGA85E2C || V850E2_ANNA
+         default y
+@@ -121,7 +116,7 @@ menu "Processor type and features"
+    # Boards in the RTE-x-CB series
+    config RTE_CB
+         bool
+-        depends RTE_CB_MA1 || RTE_CB_NB85E
++        depends RTE_CB_MA1 || RTE_CB_NB85E || RTE_CB_ME2
+         default y
+    config RTE_CB_MULTI
+@@ -129,7 +124,7 @@ menu "Processor type and features"
+         # RTE_CB_NB85E can either have multi ROM support or not, but
+         # other platforms (currently only RTE_CB_MA1) require it.
+         prompt "Multi monitor ROM support" if RTE_CB_NB85E
+-        depends RTE_CB
++        depends RTE_CB_MA1 || RTE_CB_NB85E
+         default y
+    config RTE_CB_MULTI_DBTRAP
+@@ -156,14 +151,42 @@ menu "Processor type and features"
+    # The only PCI bus we support is on the RTE-MOTHER-A board
+    config PCI
+         bool
+-        default y if RTE_MB_A_PCI
++        default RTE_MB_A_PCI
++
++
++   #### Some feature-specific configs
++
++   # Everything except for the GDB simulator uses the same interrupt controller
++   config V850E_INTC
++        bool
++        default !V850E_SIM
++
++   # Everything except for the various simulators uses the "Timer D" unit
++   config V850E_TIMER_D
++        bool
++        default !V850E_SIM && !V850E2_SIM85E2
++
++   # Cache control used on some v850e1 processors
++   config V850E_CACHE
++          bool
++        default V850E_TEG || V850E_ME2
++
++   # Cache control used on v850e2 processors; I think this should
++   # actually apply to more, but currently only the SIM85E2S uses it
++   config V850E2_CACHE
++        bool
++        default V850E2_SIM85E2S
++
++   config NO_CACHE
++        bool
++        default !V850E_CACHE && !V850E2_CACHE
+    #### Misc config
+    config ROM_KERNEL
+         bool "Kernel in ROM"
+-        depends V850E2_ANNA || (RTE_CB && !RTE_CB_MULTI)
++        depends V850E2_ANNA || V850E_AS85EP1 || RTE_CB_ME2
+    # Some platforms pre-zero memory, in which case the kernel doesn't need to
+    config ZERO_BSS
+@@ -177,9 +200,12 @@ menu "Processor type and features"
+         int
+         default 8 if V850E2_SIM85E2C || V850E2_FPGA85E2C
++   config V850E_HIGHRES_TIMER
++        bool "High resolution timer support"
++        depends V850E_TIMER_D
+    config TIME_BOOTUP
+         bool "Time bootup"
+-        depends V850E_MA1_HIGHRES_TIMER
++        depends V850E_HIGHRES_TIMER
+    config RESET_GUARD
+         bool "Reset Guard"
+@@ -241,6 +267,7 @@ config KCORE_AOUT
+       default y
+ config KCORE_ELF
++      bool
+       default y
+ source "fs/Kconfig.binfmt"
+--- linux-2.6.0-test1/arch/v850/kernel/anna.c  2003-06-14 12:18:21.000000000 -0700
++++ 25/arch/v850/kernel/anna.c 2003-07-19 17:03:49.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * arch/v850/kernel/anna.c -- Anna V850E2 evaluation chip/board
+  *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -21,8 +21,8 @@
+ #include <asm/machdep.h>
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+-#include <asm/nb85e_timer_d.h>
+-#include <asm/nb85e_uart.h>
++#include <asm/v850e_timer_d.h>
++#include <asm/v850e_uart.h>
+ #include "mach.h"
+@@ -41,32 +41,34 @@ static void anna_led_tick (void);
+ void __init mach_early_init (void)
+ {
+-      ANNA_ILBEN  = 0;
+-      ANNA_CSC(0) = 0x402F;
+-      ANNA_CSC(1) = 0x4000;
+-      ANNA_BPC    = 0;
+-      ANNA_BSC    = 0xAAAA;
+-      ANNA_BEC    = 0;
+-      ANNA_BHC    = 0xFFFF;   /* icache all memory, dcache all */
+-      ANNA_BCT(0) = 0xB088;
+-      ANNA_BCT(1) = 0x0008;
+-      ANNA_DWC(0) = 0x0027;
+-      ANNA_DWC(1) = 0;
+-      ANNA_BCC    = 0x0006;
+-      ANNA_ASC    = 0;
+-      ANNA_LBS    = 0x0089;
+-      ANNA_SCR3   = 0x21A9;
+-      ANNA_RFS3   = 0x8121;
++      ANNA_ILBEN    = 0;
+-      nb85e_intc_disable_irqs ();
++      V850E2_CSC(0) = 0x402F;
++      V850E2_CSC(1) = 0x4000;
++      V850E2_BPC    = 0;
++      V850E2_BSC    = 0xAAAA;
++      V850E2_BEC    = 0;
++
++#if 0
++      V850E2_BHC    = 0xFFFF; /* icache all memory, dcache all */
++#else
++      V850E2_BHC    = 0;      /* cache no memory */
++#endif
++      V850E2_BCT(0) = 0xB088;
++      V850E2_BCT(1) = 0x0008;
++      V850E2_DWC(0) = 0x0027;
++      V850E2_DWC(1) = 0;
++      V850E2_BCC    = 0x0006;
++      V850E2_ASC    = 0;
++      V850E2_LBS    = 0x0089;
++      V850E2_SCR(3) = 0x21A9;
++      V850E2_RFS(3) = 0x8121;
++
++      v850e_intc_disable_irqs ();
+ }
+ void __init mach_setup (char **cmdline)
+ {
+-#ifdef CONFIG_V850E_NB85E_UART_CONSOLE
+-      nb85e_uart_cons_init (1);
+-#endif
+-
+       ANNA_PORT_PM (LEDS_PORT) = 0;   /* Make all LED pins output pins.  */
+       mach_tick = anna_led_tick;
+ }
+@@ -95,12 +97,12 @@ void mach_gettimeofday (struct timespec 
+ void __init mach_sched_init (struct irqaction *timer_action)
+ {
+       /* Start hardware timer.  */
+-      nb85e_timer_d_configure (0, HZ);
++      v850e_timer_d_configure (0, HZ);
+       /* Install timer interrupt handler.  */
+       setup_irq (IRQ_INTCMD(0), timer_action);
+ }
+-static struct nb85e_intc_irq_init irq_inits[] = {
++static struct v850e_intc_irq_init irq_inits[] = {
+       { "IRQ", 0,             NUM_MACH_IRQS,  1, 7 },
+       { "PIN", IRQ_INTP(0),   IRQ_INTP_NUM,   1, 4 },
+       { "CCC", IRQ_INTCCC(0), IRQ_INTCCC_NUM, 1, 5 },
+@@ -118,7 +120,7 @@ static struct hw_interrupt_type hw_itype
+ void __init mach_init_irqs (void)
+ {
+-      nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++      v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ void machine_restart (char *__unused)
+--- linux-2.6.0-test1/arch/v850/kernel/as85ep1.c       2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/v850/kernel/as85ep1.c      2003-07-19 17:03:49.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * arch/v850/kernel/as85ep1.c -- AS85EP1 V850E evaluation chip/board
+  *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -21,8 +21,8 @@
+ #include <asm/machdep.h>
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+-#include <asm/nb85e_timer_d.h>
+-#include <asm/nb85e_uart.h>
++#include <asm/v850e_timer_d.h>
++#include <asm/v850e_uart.h>
+ #include "mach.h"
+@@ -90,20 +90,14 @@ void __init mach_early_init (void)
+       AS85EP1_IRAMM = 0x0;    /* \e$BFbB"L?Na\e(BRAM\e$B$O!V\e(Bread-mode\e$B!W$K$J$j$^$9\e(B */
+ #endif /* !CONFIG_ROM_KERNEL */
+-      nb85e_intc_disable_irqs ();
++      v850e_intc_disable_irqs ();
+ }
+ void __init mach_setup (char **cmdline)
+ {
+-#ifdef CONFIG_V850E_NB85E_UART_CONSOLE
+-      nb85e_uart_cons_init (1);
+-#endif
+-
+       AS85EP1_PORT_PMC (LEDS_PORT) = 0; /* Make the LEDs port an I/O port. */
+       AS85EP1_PORT_PM (LEDS_PORT) = 0; /* Make all the bits output pins.  */
+       mach_tick = as85ep1_led_tick;
+-
+-      ROOT_DEV = MKDEV (BLKMEM_MAJOR, 0);
+ }
+ void __init mach_get_physical_ram (unsigned long *ram_start,
+@@ -137,21 +131,21 @@ void __init mach_reserve_bootmem ()
+                                root_fs_image_end - root_fs_image_start);
+ }
+-void mach_gettimeofday (struct timeval *tv)
++void mach_gettimeofday (struct timespec *tv)
+ {
+       tv->tv_sec = 0;
+-      tv->tv_usec = 0;
++      tv->tv_nsec = 0;
+ }
+ void __init mach_sched_init (struct irqaction *timer_action)
+ {
+       /* Start hardware timer.  */
+-      nb85e_timer_d_configure (0, HZ);
++      v850e_timer_d_configure (0, HZ);
+       /* Install timer interrupt handler.  */
+       setup_irq (IRQ_INTCMD(0), timer_action);
+ }
+-static struct nb85e_intc_irq_init irq_inits[] = {
++static struct v850e_intc_irq_init irq_inits[] = {
+       { "IRQ", 0,             NUM_MACH_IRQS,  1, 7 },
+       { "CCC", IRQ_INTCCC(0), IRQ_INTCCC_NUM, 1, 5 },
+       { "CMD", IRQ_INTCMD(0), IRQ_INTCMD_NUM, 1, 5 },
+@@ -166,7 +160,7 @@ static struct hw_interrupt_type hw_itype
+ void __init mach_init_irqs (void)
+ {
+-      nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++      v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ void machine_restart (char *__unused)
+--- linux-2.6.0-test1/arch/v850/kernel/fpga85e2c.c     2003-06-14 12:18:33.000000000 -0700
++++ 25/arch/v850/kernel/fpga85e2c.c    2003-07-19 17:03:49.000000000 -0700
+@@ -2,8 +2,8 @@
+  * arch/v850/kernel/fpga85e2c.h -- Machine-dependent defs for
+  *    FPGA implementation of V850E2/NA85E2C
+  *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -46,7 +46,7 @@ void __init mach_early_init (void)
+       /* Set bus sizes: CS0 32-bit, CS1 16-bit, CS7 8-bit,
+          everything else 32-bit.  */
+-      BSC = 0x2AA6;
++      V850E2_BSC = 0x2AA6;
+       for (i = 2; i <= 6; i++)
+               CSDEV(i) = 0;   /* 32 bit */
+@@ -134,7 +134,7 @@ void machine_power_off (void)
\f
+ /* Interrupts */
+-struct nb85e_intc_irq_init irq_inits[] = {
++struct v850e_intc_irq_init irq_inits[] = {
+       { "IRQ", 0,             NUM_MACH_IRQS,  1, 7 },
+       { "RPU", IRQ_RPU(0),    IRQ_RPU_NUM,    1, 6 },
+       { 0 }
+@@ -146,7 +146,7 @@ struct hw_interrupt_type hw_itypes[NUM_I
+ /* Initialize interrupts.  */
+ void __init mach_init_irqs (void)
+ {
+-      nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++      v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
\f
+--- linux-2.6.0-test1/arch/v850/kernel/gbus_int.c      2003-07-13 21:44:34.000000000 -0700
++++ 25/arch/v850/kernel/gbus_int.c     2003-07-19 17:03:49.000000000 -0700
+@@ -113,9 +113,7 @@ static irqreturn_t gbus_int_handle_irq (
+               /* Only pay attention to enabled interrupts.  */
+               status &= enable;
+               if (status) {
+-                      unsigned base_irq
+-                              = IRQ_GBUS_INT (w * GBUS_INT_BITS_PER_WORD);
+-                      irq = base_irq;
++                      irq = IRQ_GBUS_INT (w * GBUS_INT_BITS_PER_WORD);
+                       do {
+                               /* There's an active interrupt in word
+                                  W, find out which one, and call its
+@@ -247,7 +245,7 @@ void __init gbus_int_init_irqs (void)
+       /* First initialize the shared gint interrupts.  */
+       for (i = 0; i < NUM_USED_GINTS; i++) {
+               unsigned gint = used_gint[i].gint;
+-              struct nb85e_intc_irq_init gint_irq_init[2];
++              struct v850e_intc_irq_init gint_irq_init[2];
+               /* We initialize one GINT interrupt at a time.  */
+               gint_irq_init[0].name = "GINT";
+@@ -258,7 +256,7 @@ void __init gbus_int_init_irqs (void)
+               gint_irq_init[1].name = 0; /* Terminate the vector.  */
+-              nb85e_intc_init_irq_types (gint_irq_init, gint_hw_itypes);
++              v850e_intc_init_irq_types (gint_irq_init, gint_hw_itypes);
+       }
+       /* Then the GBUS interrupts.  */
+--- linux-2.6.0-test1/arch/v850/kernel/head.S  2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/v850/kernel/head.S 2003-07-19 17:03:49.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * arch/v850/kernel/head.S -- Lowest-level startup code
+  *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -115,7 +115,14 @@ C_ENTRY(start):
+       jarl    CSYM(memset), lp
+ #endif
+-      // Start Linux kernel.
++      // What happens if the main kernel function returns (it shouldn't)
+       mov     hilo(CSYM(machine_halt)), lp
+-      jr      CSYM(start_kernel)
++
++      // Start the linux kernel.  We use an indirect jump to get extra
++      // range, because on some platforms this initial startup code
++      // (and the associated platform-specific code in mach_early_init)
++      // are located far away from the main kernel, e.g. so that they
++      // can initialize RAM first and copy the kernel or something.
++      mov     hilo(CSYM(start_kernel)), r12
++      jmp     [r12]
+ C_END(start)
+--- linux-2.6.0-test1/arch/v850/kernel/highres_timer.c 2003-06-14 12:18:52.000000000 -0700
++++ 25/arch/v850/kernel/highres_timer.c        2003-07-19 17:03:49.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * arch/v850/kernel/highres_timer.c -- High resolution timing routines
+  *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -12,7 +12,7 @@
+  */
+ #include <asm/system.h>
+-#include <asm/nb85e_timer_d.h>
++#include <asm/v850e_timer_d.h>
+ #include <asm/highres_timer.h>
+ #define HIGHRES_TIMER_USEC_SHIFT   12
+@@ -42,7 +42,7 @@ void highres_timer_slow_tick_irq (void)
+ void highres_timer_reset (void)
+ {
+-      NB85E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT) = 0;
++      V850E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT) = 0;
+       HIGHRES_TIMER_SLOW_TICKS = 0;
+ }
+@@ -51,12 +51,12 @@ void highres_timer_start (void)
+       u32 fast_tick_rate;
+       /* Start hardware timer.  */
+-      nb85e_timer_d_configure (HIGHRES_TIMER_TIMER_D_UNIT,
++      v850e_timer_d_configure (HIGHRES_TIMER_TIMER_D_UNIT,
+                                HIGHRES_TIMER_SLOW_TICK_RATE);
+       fast_tick_rate =
+-              (NB85E_TIMER_D_BASE_FREQ
+-               >> NB85E_TIMER_D_DIVLOG2 (HIGHRES_TIMER_TIMER_D_UNIT));
++              (V850E_TIMER_D_BASE_FREQ
++               >> V850E_TIMER_D_DIVLOG2 (HIGHRES_TIMER_TIMER_D_UNIT));
+       /* The obvious way of calculating microseconds from fast ticks
+          is to do:
+@@ -77,16 +77,16 @@ void highres_timer_start (void)
+       /* Enable the interrupt (which is hardwired to this use), and
+          give it the highest priority.  */
+-      NB85E_INTC_IC (IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT)) = 0;
++      V850E_INTC_IC (IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT)) = 0;
+ }
+ void highres_timer_stop (void)
+ {
+       /* Stop the timer.  */
+-      NB85E_TIMER_D_TMCD (HIGHRES_TIMER_TIMER_D_UNIT) =
+-              NB85E_TIMER_D_TMCD_CAE;
++      V850E_TIMER_D_TMCD (HIGHRES_TIMER_TIMER_D_UNIT) =
++              V850E_TIMER_D_TMCD_CAE;
+       /* Disable its interrupt, just in case.  */
+-      nb85e_intc_disable_irq (IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT));
++      v850e_intc_disable_irq (IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT));
+ }
+ inline void highres_timer_read_ticks (u32 *slow_ticks, u32 *fast_ticks)
+@@ -95,9 +95,9 @@ inline void highres_timer_read_ticks (u3
+       u32 fast_ticks_1, fast_ticks_2, _slow_ticks;
+       local_irq_save (flags);
+-      fast_ticks_1 = NB85E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT);
++      fast_ticks_1 = V850E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT);
+       _slow_ticks = HIGHRES_TIMER_SLOW_TICKS;
+-      fast_ticks_2 = NB85E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT);
++      fast_ticks_2 = V850E_TIMER_D_TMD (HIGHRES_TIMER_TIMER_D_UNIT);
+       local_irq_restore (flags);
+       if (fast_ticks_2 < fast_ticks_1)
+--- linux-2.6.0-test1/arch/v850/kernel/intv.S  2003-06-14 12:18:22.000000000 -0700
++++ 25/arch/v850/kernel/intv.S 2003-07-19 17:03:49.000000000 -0700
+@@ -16,7 +16,7 @@
+ #include <asm/machdep.h>
+ #include <asm/entry.h>
+-#ifdef CONFIG_V850E_MA1_HIGHRES_TIMER
++#ifdef CONFIG_V850E_HIGHRES_TIMER
+ #include <asm/highres_timer.h>
+ #endif
+@@ -59,7 +59,7 @@
+       .section        .intv.mach, "ax"
+       .org    0x0
+-#if defined (CONFIG_V850E_MA1_HIGHRES_TIMER) && defined (IRQ_INTCMD)
++#if defined (CONFIG_V850E_HIGHRES_TIMER) && defined (IRQ_INTCMD)
+       /* Interrupts before the highres timer interrupt.  */
+       .rept   IRQ_INTCMD (HIGHRES_TIMER_TIMER_D_UNIT)
+--- linux-2.6.0-test1/arch/v850/kernel/ma.c    2003-06-14 12:17:58.000000000 -0700
++++ 25/arch/v850/kernel/ma.c   2003-07-19 17:03:49.000000000 -0700
+@@ -22,19 +22,19 @@
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+ #include <asm/machdep.h>
+-#include <asm/nb85e_timer_d.h>
++#include <asm/v850e_timer_d.h>
+ #include "mach.h"
+ void __init mach_sched_init (struct irqaction *timer_action)
+ {
+       /* Start hardware timer.  */
+-      nb85e_timer_d_configure (0, HZ);
++      v850e_timer_d_configure (0, HZ);
+       /* Install timer interrupt handler.  */
+       setup_irq (IRQ_INTCMD(0), timer_action);
+ }
+-static struct nb85e_intc_irq_init irq_inits[] = {
++static struct v850e_intc_irq_init irq_inits[] = {
+       { "IRQ", 0,             NUM_MACH_IRQS,  1, 7 },
+       { "CMD", IRQ_INTCMD(0), IRQ_INTCMD_NUM, 1, 5 },
+       { "DMA", IRQ_INTDMA(0), IRQ_INTDMA_NUM, 1, 2 },
+@@ -51,7 +51,7 @@ static struct hw_interrupt_type hw_itype
+ /* Initialize MA chip interrupts.  */
+ void __init ma_init_irqs (void)
+ {
+-      nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++      v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ /* Called before configuring an on-chip UART.  */
+--- linux-2.6.0-test1/arch/v850/kernel/Makefile        2003-06-14 12:18:51.000000000 -0700
++++ 25/arch/v850/kernel/Makefile       2003-07-19 17:03:49.000000000 -0700
+@@ -15,24 +15,26 @@ obj-y += intv.o entry.o process.o syscal
+        signal.o irq.o mach.o ptrace.o bug.o
+ obj-$(CONFIG_MODULES)         += module.o v850_ksyms.o
+ # chip-specific code
+-obj-$(CONFIG_V850E_NB85E)     += nb85e_intc.o
+-obj-$(CONFIG_V850E_MA1)               += ma.o nb85e_utils.o nb85e_timer_d.o
+-obj-$(CONFIG_V850E_TEG)               += teg.o nb85e_utils.o nb85e_cache.o \
+-                                 nb85e_timer_d.o
+-obj-$(CONFIG_V850E2_ANNA)     += anna.o nb85e_intc.o nb85e_utils.o \
+-                                 nb85e_timer_d.o
+-obj-$(CONFIG_V850E_AS85EP1)   += as85ep1.o nb85e_intc.o nb85e_utils.o \
+-                                 nb85e_timer_d.o
++obj-$(CONFIG_V850E_MA1)               += ma.o
++obj-$(CONFIG_V850E_ME2)               += me2.o
++obj-$(CONFIG_V850E_TEG)               += teg.o
++obj-$(CONFIG_V850E_AS85EP1)   += as85ep1.o
++obj-$(CONFIG_V850E2_ANNA)     += anna.o
+ # platform-specific code
+ obj-$(CONFIG_V850E_SIM)               += sim.o simcons.o
+-obj-$(CONFIG_V850E2_SIM85E2C) += sim85e2c.o nb85e_intc.o memcons.o
+-obj-$(CONFIG_V850E2_FPGA85E2C)        += fpga85e2c.o nb85e_intc.o memcons.o
++obj-$(CONFIG_V850E2_SIM85E2)  += sim85e2.o memcons.o
++obj-$(CONFIG_V850E2_FPGA85E2C)        += fpga85e2c.o memcons.o
+ obj-$(CONFIG_RTE_CB)          += rte_cb.o rte_cb_leds.o
+ obj-$(CONFIG_RTE_CB_MA1)      += rte_ma1_cb.o
++obj-$(CONFIG_RTE_CB_ME2)      += rte_me2_cb.o
+ obj-$(CONFIG_RTE_CB_NB85E)    += rte_nb85e_cb.o
+ obj-$(CONFIG_RTE_CB_MULTI)    += rte_cb_multi.o
+ obj-$(CONFIG_RTE_MB_A_PCI)    += rte_mb_a_pci.o
+ obj-$(CONFIG_RTE_GBUS_INT)    += gbus_int.o
+ # feature-specific code
+-obj-$(CONFIG_V850E_MA1_HIGHRES_TIMER) += highres_timer.o
++obj-$(CONFIG_V850E_INTC)      += v850e_intc.o
++obj-$(CONFIG_V850E_TIMER_D)   += v850e_timer_d.o v850e_utils.o
++obj-$(CONFIG_V850E_CACHE)     += v850e_cache.o
++obj-$(CONFIG_V850E2_CACHE)    += v850e2_cache.o
++obj-$(CONFIG_V850E_HIGHRES_TIMER) += highres_timer.o
+ obj-$(CONFIG_PROC_FS)         += procfs.o
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/me2.c  2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,74 @@
++/*
++ * arch/v850/kernel/me2.c -- V850E/ME2 chip-specific support
++ *
++ *  Copyright (C) 2003  NEC Corporation
++ *  Copyright (C) 2003  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/mm.h>
++#include <linux/swap.h>
++#include <linux/bootmem.h>
++#include <linux/irq.h>
++
++#include <asm/atomic.h>
++#include <asm/page.h>
++#include <asm/machdep.h>
++#include <asm/v850e_timer_d.h>
++
++#include "mach.h"
++
++void __init mach_sched_init (struct irqaction *timer_action)
++{
++      /* Start hardware timer.  */
++      v850e_timer_d_configure (0, HZ);
++      /* Install timer interrupt handler.  */
++      setup_irq (IRQ_INTCMD(0), timer_action);
++}
++
++static struct v850e_intc_irq_init irq_inits[] = {
++      { "IRQ",    0,                NUM_CPU_IRQS,      1, 7 },
++      { "INTP",   IRQ_INTP(0),      IRQ_INTP_NUM,      1, 5 },
++      { "CMD",    IRQ_INTCMD(0),    IRQ_INTCMD_NUM,    1, 3 },
++      { "UBTIRE", IRQ_INTUBTIRE(0), IRQ_INTUBTIRE_NUM, 5, 4 },
++      { "UBTIR",  IRQ_INTUBTIR(0),  IRQ_INTUBTIR_NUM,  5, 4 },
++      { "UBTIT",  IRQ_INTUBTIT(0),  IRQ_INTUBTIT_NUM,  5, 4 },
++      { "UBTIF",  IRQ_INTUBTIF(0),  IRQ_INTUBTIF_NUM,  5, 4 },
++      { "UBTITO", IRQ_INTUBTITO(0), IRQ_INTUBTITO_NUM, 5, 4 },
++      { 0 }
++};
++#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
++
++static struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
++
++/* Initialize V850E/ME2 chip interrupts.  */
++void __init me2_init_irqs (void)
++{
++      v850e_intc_init_irq_types (irq_inits, hw_itypes);
++}
++
++/* Called before configuring an on-chip UART.  */
++void me2_uart_pre_configure (unsigned chan, unsigned cflags, unsigned baud)
++{
++      if (chan == 0) {
++              /* Specify that the relevent pins on the chip should do
++                 serial I/O, not direct I/O.  */
++              ME2_PORT1_PMC |= 0xC;
++              /* Specify that we're using the UART, not the CSI device. */
++              ME2_PORT1_PFC |= 0xC;
++      } else if (chan == 1) {
++              /* Specify that the relevent pins on the chip should do
++                 serial I/O, not direct I/O.  */
++              ME2_PORT2_PMC |= 0x6;
++              /* Specify that we're using the UART, not the CSI device. */
++              ME2_PORT2_PFC |= 0x6;
++      }
++}
+--- linux-2.6.0-test1/arch/v850/kernel/nb85e_cache.c   2003-06-14 12:18:25.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,178 +0,0 @@
+-/*
+- * arch/v850/kernel/nb85e_cache.c -- Cache control for NB85E_CACHE212 and
+- *    NB85E_CACHE213 cache memories
+- *
+- *  Copyright (C) 2003  NEC Electronics Corporation
+- *  Copyright (C) 2003  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#include <asm/entry.h>
+-#include <asm/nb85e_cache.h>
+-
+-#define WAIT_UNTIL_CLEAR(value) while (value) {}
+-
+-/* Set caching params via the BHC and DCC registers.  */
+-void nb85e_cache_enable (u16 bhc, u16 dcc)
+-{
+-      unsigned long *r0_ram = (unsigned long *)R0_RAM_ADDR;
+-      register u16 bhc_val asm ("r6") = bhc;
+-
+-      /* Configure data-cache.  */
+-      NB85E_CACHE_DCC = dcc;
+-
+-      /* Configure caching for various memory regions by writing the BHC
+-         register.  The documentation says that an instruction _cannot_
+-         enable/disable caching for the memory region in which the
+-         instruction itself exists; to work around this, we store
+-         appropriate instructions into the on-chip RAM area (which is never
+-         cached), and briefly jump there to do the work.  */
+-      r0_ram[0] = 0xf0720760; /* st.h r0, 0xfffff072[r0] */
+-      r0_ram[1] = 0xf06a3760; /* st.h r6, 0xfffff06a[r0] */
+-      r0_ram[2] = 0x5640006b; /* jmp [r11] */
+-      asm ("mov hilo(1f), r11; jmp [%1]; 1:;"
+-           :: "r" (bhc_val), "r" (R0_RAM_ADDR) : "r11");
+-}
+-
+-static void clear_icache (void)
+-{
+-      /* 1. Read the instruction cache control register (ICC) and confirm
+-            that bits 0 and 1 (TCLR0, TCLR1) are all cleared.  */
+-      WAIT_UNTIL_CLEAR (NB85E_CACHE_ICC & 0x3);
+-
+-      /* 2. Read the ICC register and confirm that bit 12 (LOCK0) is
+-            cleared.  Bit 13 of the ICC register is always cleared.  */
+-      WAIT_UNTIL_CLEAR (NB85E_CACHE_ICC & 0x1000);
+-
+-      /* 3. Set the TCLR0 and TCLR1 bits of the ICC register as follows,
+-            when clearing way 0 and way 1 at the same time:
+-              (a) Set the TCLR0 and TCLR1 bits.
+-              (b) Read the TCLR0 and TCLR1 bits to confirm that these bits
+-                  are cleared.
+-              (c) Perform (a) and (b) above again.  */
+-      NB85E_CACHE_ICC |= 0x3;
+-      WAIT_UNTIL_CLEAR (NB85E_CACHE_ICC & 0x3);
+-      /* Do it again.  */
+-      NB85E_CACHE_ICC |= 0x3;
+-      WAIT_UNTIL_CLEAR (NB85E_CACHE_ICC & 0x3);
+-}
+-
+-/* Flush or clear (or both) the data cache, depending on the value of FLAGS;
+-   the procedure is the same for both, just the control bits used differ (and
+-   both may be performed simultaneously).  */
+-static void dcache_op (unsigned short flags)
+-{
+-      /* 1. Read the data cache control register (DCC) and confirm that bits
+-            0, 1, 4, and 5 (DC00, DC01, DC04, DC05) are all cleared.  */
+-      WAIT_UNTIL_CLEAR (NB85E_CACHE_DCC & 0x33);
+-
+-      /* 2. Clear DCC register bit 12 (DC12), bit 13 (DC13), or both
+-            depending on the way for which tags are to be cleared.  */
+-      NB85E_CACHE_DCC &= ~0xC000;
+-
+-      /* 3. Set DCC register bit 0 (DC00), bit 1 (DC01) or both depending on
+-            the way for which tags are to be cleared.
+-            ...
+-            Set DCC register bit 4 (DC04), bit 5 (DC05), or both depending
+-            on the way to be data flushed.  */
+-      NB85E_CACHE_DCC |= flags;
+-
+-      /* 4. Read DCC register bit DC00, DC01 [DC04, DC05], or both depending
+-            on the way for which tags were cleared [flushed] and confirm
+-            that that bit is cleared.  */
+-      WAIT_UNTIL_CLEAR (NB85E_CACHE_DCC & flags);
+-}
+-
+-/* Flushes the contents of the dcache to memory.  */
+-static inline void flush_dcache (void)
+-{
+-      /* We only need to do something if in write-back mode.  */
+-      if (NB85E_CACHE_DCC & 0x0400)
+-              dcache_op (0x30);
+-}
+-
+-/* Flushes the contents of the dcache to memory, and then clears it.  */
+-static inline void clear_dcache (void)
+-{
+-      /* We only need to do something if the dcache is enabled.  */
+-      if (NB85E_CACHE_DCC & 0x0C00)
+-              dcache_op (0x33);
+-}
+-
+-/* Clears the dcache without flushing to memory first.  */
+-static inline void clear_dcache_no_flush (void)
+-{
+-      /* We only need to do something if the dcache is enabled.  */
+-      if (NB85E_CACHE_DCC & 0x0C00)
+-              dcache_op (0x3);
+-}
+-
+-static inline void cache_exec_after_store (void)
+-{
+-      flush_dcache ();
+-      clear_icache ();
+-}
+-
+-\f
+-/* Exported functions.  */
+-
+-void inline nb85e_cache_flush_all (void)
+-{
+-      clear_icache ();
+-      clear_dcache ();
+-}
+-
+-void nb85e_cache_flush_mm (struct mm_struct *mm)
+-{
+-      /* nothing */
+-}
+-
+-void nb85e_cache_flush_range (struct mm_struct *mm,
+-                            unsigned long start, unsigned long end)
+-{
+-      /* nothing */
+-}
+-
+-void nb85e_cache_flush_page (struct vm_area_struct *vma,
+-                           unsigned long page_addr)
+-{
+-      /* nothing */
+-}
+-
+-void nb85e_cache_flush_dcache_page (struct page *page)
+-{
+-      /* nothing */
+-}
+-
+-void nb85e_cache_flush_icache (void)
+-{
+-      cache_exec_after_store ();
+-}
+-
+-void nb85e_cache_flush_icache_range (unsigned long start, unsigned long end)
+-{
+-      cache_exec_after_store ();
+-}
+-
+-void nb85e_cache_flush_icache_page (struct vm_area_struct *vma,
+-                                  struct page *page)
+-{
+-      cache_exec_after_store ();
+-}
+-
+-void nb85e_cache_flush_icache_user_range (struct vm_area_struct *vma,
+-                                        struct page *page,
+-                                        unsigned long adr, int len)
+-{
+-      cache_exec_after_store ();
+-}
+-
+-void nb85e_cache_flush_sigtramp (unsigned long addr)
+-{
+-      cache_exec_after_store ();
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/nb85e_intc.c    2003-06-14 12:18:06.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,104 +0,0 @@
+-/*
+- * arch/v850/kernel/nb85e_intc.c -- NB85E cpu core interrupt controller (INTC)
+- *
+- *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+- *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/irq.h>
+-
+-#include <asm/nb85e_intc.h>
+-
+-static void irq_nop (unsigned irq) { }
+-
+-static unsigned nb85e_intc_irq_startup (unsigned irq)
+-{
+-      nb85e_intc_clear_pending_irq (irq);
+-      nb85e_intc_enable_irq (irq);
+-      return 0;
+-}
+-
+-static void nb85e_intc_end_irq (unsigned irq)
+-{
+-      unsigned long psw, temp;
+-
+-      /* Clear the highest-level bit in the In-service priority register
+-         (ISPR), to allow this interrupt (or another of the same or
+-         lesser priority) to happen again.
+-
+-         The `reti' instruction normally does this automatically when the
+-         PSW bits EP and NP are zero, but we can't always rely on reti
+-         being used consistently to return after an interrupt (another
+-         process can be scheduled, for instance, which can delay the
+-         associated reti for a long time, or this process may be being
+-         single-stepped, which uses the `dbret' instruction to return
+-         from the kernel).
+-
+-         We also set the PSW EP bit, which prevents reti from also
+-         trying to modify the ISPR itself.  */
+-
+-      /* Get PSW and disable interrupts.  */
+-      asm volatile ("stsr psw, %0; di" : "=r" (psw));
+-      /* We don't want to do anything for NMIs (they don't use the ISPR).  */
+-      if (! (psw & 0xC0)) {
+-              /* Transition to `trap' state, so that an eventual real
+-                 reti instruction won't modify the ISPR.  */
+-              psw |= 0x40;
+-              /* Fake an interrupt return, which automatically clears the
+-                 appropriate bit in the ISPR.  */
+-              asm volatile ("mov hilo(1f), %0;"
+-                            "ldsr %0, eipc; ldsr %1, eipsw;"
+-                            "reti;"
+-                            "1:"
+-                            : "=&r" (temp) : "r" (psw));
+-      }
+-}
+-
+-/* Initialize HW_IRQ_TYPES for INTC-controlled irqs described in array
+-   INITS (which is terminated by an entry with the name field == 0).  */
+-void __init nb85e_intc_init_irq_types (struct nb85e_intc_irq_init *inits,
+-                                     struct hw_interrupt_type *hw_irq_types)
+-{
+-      struct nb85e_intc_irq_init *init;
+-      for (init = inits; init->name; init++) {
+-              unsigned i;
+-              struct hw_interrupt_type *hwit = hw_irq_types++;
+-
+-              hwit->typename = init->name;
+-
+-              hwit->startup  = nb85e_intc_irq_startup;
+-              hwit->shutdown = nb85e_intc_disable_irq;
+-              hwit->enable   = nb85e_intc_enable_irq;
+-              hwit->disable  = nb85e_intc_disable_irq;
+-              hwit->ack      = irq_nop;
+-              hwit->end      = nb85e_intc_end_irq;
+-              
+-              /* Initialize kernel IRQ infrastructure for this interrupt.  */
+-              init_irq_handlers(init->base, init->num, init->interval, hwit);
+-
+-              /* Set the interrupt priorities.  */
+-              for (i = 0; i < init->num; i++) {
+-                      unsigned irq = init->base + i * init->interval;
+-
+-                      /* If the interrupt is currently enabled (all
+-                         interrupts are initially disabled), then
+-                         assume whoever enabled it has set things up
+-                         properly, and avoid messing with it.  */
+-                      if (! nb85e_intc_irq_enabled (irq))
+-                              /* This write also (1) disables the
+-                                 interrupt, and (2) clears any pending
+-                                 interrupts.  */
+-                              NB85E_INTC_IC (irq)
+-                                      = (NB85E_INTC_IC_PR (init->priority)
+-                                         | NB85E_INTC_IC_MK);
+-              }
+-      }
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/nb85e_timer_d.c 2003-06-14 12:18:21.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,54 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_timer_d.c -- `Timer D' component often used
+- *    with the NB85E cpu core
+- *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#include <linux/kernel.h>
+-
+-#include <asm/nb85e_utils.h>
+-#include <asm/nb85e_timer_d.h>
+-
+-/* Start interval timer TIMER (0-3).  The timer will issue the
+-   corresponding INTCMD interrupt RATE times per second.
+-   This function does not enable the interrupt.  */
+-void nb85e_timer_d_configure (unsigned timer, unsigned rate)
+-{
+-      unsigned divlog2, count;
+-
+-      /* Calculate params for timer.  */
+-      if (! calc_counter_params (
+-                  NB85E_TIMER_D_BASE_FREQ, rate,
+-                  NB85E_TIMER_D_TMCD_CS_MIN, NB85E_TIMER_D_TMCD_CS_MAX, 16,
+-                  &divlog2, &count))
+-              printk (KERN_WARNING
+-                      "Cannot find interval timer %d setting suitable"
+-                      " for rate of %dHz.\n"
+-                      "Using rate of %dHz instead.\n",
+-                      timer, rate,
+-                      (NB85E_TIMER_D_BASE_FREQ >> divlog2) >> 16);
+-
+-      /* Do the actual hardware timer initialization:  */
+-
+-      /* Enable timer.  */
+-      NB85E_TIMER_D_TMCD(timer) = NB85E_TIMER_D_TMCD_CAE;
+-      /* Set clock divider.  */
+-      NB85E_TIMER_D_TMCD(timer)
+-              = NB85E_TIMER_D_TMCD_CAE
+-              | NB85E_TIMER_D_TMCD_CS(divlog2);
+-      /* Set timer compare register.  */
+-      NB85E_TIMER_D_CMD(timer) = count;
+-      /* Start counting.  */
+-      NB85E_TIMER_D_TMCD(timer)
+-              = NB85E_TIMER_D_TMCD_CAE
+-              | NB85E_TIMER_D_TMCD_CS(divlog2)
+-              | NB85E_TIMER_D_TMCD_CE;
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/nb85e_utils.c   2003-06-14 12:17:59.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,65 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_utils.h -- Utility functions associated with
+- *    the NB85E cpu core
+- *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-/* Note: these functions are often associated with the N85E cpu core,
+-   but not always, which is why they're not in `nb85e.c'.  */
+-
+-#include <asm/nb85e_utils.h>
+-
+-/* Calculate counter clock-divider and count values to attain the
+-   desired frequency RATE from the base frequency BASE_FREQ.  The
+-   counter is expected to have a clock-divider, which can divide the
+-   system cpu clock by a power of two value from MIN_DIVLOG2 to
+-   MAX_DIV_LOG2, and a word-size of COUNTER_SIZE bits (the counter
+-   counts up and resets whenever it's equal to the compare register,
+-   generating an interrupt or whatever when it does so).  The returned
+-   values are: *DIVLOG2 -- log2 of the desired clock divider and *COUNT
+-   -- the counter compare value to use.  Returns true if it was possible
+-   to find a reasonable value, otherwise false (and the other return
+-   values will be set to be as good as possible).  */
+-int calc_counter_params (unsigned long base_freq,
+-                       unsigned long rate,
+-                       unsigned min_divlog2, unsigned max_divlog2,
+-                       unsigned counter_size,
+-                       unsigned *divlog2, unsigned *count)
+-{
+-      unsigned _divlog2;
+-      int ok = 0;
+-
+-      /* Find the lowest clock divider setting that can represent RATE.  */
+-      for (_divlog2 = min_divlog2; _divlog2 <= max_divlog2; _divlog2++) {
+-              /* Minimum interrupt rate possible using this divider.  */
+-              unsigned min_int_rate
+-                      = (base_freq >> _divlog2) >> counter_size;
+-
+-              if (min_int_rate <= rate) {
+-                      /* This setting is the highest resolution
+-                         setting that's slow enough enough to attain
+-                         RATE interrupts per second, so use it.  */
+-                      ok = 1;
+-                      break;
+-              }
+-      }
+-
+-      if (_divlog2 > max_divlog2)
+-              /* Can't find correct setting.  */
+-              _divlog2 = max_divlog2;
+-
+-      if (divlog2)
+-              *divlog2 = _divlog2;
+-      if (count)
+-              *count = ((base_freq >> _divlog2) + rate/2) / rate;
+-
+-      return ok;
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/rte_cb.c        2003-06-14 12:17:57.000000000 -0700
++++ 25/arch/v850/kernel/rte_cb.c       2003-07-19 17:03:49.000000000 -0700
+@@ -17,7 +17,7 @@
+ #include <linux/fs.h>
+ #include <asm/machdep.h>
+-#include <asm/nb85e_uart.h>
++#include <asm/v850e_uart.h>
+ #include "mach.h"
+@@ -34,7 +34,7 @@ extern void multi_init (void);
\f
+ void __init rte_cb_early_init (void)
+ {
+-      nb85e_intc_disable_irqs ();
++      v850e_intc_disable_irqs ();
+ #ifdef CONFIG_RTE_CB_MULTI
+       multi_init ();
+@@ -43,6 +43,7 @@ void __init rte_cb_early_init (void)
+ void __init mach_setup (char **cmdline)
+ {
++#ifdef CONFIG_RTE_MB_A_PCI
+       /* Probe for Mother-A, and print a message if we find it.  */
+       *(volatile unsigned long *)MB_A_SRAM_ADDR = 0xDEADBEEF;
+       if (*(volatile unsigned long *)MB_A_SRAM_ADDR == 0xDEADBEEF) {
+@@ -52,23 +53,11 @@ void __init mach_setup (char **cmdline)
+                               "          NEC SolutionGear/Midas lab"
+                               " RTE-MOTHER-A motherboard\n");
+       }
+-
+-#if defined (CONFIG_V850E_NB85E_UART_CONSOLE) && !defined (CONFIG_TIME_BOOTUP)
+-      nb85e_uart_cons_init (0);
+-#endif
++#endif /* CONFIG_RTE_MB_A_PCI */
+       mach_tick = led_tick;
+ }
+-#ifdef CONFIG_TIME_BOOTUP
+-void initial_boot_done (void)
+-{
+-#ifdef CONFIG_V850E_NB85E_UART_CONSOLE
+-      nb85e_uart_cons_init (0);
+-#endif
+-}
+-#endif
+-
+ void machine_restart (char *__unused)
+ {
+ #ifdef CONFIG_RESET_GUARD
+@@ -194,6 +183,7 @@ static struct hw_interrupt_type gbus_hw_
+ #endif /* CONFIG_RTE_GBUS_INT */
++
+ void __init rte_cb_init_irqs (void)
+ {
+ #ifdef CONFIG_RTE_GBUS_INT
+--- linux-2.6.0-test1/arch/v850/kernel/rte_ma1_cb.c    2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/v850/kernel/rte_ma1_cb.c   2003-07-19 17:03:49.000000000 -0700
+@@ -20,7 +20,7 @@
+ #include <asm/page.h>
+ #include <asm/ma1.h>
+ #include <asm/rte_ma1_cb.h>
+-#include <asm/nb85e_timer_c.h>
++#include <asm/v850e_timer_c.h>
+ #include "mach.h"
+@@ -89,14 +89,14 @@ void __init mach_init_irqs (void)
+       rte_cb_init_irqs ();
+       /* Use falling-edge-sensitivity for interrupts .  */
+-      NB85E_TIMER_C_SESC (0) &= ~0xC;
+-      NB85E_TIMER_C_SESC (1) &= ~0xF;
++      V850E_TIMER_C_SESC (0) &= ~0xC;
++      V850E_TIMER_C_SESC (1) &= ~0xF;
+       /* INTP000-INTP011 are shared with `Timer C', so we have to set
+          up Timer C to pass them through as raw interrupts.  */
+       for (tc = 0; tc < 2; tc++)
+               /* Turn on the timer.  */
+-              NB85E_TIMER_C_TMCC0 (tc) |= NB85E_TIMER_C_TMCC0_CAE;
++              V850E_TIMER_C_TMCC0 (tc) |= V850E_TIMER_C_TMCC0_CAE;
+       /* Make sure the relevant port0/port1 pins are assigned
+          interrupt duty.  We used INTP001-INTP011 (don't screw with
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/rte_me2_cb.c   2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,308 @@
++/*
++ * arch/v850/kernel/rte_me2_cb.c -- Midas labs RTE-V850E/ME2-CB board
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/bootmem.h>
++#include <linux/irq.h>
++#include <linux/fs.h>
++#include <linux/major.h>
++#include <linux/sched.h>
++#include <linux/delay.h>
++
++#include <asm/atomic.h>
++#include <asm/page.h>
++#include <asm/me2.h>
++#include <asm/rte_me2_cb.h>
++#include <asm/machdep.h>
++#include <asm/v850e_intc.h>
++#include <asm/v850e_cache.h>
++#include <asm/irq.h>
++
++#include "mach.h"
++
++extern unsigned long *_intv_start;
++extern unsigned long *_intv_end;
++
++/* LED access routines.  */
++extern unsigned read_leds (int pos, char *buf, int len);
++extern unsigned write_leds (int pos, const char *buf, int len);
++
++
++/* SDRAM are almost contiguous (with a small hole in between;
++   see mach_reserve_bootmem for details), so just use both as one big area.  */
++#define RAM_START     SDRAM_ADDR
++#define RAM_END               (SDRAM_ADDR + SDRAM_SIZE)
++
++
++void __init mach_get_physical_ram (unsigned long *ram_start,
++                                 unsigned long *ram_len)
++{
++      *ram_start = RAM_START;
++      *ram_len = RAM_END - RAM_START;
++}
++
++void __init mach_reserve_bootmem ()
++{
++      extern char _root_fs_image_start, _root_fs_image_end;
++      u32 root_fs_image_start = (u32)&_root_fs_image_start;
++      u32 root_fs_image_end = (u32)&_root_fs_image_end;
++
++      /* Reserve the memory used by the root filesystem image if it's
++         in RAM.  */
++      if (root_fs_image_start >= RAM_START && root_fs_image_start < RAM_END)
++              reserve_bootmem (root_fs_image_start,
++                               root_fs_image_end - root_fs_image_start);
++}
++
++void mach_gettimeofday (struct timespec *tv)
++{
++      tv->tv_sec = 0;
++      tv->tv_nsec = 0;
++}
++
++/* Called before configuring an on-chip UART.  */
++void rte_me2_cb_uart_pre_configure (unsigned chan,
++                                  unsigned cflags, unsigned baud)
++{
++      /* The RTE-V850E/ME2-CB connects some general-purpose I/O
++         pins on the CPU to the RTS/CTS lines of UARTB channel 0's
++         serial connection.
++         I/O pins P21 and P22 are RTS and CTS respectively.  */
++      if (chan == 0) {
++              /* Put P21 & P22 in I/O port mode.  */
++              ME2_PORT2_PMC &= ~0x6;
++              /* Make P21 and output, and P22 an input.  */
++              ME2_PORT2_PM = (ME2_PORT2_PM & ~0xC) | 0x4;
++      }
++
++      me2_uart_pre_configure (chan, cflags, baud);
++}
++
++void __init mach_init_irqs (void)
++{
++      /* Initialize interrupts.  */
++      me2_init_irqs ();
++      rte_me2_cb_init_irqs ();
++}
++
++#ifdef CONFIG_ROM_KERNEL
++/* Initialization for kernel in ROM.  */
++static inline rom_kernel_init (void)
++{
++      /* If the kernel is in ROM, we have to copy any initialized data
++         from ROM into RAM.  */
++      extern unsigned long _data_load_start, _sdata, _edata;
++      register unsigned long *src = &_data_load_start;
++      register unsigned long *dst = &_sdata, *end = &_edata;
++
++      while (dst != end)
++              *dst++ = *src++;
++}
++#endif /* CONFIG_ROM_KERNEL */
++
++static void install_interrupt_vectors (void)
++{
++      unsigned long *p1, *p2;
++
++      ME2_IRAMM = 0x03; /* V850E/ME2 iRAM write mode */
++
++      /* vector copy to iRAM */
++      p1 = (unsigned long *)0; /* v85x vector start */
++      p2 = (unsigned long *)&_intv_start;
++      while (p2 < (unsigned long *)&_intv_end)
++              *p1++ = *p2++;
++
++      ME2_IRAMM = 0x00; /* V850E/ME2 iRAM read mode */
++}
++\f
++/* CompactFlash */
++
++static void cf_power_on (void)
++{
++      /* CF card detected? */
++      if (CB_CF_STS0 & 0x0030)
++              return;
++
++      CB_CF_REG0 = 0x0002; /* reest on */
++      mdelay (10);
++      CB_CF_REG0 = 0x0003; /* power on */
++      mdelay (10);
++      CB_CF_REG0 = 0x0001; /* reset off */
++      mdelay (10);
++}
++
++static void cf_power_off (void)
++{
++      CB_CF_REG0 = 0x0003; /* power on */
++      mdelay (10);
++      CB_CF_REG0 = 0x0002; /* reest on */
++      mdelay (10);
++}
++
++void __init mach_early_init (void)
++{
++      install_interrupt_vectors ();
++
++      /* CS1 SDRAM instruction cache enable */
++      v850e_cache_enable (0x04, 0x03, 0);
++
++      rte_cb_early_init ();
++
++      /* CompactFlash power on */
++      cf_power_on ();
++
++#if defined (CONFIG_ROM_KERNEL)
++      rom_kernel_init ();
++#endif
++}
++
++\f
++/* RTE-V850E/ME2-CB Programmable Interrupt Controller.  */
++
++static struct cb_pic_irq_init cb_pic_irq_inits[] = {
++      { "CB_EXTTM0",       IRQ_CB_EXTTM0,       1, 1, 6 },
++      { "CB_EXTSIO",       IRQ_CB_EXTSIO,       1, 1, 6 },
++      { "CB_TOVER",        IRQ_CB_TOVER,        1, 1, 6 },
++      { "CB_GINT0",        IRQ_CB_GINT0,        1, 1, 6 },
++      { "CB_USB",          IRQ_CB_USB,          1, 1, 6 },
++      { "CB_LANC",         IRQ_CB_LANC,         1, 1, 6 },
++      { "CB_USB_VBUS_ON",  IRQ_CB_USB_VBUS_ON,  1, 1, 6 },
++      { "CB_USB_VBUS_OFF", IRQ_CB_USB_VBUS_OFF, 1, 1, 6 },
++      { "CB_EXTTM1",       IRQ_CB_EXTTM1,       1, 1, 6 },
++      { "CB_EXTTM2",       IRQ_CB_EXTTM2,       1, 1, 6 },
++      { 0 }
++};
++#define NUM_CB_PIC_IRQ_INITS  \
++   ((sizeof cb_pic_irq_inits / sizeof cb_pic_irq_inits[0]) - 1)
++
++static struct hw_interrupt_type cb_pic_hw_itypes[NUM_CB_PIC_IRQ_INITS];
++static unsigned char cb_pic_active_irqs = 0;
++
++void __init rte_me2_cb_init_irqs (void)
++{
++      cb_pic_init_irq_types (cb_pic_irq_inits, cb_pic_hw_itypes);
++
++      /* Initalize on board PIC1 (not PIC0) enable */
++      CB_PIC_INT0M  = 0x0000;
++      CB_PIC_INT1M  = 0x0000;
++      CB_PIC_INTR   = 0x0000;
++      CB_PIC_INTEN |= CB_PIC_INT1EN;
++
++      ME2_PORT2_PMC    |= 0x08;       /* INTP23/SCK1 mode */
++      ME2_PORT2_PFC    &= ~0x08;      /* INTP23 mode */
++      ME2_INTR(2)      &= ~0x08;      /* INTP23 falling-edge detect */
++      ME2_INTF(2)      &= ~0x08;      /*   " */
++
++      rte_cb_init_irqs ();    /* gbus &c */
++}
++
++
++/* Enable interrupt handling for interrupt IRQ.  */
++void cb_pic_enable_irq (unsigned irq)
++{
++      CB_PIC_INT1M |= 1 << (irq - CB_PIC_BASE_IRQ);
++}
++
++void cb_pic_disable_irq (unsigned irq)
++{
++      CB_PIC_INT1M &= ~(1 << (irq - CB_PIC_BASE_IRQ));
++}
++
++void cb_pic_shutdown_irq (unsigned irq)
++{
++      cb_pic_disable_irq (irq);
++
++      if (--cb_pic_active_irqs == 0)
++              free_irq (IRQ_CB_PIC, 0);
++
++      CB_PIC_INT1M &= ~(1 << (irq - CB_PIC_BASE_IRQ));
++}
++
++static void cb_pic_handle_irq (int irq, void *dev_id, struct pt_regs *regs)
++{
++      unsigned status = CB_PIC_INTR;
++      unsigned enable = CB_PIC_INT1M;
++
++      /* Only pay attention to enabled interrupts.  */
++      status &= enable;
++
++      CB_PIC_INTEN &= ~CB_PIC_INT1EN;
++
++      if (status) {
++              unsigned mask = 1;
++
++              irq = CB_PIC_BASE_IRQ;
++              do {
++                      /* There's an active interrupt, find out which one,
++                         and call its handler.  */
++                      while (! (status & mask)) {
++                              irq++;
++                              mask <<= 1;
++                      }
++                      status &= ~mask;
++
++                      CB_PIC_INTR = mask;
++
++                      /* Recursively call handle_irq to handle it. */
++                      handle_irq (irq, regs);
++              } while (status);
++      }
++
++      CB_PIC_INTEN |= CB_PIC_INT1EN;
++}
++
++
++static void irq_nop (unsigned irq) { }
++
++static unsigned cb_pic_startup_irq (unsigned irq)
++{
++      int rval;
++
++      if (cb_pic_active_irqs == 0) {
++              rval = request_irq (IRQ_CB_PIC, cb_pic_handle_irq,
++                                  SA_INTERRUPT, "cb_pic_handler", 0);
++              if (rval != 0)
++                      return rval;
++      }
++
++      cb_pic_active_irqs++;
++
++      cb_pic_enable_irq (irq);
++
++      return 0;
++}
++
++/* Initialize HW_IRQ_TYPES for INTC-controlled irqs described in array
++   INITS (which is terminated by an entry with the name field == 0).  */
++void __init cb_pic_init_irq_types (struct cb_pic_irq_init *inits,
++                                 struct hw_interrupt_type *hw_irq_types)
++{
++      struct cb_pic_irq_init *init;
++      for (init = inits; init->name; init++) {
++              struct hw_interrupt_type *hwit = hw_irq_types++;
++
++              hwit->typename = init->name;
++
++              hwit->startup  = cb_pic_startup_irq;
++              hwit->shutdown = cb_pic_shutdown_irq;
++              hwit->enable   = cb_pic_enable_irq;
++              hwit->disable  = cb_pic_disable_irq;
++              hwit->ack      = irq_nop;
++              hwit->end      = irq_nop;
++
++              /* Initialize kernel IRQ infrastructure for this interrupt.  */
++              init_irq_handlers(init->base, init->num, init->interval, hwit);
++      }
++}
+--- linux-2.6.0-test1/arch/v850/kernel/rte_nb85e_cb.c  2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/v850/kernel/rte_nb85e_cb.c 2003-07-19 17:03:49.000000000 -0700
+@@ -21,7 +21,7 @@
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+-#include <asm/nb85e.h>
++#include <asm/v850e.h>
+ #include <asm/rte_nb85e_cb.h>
+ #include "mach.h"
+@@ -41,7 +41,7 @@ void __init mach_early_init (void)
+          Unfortunately, the dcache seems to be buggy, so we only use the
+          icache for now.  */
+-      nb85e_cache_enable (0x0040 /* BHC */, 0x0000 /* DCC */);
++      v850e_cache_enable (0x0040 /*BHC*/, 0x0003 /*ICC*/, 0x0000 /*DCC*/);
+       rte_cb_early_init ();
+ }
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/sim85e2.c      2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,211 @@
++/*
++ * arch/v850/kernel/sim85e2.c -- Machine-specific stuff for
++ *    V850E2 RTL simulator
++ *
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/mm.h>
++#include <linux/swap.h>
++#include <linux/bootmem.h>
++#include <linux/irq.h>
++
++#include <asm/atomic.h>
++#include <asm/page.h>
++#include <asm/machdep.h>
++
++#include "mach.h"
++
++
++/* There are 4 possible areas we can use:
++
++     IRAM (1MB) is fast for instruction fetches, but slow for data
++     DRAM (1020KB) is fast for data, but slow for instructions
++     ERAM is cached, so should be fast for both insns and data
++     SDRAM is external DRAM, similar to ERAM
++*/
++
++#define INIT_MEMC_FOR_SDRAM
++#define USE_SDRAM_AREA
++#define KERNEL_IN_SDRAM_AREA
++
++#define DCACHE_MODE   V850E2_CACHE_BTSC_DCM_WT
++/*#define DCACHE_MODE V850E2_CACHE_BTSC_DCM_WB_ALLOC*/
++
++#ifdef USE_SDRAM_AREA
++#define RAM_START     SDRAM_ADDR
++#define RAM_END               (SDRAM_ADDR + SDRAM_SIZE)
++#else
++/* When we use DRAM, we need to account for the fact that the end of it is
++   used for R0_RAM.  */
++#define RAM_START     DRAM_ADDR
++#define RAM_END               R0_RAM_ADDR
++#endif
++
++
++extern void memcons_setup (void);
++
++
++#ifdef KERNEL_IN_SDRAM_AREA
++#define EARLY_INIT_SECTION_ATTR __attribute__ ((section (".early.text")))
++#else
++#define EARLY_INIT_SECTION_ATTR __init
++#endif
++
++void EARLY_INIT_SECTION_ATTR mach_early_init (void)
++{
++      extern int panic_timeout;
++
++      /* The sim85e2 simulator tracks `undefined' values, so to make
++         debugging easier, we begin by zeroing out all otherwise
++         undefined registers.  This is not strictly necessary.
++
++         The registers we zero are:
++             Every GPR except:
++                 stack-pointer (r3)
++                 task-pointer (r16)
++                 our return addr (r31)
++             Every system register (SPR) that we know about except for
++             the PSW (SPR 5), which we zero except for the
++             disable-interrupts bit.
++      */
++
++      /* GPRs */
++      asm volatile ("             mov r0, r1 ; mov r0, r2              ");
++      asm volatile ("mov r0, r4 ; mov r0, r5 ; mov r0, r6 ; mov r0, r7 ");
++      asm volatile ("mov r0, r8 ; mov r0, r9 ; mov r0, r10; mov r0, r11");
++      asm volatile ("mov r0, r12; mov r0, r13; mov r0, r14; mov r0, r15");
++      asm volatile ("             mov r0, r17; mov r0, r18; mov r0, r19");
++      asm volatile ("mov r0, r20; mov r0, r21; mov r0, r22; mov r0, r23");
++      asm volatile ("mov r0, r24; mov r0, r25; mov r0, r26; mov r0, r27");
++      asm volatile ("mov r0, r28; mov r0, r29; mov r0, r30");
++
++      /* SPRs */
++      asm volatile ("ldsr r0, 0;  ldsr r0, 1;  ldsr r0, 2;  ldsr r0, 3");
++      asm volatile ("ldsr r0, 4");
++      asm volatile ("addi 0x20, r0, r1; ldsr r1, 5"); /* PSW */
++      asm volatile ("ldsr r0, 16; ldsr r0, 17; ldsr r0, 18; ldsr r0, 19");
++      asm volatile ("ldsr r0, 20");
++
++
++#ifdef INIT_MEMC_FOR_SDRAM
++      /* Settings for SDRAM controller.  */
++      V850E2_VSWC   = 0x0042;
++      V850E2_BSC    = 0x9286;
++      V850E2_BCT(0) = 0xb000; /* was: 0 */
++      V850E2_BCT(1) = 0x000b;
++      V850E2_ASC    = 0;
++      V850E2_LBS    = 0xa9aa; /* was: 0xaaaa */
++      V850E2_LBC(0) = 0;
++      V850E2_LBC(1) = 0;      /* was: 0x3 */
++      V850E2_BCC    = 0;
++      V850E2_RFS(4) = 0x800a; /* was: 0xf109 */
++      V850E2_SCR(4) = 0x2091; /* was: 0x20a1 */
++      V850E2_RFS(3) = 0x800c;
++      V850E2_SCR(3) = 0x20a1;
++      V850E2_DWC(0) = 0;
++      V850E2_DWC(1) = 0;
++#endif
++
++#if 0
++#ifdef CONFIG_V850E2_SIM85E2S
++      /* Turn on the caches.  */
++      V850E2_CACHE_BTSC = V850E2_CACHE_BTSC_ICM | DCACHE_MODE;
++      V850E2_BHC  = 0x1010;
++#elif CONFIG_V850E2_SIM85E2C
++      V850E2_CACHE_BTSC |= (V850E2_CACHE_BTSC_ICM | V850E2_CACHE_BTSC_DCM0);
++      V850E2_BUSM_BHC = 0xFFFF;
++#endif
++#else
++      V850E2_BHC  = 0;
++#endif
++
++      /* Don't stop the simulator at `halt' instructions.  */
++      SIM85E2_NOTHAL = 1;
++
++      /* Ensure that the simulator halts on a panic, instead of going
++         into an infinite loop inside the panic function.  */
++      panic_timeout = -1;
++}
++
++void __init mach_setup (char **cmdline)
++{
++      memcons_setup ();
++}
++
++void mach_get_physical_ram (unsigned long *ram_start, unsigned long *ram_len)
++{
++      *ram_start = RAM_START;
++      *ram_len = RAM_END - RAM_START;
++}
++
++void __init mach_reserve_bootmem ()
++{
++      extern char _root_fs_image_start, _root_fs_image_end;
++      u32 root_fs_image_start = (u32)&_root_fs_image_start;
++      u32 root_fs_image_end = (u32)&_root_fs_image_end;
++
++      /* Reserve the memory used by the root filesystem image if it's
++         in RAM.  */
++      if (root_fs_image_end > root_fs_image_start
++          && root_fs_image_start >= RAM_START
++          && root_fs_image_start < RAM_END)
++              reserve_bootmem (root_fs_image_start,
++                               root_fs_image_end - root_fs_image_start);
++}
++
++void __init mach_sched_init (struct irqaction *timer_action)
++{
++      /* The simulator actually cycles through all interrupts
++         periodically.  We just pay attention to IRQ0, which gives us
++         1/64 the rate of the periodic interrupts.  */
++      setup_irq (0, timer_action);
++}
++
++void mach_gettimeofday (struct timespec *tv)
++{
++      tv->tv_sec = 0;
++      tv->tv_nsec = 0;
++}
++\f
++/* Interrupts */
++
++struct v850e_intc_irq_init irq_inits[] = {
++      { "IRQ", 0, NUM_MACH_IRQS, 1, 7 },
++      { 0 }
++};
++struct hw_interrupt_type hw_itypes[1];
++
++/* Initialize interrupts.  */
++void __init mach_init_irqs (void)
++{
++      v850e_intc_init_irq_types (irq_inits, hw_itypes);
++}
++\f
++
++void machine_halt (void) __attribute__ ((noreturn));
++void machine_halt (void)
++{
++      SIM85E2_SIMFIN = 0;     /* Halt immediately.  */
++      for (;;) {}
++}
++
++void machine_restart (char *__unused)
++{
++      machine_halt ();
++}
++
++void machine_power_off (void)
++{
++      machine_halt ();
++}
+--- linux-2.6.0-test1/arch/v850/kernel/sim85e2c.c      2003-06-14 12:18:22.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,145 +0,0 @@
+-/*
+- * arch/v850/kernel/sim85e2c.c -- Machine-specific stuff for
+- *    V850E2 RTL simulator
+- *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#include <linux/config.h>
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/mm.h>
+-#include <linux/swap.h>
+-#include <linux/bootmem.h>
+-#include <linux/irq.h>
+-
+-#include <asm/atomic.h>
+-#include <asm/page.h>
+-#include <asm/machdep.h>
+-
+-#include "mach.h"
+-
+-extern void memcons_setup (void);
+-
+-
+-void __init mach_early_init (void)
+-{
+-      extern int panic_timeout;
+-
+-      /* Don't stop the simulator at `halt' instructions.  */
+-      NOTHAL = 1;
+-
+-      /* The sim85e2c simulator tracks `undefined' values, so to make
+-         debugging easier, we begin by zeroing out all otherwise
+-         undefined registers.  This is not strictly necessary.
+-
+-         The registers we zero are:
+-             Every GPR except:
+-                 stack-pointer (r3)
+-                 task-pointer (r16)
+-                 our return addr (r31)
+-             Every system register (SPR) that we know about except for
+-             the PSW (SPR 5), which we zero except for the
+-             disable-interrupts bit.
+-      */
+-
+-      /* GPRs */
+-      asm volatile ("             mov r0, r1 ; mov r0, r2              ");
+-      asm volatile ("mov r0, r4 ; mov r0, r5 ; mov r0, r6 ; mov r0, r7 ");
+-      asm volatile ("mov r0, r8 ; mov r0, r9 ; mov r0, r10; mov r0, r11");
+-      asm volatile ("mov r0, r12; mov r0, r13; mov r0, r14; mov r0, r15");
+-      asm volatile ("             mov r0, r17; mov r0, r18; mov r0, r19");
+-      asm volatile ("mov r0, r20; mov r0, r21; mov r0, r22; mov r0, r23");
+-      asm volatile ("mov r0, r24; mov r0, r25; mov r0, r26; mov r0, r27");
+-      asm volatile ("mov r0, r28; mov r0, r29; mov r0, r30");
+-
+-      /* SPRs */
+-      asm volatile ("ldsr r0, 0;  ldsr r0, 1;  ldsr r0, 2;  ldsr r0, 3");
+-      asm volatile ("ldsr r0, 4");
+-      asm volatile ("addi 0x20, r0, r1; ldsr r1, 5"); /* PSW */
+-      asm volatile ("ldsr r0, 16; ldsr r0, 17; ldsr r0, 18; ldsr r0, 19");
+-      asm volatile ("ldsr r0, 20");
+-
+-      /* Turn on the caches.  */
+-      NA85E2C_CACHE_BTSC
+-              |= (NA85E2C_CACHE_BTSC_ICM | NA85E2C_CACHE_BTSC_DCM0);
+-      NA85E2C_BUSM_BHC = 0xFFFF;
+-
+-      /* Ensure that the simulator halts on a panic, instead of going
+-         into an infinite loop inside the panic function.  */
+-      panic_timeout = -1;
+-}
+-
+-void __init mach_setup (char **cmdline)
+-{
+-      memcons_setup ();
+-}
+-
+-void mach_get_physical_ram (unsigned long *ram_start, unsigned long *ram_len)
+-{
+-      /* There are 3 possible areas we can use:
+-           IRAM (1MB) is fast for instruction fetches, but slow for data
+-           DRAM (1020KB) is fast for data, but slow for instructions
+-           ERAM is cached, so should be fast for both insns and data,
+-                _but_ currently only supports write-through caching, so
+-                writes are slow.
+-         Since there's really no area that's good for general kernel
+-         use, we use DRAM -- it won't be good for user programs
+-         (which will be loaded into kernel allocated memory), but
+-         currently we're more concerned with testing the kernel.  */
+-      *ram_start = DRAM_ADDR;
+-      *ram_len = R0_RAM_ADDR - DRAM_ADDR;
+-}
+-
+-void __init mach_sched_init (struct irqaction *timer_action)
+-{
+-      /* The simulator actually cycles through all interrupts
+-         periodically.  We just pay attention to IRQ0, which gives us
+-         1/64 the rate of the periodic interrupts.  */
+-      setup_irq (0, timer_action);
+-}
+-
+-void mach_gettimeofday (struct timespec *tv)
+-{
+-      tv->tv_sec = 0;
+-      tv->tv_nsec = 0;
+-}
+-\f
+-/* Interrupts */
+-
+-struct nb85e_intc_irq_init irq_inits[] = {
+-      { "IRQ", 0, NUM_MACH_IRQS, 1, 7 },
+-      { 0 }
+-};
+-struct hw_interrupt_type hw_itypes[1];
+-
+-/* Initialize interrupts.  */
+-void __init mach_init_irqs (void)
+-{
+-      nb85e_intc_init_irq_types (irq_inits, hw_itypes);
+-}
+-\f
+-
+-void machine_halt (void) __attribute__ ((noreturn));
+-void machine_halt (void)
+-{
+-      SIMFIN = 0;             /* Halt immediately.  */
+-      for (;;) {}
+-}
+-
+-void machine_restart (char *__unused)
+-{
+-      machine_halt ();
+-}
+-
+-void machine_power_off (void)
+-{
+-      machine_halt ();
+-}
+--- linux-2.6.0-test1/arch/v850/kernel/teg.c   2003-06-14 12:18:25.000000000 -0700
++++ 25/arch/v850/kernel/teg.c  2003-07-19 17:03:49.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <asm/atomic.h>
+ #include <asm/page.h>
+ #include <asm/machdep.h>
+-#include <asm/nb85e_timer_d.h>
++#include <asm/v850e_timer_d.h>
+ #include "mach.h"
+@@ -31,12 +31,12 @@ void __init mach_sched_init (struct irqa
+       /* Select timer interrupt instead of external pin.  */
+       TEG_ISS |= 0x1;
+       /* Start hardware timer.  */
+-      nb85e_timer_d_configure (0, HZ);
++      v850e_timer_d_configure (0, HZ);
+       /* Install timer interrupt handler.  */
+       setup_irq (IRQ_INTCMD(0), timer_action);
+ }
+-static struct nb85e_intc_irq_init irq_inits[] = {
++static struct v850e_intc_irq_init irq_inits[] = {
+       { "IRQ", 0,             NUM_CPU_IRQS,   1, 7 },
+       { "CMD", IRQ_INTCMD(0), IRQ_INTCMD_NUM, 1, 5 },
+       { "SER", IRQ_INTSER(0), IRQ_INTSER_NUM, 1, 3 },
+@@ -51,7 +51,7 @@ static struct hw_interrupt_type hw_itype
+ /* Initialize MA chip interrupts.  */
+ void __init teg_init_irqs (void)
+ {
+-      nb85e_intc_init_irq_types (irq_inits, hw_itypes);
++      v850e_intc_init_irq_types (irq_inits, hw_itypes);
+ }
+ /* Called before configuring an on-chip UART.  */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e2_cache.c 2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,127 @@
++/*
++ * arch/v850/kernel/v850e2_cache.c -- Cache control for V850E2 cache
++ *    memories
++ *
++ *  Copyright (C) 2003  NEC Electronics Corporation
++ *  Copyright (C) 2003  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#include <linux/mm.h>
++
++#include <asm/v850e2_cache.h>
++
++/* Cache operations we can do.  The encoding corresponds directly to the
++   value we need to write into the COPR register.  */
++enum cache_op {
++      OP_SYNC_IF_DIRTY           = V850E2_CACHE_COPR_CFC(0), /* 000 */
++      OP_SYNC_IF_VALID           = V850E2_CACHE_COPR_CFC(1), /* 001 */
++      OP_SYNC_IF_VALID_AND_CLEAR = V850E2_CACHE_COPR_CFC(3), /* 011 */
++      OP_WAY_CLEAR               = V850E2_CACHE_COPR_CFC(4), /* 100 */
++      OP_FILL                    = V850E2_CACHE_COPR_CFC(5), /* 101 */
++      OP_CLEAR                   = V850E2_CACHE_COPR_CFC(6), /* 110 */
++      OP_CREATE_DIRTY            = V850E2_CACHE_COPR_CFC(7)  /* 111 */
++};
++
++/* Which cache to use.  This encoding also corresponds directly to the
++   value we need to write into the COPR register. */
++enum cache {
++      ICACHE = 0,
++      DCACHE = V850E2_CACHE_COPR_LBSL
++};
++
++/* Returns ADDR rounded down to the beginning of its cache-line.  */
++#define CACHE_LINE_ADDR(addr)  \
++   ((addr) & ~(V850E2_CACHE_LINE_SIZE - 1))
++/* Returns END_ADDR rounded up to the `limit' of its cache-line.  */
++#define CACHE_LINE_END_ADDR(end_addr)  \
++   CACHE_LINE_ADDR(end_addr + (V850E2_CACHE_LINE_SIZE - 1))
++
++\f
++/* Low-level cache ops.  */
++
++/* Apply cache-op OP to all entries in CACHE.  */
++static inline void cache_op_all (enum cache_op op, enum cache cache)
++{
++      int cmd = op | cache | V850E2_CACHE_COPR_WSLE | V850E2_CACHE_COPR_STRT;
++
++      if (op != OP_WAY_CLEAR) {
++              /* The WAY_CLEAR operation does the whole way, but other
++                 ops take begin-index and count params; we just indicate
++                 the entire cache.  */
++              V850E2_CACHE_CADL = 0;
++              V850E2_CACHE_CADH = 0;
++              V850E2_CACHE_CCNT = V850E2_CACHE_WAY_SIZE - 1;
++      }
++
++      V850E2_CACHE_COPR = cmd | V850E2_CACHE_COPR_WSL(0); /* way 0 */
++      V850E2_CACHE_COPR = cmd | V850E2_CACHE_COPR_WSL(1); /* way 1 */
++      V850E2_CACHE_COPR = cmd | V850E2_CACHE_COPR_WSL(2); /* way 2 */
++      V850E2_CACHE_COPR = cmd | V850E2_CACHE_COPR_WSL(3); /* way 3 */
++}
++
++/* Apply cache-op OP to all entries in CACHE covering addresses ADDR
++   through ADDR+LEN.  */
++static inline void cache_op_range (enum cache_op op, u32 addr, u32 len,
++                                 enum cache cache)
++{
++      u32 start = CACHE_LINE_ADDR (addr);
++      u32 end = CACHE_LINE_END_ADDR (addr + len);
++      u32 num_lines = (end - start) >> V850E2_CACHE_LINE_SIZE_BITS;
++
++      V850E2_CACHE_CADL = start & 0xFFFF;
++      V850E2_CACHE_CADH = start >> 16;
++      V850E2_CACHE_CCNT = num_lines - 1;
++
++      V850E2_CACHE_COPR = op | cache | V850E2_CACHE_COPR_STRT;
++}
++
++\f
++/* High-level ops.  */
++
++static void cache_exec_after_store_all (void)
++{
++      cache_op_all (OP_SYNC_IF_DIRTY, DCACHE);
++      cache_op_all (OP_WAY_CLEAR, ICACHE);
++}
++
++static void cache_exec_after_store_range (u32 start, u32 len)
++{
++      cache_op_range (OP_SYNC_IF_DIRTY, start, len, DCACHE);
++      cache_op_range (OP_CLEAR, start, len, ICACHE);
++}
++
++\f
++/* Exported functions.  */
++
++void flush_icache (void)
++{
++      cache_exec_after_store_all ();
++}
++
++void flush_icache_range (unsigned long start, unsigned long end)
++{
++      cache_exec_after_store_range (start, end - start);
++}
++
++void flush_icache_page (struct vm_area_struct *vma, struct page *page)
++{
++      cache_exec_after_store_range (page_to_virt (page), PAGE_SIZE);
++}
++
++void flush_icache_user_range (struct vm_area_struct *vma, struct page *page,
++                            unsigned long addr, int len)
++{
++      cache_exec_after_store_range (addr, len);
++}
++
++void flush_cache_sigtramp (unsigned long addr)
++{
++      /* For the exact size, see signal.c, but 16 bytes should be enough.  */
++      cache_exec_after_store_range (addr, 16);
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e_cache.c  2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,173 @@
++/*
++ * arch/v850/kernel/v850e_cache.c -- Cache control for V850E cache memories
++ *
++ *  Copyright (C) 2003  NEC Electronics Corporation
++ *  Copyright (C) 2003  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* This file implements cache control for the rather simple cache used on
++   some V850E CPUs, specifically the NB85E/TEG CPU-core and the V850E/ME2
++   CPU.  V850E2 processors have their own (better) cache
++   implementation.  */
++
++#include <asm/entry.h>
++#include <asm/v850e_cache.h>
++
++#define WAIT_UNTIL_CLEAR(value) while (value) {}
++
++/* Set caching params via the BHC and DCC registers.  */
++void v850e_cache_enable (u16 bhc, u16 icc, u16 dcc)
++{
++      unsigned long *r0_ram = (unsigned long *)R0_RAM_ADDR;
++      register u16 bhc_val asm ("r6") = bhc;
++
++      /* Read the instruction cache control register (ICC) and confirm
++         that bits 0 and 1 (TCLR0, TCLR1) are all cleared.  */
++      WAIT_UNTIL_CLEAR (V850E_CACHE_ICC & 0x3);
++      V850E_CACHE_ICC = icc;
++
++#ifdef V850E_CACHE_DCC
++      /* Configure data-cache.  */
++      V850E_CACHE_DCC = dcc;
++#endif /* V850E_CACHE_DCC */
++
++      /* Configure caching for various memory regions by writing the BHC
++         register.  The documentation says that an instruction _cannot_
++         enable/disable caching for the memory region in which the
++         instruction itself exists; to work around this, we store
++         appropriate instructions into the on-chip RAM area (which is never
++         cached), and briefly jump there to do the work.  */
++#ifdef V850E_CACHE_WRITE_IBS
++      *r0_ram++       = 0xf0720760;   /* st.h r0, 0xfffff072[r0] */
++#endif
++      *r0_ram++       = 0xf06a3760;   /* st.h r6, 0xfffff06a[r0] */
++      *r0_ram         = 0x5640006b;   /* jmp [r11] */
++
++      asm ("mov hilo(1f), r11; jmp [%1]; 1:;"
++           :: "r" (bhc_val), "r" (R0_RAM_ADDR) : "r11");
++}
++
++static void clear_icache (void)
++{
++      /* 1. Read the instruction cache control register (ICC) and confirm
++            that bits 0 and 1 (TCLR0, TCLR1) are all cleared.  */
++      WAIT_UNTIL_CLEAR (V850E_CACHE_ICC & 0x3);
++
++      /* 2. Read the ICC register and confirm that bit 12 (LOCK0) is
++            cleared.  Bit 13 of the ICC register is always cleared.  */
++      WAIT_UNTIL_CLEAR (V850E_CACHE_ICC & 0x1000);
++
++      /* 3. Set the TCLR0 and TCLR1 bits of the ICC register as follows,
++            when clearing way 0 and way 1 at the same time:
++              (a) Set the TCLR0 and TCLR1 bits.
++              (b) Read the TCLR0 and TCLR1 bits to confirm that these bits
++                  are cleared.
++              (c) Perform (a) and (b) above again.  */
++      V850E_CACHE_ICC |= 0x3;
++      WAIT_UNTIL_CLEAR (V850E_CACHE_ICC & 0x3);
++
++#ifdef V850E_CACHE_REPEAT_ICC_WRITE
++      /* Do it again.  */
++      V850E_CACHE_ICC |= 0x3;
++      WAIT_UNTIL_CLEAR (V850E_CACHE_ICC & 0x3);
++#endif
++}
++
++#ifdef V850E_CACHE_DCC
++/* Flush or clear (or both) the data cache, depending on the value of FLAGS;
++   the procedure is the same for both, just the control bits used differ (and
++   both may be performed simultaneously).  */
++static void dcache_op (unsigned short flags)
++{
++      /* 1. Read the data cache control register (DCC) and confirm that bits
++            0, 1, 4, and 5 (DC00, DC01, DC04, DC05) are all cleared.  */
++      WAIT_UNTIL_CLEAR (V850E_CACHE_DCC & 0x33);
++
++      /* 2. Clear DCC register bit 12 (DC12), bit 13 (DC13), or both
++            depending on the way for which tags are to be cleared.  */
++      V850E_CACHE_DCC &= ~0xC000;
++
++      /* 3. Set DCC register bit 0 (DC00), bit 1 (DC01) or both depending on
++            the way for which tags are to be cleared.
++            ...
++            Set DCC register bit 4 (DC04), bit 5 (DC05), or both depending
++            on the way to be data flushed.  */
++      V850E_CACHE_DCC |= flags;
++
++      /* 4. Read DCC register bit DC00, DC01 [DC04, DC05], or both depending
++            on the way for which tags were cleared [flushed] and confirm
++            that that bit is cleared.  */
++      WAIT_UNTIL_CLEAR (V850E_CACHE_DCC & flags);
++}
++#endif /* V850E_CACHE_DCC */
++
++/* Flushes the contents of the dcache to memory.  */
++static inline void flush_dcache (void)
++{
++#ifdef V850E_CACHE_DCC
++      /* We only need to do something if in write-back mode.  */
++      if (V850E_CACHE_DCC & 0x0400)
++              dcache_op (0x30);
++#endif /* V850E_CACHE_DCC */
++}
++
++/* Flushes the contents of the dcache to memory, and then clears it.  */
++static inline void clear_dcache (void)
++{
++#ifdef V850E_CACHE_DCC
++      /* We only need to do something if the dcache is enabled.  */
++      if (V850E_CACHE_DCC & 0x0C00)
++              dcache_op (0x33);
++#endif /* V850E_CACHE_DCC */
++}
++
++/* Clears the dcache without flushing to memory first.  */
++static inline void clear_dcache_no_flush (void)
++{
++#ifdef V850E_CACHE_DCC
++      /* We only need to do something if the dcache is enabled.  */
++      if (V850E_CACHE_DCC & 0x0C00)
++              dcache_op (0x3);
++#endif /* V850E_CACHE_DCC */
++}
++
++static inline void cache_exec_after_store (void)
++{
++      flush_dcache ();
++      clear_icache ();
++}
++
++\f
++/* Exported functions.  */
++
++void flush_icache (void)
++{
++      cache_exec_after_store ();
++}
++
++void flush_icache_range (unsigned long start, unsigned long end)
++{
++      cache_exec_after_store ();
++}
++
++void flush_icache_page (struct vm_area_struct *vma, struct page *page)
++{
++      cache_exec_after_store ();
++}
++
++void flush_icache_user_range (struct vm_area_struct *vma, struct page *page,
++                            unsigned long adr, int len)
++{
++      cache_exec_after_store ();
++}
++
++void flush_cache_sigtramp (unsigned long addr)
++{
++      cache_exec_after_store ();
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e_intc.c   2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,104 @@
++/*
++ * arch/v850/kernel/v850e_intc.c -- V850E interrupt controller (INTC)
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/irq.h>
++
++#include <asm/v850e_intc.h>
++
++static void irq_nop (unsigned irq) { }
++
++static unsigned v850e_intc_irq_startup (unsigned irq)
++{
++      v850e_intc_clear_pending_irq (irq);
++      v850e_intc_enable_irq (irq);
++      return 0;
++}
++
++static void v850e_intc_end_irq (unsigned irq)
++{
++      unsigned long psw, temp;
++
++      /* Clear the highest-level bit in the In-service priority register
++         (ISPR), to allow this interrupt (or another of the same or
++         lesser priority) to happen again.
++
++         The `reti' instruction normally does this automatically when the
++         PSW bits EP and NP are zero, but we can't always rely on reti
++         being used consistently to return after an interrupt (another
++         process can be scheduled, for instance, which can delay the
++         associated reti for a long time, or this process may be being
++         single-stepped, which uses the `dbret' instruction to return
++         from the kernel).
++
++         We also set the PSW EP bit, which prevents reti from also
++         trying to modify the ISPR itself.  */
++
++      /* Get PSW and disable interrupts.  */
++      asm volatile ("stsr psw, %0; di" : "=r" (psw));
++      /* We don't want to do anything for NMIs (they don't use the ISPR).  */
++      if (! (psw & 0xC0)) {
++              /* Transition to `trap' state, so that an eventual real
++                 reti instruction won't modify the ISPR.  */
++              psw |= 0x40;
++              /* Fake an interrupt return, which automatically clears the
++                 appropriate bit in the ISPR.  */
++              asm volatile ("mov hilo(1f), %0;"
++                            "ldsr %0, eipc; ldsr %1, eipsw;"
++                            "reti;"
++                            "1:"
++                            : "=&r" (temp) : "r" (psw));
++      }
++}
++
++/* Initialize HW_IRQ_TYPES for INTC-controlled irqs described in array
++   INITS (which is terminated by an entry with the name field == 0).  */
++void __init v850e_intc_init_irq_types (struct v850e_intc_irq_init *inits,
++                                     struct hw_interrupt_type *hw_irq_types)
++{
++      struct v850e_intc_irq_init *init;
++      for (init = inits; init->name; init++) {
++              unsigned i;
++              struct hw_interrupt_type *hwit = hw_irq_types++;
++
++              hwit->typename = init->name;
++
++              hwit->startup  = v850e_intc_irq_startup;
++              hwit->shutdown = v850e_intc_disable_irq;
++              hwit->enable   = v850e_intc_enable_irq;
++              hwit->disable  = v850e_intc_disable_irq;
++              hwit->ack      = irq_nop;
++              hwit->end      = v850e_intc_end_irq;
++              
++              /* Initialize kernel IRQ infrastructure for this interrupt.  */
++              init_irq_handlers(init->base, init->num, init->interval, hwit);
++
++              /* Set the interrupt priorities.  */
++              for (i = 0; i < init->num; i++) {
++                      unsigned irq = init->base + i * init->interval;
++
++                      /* If the interrupt is currently enabled (all
++                         interrupts are initially disabled), then
++                         assume whoever enabled it has set things up
++                         properly, and avoid messing with it.  */
++                      if (! v850e_intc_irq_enabled (irq))
++                              /* This write also (1) disables the
++                                 interrupt, and (2) clears any pending
++                                 interrupts.  */
++                              V850E_INTC_IC (irq)
++                                      = (V850E_INTC_IC_PR (init->priority)
++                                         | V850E_INTC_IC_MK);
++              }
++      }
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e_timer_d.c        2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,54 @@
++/*
++ * include/asm-v850/v850e_timer_d.c -- `Timer D' component often used
++ *    with V850E CPUs
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#include <linux/kernel.h>
++
++#include <asm/v850e_utils.h>
++#include <asm/v850e_timer_d.h>
++
++/* Start interval timer TIMER (0-3).  The timer will issue the
++   corresponding INTCMD interrupt RATE times per second.
++   This function does not enable the interrupt.  */
++void v850e_timer_d_configure (unsigned timer, unsigned rate)
++{
++      unsigned divlog2, count;
++
++      /* Calculate params for timer.  */
++      if (! calc_counter_params (
++                  V850E_TIMER_D_BASE_FREQ, rate,
++                  V850E_TIMER_D_TMCD_CS_MIN, V850E_TIMER_D_TMCD_CS_MAX, 16,
++                  &divlog2, &count))
++              printk (KERN_WARNING
++                      "Cannot find interval timer %d setting suitable"
++                      " for rate of %dHz.\n"
++                      "Using rate of %dHz instead.\n",
++                      timer, rate,
++                      (V850E_TIMER_D_BASE_FREQ >> divlog2) >> 16);
++
++      /* Do the actual hardware timer initialization:  */
++
++      /* Enable timer.  */
++      V850E_TIMER_D_TMCD(timer) = V850E_TIMER_D_TMCD_CAE;
++      /* Set clock divider.  */
++      V850E_TIMER_D_TMCD(timer)
++              = V850E_TIMER_D_TMCD_CAE
++              | V850E_TIMER_D_TMCD_CS(divlog2);
++      /* Set timer compare register.  */
++      V850E_TIMER_D_CMD(timer) = count;
++      /* Start counting.  */
++      V850E_TIMER_D_TMCD(timer)
++              = V850E_TIMER_D_TMCD_CAE
++              | V850E_TIMER_D_TMCD_CS(divlog2)
++              | V850E_TIMER_D_TMCD_CE;
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/kernel/v850e_utils.c  2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,62 @@
++/*
++ * include/asm-v850/v850e_utils.h -- Utility functions associated with
++ *    V850E CPUs
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#include <asm/v850e_utils.h>
++
++/* Calculate counter clock-divider and count values to attain the
++   desired frequency RATE from the base frequency BASE_FREQ.  The
++   counter is expected to have a clock-divider, which can divide the
++   system cpu clock by a power of two value from MIN_DIVLOG2 to
++   MAX_DIV_LOG2, and a word-size of COUNTER_SIZE bits (the counter
++   counts up and resets whenever it's equal to the compare register,
++   generating an interrupt or whatever when it does so).  The returned
++   values are: *DIVLOG2 -- log2 of the desired clock divider and *COUNT
++   -- the counter compare value to use.  Returns true if it was possible
++   to find a reasonable value, otherwise false (and the other return
++   values will be set to be as good as possible).  */
++int calc_counter_params (unsigned long base_freq,
++                       unsigned long rate,
++                       unsigned min_divlog2, unsigned max_divlog2,
++                       unsigned counter_size,
++                       unsigned *divlog2, unsigned *count)
++{
++      unsigned _divlog2;
++      int ok = 0;
++
++      /* Find the lowest clock divider setting that can represent RATE.  */
++      for (_divlog2 = min_divlog2; _divlog2 <= max_divlog2; _divlog2++) {
++              /* Minimum interrupt rate possible using this divider.  */
++              unsigned min_int_rate
++                      = (base_freq >> _divlog2) >> counter_size;
++
++              if (min_int_rate <= rate) {
++                      /* This setting is the highest resolution
++                         setting that's slow enough enough to attain
++                         RATE interrupts per second, so use it.  */
++                      ok = 1;
++                      break;
++              }
++      }
++
++      if (_divlog2 > max_divlog2)
++              /* Can't find correct setting.  */
++              _divlog2 = max_divlog2;
++
++      if (divlog2)
++              *divlog2 = _divlog2;
++      if (count)
++              *count = ((base_freq >> _divlog2) + rate/2) / rate;
++
++      return ok;
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/rte_me2_cb.ld 2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,30 @@
++/* Linker script for the Midas labs RTE-V850E/ME2-CB evaluation board
++   (CONFIG_RTE_CB_ME2), with kernel in SDRAM.  */
++
++MEMORY {
++      /* 128Kbyte of IRAM */
++      IRAM : ORIGIN = 0x00000000, LENGTH = 0x00020000
++      
++      /* 32MB of SDRAM.  */
++      SDRAM : ORIGIN = 0x00800000, LENGTH = 0x02000000
++}
++
++#define KRAM SDRAM
++
++SECTIONS {
++      .text : {
++              __kram_start = . ;
++              TEXT_CONTENTS
++              INTV_CONTENTS   /* copy to iRAM (0x0-0x620) */
++      } > KRAM
++
++      .data : {
++              DATA_CONTENTS
++              BSS_CONTENTS
++              RAMK_INIT_CONTENTS
++              __kram_end = . ;
++              BOOTMAP_CONTENTS
++      } > KRAM
++      
++      .root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM
++}
+--- linux-2.6.0-test1/arch/v850/sim85e2c.ld    2003-06-14 12:18:34.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,44 +0,0 @@
+-/* Linker script for the sim85e2c simulator, which is a verilog simulation of
+-   the V850E2 NA85E2C cpu core (CONFIG_V850E2_SIM85E2C).  */
+-
+-MEMORY {
+-      /* 1MB of `instruction RAM', starting at 0.
+-         Instruction fetches are much faster from IRAM than from DRAM.
+-         This should match IRAM_ADDR in "include/asm-v580/sim85e2c.h".    */
+-      IRAM    : ORIGIN = 0x00000000, LENGTH = 0x00100000
+-
+-      /* 1MB of `data RAM', below and contiguous with the I/O space.
+-         Data fetches are much faster from DRAM than from IRAM.
+-         This should match DRAM_ADDR in "include/asm-v580/sim85e2c.h".  */
+-      DRAM    : ORIGIN = 0xfff00000, LENGTH = 0x000ff000
+-      /* We have to load DRAM at a mirror-address of 0x1ff00000,
+-         because the simulator's preprocessing script isn't smart
+-         enough to deal with the above LMA.  */
+-      DRAM_LOAD : ORIGIN = 0x1ff00000, LENGTH = 0x000ff000
+-
+-      /* `external ram' (CS1 area), comes after IRAM.
+-         This should match ERAM_ADDR in "include/asm-v580/sim85e2c.h".  */
+-      ERAM    : ORIGIN = 0x00100000, LENGTH = 0x07f00000
+-}
+-
+-SECTIONS {
+-      .iram : {
+-              INTV_CONTENTS
+-              TEXT_CONTENTS
+-              RAMK_INIT_CONTENTS
+-      } > IRAM
+-      .data : {
+-              __kram_start = . ;
+-              DATA_CONTENTS
+-              BSS_CONTENTS
+-              ROOT_FS_CONTENTS
+-
+-              /* We stick console output into a buffer here.  */
+-              _memcons_output = . ;
+-              . = . + 0x8000 ;
+-              _memcons_output_end = . ;
+-
+-              __kram_end = . ;
+-              BOOTMAP_CONTENTS
+-      } > DRAM  AT> DRAM_LOAD
+-}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/arch/v850/sim85e2.ld    2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,44 @@
++/* Linker script for the sim85e2c simulator, which is a verilog simulation of
++   the V850E2 NA85E2C cpu core (CONFIG_V850E2_SIM85E2C).  */
++
++MEMORY {
++      /* 1MB of `instruction RAM', starting at 0.
++         Instruction fetches are much faster from IRAM than from DRAM.
++         This should match IRAM_ADDR in "include/asm-v580/sim85e2c.h".    */
++      IRAM            : ORIGIN = 0x00000000, LENGTH = 0x00100000
++
++      /* 1MB of `data RAM', below and contiguous with the I/O space.
++         Data fetches are much faster from DRAM than from IRAM.
++         This should match DRAM_ADDR in "include/asm-v580/sim85e2c.h".  */
++      DRAM            : ORIGIN = 0xfff00000, LENGTH = 0x000ff000
++      /* We have to load DRAM at a mirror-address of 0x1ff00000,
++         because the simulator's preprocessing script isn't smart
++         enough to deal with the above LMA.  */
++      DRAM_LOAD       : ORIGIN = 0x1ff00000, LENGTH = 0x000ff000
++
++      /* `external ram' (CS1 area), comes after IRAM.
++         This should match ERAM_ADDR in "include/asm-v580/sim85e2c.h".  */
++      ERAM            : ORIGIN = 0x00100000, LENGTH = 0x07f00000
++
++      /* Dynamic RAM; uses memory controller.  */
++      /* SDRAM        : ORIGIN = 0x10000000, LENGTH = 0x01000000 */
++      SDRAM           : ORIGIN = 0x10000000, LENGTH = 0x00200000/*use 2MB*/
++}
++
++SECTIONS {
++      .iram : {
++              INTV_CONTENTS
++              *arch/v850/kernel/head.o
++              *(.early.text)
++      } > IRAM
++      .dram : {
++              _memcons_output = . ;
++              . = . + 0x8000 ;
++              _memcons_output_end = . ;
++      } > DRAM
++      .sdram : {
++              /* We stick console output into a buffer here.  */
++              RAMK_KRAM_CONTENTS
++              ROOT_FS_CONTENTS
++      } > SDRAM
++}
+--- linux-2.6.0-test1/arch/v850/vmlinux.lds.S  2003-06-22 12:04:44.000000000 -0700
++++ 25/arch/v850/vmlinux.lds.S 2003-07-19 17:03:49.000000000 -0700
+@@ -206,8 +206,8 @@ _jiffies = _jiffies_64 ;
+ # include "sim.ld"
+ #endif
+-#ifdef CONFIG_V850E2_SIM85E2C
+-# include "sim85e2c.ld"
++#ifdef CONFIG_V850E2_SIM85E2
++# include "sim85e2.ld"
+ #endif
+ #ifdef CONFIG_V850E2_FPGA85E2C
+@@ -247,3 +247,8 @@ _jiffies = _jiffies_64 ;
+ #  include "rte_nb85e_cb.ld"
+ # endif
+ #endif
++
++#ifdef CONFIG_RTE_CB_ME2
++#  include "rte_me2_cb.ld"
++#endif
++
+--- linux-2.6.0-test1/arch/x86_64/boot/compressed/head.S       2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/x86_64/boot/compressed/head.S      2003-07-19 17:04:53.000000000 -0700
+@@ -26,6 +26,7 @@
+ .code32
+ .text
++#define IN_BOOTLOADER
+ #include <linux/linkage.h>
+ #include <asm/segment.h>
+--- linux-2.6.0-test1/arch/x86_64/boot/compressed/misc.c       2003-06-26 22:07:24.000000000 -0700
++++ 25/arch/x86_64/boot/compressed/misc.c      2003-07-19 17:04:53.000000000 -0700
+@@ -9,6 +9,7 @@
+  * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
+  */
++#define IN_BOOTLOADER
+ #include "miscsetup.h"
+ #include <asm/io.h>
+--- linux-2.6.0-test1/arch/x86_64/ia32/syscall32.c     2003-06-14 12:18:24.000000000 -0700
++++ 25/arch/x86_64/ia32/syscall32.c    2003-07-19 17:07:16.000000000 -0700
+@@ -29,12 +29,15 @@ char *syscall32_page; 
+    and let it be handled by generic VM */ 
+ int map_syscall32(struct mm_struct *mm, unsigned long address) 
+ { 
++      pgd_t *pgd;
++      pmd_t *pmd;
+       pte_t *pte;
+       int err = 0;
+       down_read(&mm->mmap_sem);
+       spin_lock(&mm->page_table_lock); 
+-      pmd_t *pmd = pmd_alloc(mm, pgd_offset(mm, address), address); 
+-      if (pmd && (pte = pte_alloc_map(mm, pmd, address)) != NULL) { 
++      pgd = pgd_offset(mm, address);
++      pmd = pmd_alloc_map(mm, pgd, address);
++      if (pmd && (pte = pte_alloc_map(mm, pgd, &pmd, address)) != NULL) {
+               if (pte_none(*pte)) { 
+                       set_pte(pte, 
+                               mk_pte(virt_to_page(syscall32_page), 
+--- linux-2.6.0-test1/arch/x86_64/kernel/apic.c        2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/x86_64/kernel/apic.c       2003-07-19 17:04:07.000000000 -0700
+@@ -298,8 +298,8 @@ void __init setup_local_APIC (void)
+        * Double-check whether this APIC is really registered.
+        * This is meaningless in clustered apic mode, so we skip it.
+        */
+-      if (!clustered_apic_mode && 
+-          !test_bit(GET_APIC_ID(apic_read(APIC_ID)), &phys_cpu_present_map))
++      if (!clustered_apic_mode &&
++              !cpu_isset(GET_APIC_ID(apic_read(APIC_ID)), phys_cpu_present_map))
+               BUG();
+       /*
+@@ -997,7 +997,7 @@ int __init APIC_init_uniprocessor (void)
+       connect_bsp_APIC();
+-      phys_cpu_present_map = 1;
++      phys_cpu_present_map = cpumask_of_cpu(0);
+       apic_write_around(APIC_ID, boot_cpu_id);
+       setup_local_APIC();
+--- linux-2.6.0-test1/arch/x86_64/kernel/io_apic.c     2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/x86_64/kernel/io_apic.c    2003-07-19 17:04:07.000000000 -0700
+@@ -1014,7 +1014,7 @@ void disable_IO_APIC(void)
+ static void __init setup_ioapic_ids_from_mpc (void)
+ {
+       union IO_APIC_reg_00 reg_00;
+-      unsigned long phys_id_present_map = phys_cpu_present_map;
++      cpumask_t phys_id_present_map = phys_cpu_present_map;
+       int apic;
+       int i;
+       unsigned char old_id;
+@@ -1047,22 +1047,22 @@ static void __init setup_ioapic_ids_from
+                * system must have a unique ID or we get lots of nice
+                * 'stuck on smp_invalidate_needed IPI wait' messages.
+                */
+-              if (phys_id_present_map & (1 << mp_ioapics[apic].mpc_apicid)) {
++              if (cpu_isset(mp_ioapics[apic].mpc_apicid, phys_id_present_map)) {
+                       printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
+                               apic, mp_ioapics[apic].mpc_apicid);
+                       for (i = 0; i < 0xf; i++)
+-                              if (!(phys_id_present_map & (1 << i)))
++                              if (!cpu_isset(i, phys_id_present_map))
+                                       break;
+                       if (i >= 0xf)
+                               panic("Max APIC ID exceeded!\n");
+                       printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
+                               i);
+-                      phys_id_present_map |= 1 << i;
++                      cpu_set(i, phys_id_present_map);
+                       mp_ioapics[apic].mpc_apicid = i;
+               } else {
+                       printk(KERN_INFO 
+                              "Using IO-APIC %d\n", mp_ioapics[apic].mpc_apicid);
+-                      phys_id_present_map |= 1 << mp_ioapics[apic].mpc_apicid;
++                      cpu_set(mp_ioapics[apic].mpc_apicid, phys_id_present_map);
+               }
+@@ -1638,7 +1638,7 @@ void __init mp_config_ioapic_for_sci(int
+ int __init io_apic_get_unique_id (int ioapic, int apic_id)
+ {
+       union IO_APIC_reg_00 reg_00;
+-      static unsigned long apic_id_map = 0;
++      static cpumask_t apic_id_map;
+       unsigned long flags;
+       int i = 0;
+@@ -1651,7 +1651,7 @@ int __init io_apic_get_unique_id (int io
+        *      advantage of new APIC bus architecture.
+        */
+-      if (!apic_id_map)
++      if (!cpus_empty(apic_id_map))
+               apic_id_map = phys_cpu_present_map;
+       spin_lock_irqsave(&ioapic_lock, flags);
+@@ -1668,10 +1668,10 @@ int __init io_apic_get_unique_id (int io
+        * Every APIC in a system must have a unique ID or we get lots of nice 
+        * 'stuck on smp_invalidate_needed IPI wait' messages.
+        */
+-      if (apic_id_map & (1 << apic_id)) {
++      if (cpu_isset(apic_id, apic_id_map)) {
+               for (i = 0; i < IO_APIC_MAX_ID; i++) {
+-                      if (!(apic_id_map & (1 << i)))
++                      if (!cpu_isset(i, apic_id_map))
+                               break;
+               }
+@@ -1684,7 +1684,7 @@ int __init io_apic_get_unique_id (int io
+               apic_id = i;
+       } 
+-      apic_id_map |= (1 << apic_id);
++      cpu_set(apic_id, apic_id_map);
+       if (reg_00.bits.ID != apic_id) {
+               reg_00.bits.ID = apic_id;
+--- linux-2.6.0-test1/arch/x86_64/kernel/irq.c 2003-06-14 12:18:08.000000000 -0700
++++ 25/arch/x86_64/kernel/irq.c        2003-07-19 17:04:07.000000000 -0700
+@@ -792,13 +792,13 @@ int setup_irq(unsigned int irq, struct i
+ static struct proc_dir_entry * root_irq_dir;
+ static struct proc_dir_entry * irq_dir [NR_IRQS];
+-#define HEX_DIGITS 8
++#define HEX_DIGITS (2*sizeof(cpumask_t))
+ static unsigned int parse_hex_value (const char *buffer,
+-              unsigned long count, unsigned long *ret)
++              unsigned long count, cpumask_t *ret)
+ {
+       unsigned char hexnum [HEX_DIGITS];
+-      unsigned long value;
++      cpumask_t value = CPU_MASK_NONE;
+       unsigned i;
+       if (!count)
+@@ -812,10 +812,9 @@ static unsigned int parse_hex_value (con
+        * Parse the first 8 characters as a hex string, any non-hex char
+        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+        */
+-      value = 0;
+       for (i = 0; i < count; i++) {
+-              unsigned int c = hexnum[i];
++              unsigned int k, c = hexnum[i];
+               switch (c) {
+                       case '0' ... '9': c -= '0'; break;
+@@ -824,7 +823,10 @@ static unsigned int parse_hex_value (con
+               default:
+                       goto out;
+               }
+-              value = (value << 4) | c;
++              cpus_shift_left(value, value, 4);
++              for (k = 0; k < 4; ++k)
++                      if (c & (1 << k))
++                              cpu_set(k, value);
+       }
+ out:
+       *ret = value;
+@@ -835,20 +837,31 @@ out:
+ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
++static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
+ static int irq_affinity_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
++      int k, len;
++      cpumask_t tmp = irq_affinity[(long)data];
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
++
++      for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int irq_affinity_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+       int irq = (long) data, full_count = count, err;
+-      unsigned long new_value;
++      cpumask_t tmp, new_value;
+       if (!irq_desc[irq].handler->set_affinity)
+               return -EIO;
+@@ -860,7 +873,8 @@ static int irq_affinity_write_proc (stru
+        * way to make the system unusable accidentally :-) At least
+        * one online CPU still has to be targeted.
+        */
+-      if (!(new_value & cpu_online_map))
++      cpus_and(tmp, new_value, cpu_online_map);
++      if (cpus_empty(tmp))
+               return -EINVAL;
+       irq_affinity[irq] = new_value;
+@@ -874,17 +888,28 @@ static int irq_affinity_write_proc (stru
+ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data;
++      cpumask_t tmp, *mask = (cpumask_t *) data;
++      int k, len;
++
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+-      return sprintf (page, "%08lx\n", *mask);
++
++      tmp = *mask;
++      for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
++              len += j;
++              page += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++      len += sprintf(page, "\n");
++      return len;
+ }
+ static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+ {
+-      unsigned long *mask = (unsigned long *) data, full_count = count, err;
+-      unsigned long new_value;
++      unsigned long full_count = count, err;
++      cpumask_t new_value, *mask = (cpumask_t *)data;
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+--- linux-2.6.0-test1/arch/x86_64/kernel/ldt.c 2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/x86_64/kernel/ldt.c        2003-07-19 17:04:07.000000000 -0700
+@@ -60,9 +60,12 @@ static int alloc_ldt(mm_context_t *pc, u
+       wmb();
+       if (reload) {
+ #ifdef CONFIG_SMP
++              cpumask_t mask;
++
+               preempt_disable();
++              mask = cpumask_of_cpu(smp_processor_id());
+               load_LDT(pc);
+-              if (current->mm->cpu_vm_mask != (1UL<<smp_processor_id()))
++              if (!cpus_equal(current->mm->cpu_vm_mask, mask))
+                       smp_call_function(flush_ldt, 0, 1, 1);
+               preempt_enable();
+ #else
+--- linux-2.6.0-test1/arch/x86_64/kernel/mpparse.c     2003-06-14 12:18:06.000000000 -0700
++++ 25/arch/x86_64/kernel/mpparse.c    2003-07-19 17:04:07.000000000 -0700
+@@ -65,7 +65,7 @@ unsigned int boot_cpu_id = -1U;
+ static unsigned int num_processors = 0;
+ /* Bitmask of physically existing CPUs */
+-unsigned long phys_cpu_present_map = 0;
++cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
+ /* ACPI MADT entry parsing functions */
+ #ifdef CONFIG_ACPI_BOOT
+@@ -124,7 +124,7 @@ static void __init MP_processor_info (st
+       }
+       ver = m->mpc_apicver;
+-      phys_cpu_present_map |= 1 << m->mpc_apicid;
++      cpu_set(m->mpc_apicid, phys_cpu_present_map);
+       /*
+        * Validate version
+        */
+--- linux-2.6.0-test1/arch/x86_64/kernel/msr.c 2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/x86_64/kernel/msr.c        2003-07-19 17:04:07.000000000 -0700
+@@ -242,7 +242,7 @@ static int msr_open(struct inode *inode,
+   int cpu = minor(file->f_dentry->d_inode->i_rdev);
+   struct cpuinfo_x86 *c = &(cpu_data)[cpu];
+   
+-  if ( !(cpu_online_map & (1UL << cpu)) )
++  if (!cpu_online(cpu))
+     return -ENXIO;            /* No such CPU */
+   if ( !cpu_has(c, X86_FEATURE_MSR) )
+     return -EIO;              /* MSR not supported */
+--- linux-2.6.0-test1/arch/x86_64/kernel/reboot.c      2003-06-14 12:18:30.000000000 -0700
++++ 25/arch/x86_64/kernel/reboot.c     2003-07-19 17:04:07.000000000 -0700
+@@ -110,7 +110,7 @@ static void smp_halt(void)
+       }
+       /* Wait for all other CPUs to have run smp_stop_cpu */
+-      while (cpu_online_map) 
++      while (!cpus_empty(cpu_online_map))
+               rep_nop(); 
+ }
+ #endif
+--- linux-2.6.0-test1/arch/x86_64/kernel/setup.c       2003-07-02 14:53:14.000000000 -0700
++++ 25/arch/x86_64/kernel/setup.c      2003-07-19 17:04:07.000000000 -0700
+@@ -643,7 +643,7 @@ static int show_cpuinfo(struct seq_file 
+ #ifdef CONFIG_SMP
+-      if (!(cpu_online_map & (1<<(c-cpu_data))))
++      if (!cpu_online(c-cpu_data))
+               return 0;
+ #endif
+--- linux-2.6.0-test1/arch/x86_64/kernel/smpboot.c     2003-06-16 22:32:20.000000000 -0700
++++ 25/arch/x86_64/kernel/smpboot.c    2003-07-19 17:04:07.000000000 -0700
+@@ -54,11 +54,11 @@
+ #include <asm/proto.h>
+ /* Bitmask of currently online CPUs */
+-unsigned long cpu_online_map = 1;
++cpumask_t cpu_online_map;
+-static volatile unsigned long cpu_callin_map;
+-volatile unsigned long cpu_callout_map;
+-static unsigned long smp_commenced_mask;
++static cpumask_t cpu_callin_map;
++cpumask_t cpu_callout_map;
++static cpumask_t smp_commenced_mask;
+ /* Per CPU bogomips and other parameters */
+ struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
+@@ -174,7 +174,7 @@ static void __init synchronize_tsc_bp (v
+       sum = 0;
+       for (i = 0; i < NR_CPUS; i++) {
+-              if (test_bit(i, &cpu_callout_map)) {
++              if (cpu_isset(i, cpu_callout_map)) {
+               t0 = tsc_values[i];
+               sum += t0;
+       }
+@@ -183,7 +183,7 @@ static void __init synchronize_tsc_bp (v
+       sum = 0;
+       for (i = 0; i < NR_CPUS; i++) {
+-              if (!test_bit(i, &cpu_callout_map))
++              if (!cpu_isset(i, cpu_callout_map))
+                       continue;
+               delta = tsc_values[i] - avg;
+@@ -258,7 +258,7 @@ void __init smp_callin(void)
+        */
+       phys_id = GET_APIC_ID(apic_read(APIC_ID));
+       cpuid = smp_processor_id();
+-      if (test_and_set_bit(cpuid, &cpu_callin_map)) {
++      if (cpu_test_and_set(cpuid, cpu_callin_map)) {
+               panic("smp_callin: phys CPU#%d, CPU#%d already present??\n",
+                                       phys_id, cpuid);
+       }
+@@ -280,7 +280,7 @@ void __init smp_callin(void)
+               /*
+                * Has the boot CPU finished it's STARTUP sequence?
+                */
+-              if (test_bit(cpuid, &cpu_callout_map))
++              if (cpu_isset(cpuid, cpu_callout_map))
+                       break;
+               rep_nop();
+       }
+@@ -320,7 +320,7 @@ void __init smp_callin(void)
+       /*
+        * Allow the master to continue.
+        */
+-      set_bit(cpuid, &cpu_callin_map);
++      cpu_set(cpuid, cpu_callin_map);
+       /*
+        *      Synchronize the TSC with the BP
+@@ -348,7 +348,7 @@ void __init start_secondary(void)
+       barrier();
+       Dprintk("cpu %d: waiting for commence\n", smp_processor_id()); 
+-      while (!test_bit(smp_processor_id(), &smp_commenced_mask))
++      while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
+               rep_nop();
+       Dprintk("cpu %d: setting up apic clock\n", smp_processor_id());         
+@@ -372,7 +372,7 @@ void __init start_secondary(void)
+       local_flush_tlb();
+       Dprintk("cpu %d eSetting cpu_online_map\n", smp_processor_id()); 
+-      set_bit(smp_processor_id(), &cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
+       wmb();
+       
+       cpu_idle();
+@@ -630,19 +630,19 @@ static void __init do_boot_cpu (int apic
+                * allow APs to start initializing.
+                */
+               Dprintk("Before Callout %d.\n", cpu);
+-              set_bit(cpu, &cpu_callout_map);
++              cpu_set(cpu, cpu_callout_map);
+               Dprintk("After Callout %d.\n", cpu);
+               /*
+                * Wait 5s total for a response
+                */
+               for (timeout = 0; timeout < 50000; timeout++) {
+-                      if (test_bit(cpu, &cpu_callin_map))
++                      if (cpu_isset(cpu, cpu_callin_map))
+                               break;  /* It has booted */
+                       udelay(100);
+               }
+-              if (test_bit(cpu, &cpu_callin_map)) {
++              if (cpu_isset(cpu, cpu_callin_map)) {
+                       /* number CPUs logically, starting from 1 (BSP is 0) */
+                       Dprintk("OK.\n");
+                       printk(KERN_INFO "CPU%d: ", cpu);
+@@ -663,7 +663,7 @@ static void __init do_boot_cpu (int apic
+               }
+       }
+       if (boot_error) {
+-              clear_bit(cpu, &cpu_callout_map); /* was set here (do_boot_cpu()) */
++              cpu_clear(cpu, cpu_callout_map); /* was set here (do_boot_cpu()) */
+               clear_bit(cpu, &cpu_initialized); /* was set by cpu_init() */
+               cpucount--;
+       }
+@@ -734,10 +734,10 @@ static void __init smp_boot_cpus(unsigne
+       current_thread_info()->cpu = 0;
+       smp_tune_scheduling();
+-      if (!test_bit(hard_smp_processor_id(), &phys_cpu_present_map)) {
++      if (!cpu_isset(hard_smp_processor_id(), phys_cpu_present_map)) {
+               printk("weird, boot CPU (#%d) not listed by the BIOS.\n",
+                      hard_smp_processor_id());
+-              phys_cpu_present_map |= (1 << hard_smp_processor_id());
++              cpu_set(hard_smp_processor_id(), phys_cpu_present_map);
+       }
+       /*
+@@ -747,8 +747,8 @@ static void __init smp_boot_cpus(unsigne
+       if (!smp_found_config) {
+               printk(KERN_NOTICE "SMP motherboard not detected.\n");
+               io_apic_irqs = 0;
+-              cpu_online_map = phys_cpu_present_map = 1;
+-              phys_cpu_present_map = 1;
++              cpu_online_map = cpumask_of_cpu(0);
++              phys_cpu_present_map = cpumask_of_cpu(0);
+               if (APIC_init_uniprocessor())
+                       printk(KERN_NOTICE "Local APIC not detected."
+                                          " Using dummy APIC emulation.\n");
+@@ -759,10 +759,10 @@ static void __init smp_boot_cpus(unsigne
+        * Should not be necessary because the MP table should list the boot
+        * CPU too, but we do it for the sake of robustness anyway.
+        */
+-      if (!test_bit(boot_cpu_id, &phys_cpu_present_map)) {
++      if (!cpu_isset(boot_cpu_id, phys_cpu_present_map)) {
+               printk(KERN_NOTICE "weird, boot CPU (#%d) not listed by the BIOS.\n",
+                                                                boot_cpu_id);
+-              phys_cpu_present_map |= (1 << hard_smp_processor_id());
++              cpu_set(hard_smp_processor_id(), phys_cpu_present_map);
+       }
+       /*
+@@ -773,8 +773,8 @@ static void __init smp_boot_cpus(unsigne
+                       boot_cpu_id);
+               printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n");
+               io_apic_irqs = 0;
+-              cpu_online_map = phys_cpu_present_map = 1;
+-              phys_cpu_present_map = 1;
++              cpu_online_map = cpumask_of_cpu(0);
++              phys_cpu_present_map = cpumask_of_cpu(0);
+               disable_apic = 1;
+               goto smp_done;
+       }
+@@ -788,8 +788,8 @@ static void __init smp_boot_cpus(unsigne
+               smp_found_config = 0;
+               printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n");
+               io_apic_irqs = 0;
+-              cpu_online_map = phys_cpu_present_map = 1;
+-              phys_cpu_present_map = 1;
++              cpu_online_map = cpumask_of_cpu(0);
++              phys_cpu_present_map = cpumask_of_cpu(0);
+               disable_apic = 1;
+               goto smp_done;
+       }
+@@ -812,7 +812,7 @@ static void __init smp_boot_cpus(unsigne
+               if (apicid == boot_cpu_id)
+                       continue;
+-              if (!(phys_cpu_present_map & (1 << apicid)))
++              if (!cpu_isset(apicid, phys_cpu_present_map))
+                       continue;
+               if ((max_cpus >= 0) && (max_cpus <= cpucount+1))
+                       continue;
+@@ -848,7 +848,7 @@ static void __init smp_boot_cpus(unsigne
+       } else {
+               unsigned long bogosum = 0;
+               for (cpu = 0; cpu < NR_CPUS; cpu++)
+-                      if (cpu_callout_map & (1<<cpu))
++                      if (cpu_isset(cpu, cpu_callout_map))
+                               bogosum += cpu_data[cpu].loops_per_jiffy;
+               printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
+                       cpucount+1,
+@@ -889,20 +889,20 @@ void __init smp_prepare_cpus(unsigned in
+ void __devinit smp_prepare_boot_cpu(void)
+ {
+-      set_bit(smp_processor_id(), &cpu_online_map);
+-      set_bit(smp_processor_id(), &cpu_callout_map);
++      cpu_set(smp_processor_id(), cpu_online_map);
++      cpu_set(smp_processor_id(), cpu_callout_map);
+ }
+ int __devinit __cpu_up(unsigned int cpu)
+ {
+       /* This only works at boot for x86.  See "rewrite" above. */
+-      if (test_bit(cpu, &smp_commenced_mask)) { 
++      if (cpu_isset(cpu, smp_commenced_mask)) {
+               local_irq_enable();
+               return -ENOSYS;
+       }
+       /* In case one didn't come up */
+-      if (!test_bit(cpu, &cpu_callin_map)) { 
++      if (!cpu_isset(cpu, cpu_callin_map)) {
+               local_irq_enable();
+               return -EIO;
+       }
+@@ -911,8 +911,8 @@ int __devinit __cpu_up(unsigned int cpu)
+       /* Unleash the CPU! */
+       Dprintk("waiting for cpu %d\n", cpu);
+-      set_bit(cpu, &smp_commenced_mask);
+-      while (!test_bit(cpu, &cpu_online_map))
++      cpu_set(cpu, smp_commenced_mask);
++      while (!cpu_isset(cpu, cpu_online_map))
+               mb();
+       return 0;
+ }
+--- linux-2.6.0-test1/arch/x86_64/kernel/smp.c 2003-06-14 12:18:04.000000000 -0700
++++ 25/arch/x86_64/kernel/smp.c        2003-07-19 17:04:07.000000000 -0700
+@@ -92,8 +92,9 @@ void send_IPI_self(int vector)
+       __send_IPI_shortcut(APIC_DEST_SELF, vector);
+ }
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t cpumask, int vector)
+ {
++      unsigned long mask = cpus_coerce(cpumask);
+       unsigned long cfg;
+       unsigned long flags;
+@@ -133,7 +134,7 @@ static inline void send_IPI_mask(int mas
+  *    Optimizations Manfred Spraul <manfred@colorfullife.com>
+  */
+-static volatile unsigned long flush_cpumask;
++static volatile cpumask_t flush_cpumask;
+ static struct mm_struct * flush_mm;
+ static unsigned long flush_va;
+ static spinlock_t tlbstate_lock = SPIN_LOCK_UNLOCKED;
+@@ -203,7 +204,7 @@ asmlinkage void smp_invalidate_interrupt
+       cpu = get_cpu();
+-      if (!test_bit(cpu, &flush_cpumask))
++      if (!cpu_isset(cpu, flush_cpumask))
+               goto out;
+               /* 
+                * This was a BUG() but until someone can quote me the
+@@ -224,15 +225,16 @@ asmlinkage void smp_invalidate_interrupt
+                       leave_mm(cpu);
+       }
+       ack_APIC_irq();
+-      clear_bit(cpu, &flush_cpumask);
++      cpu_clear(cpu, flush_cpumask);
+ out:
+       put_cpu_no_resched();
+ }
+-static void flush_tlb_others (unsigned long cpumask, struct mm_struct *mm,
++static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
+                                               unsigned long va)
+ {
++      cpumask_t tmp;
+       /*
+        * A couple of (to be removed) sanity checks:
+        *
+@@ -240,12 +242,10 @@ static void flush_tlb_others (unsigned l
+        * - current CPU must not be in mask
+        * - mask must exist :)
+        */
+-      if (!cpumask)
+-              BUG();
+-      if ((cpumask & cpu_online_map) != cpumask)
+-              BUG();
+-      if (cpumask & (1 << smp_processor_id()))
+-              BUG();
++      BUG_ON(cpus_empty(cpumask));
++      cpus_and(tmp, cpumask, cpu_online_map);
++      BUG_ON(!cpus_equal(tmp, cpumask));
++      BUG_ON(cpu_isset(smp_processor_id(), cpumask));
+       if (!mm)
+               BUG();
+@@ -259,14 +259,15 @@ static void flush_tlb_others (unsigned l
+       
+       flush_mm = mm;
+       flush_va = va;
+-      atomic_set_mask(cpumask, &flush_cpumask);
++      cpus_or(flush_cpumask, cpumask, flush_cpumask);
++
+       /*
+        * We have to send the IPI only to
+        * CPUs affected.
+        */
+       send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);
+-      while (flush_cpumask)
++      while (!cpus_empty(flush_cpumask))
+               /* nothing. lockup detection does not belong here */;
+       flush_mm = NULL;
+@@ -277,23 +278,25 @@ static void flush_tlb_others (unsigned l
+ void flush_tlb_current_task(void)
+ {
+       struct mm_struct *mm = current->mm;
+-      unsigned long cpu_mask;
++      cpumask_t cpu_mask;
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++      cpu_mask = mm->cpu_vm_mask;
++      cpu_clear(smp_processor_id(), cpu_mask);
+       local_flush_tlb();
+-      if (cpu_mask)
++      if (!cpus_empty(cpu_mask))
+               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+       preempt_enable();
+ }
+ void flush_tlb_mm (struct mm_struct * mm)
+ {
+-      unsigned long cpu_mask;
++      cpumask_t cpu_mask;
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++      cpu_mask = mm->cpu_vm_mask;
++      cpu_clear(smp_processor_id(), cpu_mask);
+       if (current->active_mm == mm) {
+               if (current->mm)
+@@ -301,7 +304,7 @@ void flush_tlb_mm (struct mm_struct * mm
+               else
+                       leave_mm(smp_processor_id());
+       }
+-      if (cpu_mask)
++      if (!cpus_empty(cpu_mask))
+               flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+       preempt_enable();
+@@ -310,10 +313,11 @@ void flush_tlb_mm (struct mm_struct * mm
+ void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
+ {
+       struct mm_struct *mm = vma->vm_mm;
+-      unsigned long cpu_mask;
++      cpumask_t cpu_mask;
+       preempt_disable();
+-      cpu_mask = mm->cpu_vm_mask & ~(1UL << smp_processor_id());
++      cpu_mask = mm->cpu_vm_mask;
++      cpu_clear(smp_processor_id(), cpu_mask);
+       if (current->active_mm == mm) {
+               if(current->mm)
+@@ -322,7 +326,7 @@ void flush_tlb_page(struct vm_area_struc
+                       leave_mm(smp_processor_id());
+       }
+-      if (cpu_mask)
++      if (!cpus_empty(cpu_mask))
+               flush_tlb_others(cpu_mask, mm, va);
+       preempt_enable();
+@@ -355,7 +359,7 @@ void smp_kdb_stop(void)
+ void smp_send_reschedule(int cpu)
+ {
+-      send_IPI_mask(1 << cpu, RESCHEDULE_VECTOR);
++      send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
+ }
+ /*
+@@ -430,7 +434,7 @@ void smp_stop_cpu(void)
+       /*
+        * Remove this CPU:
+        */
+-      clear_bit(smp_processor_id(), &cpu_online_map);
++      cpu_clear(smp_processor_id(), cpu_online_map);
+       local_irq_disable();
+       disable_local_APIC();
+       local_irq_enable(); 
+@@ -491,8 +495,8 @@ int slow_smp_processor_id(void)
+       unsigned long sp = (unsigned long)&stack_location; 
+       int offset = 0, cpu;
+-      for (offset = 0; (cpu_online_map >> offset); offset = cpu + 1) { 
+-              cpu = ffz(~(cpu_online_map >> offset));
++      for (offset = 0; next_cpu(offset, cpu_online_map) < NR_CPUS; offset = cpu + 1) {
++              cpu = next_cpu(offset, cpu_online_map);
+               if (sp >= (u64)cpu_pda[cpu].irqstackptr - IRQSTACKSIZE && 
+                   sp <= (u64)cpu_pda[cpu].irqstackptr)
+--- linux-2.6.0-test1/arch/x86_64/mm/init.c    2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/x86_64/mm/init.c   2003-07-19 17:03:49.000000000 -0700
+@@ -19,9 +19,6 @@
+ #include <linux/swap.h>
+ #include <linux/smp.h>
+ #include <linux/init.h>
+-#ifdef CONFIG_BLK_DEV_INITRD
+-#include <linux/blk.h>
+-#endif
+ #include <linux/pagemap.h>
+ #include <linux/bootmem.h>
+ #include <linux/proc_fs.h>
+--- linux-2.6.0-test1/arch/x86_64/mm/ioremap.c 2003-06-14 12:18:34.000000000 -0700
++++ 25/arch/x86_64/mm/ioremap.c        2003-07-19 17:07:16.000000000 -0700
+@@ -82,7 +82,7 @@ static int remap_area_pages(unsigned lon
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+-              pmd = pmd_alloc(&init_mm, dir, address);
++              pmd = pmd_alloc_kernel(&init_mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+--- linux-2.6.0-test1/arch/x86_64/mm/numa.c    2003-07-10 18:50:30.000000000 -0700
++++ 25/arch/x86_64/mm/numa.c   2003-07-19 17:03:49.000000000 -0700
+@@ -8,7 +8,6 @@
+ #include <linux/init.h>
+ #include <linux/bootmem.h>
+ #include <linux/mmzone.h>
+-#include <linux/blk.h>
+ #include <linux/ctype.h>
+ #include <asm/e820.h>
+ #include <asm/proto.h>
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/fb/neofb.txt      2003-07-19 17:04:55.000000000 -0700
+@@ -0,0 +1,27 @@
++the neofb framebuffer driver supports the following Neomagic chipsets:
++
++NM2070 MagicGraph 128
++NM2090 MagicGraph 128V
++NM2093 MagicGraph 128ZV
++NM2097 MagicGraph 128ZV+
++NM2160 MagicGraph 128XD
++NM2200 MagicGraph 256AV
++NM2230 MagicGraph 256AV+
++NM2360 MagicGraph 256ZX
++NM2380 MagicGraph 256XL+
++
++with the following options:
++
++disabled      Disable this driver's initialization.
++internal      Enable output on internal LCD Display.
++external      Enable output on external CRT.
++nostretch     Disable stretching of modes smaller than LCD.
++nopciburst    Disable PCI burst mode.
++libretto      Force Libretto 100/110 800x480 LCD.
++picturebook   Force Picturebook 1024x480 LCD.
++
++at the boot prompt:
++      video=neofb:picturebook
++
++as a module:
++      modprobe neofb picturebook=1
+--- linux-2.6.0-test1/Documentation/filesystems/proc.txt       2003-06-26 22:07:24.000000000 -0700
++++ 25/Documentation/filesystems/proc.txt      2003-07-19 17:04:56.000000000 -0700
+@@ -222,6 +222,7 @@ Table 1-3: Kernel info in /proc 
+  partitions  Table of partitions known to the system           
+  pci       Depreciated info of PCI bus (new way -> /proc/bus/pci/, 
+              decoupled by lspci                                       (2.4)
++ rcu       Read-Copy Update information                       (2.5)
+  rtc         Real time clock                                   
+  scsi        SCSI info (see text)                              
+  slabinfo    Slab pool info                                    
+@@ -346,6 +347,9 @@ available.  In this case, there are 0 ch
+ ZONE_DMA, 4 chunks of 2^1*PAGE_SIZE in ZONE_DMA, 101 chunks of 2^4*PAGE_SIZE 
+ available in ZONE_NORMAL, etc... 
++The rcu file gives information about Read-Copy Update synchronization
++primitive. It indicates the number for RCU requests and actual
++updates for every CPU.
+ 1.3 IDE devices in /proc/ide
+ ----------------------------
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/andthen 2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,100 @@
++
++define        set_andthen
++      set var $thp=0
++      set var $thp=(struct kgdb_and_then_struct *)&kgdb_data[0]
++      set var $at_size = (sizeof kgdb_data)/(sizeof *$thp)
++      set var $at_oc=kgdb_and_then_count
++      set var $at_cc=$at_oc
++end
++
++define andthen_next
++      set var $at_cc=$arg0
++end
++
++define andthen
++      andthen_set_edge
++      if ($at_cc >= $at_oc)
++              printf "Outside window.  Window size is %d\n",($at_oc-$at_low)
++      else
++              printf "%d: ",$at_cc
++              output *($thp+($at_cc++ % $at_size ))
++              printf "\n"
++      end
++end
++define andthen_set_edge
++      set var $at_oc=kgdb_and_then_count
++      set var $at_low = $at_oc - $at_size
++      if ($at_low < 0 )
++              set var $at_low = 0
++      end
++      if (( $at_cc > $at_oc) || ($at_cc < $at_low))
++              printf "Count outside of window, setting count to "
++              if ($at_cc >= $at_oc)
++                      set var $at_cc = $at_oc
++              else
++                      set var $at_cc = $at_low
++              end
++              printf "%d\n",$at_cc
++      end
++end
++
++define beforethat
++      andthen_set_edge
++      if ($at_cc <= $at_low)
++              printf "Outside window.  Window size is %d\n",($at_oc-$at_low)
++      else
++              printf "%d: ",$at_cc-1
++              output *($thp+(--$at_cc % $at_size ))
++              printf "\n"
++      end
++end
++
++document andthen_next
++      andthen_next <count>
++      .       sets the number of the event to display next. If this event
++      .       is not in the event pool, either andthen or beforethat will
++      .       correct it to the nearest event pool edge.  The event pool
++      .       ends at the last event recorded and begins <number of events>
++      .       prior to that.  If beforethat is used next, it will display
++      .       event <count> -1.
++.
++      andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++      
++                      
++document andthen
++      andthen 
++.     displays the next event in the list.  <set_andthen> sets up to display
++.     the oldest saved event first. 
++.     <count> (optional) count of the event to display.
++.     note the number of events saved is specified at configure time.
++.     if events are saved between calls to andthen the index will change
++.     but the displayed event will be the next one (unless the event buffer
++.     is overrun).
++.
++.     andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++
++document set_andthen
++      set_andthen
++.     sets up to use the <andthen> and <beforethat> commands. 
++.             if you have defined your own struct, use the above and
++.             then enter the following:
++.             p $thp=(struct kgdb_and_then_structX *)&kgdb_data[0]
++.             where <kgdb_and_then_structX> is the name of your structure.
++.
++.     andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
++
++document beforethat
++      beforethat 
++.     displays the next prior event in the list. <set_andthen> sets up to
++.     display the last occuring event first.
++.
++.     note the number of events saved is specified at configure time.
++.     if events are saved between calls to beforethat the index will change
++.     but the displayed event will be the next one (unless the event buffer
++.     is overrun).
++.
++.     andthen commands are: set_andthen, andthen_next, andthen and beforethat
++end
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/debug-nmi.txt   2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,37 @@
++Subject: Debugging with NMI
++Date: Mon, 12 Jul 1999 11:28:31 -0500
++From: David Grothe <dave@gcom.com>
++Organization: Gcom, Inc
++To: David Grothe <dave@gcom.com>
++
++Kernel hackers:
++
++Maybe this is old hat, but it is new to me --
++
++On an ISA bus machine, if you short out the A1 and B1 pins of an ISA
++slot you will generate an NMI to the CPU.  This interrupts even a
++machine that is hung in a loop with interrupts disabled.  Used in
++conjunction with kgdb <
++ftp://ftp.gcom.com/pub/linux/src/kgdb-2.3.35/kgdb-2.3.35.tgz > you can
++gain debugger control of a machine that is hung in the kernel!  Even
++without kgdb the kernel will print a stack trace so you can find out
++where it was hung.
++
++The A1/B1 pins are directly opposite one another and the farthest pins
++towards the bracket end of the ISA bus socket.  You can stick a paper
++clip or multi-meter probe between them to short them out.
++
++I had a spare ISA bus to PC104 bus adapter around.  The PC104 end of the
++board consists of two rows of wire wrap pins.  So I wired a push button
++between the A1/B1 pins and now have an ISA board that I can stick into
++any ISA bus slot for debugger entry.
++
++Microsoft has a circuit diagram of a PCI card at
++http://www.microsoft.com/hwdev/DEBUGGING/DMPSW.HTM.  If you want to
++build one you will have to mail them and ask for the PAL equations.
++Nobody makes one comercially.
++
++[THIS TIP COMES WITH NO WARRANTY WHATSOEVER.  It works for me, but if
++your machine catches fire, it is your problem, not mine.]
++
++-- Dave (the kgdb guy)
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/gdb-globals.txt 2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,71 @@
++Sender: akale@veritas.com
++Date: Fri, 23 Jun 2000 19:26:35 +0530
++From: "Amit S. Kale" <akale@veritas.com>
++Organization: Veritas Software (India)
++To: Dave Grothe <dave@gcom.com>, linux-kernel@vger.rutgers.edu
++CC: David Milburn <dmilburn@wirespeed.com>,
++        "Edouard G. Parmelan" <Edouard.Parmelan@quadratec.fr>,
++        ezannoni@cygnus.com, Keith Owens <kaos@ocs.com.au>
++Subject: Re: Module debugging using kgdb
++
++Dave Grothe wrote:
++> 
++> Amit:
++> 
++> There is a 2.4.0 version of kgdb on our ftp site:
++> ftp://ftp.gcom.com/pub/linux/src/kgdb.  I mirrored your version of gdb
++> and loadmodule.sh there.
++> 
++> Have a look at the README file and see if I go it right.  If not, send
++> me some corrections and I will update it.
++> 
++> Does your version of gdb solve the global variable problem?
++
++Yes. 
++Thanks to Elena Zanoni, gdb (developement version) can now calculate 
++correctly addresses  of dynamically loaded object files. I have not been 
++following gdb developement for sometime and am not sure when symbol
++address calculation fix is going to appear in a gdb stable version.
++
++Elena, any idea when the fix will make it to a prebuilt gdb from a
++redhat release?
++
++For the time being I have built a gdb developement version. It can be
++used for module debugging with loadmodule.sh script.
++
++The problem with calculating of module addresses with previous versions
++of gdb was as follows:
++gdb did not use base address of a section while calculating address of
++a symbol in the section in an object file loaded via 'add-symbol-file'. 
++It used address of .text segment instead. Due to this addresses of
++symbols in .data, .bss etc. (e.g. global variables) were calculated incorrectly.
++
++Above mentioned fix allow gdb to use base address of a segment while
++calculating address of a symbol in it. It adds a parameter '-s' to
++'add-symbol-file' command for specifying base address of a segment.
++
++loadmodule.sh script works as follows.
++
++1. Copy a module file to target machine.
++2. Load the module on the target machine using insmod with -m parameter.
++insmod produces a module load map which contains base addresses of all
++sections in the module and addresses of symbols in the module file.
++3. Find all sections and their base addresses in the module from 
++the module map.
++4. Generate a script that loads the module file. The script uses
++'add-symbol-file' and specifies address of text segment followed by
++addresses of all segments in the module.
++
++Here is an example gdb script produced by loadmodule.sh script.
++
++add-symbol-file foo 0xd082c060 -s .text.lock 0xd08cbfb5 
++-s .fixup 0xd08cfbdf -s .rodata 0xd08cfde0 -s __ex_table 0xd08e3b38 
++-s .data 0xd08e3d00 -s .bss 0xd08ec8c0 -s __ksymtab 0xd08ee838
++
++With this command gdb can calculate addresses of symbols in ANY segment
++in a module file.
++
++Regards.
++-- 
++Amit Kale
++Veritas Software ( http://www.veritas.com )
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/gdbinit 2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,14 @@
++shell echo -e "\003" >/dev/ttyS0
++set remotebaud 38400
++target remote /dev/ttyS0
++define si
++stepi
++printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
++printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
++x/i $eip
++end
++define ni
++nexti
++printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
++printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
++x/i $eip
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/gdbinit.hw      2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,117 @@
++
++#Using ia-32 hardware breakpoints.
++#
++#4 hardware breakpoints are available in ia-32 processors. These breakpoints
++#do not need code modification. They are set using debug registers.
++#
++#Each hardware breakpoint can be of one of the
++#three types: execution, write, access.
++#1. An Execution breakpoint is triggered when code at the breakpoint address is
++#executed.
++#2. A write breakpoint ( aka watchpoints ) is triggered when memory location
++#at the breakpoint address is written.
++#3. An access breakpoint is triggered when memory location at the breakpoint
++#address is either read or written.
++#
++#As hardware breakpoints are available in limited number, use software
++#breakpoints ( br command in gdb ) instead of execution hardware breakpoints.
++#
++#Length of an access or a write breakpoint defines length of the datatype to
++#be watched. Length is 1 for char, 2 short , 3 int.
++#
++#For placing execution, write and access breakpoints, use commands
++#hwebrk, hwwbrk, hwabrk
++#To remove a breakpoint use hwrmbrk command.
++#
++#These commands take following types of arguments. For arguments associated
++#with each command, use help command.
++#1. breakpointno: 0 to 3
++#2. length: 1 to 3
++#3. address: Memory location in hex ( without 0x ) e.g c015e9bc
++#
++#Use the command exinfo to find which hardware breakpoint occured.
++
++#hwebrk breakpointno address
++define hwebrk
++      maintenance packet Y$arg0,0,0,$arg1
++end
++document hwebrk
++      hwebrk <breakpointno> <address>
++      Places a hardware execution breakpoint
++      <breakpointno> = 0 - 3
++      <address> = Hex digits without leading "0x".
++end
++
++#hwwbrk breakpointno length address
++define hwwbrk
++      maintenance packet Y$arg0,1,$arg1,$arg2
++end
++document hwwbrk
++      hwwbrk <breakpointno> <length> <address>
++      Places a hardware write breakpoint
++      <breakpointno> = 0 - 3
++      <length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
++      <address> = Hex digits without leading "0x".
++end
++
++#hwabrk breakpointno length address
++define hwabrk
++      maintenance packet Y$arg0,1,$arg1,$arg2
++end
++document hwabrk
++      hwabrk <breakpointno> <length> <address>
++      Places a hardware access breakpoint
++      <breakpointno> = 0 - 3
++      <length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
++      <address> = Hex digits without leading "0x".
++end
++
++#hwrmbrk breakpointno
++define hwrmbrk
++      maintenance packet y$arg0
++end
++document hwrmbrk
++      hwrmbrk <breakpointno>
++      <breakpointno> = 0 - 3
++      Removes a hardware breakpoint
++end
++
++define reboot
++        maintenance packet r
++end
++#exinfo 
++define exinfo
++      maintenance packet qE
++end
++document exinfo
++      exinfo 
++      Gives information about a breakpoint.
++end
++define get_th
++      p $th=(struct thread_info *)((int)$esp & ~8191)
++end
++document get_th
++      get_tu
++      Gets and prints the current thread_info pointer, Defines th to be it.
++end
++define get_cu
++      p $cu=(struct thread_info *)((int)$esp & ~8191)->task
++end
++document get_cu
++      get_cu
++      Gets and print the "current" value.  Defines $cu to be it.
++end
++define int_off
++      set var $flags=$eflags
++      set $eflags=$eflags&~0x200
++      end
++define int_on
++      set var $eflags|=$flags&0x200
++      end
++document int_off
++      saves the current interrupt state and clears the processor interrupt 
++      flag.  Use int_on to restore the saved flag.
++end
++document int_on
++      Restores the interrupt flag saved by int_off.
++end
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/gdbinit-modules 2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,146 @@
++#
++# Usefull GDB user-command to debug Linux Kernel Modules with gdbstub.
++#
++# This don't work for Linux-2.0 or older.
++#
++# Author Edouard G. Parmelan <Edouard.Parmelan@quadratec.fr>
++#
++#
++# Fri Apr 30 20:33:29 CEST 1999
++#   First public release.
++#
++#   Major cleanup after experiment Linux-2.0 kernel without success.
++#   Symbols of a module are not in the correct order, I can't explain
++#   why :(
++#
++# Fri Mar 19 15:41:40 CET 1999
++#   Initial version.
++#
++# Thu Jan  6 16:29:03 CST 2000
++#   A little fixing by Dave Grothe <dave@gcom.com>
++#
++# Mon Jun 19 09:33:13 CDT 2000
++#   Alignment changes from Edouard Parmelan
++#
++# The basic idea is to find where insmod load the module and inform
++# GDB to load the symbol table of the module with the GDB command 
++# ``add-symbol-file <object> <address>''.
++#
++# The Linux kernel holds the list of all loaded modules in module_list,
++# this list end with &kernel_module (exactly with module->next == NULL,
++# but the last module is not a real module).
++#
++# Insmod allocates the struct module before the object file.  Since
++# Linux-2.1, this structure contain his size.  The real address of
++# the object file is then (char*)module + module->size_of_struct.
++#
++# You can use three user functions ``mod-list'', ``mod-print-symbols''
++# and ``add-module-symbols''.
++#
++# mod-list list all loaded modules with the format:
++#    <module-address> <module-name>
++#
++# As soon as you have found the address of your module, you can
++# print its exported symbols (mod-print-symbols) or inform GDB to add
++# symbols from your module file (mod-add-symbols).
++#
++# The argument that you give to mod-print-symbols or mod-add-symbols
++# is the <module-address> from the mod-list command.
++#
++# When using the mod-add-symbols command you must also give the full
++# pathname of the modules object code file.
++#
++# The command mod-add-lis is an example of how to make this easier.
++# You can edit this macro to contain the path name of your own
++# favorite module and then use it as a shorthand to load it.  You
++# still need the module-address, however.
++#
++# The internal function ``mod-validate'' set the GDB variable $mod
++# as a ``struct module*'' if the kernel known the module otherwise
++# $mod is set to NULL.  This ensure to not add symbols for a wrong
++# address.
++# 
++# Have a nice hacking day !
++#
++#
++define mod-list
++    set $mod = (struct module*)module_list
++    # the last module is the kernel, ignore it
++    while $mod != &kernel_module
++      printf "%p\t%s\n", (long)$mod, ($mod)->name
++      set $mod = $mod->next
++    end
++end
++document mod-list
++List all modules in the form: <module-address> <module-name>
++Use the <module-address> as the argument for the other
++mod-commands: mod-print-symbols, mod-add-symbols.
++end
++
++define mod-validate
++    set $mod = (struct module*)module_list
++    while ($mod != $arg0) && ($mod != &kernel_module)
++      set $mod = $mod->next
++    end
++    if $mod == &kernel_module
++      set $mod = 0
++      printf "%p is not a module\n", $arg0
++    end
++end
++document mod-validate
++mod-validate <module-address>
++Internal user-command used to validate the module parameter.
++If <module> is a real loaded module, set $mod to it otherwise set $mod to 0.
++end
++
++
++define mod-print-symbols
++    mod-validate $arg0
++    if $mod != 0
++      set $i = 0
++      while $i < $mod->nsyms
++          set $sym = $mod->syms[$i]
++          printf "%p\t%s\n", $sym->value, $sym->name
++          set $i = $i + 1
++      end
++    end
++end
++document mod-print-symbols
++mod-print-symbols <module-address>
++Print all exported symbols of the module.  see mod-list
++end
++
++
++define mod-add-symbols-align
++    mod-validate $arg0
++    if $mod != 0
++      set $mod_base = ($mod->size_of_struct + (long)$mod)
++      if ($arg2 != 0) && (($mod_base & ($arg2 - 1)) != 0)
++          set $mod_base = ($mod_base | ($arg2 - 1)) + 1
++      end
++      add-symbol-file $arg1 $mod_base
++    end
++end
++document mod-add-symbols-align
++mod-add-symbols-align <module-address> <object file path name> <align>
++Load the symbols table of the module from the object file where
++first section aligment is <align>.
++To retreive alignment, use `objdump -h <object file path name>'.
++end
++
++define mod-add-symbols
++    mod-add-symbols-align $arg0 $arg1 sizeof(long)
++end
++document mod-add-symbols
++mod-add-symbols <module-address> <object file path name>
++Load the symbols table of the module from the object file.
++Default alignment is 4.  See mod-add-symbols-align.
++end
++
++define mod-add-lis
++    mod-add-symbols-align $arg0 /usr/src/LiS/streams.o 16
++end
++document mod-add-lis
++mod-add-lis <module-address>
++Does mod-add-symbols <module-address> /usr/src/LiS/streams.o
++end
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/kgdb.txt        2003-07-19 17:04:05.000000000 -0700
+@@ -0,0 +1,716 @@
++Last edit: <20030506.1615.42>
++This file has information specific to the i386 kgdb option.  Other
++platforms with the kgdb option may behave in a similar fashion.
++
++New features: 
++============
++20030505.1827.27
++We are starting to align with the sourceforge version, at least in 
++commands.  To this end, the boot command string to start kgdb at
++boot time has been changed from "kgdb" to "gdb".
++
++Andrew Morton sent a couple of patches which are now included as follows:
++1.) We now return a flag to the interrupt handler.
++2.) We no longer use smp_num_cpus (a conflict with the lock meter).
++3.) And from William Lee Irwin III <wli@holomorphy.com> code to make
++    sure high-mem is set up before we attempt to register our interrupt
++    handler.
++We now include asm/kgdb.h from config.h so you will most likely never
++have to include it.  It also 'NULLS' the kgdb macros you might have in
++your code when CONFIG_KGDB is not defined.  This allows you to just
++turn off CONFIG_KGDB to turn off all the kgdb_ts() calls and such.
++This include is conditioned on the machine being an x86 so as to not
++mess with other archs.
++
++20020801.1129.03
++This is currently the version for the 2.4.18 (and beyond?) kernel.
++
++We have several new "features" beginning with this version:
++ 
++1.) Kgdb now syncs the "other" CPUs with a cross-CPU NMI.  No more
++    waiting and it will pull that guy out of an IRQ off spin lock :)
++
++2.) We doctored up the code that tells where a task is waiting and
++    included it so that the "info thread" command will show a bit more
++    than "schedule()".  Try it...
++
++3.) Added the ability to call a function from gdb.  All the standard gdb
++    issues apply, i.e. if you hit a breakpoint in the function, you are
++    not allowed to call another (gdb limitation, not kgdb).  To help
++    this capability we added a memory allocation function.  Gdb does not
++    return this memory (it is used for strings that you pass to that function
++    you are calling from gdb) so we fixed up a way to allow you to
++    manually return the memory (see below).
++
++4.) Kgdb time stamps (kgdb_ts()) are enhanced to expand what was the
++    interrupt flag to now also include the preemption count and the
++    "in_interrupt" info.  The flag is now called "with_pif" to indicate
++    the order, preempt_count, in_interrupt, flag.  The preempt_count is
++    shifted left by 4 bits so you can read the count in hex by dropping
++    the low order digit.  In_interrupt is in bit 1, and the flag is in
++    bit 0.
++
++5.) The command: "p kgdb_info" is now expanded and prints something
++    like:
++(gdb) p kgdb_info
++$2 = {used_malloc = 0, called_from = 0xc0107506, entry_tsc = 67468627259, 
++  errcode = 0, vector = 3, print_debug_info = 0, hold_on_sstep = 1, 
++  cpus_waiting = {{task = 0xc027a000, pid = 32768, hold = 0, 
++      regs = 0xc027bf84}, {task = 0x0, pid = 0, hold = 0, regs = 0x0}}}
++    
++    Things to note here: a.) used_malloc is the amount of memory that
++    has been malloc'ed to do calls from gdb.  You can reclaim this
++    memory like this: "p kgdb_info.used_malloc=0" Cool, huh?  b.)
++    cpus_waiting is now "sized" by the number of CPUs you enter at
++    configure time in the kgdb configure section.  This is NOT used
++    anywhere else in the system, but it is "nice" here.  c.)  The task's
++    "pid" is now in the structure.  This is the pid you will need to use
++    to decode to the thread id to get gdb to look at that thread.
++    Remember that the "info thread" command prints a list of threads
++    wherein it numbers each thread with its reference number followed
++    by the thread's pid.  Note that the per-CPU idle threads actually
++    have pids of 0 (yes, there is more than one pid 0 in an SMP system).
++    To avoid confusion, kgdb numbers these threads with numbers beyond
++    the MAX_PID.  That is why you see 32768 and above.
++
++6.) A subtle change, we now provide the complete register set for tasks
++    that are active on the other CPUs.  This allows better trace back on
++    those tasks.
++
++    And, let's mention what we could not fix.  Back-trace from all but the
++    thread that we trapped will, most likely, have a bogus entry in it.
++    The problem is that gdb does not recognize the entry code for
++    functions that use "current" near (at all?) the entry.  The compiler
++    is putting the "current" decode as the first two instructions of the
++    function where gdb expects to find %ebp changing code.  Back trace
++    also has trouble with interrupt frames.  I am talking with Daniel
++    Jacobowitz about some way to fix this, but don't hold your breath.
++
++20011220.0050.35
++Major enhancement with this version is the ability to hold one or more
++CPUs in an SMP system while allowing the others to continue.  Also, by
++default only the current CPU is enabled on single-step commands (please
++note that gdb issues single-step commands at times other than when you
++use the si command).
++ 
++Another change is to collect some useful information in
++a global structure called "kgdb_info".  You should be able to just:
++
++p kgdb_info
++
++although I have seen cases where the first time this is done gdb just
++prints the first member but prints the whole structure if you then enter
++CR (carriage return or enter).  This also works:
++
++p *&kgdb_info
++
++Here is a sample:
++(gdb) p kgdb_info
++$4 = {called_from = 0xc010732c, entry_tsc = 32804123790856, errcode = 0, 
++  vector = 3, print_debug_info = 0}
++
++"Called_from" is the return address from the current entry into kgdb.  
++Sometimes it is useful to know why you are in kgdb, for example, was 
++it an NMI or a real breakpoint?  The simple way to interrogate this
++return address is:
++
++l *0xc010732c
++
++which will print the surrounding few lines of source code.
++
++"Entry_tsc" is the CPU TSC on entry to kgdb (useful to compare to the
++kgdb_ts entries).
++
++"errcode" and "vector" are other entry parameters which may be helpful on
++some traps.
++
++"print_debug_info" is the internal debugging kgdb print enable flag.  Yes,
++you can modify it.
++
++In SMP systems kgdb_info also includes the "cpus_waiting" structure and
++"hold_on_step": 
++
++(gdb) p kgdb_info
++$7 = {called_from = 0xc0112739, entry_tsc = 1034936624074, errcode = 0, 
++  vector = 2, print_debug_info = 0, hold_on_sstep = 1, cpus_waiting = {{
++      task = 0x0, hold = 0, regs = 0x0}, {task = 0xc71b8000, hold = 0, 
++      regs = 0xc71b9f70}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0, 
++      hold = 0, regs = 0x0}}}
++
++"Cpus_waiting" has an entry for each CPU other than the current one that
++has been stopped.  Each entry contains the task_struct address for that
++CPU, the address of the regs for that task and a hold flag.  All these
++have the proper typing so that, for example:
++
++p *kgdb_info.cpus_waiting[1].regs
++
++will print the registers for CPU 1.
++
++"Hold_on_sstep" is a new feature with this version and comes up set or
++true.  What this means is that whenever kgdb is asked to single-step all
++other CPUs are held (i.e. not allowed to execute).  The flag applies to
++all but the current CPU and, again, can be changed:
++
++p kgdb_info.hold_on_sstep=0
++
++restores the old behavior of letting all CPUs run during single-stepping.
++
++Likewise, each CPU has a "hold" flag, which if set, locks that CPU out
++of execution.  Note that this has some risk in cases where the CPUs need
++to communicate with each other.  If kgdb finds no CPU available on exit,
++it will push a message thru gdb and stay in kgdb.  Note that it is legal
++to hold the current CPU as long as at least one CPU can execute.
++
++20010621.1117.09
++This version implements an event queue.  Events are signaled by calling
++a function in the kgdb stub and may be examined from gdb.  See EVENTS 
++below for details.  This version also tightens up the interrupt and SMP
++handling to not allow interrupts on the way to kgdb from a breakpoint 
++trap.  It is fine to allow these interrupts for user code, but not
++system debugging.
++
++Version
++=======
++
++This version of the kgdb package was developed and tested on
++kernel version 2.4.16.  It will not install on any earlier kernels.  
++It is possible that it will continue to work on later versions
++of 2.4 and then versions of 2.5 (I hope).
++
++
++Debugging Setup
++===============
++
++Designate one machine as the "development" machine.  This is the
++machine on which you run your compiles and which has your source
++code for the kernel.  Designate a second machine as the "target"
++machine.  This is the machine that will run your experimental
++kernel.
++
++The two machines will be connected together via a serial line out
++one or the other of the COM ports of the PC.  You will need the
++appropriate modem eliminator (null modem) cable(s) for this.
++
++Decide on which tty port you want the machines to communicate, then
++connect them up back-to-back using the null modem cable.  COM1 is
++/dev/ttyS0 and COM2 is /dev/ttyS1. You should test this connection
++with the two machines prior to trying to debug a kernel.  Once you
++have it working, on the TARGET machine, enter:
++
++setserial /dev/ttyS0 (or what ever tty you are using)
++
++and record the port address and the IRQ number.
++
++On the DEVELOPMENT machine you need to apply the patch for the kgdb
++hooks.  You have probably already done that if you are reading this
++file.
++
++On your DEVELOPMENT machine, go to your kernel source directory and do
++"make Xconfig" where X is one of "x", "menu", or "".  If you are
++configuring in the standard serial driver, it must not be a module.
++Either yes or no is ok, but making the serial driver a module means it
++will initialize after kgdb has set up the UART interrupt code and may
++cause a failure of the control-C option discussed below.  The configure
++question for the serial driver is under the "Character devices" heading
++and is:
++
++"Standard/generic (8250/16550 and compatible UARTs) serial support"
++
++Go down to the kernel debugging menu item and open it up.  Enable the
++kernel kgdb stub code by selecting that item.  You can also choose to
++turn on the "-ggdb -O1" compile options.  The -ggdb causes the compiler
++to put more debug info (like local symbols) in the object file.  On the
++i386 -g and -ggdb are the same so this option just reduces to "O1".  The
++-O1 reduces the optimization level.  This may be helpful in some cases,
++be aware, however, that this may also mask the problem you are looking
++for.
++
++The baud rate.  Default is 115200.  What ever you choose be sure that
++the host machine is set to the same speed.  I recommend the default.
++
++The port.  This is the I/O address of the serial UART that you should
++have gotten using setserial as described above.  The standard COM1 port
++(3f8) using IRQ 4 is default.  COM2 is 2f8 which by convention uses IRQ
++3.
++
++The port IRQ (see above).
++
++Stack overflow test.  This option makes a minor change in the trap,
++system call and interrupt code to detect stack overflow and transfer
++control to kgdb if it happens.  (Some platforms have this in the
++baseline code, but the i386 does not.)
++
++You can also configure the system to recognize the boot option
++"console=kgdb" which if given will cause all console output during
++booting to be put thru gdb as well as other consoles.  This option
++requires that gdb and kgdb be connected prior to sending console output
++so, if they are not, a breakpoint is executed to force the connection.
++This will happen before any kernel output (it is going thru gdb, right),
++and will stall the boot until the connection is made.
++
++You can also configure in a patch to SysRq to enable the kGdb SysRq.
++This request generates a breakpoint.  Since the serial port IRQ line is
++set up after any serial drivers, it is possible that this command will
++work when the control-C will not.
++
++Save and exit the Xconfig program.  Then do "make clean" , "make dep"
++and "make bzImage" (or whatever target you want to make).  This gets the
++kernel compiled with the "-g" option set -- necessary for debugging.
++
++You have just built the kernel on your DEVELOPMENT machine that you
++intend to run on your TARGET machine.
++
++To install this new kernel, use the following installation procedure.
++Remember, you are on the DEVELOPMENT machine patching the kernel source
++for the kernel that you intend to run on the TARGET machine.
++
++Copy this kernel to your target machine using your usual procedures.  I
++usually arrange to copy development:
++/usr/src/linux/arch/i386/boot/bzImage to /vmlinuz on the TARGET machine
++via a LAN based NFS access.  That is, I run the cp command on the target
++and copy from the development machine via the LAN.  Run Lilo (see "man
++lilo" for details on how to set this up) on the new kernel on the target
++machine so that it will boot!  Then boot the kernel on the target
++machine.
++
++On the DEVELOPMENT machine, create a file called .gdbinit in the
++directory /usr/src/linux.  An example .gdbinit file looks like this:
++
++shell echo -e "\003" >/dev/ttyS0
++set remotebaud 38400 (or what ever speed you have chosen)
++target remote /dev/ttyS0
++
++
++Change the "echo" and "target" definition so that it specifies the tty
++port that you intend to use.  Change the "remotebaud" definition to
++match the data rate that you are going to use for the com line.
++
++You are now ready to try it out.
++
++Boot your target machine with "kgdb" in the boot command i.e. something
++like:
++
++lilo> test kgdb
++
++or if you also want console output thru gdb:
++
++lilo> test kgdb console=kgdb
++
++You should see the lilo message saying it has loaded the kernel and then
++all output stops.  The kgdb stub is trying to connect with gdb.  Start
++gdb something like this:
++
++
++On your DEVELOPMENT machine, cd /usr/src/linux and enter "gdb vmlinux".
++When gdb gets the symbols loaded it will read your .gdbinit file and, if
++everything is working correctly, you should see gdb print out a few
++lines indicating that a breakpoint has been taken.  It will actually
++show a line of code in the target kernel inside the kgdb activation
++code.
++
++The gdb interaction should look something like this:
++
++    linux-dev:/usr/src/linux# gdb vmlinux
++    GDB is free software and you are welcome to distribute copies of it
++     under certain conditions; type "show copying" to see the conditions.
++    There is absolutely no warranty for GDB; type "show warranty" for details.
++    GDB 4.15.1 (i486-slackware-linux), 
++    Copyright 1995 Free Software Foundation, Inc...
++    breakpoint () at i386-stub.c:750
++    750     }
++    (gdb) 
++
++You can now use whatever gdb commands you like to set breakpoints.
++Enter "continue" to start your target machine executing again.  At this
++point the target system will run at full speed until it encounters
++your breakpoint or gets a segment violation in the kernel, or whatever.
++
++If you have the kgdb console enabled when you continue, gdb will print
++out all the console messages.
++
++The above example caused a breakpoint relatively early in the boot
++process.  For the i386 kgdb it is possible to code a break instruction
++as the first C-language point in init/main.c, i.e. as the first instruction
++in start_kernel().  This could be done as follows:
++
++#include <asm/kgdb.h>
++       breakpoint();
++
++This breakpoint() is really a function that sets up the breakpoint and
++single-step hardware trap cells and then executes a breakpoint.  Any
++early hard coded breakpoint will need to use this function.  Once the
++trap cells are set up they need not be set again, but doing it again
++does not hurt anything, so you don't need to be concerned about which
++breakpoint is hit first.  Once the trap cells are set up (and the kernel
++sets them up in due course even if breakpoint() is never called) the
++macro:
++
++BREAKPOINT;
++
++will generate an inline breakpoint.  This may be more useful as it stops
++the processor at the instruction instead of in a function a step removed
++from the location of interest.  In either case <asm/kgdb.h> must be
++included to define both breakpoint() and BREAKPOINT.
++
++Triggering kgdbstub at other times
++==================================
++
++Often you don't need to enter the debugger until much later in the boot
++or even after the machine has been running for some time.  Once the
++kernel is booted and interrupts are on, you can force the system to
++enter the debugger by sending a control-C to the debug port. This is
++what the first line of the recommended .gdbinit file does.  This allows
++you to start gdb any time after the system is up as well as when the
++system is already at a breakpoint.  (In the case where the system is
++already at a breakpoint the control-C is not needed, however, it will
++be ignored by the target so no harm is done.  Also note the the echo
++command assumes that the port speed is already set.  This will be true
++once gdb has connected, but it is best to set the port speed before you
++run gdb.)
++
++Another simple way to do this is to put the following file in you ~/bin
++directory:
++
++#!/bin/bash
++echo  -e "\003"  > /dev/ttyS0 
++
++Here, the ttyS0 should be replaced with what ever port you are using.
++The "\003" is control-C.  Once you are connected with gdb, you can enter
++control-C at the command prompt.
++
++An alternative way to get control to the debugger is to enable the kGdb
++SysRq command.  Then you would enter Alt-SysRq-g (all three keys at the
++same time, but push them down in the order given).  To refresh your
++memory of the available SysRq commands try Alt-SysRq-=.  Actually any
++undefined command could replace the "=", but I like to KNOW that what I
++am pushing will never be defined.
++ 
++Debugging hints
++===============
++
++You can break into the target machine at any time from the development
++machine by typing ^C (see above paragraph).  If the target machine has
++interrupts enabled this will stop it in the kernel and enter the
++debugger.
++
++There is unfortunately no way of breaking into the kernel if it is
++in a loop with interrupts disabled, so if this happens to you then
++you need to place exploratory breakpoints or printk's into the kernel
++to find out where it is looping.  The exploratory breakpoints can be
++entered either thru gdb or hard coded into the source.  This is very
++handy if you do something like:
++
++if (<it hurts>) BREAKPOINT;
++
++
++There is a copy of an e-mail in the Documentation/i386/kgdb/ directory
++(debug-nmi.txt) which describes how to create an NMI on an ISA bus
++machine using a paper clip.  I have a sophisticated version of this made
++by wiring a push button switch into a PC104/ISA bus adapter card.  The
++adapter card nicely furnishes wire wrap pins for all the ISA bus
++signals.
++
++When you are done debugging the kernel on the target machine it is a
++good idea to leave it in a running state.  This makes reboots faster,
++bypassing the fsck.  So do a gdb "continue" as the last gdb command if
++this is possible.  To terminate gdb itself on the development machine
++and leave the target machine running, first clear all breakpoints and
++continue, then type ^Z to suspend gdb and then kill it with "kill %1" or
++something similar.
++
++If gdbstub Does Not Work
++========================
++
++If it doesn't work, you will have to troubleshoot it.  Do the easy
++things first like double checking your cabling and data rates.  You
++might try some non-kernel based programs to see if the back-to-back
++connection works properly.  Just something simple like cat /etc/hosts
++>/dev/ttyS0 on one machine and cat /dev/ttyS0 on the other will tell you
++if you can send data from one machine to the other.  Make sure it works
++in both directions.  There is no point in tearing out your hair in the
++kernel if the line doesn't work.
++
++All of the real action takes place in the file
++/usr/src/linux/arch/i386/kernel/kgdb_stub.c.  That is the code on the target
++machine that interacts with gdb on the development machine.  In gdb you can
++turn on a debug switch with the following command:
++
++      set remotedebug
++
++This will print out the protocol messages that gdb is exchanging with
++the target machine.
++
++Another place to look is /usr/src/arch/i386/lib/kgdb_serial.c. This is
++the code that talks to the serial port on the target side.  There might
++be a problem there.  In particular there is a section of this code that
++tests the UART which will tell you what UART you have if you define
++"PRNT" (just remove "_off" from the #define PRNT_off).  To view this
++report you will need to boot the system without any beakpoints.  This
++allows the kernel to run to the point where it calls kgdb to set up
++interrupts.  At this time kgdb will test the UART and print out the type
++it finds.  (You need to wait so that the printks are actually being
++printed.  Early in the boot they are cached, waiting for the console to
++be enabled.  Also, if kgdb is entered thru a breakpoint it is possible
++to cause a dead lock by calling printk when the console is locked.  The
++stub thus avoids doing printks from breakpoints, especially in the
++serial code.)  At this time, if the UART fails to do the expected thing,
++kgdb will print out (using printk) information on what failed.  (These
++messages will be buried in all the other boot up messages.  Look for
++lines that start with "gdb_hook_interrupt:".  You may want to use dmesg
++once the system is up to view the log.  If this fails or if you still
++don't connect, review your answers for the port address.  Use:
++
++setserial /dev/ttyS0 
++
++to get the current port and IRQ information.  This command will also
++tell you what the system found for the UART type. The stub recognizes
++the following UART types:
++
++16450, 16550, and 16550A
++
++If you are really desperate you can use printk debugging in the
++kgdbstub code in the target kernel until you get it working.  In particular,
++there is a global variable in /usr/src/linux/arch/i386/kernel/kgdb_stub.c
++named "remote_debug".  Compile your kernel with this set to 1, rather
++than 0 and the debug stub will print out lots of stuff as it does
++what it does.  Likewise there are debug printks in the kgdb_serial.c
++code that can be turned on with simple changes in the macro defines.
++
++
++Debugging Loadable Modules
++==========================
++
++This technique comes courtesy of Edouard Parmelan
++<Edouard.Parmelan@quadratec.fr>
++
++When you run gdb, enter the command
++
++source gdbinit-modules
++
++This will read in a file of gdb macros that was installed in your
++kernel source directory when kgdb was installed.  This file implements
++the following commands:
++
++mod-list
++    Lists the loaded modules in the form <module-address> <module-name>
++
++mod-print-symbols <module-address>
++    Prints all the symbols in the indicated module.
++
++mod-add-symbols <module-address> <object-file-path-name>
++    Loads the symbols from the object file and associates them
++    with the indicated module.
++
++After you have loaded the module that you want to debug, use the command
++mod-list to find the <module-address> of your module.  Then use that
++address in the mod-add-symbols command to load your module's symbols.
++From that point onward you can debug your module as if it were a part
++of the kernel.
++
++The file gdbinit-modules also contains a command named mod-add-lis as
++an example of how to construct a command of your own to load your
++favorite module.  The idea is to "can" the pathname of the module
++in the command so you don't have to type so much.
++
++Threads
++=======
++
++Each process in a target machine is seen as a gdb thread. gdb thread
++related commands (info threads, thread n) can be used.
++
++ia-32 hardware breakpoints
++==========================
++
++kgdb stub contains support for hardware breakpoints using debugging features
++of ia-32(x86) processors. These breakpoints do not need code modification.
++They use debugging registers. 4 hardware breakpoints are available in ia-32
++processors.
++
++Each hardware breakpoint can be of one of the following three types.
++
++1. Execution breakpoint - An Execution breakpoint is triggered when code
++      at the breakpoint address is executed.
++
++      As limited number of hardware breakpoints are available, it is
++      advisable to use software breakpoints ( break command ) instead
++      of execution hardware breakpoints, unless modification of code
++      is to be avoided.
++
++2. Write breakpoint - A write breakpoint is triggered when memory
++      location at the breakpoint address is written.
++
++      A write or can be placed for data of variable length. Length of
++      a write breakpoint indicates length of the datatype to be
++      watched. Length is 1 for 1 byte data , 2 for 2 byte data, 3 for
++      4 byte data.
++
++3. Access breakpoint - An access breakpoint is triggered when memory
++      location at the breakpoint address is either read or written.
++
++      Access breakpoints also have lengths similar to write breakpoints.
++
++IO breakpoints in ia-32 are not supported.
++
++Since gdb stub at present does not use the protocol used by gdb for hardware
++breakpoints, hardware breakpoints are accessed through gdb macros. gdb macros
++for hardware breakpoints are described below.
++
++hwebrk        - Places an execution breakpoint
++      hwebrk breakpointno address
++hwwbrk        - Places a write breakpoint
++      hwwbrk breakpointno length address
++hwabrk        - Places an access breakpoint
++      hwabrk breakpointno length address
++hwrmbrk       - Removes a breakpoint
++      hwrmbrk breakpointno
++exinfo        - Tells whether a software or hardware breakpoint has occurred.
++      Prints number of the hardware breakpoint if a hardware breakpoint has
++      occurred.
++
++Arguments required by these commands are as follows
++breakpointno  - 0 to 3
++length                - 1 to 3
++address               - Memory location in hex digits ( without 0x ) e.g c015e9bc
++
++SMP support
++==========
++
++When a breakpoint occurs or user issues a break ( Ctrl + C ) to gdb
++client, all the processors are forced to enter the debugger. Current
++thread corresponds to the thread running on the processor where
++breakpoint occurred.  Threads running on other processor(s) appear
++similar to other non-running threads in the 'info threads' output.
++Within the kgdb stub there is a structure "waiting_cpus" in which kgdb
++records the values of "current" and "regs" for each CPU other than the
++one that hit the breakpoint.  "current" is a pointer to the task
++structure for the task that CPU is running, while "regs" points to the
++saved registers for the task.  This structure can be examined with the
++gdb "p" command.
++
++ia-32 hardware debugging registers on all processors are set to same
++values.  Hence any hardware breakpoints may occur on any processor.
++
++gdb troubleshooting
++===================
++
++1. gdb hangs
++Kill it. restart gdb. Connect to target machine.
++
++2. gdb cannot connect to target machine (after killing a gdb and
++restarting another) If the target machine was not inside debugger when
++you killed gdb, gdb cannot connect because the target machine won't
++respond.  In this case echo "Ctrl+C"(ASCII 3) to the serial line.
++e.g. echo -e "\003" > /dev/ttyS1
++This forces that target machine into the debugger, after which you
++can connect.
++
++3. gdb cannot connect even after echoing Ctrl+C into serial line
++Try changing serial line settings min to 1 and time to 0
++e.g. stty min 1 time 0 < /dev/ttyS1
++Try echoing again
++
++Check serial line speed and set it to correct value if required
++e.g. stty ispeed 115200 ospeed 115200 < /dev/ttyS1
++
++EVENTS
++======
++
++Ever want to know the order of things happening?  Which CPU did what and
++when?  How did the spinlock get the way it is?  Then events are for
++you.  Events are defined by calls to an event collection interface and
++saved for later examination.  In this case, kgdb events are saved by a
++very fast bit of code in kgdb which is fully SMP and interrupt protected
++and they are examined by using gdb to display them.  Kgdb keeps only
++the last N events, where N must be a power of two and is defined at
++configure time.
++
++
++Events are signaled to kgdb by calling:
++
++kgdb_ts(data0,data1)
++
++For each call kgdb records each call in an array along with other info.
++Here is the array definition:
++
++struct kgdb_and_then_struct {
++#ifdef CONFIG_SMP
++      int     on_cpu;
++#endif
++      long long at_time;
++      int     from_ln;
++      char    * in_src;
++      void    *from;
++        int     with_if;
++      int     data0;
++      int     data1;
++};
++
++For SMP machines the CPU is recorded, for all machines the TSC is
++recorded (gets a time stamp) as well as the line number and source file
++the call was made from.  The address of the (from), the "if" (interrupt
++flag) and the two data items are also recorded.  The macro kgdb_ts casts
++the types to int, so you can put any 32-bit values here.  There is a
++configure option to select the number of events you want to keep.  A
++nice number might be 128, but you can keep up to 1024 if you want.  The
++number must be a power of two.  An "andthen" macro library is provided
++for gdb to help you look at these events.  It is also possible to define
++a different structure for the event storage and cast the data to this
++structure.  For example the following structure is defined in kgdb:
++
++struct kgdb_and_then_struct2 {
++#ifdef CONFIG_SMP
++      int     on_cpu;
++#endif
++      long long at_time;
++      int     from_ln;
++      char    * in_src;
++      void    *from;
++        int     with_if;
++      struct task_struct *t1;
++      struct task_struct *t2;
++};
++
++If you use this for display, the data elements will be displayed as
++pointers to task_struct entries.  You may want to define your own
++structure to use in casting.  You should only change the last two items
++and you must keep the structure size the same.  Kgdb will handle these
++as 32-bit ints, but within that constraint you can define a structure to
++cast to any 32-bit quantity.  This need only be available to gdb and is
++only used for casting in the display code.
++
++Final Items
++===========
++
++I picked up this code from Amit S. Kale and enhanced it.
++
++If you make some really cool modification to this stuff, or if you 
++fix a bug, please let me know.
++
++George Anzinger
++<george@mvista.com>
++
++Amit S. Kale
++<akale@veritas.com>
++
++(First kgdb by David Grothe <dave@gcom.com>)
++
++(modified by Tigran Aivazian <tigran@sco.com>)
++    Putting gdbstub into the kernel config menu.
++
++(modified by Scott Foehner <sfoehner@engr.sgi.com>)
++    Hooks for entering gdbstub at boot time.
++
++(modified by Amit S. Kale <akale@veritas.com>)
++    Threads, ia-32 hw debugging, mp support, console support,
++    nmi watchdog handling.
++
++(modified by George Anzinger <george@mvista.com>)
++    Extended threads to include the idle threads.
++    Enhancements to allow breakpoint() at first C code.
++    Use of module_init() and __setup() to automate the configure.
++    Enhanced the cpu "collection" code to work in early bring-up.
++    Added ability to call functions from gdb
++    Print info thread stuff without going back to schedule()
++    Now collect the "other" cpus with an IPI/ NMI.
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/Documentation/i386/kgdb/loadmodule.sh   2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,78 @@
++#/bin/sh
++# This script loads a module on a target machine and generates a gdb script.
++# source generated gdb script to load the module file at appropriate addresses
++# in gdb.
++#
++# Usage: 
++# Loading the module on target machine and generating gdb script)
++#     [foo]$ loadmodule.sh <modulename>
++#
++# Loading the module file into gdb
++#     (gdb) source <gdbscriptpath>
++#
++# Modify following variables according to your setup. 
++#     TESTMACHINE - Name of the target machine
++#     GDBSCRIPTS - The directory where a gdb script will be generated
++#
++# Author: Amit S. Kale (akale@veritas.com).
++#
++# If you run into problems, please check files pointed to by following
++# variables.
++#     ERRFILE - /tmp/<modulename>.errs contains stderr output of insmod
++#     MAPFILE - /tmp/<modulename>.map contains stdout output of insmod
++#     GDBSCRIPT - $GDBSCRIPTS/load<modulename> gdb script.
++
++TESTMACHINE=foo
++GDBSCRIPTS=/home/bar
++
++if [ $# -lt 1 ] ; then {
++      echo Usage: $0 modulefile
++      exit
++} ; fi
++
++MODULEFILE=$1
++MODULEFILEBASENAME=`basename $1`
++
++if [ $MODULEFILE = $MODULEFILEBASENAME ] ; then {
++      MODULEFILE=`pwd`/$MODULEFILE
++} fi
++
++ERRFILE=/tmp/$MODULEFILEBASENAME.errs
++MAPFILE=/tmp/$MODULEFILEBASENAME.map
++GDBSCRIPT=$GDBSCRIPTS/load$MODULEFILEBASENAME
++
++function findaddr() {
++      local ADDR=0x$(echo "$SEGMENTS" | \
++              grep "$1" | sed 's/^[^ ]*[ ]*[^ ]*[ ]*//' | \
++              sed 's/[ ]*[^ ]*$//')
++      echo $ADDR
++}
++
++function checkerrs() {
++      if [ "`cat $ERRFILE`" != "" ] ; then {
++              cat $ERRFILE
++              exit
++      } fi
++}
++
++#load the module
++echo Copying $MODULEFILE to $TESTMACHINE
++rcp $MODULEFILE root@${TESTMACHINE}:
++
++echo Loading module $MODULEFILE
++rsh -l root $TESTMACHINE  /sbin/insmod -m ./`basename $MODULEFILE` \
++      > $MAPFILE 2> $ERRFILE
++checkerrs
++
++SEGMENTS=`head -n 11 $MAPFILE | tail -n 10`
++TEXTADDR=$(findaddr "\\.text[^.]")
++LOADSTRING="add-symbol-file $MODULEFILE $TEXTADDR"
++SEGADDRS=`echo "$SEGMENTS" | awk '//{
++      if ($1 != ".text" && $1 != ".this" &&
++          $1 != ".kstrtab" && $1 != ".kmodtab") {
++              print " -s " $1 " 0x" $3 " "
++      }
++}'`
++LOADSTRING="$LOADSTRING $SEGADDRS"
++echo Generating script $GDBSCRIPT
++echo $LOADSTRING > $GDBSCRIPT
+--- linux-2.6.0-test1/Documentation/magic-number.txt   2003-06-14 12:18:23.000000000 -0700
++++ 25/Documentation/magic-number.txt  2003-07-19 17:03:49.000000000 -0700
+@@ -51,6 +51,13 @@ kernel before 2.6.x yet.
+                                       <pasky@ucw.cz>
+                                       03 Nov 2002
++Updated the magic table to Linux 2.5.74.
++
++                                      Fabian Frederick
++                                      <ffrederick@users.sourceforge.net>
++                                      09 Jul 2003
++
++
+ Magic Name            Number      Structure            File
+ ===========================================================================
+ PG_MAGIC              'P'         pg_{read,write}_hdr include/linux/pg.h
+@@ -62,10 +69,12 @@ AURORA_MAGIC          0x0A18      Aurora
+ HDLC_MAGIC            0x239e      n_hdlc            drivers/char/n_hdlc.c
+ APM_BIOS_MAGIC        0x4101      apm_user          arch/i386/kernel/apm.c
+ CYCLADES_MAGIC        0x4359      cyclades_port     include/linux/cyclades.h
++DB_MAGIC              0x4442      fc_info           drivers/net/iph5526_novram.c
++DL_MAGIC              0x444d      fc_info           drivers/net/iph5526_novram.c
+ FASYNC_MAGIC          0x4601      fasync_struct     include/linux/fs.h
++FF_MAGIC              0x4646      fc_info           drivers/net/iph5526_novram.c
+ ISICOM_MAGIC          0x4d54      isi_port          include/linux/isicom.h
+-PTY_MAGIC             0x5001      (none at the moment)
+-                                                    drivers/char/pty.c
++PTY_MAGIC             0x5001                        drivers/char/pty.c
+ PPP_MAGIC             0x5002      ppp               include/linux/if_pppvar.h
+ SERIAL_MAGIC          0x5301      async_struct      include/linux/serial.h
+ SSTATE_MAGIC          0x5302      serial_state      include/linux/serial.h
+@@ -81,9 +90,9 @@ TTY_DRIVER_MAGIC      0x5402      tty_dr
+ MGSLPC_MAGIC          0x5402      mgslpc_info       drivers/char/pcmcia/synclink_cs.c
+ TTY_LDISC_MAGIC       0x5403      tty_ldisc         include/linux/tty_ldisc.h
+ USB_SERIAL_MAGIC      0x6702      usb_serial        drivers/usb/serial/usb-serial.h
++FULL_DUPLEX_MAGIC     0x6969                        drivers/net/tulip/de2104x.c
+ USB_BLUETOOTH_MAGIC   0x6d02      usb_bluetooth     drivers/usb/class/bluetty.c
+-RFCOMM_TTY_MAGIC      0x6d02      (note at the moment)
+-                                                    net/bluetooth/rfcomm/tty.c
++RFCOMM_TTY_MAGIC      0x6d02                        net/bluetooth/rfcomm/tty.c
+ USB_SERIAL_PORT_MAGIC 0x7301      usb_serial_port   drivers/usb/serial/usb-serial.h
+ CG_MAGIC              0x00090255  ufs_cylinder_group include/linux/ufs_fs.h
+ A2232_MAGIC           0x000a2232  gs_port           drivers/char/ser_a2232.h
+@@ -91,6 +100,7 @@ SOLARIS_SOCKET_MAGIC  0x000ADDED  sol_so
+ RPORT_MAGIC           0x00525001  r_port            drivers/char/rocket_int.h
+ LSEMAGIC              0x05091998  lse               drivers/fc4/fc.c
+ GDTIOCTL_MAGIC        0x06030f07  gdth_iowr_str     drivers/scsi/gdth_ioctl.h
++RIEBL_MAGIC           0x09051990                    drivers/net/atarilance.c
+ RIO_MAGIC             0x12345678  gs_port           drivers/char/rio/rio_linux.c
+ SX_MAGIC              0x12345678  gs_port           drivers/char/sx.h
+ NBD_REQUEST_MAGIC     0x12560953  nbd_request       include/linux/nbd.h
+@@ -120,6 +130,7 @@ SAVEKMSG_MAGIC1       0x53415645  savekm
+ GDA_MAGIC             0x58464552  gda               include/asm-mips64/sn/gda.h
+ RED_MAGIC1            0x5a2cf071  (any)             mm/slab.c
+ STL_PORTMAGIC         0x5a7182c9  stlport           include/linux/stallion.h
++EEPROM_MAGIC_VALUE    0X5ab478d2  lanai_dev         drivers/atm/lanai.c
+ HDLCDRV_MAGIC         0x5ac6e778  hdlcdrv_state     include/linux/hdlcdrv.h
+ EPCA_MAGIC            0x5c6df104  channel           include/linux/epca.h
+ PCXX_MAGIC            0x5c6df104  channel           drivers/char/pcxx.h
+@@ -127,9 +138,11 @@ KV_MAGIC              0x5f4b565f  kernel
+ I810_STATE_MAGIC      0x63657373  i810_state        sound/oss/i810_audio.c
+ TRIDENT_STATE_MAGIC   0x63657373  trient_state      sound/oss/trident.c
+ M3_CARD_MAGIC         0x646e6f50  m3_card           sound/oss/maestro3.c
++FW_HEADER_MAGIC       0x65726F66  fw_header         drivers/atm/fore200e.h
+ SLOT_MAGIC            0x67267321  slot              drivers/hotplug/cpqphp.h
+ SLOT_MAGIC            0x67267322  slot              drivers/hotplug/acpiphp.h
+ LO_MAGIC              0x68797548  nbd_device        include/linux/nbd.h
++OPROFILE_MAGIC        0x6f70726f  super_block       drivers/oprofile/oprofilefs.h
+ M3_STATE_MAGIC        0x734d724d  m3_state          sound/oss/maestro3.c
+ STL_PANELMAGIC        0x7ef621a1  stlpanel          include/linux/stallion.h
+ VMALLOC_MAGIC         0x87654320  snd_alloc_track   sound/core/memory.c
+@@ -137,11 +150,15 @@ KMALLOC_MAGIC         0x87654321  snd_al
+ PWC_MAGIC             0x89DC10AB  pwc_device        drivers/usb/media/pwc.h
+ NBD_REPLY_MAGIC       0x96744668  nbd_reply         include/linux/nbd.h
+ STL_BOARDMAGIC        0xa2267f52  stlbrd            include/linux/stallion.h
++ENI155_MAGIC          0xa54b872d  midway_eprom            drivers/atm/eni.h
+ SCI_MAGIC             0xbabeface  gs_port           drivers/char/sh-sci.h
+ CODA_MAGIC            0xC0DAC0DA  coda_file_info    include/linux/coda_fs_i.h
++DPMEM_MAGIC           0xc0ffee11  gdt_pci_sram      drivers/scsi/gdth.h
+ STLI_PORTMAGIC        0xe671c7a1  stliport          include/linux/istallion.h
+ YAM_MAGIC             0xF10A7654  yam_port          drivers/net/hamradio/yam.c
+ CCB_MAGIC             0xf2691ad2  ccb               drivers/scsi/ncr53c8xx.c
++QUEUE_MAGIC_FREE      0xf7e1c9a3  queue_entry       drivers/scsi/arm/queue.c
++QUEUE_MAGIC_USED      0xf7e1cc33  queue_entry       drivers/scsi/arm/queue.c
+ HTB_CMAGIC            0xFEFAFEF1  htb_class         net/sched/sch_htb.c
+ NMI_MAGIC             0x48414d4d455201 nmi_s        include/asm-mips64/sn/nmi.h
+--- linux-2.6.0-test1/Documentation/networking/vortex.txt      2003-06-14 12:18:00.000000000 -0700
++++ 25/Documentation/networking/vortex.txt     2003-07-19 17:05:08.000000000 -0700
+@@ -216,19 +216,6 @@ watchdog=N
+   to increase this value on LANs which have very high collision rates.
+   The default value is 5000 (5.0 seconds).
+-enable_wol=N1,N2,N3,...
+-
+-  Enable Wake-on-LAN support for the relevant interface.  Donald
+-  Becker's `ether-wake' application may be used to wake suspended
+-  machines.
+-
+-  Also enables the NIC's power management support.
+-
+-global_enable_wol=N
+-
+-  Sets enable_wol mode for all 3c59x NICs in the machine.  Entries in
+-  the `enable_wol' array above will override any setting of this.
+-
+ Media selection
+ ---------------
+--- linux-2.6.0-test1/Documentation/pnp.txt    2003-06-14 12:17:58.000000000 -0700
++++ 25/Documentation/pnp.txt   2003-07-19 17:03:49.000000000 -0700
+@@ -22,7 +22,7 @@ user interface is integrated into driver
+ In addition to the standard driverfs file the following are created in each 
+ device's directory:
+ id - displays a list of support EISA IDs
+-possible - displays possible resource configurations
++options - displays possible resource configurations
+ resources - displays currently allocated resources and allows resource changes
+ -activating a device
+@@ -60,7 +60,7 @@ DISABLED
+ - Notice the string "DISABLED".  THis means the device is not active.
+ 3.) check the device's possible configurations (optional)
+-# cat possible
++# cat options
+ Dependent: 01 - Priority acceptable
+     port 0x3f0-0x3f0, align 0x7, size 0x6, 16-bit address decoding
+     port 0x3f7-0x3f7, align 0x0, size 0x1, 16-bit address decoding
+--- linux-2.6.0-test1/drivers/acorn/block/fd1772.c     2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/acorn/block/fd1772.c    2003-07-19 17:03:49.000000000 -0700
+@@ -152,8 +152,6 @@
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
+-
+ /* Note: FD_MAX_UNITS could be redefined to 2 for the Atari (with
+  * little additional rework in this file). But I'm not yet sure if
+  * some other code depends on the number of floppies... (It is defined
+--- linux-2.6.0-test1/drivers/acorn/block/mfmhd.c      2003-06-14 12:18:01.000000000 -0700
++++ 25/drivers/acorn/block/mfmhd.c     2003-07-19 17:03:49.000000000 -0700
+@@ -111,7 +111,6 @@
+ #include <linux/major.h>
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/acpi/executer/exutils.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/acpi/executer/exutils.c 2003-07-19 17:03:49.000000000 -0700
+@@ -290,7 +290,7 @@ acpi_ex_digits_needed (
+        * acpi_integer is unsigned, so we don't worry about a '-'
+        */
+       if ((current_value = value) == 0) {
+-          return_VALUE (1);
++              return_VALUE (1);
+       }
+       num_digits = 0;
+--- linux-2.6.0-test1/drivers/acpi/hardware/hwregs.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/acpi/hardware/hwregs.c  2003-07-19 17:03:49.000000000 -0700
+@@ -357,9 +357,9 @@ acpi_set_register (
+       /*
+        * Decode the Register ID
+-       * Register id = Register block id | bit id
++       * Register ID = [Register block ID] | [bit ID]
+        *
+-       * Check bit id to fine locate Register offset.
++       * Check bit ID to fine locate Register offset.
+        * Check Mask to determine Register offset, and then read-write.
+        */
+       switch (bit_reg_info->parent_register) {
+@@ -367,9 +367,9 @@ acpi_set_register (
+               /*
+                * Status Registers are different from the rest.  Clear by
+-               * writing 1, writing 0 has no effect.  So, the only relevant
++               * writing 1, and writing 0 has no effect.  So, the only relevant
+                * information is the single bit we're interested in, all others should
+-               * be written as 0 so they will be left unchanged
++               * be written as 0 so they will be left unchanged.
+                */
+               value = ACPI_REGISTER_PREPARE_BITS (value,
+                                bit_reg_info->bit_position, bit_reg_info->access_bit_mask);
+@@ -394,17 +394,17 @@ acpi_set_register (
+       case ACPI_REGISTER_PM1_CONTROL:
+               /*
+-               * Read the PM1 Control register.
++               * Write the PM1 Control register.
+                * Note that at this level, the fact that there are actually TWO
+-               * registers (A and B - and that B may not exist) is abstracted.
++               * registers (A and B - and B may not exist) is abstracted.
+                */
+               ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM1 control: Read %X\n", register_value));
+               ACPI_REGISTER_INSERT_VALUE (register_value, bit_reg_info->bit_position,
+                               bit_reg_info->access_bit_mask, value);
+-              status = acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, register_id,
+-                              (u16) register_value);
++              status = acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
++                                ACPI_REGISTER_PM1_CONTROL, (u16) register_value);
+               break;
+@@ -724,7 +724,7 @@ acpi_hw_low_level_read (
+       /*
+        * Three address spaces supported:
+-       * Memory, Io, or PCI config.
++       * Memory, IO, or PCI_Config.
+        */
+       switch (reg->address_space_id) {
+       case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+@@ -808,9 +808,10 @@ acpi_hw_low_level_write (
+               (!reg->address)) {
+               return (AE_OK);
+       }
++
+       /*
+        * Three address spaces supported:
+-       * Memory, Io, or PCI config.
++       * Memory, IO, or PCI_Config.
+        */
+       switch (reg->address_space_id) {
+       case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+--- linux-2.6.0-test1/drivers/acpi/osl.c       2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/acpi/osl.c      2003-07-19 17:03:49.000000000 -0700
+@@ -35,6 +35,7 @@
+ #include <linux/kmod.h>
+ #include <linux/delay.h>
+ #include <linux/workqueue.h>
++#include <linux/nmi.h>
+ #include <acpi/acpi.h>
+ #include <asm/io.h>
+ #include <acpi/acpi_bus.h>
+@@ -291,11 +292,14 @@ acpi_os_sleep(u32 sec, u32 ms)
+ void
+ acpi_os_stall(u32 us)
+ {
+-      if (us > 10000) {
+-              mdelay(us / 1000);
+-      }
+-      else {
+-              udelay(us);
++      while (us) {
++              u32 delay = 1000;
++
++              if (delay > us)
++                      delay = us;
++              udelay(delay);
++              touch_nmi_watchdog();
++              us -= delay;
+       }
+ }
+--- linux-2.6.0-test1/drivers/acpi/processor.c 2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/acpi/processor.c        2003-07-19 17:03:49.000000000 -0700
+@@ -1351,7 +1351,7 @@ static int acpi_processor_throttling_ope
+                                               PDE(inode)->data);
+ }
+-static int
++static ssize_t
+ acpi_processor_write_throttling (
+         struct file           *file,
+         const char            *buffer,
+@@ -1414,7 +1414,7 @@ static int acpi_processor_limit_open_fs(
+                                               PDE(inode)->data);
+ }
+-static int
++static ssize_t
+ acpi_processor_write_limit (
+       struct file             *file,
+       const char              *buffer,
+--- linux-2.6.0-test1/drivers/acpi/tables.c    2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/acpi/tables.c   2003-07-19 17:03:49.000000000 -0700
+@@ -33,6 +33,7 @@
+ #include <linux/irq.h>
+ #include <linux/errno.h>
+ #include <linux/acpi.h>
++#include <linux/bootmem.h>
+ #define PREFIX                        "ACPI: "
+@@ -61,16 +62,14 @@ static char *acpi_table_signatures[ACPI_
+ /* System Description Table (RSDT/XSDT) */
+ struct acpi_table_sdt {
+-      unsigned long           pa;             /* Physical Address */
+-      unsigned long           count;          /* Table count */
+-      struct {
+-              unsigned long           pa;
+-              enum acpi_table_id      id;
+-              unsigned long           size;
+-      }                       entry[ACPI_MAX_TABLES];
++      unsigned long           pa;
++      enum acpi_table_id      id;
++      unsigned long           size;
+ } __attribute__ ((packed));
+-static struct acpi_table_sdt  sdt;
++static unsigned long          sdt_pa;         /* Physical Address */
++static unsigned long          sdt_count;      /* Table count */
++static struct acpi_table_sdt  *sdt_entry;
+ void
+ acpi_table_print (
+@@ -236,11 +235,11 @@ acpi_get_table_header_early (
+       /* Locate the table. */
+-      for (i = 0; i < sdt.count; i++) {
+-              if (sdt.entry[i].id != temp_id)
++      for (i = 0; i < sdt_count; i++) {
++              if (sdt_entry[i].id != temp_id)
+                       continue;
+               *header = (void *)
+-                      __acpi_map_table(sdt.entry[i].pa, sdt.entry[i].size);
++                      __acpi_map_table(sdt_entry[i].pa, sdt_entry[i].size);
+               if (!*header) {
+                       printk(KERN_WARNING PREFIX "Unable to map %s\n",
+                              acpi_table_signatures[temp_id]);
+@@ -289,11 +288,11 @@ acpi_table_parse_madt_family (
+       /* Locate the MADT (if exists). There should only be one. */
+-      for (i = 0; i < sdt.count; i++) {
+-              if (sdt.entry[i].id != id)
++      for (i = 0; i < sdt_count; i++) {
++              if (sdt_entry[i].id != id)
+                       continue;
+               madt = (void *)
+-                      __acpi_map_table(sdt.entry[i].pa, sdt.entry[i].size);
++                      __acpi_map_table(sdt_entry[i].pa, sdt_entry[i].size);
+               if (!madt) {
+                       printk(KERN_WARNING PREFIX "Unable to map %s\n",
+                              acpi_table_signatures[id]);
+@@ -308,7 +307,7 @@ acpi_table_parse_madt_family (
+               return -ENODEV;
+       }
+-      madt_end = (unsigned long) madt + sdt.entry[i].size;
++      madt_end = (unsigned long) madt + sdt_entry[i].size;
+       /* Parse all entries looking for a match. */
+@@ -349,10 +348,10 @@ acpi_table_parse (
+       if (!handler)
+               return -EINVAL;
+-      for (i = 0; i < sdt.count; i++) {
+-              if (sdt.entry[i].id != id)
++      for (i = 0; i < sdt_count; i++) {
++              if (sdt_entry[i].id != id)
+                       continue;
+-              handler(sdt.entry[i].pa, sdt.entry[i].size);
++              handler(sdt_entry[i].pa, sdt_entry[i].size);
+               count++;
+       }
+@@ -377,11 +376,11 @@ acpi_table_get_sdt (
+                       
+               struct acpi_table_xsdt  *mapped_xsdt = NULL;
+-              sdt.pa = ((struct acpi20_table_rsdp*)rsdp)->xsdt_address;
++              sdt_pa = ((struct acpi20_table_rsdp*)rsdp)->xsdt_address;
+               /* map in just the header */
+               header = (struct acpi_table_header *)
+-                      __acpi_map_table(sdt.pa, sizeof(struct acpi_table_header));
++                      __acpi_map_table(sdt_pa, sizeof(struct acpi_table_header));
+               if (!header) {
+                       printk(KERN_WARNING PREFIX "Unable to map XSDT header\n");
+@@ -390,7 +389,7 @@ acpi_table_get_sdt (
+               /* remap in the entire table before processing */
+               mapped_xsdt = (struct acpi_table_xsdt *)
+-                      __acpi_map_table(sdt.pa, header->length);
++                      __acpi_map_table(sdt_pa, header->length);
+               if (!mapped_xsdt) {
+                       printk(KERN_WARNING PREFIX "Unable to map XSDT\n");
+                       return -ENODEV;
+@@ -407,15 +406,21 @@ acpi_table_get_sdt (
+                       return -ENODEV;
+               }
+-              sdt.count = (header->length - sizeof(struct acpi_table_header)) >> 3;
+-              if (sdt.count > ACPI_MAX_TABLES) {
++              sdt_count = (header->length - sizeof(struct acpi_table_header)) >> 3;
++              if (sdt_count > ACPI_MAX_TABLES) {
+                       printk(KERN_WARNING PREFIX "Truncated %lu XSDT entries\n",
+-                              (sdt.count - ACPI_MAX_TABLES));
+-                      sdt.count = ACPI_MAX_TABLES;
++                              (sdt_count - ACPI_MAX_TABLES));
++                      sdt_count = ACPI_MAX_TABLES;
+               }
+-              for (i = 0; i < sdt.count; i++)
+-                      sdt.entry[i].pa = (unsigned long) mapped_xsdt->entry[i];
++              sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt));
++              if (!sdt_entry) {
++                      printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n");
++                      return -ENOMEM;
++              }
++
++              for (i = 0; i < sdt_count; i++)
++                      sdt_entry[i].pa = (unsigned long) mapped_xsdt->entry[i];
+       }
+       /* Then check RSDT */
+@@ -424,11 +429,11 @@ acpi_table_get_sdt (
+               struct acpi_table_rsdt  *mapped_rsdt = NULL;
+-              sdt.pa = rsdp->rsdt_address;
++              sdt_pa = rsdp->rsdt_address;
+               /* map in just the header */
+               header = (struct acpi_table_header *)
+-                      __acpi_map_table(sdt.pa, sizeof(struct acpi_table_header));
++                      __acpi_map_table(sdt_pa, sizeof(struct acpi_table_header));
+               if (!header) {
+                       printk(KERN_WARNING PREFIX "Unable to map RSDT header\n");
+                       return -ENODEV;
+@@ -436,7 +441,7 @@ acpi_table_get_sdt (
+               /* remap in the entire table before processing */
+               mapped_rsdt = (struct acpi_table_rsdt *)
+-                      __acpi_map_table(sdt.pa, header->length);
++                      __acpi_map_table(sdt_pa, header->length);
+               if (!mapped_rsdt) {
+                       printk(KERN_WARNING PREFIX "Unable to map RSDT\n");
+                       return -ENODEV;
+@@ -453,15 +458,21 @@ acpi_table_get_sdt (
+                       return -ENODEV;
+               }
+-              sdt.count = (header->length - sizeof(struct acpi_table_header)) >> 2;
+-              if (sdt.count > ACPI_MAX_TABLES) {
++              sdt_count = (header->length - sizeof(struct acpi_table_header)) >> 2;
++              if (sdt_count > ACPI_MAX_TABLES) {
+                       printk(KERN_WARNING PREFIX "Truncated %lu RSDT entries\n",
+-                              (sdt.count - ACPI_TABLE_COUNT));
+-                      sdt.count = ACPI_MAX_TABLES;
++                              (sdt_count - ACPI_MAX_TABLES));
++                      sdt_count = ACPI_MAX_TABLES;
+               }
+-              for (i = 0; i < sdt.count; i++)
+-                      sdt.entry[i].pa = (unsigned long) mapped_rsdt->entry[i];
++              sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt));
++              if (!sdt_entry) {
++                      printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n");
++                      return -ENOMEM;
++              }
++
++              for (i = 0; i < sdt_count; i++)
++                      sdt_entry[i].pa = (unsigned long) mapped_rsdt->entry[i];
+       }
+       else {
+@@ -469,38 +480,38 @@ acpi_table_get_sdt (
+               return -ENODEV;
+       }
+-      acpi_table_print(header, sdt.pa);
++      acpi_table_print(header, sdt_pa);
+-      for (i = 0; i < sdt.count; i++) {
++      for (i = 0; i < sdt_count; i++) {
+               /* map in just the header */
+               header = (struct acpi_table_header *)
+-                      __acpi_map_table(sdt.entry[i].pa,
++                      __acpi_map_table(sdt_entry[i].pa,
+                               sizeof(struct acpi_table_header));
+               if (!header)
+                       continue;
+               /* remap in the entire table before processing */
+               header = (struct acpi_table_header *)
+-                      __acpi_map_table(sdt.entry[i].pa,
++                      __acpi_map_table(sdt_entry[i].pa,
+                               header->length);
+               if (!header)
+                       continue;
+                      
+-              acpi_table_print(header, sdt.entry[i].pa);
++              acpi_table_print(header, sdt_entry[i].pa);
+               if (acpi_table_compute_checksum(header, header->length)) {
+                       printk(KERN_WARNING "  >>> ERROR: Invalid checksum\n");
+                       continue;
+               }
+-              sdt.entry[i].size = header->length;
++              sdt_entry[i].size = header->length;
+               for (id = 0; id < ACPI_TABLE_COUNT; id++) {
+                       if (!strncmp((char *) &header->signature,
+                               acpi_table_signatures[id],
+                               sizeof(header->signature))) {
+-                              sdt.entry[i].id = id;
++                              sdt_entry[i].id = id;
+                       }
+               }
+       }
+@@ -525,8 +536,6 @@ acpi_table_init (void)
+       unsigned long           rsdp_phys = 0;
+       int                     result = 0;
+-      memset(&sdt, 0, sizeof(struct acpi_table_sdt));
+-
+       /* Locate and map the Root System Description Table (RSDP) */
+       rsdp_phys = acpi_find_rsdp();
+--- linux-2.6.0-test1/drivers/acpi/tables/tbconvrt.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/acpi/tables/tbconvrt.c  2003-07-19 17:03:49.000000000 -0700
+@@ -75,14 +75,10 @@ acpi_tb_get_table_count (
+       ACPI_FUNCTION_ENTRY ();
+-#if ACPI_MACHINE_WIDTH != 64
+-
+       if (RSDP->revision < 2) {
+               pointer_size = sizeof (u32);
+       }
+-      else
+-#endif
+-      {
++      else {
+               pointer_size = sizeof (u64);
+       }
+--- linux-2.6.0-test1/drivers/acpi/tables/tbget.c      2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/acpi/tables/tbget.c     2003-07-19 17:03:49.000000000 -0700
+@@ -145,7 +145,7 @@ acpi_tb_get_table_header (
+               /* Create a logical address for the physical pointer*/
+               status = acpi_os_map_memory (address->pointer.physical, sizeof (struct acpi_table_header),
+-                                (void **) &header);
++                                (void *) &header);
+               if (ACPI_FAILURE (status)) {
+                       ACPI_REPORT_ERROR (("Could not map memory at %8.8X%8.8X for length %X\n",
+                               ACPI_HIDWORD (address->pointer.physical),
+@@ -361,7 +361,7 @@ acpi_tb_get_this_table (
+                * into our address space.
+                */
+               status = acpi_os_map_memory (address->pointer.physical, (acpi_size) header->length,
+-                                (void **) &full_table);
++                                (void *) &full_table);
+               if (ACPI_FAILURE (status)) {
+                       ACPI_REPORT_ERROR (("Could not map memory for table [%4.4s] at %8.8X%8.8X for length %X\n",
+                               header->signature,
+--- linux-2.6.0-test1/drivers/acpi/tables/tbinstal.c   2003-06-14 12:18:03.000000000 -0700
++++ 25/drivers/acpi/tables/tbinstal.c  2003-07-19 17:03:49.000000000 -0700
+@@ -271,22 +271,40 @@ acpi_tb_init_table_descriptor (
+               if (list_head->next) {
+                       return_ACPI_STATUS (AE_ALREADY_EXISTS);
+               }
+-      }
+-      /*
+-       * Link the new table in to the list of tables of this type.
+-       * Just insert at the start of the list, order unimportant.
+-       *
+-       * table_desc->Prev is already NULL from calloc()
+-       */
+-      table_desc->next = list_head->next;
+-      list_head->next = table_desc;
++              table_desc->next = list_head->next;
++              list_head->next = table_desc;
+-      if (table_desc->next) {
+-              table_desc->next->prev = table_desc;
++              if (table_desc->next) {
++                      table_desc->next->prev = table_desc;
++              }
++
++              list_head->count++;
+       }
++      else {
++              /*
++               * Link the new table in to the list of tables of this type.
++               * Insert at the end of the list, order IS IMPORTANT.
++               *
++               * table_desc->Prev & Next are already NULL from calloc()
++               */
++              list_head->count++;
++
++              if (!list_head->next) {
++                      list_head->next = table_desc;
++              }
++              else {
++                      table_desc->next = list_head->next;
+-      list_head->count++;
++                      while (table_desc->next->next) {
++                              table_desc->next = table_desc->next->next;
++                      }
++
++                      table_desc->next->next = table_desc;
++                      table_desc->prev = table_desc->next;
++                      table_desc->next = NULL;
++              }
++      }
+       /* Finish initialization of the table descriptor */
+--- linux-2.6.0-test1/drivers/acpi/tables/tbrsdt.c     2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/acpi/tables/tbrsdt.c    2003-07-19 17:03:49.000000000 -0700
+@@ -85,7 +85,7 @@ acpi_tb_verify_rsdp (
+                * Obtain access to the RSDP structure
+                */
+               status = acpi_os_map_memory (address->pointer.physical, sizeof (struct rsdp_descriptor),
+-                                (void **) &rsdp);
++                                (void *) &rsdp);
+               if (ACPI_FAILURE (status)) {
+                       return_ACPI_STATUS (status);
+               }
+--- linux-2.6.0-test1/drivers/acpi/tables/tbxfroot.c   2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/acpi/tables/tbxfroot.c  2003-07-19 17:03:49.000000000 -0700
+@@ -179,7 +179,7 @@ acpi_get_firmware_table (
+               if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) {
+                       status = acpi_os_map_memory (rsdp_address.pointer.physical, sizeof (struct rsdp_descriptor),
+-                                        (void **) &acpi_gbl_RSDP);
++                                        (void *) &acpi_gbl_RSDP);
+                       if (ACPI_FAILURE (status)) {
+                               return_ACPI_STATUS (status);
+                       }
+@@ -423,7 +423,7 @@ acpi_tb_find_rsdp (
+                * 1) Search EBDA (low memory) paragraphs
+                */
+               status = acpi_os_map_memory ((u64) ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE,
+-                                (void **) &table_ptr);
++                                (void *) &table_ptr);
+               if (ACPI_FAILURE (status)) {
+                       ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X for length %X\n",
+                               ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE));
+@@ -447,7 +447,7 @@ acpi_tb_find_rsdp (
+                * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h
+                */
+               status = acpi_os_map_memory ((u64) ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE,
+-                                (void **) &table_ptr);
++                                (void *) &table_ptr);
+               if (ACPI_FAILURE (status)) {
+                       ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X for length %X\n",
+                               ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE));
+--- linux-2.6.0-test1/drivers/acpi/thermal.c   2003-06-14 12:18:32.000000000 -0700
++++ 25/drivers/acpi/thermal.c  2003-07-19 17:03:49.000000000 -0700
+@@ -84,11 +84,11 @@ static int acpi_thermal_remove (struct a
+ static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file);
+ static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file);
+ static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file);
+-static int acpi_thermal_write_trip_points (struct file*,const char *,size_t,loff_t *);
++static ssize_t acpi_thermal_write_trip_points (struct file*,const char *,size_t,loff_t *);
+ static int acpi_thermal_cooling_open_fs(struct inode *inode, struct file *file);
+-static int acpi_thermal_write_cooling_mode (struct file*,const char *,size_t,loff_t *);
++static ssize_t acpi_thermal_write_cooling_mode (struct file*,const char *,size_t,loff_t *);
+ static int acpi_thermal_polling_open_fs(struct inode *inode, struct file *file);
+-static int acpi_thermal_write_polling(struct file*,const char *,size_t,loff_t *);
++static ssize_t acpi_thermal_write_polling(struct file*,const char *,size_t,loff_t *);
+ static struct acpi_driver acpi_thermal_driver = {
+       .name =         ACPI_THERMAL_DRIVER_NAME,
+@@ -881,7 +881,7 @@ static int acpi_thermal_trip_open_fs(str
+       return single_open(file, acpi_thermal_trip_seq_show, PDE(inode)->data);
+ }
+-static int
++static ssize_t
+ acpi_thermal_write_trip_points (
+         struct file           *file,
+         const char            *buffer,
+@@ -950,7 +950,7 @@ static int acpi_thermal_cooling_open_fs(
+                                                       PDE(inode)->data);
+ }
+-static int
++static ssize_t
+ acpi_thermal_write_cooling_mode (
+       struct file             *file,
+       const char              *buffer,
+@@ -1011,7 +1011,7 @@ static int acpi_thermal_polling_open_fs(
+                                                       PDE(inode)->data);
+ }
+-static int
++static ssize_t
+ acpi_thermal_write_polling (
+       struct file             *file,
+       const char              *buffer,
+--- linux-2.6.0-test1/drivers/acpi/utilities/utglobal.c        2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/acpi/utilities/utglobal.c       2003-07-19 17:03:49.000000000 -0700
+@@ -307,9 +307,9 @@ struct acpi_table_support           acpi
+       /***********    Name,   Signature, Global typed pointer     Signature size,      Type                  How many allowed?,    Contains valid AML? */
+       /* RSDP 0 */ {RSDP_NAME, RSDP_SIG, NULL,                    sizeof (RSDP_SIG)-1, ACPI_TABLE_ROOT     | ACPI_TABLE_SINGLE},
+-      /* DSDT 1 */ {DSDT_SIG,  DSDT_SIG, (void **) &acpi_gbl_DSDT, sizeof (DSDT_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE  | ACPI_TABLE_EXECUTABLE},
+-      /* FADT 2 */ {FADT_SIG,  FADT_SIG, (void **) &acpi_gbl_FADT, sizeof (FADT_SIG)-1, ACPI_TABLE_PRIMARY | ACPI_TABLE_SINGLE},
+-      /* FACS 3 */ {FACS_SIG,  FACS_SIG, (void **) &acpi_gbl_FACS, sizeof (FACS_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE},
++      /* DSDT 1 */ {DSDT_SIG,  DSDT_SIG, (void *) &acpi_gbl_DSDT, sizeof (DSDT_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE  | ACPI_TABLE_EXECUTABLE},
++      /* FADT 2 */ {FADT_SIG,  FADT_SIG, (void *) &acpi_gbl_FADT, sizeof (FADT_SIG)-1, ACPI_TABLE_PRIMARY | ACPI_TABLE_SINGLE},
++      /* FACS 3 */ {FACS_SIG,  FACS_SIG, (void *) &acpi_gbl_FACS, sizeof (FACS_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE},
+       /* PSDT 4 */ {PSDT_SIG,  PSDT_SIG, NULL,                    sizeof (PSDT_SIG)-1, ACPI_TABLE_PRIMARY  | ACPI_TABLE_MULTIPLE | ACPI_TABLE_EXECUTABLE},
+       /* SSDT 5 */ {SSDT_SIG,  SSDT_SIG, NULL,                    sizeof (SSDT_SIG)-1, ACPI_TABLE_PRIMARY  | ACPI_TABLE_MULTIPLE | ACPI_TABLE_EXECUTABLE},
+       /* XSDT 6 */ {XSDT_SIG,  XSDT_SIG, NULL,                    sizeof (RSDT_SIG)-1, ACPI_TABLE_ROOT     | ACPI_TABLE_SINGLE},
+--- linux-2.6.0-test1/drivers/atm/atmtcp.c     2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/atm/atmtcp.c    2003-07-19 17:03:49.000000000 -0700
+@@ -66,7 +66,7 @@ static int atmtcp_send_control(struct at
+       *(struct atm_vcc **) &new_msg->vcc = vcc;
+       old_test = test_bit(flag,&vcc->flags);
+       out_vcc->push(out_vcc,skb);
+-      add_wait_queue(&vcc->sleep,&wait);
++      add_wait_queue(vcc->sk->sk_sleep, &wait);
+       while (test_bit(flag,&vcc->flags) == old_test) {
+               mb();
+               out_vcc = PRIV(vcc->dev) ? PRIV(vcc->dev)->vcc : NULL;
+@@ -78,7 +78,7 @@ static int atmtcp_send_control(struct at
+               schedule();
+       }
+       current->state = TASK_RUNNING;
+-      remove_wait_queue(&vcc->sleep,&wait);
++      remove_wait_queue(vcc->sk->sk_sleep, &wait);
+       return error;
+ }
+@@ -90,7 +90,7 @@ static int atmtcp_recv_control(const str
+       vcc->vpi = msg->addr.sap_addr.vpi;
+       vcc->vci = msg->addr.sap_addr.vci;
+       vcc->qos = msg->qos;
+-      vcc->reply = msg->result;
++      vcc->sk->sk_err = -msg->result;
+       switch (msg->type) {
+           case ATMTCP_CTRL_OPEN:
+               change_bit(ATM_VF_READY,&vcc->flags);
+@@ -103,7 +103,7 @@ static int atmtcp_recv_control(const str
+                   msg->type);
+               return -EINVAL;
+       }
+-      wake_up(&vcc->sleep);
++      wake_up(vcc->sk->sk_sleep);
+       return 0;
+ }
+@@ -134,7 +134,7 @@ static int atmtcp_v_open(struct atm_vcc 
+       clear_bit(ATM_VF_READY,&vcc->flags); /* just in case ... */
+       error = atmtcp_send_control(vcc,ATMTCP_CTRL_OPEN,&msg,ATM_VF_READY);
+       if (error) return error;
+-      return vcc->reply;
++      return -vcc->sk->sk_err;
+ }
+@@ -257,7 +257,7 @@ static void atmtcp_c_close(struct atm_vc
+               walk = atm_sk(s);
+               if (walk->dev != atmtcp_dev)
+                       continue;
+-              wake_up(&walk->sleep);
++              wake_up(walk->sk->sk_sleep);
+       }
+       read_unlock(&vcc_sklist_lock);
+ }
+--- linux-2.6.0-test1/drivers/base/node.c      2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/base/node.c     2003-07-19 17:04:07.000000000 -0700
+@@ -7,6 +7,7 @@
+ #include <linux/init.h>
+ #include <linux/mm.h>
+ #include <linux/node.h>
++#include <linux/cpumask.h>
+ #include <linux/topology.h>
+ static struct sysdev_class node_class = {
+@@ -17,7 +18,17 @@ static struct sysdev_class node_class = 
+ static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
+ {
+       struct node *node_dev = to_node(dev);
+-        return sprintf(buf,"%lx\n",node_dev->cpumap);
++      cpumask_t tmp = node_dev->cpumap;
++      int k, len = 0;
++
++      for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
++              int j = sprintf(buf, "%04hx", (u16)cpus_coerce(tmp));
++              len += j;
++              buf += j;
++              cpus_shift_right(tmp, tmp, 16);
++      }
++        len += sprintf(buf, "\n");
++      return len;
+ }
+ static SYSDEV_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);
+--- linux-2.6.0-test1/drivers/block/acsi.c     2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/block/acsi.c    2003-07-19 17:03:49.000000000 -0700
+@@ -55,7 +55,6 @@
+ #include <linux/delay.h>
+ #include <linux/mm.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
+ #include <linux/slab.h>
+ #include <linux/interrupt.h>
+ #include <scsi/scsi.h> /* for SCSI_IOCTL_GET_IDLUN */
+--- linux-2.6.0-test1/drivers/block/amiflop.c  2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/block/amiflop.c 2003-07-19 17:03:49.000000000 -0700
+@@ -79,7 +79,6 @@
+ #include <asm/amigahw.h>
+ #include <asm/amigaints.h>
+ #include <asm/irq.h>
+-#include <linux/blk.h>
+ #undef DEBUG /* print _LOTS_ of infos */
+--- linux-2.6.0-test1/drivers/block/as-iosched.c       2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/as-iosched.c      2003-07-19 17:03:49.000000000 -0700
+@@ -12,7 +12,6 @@
+ #include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+@@ -834,10 +833,11 @@ static void as_update_iohist(struct as_i
+                                                       + 2*1024*64);
+               aic->seek_samples += 256;
+-              aic->seek_total += 256*seek_dist;
++              aic->seek_total += (u64)256*seek_dist;
+               if (aic->seek_samples) {
+-                      aic->seek_mean = aic->seek_total + 128;
+-                      sector_div(aic->seek_mean, aic->seek_samples);
++                      u64 total = aic->seek_total + (aic->seek_samples>>1);
++                      do_div(total, aic->seek_samples);
++                      aic->seek_mean = (sector_t)total;
+               }
+               aic->seek_samples = (aic->seek_samples>>1)
+                                       + (aic->seek_samples>>2);
+@@ -1306,6 +1306,15 @@ static void as_add_request(struct as_dat
+       as_update_arq(ad, arq); /* keep state machine up to date */
+ }
++/*
++ * FIXME: HACK for AS requeue problems
++ */
++static void as_requeue_request(request_queue_t *q, struct request *rq)
++{
++      elv_completed_request(q, rq);
++      __elv_add_request(q, rq, 0, 0);
++}
++
+ static void
+ as_insert_request(request_queue_t *q, struct request *rq,
+                       struct list_head *insert_here)
+@@ -1821,6 +1830,7 @@ elevator_t iosched_as = {
+       .elevator_next_req_fn =         as_next_request,
+       .elevator_add_req_fn =          as_insert_request,
+       .elevator_remove_req_fn =       as_remove_request,
++      .elevator_requeue_req_fn =      as_requeue_request,
+       .elevator_queue_empty_fn =      as_queue_empty,
+       .elevator_completed_req_fn =    as_completed_request,
+       .elevator_former_req_fn =       as_former_request,
+--- linux-2.6.0-test1/drivers/block/ataflop.c  2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/block/ataflop.c 2003-07-19 17:03:49.000000000 -0700
+@@ -91,7 +91,6 @@
+ #include <asm/atariints.h>
+ #include <asm/atari_stdma.h>
+ #include <asm/atari_stram.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #define       FD_MAX_UNITS 2
+--- linux-2.6.0-test1/drivers/block/cciss.c    2003-07-10 18:50:30.000000000 -0700
++++ 25/drivers/block/cciss.c   2003-07-19 17:03:49.000000000 -0700
+@@ -41,7 +41,6 @@
+ #include <asm/uaccess.h>
+ #include <asm/io.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/genhd.h>
+ #include <linux/completion.h>
+--- linux-2.6.0-test1/drivers/block/cciss_scsi.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/block/cciss_scsi.c      2003-07-19 17:03:49.000000000 -0700
+@@ -712,7 +712,8 @@ cciss_scsi_detect(int ctlr)
+       sh->hostdata[0] = (unsigned long) hba[ctlr];
+       sh->irq = hba[ctlr]->intr;
+       sh->unique_id = sh->irq;
+-      scsi_add_host(sh, &hba[ctlr]->pdev->dev);
++      scsi_add_host(sh, &hba[ctlr]->pdev->dev); /* XXX handle failure */
++      scsi_scan_host(sh);
+       return 1;
+ }
+--- linux-2.6.0-test1/drivers/block/cpqarray.c 2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/block/cpqarray.c        2003-07-19 17:03:49.000000000 -0700
+@@ -38,7 +38,6 @@
+ #include <linux/init.h>
+ #include <linux/hdreg.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/genhd.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/block/cryptoloop.c       2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/cryptoloop.c      2003-07-19 17:03:49.000000000 -0700
+@@ -26,7 +26,6 @@
+ #include <linux/crypto.h>
+ #include <linux/blkdev.h>
+ #include <linux/loop.h>
+-#include <linux/blk.h>
+ #include <asm/semaphore.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/block/DAC960.c   2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/block/DAC960.c  2003-07-19 17:03:49.000000000 -0700
+@@ -23,7 +23,6 @@
+ #include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/bio.h>
+ #include <linux/completion.h>
+--- linux-2.6.0-test1/drivers/block/deadline-iosched.c 2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/block/deadline-iosched.c        2003-07-19 17:03:49.000000000 -0700
+@@ -10,7 +10,6 @@
+ #include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+--- linux-2.6.0-test1/drivers/block/elevator.c 2003-07-10 18:50:30.000000000 -0700
++++ 25/drivers/block/elevator.c        2003-07-19 17:03:49.000000000 -0700
+@@ -29,7 +29,6 @@
+ #include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+@@ -214,6 +213,18 @@ void elv_merge_requests(request_queue_t 
+               e->elevator_merge_req_fn(q, rq, next);
+ }
++void elv_requeue_request(request_queue_t *q, struct request *rq)
++{
++      /*
++       * if iosched has an explicit requeue hook, then use that. otherwise
++       * just put the request at the front of the queue
++       */
++      if (q->elevator.elevator_requeue_req_fn)
++              q->elevator.elevator_requeue_req_fn(q, rq);
++      else
++              __elv_add_request(q, rq, 0, 0);
++}
++
+ void __elv_add_request(request_queue_t *q, struct request *rq, int at_end,
+                      int plug)
+ {
+@@ -417,6 +428,7 @@ EXPORT_SYMBOL(elevator_noop);
+ EXPORT_SYMBOL(elv_add_request);
+ EXPORT_SYMBOL(__elv_add_request);
++EXPORT_SYMBOL(elv_requeue_request);
+ EXPORT_SYMBOL(elv_next_request);
+ EXPORT_SYMBOL(elv_remove_request);
+ EXPORT_SYMBOL(elv_queue_empty);
+--- linux-2.6.0-test1/drivers/block/floppy98.c 2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/floppy98.c        2003-07-19 17:03:49.000000000 -0700
+@@ -277,7 +277,6 @@ static int irqdma_allocated;
+ #define LOCAL_END_REQUEST
+ #define DEVICE_NAME "floppy"
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/cdrom.h> /* for the compatibility eject ioctl */
+ #include <linux/completion.h>
+--- linux-2.6.0-test1/drivers/block/floppy.c   2003-07-10 18:50:30.000000000 -0700
++++ 25/drivers/block/floppy.c  2003-07-19 17:15:21.000000000 -0700
+@@ -242,7 +242,7 @@ static int irqdma_allocated;
+ #define LOCAL_END_REQUEST
+ #define DEVICE_NAME "floppy"
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <linux/cdrom.h> /* for the compatibility eject ioctl */
+ #include <linux/completion.h>
+@@ -4261,6 +4261,7 @@ int __init floppy_init(void)
+                       floppy_sizes[i] = MAX_DISK_SIZE << 1;
+       blk_init_queue(&floppy_queue, do_fd_request, &floppy_lock);
++      blk_queue_max_hw_segments(&floppy_queue, 1);
+       reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
+       config_types();
+--- linux-2.6.0-test1/drivers/block/genhd.c    2003-07-10 18:50:30.000000000 -0700
++++ 25/drivers/block/genhd.c   2003-07-19 17:06:13.000000000 -0700
+@@ -7,7 +7,7 @@
+ #include <linux/fs.h>
+ #include <linux/genhd.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/spinlock.h>
+ #include <linux/seq_file.h>
+@@ -336,7 +336,7 @@ static struct sysfs_ops disk_sysfs_ops =
+ static ssize_t disk_dev_read(struct gendisk * disk, char *page)
+ {
+       dev_t base = MKDEV(disk->major, disk->first_minor); 
+-      return sprintf(page, "%04x\n", (unsigned)base);
++      return print_dev_t(page, base);
+ }
+ static ssize_t disk_range_read(struct gendisk * disk, char *page)
+ {
+--- linux-2.6.0-test1/drivers/block/ioctl.c    2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/block/ioctl.c   2003-07-19 17:03:49.000000000 -0700
+@@ -1,5 +1,5 @@
+ #include <linux/sched.h>              /* for capable() */
+-#include <linux/blk.h>                        /* for set_device_ro() */
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <linux/backing-dev.h>
+ #include <linux/buffer_head.h>
+@@ -166,13 +166,11 @@ int blkdev_ioctl(struct inode *inode, st
+                       return -EINVAL;
+               if (get_user(n, (int *) arg))
+                       return -EFAULT;
+-              if (n > PAGE_SIZE || n < 512 || (n & (n - 1)))
+-                      return -EINVAL;
+               if (bd_claim(bdev, &holder) < 0)
+                       return -EBUSY;
+-              set_blocksize(bdev, n);
++              ret = set_blocksize(bdev, n);
+               bd_release(bdev);
+-              return 0;
++              return ret;
+       case BLKPG:
+               return blkpg_ioctl(bdev, (struct blkpg_ioctl_arg *) arg);
+       case BLKRRPART:
+--- linux-2.6.0-test1/drivers/block/Kconfig    2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/Kconfig   2003-07-19 17:03:49.000000000 -0700
+@@ -264,6 +264,7 @@ config BLK_DEV_LOOP
+ config BLK_DEV_CRYPTOLOOP
+       tristate "Cryptoloop Support"
++      select CRYPTO
+       depends on BLK_DEV_LOOP
+       ---help---
+         Say Y here if you want to be able to use the ciphers that are 
+@@ -339,7 +340,7 @@ config BLK_DEV_INITRD
+ config LBD
+       bool "Support for Large Block Devices"
+-      depends on X86
++      depends on X86 || MIPS32 || PPC32 || ARCH_S390_31 || SUPERH
+       help
+         Say Y here if you want to attach large (bigger than 2TB) discs to
+         your machine, or if you want to have a raid or loopback device
+--- linux-2.6.0-test1/drivers/block/ll_rw_blk.c        2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/ll_rw_blk.c       2003-07-19 17:06:49.000000000 -0700
+@@ -17,7 +17,7 @@
+ #include <linux/module.h>
+ #include <linux/backing-dev.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/highmem.h>
+ #include <linux/mm.h>
+ #include <linux/kernel_stat.h>
+@@ -371,6 +371,20 @@ void blk_queue_hardsect_size(request_que
+ }
+ /**
++ * blk_queue_stack_limits - inherit underlying queue limits for stacked drivers
++ * @t:        the stacking driver (top)
++ * @b:  the underlying device (bottom)
++ **/
++void blk_queue_stack_limits(request_queue_t *t, request_queue_t *b)
++{
++      t->max_sectors = min(t->max_sectors,b->max_sectors);
++      t->max_phys_segments = min(t->max_phys_segments,b->max_phys_segments);
++      t->max_hw_segments = min(t->max_hw_segments,b->max_hw_segments);
++      t->max_segment_size = min(t->max_segment_size,b->max_segment_size);
++      t->hardsect_size = max(t->hardsect_size,b->hardsect_size);
++}
++
++/**
+  * blk_queue_segment_boundary - set boundary rules for segment merging
+  * @q:  the request queue for the device
+  * @mask:  the memory boundary mask
+@@ -1494,6 +1508,23 @@ struct request *blk_get_request(request_
+       return rq;
+ }
++/**
++ * blk_requeue_request - put a request back on queue
++ * @q:                request queue where request should be inserted
++ * @rq:               request to be inserted
++ *
++ * Description:
++ *    Drivers often keep queueing requests until the hardware cannot accept
++ *    more, when that condition happens we need to put the request back
++ *    on the queue. Must be called with queue lock held.
++ */
++void blk_requeue_request(request_queue_t *q, struct request *rq)
++{
++      if (blk_rq_tagged(rq))
++              blk_queue_end_tag(q, rq);
++
++      elv_requeue_request(q, rq);
++}
+ /**
+  * blk_insert_request - insert a special request in to a request queue
+@@ -1659,25 +1690,50 @@ void blk_put_request(struct request *req
+ }
+ /**
+- * blk_congestion_wait - wait for a queue to become uncongested
++ * blk_congestion_wait_wq - wait for a queue to become uncongested,
+  * @rw: READ or WRITE
+  * @timeout: timeout in jiffies
++ * @wait : wait queue entry to use for waiting or async notification
++ * (NULL defaults to synchronous behaviour)
+  *
+  * Waits for up to @timeout jiffies for a queue (any queue) to exit congestion.
+  * If no queues are congested then just wait for the next request to be
+  * returned.
++ *
++ * If the wait queue parameter specifies an async i/o callback,
++ * then instead of blocking, just register the callback on the wait
++ * queue for async notification when the queue gets uncongested.
+  */
+-void blk_congestion_wait(int rw, long timeout)
++int blk_congestion_wait_wq(int rw, long timeout, wait_queue_t *wait)
+ {
+-      DEFINE_WAIT(wait);
+       wait_queue_head_t *wqh = &congestion_wqh[rw];
++      DEFINE_WAIT(local_wait);
++
++      if (!wait)
++              wait = &local_wait;
+       blk_run_queues();
+-      prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
++      prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
++      if (!is_sync_wait(wait)) {
++              /*
++               * if we've queued an async wait queue
++               * callback do not block; just tell the
++               * caller to return and retry later when
++               * the callback is notified
++               */
++              return -EIOCBRETRY;
++      }
+       io_schedule_timeout(timeout);
+-      finish_wait(wqh, &wait);
++      finish_wait(wqh, wait);
++      return 0;
++}
++
++void blk_congestion_wait(int rw, long timeout)
++{
++      blk_congestion_wait_wq(rw, timeout, NULL);
+ }
++
+ /*
+  * Has to be called with the request spinlock acquired
+  */
+@@ -2720,6 +2776,7 @@ EXPORT_SYMBOL(blk_queue_max_phys_segment
+ EXPORT_SYMBOL(blk_queue_max_hw_segments);
+ EXPORT_SYMBOL(blk_queue_max_segment_size);
+ EXPORT_SYMBOL(blk_queue_hardsect_size);
++EXPORT_SYMBOL(blk_queue_stack_limits);
+ EXPORT_SYMBOL(blk_queue_segment_boundary);
+ EXPORT_SYMBOL(blk_queue_dma_alignment);
+ EXPORT_SYMBOL(blk_rq_map_sg);
+@@ -2730,6 +2787,7 @@ EXPORT_SYMBOL(blk_hw_contig_segment);
+ EXPORT_SYMBOL(blk_get_request);
+ EXPORT_SYMBOL(blk_put_request);
+ EXPORT_SYMBOL(blk_insert_request);
++EXPORT_SYMBOL(blk_requeue_request);
+ EXPORT_SYMBOL(blk_queue_prep_rq);
+ EXPORT_SYMBOL(blk_queue_merge_bvec);
+--- linux-2.6.0-test1/drivers/block/nbd.c      2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/block/nbd.c     2003-07-19 17:03:49.000000000 -0700
+@@ -44,7 +44,6 @@
+ #include <linux/major.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+@@ -55,8 +54,6 @@
+ #include <linux/errno.h>
+ #include <linux/file.h>
+ #include <linux/ioctl.h>
+-#include <linux/blkdev.h>
+-#include <linux/blk.h>
+ #include <net/sock.h>
+ #include <linux/devfs_fs_kernel.h>
+@@ -261,7 +258,8 @@ void nbd_send_req(struct nbd_device *lo,
+       dprintk(DBG_TX, "%s: request %p: sending control (%s@%llu,%luB)\n",
+                       lo->disk->disk_name, req,
+                       nbdcmd_to_ascii(nbd_cmd(req)),
+-                      req->sector << 9, req->nr_sectors << 9);
++                      (unsigned long long)req->sector << 9,
++                      req->nr_sectors << 9);
+       result = sock_xmit(sock, 1, &request, sizeof(request),
+                       (nbd_cmd(req) == NBD_CMD_WRITE)? MSG_MORE: 0);
+       if (result <= 0) {
+--- linux-2.6.0-test1/drivers/block/paride/pcd.c       2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/block/paride/pcd.c      2003-07-19 17:03:49.000000000 -0700
+@@ -137,7 +137,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV,
+ #include <linux/delay.h>
+ #include <linux/cdrom.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/uaccess.h>
+ static spinlock_t pcd_lock;
+--- linux-2.6.0-test1/drivers/block/paride/pd.c        2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/block/paride/pd.c       2003-07-19 17:03:49.000000000 -0700
+@@ -150,7 +150,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_GEO,
+ #include <linux/delay.h>
+ #include <linux/hdreg.h>
+ #include <linux/cdrom.h>      /* for the eject ioctl */
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/block/paride/pf.c        2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/block/paride/pf.c       2003-07-19 17:03:49.000000000 -0700
+@@ -150,7 +150,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV,
+ #include <linux/hdreg.h>
+ #include <linux/cdrom.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <asm/uaccess.h>
+@@ -222,9 +222,6 @@ MODULE_PARM(drive3, "1-7i");
+ #define ATAPI_READ_10         0x28
+ #define ATAPI_WRITE_10                0x2a
+-#ifdef MODULE
+-void cleanup_module(void);
+-#endif
+ static int pf_open(struct inode *inode, struct file *file);
+ static void do_pf_request(request_queue_t * q);
+ static int pf_ioctl(struct inode *inode, struct file *file,
+--- linux-2.6.0-test1/drivers/block/ps2esdi.c  2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/block/ps2esdi.c 2003-07-19 17:03:49.000000000 -0700
+@@ -38,7 +38,7 @@
+ #include <linux/kernel.h>
+ #include <linux/genhd.h>
+ #include <linux/ps2esdi.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/mca.h>
+ #include <linux/init.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/block/swim3.c    2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/block/swim3.c   2003-07-19 17:03:49.000000000 -0700
+@@ -24,7 +24,6 @@
+ #include <linux/delay.h>
+ #include <linux/fd.h>
+ #include <linux/ioctl.h>
+-#include <linux/blk.h>
+ #include <linux/devfs_fs_kernel.h>
+ #include <asm/io.h>
+ #include <asm/dbdma.h>
+--- linux-2.6.0-test1/drivers/block/swim_iop.c 2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/block/swim_iop.c        2003-07-19 17:03:49.000000000 -0700
+@@ -30,7 +30,6 @@
+ #include <linux/timer.h>
+ #include <linux/delay.h>
+ #include <linux/fd.h>
+-#include <linux/blk.h>
+ #include <linux/ioctl.h>
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/block/umem.c     2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/block/umem.c    2003-07-19 17:03:49.000000000 -0700
+@@ -99,7 +99,7 @@ static int pci_cmds;
+ static int major_nr;
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ struct cardinfo {
+--- linux-2.6.0-test1/drivers/block/xd.c       2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/block/xd.c      2003-07-19 17:03:49.000000000 -0700
+@@ -46,7 +46,7 @@
+ #include <linux/init.h>
+ #include <linux/wait.h>
+ #include <linux/devfs_fs_kernel.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/block/z2ram.c    2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/block/z2ram.c   2003-07-19 17:03:49.000000000 -0700
+@@ -30,7 +30,6 @@
+ #include <linux/major.h>
+ #include <linux/slab.h>
+ #include <linux/vmalloc.h>
+-#include <linux/blk.h>
+ #include <linux/init.h>
+ #include <linux/module.h>
+--- linux-2.6.0-test1/drivers/cdrom/aztcd.c    2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/cdrom/aztcd.c   2003-07-19 17:03:49.000000000 -0700
+@@ -166,7 +166,7 @@
+ */
+ #include <linux/version.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "aztcd.h"
+ #include <linux/module.h>
+--- linux-2.6.0-test1/drivers/cdrom/cdrom.c    2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/cdrom/cdrom.c   2003-07-19 17:03:49.000000000 -0700
+@@ -268,6 +268,7 @@
+ #include <linux/init.h>
+ #include <linux/fcntl.h>
+ #include <linux/blkdev.h>
++#include <linux/times.h>
+ #include <asm/uaccess.h>
+@@ -2171,6 +2172,7 @@ static int mmc_ioctl(struct cdrom_device
+                       return -ENOSYS;
+               cdinfo(CD_DO_IOCTL, "entering CDROM_SEND_PACKET\n"); 
+               IOCTL_IN(arg, struct cdrom_generic_command, cgc);
++              cgc.timeout = clock_t_to_jiffies(cgc.timeout);
+               return cdrom_do_cmd(cdi, &cgc);
+               }
+       case CDROM_NEXT_WRITABLE: {
+--- linux-2.6.0-test1/drivers/cdrom/cdu31a.c   2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/cdrom/cdu31a.c  2003-07-19 17:03:49.000000000 -0700
+@@ -177,7 +177,7 @@
+ #include "cdu31a.h"
+ #define MAJOR_NR CDU31A_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #define CDU31A_READAHEAD 4    /* 128 sector, 64kB, 32 reads read-ahead */
+ #define CDU31A_MAX_CONSECUTIVE_ATTENTIONS 10
+--- linux-2.6.0-test1/drivers/cdrom/cm206.c    2003-06-14 12:18:33.000000000 -0700
++++ 25/drivers/cdrom/cm206.c   2003-07-19 17:03:49.000000000 -0700
+@@ -199,7 +199,7 @@ History:
+ #define MAJOR_NR CM206_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #undef DEBUG
+ #define STATISTICS            /* record times and frequencies of events */
+--- linux-2.6.0-test1/drivers/cdrom/gscd.c     2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/cdrom/gscd.c    2003-07-19 17:03:49.000000000 -0700
+@@ -69,7 +69,7 @@
+ #include <asm/uaccess.h>
+ #define MAJOR_NR GOLDSTAR_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #define gscd_port gscd                /* for compatible parameter passing with "insmod" */
+ #include "gscd.h"
+--- linux-2.6.0-test1/drivers/cdrom/mcd.c      2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/cdrom/mcd.c     2003-07-19 17:03:49.000000000 -0700
+@@ -101,7 +101,7 @@
+ #include <asm/io.h>
+ #include <asm/current.h>
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #define mcd_port mcd          /* for compatible parameter passing with "insmod" */
+ #include "mcd.h"
+--- linux-2.6.0-test1/drivers/cdrom/mcdx.c     2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/cdrom/mcdx.c    2003-07-19 17:03:49.000000000 -0700
+@@ -74,7 +74,7 @@ static const char *mcdx_c_version
+ #include <linux/major.h>
+ #define MAJOR_NR MITSUMI_X_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/devfs_fs_kernel.h>
+ /* for compatible parameter passing with "insmod" */
+--- linux-2.6.0-test1/drivers/cdrom/optcd.c    2003-06-14 12:18:04.000000000 -0700
++++ 25/drivers/cdrom/optcd.c   2003-07-19 17:03:49.000000000 -0700
+@@ -73,7 +73,7 @@
+ #include <linux/init.h>
+ #include <asm/io.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/cdrom.h>
+ #include "optcd.h"
+--- linux-2.6.0-test1/drivers/cdrom/sbpcd.c    2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/cdrom/sbpcd.c   2003-07-19 17:03:49.000000000 -0700
+@@ -387,7 +387,7 @@
+ #include "sbpcd.h"
+ #define MAJOR_NR MATSUSHITA_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ /*==========================================================================*/
+ #if SBPCD_DIS_IRQ
+--- linux-2.6.0-test1/drivers/cdrom/sjcd.c     2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/cdrom/sjcd.c    2003-07-19 17:03:49.000000000 -0700
+@@ -74,7 +74,7 @@
+ #include <asm/system.h>
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "sjcd.h"
+ static int sjcd_present = 0;
+--- linux-2.6.0-test1/drivers/cdrom/sonycd535.c        2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/cdrom/sonycd535.c       2003-07-19 17:03:49.000000000 -0700
+@@ -134,7 +134,7 @@
+ #include <linux/cdrom.h>
+ #define MAJOR_NR CDU535_CDROM_MAJOR
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #define sony535_cd_base_io sonycd535 /* for compatible parameter passing with "insmod" */
+ #include "sonycd535.h"
+--- linux-2.6.0-test1/drivers/char/agp/i460-agp.c      2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/char/agp/i460-agp.c     2003-07-19 17:03:49.000000000 -0700
+@@ -608,7 +608,7 @@ static struct pci_driver agp_intel_i460_
+       .name           = "agpgart-intel-i460",
+       .id_table       = agp_intel_i460_pci_table,
+       .probe          = agp_intel_i460_probe,
+-      .remove         = agp_intel_i460_remove,
++      .remove         = __devexit_p(agp_intel_i460_remove),
+ };
+ static int __init agp_intel_i460_init(void)
+--- linux-2.6.0-test1/drivers/char/busmouse.c  2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/char/busmouse.c 2003-07-19 17:03:49.000000000 -0700
+@@ -357,25 +357,23 @@ int register_busmouse(struct busmouse *o
+ {
+       unsigned int msedev = MINOR_TO_MOUSE(ops->minor);
+       struct busmouse_data *mse;
+-      int ret;
++      int ret = -EINVAL;
+       if (msedev >= NR_MICE) {
+               printk(KERN_ERR "busmouse: trying to allocate mouse on minor %d\n",
+                      ops->minor);
+-              return -EINVAL;
++              goto out;
+       }
++      ret = -ENOMEM;
+       mse = kmalloc(sizeof(*mse), GFP_KERNEL);
+       if (!mse)
+-              return -ENOMEM;
++              goto out;
+       down(&mouse_sem);
++      ret = -EBUSY;
+       if (busmouse_data[msedev])
+-      {
+-              up(&mouse_sem);
+-              kfree(mse);
+-              return -EBUSY;
+-      }
++              goto freemem;
+       memset(mse, 0, sizeof(*mse));
+@@ -386,14 +384,22 @@ int register_busmouse(struct busmouse *o
+       mse->lock = (spinlock_t)SPIN_LOCK_UNLOCKED;
+       init_waitqueue_head(&mse->wait);
+-      busmouse_data[msedev] = mse;
+       ret = misc_register(&mse->miscdev);
+-      if (!ret)
+-              ret = msedev;
++
++      if (ret < 0) 
++              goto freemem;
++
++      busmouse_data[msedev] = mse;
++      ret = msedev;
++out:
+       up(&mouse_sem);
+-      
+       return ret;
++
++
++freemem:
++      kfree(mse);
++      goto out;
+ }
+ /**
+--- linux-2.6.0-test1/drivers/char/drm/drm_memory.h    2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/char/drm/drm_memory.h   2003-07-19 17:07:16.000000000 -0700
+@@ -128,7 +128,7 @@ static inline unsigned long
+ drm_follow_page (void *vaddr)
+ {
+       pgd_t *pgd = pgd_offset_k((unsigned long) vaddr);
+-      pmd_t *pmd = pmd_offset(pgd, (unsigned long) vaddr);
++      pmd_t *pmd = pmd_offset_kernel(pgd, (unsigned long)vaddr);
+       pte_t *ptep = pte_offset_kernel(pmd, (unsigned long) vaddr);
+       return pte_pfn(*ptep) << PAGE_SHIFT;
+ }
+--- linux-2.6.0-test1/drivers/char/ftape/lowlevel/fdc-io.c     2003-06-14 12:18:04.000000000 -0700
++++ 25/drivers/char/ftape/lowlevel/fdc-io.c    2003-07-19 17:03:49.000000000 -0700
+@@ -66,6 +66,7 @@ int ft_mach2             = CONFIG_FT_MAC
+ /*      Local vars.
+  */
++static spinlock_t fdc_io_lock; 
+ static unsigned int fdc_calibr_count;
+ static unsigned int fdc_calibr_time;
+ static int fdc_status;
+@@ -89,14 +90,13 @@ void fdc_catch_stray_interrupts(int coun
+ {
+       unsigned long flags;
+-      save_flags(flags);
+-      cli();
++      spin_lock_irqsave(&fdc_io_lock, flags);
+       if (count == 0) {
+               ft_expected_stray_interrupts = 0;
+       } else {
+               ft_expected_stray_interrupts += count;
+       }
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&fdc_io_lock, flags);
+ }
+ /*  Wait during a timeout period for a given FDC status.
+@@ -194,8 +194,7 @@ int fdc_command(const __u8 * cmd_data, i
+       TRACE_FUN(ft_t_any);
+       fdc_usec_wait(FT_RQM_DELAY);    /* wait for valid RQM status */
+-      save_flags(flags);
+-      cli();
++      spin_lock_irqsave(&fdc_io_lock, flags);
+       if (!in_interrupt())
+               /* Yes, I know, too much comments inside this function
+                * ...
+@@ -242,12 +241,11 @@ int fdc_command(const __u8 * cmd_data, i
+                       }
+                       fdc_usec_wait(FT_RQM_DELAY);    /* wait for valid RQM status */
+-                      save_flags(flags);
+-                      cli();
++                      spin_lock_irqsave(&fdc_io_lock, flags);
+               }
+       fdc_status = inb(fdc.msr);
+       if ((fdc_status & FDC_DATA_READY_MASK) != FDC_DATA_IN_READY) {
+-              restore_flags(flags);
++              spin_unlock_irqrestore(&fdc_io_lock, flags);
+               TRACE_ABORT(-EBUSY, ft_t_err, "fdc not ready");
+       } 
+       fdc_mode = *cmd_data;   /* used by isr */
+@@ -289,7 +287,7 @@ int fdc_command(const __u8 * cmd_data, i
+               last_time = ftape_timestamp();
+       }
+ #endif
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&fdc_io_lock, flags);
+       TRACE_EXIT result;
+ }
+@@ -305,15 +303,14 @@ int fdc_result(__u8 * res_data, int res_
+       int retry = 0;
+       TRACE_FUN(ft_t_any);
+-      save_flags(flags);
+-      cli();
++      spin_lock_irqsave(&fdc_io_lock, flags);
+       fdc_status = inb(fdc.msr);
+       if ((fdc_status & FDC_DATA_READY_MASK) != FDC_DATA_OUT_READY) {
+               TRACE(ft_t_err, "fdc not ready");
+               result = -EBUSY;
+       } else while (count) {
+               if (!(fdc_status & FDC_BUSY)) {
+-                      restore_flags(flags);
++                      spin_unlock_irqrestore(&fdc_io_lock, flags);
+                       TRACE_ABORT(-EIO, ft_t_err, "premature end of result phase");
+               }
+               result = fdc_read(res_data);
+@@ -336,7 +333,7 @@ int fdc_result(__u8 * res_data, int res_
+                       ++res_data;
+               }
+       }
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&fdc_io_lock, flags);
+       fdc_usec_wait(FT_RQM_DELAY);    /* allow FDC to negate BSY */
+       TRACE_EXIT result;
+ }
+@@ -609,8 +606,7 @@ void fdc_reset(void)
+       unsigned long flags;
+       TRACE_FUN(ft_t_any);
+-      save_flags(flags);
+-      cli();
++      spin_lock_irqsave(&fdc_io_lock, flags);
+       fdc_dor_reset(1); /* keep unit selected */
+@@ -629,7 +625,7 @@ void fdc_reset(void)
+        */
+       fdc_update_dsr();               /* restore data rate and precomp */
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&fdc_io_lock, flags);
+         /*
+          *    Wait for first polling cycle to complete
+@@ -928,8 +924,7 @@ int fdc_setup_formatting(buffer_struct *
+        */
+         TRACE(ft_t_fdc_dma,
+             "phys. addr. = %lx", virt_to_bus((void*) buff->ptr));
+-      save_flags(flags);
+-      cli();                  /* could be called from ISR ! */
++      spin_lock_irqsave(&fdc_io_lock, flags);
+       fdc_setup_dma(DMA_MODE_WRITE, buff->ptr, FT_SECTORS_PER_SEGMENT * 4);
+       /* Issue FDC command to start reading/writing.
+        */
+@@ -937,7 +932,7 @@ int fdc_setup_formatting(buffer_struct *
+       out[4] = buff->gap3;
+       TRACE_CATCH(fdc_setup_error = fdc_command(out, sizeof(out)),
+                   restore_flags(flags); fdc_mode = fdc_idle);
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&fdc_io_lock, flags);
+       TRACE_EXIT 0;
+ }
+@@ -977,11 +972,10 @@ int fdc_setup_read_write(buffer_struct *
+               break;
+       default:
+               TRACE_ABORT(-EIO,
+-                          ft_t_bug, "bug: illegal operation parameter");
++                          ft_t_bug, "bug: invalid operation parameter");
+       }
+       TRACE(ft_t_fdc_dma, "phys. addr. = %lx",virt_to_bus((void*)buff->ptr));
+-      save_flags(flags);
+-      cli();                  /* could be called from ISR ! */
++      spin_lock_irqsave(&fdc_io_lock, flags);
+       if (operation != FDC_VERIFY) {
+               fdc_setup_dma(dma_mode, buff->ptr,
+                             FT_SECTOR_SIZE * buff->sector_count);
+@@ -999,7 +993,7 @@ int fdc_setup_read_write(buffer_struct *
+       out[8] = 0xff;          /* No limit to transfer size. */
+       TRACE(ft_t_fdc_dma, "C: 0x%02x, H: 0x%02x, R: 0x%02x, cnt: 0x%02x",
+               out[2], out[3], out[4], out[6] - out[4] + 1);
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&fdc_io_lock, flags);
+       TRACE_CATCH(fdc_setup_error = fdc_command(out, 9),fdc_mode = fdc_idle);
+       TRACE_EXIT 0;
+ }
+--- linux-2.6.0-test1/drivers/char/ftape/lowlevel/ftape-calibr.c       2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/char/ftape/lowlevel/ftape-calibr.c      2003-07-19 17:03:49.000000000 -0700
+@@ -49,6 +49,8 @@
+ static unsigned long ps_per_cycle = 0;
+ #endif
++static spinlock_t calibr_lock;
++
+ /*
+  * Note: On Intel PCs, the clock ticks at 100 Hz (HZ==100) which is
+  * too slow for certain timeouts (and that clock doesn't even tick
+@@ -75,13 +77,12 @@ unsigned int ftape_timestamp(void)
+       __u16 lo;
+       __u16 hi;
+-      save_flags(flags);
+-      cli();
++      spin_lock_irqsave(&calibr_lock, flags);
+       outb_p(0x00, 0x43);     /* latch the count ASAP */
+       lo = inb_p(0x40);       /* read the latched count */
+       lo |= inb(0x40) << 8;
+       hi = jiffies;
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&calibr_lock, flags);
+       return ((hi + 1) * (unsigned int) LATCH) - lo;  /* downcounter ! */
+ #endif
+ }
+@@ -94,12 +95,11 @@ static unsigned int short_ftape_timestam
+       unsigned int count;
+       unsigned long flags;
+  
+-      save_flags(flags);
+-      cli();
++      spin_lock_irqsave(&calibr_lock, flags);
+       outb_p(0x00, 0x43);     /* latch the count ASAP */
+       count = inb_p(0x40);    /* read the latched count */
+       count |= inb(0x40) << 8;
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&calibr_lock, flags);
+       return (LATCH - count); /* normal: downcounter */
+ #endif
+ }
+@@ -150,14 +150,13 @@ static void time_inb(void)
+       int status;
+       TRACE_FUN(ft_t_any);
+-      save_flags(flags);
+-      cli();
++      spin_lock_irqsave(&calibr_lock, flags);
+       t0 = short_ftape_timestamp();
+       for (i = 0; i < 1000; ++i) {
+               status = inb(fdc.msr);
+       }
+       t1 = short_ftape_timestamp();
+-      restore_flags(flags);
++      spin_unlock_irqrestore(&calibr_lock, flags);
+       TRACE(ft_t_info, "inb() duration: %d nsec", ftape_timediff(t0, t1));
+       TRACE_EXIT;
+ }
+@@ -241,8 +240,7 @@ void ftape_calibrate(char *name,
+               *calibr_count =
+               *calibr_time = count;   /* set TC to 1 */
+-              save_flags(flags);
+-              cli();
++              spin_lock_irqsave(&calibr_lock, flags);
+               fun(0);         /* dummy, get code into cache */
+               t0 = short_ftape_timestamp();
+               fun(0);         /* overhead + one test */
+@@ -252,7 +250,7 @@ void ftape_calibrate(char *name,
+               fun(count);             /* overhead + count tests */
+               t1 = short_ftape_timestamp();
+               multiple = diff(t0, t1);
+-              restore_flags(flags);
++              spin_unlock_irqrestore(&calibr_lock, flags);
+               time = ftape_timediff(0, multiple - once);
+               tc = (1000 * time) / (count - 1);
+               TRACE(ft_t_any, "once:%3d us,%6d times:%6d us, TC:%5d ns",
+--- linux-2.6.0-test1/drivers/char/ftape/lowlevel/ftape-format.c       2003-06-14 12:18:21.000000000 -0700
++++ 25/drivers/char/ftape/lowlevel/ftape-format.c      2003-07-19 17:03:49.000000000 -0700
+@@ -44,6 +44,8 @@
+ #define FT_FMT_SEGS_PER_BUF (FT_BUFF_SIZE/(4*FT_SECTORS_PER_SEGMENT))
+ #endif
++static spinlock_t ftape_format_lock;
++
+ /*
+  *  first segment of the new buffer
+  */
+@@ -129,9 +131,9 @@ int ftape_format_track(const unsigned in
+       head->status = formatting;
+       TRACE_CATCH(ftape_seek_head_to_track(track),);
+       TRACE_CATCH(ftape_command(QIC_LOGICAL_FORWARD),);
+-      save_flags(flags); cli();
++      spin_lock_irqsave(&ftape_format_lock, flags);
+       TRACE_CATCH(fdc_setup_formatting(head), restore_flags(flags));
+-      restore_flags(flags);   
++      spin_unlock_irqrestore(&ftape_format_lock, flags);
+       TRACE_EXIT 0;
+ }
+--- linux-2.6.0-test1/drivers/char/ftape/zftape/zftape-init.c  2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/char/ftape/zftape/zftape-init.c 2003-07-19 17:03:49.000000000 -0700
+@@ -118,7 +118,7 @@ static int zft_open(struct inode *ino, s
+            > 
+           FTAPE_SEL_D) {
+               clear_bit(0,&busy_flag);
+-              TRACE_ABORT(-ENXIO, ft_t_err, "failed: illegal unit nr");
++              TRACE_ABORT(-ENXIO, ft_t_err, "failed: invalid unit nr");
+       }
+       orig_sigmask = current->blocked;
+       sigfillset(&current->blocked);
+--- linux-2.6.0-test1/drivers/char/ip2.c       2003-06-14 12:18:20.000000000 -0700
++++ 25/drivers/char/ip2.c      2003-07-19 17:03:49.000000000 -0700
+@@ -38,16 +38,14 @@ static int irq[IP2_MAX_BOARDS] = { -1, -
+ static int poll_only = 0;
+-#     if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
+-              MODULE_AUTHOR("Doug McNash");
+-              MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
+-              MODULE_PARM(irq,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i");
+-              MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards");
+-              MODULE_PARM(io,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i");
+-              MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards");
+-              MODULE_PARM(poll_only,"1i");
+-              MODULE_PARM_DESC(poll_only,"Do not use card interrupts");
+-#     endif   /* LINUX_VERSION */
++MODULE_AUTHOR("Doug McNash");
++MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
++MODULE_PARM(irq,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i");
++MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards");
++MODULE_PARM(io,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i");
++MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards");
++MODULE_PARM(poll_only,"1i");
++MODULE_PARM_DESC(poll_only,"Do not use card interrupts");
+ //======================================================================
+--- linux-2.6.0-test1/drivers/char/ip2/i2lib.c 2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/char/ip2/i2lib.c        2003-07-19 17:03:49.000000000 -0700
+@@ -1089,7 +1089,7 @@ i2Output(i2ChanStrPtr pCh, const char *p
+                       // Move the data
+                       if ( user ) {
+-                              COPY_FROM_USER(rc, (char*)(DATA_OF(pInsert)), pSource,
++                              rc = copy_from_user((char*)(DATA_OF(pInsert)), pSource,
+                                               amountToMove );
+                       } else {
+                               memcpy( (char*)(DATA_OF(pInsert)), pSource, amountToMove );
+--- linux-2.6.0-test1/drivers/char/ip2/i2os.h  2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/char/ip2/i2os.h 2003-07-19 17:03:49.000000000 -0700
+@@ -19,8 +19,6 @@
+ #ifndef I2OS_H    /* To prevent multiple includes */
+ #define I2OS_H 1
+-#define VERSION(ver,rel,seq) (((ver)<<16) | ((rel)<<8) | (seq))
+-
+ //-------------------------------------------------
+ // Required Includes
+ //-------------------------------------------------
+@@ -46,22 +44,6 @@
+ // Interrupt control
+ //--------------------------------------------
+-#if LINUX_VERSION_CODE < 0x00020100
+-typedef int spinlock_t;
+-#define spin_lock_init() 
+-#define spin_lock(a)
+-#define spin_unlock(a)
+-#define spin_lock_irqsave(a,b)                        {save_flags((b));cli();}
+-#define spin_unlock_irqrestore(a,b)           {restore_flags((b));}
+-#define write_lock_irqsave(a,b)                       spin_lock_irqsave(a,b)
+-#define write_unlock_irqrestore(a,b)  spin_unlock_irqrestore(a,b)
+-#define read_lock_irqsave(a,b)                        spin_lock_irqsave(a,b)
+-#define read_unlock_irqrestore(a,b)           spin_unlock_irqrestore(a,b)
+-#endif
+-
+-//#define SAVE_AND_DISABLE_INTS(a,b)  spin_lock_irqsave(a,b)
+-//#define RESTORE_INTS(a,b)           spin_unlock_irqrestore(a,b)
+-
+ #define LOCK_INIT(a)  rwlock_init(a)
+ #define SAVE_AND_DISABLE_INTS(a,b) { \
+--- linux-2.6.0-test1/drivers/char/ip2main.c   2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/char/ip2main.c  2003-07-19 17:03:49.000000000 -0700
+@@ -83,7 +83,6 @@
+ /* Includes */
+ /************/
+ #include <linux/config.h>
+-// Uncomment the following if you want it compiled with modversions
+ #include <linux/version.h>
+@@ -120,82 +119,11 @@
+ #include <asm/irq.h>
+ #include <asm/bitops.h>
+-#ifndef KERNEL_VERSION
+-#define KERNEL_VERSION(ver,rel,seq) (((ver)<<16) | ((rel)<<8) | (seq))
+-#endif
+-
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
+-#     include <linux/vmalloc.h>
+-#     include <linux/init.h>
+-#     include <asm/serial.h>
+-#else
+-#     include <linux/bios32.h>
+-#endif
++#include <linux/vmalloc.h>
++#include <linux/init.h>
++#include <asm/serial.h>
+-// These VERSION switches maybe inexact because I simply don't know
+-// when the various features appeared in the 2.1.XX kernels.
+-// They are good enough for 2.0 vs 2.2 and if you are fooling with
+-// the 2.1.XX stuff then it would be trivial for you to fix.
+-// Most of these macros were stolen from some other drivers
+-// so blame them.
+-
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,4)
+-#     define GET_USER(error,value,addr) error = get_user(value,addr)
+-#     define COPY_FROM_USER(error,dest,src,size) error = copy_from_user(dest,src,size) ? -EFAULT : 0
+-#     define PUT_USER(error,value,addr) error = put_user(value,addr)
+-#     define COPY_TO_USER(error,dest,src,size) error = copy_to_user(dest,src,size) ? -EFAULT : 0
+-
+-#     if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,5)
+-#             include <asm/uaccess.h>
+-#             define          pcibios_strerror(status)        \
+-                                      printk( KERN_ERR "IP2: PCI error 0x%x \n", status );
+-#     endif
+-
+-#else  /* 2.0.x and 2.1.x before 2.1.4 */
+-
+-#     define          proc_register_dynamic(a,b) proc_register(a,b) 
+-
+-#     define GET_USER(error,value,addr)                                         \
+-      do {                                                                      \
+-              error = verify_area (VERIFY_READ, (void *) addr, sizeof (value)); \
+-              if (error == 0)                                                   \
+-                      value = get_user(addr);                                   \
+-      } while (0)
+-
+-#     define COPY_FROM_USER(error,dest,src,size)                                \
+-      do {                                                                      \
+-              error = verify_area (VERIFY_READ, (void *) src, size);            \
+-              if (error == 0)                                                   \
+-                      memcpy_fromfs (dest, src, size);                          \
+-      } while (0)
+-
+-#     define PUT_USER(error,value,addr)                                          \
+-      do {                                                                       \
+-              error = verify_area (VERIFY_WRITE, (void *) addr, sizeof (value)); \
+-              if (error == 0)                                                    \
+-                      put_user (value, addr);                                    \
+-      } while (0)
+-
+-#     define COPY_TO_USER(error,dest,src,size)                                  \
+-      do {                                                                      \
+-              error = verify_area (VERIFY_WRITE, (void *) dest, size);                  \
+-              if (error == 0)                                                   \
+-                      memcpy_tofs (dest, src, size);                            \
+-      } while (0)
+-
+-#endif
+-
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+-#define __init
+-#define __initfunc(a) a
+-#define __initdata
+-#define ioremap(a,b) vremap((a),(b))
+-#define iounmap(a) vfree((a))
+-#define SERIAL_TYPE_NORMAL    1
+-#define schedule_timeout(a){current->timeout = jiffies + (a); schedule();}
+-#define signal_pending(a) ((a)->signal & ~(a)->blocked)
+-#define in_interrupt()        intr_count
+-#endif
++#include <asm/uaccess.h>
+ #include "./ip2/ip2types.h"
+ #include "./ip2/ip2trace.h"
+@@ -276,11 +204,7 @@ static int set_modem_info(i2ChanStrPtr, 
+ static int get_serial_info(i2ChanStrPtr, struct serial_struct *);
+ static int set_serial_info(i2ChanStrPtr, struct serial_struct *);
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+-static int     ip2_ipl_read(struct inode *, char *, size_t , loff_t *);
+-#else
+-static ssize_t ip2_ipl_read(struct file *, char *, size_t, loff_t *) ;
+-#endif
++static ssize_t ip2_ipl_read(struct file *, char *, size_t, loff_t *);
+ static ssize_t ip2_ipl_write(struct file *, const char *, size_t, loff_t *);
+ static int ip2_ipl_ioctl(struct inode *, struct file *, UINT, ULONG);
+ static int ip2_ipl_open(struct inode *, struct file *);
+@@ -354,9 +278,6 @@ static int tracewrap;
+ #define DBG_CNT(s)
+ #endif
+-#define MIN(a,b)      ( ( (a) < (b) ) ? (a) : (b) )
+-#define MAX(a,b)      ( ( (a) > (b) ) ? (a) : (b) )
+-
+ /********/
+ /* Code */
+ /********/
+@@ -366,12 +287,9 @@ static int tracewrap;
+ #include "./ip2/i2lib.c"      /* High level interface services */
+ /* Configuration area for modprobe */
+-#ifdef MODULE
+-#     if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
+-              MODULE_AUTHOR("Doug McNash");
+-              MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
+-#     endif   /* LINUX_VERSION */
+-#endif        /* MODULE */
++
++MODULE_AUTHOR("Doug McNash");
++MODULE_DESCRIPTION("Computone IntelliPort Plus Driver");
+ static int poll_only = 0;
+@@ -660,53 +578,6 @@ ip2_loadmain(int *iop, int *irqp, unsign
+                       break;
+               case PCI:
+ #ifdef CONFIG_PCI
+-#if (LINUX_VERSION_CODE < 0x020163) /* 2.1.99 */
+-                      if (pcibios_present()) {
+-                              unsigned char pci_bus, pci_devfn;
+-                              int Pci_index = 0;
+-                              status = pcibios_find_device(PCI_VENDOR_ID_COMPUTONE,
+-                                                        PCI_DEVICE_ID_COMPUTONE_IP2EX, Pci_index,
+-                                                        &pci_bus, &pci_devfn);
+-                              if (status == 0) {
+-                                      unsigned int addr;
+-                                      unsigned char pci_irq;
+-
+-                                      ip2config.type[i] = PCI;
+-                                      /* 
+-                                       * Update Pci_index, so that the next time we go
+-                                       * searching for a PCI board we find a different
+-                                       * one.
+-                                       */
+-                                      ++Pci_index;
+-
+-                                      pcibios_read_config_dword(pci_bus, pci_devfn,
+-                                                                PCI_BASE_ADDRESS_1, &addr);
+-                                      if ( addr & 1 ) {
+-                                              ip2config.addr[i]=(USHORT)(addr&0xfffe);
+-                                      } else {
+-                                              printk( KERN_ERR "IP2: PCI I/O address error\n");
+-                                      }
+-                                      pcibios_read_config_byte(pci_bus, pci_devfn,
+-                                                                PCI_INTERRUPT_LINE, &pci_irq);
+-
+-//            If the PCI BIOS assigned it, lets try and use it.  If we
+-//            can't acquire it or it screws up, deal with it then.
+-
+-//                                    if (!is_valid_irq(pci_irq)) {
+-//                                            printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq);
+-//                                            pci_irq = 0;
+-//                                    }
+-                                      ip2config.irq[i] = pci_irq;
+-                              } else {        // ann error
+-                                      ip2config.addr[i] = 0;
+-                                      if (status == PCIBIOS_DEVICE_NOT_FOUND) {
+-                                              printk( KERN_ERR "IP2: PCI board %d not found\n", i );
+-                                      } else {
+-                                              pcibios_strerror(status);
+-                                      }
+-                              } 
+-                      } 
+-#else /* LINUX_VERSION_CODE > 2.1.99 */
+                       {
+                               struct pci_dev *pci_dev_i = NULL;
+                               pci_dev_i = pci_find_device(PCI_VENDOR_ID_COMPUTONE,
+@@ -739,11 +610,10 @@ ip2_loadmain(int *iop, int *irqp, unsign
+                                       if (status == PCIBIOS_DEVICE_NOT_FOUND) {
+                                               printk( KERN_ERR "IP2: PCI board %d not found\n", i );
+                                       } else {
+-                                              pcibios_strerror(status);
++                                              printk( KERN_ERR "IP2: PCI error 0x%x \n", status );
+                                       }
+                               } 
+                       }
+-#endif        /* ! 2_0_X */
+ #else
+                       printk( KERN_ERR "IP2: PCI card specified but PCI support not\n");
+                       printk( KERN_ERR "IP2: configured in this kernel.\n");
+@@ -2193,7 +2063,7 @@ ip2_ioctl ( PTTY tty, struct file *pFile
+               ip2trace (CHANN, ITRC_IOCTL, 6, 1, rc );
+-                      PUT_USER(rc,C_CLOCAL(tty) ? 1 : 0, (unsigned long *) arg);
++                      rc = put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *) arg);
+               if (rc) 
+                       return rc;
+       break;
+@@ -2202,7 +2072,7 @@ ip2_ioctl ( PTTY tty, struct file *pFile
+               ip2trace (CHANN, ITRC_IOCTL, 7, 1, rc );
+-              GET_USER(rc,arg,(unsigned long *) arg);
++              rc = get_user(arg,(unsigned long *) arg);
+               if (rc) 
+                       return rc;
+               tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL)
+@@ -2243,7 +2113,7 @@ ip2_ioctl ( PTTY tty, struct file *pFile
+                       return -EINTR;
+               }
+ #endif
+-              PUT_USER(rc,
++              rc = put_user(
+                                   ((pCh->dataSetOut & I2_RTS) ? TIOCM_RTS : 0)
+                                 | ((pCh->dataSetOut & I2_DTR) ? TIOCM_DTR : 0)
+                                 | ((pCh->dataSetIn  & I2_DCD) ? TIOCM_CAR : 0)
+@@ -2333,17 +2203,17 @@ ip2_ioctl ( PTTY tty, struct file *pFile
+               cnow = pCh->icount;
+               restore_flags(flags);
+               p_cuser = (struct serial_icounter_struct *) arg;
+-              PUT_USER(rc,cnow.cts, &p_cuser->cts);
+-              PUT_USER(rc,cnow.dsr, &p_cuser->dsr);
+-              PUT_USER(rc,cnow.rng, &p_cuser->rng);
+-              PUT_USER(rc,cnow.dcd, &p_cuser->dcd);
+-              PUT_USER(rc,cnow.rx, &p_cuser->rx);
+-              PUT_USER(rc,cnow.tx, &p_cuser->tx);
+-              PUT_USER(rc,cnow.frame, &p_cuser->frame);
+-              PUT_USER(rc,cnow.overrun, &p_cuser->overrun);
+-              PUT_USER(rc,cnow.parity, &p_cuser->parity);
+-              PUT_USER(rc,cnow.brk, &p_cuser->brk);
+-              PUT_USER(rc,cnow.buf_overrun, &p_cuser->buf_overrun);
++              rc = put_user(cnow.cts, &p_cuser->cts);
++              rc = put_user(cnow.dsr, &p_cuser->dsr);
++              rc = put_user(cnow.rng, &p_cuser->rng);
++              rc = put_user(cnow.dcd, &p_cuser->dcd);
++              rc = put_user(cnow.rx, &p_cuser->rx);
++              rc = put_user(cnow.tx, &p_cuser->tx);
++              rc = put_user(cnow.frame, &p_cuser->frame);
++              rc = put_user(cnow.overrun, &p_cuser->overrun);
++              rc = put_user(cnow.parity, &p_cuser->parity);
++              rc = put_user(cnow.brk, &p_cuser->brk);
++              rc = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
+               break;
+       /*
+@@ -2387,7 +2257,7 @@ set_modem_info(i2ChanStrPtr pCh, unsigne
+       int rc;
+       unsigned int arg;
+-      GET_USER(rc,arg,value);
++      rc = get_user(arg,value);
+       if (rc)
+               return rc;
+       switch(cmd) {
+@@ -2469,7 +2339,7 @@ get_serial_info ( i2ChanStrPtr pCh, stru
+       tmp.close_delay = pCh->ClosingDelay;
+       tmp.closing_wait = pCh->ClosingWaitTime;
+       tmp.custom_divisor = pCh->BaudDivisor;
+-      COPY_TO_USER(rc,retinfo,&tmp,sizeof(*retinfo));
++      rc = copy_to_user(retinfo,&tmp,sizeof(*retinfo));
+    return rc;
+ }
+@@ -2489,15 +2359,15 @@ set_serial_info( i2ChanStrPtr pCh, struc
+ {
+       struct serial_struct ns;
+       int   old_flags, old_baud_divisor;
+-      int     rc = 0;
+       if ( !new_info ) {
+               return -EFAULT;
+       }
+-      COPY_FROM_USER(rc, &ns, new_info, sizeof (ns) );
+-      if (rc) {
+-              return rc;
++
++      if (copy_from_user(&ns, new_info, sizeof (ns))) {
++              return -EFAULT;
+       }
++
+       /*
+        * We don't allow setserial to change IRQ, board address, type or baud
+        * base. Also line nunber as such is meaningless but we use it for our
+@@ -2537,7 +2407,7 @@ set_serial_info( i2ChanStrPtr pCh, struc
+               set_params( pCh, NULL );
+       }
+-      return rc;
++      return 0;
+ }
+ /******************************************************************************/
+@@ -2860,16 +2730,10 @@ service_it:
+ /******************************************************************************/
+ static 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+-int
+-ip2_ipl_read(struct inode *pInode, char *pData, size_t count, loff_t *off )
+-      unsigned int minor = minor( pInode->i_rdev );
+-#else
+ ssize_t
+ ip2_ipl_read(struct file *pFile, char *pData, size_t count, loff_t *off )
+ {
+       unsigned int minor = minor( pFile->f_dentry->d_inode->i_rdev );
+-#endif
+       int rc = 0;
+ #ifdef IP2DEBUG_IPL
+@@ -2904,7 +2768,7 @@ DumpFifoBuffer ( char *pData, int count 
+ {
+ #ifdef DEBUG_FIFO
+       int rc;
+-      COPY_TO_USER(rc, pData, DBGBuf, count);
++      rc = copy_to_user(pData, DBGBuf, count);
+       printk(KERN_DEBUG "Last index %d\n", I );
+@@ -2925,10 +2789,10 @@ DumpTraceBuffer ( char *pData, int count
+       if ( count < (sizeof(int) * 6) ) {
+               return -EIO;
+       }
+-      PUT_USER(rc, tracewrap, pIndex );
+-      PUT_USER(rc, TRACEMAX, ++pIndex );
+-      PUT_USER(rc, tracestrip, ++pIndex );
+-      PUT_USER(rc, tracestuff, ++pIndex );
++      rc = put_user(tracewrap, pIndex );
++      rc = put_user(TRACEMAX, ++pIndex );
++      rc = put_user(tracestrip, ++pIndex );
++      rc = put_user(tracestuff, ++pIndex );
+       pData += sizeof(int) * 6;
+       count -= sizeof(int) * 6;
+@@ -2941,7 +2805,7 @@ DumpTraceBuffer ( char *pData, int count
+       }
+       chunk = TRACEMAX - tracestrip;
+       if ( dumpcount > chunk ) {
+-              COPY_TO_USER(rc, pData, &tracebuf[tracestrip],
++              rc = copy_to_user(pData, &tracebuf[tracestrip],
+                             chunk * sizeof(tracebuf[0]) );
+               pData += chunk * sizeof(tracebuf[0]);
+               tracestrip = 0;
+@@ -2949,13 +2813,13 @@ DumpTraceBuffer ( char *pData, int count
+       } else {
+               chunk = dumpcount;
+       }
+-      COPY_TO_USER(rc, pData, &tracebuf[tracestrip],
++      rc = copy_to_user(pData, &tracebuf[tracestrip],
+                     chunk * sizeof(tracebuf[0]) );
+       tracestrip += chunk;
+       tracewrap = 0;
+-      PUT_USER(rc, tracestrip, ++pIndex );
+-      PUT_USER(rc, tracestuff, ++pIndex );
++      rc = put_user(tracestrip, ++pIndex );
++      rc = put_user(tracestuff, ++pIndex );
+       return dumpcount;
+ #else
+@@ -3019,15 +2883,15 @@ ip2_ipl_ioctl ( struct inode *pInode, st
+       case 13:
+               switch ( cmd ) {
+               case 64:        /* Driver - ip2stat */
+-                      PUT_USER(rc, ip2_tty_driver->refcount, pIndex++ );
+-                      PUT_USER(rc, irq_counter, pIndex++  );
+-                      PUT_USER(rc, bh_counter, pIndex++  );
++                      rc = put_user(ip2_tty_driver->refcount, pIndex++ );
++                      rc = put_user(irq_counter, pIndex++  );
++                      rc = put_user(bh_counter, pIndex++  );
+                       break;
+               case 65:        /* Board  - ip2stat */
+                       if ( pB ) {
+-                              COPY_TO_USER(rc, (char*)arg, (char*)pB, sizeof(i2eBordStr) );
+-                              PUT_USER(rc, INB(pB->i2eStatus),
++                              rc = copy_to_user((char*)arg, (char*)pB, sizeof(i2eBordStr) );
++                              rc = put_user(INB(pB->i2eStatus),
+                                       (ULONG*)(arg + (ULONG)(&pB->i2eStatus) - (ULONG)pB ) );
+                       } else {
+                               rc = -ENODEV;
+@@ -3039,7 +2903,7 @@ ip2_ipl_ioctl ( struct inode *pInode, st
+                               pCh = DevTable[cmd];
+                               if ( pCh )
+                               {
+-                                      COPY_TO_USER(rc, (char*)arg, (char*)pCh, sizeof(i2ChanStr) );
++                                      rc = copy_to_user((char*)arg, (char*)pCh, sizeof(i2ChanStr) );
+                               } else {
+                                       rc = -ENODEV;
+                               }
+@@ -3054,60 +2918,60 @@ ip2_ipl_ioctl ( struct inode *pInode, st
+               break;
+       case 3:     // Trace device
+               if ( cmd == 1 ) {
+-                      PUT_USER(rc, iiSendPendingMail, pIndex++ );
+-                      PUT_USER(rc, i2InitChannels, pIndex++ );
+-                      PUT_USER(rc, i2QueueNeeds, pIndex++ );
+-                      PUT_USER(rc, i2QueueCommands, pIndex++ );
+-                      PUT_USER(rc, i2GetStatus, pIndex++ );
+-                      PUT_USER(rc, i2Input, pIndex++ );
+-                      PUT_USER(rc, i2InputFlush, pIndex++ );
+-                      PUT_USER(rc, i2Output, pIndex++ );
+-                      PUT_USER(rc, i2FlushOutput, pIndex++ );
+-                      PUT_USER(rc, i2DrainWakeup, pIndex++ );
+-                      PUT_USER(rc, i2DrainOutput, pIndex++ );
+-                      PUT_USER(rc, i2OutputFree, pIndex++ );
+-                      PUT_USER(rc, i2StripFifo, pIndex++ );
+-                      PUT_USER(rc, i2StuffFifoBypass, pIndex++ );
+-                      PUT_USER(rc, i2StuffFifoFlow, pIndex++ );
+-                      PUT_USER(rc, i2StuffFifoInline, pIndex++ );
+-                      PUT_USER(rc, i2ServiceBoard, pIndex++ );
+-                      PUT_USER(rc, serviceOutgoingFifo, pIndex++ );
+-                      // PUT_USER(rc, ip2_init, pIndex++ );
+-                      PUT_USER(rc, ip2_init_board, pIndex++ );
+-                      PUT_USER(rc, find_eisa_board, pIndex++ );
+-                      PUT_USER(rc, set_irq, pIndex++ );
+-                      PUT_USER(rc, ip2_interrupt, pIndex++ );
+-                      PUT_USER(rc, ip2_poll, pIndex++ );
+-                      PUT_USER(rc, service_all_boards, pIndex++ );
+-                      PUT_USER(rc, do_input, pIndex++ );
+-                      PUT_USER(rc, do_status, pIndex++ );
++                      rc = put_user(iiSendPendingMail, pIndex++ );
++                      rc = put_user(i2InitChannels, pIndex++ );
++                      rc = put_user(i2QueueNeeds, pIndex++ );
++                      rc = put_user(i2QueueCommands, pIndex++ );
++                      rc = put_user(i2GetStatus, pIndex++ );
++                      rc = put_user(i2Input, pIndex++ );
++                      rc = put_user(i2InputFlush, pIndex++ );
++                      rc = put_user(i2Output, pIndex++ );
++                      rc = put_user(i2FlushOutput, pIndex++ );
++                      rc = put_user(i2DrainWakeup, pIndex++ );
++                      rc = put_user(i2DrainOutput, pIndex++ );
++                      rc = put_user(i2OutputFree, pIndex++ );
++                      rc = put_user(i2StripFifo, pIndex++ );
++                      rc = put_user(i2StuffFifoBypass, pIndex++ );
++                      rc = put_user(i2StuffFifoFlow, pIndex++ );
++                      rc = put_user(i2StuffFifoInline, pIndex++ );
++                      rc = put_user(i2ServiceBoard, pIndex++ );
++                      rc = put_user(serviceOutgoingFifo, pIndex++ );
++                      // rc = put_user(ip2_init, pIndex++ );
++                      rc = put_user(ip2_init_board, pIndex++ );
++                      rc = put_user(find_eisa_board, pIndex++ );
++                      rc = put_user(set_irq, pIndex++ );
++                      rc = put_user(ip2_interrupt, pIndex++ );
++                      rc = put_user(ip2_poll, pIndex++ );
++                      rc = put_user(service_all_boards, pIndex++ );
++                      rc = put_user(do_input, pIndex++ );
++                      rc = put_user(do_status, pIndex++ );
+ #ifndef IP2DEBUG_OPEN
+-                      PUT_USER(rc, 0, pIndex++ );
++                      rc = put_user(0, pIndex++ );
+ #else
+-                      PUT_USER(rc, open_sanity_check, pIndex++ );
++                      rc = put_user(open_sanity_check, pIndex++ );
+ #endif
+-                      PUT_USER(rc, ip2_open, pIndex++ );
+-                      PUT_USER(rc, ip2_close, pIndex++ );
+-                      PUT_USER(rc, ip2_hangup, pIndex++ );
+-                      PUT_USER(rc, ip2_write, pIndex++ );
+-                      PUT_USER(rc, ip2_putchar, pIndex++ );
+-                      PUT_USER(rc, ip2_flush_chars, pIndex++ );
+-                      PUT_USER(rc, ip2_write_room, pIndex++ );
+-                      PUT_USER(rc, ip2_chars_in_buf, pIndex++ );
+-                      PUT_USER(rc, ip2_flush_buffer, pIndex++ );
+-
+-                      //PUT_USER(rc, ip2_wait_until_sent, pIndex++ );
+-                      PUT_USER(rc, 0, pIndex++ );
+-
+-                      PUT_USER(rc, ip2_throttle, pIndex++ );
+-                      PUT_USER(rc, ip2_unthrottle, pIndex++ );
+-                      PUT_USER(rc, ip2_ioctl, pIndex++ );
+-                      PUT_USER(rc, set_modem_info, pIndex++ );
+-                      PUT_USER(rc, get_serial_info, pIndex++ );
+-                      PUT_USER(rc, set_serial_info, pIndex++ );
+-                      PUT_USER(rc, ip2_set_termios, pIndex++ );
+-                      PUT_USER(rc, ip2_set_line_discipline, pIndex++ );
+-                      PUT_USER(rc, set_params, pIndex++ );
++                      rc = put_user(ip2_open, pIndex++ );
++                      rc = put_user(ip2_close, pIndex++ );
++                      rc = put_user(ip2_hangup, pIndex++ );
++                      rc = put_user(ip2_write, pIndex++ );
++                      rc = put_user(ip2_putchar, pIndex++ );
++                      rc = put_user(ip2_flush_chars, pIndex++ );
++                      rc = put_user(ip2_write_room, pIndex++ );
++                      rc = put_user(ip2_chars_in_buf, pIndex++ );
++                      rc = put_user(ip2_flush_buffer, pIndex++ );
++
++                      //rc = put_user(ip2_wait_until_sent, pIndex++ );
++                      rc = put_user(0, pIndex++ );
++
++                      rc = put_user(ip2_throttle, pIndex++ );
++                      rc = put_user(ip2_unthrottle, pIndex++ );
++                      rc = put_user(ip2_ioctl, pIndex++ );
++                      rc = put_user(set_modem_info, pIndex++ );
++                      rc = put_user(get_serial_info, pIndex++ );
++                      rc = put_user(set_serial_info, pIndex++ );
++                      rc = put_user(ip2_set_termios, pIndex++ );
++                      rc = put_user(ip2_set_line_discipline, pIndex++ );
++                      rc = put_user(set_params, pIndex++ );
+               } else {
+                       rc = -EINVAL;
+               }
+--- linux-2.6.0-test1/drivers/char/istallion.c 2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/char/istallion.c        2003-07-19 17:03:49.000000000 -0700
+@@ -650,8 +650,6 @@ static unsigned int        stli_baudrates[] = {
+  */
+ #ifdef MODULE
+-int           init_module(void);
+-void          cleanup_module(void);
+ static void   stli_argbrds(void);
+ static int    stli_parsebrd(stlconf_t *confp, char **argp);
+--- linux-2.6.0-test1/drivers/char/keyboard.c  2003-06-26 22:07:24.000000000 -0700
++++ 25/drivers/char/keyboard.c 2003-07-19 17:04:02.000000000 -0700
+@@ -1055,6 +1055,9 @@ void kbd_keycode(unsigned int keycode, i
+       }
+       if (sysrq_down && down && !rep) {
+               handle_sysrq(kbd_sysrq_xlate[keycode], regs, tty);
++#ifdef CONFIG_KGDB_SYSRQ
++                sysrq_down = 0;        /* in case we miss the "up" event */
++#endif
+               return;
+       }
+ #endif
+--- linux-2.6.0-test1/drivers/char/moxa.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/char/moxa.c     2003-07-19 17:03:49.000000000 -0700
+@@ -216,10 +216,7 @@ static struct timer_list moxaEmptyTimer[
+ static struct semaphore moxaBuffSem;
+ int moxa_init(void);
+-#ifdef MODULE
+-int init_module(void);
+-void cleanup_module(void);
+-#endif
++
+ /*
+  * static functions:
+  */
+--- linux-2.6.0-test1/drivers/char/nwbutton.h  2003-06-14 12:18:04.000000000 -0700
++++ 25/drivers/char/nwbutton.h 2003-07-19 17:03:49.000000000 -0700
+@@ -32,10 +32,6 @@ int button_init (void);
+ int button_add_callback (void (*callback) (void), int count);
+ int button_del_callback (void (*callback) (void));
+ static void button_consume_callbacks (int bpcount);
+-#ifdef MODULE
+-int init_module (void);
+-void cleanup_module (void);
+-#endif /* MODULE */
+ #else /* Not compiling the driver itself */
+--- linux-2.6.0-test1/drivers/char/pcxx.c      2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/char/pcxx.c     2003-07-19 17:03:49.000000000 -0700
+@@ -209,17 +209,9 @@ static void cleanup_board_resources(void
+ #ifdef MODULE
+-/*
+- * pcxe_init() is our init_module():
+- */
+-#define pcxe_init init_module
+-
+-void  cleanup_module(void);
+-
+-
+ /*****************************************************************************/
+-void cleanup_module()
++static void pcxe_cleanup()
+ {
+       unsigned long   flags;
+@@ -240,6 +232,12 @@ void cleanup_module()
+       kfree(digi_channels);
+       restore_flags(flags);
+ }
++
++/*
++ * pcxe_init() is our init_module():
++ */
++module_init(pcxe_init);
++module_cleanup(pcxe_cleanup);
+ #endif
+ static inline struct channel *chan(register struct tty_struct *tty)
+--- linux-2.6.0-test1/drivers/char/stallion.c  2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/char/stallion.c 2003-07-19 17:03:49.000000000 -0700
+@@ -472,8 +472,6 @@ static unsigned int        stl_baudrates[] = {
+  */
+ #ifdef MODULE
+-int           init_module(void);
+-void          cleanup_module(void);
+ static void   stl_argbrds(void);
+ static int    stl_parsebrd(stlconf_t *confp, char **argp);
+--- linux-2.6.0-test1/drivers/char/sysrq.c     2003-06-26 22:07:24.000000000 -0700
++++ 25/drivers/char/sysrq.c    2003-07-19 17:04:02.000000000 -0700
+@@ -35,6 +35,19 @@
+ #include <linux/spinlock.h>
+ #include <asm/ptrace.h>
++#ifdef CONFIG_KGDB_SYSRQ
++
++#define  GDB_OP &kgdb_op
++static struct sysrq_key_op kgdb_op={
++      handler:        (void*)breakpoint,
++      help_msg:       "kGdb ",
++      action_msg:     "Debug breakpoint\n",
++};
++
++#else
++#define  GDB_OP NULL
++#endif
++
+ extern void reset_vc(unsigned int);
+ extern struct list_head super_blocks;
+@@ -240,7 +253,7 @@ static struct sysrq_key_op *sysrq_key_ta
+ /* d */       NULL,
+ /* e */       &sysrq_term_op,
+ /* f */       NULL,
+-/* g */       NULL,
++/* g */       GDB_OP,
+ /* h */       NULL,
+ /* i */       &sysrq_kill_op,
+ /* j */       NULL,
+--- linux-2.6.0-test1/drivers/char/tty_io.c    2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/char/tty_io.c   2003-07-19 17:06:13.000000000 -0700
+@@ -2106,7 +2106,7 @@ static spinlock_t tty_dev_list_lock = SP
+ static ssize_t show_dev(struct class_device *class_dev, char *buf)
+ {
+       struct tty_dev *tty_dev = to_tty_dev(class_dev);
+-      return sprintf(buf, "%04lx\n", (unsigned long)tty_dev->dev);
++      return print_dev_t(buf, tty_dev->dev);
+ }
+ static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+--- linux-2.6.0-test1/drivers/char/watchdog/acquirewdt.c       2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/char/watchdog/acquirewdt.c      2003-07-19 17:03:49.000000000 -0700
+@@ -143,7 +143,7 @@ static int acq_open(struct inode *inode,
+                       return -EBUSY;
+               }
+               if (nowayout)
+-                      MOD_INC_USE_COUNT;
++                      __module_get(THIS_MODULE);
+               /* Activate */
+               acq_is_open=1;
+--- linux-2.6.0-test1/drivers/char/watchdog/i810-tco.c 2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/char/watchdog/i810-tco.c        2003-07-19 17:03:49.000000000 -0700
+@@ -25,7 +25,8 @@
+  *    82801AA & 82801AB  chip : document number 290655-003, 290677-004,
+  *    82801BA & 82801BAM chip : document number 290687-002, 298242-005,
+  *    82801CA & 82801CAM chip : document number 290716-001, 290718-001,
+- *    82801DB & 82801E   chip : document number 290744-001, 273599-001
++ *    82801DB & 82801E   chip : document number 290744-001, 273599-001,
++ *    82801EB & 82801ER  chip : document number 252516-001
+  *
+  *  20000710 Nils Faerber
+  *    Initial Version 0.01
+@@ -42,9 +43,11 @@
+  *         clean up ioctls (WDIOC_GETSTATUS, WDIOC_GETBOOTSTATUS and
+  *         WDIOC_SETOPTIONS), made i810tco_getdevice __init,
+  *         removed boot_status, removed tco_timer_read,
+- *         added support for 82801DB and 82801E chipset, general cleanup.
++ *         added support for 82801DB and 82801E chipset,
++ *         added support for 82801EB and 8280ER chipset,
++ *         general cleanup.
+  */
+- 
++
+ #include <linux/module.h>
+ #include <linux/types.h>
+ #include <linux/miscdevice.h>
+@@ -164,7 +167,7 @@ static int tco_timer_settimer (unsigned 
+  * Reload (trigger) the timer. Lock is needed so we don't reload it during
+  * a reprogramming event
+  */
+- 
++
+ static void tco_timer_reload (void)
+ {
+       spin_lock(&tco_lock);
+@@ -307,6 +310,7 @@ static struct pci_device_id i810tco_pci_
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12,  PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0,   PCI_ANY_ID, PCI_ANY_ID, },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0,    PCI_ANY_ID, PCI_ANY_ID, },
++      { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0,   PCI_ANY_ID, PCI_ANY_ID, },
+       { 0, },
+ };
+ MODULE_DEVICE_TABLE (pci, i810tco_pci_tbl);
+--- linux-2.6.0-test1/drivers/char/watchdog/i810-tco.h 2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/char/watchdog/i810-tco.h        2003-07-19 17:03:49.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- *    i810-tco 0.05:  TCO timer driver for i8xx chipsets
++ *    i810-tco:       TCO timer driver for i8xx chipsets
+  *
+  *    (c) Copyright 2000 kernel concepts <nils@kernelconcepts.de>, All Rights Reserved.
+  *                            http://www.kernelconcepts.de
+@@ -8,7 +8,7 @@
+  *    modify it under the terms of the GNU General Public License
+  *    as published by the Free Software Foundation; either version
+  *    2 of the License, or (at your option) any later version.
+- *    
++ *
+  *    Neither kernel concepts nor Nils Faerber admit liability nor provide
+  *    warranty for any of this software. This material is provided
+  *    "AS-IS" and at no charge.
+--- linux-2.6.0-test1/drivers/char/watchdog/ib700wdt.c 2003-06-14 12:18:33.000000000 -0700
++++ 25/drivers/char/watchdog/ib700wdt.c        2003-07-19 17:03:49.000000000 -0700
+@@ -230,7 +230,7 @@ ibwdt_open(struct inode *inode, struct f
+                       return -EBUSY;
+               }
+               if (nowayout)
+-                      MOD_INC_USE_COUNT;
++                      __module_get(THIS_MODULE);
+               /* Activate */
+               ibwdt_is_open = 1;
+--- linux-2.6.0-test1/drivers/char/watchdog/indydog.c  2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/char/watchdog/indydog.c 2003-07-19 17:03:49.000000000 -0700
+@@ -54,7 +54,7 @@ static int indydog_open(struct inode *in
+               return -EBUSY;
+       if (nowayout)
+-              MOD_INC_USE_COUNT;
++              __module_get(THIS_MODULE);
+       /*
+        *      Activate timer
+--- linux-2.6.0-test1/drivers/char/watchdog/machzwd.c  2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/char/watchdog/machzwd.c 2003-07-19 17:03:49.000000000 -0700
+@@ -392,7 +392,7 @@ static int zf_open(struct inode *inode, 
+                       }
+                       if (nowayout)
+-                              MOD_INC_USE_COUNT;
++                              __module_get(THIS_MODULE);
+                       zf_is_open = 1;
+--- linux-2.6.0-test1/drivers/char/watchdog/pcwd.c     2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/char/watchdog/pcwd.c    2003-07-19 17:03:49.000000000 -0700
+@@ -431,7 +431,7 @@ static int pcwd_open(struct inode *ino, 
+                       atomic_inc( &open_allowed );
+                       return -EBUSY;
+               }
+-              MOD_INC_USE_COUNT;
++              __module_get(THIS_MODULE);
+               /*  Enable the port  */
+               if (revision == PCWD_REVISION_C) {
+                       spin_lock(&io_lock);
+--- linux-2.6.0-test1/drivers/char/watchdog/sbc60xxwdt.c       2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/char/watchdog/sbc60xxwdt.c      2003-07-19 17:03:49.000000000 -0700
+@@ -207,9 +207,8 @@ static int fop_open(struct inode * inode
+                       /* Just in case we're already talking to someone... */
+                       if(wdt_is_open)
+                               return -EBUSY;
+-                      if (nowayout) {
+-                              MOD_INC_USE_COUNT;
+-                      }
++                      if (nowayout) 
++                              __module_get(THIS_MODULE);
+                       /* Good, fire up the show */
+                       wdt_is_open = 1;
+                       wdt_startup();
+--- linux-2.6.0-test1/drivers/char/watchdog/sc520_wdt.c        2003-06-14 12:18:20.000000000 -0700
++++ 25/drivers/char/watchdog/sc520_wdt.c       2003-07-19 17:03:49.000000000 -0700
+@@ -231,7 +231,7 @@ static int fop_open(struct inode * inode
+                       /* Good, fire up the show */
+                       wdt_startup();
+                       if (nowayout)
+-                              MOD_INC_USE_COUNT;
++                              __module_get(THIS_MODULE);
+                       return 0;
+               default:
+--- linux-2.6.0-test1/drivers/char/watchdog/shwdt.c    2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/char/watchdog/shwdt.c   2003-07-19 17:03:49.000000000 -0700
+@@ -3,7 +3,7 @@
+  *
+  * Watchdog driver for integrated watchdog in the SuperH processors.
+  *
+- * Copyright (C) 2001, 2002 Paul Mundt <lethal@0xd6.org>
++ * Copyright (C) 2001, 2002, 2003 Paul Mundt <lethal@linux-sh.org>
+  *
+  * This program is free software; you can redistribute it and/or modify it
+  * under the terms of the GNU General Public License as published by the
+@@ -12,6 +12,10 @@
+  *
+  * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com>
+  *     Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT
++ *
++ * 19-Apr-2002 Rob Radez <rob@osinvestor.com>
++ *     Added expect close support, made emulated timeout runtime changeable
++ *     general cleanups, add some ioctls
+  */
+ #include <linux/config.h>
+ #include <linux/module.h>
+@@ -22,76 +26,50 @@
+ #include <linux/reboot.h>
+ #include <linux/notifier.h>
+ #include <linux/ioport.h>
++#include <linux/fs.h>
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+-
+-#if defined(CONFIG_CPU_SH5)
+-  #define WTCNT               CPRC_BASE + 0x10
+-  #define WTCSR               CPRC_BASE + 0x18
+-#elif defined(CONFIG_CPU_SH4)
+-  #define WTCNT               0xffc00008
+-  #define WTCSR               0xffc0000c
+-#elif defined(CONFIG_CPU_SH3)
+-  #define WTCNT               0xffffff84
+-  #define WTCSR               0xffffff86
+-#else
+-  #error "Can't use SuperH watchdog on this platform"
+-#endif
+-
+-#define WTCNT_HIGH    0x5a00
+-#define WTCSR_HIGH    0xa500
+-
+-#define WTCSR_TME     0x80
+-#define WTCSR_WT      0x40
+-#define WTCSR_RSTS    0x20
+-#define WTCSR_WOVF    0x10
+-#define WTCSR_IOVF    0x08
+-#define WTCSR_CKS2    0x04
+-#define WTCSR_CKS1    0x02
+-#define WTCSR_CKS0    0x01
+-
+-/*
+- * CKS0-2 supports a number of clock division ratios. At the time the watchdog
+- * is enabled, it defaults to a 41 usec overflow period .. we overload this to
+- * something a little more reasonable, and really can't deal with anything
+- * lower than WTCSR_CKS_1024, else we drop back into the usec range.
+- *
+- * Clock Division Ratio         Overflow Period
+- * --------------------------------------------
+- *     1/32 (initial value)       41 usecs
+- *     1/64                       82 usecs
+- *     1/128                     164 usecs
+- *     1/256                     328 usecs
+- *     1/512                     656 usecs
+- *     1/1024                   1.31 msecs
+- *     1/2048                   2.62 msecs
+- *     1/4096                   5.25 msecs
+- */
+-#define WTCSR_CKS_32  0x00
+-#define WTCSR_CKS_64  0x01
+-#define WTCSR_CKS_128 0x02
+-#define WTCSR_CKS_256 0x03
+-#define WTCSR_CKS_512 0x04
+-#define WTCSR_CKS_1024        0x05
+-#define WTCSR_CKS_2048        0x06
+-#define WTCSR_CKS_4096        0x07
++#include <asm/watchdog.h>
+ /*
+- * Default clock division ratio is 5.25 msecs. Overload this at module load
+- * time. Any value not in the msec range will default to a timeout of one
+- * jiffy, which exceeds the usec overflow periods.
++ * Default clock division ratio is 5.25 msecs. For an additional table of
++ * values, consult the asm-sh/watchdog.h. Overload this at module load
++ * time. 
++ *
++ * In order for this to work reliably we need to have HZ set to 1000 or
++ * something quite higher than 100 (or we need a proper high-res timer
++ * implementation that will deal with this properly), otherwise the 10ms
++ * resolution of a jiffy is enough to trigger the overflow. For things like
++ * the SH-4 and SH-5, this isn't necessarily that big of a problem, though
++ * for the SH-2 and SH-3, this isn't recommended unless the WDT is absolutely
++ * necssary.
++ *
++ * As a result of this timing problem, the only modes that are particularly
++ * feasible are the 4096 and the 2048 divisors, which yeild 5.25 and 2.62ms
++ * overflow periods respectively.
++ *
++ * Also, since we can't really expect userspace to be responsive enough
++ * before the overflow happens, we maintain two seperate timers .. One in
++ * the kernel for clearing out WOVF every 2ms or so (again, this depends on
++ * HZ == 1000), and another for monitoring userspace writes to the WDT device.
++ *
++ * As such, we currently use a configurable heartbeat interval which defaults
++ * to 30s. In this case, the userspace daemon is only responsible for periodic
++ * writes to the device before the next heartbeat is scheduled. If the daemon
++ * misses its deadline, the kernel timer will allow the WDT to overflow.
+  */
+ static int clock_division_ratio = WTCSR_CKS_4096;
+-#define msecs_to_jiffies(msecs)       (jiffies + ((HZ * msecs + 999) / 1000))
++#define msecs_to_jiffies(msecs)       (jiffies + (HZ * msecs + 9999) / 10000)
+ #define next_ping_period(cks) msecs_to_jiffies(cks - 4)
+-#define user_ping_period(cks) (next_ping_period(cks) * 10)
+-static unsigned long sh_is_open = 0;
++static unsigned long shwdt_is_open;
+ static struct watchdog_info sh_wdt_info;
++static char shwdt_expect_close;
+ static struct timer_list timer;
+ static unsigned long next_heartbeat;
++static int heartbeat = 30;
+ #ifdef CONFIG_WATCHDOG_NOWAYOUT
+ static int nowayout = 1;
+@@ -99,35 +77,6 @@ static int nowayout = 1;
+ static int nowayout = 0;
+ #endif
+-MODULE_PARM(nowayout,"i");
+-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+-
+-/**
+- *    sh_wdt_write_cnt - Write to Counter
+- *
+- *    @val: Value to write
+- *
+- *    Writes the given value @val to the lower byte of the timer counter.
+- *    The upper byte is set manually on each write.
+- */
+-static void sh_wdt_write_cnt(__u8 val)
+-{
+-      ctrl_outw(WTCNT_HIGH | (__u16)val, WTCNT);
+-}
+-
+-/**
+- *    sh_wdt_write_csr - Write to Control/Status Register
+- *
+- *    @val: Value to write
+- *
+- *    Writes the given value @val to the lower byte of the control/status
+- *    register. The upper byte is set manually on each write.
+- */
+-static void sh_wdt_write_csr(__u8 val)
+-{
+-      ctrl_outw(WTCSR_HIGH | (__u16)val, WTCSR);
+-}
+-
+ /**
+  *    sh_wdt_start - Start the Watchdog
+  *
+@@ -135,13 +84,44 @@ static void sh_wdt_write_csr(__u8 val)
+  */
+ static void sh_wdt_start(void)
+ {
+-      timer.expires = next_ping_period(clock_division_ratio);
+-      next_heartbeat = user_ping_period(clock_division_ratio);
+-      add_timer(&timer);
++      __u8 csr;
++
++      mod_timer(&timer, next_ping_period(clock_division_ratio));
++      next_heartbeat = jiffies + (heartbeat * HZ);
++
++      csr = sh_wdt_read_csr();
++      csr |= WTCSR_WT | clock_division_ratio;
++      sh_wdt_write_csr(csr);
+-      sh_wdt_write_csr(WTCSR_WT | WTCSR_CKS_4096);
+       sh_wdt_write_cnt(0);
+-      sh_wdt_write_csr((ctrl_inb(WTCSR) | WTCSR_TME));
++
++      /*
++       * These processors have a bit of an inconsistent initialization
++       * process.. starting with SH-3, RSTS was moved to WTCSR, and the
++       * RSTCSR register was removed.
++       *
++       * On the SH-2 however, in addition with bits being in different
++       * locations, we must deal with RSTCSR outright..
++       */
++      csr = sh_wdt_read_csr();
++      csr |= WTCSR_TME;
++      csr &= ~WTCSR_RSTS;
++      sh_wdt_write_csr(csr);
++
++#ifdef CONFIG_CPU_SH2
++      /*
++       * Whoever came up with the RSTCSR semantics must've been smoking
++       * some of the good stuff, since in addition to the WTCSR/WTCNT write
++       * brain-damage, it's managed to fuck things up one step further..
++       *
++       * If we need to clear the WOVF bit, the upper byte has to be 0xa5..
++       * but if we want to touch RSTE or RSTS, the upper byte has to be
++       * 0x5a..
++       */
++      csr = sh_wdt_read_rstcsr();
++      csr &= ~RSTCSR_RSTS;
++      sh_wdt_write_rstcsr(csr);
++#endif        
+ }
+ /**
+@@ -151,9 +131,13 @@ static void sh_wdt_start(void)
+  */
+ static void sh_wdt_stop(void)
+ {
++      __u8 csr;
++
+       del_timer(&timer);
+-      sh_wdt_write_csr((ctrl_inb(WTCSR) & ~WTCSR_TME));
++      csr = sh_wdt_read_csr();
++      csr &= ~WTCSR_TME;
++      sh_wdt_write_csr(csr);
+ }
+ /**
+@@ -166,11 +150,15 @@ static void sh_wdt_stop(void)
+ static void sh_wdt_ping(unsigned long data)
+ {
+       if (time_before(jiffies, next_heartbeat)) {
+-              sh_wdt_write_csr((ctrl_inb(WTCSR) & ~WTCSR_IOVF));
++              __u8 csr;
++
++              csr = sh_wdt_read_csr();
++              csr &= ~WTCSR_IOVF;
++              sh_wdt_write_csr(csr);
++
+               sh_wdt_write_cnt(0);
+-              timer.expires = next_ping_period(clock_division_ratio);
+-              add_timer(&timer);
++              mod_timer(&timer, next_ping_period(clock_division_ratio));
+       }
+ }
+@@ -184,21 +172,12 @@ static void sh_wdt_ping(unsigned long da
+  */
+ static int sh_wdt_open(struct inode *inode, struct file *file)
+ {
+-      switch (minor(inode->i_rdev)) {
+-              case WATCHDOG_MINOR:
+-                      if (test_and_set_bit(0, &sh_is_open))
+-                              return -EBUSY;
++      if (test_and_set_bit(0, &shwdt_is_open))
++              return -EBUSY;
++      if (nowayout)
++              __module_get(THIS_MODULE);
+-                      if (nowayout) {
+-                              MOD_INC_USE_COUNT;
+-                      }
+-
+-                      sh_wdt_start();
+-
+-                      break;
+-              default:
+-                      return -ENODEV;
+-      }
++      sh_wdt_start();
+       return 0;
+ }
+@@ -213,33 +192,20 @@ static int sh_wdt_open(struct inode *ino
+  */
+ static int sh_wdt_close(struct inode *inode, struct file *file)
+ {
+-      if (minor(inode->i_rdev) == WATCHDOG_MINOR) {
+-              if (!nowayout) {
+-                      sh_wdt_stop();
+-              }
+-              clear_bit(0, &sh_is_open);
++      if (!nowayout && shwdt_expect_close == 42) {
++              sh_wdt_stop();
++      } else {
++              printk(KERN_CRIT "shwdt: Unexpected close, not stopping watchdog!\n");
++              next_heartbeat = jiffies + (heartbeat * HZ);
+       }
++
++      clear_bit(0, &shwdt_is_open);
++      shwdt_expect_close = 0;
+       
+       return 0;
+ }
+ /**
+- *    sh_wdt_read - Read from Device
+- *
+- *    @file: file handle of device
+- *    @buf: buffer to write to
+- *    @count: length of buffer
+- *    @ppos: offset
+- *
+- *    Unsupported.
+- */
+-static ssize_t sh_wdt_read(struct file *file, char *buf,
+-                         size_t count, loff_t *ppos)
+-{
+-      return -EINVAL;
+-}
+-
+-/**
+  *    sh_wdt_write - Write to Device
+  *
+  *    @file: file handle of device
+@@ -257,11 +223,21 @@ static ssize_t sh_wdt_write(struct file 
+               return -ESPIPE;
+       if (count) {
+-              next_heartbeat = user_ping_period(clock_division_ratio);
+-              return 1;
++              size_t i;
++
++              shwdt_expect_close = 0;
++
++              for (i = 0; i != count; i++) {
++                      char c;
++                      if (get_user(c, buf + i))
++                              return -EFAULT;
++                      if (c == 'V')
++                              shwdt_expect_close = 42;
++              }
++              next_heartbeat = jiffies + (heartbeat * HZ);
+       }
+-      return 0;
++      return count;
+ }
+ /**
+@@ -278,6 +254,8 @@ static ssize_t sh_wdt_write(struct file 
+ static int sh_wdt_ioctl(struct inode *inode, struct file *file,
+                       unsigned int cmd, unsigned long arg)
+ {
++      int new_timeout;
++
+       switch (cmd) {
+               case WDIOC_GETSUPPORT:
+                       if (copy_to_user((struct watchdog_info *)arg,
+@@ -288,17 +266,41 @@ static int sh_wdt_ioctl(struct inode *in
+                       
+                       break;
+               case WDIOC_GETSTATUS:
+-                      if (copy_to_user((int *)arg,
+-                                       &sh_is_open,
+-                                       sizeof(int))) {
++              case WDIOC_GETBOOTSTATUS:
++                      return put_user(0, (int *)arg);
++              case WDIOC_KEEPALIVE:
++                      next_heartbeat = jiffies + (heartbeat * HZ);
++
++                      break;
++              case WDIOC_SETTIMEOUT:
++                      if (get_user(new_timeout, (int *)arg))
+                               return -EFAULT;
++                      if (new_timeout < 1 || new_timeout > 3600) /* arbitrary upper limit */
++                              return -EINVAL;
++                      heartbeat = new_timeout;
++                      next_heartbeat = jiffies + (heartbeat * HZ);
++                      /* Fall */
++              case WDIOC_GETTIMEOUT:
++                      return put_user(heartbeat, (int *)arg);
++              case WDIOC_SETOPTIONS:
++              {
++                      int options, retval = -EINVAL;
++
++                      if (get_user(options, (int *)arg))
++                              return -EFAULT;
++
++                      if (options & WDIOS_DISABLECARD) {
++                              sh_wdt_stop();
++                              retval = 0;
+                       }
+-                      break;
+-              case WDIOC_KEEPALIVE:
+-                      next_heartbeat = user_ping_period(clock_division_ratio);
++                      if (options & WDIOS_ENABLECARD) {
++                              sh_wdt_start();
++                              retval = 0;
++                      }
+                       
+-                      break;
++                      return retval;
++              }
+               default:
+                       return -ENOTTY;
+       }
+@@ -328,7 +330,7 @@ static int sh_wdt_notify_sys(struct noti
+ static struct file_operations sh_wdt_fops = {
+       .owner          = THIS_MODULE,
+-      .read           = sh_wdt_read,
++      .llseek         = no_llseek,
+       .write          = sh_wdt_write,
+       .ioctl          = sh_wdt_ioctl,
+       .open           = sh_wdt_open,
+@@ -336,21 +338,20 @@ static struct file_operations sh_wdt_fop
+ };
+ static struct watchdog_info sh_wdt_info = {
+-      .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
+-      .firmware_version = 1,
+-      .identity = "SH WDT",
++      .options                = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
++      .firmware_version       = 1,
++      .identity               = "SH WDT",
+ };
+ static struct notifier_block sh_wdt_notifier = {
+-      .notifier_call = sh_wdt_notify_sys,
+-      .next = NULL,
+-      .priority = 0
++      .notifier_call          = sh_wdt_notify_sys,
++      .priority               = 0,
+ };
+ static struct miscdevice sh_wdt_miscdev = {
+-      .minor = WATCHDOG_MINOR,
+-      .name = "watchdog",
+-      .fops &sh_wdt_fops,
++      .minor          = WATCHDOG_MINOR,
++      .name           = "watchdog",
++      .fops           = &sh_wdt_fops,
+ };
+ /**
+@@ -366,23 +367,8 @@ static int __init sh_wdt_init(void)
+               return -EINVAL;
+       }
+-      if (!request_region(WTCNT, 1, "shwdt")) {
+-              printk(KERN_ERR "shwdt: Can't request WTCNT region\n");
+-              misc_deregister(&sh_wdt_miscdev);
+-              return -ENXIO;
+-      }
+-
+-      if (!request_region(WTCSR, 1, "shwdt")) {
+-              printk(KERN_ERR "shwdt: Can't request WTCSR region\n");
+-              release_region(WTCNT, 1);
+-              misc_deregister(&sh_wdt_miscdev);
+-              return -ENXIO;
+-      }
+-
+       if (register_reboot_notifier(&sh_wdt_notifier)) {
+               printk(KERN_ERR "shwdt: Can't register reboot notifier\n");
+-              release_region(WTCSR, 1);
+-              release_region(WTCNT, 1);
+               misc_deregister(&sh_wdt_miscdev);
+               return -EINVAL;
+       }
+@@ -403,16 +389,16 @@ static int __init sh_wdt_init(void)
+ static void __exit sh_wdt_exit(void)
+ {
+       unregister_reboot_notifier(&sh_wdt_notifier);
+-      release_region(WTCSR, 1);
+-      release_region(WTCNT, 1);
+       misc_deregister(&sh_wdt_miscdev);
+ }
+-MODULE_AUTHOR("Paul Mundt <lethal@0xd6.org>");
++MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
+ MODULE_DESCRIPTION("SuperH watchdog driver");
+ MODULE_LICENSE("GPL");
+ MODULE_PARM(clock_division_ratio, "i");
+ MODULE_PARM_DESC(clock_division_ratio, "Clock division ratio. Valid ranges are from 0x5 (1.31ms) to 0x7 (5.25ms). Defaults to 0x7.");
++MODULE_PARM(nowayout,"i");
++MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+ module_init(sh_wdt_init);
+ module_exit(sh_wdt_exit);
+--- linux-2.6.0-test1/drivers/char/watchdog/softdog.c  2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/char/watchdog/softdog.c 2003-07-19 17:03:49.000000000 -0700
+@@ -104,9 +104,8 @@ static int softdog_open(struct inode *in
+ {
+       if(test_and_set_bit(0, &timer_alive))
+               return -EBUSY;
+-      if (nowayout) {
+-              MOD_INC_USE_COUNT;
+-      }
++      if (nowayout) 
++              __module_get(THIS_MODULE);
+       /*
+        *      Activate timer
+        */
+--- linux-2.6.0-test1/drivers/char/watchdog/wdt977.c   2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/char/watchdog/wdt977.c  2003-07-19 17:03:49.000000000 -0700
+@@ -16,6 +16,8 @@
+  *    19-Dec-2001 Woody Suwalski: Netwinder fixes, ioctl interface
+  *    06-Jan-2002 Woody Suwalski: For compatibility, convert all timeouts
+  *                                from minutes to seconds.
++ *      07-Jul-2003 Daniele Bellucci: Audit return code of misc_register in
++ *                                    nwwatchdog_init.
+  */
+ #include <linux/module.h>
+@@ -99,7 +101,7 @@ static int wdt977_open(struct inode *ino
+       if (nowayout)
+       {
+-              MOD_INC_USE_COUNT;
++              __module_get(THIS_MODULE);
+               /* do not permit disabling the watchdog by writing 0 to reg. 0xF2 */
+               if (!timeoutM) timeoutM = DEFAULT_TIMEOUT;
+@@ -343,12 +345,14 @@ static struct miscdevice wdt977_miscdev=
+ static int __init nwwatchdog_init(void)
+ {
++      int retval;
+       if (!machine_is_netwinder())
+               return -ENODEV;
+-      misc_register(&wdt977_miscdev);
+-      printk(KERN_INFO "Wdt977 Watchdog sleeping.\n");
+-      return 0;
++      retval = misc_register(&wdt977_miscdev);
++      if (!retval)
++              printk(KERN_INFO "Wdt977 Watchdog sleeping.\n");
++      return retval;
+ }
+ static void __exit nwwatchdog_exit(void)
+--- linux-2.6.0-test1/drivers/char/watchdog/wdt_pci.c  2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/char/watchdog/wdt_pci.c 2003-07-19 17:03:49.000000000 -0700
+@@ -367,7 +367,7 @@ static int wdtpci_open(struct inode *ino
+                               return -EBUSY;
+                       if (nowayout) {
+-                              MOD_INC_USE_COUNT;
++                              __module_get(THIS_MODULE);
+                       }
+                       /*
+                        *      Activate 
+--- linux-2.6.0-test1/drivers/fc4/fc.c 2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/fc4/fc.c        2003-07-19 17:03:49.000000000 -0700
+@@ -33,7 +33,6 @@
+ #include <linux/slab.h>
+ #include <linux/string.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
+ #include <asm/pgtable.h>
+ #include <asm/irq.h>
+--- linux-2.6.0-test1/drivers/fc4/fcp_impl.h   2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/fc4/fcp_impl.h  2003-07-19 17:03:49.000000000 -0700
+@@ -8,7 +8,6 @@
+ #define _FCP_SCSI_H
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include "../scsi/scsi.h"
+ #include "fc.h"
+--- linux-2.6.0-test1/drivers/i2c/i2c-dev.c    2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/i2c/i2c-dev.c   2003-07-19 17:06:13.000000000 -0700
+@@ -118,7 +118,7 @@ static void return_i2c_dev(struct i2c_de
+ static ssize_t show_dev(struct class_device *class_dev, char *buf)
+ {
+       struct i2c_dev *i2c_dev = to_i2c_dev(class_dev);
+-      return sprintf(buf, "%04x\n", MKDEV(I2C_MAJOR, i2c_dev->minor));
++      return print_dev_t(buf, MKDEV(I2C_MAJOR, i2c_dev->minor));
+ }
+ static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+--- linux-2.6.0-test1/drivers/ide/ide-disk.c   2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/ide/ide-disk.c  2003-07-19 17:07:19.000000000 -0700
+@@ -1665,6 +1665,10 @@ static void idedisk_setup (ide_drive_t *
+       drive->no_io_32bit = id->dword_io ? 1 : 0;
+       if (drive->id->cfs_enable_2 & 0x3000)
+               write_cache(drive, (id->cfs_enable_2 & 0x3000));
++
++#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT
++      HWIF(drive)->ide_dma_queued_on(drive);
++#endif
+ }
+ static int idedisk_cleanup (ide_drive_t *drive)
+--- linux-2.6.0-test1/drivers/ide/ide-dma.c    2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/ide/ide-dma.c   2003-07-19 17:07:19.000000000 -0700
+@@ -442,9 +442,10 @@ static int config_drive_for_dma (ide_dri
+  *    the driver to resolve the problem, if a DMA transfer is still
+  *    in progress we continue to wait (arguably we need to add a 
+  *    secondary 'I don't care what the drive thinks' timeout here)
+- *    Finally if we have an interrupt but for some reason got the
+- *    timeout first we complete the I/O. This can occur if an 
+- *    interrupt is lost or due to bugs.
++ *    Finally if we have an interrupt we let it complete the I/O.
++ *    But only one time - we clear expiry and if it's still not
++ *    completed after WAIT_CMD, we error and retry in PIO.
++ *    This can occur if an interrupt is lost or due to hang or bugs.
+  */
+  
+ static int dma_timer_expiry (ide_drive_t *drive)
+@@ -461,19 +462,16 @@ static int dma_timer_expiry (ide_drive_t
+       HWGROUP(drive)->expiry = NULL;  /* one free ride for now */
+       /* 1 dmaing, 2 error, 4 intr */
+-      
+-      if (dma_stat & 2) {     /* ERROR */
+-              (void) hwif->ide_dma_end(drive);
+-              return DRIVER(drive)->error(drive,
+-                      "dma_timer_expiry", hwif->INB(IDE_STATUS_REG));
+-      }
++      if (dma_stat & 2)       /* ERROR */
++              return -1;
++
+       if (dma_stat & 1)       /* DMAing */
+               return WAIT_CMD;
+       if (dma_stat & 4)       /* Got an Interrupt */
+-              HWGROUP(drive)->handler(drive);
++              return WAIT_CMD;
+-      return 0;
++      return 0;       /* Status is unknown -- reset the bus */
+ }
+ /**
+@@ -572,10 +570,6 @@ int __ide_dma_on (ide_drive_t *drive)
+       if (HWIF(drive)->ide_dma_host_on(drive))
+               return 1;
+-#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT
+-      HWIF(drive)->ide_dma_queued_on(drive);
+-#endif
+-
+       return 0;
+ }
+--- linux-2.6.0-test1/drivers/ide/ide-io.c     2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/ide/ide-io.c    2003-07-19 17:03:49.000000000 -0700
+@@ -949,14 +949,14 @@ queue_next:
+                * happens anyway when any interrupt comes in, IDE or otherwise
+                *  -- the kernel masks the IRQ while it is being handled.
+                */
+-              if (masked_irq != IDE_NO_IRQ && hwif->irq != masked_irq)
++              if (hwif->irq != masked_irq)
+                       disable_irq_nosync(hwif->irq);
+               spin_unlock(&ide_lock);
+               local_irq_enable();
+                       /* allow other IRQs while we start this request */
+               startstop = start_request(drive, rq);
+               spin_lock_irq(&ide_lock);
+-              if (masked_irq != IDE_NO_IRQ && hwif->irq != masked_irq)
++              if (hwif->irq != masked_irq)
+                       enable_irq(hwif->irq);
+               if (startstop == ide_released)
+                       goto queue_next;
+@@ -980,21 +980,25 @@ void do_ide_request(request_queue_t *q)
+  * retry the current request in pio mode instead of risking tossing it
+  * all away
+  */
+-void ide_dma_timeout_retry(ide_drive_t *drive)
++static ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error)
+ {
+       ide_hwif_t *hwif = HWIF(drive);
+       struct request *rq;
++      ide_startstop_t ret = ide_stopped;
+       /*
+        * end current dma transaction
+        */
+-      (void) hwif->ide_dma_end(drive);
+-      /*
+-       * complain a little, later we might remove some of this verbosity
+-       */
+-      printk(KERN_WARNING "%s: timeout waiting for DMA\n", drive->name);
+-      (void) hwif->ide_dma_timeout(drive);
++      if (error < 0) {
++              printk(KERN_WARNING "%s: DMA timeout error\n", drive->name);
++              (void)HWIF(drive)->ide_dma_end(drive);
++              ret = DRIVER(drive)->error(drive, "dma timeout error",
++                                              hwif->INB(IDE_STATUS_REG));
++      } else {
++              printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name);
++              (void) hwif->ide_dma_timeout(drive);
++      }
+       /*
+        * disable dma for now, but remember that we did so because of
+@@ -1018,9 +1022,9 @@ void ide_dma_timeout_retry(ide_drive_t *
+       rq->hard_cur_sectors = rq->current_nr_sectors;
+       if (rq->bio)
+               rq->buffer = NULL;
+-}
+-EXPORT_SYMBOL(ide_dma_timeout_retry);
++      return ret;
++}
+ /**
+  *    ide_timer_expiry        -       handle lack of an IDE interrupt
+@@ -1041,11 +1045,10 @@ void ide_timer_expiry (unsigned long dat
+       ide_hwgroup_t   *hwgroup = (ide_hwgroup_t *) data;
+       ide_handler_t   *handler;
+       ide_expiry_t    *expiry;
+-      unsigned long   flags;
+-      unsigned long   wait;
++      unsigned long   flags;
++      unsigned long   wait = -1;
+       spin_lock_irqsave(&ide_lock, flags);
+-      del_timer(&hwgroup->timer);
+       if ((handler = hwgroup->handler) == NULL) {
+               /*
+@@ -1072,7 +1075,7 @@ void ide_timer_expiry (unsigned long dat
+                       }
+                       if ((expiry = hwgroup->expiry) != NULL) {
+                               /* continue */
+-                              if ((wait = expiry(drive)) != 0) {
++                              if ((wait = expiry(drive)) > 0) {
+                                       /* reset timer */
+                                       hwgroup->timer.expires  = jiffies + wait;
+                                       add_timer(&hwgroup->timer);
+@@ -1107,15 +1110,15 @@ void ide_timer_expiry (unsigned long dat
+                               startstop = handler(drive);
+                       } else {
+                               if (drive->waiting_for_dma) {
+-                                      startstop = ide_stopped;
+-                                      ide_dma_timeout_retry(drive);
++                                      startstop = ide_dma_timeout_retry(drive, wait);
+                               } else
+-                                      startstop = DRIVER(drive)->error(drive, "irq timeout", hwif->INB(IDE_STATUS_REG));
++                                      startstop =
++                                      DRIVER(drive)->error(drive, "irq timeout", hwif->INB(IDE_STATUS_REG));
+                       }
+                       set_recovery_timer(hwif);
+                       drive->service_time = jiffies - drive->service_start;
+-                      enable_irq(hwif->irq);
+                       spin_lock_irq(&ide_lock);
++                      enable_irq(hwif->irq);
+                       if (startstop == ide_stopped)
+                               hwgroup->busy = 0;
+               }
+--- linux-2.6.0-test1/drivers/ide/Kconfig      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/ide/Kconfig     2003-07-19 17:03:49.000000000 -0700
+@@ -521,7 +521,7 @@ config BLK_DEV_ALI15X3
+         If you say Y here, you also need to say Y to "Use DMA by default
+         when available", above.  Please read the comments at the top of
+-        <file:drivers/ide/alim15x3.c>.
++        <file:drivers/ide/pci/alim15x3.c>.
+         If unsure, say N.
+@@ -608,7 +608,7 @@ config HPT34X_AUTODMA
+       depends on BLK_DEV_HPT34X && IDEDMA_PCI_WIP
+       help
+         This is a dangerous thing to attempt currently! Please read the
+-        comments at the top of <file:drivers/ide/hpt34x.c>.  If you say Y
++        comments at the top of <file:drivers/ide/pci/hpt34x.c>.  If you say Y
+         here, then say Y to "Use DMA by default when available" as well.
+         If unsure, say N.
+@@ -670,14 +670,14 @@ config BLK_DEV_NS87415
+         This driver adds detection and support for the NS87415 chip
+         (used in SPARC64, among others).
+-        Please read the comments at the top of <file:drivers/ide/ns87415.c>.
++        Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>.
+ config BLK_DEV_OPTI621
+       tristate "OPTi 82C621 chipset enhanced support (EXPERIMENTAL)"
+       depends on PCI && BLK_DEV_IDEPCI && EXPERIMENTAL
+       help
+         This is a driver for the OPTi 82C621 EIDE controller.
+-        Please read the comments at the top of <file:drivers/ide/opti621.c>.
++        Please read the comments at the top of <file:drivers/ide/pci/opti621.c>.
+ config BLK_DEV_PDC202XX_OLD
+       tristate "PROMISE PDC202{46|62|65|67} support"
+@@ -696,7 +696,7 @@ config PDC202XX_BURST
+         when the PDC20265 BIOS has been disabled (for faster boot up).
+         Please read the comments at the top of
+-        <file:drivers/ide/pdc202xx.c>.
++        <file:drivers/ide/pci/pdc202xx_old.c>.
+         If unsure, say N.
+@@ -754,7 +754,7 @@ config BLK_DEV_SIS5513
+         If you say Y here, you need to say Y to "Use DMA by default when
+         available" as well.
+-        Please read the comments at the top of <file:drivers/ide/sis5513.c>.
++        Please read the comments at the top of <file:drivers/ide/pci/sis5513.c>.
+ config BLK_DEV_SLC90E66
+       tristate "SLC90E66 chipset support"
+@@ -770,7 +770,7 @@ config BLK_DEV_SLC90E66
+         available" as well.
+         Please read the comments at the top of
+-        drivers/ide/slc90e66.c.
++        drivers/ide/pci/slc90e66.c.
+ config BLK_DEV_TRM290
+       tristate "Tekram TRM290 chipset support"
+@@ -779,7 +779,7 @@ config BLK_DEV_TRM290
+         This driver adds support for bus master DMA transfers
+         using the Tekram TRM290 PCI IDE chip. Volunteers are
+         needed for further tweaking and development.
+-        Please read the comments at the top of <file:drivers/ide/trm290.c>.
++        Please read the comments at the top of <file:drivers/ide/pci/trm290.c>.
+ config BLK_DEV_VIA82CXXX
+       tristate "VIA82CXXX chipset support"
+@@ -1010,7 +1010,7 @@ config BLK_DEV_ALI14XX
+         boot parameter.  It enables support for the secondary IDE interface
+         of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster
+         I/O speeds to be set as well.  See the files
+-        <file:Documentation/ide.txt> and <file:drivers/ide/ali14xx.c> for
++        <file:Documentation/ide.txt> and <file:drivers/ide/legacy/ali14xx.c> for
+         more info.
+ config BLK_DEV_DTC2278
+@@ -1021,7 +1021,7 @@ config BLK_DEV_DTC2278
+         boot parameter. It enables support for the secondary IDE interface
+         of the DTC-2278 card, and permits faster I/O speeds to be set as
+         well. See the <file:Documentation/ide.txt> and
+-        <file:drivers/ide/dtc2278.c> files for more info.
++        <file:drivers/ide/legacy/dtc2278.c> files for more info.
+ config BLK_DEV_HT6560B
+       tristate "Holtek HT6560B support"
+@@ -1031,7 +1031,7 @@ config BLK_DEV_HT6560B
+         boot parameter. It enables support for the secondary IDE interface
+         of the Holtek card, and permits faster I/O speeds to be set as well.
+         See the <file:Documentation/ide.txt> and
+-        <file:drivers/ide/ht6560b.c> files for more info.
++        <file:drivers/ide/legacy/ht6560b.c> files for more info.
+ config BLK_DEV_PDC4030
+       tristate "PROMISE DC4030 support (EXPERIMENTAL)"
+@@ -1044,7 +1044,7 @@ config BLK_DEV_PDC4030
+         supported (and probably never will be since I don't think the cards
+         support them). This driver is enabled at runtime using the "ide0=dc4030"
+         or "ide1=dc4030" kernel boot parameter. See the
+-        <file:drivers/ide/pdc4030.c> file for more info.
++        <file:drivers/ide/legacy/pdc4030.c> file for more info.
+ config BLK_DEV_QD65XX
+       tristate "QDI QD65xx support"
+@@ -1052,7 +1052,7 @@ config BLK_DEV_QD65XX
+       help
+         This driver is enabled at runtime using the "ide0=qd65xx" kernel
+         boot parameter.  It permits faster I/O speeds to be set.  See the
+-        <file:Documentation/ide.txt> and <file:drivers/ide/qd65xx.c> for
++        <file:Documentation/ide.txt> and <file:drivers/ide/legacy/qd65xx.c> for
+         more info.
+ config BLK_DEV_UMC8672
+@@ -1063,7 +1063,7 @@ config BLK_DEV_UMC8672
+         boot parameter. It enables support for the secondary IDE interface
+         of the UMC-8672, and permits faster I/O speeds to be set as well.
+         See the files <file:Documentation/ide.txt> and
+-        <file:drivers/ide/umc8672.c> for more info.
++        <file:drivers/ide/legacy/umc8672.c> for more info.
+ config BLK_DEV_HD_ONLY
+       bool "Old hard disk (MFM/RLL/IDE) driver"
+@@ -1132,7 +1132,7 @@ config BLK_DEV_PDC202XX
+         available" as well.
+         Please read the comments at the top of
+-        <file:drivers/ide/pdc202xx.c>.
++        <file:drivers/ide/pdc202xx_old.c>.
+         If unsure, say N.
+--- linux-2.6.0-test1/drivers/ide/legacy/hd98.c        2003-06-14 12:18:28.000000000 -0700
++++ 25/drivers/ide/legacy/hd98.c       2003-07-19 17:03:49.000000000 -0700
+@@ -46,8 +46,6 @@
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
+-
+ #include "io_ports.h"
+ #ifdef __arm__
+--- linux-2.6.0-test1/drivers/ide/legacy/hd.c  2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/ide/legacy/hd.c 2003-07-19 17:03:49.000000000 -0700
+@@ -26,7 +26,7 @@
+ /* Uncomment the following if you want verbose error reports. */
+ /* #define VERBOSE_ERRORS */
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/errno.h>
+ #include <linux/signal.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/ide/ppc/mpc8xx.c 2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/ide/ppc/mpc8xx.c        2003-07-19 17:03:49.000000000 -0700
+@@ -27,7 +27,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/reboot.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
+ #include <linux/ioport.h>
+ #include <linux/ide.h>
+ #include <linux/bootmem.h>
+--- linux-2.6.0-test1/drivers/ieee1394/amdtp.c 2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/ieee1394/amdtp.c        2003-07-19 17:03:49.000000000 -0700
+@@ -62,6 +62,12 @@
+  * - Maybe make an ALSA interface, that is, create a file_ops
+  *   implementation that recognizes ALSA ioctls and uses defaults for
+  *   things that can't be controlled through ALSA (iso channel).
++ *
++ *   Changes:
++ *
++ * - Audit copy_from_user in amdtp_write.
++ *                           Daniele Bellucci <bellucda@tiscali.it>
++ *
+  */
+ #include <linux/module.h>
+@@ -1112,7 +1118,8 @@ static ssize_t amdtp_write(struct file *
+       for (i = 0; i < count; i += length) {
+               p = buffer_put_bytes(s->input, count - i, &length);
+-              copy_from_user(p, buffer + i, length);
++              if (copy_from_user(p, buffer + i, length))
++                      return -EFAULT;
+               if (s->input->length < s->input->size)
+                       continue;
+               
+--- linux-2.6.0-test1/drivers/ieee1394/sbp2.c  2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/ieee1394/sbp2.c 2003-07-19 17:03:49.000000000 -0700
+@@ -52,7 +52,7 @@
+ #include <linux/delay.h>
+ #include <linux/sched.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/smp_lock.h>
+ #include <linux/init.h>
+ #include <linux/version.h>
+--- linux-2.6.0-test1/drivers/input/keyboard/sunkbd.c  2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/input/keyboard/sunkbd.c 2003-07-19 17:03:49.000000000 -0700
+@@ -80,8 +80,8 @@ struct sunkbd {
+       char name[64];
+       char phys[32];
+       char type;
+-      char reset;
+-      char layout;
++      volatile char reset;
++      volatile char layout;
+ };
+ /*
+--- linux-2.6.0-test1/drivers/input/mouse/psmouse-base.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/input/mouse/psmouse-base.c      2003-07-19 17:07:16.000000000 -0700
+@@ -200,7 +200,7 @@ int psmouse_command(struct psmouse *psmo
+       psmouse->cmdcnt = receive;
+       if (command == PSMOUSE_CMD_RESET_BAT)
+-                timeout = 2000000; /* 2 sec */
++                timeout = 4000000; /* 4 sec */
+       if (command & 0xff)
+               if (psmouse_sendbyte(psmouse, command & 0xff))
+--- linux-2.6.0-test1/drivers/md/dm.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/md/dm.c 2003-07-19 17:03:49.000000000 -0700
+@@ -8,7 +8,6 @@
+ #include <linux/init.h>
+ #include <linux/module.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/bio.h>
+ #include <linux/mempool.h>
+@@ -63,6 +62,12 @@ struct mapped_device {
+        * io objects are allocated from here.
+        */
+       mempool_t *io_pool;
++
++      /*
++       * Event handling.
++       */
++      uint32_t event_nr;
++      wait_queue_head_t eventq;
+ };
+ #define MIN_IOS 256
+@@ -510,6 +515,11 @@ static int dm_request(request_queue_t *q
+               down_read(&md->lock);
+       }
++      if (!md->map) {
++              bio_io_error(bio, bio->bi_size);
++              return 0;
++      }
++
+       __split_bio(md, bio);
+       up_read(&md->lock);
+       return 0;
+@@ -619,6 +629,8 @@ static struct mapped_device *alloc_dev(u
+       atomic_set(&md->pending, 0);
+       init_waitqueue_head(&md->wait);
++      init_waitqueue_head(&md->eventq);
++
+       return md;
+ }
+@@ -634,6 +646,16 @@ static void free_dev(struct mapped_devic
+ /*
+  * Bind a table to the device.
+  */
++static void event_callback(void *context)
++{
++      struct mapped_device *md = (struct mapped_device *) context;
++
++      down_write(&md->lock);
++      md->event_nr++;
++      wake_up_interruptible(&md->eventq);
++      up_write(&md->lock);
++}
++
+ static int __bind(struct mapped_device *md, struct dm_table *t)
+ {
+       request_queue_t *q = &md->queue;
+@@ -645,6 +667,8 @@ static int __bind(struct mapped_device *
+       if (size == 0)
+               return 0;
++      dm_table_event_callback(md->map, event_callback, md);
++
+       dm_table_get(t);
+       dm_table_set_restrictions(t, q);
+       return 0;
+@@ -652,6 +676,10 @@ static int __bind(struct mapped_device *
+ static void __unbind(struct mapped_device *md)
+ {
++      if (!md->map)
++              return;
++
++      dm_table_event_callback(md->map, NULL, NULL);
+       dm_table_put(md->map);
+       md->map = NULL;
+       set_capacity(md->disk, 0);
+@@ -661,35 +689,26 @@ static void __unbind(struct mapped_devic
+  * Constructor for a new device.
+  */
+ static int create_aux(unsigned int minor, int persistent,
+-                    struct dm_table *table, struct mapped_device **result)
++                    struct mapped_device **result)
+ {
+-      int r;
+       struct mapped_device *md;
+       md = alloc_dev(minor, persistent);
+       if (!md)
+               return -ENXIO;
+-      r = __bind(md, table);
+-      if (r) {
+-              free_dev(md);
+-              return r;
+-      }
+-      dm_table_resume_targets(md->map);
+-
+       *result = md;
+       return 0;
+ }
+-int dm_create(struct dm_table *table, struct mapped_device **result)
++int dm_create(struct mapped_device **result)
+ {
+-      return create_aux(0, 0, table, result);
++      return create_aux(0, 0, result);
+ }
+-int dm_create_with_minor(unsigned int minor,
+-                       struct dm_table *table, struct mapped_device **result)
++int dm_create_with_minor(unsigned int minor, struct mapped_device **result)
+ {
+-      return create_aux(minor, 1, table, result);
++      return create_aux(minor, 1, result);
+ }
+ void dm_get(struct mapped_device *md)
+@@ -700,7 +719,7 @@ void dm_get(struct mapped_device *md)
+ void dm_put(struct mapped_device *md)
+ {
+       if (atomic_dec_and_test(&md->holders)) {
+-              if (!test_bit(DMF_SUSPENDED, &md->flags))
++              if (!test_bit(DMF_SUSPENDED, &md->flags) && md->map)
+                       dm_table_suspend_targets(md->map);
+               __unbind(md);
+               free_dev(md);
+@@ -790,7 +809,8 @@ int dm_suspend(struct mapped_device *md)
+       down_write(&md->lock);
+       remove_wait_queue(&md->wait, &wait);
+       set_bit(DMF_SUSPENDED, &md->flags);
+-      dm_table_suspend_targets(md->map);
++      if (md->map)
++              dm_table_suspend_targets(md->map);
+       up_write(&md->lock);
+       return 0;
+@@ -801,7 +821,8 @@ int dm_resume(struct mapped_device *md)
+       struct deferred_io *def;
+       down_write(&md->lock);
+-      if (!test_bit(DMF_SUSPENDED, &md->flags) ||
++      if (!md->map ||
++          !test_bit(DMF_SUSPENDED, &md->flags) ||
+           !dm_table_get_size(md->map)) {
+               up_write(&md->lock);
+               return -EINVAL;
+@@ -820,6 +841,42 @@ int dm_resume(struct mapped_device *md)
+       return 0;
+ }
++/*-----------------------------------------------------------------
++ * Event notification.
++ *---------------------------------------------------------------*/
++uint32_t dm_get_event_nr(struct mapped_device *md)
++{
++      uint32_t r;
++
++      down_read(&md->lock);
++      r = md->event_nr;
++      up_read(&md->lock);
++
++      return r;
++}
++
++int dm_add_wait_queue(struct mapped_device *md, wait_queue_t *wq,
++                    uint32_t event_nr)
++{
++      down_write(&md->lock);
++      if (event_nr != md->event_nr) {
++              up_write(&md->lock);
++              return 1;
++      }
++
++      add_wait_queue(&md->eventq, wq);
++      up_write(&md->lock);
++
++      return 0;
++}
++
++void dm_remove_wait_queue(struct mapped_device *md, wait_queue_t *wq)
++{
++      down_write(&md->lock);
++      remove_wait_queue(&md->eventq, wq);
++      up_write(&md->lock);
++}
++
+ /*
+  * The gendisk is only valid as long as you have a reference
+  * count on 'md'.
+@@ -835,7 +892,8 @@ struct dm_table *dm_get_table(struct map
+       down_read(&md->lock);
+       t = md->map;
+-      dm_table_get(t);
++      if (t)
++              dm_table_get(t);
+       up_read(&md->lock);
+       return t;
+--- linux-2.6.0-test1/drivers/md/dm.h  2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/md/dm.h 2003-07-19 17:03:49.000000000 -0700
+@@ -51,9 +51,8 @@ struct mapped_device;
+  * Functions for manipulating a struct mapped_device.
+  * Drop the reference with dm_put when you finish with the object.
+  *---------------------------------------------------------------*/
+-int dm_create(struct dm_table *table, struct mapped_device **md);
+-int dm_create_with_minor(unsigned int minor, struct dm_table *table,
+-                       struct mapped_device **md);
++int dm_create(struct mapped_device **md);
++int dm_create_with_minor(unsigned int minor, struct mapped_device **md);
+ /*
+  * Reference counting for md.
+@@ -79,6 +78,14 @@ int dm_swap_table(struct mapped_device *
+ struct dm_table *dm_get_table(struct mapped_device *md);
+ /*
++ * Event functions.
++ */
++uint32_t dm_get_event_nr(struct mapped_device *md);
++int dm_add_wait_queue(struct mapped_device *md, wait_queue_t *wq,
++                    uint32_t event_nr);
++void dm_remove_wait_queue(struct mapped_device *md, wait_queue_t *wq);
++
++/*
+  * Info functions.
+  */
+ struct gendisk *dm_disk(struct mapped_device *md);
+@@ -96,6 +103,8 @@ void dm_table_put(struct dm_table *t);
+ int dm_table_add_target(struct dm_table *t, const char *type,
+                       sector_t start, sector_t len, char *params);
+ int dm_table_complete(struct dm_table *t);
++void dm_table_event_callback(struct dm_table *t,
++                           void (*fn)(void *), void *context);
+ void dm_table_event(struct dm_table *t);
+ sector_t dm_table_get_size(struct dm_table *t);
+ struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index);
+@@ -104,7 +113,6 @@ void dm_table_set_restrictions(struct dm
+ unsigned int dm_table_get_num_targets(struct dm_table *t);
+ struct list_head *dm_table_get_devices(struct dm_table *t);
+ int dm_table_get_mode(struct dm_table *t);
+-void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq);
+ void dm_table_suspend_targets(struct dm_table *t);
+ void dm_table_resume_targets(struct dm_table *t);
+--- linux-2.6.0-test1/drivers/md/dm-ioctl.c    2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/md/dm-ioctl.c   2003-07-19 17:03:49.000000000 -0700
+@@ -1,1134 +1,13 @@
+ /*
+- * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
++ * Copyright (C) 2003 Sistina Software (UK) Limited.
+  *
+  * This file is released under the GPL.
+  */
+-#include "dm.h"
+-
+-#include <linux/module.h>
+-#include <linux/vmalloc.h>
+-#include <linux/miscdevice.h>
+ #include <linux/dm-ioctl.h>
+-#include <linux/init.h>
+-#include <linux/wait.h>
+-#include <linux/blk.h>
+-#include <linux/slab.h>
+-#include <linux/devfs_fs_kernel.h>
+-
+-#include <asm/uaccess.h>
+-
+-#define DM_DRIVER_EMAIL "dm@uk.sistina.com"
+-
+-/*-----------------------------------------------------------------
+- * The ioctl interface needs to be able to look up devices by
+- * name or uuid.
+- *---------------------------------------------------------------*/
+-struct hash_cell {
+-      struct list_head name_list;
+-      struct list_head uuid_list;
+-
+-      char *name;
+-      char *uuid;
+-      struct mapped_device *md;
+-};
+-
+-#define NUM_BUCKETS 64
+-#define MASK_BUCKETS (NUM_BUCKETS - 1)
+-static struct list_head _name_buckets[NUM_BUCKETS];
+-static struct list_head _uuid_buckets[NUM_BUCKETS];
+-
+-void dm_hash_remove_all(void);
+-
+-/*
+- * Guards access to all three tables.
+- */
+-static DECLARE_RWSEM(_hash_lock);
+-
+-static void init_buckets(struct list_head *buckets)
+-{
+-      unsigned int i;
+-
+-      for (i = 0; i < NUM_BUCKETS; i++)
+-              INIT_LIST_HEAD(buckets + i);
+-}
+-
+-int dm_hash_init(void)
+-{
+-      init_buckets(_name_buckets);
+-      init_buckets(_uuid_buckets);
+-      devfs_mk_dir(DM_DIR);
+-      return 0;
+-}
+-
+-void dm_hash_exit(void)
+-{
+-      dm_hash_remove_all();
+-      devfs_remove(DM_DIR);
+-}
+-
+-/*-----------------------------------------------------------------
+- * Hash function:
+- * We're not really concerned with the str hash function being
+- * fast since it's only used by the ioctl interface.
+- *---------------------------------------------------------------*/
+-static unsigned int hash_str(const char *str)
+-{
+-      const unsigned int hash_mult = 2654435387U;
+-      unsigned int h = 0;
+-
+-      while (*str)
+-              h = (h + (unsigned int) *str++) * hash_mult;
+-
+-      return h & MASK_BUCKETS;
+-}
+-
+-/*-----------------------------------------------------------------
+- * Code for looking up a device by name
+- *---------------------------------------------------------------*/
+-static struct hash_cell *__get_name_cell(const char *str)
+-{
+-      struct list_head *tmp;
+-      struct hash_cell *hc;
+-      unsigned int h = hash_str(str);
+-
+-      list_for_each (tmp, _name_buckets + h) {
+-              hc = list_entry(tmp, struct hash_cell, name_list);
+-              if (!strcmp(hc->name, str))
+-                      return hc;
+-      }
+-
+-      return NULL;
+-}
+-
+-static struct hash_cell *__get_uuid_cell(const char *str)
+-{
+-      struct list_head *tmp;
+-      struct hash_cell *hc;
+-      unsigned int h = hash_str(str);
+-
+-      list_for_each (tmp, _uuid_buckets + h) {
+-              hc = list_entry(tmp, struct hash_cell, uuid_list);
+-              if (!strcmp(hc->uuid, str))
+-                      return hc;
+-      }
+-
+-      return NULL;
+-}
+-
+-/*-----------------------------------------------------------------
+- * Inserting, removing and renaming a device.
+- *---------------------------------------------------------------*/
+-static inline char *kstrdup(const char *str)
+-{
+-      char *r = kmalloc(strlen(str) + 1, GFP_KERNEL);
+-      if (r)
+-              strcpy(r, str);
+-      return r;
+-}
+-
+-static struct hash_cell *alloc_cell(const char *name, const char *uuid,
+-                                  struct mapped_device *md)
+-{
+-      struct hash_cell *hc;
+-
+-      hc = kmalloc(sizeof(*hc), GFP_KERNEL);
+-      if (!hc)
+-              return NULL;
+-
+-      hc->name = kstrdup(name);
+-      if (!hc->name) {
+-              kfree(hc);
+-              return NULL;
+-      }
+-
+-      if (!uuid)
+-              hc->uuid = NULL;
+-
+-      else {
+-              hc->uuid = kstrdup(uuid);
+-              if (!hc->uuid) {
+-                      kfree(hc->name);
+-                      kfree(hc);
+-                      return NULL;
+-              }
+-      }
+-
+-      INIT_LIST_HEAD(&hc->name_list);
+-      INIT_LIST_HEAD(&hc->uuid_list);
+-      hc->md = md;
+-      return hc;
+-}
+-
+-static void free_cell(struct hash_cell *hc)
+-{
+-      if (hc) {
+-              kfree(hc->name);
+-              kfree(hc->uuid);
+-              kfree(hc);
+-      }
+-}
+-
+-/*
+- * devfs stuff.
+- */
+-static int register_with_devfs(struct hash_cell *hc)
+-{
+-      struct gendisk *disk = dm_disk(hc->md);
+-
+-      devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
+-                     S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
+-                     DM_DIR "/%s", hc->name);
+-      return 0;
+-}
+-
+-static int unregister_with_devfs(struct hash_cell *hc)
+-{
+-      devfs_remove(DM_DIR"/%s", hc->name);
+-      return 0;
+-}
+-
+-/*
+- * The kdev_t and uuid of a device can never change once it is
+- * initially inserted.
+- */
+-int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md)
+-{
+-      struct hash_cell *cell;
+-
+-      /*
+-       * Allocate the new cells.
+-       */
+-      cell = alloc_cell(name, uuid, md);
+-      if (!cell)
+-              return -ENOMEM;
+-
+-      /*
+-       * Insert the cell into all three hash tables.
+-       */
+-      down_write(&_hash_lock);
+-      if (__get_name_cell(name))
+-              goto bad;
+-
+-      list_add(&cell->name_list, _name_buckets + hash_str(name));
+-
+-      if (uuid) {
+-              if (__get_uuid_cell(uuid)) {
+-                      list_del(&cell->name_list);
+-                      goto bad;
+-              }
+-              list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid));
+-      }
+-      register_with_devfs(cell);
+-      dm_get(md);
+-      up_write(&_hash_lock);
+-
+-      return 0;
+-
+- bad:
+-      up_write(&_hash_lock);
+-      free_cell(cell);
+-      return -EBUSY;
+-}
+-
+-void __hash_remove(struct hash_cell *hc)
+-{
+-      /* remove from the dev hash */
+-      list_del(&hc->uuid_list);
+-      list_del(&hc->name_list);
+-      unregister_with_devfs(hc);
+-      dm_put(hc->md);
+-      free_cell(hc);
+-}
+-
+-void dm_hash_remove_all(void)
+-{
+-      int i;
+-      struct hash_cell *hc;
+-      struct list_head *tmp, *n;
+-
+-      down_write(&_hash_lock);
+-      for (i = 0; i < NUM_BUCKETS; i++) {
+-              list_for_each_safe (tmp, n, _name_buckets + i) {
+-                      hc = list_entry(tmp, struct hash_cell, name_list);
+-                      __hash_remove(hc);
+-              }
+-      }
+-      up_write(&_hash_lock);
+-}
+-
+-int dm_hash_rename(const char *old, const char *new)
+-{
+-      char *new_name, *old_name;
+-      struct hash_cell *hc;
+-
+-      /*
+-       * duplicate new.
+-       */
+-      new_name = kstrdup(new);
+-      if (!new_name)
+-              return -ENOMEM;
+-
+-      down_write(&_hash_lock);
+-
+-      /*
+-       * Is new free ?
+-       */
+-      hc = __get_name_cell(new);
+-      if (hc) {
+-              DMWARN("asked to rename to an already existing name %s -> %s",
+-                     old, new);
+-              up_write(&_hash_lock);
+-              kfree(new_name);
+-              return -EBUSY;
+-      }
+-
+-      /*
+-       * Is there such a device as 'old' ?
+-       */
+-      hc = __get_name_cell(old);
+-      if (!hc) {
+-              DMWARN("asked to rename a non existent device %s -> %s",
+-                     old, new);
+-              up_write(&_hash_lock);
+-              kfree(new_name);
+-              return -ENXIO;
+-      }
+-
+-      /*
+-       * rename and move the name cell.
+-       */
+-      unregister_with_devfs(hc);
+-
+-      list_del(&hc->name_list);
+-      old_name = hc->name;
+-      hc->name = new_name;
+-      list_add(&hc->name_list, _name_buckets + hash_str(new_name));
+-
+-      /* rename the device node in devfs */
+-      register_with_devfs(hc);
+-
+-      up_write(&_hash_lock);
+-      kfree(old_name);
+-      return 0;
+-}
+-
+-
+-/*-----------------------------------------------------------------
+- * Implementation of the ioctl commands
+- *---------------------------------------------------------------*/
+-
+-/*
+- * All the ioctl commands get dispatched to functions with this
+- * prototype.
+- */
+-typedef int (*ioctl_fn)(struct dm_ioctl *param, struct dm_ioctl *user);
+-
+-/*
+- * Check a string doesn't overrun the chunk of
+- * memory we copied from userland.
+- */
+-static int valid_str(char *str, void *begin, void *end)
+-{
+-      while (((void *) str >= begin) && ((void *) str < end))
+-              if (!*str++)
+-                      return 0;
+-
+-      return -EINVAL;
+-}
+-
+-static int next_target(struct dm_target_spec *last, uint32_t next,
+-                     void *begin, void *end,
+-                     struct dm_target_spec **spec, char **params)
+-{
+-      *spec = (struct dm_target_spec *)
+-          ((unsigned char *) last + next);
+-      *params = (char *) (*spec + 1);
+-
+-      if (*spec < (last + 1) || ((void *) *spec > end))
+-              return -EINVAL;
+-
+-      return valid_str(*params, begin, end);
+-}
+-
+-static int populate_table(struct dm_table *table, struct dm_ioctl *args)
+-{
+-      int r, first = 1;
+-      unsigned int i = 0;
+-      struct dm_target_spec *spec;
+-      char *params;
+-      void *begin, *end;
+-
+-      if (!args->target_count) {
+-              DMWARN("populate_table: no targets specified");
+-              return -EINVAL;
+-      }
+-
+-      begin = (void *) args;
+-      end = begin + args->data_size;
+-
+-      for (i = 0; i < args->target_count; i++) {
+-
+-              if (first)
+-                      r = next_target((struct dm_target_spec *) args,
+-                                      args->data_start,
+-                                      begin, end, &spec, &params);
+-              else
+-                      r = next_target(spec, spec->next, begin, end,
+-                                      &spec, &params);
+-
+-              if (r) {
+-                      DMWARN("unable to find target");
+-                      return -EINVAL;
+-              }
+-
+-              r = dm_table_add_target(table, spec->target_type,
+-                                      (sector_t) spec->sector_start,
+-                                      (sector_t) spec->length,
+-                                      params);
+-              if (r) {
+-                      DMWARN("internal error adding target to table");
+-                      return -EINVAL;
+-              }
+-
+-              first = 0;
+-      }
+-
+-      return dm_table_complete(table);
+-}
+-
+-/*
+- * Round up the ptr to the next 'align' boundary.  Obviously
+- * 'align' must be a power of 2.
+- */
+-static inline void *align_ptr(void *ptr, unsigned int align)
+-{
+-      align--;
+-      return (void *) (((unsigned long) (ptr + align)) & ~align);
+-}
+-
+-/*
+- * Copies a dm_ioctl and an optional additional payload to
+- * userland.
+- */
+-static int results_to_user(struct dm_ioctl *user, struct dm_ioctl *param,
+-                         void *data, uint32_t len)
+-{
+-      int r;
+-      void *ptr = NULL;
+-
+-      if (data) {
+-              ptr = align_ptr(user + 1, sizeof(unsigned long));
+-              param->data_start = ptr - (void *) user;
+-      }
+-
+-      /*
+-       * The version number has already been filled in, so we
+-       * just copy later fields.
+-       */
+-      r = copy_to_user(&user->data_size, &param->data_size,
+-                       sizeof(*param) - sizeof(param->version));
+-      if (r)
+-              return -EFAULT;
+-
+-      if (data) {
+-              if (param->data_start + len > param->data_size)
+-                      return -ENOSPC;
+-
+-              if (copy_to_user(ptr, data, len))
+-                      r = -EFAULT;
+-      }
+-
+-      return r;
+-}
+-
+-/*
+- * Fills in a dm_ioctl structure, ready for sending back to
+- * userland.
+- */
+-static int __info(struct mapped_device *md, struct dm_ioctl *param)
+-{
+-      struct dm_table *table;
+-      struct block_device *bdev;
+-      struct gendisk *disk = dm_disk(md);
+-
+-      param->flags = DM_EXISTS_FLAG;
+-      if (dm_suspended(md))
+-              param->flags |= DM_SUSPEND_FLAG;
+-
+-      bdev = bdget_disk(disk, 0);
+-      if (!bdev)
+-              return -ENXIO;
+-
+-      param->dev = bdev->bd_dev;
+-      param->open_count = bdev->bd_openers;
+-      bdput(bdev);
+-
+-      if (disk->policy)
+-              param->flags |= DM_READONLY_FLAG;
+-
+-      table = dm_get_table(md);
+-      param->target_count = dm_table_get_num_targets(table);
+-      dm_table_put(table);
+-
+-      return 0;
+-}
+-
+-/*
+- * Always use UUID for lookups if it's present, otherwise use name.
+- */
+-static inline struct mapped_device *find_device(struct dm_ioctl *param)
+-{
+-      struct hash_cell *hc;
+-      struct mapped_device *md = NULL;
+-
+-      down_read(&_hash_lock);
+-      hc = *param->uuid ? __get_uuid_cell(param->uuid) :
+-              __get_name_cell(param->name);
+-      if (hc) {
+-              md = hc->md;
+-
+-              /*
+-               * Sneakily write in both the name and the uuid
+-               * while we have the cell.
+-               */
+-              strlcpy(param->name, hc->name, sizeof(param->name));
+-              if (hc->uuid)
+-                      strlcpy(param->uuid, hc->uuid, sizeof(param->uuid));
+-              else
+-                      param->uuid[0] = '\0';
+-
+-              dm_get(md);
+-      }
+-      up_read(&_hash_lock);
+-
+-      return md;
+-}
+-
+-#define ALIGNMENT sizeof(int)
+-static void *_align(void *ptr, unsigned int a)
+-{
+-      register unsigned long align = --a;
+-
+-      return (void *) (((unsigned long) ptr + align) & ~align);
+-}
+-
+-/*
+- * Copies device info back to user space, used by
+- * the create and info ioctls.
+- */
+-static int info(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      struct mapped_device *md;
+-
+-      param->flags = 0;
+-
+-      md = find_device(param);
+-      if (!md)
+-              /*
+-               * Device not found - returns cleared exists flag.
+-               */
+-              goto out;
+-
+-      __info(md, param);
+-      dm_put(md);
+-
+-      out:
+-      return results_to_user(user, param, NULL, 0);
+-}
+-
+-static inline int get_mode(struct dm_ioctl *param)
+-{
+-      int mode = FMODE_READ | FMODE_WRITE;
+-
+-      if (param->flags & DM_READONLY_FLAG)
+-              mode = FMODE_READ;
+-
+-      return mode;
+-}
+-
+-static int check_name(const char *name)
+-{
+-      if (name[0] == '/') {
+-              DMWARN("invalid device name");
+-              return -EINVAL;
+-      }
+-
+-      return 0;
+-}
+-
+-static int create(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      int r;
+-      struct dm_table *t;
+-      struct mapped_device *md;
+-
+-      r = check_name(param->name);
+-      if (r)
+-              return r;
+-
+-      r = dm_table_create(&t, get_mode(param));
+-      if (r)
+-              return r;
+-
+-      r = populate_table(t, param);
+-      if (r) {
+-              dm_table_put(t);
+-              return r;
+-      }
+-
+-      if (param->flags & DM_PERSISTENT_DEV_FLAG)
+-              r = dm_create_with_minor(minor(to_kdev_t(param->dev)), t, &md);
+-      else
+-              r = dm_create(t, &md);
+-
+-      if (r) {
+-              dm_table_put(t);
+-              return r;
+-      }
+-      dm_table_put(t);        /* md will have grabbed its own reference */
+-
+-      set_disk_ro(dm_disk(md), (param->flags & DM_READONLY_FLAG) ? 1 : 0);
+-      r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
+-      dm_put(md);
+-
+-      return r ? r : info(param, user);
+-}
+-
+-/*
+- * Build up the status struct for each target
+- */
+-static int __status(struct mapped_device *md, struct dm_ioctl *param,
+-                  char *outbuf, size_t *len)
+-{
+-      unsigned int i, num_targets;
+-      struct dm_target_spec *spec;
+-      char *outptr;
+-      status_type_t type;
+-      struct dm_table *table = dm_get_table(md);
+-
+-      if (param->flags & DM_STATUS_TABLE_FLAG)
+-              type = STATUSTYPE_TABLE;
+-      else
+-              type = STATUSTYPE_INFO;
+-
+-      outptr = outbuf;
+-
+-      /* Get all the target info */
+-      num_targets = dm_table_get_num_targets(table);
+-      for (i = 0; i < num_targets; i++) {
+-              struct dm_target *ti = dm_table_get_target(table, i);
+-
+-              if (outptr - outbuf +
+-                  sizeof(struct dm_target_spec) > param->data_size) {
+-                      dm_table_put(table);
+-                      return -ENOMEM;
+-              }
+-
+-              spec = (struct dm_target_spec *) outptr;
+-
+-              spec->status = 0;
+-              spec->sector_start = ti->begin;
+-              spec->length = ti->len;
+-              strlcpy(spec->target_type, ti->type->name,
+-                      sizeof(spec->target_type));
+-
+-              outptr += sizeof(struct dm_target_spec);
+-
+-              /* Get the status/table string from the target driver */
+-              if (ti->type->status)
+-                      ti->type->status(ti, type, outptr,
+-                                       outbuf + param->data_size - outptr);
+-              else
+-                      outptr[0] = '\0';
+-
+-              outptr += strlen(outptr) + 1;
+-              _align(outptr, ALIGNMENT);
+-              spec->next = outptr - outbuf;
+-      }
+-
+-      param->target_count = num_targets;
+-      *len = outptr - outbuf;
+-      dm_table_put(table);
+-
+-      return 0;
+-}
+-
+-/*
+- * Return the status of a device as a text string for each
+- * target.
+- */
+-static int get_status(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      struct mapped_device *md;
+-      size_t len = 0;
+-      int ret;
+-      char *outbuf = NULL;
+-
+-      md = find_device(param);
+-      if (!md)
+-              /*
+-               * Device not found - returns cleared exists flag.
+-               */
+-              goto out;
+-
+-      /* We haven't a clue how long the resultant data will be so
+-         just allocate as much as userland has allowed us and make sure
+-         we don't overun it */
+-      outbuf = kmalloc(param->data_size, GFP_KERNEL);
+-      if (!outbuf)
+-              goto out;
+-      /*
+-       * Get the status of all targets
+-       */
+-      __status(md, param, outbuf, &len);
+-
+-      /*
+-       * Setup the basic dm_ioctl structure.
+-       */
+-      __info(md, param);
+-
+-      out:
+-      if (md)
+-              dm_put(md);
+-
+-      ret = results_to_user(user, param, outbuf, len);
+-
+-      if (outbuf)
+-              kfree(outbuf);
+-
+-      return ret;
+-}
+-
+-/*
+- * Wait for a device to report an event
+- */
+-static int wait_device_event(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      struct mapped_device *md;
+-      struct dm_table *table;
+-      DECLARE_WAITQUEUE(wq, current);
+-
+-      md = find_device(param);
+-      if (!md)
+-              /*
+-               * Device not found - returns cleared exists flag.
+-               */
+-              goto out;
+-
+-      /*
+-       * Setup the basic dm_ioctl structure.
+-       */
+-      __info(md, param);
+-
+-      /*
+-       * Wait for a notification event
+-       */
+-      set_current_state(TASK_INTERRUPTIBLE);
+-      table = dm_get_table(md);
+-      dm_table_add_wait_queue(table, &wq);
+-      dm_table_put(table);
+-      dm_put(md);
+-
+-      schedule();
+-
+-      out:
+-      return results_to_user(user, param, NULL, 0);
+-}
+-
+-/*
+- * Retrieves a list of devices used by a particular dm device.
+- */
+-static int dep(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      int r;
+-      unsigned int count;
+-      struct mapped_device *md;
+-      struct list_head *tmp;
+-      size_t len = 0;
+-      struct dm_target_deps *deps = NULL;
+-      struct dm_table *table;
+-
+-      md = find_device(param);
+-      if (!md)
+-              goto out;
+-      table = dm_get_table(md);
+-
+-      /*
+-       * Setup the basic dm_ioctl structure.
+-       */
+-      __info(md, param);
+-
+-      /*
+-       * Count the devices.
+-       */
+-      count = 0;
+-      list_for_each(tmp, dm_table_get_devices(table))
+-          count++;
+-
+-      /*
+-       * Allocate a kernel space version of the dm_target_status
+-       * struct.
+-       */
+-      if (array_too_big(sizeof(*deps), sizeof(*deps->dev), count)) {
+-              dm_table_put(table);
+-              dm_put(md);
+-              return -ENOMEM;
+-      }
+-
+-      len = sizeof(*deps) + (sizeof(*deps->dev) * count);
+-      deps = kmalloc(len, GFP_KERNEL);
+-      if (!deps) {
+-              dm_table_put(table);
+-              dm_put(md);
+-              return -ENOMEM;
+-      }
+-
+-      /*
+-       * Fill in the devices.
+-       */
+-      deps->count = count;
+-      count = 0;
+-      list_for_each(tmp, dm_table_get_devices(table)) {
+-              struct dm_dev *dd = list_entry(tmp, struct dm_dev, list);
+-              deps->dev[count++] = dd->bdev->bd_dev;
+-      }
+-      dm_table_put(table);
+-      dm_put(md);
+-
+-      out:
+-      r = results_to_user(user, param, deps, len);
+-
+-      kfree(deps);
+-      return r;
+-}
+-
+-static int remove(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      struct hash_cell *hc;
+-
+-      down_write(&_hash_lock);
+-      hc = *param->uuid ? __get_uuid_cell(param->uuid) :
+-              __get_name_cell(param->name);
+-      if (!hc) {
+-              DMWARN("device doesn't appear to be in the dev hash table.");
+-              up_write(&_hash_lock);
+-              return -EINVAL;
+-      }
+-
+-      /*
+-       * You may ask the interface to drop its reference to an
+-       * in use device.  This is no different to unlinking a
+-       * file that someone still has open.  The device will not
+-       * actually be destroyed until the last opener closes it.
+-       * The name and uuid of the device (both are interface
+-       * properties) will be available for reuse immediately.
+-       *
+-       * You don't want to drop a _suspended_ device from the
+-       * interface, since that will leave you with no way of
+-       * resuming it.
+-       */
+-      if (dm_suspended(hc->md)) {
+-              DMWARN("refusing to remove a suspended device.");
+-              up_write(&_hash_lock);
+-              return -EPERM;
+-      }
+-
+-      __hash_remove(hc);
+-      up_write(&_hash_lock);
+-      return 0;
+-}
+-
+-static int remove_all(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      dm_hash_remove_all();
+-      return 0;
+-}
+-
+-static int suspend(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      int r;
+-      struct mapped_device *md;
+-
+-      md = find_device(param);
+-      if (!md)
+-              return -ENXIO;
+-
+-      if (param->flags & DM_SUSPEND_FLAG)
+-              r = dm_suspend(md);
+-      else
+-              r = dm_resume(md);
+-
+-      dm_put(md);
+-      return r;
+-}
+-
+-static int reload(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      int r;
+-      struct mapped_device *md;
+-      struct dm_table *t;
+-
+-      r = dm_table_create(&t, get_mode(param));
+-      if (r)
+-              return r;
+-
+-      r = populate_table(t, param);
+-      if (r) {
+-              dm_table_put(t);
+-              return r;
+-      }
+-
+-      md = find_device(param);
+-      if (!md) {
+-              dm_table_put(t);
+-              return -ENXIO;
+-      }
+-
+-      r = dm_swap_table(md, t);
+-      if (r) {
+-              dm_put(md);
+-              dm_table_put(t);
+-              return r;
+-      }
+-      dm_table_put(t);        /* md will have taken its own reference */
+-
+-      set_disk_ro(dm_disk(md), (param->flags & DM_READONLY_FLAG) ? 1 : 0);
+-      dm_put(md);
+-
+-      r = info(param, user);
+-      return r;
+-}
+-
+-static int rename(struct dm_ioctl *param, struct dm_ioctl *user)
+-{
+-      int r;
+-      char *new_name = (char *) param + param->data_start;
+-
+-      if (valid_str(new_name, (void *) param,
+-                    (void *) param + param->data_size)) {
+-              DMWARN("Invalid new logical volume name supplied.");
+-              return -EINVAL;
+-      }
+-
+-      r = check_name(new_name);
+-      if (r)
+-              return r;
+-
+-      return dm_hash_rename(param->name, new_name);
+-}
+-
+-
+-/*-----------------------------------------------------------------
+- * Implementation of open/close/ioctl on the special char
+- * device.
+- *---------------------------------------------------------------*/
+-static ioctl_fn lookup_ioctl(unsigned int cmd)
+-{
+-      static struct {
+-              int cmd;
+-              ioctl_fn fn;
+-      } _ioctls[] = {
+-              {DM_VERSION_CMD, NULL}, /* version is dealt with elsewhere */
+-              {DM_REMOVE_ALL_CMD, remove_all},
+-              {DM_DEV_CREATE_CMD, create},
+-              {DM_DEV_REMOVE_CMD, remove},
+-              {DM_DEV_RELOAD_CMD, reload},
+-              {DM_DEV_RENAME_CMD, rename},
+-              {DM_DEV_SUSPEND_CMD, suspend},
+-              {DM_DEV_DEPS_CMD, dep},
+-              {DM_DEV_STATUS_CMD, info},
+-              {DM_TARGET_STATUS_CMD, get_status},
+-              {DM_TARGET_WAIT_CMD, wait_device_event},
+-      };
+-
+-      return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn;
+-}
+-
+-/*
+- * As well as checking the version compatibility this always
+- * copies the kernel interface version out.
+- */
+-static int check_version(unsigned int cmd, struct dm_ioctl *user)
+-{
+-      uint32_t version[3];
+-      int r = 0;
+-
+-      if (copy_from_user(version, user->version, sizeof(version)))
+-              return -EFAULT;
+-
+-      if ((DM_VERSION_MAJOR != version[0]) ||
+-          (DM_VERSION_MINOR < version[1])) {
+-              DMWARN("ioctl interface mismatch: "
+-                     "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)",
+-                     DM_VERSION_MAJOR, DM_VERSION_MINOR,
+-                     DM_VERSION_PATCHLEVEL,
+-                     version[0], version[1], version[2], cmd);
+-              r = -EINVAL;
+-      }
+-
+-      /*
+-       * Fill in the kernel version.
+-       */
+-      version[0] = DM_VERSION_MAJOR;
+-      version[1] = DM_VERSION_MINOR;
+-      version[2] = DM_VERSION_PATCHLEVEL;
+-      if (copy_to_user(user->version, version, sizeof(version)))
+-              return -EFAULT;
+-
+-      return r;
+-}
+-
+-static void free_params(struct dm_ioctl *param)
+-{
+-      vfree(param);
+-}
+-
+-static int copy_params(struct dm_ioctl *user, struct dm_ioctl **param)
+-{
+-      struct dm_ioctl tmp, *dmi;
+-
+-      if (copy_from_user(&tmp, user, sizeof(tmp)))
+-              return -EFAULT;
+-
+-      if (tmp.data_size < sizeof(tmp))
+-              return -EINVAL;
+-
+-      dmi = (struct dm_ioctl *) vmalloc(tmp.data_size);
+-      if (!dmi)
+-              return -ENOMEM;
+-
+-      if (copy_from_user(dmi, user, tmp.data_size)) {
+-              vfree(dmi);
+-              return -EFAULT;
+-      }
+-
+-      *param = dmi;
+-      return 0;
+-}
+-
+-static int validate_params(uint cmd, struct dm_ioctl *param)
+-{
+-      /* Ignores parameters */
+-      if (cmd == DM_REMOVE_ALL_CMD)
+-              return 0;
+-
+-      /* Unless creating, either name of uuid but not both */
+-      if (cmd != DM_DEV_CREATE_CMD) {
+-              if ((!*param->uuid && !*param->name) ||
+-                  (*param->uuid && *param->name)) {
+-                      DMWARN("one of name or uuid must be supplied");
+-                      return -EINVAL;
+-              }
+-      }
+-
+-      /* Ensure strings are terminated */
+-      param->name[DM_NAME_LEN - 1] = '\0';
+-      param->uuid[DM_UUID_LEN - 1] = '\0';
+-
+-      return 0;
+-}
+-
+-static int ctl_ioctl(struct inode *inode, struct file *file,
+-                   uint command, ulong u)
+-{
+-      int r = 0;
+-      unsigned int cmd;
+-      struct dm_ioctl *param;
+-      struct dm_ioctl *user = (struct dm_ioctl *) u;
+-      ioctl_fn fn = NULL;
+-
+-      /* only root can play with this */
+-      if (!capable(CAP_SYS_ADMIN))
+-              return -EACCES;
+-
+-      if (_IOC_TYPE(command) != DM_IOCTL)
+-              return -ENOTTY;
+-
+-      cmd = _IOC_NR(command);
+-
+-      /*
+-       * Check the interface version passed in.  This also
+-       * writes out the kernels interface version.
+-       */
+-      r = check_version(cmd, user);
+-      if (r)
+-              return r;
+-
+-      /*
+-       * Nothing more to do for the version command.
+-       */
+-      if (cmd == DM_VERSION_CMD)
+-              return 0;
+-
+-      fn = lookup_ioctl(cmd);
+-      if (!fn) {
+-              DMWARN("dm_ctl_ioctl: unknown command 0x%x", command);
+-              return -ENOTTY;
+-      }
+-
+-      /*
+-       * Copy the parameters into kernel space.
+-       */
+-      r = copy_params(user, &param);
+-      if (r)
+-              return r;
+-
+-      r = validate_params(cmd, param);
+-      if (r) {
+-              free_params(param);
+-              return r;
+-      }
+-
+-      r = fn(param, user);
+-      free_params(param);
+-      return r;
+-}
+-
+-static struct file_operations _ctl_fops = {
+-      .ioctl   = ctl_ioctl,
+-      .owner   = THIS_MODULE,
+-};
+-
+-static struct miscdevice _dm_misc = {
+-      .minor          = MISC_DYNAMIC_MINOR,
+-      .name           = DM_NAME,
+-      .devfs_name     = "mapper/control",
+-      .fops           = &_ctl_fops
+-};
+-
+-/*
+- * Create misc character device and link to DM_DIR/control.
+- */
+-int __init dm_interface_init(void)
+-{
+-      int r;
+-
+-      r = dm_hash_init();
+-      if (r)
+-              return r;
+-
+-      r = misc_register(&_dm_misc);
+-      if (r) {
+-              DMERR("misc_register failed for control device");
+-              dm_hash_exit();
+-              return r;
+-      }
+-
+-      DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR,
+-             DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA,
+-             DM_DRIVER_EMAIL);
+-      return 0;
+-
+-      if (misc_deregister(&_dm_misc) < 0)
+-              DMERR("misc_deregister failed for control device");
+-      dm_hash_exit();
+-      return r;
+-}
+-void dm_interface_exit(void)
+-{
+-      if (misc_deregister(&_dm_misc) < 0)
+-              DMERR("misc_deregister failed for control device");
+-      dm_hash_exit();
+-}
++#ifdef CONFIG_DM_IOCTL_V4
++#include "dm-ioctl-v4.c"
++#else
++#include "dm-ioctl-v1.c"
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/md/dm-ioctl-v1.c        2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,1160 @@
++/*
++ * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
++ *
++ * This file is released under the GPL.
++ */
++
++#include "dm.h"
++
++#include <linux/module.h>
++#include <linux/vmalloc.h>
++#include <linux/miscdevice.h>
++#include <linux/dm-ioctl.h>
++#include <linux/init.h>
++#include <linux/wait.h>
++#include <linux/blk.h>
++#include <linux/slab.h>
++#include <linux/devfs_fs_kernel.h>
++
++#include <asm/uaccess.h>
++
++#define DM_DRIVER_EMAIL "dm@uk.sistina.com"
++
++/*-----------------------------------------------------------------
++ * The ioctl interface needs to be able to look up devices by
++ * name or uuid.
++ *---------------------------------------------------------------*/
++struct hash_cell {
++      struct list_head name_list;
++      struct list_head uuid_list;
++
++      char *name;
++      char *uuid;
++      struct mapped_device *md;
++};
++
++#define NUM_BUCKETS 64
++#define MASK_BUCKETS (NUM_BUCKETS - 1)
++static struct list_head _name_buckets[NUM_BUCKETS];
++static struct list_head _uuid_buckets[NUM_BUCKETS];
++
++void dm_hash_remove_all(void);
++
++/*
++ * Guards access to all three tables.
++ */
++static DECLARE_RWSEM(_hash_lock);
++
++static void init_buckets(struct list_head *buckets)
++{
++      unsigned int i;
++
++      for (i = 0; i < NUM_BUCKETS; i++)
++              INIT_LIST_HEAD(buckets + i);
++}
++
++int dm_hash_init(void)
++{
++      init_buckets(_name_buckets);
++      init_buckets(_uuid_buckets);
++      devfs_mk_dir(DM_DIR);
++      return 0;
++}
++
++void dm_hash_exit(void)
++{
++      dm_hash_remove_all();
++      devfs_remove(DM_DIR);
++}
++
++/*-----------------------------------------------------------------
++ * Hash function:
++ * We're not really concerned with the str hash function being
++ * fast since it's only used by the ioctl interface.
++ *---------------------------------------------------------------*/
++static unsigned int hash_str(const char *str)
++{
++      const unsigned int hash_mult = 2654435387U;
++      unsigned int h = 0;
++
++      while (*str)
++              h = (h + (unsigned int) *str++) * hash_mult;
++
++      return h & MASK_BUCKETS;
++}
++
++/*-----------------------------------------------------------------
++ * Code for looking up a device by name
++ *---------------------------------------------------------------*/
++static struct hash_cell *__get_name_cell(const char *str)
++{
++      struct list_head *tmp;
++      struct hash_cell *hc;
++      unsigned int h = hash_str(str);
++
++      list_for_each (tmp, _name_buckets + h) {
++              hc = list_entry(tmp, struct hash_cell, name_list);
++              if (!strcmp(hc->name, str))
++                      return hc;
++      }
++
++      return NULL;
++}
++
++static struct hash_cell *__get_uuid_cell(const char *str)
++{
++      struct list_head *tmp;
++      struct hash_cell *hc;
++      unsigned int h = hash_str(str);
++
++      list_for_each (tmp, _uuid_buckets + h) {
++              hc = list_entry(tmp, struct hash_cell, uuid_list);
++              if (!strcmp(hc->uuid, str))
++                      return hc;
++      }
++
++      return NULL;
++}
++
++/*-----------------------------------------------------------------
++ * Inserting, removing and renaming a device.
++ *---------------------------------------------------------------*/
++static inline char *kstrdup(const char *str)
++{
++      char *r = kmalloc(strlen(str) + 1, GFP_KERNEL);
++      if (r)
++              strcpy(r, str);
++      return r;
++}
++
++static struct hash_cell *alloc_cell(const char *name, const char *uuid,
++                                  struct mapped_device *md)
++{
++      struct hash_cell *hc;
++
++      hc = kmalloc(sizeof(*hc), GFP_KERNEL);
++      if (!hc)
++              return NULL;
++
++      hc->name = kstrdup(name);
++      if (!hc->name) {
++              kfree(hc);
++              return NULL;
++      }
++
++      if (!uuid)
++              hc->uuid = NULL;
++
++      else {
++              hc->uuid = kstrdup(uuid);
++              if (!hc->uuid) {
++                      kfree(hc->name);
++                      kfree(hc);
++                      return NULL;
++              }
++      }
++
++      INIT_LIST_HEAD(&hc->name_list);
++      INIT_LIST_HEAD(&hc->uuid_list);
++      hc->md = md;
++      return hc;
++}
++
++static void free_cell(struct hash_cell *hc)
++{
++      if (hc) {
++              kfree(hc->name);
++              kfree(hc->uuid);
++              kfree(hc);
++      }
++}
++
++/*
++ * devfs stuff.
++ */
++static int register_with_devfs(struct hash_cell *hc)
++{
++      struct gendisk *disk = dm_disk(hc->md);
++
++      devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
++                     S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
++                     DM_DIR "/%s", hc->name);
++      return 0;
++}
++
++static int unregister_with_devfs(struct hash_cell *hc)
++{
++      devfs_remove(DM_DIR"/%s", hc->name);
++      return 0;
++}
++
++/*
++ * The kdev_t and uuid of a device can never change once it is
++ * initially inserted.
++ */
++int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md)
++{
++      struct hash_cell *cell;
++
++      /*
++       * Allocate the new cells.
++       */
++      cell = alloc_cell(name, uuid, md);
++      if (!cell)
++              return -ENOMEM;
++
++      /*
++       * Insert the cell into all three hash tables.
++       */
++      down_write(&_hash_lock);
++      if (__get_name_cell(name))
++              goto bad;
++
++      list_add(&cell->name_list, _name_buckets + hash_str(name));
++
++      if (uuid) {
++              if (__get_uuid_cell(uuid)) {
++                      list_del(&cell->name_list);
++                      goto bad;
++              }
++              list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid));
++      }
++      register_with_devfs(cell);
++      dm_get(md);
++      up_write(&_hash_lock);
++
++      return 0;
++
++ bad:
++      up_write(&_hash_lock);
++      free_cell(cell);
++      return -EBUSY;
++}
++
++void __hash_remove(struct hash_cell *hc)
++{
++      /* remove from the dev hash */
++      list_del(&hc->uuid_list);
++      list_del(&hc->name_list);
++      unregister_with_devfs(hc);
++      dm_put(hc->md);
++      free_cell(hc);
++}
++
++void dm_hash_remove_all(void)
++{
++      int i;
++      struct hash_cell *hc;
++      struct list_head *tmp, *n;
++
++      down_write(&_hash_lock);
++      for (i = 0; i < NUM_BUCKETS; i++) {
++              list_for_each_safe (tmp, n, _name_buckets + i) {
++                      hc = list_entry(tmp, struct hash_cell, name_list);
++                      __hash_remove(hc);
++              }
++      }
++      up_write(&_hash_lock);
++}
++
++int dm_hash_rename(const char *old, const char *new)
++{
++      char *new_name, *old_name;
++      struct hash_cell *hc;
++
++      /*
++       * duplicate new.
++       */
++      new_name = kstrdup(new);
++      if (!new_name)
++              return -ENOMEM;
++
++      down_write(&_hash_lock);
++
++      /*
++       * Is new free ?
++       */
++      hc = __get_name_cell(new);
++      if (hc) {
++              DMWARN("asked to rename to an already existing name %s -> %s",
++                     old, new);
++              up_write(&_hash_lock);
++              kfree(new_name);
++              return -EBUSY;
++      }
++
++      /*
++       * Is there such a device as 'old' ?
++       */
++      hc = __get_name_cell(old);
++      if (!hc) {
++              DMWARN("asked to rename a non existent device %s -> %s",
++                     old, new);
++              up_write(&_hash_lock);
++              kfree(new_name);
++              return -ENXIO;
++      }
++
++      /*
++       * rename and move the name cell.
++       */
++      unregister_with_devfs(hc);
++
++      list_del(&hc->name_list);
++      old_name = hc->name;
++      hc->name = new_name;
++      list_add(&hc->name_list, _name_buckets + hash_str(new_name));
++
++      /* rename the device node in devfs */
++      register_with_devfs(hc);
++
++      up_write(&_hash_lock);
++      kfree(old_name);
++      return 0;
++}
++
++
++/*-----------------------------------------------------------------
++ * Implementation of the ioctl commands
++ *---------------------------------------------------------------*/
++
++/*
++ * All the ioctl commands get dispatched to functions with this
++ * prototype.
++ */
++typedef int (*ioctl_fn)(struct dm_ioctl *param, struct dm_ioctl *user);
++
++/*
++ * Check a string doesn't overrun the chunk of
++ * memory we copied from userland.
++ */
++static int valid_str(char *str, void *begin, void *end)
++{
++      while (((void *) str >= begin) && ((void *) str < end))
++              if (!*str++)
++                      return 0;
++
++      return -EINVAL;
++}
++
++static int next_target(struct dm_target_spec *last, uint32_t next,
++                     void *begin, void *end,
++                     struct dm_target_spec **spec, char **params)
++{
++      *spec = (struct dm_target_spec *)
++          ((unsigned char *) last + next);
++      *params = (char *) (*spec + 1);
++
++      if (*spec < (last + 1) || ((void *) *spec > end))
++              return -EINVAL;
++
++      return valid_str(*params, begin, end);
++}
++
++static int populate_table(struct dm_table *table, struct dm_ioctl *args)
++{
++      int r, first = 1;
++      unsigned int i = 0;
++      struct dm_target_spec *spec;
++      char *params;
++      void *begin, *end;
++
++      if (!args->target_count) {
++              DMWARN("populate_table: no targets specified");
++              return -EINVAL;
++      }
++
++      begin = (void *) args;
++      end = begin + args->data_size;
++
++      for (i = 0; i < args->target_count; i++) {
++
++              if (first)
++                      r = next_target((struct dm_target_spec *) args,
++                                      args->data_start,
++                                      begin, end, &spec, &params);
++              else
++                      r = next_target(spec, spec->next, begin, end,
++                                      &spec, &params);
++
++              if (r) {
++                      DMWARN("unable to find target");
++                      return -EINVAL;
++              }
++
++              r = dm_table_add_target(table, spec->target_type,
++                                      (sector_t) spec->sector_start,
++                                      (sector_t) spec->length,
++                                      params);
++              if (r) {
++                      DMWARN("internal error adding target to table");
++                      return -EINVAL;
++              }
++
++              first = 0;
++      }
++
++      return dm_table_complete(table);
++}
++
++/*
++ * Round up the ptr to the next 'align' boundary.  Obviously
++ * 'align' must be a power of 2.
++ */
++static inline void *align_ptr(void *ptr, unsigned int align)
++{
++      align--;
++      return (void *) (((unsigned long) (ptr + align)) & ~align);
++}
++
++/*
++ * Copies a dm_ioctl and an optional additional payload to
++ * userland.
++ */
++static int results_to_user(struct dm_ioctl *user, struct dm_ioctl *param,
++                         void *data, uint32_t len)
++{
++      int r;
++      void *ptr = NULL;
++
++      if (data) {
++              ptr = align_ptr(user + 1, sizeof(unsigned long));
++              param->data_start = ptr - (void *) user;
++      }
++
++      /*
++       * The version number has already been filled in, so we
++       * just copy later fields.
++       */
++      r = copy_to_user(&user->data_size, &param->data_size,
++                       sizeof(*param) - sizeof(param->version));
++      if (r)
++              return -EFAULT;
++
++      if (data) {
++              if (param->data_start + len > param->data_size)
++                      return -ENOSPC;
++
++              if (copy_to_user(ptr, data, len))
++                      r = -EFAULT;
++      }
++
++      return r;
++}
++
++/*
++ * Fills in a dm_ioctl structure, ready for sending back to
++ * userland.
++ */
++static int __info(struct mapped_device *md, struct dm_ioctl *param)
++{
++      struct dm_table *table;
++      struct block_device *bdev;
++      struct gendisk *disk = dm_disk(md);
++
++      param->flags = DM_EXISTS_FLAG;
++      if (dm_suspended(md))
++              param->flags |= DM_SUSPEND_FLAG;
++
++      bdev = bdget_disk(disk, 0);
++      if (!bdev)
++              return -ENXIO;
++
++      param->dev = bdev->bd_dev;
++      param->open_count = bdev->bd_openers;
++      bdput(bdev);
++
++      if (disk->policy)
++              param->flags |= DM_READONLY_FLAG;
++
++      table = dm_get_table(md);
++      param->target_count = dm_table_get_num_targets(table);
++      dm_table_put(table);
++
++      return 0;
++}
++
++/*
++ * Always use UUID for lookups if it's present, otherwise use name.
++ */
++static inline struct mapped_device *find_device(struct dm_ioctl *param)
++{
++      struct hash_cell *hc;
++      struct mapped_device *md = NULL;
++
++      down_read(&_hash_lock);
++      hc = *param->uuid ? __get_uuid_cell(param->uuid) :
++              __get_name_cell(param->name);
++      if (hc) {
++              md = hc->md;
++
++              /*
++               * Sneakily write in both the name and the uuid
++               * while we have the cell.
++               */
++              strlcpy(param->name, hc->name, sizeof(param->name));
++              if (hc->uuid)
++                      strlcpy(param->uuid, hc->uuid, sizeof(param->uuid));
++              else
++                      param->uuid[0] = '\0';
++
++              dm_get(md);
++      }
++      up_read(&_hash_lock);
++
++      return md;
++}
++
++#define ALIGNMENT sizeof(int)
++static void *_align(void *ptr, unsigned int a)
++{
++      register unsigned long align = --a;
++
++      return (void *) (((unsigned long) ptr + align) & ~align);
++}
++
++/*
++ * Copies device info back to user space, used by
++ * the create and info ioctls.
++ */
++static int info(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      struct mapped_device *md;
++
++      param->flags = 0;
++
++      md = find_device(param);
++      if (!md)
++              /*
++               * Device not found - returns cleared exists flag.
++               */
++              goto out;
++
++      __info(md, param);
++      dm_put(md);
++
++      out:
++      return results_to_user(user, param, NULL, 0);
++}
++
++static inline int get_mode(struct dm_ioctl *param)
++{
++      int mode = FMODE_READ | FMODE_WRITE;
++
++      if (param->flags & DM_READONLY_FLAG)
++              mode = FMODE_READ;
++
++      return mode;
++}
++
++static int check_name(const char *name)
++{
++      if (name[0] == '/') {
++              DMWARN("invalid device name");
++              return -EINVAL;
++      }
++
++      return 0;
++}
++
++static int create(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      int r;
++      struct dm_table *t;
++      struct mapped_device *md;
++
++      r = check_name(param->name);
++      if (r)
++              return r;
++
++      r = dm_table_create(&t, get_mode(param));
++      if (r)
++              return r;
++
++      r = populate_table(t, param);
++      if (r) {
++              dm_table_put(t);
++              return r;
++      }
++
++      if (param->flags & DM_PERSISTENT_DEV_FLAG)
++              r = dm_create_with_minor(minor(to_kdev_t(param->dev)), &md);
++      else
++              r = dm_create(&md);
++
++      if (r) {
++              dm_table_put(t);
++              return r;
++      }
++
++      /* suspend the device */
++      r = dm_suspend(md);
++      if (r) {
++              DMWARN("suspend failed");
++              dm_table_put(t);
++              dm_put(md);
++              return r;
++      }
++      /* swap in the table */
++      r = dm_swap_table(md, t);
++      if (r) {
++              DMWARN("table swap failed");
++              dm_table_put(t);
++              dm_put(md);
++              return r;
++      }
++
++      /* resume the device */
++      r = dm_resume(md);
++      if (r) {
++              DMWARN("resume failed");
++              dm_table_put(t);
++              dm_put(md);
++              return r;
++      }
++
++      dm_table_put(t);        /* md will have grabbed its own reference */
++
++      set_disk_ro(dm_disk(md), (param->flags & DM_READONLY_FLAG) ? 1 : 0);
++      r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
++      dm_put(md);
++
++      return r ? r : info(param, user);
++}
++
++/*
++ * Build up the status struct for each target
++ */
++static int __status(struct mapped_device *md, struct dm_ioctl *param,
++                  char *outbuf, size_t *len)
++{
++      unsigned int i, num_targets;
++      struct dm_target_spec *spec;
++      char *outptr;
++      status_type_t type;
++      struct dm_table *table = dm_get_table(md);
++
++      if (param->flags & DM_STATUS_TABLE_FLAG)
++              type = STATUSTYPE_TABLE;
++      else
++              type = STATUSTYPE_INFO;
++
++      outptr = outbuf;
++
++      /* Get all the target info */
++      num_targets = dm_table_get_num_targets(table);
++      for (i = 0; i < num_targets; i++) {
++              struct dm_target *ti = dm_table_get_target(table, i);
++
++              if (outptr - outbuf +
++                  sizeof(struct dm_target_spec) > param->data_size) {
++                      dm_table_put(table);
++                      return -ENOMEM;
++              }
++
++              spec = (struct dm_target_spec *) outptr;
++
++              spec->status = 0;
++              spec->sector_start = ti->begin;
++              spec->length = ti->len;
++              strlcpy(spec->target_type, ti->type->name,
++                      sizeof(spec->target_type));
++
++              outptr += sizeof(struct dm_target_spec);
++
++              /* Get the status/table string from the target driver */
++              if (ti->type->status)
++                      ti->type->status(ti, type, outptr,
++                                       outbuf + param->data_size - outptr);
++              else
++                      outptr[0] = '\0';
++
++              outptr += strlen(outptr) + 1;
++              _align(outptr, ALIGNMENT);
++              spec->next = outptr - outbuf;
++      }
++
++      param->target_count = num_targets;
++      *len = outptr - outbuf;
++      dm_table_put(table);
++
++      return 0;
++}
++
++/*
++ * Return the status of a device as a text string for each
++ * target.
++ */
++static int get_status(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      struct mapped_device *md;
++      size_t len = 0;
++      int ret;
++      char *outbuf = NULL;
++
++      md = find_device(param);
++      if (!md)
++              /*
++               * Device not found - returns cleared exists flag.
++               */
++              goto out;
++
++      /* We haven't a clue how long the resultant data will be so
++         just allocate as much as userland has allowed us and make sure
++         we don't overun it */
++      outbuf = kmalloc(param->data_size, GFP_KERNEL);
++      if (!outbuf)
++              goto out;
++      /*
++       * Get the status of all targets
++       */
++      __status(md, param, outbuf, &len);
++
++      /*
++       * Setup the basic dm_ioctl structure.
++       */
++      __info(md, param);
++
++      out:
++      if (md)
++              dm_put(md);
++
++      ret = results_to_user(user, param, outbuf, len);
++
++      if (outbuf)
++              kfree(outbuf);
++
++      return ret;
++}
++
++/*
++ * Wait for a device to report an event
++ */
++static int wait_device_event(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      struct mapped_device *md;
++      DECLARE_WAITQUEUE(wq, current);
++
++      md = find_device(param);
++      if (!md)
++              /*
++               * Device not found - returns cleared exists flag.
++               */
++              goto out;
++
++      /*
++       * Setup the basic dm_ioctl structure.
++       */
++      __info(md, param);
++
++      /*
++       * Wait for a notification event
++       */
++      set_current_state(TASK_INTERRUPTIBLE);
++      if (!dm_add_wait_queue(md, &wq, dm_get_event_nr(md))) {
++              schedule();
++              dm_remove_wait_queue(md, &wq);
++      }
++      set_current_state(TASK_RUNNING);
++      dm_put(md);
++
++      out:
++      return results_to_user(user, param, NULL, 0);
++}
++
++/*
++ * Retrieves a list of devices used by a particular dm device.
++ */
++static int dep(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      int r;
++      unsigned int count;
++      struct mapped_device *md;
++      struct list_head *tmp;
++      size_t len = 0;
++      struct dm_target_deps *deps = NULL;
++      struct dm_table *table;
++
++      md = find_device(param);
++      if (!md)
++              goto out;
++      table = dm_get_table(md);
++
++      /*
++       * Setup the basic dm_ioctl structure.
++       */
++      __info(md, param);
++
++      /*
++       * Count the devices.
++       */
++      count = 0;
++      list_for_each(tmp, dm_table_get_devices(table))
++          count++;
++
++      /*
++       * Allocate a kernel space version of the dm_target_status
++       * struct.
++       */
++      if (array_too_big(sizeof(*deps), sizeof(*deps->dev), count)) {
++              dm_table_put(table);
++              dm_put(md);
++              return -ENOMEM;
++      }
++
++      len = sizeof(*deps) + (sizeof(*deps->dev) * count);
++      deps = kmalloc(len, GFP_KERNEL);
++      if (!deps) {
++              dm_table_put(table);
++              dm_put(md);
++              return -ENOMEM;
++      }
++
++      /*
++       * Fill in the devices.
++       */
++      deps->count = count;
++      count = 0;
++      list_for_each(tmp, dm_table_get_devices(table)) {
++              struct dm_dev *dd = list_entry(tmp, struct dm_dev, list);
++              deps->dev[count++] = dd->bdev->bd_dev;
++      }
++      dm_table_put(table);
++      dm_put(md);
++
++      out:
++      r = results_to_user(user, param, deps, len);
++
++      kfree(deps);
++      return r;
++}
++
++static int remove(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      struct hash_cell *hc;
++
++      down_write(&_hash_lock);
++      hc = *param->uuid ? __get_uuid_cell(param->uuid) :
++              __get_name_cell(param->name);
++      if (!hc) {
++              DMWARN("device doesn't appear to be in the dev hash table.");
++              up_write(&_hash_lock);
++              return -EINVAL;
++      }
++
++      /*
++       * You may ask the interface to drop its reference to an
++       * in use device.  This is no different to unlinking a
++       * file that someone still has open.  The device will not
++       * actually be destroyed until the last opener closes it.
++       * The name and uuid of the device (both are interface
++       * properties) will be available for reuse immediately.
++       *
++       * You don't want to drop a _suspended_ device from the
++       * interface, since that will leave you with no way of
++       * resuming it.
++       */
++      if (dm_suspended(hc->md)) {
++              DMWARN("refusing to remove a suspended device.");
++              up_write(&_hash_lock);
++              return -EPERM;
++      }
++
++      __hash_remove(hc);
++      up_write(&_hash_lock);
++      return 0;
++}
++
++static int remove_all(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      dm_hash_remove_all();
++      return 0;
++}
++
++static int suspend(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      int r;
++      struct mapped_device *md;
++
++      md = find_device(param);
++      if (!md)
++              return -ENXIO;
++
++      if (param->flags & DM_SUSPEND_FLAG)
++              r = dm_suspend(md);
++      else
++              r = dm_resume(md);
++
++      dm_put(md);
++      return r;
++}
++
++static int reload(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      int r;
++      struct mapped_device *md;
++      struct dm_table *t;
++
++      r = dm_table_create(&t, get_mode(param));
++      if (r)
++              return r;
++
++      r = populate_table(t, param);
++      if (r) {
++              dm_table_put(t);
++              return r;
++      }
++
++      md = find_device(param);
++      if (!md) {
++              dm_table_put(t);
++              return -ENXIO;
++      }
++
++      r = dm_swap_table(md, t);
++      if (r) {
++              dm_put(md);
++              dm_table_put(t);
++              return r;
++      }
++      dm_table_put(t);        /* md will have taken its own reference */
++
++      set_disk_ro(dm_disk(md), (param->flags & DM_READONLY_FLAG) ? 1 : 0);
++      dm_put(md);
++
++      r = info(param, user);
++      return r;
++}
++
++static int rename(struct dm_ioctl *param, struct dm_ioctl *user)
++{
++      int r;
++      char *new_name = (char *) param + param->data_start;
++
++      if (valid_str(new_name, (void *) param,
++                    (void *) param + param->data_size)) {
++              DMWARN("Invalid new logical volume name supplied.");
++              return -EINVAL;
++      }
++
++      r = check_name(new_name);
++      if (r)
++              return r;
++
++      return dm_hash_rename(param->name, new_name);
++}
++
++
++/*-----------------------------------------------------------------
++ * Implementation of open/close/ioctl on the special char
++ * device.
++ *---------------------------------------------------------------*/
++static ioctl_fn lookup_ioctl(unsigned int cmd)
++{
++      static struct {
++              int cmd;
++              ioctl_fn fn;
++      } _ioctls[] = {
++              {DM_VERSION_CMD, NULL}, /* version is dealt with elsewhere */
++              {DM_REMOVE_ALL_CMD, remove_all},
++              {DM_DEV_CREATE_CMD, create},
++              {DM_DEV_REMOVE_CMD, remove},
++              {DM_DEV_RELOAD_CMD, reload},
++              {DM_DEV_RENAME_CMD, rename},
++              {DM_DEV_SUSPEND_CMD, suspend},
++              {DM_DEV_DEPS_CMD, dep},
++              {DM_DEV_STATUS_CMD, info},
++              {DM_TARGET_STATUS_CMD, get_status},
++              {DM_TARGET_WAIT_CMD, wait_device_event},
++      };
++
++      return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn;
++}
++
++/*
++ * As well as checking the version compatibility this always
++ * copies the kernel interface version out.
++ */
++static int check_version(unsigned int cmd, struct dm_ioctl *user)
++{
++      uint32_t version[3];
++      int r = 0;
++
++      if (copy_from_user(version, user->version, sizeof(version)))
++              return -EFAULT;
++
++      if ((DM_VERSION_MAJOR != version[0]) ||
++          (DM_VERSION_MINOR < version[1])) {
++              DMWARN("ioctl interface mismatch: "
++                     "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)",
++                     DM_VERSION_MAJOR, DM_VERSION_MINOR,
++                     DM_VERSION_PATCHLEVEL,
++                     version[0], version[1], version[2], cmd);
++              r = -EINVAL;
++      }
++
++      /*
++       * Fill in the kernel version.
++       */
++      version[0] = DM_VERSION_MAJOR;
++      version[1] = DM_VERSION_MINOR;
++      version[2] = DM_VERSION_PATCHLEVEL;
++      if (copy_to_user(user->version, version, sizeof(version)))
++              return -EFAULT;
++
++      return r;
++}
++
++static void free_params(struct dm_ioctl *param)
++{
++      vfree(param);
++}
++
++static int copy_params(struct dm_ioctl *user, struct dm_ioctl **param)
++{
++      struct dm_ioctl tmp, *dmi;
++
++      if (copy_from_user(&tmp, user, sizeof(tmp)))
++              return -EFAULT;
++
++      if (tmp.data_size < sizeof(tmp))
++              return -EINVAL;
++
++      dmi = (struct dm_ioctl *) vmalloc(tmp.data_size);
++      if (!dmi)
++              return -ENOMEM;
++
++      if (copy_from_user(dmi, user, tmp.data_size)) {
++              vfree(dmi);
++              return -EFAULT;
++      }
++
++      *param = dmi;
++      return 0;
++}
++
++static int validate_params(uint cmd, struct dm_ioctl *param)
++{
++      /* Ignores parameters */
++      if (cmd == DM_REMOVE_ALL_CMD)
++              return 0;
++
++      /* Unless creating, either name of uuid but not both */
++      if (cmd != DM_DEV_CREATE_CMD) {
++              if ((!*param->uuid && !*param->name) ||
++                  (*param->uuid && *param->name)) {
++                      DMWARN("one of name or uuid must be supplied");
++                      return -EINVAL;
++              }
++      }
++
++      /* Ensure strings are terminated */
++      param->name[DM_NAME_LEN - 1] = '\0';
++      param->uuid[DM_UUID_LEN - 1] = '\0';
++
++      return 0;
++}
++
++static int ctl_ioctl(struct inode *inode, struct file *file,
++                   uint command, ulong u)
++{
++      int r = 0;
++      unsigned int cmd;
++      struct dm_ioctl *param;
++      struct dm_ioctl *user = (struct dm_ioctl *) u;
++      ioctl_fn fn = NULL;
++
++      /* only root can play with this */
++      if (!capable(CAP_SYS_ADMIN))
++              return -EACCES;
++
++      if (_IOC_TYPE(command) != DM_IOCTL)
++              return -ENOTTY;
++
++      cmd = _IOC_NR(command);
++
++      /*
++       * Check the interface version passed in.  This also
++       * writes out the kernels interface version.
++       */
++      r = check_version(cmd, user);
++      if (r)
++              return r;
++
++      /*
++       * Nothing more to do for the version command.
++       */
++      if (cmd == DM_VERSION_CMD)
++              return 0;
++
++      fn = lookup_ioctl(cmd);
++      if (!fn) {
++              DMWARN("dm_ctl_ioctl: unknown command 0x%x", command);
++              return -ENOTTY;
++      }
++
++      /*
++       * Copy the parameters into kernel space.
++       */
++      r = copy_params(user, &param);
++      if (r)
++              return r;
++
++      r = validate_params(cmd, param);
++      if (r) {
++              free_params(param);
++              return r;
++      }
++
++      r = fn(param, user);
++      free_params(param);
++      return r;
++}
++
++static struct file_operations _ctl_fops = {
++      .ioctl   = ctl_ioctl,
++      .owner   = THIS_MODULE,
++};
++
++static struct miscdevice _dm_misc = {
++      .minor          = MISC_DYNAMIC_MINOR,
++      .name           = DM_NAME,
++      .devfs_name     = "mapper/control",
++      .fops           = &_ctl_fops
++};
++
++/*
++ * Create misc character device and link to DM_DIR/control.
++ */
++int __init dm_interface_init(void)
++{
++      int r;
++
++      r = dm_hash_init();
++      if (r)
++              return r;
++
++      r = misc_register(&_dm_misc);
++      if (r) {
++              DMERR("misc_register failed for control device");
++              dm_hash_exit();
++              return r;
++      }
++
++      DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR,
++             DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA,
++             DM_DRIVER_EMAIL);
++      return 0;
++
++      if (misc_deregister(&_dm_misc) < 0)
++              DMERR("misc_deregister failed for control device");
++      dm_hash_exit();
++      return r;
++}
++
++void dm_interface_exit(void)
++{
++      if (misc_deregister(&_dm_misc) < 0)
++              DMERR("misc_deregister failed for control device");
++      dm_hash_exit();
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/md/dm-ioctl-v4.c        2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,1252 @@
++/*
++ * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
++ *
++ * This file is released under the GPL.
++ */
++
++#include "dm.h"
++
++#include <linux/module.h>
++#include <linux/vmalloc.h>
++#include <linux/miscdevice.h>
++#include <linux/init.h>
++#include <linux/wait.h>
++#include <linux/blk.h>
++#include <linux/slab.h>
++#include <linux/devfs_fs_kernel.h>
++
++#include <asm/uaccess.h>
++
++#define DM_DRIVER_EMAIL "dm@uk.sistina.com"
++
++/*-----------------------------------------------------------------
++ * The ioctl interface needs to be able to look up devices by
++ * name or uuid.
++ *---------------------------------------------------------------*/
++struct hash_cell {
++      struct list_head name_list;
++      struct list_head uuid_list;
++
++      char *name;
++      char *uuid;
++      struct mapped_device *md;
++      struct dm_table *new_map;
++};
++
++#define NUM_BUCKETS 64
++#define MASK_BUCKETS (NUM_BUCKETS - 1)
++static struct list_head _name_buckets[NUM_BUCKETS];
++static struct list_head _uuid_buckets[NUM_BUCKETS];
++
++void dm_hash_remove_all(void);
++
++/*
++ * Guards access to both hash tables.
++ */
++static DECLARE_RWSEM(_hash_lock);
++
++static void init_buckets(struct list_head *buckets)
++{
++      unsigned int i;
++
++      for (i = 0; i < NUM_BUCKETS; i++)
++              INIT_LIST_HEAD(buckets + i);
++}
++
++int dm_hash_init(void)
++{
++      init_buckets(_name_buckets);
++      init_buckets(_uuid_buckets);
++      devfs_mk_dir(DM_DIR);
++      return 0;
++}
++
++void dm_hash_exit(void)
++{
++      dm_hash_remove_all();
++      devfs_remove(DM_DIR);
++}
++
++/*-----------------------------------------------------------------
++ * Hash function:
++ * We're not really concerned with the str hash function being
++ * fast since it's only used by the ioctl interface.
++ *---------------------------------------------------------------*/
++static unsigned int hash_str(const char *str)
++{
++      const unsigned int hash_mult = 2654435387U;
++      unsigned int h = 0;
++
++      while (*str)
++              h = (h + (unsigned int) *str++) * hash_mult;
++
++      return h & MASK_BUCKETS;
++}
++
++/*-----------------------------------------------------------------
++ * Code for looking up a device by name
++ *---------------------------------------------------------------*/
++static struct hash_cell *__get_name_cell(const char *str)
++{
++      struct list_head *tmp;
++      struct hash_cell *hc;
++      unsigned int h = hash_str(str);
++
++      list_for_each (tmp, _name_buckets + h) {
++              hc = list_entry(tmp, struct hash_cell, name_list);
++              if (!strcmp(hc->name, str))
++                      return hc;
++      }
++
++      return NULL;
++}
++
++static struct hash_cell *__get_uuid_cell(const char *str)
++{
++      struct list_head *tmp;
++      struct hash_cell *hc;
++      unsigned int h = hash_str(str);
++
++      list_for_each (tmp, _uuid_buckets + h) {
++              hc = list_entry(tmp, struct hash_cell, uuid_list);
++              if (!strcmp(hc->uuid, str))
++                      return hc;
++      }
++
++      return NULL;
++}
++
++/*-----------------------------------------------------------------
++ * Inserting, removing and renaming a device.
++ *---------------------------------------------------------------*/
++static inline char *kstrdup(const char *str)
++{
++      char *r = kmalloc(strlen(str) + 1, GFP_KERNEL);
++      if (r)
++              strcpy(r, str);
++      return r;
++}
++
++static struct hash_cell *alloc_cell(const char *name, const char *uuid,
++                                  struct mapped_device *md)
++{
++      struct hash_cell *hc;
++
++      hc = kmalloc(sizeof(*hc), GFP_KERNEL);
++      if (!hc)
++              return NULL;
++
++      hc->name = kstrdup(name);
++      if (!hc->name) {
++              kfree(hc);
++              return NULL;
++      }
++
++      if (!uuid)
++              hc->uuid = NULL;
++
++      else {
++              hc->uuid = kstrdup(uuid);
++              if (!hc->uuid) {
++                      kfree(hc->name);
++                      kfree(hc);
++                      return NULL;
++              }
++      }
++
++      INIT_LIST_HEAD(&hc->name_list);
++      INIT_LIST_HEAD(&hc->uuid_list);
++      hc->md = md;
++      hc->new_map = NULL;
++      return hc;
++}
++
++static void free_cell(struct hash_cell *hc)
++{
++      if (hc) {
++              kfree(hc->name);
++              kfree(hc->uuid);
++              kfree(hc);
++      }
++}
++
++/*
++ * devfs stuff.
++ */
++static int register_with_devfs(struct hash_cell *hc)
++{
++      struct gendisk *disk = dm_disk(hc->md);
++
++      devfs_mk_bdev(MKDEV(disk->major, disk->first_minor),
++                    S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
++                    DM_DIR "/%s", hc->name);
++      return 0;
++}
++
++static int unregister_with_devfs(struct hash_cell *hc)
++{
++      devfs_remove(DM_DIR"/%s", hc->name);
++      return 0;
++}
++
++/*
++ * The kdev_t and uuid of a device can never change once it is
++ * initially inserted.
++ */
++int dm_hash_insert(const char *name, const char *uuid, struct mapped_device *md)
++{
++      struct hash_cell *cell;
++
++      /*
++       * Allocate the new cells.
++       */
++      cell = alloc_cell(name, uuid, md);
++      if (!cell)
++              return -ENOMEM;
++
++      /*
++       * Insert the cell into both hash tables.
++       */
++      down_write(&_hash_lock);
++      if (__get_name_cell(name))
++              goto bad;
++
++      list_add(&cell->name_list, _name_buckets + hash_str(name));
++
++      if (uuid) {
++              if (__get_uuid_cell(uuid)) {
++                      list_del(&cell->name_list);
++                      goto bad;
++              }
++              list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid));
++      }
++      register_with_devfs(cell);
++      dm_get(md);
++      up_write(&_hash_lock);
++
++      return 0;
++
++ bad:
++      up_write(&_hash_lock);
++      free_cell(cell);
++      return -EBUSY;
++}
++
++void __hash_remove(struct hash_cell *hc)
++{
++      /* remove from the dev hash */
++      list_del(&hc->uuid_list);
++      list_del(&hc->name_list);
++      unregister_with_devfs(hc);
++      dm_put(hc->md);
++      if (hc->new_map)
++              dm_table_put(hc->new_map);
++      free_cell(hc);
++}
++
++void dm_hash_remove_all(void)
++{
++      int i;
++      struct hash_cell *hc;
++      struct list_head *tmp, *n;
++
++      down_write(&_hash_lock);
++      for (i = 0; i < NUM_BUCKETS; i++) {
++              list_for_each_safe (tmp, n, _name_buckets + i) {
++                      hc = list_entry(tmp, struct hash_cell, name_list);
++                      __hash_remove(hc);
++              }
++      }
++      up_write(&_hash_lock);
++}
++
++int dm_hash_rename(const char *old, const char *new)
++{
++      char *new_name, *old_name;
++      struct hash_cell *hc;
++
++      /*
++       * duplicate new.
++       */
++      new_name = kstrdup(new);
++      if (!new_name)
++              return -ENOMEM;
++
++      down_write(&_hash_lock);
++
++      /*
++       * Is new free ?
++       */
++      hc = __get_name_cell(new);
++      if (hc) {
++              DMWARN("asked to rename to an already existing name %s -> %s",
++                     old, new);
++              up_write(&_hash_lock);
++              kfree(new_name);
++              return -EBUSY;
++      }
++
++      /*
++       * Is there such a device as 'old' ?
++       */
++      hc = __get_name_cell(old);
++      if (!hc) {
++              DMWARN("asked to rename a non existent device %s -> %s",
++                     old, new);
++              up_write(&_hash_lock);
++              kfree(new_name);
++              return -ENXIO;
++      }
++
++      /*
++       * rename and move the name cell.
++       */
++      unregister_with_devfs(hc);
++
++      list_del(&hc->name_list);
++      old_name = hc->name;
++      hc->name = new_name;
++      list_add(&hc->name_list, _name_buckets + hash_str(new_name));
++
++      /* rename the device node in devfs */
++      register_with_devfs(hc);
++
++      up_write(&_hash_lock);
++      kfree(old_name);
++      return 0;
++}
++
++/*-----------------------------------------------------------------
++ * Implementation of the ioctl commands
++ *---------------------------------------------------------------*/
++/*
++ * All the ioctl commands get dispatched to functions with this
++ * prototype.
++ */
++typedef int (*ioctl_fn)(struct dm_ioctl *param, size_t param_size);
++
++static int remove_all(struct dm_ioctl *param, size_t param_size)
++{
++      dm_hash_remove_all();
++      param->data_size = 0;
++      return 0;
++}
++
++/*
++ * Round up the ptr to an 8-byte boundary.
++ */
++#define ALIGN_MASK 7
++static inline void *align_ptr(void *ptr)
++{
++      return (void *) (((size_t) (ptr + ALIGN_MASK)) & ~ALIGN_MASK);
++}
++
++/*
++ * Retrieves the data payload buffer from an already allocated
++ * struct dm_ioctl.
++ */
++static void *get_result_buffer(struct dm_ioctl *param, size_t param_size,
++                             size_t *len)
++{
++      param->data_start = align_ptr(param + 1) - (void *) param;
++
++      if (param->data_start < param_size)
++              *len = param_size - param->data_start;
++      else
++              *len = 0;
++
++      return ((void *) param) + param->data_start;
++}
++
++static int list_devices(struct dm_ioctl *param, size_t param_size)
++{
++      unsigned int i;
++      struct hash_cell *hc;
++      size_t len, needed = 0;
++      struct gendisk *disk;
++      struct dm_name_list *nl, *old_nl = NULL;
++
++      down_write(&_hash_lock);
++
++      /*
++       * Loop through all the devices working out how much
++       * space we need.
++       */
++      for (i = 0; i < NUM_BUCKETS; i++) {
++              list_for_each_entry (hc, _name_buckets + i, name_list) {
++                      needed += sizeof(struct dm_name_list);
++                      needed += strlen(hc->name);
++                      needed += ALIGN_MASK;
++              }
++      }
++
++      /*
++       * Grab our output buffer.
++       */
++      nl = get_result_buffer(param, param_size, &len);
++      if (len < needed) {
++              param->flags |= DM_BUFFER_FULL_FLAG;
++              goto out;
++      }
++      param->data_size = param->data_start + needed;
++
++      nl->dev = 0;    /* Flags no data */
++
++      /*
++       * Now loop through filling out the names.
++       */
++      for (i = 0; i < NUM_BUCKETS; i++) {
++              list_for_each_entry (hc, _name_buckets + i, name_list) {
++                      if (old_nl)
++                              old_nl->next = (uint32_t) ((void *) nl -
++                                                         (void *) old_nl);
++                      disk = dm_disk(hc->md);
++                      nl->dev = MKDEV(disk->major, disk->first_minor);
++                      nl->next = 0;
++                      strcpy(nl->name, hc->name);
++
++                      old_nl = nl;
++                      nl = align_ptr(((void *) ++nl) + strlen(hc->name) + 1);
++              }
++      }
++
++ out:
++      up_write(&_hash_lock);
++      return 0;
++}
++
++static int check_name(const char *name)
++{
++      if (strchr(name, '/')) {
++              DMWARN("invalid device name");
++              return -EINVAL;
++      }
++
++      return 0;
++}
++
++/*
++ * Fills in a dm_ioctl structure, ready for sending back to
++ * userland.
++ */
++static int __dev_status(struct mapped_device *md, struct dm_ioctl *param)
++{
++      struct gendisk *disk = dm_disk(md);
++      struct dm_table *table;
++      struct block_device *bdev;
++
++      param->flags &= ~(DM_SUSPEND_FLAG | DM_READONLY_FLAG |
++                        DM_ACTIVE_PRESENT_FLAG);
++
++      if (dm_suspended(md))
++              param->flags |= DM_SUSPEND_FLAG;
++
++      bdev = bdget_disk(disk, 0);
++      if (!bdev)
++              return -ENXIO;
++
++      param->dev = MKDEV(disk->major, disk->first_minor);
++
++      /*
++       * Yes, this will be out of date by the time it gets back
++       * to userland, but it is still very useful ofr
++       * debugging.
++       */
++      param->open_count = bdev->bd_openers;
++      bdput(bdev);
++
++      if (disk->policy)
++              param->flags |= DM_READONLY_FLAG;
++
++      param->event_nr = dm_get_event_nr(md);
++
++      table = dm_get_table(md);
++      if (table) {
++              param->flags |= DM_ACTIVE_PRESENT_FLAG;
++              param->target_count = dm_table_get_num_targets(table);
++              dm_table_put(table);
++      } else
++              param->target_count = 0;
++
++      return 0;
++}
++
++static int dev_create(struct dm_ioctl *param, size_t param_size)
++{
++      int r;
++      struct mapped_device *md;
++
++      r = check_name(param->name);
++      if (r)
++              return r;
++
++      if (param->flags & DM_PERSISTENT_DEV_FLAG)
++              r = dm_create_with_minor(minor(to_kdev_t(param->dev)), &md);
++      else
++              r = dm_create(&md);
++
++      if (r)
++              return r;
++
++      r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
++      if (r) {
++              dm_put(md);
++              return r;
++      }
++
++      param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
++
++      r = __dev_status(md, param);
++      dm_put(md);
++
++      return r;
++}
++
++/*
++ * Always use UUID for lookups if it's present, otherwise use name.
++ */
++static inline struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param)
++{
++      return *param->uuid ?
++          __get_uuid_cell(param->uuid) : __get_name_cell(param->name);
++}
++
++static inline struct mapped_device *find_device(struct dm_ioctl *param)
++{
++      struct hash_cell *hc;
++      struct mapped_device *md = NULL;
++
++      down_read(&_hash_lock);
++      hc = __find_device_hash_cell(param);
++      if (hc) {
++              md = hc->md;
++
++              /*
++               * Sneakily write in both the name and the uuid
++               * while we have the cell.
++               */
++              strncpy(param->name, hc->name, sizeof(param->name));
++              if (hc->uuid)
++                      strncpy(param->uuid, hc->uuid, sizeof(param->uuid)-1);
++              else
++                      param->uuid[0] = '\0';
++
++              if (hc->new_map)
++                      param->flags |= DM_INACTIVE_PRESENT_FLAG;
++              else
++                      param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
++
++              dm_get(md);
++      }
++      up_read(&_hash_lock);
++
++      return md;
++}
++
++static int dev_remove(struct dm_ioctl *param, size_t param_size)
++{
++      struct hash_cell *hc;
++
++      down_write(&_hash_lock);
++      hc = __find_device_hash_cell(param);
++
++      if (!hc) {
++              DMWARN("device doesn't appear to be in the dev hash table.");
++              up_write(&_hash_lock);
++              return -ENXIO;
++      }
++
++      __hash_remove(hc);
++      up_write(&_hash_lock);
++      param->data_size = 0;
++      return 0;
++}
++
++/*
++ * Check a string doesn't overrun the chunk of
++ * memory we copied from userland.
++ */
++static int invalid_str(char *str, void *end)
++{
++      while ((void *) str < end)
++              if (!*str++)
++                      return 0;
++
++      return -EINVAL;
++}
++
++static int dev_rename(struct dm_ioctl *param, size_t param_size)
++{
++      int r;
++      char *new_name = (char *) param + param->data_start;
++
++      if (new_name < (char *) (param + 1) ||
++          invalid_str(new_name, (void *) param + param_size)) {
++              DMWARN("Invalid new logical volume name supplied.");
++              return -EINVAL;
++      }
++
++      r = check_name(new_name);
++      if (r)
++              return r;
++
++      param->data_size = 0;
++      return dm_hash_rename(param->name, new_name);
++}
++
++static int suspend(struct dm_ioctl *param)
++{
++      int r = 0;
++      struct mapped_device *md;
++
++      md = find_device(param);
++      if (!md)
++              return -ENXIO;
++
++      if (!dm_suspended(md))
++              r = dm_suspend(md);
++
++      if (!r)
++              r = __dev_status(md, param);
++
++      dm_put(md);
++      return r;
++}
++
++static int resume(struct dm_ioctl *param)
++{
++      int r = 0;
++      struct hash_cell *hc;
++      struct mapped_device *md;
++      struct dm_table *new_map;
++
++      down_write(&_hash_lock);
++
++      hc = __find_device_hash_cell(param);
++      if (!hc) {
++              DMWARN("device doesn't appear to be in the dev hash table.");
++              up_write(&_hash_lock);
++              return -ENXIO;
++      }
++
++      md = hc->md;
++      dm_get(md);
++
++      new_map = hc->new_map;
++      hc->new_map = NULL;
++      param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
++
++      up_write(&_hash_lock);
++
++      /* Do we need to load a new map ? */
++      if (new_map) {
++              /* Suspend if it isn't already suspended */
++              if (!dm_suspended(md))
++                      dm_suspend(md);
++
++              r = dm_swap_table(md, new_map);
++              if (r) {
++                      dm_put(md);
++                      dm_table_put(new_map);
++                      return r;
++              }
++
++              if (dm_table_get_mode(new_map) & FMODE_WRITE)
++                      set_disk_ro(dm_disk(md), 0);
++              else
++                      set_disk_ro(dm_disk(md), 1);
++
++              dm_table_put(new_map);
++      }
++
++      if (dm_suspended(md))
++              r = dm_resume(md);
++
++      if (!r)
++              r = __dev_status(md, param);
++
++      dm_put(md);
++      return r;
++}
++
++/*
++ * Set or unset the suspension state of a device.
++ * If the device already is in the requested state we just return its status.
++ */
++static int dev_suspend(struct dm_ioctl *param, size_t param_size)
++{
++      if (param->flags & DM_SUSPEND_FLAG)
++              return suspend(param);
++
++      return resume(param);
++}
++
++/*
++ * Copies device info back to user space, used by
++ * the create and info ioctls.
++ */
++static int dev_status(struct dm_ioctl *param, size_t param_size)
++{
++      int r;
++      struct mapped_device *md;
++
++      md = find_device(param);
++      if (!md)
++              return -ENXIO;
++
++      r = __dev_status(md, param);
++      dm_put(md);
++      return r;
++}
++
++/*
++ * Wait for a device to report an event
++ */
++static int dev_wait(struct dm_ioctl *param, size_t param_size)
++{
++      int r;
++      struct mapped_device *md;
++      DECLARE_WAITQUEUE(wq, current);
++
++      md = find_device(param);
++      if (!md)
++              return -ENXIO;
++
++      /*
++       * Wait for a notification event
++       */
++      set_current_state(TASK_INTERRUPTIBLE);
++      if (!dm_add_wait_queue(md, &wq, param->event_nr)) {
++              schedule();
++              dm_remove_wait_queue(md, &wq);
++      }
++      set_current_state(TASK_RUNNING);
++
++      /*
++       * The userland program is going to want to know what
++       * changed to trigger the event, so we may as well tell
++       * him and save an ioctl.
++       */
++      r = __dev_status(md, param);
++
++      dm_put(md);
++      return r;
++}
++
++static inline int get_mode(struct dm_ioctl *param)
++{
++      int mode = FMODE_READ | FMODE_WRITE;
++
++      if (param->flags & DM_READONLY_FLAG)
++              mode = FMODE_READ;
++
++      return mode;
++}
++
++static int next_target(struct dm_target_spec *last, uint32_t next, void *end,
++                     struct dm_target_spec **spec, char **target_params)
++{
++      *spec = (struct dm_target_spec *) ((unsigned char *) last + next);
++      *target_params = (char *) (*spec + 1);
++
++      if (*spec < (last + 1))
++              return -EINVAL;
++
++      return invalid_str(*target_params, end);
++}
++
++static int populate_table(struct dm_table *table,
++                        struct dm_ioctl *param, size_t param_size)
++{
++      int r;
++      unsigned int i = 0;
++      struct dm_target_spec *spec = (struct dm_target_spec *) param;
++      uint32_t next = param->data_start;
++      void *end = (void *) param + param_size;
++      char *target_params;
++
++      if (!param->target_count) {
++              DMWARN("populate_table: no targets specified");
++              return -EINVAL;
++      }
++
++      for (i = 0; i < param->target_count; i++) {
++
++              r = next_target(spec, next, end, &spec, &target_params);
++              if (r) {
++                      DMWARN("unable to find target");
++                      return r;
++              }
++
++              r = dm_table_add_target(table, spec->target_type,
++                                      (sector_t) spec->sector_start,
++                                      (sector_t) spec->length,
++                                      target_params);
++              if (r) {
++                      DMWARN("error adding target to table");
++                      return r;
++              }
++
++              next = spec->next;
++      }
++
++      return dm_table_complete(table);
++}
++
++static int table_load(struct dm_ioctl *param, size_t param_size)
++{
++      int r;
++      struct hash_cell *hc;
++      struct dm_table *t;
++
++      r = dm_table_create(&t, get_mode(param));
++      if (r)
++              return r;
++
++      r = populate_table(t, param, param_size);
++      if (r) {
++              dm_table_put(t);
++              return r;
++      }
++
++      down_write(&_hash_lock);
++      hc = __find_device_hash_cell(param);
++      if (!hc) {
++              DMWARN("device doesn't appear to be in the dev hash table.");
++              up_write(&_hash_lock);
++              return -ENXIO;
++      }
++
++      hc->new_map = t;
++      param->flags |= DM_INACTIVE_PRESENT_FLAG;
++
++      r = __dev_status(hc->md, param);
++      up_write(&_hash_lock);
++      return r;
++}
++
++static int table_clear(struct dm_ioctl *param, size_t param_size)
++{
++      int r;
++      struct hash_cell *hc;
++
++      down_write(&_hash_lock);
++
++      hc = __find_device_hash_cell(param);
++      if (!hc) {
++              DMWARN("device doesn't appear to be in the dev hash table.");
++              up_write(&_hash_lock);
++              return -ENXIO;
++      }
++
++      if (hc->new_map) {
++              dm_table_put(hc->new_map);
++              hc->new_map = NULL;
++      }
++
++      param->flags &= ~DM_INACTIVE_PRESENT_FLAG;
++
++      r = __dev_status(hc->md, param);
++      up_write(&_hash_lock);
++      return r;
++}
++
++/*
++ * Retrieves a list of devices used by a particular dm device.
++ */
++static void retrieve_deps(struct dm_table *table,
++                        struct dm_ioctl *param, size_t param_size)
++{
++      unsigned int count = 0;
++      struct list_head *tmp;
++      size_t len, needed;
++      struct dm_target_deps *deps;
++
++      deps = get_result_buffer(param, param_size, &len);
++
++      /*
++       * Count the devices.
++       */
++      list_for_each(tmp, dm_table_get_devices(table))
++              count++;
++
++      /*
++       * Check we have enough space.
++       */
++      needed = sizeof(*deps) + (sizeof(*deps->dev) * count);
++      if (len < needed) {
++              param->flags |= DM_BUFFER_FULL_FLAG;
++              return;
++      }
++
++      /*
++       * Fill in the devices.
++       */
++      deps->count = count;
++      count = 0;
++      list_for_each(tmp, dm_table_get_devices(table)) {
++              struct dm_dev *dd = list_entry(tmp, struct dm_dev, list);
++              deps->dev[count++] = dd->bdev->bd_dev;
++      }
++
++      param->data_size = param->data_start + needed;
++}
++
++static int table_deps(struct dm_ioctl *param, size_t param_size)
++{
++      int r = 0;
++      struct mapped_device *md;
++      struct dm_table *table;
++
++      md = find_device(param);
++      if (!md)
++              return -ENXIO;
++
++      r = __dev_status(md, param);
++      if (r)
++              goto out;
++
++      table = dm_get_table(md);
++      if (table) {
++              retrieve_deps(table, param, param_size);
++              dm_table_put(table);
++      }
++
++ out:
++      dm_put(md);
++      return r;
++}
++
++/*
++ * Build up the status struct for each target
++ */
++static void retrieve_status(struct dm_table *table,
++                          struct dm_ioctl *param, size_t param_size)
++{
++      unsigned int i, num_targets;
++      struct dm_target_spec *spec;
++      char *outbuf, *outptr;
++      status_type_t type;
++      size_t remaining, len, used = 0;
++
++      outptr = outbuf = get_result_buffer(param, param_size, &len);
++
++      if (param->flags & DM_STATUS_TABLE_FLAG)
++              type = STATUSTYPE_TABLE;
++      else
++              type = STATUSTYPE_INFO;
++
++      /* Get all the target info */
++      num_targets = dm_table_get_num_targets(table);
++      for (i = 0; i < num_targets; i++) {
++              struct dm_target *ti = dm_table_get_target(table, i);
++
++              remaining = len - (outptr - outbuf);
++              if (remaining < sizeof(struct dm_target_spec)) {
++                      param->flags |= DM_BUFFER_FULL_FLAG;
++                      break;
++              }
++
++              spec = (struct dm_target_spec *) outptr;
++
++              spec->status = 0;
++              spec->sector_start = ti->begin;
++              spec->length = ti->len;
++              strncpy(spec->target_type, ti->type->name,
++                      sizeof(spec->target_type));
++
++              outptr += sizeof(struct dm_target_spec);
++              remaining = len - (outptr - outbuf);
++
++              /* Get the status/table string from the target driver */
++              if (ti->type->status) {
++                      if (ti->type->status(ti, type, outptr, remaining)) {
++                              param->flags |= DM_BUFFER_FULL_FLAG;
++                              break;
++                      }
++              } else
++                      outptr[0] = '\0';
++
++              outptr += strlen(outptr) + 1;
++              used = param->data_start + (outptr - outbuf);
++
++              align_ptr(outptr);
++              spec->next = outptr - outbuf;
++      }
++
++      if (used)
++              param->data_size = used;
++
++      param->target_count = num_targets;
++}
++
++/*
++ * Return the status of a device as a text string for each
++ * target.
++ */
++static int table_status(struct dm_ioctl *param, size_t param_size)
++{
++      int r;
++      struct mapped_device *md;
++      struct dm_table *table;
++
++      md = find_device(param);
++      if (!md)
++              return -ENXIO;
++
++      r = __dev_status(md, param);
++      if (r)
++              goto out;
++
++      table = dm_get_table(md);
++      if (table) {
++              retrieve_status(table, param, param_size);
++              dm_table_put(table);
++      }
++
++ out:
++      dm_put(md);
++      return r;
++}
++
++/*-----------------------------------------------------------------
++ * Implementation of open/close/ioctl on the special char
++ * device.
++ *---------------------------------------------------------------*/
++static ioctl_fn lookup_ioctl(unsigned int cmd)
++{
++      static struct {
++              int cmd;
++              ioctl_fn fn;
++      } _ioctls[] = {
++              {DM_VERSION_CMD, NULL}, /* version is dealt with elsewhere */
++              {DM_REMOVE_ALL_CMD, remove_all},
++              {DM_LIST_DEVICES_CMD, list_devices},
++
++              {DM_DEV_CREATE_CMD, dev_create},
++              {DM_DEV_REMOVE_CMD, dev_remove},
++              {DM_DEV_RENAME_CMD, dev_rename},
++              {DM_DEV_SUSPEND_CMD, dev_suspend},
++              {DM_DEV_STATUS_CMD, dev_status},
++              {DM_DEV_WAIT_CMD, dev_wait},
++
++              {DM_TABLE_LOAD_CMD, table_load},
++              {DM_TABLE_CLEAR_CMD, table_clear},
++              {DM_TABLE_DEPS_CMD, table_deps},
++              {DM_TABLE_STATUS_CMD, table_status}
++      };
++
++      return (cmd >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[cmd].fn;
++}
++
++/*
++ * As well as checking the version compatibility this always
++ * copies the kernel interface version out.
++ */
++static int check_version(unsigned int cmd, struct dm_ioctl *user)
++{
++      uint32_t version[3];
++      int r = 0;
++
++      if (copy_from_user(version, user->version, sizeof(version)))
++              return -EFAULT;
++
++      if ((DM_VERSION_MAJOR != version[0]) ||
++          (DM_VERSION_MINOR < version[1])) {
++              DMWARN("ioctl interface mismatch: "
++                     "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)",
++                     DM_VERSION_MAJOR, DM_VERSION_MINOR,
++                     DM_VERSION_PATCHLEVEL,
++                     version[0], version[1], version[2], cmd);
++              r = -EINVAL;
++      }
++
++      /*
++       * Fill in the kernel version.
++       */
++      version[0] = DM_VERSION_MAJOR;
++      version[1] = DM_VERSION_MINOR;
++      version[2] = DM_VERSION_PATCHLEVEL;
++      if (copy_to_user(user->version, version, sizeof(version)))
++              return -EFAULT;
++
++      return r;
++}
++
++static void free_params(struct dm_ioctl *param)
++{
++      vfree(param);
++}
++
++static int copy_params(struct dm_ioctl *user, struct dm_ioctl **param)
++{
++      struct dm_ioctl tmp, *dmi;
++
++      if (copy_from_user(&tmp, user, sizeof(tmp)))
++              return -EFAULT;
++
++      if (tmp.data_size < sizeof(tmp))
++              return -EINVAL;
++
++      dmi = (struct dm_ioctl *) vmalloc(tmp.data_size);
++      if (!dmi)
++              return -ENOMEM;
++
++      if (copy_from_user(dmi, user, tmp.data_size)) {
++              vfree(dmi);
++              return -EFAULT;
++      }
++
++      *param = dmi;
++      return 0;
++}
++
++static int validate_params(uint cmd, struct dm_ioctl *param)
++{
++      /* Always clear this flag */
++      param->flags &= ~DM_BUFFER_FULL_FLAG;
++
++      /* Ignores parameters */
++      if (cmd == DM_REMOVE_ALL_CMD || cmd == DM_LIST_DEVICES_CMD)
++              return 0;
++
++      /* Unless creating, either name or uuid but not both */
++      if (cmd != DM_DEV_CREATE_CMD) {
++              if ((!*param->uuid && !*param->name) ||
++                  (*param->uuid && *param->name)) {
++                      DMWARN("one of name or uuid must be supplied, cmd(%u)",
++                             cmd);
++                      return -EINVAL;
++              }
++      }
++
++      /* Ensure strings are terminated */
++      param->name[DM_NAME_LEN - 1] = '\0';
++      param->uuid[DM_UUID_LEN - 1] = '\0';
++
++      return 0;
++}
++
++static int ctl_ioctl(struct inode *inode, struct file *file,
++                   uint command, ulong u)
++{
++      int r = 0;
++      unsigned int cmd;
++      struct dm_ioctl *param;
++      struct dm_ioctl *user = (struct dm_ioctl *) u;
++      ioctl_fn fn = NULL;
++      size_t param_size;
++
++      /* only root can play with this */
++      if (!capable(CAP_SYS_ADMIN))
++              return -EACCES;
++
++      if (_IOC_TYPE(command) != DM_IOCTL)
++              return -ENOTTY;
++
++      cmd = _IOC_NR(command);
++
++      /*
++       * Check the interface version passed in.  This also
++       * writes out the kernel's interface version.
++       */
++      r = check_version(cmd, user);
++      if (r)
++              return r;
++
++      /*
++       * Nothing more to do for the version command.
++       */
++      if (cmd == DM_VERSION_CMD)
++              return 0;
++
++      fn = lookup_ioctl(cmd);
++      if (!fn) {
++              DMWARN("dm_ctl_ioctl: unknown command 0x%x", command);
++              return -ENOTTY;
++      }
++
++      /*
++       * Trying to avoid low memory issues when a device is
++       * suspended.
++       */
++      current->flags |= PF_MEMALLOC;
++
++      /*
++       * Copy the parameters into kernel space.
++       */
++      r = copy_params(user, &param);
++      if (r) {
++              current->flags &= ~PF_MEMALLOC;
++              return r;
++      }
++
++      /*
++       * FIXME: eventually we will remove the PF_MEMALLOC flag
++       * here.  However the tools still do nasty things like
++       * 'load' while a device is suspended.
++       */
++
++      r = validate_params(cmd, param);
++      if (r)
++              goto out;
++
++      param_size = param->data_size;
++      param->data_size = sizeof(*param);
++      r = fn(param, param_size);
++
++      /*
++       * Copy the results back to userland.
++       */
++      if (!r && copy_to_user(user, param, param->data_size))
++              r = -EFAULT;
++
++ out:
++      free_params(param);
++      current->flags &= ~PF_MEMALLOC;
++      return r;
++}
++
++static struct file_operations _ctl_fops = {
++      .ioctl   = ctl_ioctl,
++      .owner   = THIS_MODULE,
++};
++
++static struct miscdevice _dm_misc = {
++      .minor          = MISC_DYNAMIC_MINOR,
++      .name           = DM_NAME,
++      .devfs_name     = "mapper/control",
++      .fops           = &_ctl_fops
++};
++
++/*
++ * Create misc character device and link to DM_DIR/control.
++ */
++int __init dm_interface_init(void)
++{
++      int r;
++
++      r = dm_hash_init();
++      if (r)
++              return r;
++
++      r = misc_register(&_dm_misc);
++      if (r) {
++              DMERR("misc_register failed for control device");
++              dm_hash_exit();
++              return r;
++      }
++
++      DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR,
++             DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA,
++             DM_DRIVER_EMAIL);
++      return 0;
++}
++
++void dm_interface_exit(void)
++{
++      if (misc_deregister(&_dm_misc) < 0)
++              DMERR("misc_deregister failed for control device");
++
++      dm_hash_exit();
++}
+--- linux-2.6.0-test1/drivers/md/dm-table.c    2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/md/dm-table.c   2003-07-19 17:03:49.000000000 -0700
+@@ -48,11 +48,9 @@ struct dm_table {
+        */
+       struct io_restrictions limits;
+-      /*
+-       * A waitqueue for processes waiting for something
+-       * interesting to happen to this table.
+-       */
+-      wait_queue_head_t eventq;
++      /* events get handed up using this callback */
++      void (*event_fn)(void *);
++      void *event_context;
+ };
+ /*
+@@ -222,7 +220,6 @@ int dm_table_create(struct dm_table **re
+               return -ENOMEM;
+       }
+-      init_waitqueue_head(&t->eventq);
+       t->mode = mode;
+       *result = t;
+       return 0;
+@@ -243,9 +240,6 @@ void table_destroy(struct dm_table *t)
+ {
+       unsigned int i;
+-      /* destroying the table counts as an event */
+-      dm_table_event(t);
+-
+       /* free the indexes (see dm_table_complete) */
+       if (t->depth >= 2)
+               vfree(t->index[t->depth - 2]);
+@@ -694,9 +688,22 @@ int dm_table_complete(struct dm_table *t
+       return r;
+ }
++static spinlock_t _event_lock = SPIN_LOCK_UNLOCKED;
++void dm_table_event_callback(struct dm_table *t,
++                           void (*fn)(void *), void *context)
++{
++      spin_lock_irq(&_event_lock);
++      t->event_fn = fn;
++      t->event_context = context;
++      spin_unlock_irq(&_event_lock);
++}
++
+ void dm_table_event(struct dm_table *t)
+ {
+-      wake_up_interruptible(&t->eventq);
++      spin_lock(&_event_lock);
++      if (t->event_fn)
++              t->event_fn(t->event_context);
++      spin_unlock(&_event_lock);
+ }
+ sector_t dm_table_get_size(struct dm_table *t)
+@@ -761,11 +768,6 @@ int dm_table_get_mode(struct dm_table *t
+       return t->mode;
+ }
+-void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq)
+-{
+-      add_wait_queue(&t->eventq, wq);
+-}
+-
+ void dm_table_suspend_targets(struct dm_table *t)
+ {
+       int i;
+--- linux-2.6.0-test1/drivers/md/Kconfig       2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/md/Kconfig      2003-07-19 17:03:49.000000000 -0700
+@@ -145,5 +145,12 @@ config BLK_DEV_DM
+         If unsure, say N.
++config DM_IOCTL_V4
++      bool "ioctl interface version 4"
++      depends on BLK_DEV_DM
++      ---help---
++        Recent tools use a new version of the ioctl interface, only
++          select this option if you intend using such tools.
++
+ endmenu
+--- linux-2.6.0-test1/drivers/md/linear.c      2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/md/linear.c     2003-07-19 17:04:58.000000000 -0700
+@@ -114,6 +114,8 @@ static int linear_run (mddev_t *mddev)
+               }
+               disk->rdev = rdev;
++              blk_queue_stack_limits(&mddev->queue,
++                                     rdev->bdev->bd_disk->queue);
+               disk->size = rdev->size;
+               mddev->array_size += rdev->size;
+--- linux-2.6.0-test1/drivers/md/md.c  2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/md/md.c 2003-07-19 17:03:49.000000000 -0700
+@@ -52,8 +52,6 @@
+ #define MD_DRIVER
+ #define DEVICE_NR(device) (minor(device))
+-#include <linux/blk.h>
+-
+ #define DEBUG 0
+ #define dprintk(x...) ((void)(DEBUG && printk(x)))
+--- linux-2.6.0-test1/drivers/md/multipath.c   2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/md/multipath.c  2003-07-19 17:04:58.000000000 -0700
+@@ -271,6 +271,8 @@ static int multipath_add_disk(mddev_t *m
+       for (path=0; path<mddev->raid_disks; path++) 
+               if ((p=conf->multipaths+path)->rdev == NULL) {
+                       p->rdev = rdev;
++                      blk_queue_stack_limits(&mddev->queue,
++                                             rdev->bdev->bd_disk->queue);
+                       conf->working_disks++;
+                       rdev->raid_disk = path;
+                       rdev->in_sync = 1;
+@@ -408,6 +410,8 @@ static int multipath_run (mddev_t *mddev
+               disk = conf->multipaths + disk_idx;
+               disk->rdev = rdev;
++              blk_queue_stack_limits(&mddev->queue,
++                                     rdev->bdev->bd_disk->queue);
+               if (!rdev->faulty) 
+                       conf->working_disks++;
+       }
+--- linux-2.6.0-test1/drivers/md/raid0.c       2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/md/raid0.c      2003-07-19 17:04:58.000000000 -0700
+@@ -113,6 +113,8 @@ static int create_strip_zones (mddev_t *
+                       goto abort;
+               }
+               zone->dev[j] = rdev1;
++              blk_queue_stack_limits(&mddev->queue,
++                                     rdev1->bdev->bd_disk->queue);
+               if (!smallest || (rdev1->size <smallest->size))
+                       smallest = rdev1;
+               cnt++;
+@@ -293,7 +295,6 @@ static int raid0_run (mddev_t *mddev)
+               conf->hash_spacing++;
+       }
+-      blk_queue_max_sectors(&mddev->queue, mddev->chunk_size >> 9);
+       blk_queue_merge_bvec(&mddev->queue, raid0_mergeable_bvec);
+       return 0;
+--- linux-2.6.0-test1/drivers/md/raid1.c       2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/md/raid1.c      2003-07-19 17:04:58.000000000 -0700
+@@ -678,6 +678,8 @@ static int raid1_add_disk(mddev_t *mddev
+       for (mirror=0; mirror < mddev->raid_disks; mirror++)
+               if ( !(p=conf->mirrors+mirror)->rdev) {
+                       p->rdev = rdev;
++                      blk_queue_stack_limits(&mddev->queue,
++                                             rdev->bdev->bd_disk->queue);
+                       p->head_position = 0;
+                       rdev->raid_disk = mirror;
+                       found = 1;
+@@ -1076,6 +1078,8 @@ static int run(mddev_t *mddev)
+               disk = conf->mirrors + disk_idx;
+               disk->rdev = rdev;
++              blk_queue_stack_limits(&mddev->queue,
++                                     rdev->bdev->bd_disk->queue);
+               disk->head_position = 0;
+               if (!rdev->faulty && rdev->in_sync)
+                       conf->working_disks++;
+--- linux-2.6.0-test1/drivers/media/common/Makefile    2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/media/common/Makefile   2003-07-19 17:03:49.000000000 -0700
+@@ -1,5 +1,5 @@
+ saa7146-objs    := saa7146_i2c.o saa7146_core.o 
+-saa7146_vv-objs := saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o  
++saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o  
+ obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o saa7146_vv.o
+--- linux-2.6.0-test1/drivers/media/common/saa7146_core.c      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_core.c     2003-07-19 17:03:49.000000000 -0700
+@@ -373,6 +373,9 @@ static int saa7146_init_one(struct pci_d
+       dev->module = THIS_MODULE;
+       init_waitqueue_head(&dev->i2c_wq);
++      /* set some default values */
++      saa7146_write(dev, BCS_CTRL, 0x80400040);
++
+       if( 0 != ext->probe) {
+               if( 0 != ext->probe(dev) ) {
+                       DEB_D(("ext->probe() failed for %p. skipping device.\n",dev));
+@@ -391,9 +394,6 @@ static int saa7146_init_one(struct pci_d
+       list_add_tail(&dev->item,&saa7146_devices);
+       saa7146_num++;
+-      /* set some default values */
+-      saa7146_write(dev, BCS_CTRL, 0x80400040);
+-
+       err = 0;
+       goto out;
+ attach_error:
+--- linux-2.6.0-test1/drivers/media/common/saa7146_fops.c      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_fops.c     2003-07-19 17:03:49.000000000 -0700
+@@ -106,10 +106,21 @@ void saa7146_buffer_next(struct saa7146_
+                       // fixme: fix this for vflip != 0
+                       saa7146_write(dev, PROT_ADDR1, 0);
++                      saa7146_write(dev, MC2, (MASK_02|MASK_18));             
++
+                       /* write the address of the rps-program */
+                       saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle);
+                       /* turn on rps */
+                       saa7146_write(dev, MC1, (MASK_12 | MASK_28));
++                              
++/*
++                      printk("vdma%d.base_even:     0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
++                      printk("vdma%d.base_odd:      0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
++                      printk("vdma%d.prot_addr:     0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
++                      printk("vdma%d.base_page:     0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
++                      printk("vdma%d.pitch:         0x%08x\n", 1,saa7146_read(dev,PITCH1));
++                      printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
++*/
+               }
+               del_timer(&q->timeout);
+       }
+@@ -374,7 +385,7 @@ static struct video_device device_templa
+       .minor          = -1,
+ };
+-int saa7146_vv_init(struct saa7146_dev* dev)
++int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv)
+ {
+       struct saa7146_vv *vv = kmalloc (sizeof(struct saa7146_vv),GFP_KERNEL);
+       if( NULL == vv ) {
+@@ -385,6 +396,11 @@ int saa7146_vv_init(struct saa7146_dev* 
+       DEB_EE(("dev:%p\n",dev));
+       
++      /* save per-device extension data (one extension can
++         handle different devices that might need different
++         configuration data) */
++      dev->ext_vv_data = ext_vv;
++      
+       vv->video_minor = -1;
+       vv->vbi_minor = -1;
+@@ -475,13 +491,6 @@ static void __exit saa7146_vv_cleanup_mo
+ module_init(saa7146_vv_init_module);
+ module_exit(saa7146_vv_cleanup_module);
+-EXPORT_SYMBOL_GPL(saa7146_set_hps_source_and_sync);
+-EXPORT_SYMBOL_GPL(saa7146_register_device);
+-EXPORT_SYMBOL_GPL(saa7146_unregister_device);
+-
+-EXPORT_SYMBOL_GPL(saa7146_vv_init);
+-EXPORT_SYMBOL_GPL(saa7146_vv_release);
+-
+ MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
+ MODULE_DESCRIPTION("video4linux driver for saa7146-based hardware");
+ MODULE_LICENSE("GPL");
+--- linux-2.6.0-test1/drivers/media/common/saa7146_hlp.c       2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_hlp.c      2003-07-19 17:03:49.000000000 -0700
+@@ -242,7 +242,9 @@ static int calculate_v_scale_registers(s
+               if( 2*out_y >= in_y) {
+                       lpi = 1;
+               }
+-      } else if (field == V4L2_FIELD_TOP || field == V4L2_FIELD_BOTTOM) {
++      } else if (field == V4L2_FIELD_TOP
++              || field == V4L2_FIELD_ALTERNATE
++              || field == V4L2_FIELD_BOTTOM) {
+               if( 4*out_y >= in_y ) {
+                       lpi = 1;
+               }
+@@ -468,9 +470,7 @@ static void calculate_clipping_registers
+       *clip_format &= 0xfffffff7;
+       if (V4L2_FIELD_HAS_BOTH(field)) {
+               *clip_format |= 0x00000008;
+-      } else if (field == V4L2_FIELD_TOP) {
+-              *clip_format |= 0x00000000;
+-      } else if (field == V4L2_FIELD_BOTTOM) {
++      } else {
+               *clip_format |= 0x00000000;
+       }
+ }
+@@ -593,6 +593,10 @@ static void saa7146_set_position(struct 
+       }
+       
+       if (V4L2_FIELD_HAS_BOTH(field)) {
++      } else if (field == V4L2_FIELD_ALTERNATE) {
++              /* fixme */
++              vdma1.base_odd = vdma1.prot_addr;
++              vdma1.pitch /= 2;
+       } else if (field == V4L2_FIELD_TOP) {
+               vdma1.base_odd = vdma1.prot_addr;
+               vdma1.pitch /= 2;
+@@ -706,7 +710,7 @@ void saa7146_write_out_dma(struct saa714
+       /* calculate starting address */
+       where  = (which-1)*0x18;
+-      if( 0 != (dev->ext->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
++      if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
+               saa7146_write(dev, where,       vdma->base_even);
+               saa7146_write(dev, where+0x04,  vdma->base_odd);
+       } else {
+@@ -760,6 +764,16 @@ static int calculate_video_dma_grab_pack
+       }
+       if (V4L2_FIELD_HAS_BOTH(field)) {
++      } else if (field == V4L2_FIELD_ALTERNATE) {
++              /* fixme */
++              if ( vv->last_field == V4L2_FIELD_TOP ) {
++                      vdma1.base_odd  = vdma1.prot_addr;
++                      vdma1.pitch /= 2;
++              } else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
++                      vdma1.base_odd  = vdma1.base_even;
++                      vdma1.base_even = vdma1.prot_addr;
++                      vdma1.pitch /= 2;
++              }
+       } else if (field == V4L2_FIELD_TOP) {
+               vdma1.base_odd  = vdma1.prot_addr;
+               vdma1.pitch /= 2;
+@@ -896,6 +910,14 @@ static int calculate_video_dma_grab_plan
+       }
+       if (V4L2_FIELD_HAS_BOTH(field)) {
++      } else if (field == V4L2_FIELD_ALTERNATE) {
++              /* fixme */
++              vdma1.base_odd  = vdma1.prot_addr;
++              vdma1.pitch /= 2;
++              vdma2.base_odd  = vdma2.prot_addr;
++              vdma2.pitch /= 2;
++              vdma3.base_odd  = vdma3.prot_addr;
++              vdma3.pitch /= 2;
+       } else if (field == V4L2_FIELD_TOP) {
+               vdma1.base_odd  = vdma1.prot_addr;
+               vdma1.pitch /= 2;
+@@ -935,21 +957,22 @@ static int calculate_video_dma_grab_plan
+ static void program_capture_engine(struct saa7146_dev *dev, int planar)
+ {
+       struct saa7146_vv *vv = dev->vv_data;
++      int count = 0;
+       unsigned long e_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_E_FID_A : CMD_E_FID_B;
+       unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
+-      if( 0 != (dev->ext->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
++      if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
+               unsigned long tmp = e_wait;
+               e_wait = o_wait;
+               o_wait = tmp;
+       }
+-      /* wait for o_fid_a/b / e_fid_a/b toggle only if bit 0 is not set*/
+-      WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
++      /* wait for o_fid_a/b / e_fid_a/b toggle only if rps register 0 is not set*/
+       WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | o_wait);
++      WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
+-      /* set bit 0 */
++      /* set rps register 0 */
+       WRITE_RPS0(CMD_WR_REG | (1 << 8) | (MC2/4));    
+       WRITE_RPS0(MASK_27 | MASK_11);
+       
+@@ -970,8 +993,14 @@ static void program_capture_engine(struc
+       }
+       
+       /* wait for o_fid_a/b / e_fid_a/b toggle */
++      if ( vv->last_field == V4L2_FIELD_INTERLACED ) {
++              WRITE_RPS0(CMD_PAUSE | o_wait);
+       WRITE_RPS0(CMD_PAUSE | e_wait);
++      } else if ( vv->last_field == V4L2_FIELD_TOP ) {
+       WRITE_RPS0(CMD_PAUSE | o_wait);
++      } else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
++              WRITE_RPS0(CMD_PAUSE | e_wait);
++      }
+       /* turn off video-dma1 */
+       WRITE_RPS0(CMD_WR_REG_MASK | (MC1/4));
+@@ -999,13 +1028,39 @@ static void program_capture_engine(struc
+ void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next)
+ {
+       struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
++      struct saa7146_vv *vv = dev->vv_data;
++      u32 vdma1_prot_addr;
+       DEB_CAP(("buf:%p, next:%p\n",buf,next));
++/*
++      printk("vdma%d.base_even:     0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1));
++      printk("vdma%d.base_odd:      0x%08x\n", 1,saa7146_read(dev,BASE_ODD1));
++      printk("vdma%d.prot_addr:     0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1));
++      printk("vdma%d.base_page:     0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1));
++      printk("vdma%d.pitch:         0x%08x\n", 1,saa7146_read(dev,PITCH1));
++      printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1));
++      printk("vdma%d => vptr      : 0x%08x\n", 1,saa7146_read(dev,PCI_VDP1));
++*/
++
++      vdma1_prot_addr = saa7146_read(dev, PROT_ADDR1);
++      if( 0 == vdma1_prot_addr ) {
++              /* clear out beginning of streaming bit (rps register 0)*/
++              DEB_CAP(("forcing sync to new frame\n"));
++              saa7146_write(dev, MC2, MASK_27 );
++      }
++
+       saa7146_set_window(dev, buf->fmt->width, buf->fmt->height, buf->fmt->field);
+       saa7146_set_output_format(dev, sfmt->trans);
+       saa7146_disable_clipping(dev);
++      if ( vv->last_field == V4L2_FIELD_INTERLACED ) {
++      } else if ( vv->last_field == V4L2_FIELD_TOP ) {
++              vv->last_field = V4L2_FIELD_BOTTOM;
++      } else if ( vv->last_field == V4L2_FIELD_BOTTOM ) {
++              vv->last_field = V4L2_FIELD_TOP;
++      }
++
+       if( 0 != IS_PLANAR(sfmt->trans)) {
+               calculate_video_dma_grab_planar(dev, buf);
+               program_capture_engine(dev,1);
+--- linux-2.6.0-test1/drivers/media/common/saa7146_i2c.c       2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_i2c.c      2003-07-19 17:03:49.000000000 -0700
+@@ -181,9 +181,10 @@ static int saa7146_i2c_reset(struct saa7
+ /* this functions writes out the data-byte 'dword' to the i2c-device.
+    it returns 0 if ok, -1 if the transfer failed, -2 if the transfer
+    failed badly (e.g. address error) */
+-static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword)
++static int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword, int short_delay)
+ {
+       u32 status = 0, mc2 = 0;
++      int trial = 0;
+       int timeout;
+       /* write out i2c-command */
+@@ -224,10 +225,13 @@ static int saa7146_i2c_writeout(struct s
+               /* wait until we get a transfer done or error */
+               timeout = jiffies + HZ/100 + 1; /* 10ms */
+               while(1) {
++                      /**
++                       *  first read usually delivers bogus results...
++                       */
++                      saa7146_i2c_status(dev);
+                       status = saa7146_i2c_status(dev);
+-                      if( (0x3 == (status & 0x3)) || (0 == (status & 0x1)) ) {
++                      if ((status & 0x3) != 1)
+                               break;
+-                      }
+                       if (jiffies > timeout) {
+                               /* this is normal when probing the bus
+                                * (no answer from nonexisistant device...)
+@@ -235,6 +239,9 @@ static int saa7146_i2c_writeout(struct s
+                               DEB_I2C(("saa7146_i2c_writeout: timed out waiting for end of xfer\n"));
+                               return -EIO;
+                       }
++                      if ((++trial < 20) && short_delay)
++                              udelay(10);
++                      else
+                       my_wait(dev,1);
+               }
+       }
+@@ -277,6 +284,7 @@ int saa7146_i2c_transfer(struct saa7146_
+       u32* buffer = dev->d_i2c.cpu_addr;
+       int err = 0;
+         int address_err = 0;
++        int short_delay = 0;
+       
+       if (down_interruptible (&dev->i2c_lock))
+               return -ERESTARTSYS;
+@@ -292,6 +300,8 @@ int saa7146_i2c_transfer(struct saa7146_
+               goto out;
+       }
++        if (count > 3) short_delay = 1;
++  
+       do {
+               /* reset the i2c-device if necessary */
+               err = saa7146_i2c_reset(dev);
+@@ -302,7 +312,7 @@ int saa7146_i2c_transfer(struct saa7146_
+               /* write out the u32s one after another */
+               for(i = 0; i < count; i++) {
+-                      err = saa7146_i2c_writeout(dev, &buffer[i] );
++                      err = saa7146_i2c_writeout(dev, &buffer[i], short_delay);
+                       if ( 0 != err) {
+                               /* this one is unsatisfying: some i2c slaves on some
+                                  dvb cards don't acknowledge correctly, so the saa7146
+@@ -357,7 +367,7 @@ out:
+       if( 0 == dev->revision ) {
+               u32 zero = 0;
+               saa7146_i2c_reset(dev);
+-              if( 0 != saa7146_i2c_writeout(dev, &zero)) {
++              if( 0 != saa7146_i2c_writeout(dev, &zero, short_delay)) {
+                       INFO(("revision 0 error. this should never happen.\n"));
+               }
+       }
+@@ -397,8 +407,13 @@ int saa7146_i2c_adapter_prepare(struct s
+       if( NULL != i2c_adapter ) {
+               memset(i2c_adapter,0,sizeof(struct i2c_adapter));
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
++              strcpy(i2c_adapter->name, dev->name);   
++              i2c_adapter->data = dev;
++#else
+               strcpy(i2c_adapter->dev.name, dev->name);       
+               i2c_set_adapdata(i2c_adapter,dev);
++#endif
+               i2c_adapter->algo          = &saa7146_algo;
+               i2c_adapter->algo_data     = NULL;
+               i2c_adapter->id            = I2C_ALGO_SAA7146;
+--- linux-2.6.0-test1/drivers/media/common/saa7146_vbi.c       2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_vbi.c      2003-07-19 17:03:49.000000000 -0700
+@@ -9,6 +9,7 @@ static int vbi_workaround(struct saa7146
+         u32          *cpu;
+         dma_addr_t   dma_addr;
+       
++      int count = 0;
+       int i;
+       DECLARE_WAITQUEUE(wait, current);
+@@ -443,5 +444,3 @@ struct saa7146_use_ops saa7146_vbi_uops 
+       .irq_done       = vbi_irq_done,
+       .read           = vbi_read,
+ };
+-
+-EXPORT_SYMBOL_GPL(saa7146_vbi_uops);
+--- linux-2.6.0-test1/drivers/media/common/saa7146_video.c     2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/common/saa7146_video.c    2003-07-19 17:03:49.000000000 -0700
+@@ -137,6 +137,7 @@ static int try_win(struct saa7146_dev *d
+         switch (field) {
+         case V4L2_FIELD_TOP:
+         case V4L2_FIELD_BOTTOM:
++        case V4L2_FIELD_ALTERNATE:
+                 maxh = maxh / 2;
+                 break;
+         case V4L2_FIELD_INTERLACED:
+@@ -186,11 +187,18 @@ static int try_fmt(struct saa7146_fh *fh
+                               : V4L2_FIELD_BOTTOM;
+               }
+               switch (field) {
++              case V4L2_FIELD_ALTERNATE: {
++                      vv->last_field = V4L2_FIELD_TOP;
++                      maxh = maxh / 2;
++                      break;
++              }
+               case V4L2_FIELD_TOP:
+               case V4L2_FIELD_BOTTOM:
++                      vv->last_field = V4L2_FIELD_INTERLACED;
+                       maxh = maxh / 2;
+                       break;
+               case V4L2_FIELD_INTERLACED:
++                      vv->last_field = V4L2_FIELD_INTERLACED;
+                       break;
+               default: {
+                       DEB_D(("no known field mode '%d'.\n",field));
+@@ -220,7 +228,7 @@ static int try_fmt(struct saa7146_fh *fh
+       }
+ }
+-static int start_preview(struct saa7146_fh *fh)
++int saa7146_start_preview(struct saa7146_fh *fh)
+ {
+       struct saa7146_dev *dev = fh->dev;
+       struct saa7146_vv *vv = dev->vv_data;
+@@ -266,12 +274,12 @@ static int start_preview(struct saa7146_
+       return 0;
+ }
+-static int stop_preview(struct saa7146_fh *fh)
++int saa7146_stop_preview(struct saa7146_fh *fh)
+ {
+       struct saa7146_dev *dev = fh->dev;
+       struct saa7146_vv *vv = dev->vv_data;
+-      DEB_EE(("saa7146.o: stop_preview()\n"));
++      DEB_EE(("saa7146.o: saa7146_stop_preview()\n"));
+       /* check if overlay is running */
+       if( 0 == vv->ov_data ) {
+@@ -333,8 +341,8 @@ static int s_fmt(struct saa7146_fh *fh, 
+               if( vv->ov_data != NULL ) {
+                       if( fh == vv->ov_data->fh) {
+                               spin_lock_irqsave(&dev->slock,flags);
+-                              stop_preview(fh);
+-                              start_preview(fh);
++                              saa7146_stop_preview(fh);
++                              saa7146_start_preview(fh);
+                               spin_unlock_irqrestore(&dev->slock,flags);
+                       }
+               }
+@@ -522,8 +530,8 @@ static int set_control(struct saa7146_fh
+               if( 0 != vv->ov_data ) {
+                       if( fh == vv->ov_data->fh ) {
+                               spin_lock_irqsave(&dev->slock,flags);
+-                              stop_preview(fh);
+-                              start_preview(fh);
++                              saa7146_stop_preview(fh);
++                              saa7146_start_preview(fh);
+                               spin_unlock_irqrestore(&dev->slock,flags);
+                       }
+               }
+@@ -561,7 +569,7 @@ static int saa7146_pgtable_build(struct 
+                               m3 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1;
+                               o1 = size%PAGE_SIZE;
+                               o2 = (size+(size/4))%PAGE_SIZE;
+-                              printk("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2);
++                              DEB_CAP(("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2));
+                               break;
+                       }
+                       case 16: {
+@@ -571,7 +579,7 @@ static int saa7146_pgtable_build(struct 
+                               m3 = ((2*size+PAGE_SIZE)/PAGE_SIZE)-1;
+                               o1 = size%PAGE_SIZE;
+                               o2 = (size+(size/2))%PAGE_SIZE;
+-                              printk("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2);
++                              DEB_CAP(("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2));
+                               break;
+                       }
+                       default: {
+@@ -674,7 +682,7 @@ static int video_begin(struct saa7146_fh
+       spin_lock_irqsave(&dev->slock,flags);
+-      /* clear out beginning of streaming bit */
++      /* clear out beginning of streaming bit (rps register 0)*/
+       saa7146_write(dev, MC2, MASK_27 );
+       /* enable rps0 irqs */
+@@ -740,19 +748,19 @@ int saa7146_video_do_ioctl(struct inode 
+       struct videobuf_queue *q;
+       /* check if extension handles the command */
+-      for(ee = 0; dev->ext->ext_vv_data->ioctls[ee].flags != 0; ee++) {
+-              if( cmd == dev->ext->ext_vv_data->ioctls[ee].cmd )
++      for(ee = 0; dev->ext_vv_data->ioctls[ee].flags != 0; ee++) {
++              if( cmd == dev->ext_vv_data->ioctls[ee].cmd )
+                       break;
+       }
+       
+-      if( 0 != (dev->ext->ext_vv_data->ioctls[ee].flags & SAA7146_EXCLUSIVE) ) {
++      if( 0 != (dev->ext_vv_data->ioctls[ee].flags & SAA7146_EXCLUSIVE) ) {
+               DEB_D(("extension handles ioctl exclusive.\n"));
+-              result = dev->ext->ext_vv_data->ioctl(dev, cmd, arg);
++              result = dev->ext_vv_data->ioctl(fh, cmd, arg);
+               return result;
+       }
+-      if( 0 != (dev->ext->ext_vv_data->ioctls[ee].flags & SAA7146_BEFORE) ) {
++      if( 0 != (dev->ext_vv_data->ioctls[ee].flags & SAA7146_BEFORE) ) {
+               DEB_D(("extension handles ioctl before.\n"));
+-              result = dev->ext->ext_vv_data->ioctl(dev, cmd, arg);
++              result = dev->ext_vv_data->ioctl(fh, cmd, arg);
+               if( -EAGAIN != result ) {
+                       return result;
+               }
+@@ -793,7 +801,7 @@ int saa7146_video_do_ioctl(struct inode 
+                       V4L2_CAP_VIDEO_OVERLAY |
+                       V4L2_CAP_READWRITE | 
+                       V4L2_CAP_STREAMING;
+-              cap->capabilities |= dev->ext->ext_vv_data->capabilities;
++              cap->capabilities |= dev->ext_vv_data->capabilities;
+               return 0;
+       }
+       case VIDIOC_G_FBUF:
+@@ -942,9 +950,10 @@ int saa7146_video_do_ioctl(struct inode 
+               struct v4l2_standard *e = arg;
+               if (e->index < 0 )
+                       return -EINVAL;
+-              if( e->index < dev->ext->ext_vv_data->num_stds ) {
++              if( e->index < dev->ext_vv_data->num_stds ) {
+                       DEB_EE(("VIDIOC_ENUMSTD: index:%d\n",e->index));
+-                      return v4l2_video_std_construct(e, dev->ext->ext_vv_data->stds[e->index].id, dev->ext->ext_vv_data->stds[e->index].name);
++                      v4l2_video_std_construct(e, dev->ext_vv_data->stds[e->index].id, dev->ext_vv_data->stds[e->index].name);
++                      return 0;
+               }
+               return -EINVAL;
+       }
+@@ -968,22 +977,22 @@ int saa7146_video_do_ioctl(struct inode 
+               if( vv->ov_data != NULL ) {
+                       ov_fh = vv->ov_data->fh;
+-                      stop_preview(ov_fh);
++                      saa7146_stop_preview(ov_fh);
+                       restart_overlay = 1;
+               }
+-              for(i = 0; i < dev->ext->ext_vv_data->num_stds; i++)
+-                      if (*id & dev->ext->ext_vv_data->stds[i].id)
++              for(i = 0; i < dev->ext_vv_data->num_stds; i++)
++                      if (*id & dev->ext_vv_data->stds[i].id)
+                               break;
+-              if (i != dev->ext->ext_vv_data->num_stds) {
+-                      vv->standard = &dev->ext->ext_vv_data->stds[i];
+-                      if( NULL != dev->ext->ext_vv_data->std_callback )
+-                              dev->ext->ext_vv_data->std_callback(dev, vv->standard);
++              if (i != dev->ext_vv_data->num_stds) {
++                      vv->standard = &dev->ext_vv_data->stds[i];
++                      if( NULL != dev->ext_vv_data->std_callback )
++                              dev->ext_vv_data->std_callback(dev, vv->standard);
+                       found = 1;
+               }
+               if( 0 != restart_overlay ) {
+-                      start_preview(ov_fh);
++                      saa7146_start_preview(ov_fh);
+               }
+               up(&dev->lock);
+@@ -1000,7 +1009,7 @@ int saa7146_video_do_ioctl(struct inode 
+               int on = *(int *)arg;
+               int err = 0;
+-              if( NULL == vv->ov_fmt ) {
++              if( NULL == vv->ov_fmt && on != 0 ) {
+                       DEB_D(("VIDIOC_OVERLAY: no framebuffer informations. call S_FBUF first!\n"));
+                       return -EAGAIN;
+               }
+@@ -1013,7 +1022,7 @@ int saa7146_video_do_ioctl(struct inode 
+                               }
+                       }
+                       spin_lock_irqsave(&dev->slock,flags);
+-                      err = start_preview(fh);
++                      err = saa7146_start_preview(fh);
+                       spin_unlock_irqrestore(&dev->slock,flags);
+               } else {
+                       if( vv->ov_data != NULL ) {
+@@ -1022,7 +1031,7 @@ int saa7146_video_do_ioctl(struct inode 
+                               }
+                       }
+                       spin_lock_irqsave(&dev->slock,flags);
+-                      err = stop_preview(fh);
++                      err = saa7146_stop_preview(fh);
+                       spin_unlock_irqrestore(&dev->slock,flags);
+               }
+               return err;
+@@ -1036,12 +1045,18 @@ int saa7146_video_do_ioctl(struct inode 
+               return videobuf_querybuf(q,arg);
+       }
+       case VIDIOC_QBUF: {
+-              DEB_D(("VIDIOC_QBUF \n"));
+-              return videobuf_qbuf(file,q,arg);
++              struct v4l2_buffer *b = arg;
++              int ret = 0;
++              ret = videobuf_qbuf(file,q,b);
++              DEB_D(("VIDIOC_QBUF: ret:%d, index:%d\n",ret,b->index));
++              return ret;
+       }
+       case VIDIOC_DQBUF: {
+-              DEB_D(("VIDIOC_DQBUF \n"));
+-              return videobuf_dqbuf(file,q,arg);
++              struct v4l2_buffer *b = arg;
++              int ret = 0;
++              ret = videobuf_dqbuf(file,q,b);
++              DEB_D(("VIDIOC_DQBUF: ret:%d, index:%d\n",ret,b->index));
++              return ret;
+       }
+       case VIDIOC_STREAMON: {
+               DEB_D(("VIDIOC_STREAMON \n"));
+@@ -1075,7 +1090,7 @@ int saa7146_video_do_ioctl(struct inode 
+               q = &fh->video_q;
+               down(&q->lock);
+-              err = videobuf_mmap_setup(file,q,gbuffers,gbufsize);
++              err = videobuf_mmap_setup(file,q,gbuffers,gbufsize); // ,V4L2_MEMORY_MMAP);
+               if (err < 0) {
+                       up(&q->lock);
+                       return err;
+@@ -1250,7 +1265,7 @@ static void video_init(struct saa7146_de
+       vv->video_q.dev              = dev;
+       /* set some default values */
+-      vv->standard = &dev->ext->ext_vv_data->stds[0];
++      vv->standard = &dev->ext_vv_data->stds[0];
+       /* FIXME: what's this? */
+       vv->current_hps_source = SAA7146_HPS_SOURCE_PORT_A;
+@@ -1287,7 +1302,7 @@ static void video_close(struct saa7146_d
+       if( 0 != vv->ov_data ) {
+               if( fh == vv->ov_data->fh ) {
+                       spin_lock_irqsave(&dev->slock,flags);
+-                      stop_preview(fh);
++                      saa7146_stop_preview(fh);
+                       spin_unlock_irqrestore(&dev->slock,flags);
+               }
+       }
+@@ -1331,7 +1346,7 @@ static ssize_t video_read(struct file *f
+       if( vv->ov_data != NULL ) {
+               ov_fh = vv->ov_data->fh;
+-              stop_preview(ov_fh);
++              saa7146_stop_preview(ov_fh);
+               restart_overlay = 1;
+       }
+@@ -1343,7 +1358,7 @@ static ssize_t video_read(struct file *f
+       /* restart overlay if it was active before */
+       if( 0 != restart_overlay ) {
+-              start_preview(ov_fh);
++              saa7146_start_preview(ov_fh);
+       }
+       
+       return ret;
+@@ -1358,5 +1373,3 @@ struct saa7146_use_ops saa7146_video_uop
+       .capture_begin = video_begin,
+       .capture_end = video_end,
+ };
+-
+-EXPORT_SYMBOL_GPL(saa7146_video_uops);
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/common/saa7146_vv_ksyms.c 2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,15 @@
++#include <linux/module.h>
++#include <media/saa7146_vv.h>
++
++EXPORT_SYMBOL_GPL(saa7146_vbi_uops);
++EXPORT_SYMBOL_GPL(saa7146_video_uops);
++
++EXPORT_SYMBOL_GPL(saa7146_start_preview);
++EXPORT_SYMBOL_GPL(saa7146_stop_preview);
++
++EXPORT_SYMBOL_GPL(saa7146_set_hps_source_and_sync);
++EXPORT_SYMBOL_GPL(saa7146_register_device);
++EXPORT_SYMBOL_GPL(saa7146_unregister_device);
++
++EXPORT_SYMBOL_GPL(saa7146_vv_init);
++EXPORT_SYMBOL_GPL(saa7146_vv_release);
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/b2c2/Kconfig  2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,8 @@
++config DVB_B2C2_SKYSTAR
++      tristate "Technisat Skystar2 PCI"
++      depends on DVB_CORE
++      help
++        Support for the Skystar2 PCI DVB card by Technisat, which
++        is equipped with the FlexCopII chipset by B2C2.
++
++        Say Y if you own such a device and want to use it.
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/b2c2/Makefile 2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,3 @@
++obj-$(CONFIG_DVB_B2C2_SKYSTAR) += skystar2.o
++
++EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/b2c2/skystar2.c       2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,2506 @@
++/*
++ * skystar2.c - driver for the Technisat SkyStar2 PCI DVB card
++ *              based on the FlexCopII by B2C2,Inc.
++ *
++ * Copyright (C) 2003  V.C. , skystar@moldova.cc
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
++ */
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/pci.h>
++
++#include "dvb_i2c.h"
++#include "dvb_frontend.h"
++#include "dvb_functions.h"
++
++#include <linux/dvb/frontend.h>
++#include <linux/dvb/dmx.h>
++#include "dvb_demux.h"
++#include "dmxdev.h"
++#include "dvb_filter.h"
++#include "dvbdev.h"
++#include "demux.h"
++#include "dvb_net.h"
++
++static int debug = 0;
++#define dprintk(x...) do { if (debug) printk(x); } while (0)
++
++#define SizeOfBufDMA1 0x3AC00
++#define SizeOfBufDMA2 0x758
++
++struct dmaq {
++
++      u32 bus_addr;
++      u32 head;
++      u32 tail;
++      u32 buffer_size;
++      u8 *buffer;
++};
++
++struct packet_header {
++
++      u32 sync_byte;
++      u32 transport_error_indicator;
++      u32 payload_unit_start_indicator;
++      u32 transport_priority;
++      u32 pid;
++      u32 transport_scrambling_control;
++      u32 adaptation_field_control;
++      u32 continuity_counter;
++};
++
++struct adapter {
++
++      struct pci_dev *pdev;
++
++      u8 card_revision;
++      u32 b2c2_revision;
++      u32 PidFilterMax;
++      u32 MacFilterMax;
++      u32 irq;
++      u32 io_mem;
++      u32 io_port;
++      u8 mac_addr[8];
++      u32 dwSramType;
++
++      struct dvb_adapter *dvb_adapter;
++      struct dvb_demux demux;
++      struct dmxdev dmxdev;
++      struct dmx_frontend hw_frontend;
++      struct dmx_frontend mem_frontend;
++      struct dvb_i2c_bus *i2c_bus;
++      struct dvb_net dvbnet;
++
++      struct semaphore i2c_sem;
++
++      struct dmaq dmaq1;
++      struct dmaq dmaq2;
++
++      u32 dma_ctrl;
++      u32 dma_status;
++
++      u32 capturing;
++
++      spinlock_t lock;
++
++      u16 pids[0x27];
++      u32 mac_filter;
++};
++
++#define WriteRegDW(adapter,reg,value) writel(value, adapter->io_mem + reg)
++#define ReadRegDW(adapter,reg) readl(adapter->io_mem + reg)
++
++static void WriteRegOp(struct adapter *adapter, u32 reg, u32 operation, u32 andvalue, u32 orvalue)
++{
++      u32 tmp;
++
++      tmp = ReadRegDW(adapter, reg);
++
++      if (operation == 1)
++              tmp = tmp | orvalue;
++      if (operation == 2)
++              tmp = tmp & andvalue;
++      if (operation == 3)
++              tmp = (tmp & andvalue) | orvalue;
++
++      WriteRegDW(adapter, reg, tmp);
++}
++
++/* i2c functions */
++static int i2cMainWriteForFlex2(struct adapter * adapter, u32 command, u8 * buf, u32 retries)
++{
++      u32 i;
++      u32 value;
++
++      WriteRegDW(adapter, 0x100, 0);
++      WriteRegDW(adapter, 0x100, command);
++
++      for (i = 0; i < retries; i++) {
++              value = ReadRegDW(adapter, 0x100);
++
++              if ((value & 0x40000000) == 0) {
++                      if ((value & 0x81000000) == 0x80000000) {
++                              if (buf != 0)
++                                      *buf = (value >> 0x10) & 0xff;
++
++                              return 1;
++                      }
++
++              } else {
++
++                      WriteRegDW(adapter, 0x100, 0);
++                      WriteRegDW(adapter, 0x100, command);
++              }
++      }
++
++      return 0;
++}
++
++/* device = 0x10000000 for tuner, 0x20000000 for eeprom */
++static void i2cMainSetup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
++{
++      *command = device | ((len - 1) << 26) | (value << 16) | (addr << 8) | chip_addr;
++
++      if (op != 0)
++              *command = *command | 0x03000000;
++      else
++              *command = *command | 0x01000000;
++}
++
++static int FlexI2cRead4(struct adapter * adapter, u32 device, u32 chip_addr, u16 addr, u8 * buf, u8 len)
++{
++      u32 command;
++      u32 value;
++
++      int result, i;
++
++      i2cMainSetup(device, chip_addr, 1, addr, 0, len, &command);
++
++      result = i2cMainWriteForFlex2(adapter, command, buf, 100000);
++
++      if ((result & 0xff) != 0) {
++              if (len > 1) {
++                      value = ReadRegDW(adapter, 0x104);
++
++                      for (i = 1; i < len; i++) {
++                              buf[i] = value & 0xff;
++                              value = value >> 8;
++                      }
++              }
++      }
++
++      return result;
++}
++
++static int FlexI2cWrite4(struct adapter * adapter, u32 device, u32 chip_addr, u32 addr, u8 * buf, u8 len)
++{
++      u32 command;
++      u32 value;
++      int i;
++
++      if (len > 1) {
++              value = 0;
++
++              for (i = len; i > 1; i--) {
++                      value = value << 8;
++                      value = value | buf[i - 1];
++              }
++
++              WriteRegDW(adapter, 0x104, value);
++      }
++
++      i2cMainSetup(device, chip_addr, 0, addr, buf[0], len, &command);
++
++      return i2cMainWriteForFlex2(adapter, command, 0, 100000);
++}
++
++static void fixchipaddr(u32 device, u32 bus, u32 addr, u32 *ret)
++{
++      if (device == 0x20000000)
++              *ret = bus | ((addr >> 8) & 3);
++
++      *ret = bus;
++}
++
++static u32 FLEXI2C_read(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
++{
++      u32 chipaddr;
++      u32 bytes_to_transfer;
++      u8 *start;
++
++//  dprintk("%s:\n", __FUNCTION__);
++
++      start = buf;
++
++      while (len != 0) {
++              bytes_to_transfer = len;
++
++              if (bytes_to_transfer > 4)
++                      bytes_to_transfer = 4;
++
++              fixchipaddr(device, bus, addr, &chipaddr);
++
++              if (FlexI2cRead4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
++                      return buf - start;
++
++              buf = buf + bytes_to_transfer;
++              addr = addr + bytes_to_transfer;
++              len = len - bytes_to_transfer;
++      };
++
++      return buf - start;
++}
++
++static u32 FLEXI2C_write(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
++{
++      u32 chipaddr;
++      u32 bytes_to_transfer;
++      u8 *start;
++
++//  dprintk("%s:\n", __FUNCTION__);
++
++      start = buf;
++
++      while (len != 0) {
++              bytes_to_transfer = len;
++
++              if (bytes_to_transfer > 4)
++                      bytes_to_transfer = 4;
++
++              fixchipaddr(device, bus, addr, &chipaddr);
++
++              if (FlexI2cWrite4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
++                      return buf - start;
++
++              buf = buf + bytes_to_transfer;
++              addr = addr + bytes_to_transfer;
++              len = len - bytes_to_transfer;
++      }
++
++      return buf - start;
++}
++
++static int master_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg *msgs, int num)
++{
++      struct adapter *tmp = i2c->data;
++      int i, ret = 0;
++
++      if (down_interruptible(&tmp->i2c_sem))
++              return -ERESTARTSYS;
++
++      if (0) {
++              dprintk("%s:\n", __FUNCTION__);
++
++              for (i = 0; i < num; i++) {
++                      printk("message %d: flags=%x, addr=0x%04x, buf=%x, len=%d \n", i, msgs[i].flags, msgs[i].addr, (u32) msgs[i].buf, msgs[i].len);
++              }
++      }
++      
++      /* allow only the vp310 frontend to access the bus */
++      if ((msgs[0].addr != 0x0E) && (msgs[0].addr != 0x61)) {
++              up(&tmp->i2c_sem);
++
++              return -EREMOTEIO;
++      }
++
++      if ((num == 1) && (msgs[0].buf != NULL)) {
++              if (msgs[0].flags == I2C_M_RD) {
++                      ret = -EINVAL;
++
++              } else {
++
++                      // single writes do have the reg addr in buf[0] and data in buf[1] to buf[n]
++                      ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], &msgs[0].buf[1], msgs[0].len - 1);
++
++                      if (ret != msgs[0].len - 1)
++                              ret = -EREMOTEIO;
++                      else
++                              ret = num;
++              }
++
++      } else if ((num == 2) && (msgs[1].buf != NULL)) {
++
++              // i2c reads consist of a reg addr _write_ followed by a data read, so msg[1].flags has to be examined
++              if (msgs[1].flags == I2C_M_RD) {
++                      ret = FLEXI2C_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
++
++              } else {
++
++                      ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
++              }
++
++              if (ret != msgs[1].len)
++                      ret = -EREMOTEIO;
++              else
++                      ret = num;
++      }
++
++      up(&tmp->i2c_sem);
++
++      /* master xfer functions always return the number of successfully
++         transmitted messages, not the number of transmitted bytes.
++         return -EREMOTEIO in case of failure. */
++      return ret;
++}
++
++/* SRAM (Skystar2 rev2.3 has one "ISSI IS61LV256" chip on board,
++   but it seems that FlexCopII can work with more than one chip) */
++static void SRAMSetNetDest(struct adapter * adapter, u8 dest)
++{
++      u32 tmp;
++
++      udelay(1000);
++
++      tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFFC) | (dest & 3);
++
++      udelay(1000);
++
++      WriteRegDW(adapter, 0x714, tmp);
++      WriteRegDW(adapter, 0x714, tmp);
++
++      udelay(1000);
++
++      /* return value is never used? */
++/*    return tmp; */
++}
++
++static void SRAMSetCaiDest(struct adapter * adapter, u8 dest)
++{
++      u32 tmp;
++
++      udelay(1000);
++
++      tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFF3) | ((dest & 3) << 2);
++
++      udelay(1000);
++      udelay(1000);
++
++      WriteRegDW(adapter, 0x714, tmp);
++      WriteRegDW(adapter, 0x714, tmp);
++
++      udelay(1000);
++
++      /* return value is never used? */
++/*    return tmp; */
++}
++
++static void SRAMSetCaoDest(struct adapter * adapter, u8 dest)
++{
++      u32 tmp;
++
++      udelay(1000);
++
++      tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFCF) | ((dest & 3) << 4);
++
++      udelay(1000);
++      udelay(1000);
++
++      WriteRegDW(adapter, 0x714, tmp);
++      WriteRegDW(adapter, 0x714, tmp);
++
++      udelay(1000);
++
++      /* return value is never used? */
++/*    return tmp; */
++}
++
++static void SRAMSetMediaDest(struct adapter * adapter, u8 dest)
++{
++      u32 tmp;
++
++      udelay(1000);
++
++      tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFF3F) | ((dest & 3) << 6);
++
++      udelay(1000);
++      udelay(1000);
++
++      WriteRegDW(adapter, 0x714, tmp);
++      WriteRegDW(adapter, 0x714, tmp);
++
++      udelay(1000);
++
++      /* return value is never used? */
++/*    return tmp; */
++}
++
++/* SRAM memory is accessed through a buffer register in the FlexCop
++   chip (0x700). This register has the following structure:
++    bits 0-14  : address
++    bit  15    : read/write flag
++    bits 16-23 : 8-bit word to write
++    bits 24-27 : = 4
++    bits 28-29 : memory bank selector
++    bit  31    : busy flag
++*/
++static void FlexSramWrite(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
++{
++      u32 i, command, retries;
++
++      for (i = 0; i < len; i++) {
++              command = bank | addr | 0x04000000 | (*buf << 0x10);
++
++              retries = 2;
++
++              while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
++                      mdelay(1);
++                      retries--;
++              };
++
++              if (retries == 0)
++                      printk("%s: SRAM timeout\n", __FUNCTION__);
++
++              WriteRegDW(adapter, 0x700, command);
++
++              buf++;
++              addr++;
++      }
++}
++
++static void FlexSramRead(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
++{
++      u32 i, command, value, retries;
++
++      for (i = 0; i < len; i++) {
++              command = bank | addr | 0x04008000;
++
++              retries = 10000;
++
++              while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
++                      mdelay(1);
++                      retries--;
++              };
++
++              if (retries == 0)
++                      printk("%s: SRAM timeout\n", __FUNCTION__);
++
++              WriteRegDW(adapter, 0x700, command);
++
++              retries = 10000;
++
++              while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
++                      mdelay(1);
++                      retries--;
++              };
++
++              if (retries == 0)
++                      printk("%s: SRAM timeout\n", __FUNCTION__);
++
++              value = ReadRegDW(adapter, 0x700) >> 0x10;
++
++              *buf = (value & 0xff);
++
++              addr++;
++              buf++;
++      }
++}
++
++static void SRAM_writeChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
++{
++      u32 bank;
++
++      bank = 0;
++
++      if (adapter->dwSramType == 0x20000) {
++              bank = (addr & 0x18000) << 0x0D;
++      }
++
++      if (adapter->dwSramType == 0x00000) {
++              if ((addr >> 0x0F) == 0)
++                      bank = 0x20000000;
++              else
++                      bank = 0x10000000;
++      }
++
++      FlexSramWrite(adapter, bank, addr & 0x7FFF, buf, len);
++}
++
++static void SRAM_readChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
++{
++      u32 bank;
++
++      bank = 0;
++
++      if (adapter->dwSramType == 0x20000) {
++              bank = (addr & 0x18000) << 0x0D;
++      }
++
++      if (adapter->dwSramType == 0x00000) {
++              if ((addr >> 0x0F) == 0)
++                      bank = 0x20000000;
++              else
++                      bank = 0x10000000;
++      }
++
++      FlexSramRead(adapter, bank, addr & 0x7FFF, buf, len);
++}
++
++static void SRAM_read(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
++{
++      u32 length;
++
++      while (len != 0) {
++              length = len;
++
++              // check if the address range belongs to the same 
++              // 32K memory chip. If not, the data is read from 
++              // one chip at a time.
++              if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
++                      length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
++              }
++
++              SRAM_readChunk(adapter, addr, buf, length);
++
++              addr = addr + length;
++              buf = buf + length;
++              len = len - length;
++      }
++}
++
++static void SRAM_write(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
++{
++      u32 length;
++
++      while (len != 0) {
++              length = len;
++
++              // check if the address range belongs to the same 
++              // 32K memory chip. If not, the data is written to
++              // one chip at a time.
++              if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
++                      length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
++              }
++
++              SRAM_writeChunk(adapter, addr, buf, length);
++
++              addr = addr + length;
++              buf = buf + length;
++              len = len - length;
++      }
++}
++
++static void SRAM_setSize(struct adapter *adapter, u32 mask)
++{
++      WriteRegDW(adapter, 0x71C, (mask | (~0x30000 & ReadRegDW(adapter, 0x71C))));
++}
++
++static void SRAM_init(struct adapter *adapter)
++{
++      u32 tmp;
++
++      tmp = ReadRegDW(adapter, 0x71C);
++
++      WriteRegDW(adapter, 0x71C, 1);
++
++      if (ReadRegDW(adapter, 0x71C) != 0) {
++              WriteRegDW(adapter, 0x71C, tmp);
++
++              adapter->dwSramType = tmp & 0x30000;
++
++              dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
++
++      } else {
++
++              adapter->dwSramType = 0x10000;
++
++              dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
++      }
++
++      /* return value is never used? */
++/*    return adapter->dwSramType; */
++}
++
++static int SRAM_testLocation(struct adapter *adapter, u32 mask, u32 addr)
++{
++      u8 tmp1, tmp2;
++
++      dprintk("%s: mask = %x, addr = %x\n", __FUNCTION__, mask, addr);
++
++      SRAM_setSize(adapter, mask);
++      SRAM_init(adapter);
++
++      tmp2 = 0xA5;
++      tmp1 = 0x4F;
++
++      SRAM_write(adapter, addr, &tmp2, 1);
++      SRAM_write(adapter, addr + 4, &tmp1, 1);
++
++      tmp2 = 0;
++
++      mdelay(20);
++
++      SRAM_read(adapter, addr, &tmp2, 1);
++      SRAM_read(adapter, addr, &tmp2, 1);
++
++      dprintk("%s: wrote 0xA5, read 0x%2x\n", __FUNCTION__, tmp2);
++
++      if (tmp2 != 0xA5)
++              return 0;
++
++      tmp2 = 0x5A;
++      tmp1 = 0xF4;
++
++      SRAM_write(adapter, addr, &tmp2, 1);
++      SRAM_write(adapter, addr + 4, &tmp1, 1);
++
++      tmp2 = 0;
++
++      mdelay(20);
++
++      SRAM_read(adapter, addr, &tmp2, 1);
++      SRAM_read(adapter, addr, &tmp2, 1);
++
++      dprintk("%s: wrote 0x5A, read 0x%2x\n", __FUNCTION__, tmp2);
++
++      if (tmp2 != 0x5A)
++              return 0;
++
++      return 1;
++}
++
++static u32 SRAM_length(struct adapter * adapter)
++{
++      if (adapter->dwSramType == 0x10000)
++              return 32768;   //  32K
++      if (adapter->dwSramType == 0x00000)
++              return 65536;   //  64K        
++      if (adapter->dwSramType == 0x20000)
++              return 131072;  // 128K
++
++      return 32768;           // 32K
++}
++
++/* FlexcopII can work with 32K, 64K or 128K of external SRAM memory.
++    - for 128K there are 4x32K chips at bank 0,1,2,3.
++    - for  64K there are 2x32K chips at bank 1,2.
++    - for  32K there is one 32K chip at bank 0.
++
++   FlexCop works only with one bank at a time. The bank is selected
++   by bits 28-29 of the 0x700 register.
++  
++   bank 0 covers addresses 0x00000-0x07FFF
++   bank 1 covers addresses 0x08000-0x0FFFF
++   bank 2 covers addresses 0x10000-0x17FFF
++   bank 3 covers addresses 0x18000-0x1FFFF
++*/
++static int SramDetectForFlex2(struct adapter *adapter)
++{
++      u32 tmp, tmp2, tmp3;
++
++      dprintk("%s:\n", __FUNCTION__);
++
++      tmp = ReadRegDW(adapter, 0x208);
++      WriteRegDW(adapter, 0x208, 0);
++
++      tmp2 = ReadRegDW(adapter, 0x71C);
++
++      dprintk("%s: tmp2 = %x\n", __FUNCTION__, tmp2);
++
++      WriteRegDW(adapter, 0x71C, 1);
++
++      tmp3 = ReadRegDW(adapter, 0x71C);
++
++      dprintk("%s: tmp3 = %x\n", __FUNCTION__, tmp3);
++
++      WriteRegDW(adapter, 0x71C, tmp2);
++
++      // check for internal SRAM ???
++      tmp3--;
++      if (tmp3 != 0) {
++              SRAM_setSize(adapter, 0x10000);
++              SRAM_init(adapter);
++              WriteRegDW(adapter, 0x208, tmp);
++
++              dprintk("%s: sram size = 32K\n", __FUNCTION__);
++
++              return 32;
++      }
++
++      if (SRAM_testLocation(adapter, 0x20000, 0x18000) != 0) {
++              SRAM_setSize(adapter, 0x20000);
++              SRAM_init(adapter);
++              WriteRegDW(adapter, 0x208, tmp);
++
++              dprintk("%s: sram size = 128K\n", __FUNCTION__);
++
++              return 128;
++      }
++
++      if (SRAM_testLocation(adapter, 0x00000, 0x10000) != 0) {
++              SRAM_setSize(adapter, 0x00000);
++              SRAM_init(adapter);
++              WriteRegDW(adapter, 0x208, tmp);
++
++              dprintk("%s: sram size = 64K\n", __FUNCTION__);
++
++              return 64;
++      }
++
++      if (SRAM_testLocation(adapter, 0x10000, 0x00000) != 0) {
++              SRAM_setSize(adapter, 0x10000);
++              SRAM_init(adapter);
++              WriteRegDW(adapter, 0x208, tmp);
++
++              dprintk("%s: sram size = 32K\n", __FUNCTION__);
++
++              return 32;
++      }
++
++      SRAM_setSize(adapter, 0x10000);
++      SRAM_init(adapter);
++      WriteRegDW(adapter, 0x208, tmp);
++
++      dprintk("%s: SRAM detection failed. Set to 32K \n", __FUNCTION__);
++
++      return 0;
++}
++
++static void SLL_detectSramSize(struct adapter *adapter)
++{
++      SramDetectForFlex2(adapter);
++}
++/* EEPROM (Skystar2 has one "24LC08B" chip on board) */
++/*
++static int EEPROM_write(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
++{
++      return FLEXI2C_write(adapter, 0x20000000, 0x50, addr, buf, len);
++}
++*/
++
++static int EEPROM_read(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
++{
++      return FLEXI2C_read(adapter, 0x20000000, 0x50, addr, buf, len);
++}
++
++u8 calc_LRC(u8 * buf, u32 len)
++{
++      u32 i;
++      u8 sum;
++
++      sum = 0;
++
++      for (i = 0; i < len; i++)
++              sum = sum ^ buf[i];
++
++      return sum;
++}
++
++static int EEPROM_LRC_read(struct adapter *adapter, u32 addr, u32 len, u8 * buf, u32 retries)
++{
++      int i;
++
++      for (i = 0; i < retries; i++) {
++              if (EEPROM_read(adapter, addr, buf, len) == len) {
++                      if (calc_LRC(buf, len - 1) == buf[len - 1])
++                              return 1;
++              }
++      }
++
++      return 0;
++}
++
++/*
++static int EEPROM_LRC_write(struct adapter *adapter, u32 addr, u32 len, u8 * wbuf, u8 * rbuf, u32 retries)
++{
++      int i;
++
++      for (i = 0; i < retries; i++) {
++              if (EEPROM_write(adapter, addr, wbuf, len) == len) {
++                      if (EEPROM_LRC_read(adapter, addr, len, rbuf, retries) == 1)
++                              return 1;
++              }
++      }
++
++      return 0;
++}
++*/
++
++/* These functions could be called from the initialization routine 
++   to unlock SkyStar2 cards, locked by "Europe On Line".
++        
++   in cards from "Europe On Line" the key is:
++
++       u8 key[20] = {
++          0xB2, 0x01, 0x00, 0x00,
++          0x00, 0x00, 0x00, 0x00,
++          0x00, 0x00, 0x00, 0x00,
++          0x00, 0x00, 0x00, 0x00,
++       };
++
++       LRC = 0xB3;
++
++  in unlocked cards the key is:
++
++       u8 key[20] = {
++          0xB2, 0x00, 0x00, 0x00,
++          0x00, 0x00, 0x00, 0x00,
++          0x00, 0x00, 0x00, 0x00,
++          0x00, 0x00, 0x00, 0x00,
++       };
++
++      LRC = 0xB2;
++*/
++/*
++static int EEPROM_writeKey(struct adapter *adapter, u8 * key, u32 len)
++{
++      u8 rbuf[20];
++      u8 wbuf[20];
++
++      if (len != 16)
++              return 0;
++
++      memcpy(wbuf, key, len);
++
++      wbuf[16] = 0;
++      wbuf[17] = 0;
++      wbuf[18] = 0;
++      wbuf[19] = calc_LRC(wbuf, 19);
++
++      return EEPROM_LRC_write(adapter, 0x3E4, 20, wbuf, rbuf, 4);
++}
++*/
++static int EEPROM_readKey(struct adapter *adapter, u8 * key, u32 len)
++{
++      u8 buf[20];
++
++      if (len != 16)
++              return 0;
++
++      if (EEPROM_LRC_read(adapter, 0x3E4, 20, buf, 4) == 0)
++              return 0;
++
++      memcpy(key, buf, len);
++
++      return 1;
++}
++
++static int EEPROM_getMacAddr(struct adapter *adapter, char type, u8 * mac)
++{
++      u8 tmp[8];
++
++      if (EEPROM_LRC_read(adapter, 0x3F8, 8, tmp, 4) != 0) {
++              if (type != 0) {
++                      mac[0] = tmp[0];
++                      mac[1] = tmp[1];
++                      mac[2] = tmp[2];
++                      mac[3] = 0xFE;
++                      mac[4] = 0xFF;
++                      mac[5] = tmp[3];
++                      mac[6] = tmp[4];
++                      mac[7] = tmp[5];
++
++              } else {
++
++                      mac[0] = tmp[0];
++                      mac[1] = tmp[1];
++                      mac[2] = tmp[2];
++                      mac[3] = tmp[3];
++                      mac[4] = tmp[4];
++                      mac[5] = tmp[5];
++              }
++
++              return 1;
++
++      } else {
++
++              if (type == 0) {
++                      memset(mac, 0, 6);
++
++              } else {
++
++                      memset(mac, 0, 8);
++              }
++
++              return 0;
++      }
++}
++
++/*
++static char EEPROM_setMacAddr(struct adapter *adapter, char type, u8 * mac)
++{
++      u8 tmp[8];
++
++      if (type != 0) {
++              tmp[0] = mac[0];
++              tmp[1] = mac[1];
++              tmp[2] = mac[2];
++              tmp[3] = mac[5];
++              tmp[4] = mac[6];
++              tmp[5] = mac[7];
++
++      } else {
++
++              tmp[0] = mac[0];
++              tmp[1] = mac[1];
++              tmp[2] = mac[2];
++              tmp[3] = mac[3];
++              tmp[4] = mac[4];
++              tmp[5] = mac[5];
++      }
++
++      tmp[6] = 0;
++      tmp[7] = calc_LRC(tmp, 7);
++
++      if (EEPROM_write(adapter, 0x3F8, tmp, 8) == 8)
++              return 1;
++
++      return 0;
++}
++*/
++
++/* PID filter */
++static void FilterEnableStream1Filter(struct adapter *adapter, u32 op)
++{
++      dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000001, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000001);
++      }
++}
++
++static void FilterEnableStream2Filter(struct adapter *adapter, u32 op)
++{
++      dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000002, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000002);
++      }
++}
++
++static void FilterEnablePcrFilter(struct adapter *adapter, u32 op)
++{
++      dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000004, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000004);
++      }
++}
++
++static void FilterEnablePmtFilter(struct adapter *adapter, u32 op)
++{
++      dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000008, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000008);
++      }
++}
++
++static void FilterEnableEmmFilter(struct adapter *adapter, u32 op)
++{
++      dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000010, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000010);
++      }
++}
++
++static void FilterEnableEcmFilter(struct adapter *adapter, u32 op)
++{
++      dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000020, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000020);
++      }
++}
++
++/*
++static void FilterEnableNullFilter(struct adapter *adapter, u32 op)
++{
++      dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000040, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000040);
++      }
++}
++*/
++
++static void FilterEnableMaskFilter(struct adapter *adapter, u32 op)
++{
++      dprintk("%s: op=%x\n", __FUNCTION__, op);
++
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000080, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000080);
++      }
++}
++
++
++static void CtrlEnableMAC(struct adapter *adapter, u32 op)
++{
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
++      }
++}
++
++static int CASetMacDstAddrFilter(struct adapter *adapter, u8 * mac)
++{
++      u32 tmp1, tmp2;
++
++      tmp1 = (mac[3] << 0x18) | (mac[2] << 0x10) | (mac[1] << 0x08) | mac[0];
++      tmp2 = (mac[5] << 0x08) | mac[4];
++
++      WriteRegDW(adapter, 0x418, tmp1);
++      WriteRegDW(adapter, 0x41C, tmp2);
++
++      return 0;
++}
++
++/*
++static void SetIgnoreMACFilter(struct adapter *adapter, u8 op)
++{
++      if (op != 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
++
++              adapter->mac_filter = 1;
++
++      } else {
++
++              if (adapter->mac_filter != 0) {
++                      adapter->mac_filter = 0;
++
++                      WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
++              }
++      }
++}
++*/
++
++/*
++static void CheckNullFilterEnable(struct adapter *adapter)
++{
++      FilterEnableNullFilter(adapter, 1);
++      FilterEnableMaskFilter(adapter, 1);
++}
++*/
++
++static void InitPIDsInfo(struct adapter *adapter)
++{
++      int i;
++
++      for (i = 0; i < 0x27; i++)
++              adapter->pids[i] = 0x1FFF;
++}
++
++static int CheckPID(struct adapter *adapter, u16 pid)
++{
++      u32 i;
++
++      if (pid == 0x1FFF)
++              return 0;
++
++      for (i = 0; i < 0x27; i++) {
++              if (adapter->pids[i] == pid)
++                      return 1;
++      }
++
++      return 0;
++}
++
++static void PidSetGroupPID(struct adapter * adapter, u32 pid)
++{
++      u32 value;
++
++      dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++      value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x30C) & 0xFFFF0000);
++
++      WriteRegDW(adapter, 0x30C, value);
++
++      /* return value is never used? */
++/*    return value; */
++}
++
++static void PidSetGroupMASK(struct adapter * adapter, u32 pid)
++{
++      u32 value;
++
++      dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++      value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x30C) & 0xFFFF);
++
++      WriteRegDW(adapter, 0x30C, value);
++
++      /* return value is never used? */
++/*    return value; */
++}
++
++static void PidSetStream1PID(struct adapter * adapter, u32 pid)
++{
++      u32 value;
++
++      dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++      value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x300) & 0xFFFFC000);
++
++      WriteRegDW(adapter, 0x300, value);
++
++      /* return value is never used? */
++/*    return value; */
++}
++
++static void PidSetStream2PID(struct adapter * adapter, u32 pid)
++{
++      u32 value;
++
++      dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++      value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x300) & 0xFFFF);
++
++      WriteRegDW(adapter, 0x300, value);
++
++      /* return value is never used? */
++/*    return value; */
++}
++
++static void PidSetPcrPID(struct adapter * adapter, u32 pid)
++{
++      u32 value;
++
++      dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++      value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x304) & 0xFFFFC000);
++
++      WriteRegDW(adapter, 0x304, value);
++
++      /* return value is never used? */
++/*    return value; */
++}
++
++static void PidSetPmtPID(struct adapter * adapter, u32 pid)
++{
++      u32 value;
++
++      dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++      value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x304) & 0x3FFF);
++
++      WriteRegDW(adapter, 0x304, value);
++
++      /* return value is never used? */
++/*    return value; */
++}
++
++static void PidSetEmmPID(struct adapter * adapter, u32 pid)
++{
++      u32 value;
++
++      dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++      value = (pid & 0xFFFF) | (ReadRegDW(adapter, 0x308) & 0xFFFF0000);
++
++      WriteRegDW(adapter, 0x308, value);
++
++      /* return value is never used? */
++/*    return value; */
++}
++
++static void PidSetEcmPID(struct adapter * adapter, u32 pid)
++{
++      u32 value;
++
++      dprintk("%s: pid=%x\n", __FUNCTION__, pid);
++
++      value = (pid << 0x10) | (ReadRegDW(adapter, 0x308) & 0xFFFF);
++
++      WriteRegDW(adapter, 0x308, value);
++
++      /* return value is never used? */
++/*    return value; */
++}
++
++static int PidGetStream1PID(struct adapter * adapter)
++{
++      return ReadRegDW(adapter, 0x300) & 0x00001FFF;
++}
++
++static int PidGetStream2PID(struct adapter * adapter)
++{
++      return (ReadRegDW(adapter, 0x300) >> 0x10)& 0x00001FFF;
++}
++
++static int PidGetPcrPID(struct adapter * adapter)
++{
++      return ReadRegDW(adapter, 0x304) & 0x00001FFF;
++}
++
++static int PidGetPmtPID(struct adapter * adapter)
++{
++      return (ReadRegDW(adapter, 0x304) >> 0x10)& 0x00001FFF;
++}
++
++static int PidGetEmmPID(struct adapter * adapter)
++{
++      return ReadRegDW(adapter, 0x308) & 0x00001FFF;
++}
++
++static int PidGetEcmPID(struct adapter * adapter)
++{
++      return (ReadRegDW(adapter, 0x308) >> 0x10)& 0x00001FFF;
++}
++
++static int PidGetGroupPID(struct adapter * adapter)
++{
++      return ReadRegDW(adapter, 0x30C) & 0x00001FFF;
++}
++
++static int PidGetGroupMASK(struct adapter * adapter)
++{
++      return (ReadRegDW(adapter, 0x30C) >> 0x10)& 0x00001FFF;
++}
++
++/*
++static void ResetHardwarePIDFilter(struct adapter *adapter)
++{
++      PidSetStream1PID(adapter, 0x1FFF);
++
++      PidSetStream2PID(adapter, 0x1FFF);
++      FilterEnableStream2Filter(adapter, 0);
++
++      PidSetPcrPID(adapter, 0x1FFF);
++      FilterEnablePcrFilter(adapter, 0);
++
++      PidSetPmtPID(adapter, 0x1FFF);
++      FilterEnablePmtFilter(adapter, 0);
++
++      PidSetEcmPID(adapter, 0x1FFF);
++      FilterEnableEcmFilter(adapter, 0);
++
++      PidSetEmmPID(adapter, 0x1FFF);
++      FilterEnableEmmFilter(adapter, 0);
++}
++*/
++
++static void OpenWholeBandwidth(struct adapter *adapter)
++{
++      PidSetGroupPID(adapter, 0);
++
++      PidSetGroupMASK(adapter, 0);
++
++      FilterEnableMaskFilter(adapter, 1);
++}
++
++static int AddHwPID(struct adapter *adapter, u32 pid)
++{
++      dprintk("%s: pid=%d\n", __FUNCTION__, pid);
++
++      if (pid <= 0x1F)
++              return 1;
++
++      if ((PidGetGroupMASK(adapter) == 0) && (PidGetGroupPID(adapter) == 0))
++              return 0;
++
++      if (PidGetStream1PID(adapter) == 0x1FFF) {
++              PidSetStream1PID(adapter, pid & 0xFFFF);
++
++              FilterEnableStream1Filter(adapter, 1);
++
++              return 1;
++      }
++
++      if (PidGetStream2PID(adapter) == 0x1FFF) {
++              PidSetStream2PID(adapter, (pid & 0xFFFF));
++
++              FilterEnableStream2Filter(adapter, 1);
++
++              return 1;
++      }
++
++      if (PidGetPcrPID(adapter) == 0x1FFF) {
++              PidSetPcrPID(adapter, (pid & 0xFFFF));
++
++              FilterEnablePcrFilter(adapter, 1);
++
++              return 1;
++      }
++
++      if ((PidGetPmtPID(adapter) & 0x1FFF) == 0x1FFF) {
++              PidSetPmtPID(adapter, (pid & 0xFFFF));
++
++              FilterEnablePmtFilter(adapter, 1);
++
++              return 1;
++      }
++
++      if ((PidGetEmmPID(adapter) & 0x1FFF) == 0x1FFF) {
++              PidSetEmmPID(adapter, (pid & 0xFFFF));
++
++              FilterEnableEmmFilter(adapter, 1);
++
++              return 1;
++      }
++
++      if ((PidGetEcmPID(adapter) & 0x1FFF) == 0x1FFF) {
++              PidSetEcmPID(adapter, (pid & 0xFFFF));
++
++              FilterEnableEcmFilter(adapter, 1);
++
++              return 1;
++      }
++
++      return -1;
++}
++
++static int RemoveHwPID(struct adapter *adapter, u32 pid)
++{
++      dprintk("%s: pid=%d\n", __FUNCTION__, pid);
++
++      if (pid <= 0x1F)
++              return 1;
++
++      if (PidGetStream1PID(adapter) == pid) {
++              PidSetStream1PID(adapter, 0x1FFF);
++
++              return 1;
++      }
++
++      if (PidGetStream2PID(adapter) == pid) {
++              PidSetStream2PID(adapter, 0x1FFF);
++
++              FilterEnableStream2Filter(adapter, 0);
++
++              return 1;
++      }
++
++      if (PidGetPcrPID(adapter) == pid) {
++              PidSetPcrPID(adapter, 0x1FFF);
++
++              FilterEnablePcrFilter(adapter, 0);
++
++              return 1;
++      }
++
++      if (PidGetPmtPID(adapter) == pid) {
++              PidSetPmtPID(adapter, 0x1FFF);
++
++              FilterEnablePmtFilter(adapter, 0);
++
++              return 1;
++      }
++
++      if (PidGetEmmPID(adapter) == pid) {
++              PidSetEmmPID(adapter, 0x1FFF);
++
++              FilterEnableEmmFilter(adapter, 0);
++
++              return 1;
++      }
++
++      if (PidGetEcmPID(adapter) == pid) {
++              PidSetEcmPID(adapter, 0x1FFF);
++
++              FilterEnableEcmFilter(adapter, 0);
++
++              return 1;
++      }
++
++      return -1;
++}
++
++static int AddPID(struct adapter *adapter, u32 pid)
++{
++      int i;
++
++      dprintk("%s: pid=%d\n", __FUNCTION__, pid);
++
++      if (pid > 0x1FFE)
++              return -1;
++
++      if (CheckPID(adapter, pid) == 1)
++              return 1;
++
++      for (i = 0; i < 0x27; i++) {
++              if (adapter->pids[i] == 0x1FFF) // find free pid filter
++              {
++                      adapter->pids[i] = pid;
++
++                      if (AddHwPID(adapter, pid) < 0)
++                              OpenWholeBandwidth(adapter);
++
++                      return 1;
++              }
++      }
++
++      return -1;
++}
++
++static int RemovePID(struct adapter *adapter, u32 pid)
++{
++      u32 i;
++
++      dprintk("%s: pid=%d\n", __FUNCTION__, pid);
++
++      if (pid > 0x1FFE)
++              return -1;
++
++      for (i = 0; i < 0x27; i++) {
++              if (adapter->pids[i] == pid) {
++                      adapter->pids[i] = 0x1FFF;
++
++                      RemoveHwPID(adapter, pid);
++
++                      return 1;
++              }
++      }
++
++      return -1;
++}
++
++/* dma & irq */
++static void CtrlEnableSmc(struct adapter *adapter, u32 op)
++{
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00000800, 0);
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00000800);
++      }
++}
++
++static void DmaEnableDisableIrq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
++{
++      adapter->dma_ctrl = adapter->dma_ctrl & 0x000F0000;
++
++      if (flag1 == 0) {
++              if (flag2 == 0)
++                      adapter->dma_ctrl = adapter->dma_ctrl & ~0x00010000;
++              else
++                      adapter->dma_ctrl = adapter->dma_ctrl | 0x00010000;
++
++              if (flag3 == 0)
++                      adapter->dma_ctrl = adapter->dma_ctrl & ~0x00020000;
++              else
++                      adapter->dma_ctrl = adapter->dma_ctrl | 0x00020000;
++
++      } else {
++
++              if (flag2 == 0)
++                      adapter->dma_ctrl = adapter->dma_ctrl & ~0x00040000;
++              else
++                      adapter->dma_ctrl = adapter->dma_ctrl | 0x00040000;
++
++              if (flag3 == 0)
++                      adapter->dma_ctrl = adapter->dma_ctrl & ~0x00080000;
++              else
++                      adapter->dma_ctrl = adapter->dma_ctrl | 0x00080000;
++      }
++}
++
++static void IrqDmaEnableDisableIrq(struct adapter * adapter, u32 op)
++{
++      u32 value;
++
++      value = ReadRegDW(adapter, 0x208) & 0xFFF0FFFF;
++
++      if (op != 0)
++              value = value | (adapter->dma_ctrl & 0x000F0000);
++
++      WriteRegDW(adapter, 0x208, value);
++}
++
++/* FlexCopII has 2 dma channels. DMA1 is used to transfer TS data to
++   system memory.
++
++   The DMA1 buffer is divided in 2 subbuffers of equal size.
++   FlexCopII will transfer TS data to one subbuffer, signal an interrupt
++   when the subbuffer is full and continue fillig the second subbuffer.
++
++   For DMA1:
++       subbuffer size in 32-bit words is stored in the first 24 bits of
++       register 0x004. The last 8 bits of register 0x004 contain the number
++       of subbuffers.
++       
++       the first 30 bits of register 0x000 contain the address of the first
++       subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
++       when dma1 is enabled.
++
++       the first 30 bits of register 0x00C contain the address of the second
++       subbuffer. the last 2 bits contain 1.
++
++       register 0x008 will contain the address of the subbuffer that was filled
++       with TS data, when FlexCopII will generate an interrupt.
++
++   For DMA2:
++       subbuffer size in 32-bit words is stored in the first 24 bits of
++       register 0x014. The last 8 bits of register 0x014 contain the number
++       of subbuffers.
++       
++       the first 30 bits of register 0x010 contain the address of the first
++       subbuffer.  The last 2 bits contain 0, when dma1 is disabled and 1,
++       when dma1 is enabled.
++
++       the first 30 bits of register 0x01C contain the address of the second
++       subbuffer. the last 2 bits contain 1.
++
++       register 0x018 contains the address of the subbuffer that was filled
++       with TS data, when FlexCopII generates an interrupt.
++*/
++static int DmaInitDMA(struct adapter *adapter, u32 dma_channel)
++{
++      u32 subbuffers, subbufsize, subbuf0, subbuf1;
++
++      if (dma_channel == 0) {
++              dprintk("%s: Initializing DMA1 channel\n", __FUNCTION__);
++
++              subbuffers = 2;
++
++              subbufsize = (((adapter->dmaq1.buffer_size / 2) / 4) << 8) | subbuffers;
++
++              subbuf0 = adapter->dmaq1.bus_addr & 0xFFFFFFFC;
++
++              subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xFFFFFFFC) | 1;
++
++              dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
++              udelay(1000);
++              WriteRegDW(adapter, 0x000, subbuf0);
++
++              dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
++              udelay(1000);
++              WriteRegDW(adapter, 0x004, subbufsize);
++
++              dprintk("%s: second subbuffer address = 0x%x\n", __FUNCTION__, subbuf1);
++              udelay(1000);
++              WriteRegDW(adapter, 0x00C, subbuf1);
++
++              dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
++              WriteRegDW(adapter, 0x008, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
++              udelay(1000);
++
++              if (subbuffers == 0)
++                      DmaEnableDisableIrq(adapter, 0, 1, 0);
++              else
++                      DmaEnableDisableIrq(adapter, 0, 1, 1);
++
++              IrqDmaEnableDisableIrq(adapter, 1);
++
++              SRAMSetMediaDest(adapter, 1);
++              SRAMSetNetDest(adapter, 1);
++              SRAMSetCaiDest(adapter, 2);
++              SRAMSetCaoDest(adapter, 2);
++      }
++
++      if (dma_channel == 1) {
++              dprintk("%s: Initializing DMA2 channel\n", __FUNCTION__);
++
++              subbuffers = 2;
++
++              subbufsize = (((adapter->dmaq2.buffer_size / 2) / 4) << 8) | subbuffers;
++
++              subbuf0 = adapter->dmaq2.bus_addr & 0xFFFFFFFC;
++
++              subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xFFFFFFFC) | 1;
++
++              dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
++              udelay(1000);
++              WriteRegDW(adapter, 0x010, subbuf0);
++
++              dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
++              udelay(1000);
++              WriteRegDW(adapter, 0x014, subbufsize);
++
++              dprintk("%s: second buffer address = 0x%x\n", __FUNCTION__, subbuf1);
++              udelay(1000);
++              WriteRegDW(adapter, 0x01C, subbuf1);
++
++              SRAMSetCaiDest(adapter, 2);
++      }
++
++      return 0;
++}
++
++static void CtrlEnableReceiveData(struct adapter *adapter, u32 op)
++{
++      if (op == 0) {
++              WriteRegOp(adapter, 0x208, 2, ~0x00008000, 0);
++
++              adapter->dma_status = adapter->dma_status & ~0x00000004;
++
++      } else {
++
++              WriteRegOp(adapter, 0x208, 1, 0, 0x00008000);
++
++              adapter->dma_status = adapter->dma_status | 0x00000004;
++      }
++}
++
++/* bit 0 of dma_mask is set to 1 if dma1 channel has to be enabled/disabled
++   bit 1 of dma_mask is set to 1 if dma2 channel has to be enabled/disabled
++*/
++static void DmaStartStop0x2102(struct adapter *adapter, u32 dma_mask, u32 start_stop)
++{
++      u32 dma_enable, dma1_enable, dma2_enable;
++
++      dprintk("%s: dma_mask=%x\n", __FUNCTION__, dma_mask);
++
++      if (start_stop == 1) {
++              dprintk("%s: starting dma\n", __FUNCTION__);
++
++              dma1_enable = 0;
++              dma2_enable = 0;
++
++              if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) == 0) && (adapter->dmaq1.bus_addr != 0)) {
++                      adapter->dma_status = adapter->dma_status | 1;
++                      dma1_enable = 1;
++              }
++
++              if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) == 0) && (adapter->dmaq2.bus_addr != 0)) {
++                      adapter->dma_status = adapter->dma_status | 2;
++                      dma2_enable = 1;
++              }
++              // enable dma1 and dma2
++              if ((dma1_enable == 1) && (dma2_enable == 1)) {
++                      WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
++                      WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
++                      WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
++
++                      CtrlEnableReceiveData(adapter, 1);
++
++                      return;
++              }
++              // enable dma1
++              if ((dma1_enable == 1) && (dma2_enable == 0)) {
++                      WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
++                      WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
++
++                      CtrlEnableReceiveData(adapter, 1);
++
++                      return;
++              }
++              // enable dma2
++              if ((dma1_enable == 0) && (dma2_enable == 1)) {
++                      WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
++
++                      CtrlEnableReceiveData(adapter, 1);
++
++                      return;
++              }
++              // start dma
++              if ((dma1_enable == 0) && (dma2_enable == 0)) {
++                      CtrlEnableReceiveData(adapter, 1);
++
++                      return;
++              }
++
++      } else {
++
++              dprintk("%s: stoping dma\n", __FUNCTION__);
++
++              dma_enable = adapter->dma_status & 0x00000003;
++
++              if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0)) {
++                      dma_enable = dma_enable & 0xFFFFFFFE;
++              }
++
++              if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0)) {
++                      dma_enable = dma_enable & 0xFFFFFFFD;
++              }
++              //stop dma
++              if ((dma_enable == 0) && ((adapter->dma_status & 4) != 0)) {
++                      CtrlEnableReceiveData(adapter, 0);
++
++                      udelay(3000);
++              }
++              //disable dma1
++              if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0) && (adapter->dmaq1.bus_addr != 0)) {
++                      WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr);
++                      WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
++
++                      adapter->dma_status = adapter->dma_status & ~0x00000001;
++              }
++              //disable dma2
++              if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0) && (adapter->dmaq2.bus_addr != 0)) {
++                      WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr);
++
++                      adapter->dma_status = adapter->dma_status & ~0x00000002;
++              }
++      }
++}
++
++static void OpenStream(struct adapter *adapter, u32 pid)
++{
++      u32 dma_mask;
++
++      if (adapter->capturing == 0)
++              adapter->capturing = 1;
++
++      FilterEnableMaskFilter(adapter, 1);
++
++      AddPID(adapter, pid);
++
++      dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
++
++      if ((adapter->dma_status & 7) != 7) {
++              dma_mask = 0;
++
++              if (((adapter->dma_status & 0x10000000) != 0) && ((adapter->dma_status & 1) == 0)) {
++                      dma_mask = dma_mask | 1;
++
++                      adapter->dmaq1.head = 0;
++                      adapter->dmaq1.tail = 0;
++
++                      memset(adapter->dmaq1.buffer, 0, adapter->dmaq1.buffer_size);
++              }
++
++              if (((adapter->dma_status & 0x20000000) != 0) && ((adapter->dma_status & 2) == 0)) {
++                      dma_mask = dma_mask | 2;
++
++                      adapter->dmaq2.head = 0;
++                      adapter->dmaq2.tail = 0;
++              }
++
++              if (dma_mask != 0) {
++                      IrqDmaEnableDisableIrq(adapter, 1);
++
++                      DmaStartStop0x2102(adapter, dma_mask, 1);
++              }
++      }
++}
++
++static void CloseStream(struct adapter *adapter, u32 pid)
++{
++      u32 dma_mask;
++
++      if (adapter->capturing != 0)
++              adapter->capturing = 0;
++
++      dprintk("%s: dma_status=%x\n", __FUNCTION__, adapter->dma_status);
++
++      dma_mask = 0;
++
++      if ((adapter->dma_status & 1) != 0)
++              dma_mask = dma_mask | 0x00000001;
++      if ((adapter->dma_status & 2) != 0)
++              dma_mask = dma_mask | 0x00000002;
++
++      if (dma_mask != 0) {
++              DmaStartStop0x2102(adapter, dma_mask, 0);
++      }
++
++      RemovePID(adapter, pid);
++}
++
++static void InterruptServiceDMA1(struct adapter *adapter)
++{
++      struct dvb_demux *dvbdmx = &adapter->demux;
++      struct packet_header packet_header;
++
++      int nCurDmaCounter;
++      u32 nNumBytesParsed;
++      u32 nNumNewBytesTransferred;
++      u32 dwDefaultPacketSize = 188;
++      u8 gbTmpBuffer[188];
++      u8 *pbDMABufCurPos;
++
++      nCurDmaCounter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
++      nCurDmaCounter = (nCurDmaCounter / dwDefaultPacketSize) * dwDefaultPacketSize;
++
++      if ((nCurDmaCounter < 0) || (nCurDmaCounter > adapter->dmaq1.buffer_size)) {
++              dprintk("%s: dma counter outside dma buffer\n", __FUNCTION__);
++              return;
++      }
++
++      adapter->dmaq1.head = nCurDmaCounter;
++
++      if (adapter->dmaq1.tail <= nCurDmaCounter) {
++              nNumNewBytesTransferred = nCurDmaCounter - adapter->dmaq1.tail;
++
++      } else {
++
++              nNumNewBytesTransferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + nCurDmaCounter;
++      }
++
++//  dprintk("%s: nCurDmaCounter   = %d\n" , __FUNCTION__, nCurDmaCounter);
++//    dprintk("%s: dmaq1.tail       = %d\n" , __FUNCTION__, adapter->dmaq1.tail):
++//  dprintk("%s: BytesTransferred = %d\n" , __FUNCTION__, nNumNewBytesTransferred);
++
++      if (nNumNewBytesTransferred < dwDefaultPacketSize)
++              return;
++
++      nNumBytesParsed = 0;
++
++      while (nNumBytesParsed < nNumNewBytesTransferred) {
++              pbDMABufCurPos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
++
++              if (adapter->dmaq1.buffer + adapter->dmaq1.buffer_size < adapter->dmaq1.buffer + adapter->dmaq1.tail + 188) {
++                      memcpy(gbTmpBuffer, adapter->dmaq1.buffer + adapter->dmaq1.tail, adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
++                      memcpy(gbTmpBuffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer, (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
++
++                      pbDMABufCurPos = gbTmpBuffer;
++              }
++
++              if (adapter->capturing != 0) {
++                      u32 *dq = (u32 *) pbDMABufCurPos;
++
++                      packet_header.sync_byte = *dq & 0x000000FF;
++                      packet_header.transport_error_indicator = *dq & 0x00008000;
++                      packet_header.payload_unit_start_indicator = *dq & 0x00004000;
++                      packet_header.transport_priority = *dq & 0x00002000;
++                      packet_header.pid = ((*dq & 0x00FF0000) >> 0x10) | (*dq & 0x00001F00);
++                      packet_header.transport_scrambling_control = *dq >> 0x1E;
++                      packet_header.adaptation_field_control = (*dq & 0x30000000) >> 0x1C;
++                      packet_header.continuity_counter = (*dq & 0x0F000000) >> 0x18;
++
++                      if ((packet_header.sync_byte == 0x47) && (packet_header.transport_error_indicator == 0) && (packet_header.pid != 0x1FFF)) {
++                              if (CheckPID(adapter, packet_header.pid & 0x0000FFFF) != 0) {
++                                      dvb_dmx_swfilter_packets(dvbdmx, pbDMABufCurPos, dwDefaultPacketSize / 188);
++
++                              } else {
++
++//                  dprintk("%s: pid=%x\n", __FUNCTION__, packet_header.pid);
++                              }
++                      }
++              }
++
++              nNumBytesParsed = nNumBytesParsed + dwDefaultPacketSize;
++
++              adapter->dmaq1.tail = adapter->dmaq1.tail + dwDefaultPacketSize;
++
++              if (adapter->dmaq1.tail >= adapter->dmaq1.buffer_size)
++                      adapter->dmaq1.tail = adapter->dmaq1.tail - adapter->dmaq1.buffer_size;
++      };
++}
++
++static void InterruptServiceDMA2(struct adapter *adapter)
++{
++      printk("%s:\n", __FUNCTION__);
++}
++
++static irqreturn_t isr(int irq, void *dev_id, struct pt_regs *regs)
++{
++      struct adapter *tmp = dev_id;
++
++      u32 value;
++
++//  dprintk("%s:\n", __FUNCTION__);
++
++      spin_lock_irq(&tmp->lock);
++
++      if (0 == ((value = ReadRegDW(tmp, 0x20C)) & 0x0F)) {
++              spin_unlock_irq(&tmp->lock);
++              return IRQ_NONE;
++      }
++      
++      while (value != 0) {
++              if ((value & 0x03) != 0)
++                      InterruptServiceDMA1(tmp);
++              if ((value & 0x0C) != 0)
++                      InterruptServiceDMA2(tmp);
++              value = ReadRegDW(tmp, 0x20C) & 0x0F;
++      }
++
++      spin_unlock_irq(&tmp->lock);
++      return IRQ_HANDLED;
++}
++
++static void Initdmaqueue(struct adapter *adapter)
++{
++      dma_addr_t dma_addr;
++
++      if (adapter->dmaq1.buffer != 0)
++              return;
++
++      adapter->dmaq1.head = 0;
++      adapter->dmaq1.tail = 0;
++      adapter->dmaq1.buffer = 0;
++
++      adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, &dma_addr);
++
++      if (adapter->dmaq1.buffer != 0) {
++              memset(adapter->dmaq1.buffer, 0, SizeOfBufDMA1);
++
++              adapter->dmaq1.bus_addr = dma_addr;
++              adapter->dmaq1.buffer_size = SizeOfBufDMA1;
++
++              DmaInitDMA(adapter, 0);
++
++              adapter->dma_status = adapter->dma_status | 0x10000000;
++
++              dprintk("%s: allocated dma buffer at 0x%x, length=%d\n", __FUNCTION__, (int) adapter->dmaq1.buffer, SizeOfBufDMA1);
++
++      } else {
++
++              adapter->dma_status = adapter->dma_status & ~0x10000000;
++      }
++
++      if (adapter->dmaq2.buffer != 0)
++              return;
++
++      adapter->dmaq2.head = 0;
++      adapter->dmaq2.tail = 0;
++      adapter->dmaq2.buffer = 0;
++
++      adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, &dma_addr);
++
++      if (adapter->dmaq2.buffer != 0) {
++              memset(adapter->dmaq2.buffer, 0, SizeOfBufDMA2);
++
++              adapter->dmaq2.bus_addr = dma_addr;
++              adapter->dmaq2.buffer_size = SizeOfBufDMA2;
++
++              DmaInitDMA(adapter, 1);
++
++              adapter->dma_status = adapter->dma_status | 0x20000000;
++
++              dprintk("%s: allocated dma buffer at 0x%x, length=%d\n", __FUNCTION__, (int) adapter->dmaq2.buffer, (int) SizeOfBufDMA2);
++
++      } else {
++
++              adapter->dma_status = adapter->dma_status & ~0x20000000;
++      }
++}
++
++static void Freedmaqueue(struct adapter *adapter)
++{
++      if (adapter->dmaq1.buffer != 0) {
++              pci_free_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
++
++              adapter->dmaq1.bus_addr = 0;
++              adapter->dmaq1.head = 0;
++              adapter->dmaq1.tail = 0;
++              adapter->dmaq1.buffer_size = 0;
++              adapter->dmaq1.buffer = 0;
++      }
++
++      if (adapter->dmaq2.buffer != 0) {
++              pci_free_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
++
++              adapter->dmaq2.bus_addr = 0;
++              adapter->dmaq2.head = 0;
++              adapter->dmaq2.tail = 0;
++              adapter->dmaq2.buffer_size = 0;
++              adapter->dmaq2.buffer = 0;
++      }
++}
++
++static void FreeAdapterObject(struct adapter *adapter)
++{
++      dprintk("%s:\n", __FUNCTION__);
++
++      CloseStream(adapter, 0);
++
++      if (adapter->irq != 0)
++              free_irq(adapter->irq, adapter);
++
++      Freedmaqueue(adapter);
++
++      if (adapter->io_mem != 0)
++              iounmap((void *) adapter->io_mem);
++
++      if (adapter != 0)
++              kfree(adapter);
++}
++
++static struct pci_driver skystar2_pci_driver;
++
++static int ClaimAdapter(struct adapter *adapter)
++{
++      struct pci_dev *pdev = adapter->pdev;
++
++      u16 var;
++
++      if (!request_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1), skystar2_pci_driver.name))
++              return -EBUSY;
++
++      if (!request_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0), skystar2_pci_driver.name))
++              return -EBUSY;
++
++      pci_read_config_byte(pdev, PCI_CLASS_REVISION, &adapter->card_revision);
++
++      dprintk("%s: card revision %x \n", __FUNCTION__, adapter->card_revision);
++
++      if (pci_enable_device(pdev))
++              return -EIO;
++
++      pci_read_config_word(pdev, 4, &var);
++
++      if ((var & 4) == 0)
++              pci_set_master(pdev);
++
++      adapter->io_port = pdev->resource[1].start;
++
++      adapter->io_mem = (u32) ioremap(pdev->resource[0].start, 0x800);
++
++      if (adapter->io_mem == 0) {
++              dprintk("%s: can not map io memory\n", __FUNCTION__);
++
++              return 2;
++      }
++
++      dprintk("%s: io memory maped at %x\n", __FUNCTION__, adapter->io_mem);
++
++      return 1;
++}
++
++/*
++static int SLL_reset_FlexCOP(struct adapter *adapter)
++{
++      WriteRegDW(adapter, 0x208, 0);
++      WriteRegDW(adapter, 0x210, 0xB2FF);
++
++      return 0;
++}
++*/
++
++static int DriverInitialize(struct pci_dev * pdev)
++{
++      struct adapter *adapter;
++      u32 tmp;
++      u8 key[16];
++
++      if (!(adapter = kmalloc(sizeof(struct adapter), GFP_KERNEL))) {
++              dprintk("%s: out of memory!\n", __FUNCTION__);
++
++              return -ENOMEM;
++      }
++
++      memset(adapter, 0, sizeof(struct adapter));
++
++      pci_set_drvdata(pdev,adapter);
++
++      adapter->pdev = pdev;
++      adapter->irq = pdev->irq;
++
++      if ((ClaimAdapter(adapter)) != 1) {
++              FreeAdapterObject(adapter);
++
++              return -ENODEV;
++      }
++
++      IrqDmaEnableDisableIrq(adapter, 0);
++
++      if (request_irq(pdev->irq, isr, 0x4000000, "Skystar2", adapter) != 0) {
++              dprintk("%s: unable to allocate irq=%d !\n", __FUNCTION__, pdev->irq);
++
++              FreeAdapterObject(adapter);
++
++              return -ENODEV;
++      }
++
++      ReadRegDW(adapter, 0x208);
++      WriteRegDW(adapter, 0x208, 0);
++      WriteRegDW(adapter, 0x210, 0xB2FF);
++      WriteRegDW(adapter, 0x208, 0x40);
++
++      InitPIDsInfo(adapter);
++
++      PidSetGroupPID(adapter, 0);
++      PidSetGroupMASK(adapter, 0x1FE0);
++      PidSetStream1PID(adapter, 0x1FFF);
++      PidSetStream2PID(adapter, 0x1FFF);
++      PidSetPmtPID(adapter, 0x1FFF);
++      PidSetPcrPID(adapter, 0x1FFF);
++      PidSetEcmPID(adapter, 0x1FFF);
++      PidSetEmmPID(adapter, 0x1FFF);
++
++      Initdmaqueue(adapter);
++
++      if ((adapter->dma_status & 0x30000000) == 0) {
++              FreeAdapterObject(adapter);
++
++              return -ENODEV;
++      }
++
++      adapter->b2c2_revision = (ReadRegDW(adapter, 0x204) >> 0x18);
++
++      if ((adapter->b2c2_revision != 0x82) && (adapter->b2c2_revision != 0xC3))
++              if (adapter->b2c2_revision != 0x82) {
++                      dprintk("%s: The revision of the FlexCopII chip on your card is - %d\n", __FUNCTION__, adapter->b2c2_revision);
++                      dprintk("%s: This driver works now only with FlexCopII(rev.130) and FlexCopIIB(rev.195).\n", __FUNCTION__);
++
++                      FreeAdapterObject(adapter);
++
++                      return -ENODEV;
++              }
++
++      tmp = ReadRegDW(adapter, 0x204);
++
++      WriteRegDW(adapter, 0x204, 0);
++      mdelay(20);
++
++      WriteRegDW(adapter, 0x204, tmp);
++      mdelay(10);
++
++      tmp = ReadRegDW(adapter, 0x308);
++      WriteRegDW(adapter, 0x308, 0x4000 | tmp);
++
++      adapter->dwSramType = 0x10000;
++
++      SLL_detectSramSize(adapter);
++
++      dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, SRAM_length(adapter), adapter->dwSramType);
++
++      SRAMSetMediaDest(adapter, 1);
++      SRAMSetNetDest(adapter, 1);
++
++      CtrlEnableSmc(adapter, 0);
++
++      SRAMSetCaiDest(adapter, 2);
++      SRAMSetCaoDest(adapter, 2);
++
++      DmaEnableDisableIrq(adapter, 1, 0, 0);
++
++      if (EEPROM_getMacAddr(adapter, 0, adapter->mac_addr) != 0) {
++              printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0], adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5], adapter->mac_addr[6], adapter->mac_addr[7]
++                  );
++
++              CASetMacDstAddrFilter(adapter, adapter->mac_addr);
++              CtrlEnableMAC(adapter, 1);
++      }
++
++      EEPROM_readKey(adapter, key, 16);
++
++      printk("%s key = \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n", __FUNCTION__, key[0], key[1], key[2], key[3], key[4], key[5], key[6], key[7], key[8], key[9], key[10], key[11], key[12], key[13], key[14], key[15]);
++
++      adapter->lock = SPIN_LOCK_UNLOCKED;
++
++      return 0;
++}
++
++static void DriverHalt(struct pci_dev *pdev)
++{
++      struct adapter *adapter;
++
++      adapter = pci_get_drvdata(pdev);
++
++      IrqDmaEnableDisableIrq(adapter, 0);
++
++      CtrlEnableReceiveData(adapter, 0);
++
++      FreeAdapterObject(adapter);
++
++      pci_set_drvdata(pdev, NULL);
++
++      release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
++
++      release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
++}
++
++static int dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++      struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
++      struct adapter *adapter = (struct adapter *) dvbdmx->priv;
++
++      dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
++
++      OpenStream(adapter, dvbdmxfeed->pid);
++
++      return 0;
++}
++
++static int dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++      struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
++      struct adapter *adapter = (struct adapter *) dvbdmx->priv;
++
++      dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
++
++      CloseStream(adapter, dvbdmxfeed->pid);
++
++      return 0;
++}
++
++/* lnb control */
++static void set_tuner_tone(struct adapter *adapter, u8 tone)
++{
++      u16 wzHalfPeriodFor45MHz[] = { 0x01FF, 0x0154, 0x00FF, 0x00CC };
++      u16 ax;
++
++      dprintk("%s: %u\n", __FUNCTION__, tone);
++
++      switch (tone) {
++      case 1:
++              ax = wzHalfPeriodFor45MHz[0];
++              break;
++      case 2:
++              ax = wzHalfPeriodFor45MHz[1];
++              break;
++      case 3:
++              ax = wzHalfPeriodFor45MHz[2];
++              break;
++      case 4:
++              ax = wzHalfPeriodFor45MHz[3];
++              break;
++
++      default:
++              ax = 0;
++      }
++
++      if (ax != 0) {
++              WriteRegDW(adapter, 0x200, ((ax << 0x0F) + (ax & 0x7FFF)) | 0x40000000);
++
++      } else {
++
++              WriteRegDW(adapter, 0x200, 0x40FF8000);
++      }
++}
++
++static void set_tuner_polarity(struct adapter *adapter, u8 polarity)
++{
++      u32 var;
++
++      dprintk("%s : polarity = %u \n", __FUNCTION__, polarity);
++
++      var = ReadRegDW(adapter, 0x204);
++
++      if (polarity == 0) {
++              dprintk("%s: LNB power off\n", __FUNCTION__);
++              var = var | 1;
++      };
++
++      if (polarity == 1) {
++              var = var & ~1;
++              var = var & ~4;
++      };
++
++      if (polarity == 2) {
++              var = var & ~1;
++              var = var | 4;
++      }
++
++      WriteRegDW(adapter, 0x204, var);
++}
++
++static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
++{
++      struct adapter *adapter = fe->before_after_data;
++
++      switch (cmd) {
++      case FE_SLEEP:
++              {
++                      printk("%s: FE_SLEEP\n", __FUNCTION__);
++
++                      set_tuner_polarity(adapter, 0);
++
++                      // return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
++                      return -EOPNOTSUPP;
++              }
++
++      case FE_SET_VOLTAGE:
++              {
++                      dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
++
++                      switch ((fe_sec_voltage_t) arg) {
++                      case SEC_VOLTAGE_13:
++
++                              printk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
++
++                              set_tuner_polarity(adapter, 1);
++
++                              break;
++
++                      case SEC_VOLTAGE_18:
++
++                              printk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
++
++                              set_tuner_polarity(adapter, 2);
++
++                              break;
++
++                      default:
++
++                              return -EINVAL;
++                      };
++
++                      break;
++              }
++
++      case FE_SET_TONE:
++              {
++                      dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
++
++                      switch ((fe_sec_tone_mode_t) arg) {
++                      case SEC_TONE_ON:
++
++                              printk("%s: SEC_TONE_ON, %x\n", __FUNCTION__, SEC_TONE_ON);
++
++                              set_tuner_tone(adapter, 1);
++
++                              break;
++
++                      case SEC_TONE_OFF:
++
++                              printk("%s: SEC_TONE_OFF, %x\n", __FUNCTION__, SEC_TONE_OFF);
++
++                              set_tuner_tone(adapter, 0);
++
++                              break;
++
++                      default:
++
++                              return -EINVAL;
++                      };
++
++                      break;
++              }
++
++      default:
++
++              return -EOPNOTSUPP;
++      };
++
++      return 0;
++}
++
++static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
++{
++      struct adapter *adapter;
++      struct dvb_adapter *dvb_adapter;
++      struct dvb_demux *dvbdemux;
++
++      int ret;
++
++      if (pdev == NULL)
++              return -ENODEV;
++
++      if (DriverInitialize(pdev) != 0)
++              return -ENODEV;
++
++      dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name);
++
++      if (dvb_adapter == NULL) {
++              printk("%s: Error registering DVB adapter\n", __FUNCTION__);
++
++              DriverHalt(pdev);
++
++              return -ENODEV;
++      }
++
++      adapter = (struct adapter *) pci_get_drvdata(pdev);
++
++      adapter->dvb_adapter = dvb_adapter;
++
++      init_MUTEX(&adapter->i2c_sem);
++
++      adapter->i2c_bus = dvb_register_i2c_bus(master_xfer, adapter, adapter->dvb_adapter, 0);
++
++      if (!adapter->i2c_bus)
++              return -ENOMEM;
++
++      dvb_add_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL, adapter);
++
++      dvbdemux = &adapter->demux;
++
++      dvbdemux->priv = (void *) adapter;
++      dvbdemux->filternum = 32;
++      dvbdemux->feednum = 32;
++      dvbdemux->start_feed = dvb_start_feed;
++      dvbdemux->stop_feed = dvb_stop_feed;
++      dvbdemux->write_to_decoder = 0;
++      dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING);
++
++      dvb_dmx_init(&adapter->demux);
++
++      adapter->hw_frontend.source = DMX_FRONTEND_0;
++
++      adapter->dmxdev.filternum = 32;
++      adapter->dmxdev.demux = &dvbdemux->dmx;
++      adapter->dmxdev.capabilities = 0;
++
++      dvb_dmxdev_init(&adapter->dmxdev, adapter->dvb_adapter);
++
++      ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
++      if (ret < 0)
++              return ret;
++
++      adapter->mem_frontend.source = DMX_MEMORY_FE;
++
++      ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &adapter->mem_frontend);
++      if (ret < 0)
++              return ret;
++
++      ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
++      if (ret < 0)
++              return ret;
++
++      dvb_net_init(adapter->dvb_adapter, &adapter->dvbnet, &dvbdemux->dmx);
++      return 0;
++}
++
++static void skystar2_remove(struct pci_dev *pdev)
++{
++      struct adapter *adapter;
++      struct dvb_demux *dvbdemux;
++
++      if (pdev == NULL)
++              return;
++
++      adapter = pci_get_drvdata(pdev);
++
++      if (adapter != NULL) {
++              dvb_net_release(&adapter->dvbnet);
++              dvbdemux = &adapter->demux;
++
++              dvbdemux->dmx.close(&dvbdemux->dmx);
++              dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &adapter->hw_frontend);
++              dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &adapter->mem_frontend);
++
++              dvb_dmxdev_release(&adapter->dmxdev);
++              dvb_dmx_release(&adapter->demux);
++
++              if (adapter->dvb_adapter != NULL) {
++                      dvb_remove_frontend_ioctls(adapter->dvb_adapter, flexcop_diseqc_ioctl, NULL);
++
++                      if (adapter->i2c_bus != NULL)
++                              dvb_unregister_i2c_bus(master_xfer, adapter->i2c_bus->adapter, adapter->i2c_bus->id);
++
++                      dvb_unregister_adapter(adapter->dvb_adapter);
++              }
++
++              DriverHalt(pdev);
++      }
++}
++
++static struct pci_device_id skystar2_pci_tbl[] = {
++      {0x000013D0, 0x00002103, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000},
++      {0,},
++};
++
++static struct pci_driver skystar2_pci_driver = {
++      .name = "Technisat SkyStar2 driver",
++      .id_table = skystar2_pci_tbl,
++      .probe = skystar2_probe,
++      .remove = skystar2_remove,
++};
++
++static int skystar2_init(void)
++{
++      return pci_module_init(&skystar2_pci_driver);
++}
++
++static void skystar2_cleanup(void)
++{
++      pci_unregister_driver(&skystar2_pci_driver);
++}
++
++module_init(skystar2_init);
++module_exit(skystar2_cleanup);
++
++MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
++MODULE_LICENSE("GPL");
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_demux.c   2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_demux.c  2003-07-19 17:03:49.000000000 -0700
+@@ -403,13 +403,16 @@ void dvb_dmx_swfilter(struct dvb_demux *
+ {
+       int p = 0,i, j;
+       
++      spin_lock(&demux->lock);
++
+       if ((i = demux->tsbufp)) {
+               if (count < (j=188-i)) {
+                       memcpy(&demux->tsbuf[i], buf, count);
+                       demux->tsbufp += count;
+-                      return;
++                      goto bailout;
+               }
+               memcpy(&demux->tsbuf[i], buf, j);
++              if (demux->tsbuf[0] == 0x47)
+               dvb_dmx_swfilter_packet(demux, demux->tsbuf);
+               demux->tsbufp = 0;
+               p += j;
+@@ -424,11 +427,14 @@ void dvb_dmx_swfilter(struct dvb_demux *
+                               i = count-p;
+                               memcpy(demux->tsbuf, buf+p, i);
+                               demux->tsbufp=i;
+-                              return;
++                              goto bailout;
+                       }
+               } else 
+                       p++;
+       }
++
++bailout:
++      spin_unlock(&demux->lock);
+ }
+@@ -1030,9 +1036,11 @@ static int dvbdmx_write(struct dmx_demux
+       if (down_interruptible (&dvbdemux->mutex))
+               return -ERESTARTSYS;
+-
+       dvb_dmx_swfilter(dvbdemux, buf, count);
+       up(&dvbdemux->mutex);
++
++      if (signal_pending(current))
++              return -EINTR;
+       return count;
+ }
+@@ -1110,8 +1118,8 @@ static int dvbdmx_get_pes_pids(struct dm
+       return 0;
+ }
+-int 
+-dvb_dmx_init(struct dvb_demux *dvbdemux)
++
++int dvb_dmx_init(struct dvb_demux *dvbdemux)
+ {
+       int i, err;
+       struct dmx_demux *dmx = &dvbdemux->dmx;
+@@ -1181,8 +1189,8 @@ dvb_dmx_init(struct dvb_demux *dvbdemux)
+       return 0;
+ }
+-int 
+-dvb_dmx_release(struct dvb_demux *dvbdemux)
++
++int dvb_dmx_release(struct dvb_demux *dvbdemux)
+ {
+       struct dmx_demux *dmx = &dvbdemux->dmx;
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvbdev.c      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvbdev.c     2003-07-19 17:03:49.000000000 -0700
+@@ -29,8 +29,6 @@
+ #include <linux/sched.h>
+ #include <linux/init.h>
+ #include <linux/slab.h>
+-#include <linux/version.h>
+-#include <asm/semaphore.h>
+ #include "dvbdev.h"
+ #include "dvb_functions.h"
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvbdev.h      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvbdev.h     2003-07-19 17:03:49.000000000 -0700
+@@ -27,8 +27,9 @@
+ #include <linux/types.h>
+ #include <linux/poll.h>
+ #include <linux/fs.h>
+-#include <linux/devfs_fs_kernel.h>
+ #include <linux/list.h>
++#include <linux/version.h>
++#include <linux/devfs_fs_kernel.h>
+ #define DVB_MAJOR 250
+@@ -48,6 +49,7 @@ struct dvb_adapter {
+       struct list_head list_head;
+       struct list_head device_list;
+       const char *name;
++      u8 proposed_mac [6];
+ };
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_frontend.c        2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_frontend.c       2003-07-19 17:03:49.000000000 -0700
+@@ -263,8 +263,14 @@ static int dvb_frontend_get_event (struc
+                 if (flags & O_NONBLOCK)
+                         return -EWOULDBLOCK;
++              up(&fe->sem);
++
+                 ret = wait_event_interruptible (events->wait_queue,
+                                                 events->eventw != events->eventr);
++
++              if (down_interruptible (&fe->sem))
++                      return -ERESTARTSYS;
++
+                 if (ret < 0)
+                         return ret;
+         }
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_functions.c       2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_functions.c      2003-07-19 17:03:49.000000000 -0700
+@@ -1,11 +1,11 @@
+ #include <linux/version.h>
+-#include <linux/string.h>
+-#include <linux/smp_lock.h>
+-#include <linux/fs.h>
+ #include <linux/errno.h>
++#include <linux/fs.h>
++#include <linux/string.h>
+ #include <linux/module.h>
+ #include <linux/ioctl.h>
+ #include <linux/slab.h>
++#include <linux/smp_lock.h>
+ #include <asm/uaccess.h>
+ void dvb_kernel_thread_setup (const char *thread_name)
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_functions.h       2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_functions.h      2003-07-19 17:03:49.000000000 -0700
+@@ -1,6 +1,8 @@
+ #ifndef __DVB_FUNCTIONS_H__
+ #define __DVB_FUNCTIONS_H__
++#include <linux/version.h>
++
+ /**
+  *  a sleeping delay function, waits i ms
+  *
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_net.c     2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_net.c    2003-07-19 17:03:49.000000000 -0700
+@@ -24,22 +24,25 @@
+  * 
+  */
+-#include <linux/errno.h>
+-#include <linux/kernel.h>
+-#include <linux/string.h>
+-#include <linux/ioctl.h>
+-#include <linux/slab.h>
+-#include <asm/uaccess.h>
+-
+ #include <linux/dvb/net.h>
++#include <asm/uaccess.h>
+ #include "dvb_demux.h"
+ #include "dvb_net.h"
+ #include "dvb_functions.h"
++
++#if 1
++#define dprintk(x...) printk(x)
++#else
++#define dprintk(x...)
++#endif
++
++
+ #define DVB_NET_MULTICAST_MAX 10
+ struct dvb_net_priv {
++      int in_use;
+         struct net_device_stats stats;
+         char name[6];
+       u16 pid;
+@@ -49,10 +52,17 @@ struct dvb_net_priv {
+       int multi_num;
+       struct dmx_section_filter *multi_secfilter[DVB_NET_MULTICAST_MAX];
+       unsigned char multi_macs[DVB_NET_MULTICAST_MAX][6];
+-      int mode;
++      int rx_mode;
++#define RX_MODE_UNI 0
++#define RX_MODE_MULTI 1
++#define RX_MODE_ALL_MULTI 2
++#define RX_MODE_PROMISC 3
++      struct work_struct set_multicast_list_wq;
++      struct work_struct restart_net_feed_wq;
+ };
+-/*
++
++/**
+  *    Determine the packet's protocol ID. The rule here is that we 
+  *    assume 802.3 if the type field is short enough to be a length.
+  *    This is normal practice and works for any 'now in use' protocol.
+@@ -60,8 +70,8 @@ struct dvb_net_priv {
+  *  stolen from eth.c out of the linux kernel, hacked for dvb-device
+  *  by Michael Holzt <kju@debian.org>
+  */
+- 
+-unsigned short my_eth_type_trans(struct sk_buff *skb, struct net_device *dev)
++static unsigned short dvb_net_eth_type_trans(struct sk_buff *skb,
++                                    struct net_device *dev)
+ {
+       struct ethhdr *eth;
+       unsigned char *rawp;
+@@ -70,8 +80,7 @@ unsigned short my_eth_type_trans(struct 
+       skb_pull(skb,dev->hard_header_len);
+       eth= skb->mac.ethernet;
+       
+-      if(*eth->h_dest&1)
+-      {
++      if (*eth->h_dest & 1) {
+               if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0)
+                       skb->pkt_type=PACKET_BROADCAST;
+               else
+@@ -83,7 +92,7 @@ unsigned short my_eth_type_trans(struct 
+               
+       rawp = skb->data;
+       
+-      /*
++      /**
+        *      This is a magic hack to spot IPX packets. Older Novell breaks
+        *      the protocol design and runs IPX over 802.3 without an 802.2 LLC
+        *      layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
+@@ -92,42 +101,73 @@ unsigned short my_eth_type_trans(struct 
+       if (*(unsigned short *)rawp == 0xFFFF)
+               return htons(ETH_P_802_3);
+               
+-      /*
++      /**
+        *      Real 802.2 LLC
+        */
+       return htons(ETH_P_802_2);
+ }
+-static void dvb_net_sec(struct net_device *dev, const u8 *pkt, int pkt_len)
++
++static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
+ {
+         u8 *eth;
+         struct sk_buff *skb;
+-        if (pkt_len<13) {
+-                printk("%s: IP/MPE packet length = %d too small.\n", dev->name, pkt_len);
++      /* note: pkt_len includes a 32bit checksum */
++      if (pkt_len < 16) {
++              printk("%s: IP/MPE packet length = %d too small.\n",
++                      dev->name, pkt_len);
++              ((struct dvb_net_priv *) dev->priv)->stats.rx_errors++;
++              ((struct dvb_net_priv *) dev->priv)->stats.rx_length_errors++;
++              return;
++      }
++      if ((pkt[5] & 0xfd) != 0xc1) {
++              /* drop scrambled or broken packets */
++              ((struct dvb_net_priv *) dev->priv)->stats.rx_errors++;
++              ((struct dvb_net_priv *) dev->priv)->stats.rx_crc_errors++;
+               return;
+       }
+-        skb = dev_alloc_skb(pkt_len+2);
+-        if (skb == NULL) {
+-                printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n",
+-                       dev->name);
++      if (pkt[5] & 0x02) {
++              //FIXME: handle LLC/SNAP
+                 ((struct dvb_net_priv *)dev->priv)->stats.rx_dropped++;
+                 return;
+         }
+-        eth=(u8 *) skb_put(skb, pkt_len+2);
+-        memcpy(eth+14, (void*)pkt+12, pkt_len-12);
++      if (pkt[7]) {
++              /* FIXME: assemble datagram from multiple sections */
++              ((struct dvb_net_priv *) dev->priv)->stats.rx_errors++;
++              ((struct dvb_net_priv *) dev->priv)->stats.rx_frame_errors++;
++              return;
++      }
++      /* we have 14 byte ethernet header (ip header follows);
++       * 12 byte MPE header; 4 byte checksum; + 2 byte alignment
++       */
++      if (!(skb = dev_alloc_skb(pkt_len - 4 - 12 + 14 + 2))) {
++              //printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
++              ((struct dvb_net_priv *) dev->priv)->stats.rx_dropped++;
++              return;
++      }
++      skb_reserve(skb, 2);    /* longword align L3 header */
++      skb->dev = dev;
++
++      /* copy L3 payload */
++      eth = (u8 *) skb_put(skb, pkt_len - 12 - 4 + 14);
++      memcpy(eth + 14, pkt + 12, pkt_len - 12 - 4);
++
++      /* create ethernet header: */
+         eth[0]=pkt[0x0b];
+         eth[1]=pkt[0x0a];
+         eth[2]=pkt[0x09];
+         eth[3]=pkt[0x08];
+         eth[4]=pkt[0x04];
+         eth[5]=pkt[0x03];
++
+         eth[6]=eth[7]=eth[8]=eth[9]=eth[10]=eth[11]=0;
+-        eth[12]=0x08; eth[13]=0x00;
+-      skb->protocol=my_eth_type_trans(skb,dev);
+-        skb->dev=dev;
++      eth[12] = 0x08; /* ETH_P_IP */
++      eth[13] = 0x00;
++
++      skb->protocol = dvb_net_eth_type_trans(skb, dev);
+         
+         ((struct dvb_net_priv *)dev->priv)->stats.rx_packets++;
+         ((struct dvb_net_priv *)dev->priv)->stats.rx_bytes+=skb->len;
+@@ -141,9 +181,11 @@ static int dvb_net_callback(const u8 *bu
+ {
+         struct net_device *dev=(struct net_device *) filter->priv;
+-      /* FIXME: this only works if exactly one complete section is
+-                delivered in buffer1 only */
+-      dvb_net_sec(dev, buffer1, buffer1_len);
++      /**
++       * we rely on the DVB API definition where exactly one complete
++       * section is delivered in buffer1
++       */
++      dvb_net_sec (dev, (u8*) buffer1, buffer1_len);
+       return 0;
+ }
+@@ -178,24 +220,27 @@ static int dvb_net_filter_set(struct net
+       memset((*secfilter)->filter_mode,  0xff, DMX_MAX_FILTER_SIZE);
+       (*secfilter)->filter_value[0]=0x3e;
+-      (*secfilter)->filter_mask[0]=0xff;
+-
+       (*secfilter)->filter_value[3]=mac[5];
+-      (*secfilter)->filter_mask[3]=mac_mask[5];
+       (*secfilter)->filter_value[4]=mac[4];
+-      (*secfilter)->filter_mask[4]=mac_mask[4];
+       (*secfilter)->filter_value[8]=mac[3];
+-      (*secfilter)->filter_mask[8]=mac_mask[3];
+       (*secfilter)->filter_value[9]=mac[2];
+-      (*secfilter)->filter_mask[9]=mac_mask[2];
+-
+       (*secfilter)->filter_value[10]=mac[1];
+-      (*secfilter)->filter_mask[10]=mac_mask[1];
+       (*secfilter)->filter_value[11]=mac[0];
++
++      (*secfilter)->filter_mask[0] = 0xff;
++      (*secfilter)->filter_mask[3] = mac_mask[5];
++      (*secfilter)->filter_mask[4] = mac_mask[4];
++      (*secfilter)->filter_mask[8] = mac_mask[3];
++      (*secfilter)->filter_mask[9] = mac_mask[2];
++      (*secfilter)->filter_mask[10] = mac_mask[1];
+       (*secfilter)->filter_mask[11]=mac_mask[0];
+-      printk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n", 
++      dprintk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n",
+              dev->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
++      dprintk("%s: filter mask=%02x %02x %02x %02x %02x %02x\n",
++             dev->name, mac_mask[0], mac_mask[1], mac_mask[2],
++             mac_mask[3], mac_mask[4], mac_mask[5]);
++
+       return 0;
+ }
+@@ -206,46 +251,57 @@ static int dvb_net_feed_start(struct net
+         struct dmx_demux *demux = priv->demux;
+         unsigned char *mac = (unsigned char *) dev->dev_addr;
+               
++      dprintk("%s: rx_mode %i\n", __FUNCTION__, priv->rx_mode);
++      if (priv->secfeed || priv->secfilter || priv->multi_secfilter[0])
++              printk("%s: BUG %d\n", __FUNCTION__, __LINE__);
++
+       priv->secfeed=0;
+       priv->secfilter=0;
++      dprintk("%s: alloc secfeed\n", __FUNCTION__);
+       ret=demux->allocate_section_feed(demux, &priv->secfeed, 
+                                        dvb_net_callback);
+       if (ret<0) {
+-              printk("%s: could not get section feed\n", dev->name);
++              printk("%s: could not allocate section feed\n", dev->name);
+               return ret;
+       }
+-      ret=priv->secfeed->set(priv->secfeed, priv->pid, 32768, 0, 0);
++      ret = priv->secfeed->set(priv->secfeed, priv->pid, 32768, 0, 1);
++
+       if (ret<0) {
+               printk("%s: could not set section feed\n", dev->name);
+-              priv->demux->
+-                      release_section_feed(priv->demux, priv->secfeed);
++              priv->demux->release_section_feed(priv->demux, priv->secfeed);
+               priv->secfeed=0;
+               return ret;
+       }
+-      /* fixme: is this correct? */
+-      try_module_get(THIS_MODULE);
+-      if (priv->mode<3) 
++      if (priv->rx_mode != RX_MODE_PROMISC) {
++              dprintk("%s: set secfilter\n", __FUNCTION__);
+               dvb_net_filter_set(dev, &priv->secfilter, mac, mask_normal);
++      }
+-      switch (priv->mode) {
+-      case 1:
+-              for (i=0; i<priv->multi_num; i++) 
++      switch (priv->rx_mode) {
++      case RX_MODE_MULTI:
++              for (i = 0; i < priv->multi_num; i++) {
++                      dprintk("%s: set multi_secfilter[%d]\n", __FUNCTION__, i);
+                       dvb_net_filter_set(dev, &priv->multi_secfilter[i],
+                                          priv->multi_macs[i], mask_normal);
++              }
+               break;
+-      case 2:
++      case RX_MODE_ALL_MULTI:
+               priv->multi_num=1;
+-              dvb_net_filter_set(dev, &priv->multi_secfilter[0], mac_allmulti, mask_allmulti);
++              dprintk("%s: set multi_secfilter[0]\n", __FUNCTION__);
++              dvb_net_filter_set(dev, &priv->multi_secfilter[0],
++                                 mac_allmulti, mask_allmulti);
+               break;
+-      case 3:
++      case RX_MODE_PROMISC:
+               priv->multi_num=0;
++              dprintk("%s: set secfilter\n", __FUNCTION__);
+               dvb_net_filter_set(dev, &priv->secfilter, mac, mask_promisc);
+               break;
+       }
+       
++      dprintk("%s: start filtering\n", __FUNCTION__);
+       priv->secfeed->start_filtering(priv->secfeed);
+       return 0;
+ }
+@@ -255,89 +311,93 @@ static void dvb_net_feed_stop(struct net
+       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+       int i;
++      dprintk("%s\n", __FUNCTION__);
+         if (priv->secfeed) {
+-              if (priv->secfeed->is_filtering)
++              if (priv->secfeed->is_filtering) {
++                      dprintk("%s: stop secfeed\n", __FUNCTION__);
+                       priv->secfeed->stop_filtering(priv->secfeed);
+-              if (priv->secfilter)
+-                      priv->secfeed->
+-                              release_filter(priv->secfeed, 
++              }
++
++              if (priv->secfilter) {
++                      dprintk("%s: release secfilter\n", __FUNCTION__);
++                      priv->secfeed->release_filter(priv->secfeed,
+                                              priv->secfilter);
+               priv->secfilter=0;
++              }
+               for (i=0; i<priv->multi_num; i++) {
+-                      if (priv->multi_secfilter[i])
+-                              priv->secfeed->
+-                                      release_filter(priv->secfeed, 
++                      if (priv->multi_secfilter[i]) {
++                              dprintk("%s: release multi_filter[%d]\n", __FUNCTION__, i);
++                              priv->secfeed->release_filter(priv->secfeed,
+                                                      priv->multi_secfilter[i]);
+                       priv->multi_secfilter[i]=0;
+               }
+-              priv->demux->
+-                      release_section_feed(priv->demux, priv->secfeed);
++              }
++
++              priv->demux->release_section_feed(priv->demux, priv->secfeed);
+               priv->secfeed=0;
+-              /* fixme: is this correct? */
+-              module_put(THIS_MODULE);
+       } else
+               printk("%s: no feed to stop\n", dev->name);
+ }
+-static int dvb_add_mc_filter(struct net_device *dev, struct dev_mc_list *mc)
++
++static int dvb_set_mc_filter (struct net_device *dev, struct dev_mc_list *mc)
+ {
+       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+-      int ret;
+-      if (priv->multi_num >= DVB_NET_MULTICAST_MAX)
++      if (priv->multi_num == DVB_NET_MULTICAST_MAX)
+               return -ENOMEM;
+-      ret = memcmp(priv->multi_macs[priv->multi_num], mc->dmi_addr, 6);
+       memcpy(priv->multi_macs[priv->multi_num], mc->dmi_addr, 6);
+       priv->multi_num++;
+-
+-      return ret;
++      return 0;
+ }
+-static void dvb_net_set_multi(struct net_device *dev)
++
++static void wq_set_multicast_list (void *data)
+ {
++      struct net_device *dev = data;
+       struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+-      struct dev_mc_list *mc;
+-      int mci;
+-      int update = 0;
++
++      dvb_net_feed_stop(dev);
++
++      priv->rx_mode = RX_MODE_UNI;
+       
+       if(dev->flags & IFF_PROMISC) {
+-//    printk("%s: promiscuous mode\n", dev->name);
+-              if(priv->mode != 3)
+-                      update = 1;
+-              priv->mode = 3;
+-      } else if(dev->flags & IFF_ALLMULTI) {
+-//    printk("%s: allmulti mode\n", dev->name);
+-              if(priv->mode != 2)
+-                      update = 1;
+-              priv->mode = 2;
+-      } else if(dev->mc_count > 0) {
+-//    printk("%s: set_mc_list, %d entries\n", 
+-//           dev->name, dev->mc_count);
+-              if(priv->mode != 1)
+-                      update = 1;
+-              priv->mode = 1;
++              dprintk("%s: promiscuous mode\n", dev->name);
++              priv->rx_mode = RX_MODE_PROMISC;
++      } else if ((dev->flags & IFF_ALLMULTI)) {
++              dprintk("%s: allmulti mode\n", dev->name);
++              priv->rx_mode = RX_MODE_ALL_MULTI;
++      } else if (dev->mc_count) {
++              int mci;
++              struct dev_mc_list *mc;
++
++              dprintk("%s: set_mc_list, %d entries\n",
++                      dev->name, dev->mc_count);
++
++              priv->rx_mode = RX_MODE_MULTI;
+               priv->multi_num = 0;
++
+               for (mci = 0, mc=dev->mc_list; 
+                    mci < dev->mc_count;
+-                   mc=mc->next, mci++)
+-                      if(dvb_add_mc_filter(dev, mc) != 0)
+-                              update = 1;
+-      } else {
+-              if(priv->mode != 0)
+-                      update = 1;
+-              priv->mode = 0;
++                   mc = mc->next, mci++) {
++                      dvb_set_mc_filter(dev, mc);
++              }
+       }
+-      if(netif_running(dev) != 0 && update > 0)
+-      {
+-              dvb_net_feed_stop(dev);
+               dvb_net_feed_start(dev);
+       }
++
++
++static void dvb_net_set_multicast_list (struct net_device *dev)
++{
++      struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
++      schedule_work(&priv->set_multicast_list_wq);
+ }
++
+ static int dvb_net_set_config(struct net_device *dev, struct ifmap *map)
+ {
+       if (netif_running(dev))
+@@ -345,29 +405,47 @@ static int dvb_net_set_config(struct net
+       return 0;
+ }
+-static int dvb_net_set_mac(struct net_device *dev, void *p)
++
++static void wq_restart_net_feed (void *data)
+ {
+-      struct sockaddr *addr=p;
+-      int update;
++      struct net_device *dev = data;
+-      update = memcmp(dev->dev_addr, addr->sa_data, dev->addr_len);
+-      memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+-      if (netif_running(dev) != 0 && update > 0) {
++      if (netif_running(dev)) {
+               dvb_net_feed_stop(dev);
+               dvb_net_feed_start(dev);
+       }
++}
++
++
++static int dvb_net_set_mac (struct net_device *dev, void *p)
++{
++      struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
++      struct sockaddr *addr=p;
++
++      memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
++
++      if (netif_running(dev))
++              schedule_work(&priv->restart_net_feed_wq);
++
+       return 0;
+ }
+ static int dvb_net_open(struct net_device *dev)
+ {
++      struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
++
++      priv->in_use++;
+       dvb_net_feed_start(dev);
+       return 0;
+ }
++
+ static int dvb_net_stop(struct net_device *dev)
+ {
++      struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
++
++      priv->in_use--;
+         dvb_net_feed_stop(dev);
+       return 0;
+ }
+@@ -386,16 +464,14 @@ static int dvb_net_init_dev(struct net_d
+       dev->stop               = dvb_net_stop;
+       dev->hard_start_xmit    = dvb_net_tx;
+       dev->get_stats          = dvb_net_get_stats;
+-      dev->set_multicast_list = dvb_net_set_multi;
++      dev->set_multicast_list = dvb_net_set_multicast_list;
+       dev->set_config         = dvb_net_set_config;
+       dev->set_mac_address    = dvb_net_set_mac;
+       dev->mtu                = 4096;
+       dev->mc_count           = 0;
+-
+-      dev->flags             |= IFF_NOARP;
+       dev->hard_header_cache  = NULL;
+-      //SET_MODULE_OWNER(dev);
++      dev->flags |= IFF_NOARP;
+       
+       return 0;
+ }
+@@ -404,18 +480,19 @@ static int get_if(struct dvb_net *dvbnet
+ {
+       int i;
+-      for (i=0; i<dvbnet->dev_num; i++) 
++      for (i=0; i<DVB_NET_DEVICES_MAX; i++)
+               if (!dvbnet->state[i])
+                       break;
+-      if (i==dvbnet->dev_num)
++
++      if (i == DVB_NET_DEVICES_MAX)
+               return -1;
++
+       dvbnet->state[i]=1;
+       return i;
+ }
+-int 
+-dvb_net_add_if(struct dvb_net *dvbnet, u16 pid)
++static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid)
+ {
+         struct net_device *net;
+       struct dmx_demux *demux;
+@@ -423,59 +500,63 @@ dvb_net_add_if(struct dvb_net *dvbnet, u
+       int result;
+       int if_num;
+  
+-      if_num=get_if(dvbnet);
+-      if (if_num<0)
++      if ((if_num = get_if(dvbnet)) < 0)
+               return -EINVAL;
+       net=&dvbnet->device[if_num];
+       demux=dvbnet->demux;
+       
+-      net->base_addr = 0;
+-      net->irq       = 0;
+-      net->dma       = 0;
+-      net->mem_start = 0;
++      memset(net, 0, sizeof(struct net_device));
++
+         memcpy(net->name, "dvb0_0", 7);
+-        net->name[3]=dvbnet->card_num+0x30;
+-        net->name[5]=if_num+0x30;
++      net->name[3]   = dvbnet->dvbdev->adapter->num + '0';
++      net->name[5]   = if_num + '0';
++      net->addr_len  = 6;
++      memcpy(net->dev_addr, dvbnet->dvbdev->adapter->proposed_mac, 6);
+         net->next      = NULL;
+         net->init      = dvb_net_init_dev;
+-        net->priv      = kmalloc(sizeof(struct dvb_net_priv), GFP_KERNEL);
+-      if (net->priv == NULL)
++
++      if (!(net->priv = kmalloc(sizeof(struct dvb_net_priv), GFP_KERNEL)))
+                       return -ENOMEM;
+       priv = net->priv;
+       memset(priv, 0, sizeof(struct dvb_net_priv));
+         priv->demux = demux;
+         priv->pid = pid;
+-      priv->mode = 0;
++      priv->rx_mode = RX_MODE_UNI;
++
++      INIT_WORK(&priv->set_multicast_list_wq, wq_set_multicast_list, net);
++      INIT_WORK(&priv->restart_net_feed_wq, wq_restart_net_feed, net);
+         net->base_addr = pid;
+                 
+       if ((result = register_netdev(net)) < 0) {
+               return result;
+       }
+-      /* fixme: is this correct? */
+-      try_module_get(THIS_MODULE);
+         return if_num;
+ }
+-int 
+-dvb_net_remove_if(struct dvb_net *dvbnet, int num)
++
++static int dvb_net_remove_if(struct dvb_net *dvbnet, int num)
+ {
++      struct dvb_net_priv *priv = dvbnet->device[num].priv;
++
+       if (!dvbnet->state[num])
+               return -EINVAL;
++      if (priv->in_use)
++              return -EBUSY;
++
+       dvb_net_stop(&dvbnet->device[num]);
+-        kfree(dvbnet->device[num].priv);
++      flush_scheduled_work();
++      kfree(priv);
+         unregister_netdev(&dvbnet->device[num]);
+       dvbnet->state[num]=0;
+-      /* fixme: is this correct? */
+-      module_put(THIS_MODULE);
+-
+       return 0;
+ }
+-int dvb_net_do_ioctl(struct inode *inode, struct file *file, 
++
++static int dvb_net_do_ioctl(struct inode *inode, struct file *file,
+                 unsigned int cmd, void *parg)
+ {
+       struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
+@@ -490,6 +571,8 @@ int dvb_net_do_ioctl(struct inode *inode
+               struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg;
+               int result;
+               
++              if (!capable(CAP_SYS_ADMIN))
++                      return -EPERM;
+               result=dvb_net_add_if(dvbnet, dvbnetif->pid);
+               if (result<0)
+                       return result;
+@@ -502,7 +585,7 @@ int dvb_net_do_ioctl(struct inode *inode
+               struct dvb_net_priv *priv_data;
+               struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg;
+-              if (dvbnetif->if_num >= dvbnet->dev_num ||
++              if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
+                   !dvbnet->state[dvbnetif->if_num])
+                       return -EFAULT;
+@@ -512,7 +595,9 @@ int dvb_net_do_ioctl(struct inode *inode
+               break;
+       }
+       case NET_REMOVE_IF:
+-              return dvb_net_remove_if(dvbnet, (long) parg);
++              if (!capable(CAP_SYS_ADMIN))
++                      return -EPERM;
++              return dvb_net_remove_if(dvbnet, (int) parg);
+       default:
+               return -EINVAL;
+       }
+@@ -542,28 +627,29 @@ static struct dvb_device dvbdev_net = {
+         .fops = &dvb_net_fops,
+ };
+-void
+-dvb_net_release(struct dvb_net *dvbnet)
++
++void dvb_net_release (struct dvb_net *dvbnet)
+ {
+       int i;
+       dvb_unregister_device(dvbnet->dvbdev);
+-      for (i=0; i<dvbnet->dev_num; i++) {
++
++      for (i=0; i<DVB_NET_DEVICES_MAX; i++) {
+               if (!dvbnet->state[i])
+                       continue;
+               dvb_net_remove_if(dvbnet, i);
+       }
+ }
+-int
+-dvb_net_init(struct dvb_adapter *adap, struct dvb_net *dvbnet, struct dmx_demux *dmx)
++
++int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,
++                struct dmx_demux *dmx)
+ {
+       int i;
+               
+       dvbnet->demux = dmx;
+-      dvbnet->dev_num = DVB_NET_DEVICES_MAX;
+-      for (i=0; i<dvbnet->dev_num; i++) 
++      for (i=0; i<DVB_NET_DEVICES_MAX; i++)
+               dvbnet->state[i] = 0;
+       dvb_register_device (adap, &dvbnet->dvbdev, &dvbdev_net,
+--- linux-2.6.0-test1/drivers/media/dvb/dvb-core/dvb_net.h     2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/dvb-core/dvb_net.h    2003-07-19 17:03:49.000000000 -0700
+@@ -35,8 +35,6 @@
+ struct dvb_net {
+       struct dvb_device *dvbdev;
+-      int card_num;
+-      int dev_num;
+       struct net_device device[DVB_NET_DEVICES_MAX];
+       int state[DVB_NET_DEVICES_MAX];
+       struct dmx_demux *demux;
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/alps_bsrv2.c 2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/alps_bsrv2.c        2003-07-19 17:03:49.000000000 -0700
+@@ -55,7 +55,7 @@ static u8 init_1893_tab [] = {
+         0x01, 0xA4, 0x35, 0x81, 0x2A, 0x0d, 0x55, 0xC4,
+         0x09, 0x69, 0x00, 0x86, 0x4c, 0x28, 0x7F, 0x00,
+         0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,       
+-        0x80, 0x00, 0x31, 0xb0, 0x14, 0x00, 0xDC, 0x20,
++        0x80, 0x00, 0x31, 0xb0, 0x14, 0x00, 0xDC, 0x00,
+         0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+         0x00, 0x55, 0x00, 0x00, 0x7f, 0x00
+@@ -158,6 +158,11 @@ static int ves1893_set_inversion (struct
+ {
+       u8 val;
++      /*
++       * inversion on/off are interchanged because i and q seem to
++       * be swapped on the hardware
++       */
++
+       switch (inversion) {
+       case INVERSION_OFF:
+               val = 0xc0;
+@@ -166,13 +171,16 @@ static int ves1893_set_inversion (struct
+               val = 0x80;
+               break;
+       case INVERSION_AUTO:
+-              val = 0x40;
++              val = 0x00;
+               break;
+       default:
+               return -EINVAL;
+       }
+-      return ves1893_writereg (i2c, 0x0c, (init_1893_tab[0x0c] & 0x3f) | val);
++      /* needs to be saved for FE_GET_FRONTEND */
++      init_1893_tab[0x0c] = (init_1893_tab[0x0c] & 0x3f) | val;
++
++      return ves1893_writereg (i2c, 0x0c, init_1893_tab[0x0c]);
+ }
+@@ -383,8 +391,14 @@ static int bsrv2_ioctl (struct dvb_front
+               afc = (afc * (int)(p->u.qpsk.symbol_rate/1000/8))/16;
+               p->frequency -= afc;
++
++              /*
++               * inversion indicator is only valid
++               * if auto inversion was used
++               */
++              if (!(init_1893_tab[0x0c] & 0x80))
+               p->inversion = (ves1893_readreg (i2c, 0x0f) & 2) ? 
+-                                      INVERSION_ON : INVERSION_OFF;
++                                      INVERSION_OFF : INVERSION_ON;
+               p->u.qpsk.fec_inner = ves1893_get_fec (i2c);
+       /*  XXX FIXME: timing offset !! */
+               break;
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/alps_tdlb7.c 2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/alps_tdlb7.c        2003-07-19 17:03:49.000000000 -0700
+@@ -349,6 +349,9 @@ static int tdlb7_ioctl (struct dvb_front
+               sp5659_set_tv_freq (i2c, p->frequency);
++              // read status reg in order to clear pending irqs
++              sp8870_readreg(i2c, 0x200);
++
+               // sample rate correction bit [23..17]
+               sp8870_writereg(i2c,0x0319,0x000A);
+               
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/grundig_29504-401.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/grundig_29504-401.c 2003-07-19 17:03:49.000000000 -0700
+@@ -37,15 +37,15 @@ static int debug = 0;
+ struct dvb_frontend_info grundig_29504_401_info = {
+-      .name                   = "Grundig 29504-401",
+-      .type                   = FE_OFDM,
+-/*    .frequency_min          = ???,*/
+-/*    .frequency_max          = ???,*/
+-      .frequency_stepsize     = 166666,
+-/*      .frequency_tolerance  = ???,*/
+-/*      .symbol_rate_tolerance        = ???,*/
+-      .notifier_delay =  0,
+-      .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 
++      name: "Grundig 29504-401",
++      type: FE_OFDM,
++/*    frequency_min: ???,*/
++/*    frequency_max: ???,*/
++      frequency_stepsize: 166666,
++/*      frequency_tolerance: ???,*/
++/*      symbol_rate_tolerance: ???,*/
++      notifier_delay: 0,
++      caps: FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 
+             FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
+             FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
+             FE_CAN_MUTE_TS /*| FE_CAN_CLEAN_SETUP*/
+@@ -109,15 +109,15 @@ static int tsa5060_set_tv_freq (struct d
+       div = (36125000 + freq) / 166666;
+       cfg = 0x88;
+-      cpump = div < 175000000 ? 2 : div < 390000000 ? 1 :
+-              div < 470000000 ? 2 : div < 750000000 ? 1 : 3;
++      cpump = freq < 175000000 ? 2 : freq < 390000000 ? 1 :
++              freq < 470000000 ? 2 : freq < 750000000 ? 1 : 3;
+-      band_select = div < 175000000 ? 0x0e : div < 470000000 ? 0x05 : 0x03;
++      band_select = freq < 175000000 ? 0x0e : freq < 470000000 ? 0x05 : 0x03;
+       buf [0] = (div >> 8) & 0x7f;
+       buf [1] = div & 0xff;
+       buf [2] = ((div >> 10) & 0x60) | cfg;
+-      buf [3] = cpump | band_select;
++      buf [3] = (cpump << 6) | band_select;
+       return tsa5060_write (i2c, buf);
+ }
+@@ -267,12 +267,12 @@ static int apply_frontend_param (struct 
+ }
+-static void reset_and_configure (struct dvb_i2c_bus *i2c)
++static int reset_and_configure (struct dvb_i2c_bus *i2c)
+ {
+       u8 buf [] = { 0x06 };
+       struct i2c_msg msg = { .addr = 0x00, .flags = 0, .buf = buf, .len = 1 };
+-      i2c->xfer (i2c, &msg, 1);
++      return (i2c->xfer (i2c, &msg, 1) == 1) ? 0 : -ENODEV;
+ }
+@@ -391,7 +391,7 @@ int grundig_29504_401_ioctl (struct dvb_
+               struct dvb_frontend_parameters *p = arg;
+               tsa5060_set_tv_freq (i2c, p->frequency);
+-              apply_frontend_param (i2c, p);
++              return apply_frontend_param (i2c, p);
+       }
+         case FE_GET_FRONTEND:
+               /*  we could correct the frequency here, but...
+@@ -417,25 +417,61 @@ int grundig_29504_401_ioctl (struct dvb_
+ static int l64781_attach (struct dvb_i2c_bus *i2c)
+ {
++      u8 reg0x3e;
+       u8 b0 [] = { 0x1a };
+       u8 b1 [] = { 0x00 };
+       struct i2c_msg msg [] = { { .addr = 0x55, .flags = 0, .buf = b0, .len = 1 },
+                          { .addr = 0x55, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
+-      if (i2c->xfer (i2c, msg, 2) == 2)   /*  probably an EEPROM... */
++      /**
++       *  the L64781 won't show up before we send the reset_and_configure()
++       *  broadcast. If nothing responds there is no L64781 on the bus...
++       */
++      if (reset_and_configure(i2c) < 0) {
++              dprintk("no response on reset_and_configure() broadcast, bailing out...\n");
+               return -ENODEV;
++      }
+-      reset_and_configure (i2c);
+-
+-      if (i2c->xfer (i2c, msg, 2) != 2)   /*  nothing... */
++      /* The chip always responds to reads */
++      if (i2c->xfer(i2c, msg, 2) != 2) {  
++              dprintk("no response to read on I2C bus\n");
+               return -ENODEV;
++      }
+-      if (b1[0] != 0xa1)
++      /* Save current register contents for bailout */
++      reg0x3e = l64781_readreg(i2c, 0x3e);
++
++      /* Reading the POWER_DOWN register always returns 0 */
++      if (reg0x3e != 0) {
++              dprintk("Device doesn't look like L64781\n");
+               return -ENODEV;
++      }
++
++      /* Turn the chip off */
++      l64781_writereg (i2c, 0x3e, 0x5a);
++
++      /* Responds to all reads with 0 */
++      if (l64781_readreg(i2c, 0x1a) != 0) {
++              dprintk("Read 1 returned unexpcted value\n");
++              goto bailout;
++      }         
++
++      /* Turn the chip on */
++      l64781_writereg (i2c, 0x3e, 0xa5);
++      
++      /* Responds with register default value */
++      if (l64781_readreg(i2c, 0x1a) != 0xa1) { 
++              dprintk("Read 2 returned unexpcted value\n");
++              goto bailout;
++      }
+       dvb_register_frontend (grundig_29504_401_ioctl, i2c, NULL,
+                              &grundig_29504_401_info);
+       return 0;
++
++ bailout:
++      l64781_writereg (i2c, 0x3e, reg0x3e);  /* restore reg 0x3e */
++      return -ENODEV;
+ }
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/grundig_29504-491.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/grundig_29504-491.c 2003-07-19 17:03:49.000000000 -0700
+@@ -179,10 +179,7 @@ static fe_code_rate_t tda8083_get_fec (s
+       static fe_code_rate_t fec_tab [] = { FEC_8_9, FEC_1_2, FEC_2_3, FEC_3_4,
+                                      FEC_4_5, FEC_5_6, FEC_6_7, FEC_7_8 };
+-      index = tda8083_readreg (i2c, 0x0e) & 0x3;
+-
+-      if (index > 7)
+-              return FEC_NONE;
++      index = tda8083_readreg(i2c, 0x0e) & 0x07;
+       return fec_tab [index];
+ }
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/Kconfig      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/Kconfig     2003-07-19 17:03:49.000000000 -0700
+@@ -93,6 +93,16 @@ config DVB_GRUNDIG_29504_401
+         DVB adapter simply enable all supported frontends, the 
+         right one will get autodetected.
++config DVB_MT312
++      tristate "Zarlink MT312 Satellite Channel Decoder (QPSK)"
++      depends on DVB_CORE
++      help
++        A DVB-S tuner module. Say Y when you want to support this frontend.
++
++        If you don't know what tuner module is soldered on your 
++        DVB adapter simply enable all supported frontends, the 
++        right one will get autodetected.
++
+ config DVB_VES1820
+       tristate "Frontends with external VES1820 demodulator (QAM)"
+       depends on DVB_CORE
+@@ -105,3 +115,23 @@ config DVB_VES1820
+         DVB adapter simply enable all supported frontends, the 
+         right one will get autodetected.
++config DVB_TDA1004X
++      tristate "Frontends with external TDA1004X demodulators (OFDM)"
++      depends on DVB_CORE
++      help
++        A DVB-T tuner module. Say Y when you want to support this frontend.
++
++        If you don't know what tuner module is soldered on your
++        DVB adapter simply enable all supported frontends, the
++        right one will get autodetected.
++
++config DVB_TDA1004X_FIRMWARE_FILE
++        string "Full pathname of tda1004x.bin firmware file"
++        depends on DVB_TDA1004X
++        default "/etc/dvb/tda1004x.bin"
++        help
++          The TDA1004X requires additional firmware in order to function.
++          The firmware file can obtained as follows:
++            wget http://www.technotrend.de/new/215/TTweb_215a_budget_20_05_2003.zip
++            unzip -j TTweb_215a_budget_20_05_2003.zip Software/Oem/PCI/App/ttlcdacc.dll
++            mv ttlcdacc.dll /etc/dvb/tda1004x.bin
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/Makefile     2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/Makefile    2003-07-19 17:03:49.000000000 -0700
+@@ -12,4 +12,6 @@ obj-$(CONFIG_DVB_ATMEL_AT76C651) += at76
+ obj-$(CONFIG_DVB_CX24110) += cx24110.o
+ obj-$(CONFIG_DVB_GRUNDIG_29504_491) += grundig_29504-491.o
+ obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o
++obi-$(CONFIG_DVB_MT312) += mt312.o
+ obj-$(CONFIG_DVB_VES1820) += ves1820.o
++obj-$(CONFIG_DVB_TDA1004X) += tda1004x.o
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/frontends/mt312.c     2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,749 @@
++/* 
++    Driver for Zarlink MT312 Satellite Channel Decoder
++
++    Copyright (C) 2003 Andreas Oberritter <obi@saftware.de>
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++    References:
++    http://products.zarlink.com/product_profiles/MT312.htm
++    http://products.zarlink.com/product_profiles/SL1935.htm
++*/
++
++#include <linux/delay.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++
++#include "dvb_frontend.h"
++#include "mt312.h"
++
++#define I2C_ADDR_MT312                0x0e
++#define I2C_ADDR_SL1935               0x61
++#define I2C_ADDR_TSA5059      0x61
++
++#define MT312_DEBUG           0
++
++#define MT312_SYS_CLK         90000000UL      /* 90 MHz */
++#define MT312_PLL_CLK         10000000UL      /* 10 MHz */
++
++static struct dvb_frontend_info mt312_info = {
++      .name = "Zarlink MT312",
++      .type = FE_QPSK,
++      .frequency_min = 950000,
++      .frequency_max = 2150000,
++      .frequency_stepsize = (MT312_PLL_CLK / 1000) / 128,
++      /*.frequency_tolerance = 29500,         FIXME: binary compatibility waste? */
++      .symbol_rate_min = MT312_SYS_CLK / 128,
++      .symbol_rate_max = MT312_SYS_CLK / 2,
++      /*.symbol_rate_tolerance = 500,         FIXME: binary compatibility waste? 2% */
++      .notifier_delay = 0,
++      .caps =
++          FE_CAN_INVERSION_AUTO | FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
++          FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
++          FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_RECOVER |
++          FE_CAN_CLEAN_SETUP | FE_CAN_MUTE_TS
++};
++
++static int mt312_read(struct dvb_i2c_bus *i2c,
++                    const enum mt312_reg_addr reg, void *buf,
++                    const size_t count)
++{
++      int ret;
++      struct i2c_msg msg[2];
++      u8 regbuf[1] = { reg };
++
++      msg[0].addr = I2C_ADDR_MT312;
++      msg[0].flags = 0;
++      msg[0].buf = regbuf;
++      msg[0].len = 1;
++      msg[1].addr = I2C_ADDR_MT312;
++      msg[1].flags = I2C_M_RD;
++      msg[1].buf = buf;
++      msg[1].len = count;
++
++      ret = i2c->xfer(i2c, msg, 2);
++
++      if (ret != 2) {
++              printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret);
++              return -EREMOTEIO;
++      }
++#ifdef MT312_DEBUG
++      {
++              int i;
++              printk(KERN_INFO "R(%d):", reg & 0x7f);
++              for (i = 0; i < count; i++)
++                      printk(" %02x", ((const u8 *) buf)[i]);
++              printk("\n");
++      }
++#endif
++
++      return 0;
++}
++
++static int mt312_write(struct dvb_i2c_bus *i2c,
++                     const enum mt312_reg_addr reg, const void *src,
++                     const size_t count)
++{
++      int ret;
++      u8 buf[count + 1];
++      struct i2c_msg msg;
++
++#ifdef MT312_DEBUG
++      {
++              int i;
++              printk(KERN_INFO "W(%d):", reg & 0x7f);
++              for (i = 0; i < count; i++)
++                      printk(" %02x", ((const u8 *) src)[i]);
++              printk("\n");
++      }
++#endif
++
++      buf[0] = reg;
++      memcpy(&buf[1], src, count);
++
++      msg.addr = I2C_ADDR_MT312;
++      msg.flags = 0;
++      msg.buf = buf;
++      msg.len = count + 1;
++
++      ret = i2c->xfer(i2c, &msg, 1);
++
++      if (ret != 1) {
++              printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret);
++              return -EREMOTEIO;
++      }
++
++      return 0;
++}
++
++static inline int mt312_readreg(struct dvb_i2c_bus *i2c,
++                              const enum mt312_reg_addr reg, u8 * val)
++{
++      return mt312_read(i2c, reg, val, 1);
++}
++
++static inline int mt312_writereg(struct dvb_i2c_bus *i2c,
++                               const enum mt312_reg_addr reg, const u8 val)
++{
++      return mt312_write(i2c, reg, &val, 1);
++}
++
++static int mt312_pll_write(struct dvb_i2c_bus *i2c, const u8 addr,
++                         u8 * buf, const u8 len)
++{
++      int ret;
++      struct i2c_msg msg;
++
++      msg.addr = addr;
++      msg.flags = 0;
++      msg.buf = buf;
++      msg.len = len;
++
++      if ((ret = mt312_writereg(i2c, GPP_CTRL, 0x40)) < 0)
++              return ret;
++
++      if ((ret = i2c->xfer(i2c, &msg, 1)) != 1)
++              printk(KERN_ERR "%s: i/o error (ret == %d)\n", __FUNCTION__, ret);
++
++      if ((ret = mt312_writereg(i2c, GPP_CTRL, 0x00)) < 0)
++              return ret;
++
++      return 0;
++}
++
++static inline u32 mt312_div(u32 a, u32 b)
++{
++      return (a + (b / 2)) / b;
++}
++
++static int sl1935_set_tv_freq(struct dvb_i2c_bus *i2c, u32 freq, u32 sr)
++{
++      /* 155 uA, Baseband Path B */
++      u8 buf[4] = { 0x00, 0x00, 0x80, 0x00 };
++
++      u8 exp;
++      u32 ref;
++      u32 div;
++
++      if (sr < 10000000) {    /* 1-10 MSym/s: ratio 2 ^ 3 */
++              exp = 3;
++              buf[2] |= 0x40; /* 690 uA */
++      } else if (sr < 15000000) {     /* 10-15 MSym/s: ratio 2 ^ 4 */
++              exp = 4;
++              buf[2] |= 0x20; /* 330 uA */
++      } else {                /* 15-45 MSym/s: ratio 2 ^ 7 */
++              exp = 7;
++              buf[3] |= 0x08; /* Baseband Path A */
++      }
++
++      div = mt312_div(MT312_PLL_CLK, 1 << exp);
++      ref = mt312_div(freq * 1000, div);
++      mt312_info.frequency_stepsize = mt312_div(div, 1000);
++
++      buf[0] = (ref >> 8) & 0x7f;
++      buf[1] = (ref >> 0) & 0xff;
++      buf[2] |= (exp - 1);
++
++      if (freq < 1550000)
++              buf[3] |= 0x10;
++
++      printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
++             buf[1], buf[2], buf[3]);
++
++      return mt312_pll_write(i2c, I2C_ADDR_SL1935, buf, sizeof(buf));
++}
++
++static int tsa5059_set_tv_freq(struct dvb_i2c_bus *i2c, u32 freq, u32 sr)
++{
++      u8 buf[4];
++
++      u32 ref = mt312_div(freq, 125);
++
++      buf[0] = (ref >> 8) & 0x7f;
++      buf[1] = (ref >> 0) & 0xff;
++      buf[2] = 0x84 | ((ref >> 10) & 0x60);
++      buf[3] = 0x80;
++      
++      if (freq < 1550000)
++              buf[3] |= 0x02;
++
++      printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
++             buf[1], buf[2], buf[3]);
++
++      return mt312_pll_write(i2c, I2C_ADDR_TSA5059, buf, sizeof(buf));
++}
++
++static int mt312_reset(struct dvb_i2c_bus *i2c, const u8 full)
++{
++      return mt312_writereg(i2c, RESET, full ? 0x80 : 0x40);
++}
++
++static int mt312_init(struct dvb_i2c_bus *i2c, const long id)
++{
++      int ret;
++      u8 buf[2];
++
++      /* wake up */
++      if ((ret = mt312_writereg(i2c, CONFIG, 0x8c)) < 0)
++              return ret;
++
++      /* wait at least 150 usec */
++      udelay(150);
++
++      /* full reset */
++      if ((ret = mt312_reset(i2c, 1)) < 0)
++              return ret;
++
++      /* SYS_CLK */
++      buf[0] = mt312_div(MT312_SYS_CLK * 2, 1000000);
++
++      /* DISEQC_RATIO */
++      buf[1] = mt312_div(MT312_PLL_CLK, 15000 * 4);
++
++      if ((ret = mt312_write(i2c, SYS_CLK, buf, sizeof(buf))) < 0)
++              return ret;
++
++      if ((ret = mt312_writereg(i2c, SNR_THS_HIGH, 0x32)) < 0)
++              return ret;
++
++      if ((ret = mt312_writereg(i2c, OP_CTRL, 0x53)) < 0)
++              return ret;
++
++      /* TS_SW_LIM */
++      buf[0] = 0x8c;
++      buf[1] = 0x98;
++
++      if ((ret = mt312_write(i2c, TS_SW_LIM_L, buf, sizeof(buf))) < 0)
++              return ret;
++
++      if ((ret = mt312_writereg(i2c, CS_SW_LIM, 0x69)) < 0)
++              return ret;
++
++      return 0;
++}
++
++static int mt312_send_master_cmd(struct dvb_i2c_bus *i2c,
++                               const struct dvb_diseqc_master_cmd *c)
++{
++      int ret;
++      u8 diseqc_mode;
++
++      if ((c->msg_len == 0) || (c->msg_len > sizeof(c->msg)))
++              return -EINVAL;
++
++      if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)
++              return ret;
++
++      if ((ret =
++           mt312_write(i2c, (0x80 | DISEQC_INSTR), c->msg, c->msg_len)) < 0)
++              return ret;
++
++      if ((ret =
++           mt312_writereg(i2c, DISEQC_MODE,
++                          (diseqc_mode & 0x40) | ((c->msg_len - 1) << 3)
++                          | 0x04)) < 0)
++              return ret;
++
++      /* set DISEQC_MODE[2:0] to zero if a return message is expected */
++      if (c->msg[0] & 0x02)
++              if ((ret =
++                   mt312_writereg(i2c, DISEQC_MODE, (diseqc_mode & 0x40))) < 0)
++                      return ret;
++
++      return 0;
++}
++
++static int mt312_recv_slave_reply(struct dvb_i2c_bus *i2c,
++                                struct dvb_diseqc_slave_reply *r)
++{
++      /* TODO */
++      return -EOPNOTSUPP;
++}
++
++static int mt312_send_burst(struct dvb_i2c_bus *i2c, const fe_sec_mini_cmd_t c)
++{
++      const u8 mini_tab[2] = { 0x02, 0x03 };
++
++      int ret;
++      u8 diseqc_mode;
++
++      if (c > SEC_MINI_B)
++              return -EINVAL;
++
++      if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)
++              return ret;
++
++      if ((ret =
++           mt312_writereg(i2c, DISEQC_MODE,
++                          (diseqc_mode & 0x40) | mini_tab[c])) < 0)
++              return ret;
++
++      return 0;
++}
++
++static int mt312_set_tone(struct dvb_i2c_bus *i2c, const fe_sec_tone_mode_t t)
++{
++      const u8 tone_tab[2] = { 0x01, 0x00 };
++
++      int ret;
++      u8 diseqc_mode;
++
++      if (t > SEC_TONE_OFF)
++              return -EINVAL;
++
++      if ((ret = mt312_readreg(i2c, DISEQC_MODE, &diseqc_mode)) < 0)
++              return ret;
++
++      if ((ret =
++           mt312_writereg(i2c, DISEQC_MODE,
++                          (diseqc_mode & 0x40) | tone_tab[t])) < 0)
++              return ret;
++
++      return 0;
++}
++
++static int mt312_set_voltage(struct dvb_i2c_bus *i2c, const fe_sec_voltage_t v)
++{
++      const u8 volt_tab[3] = { 0x00, 0x40, 0x00 };
++
++      if (v > SEC_VOLTAGE_OFF)
++              return -EINVAL;
++
++      return mt312_writereg(i2c, DISEQC_MODE, volt_tab[v]);
++}
++
++static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t * s)
++{
++      int ret;
++      u8 status[3];
++
++      *s = 0;
++
++      if ((ret = mt312_read(i2c, QPSK_STAT_H, status, sizeof(status))) < 0)
++              return ret;
++
++      if (status[0] & 0xc0)
++              *s |= FE_HAS_SIGNAL;    /* signal noise ratio */
++      if (status[0] & 0x04)
++              *s |= FE_HAS_CARRIER;   /* qpsk carrier lock */
++      if (status[2] & 0x02)
++              *s |= FE_HAS_VITERBI;   /* viterbi lock */
++      if (status[2] & 0x04)
++              *s |= FE_HAS_SYNC;      /* byte align lock */
++      if (status[0] & 0x01)
++              *s |= FE_HAS_LOCK;      /* qpsk lock */
++
++      return 0;
++}
++
++static int mt312_read_bercnt(struct dvb_i2c_bus *i2c, u32 * ber)
++{
++      int ret;
++      u8 buf[3];
++
++      if ((ret = mt312_read(i2c, RS_BERCNT_H, buf, 3)) < 0)
++              return ret;
++
++      *ber = ((buf[0] << 16) | (buf[1] << 8) | buf[2]) * 64;
++
++      return 0;
++}
++
++static int mt312_read_agc(struct dvb_i2c_bus *i2c, u16 * signal_strength)
++{
++      int ret;
++      u8 buf[3];
++      u16 agc;
++      s16 err_db;
++
++      if ((ret = mt312_read(i2c, AGC_H, buf, sizeof(buf))) < 0)
++              return ret;
++
++      agc = (buf[0] << 6) | (buf[1] >> 2);
++      err_db = (s16) (((buf[1] & 0x03) << 14) | buf[2] << 6) >> 6;
++
++      *signal_strength = agc;
++
++      printk(KERN_DEBUG "agc=%08x err_db=%hd\n", agc, err_db);
++
++      return 0;
++}
++
++static int mt312_read_snr(struct dvb_i2c_bus *i2c, u16 * snr)
++{
++      int ret;
++      u8 buf[2];
++
++      if ((ret = mt312_read(i2c, M_SNR_H, &buf, sizeof(buf))) < 0)
++              return ret;
++
++      *snr = 0xFFFF - ((((buf[0] & 0x7f) << 8) | buf[1]) << 1);
++
++      return 0;
++}
++
++static int mt312_read_ubc(struct dvb_i2c_bus *i2c, u32 * ubc)
++{
++      int ret;
++      u8 buf[2];
++
++      if ((ret = mt312_read(i2c, RS_UBC_H, &buf, sizeof(buf))) < 0)
++              return ret;
++
++      *ubc = (buf[0] << 8) | buf[1];
++
++      return 0;
++}
++
++static int mt312_set_frontend(struct dvb_i2c_bus *i2c,
++                            const struct dvb_frontend_parameters *p,
++                            const long id)
++{
++      int ret;
++      u8 buf[5];
++      u16 sr;
++
++      const u8 fec_tab[10] =
++          { 0x00, 0x01, 0x02, 0x04, 0x3f, 0x08, 0x10, 0x20, 0x3f, 0x3f };
++      const u8 inv_tab[3] = { 0x00, 0x40, 0x80 };
++
++      int (*set_tv_freq)(struct dvb_i2c_bus *i2c, u32 freq, u32 sr);
++
++      if ((p->frequency < mt312_info.frequency_min)
++          || (p->frequency > mt312_info.frequency_max))
++              return -EINVAL;
++
++      if ((p->inversion < INVERSION_OFF)
++          || (p->inversion > INVERSION_AUTO))
++              return -EINVAL;
++
++      if ((p->u.qpsk.symbol_rate < mt312_info.symbol_rate_min)
++          || (p->u.qpsk.symbol_rate > mt312_info.symbol_rate_max))
++              return -EINVAL;
++
++      if ((p->u.qpsk.fec_inner < FEC_NONE)
++          || (p->u.qpsk.fec_inner > FEC_AUTO))
++              return -EINVAL;
++
++      if ((p->u.qpsk.fec_inner == FEC_4_5)
++          || (p->u.qpsk.fec_inner == FEC_8_9))
++              return -EINVAL;
++
++      switch (id) {
++      case ID_VP310:
++              set_tv_freq = tsa5059_set_tv_freq;
++              break;
++      case ID_MT312:
++              set_tv_freq = sl1935_set_tv_freq;
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      if ((ret = set_tv_freq(i2c, p->frequency, p->u.qpsk.symbol_rate)) < 0)
++              return ret;
++
++      /* sr = (u16)(sr * 256.0 / 1000000.0) */
++      sr = mt312_div(p->u.qpsk.symbol_rate * 4, 15625);
++
++      /* SYM_RATE */
++      buf[0] = (sr >> 8) & 0x3f;
++      buf[1] = (sr >> 0) & 0xff;
++
++      /* VIT_MODE */
++      buf[2] = inv_tab[p->inversion] | fec_tab[p->u.qpsk.fec_inner];
++
++      /* QPSK_CTRL */
++      buf[3] = 0x40;          /* swap I and Q before QPSK demodulation */
++
++      if (p->u.qpsk.symbol_rate < 10000000)
++              buf[3] |= 0x04; /* use afc mode */
++
++      /* GO */
++      buf[4] = 0x01;
++
++      if ((ret = mt312_write(i2c, SYM_RATE_H, buf, sizeof(buf))) < 0)
++              return ret;
++
++      return 0;
++}
++
++static int mt312_get_inversion(struct dvb_i2c_bus *i2c,
++                             fe_spectral_inversion_t * i)
++{
++      int ret;
++      u8 vit_mode;
++
++      if ((ret = mt312_readreg(i2c, VIT_MODE, &vit_mode)) < 0)
++              return ret;
++
++      if (vit_mode & 0x80)    /* auto inversion was used */
++              *i = (vit_mode & 0x40) ? INVERSION_ON : INVERSION_OFF;
++
++      return 0;
++}
++
++static int mt312_get_symbol_rate(struct dvb_i2c_bus *i2c, u32 * sr)
++{
++      int ret;
++      u8 sym_rate_h;
++      u8 dec_ratio;
++      u16 sym_rat_op;
++      u16 monitor;
++      u8 buf[2];
++
++      if ((ret = mt312_readreg(i2c, SYM_RATE_H, &sym_rate_h)) < 0)
++              return ret;
++
++      if (sym_rate_h & 0x80) {        /* symbol rate search was used */
++              if ((ret = mt312_writereg(i2c, MON_CTRL, 0x03)) < 0)
++                      return ret;
++
++              if ((ret = mt312_read(i2c, MONITOR_H, buf, sizeof(buf))) < 0)
++                      return ret;
++
++              monitor = (buf[0] << 8) | buf[1];
++
++              printk(KERN_DEBUG "sr(auto) = %u\n",
++                     mt312_div(monitor * 15625, 4));
++      } else {
++              if ((ret = mt312_writereg(i2c, MON_CTRL, 0x05)) < 0)
++                      return ret;
++
++              if ((ret = mt312_read(i2c, MONITOR_H, buf, sizeof(buf))) < 0)
++                      return ret;
++
++              dec_ratio = ((buf[0] >> 5) & 0x07) * 32;
++
++              if ((ret = mt312_read(i2c, SYM_RAT_OP_H, buf, sizeof(buf))) < 0)
++                      return ret;
++
++              sym_rat_op = (buf[0] << 8) | buf[1];
++
++              printk(KERN_DEBUG "sym_rat_op=%d dec_ratio=%d\n",
++                     sym_rat_op, dec_ratio);
++              printk(KERN_DEBUG "*sr(manual) = %lu\n",
++                     (((MT312_PLL_CLK * 8192) / (sym_rat_op + 8192)) *
++                      2) - dec_ratio);
++      }
++
++      return 0;
++}
++
++static int mt312_get_code_rate(struct dvb_i2c_bus *i2c, fe_code_rate_t * cr)
++{
++      const fe_code_rate_t fec_tab[8] =
++          { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_6_7, FEC_7_8,
++              FEC_AUTO, FEC_AUTO };
++
++      int ret;
++      u8 fec_status;
++
++      if ((ret = mt312_readreg(i2c, FEC_STATUS, &fec_status)) < 0)
++              return ret;
++
++      *cr = fec_tab[(fec_status >> 4) & 0x07];
++
++      return 0;
++}
++
++static int mt312_get_frontend(struct dvb_i2c_bus *i2c,
++                            struct dvb_frontend_parameters *p)
++{
++      int ret;
++
++      if ((ret = mt312_get_inversion(i2c, &p->inversion)) < 0)
++              return ret;
++
++      if ((ret = mt312_get_symbol_rate(i2c, &p->u.qpsk.symbol_rate)) < 0)
++              return ret;
++
++      if ((ret = mt312_get_code_rate(i2c, &p->u.qpsk.fec_inner)) < 0)
++              return ret;
++
++      return 0;
++}
++
++static int mt312_sleep(struct dvb_i2c_bus *i2c)
++{
++      int ret;
++      u8 config;
++
++      /* reset all registers to defaults */
++      if ((ret = mt312_reset(i2c, 1)) < 0)
++              return ret;
++
++      if ((ret = mt312_readreg(i2c, CONFIG, &config)) < 0)
++              return ret;
++
++      /* enter standby */
++      if ((ret = mt312_writereg(i2c, CONFIG, config & 0x7f)) < 0)
++              return ret;
++
++      return 0;
++}
++
++static int mt312_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
++{
++      struct dvb_i2c_bus *i2c = fe->i2c;
++
++      switch (cmd) {
++      case FE_GET_INFO:
++              memcpy(arg, &mt312_info, sizeof(struct dvb_frontend_info));
++              break;
++
++      case FE_DISEQC_RESET_OVERLOAD:
++              return -EOPNOTSUPP;
++
++      case FE_DISEQC_SEND_MASTER_CMD:
++              return mt312_send_master_cmd(i2c, arg);
++
++      case FE_DISEQC_RECV_SLAVE_REPLY:
++              if ((long) fe->data == ID_MT312)
++                      return mt312_recv_slave_reply(i2c, arg);
++              else
++                      return -EOPNOTSUPP;
++
++      case FE_DISEQC_SEND_BURST:
++              return mt312_send_burst(i2c, (fe_sec_mini_cmd_t) arg);
++
++      case FE_SET_TONE:
++              return mt312_set_tone(i2c, (fe_sec_tone_mode_t) arg);
++
++      case FE_SET_VOLTAGE:
++              return mt312_set_voltage(i2c, (fe_sec_voltage_t) arg);
++
++      case FE_ENABLE_HIGH_LNB_VOLTAGE:
++              return -EOPNOTSUPP;
++
++      case FE_READ_STATUS:
++              return mt312_read_status(i2c, arg);
++
++      case FE_READ_BER:
++              return mt312_read_bercnt(i2c, arg);
++
++      case FE_READ_SIGNAL_STRENGTH:
++              return mt312_read_agc(i2c, arg);
++
++      case FE_READ_SNR:
++              return mt312_read_snr(i2c, arg);
++
++      case FE_READ_UNCORRECTED_BLOCKS:
++              return mt312_read_ubc(i2c, arg);
++
++      case FE_SET_FRONTEND:
++              return mt312_set_frontend(i2c, arg, (long) fe->data);
++
++      case FE_GET_FRONTEND:
++              return mt312_get_frontend(i2c, arg);
++
++      case FE_GET_EVENT:
++              return -EOPNOTSUPP;
++
++      case FE_SLEEP:
++              return mt312_sleep(i2c);
++
++      case FE_INIT:
++              return mt312_init(i2c, (long) fe->data);
++
++      case FE_RESET:
++              return mt312_reset(i2c, 0);
++
++      default:
++              return -ENOIOCTLCMD;
++      }
++
++      return 0;
++}
++
++static int mt312_attach(struct dvb_i2c_bus *i2c)
++{
++      int ret;
++      u8 id;
++
++      if ((ret = mt312_readreg(i2c, ID, &id)) < 0)
++              return ret;
++
++      if ((id != ID_VP310) && (id != ID_MT312))
++              return -ENODEV;
++
++      return dvb_register_frontend(mt312_ioctl, i2c, (void *) (long) id,
++                                   &mt312_info);
++}
++
++static void mt312_detach(struct dvb_i2c_bus *i2c)
++{
++      dvb_unregister_frontend(mt312_ioctl, i2c);
++}
++
++static int __init mt312_module_init(void)
++{
++      return dvb_register_i2c_device(THIS_MODULE, mt312_attach, mt312_detach);
++}
++
++static void __exit mt312_module_exit(void)
++{
++      dvb_unregister_i2c_device(mt312_attach);
++}
++
++module_init(mt312_module_init);
++module_exit(mt312_module_exit);
++
++MODULE_DESCRIPTION("MT312 Satellite Channel Decoder Driver");
++MODULE_AUTHOR("Andreas Oberritter <obi@saftware.de>");
++MODULE_LICENSE("GPL");
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/frontends/mt312.h     2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,162 @@
++/* 
++    Driver for Zarlink MT312 QPSK Frontend
++
++    Copyright (C) 2003 Andreas Oberritter <obi@saftware.de>
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++*/
++
++#ifndef _DVB_FRONTENDS_MT312
++#define _DVB_FRONTENDS_MT312
++
++enum mt312_reg_addr {
++      QPSK_INT_H = 0,
++      QPSK_INT_M = 1,
++      QPSK_INT_L = 2,
++      FEC_INT = 3,
++      QPSK_STAT_H = 4,
++      QPSK_STAT_L = 5,
++      FEC_STATUS = 6,
++      LNB_FREQ_H = 7,
++      LNB_FREQ_L = 8,
++      M_SNR_H = 9,
++      M_SNR_L = 10,
++      VIT_ERRCNT_H = 11,
++      VIT_ERRCNT_M = 12,
++      VIT_ERRCNT_L = 13,
++      RS_BERCNT_H = 14,
++      RS_BERCNT_M = 15,
++      RS_BERCNT_L = 16,
++      RS_UBC_H = 17,
++      RS_UBC_L = 18,
++      SIG_LEVEL = 19,
++      GPP_CTRL = 20,
++      RESET = 21,
++      DISEQC_MODE = 22,
++      SYM_RATE_H = 23,
++      SYM_RATE_L = 24,
++      VIT_MODE = 25,
++      QPSK_CTRL = 26,
++      GO = 27,
++      IE_QPSK_H = 28,
++      IE_QPSK_M = 29,
++      IE_QPSK_L = 30,
++      IE_FEC = 31,
++      QPSK_STAT_EN = 32,
++      FEC_STAT_EN = 33,
++      SYS_CLK = 34,
++      DISEQC_RATIO = 35,
++      DISEQC_INSTR = 36,
++      FR_LIM = 37,
++      FR_OFF = 38,
++      AGC_CTRL = 39,
++      AGC_INIT = 40,
++      AGC_REF = 41,
++      AGC_MAX = 42,
++      AGC_MIN = 43,
++      AGC_LK_TH = 44,
++      TS_AGC_LK_TH = 45,
++      AGC_PWR_SET = 46,
++      QPSK_MISC = 47,
++      SNR_THS_LOW = 48,
++      SNR_THS_HIGH = 49,
++      TS_SW_RATE = 50,
++      TS_SW_LIM_L = 51,
++      TS_SW_LIM_H = 52,
++      CS_SW_RATE_1 = 53,
++      CS_SW_RATE_2 = 54,
++      CS_SW_RATE_3 = 55,
++      CS_SW_RATE_4 = 56,
++      CS_SW_LIM = 57,
++      TS_LPK = 58,
++      TS_LPK_M = 59,
++      TS_LPK_L = 60,
++      CS_KPROP_H = 61,
++      CS_KPROP_L = 62,
++      CS_KINT_H = 63,
++      CS_KINT_L = 64,
++      QPSK_SCALE = 65,
++      TLD_OUTCLK_TH = 66,
++      TLD_INCLK_TH = 67,
++      FLD_TH = 68,
++      PLD_OUTLK3 = 69,
++      PLD_OUTLK2 = 70,
++      PLD_OUTLK1 = 71,
++      PLD_OUTLK0 = 72,
++      PLD_INLK3 = 73,
++      PLD_INLK2 = 74,
++      PLD_INLK1 = 75,
++      PLD_INLK0 = 76,
++      PLD_ACC_TIME = 77,
++      SWEEP_PAR = 78,
++      STARTUP_TIME = 79,
++      LOSSLOCK_TH = 80,
++      FEC_LOCK_TM = 81,
++      LOSSLOCK_TM = 82,
++      VIT_ERRPER_H = 83,
++      VIT_ERRPER_M = 84,
++      VIT_ERRPER_L = 85,
++      VIT_SETUP = 86,
++      VIT_REF0 = 87,
++      VIT_REF1 = 88,
++      VIT_REF2 = 89,
++      VIT_REF3 = 90,
++      VIT_REF4 = 91,
++      VIT_REF5 = 92,
++      VIT_REF6 = 93,
++      VIT_MAXERR = 94,
++      BA_SETUPT = 95,
++      OP_CTRL = 96,
++      FEC_SETUP = 97,
++      PROG_SYNC = 98,
++      AFC_SEAR_TH = 99,
++      CSACC_DIF_TH = 100,
++      QPSK_LK_CT = 101,
++      QPSK_ST_CT = 102,
++      MON_CTRL = 103,
++      QPSK_RESET = 104,
++      QPSK_TST_CT = 105,
++      QPSK_TST_ST = 106,
++      TEST_R = 107,
++      AGC_H = 108,
++      AGC_M = 109,
++      AGC_L = 110,
++      FREQ_ERR1_H = 111,
++      FREQ_ERR1_M = 112,
++      FREQ_ERR1_L = 113,
++      FREQ_ERR2_H = 114,
++      FREQ_ERR2_L = 115,
++      SYM_RAT_OP_H = 116,
++      SYM_RAT_OP_L = 117,
++      DESEQC2_INT = 118,
++      DISEQC2_STAT = 119,
++      DISEQC2_FIFO = 120,
++      DISEQC2_CTRL1 = 121,
++      DISEQC2_CTRL2 = 122,
++      MONITOR_H = 123,
++      MONITOR_L = 124,
++      TEST_MODE = 125,
++      ID = 126,
++      CONFIG = 127
++};
++
++enum mt312_model_id {
++      ID_VP310 = 1,
++      ID_MT312 = 3
++};
++
++#endif                                /* DVB_FRONTENDS_MT312 */
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/nxt6000.c    2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/nxt6000.c   2003-07-19 17:03:49.000000000 -0700
+@@ -6,8 +6,10 @@
+       
+       Alps TDME7 (Tuner: MITEL SP5659)
+       Alps TDED4 (Tuner: TI ALP510, external Nxt6000)
++      Comtech DVBT-6k07 (PLL IC: SP5730)
+     Copyright (C) 2002-2003 Florian Schirmer <schirmer@taytron.net>
++    Copyright (C) 2003 Paul Andreassen <paul@andreassen.com.au>
+     This program is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+@@ -78,6 +80,7 @@ struct nxt6000_config {
+ #define TUNER_TYPE_ALP510     0
+ #define TUNER_TYPE_SP5659     1
++#define TUNER_TYPE_SP5730     2
+ #define FE2NXT(fe) ((struct nxt6000_config *)&(fe->data))
+ #define FREQ2DIV(freq) ((freq + 36166667) / 166667)
+@@ -212,6 +215,39 @@ static int alp510_set_tv_freq(struct dvb
+       
+ }
++static int sp5730_set_tv_freq(struct dvb_frontend *fe, u32 freq)
++{
++
++      u8 buf[4];
++      struct nxt6000_config *nxt = FE2NXT(fe);
++
++      buf[0] = (FREQ2DIV(freq) >> 8) & 0x7F;
++      buf[1] = FREQ2DIV(freq) & 0xFF;
++      buf[2] = 0x93;
++
++      if ((freq >= 51000000) && (freq < 132100000))
++              buf[3] = 0x05;
++      else if ((freq >= 132100000) && (freq < 143000000))
++              buf[3] = 0x45;
++      else if ((freq >= 146000000) && (freq < 349100000))
++              buf[3] = 0x06;
++      else if ((freq >= 349100000) && (freq < 397100000))
++              buf[3] = 0x46;
++      else if ((freq >= 397100000) && (freq < 426000000))
++              buf[3] = 0x86;
++      else if ((freq >= 430000000) && (freq < 659100000))
++              buf[3] = 0x03;
++      else if ((freq >= 659100000) && (freq < 759100000))
++              buf[3] = 0x43;
++      else if ((freq >= 759100000) && (freq < 858000000))
++              buf[3] = 0x83;
++      else
++              return -EINVAL;
++
++      return pll_write(fe->i2c, nxt->demod_addr, nxt->tuner_addr, buf, 4);
++      
++}
++
+ static void nxt6000_reset(struct dvb_frontend *fe)
+ {
+@@ -756,6 +792,13 @@ static int nxt6000_ioctl(struct dvb_fron
+                                               
+                                       break;
+                                       
++                              case TUNER_TYPE_SP5730:
++
++                                      if ((result = sp5730_set_tv_freq(fe, param->frequency)) < 0)
++                                              return result;
++
++                                      break;
++
+                               default:
+                               
+                                       return -EFAULT;
+@@ -816,6 +859,14 @@ static int nxt6000_attach(struct dvb_i2c
+       
+                       dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt.tuner_addr);
+               
++              } else if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC0, NULL, 0) == 0) {
++
++                      nxt.tuner_addr = 0xC0;
++                      nxt.tuner_type = TUNER_TYPE_SP5730;
++                      nxt.clock_inversion = 0;
++      
++                      dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt.tuner_addr);
++              
+               } else {
+                       printk("nxt6000: unable to detect tuner\n");
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/frontends/tda1004x.c  2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,1158 @@
++  /*
++     Driver for Philips tda1004x OFDM Frontend
++
++     This program is free software; you can redistribute it and/or modify
++     it under the terms of the GNU General Public License as published by
++     the Free Software Foundation; either version 2 of the License, or
++     (at your option) any later version.
++
++     This program is distributed in the hope that it will be useful,
++     but WITHOUT ANY WARRANTY; without even the implied warranty of
++     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++
++     GNU General Public License for more details.
++
++     You should have received a copy of the GNU General Public License
++     along with this program; if not, write to the Free Software
++     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++   */
++
++/*
++    This driver needs a copy of the DLL "ttlcdacc.dll" from the Haupauge or Technotrend
++    windows driver saved as '/etc/dvb/tda1004x.mc'.
++    You can also pass the complete file name with the module parameter 'tda1004x_firmware'.
++
++    Currently the DLL from v2.15a of the technotrend driver is supported. Other versions can
++    be added reasonably painlessly.
++
++    Windows driver URL: http://www.technotrend.de/
++ */
++
++
++#define __KERNEL_SYSCALLS__
++#include <linux/kernel.h>
++#include <linux/vmalloc.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/string.h>
++#include <linux/slab.h>
++#include <linux/fs.h>
++#include <linux/unistd.h>
++#include <linux/fcntl.h>
++#include <linux/errno.h>
++#include "dvb_frontend.h"
++#include "dvb_functions.h"
++
++#ifndef CONFIG_TDA1004X_MC_LOCATION
++#define CONFIG_TDA1004X_MC_LOCATION "/etc/dvb/tda1004x.mc"
++#endif
++
++static int tda1004x_debug = 0;
++static char *tda1004x_firmware = CONFIG_TDA1004X_MC_LOCATION;
++
++
++#define TDA10045H_ADDRESS        0x08
++#define TD1344_ADDRESS           0x61
++#define TDM1316L_ADDRESS         0x63
++#define MC44BC374_ADDRESS        0x65
++
++#define TDA1004X_CHIPID          0x00
++#define TDA1004X_AUTO            0x01
++#define TDA1004X_IN_CONF1        0x02
++#define TDA1004X_IN_CONF2        0x03
++#define TDA1004X_OUT_CONF1       0x04
++#define TDA1004X_OUT_CONF2       0x05
++#define TDA1004X_STATUS_CD       0x06
++#define TDA1004X_CONFC4          0x07
++#define TDA1004X_DSSPARE2        0x0C
++#define TDA1004X_CODE_IN         0x0D
++#define TDA1004X_FWPAGE          0x0E
++#define TDA1004X_SCAN_CPT        0x10
++#define TDA1004X_DSP_CMD         0x11
++#define TDA1004X_DSP_ARG         0x12
++#define TDA1004X_DSP_DATA1       0x13
++#define TDA1004X_DSP_DATA2       0x14
++#define TDA1004X_CONFADC1        0x15
++#define TDA1004X_CONFC1          0x16
++#define TDA1004X_SIGNAL_STRENGTH 0x1a
++#define TDA1004X_SNR             0x1c
++#define TDA1004X_REG1E           0x1e
++#define TDA1004X_REG1F           0x1f
++#define TDA1004X_CBER_RESET      0x20
++#define TDA1004X_CBER_MSB        0x21
++#define TDA1004X_CBER_LSB        0x22
++#define TDA1004X_CVBER_LUT       0x23
++#define TDA1004X_VBER_MSB        0x24
++#define TDA1004X_VBER_MID        0x25
++#define TDA1004X_VBER_LSB        0x26
++#define TDA1004X_UNCOR           0x27
++#define TDA1004X_CONFPLL_P       0x2D
++#define TDA1004X_CONFPLL_M_MSB   0x2E
++#define TDA1004X_CONFPLL_M_LSB   0x2F
++#define TDA1004X_CONFPLL_N       0x30
++#define TDA1004X_UNSURW_MSB      0x31
++#define TDA1004X_UNSURW_LSB      0x32
++#define TDA1004X_WREF_MSB        0x33
++#define TDA1004X_WREF_MID        0x34
++#define TDA1004X_WREF_LSB        0x35
++#define TDA1004X_MUXOUT          0x36
++#define TDA1004X_CONFADC2        0x37
++#define TDA1004X_IOFFSET         0x38
++
++#define dprintk if (tda1004x_debug) printk
++
++static struct dvb_frontend_info tda10045h_info = {
++      .name = "Philips TDA10045H",
++      .type = FE_OFDM,
++      .frequency_min = 51000000,
++      .frequency_max = 858000000,
++      .frequency_stepsize = 166667,
++      .caps = FE_CAN_INVERSION_AUTO |
++          FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
++          FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
++          FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
++          FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO
++};
++
++#pragma pack(1)
++struct tda1004x_state {
++      u8 tda1004x_address;
++      u8 tuner_address;
++      u8 initialised:1;
++};
++#pragma pack()
++
++struct fwinfo {
++      int file_size;
++      int fw_offset;
++      int fw_size;
++};
++static struct fwinfo tda10045h_fwinfo[] = { {.file_size = 286720,.fw_offset = 0x34cc5,.fw_size = 30555} };
++static int tda10045h_fwinfo_count = sizeof(tda10045h_fwinfo) / sizeof(struct fwinfo);
++
++static int errno;
++
++
++static int tda1004x_write_byte(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg, int data)
++{
++      int ret;
++      u8 buf[] = { reg, data };
++      struct i2c_msg msg = { .addr=0, .flags=0, .buf=buf, .len=2 };
++
++      dprintk("%s: reg=0x%x, data=0x%x\n", __FUNCTION__, reg, data);
++
++        msg.addr = tda_state->tda1004x_address;
++      ret = i2c->xfer(i2c, &msg, 1);
++
++      if (ret != 1)
++              dprintk("%s: error reg=0x%x, data=0x%x, ret=%i\n",
++                     __FUNCTION__, reg, data, ret);
++
++      dprintk("%s: success reg=0x%x, data=0x%x, ret=%i\n", __FUNCTION__,
++              reg, data, ret);
++      return (ret != 1) ? -1 : 0;
++}
++
++static int tda1004x_read_byte(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg)
++{
++      int ret;
++      u8 b0[] = { reg };
++      u8 b1[] = { 0 };
++      struct i2c_msg msg[] = {{ .addr=0, .flags=0, .buf=b0, .len=1},
++                              { .addr=0, .flags=I2C_M_RD, .buf=b1, .len = 1}};
++
++      dprintk("%s: reg=0x%x\n", __FUNCTION__, reg);
++
++        msg[0].addr = tda_state->tda1004x_address;
++        msg[1].addr = tda_state->tda1004x_address;
++      ret = i2c->xfer(i2c, msg, 2);
++
++      if (ret != 2) {
++              dprintk("%s: error reg=0x%x, ret=%i\n", __FUNCTION__, reg,
++                     ret);
++              return -1;
++      }
++
++      dprintk("%s: success reg=0x%x, data=0x%x, ret=%i\n", __FUNCTION__,
++              reg, b1[0], ret);
++      return b1[0];
++}
++
++static int tda1004x_write_mask(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg, int mask, int data)
++{
++        int val;
++      dprintk("%s: reg=0x%x, mask=0x%x, data=0x%x\n", __FUNCTION__, reg,
++              mask, data);
++
++      // read a byte and check
++      val = tda1004x_read_byte(i2c, tda_state, reg);
++      if (val < 0)
++              return val;
++
++      // mask if off
++      val = val & ~mask;
++      val |= data & 0xff;
++
++      // write it out again
++      return tda1004x_write_byte(i2c, tda_state, reg, val);
++}
++
++static int tda1004x_write_buf(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg, unsigned char *buf, int len)
++{
++      int i;
++      int result;
++
++      dprintk("%s: reg=0x%x, len=0x%x\n", __FUNCTION__, reg, len);
++
++      result = 0;
++      for (i = 0; i < len; i++) {
++              result = tda1004x_write_byte(i2c, tda_state, reg + i, buf[i]);
++              if (result != 0)
++                      break;
++      }
++
++      return result;
++}
++
++static int tda1004x_enable_tuner_i2c(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state)
++{
++        int result;
++      dprintk("%s\n", __FUNCTION__);
++
++      result = tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 2, 2);
++      dvb_delay(1);
++      return result;
++}
++
++static int tda1004x_disable_tuner_i2c(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state)
++{
++
++      dprintk("%s\n", __FUNCTION__);
++
++      return tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 2, 0);
++}
++
++
++static int tda10045h_set_bandwidth(struct dvb_i2c_bus *i2c,
++                                 struct tda1004x_state *tda_state,
++                                 fe_bandwidth_t bandwidth)
++{
++        static u8 bandwidth_6mhz[] = { 0x02, 0x00, 0x3d, 0x00, 0x60, 0x1e, 0xa7, 0x45, 0x4f };
++        static u8 bandwidth_7mhz[] = { 0x02, 0x00, 0x37, 0x00, 0x4a, 0x2f, 0x6d, 0x76, 0xdb };
++        static u8 bandwidth_8mhz[] = { 0x02, 0x00, 0x3d, 0x00, 0x48, 0x17, 0x89, 0xc7, 0x14 };
++
++        switch (bandwidth) {
++      case BANDWIDTH_6_MHZ:
++              tda1004x_write_byte(i2c, tda_state, TDA1004X_DSSPARE2, 0x14);
++              tda1004x_write_buf(i2c, tda_state, TDA1004X_CONFPLL_P, bandwidth_6mhz, sizeof(bandwidth_6mhz));
++              break;
++
++      case BANDWIDTH_7_MHZ:
++              tda1004x_write_byte(i2c, tda_state, TDA1004X_DSSPARE2, 0x80);
++              tda1004x_write_buf(i2c, tda_state, TDA1004X_CONFPLL_P, bandwidth_7mhz, sizeof(bandwidth_7mhz));
++              break;
++
++      case BANDWIDTH_8_MHZ:
++              tda1004x_write_byte(i2c, tda_state, TDA1004X_DSSPARE2, 0x14);
++              tda1004x_write_buf(i2c, tda_state, TDA1004X_CONFPLL_P, bandwidth_8mhz, sizeof(bandwidth_8mhz));
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      tda1004x_write_byte(i2c, tda_state, TDA1004X_IOFFSET, 0);
++
++        // done
++        return 0;
++}
++
++
++static int tda1004x_init(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state)
++{
++      u8 fw_buf[65];
++      struct i2c_msg fw_msg = {.addr = 0,.flags = 0,.buf = fw_buf,.len = 0 };
++      struct i2c_msg tuner_msg = {.addr = 0,.flags = 0,.buf = 0,.len = 0 };
++      unsigned char *firmware = NULL;
++      int filesize;
++      int fd;
++      int fwinfo_idx;
++      int fw_size = 0;
++      int fw_pos;
++      int tx_size;
++        static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 };
++      mm_segment_t fs = get_fs();
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // Load the firmware
++      set_fs(get_ds());
++      fd = open(tda1004x_firmware, 0, 0);
++      if (fd < 0) {
++              printk("%s: Unable to open firmware %s\n", __FUNCTION__,
++                     tda1004x_firmware);
++              return -EIO;
++      }
++      filesize = lseek(fd, 0L, 2);
++      if (filesize <= 0) {
++              printk("%s: Firmware %s is empty\n", __FUNCTION__,
++                     tda1004x_firmware);
++              sys_close(fd);
++              return -EIO;
++      }
++
++      // find extraction parameters
++      for (fwinfo_idx = 0; fwinfo_idx < tda10045h_fwinfo_count; fwinfo_idx++) {
++              if (tda10045h_fwinfo[fwinfo_idx].file_size == filesize)
++                      break;
++      }
++      if (fwinfo_idx >= tda10045h_fwinfo_count) {
++              printk("%s: Unsupported firmware %s\n", __FUNCTION__, tda1004x_firmware);
++              sys_close(fd);
++              return -EIO;
++      }
++      fw_size = tda10045h_fwinfo[fwinfo_idx].fw_size;
++
++      // allocate buffer for it
++      firmware = vmalloc(fw_size);
++      if (firmware == NULL) {
++              printk("%s: Out of memory loading firmware\n",
++                     __FUNCTION__);
++              sys_close(fd);
++              return -EIO;
++      }
++
++      // read it!
++      lseek(fd, tda10045h_fwinfo[fwinfo_idx].fw_offset, 0);
++      if (read(fd, firmware, fw_size) != fw_size) {
++              printk("%s: Failed to read firmware\n", __FUNCTION__);
++              vfree(firmware);
++              sys_close(fd);
++              return -EIO;
++      }
++      sys_close(fd);
++      set_fs(fs);
++
++      // Disable the MC44BC374C
++      tda1004x_enable_tuner_i2c(i2c, tda_state);
++      tuner_msg.addr = MC44BC374_ADDRESS;
++      tuner_msg.buf = disable_mc44BC374c;
++      tuner_msg.len = sizeof(disable_mc44BC374c);
++      if (i2c->xfer(i2c, &tuner_msg, 1) != 1) {
++              i2c->xfer(i2c, &tuner_msg, 1);
++      }
++      tda1004x_disable_tuner_i2c(i2c, tda_state);
++
++      // set some valid bandwith parameters
++        switch(tda_state->tda1004x_address) {
++        case TDA10045H_ADDRESS:
++                tda10045h_set_bandwidth(i2c, tda_state, BANDWIDTH_8_MHZ);
++                break;
++        }
++      dvb_delay(500);
++
++      // do the firmware upload
++      tda1004x_write_byte(i2c, tda_state, TDA1004X_FWPAGE, 0);
++        fw_msg.addr = tda_state->tda1004x_address;
++      fw_pos = 0;
++      while (fw_pos != fw_size) {
++              // work out how much to send this time
++              tx_size = fw_size - fw_pos;
++              if (tx_size > 64) {
++                      tx_size = 64;
++              }
++              // send the chunk
++              fw_buf[0] = TDA1004X_CODE_IN;
++              memcpy(fw_buf + 1, firmware + fw_pos, tx_size);
++              fw_msg.len = tx_size + 1;
++              if (i2c->xfer(i2c, &fw_msg, 1) != 1) {
++                      vfree(firmware);
++                      return -EIO;
++              }
++              fw_pos += tx_size;
++
++              dprintk("%s: fw_pos=0x%x\n", __FUNCTION__, fw_pos);
++      }
++      dvb_delay(100);
++      vfree(firmware);
++
++      // Initialise the DSP and check upload was OK
++      tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 0x10, 0);
++      tda1004x_write_byte(i2c, tda_state, TDA1004X_DSP_CMD, 0x67);
++      if ((tda1004x_read_byte(i2c, tda_state, TDA1004X_DSP_DATA1) != 0x67) ||
++          (tda1004x_read_byte(i2c, tda_state, TDA1004X_DSP_DATA2) != 0x2c)) {
++              printk("%s: firmware upload failed!\n", __FUNCTION__);
++              return -EIO;
++      }
++
++      // tda setup
++      tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 8, 0);
++        tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 0x10, 0x10);
++        tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF2, 0xC0, 0x0);
++        tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 0x20, 0);
++        tda1004x_write_byte(i2c, tda_state, TDA1004X_CONFADC1, 0x2e);
++      tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x80, 0x80);
++      tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x40, 0);
++      tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x10, 0);
++        tda1004x_write_byte(i2c, tda_state, TDA1004X_REG1E, 0);
++      tda1004x_write_byte(i2c, tda_state, TDA1004X_REG1F, 0);
++      tda1004x_write_mask(i2c, tda_state, TDA1004X_VBER_MSB, 0xe0, 0xa0);
++
++      // done
++      return 0;
++}
++
++static int tda1004x_encode_fec(int fec)
++{
++      // convert known FEC values
++      switch (fec) {
++      case FEC_1_2:
++              return 0;
++      case FEC_2_3:
++              return 1;
++      case FEC_3_4:
++              return 2;
++      case FEC_5_6:
++              return 3;
++      case FEC_7_8:
++              return 4;
++      }
++
++      // unsupported
++      return -EINVAL;
++}
++
++static int tda1004x_decode_fec(int tdafec)
++{
++      // convert known FEC values
++      switch (tdafec) {
++      case 0:
++              return FEC_1_2;
++      case 1:
++              return FEC_2_3;
++      case 2:
++              return FEC_3_4;
++      case 3:
++              return FEC_5_6;
++      case 4:
++              return FEC_7_8;
++      }
++
++      // unsupported
++      return -1;
++}
++
++static int tda1004x_set_frequency(struct dvb_i2c_bus *i2c,
++                         struct tda1004x_state *tda_state,
++                         struct dvb_frontend_parameters *fe_params)
++{
++      u8 tuner_buf[4];
++      struct i2c_msg tuner_msg = {.addr=0, .flags=0, .buf=tuner_buf, .len=sizeof(tuner_buf) };
++      int tuner_frequency;
++        u8 band, cp, filter;
++      int counter, counter2;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // setup the frequency buffer
++      switch (tda_state->tuner_address) {
++      case TD1344_ADDRESS:
++
++              // setup tuner buffer
++              tuner_frequency =
++                        (((fe_params->frequency / 1000) * 6) + 217502) / 1000;
++              tuner_buf[0] = tuner_frequency >> 8;
++              tuner_buf[1] = tuner_frequency & 0xff;
++              tuner_buf[2] = 0x88;
++              if (fe_params->frequency < 550000000) {
++                      tuner_buf[3] = 0xab;
++              } else {
++                      tuner_buf[3] = 0xeb;
++              }
++
++              // tune it
++              tda1004x_enable_tuner_i2c(i2c, tda_state);
++              tuner_msg.addr = tda_state->tuner_address;
++              tuner_msg.len = 4;
++              i2c->xfer(i2c, &tuner_msg, 1);
++
++              // wait for it to finish
++              tuner_msg.len = 1;
++              tuner_msg.flags = I2C_M_RD;
++              counter = 0;
++              counter2 = 0;
++              while (counter++ < 100) {
++                      if (i2c->xfer(i2c, &tuner_msg, 1) == 1) {
++                              if (tuner_buf[0] & 0x40) {
++                                      counter2++;
++                              } else {
++                                      counter2 = 0;
++                              }
++                      }
++
++                      if (counter2 > 10) {
++                              break;
++                      }
++              }
++              tda1004x_disable_tuner_i2c(i2c, tda_state);
++              break;
++
++      case TDM1316L_ADDRESS:
++              // determine charge pump
++              tuner_frequency = fe_params->frequency + 36130000;
++              if (tuner_frequency < 87000000) {
++                      return -EINVAL;
++              } else if (tuner_frequency < 130000000) {
++                        cp = 3;
++              } else if (tuner_frequency < 160000000) {
++                      cp = 5;
++              } else if (tuner_frequency < 200000000) {
++                      cp = 6;
++              } else if (tuner_frequency < 290000000) {
++                      cp = 3;
++              } else if (tuner_frequency < 420000000) {
++                      cp = 5;
++              } else if (tuner_frequency < 480000000) {
++                      cp = 6;
++              } else if (tuner_frequency < 620000000) {
++                      cp = 3;
++              } else if (tuner_frequency < 830000000) {
++                      cp = 5;
++              } else if (tuner_frequency < 895000000) {
++                      cp = 7;
++              } else {
++                      return -EINVAL;
++              }
++
++              // determine band
++              if (fe_params->frequency < 49000000) {
++                        return -EINVAL;
++              } else if (fe_params->frequency < 159000000) {
++                        band = 1;
++              } else if (fe_params->frequency < 444000000) {
++                      band = 2;
++              } else if (fe_params->frequency < 861000000) {
++                      band = 4;
++              } else {
++                      return -EINVAL;
++              }
++
++              // work out filter
++              switch (fe_params->u.ofdm.bandwidth) {
++              case BANDWIDTH_6_MHZ:
++                        // 6 MHz isn't supported directly, but set this to
++                        // the 8 MHz setting in case we can fiddle it later
++                        filter = 1;
++                        break;
++
++                case BANDWIDTH_7_MHZ:
++                      filter = 0;
++                      break;
++
++              case BANDWIDTH_8_MHZ:
++                      filter = 1;
++                      break;
++
++              default:
++                      return -EINVAL;
++              }
++
++              // calculate tuner parameters
++              tuner_frequency =
++                        (((fe_params->frequency / 1000) * 6) + 217280) / 1000;
++              tuner_buf[0] = tuner_frequency >> 8;
++              tuner_buf[1] = tuner_frequency & 0xff;
++              tuner_buf[2] = 0xca;
++              tuner_buf[3] = (cp << 5) | (filter << 3) | band;
++
++              // tune it
++              tda1004x_enable_tuner_i2c(i2c, tda_state);
++              tuner_msg.addr = tda_state->tuner_address;
++              tuner_msg.len = 4;
++                if (i2c->xfer(i2c, &tuner_msg, 1) != 1) {
++                      return -EIO;
++              }
++              dvb_delay(1);
++              tda1004x_disable_tuner_i2c(i2c, tda_state);
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      dprintk("%s: success\n", __FUNCTION__);
++
++      // done
++      return 0;
++}
++
++static int tda1004x_set_fe(struct dvb_i2c_bus *i2c,
++                         struct tda1004x_state *tda_state,
++                         struct dvb_frontend_parameters *fe_params)
++{
++      int tmp;
++
++      dprintk("%s\n", __FUNCTION__);
++
++
++      // set frequency
++      tmp = tda1004x_set_frequency(i2c, tda_state, fe_params);
++      if (tmp < 0)
++              return tmp;
++
++        // hardcoded to use auto as much as possible
++        fe_params->u.ofdm.code_rate_HP = FEC_AUTO;
++        fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
++        fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
++
++      // Set standard params.. or put them to auto
++      if ((fe_params->u.ofdm.code_rate_HP == FEC_AUTO) ||
++          (fe_params->u.ofdm.code_rate_LP == FEC_AUTO) ||
++          (fe_params->u.ofdm.constellation == QAM_AUTO) ||
++          (fe_params->u.ofdm.hierarchy_information == HIERARCHY_AUTO)) {
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 1, 1);       // enable auto
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x03, 0);        // turn off constellation bits
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 0);        // turn off hierarchy bits
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF2, 0x3f, 0);        // turn off FEC bits
++      } else {
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 1, 0);       // disable auto
++
++              // set HP FEC
++              tmp = tda1004x_encode_fec(fe_params->u.ofdm.code_rate_HP);
++              if (tmp < 0) return tmp;
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF2, 7, tmp);
++
++              // set LP FEC
++              if (fe_params->u.ofdm.code_rate_LP != FEC_NONE) {
++                      tmp = tda1004x_encode_fec(fe_params->u.ofdm.code_rate_LP);
++                      if (tmp < 0) return tmp;
++                      tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF2, 0x38, tmp << 3);
++              }
++
++              // set constellation
++              switch (fe_params->u.ofdm.constellation) {
++              case QPSK:
++                      tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 3, 0);
++                      break;
++
++              case QAM_16:
++                      tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 3, 1);
++                      break;
++
++              case QAM_64:
++                      tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 3, 2);
++                      break;
++
++              default:
++                      return -EINVAL;
++              }
++
++              // set hierarchy
++              switch (fe_params->u.ofdm.hierarchy_information) {
++              case HIERARCHY_NONE:
++                      tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 0 << 5);
++                      break;
++
++              case HIERARCHY_1:
++                      tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 1 << 5);
++                      break;
++
++              case HIERARCHY_2:
++                      tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 2 << 5);
++                      break;
++
++              case HIERARCHY_4:
++                      tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x60, 3 << 5);
++                      break;
++
++              default:
++                      return -EINVAL;
++              }
++      }
++
++        // set bandwidth
++        switch(tda_state->tda1004x_address) {
++        case TDA10045H_ADDRESS:
++                tda10045h_set_bandwidth(i2c, tda_state, fe_params->u.ofdm.bandwidth);
++                break;
++        }
++
++      // set inversion
++      switch (fe_params->inversion) {
++      case INVERSION_OFF:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x20, 0);
++              break;
++
++      case INVERSION_ON:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC1, 0x20, 0x20);
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      // set guard interval
++      switch (fe_params->u.ofdm.guard_interval) {
++      case GUARD_INTERVAL_1_32:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 0);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 0 << 2);
++              break;
++
++      case GUARD_INTERVAL_1_16:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 0);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 1 << 2);
++              break;
++
++      case GUARD_INTERVAL_1_8:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 0);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 2 << 2);
++              break;
++
++      case GUARD_INTERVAL_1_4:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 0);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 3 << 2);
++              break;
++
++      case GUARD_INTERVAL_AUTO:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 2, 2);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x0c, 0 << 2);
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      // set transmission mode
++      switch (fe_params->u.ofdm.transmission_mode) {
++      case TRANSMISSION_MODE_2K:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 4, 0);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x10, 0 << 4);
++              break;
++
++      case TRANSMISSION_MODE_8K:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 4, 0);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x10, 1 << 4);
++              break;
++
++      case TRANSMISSION_MODE_AUTO:
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_AUTO, 4, 4);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_IN_CONF1, 0x10, 0);
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      // reset DSP
++      tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 8, 8);
++      tda1004x_write_mask(i2c, tda_state, TDA1004X_CONFC4, 8, 0);
++      dvb_delay(10);
++
++      // done
++      return 0;
++}
++
++
++static int tda1004x_get_fe(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, struct dvb_frontend_parameters *fe_params)
++{
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // inversion status
++      fe_params->inversion = INVERSION_OFF;
++      if (tda1004x_read_byte(i2c, tda_state, TDA1004X_CONFC1) & 0x20) {
++              fe_params->inversion = INVERSION_ON;
++      }
++
++      // bandwidth
++      switch (tda1004x_read_byte(i2c, tda_state, TDA1004X_WREF_LSB)) {
++      case 0x14:
++              fe_params->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;
++              break;
++      case 0xdb:
++              fe_params->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;
++              break;
++      case 0x4f:
++              fe_params->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;
++              break;
++      }
++
++      // FEC
++      fe_params->u.ofdm.code_rate_HP =
++          tda1004x_decode_fec(tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF2) & 7);
++      fe_params->u.ofdm.code_rate_LP =
++          tda1004x_decode_fec((tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF2) >> 3) & 7);
++
++      // constellation
++      switch (tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF1) & 3) {
++      case 0:
++              fe_params->u.ofdm.constellation = QPSK;
++              break;
++      case 1:
++              fe_params->u.ofdm.constellation = QAM_16;
++              break;
++      case 2:
++              fe_params->u.ofdm.constellation = QAM_64;
++              break;
++      }
++
++      // transmission mode
++      fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K;
++      if (tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF1) & 0x10) {
++              fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K;
++      }
++
++      // guard interval
++      switch ((tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF1) & 0x0c) >> 2) {
++      case 0:
++              fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_32;
++              break;
++      case 1:
++              fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_16;
++              break;
++      case 2:
++              fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_8;
++              break;
++      case 3:
++              fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_4;
++              break;
++      }
++
++      // hierarchy
++      switch ((tda1004x_read_byte(i2c, tda_state, TDA1004X_OUT_CONF1) & 0x60) >> 5) {
++      case 0:
++              fe_params->u.ofdm.hierarchy_information = HIERARCHY_NONE;
++              break;
++      case 1:
++              fe_params->u.ofdm.hierarchy_information = HIERARCHY_1;
++              break;
++      case 2:
++              fe_params->u.ofdm.hierarchy_information = HIERARCHY_2;
++              break;
++      case 3:
++              fe_params->u.ofdm.hierarchy_information = HIERARCHY_4;
++              break;
++      }
++
++      // done
++      return 0;
++}
++
++
++static int tda1004x_read_status(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, fe_status_t * fe_status)
++{
++      int status;
++        int cber;
++        int vber;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // read status
++      status = tda1004x_read_byte(i2c, tda_state, TDA1004X_STATUS_CD);
++      if (status == -1) {
++              return -EIO;
++      }
++
++        // decode
++      *fe_status = 0;
++        if (status & 4) *fe_status |= FE_HAS_SIGNAL;
++        if (status & 2) *fe_status |= FE_HAS_CARRIER;
++        if (status & 8) *fe_status |= FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
++
++        // if we don't already have VITERBI (i.e. not LOCKED), see if the viterbi
++        // is getting anything valid
++        if (!(*fe_status & FE_HAS_VITERBI)) {
++                // read the CBER
++                cber = tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_LSB);
++                if (cber == -1) return -EIO;
++                status = tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_MSB);
++                if (status == -1) return -EIO;
++                cber |= (status << 8);
++                tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_RESET);
++
++                if (cber != 65535) {
++                        *fe_status |= FE_HAS_VITERBI;
++                }
++        }
++
++        // if we DO have some valid VITERBI output, but don't already have SYNC
++        // bytes (i.e. not LOCKED), see if the RS decoder is getting anything valid.
++        if ((*fe_status & FE_HAS_VITERBI) && (!(*fe_status & FE_HAS_SYNC))) {
++                // read the VBER
++                vber = tda1004x_read_byte(i2c, tda_state, TDA1004X_VBER_LSB);
++                if (vber == -1) return -EIO;
++                status = tda1004x_read_byte(i2c, tda_state, TDA1004X_VBER_MID);
++                if (status == -1) return -EIO;
++                vber |= (status << 8);
++                status = tda1004x_read_byte(i2c, tda_state, TDA1004X_VBER_MSB);
++                if (status == -1) return -EIO;
++                vber |= ((status << 16) & 0x0f);
++                tda1004x_read_byte(i2c, tda_state, TDA1004X_CVBER_LUT);
++
++                // if RS has passed some valid TS packets, then we must be
++                // getting some SYNC bytes
++                if (vber < 16632) {
++                        *fe_status |= FE_HAS_SYNC;
++                }
++        }
++
++      // success
++      dprintk("%s: fe_status=0x%x\n", __FUNCTION__, *fe_status);
++      return 0;
++}
++
++static int tda1004x_read_signal_strength(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, u16 * signal)
++{
++      int tmp;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // read it
++      tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_SIGNAL_STRENGTH);
++      if (tmp < 0)
++              return -EIO;
++
++      // done
++      *signal = (tmp << 8) | tmp;
++      dprintk("%s: signal=0x%x\n", __FUNCTION__, *signal);
++      return 0;
++}
++
++
++static int tda1004x_read_snr(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, u16 * snr)
++{
++      int tmp;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // read it
++      tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_SNR);
++      if (tmp < 0)
++              return -EIO;
++        if (tmp) {
++                tmp = 255 - tmp;
++        }
++
++        // done
++      *snr = ((tmp << 8) | tmp);
++      dprintk("%s: snr=0x%x\n", __FUNCTION__, *snr);
++      return 0;
++}
++
++static int tda1004x_read_ucblocks(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, u32* ucblocks)
++{
++      int tmp;
++      int tmp2;
++      int counter;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // read the UCBLOCKS and reset
++      counter = 0;
++      tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_UNCOR);
++      if (tmp < 0)
++              return -EIO;
++        tmp &= 0x7f;
++      while (counter++ < 5) {
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_UNCOR, 0x80, 0);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_UNCOR, 0x80, 0);
++              tda1004x_write_mask(i2c, tda_state, TDA1004X_UNCOR, 0x80, 0);
++
++              tmp2 = tda1004x_read_byte(i2c, tda_state, TDA1004X_UNCOR);
++              if (tmp2 < 0)
++                      return -EIO;
++              tmp2 &= 0x7f;
++              if ((tmp2 < tmp) || (tmp2 == 0))
++                      break;
++      }
++
++      // done
++      if (tmp != 0x7f) {
++              *ucblocks = tmp;
++      } else {
++              *ucblocks = 0xffffffff;
++      }
++      dprintk("%s: ucblocks=0x%x\n", __FUNCTION__, *ucblocks);
++      return 0;
++}
++
++static int tda1004x_read_ber(struct dvb_i2c_bus *i2c, struct tda1004x_state* tda_state, u32* ber)
++{
++        int tmp;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // read it in
++        tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_LSB);
++        if (tmp < 0) return -EIO;
++        *ber = tmp << 1;
++        tmp = tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_MSB);
++        if (tmp < 0) return -EIO;
++        *ber |= (tmp << 9);
++        tda1004x_read_byte(i2c, tda_state, TDA1004X_CBER_RESET);
++
++      // done
++      dprintk("%s: ber=0x%x\n", __FUNCTION__, *ber);
++      return 0;
++}
++
++
++static int tda1004x_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
++{
++      int status = 0;
++      struct dvb_i2c_bus *i2c = fe->i2c;
++      struct tda1004x_state *tda_state = (struct tda1004x_state *) &(fe->data);
++
++      dprintk("%s: cmd=0x%x\n", __FUNCTION__, cmd);
++
++      switch (cmd) {
++      case FE_GET_INFO:
++                switch(tda_state->tda1004x_address) {
++                case TDA10045H_ADDRESS:
++                      memcpy(arg, &tda10045h_info, sizeof(struct dvb_frontend_info));
++                        break;
++                }
++              break;
++
++      case FE_READ_STATUS:
++              return tda1004x_read_status(i2c, tda_state, (fe_status_t *) arg);
++
++      case FE_READ_BER:
++              return tda1004x_read_ber(i2c, tda_state, (u32 *) arg);
++
++      case FE_READ_SIGNAL_STRENGTH:
++              return tda1004x_read_signal_strength(i2c, tda_state, (u16 *) arg);
++
++      case FE_READ_SNR:
++              return tda1004x_read_snr(i2c, tda_state, (u16 *) arg);
++
++      case FE_READ_UNCORRECTED_BLOCKS:
++              return tda1004x_read_ucblocks(i2c, tda_state, (u32 *) arg);
++
++      case FE_SET_FRONTEND:
++              return tda1004x_set_fe(i2c, tda_state, (struct dvb_frontend_parameters*) arg);
++
++      case FE_GET_FRONTEND:
++              return tda1004x_get_fe(i2c, tda_state, (struct dvb_frontend_parameters*) arg);
++
++      case FE_INIT:
++              // don't bother reinitialising
++              if (tda_state->initialised)
++                      return 0;
++
++              // OK, perform initialisation
++                status = tda1004x_init(i2c, tda_state);
++              if (status == 0)
++                      tda_state->initialised = 1;
++              return status;
++
++      default:
++              return -EOPNOTSUPP;
++      }
++
++      return 0;
++}
++
++
++static int tda1004x_attach(struct dvb_i2c_bus *i2c)
++{
++        int tda1004x_address = -1;
++      int tuner_address = -1;
++      struct tda1004x_state tda_state;
++      struct i2c_msg tuner_msg = {.addr=0, .flags=0, .buf=0, .len=0 };
++        static u8 td1344_init[] = { 0x0b, 0xf5, 0x88, 0xab };
++        static u8 tdm1316l_init[] = { 0x0b, 0xf5, 0x85, 0xab };
++
++      dprintk("%s\n", __FUNCTION__);
++
++      // probe for frontend
++        tda_state.tda1004x_address = TDA10045H_ADDRESS;
++      if (tda1004x_read_byte(i2c, &tda_state, TDA1004X_CHIPID) == 0x25) {
++                tda1004x_address = TDA10045H_ADDRESS;
++                printk("tda1004x: Detected Philips TDA10045H.\n");
++        }
++
++        // did we find a frontend?
++        if (tda1004x_address == -1) {
++              return -ENODEV;
++        }
++
++      // supported tuner?
++      tda1004x_enable_tuner_i2c(i2c, &tda_state);
++      tuner_msg.addr = TD1344_ADDRESS;
++      tuner_msg.buf = td1344_init;
++      tuner_msg.len = sizeof(td1344_init);
++      if (i2c->xfer(i2c, &tuner_msg, 1) == 1) {
++                dvb_delay(1);
++              tuner_address = TD1344_ADDRESS;
++              printk("tda1004x: Detected Philips TD1344 tuner. PLEASE CHECK THIS AND REPORT BACK!.\n");
++      } else {
++              tuner_msg.addr = TDM1316L_ADDRESS;
++                tuner_msg.buf = tdm1316l_init;
++                tuner_msg.len = sizeof(tdm1316l_init);
++                if (i2c->xfer(i2c, &tuner_msg, 1) == 1) {
++                        dvb_delay(1);
++                      tuner_address = TDM1316L_ADDRESS;
++                      printk("tda1004x: Detected Philips TDM1316L tuner.\n");
++              }
++      }
++      tda1004x_disable_tuner_i2c(i2c, &tda_state);
++
++      // did we find a tuner?
++      if (tuner_address == -1) {
++              printk("tda1004x: Detected, but with unknown tuner.\n");
++              return -ENODEV;
++      }
++
++        // create state
++        tda_state.tda1004x_address = tda1004x_address;
++      tda_state.tuner_address = tuner_address;
++      tda_state.initialised = 0;
++
++      // register
++        switch(tda_state.tda1004x_address) {
++        case TDA10045H_ADDRESS:
++              dvb_register_frontend(tda1004x_ioctl, i2c, (void *)(*((u32*) &tda_state)), &tda10045h_info);
++                break;
++        }
++
++      // success
++      return 0;
++}
++
++
++static
++void tda1004x_detach(struct dvb_i2c_bus *i2c)
++{
++      dprintk("%s\n", __FUNCTION__);
++
++      dvb_unregister_frontend(tda1004x_ioctl, i2c);
++}
++
++
++static
++int __init init_tda1004x(void)
++{
++      return dvb_register_i2c_device(THIS_MODULE, tda1004x_attach, tda1004x_detach);
++}
++
++
++static
++void __exit exit_tda1004x(void)
++{
++      dvb_unregister_i2c_device(tda1004x_attach);
++}
++
++module_init(init_tda1004x);
++module_exit(exit_tda1004x);
++
++MODULE_DESCRIPTION("Philips TDA10045H DVB-T Frontend");
++MODULE_AUTHOR("Andrew de Quincey & Robert Schlabbach");
++MODULE_LICENSE("GPL");
++
++MODULE_PARM(tda1004x_debug, "i");
++MODULE_PARM_DESC(tda1004x_debug, "enable verbose debug messages");
++
++MODULE_PARM(tda1004x_firmware, "s");
++MODULE_PARM_DESC(tda1004x_firmware, "Where to find the firmware file");
+--- linux-2.6.0-test1/drivers/media/dvb/frontends/ves1820.c    2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/frontends/ves1820.c   2003-07-19 17:03:49.000000000 -0700
+@@ -95,7 +95,7 @@ static struct dvb_frontend_info ves1820_
+ static u8 ves1820_inittab [] =
+ {
+-      0x69, 0x6A, 0x9B, 0x0A, 0x52, 0x46, 0x26, 0x1A,
++      0x69, 0x6A, 0x9B, 0x12, 0x12, 0x46, 0x26, 0x1A,
+       0x43, 0x6A, 0xAA, 0xAA, 0x1E, 0x85, 0x43, 0x28,
+       0xE0, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+@@ -109,7 +109,7 @@ static int ves1820_writereg (struct dvb_
+ {
+       u8 addr = GET_DEMOD_ADDR(fe->data);
+         u8 buf[] = { 0x00, reg, data };
+-      struct i2c_msg msg = { addr: addr, .flags = 0, .buf = buf, .len = 3 };
++      struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 3 };
+       struct dvb_i2c_bus *i2c = fe->i2c;
+         int ret;
+@@ -130,8 +130,8 @@ static u8 ves1820_readreg (struct dvb_fr
+       u8 b0 [] = { 0x00, reg };
+       u8 b1 [] = { 0 };
+       u8 addr = GET_DEMOD_ADDR(fe->data);
+-      struct i2c_msg msg [] = { { addr: addr, .flags = 0, .buf = b0, .len = 2 },
+-                         { addr: addr, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
++      struct i2c_msg msg [] = { { .addr = addr, .flags = 0, .buf = b0, .len = 2 },
++                         { .addr = addr, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
+       struct dvb_i2c_bus *i2c = fe->i2c;
+       int ret;
+@@ -147,7 +147,7 @@ static u8 ves1820_readreg (struct dvb_fr
+ static int tuner_write (struct dvb_i2c_bus *i2c, u8 addr, u8 data [4])
+ {
+         int ret;
+-        struct i2c_msg msg = { addr: addr, .flags = 0, .buf = data, .len = 4 };
++        struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = data, .len = 4 };
+         ret = i2c->xfer (i2c, &msg, 1);
+--- linux-2.6.0-test1/drivers/media/dvb/Kconfig        2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/media/dvb/Kconfig       2003-07-19 17:03:49.000000000 -0700
+@@ -33,9 +33,19 @@ source "drivers/media/dvb/dvb-core/Kconf
+ source "drivers/media/dvb/frontends/Kconfig"
+ comment "Supported SAA7146 based PCI Adapters"
+-      depends on DVB
++      depends on DVB && PCI
+ source "drivers/media/dvb/ttpci/Kconfig"
++comment "Supported USB Adapters"
++      depends on DVB && USB
++
++source "drivers/media/dvb/ttusb-budget/Kconfig"
++source "drivers/media/dvb/ttusb-dec/Kconfig"
++
++comment "Supported FlexCopII (B2C2) Adapters"
++      depends on DVB && PCI
++source "drivers/media/dvb/b2c2/Kconfig"
++
+ endmenu
+--- linux-2.6.0-test1/drivers/media/dvb/Makefile       2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/media/dvb/Makefile      2003-07-19 17:03:49.000000000 -0700
+@@ -2,4 +2,5 @@
+ # Makefile for the kernel multimedia device drivers.
+ #
+-obj-y        := dvb-core/ frontends/ ttpci/ # ttusb-budget/
++obj-y        := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/
++
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/av7110.c 2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/av7110.c        2003-07-19 17:03:49.000000000 -0700
+@@ -86,6 +86,7 @@
+       #define DEB_EE(x)
+ #endif
++#include "ttpci-eeprom.h"
+ #include "av7110.h"
+ #include "av7110_ipack.h"
+@@ -110,7 +111,8 @@ static int hw_sections = 1;
+ int av7110_num = 0;
+-#define FW_CI_LL_SUPPORT(arm_app) (((arm_app) >> 16) & 0x8000)
++#define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000)
++#define FW_VERSION(arm_app)       ((arm_app) & 0x0000FFFF)
+ /****************************************************************************
+  * DEBI functions
+@@ -1089,7 +1091,7 @@ static int OutCommand(struct av7110 *av7
+         u32 stat;
+ #endif
+-      DEB_EE(("av7110: %p\n",av7110));
++//    DEB_EE(("av7110: %p\n",av7110));
+       if (!av7110->arm_ready) {
+               DEB_D(("arm not ready.\n"));
+@@ -1166,7 +1168,7 @@ static inline int SOutCommand(struct av7
+ {
+         int ret;
+         
+-      DEB_EE(("av7110: %p\n",av7110));
++//    DEB_EE(("av7110: %p\n",av7110));
+         if (!av7110->arm_ready) {
+               DEB_D(("arm not ready.\n"));
+@@ -1190,7 +1192,7 @@ static int outcom(struct av7110 *av7110,
+         u16 buf[num+2];
+         int i, ret;
+-      DEB_EE(("av7110: %p\n",av7110));
++//    DEB_EE(("av7110: %p\n",av7110));
+         buf[0]=(( type << 8 ) | com);
+         buf[1]=num;
+@@ -1332,7 +1334,7 @@ static inline int msp_writereg(struct av
+ static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data)
+ {
+-      DEB_EE(("av7110: %p\n",av7110));
++//    DEB_EE(("av7110: %p\n",av7110));
+         return outcom(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data);
+ }
+@@ -1659,6 +1661,24 @@ static void OSDSetColor(struct av7110 *a
+                   color, ((blend>>4)&0x0f));
+ }
++static int OSDSetPalette(struct av7110 *av7110, u32 *colors, u8 first, u8 last)
++{
++       int i;
++       int length = last - first + 1;
++
++       if (length * 4 > DATA_BUFF3_SIZE)
++               return -1;
++
++       for (i=0; i<length; i++) {
++               u32 blend = (colors[i] & 0xF0000000) >> 4;
++               u32 yuv = blend ? RGB2YUV(colors[i] & 0xFF, (colors[i] >> 8) & 0xFF, (colors[i] >> 16) & 0xFF) | blend : 0;
++               yuv = ((yuv & 0xFFFF0000) >> 16) | ((yuv & 0x0000FFFF) << 16); // TODO kls2003-06-15: not sure if this is endian-proof
++               wdebi(av7110, DEBINOSWAP, DATA_BUFF3_BASE + i*4, yuv, 4);
++       }
++       return outcom(av7110, COMTYPE_OSD, Set_Palette, 4,
++               av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], first, last);
++}
++
+ static int OSDSetBlock(struct av7110 *av7110, int x0, int y0, int x1, int y1, int inc, u8 *data)
+ {
+         uint w, h, bpp, bpl, size, lpb, bnum, brest;
+@@ -1721,6 +1741,9 @@ static int OSD_DrawCommand(struct av7110
+                 return 0;
+         case OSD_SetPalette:
+         {      
++                if (FW_VERSION(av7110->arm_app) >= 0x2618)
++                        OSDSetPalette(av7110, (u32 *)dc->data, dc->color, dc->x0);
++                else {
+                 int i, len=dc->x0-dc->color+1;
+                 u8 *colors=(u8 *)dc->data;
+@@ -1728,6 +1751,7 @@ static int OSD_DrawCommand(struct av7110
+                         OSDSetColor(av7110, dc->color+i,
+                                     colors[i*4]  , colors[i*4+1],
+                                     colors[i*4+2], colors[i*4+3]);
++                }
+                 return 0;
+         }
+         case OSD_SetTrans: 
+@@ -2087,28 +2111,28 @@ static void SetMode(struct av7110 *av711
+ static inline void TestMode(struct av7110 *av7110, int mode)
+ {
+-      DEB_EE(("av7110: %p\n",av7110));
++//    DEB_EE(("av7110: %p\n",av7110));
+         outcom(av7110, COMTYPE_ENCODER, SetTestMode, 1, mode);
+ }
+ static inline void VidMode(struct av7110 *av7110, int mode)
+ {
+-      DEB_EE(("av7110: %p\n",av7110));
++//    DEB_EE(("av7110: %p\n",av7110));
+         outcom(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode);
+ }
+            
+-static inline int vidcom(struct av7110 *av7110, u32 com, u32 arg)
++static int inline vidcom(struct av7110 *av7110, u32 com, u32 arg)
+ {
+-      DEB_EE(("av7110: %p\n",av7110));
++//    DEB_EE(("av7110: %p\n",av7110));
+         return outcom(av7110, 0x80, 0x02, 4, 
+                       (com>>16), (com&0xffff), 
+                       (arg>>16), (arg&0xffff));
+ }
+-static inline int audcom(struct av7110 *av7110, u32 com)
++static int inline audcom(struct av7110 *av7110, u32 com)
+ {
+-      DEB_EE(("av7110: %p\n",av7110));
++//    DEB_EE(("av7110: %p\n",av7110));
+       return outcom(av7110, 0x80, 0x03, 4, 
+                       (com>>16), (com&0xffff));
+ }
+@@ -2583,38 +2607,274 @@ void p_to_t(u8 const *buf, long int leng
+  * V4L SECTION
+  ****************************************************************************/
+-int av7110_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
++static struct v4l2_input inputs[2] = {
++      { 0,    "DVB",          V4L2_INPUT_TYPE_CAMERA, 1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, 
++      { 1,    "ANALOG",       V4L2_INPUT_TYPE_TUNER,  2, 1, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++};
++
++/* taken from ves1820.c */
++static int ves1820_writereg(struct saa7146_dev *dev, u8 reg, u8 data)
++{
++      u8 addr = 0x09;
++        u8 buf[] = { 0x00, reg, data };
++      struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 3 };
++
++      DEB_EE(("av7710: dev: %p\n",dev));
++
++      if( 1 != saa7146_i2c_transfer(dev, &msg, 1, 1)) {
++              return -1;
++      }
++      return 0;
++}
++
++static int tuner_write(struct saa7146_dev *dev, u8 addr, u8 data [4])
++{
++        struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = data, .len = 4 };
++
++      DEB_EE(("av7710: dev: %p\n",dev));
++
++      if( 1 != saa7146_i2c_transfer(dev, &msg, 1, 1)) {
++              return -1;
++      }
++      return 0;
++}
++
++
++/**
++ *   set up the downconverter frequency divisor for a
++ *   reference clock comparision frequency of 62.5 kHz.
++ */
++static int tuner_set_tv_freq (struct saa7146_dev *dev, u32 freq)
++{
++        u32 div;
++      u8 config;
++        u8 buf [4];
++
++      DEB_EE(("av7710: freq: 0x%08x\n",freq));
++
++      /* magic number: 56. tuning with the frequency given by v4l2
++         is always off by 56*62.5 kHz...*/
++      div = freq + 56;
++
++      buf[0] = (div >> 8) & 0x7f;
++      buf[1] = div & 0xff;
++      buf[2] = 0x8e;
++
++      if (freq < 16*168.25 ) 
++              config = 0xa0;
++      else if (freq < 16*447.25) 
++              config = 0x90;
++      else
++              config = 0x30;
++      config &= ~0x02;
++
++      buf[3] = config;
++
++        return tuner_write (dev, 0x61, buf);
++}
++
++static struct saa7146_standard analog_standard[];
++static struct saa7146_standard dvb_standard[];
++static struct saa7146_standard standard[];
++
++int av7110_dvb_c_switch(struct saa7146_fh *fh)
++{
++      struct saa7146_dev *dev = fh->dev;
++      struct saa7146_vv *vv = dev->vv_data;
++      struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
++      u16 buf[3] = { ((COMTYPE_AUDIODAC << 8) + ADSwitch), 1, 1 };
++
++      u8 band = 0;
++      int source, sync;
++      struct saa7146_fh *ov_fh = NULL;
++      int restart_overlay = 0;
++
++      DEB_EE(("av7110: %p\n",av7110));
++
++      if( vv->ov_data != NULL ) {
++              ov_fh = vv->ov_data->fh;
++              saa7146_stop_preview(ov_fh);
++              restart_overlay = 1;
++      }
++
++      if( 0 != av7110->current_input ) {
++              buf[2] = 0;
++              band = 0x68; /* analog band */
++              source = SAA7146_HPS_SOURCE_PORT_B;
++              sync = SAA7146_HPS_SYNC_PORT_B;
++              memcpy(standard,analog_standard,sizeof(struct saa7146_standard)*2);
++      } else {
++              buf[2] = 1;
++              band = 0x28; /* digital band */ 
++              source = SAA7146_HPS_SOURCE_PORT_A;
++              sync = SAA7146_HPS_SYNC_PORT_A;
++              memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
++      }
++
++      /* hmm, this does not do anything!? */
++      if (OutCommand(av7110, buf, 3)) {
++              printk("ADSwitch error\n");
++      }
++
++      if( 0 != ves1820_writereg(dev, 0x0f, band )) {
++              printk("setting band in demodulator failed.\n");
++      }
++      saa7146_set_hps_source_and_sync(dev, source, sync);
++
++      /* restart overlay if it was active before */
++      if( 0 != restart_overlay ) {
++              saa7146_start_preview(ov_fh);
++      }
++
++      return 0;
++}
++
++int av7110_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
+ {
++      struct saa7146_dev *dev = fh->dev;
++      struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
+       DEB_EE(("saa7146_dev: %p\n",dev));
+       switch(cmd) {
++      case VIDIOC_G_TUNER:
++      {
++              struct v4l2_tuner *t = arg;
++
++              DEB_EE(("VIDIOC_G_TUNER: %d\n", t->index));
++
++              if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
++                      return -EINVAL;
++              }
++
++              memset(t,0,sizeof(*t));
++              strcpy(t->name, "Television");
++
++              t->type = V4L2_TUNER_ANALOG_TV;
++              t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
++              t->rangelow = 772;      /* 48.25 MHZ / 62.5 kHz = 772, see fi1216mk2-specs, page 2 */
++              t->rangehigh = 13684;   /* 855.25 MHz / 62.5 kHz = 13684 */
++              /* FIXME: add the real signal strength here */
++              t->signal = 0xffff;
++              t->afc = 0;             
++              /* fixme: real autodetection here */
++              t->rxsubchans   = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_MONO;
++
++              return 0;
++      }
++      case VIDIOC_S_TUNER:
++      {
++              struct v4l2_tuner *t = arg;
++              
++              DEB_EE(("VIDIOC_S_TUNER: %d\n", t->index));
++
++              if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
++                      return -EINVAL;
++              }
++
++
++              switch(t->audmode) {
++                      case V4L2_TUNER_MODE_STEREO: {
++                              DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n"));
++                              break;
++                      }
++                      case V4L2_TUNER_MODE_LANG1: {
++                              DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n"));
++                              break;
++                      }
++                      case V4L2_TUNER_MODE_LANG2: {
++                              DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG2\n"));
++                              break;
++                      }
++                      default: { /* case V4L2_TUNER_MODE_MONO: {*/
++                              DEB_D(("VIDIOC_S_TUNER: TDA9840_SET_MONO\n"));
++                              break;
++                      }
++              }
++
++              return 0;
++      }
++      case VIDIOC_G_FREQUENCY:
++      {
++              struct v4l2_frequency *f = arg;
++
++              DEB_EE(("VIDIOC_G_FREQ: freq:0x%08x.\n", f->frequency));
++
++              if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
++                      return -EINVAL;
++              }
++
++              memset(f,0,sizeof(*f));
++              f->type = V4L2_TUNER_ANALOG_TV;
++              f->frequency =  av7110->current_freq;
++
++              return 0;
++      }
++      case VIDIOC_S_FREQUENCY:
++      {
++              struct v4l2_frequency *f = arg;
++
++              DEB_EE(("VIDIOC_S_FREQUENCY: freq:0x%08x.\n",f->frequency));
++
++              if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
++                      return -EINVAL;
++              }
++
++              if (V4L2_TUNER_ANALOG_TV != f->type)
++                      return -EINVAL;
++
++              /* tune in desired frequency */                 
++              tuner_set_tv_freq(dev, f->frequency);
++              av7110->current_freq = f->frequency;
++
++              return 0;
++      }
+       case VIDIOC_ENUMINPUT:
+       {
+               struct v4l2_input *i = arg;
+               
++              DEB_EE(("VIDIOC_ENUMINPUT: %d\n", i->index));
++
++              if( 0 != av7110->has_analog_tuner ) {
++                      if( i->index < 0 || i->index >= 2) {
++                              return -EINVAL;
++                      }
++              } else {
+               if( i->index != 0 ) {
+                       return -EINVAL;
+               }
++              }               
+-              memset(i,0,sizeof(*i));
+-              i->index = 0;
+-              strcpy(i->name, "DVB");
+-              i->type = V4L2_INPUT_TYPE_CAMERA;
+-              i->audioset = 1;
++              memcpy(i, &inputs[i->index], sizeof(struct v4l2_input));
+               
+               return 0;
+       }
+       case VIDIOC_G_INPUT:
+       {
+               int *input = (int *)arg;
+-              *input = 0;
++              *input = av7110->current_input;
++              DEB_EE(("VIDIOC_G_INPUT: %d\n", *input));
+               return 0;               
+       }       
+       case VIDIOC_S_INPUT:
+       {
++              int input = *(int *)arg;
++
++              DEB_EE(("VIDIOC_S_INPUT: %d\n", input));
++
++              if( 0 == av7110->has_analog_tuner ) {
+               return 0;               
+       }       
++              
++              if( input < 0 || input >= 2) {
++                      return -EINVAL;
++              }
++              
++              /* fixme: switch inputs here */
++              av7110->current_input = input;
++              return av7110_dvb_c_switch(fh);
++      }       
+       default:
++              printk("no such ioctl\n");
+               return -ENOIOCTLCMD;
+       }
+       return 0;
+@@ -2997,7 +3257,7 @@ static int dvb_get_stc(struct dmx_demux 
+       DEB_EE(("av7110: fwstc = %04hx %04hx %04hx %04hx\n",
+                       fwstc[0], fwstc[1], fwstc[2], fwstc[3]));
+-      *stc =  (((uint64_t)fwstc[2] & 1) << 32) |
++      *stc =  (((uint64_t)(~fwstc[2]) & 1) << 32) |
+               (((uint64_t)fwstc[1])     << 16) | ((uint64_t)fwstc[0]);
+       *base = 1;
+@@ -4006,7 +4266,6 @@ static int av7110_register(struct av7110
+ #endif
+ //        }
+         
+-        av7110->dvb_net.card_num=av7110->dvb_adapter->num;
+         dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
+       return 0;
+@@ -4061,9 +4320,16 @@ struct saa7146_extension_ioctls ioctls[]
+       { VIDIOC_ENUMINPUT,     SAA7146_EXCLUSIVE },
+       { VIDIOC_G_INPUT,       SAA7146_EXCLUSIVE },
+       { VIDIOC_S_INPUT,       SAA7146_EXCLUSIVE },
++      { VIDIOC_G_FREQUENCY,   SAA7146_EXCLUSIVE },
++      { VIDIOC_S_FREQUENCY,   SAA7146_EXCLUSIVE },
++      { VIDIOC_G_TUNER,       SAA7146_EXCLUSIVE },
++      { VIDIOC_S_TUNER,       SAA7146_EXCLUSIVE },
+       { 0, 0 }
+ };
++static struct saa7146_ext_vv av7110_vv_data_st;
++static struct saa7146_ext_vv av7110_vv_data_c;
++
+ static int av7110_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext)
+ {
+       struct av7110 *av7110 = NULL;
+@@ -4081,7 +4347,16 @@ static int av7110_attach (struct saa7146
+       DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
+-      if (saa7146_vv_init(dev)) {
++      /* special case DVB-C: these cards have an analog tuner
++         plus need some special handling, so we have separate
++         saa7146_ext_vv data for these... */
++      if (dev->pci->subsystem_vendor == 0x110a) {
++              ret = saa7146_vv_init(dev, &av7110_vv_data_c);
++      } else {
++              ret = saa7146_vv_init(dev, &av7110_vv_data_st);
++      }
++      
++      if ( 0 != ret) {
+               ERR(("cannot init capture device. skipping.\n"));
+               kfree(av7110);
+               return -1;
+@@ -4114,6 +4389,8 @@ static int av7110_attach (struct saa7146
+               return -ENOMEM;
+       }
++      ttpci_eeprom_parse_mac(av7110->i2c_bus);
++
+       saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
+       saa7146_write(dev, BCS_CTRL, 0x80400040);
+@@ -4186,9 +4463,9 @@ static int av7110_attach (struct saa7146
+       bootarm(av7110);
+       firmversion(av7110);
+-      if ((av7110->arm_app&0xffff)<0x2501)
++      if (FW_VERSION(av7110->arm_app)<0x2501)
+               printk ("av7110: Warning, firmware version 0x%04x is too old. "
+-                      "System might be unstable!\n", av7110->arm_app&0xffff);
++                      "System might be unstable!\n", FW_VERSION(av7110->arm_app));
+       kernel_thread(arm_thread, (void *) av7110, 0);
+@@ -4199,6 +4476,8 @@ static int av7110_attach (struct saa7146
+       VidMode(av7110, vidmode);
+       /* remaining inits according to card and frontend type */
++      av7110->has_analog_tuner = 0;
++      av7110->current_input = 0;
+       if (i2c_writereg(av7110, 0x20, 0x00, 0x00)==1) {
+               printk ("av7110(%d): Crystal audio DAC detected\n",
+                       av7110->dvb_adapter->num);
+@@ -4225,6 +4504,31 @@ static int av7110_attach (struct saa7146
+                       msp_writereg(av7110, 0x12, 0x000a, 0x0220); // SCART 1 source
+                       msp_writereg(av7110, 0x12, 0x0007, 0x7f00); // SCART 1 volume
+                       msp_writereg(av7110, 0x12, 0x000d, 0x4800); // prescale SCART
++              
++              if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) {
++                      INFO(("saa7113 not accessible.\n"));
++              } else {
++                      av7110->has_analog_tuner = 1;
++                      /* init the saa7113 */
++                      i2c_writereg(av7110, 0x48, 0x02, 0xd0); i2c_writereg(av7110, 0x48, 0x03, 0x23); i2c_writereg(av7110, 0x48, 0x04, 0x00);
++                      i2c_writereg(av7110, 0x48, 0x05, 0x00); i2c_writereg(av7110, 0x48, 0x06, 0xe9); i2c_writereg(av7110, 0x48, 0x07, 0x0d);
++                      i2c_writereg(av7110, 0x48, 0x08, 0x98); i2c_writereg(av7110, 0x48, 0x09, 0x02); i2c_writereg(av7110, 0x48, 0x0a, 0x80);
++                      i2c_writereg(av7110, 0x48, 0x0b, 0x40); i2c_writereg(av7110, 0x48, 0x0c, 0x40); i2c_writereg(av7110, 0x48, 0x0d, 0x00);
++                      i2c_writereg(av7110, 0x48, 0x0e, 0x01); i2c_writereg(av7110, 0x48, 0x0f, 0x7c); i2c_writereg(av7110, 0x48, 0x10, 0x48);
++                      i2c_writereg(av7110, 0x48, 0x11, 0x0c); i2c_writereg(av7110, 0x48, 0x12, 0x8b); i2c_writereg(av7110, 0x48, 0x13, 0x10);
++                      i2c_writereg(av7110, 0x48, 0x14, 0x00); i2c_writereg(av7110, 0x48, 0x15, 0x00); i2c_writereg(av7110, 0x48, 0x16, 0x00);
++                      i2c_writereg(av7110, 0x48, 0x17, 0x00); i2c_writereg(av7110, 0x48, 0x18, 0x00); i2c_writereg(av7110, 0x48, 0x19, 0x00);
++                      i2c_writereg(av7110, 0x48, 0x1a, 0x00); i2c_writereg(av7110, 0x48, 0x1b, 0x00); i2c_writereg(av7110, 0x48, 0x1c, 0x00);
++                      i2c_writereg(av7110, 0x48, 0x1d, 0x00); i2c_writereg(av7110, 0x48, 0x1e, 0x00);
++              }       
++
++              memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
++              /* set dd1 stream a & b */
++                      saa7146_write(dev, DD1_STREAM_B, 0x00000000);
++              saa7146_write(dev, DD1_INIT, 0x0200700);
++              saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
++
++
+       } else if (dev->pci->subsystem_vendor == 0x110a) {
+               printk("av7110(%d): DVB-C w/o analog module detected\n",
+                       av7110->dvb_adapter->num);
+@@ -4330,6 +4634,16 @@ static struct saa7146_standard standard[
+       { "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 },
+ };
++static struct saa7146_standard analog_standard[] = {
++      { "PAL", V4L2_STD_PAL, 0x18, 288, 576, 0x08, 708, 709, 576, 768 },
++      { "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 },
++};
++
++static struct saa7146_standard dvb_standard[] = {
++      { "PAL", V4L2_STD_PAL, 0x14, 288, 576, 0x4a, 708, 709, 576, 768 },
++      { "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 },
++};
++
+ static struct saa7146_extension av7110_extension;
+ #define MAKE_AV7110_INFO(x_var,x_name) \
+@@ -4387,7 +4701,7 @@ static int std_callback(struct saa7146_d
+ }
+-static struct saa7146_ext_vv av7110_vv_data = {
++static struct saa7146_ext_vv av7110_vv_data_st = {
+       .inputs         = 1,
+       .audios         = 1,
+       .capabilities   = 0,
+@@ -4401,9 +4715,23 @@ static struct saa7146_ext_vv av7110_vv_d
+       .ioctl          = av7110_ioctl,
+ };
++static struct saa7146_ext_vv av7110_vv_data_c = {
++      .inputs         = 1,
++      .audios         = 1,
++      .capabilities   = V4L2_CAP_TUNER,
++      .flags          = 0,
++
++      .stds           = &standard[0],
++      .num_stds       = sizeof(standard)/sizeof(struct saa7146_standard),
++      .std_callback   = &std_callback, 
++
++      .ioctls         = &ioctls[0],
++      .ioctl          = av7110_ioctl,
++};
++
++
+ static struct saa7146_extension av7110_extension = {
+       .name           = "dvb\0",
+-      .ext_vv_data    = &av7110_vv_data,
+       .module         = THIS_MODULE,
+       .pci_tbl        = &pci_tbl[0],
+@@ -4442,7 +4770,11 @@ MODULE_LICENSE("GPL");
+ MODULE_PARM(av7110_debug,"i");
+ MODULE_PARM(vidmode,"i");
++MODULE_PARM_DESC(vidmode,"analog video out: 0 off, 1 CVBS+RGB (default), 2 CVBS+YC, 3 YC");
+ MODULE_PARM(pids_off,"i");
++MODULE_PARM_DESC(pids_off,"clear video/audio/PCR PID filters when demux is closed");
+ MODULE_PARM(adac,"i");
++MODULE_PARM_DESC(adac,"audio DAC type: 0 TI, 1 CRYSTAL, 2 MSP (use if autodetection fails)");
+ MODULE_PARM(hw_sections, "i");
++MODULE_PARM_DESC(hw_sections, "0 use software section filter, 1 use hardware");
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/av7110.h 2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/av7110.h        2003-07-19 17:03:49.000000000 -0700
+@@ -153,7 +153,8 @@ enum av7110_osd_command {  
+       BlitBmp,
+       ReleaseBmp,
+       SetWTrans,
+-      SetWNoTrans
++        SetWNoTrans,
++        Set_Palette
+ };
+ enum av7110_pid_command { 
+@@ -405,6 +406,11 @@ struct av7110 {
+       struct dvb_i2c_bus      *i2c_bus;       
+       char                    *card_name;
++      /* support for analog module of dvb-c */
++      int                     has_analog_tuner;
++      int                     current_input;
++      u32                     current_freq;
++                              
+       struct tasklet_struct   debi_tasklet;
+       struct tasklet_struct   gpio_tasklet;
+@@ -572,6 +578,9 @@ struct av7110 {
+ #define DATA_BUFF2_BASE       (DATA_BUFF1_BASE+DATA_BUFF1_SIZE)
+ #define DATA_BUFF2_SIZE       0x0800
++#define DATA_BUFF3_BASE (DATA_BUFF2_BASE+DATA_BUFF2_SIZE)
++#define DATA_BUFF3_SIZE 0x0400
++
+ #define Reserved      (DPRAM_BASE + 0x1E00)
+ #define Reserved_SIZE 0x1C0
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget-av.c      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget-av.c     2003-07-19 17:03:49.000000000 -0700
+@@ -170,6 +170,7 @@ static int budget_av_detach (struct saa7
+       return err;
+ }
++static struct saa7146_ext_vv vv_data;
+ static int budget_av_attach (struct saa7146_dev* dev,
+                     struct saa7146_pci_extension_data *info)
+@@ -207,16 +208,22 @@ static int budget_av_attach (struct saa7
+       dvb_delay(500);
+       if ((err = saa7113_init (budget_av))) {
+-              budget_av_detach(dev);
++              /* fixme: proper cleanup here */
++              ERR(("cannot init saa7113.\n"));
++              return err;
++      }
++
++      if ( 0 != saa7146_vv_init(dev,&vv_data)) {
++              /* fixme: proper cleanup here */
++              ERR(("cannot init vv subsystem.\n"));
+               return err;
+       }
+-      saa7146_vv_init(dev);
+       if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1",
+                                          VFL_TYPE_GRABBER)))
+       {
++              /* fixme: proper cleanup here */
+               ERR(("cannot register capture v4l2 device.\n"));
+-              budget_av_detach(dev);
+               return err;
+       }
+@@ -256,8 +263,9 @@ static struct saa7146_extension_ioctls i
+ };
+-static int av_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
++static int av_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
+ {
++      struct saa7146_dev *dev = fh->dev;
+       struct budget_av *budget_av = (struct budget_av*) dev->ext_priv;
+ /*
+       struct saa7146_vv *vv = dev->vv_data; 
+@@ -299,11 +307,19 @@ static int av_ioctl(struct saa7146_dev *
+ }
+ static struct saa7146_standard standard[] = {
+-      { "PAL",        V4L2_STD_PAL,   SAA7146_PAL_VALUES },
+-      { "NTSC",       V4L2_STD_NTSC,  SAA7146_NTSC_VALUES },
++      {
++              .name   = "PAL",        .id     = V4L2_STD_PAL,
++              .v_offset       = 0x17, .v_field        = 288,  .v_calc         = 576,
++              .h_offset       = 0x14, .h_pixels       = 680,  .h_calc         = 680+1,
++              .v_max_out      = 576,  .h_max_out      = 768,
++      }, {
++              .name   = "NTSC",       .id     = V4L2_STD_NTSC,
++              .v_offset       = 0x16, .v_field        = 240,  .v_calc         = 480,
++              .h_offset       = 0x06, .h_pixels       = 708,  .h_calc         = 708+1,
++              .v_max_out      = 480,  .h_max_out      = 640,
++      }
+ };
+-
+ static struct saa7146_ext_vv vv_data = {
+       .inputs         = 2,
+       .capabilities   = 0, // perhaps later: V4L2_CAP_VBI_CAPTURE, but that need tweaking with the saa7113
+@@ -338,8 +354,6 @@ static struct saa7146_extension budget_e
+       .attach         = budget_av_attach,
+       .detach         = budget_av_detach,
+-      .ext_vv_data    = &vv_data,
+-
+       .irq_mask       = MASK_10,
+       .irq_func       = ttpci_budget_irq10_handler,
+ };    
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget.c 2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget.c        2003-07-19 17:03:49.000000000 -0700
+@@ -192,6 +192,7 @@ static struct saa7146_extension budget_e
+ MAKE_BUDGET_INFO(ttbs,        "TT-Budget/WinTV-NOVA-S  PCI",  BUDGET_TT);
+ MAKE_BUDGET_INFO(ttbc,        "TT-Budget/WinTV-NOVA-C  PCI",  BUDGET_TT);
+ MAKE_BUDGET_INFO(ttbt,        "TT-Budget/WinTV-NOVA-T  PCI",  BUDGET_TT);
++MAKE_BUDGET_INFO(ttbt2,       "TT-Budget/WinTV-NOVA-T  PCI",  BUDGET_TT);
+ MAKE_BUDGET_INFO(satel,       "SATELCO Multimedia PCI",       BUDGET_TT_HW_DISEQC);
+ /* Uncomment for Budget Patch */
+ /*MAKE_BUDGET_INFO(fs_1_3,"Siemens/Technotrend/Hauppauge PCI rev1.3+Budget_Patch", BUDGET_PATCH);*/
+@@ -202,6 +203,7 @@ static struct pci_device_id pci_tbl[] = 
+       MAKE_EXTENSION_PCI(ttbs,  0x13c2, 0x1003),
+       MAKE_EXTENSION_PCI(ttbc,  0x13c2, 0x1004),
+       MAKE_EXTENSION_PCI(ttbt,  0x13c2, 0x1005),
++      MAKE_EXTENSION_PCI(ttbt2,  0x13c2, 0x1011),     
+       MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013),
+       {
+               .vendor    = 0,
+@@ -213,7 +215,6 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
+ static struct saa7146_extension budget_extension = {
+       .name           = "budget dvb\0",
+       .flags          = 0,
+-      .ext_vv_data    = NULL,
+       
+       .module         = THIS_MODULE,
+       .pci_tbl        = pci_tbl,
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget-ci.c      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget-ci.c     2003-07-19 17:03:49.000000000 -0700
+@@ -371,7 +371,6 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);
+ static struct saa7146_extension budget_extension = {
+       .name           = "budget_ci dvb\0",
+       .flags          = 0,
+-      .ext_vv_data    = NULL,
+       .module         = THIS_MODULE,
+       .pci_tbl        = &pci_tbl[0],
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget-core.c    2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget-core.c   2003-07-19 17:03:49.000000000 -0700
+@@ -1,4 +1,5 @@
+ #include "budget.h"
++#include "ttpci-eeprom.h"
+ int budget_debug = 0;
+@@ -165,7 +166,6 @@ static int budget_register(struct budget
+         if (ret < 0)
+                 return ret;
+-        budget->dvb_net.card_num = budget->dvb_adapter->num;
+         dvb_net_init(budget->dvb_adapter, &budget->dvb_net, &dvbdemux->dmx);
+       return 0;
+@@ -222,7 +222,7 @@ int ttpci_budget_init (struct budget *bu
+            get recognized before the main driver is loaded */
+         saa7146_write(dev, GPIO_CTRL, 0x500000);
+       
+-      saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_3200);
++      saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_120);
+       budget->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
+                                               budget->dvb_adapter, 0);
+@@ -232,6 +232,8 @@ int ttpci_budget_init (struct budget *bu
+               return -ENOMEM;
+       }
++      ttpci_eeprom_parse_mac(budget->i2c_bus);
++
+       if( NULL == (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci,length,&budget->pt))) {
+               ret = -ENOMEM;
+               goto err;
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/budget-patch.c   2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/budget-patch.c  2003-07-19 17:03:49.000000000 -0700
+@@ -165,6 +165,7 @@ static int budget_patch_attach (struct s
+ {
+         struct budget_patch *budget;
+         int err;
++      int count = 0;
+         if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL)))
+                 return -ENOMEM;
+@@ -263,7 +264,6 @@ static void __exit budget_patch_exit(voi
+ static struct saa7146_extension budget_extension = {
+         .name           = "budget_patch dvb\0",
+         .flags          = 0,
+-        .ext_vv_data    = NULL,
+         
+         .module         = THIS_MODULE,
+         .pci_tbl        = pci_tbl,
+--- linux-2.6.0-test1/drivers/media/dvb/ttpci/Makefile 2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/Makefile        2003-07-19 17:03:49.000000000 -0700
+@@ -3,16 +3,12 @@
+ # and the AV7110 DVB device driver
+ #
+-dvb-ttpci-budget-objs := budget.o
+-dvb-ttpci-budget-av-objs := budget-av.o
+-dvb-ttpci-budget-ci-objs := budget-ci.o
+-dvb-ttpci-budget-patch-objs := budget-patch.o
+ dvb-ttpci-objs := av7110.o av7110_ipack.o av7110_ir.o
+-obj-$(CONFIG_DVB_BUDGET) += budget-core.o dvb-ttpci-budget.o
+-obj-$(CONFIG_DVB_BUDGET_CI) += budget-core.o dvb-ttpci-budget-ci.o
+-obj-$(CONFIG_DVB_BUDGET_AV) += budget-core.o dvb-ttpci-budget-av.o
+-obj-$(CONFIG_DVB_BUDGET_PATCH) += budget-core.o dvb-ttpci-budget-patch.o
+-obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o
++obj-$(CONFIG_DVB_BUDGET) += budget-core.o budget.o ttpci-eeprom.o
++obj-$(CONFIG_DVB_BUDGET_AV) += budget-core.o budget-av.o ttpci-eeprom.o
++obj-$(CONFIG_DVB_BUDGET_CI) += budget-core.o budget-ci.o ttpci-eeprom.o
++obj-$(CONFIG_DVB_BUDGET_PATCH) += budget-core.o budget-patch.o ttpci-eeprom.o
++obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o ttpci-eeprom.o
+ EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/ttpci-eeprom.c  2003-07-19 17:03:49.000000000 -0700
+@@ -0,0 +1,120 @@
++/*
++    Retrieve encoded MAC address from 24C16 serial 2-wire EEPROM,
++    decode it and store it in the associated adapter struct for
++    use by dvb_net.c
++
++    This code was tested on TT-Budget/WinTV-NOVA-CI PCI boards with
++    Atmel and ST Microelectronics EEPROMs.
++
++    This card appear to have the 24C16 write protect held to ground,
++    thus permitting normal read/write operation. Theoretically it
++    would be possible to write routines to burn a different (encoded)
++    MAC address into the EEPROM.
++
++    Robert Schlabbach GMX
++    Michael Glaum     KVH Industries
++    Holger Waechtler  Convergence
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++*/
++
++#include <asm/errno.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/string.h>
++
++#include "dvb_i2c.h"
++#include "dvb_functions.h"
++
++#if 1
++#define dprintk(x...) printk(x)
++#else
++#define dprintk(x...)
++#endif
++
++
++static int ttpci_eeprom_read_encodedMAC(struct dvb_i2c_bus *i2c, u8 * encodedMAC)
++{
++      int ret;
++      u8 b0[] = { 0xd4 };
++
++      struct i2c_msg msg[] = {
++              {.addr = 0x50,.flags = 0,.buf = b0,.len = 1},
++              {.addr = 0x50,.flags = I2C_M_RD,.buf = encodedMAC,.len = 6}
++      };
++
++      dprintk("%s\n", __FUNCTION__);
++
++      ret = i2c->xfer(i2c, msg, 2);
++
++      if (ret != 2)           /* Assume EEPROM isn't there */
++              return (-ENODEV);
++
++      return 0;
++}
++
++static void decodeMAC(u8 * decodedMAC, const u8 * encodedMAC)
++{
++      u8 ormask0[3] = { 0x54, 0x7B, 0x9E };
++      u8 ormask1[3] = { 0xD3, 0xF1, 0x23 };
++      u8 low;
++      u8 high;
++      u8 shift;
++      int i;
++
++      decodedMAC[0] = 0x00;
++      decodedMAC[1] = 0xD0;
++      decodedMAC[2] = 0x5C;
++
++      for (i = 0; i < 3; i++) {
++              low = encodedMAC[2 * i] ^ ormask0[i];
++              high = encodedMAC[2 * i + 1] ^ ormask1[i];
++              shift = (high >> 6) & 0x3;
++
++              decodedMAC[5 - i] = ((high << 8) | low) >> shift;
++      }
++
++}
++
++
++int ttpci_eeprom_parse_mac(struct dvb_i2c_bus *i2c)
++{
++      int ret;
++      u8 encodedMAC[6];
++      u8 decodedMAC[6];
++
++      ret = ttpci_eeprom_read_encodedMAC(i2c, encodedMAC);
++
++      if (ret != 0) {         /* Will only be -ENODEV */
++              dprintk("Couldn't read from EEPROM: not there?\n");
++              memset(i2c->adapter->proposed_mac, 0, 6);
++              return ret;
++      }
++
++      decodeMAC(decodedMAC, encodedMAC);
++      memcpy(i2c->adapter->proposed_mac, decodedMAC, 6);
++
++      dprintk("%s adapter %i has MAC addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
++              i2c->adapter->name, i2c->adapter->num,
++              decodedMAC[0], decodedMAC[1], decodedMAC[2],
++              decodedMAC[3], decodedMAC[4], decodedMAC[5]);
++      dprintk("encoded MAC was %02x:%02x:%02x:%02x:%02x:%02x\n",
++              encodedMAC[0], encodedMAC[1], encodedMAC[2],
++              encodedMAC[3], encodedMAC[4], encodedMAC[5]);
++      return 0;
++}
++
++EXPORT_SYMBOL(ttpci_eeprom_parse_mac);
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttpci/ttpci-eeprom.h  2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,32 @@
++/*
++    Retrieve encoded MAC address from ATMEL ttpci_eeprom serial 2-wire EEPROM,
++    decode it and store it in associated adapter net device
++
++    Robert Schlabbach GMX
++    Michael Glaum     KVH Industries
++    Holger Waechtler  Convergence
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++*/
++
++#ifndef __TTPCI_EEPROM_H__
++#define __TTPCI_EEPROM_H__
++
++#include "dvb_i2c.h"
++
++extern int ttpci_eeprom_parse_mac(struct dvb_i2c_bus *i2c);
++
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c       2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,1271 @@
++/*
++ * TTUSB DVB driver
++ *
++ * Copyright (c) 2002 Holger Waechtler <holger@convergence.de>
++ * Copyright (c) 2003 Felix Domke <tmbinc@gmx.net>
++ *
++ *    This program is free software; you can redistribute it and/or
++ *    modify it under the terms of the GNU General Public License as
++ *    published by the Free Software Foundation; either version 2 of
++ *    the License, or (at your option) any later version.
++ */
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/wait.h>
++#include <linux/module.h>
++#include <linux/usb.h>
++#include <linux/delay.h>
++#include <linux/time.h>
++#include <linux/errno.h>
++#include <asm/semaphore.h>
++
++#include "dvb_frontend.h"
++#include "dmxdev.h"
++#include "dvb_demux.h"
++#include "dvb_net.h"
++
++#include <linux/dvb/frontend.h>
++#include <linux/dvb/dmx.h>
++#include <linux/pci.h>
++#include <linux/usb.h>
++
++#include "dvb_functions.h"
++
++/*
++  TTUSB_HWSECTIONS:
++    the DSP supports filtering in hardware, however, since the "muxstream"
++    is a bit braindead (no matching channel masks or no matching filter mask),
++    we won't support this - yet. it doesn't event support negative filters,
++    so the best way is maybe to keep TTUSB_HWSECTIONS undef'd and just
++    parse TS data. USB bandwith will be a problem when having large
++    datastreams, especially for dvb-net, but hey, that's not my problem.
++      
++  TTUSB_DISEQC, TTUSB_TONE:
++    let the STC do the diseqc/tone stuff. this isn't supported at least with
++    my TTUSB, so let it undef'd unless you want to implement another
++    frontend. never tested.
++              
++  DEBUG:
++    define it to > 3 for really hardcore debugging. you probably don't want
++    this unless the device doesn't load at all. > 2 for bandwidth statistics.
++*/
++
++static int debug = 0;
++
++#define dprintk(x...) do { if (debug) printk(KERN_DEBUG x); } while (0)
++
++#define ISO_BUF_COUNT      4
++#define FRAMES_PER_ISO_BUF 4
++#define ISO_FRAME_SIZE     912
++#define TTUSB_MAXCHANNEL   32
++#ifdef TTUSB_HWSECTIONS
++#define TTUSB_MAXFILTER    16 /* ??? */
++#endif
++
++#define TTUSB_BUDGET_NAME "ttusb_stc_fw"
++
++/**
++ *  since we're casting (struct ttusb*) <-> (struct dvb_demux*) around
++ *  the dvb_demux field must be the first in struct!!
++ */
++struct ttusb {
++      struct dvb_demux dvb_demux;
++      struct dmxdev dmxdev;
++      struct dvb_net dvbnet;
++
++      /* our semaphore, for channel allocation/deallocation */
++      struct semaphore sem;
++      /* and one for USB access. */
++      struct semaphore semusb;
++
++      struct dvb_adapter *adapter;
++      struct usb_device *dev;
++
++      int disconnecting;
++      int iso_streaming;
++
++      unsigned int bulk_out_pipe;
++      unsigned int bulk_in_pipe;
++      unsigned int isoc_in_pipe;
++
++      void *iso_buffer;
++      dma_addr_t iso_dma_handle;
++
++      struct urb *iso_urb[ISO_BUF_COUNT];
++
++      int running_feed_count;
++      int last_channel;
++      int last_filter;
++
++      u8 c;                   /* transaction counter, wraps around...  */
++      fe_sec_tone_mode_t tone;
++      fe_sec_voltage_t voltage;
++
++      int mux_state;          // 0..2 - MuxSyncWord, 3 - nMuxPacks,    4 - muxpack
++      u8 mux_npacks;
++      u8 muxpack[256 + 8];
++      int muxpack_ptr, muxpack_len;
++
++      int insync;
++
++      u16 cc;                 /* MuxCounter - will increment on EVERY MUX PACKET */
++      /* (including stuffing. yes. really.) */
++
++      u8 last_result[32];
++
++      struct ttusb_channel {
++              struct ttusb *ttusb;
++              struct dvb_demux_feed *dvbdmxfeed;
++
++              int active;
++              int id;
++              int pid;
++              int type;       /* 1 - TS, 2 - Filter */
++#ifdef TTUSB_HWSECTIONS
++              int filterstate[TTUSB_MAXFILTER];       /* 0: not busy, 1: busy */
++#endif
++      } channel[TTUSB_MAXCHANNEL];
++#if 0
++      devfs_handle_t stc_devfs_handle;
++#endif
++};
++
++/* ugly workaround ... don't know why it's neccessary to read */
++/* all result codes. */
++
++#define DEBUG 0
++static int ttusb_cmd(struct ttusb *ttusb,
++            const u8 * data, int len, int needresult)
++{
++      int actual_len;
++      int err;
++#if DEBUG >= 3
++      int i;
++
++      printk(">");
++      for (i = 0; i < len; ++i)
++              printk(" %02x", data[i]);
++      printk("\n");
++#endif
++
++      if (down_interruptible(&ttusb->semusb) < 0)
++              return -EAGAIN;
++
++      err = usb_bulk_msg(ttusb->dev, ttusb->bulk_out_pipe,
++                         (u8 *) data, len, &actual_len, HZ);
++      if (err != 0) {
++              dprintk("%s: usb_bulk_msg(send) failed, err == %i!\n",
++                      __FUNCTION__, err);
++              up(&ttusb->semusb);
++              return err;
++      }
++      if (actual_len != len) {
++              dprintk("%s: only wrote %d of %d bytes\n", __FUNCTION__,
++                      actual_len, len);
++              up(&ttusb->semusb);
++              return -1;
++      }
++
++      err = usb_bulk_msg(ttusb->dev, ttusb->bulk_in_pipe,
++                         ttusb->last_result, 32, &actual_len, HZ);
++
++      if (err != 0) {
++              printk("%s: failed, receive error %d\n", __FUNCTION__,
++                     err);
++              up(&ttusb->semusb);
++              return err;
++      }
++#if DEBUG >= 3
++      actual_len = ttusb->last_result[3] + 4;
++      printk("<");
++      for (i = 0; i < actual_len; ++i)
++              printk(" %02x", ttusb->last_result[i]);
++      printk("\n");
++#endif
++      if (!needresult)
++              up(&ttusb->semusb);
++      return 0;
++}
++
++static int ttusb_result(struct ttusb *ttusb, u8 * data, int len)
++{
++      memcpy(data, ttusb->last_result, len);
++      up(&ttusb->semusb);
++      return 0;
++}
++
++static int ttusb_i2c_msg(struct ttusb *ttusb,
++                u8 addr, u8 * snd_buf, u8 snd_len, u8 * rcv_buf,
++                u8 rcv_len)
++{
++      u8 b[0x28];
++      u8 id = ++ttusb->c;
++      int i, err;
++
++      if (snd_len > 0x28 - 7 || rcv_len > 0x20 - 7)
++              return -EINVAL;
++
++      b[0] = 0xaa;
++      b[1] = id;
++      b[2] = 0x31;
++      b[3] = snd_len + 3;
++      b[4] = addr << 1;
++      b[5] = snd_len;
++      b[6] = rcv_len;
++
++      for (i = 0; i < snd_len; i++)
++              b[7 + i] = snd_buf[i];
++
++      err = ttusb_cmd(ttusb, b, snd_len + 7, 1);
++
++      if (err)
++              return -EREMOTEIO;
++
++      err = ttusb_result(ttusb, b, 0x20);
++
++      if (rcv_len > 0) {
++
++              if (err || b[0] != 0x55 || b[1] != id) {
++                      dprintk
++                          ("%s: usb_bulk_msg(recv) failed, err == %i, id == %02x, b == ",
++                           __FUNCTION__, err, id);
++                      return -EREMOTEIO;
++              }
++
++              for (i = 0; i < rcv_len; i++)
++                      rcv_buf[i] = b[7 + i];
++      }
++
++      return rcv_len;
++}
++
++static int ttusb_i2c_xfer(struct dvb_i2c_bus *i2c, const struct i2c_msg msg[],
++                 int num)
++{
++      struct ttusb *ttusb = i2c->data;
++      int i = 0;
++      int inc;
++
++      if (down_interruptible(&ttusb->sem) < 0)
++              return -EAGAIN;
++
++      while (i < num) {
++              u8 addr, snd_len, rcv_len, *snd_buf, *rcv_buf;
++              int err;
++
++              if (num > i + 1 && (msg[i + 1].flags & I2C_M_RD)) {
++                      addr = msg[i].addr;
++                      snd_buf = msg[i].buf;
++                      snd_len = msg[i].len;
++                      rcv_buf = msg[i + 1].buf;
++                      rcv_len = msg[i + 1].len;
++                      inc = 2;
++              } else {
++                      addr = msg[i].addr;
++                      snd_buf = msg[i].buf;
++                      snd_len = msg[i].len;
++                      rcv_buf = NULL;
++                      rcv_len = 0;
++                      inc = 1;
++              }
++
++              err = ttusb_i2c_msg(ttusb, addr,
++                                  snd_buf, snd_len, rcv_buf, rcv_len);
++
++              if (err < rcv_len) {
++                      printk("%s: i == %i\n", __FUNCTION__, i);
++                      break;
++              }
++
++              i += inc;
++      }
++
++      up(&ttusb->sem);
++      return i;
++}
++
++#include "dvb-ttusb-dspbootcode.h"
++
++static int ttusb_boot_dsp(struct ttusb *ttusb)
++{
++      int i, err;
++      u8 b[40];
++
++      /* BootBlock */
++      b[0] = 0xaa;
++      b[2] = 0x13;
++      b[3] = 28;
++
++      /* upload dsp code in 32 byte steps (36 didn't work for me ...) */
++      /* 32 is max packet size, no messages should be splitted. */
++      for (i = 0; i < sizeof(dsp_bootcode); i += 28) {
++              memcpy(&b[4], &dsp_bootcode[i], 28);
++
++              b[1] = ++ttusb->c;
++
++              err = ttusb_cmd(ttusb, b, 32, 0);
++              if (err)
++                      goto done;
++      }
++
++      /* last block ... */
++      b[1] = ++ttusb->c;
++      b[2] = 0x13;
++      b[3] = 0;
++
++      err = ttusb_cmd(ttusb, b, 4, 0);
++      if (err)
++              goto done;
++
++      /* BootEnd */
++      b[1] = ++ttusb->c;
++      b[2] = 0x14;
++      b[3] = 0;
++
++      err = ttusb_cmd(ttusb, b, 4, 0);
++
++      done:
++      if (err) {
++              dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
++                      __FUNCTION__, err);
++      }
++
++      return err;
++}
++
++static int ttusb_set_channel(struct ttusb *ttusb, int chan_id, int filter_type,
++                    int pid)
++{
++      int err;
++      /* SetChannel */
++      u8 b[] = { 0xaa, ++ttusb->c, 0x22, 4, chan_id, filter_type,
++              (pid >> 8) & 0xff, pid & 0xff
++      };
++
++      err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++      return err;
++}
++
++static int ttusb_del_channel(struct ttusb *ttusb, int channel_id)
++{
++      int err;
++      /* DelChannel */
++      u8 b[] = { 0xaa, ++ttusb->c, 0x23, 1, channel_id };
++
++      err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++      return err;
++}
++
++#ifdef TTUSB_HWSECTIONS
++static int ttusb_set_filter(struct ttusb *ttusb, int filter_id,
++                   int associated_chan, u8 filter[8], u8 mask[8])
++{
++      int err;
++      /* SetFilter */
++      u8 b[] = { 0xaa, 0, 0x24, 0x1a, filter_id, associated_chan,
++              filter[0], filter[1], filter[2], filter[3],
++              filter[4], filter[5], filter[6], filter[7],
++              filter[8], filter[9], filter[10], filter[11],
++              mask[0], mask[1], mask[2], mask[3],
++              mask[4], mask[5], mask[6], mask[7],
++              mask[8], mask[9], mask[10], mask[11]
++      };
++
++      err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++      return err;
++}
++
++static int ttusb_del_filter(struct ttusb *ttusb, int filter_id)
++{
++      int err;
++      /* DelFilter */
++      u8 b[] = { 0xaa, ++ttusb->c, 0x25, 1, filter_id };
++
++      err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++      return err;
++}
++#endif
++
++static int ttusb_init_controller(struct ttusb *ttusb)
++{
++      u8 b0[] = { 0xaa, ++ttusb->c, 0x15, 1, 0 };
++      u8 b1[] = { 0xaa, ++ttusb->c, 0x15, 1, 1 };
++      u8 b2[] = { 0xaa, ++ttusb->c, 0x32, 1, 0 };
++      /* i2c write read: 5 bytes, addr 0x10, 0x02 bytes write, 1 bytes read. */
++      u8 b3[] =
++          { 0xaa, ++ttusb->c, 0x31, 5, 0x10, 0x02, 0x01, 0x00, 0x1e };
++      u8 b4[] =
++          { 0x55, ttusb->c, 0x31, 4, 0x10, 0x02, 0x01, 0x00, 0x1e };
++
++      u8 get_version[] = { 0xaa, ++ttusb->c, 0x17, 5, 0, 0, 0, 0, 0 };
++      u8 get_dsp_version[0x20] =
++          { 0xaa, ++ttusb->c, 0x26, 28, 0, 0, 0, 0, 0 };
++      int err;
++
++      /* reset board */
++      if ((err = ttusb_cmd(ttusb, b0, sizeof(b0), 0)))
++              return err;
++
++      /* reset board (again?) */
++      if ((err = ttusb_cmd(ttusb, b1, sizeof(b1), 0)))
++              return err;
++
++      ttusb_boot_dsp(ttusb);
++
++      /* set i2c bit rate */
++      if ((err = ttusb_cmd(ttusb, b2, sizeof(b2), 0)))
++              return err;
++
++      if ((err = ttusb_cmd(ttusb, b3, sizeof(b3), 1)))
++              return err;
++
++      err = ttusb_result(ttusb, b4, sizeof(b4));
++
++      if ((err = ttusb_cmd(ttusb, get_version, sizeof(get_version), 1)))
++              return err;
++
++      if ((err = ttusb_result(ttusb, get_version, sizeof(get_version))))
++              return err;
++
++      dprintk("%s: stc-version: %c%c%c%c%c\n", __FUNCTION__,
++              get_version[4], get_version[5], get_version[6],
++              get_version[7], get_version[8]);
++
++      if (memcmp(get_version + 4, "V 0.0", 5) &&
++          memcmp(get_version + 4, "V 1.1", 5)) {
++              printk
++                  ("%s: unknown STC version %c%c%c%c%c, please report!\n",
++                   __FUNCTION__, get_version[4], get_version[5],
++                   get_version[6], get_version[7], get_version[8]);
++      }
++
++      err =
++          ttusb_cmd(ttusb, get_dsp_version, sizeof(get_dsp_version), 1);
++      if (err)
++              return err;
++
++      err =
++          ttusb_result(ttusb, get_dsp_version, sizeof(get_dsp_version));
++      if (err)
++              return err;
++      printk("%s: dsp-version: %c%c%c\n", __FUNCTION__,
++             get_dsp_version[4], get_dsp_version[5], get_dsp_version[6]);
++      return 0;
++}
++
++#ifdef TTUSB_DISEQC
++static int ttusb_send_diseqc(struct ttusb *ttusb,
++                    const struct dvb_diseqc_master_cmd *cmd)
++{
++      u8 b[12] = { 0xaa, ++ttusb->c, 0x18 };
++
++      int err;
++
++      b[3] = 4 + 2 + cmd->msg_len;
++      b[4] = 0xFF;            /* send diseqc master, not burst */
++      b[5] = cmd->msg_len;
++
++      memcpy(b + 5, cmd->msg, cmd->msg_len);
++
++      /* Diseqc */
++      if ((err = ttusb_cmd(ttusb, b, 4 + b[3], 0))) {
++              dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
++                      __FUNCTION__, err);
++      }
++
++      return err;
++}
++#endif
++
++static int ttusb_update_lnb(struct ttusb *ttusb)
++{
++      u8 b[] = { 0xaa, ++ttusb->c, 0x16, 5, /*power: */ 1,
++              ttusb->voltage == SEC_VOLTAGE_18 ? 0 : 1,
++              ttusb->tone == SEC_TONE_ON ? 1 : 0, 1, 1
++      };
++      int err;
++
++      /* SetLNB */
++      if ((err = ttusb_cmd(ttusb, b, sizeof(b), 0))) {
++              dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
++                      __FUNCTION__, err);
++      }
++
++      return err;
++}
++
++static int ttusb_set_voltage(struct ttusb *ttusb, fe_sec_voltage_t voltage)
++{
++      ttusb->voltage = voltage;
++      return ttusb_update_lnb(ttusb);
++}
++
++#ifdef TTUSB_TONE
++static int ttusb_set_tone(struct ttusb *ttusb, fe_sec_tone_mode_t tone)
++{
++      ttusb->tone = tone;
++      return ttusb_update_lnb(ttusb);
++}
++#endif
++
++static int ttusb_lnb_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
++{
++      struct ttusb *ttusb = fe->i2c->data;
++
++      switch (cmd) {
++      case FE_SET_VOLTAGE:
++              return ttusb_set_voltage(ttusb, (fe_sec_voltage_t) arg);
++#ifdef TTUSB_TONE
++      case FE_SET_TONE:
++              return ttusb_set_tone(ttusb, (fe_sec_tone_mode_t) arg);
++#endif
++#ifdef TTUSB_DISEQC
++      case FE_DISEQC_SEND_MASTER_CMD:
++              return ttusb_send_diseqc(ttusb,
++                                       (struct dvb_diseqc_master_cmd *)
++                                       arg);
++#endif
++      default:
++              return -EOPNOTSUPP;
++      };
++}
++
++#if 0
++static void ttusb_set_led_freq(struct ttusb *ttusb, u8 freq)
++{
++      u8 b[] = { 0xaa, ++ttusb->c, 0x19, 1, freq };
++      int err, actual_len;
++
++      err = ttusb_cmd(ttusb, b, sizeof(b), 0);
++      if (err) {
++              dprintk("%s: usb_bulk_msg() failed, return value %i!\n",
++                      __FUNCTION__, err);
++      }
++}
++#endif
++
++/*****************************************************************************/
++
++#ifdef TTUSB_HWSECTIONS
++static void ttusb_handle_ts_data(struct ttusb_channel *channel,
++                               const u8 * data, int len);
++static void ttusb_handle_sec_data(struct ttusb_channel *channel,
++                                const u8 * data, int len);
++#endif
++
++int numpkt = 0, lastj, numts, numstuff, numsec, numinvalid;
++
++static void ttusb_process_muxpack(struct ttusb *ttusb, const u8 * muxpack,
++                         int len)
++{
++      u16 csum = 0, cc;
++      int i;
++      for (i = 0; i < len; i += 2)
++              csum ^= le16_to_cpup((u16 *) (muxpack + i));
++      if (csum) {
++              printk("%s: muxpack with incorrect checksum, ignoring\n",
++                     __FUNCTION__);
++              numinvalid++;
++              return;
++      }
++
++      cc = (muxpack[len - 4] << 8) | muxpack[len - 3];
++      cc &= 0x7FFF;
++      if (cc != ttusb->cc)
++              printk("%s: cc discontinuity (%d frames missing)\n",
++                     __FUNCTION__, (cc - ttusb->cc) & 0x7FFF);
++      ttusb->cc = (cc + 1) & 0x7FFF;
++      if (muxpack[0] & 0x80) {
++#ifdef TTUSB_HWSECTIONS
++              /* section data */
++              int pusi = muxpack[0] & 0x40;
++              int channel = muxpack[0] & 0x1F;
++              int payload = muxpack[1];
++              const u8 *data = muxpack + 2;
++              /* check offset flag */
++              if (muxpack[0] & 0x20)
++                      data++;
++
++              ttusb_handle_sec_data(ttusb->channel + channel, data,
++                                    payload);
++              data += payload;
++
++              if ((!!(ttusb->muxpack[0] & 0x20)) ^
++                  !!(ttusb->muxpack[1] & 1))
++                      data++;
++#warning TODO: pusi
++              printk("cc: %04x\n", (data[0] << 8) | data[1]);
++#endif
++              numsec++;
++      } else if (muxpack[0] == 0x47) {
++#ifdef TTUSB_HWSECTIONS
++              /* we have TS data here! */
++              int pid = ((muxpack[1] & 0x0F) << 8) | muxpack[2];
++              int channel;
++              for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel)
++                      if (ttusb->channel[channel].active
++                          && (pid == ttusb->channel[channel].pid))
++                              ttusb_handle_ts_data(ttusb->channel +
++                                                   channel, muxpack,
++                                                   188);
++#endif
++              numts++;
++              dvb_dmx_swfilter_packets(&ttusb->dvb_demux, muxpack, 1);
++      } else if (muxpack[0] != 0) {
++              numinvalid++;
++              printk("illegal muxpack type %02x\n", muxpack[0]);
++      } else
++              numstuff++;
++}
++
++static void ttusb_process_frame(struct ttusb *ttusb, u8 * data, int len)
++{
++      int maxwork = 1024;
++      while (len) {
++              if (!(maxwork--)) {
++                      printk("%s: too much work\n", __FUNCTION__);
++                      break;
++              }
++
++              switch (ttusb->mux_state) {
++              case 0:
++              case 1:
++              case 2:
++                      len--;
++                      if (*data++ == 0xAA)
++                              ++ttusb->mux_state;
++                      else {
++                              ttusb->mux_state = 0;
++#if DEBUG > 3
++                              if (ttusb->insync)
++                                      printk("%02x ", data[-1]);
++#else
++                              if (ttusb->insync) {
++                                      printk("%s: lost sync.\n",
++                                             __FUNCTION__);
++                                      ttusb->insync = 0;
++                              }
++#endif
++                      }
++                      break;
++              case 3:
++                      ttusb->insync = 1;
++                      len--;
++                      ttusb->mux_npacks = *data++;
++                      ++ttusb->mux_state;
++                      ttusb->muxpack_ptr = 0;
++                      /* maximum bytes, until we know the length */
++                      ttusb->muxpack_len = 2;
++                      break;
++              case 4:
++                      {
++                              int avail;
++                              avail = len;
++                              if (avail >
++                                  (ttusb->muxpack_len -
++                                   ttusb->muxpack_ptr))
++                                      avail =
++                                          ttusb->muxpack_len -
++                                          ttusb->muxpack_ptr;
++                              memcpy(ttusb->muxpack + ttusb->muxpack_ptr,
++                                     data, avail);
++                              ttusb->muxpack_ptr += avail;
++                              if (ttusb->muxpack_ptr > 264)
++                                      BUG();
++                              data += avail;
++                              len -= avail;
++                              /* determine length */
++                              if (ttusb->muxpack_ptr == 2) {
++                                      if (ttusb->muxpack[0] & 0x80) {
++                                              ttusb->muxpack_len =
++                                                  ttusb->muxpack[1] + 2;
++                                              if (ttusb->
++                                                  muxpack[0] & 0x20)
++                                                      ttusb->
++                                                          muxpack_len++;
++                                              if ((!!
++                                                   (ttusb->
++                                                    muxpack[0] & 0x20)) ^
++                                                  !!(ttusb->
++                                                     muxpack[1] & 1))
++                                                      ttusb->
++                                                          muxpack_len++;
++                                              ttusb->muxpack_len += 4;
++                                      } else if (ttusb->muxpack[0] ==
++                                                 0x47)
++                                              ttusb->muxpack_len =
++                                                  188 + 4;
++                                      else if (ttusb->muxpack[0] == 0x00)
++                                              ttusb->muxpack_len =
++                                                  ttusb->muxpack[1] + 2 +
++                                                  4;
++                                      else {
++                                              dprintk
++                                                  ("%s: invalid state: first byte is %x\n",
++                                                   __FUNCTION__,
++                                                   ttusb->muxpack[0]);
++                                              ttusb->mux_state = 0;
++                                      }
++                              }
++
++                      /**
++                       * if length is valid and we reached the end:
++                       * goto next muxpack
++                       */
++                              if ((ttusb->muxpack_ptr >= 2) &&
++                                  (ttusb->muxpack_ptr ==
++                                   ttusb->muxpack_len)) {
++                                      ttusb_process_muxpack(ttusb,
++                                                            ttusb->
++                                                            muxpack,
++                                                            ttusb->
++                                                            muxpack_ptr);
++                                      ttusb->muxpack_ptr = 0;
++                                      /* maximum bytes, until we know the length */
++                                      ttusb->muxpack_len = 2;
++
++                              /**
++                               * no muxpacks left?
++                               * return to search-sync state
++                               */
++                                      if (!ttusb->mux_npacks--) {
++                                              ttusb->mux_state = 0;
++                                              break;
++                                      }
++                              }
++                              break;
++                      }
++              default:
++                      BUG();
++                      break;
++              }
++      }
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void ttusb_iso_irq(struct urb *urb)
++#else
++static void ttusb_iso_irq(struct urb *urb, struct pt_regs *ptregs)
++#endif
++{
++      struct ttusb *ttusb = urb->context;
++
++      if (!ttusb->iso_streaming)
++              return;
++
++#if 0
++      printk("%s: status %d, errcount == %d, length == %i\n",
++             __FUNCTION__,
++             urb->status, urb->error_count, urb->actual_length);
++#endif
++
++      if (!urb->status) {
++              int i;
++              for (i = 0; i < urb->number_of_packets; ++i) {
++                      struct usb_iso_packet_descriptor *d;
++                      u8 *data;
++                      int len;
++                      numpkt++;
++                      if ((jiffies - lastj) >= HZ) {
++#if DEBUG > 2
++                              printk
++                                  ("frames/s: %d (ts: %d, stuff %d, sec: %d, invalid: %d, all: %d)\n",
++                                   numpkt * HZ / (jiffies - lastj),
++                                   numts, numstuff, numsec, numinvalid,
++                                   numts + numstuff + numsec +
++                                   numinvalid);
++#endif
++                              numts = numstuff = numsec = numinvalid = 0;
++                              lastj = jiffies;
++                              numpkt = 0;
++                      }
++                      d = &urb->iso_frame_desc[i];
++                      data = urb->transfer_buffer + d->offset;
++                      len = d->actual_length;
++                      d->actual_length = 0;
++                      d->status = 0;
++                      ttusb_process_frame(ttusb, data, len);
++              }
++      }
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++      usb_submit_urb(urb, GFP_KERNEL);
++#endif
++}
++
++static void ttusb_free_iso_urbs(struct ttusb *ttusb)
++{
++      int i;
++
++      for (i = 0; i < ISO_BUF_COUNT; i++)
++              if (ttusb->iso_urb[i])
++                      usb_free_urb(ttusb->iso_urb[i]);
++
++      pci_free_consistent(NULL,
++                          ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF *
++                          ISO_BUF_COUNT, ttusb->iso_buffer,
++                          ttusb->iso_dma_handle);
++}
++
++static int ttusb_alloc_iso_urbs(struct ttusb *ttusb)
++{
++      int i;
++
++      ttusb->iso_buffer = pci_alloc_consistent(NULL,
++                                               ISO_FRAME_SIZE *
++                                               FRAMES_PER_ISO_BUF *
++                                               ISO_BUF_COUNT,
++                                               &ttusb->iso_dma_handle);
++
++      memset(ttusb->iso_buffer, 0,
++             ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT);
++
++      for (i = 0; i < ISO_BUF_COUNT; i++) {
++              struct urb *urb;
++
++              if (!
++                  (urb =
++                   usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_KERNEL))) {
++                      ttusb_free_iso_urbs(ttusb);
++                      return -ENOMEM;
++              }
++
++              ttusb->iso_urb[i] = urb;
++      }
++
++      return 0;
++}
++
++static void ttusb_stop_iso_xfer(struct ttusb *ttusb)
++{
++      int i;
++
++      for (i = 0; i < ISO_BUF_COUNT; i++)
++              usb_unlink_urb(ttusb->iso_urb[i]);
++
++      ttusb->iso_streaming = 0;
++}
++
++static int ttusb_start_iso_xfer(struct ttusb *ttusb)
++{
++      int i, j, err, buffer_offset = 0;
++
++      if (ttusb->iso_streaming) {
++              printk("%s: iso xfer already running!\n", __FUNCTION__);
++              return 0;
++      }
++
++      ttusb->insync = 0;
++      ttusb->mux_state = 0;
++
++      for (i = 0; i < ISO_BUF_COUNT; i++) {
++              int frame_offset = 0;
++              struct urb *urb = ttusb->iso_urb[i];
++
++              urb->dev = ttusb->dev;
++              urb->context = ttusb;
++              urb->complete = ttusb_iso_irq;
++              urb->pipe = ttusb->isoc_in_pipe;
++              urb->transfer_flags = URB_ISO_ASAP;
++              urb->number_of_packets = FRAMES_PER_ISO_BUF;
++              urb->transfer_buffer_length =
++                  ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
++              urb->transfer_buffer = ttusb->iso_buffer + buffer_offset;
++              buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
++
++              for (j = 0; j < FRAMES_PER_ISO_BUF; j++) {
++                      urb->iso_frame_desc[j].offset = frame_offset;
++                      urb->iso_frame_desc[j].length = ISO_FRAME_SIZE;
++                      frame_offset += ISO_FRAME_SIZE;
++              }
++      }
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++      for (i = 0; i < ISO_BUF_COUNT; i++) {
++              int next = (i + 1) % ISO_BUF_COUNT;
++              ttusb->iso_urb[i]->next = ttusb->iso_urb[next];
++      }
++#endif
++
++      for (i = 0; i < ISO_BUF_COUNT; i++) {
++              if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_KERNEL))) {
++                      ttusb_stop_iso_xfer(ttusb);
++                      printk
++                          ("%s: failed urb submission (%i: err = %i)!\n",
++                           __FUNCTION__, i, err);
++                      return err;
++              }
++      }
++
++      ttusb->iso_streaming = 1;
++
++      return 0;
++}
++
++#ifdef TTUSB_HWSECTIONS
++static void ttusb_handle_ts_data(struct ttusb_channel *channel, const u8 * data,
++                        int len)
++{
++      struct dvb_demux_feed *dvbdmxfeed = channel->dvbdmxfeed;
++
++      dvbdmxfeed->cb.ts(data, len, 0, 0, &dvbdmxfeed->feed.ts, 0);
++}
++
++static void ttusb_handle_sec_data(struct ttusb_channel *channel, const u8 * data,
++                         int len)
++{
++//      struct dvb_demux_feed *dvbdmxfeed = channel->dvbdmxfeed;
++#error TODO: handle ugly stuff
++//      dvbdmxfeed->cb.sec(data, len, 0, 0, &dvbdmxfeed->feed.sec, 0);
++}
++#endif
++
++static struct ttusb_channel *ttusb_channel_allocate(struct ttusb *ttusb)
++{
++      int i;
++
++      if (down_interruptible(&ttusb->sem))
++              return NULL;
++
++      /* lock! */
++      for (i = 0; i < TTUSB_MAXCHANNEL; ++i) {
++              if (!ttusb->channel[i].active) {
++                      ttusb->channel[i].active = 1;
++                      up(&ttusb->sem);
++                      return ttusb->channel + i;
++              }
++      }
++
++      up(&ttusb->sem);
++
++      return NULL;
++}
++
++static int ttusb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++      struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
++      struct ttusb_channel *channel;
++
++      printk("ttusb_start_feed\n");
++
++      switch (dvbdmxfeed->type) {
++      case DMX_TYPE_TS:
++              break;
++      case DMX_TYPE_SEC:
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      if (dvbdmxfeed->type == DMX_TYPE_TS) {
++              switch (dvbdmxfeed->pes_type) {
++              case DMX_TS_PES_VIDEO:
++              case DMX_TS_PES_AUDIO:
++              case DMX_TS_PES_TELETEXT:
++              case DMX_TS_PES_PCR:
++              case DMX_TS_PES_OTHER:
++                      channel = ttusb_channel_allocate(ttusb);
++                      break;
++              default:
++                      return -EINVAL;
++              }
++      } else {
++              channel = ttusb_channel_allocate(ttusb);
++      }
++
++      if (!channel)
++              return -EBUSY;
++
++      dvbdmxfeed->priv = channel;
++      channel->dvbdmxfeed = dvbdmxfeed;
++
++      channel->pid = dvbdmxfeed->pid;
++
++#ifdef TTUSB_HWSECTIONS
++      if (dvbdmxfeed->type == DMX_TYPE_TS) {
++              channel->type = 1;
++      } else if (dvbdmxfeed->type == DMX_TYPE_SEC) {
++              channel->type = 2;
++#error TODO: allocate filters
++      }
++#else
++      channel->type = 1;
++#endif
++
++      ttusb_set_channel(ttusb, channel->id, channel->type, channel->pid);
++
++      if (0 == ttusb->running_feed_count++)
++              ttusb_start_iso_xfer(ttusb);
++
++      return 0;
++}
++
++static int ttusb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++      struct ttusb_channel *channel =
++          (struct ttusb_channel *) dvbdmxfeed->priv;
++      struct ttusb *ttusb = (struct ttusb *) dvbdmxfeed->demux;
++
++      ttusb_del_channel(channel->ttusb, channel->id);
++
++      if (--ttusb->running_feed_count == 0)
++              ttusb_stop_iso_xfer(ttusb);
++
++      channel->active = 0;
++
++      return 0;
++}
++
++static int ttusb_setup_interfaces(struct ttusb *ttusb)
++{
++      usb_set_configuration(ttusb->dev, 1);
++      usb_set_interface(ttusb->dev, 1, 1);
++
++      ttusb->bulk_out_pipe = usb_sndbulkpipe(ttusb->dev, 1);
++      ttusb->bulk_in_pipe = usb_rcvbulkpipe(ttusb->dev, 1);
++      ttusb->isoc_in_pipe = usb_rcvisocpipe(ttusb->dev, 2);
++
++      return 0;
++}
++
++#if 0
++static u8 stc_firmware[8192];
++
++static int stc_open(struct inode *inode, struct file *file)
++{
++      struct ttusb *ttusb = file->private_data;
++      int addr;
++
++      for (addr = 0; addr < 8192; addr += 16) {
++              u8 snd_buf[2] = { addr >> 8, addr & 0xFF };
++              ttusb_i2c_msg(ttusb, 0x50, snd_buf, 2, stc_firmware + addr,
++                            16);
++      }
++
++      return 0;
++}
++
++static ssize_t stc_read(struct file *file, char *buf, size_t count,
++               loff_t * offset)
++{
++      int tc = count;
++
++      if ((tc + *offset) > 8192)
++              tc = 8192 - *offset;
++
++      if (tc < 0)
++              return 0;
++
++      copy_to_user(buf, stc_firmware + *offset, tc);
++
++      *offset += tc;
++
++      return tc;
++}
++
++static int stc_release(struct inode *inode, struct file *file)
++{
++      return 0;
++}
++
++static struct file_operations stc_fops = {
++      .owner = THIS_MODULE,
++      .read = stc_read,
++      .open = stc_open,
++      .release = stc_release,
++};
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void *ttusb_probe(struct usb_device *udev, unsigned int ifnum,
++                const struct usb_device_id *id)
++{
++      struct ttusb *ttusb;
++      int result, channel;
++
++      if (ifnum != 0)
++              return NULL;
++
++      dprintk("%s: TTUSB DVB connected\n", __FUNCTION__);
++
++      if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
++              return NULL;
++
++#else
++static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
++{
++      struct usb_device *udev;
++      struct ttusb *ttusb;
++      int result, channel;
++
++      dprintk("%s: TTUSB DVB connected\n", __FUNCTION__);
++
++      udev = interface_to_usbdev(intf);
++
++      if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
++              return -ENOMEM;
++
++#endif
++
++      memset(ttusb, 0, sizeof(struct ttusb));
++
++      for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel) {
++              ttusb->channel[channel].id = channel;
++              ttusb->channel[channel].ttusb = ttusb;
++      }
++
++      ttusb->dev = udev;
++      ttusb->c = 0;
++      ttusb->mux_state = 0;
++      sema_init(&ttusb->sem, 0);
++      sema_init(&ttusb->semusb, 1);
++
++      ttusb_setup_interfaces(ttusb);
++
++      ttusb_alloc_iso_urbs(ttusb);
++      if (ttusb_init_controller(ttusb))
++              printk("ttusb_init_controller: error\n");
++
++      up(&ttusb->sem);
++
++      dvb_register_adapter(&ttusb->adapter,
++                           "Technotrend/Hauppauge Nova-USB");
++
++      dvb_register_i2c_bus(ttusb_i2c_xfer, ttusb, ttusb->adapter, 0);
++      dvb_add_frontend_ioctls(ttusb->adapter, ttusb_lnb_ioctl, NULL,
++                              ttusb);
++
++      memset(&ttusb->dvb_demux, 0, sizeof(ttusb->dvb_demux));
++
++      ttusb->dvb_demux.dmx.capabilities =
++          DMX_TS_FILTERING | DMX_SECTION_FILTERING;
++      ttusb->dvb_demux.priv = 0;
++#ifdef TTUSB_HWSECTIONS
++      ttusb->dvb_demux.filternum = TTUSB_MAXFILTER;
++#else
++      ttusb->dvb_demux.filternum = 32;
++#endif
++      ttusb->dvb_demux.feednum = TTUSB_MAXCHANNEL;
++      ttusb->dvb_demux.start_feed = ttusb_start_feed;
++      ttusb->dvb_demux.stop_feed = ttusb_stop_feed;
++      ttusb->dvb_demux.write_to_decoder = 0;
++
++      if ((result = dvb_dmx_init(&ttusb->dvb_demux)) < 0) {
++              printk("ttusb_dvb: dvb_dmx_init failed (errno = %d)\n",
++                     result);
++              goto err;
++      }
++//FIXME dmxdev (nur WAS?)
++      ttusb->dmxdev.filternum = ttusb->dvb_demux.filternum;
++      ttusb->dmxdev.demux = &ttusb->dvb_demux.dmx;
++      ttusb->dmxdev.capabilities = 0;
++
++      if ((result = dvb_dmxdev_init(&ttusb->dmxdev, ttusb->adapter)) < 0) {
++              printk("ttusb_dvb: dvb_dmxdev_init failed (errno = %d)\n",
++                     result);
++              dvb_dmx_release(&ttusb->dvb_demux);
++              goto err;
++      }
++
++      if (dvb_net_init
++          (ttusb->adapter, &ttusb->dvbnet, &ttusb->dvb_demux.dmx)) {
++              printk("ttusb_dvb: dvb_net_init failed!\n");
++      }
++
++      err:
++#if 0
++      ttusb->stc_devfs_handle =
++          devfs_register(ttusb->adapter->devfs_handle, TTUSB_BUDGET_NAME,
++                         DEVFS_FL_DEFAULT, 0, 192,
++                         S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
++                         | S_IROTH | S_IWOTH, &stc_fops, ttusb);
++#endif
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++      return (void *) ttusb;
++#else
++      usb_set_intfdata(intf, (void *) ttusb);
++
++      return 0;
++#endif
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void ttusb_disconnect(struct usb_device *udev, void *data)
++{
++      struct ttusb *ttusb = data;
++#else
++static void ttusb_disconnect(struct usb_interface *intf)
++{
++      struct ttusb *ttusb = usb_get_intfdata(intf);
++
++      usb_set_intfdata(intf, NULL);
++#endif
++
++      ttusb->disconnecting = 1;
++
++      ttusb_stop_iso_xfer(ttusb);
++
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69))
++#undef devfs_remove
++#define devfs_remove(x)       devfs_unregister(ttusb->stc_devfs_handle);
++#endif
++#if 0
++      devfs_remove(TTUSB_BUDGET_NAME);
++#endif
++      ttusb->dvb_demux.dmx.close(&ttusb->dvb_demux.dmx);
++      dvb_net_release(&ttusb->dvbnet);
++      dvb_dmxdev_release(&ttusb->dmxdev);
++      dvb_dmx_release(&ttusb->dvb_demux);
++
++      dvb_unregister_i2c_bus(ttusb_i2c_xfer, ttusb->adapter, 0);
++      dvb_unregister_adapter(ttusb->adapter);
++
++      ttusb_free_iso_urbs(ttusb);
++
++      kfree(ttusb);
++
++      dprintk("%s: TTUSB DVB disconnected\n", __FUNCTION__);
++}
++
++static struct usb_device_id ttusb_table[] = {
++      {USB_DEVICE(0xb48, 0x1003)},
++      {USB_DEVICE(0xb48, 0x1004)},    /* to be confirmed ????  */
++      {USB_DEVICE(0xb48, 0x1005)},    /* to be confirmed ????  */
++      {}
++};
++
++MODULE_DEVICE_TABLE(usb, ttusb_table);
++
++static struct usb_driver ttusb_driver = {
++      .name           = "Technotrend/Hauppauge USB-Nova",
++      .probe          = ttusb_probe,
++      .disconnect     = ttusb_disconnect,
++      .id_table       = ttusb_table,
++};
++
++static int __init ttusb_init(void)
++{
++      int err;
++
++      if ((err = usb_register(&ttusb_driver)) < 0) {
++              printk("%s: usb_register failed! Error number %d",
++                     __FILE__, err);
++              return -1;
++      }
++
++      return 0;
++}
++
++static void __exit ttusb_exit(void)
++{
++      usb_deregister(&ttusb_driver);
++}
++
++module_init(ttusb_init);
++module_exit(ttusb_exit);
++
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "Debug or not");
++
++MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>");
++MODULE_DESCRIPTION("TTUSB DVB Driver");
++MODULE_LICENSE("GPL");
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h  2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,1644 @@
++
++#include <asm/types.h>
++
++u8 dsp_bootcode [] __initdata = {
++      0x08, 0xaa, 0x00, 0x18, 0x00, 0x03, 0x08, 0x00, 
++      0x00, 0x10, 0x00, 0x00, 0x01, 0x80, 0x18, 0x5f, 
++      0x00, 0x00, 0x01, 0x80, 0x77, 0x18, 0x2a, 0xeb, 
++      0x6b, 0xf8, 0x00, 0x18, 0x03, 0xff, 0x68, 0xf8, 
++      0x00, 0x18, 0xff, 0xfe, 0xf7, 0xb8, 0xf7, 0xbe, 
++      0xf6, 0xb9, 0xf4, 0xa0, 0xf6, 0xb7, 0xf6, 0xb5, 
++      0xf6, 0xb6, 0xf0, 0x20, 0x19, 0xdf, 0xf1, 0x00, 
++      0x00, 0x01, 0xf8, 0x4d, 0x01, 0xab, 0xf6, 0xb8, 
++      0xf0, 0x20, 0x19, 0xdf, 0xf0, 0x73, 0x01, 0xa5, 
++      0x7e, 0xf8, 0x00, 0x12, 0xf0, 0x00, 0x00, 0x01, 
++      0x47, 0xf8, 0x00, 0x11, 0x7e, 0x92, 0x00, 0xf8, 
++      0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x7e, 0xf8, 
++      0x00, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x6c, 0x89, 
++      0x01, 0x9a, 0xf7, 0xb8, 0xee, 0xfc, 0xf0, 0x20, 
++      0xff, 0xff, 0xf1, 0x00, 0x00, 0x01, 0xf8, 0x4d, 
++      0x01, 0xbf, 0xf2, 0x73, 0x01, 0xb9, 0x4e, 0x02, 
++      0xf4, 0x95, 0xf5, 0xe3, 0x56, 0x02, 0x7e, 0x00, 
++      0x11, 0x00, 0xfa, 0x4c, 0x01, 0xb7, 0x6b, 0x03, 
++      0x00, 0x01, 0xf6, 0xb8, 0xee, 0x04, 0xf0, 0x74, 
++      0x0d, 0xa7, 0xf0, 0x74, 0x01, 0xc5, 0x4a, 0x11, 
++      0x4a, 0x16, 0x72, 0x11, 0x2a, 0xe6, 0x10, 0xf8, 
++      0x00, 0x11, 0xfa, 0x45, 0x01, 0xdb, 0xf4, 0x95, 
++      0xee, 0xff, 0x48, 0x11, 0xf0, 0x00, 0x2a, 0xc6, 
++      0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0xee, 
++      0xff, 0xff, 0xf4, 0xe3, 0x6c, 0xe9, 0xff, 0xff, 
++      0x01, 0xd5, 0x10, 0xf8, 0x2a, 0xe7, 0xf8, 0x45, 
++      0x01, 0xe2, 0x10, 0xf8, 0x2a, 0xe7, 0xf4, 0xe3, 
++      0xf0, 0x74, 0x01, 0xff, 0xee, 0x01, 0x8a, 0x16, 
++      0x8a, 0x11, 0xfc, 0x00, 0xf7, 0xb8, 0xe9, 0x20, 
++      0x4a, 0x11, 0x09, 0xf8, 0x2a, 0xe6, 0xf8, 0x4e, 
++      0x01, 0xf3, 0xf2, 0x73, 0x01, 0xfd, 0xf4, 0x95, 
++      0xe8, 0x01, 0x72, 0x11, 0x2a, 0xe6, 0x49, 0x11, 
++      0x80, 0xe1, 0x2a, 0xc6, 0xf3, 0x00, 0x00, 0x01, 
++      0xe8, 0x00, 0x81, 0xf8, 0x2a, 0xe6, 0x8a, 0x11, 
++      0xfc, 0x00, 0xf4, 0x95, 0xf0, 0x73, 0x02, 0x00, 
++      0x10, 0xf8, 0x2a, 0x0f, 0xfc, 0x00, 0x4a, 0x11, 
++      0xf0, 0x74, 0x02, 0x02, 0x80, 0xf8, 0x2a, 0x10, 
++      0x73, 0x08, 0x00, 0x09, 0x40, 0xf8, 0x2a, 0x15, 
++      0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++      0x03, 0xe8, 0xf5, 0xa9, 0xf8, 0x30, 0x02, 0x21, 
++      0x71, 0xf8, 0x2a, 0x10, 0x2a, 0x15, 0x56, 0xf8, 
++      0x2a, 0x0c, 0xf0, 0xe3, 0x4e, 0xf8, 0x2a, 0x16, 
++      0xe8, 0x00, 0x4e, 0xf8, 0x2a, 0x0c, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 
++      0x68, 0xf8, 0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 
++      0x00, 0x07, 0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 
++      0xff, 0xfc, 0x6b, 0xf8, 0x2a, 0x0f, 0x00, 0x01, 
++      0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x06, 0xf4, 0xeb, 
++      0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x0f, 0x00, 0x00, 
++      0x76, 0x00, 0x00, 0x00, 0xfb, 0x80, 0x19, 0x4c, 
++      0xf4, 0x95, 0xe8, 0x00, 0x80, 0xf8, 0x2a, 0x11, 
++      0xf9, 0x80, 0x19, 0x07, 0x80, 0xf8, 0x2a, 0x0e, 
++      0xf9, 0x80, 0x16, 0x66, 0x76, 0x00, 0x2a, 0x12, 
++      0x10, 0xf8, 0x2a, 0x11, 0xf9, 0x80, 0x18, 0xe3, 
++      0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x66, 
++      0x10, 0xf8, 0x2a, 0x0e, 0xf9, 0x80, 0x16, 0x87, 
++      0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf6, 0xb8, 
++      0xf4, 0x95, 0xf0, 0x20, 0x80, 0x00, 0x11, 0xf8, 
++      0x2a, 0x5a, 0xf8, 0x4d, 0x02, 0x93, 0x11, 0xf8, 
++      0x2a, 0x9f, 0xf8, 0x4c, 0x02, 0x7c, 0x77, 0x12, 
++      0x2a, 0x39, 0x49, 0x12, 0x01, 0xf8, 0x2a, 0x9f, 
++      0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81, 
++      0x00, 0x11, 0x6c, 0xe1, 0xff, 0xab, 0x02, 0x93, 
++      0x6b, 0xf8, 0x2a, 0x9f, 0x00, 0x01, 0xe9, 0x05, 
++      0x01, 0xe2, 0x00, 0x03, 0x81, 0xf8, 0x2a, 0xa0, 
++      0xf0, 0x73, 0x02, 0x95, 0x72, 0x11, 0x2a, 0x9f, 
++      0xf4, 0x95, 0x10, 0xe1, 0x2a, 0x39, 0x6b, 0xf8, 
++      0x2a, 0x9f, 0x00, 0x01, 0x11, 0xf8, 0x2a, 0x9f, 
++      0x09, 0xf8, 0x2a, 0xa0, 0xf8, 0x4c, 0x02, 0x93, 
++      0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 0x76, 0xf8, 
++      0x2a, 0x9f, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa0, 
++      0x00, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x48, 0x11, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++      0x10, 0xf8, 0x2a, 0x5a, 0xf8, 0x44, 0x02, 0xb2, 
++      0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x01, 0xf0, 0x74, 
++      0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++      0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 0x02, 0xb2, 
++      0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 0x80, 0x00, 
++      0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0xd6, 
++      0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95, 
++      0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b, 
++      0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11, 
++      0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15, 
++      0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19, 
++      0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a, 
++      0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8, 
++      0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++      0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++      0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe, 
++      0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xfd, 
++      0xf0, 0x74, 0x02, 0x58, 0x88, 0x11, 0xf4, 0x95, 
++      0x77, 0x10, 0x80, 0x00, 0xf4, 0xa9, 0xf8, 0x30, 
++      0x02, 0xef, 0x48, 0x11, 0xf0, 0x30, 0x00, 0xff, 
++      0x80, 0x00, 0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 
++      0x18, 0xd6, 0xee, 0x03, 0x8a, 0x18, 0xf4, 0x95, 
++      0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 0x8a, 0x1a, 
++      0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 0x8a, 0x19, 
++      0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x15, 
++      0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 0x8a, 0x11, 
++      0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 
++      0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 0xf4, 0xeb, 
++      0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 
++      0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 
++      0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 
++      0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 
++      0x00, 0x03, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 
++      0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95, 
++      0xf4, 0x95, 0x10, 0x81, 0x6f, 0xf8, 0x2a, 0x9e, 
++      0x0c, 0x88, 0xe8, 0xff, 0x18, 0xe1, 0x00, 0x01, 
++      0x1a, 0xf8, 0x2a, 0x9e, 0xf0, 0x30, 0x1f, 0xff, 
++      0x80, 0xf8, 0x2a, 0x9e, 0x8a, 0x11, 0xfc, 0x00, 
++      0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 
++      0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 0x11, 0xe2, 
++      0x00, 0x01, 0x81, 0xe1, 0x00, 0x01, 0x11, 0xe2, 
++      0x00, 0x02, 0x81, 0xe1, 0x00, 0x02, 0x76, 0xe1, 
++      0x00, 0x03, 0x00, 0x02, 0x48, 0x08, 0x6f, 0xe1, 
++      0x00, 0x04, 0x0c, 0x98, 0xf0, 0x30, 0x00, 0xff, 
++      0x80, 0xe1, 0x00, 0x05, 0x76, 0xe1, 0x00, 0x06, 
++      0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 0x2a, 0x39, 
++      0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 0x2a, 0x18, 
++      0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 0x00, 0x01, 
++      0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 0x00, 0x02, 
++      0x76, 0xe1, 0x00, 0x03, 0x00, 0x04, 0x48, 0x11, 
++      0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 0xf4, 0x95, 
++      0x77, 0x13, 0x2a, 0x76, 0xe9, 0x00, 0xe5, 0x98, 
++      0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 0x48, 0x0b, 
++      0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x03, 0x71, 
++      0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xf0, 
++      0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0x81, 
++      0x00, 0x14, 0x71, 0xe1, 0x00, 0x01, 0x00, 0x15, 
++      0x49, 0x11, 0xf3, 0x00, 0x00, 0x02, 0x89, 0x11, 
++      0xe7, 0x82, 0x6d, 0xea, 0x00, 0x04, 0xe7, 0x83, 
++      0x6d, 0xeb, 0x00, 0x0a, 0x77, 0x1a, 0x00, 0x05, 
++      0xf0, 0x72, 0x03, 0xaa, 0x11, 0x81, 0xf2, 0xe8, 
++      0x80, 0x82, 0xe9, 0xff, 0x19, 0xe1, 0x00, 0x01, 
++      0xf1, 0xa0, 0x81, 0x92, 0x11, 0xe1, 0x00, 0x0c, 
++      0xf2, 0xe8, 0x80, 0x83, 0xe9, 0xff, 0x19, 0xe1, 
++      0x00, 0x0d, 0xf1, 0xa0, 0x81, 0x93, 0x6d, 0xe9, 
++      0x00, 0x02, 0x48, 0x18, 0x49, 0x18, 0x70, 0x00, 
++      0x00, 0x15, 0xf0, 0x00, 0x00, 0x04, 0xf3, 0x00, 
++      0x00, 0x0a, 0x80, 0x01, 0x81, 0x02, 0xf2, 0x74, 
++      0x0e, 0x54, 0xf4, 0x95, 0x48, 0x14, 0xee, 0x10, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf0, 0x74, 
++      0x0c, 0x5e, 0x80, 0xf8, 0x2a, 0x5c, 0x77, 0x12, 
++      0x2a, 0x39, 0x76, 0x82, 0x00, 0x55, 0x77, 0x11, 
++      0x2a, 0x18, 0x10, 0xe1, 0x00, 0x01, 0x80, 0xe2, 
++      0x00, 0x01, 0x10, 0xe1, 0x00, 0x02, 0x80, 0xe2, 
++      0x00, 0x02, 0x76, 0xe2, 0x00, 0x03, 0x00, 0x1c, 
++      0xf6, 0xb8, 0x56, 0xf8, 0x2a, 0x16, 0xf0, 0xf0, 
++      0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x07, 0x56, 0xf8, 
++      0x2a, 0x16, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80, 
++      0x80, 0xe2, 0x00, 0x06, 0x56, 0xf8, 0x2a, 0x16, 
++      0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 
++      0x00, 0x05, 0x57, 0xf8, 0x2a, 0x16, 0xe8, 0xff, 
++      0xf2, 0x80, 0x80, 0xe2, 0x00, 0x04, 0x56, 0xf8, 
++      0x27, 0x6c, 0xf0, 0xf0, 0xf0, 0xf8, 0x80, 0xe2, 
++      0x00, 0x0b, 0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf0, 
++      0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0a, 
++      0x56, 0xf8, 0x27, 0x6c, 0xf1, 0xf8, 0xe8, 0xff, 
++      0xf2, 0x80, 0x80, 0xe2, 0x00, 0x09, 0xe8, 0xff, 
++      0x57, 0xf8, 0x27, 0x6c, 0xf2, 0x80, 0x80, 0xe2, 
++      0x00, 0x08, 0x56, 0xf8, 0x27, 0x6a, 0xf0, 0xf0, 
++      0xf0, 0xf8, 0x80, 0xe2, 0x00, 0x0f, 0x56, 0xf8, 
++      0x27, 0x6a, 0xf1, 0xf0, 0xe8, 0xff, 0xf2, 0x80, 
++      0x80, 0xe2, 0x00, 0x0e, 0x56, 0xf8, 0x27, 0x6a, 
++      0xf1, 0xf8, 0xe8, 0xff, 0xf2, 0x80, 0x80, 0xe2, 
++      0x00, 0x0d, 0x57, 0xf8, 0x27, 0x6a, 0xe8, 0xff, 
++      0xf2, 0x80, 0x80, 0xe2, 0x00, 0x0c, 0x76, 0xe2, 
++      0x00, 0x13, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x12, 
++      0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x5c, 0x0c, 0x58, 
++      0x80, 0xe2, 0x00, 0x11, 0xe8, 0xff, 0x18, 0xf8, 
++      0x2a, 0x5c, 0x80, 0xe2, 0x00, 0x10, 0x76, 0xe2, 
++      0x00, 0x17, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x16, 
++      0x00, 0x00, 0x6f, 0xf8, 0x2a, 0x9e, 0x0c, 0x58, 
++      0x80, 0xe2, 0x00, 0x15, 0xe8, 0xff, 0x18, 0xf8, 
++      0x2a, 0x9e, 0x80, 0xe2, 0x00, 0x14, 0x76, 0xe2, 
++      0x00, 0x1b, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1a, 
++      0x00, 0x00, 0x76, 0xe2, 0x00, 0x19, 0x00, 0x00, 
++      0x70, 0xe2, 0x00, 0x18, 0x27, 0x6e, 0x76, 0xe2, 
++      0x00, 0x1f, 0x00, 0x00, 0x76, 0xe2, 0x00, 0x1e, 
++      0x00, 0x00, 0x76, 0xe2, 0x00, 0x1d, 0x00, 0x00, 
++      0x76, 0xe2, 0x00, 0x1c, 0x00, 0x00, 0x76, 0xe2, 
++      0x00, 0x20, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++      0x10, 0xf8, 0x2a, 0x38, 0xf8, 0x45, 0x04, 0xed, 
++      0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x02, 
++      0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x08, 
++      0x6d, 0xe9, 0xff, 0xdf, 0xf6, 0xa9, 0xf8, 0x20, 
++      0x04, 0x75, 0xf0, 0x73, 0x04, 0x7d, 0xf0, 0x10, 
++      0x00, 0x21, 0xf0, 0x00, 0x1a, 0x83, 0x48, 0x08, 
++      0x7e, 0xf8, 0x00, 0x08, 0xf4, 0xe2, 0xf0, 0x74, 
++      0x03, 0x0a, 0xf0, 0x73, 0x04, 0xea, 0x48, 0x12, 
++      0xf2, 0x74, 0x03, 0x23, 0xf0, 0x00, 0x00, 0x04, 
++      0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 
++      0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 
++      0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48, 
++      0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x69, 
++      0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36, 
++      0xf0, 0x73, 0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 
++      0xe8, 0xff, 0x6f, 0xe1, 0x00, 0x04, 0x0d, 0x48, 
++      0x18, 0xe1, 0x00, 0x05, 0xf2, 0x74, 0x09, 0x41, 
++      0xf4, 0x95, 0xf2, 0xa0, 0xf0, 0x74, 0x03, 0x36, 
++      0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0x57, 
++      0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 0x2a, 0x1c, 
++      0xf0, 0x74, 0x12, 0xa4, 0xf2, 0x74, 0x03, 0x36, 
++      0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 
++      0x48, 0x12, 0xf2, 0x74, 0x03, 0x80, 0xf0, 0x00, 
++      0x00, 0x04, 0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 
++      0xe8, 0x00, 0xf0, 0x73, 0x04, 0xea, 0x10, 0xf8, 
++      0x2a, 0x1c, 0xf0, 0x74, 0x12, 0xc5, 0xf2, 0x74, 
++      0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 0xf0, 0x73, 
++      0x04, 0xea, 0x77, 0x11, 0x2a, 0x18, 0xe8, 0xff, 
++      0x6f, 0xe1, 0x00, 0x06, 0x0d, 0x48, 0x18, 0xe1, 
++      0x00, 0x07, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0xf2, 0xa0, 0x70, 0x00, 0x00, 0x12, 0x80, 0x01, 
++      0x10, 0xe1, 0x00, 0x04, 0xf0, 0x74, 0x0e, 0x7a, 
++      0xf2, 0x74, 0x03, 0x36, 0xf4, 0x95, 0xe8, 0x00, 
++      0xf0, 0x73, 0x04, 0xea, 0xf0, 0x74, 0x03, 0xbc, 
++      0x76, 0xf8, 0x2a, 0x38, 0x00, 0x00, 0xee, 0x02, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 
++      0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 
++      0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 
++      0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 
++      0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x09, 
++      0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 
++      0xf4, 0x95, 0x77, 0x13, 0x2a, 0x86, 0xe9, 0x00, 
++      0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 
++      0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 
++      0x05, 0x0a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 
++      0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 
++      0x77, 0x13, 0x2a, 0x18, 0x10, 0xe3, 0x00, 0x01, 
++      0x80, 0xe1, 0x00, 0x01, 0x10, 0xe3, 0x00, 0x02, 
++      0x80, 0xe1, 0x00, 0x02, 0x13, 0xe3, 0x00, 0x03, 
++      0x81, 0xe1, 0x00, 0x03, 0x48, 0x11, 0x77, 0x11, 
++      0x00, 0x00, 0xf8, 0x4d, 0x05, 0x44, 0xf0, 0x00, 
++      0x00, 0x04, 0x88, 0x12, 0x48, 0x13, 0xf0, 0x00, 
++      0x00, 0x04, 0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 
++      0xe5, 0x98, 0x6d, 0x91, 0xf6, 0xb8, 0x48, 0x11, 
++      0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 0x05, 0x3a, 
++      0xf0, 0x20, 0x2a, 0x39, 0x49, 0x11, 0xf5, 0x00, 
++      0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x76, 0xe1, 
++      0x00, 0x04, 0x00, 0xaa, 0xf0, 0x74, 0x02, 0x98, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x77, 0x11, 
++      0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 0x77, 0x12, 
++      0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 0x80, 0xe1, 
++      0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 0x80, 0xe1, 
++      0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x0c, 
++      0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x12, 
++      0xf4, 0x95, 0x77, 0x13, 0x2a, 0x7a, 0xe9, 0x00, 
++      0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 0xf6, 0xb8, 
++      0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 0xf8, 0x43, 
++      0x05, 0x6a, 0x76, 0x82, 0x00, 0xaa, 0xf0, 0x74, 
++      0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0x77, 0x11, 0x2a, 0x39, 0x76, 0x81, 0x00, 0x55, 
++      0x77, 0x12, 0x2a, 0x18, 0x10, 0xe2, 0x00, 0x01, 
++      0x80, 0xe1, 0x00, 0x01, 0x10, 0xe2, 0x00, 0x02, 
++      0x80, 0xe1, 0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 
++      0x00, 0x19, 0x48, 0x11, 0xf0, 0x00, 0x00, 0x04, 
++      0x88, 0x12, 0xf4, 0x95, 0x77, 0x13, 0x2a, 0x5d, 
++      0xe9, 0x00, 0xe5, 0x98, 0xf3, 0x00, 0x00, 0x01, 
++      0xf6, 0xb8, 0x48, 0x0b, 0x08, 0xf8, 0x2a, 0x3c, 
++      0xf8, 0x43, 0x05, 0x93, 0x76, 0x82, 0x00, 0xaa, 
++      0xf0, 0x74, 0x02, 0x98, 0x8a, 0x11, 0xfc, 0x00, 
++      0x4a, 0x11, 0x88, 0x11, 0x10, 0xf8, 0x2a, 0x38, 
++      0xf8, 0x44, 0x05, 0xe3, 0x10, 0xf8, 0x2a, 0xa1, 
++      0xf8, 0x44, 0x05, 0xba, 0x6c, 0xe1, 0xff, 0x56, 
++      0x05, 0xe3, 0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 
++      0x70, 0xe2, 0x2a, 0x18, 0x00, 0x11, 0x6b, 0xf8, 
++      0x2a, 0xa1, 0x00, 0x01, 0xf0, 0x73, 0x05, 0xe3, 
++      0x72, 0x12, 0x2a, 0xa1, 0xf4, 0x95, 0x70, 0xe2, 
++      0x2a, 0x18, 0x00, 0x11, 0x10, 0xf8, 0x2a, 0xa1, 
++      0xf0, 0x00, 0x00, 0x01, 0x88, 0x12, 0xf4, 0x95, 
++      0xf4, 0x95, 0x6e, 0xe2, 0xff, 0xfc, 0x05, 0xd1, 
++      0x73, 0x12, 0x2a, 0xa1, 0x48, 0x11, 0xf0, 0x00, 
++      0x00, 0x05, 0x80, 0xf8, 0x2a, 0xa2, 0x10, 0xf8, 
++      0x2a, 0xa1, 0x08, 0xf8, 0x2a, 0xa2, 0xf8, 0x44, 
++      0x05, 0xe3, 0x6c, 0xe1, 0xff, 0xab, 0x05, 0xdd, 
++      0x76, 0xf8, 0x2a, 0x38, 0x00, 0x01, 0x76, 0xf8, 
++      0x2a, 0xa1, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa2, 
++      0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0xf4, 0x95, 
++      0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 0x4a, 0x0b, 
++      0x4a, 0x0c, 0x4a, 0x0d, 0x4a, 0x10, 0x4a, 0x11, 
++      0x4a, 0x12, 0x4a, 0x13, 0x4a, 0x14, 0x4a, 0x15, 
++      0x4a, 0x16, 0x4a, 0x17, 0x4a, 0x17, 0x4a, 0x19, 
++      0x4a, 0x0e, 0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1a, 
++      0x4a, 0x1d, 0x4a, 0x1b, 0x4a, 0x1c, 0x68, 0xf8, 
++      0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++      0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++      0x48, 0x18, 0x68, 0xf8, 0x00, 0x18, 0xff, 0xfe, 
++      0xf4, 0x95, 0xf4, 0x95, 0x4a, 0x08, 0xee, 0xff, 
++      0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x18, 0x04, 
++      0xf0, 0x74, 0x05, 0xa2, 0xee, 0x01, 0x8a, 0x18, 
++      0xf4, 0x95, 0x8a, 0x1c, 0x8a, 0x1b, 0x8a, 0x1d, 
++      0x8a, 0x1a, 0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0e, 
++      0x8a, 0x19, 0x8a, 0x17, 0x8a, 0x17, 0x8a, 0x16, 
++      0x8a, 0x15, 0x8a, 0x14, 0x8a, 0x13, 0x8a, 0x12, 
++      0x8a, 0x11, 0x8a, 0x10, 0x8a, 0x0d, 0x8a, 0x0c, 
++      0x8a, 0x0b, 0x8a, 0x0a, 0x8a, 0x09, 0x8a, 0x08, 
++      0xf4, 0xeb, 0xee, 0xfd, 0x76, 0xf8, 0x2a, 0x38, 
++      0x00, 0x00, 0x76, 0xf8, 0x2a, 0x5a, 0x00, 0x00, 
++      0xe8, 0x01, 0x4e, 0x00, 0xfb, 0x80, 0x17, 0xd6, 
++      0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x2a, 0x5b, 
++      0x76, 0x00, 0x2a, 0x8f, 0xf9, 0x80, 0x16, 0xaa, 
++      0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x5c, 
++      0x10, 0xf8, 0x2a, 0x5b, 0xf9, 0x80, 0x17, 0x6f, 
++      0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1a, 
++      0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1a, 
++      0xfb, 0x80, 0x16, 0x66, 0xf4, 0x95, 0xe8, 0x1b, 
++      0xfb, 0x80, 0x16, 0x87, 0xf4, 0x95, 0xe8, 0x1b, 
++      0xee, 0x03, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 
++      0x13, 0x02, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d, 
++      0x06, 0x6a, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 
++      0xf4, 0x95, 0xf0, 0x72, 0x06, 0x69, 0x1c, 0x91, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 
++      0x12, 0x03, 0x11, 0x02, 0xf8, 0x45, 0x06, 0x79, 
++      0xf0, 0x10, 0x00, 0x01, 0x88, 0x1a, 0xf4, 0x95, 
++      0xf0, 0x72, 0x06, 0x78, 0x81, 0x91, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 
++      0x00, 0x11, 0x11, 0x03, 0x61, 0xf8, 0x00, 0x11, 
++      0x00, 0x01, 0xf8, 0x30, 0x06, 0x91, 0xf6, 0xb8, 
++      0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11, 
++      0xf3, 0xe8, 0xe8, 0xff, 0x18, 0x81, 0xf1, 0xa0, 
++      0x81, 0x81, 0xf0, 0x73, 0x06, 0x9d, 0xf6, 0xb8, 
++      0x6f, 0xf8, 0x00, 0x11, 0x0c, 0x1f, 0x88, 0x11, 
++      0xf3, 0x30, 0x00, 0xff, 0xf0, 0x20, 0xff, 0x00, 
++      0x18, 0x81, 0xf1, 0xa0, 0x81, 0x81, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x11, 0x02, 
++      0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 
++      0x06, 0xb1, 0x49, 0x0b, 0xf6, 0x1f, 0x88, 0x11, 
++      0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf2, 0x73, 
++      0x06, 0xb8, 0xf0, 0x30, 0x00, 0xff, 0x49, 0x0b, 
++      0xf6, 0x1f, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
++      0x12, 0x81, 0xf4, 0x78, 0x8a, 0x11, 0xfc, 0x00, 
++      0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x12, 
++      0x13, 0x03, 0x88, 0x11, 0xe8, 0x00, 0xf8, 0x4d, 
++      0x06, 0xcc, 0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 
++      0xf4, 0x95, 0xf0, 0x72, 0x06, 0xcb, 0x11, 0x92, 
++      0xf2, 0xc0, 0x81, 0x91, 0x8a, 0x11, 0xfc, 0x00, 
++      0x88, 0x12, 0x12, 0x02, 0x71, 0x01, 0x00, 0x13, 
++      0xf8, 0x45, 0x06, 0xdb, 0xf0, 0x10, 0x00, 0x01, 
++      0x88, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x06, 0xda, 
++      0xe5, 0x98, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++      0x88, 0x11, 0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 
++      0x00, 0x12, 0x61, 0xf8, 0x00, 0x12, 0x00, 0x01, 
++      0xf8, 0x20, 0x06, 0xea, 0xf0, 0x00, 0x00, 0x01, 
++      0xf6, 0xb8, 0xf0, 0x00, 0x00, 0x01, 0x6f, 0xf8, 
++      0x00, 0x12, 0x0f, 0x1f, 0x48, 0x08, 0x81, 0x00, 
++      0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xba, 
++      0xf4, 0x95, 0x48, 0x11, 0xee, 0x02, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x88, 0x12, 
++      0x11, 0x04, 0x10, 0x06, 0x71, 0x05, 0x00, 0x13, 
++      0x61, 0xf8, 0x00, 0x13, 0x00, 0x01, 0xf8, 0x20, 
++      0x07, 0x09, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 
++      0x00, 0x01, 0x88, 0x11, 0xf6, 0xb8, 0x6f, 0xf8, 
++      0x00, 0x13, 0x0f, 0x1f, 0x81, 0x00, 0x48, 0x11, 
++      0xf4, 0x7f, 0x80, 0x01, 0xf2, 0x74, 0x06, 0xce, 
++      0xf4, 0x95, 0x48, 0x12, 0x48, 0x11, 0xf0, 0x30, 
++      0xff, 0xfe, 0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 
++      0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xfc, 
++      0xf4, 0x95, 0x80, 0x02, 0x71, 0x08, 0x00, 0x16, 
++      0x10, 0x09, 0x71, 0x0b, 0x00, 0x17, 0x80, 0x03, 
++      0x71, 0x0a, 0x00, 0x11, 0x48, 0x17, 0xf8, 0x45, 
++      0x07, 0x3f, 0x70, 0x00, 0x00, 0x11, 0x10, 0x03, 
++      0xf0, 0x74, 0x06, 0x9f, 0x80, 0x01, 0x70, 0x00, 
++      0x00, 0x16, 0x10, 0x02, 0xf0, 0x74, 0x06, 0x7b, 
++      0x6d, 0x91, 0x6d, 0x96, 0x6c, 0xef, 0xff, 0xff, 
++      0x07, 0x2f, 0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++      0x10, 0xf8, 0x2a, 0xe8, 0x08, 0xf8, 0x2a, 0xe9, 
++      0xf8, 0x45, 0x07, 0x64, 0x76, 0x00, 0x00, 0x01, 
++      0x62, 0xf8, 0x2a, 0xe9, 0x00, 0x5e, 0xf2, 0x74, 
++      0x12, 0x0b, 0xf0, 0x00, 0x30, 0x40, 0x72, 0x11, 
++      0x2a, 0xe9, 0x77, 0x10, 0x00, 0x0f, 0xf5, 0xa9, 
++      0xf8, 0x20, 0x07, 0x61, 0x6b, 0xf8, 0x2a, 0xe9, 
++      0x00, 0x01, 0xf0, 0x73, 0x07, 0x64, 0x76, 0xf8, 
++      0x2a, 0xe9, 0x00, 0x00, 0xee, 0x02, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0x88, 0x11, 0xe8, 0x00, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x08, 0xe8, 0x00, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x09, 0xf6, 0xb8, 
++      0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 0x75, 0xf8, 
++      0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 0x0c, 0x30, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 0x76, 0xf8, 
++      0x2a, 0xe8, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xe9, 
++      0x00, 0x00, 0x6c, 0x81, 0x07, 0x92, 0x76, 0xf8, 
++      0x2a, 0xea, 0x00, 0x00, 0xfb, 0x80, 0x16, 0x76, 
++      0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 0x75, 0xf8, 
++      0x00, 0x08, 0x00, 0x00, 0xf0, 0x73, 0x07, 0xa8, 
++      0x76, 0xf8, 0x2a, 0xea, 0x00, 0x01, 0xfb, 0x80, 
++      0x16, 0x66, 0xf4, 0x95, 0xe8, 0x10, 0xfb, 0x80, 
++      0x16, 0x87, 0xf4, 0x95, 0xe8, 0x10, 0xe8, 0x00, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0xf6, 0xb8, 
++      0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 0x75, 0xf8, 
++      0x00, 0x08, 0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 
++      0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 0x4a, 0x0a, 
++      0x4a, 0x06, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
++      0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++      0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++      0x10, 0xf8, 0x2a, 0xea, 0xf8, 0x45, 0x07, 0xe1, 
++      0x10, 0xf8, 0x2a, 0xe8, 0xf0, 0x00, 0x00, 0x01, 
++      0xf0, 0x30, 0x00, 0x0f, 0x80, 0xf8, 0x2a, 0xe8, 
++      0x10, 0xf8, 0x2a, 0xe8, 0xf8, 0x44, 0x07, 0xd6, 
++      0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xfc, 0x3f, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x0d, 0xf0, 0x20, 
++      0x0c, 0x30, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x0c, 
++      0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 
++      0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0xff, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x8a, 0x1d, 
++      0x8a, 0x07, 0x8a, 0x06, 0x8a, 0x0a, 0x8a, 0x09, 
++      0x8a, 0x08, 0xf4, 0xeb, 0xee, 0xff, 0xf2, 0x74, 
++      0x07, 0x67, 0xf4, 0x95, 0xe8, 0x01, 0xee, 0x01, 
++      0xfc, 0x00, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
++      0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++      0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++      0x8a, 0x1d, 0x8a, 0x07, 0xf4, 0xeb, 0x4a, 0x11, 
++      0x77, 0x11, 0x00, 0x28, 0x76, 0x81, 0x24, 0x00, 
++      0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++      0xf2, 0x74, 0x07, 0x67, 0xf4, 0x95, 0xe8, 0x00, 
++      0x77, 0x11, 0x00, 0x1d, 0x68, 0x81, 0x00, 0x7f, 
++      0xf6, 0xb8, 0xf4, 0x95, 0xf0, 0x20, 0xff, 0x80, 
++      0x77, 0x11, 0x00, 0x1d, 0xf0, 0x30, 0x01, 0x00, 
++      0x1a, 0x81, 0x80, 0x81, 0xf0, 0x74, 0x0a, 0x33, 
++      0xf0, 0x74, 0x11, 0xac, 0xf9, 0x80, 0x13, 0x25, 
++      0xf9, 0x80, 0x16, 0x53, 0xf9, 0x80, 0x17, 0x82, 
++      0xf0, 0x74, 0x06, 0x2f, 0xf9, 0x80, 0x14, 0xb2, 
++      0xf9, 0x80, 0x19, 0x10, 0xf0, 0x74, 0x0d, 0xe3, 
++      0xf0, 0x74, 0x07, 0xe8, 0xf0, 0x74, 0x02, 0x36, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x60, 0xf8, 
++      0x27, 0x7b, 0xff, 0xff, 0xf8, 0x30, 0x08, 0x39, 
++      0x71, 0xf8, 0x27, 0x7b, 0x27, 0x79, 0x60, 0xf8, 
++      0x27, 0x79, 0xff, 0xff, 0xf8, 0x30, 0x08, 0xb2, 
++      0x10, 0xf8, 0x29, 0x86, 0x08, 0xf8, 0x27, 0x79, 
++      0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 0xf4, 0x95, 
++      0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x30, 
++      0x08, 0x58, 0x10, 0xf8, 0x27, 0x79, 0x08, 0xf8, 
++      0x27, 0x7a, 0xf0, 0x30, 0x7f, 0xff, 0x88, 0x11, 
++      0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
++      0xf8, 0x20, 0x08, 0x63, 0x76, 0xf8, 0x27, 0x79, 
++      0xff, 0xff, 0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 
++      0xf7, 0xb8, 0xf2, 0x73, 0x08, 0xd9, 0xf0, 0x20, 
++      0xff, 0xff, 0xf6, 0xb8, 0x56, 0xf8, 0x27, 0x74, 
++      0xf0, 0xf9, 0x88, 0x11, 0x56, 0xf8, 0x27, 0x72, 
++      0xf0, 0xf9, 0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 
++      0xe7, 0x20, 0xf4, 0xa9, 0xf8, 0x30, 0x08, 0x8f, 
++      0xf1, 0x20, 0x27, 0x7c, 0x48, 0x11, 0xf6, 0x00, 
++      0x88, 0x13, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x83, 
++      0x08, 0xf8, 0x27, 0x79, 0xf0, 0x30, 0x7f, 0xff, 
++      0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 
++      0xf5, 0xab, 0xf8, 0x30, 0x08, 0x8f, 0x6d, 0x91, 
++      0x48, 0x11, 0xf0, 0x30, 0x01, 0xff, 0x88, 0x11, 
++      0xf4, 0x95, 0xe7, 0x20, 0xf7, 0xa9, 0xf8, 0x30, 
++      0x08, 0x74, 0x6d, 0x89, 0x48, 0x11, 0xf0, 0x30, 
++      0x01, 0xff, 0xf0, 0xe7, 0xf4, 0x95, 0x48, 0x08, 
++      0x4e, 0xf8, 0x27, 0x74, 0x48, 0x08, 0xf1, 0xf9, 
++      0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 
++      0x27, 0x7c, 0x27, 0x7a, 0x60, 0xf8, 0x27, 0x7b, 
++      0xff, 0xff, 0xf8, 0x30, 0x08, 0xab, 0x48, 0x08, 
++      0x4e, 0xf8, 0x27, 0x72, 0x76, 0xf8, 0x27, 0x7b, 
++      0xff, 0xff, 0x76, 0xf8, 0x27, 0x79, 0xff, 0xff, 
++      0xf2, 0x73, 0x08, 0xd9, 0xf4, 0x95, 0xe8, 0x00, 
++      0x44, 0xf8, 0x27, 0x73, 0x40, 0xf8, 0x27, 0x75, 
++      0x82, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++      0x80, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xd8, 
++      0xf6, 0xb8, 0x10, 0xf8, 0x27, 0x73, 0xf0, 0x00, 
++      0x80, 0x00, 0x48, 0x08, 0x4e, 0xf8, 0x27, 0x74, 
++      0x48, 0x08, 0xf0, 0xf9, 0x88, 0x11, 0xf4, 0x95, 
++      0xf4, 0x95, 0x71, 0xe1, 0x27, 0x7c, 0x27, 0x7a, 
++      0xf7, 0xb8, 0x57, 0xf8, 0x27, 0x74, 0xf0, 0x62, 
++      0xff, 0xff, 0xf0, 0x40, 0xff, 0x80, 0xf2, 0x80, 
++      0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfb, 
++      0x11, 0xf8, 0x27, 0x71, 0x09, 0xf8, 0x27, 0x73, 
++      0x89, 0x11, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 
++      0xf6, 0xa9, 0xf8, 0x20, 0x08, 0xed, 0xf2, 0x73, 
++      0x09, 0x0e, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0x20, 
++      0x76, 0x00, 0x00, 0x41, 0xf0, 0x74, 0x12, 0xee, 
++      0x88, 0x16, 0xf4, 0x95, 0xf7, 0xb8, 0x6d, 0x96, 
++      0x10, 0xf8, 0x00, 0x16, 0xf8, 0x47, 0x09, 0x0a, 
++      0xe7, 0x61, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 
++      0x00, 0x80, 0x76, 0x02, 0x00, 0xff, 0x76, 0x03, 
++      0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 
++      0xe8, 0x00, 0x6c, 0xe9, 0xff, 0xff, 0x08, 0xfb, 
++      0x73, 0x16, 0x00, 0x0e, 0xf0, 0x66, 0x00, 0x41, 
++      0xee, 0x05, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
++      0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x13, 
++      0xf6, 0xb8, 0x77, 0x11, 0x7f, 0xff, 0x57, 0xf8, 
++      0x27, 0x72, 0x48, 0x11, 0xf2, 0x80, 0xf0, 0x00, 
++      0x80, 0x00, 0x88, 0x11, 0xf6, 0x40, 0xf0, 0xe0, 
++      0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 0x80, 0xf8, 
++      0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x57, 0xf8, 
++      0x27, 0x72, 0x48, 0x12, 0xf2, 0x80, 0x88, 0x12, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x09, 0x38, 
++      0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++      0xf0, 0x73, 0x09, 0x3d, 0xf0, 0x20, 0x80, 0x01, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x70, 0x81, 
++      0x00, 0x13, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0xf0, 0x30, 0x7f, 0xff, 0x11, 0xf8, 0x29, 0x86, 
++      0xf5, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11, 
++      0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
++      0xf8, 0x20, 0x09, 0x54, 0xf2, 0x73, 0x09, 0x67, 
++      0xf4, 0x95, 0xe8, 0x02, 0x6f, 0xf8, 0x27, 0x7a, 
++      0x0d, 0x20, 0xf3, 0x30, 0x7f, 0xff, 0x89, 0x11, 
++      0xf4, 0x95, 0x77, 0x10, 0x40, 0x00, 0xf6, 0xa9, 
++      0xf8, 0x20, 0x09, 0x64, 0xf2, 0x73, 0x09, 0x67, 
++      0xf4, 0x95, 0xe8, 0x01, 0x80, 0xf8, 0x27, 0x7b, 
++      0xe8, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0x11, 0xf8, 0x29, 0x86, 0xf5, 0x20, 0xf3, 0x30, 
++      0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++      0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x7a, 
++      0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x02, 
++      0x6f, 0xf8, 0x27, 0x7a, 0x0d, 0x20, 0xf3, 0x30, 
++      0x7f, 0xff, 0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++      0x40, 0x00, 0xf6, 0xa9, 0xf8, 0x20, 0x09, 0x8a, 
++      0xf2, 0x73, 0x09, 0x8d, 0xf4, 0x95, 0xe8, 0x01, 
++      0x80, 0xf8, 0x27, 0x79, 0xe8, 0x00, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 
++      0x00, 0x12, 0x88, 0x11, 0xf6, 0xb8, 0x57, 0xf8, 
++      0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80, 
++      0xf0, 0x00, 0x80, 0x00, 0x80, 0x81, 0x57, 0xf8, 
++      0x27, 0x72, 0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 
++      0x80, 0xf8, 0x27, 0x78, 0x77, 0x11, 0x80, 0x00, 
++      0x48, 0x11, 0x57, 0xf8, 0x27, 0x72, 0xf2, 0x80, 
++      0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 
++      0x09, 0xb5, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
++      0x00, 0x01, 0xf0, 0x73, 0x09, 0xba, 0xf0, 0x20, 
++      0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++      0x45, 0xf8, 0x27, 0x71, 0x43, 0xf8, 0x27, 0x73, 
++      0x83, 0xf8, 0x00, 0x11, 0xf4, 0x95, 0xe7, 0x20, 
++      0xf6, 0xa9, 0xf8, 0x30, 0x09, 0xc9, 0xf2, 0x73, 
++      0x09, 0xe4, 0x77, 0x12, 0x00, 0x00, 0x57, 0xf8, 
++      0x27, 0x72, 0xf0, 0x20, 0x7f, 0xff, 0xf2, 0x80, 
++      0x49, 0x12, 0xf5, 0x00, 0xf3, 0x00, 0x80, 0x00, 
++      0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0xf8, 0x30, 
++      0x09, 0xdc, 0xf1, 0x20, 0x80, 0x00, 0xf5, 0x20, 
++      0x89, 0x12, 0xf4, 0x95, 0x48, 0x12, 0x6f, 0xf8, 
++      0x27, 0x73, 0x0d, 0x00, 0xf4, 0x95, 0x49, 0x0b, 
++      0x4f, 0xf8, 0x27, 0x72, 0x8a, 0x11, 0xfe, 0x00, 
++      0x48, 0x12, 0xf4, 0x95, 0x4a, 0x11, 0x4a, 0x16, 
++      0x4a, 0x17, 0xee, 0xfc, 0xf4, 0x95, 0x71, 0x08, 
++      0x00, 0x16, 0x88, 0x17, 0xf0, 0x74, 0x08, 0x30, 
++      0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74, 
++      0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0a, 0x0a, 
++      0xf2, 0x74, 0x08, 0xdb, 0xf4, 0x95, 0x48, 0x16, 
++      0x48, 0x18, 0x70, 0x00, 0x00, 0x16, 0xf2, 0x74, 
++      0x09, 0x8f, 0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 
++      0x10, 0x02, 0x70, 0x01, 0x00, 0x11, 0x80, 0x00, 
++      0xf2, 0x74, 0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 
++      0x49, 0x11, 0x48, 0x17, 0xf6, 0x00, 0x88, 0x17, 
++      0xe7, 0x60, 0xf5, 0xa9, 0xf8, 0x20, 0x0a, 0x2d, 
++      0x48, 0x16, 0xf6, 0x20, 0x88, 0x11, 0x48, 0x18, 
++      0x70, 0x00, 0x00, 0x11, 0xf2, 0x74, 0x09, 0x8f, 
++      0xf0, 0x00, 0x00, 0x02, 0x88, 0x11, 0x70, 0x01, 
++      0x00, 0x11, 0x10, 0x02, 0x80, 0x00, 0xf2, 0x74, 
++      0x06, 0xce, 0xf4, 0x95, 0x48, 0x17, 0xee, 0x04, 
++      0x48, 0x16, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 
++      0xfc, 0x00, 0xee, 0xfd, 0xe8, 0x00, 0x4e, 0xf8, 
++      0x27, 0x70, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x72, 
++      0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x74, 0xe8, 0x00, 
++      0x4e, 0xf8, 0x27, 0x76, 0x76, 0xf8, 0x27, 0x79, 
++      0xff, 0xff, 0x76, 0xf8, 0x27, 0x7a, 0x00, 0x00, 
++      0x76, 0xf8, 0x27, 0x7b, 0xff, 0xff, 0x76, 0xf8, 
++      0x27, 0x78, 0x00, 0x00, 0xe8, 0x00, 0x75, 0xf8, 
++      0x00, 0x08, 0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 
++      0x76, 0x01, 0x02, 0x00, 0xf2, 0x74, 0x12, 0xdc, 
++      0xf0, 0x20, 0x27, 0x7c, 0xee, 0x03, 0xfc, 0x00, 
++      0x4a, 0x11, 0xee, 0xfc, 0xf4, 0x95, 0x4e, 0x00, 
++      0x77, 0x12, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x12, 
++      0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x12, 
++      0xf0, 0xe0, 0xf1, 0xf1, 0x4f, 0x02, 0xe9, 0x01, 
++      0xf4, 0x95, 0x48, 0x0b, 0xf5, 0x40, 0x56, 0x02, 
++      0xf1, 0x80, 0x81, 0xf8, 0x27, 0x78, 0x77, 0x11, 
++      0x80, 0x00, 0x56, 0x00, 0x49, 0x11, 0xf1, 0x80, 
++      0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 
++      0x0a, 0x81, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
++      0x00, 0x01, 0xf0, 0x73, 0x0a, 0x86, 0xf0, 0x20, 
++      0x80, 0x01, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++      0x10, 0x82, 0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 
++      0x4a, 0x11, 0xee, 0xfe, 0xf4, 0x95, 0x4e, 0x00, 
++      0x77, 0x11, 0x7f, 0xff, 0xf6, 0xb8, 0x49, 0x11, 
++      0xf1, 0x80, 0xf3, 0x00, 0x80, 0x00, 0x89, 0x11, 
++      0xf0, 0xe0, 0xf1, 0xf1, 0xe8, 0x01, 0xf2, 0x80, 
++      0x80, 0xf8, 0x27, 0x78, 0x56, 0x00, 0xf1, 0x20, 
++      0x80, 0x00, 0xf1, 0x80, 0xf4, 0x95, 0x49, 0x0b, 
++      0xf8, 0x4d, 0x0a, 0xab, 0xf0, 0x20, 0x80, 0x01, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf0, 0x73, 
++      0x0a, 0xaf, 0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 
++      0x00, 0x01, 0xee, 0x02, 0x48, 0x11, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0x88, 0x12, 0x13, 0x02, 
++      0x77, 0x11, 0x00, 0x00, 0xf8, 0x4d, 0x0a, 0xcb, 
++      0xf3, 0x10, 0x00, 0x01, 0x89, 0x1a, 0xf4, 0x95, 
++      0xf0, 0x72, 0x0a, 0xca, 0x48, 0x11, 0x1c, 0xf8, 
++      0x29, 0x7e, 0x88, 0x11, 0x11, 0xf8, 0x29, 0x7e, 
++      0xf2, 0x00, 0x00, 0x01, 0x80, 0xf8, 0x29, 0x7e, 
++      0x81, 0x92, 0x48, 0x11, 0x8a, 0x11, 0xfc, 0x00, 
++      0x4a, 0x11, 0xf4, 0x95, 0x71, 0x02, 0x00, 0x11, 
++      0x88, 0x12, 0xf6, 0xb8, 0xf0, 0x20, 0x7f, 0xff, 
++      0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0xf0, 0x00, 
++      0x80, 0x00, 0x80, 0x82, 0x57, 0xf8, 0x27, 0x70, 
++      0xe8, 0x01, 0xf3, 0xf1, 0xf2, 0x80, 0x80, 0xf8, 
++      0x27, 0x78, 0x77, 0x12, 0x80, 0x00, 0x48, 0x12, 
++      0x57, 0xf8, 0x27, 0x70, 0xf2, 0x80, 0x88, 0x12, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x82, 0x0a, 0xf4, 
++      0xe8, 0x00, 0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 
++      0xf0, 0x73, 0x0a, 0xf9, 0xf0, 0x20, 0x80, 0x01, 
++      0x75, 0xf8, 0x00, 0x08, 0x00, 0x01, 0x45, 0xf8, 
++      0x27, 0x75, 0xe7, 0x10, 0x43, 0xf8, 0x27, 0x71, 
++      0x83, 0xf8, 0x00, 0x12, 0x6d, 0xe8, 0x00, 0x04, 
++      0x6d, 0x8a, 0xf6, 0xaa, 0xf8, 0x30, 0x0b, 0x0a, 
++      0xf2, 0x73, 0x0b, 0x25, 0x77, 0x11, 0x00, 0x00, 
++      0x57, 0xf8, 0x27, 0x70, 0xf0, 0x20, 0x7f, 0xff, 
++      0xf2, 0x80, 0x49, 0x11, 0xf5, 0x00, 0xf3, 0x00, 
++      0x80, 0x00, 0x61, 0xf8, 0x00, 0x0b, 0x80, 0x00, 
++      0xf8, 0x30, 0x0b, 0x1d, 0xf1, 0x20, 0x80, 0x00, 
++      0xf5, 0x20, 0x89, 0x11, 0xf4, 0x95, 0x48, 0x11, 
++      0x6f, 0xf8, 0x27, 0x71, 0x0d, 0x00, 0xf4, 0x95, 
++      0x49, 0x0b, 0x4f, 0xf8, 0x27, 0x70, 0x48, 0x11, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
++      0x4a, 0x17, 0xee, 0xf0, 0x88, 0x17, 0x10, 0x17, 
++      0x80, 0x05, 0x10, 0x16, 0x80, 0x06, 0x10, 0x15, 
++      0x80, 0x07, 0x71, 0x14, 0x00, 0x11, 0x10, 0x05, 
++      0xf0, 0x30, 0x00, 0x01, 0x88, 0x10, 0x10, 0x06, 
++      0xf0, 0x30, 0x00, 0x01, 0x80, 0x08, 0x49, 0x11, 
++      0x10, 0x05, 0xf6, 0x01, 0x80, 0x09, 0x10, 0x06, 
++      0x61, 0xf8, 0x00, 0x08, 0x00, 0x01, 0xf8, 0x20, 
++      0x0b, 0x4b, 0x10, 0x09, 0xf0, 0x00, 0x00, 0x01, 
++      0x80, 0x09, 0x71, 0x08, 0x00, 0x12, 0xf4, 0xaa, 
++      0xf8, 0x30, 0x0b, 0x54, 0x10, 0x09, 0xf0, 0x00, 
++      0x00, 0x01, 0x80, 0x09, 0x12, 0x09, 0x49, 0x11, 
++      0xf4, 0x7f, 0x80, 0x09, 0xf6, 0x20, 0x80, 0x0a, 
++      0x56, 0xf8, 0x27, 0x70, 0x4e, 0x0c, 0x10, 0x09, 
++      0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 
++      0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 0xf4, 0x95, 
++      0xf4, 0x95, 0x6c, 0x86, 0x0b, 0x6d, 0xf2, 0x73, 
++      0x0c, 0x59, 0xf4, 0x95, 0xe8, 0x00, 0xf6, 0xb8, 
++      0xf4, 0x95, 0x56, 0x0c, 0xf0, 0xf9, 0x88, 0x12, 
++      0xf4, 0x95, 0xf4, 0x95, 0x70, 0xe2, 0x27, 0x7c, 
++      0x29, 0x86, 0xe8, 0x00, 0x80, 0x0e, 0x48, 0x11, 
++      0xf8, 0x45, 0x0b, 0xcc, 0x77, 0x10, 0x00, 0x01, 
++      0xf4, 0xa9, 0xf8, 0x30, 0x0b, 0x89, 0x6c, 0xe1, 
++      0xff, 0xfd, 0x0b, 0x8b, 0x10, 0xe7, 0x00, 0x02, 
++      0x80, 0x0e, 0xf0, 0x73, 0x0b, 0x8b, 0x10, 0x87, 
++      0x80, 0x0e, 0xe7, 0x10, 0xf5, 0xae, 0xf8, 0x20, 
++      0x0b, 0xb2, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 
++      0x00, 0x16, 0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 
++      0x48, 0x17, 0x49, 0x16, 0xf6, 0x00, 0x88, 0x17, 
++      0x48, 0x11, 0xf6, 0x20, 0x88, 0x11, 0x10, 0x09, 
++      0xf6, 0x20, 0x80, 0x00, 0x48, 0x18, 0xf2, 0x74, 
++      0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x16, 
++      0x10, 0x04, 0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 
++      0x00, 0x11, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11, 
++      0x00, 0x04, 0x80, 0x04, 0xf0, 0x73, 0x0b, 0xbc, 
++      0x70, 0x00, 0x00, 0x17, 0x70, 0x01, 0x00, 0x11, 
++      0x10, 0x04, 0xf0, 0x74, 0x06, 0xce, 0x48, 0x11, 
++      0x00, 0x04, 0x80, 0x04, 0x49, 0x11, 0x48, 0x16, 
++      0xf6, 0x20, 0x88, 0x16, 0xf4, 0x95, 0xf4, 0x95, 
++      0x6c, 0x86, 0x0b, 0xcc, 0x10, 0x0a, 0x80, 0x00, 
++      0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 
++      0x00, 0x04, 0x88, 0x16, 0x12, 0x0a, 0xf8, 0x45, 
++      0x0c, 0x33, 0x71, 0x0a, 0x00, 0x10, 0xf4, 0xae, 
++      0xf8, 0x30, 0x0c, 0x1c, 0x48, 0x16, 0xf0, 0xe1, 
++      0x88, 0x11, 0x12, 0x08, 0xf8, 0x45, 0x0b, 0xdb, 
++      0x6d, 0x89, 0x12, 0x07, 0xf8, 0x45, 0x0b, 0xe9, 
++      0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11, 
++      0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74, 
++      0x06, 0xdc, 0xf0, 0x73, 0x0b, 0xef, 0x48, 0x11, 
++      0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74, 
++      0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e, 
++      0x10, 0x06, 0x49, 0x11, 0xf6, 0x00, 0x80, 0x06, 
++      0x10, 0x05, 0xf6, 0x20, 0x88, 0x11, 0xf0, 0x00, 
++      0x00, 0x01, 0x48, 0x08, 0x6f, 0x00, 0x0c, 0x9f, 
++      0x48, 0x18, 0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 
++      0x00, 0x04, 0x12, 0x07, 0xf8, 0x45, 0x0c, 0x11, 
++      0x10, 0x07, 0x80, 0x00, 0x70, 0x02, 0x00, 0x11, 
++      0x10, 0x06, 0x80, 0x01, 0x10, 0x04, 0xf0, 0x74, 
++      0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x17, 0x48, 0x11, 
++      0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 0xf0, 0x74, 
++      0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 0x81, 0x0e, 
++      0xf0, 0x73, 0x0c, 0x33, 0x12, 0x07, 0xf8, 0x45, 
++      0x0c, 0x2a, 0x10, 0x07, 0x80, 0x00, 0x10, 0x06, 
++      0x80, 0x01, 0x10, 0x05, 0x80, 0x02, 0x10, 0x04, 
++      0xf0, 0x74, 0x06, 0xdc, 0xf0, 0x73, 0x0c, 0x30, 
++      0x12, 0x05, 0x6f, 0x00, 0x0c, 0x9f, 0x10, 0x04, 
++      0xf0, 0x74, 0x0a, 0xb3, 0x11, 0x0e, 0xf1, 0xc0, 
++      0x81, 0x0e, 0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 
++      0xf2, 0x74, 0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 
++      0x71, 0x04, 0x00, 0x11, 0x70, 0x81, 0x29, 0x86, 
++      0x10, 0x0e, 0x1c, 0xf8, 0x29, 0x86, 0x80, 0x0e, 
++      0x76, 0x00, 0x00, 0x01, 0x48, 0x18, 0xf2, 0x74, 
++      0x0a, 0xce, 0xf0, 0x00, 0x00, 0x04, 0x10, 0x0e, 
++      0x71, 0x04, 0x00, 0x11, 0x80, 0x81, 0x10, 0xf8, 
++      0x29, 0x86, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x30, 
++      0x7f, 0xff, 0x80, 0xf8, 0x29, 0x86, 0x10, 0x09, 
++      0xf0, 0x00, 0x00, 0x02, 0x80, 0x09, 0xee, 0x10, 
++      0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
++      0x10, 0xf8, 0x27, 0x75, 0x08, 0xf8, 0x27, 0x71, 
++      0xf0, 0x10, 0x00, 0x01, 0x48, 0x08, 0xfc, 0x00, 
++      0x4a, 0x11, 0x4a, 0x16, 0xee, 0xff, 0xf4, 0x95, 
++      0x71, 0x04, 0x00, 0x16, 0xf0, 0x00, 0x00, 0x01, 
++      0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 0x6d, 0xee, 
++      0xff, 0xfd, 0x48, 0x16, 0xf8, 0x45, 0x0c, 0x99, 
++      0x56, 0xf8, 0x29, 0x7c, 0xf0, 0x74, 0x0a, 0x5a, 
++      0x88, 0x11, 0x10, 0xf8, 0x29, 0x7d, 0xf0, 0x00, 
++      0x00, 0x01, 0x48, 0x08, 0x4e, 0xf8, 0x29, 0x7c, 
++      0x10, 0xf8, 0x29, 0x82, 0xf0, 0x00, 0x00, 0x01, 
++      0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xa9, 
++      0xfa, 0x30, 0x0c, 0x96, 0x80, 0xf8, 0x29, 0x82, 
++      0x56, 0xf8, 0x29, 0x80, 0xf0, 0x00, 0x00, 0x01, 
++      0x4e, 0xf8, 0x29, 0x80, 0x73, 0x11, 0x29, 0x82, 
++      0x6c, 0xee, 0xff, 0xff, 0x0c, 0x76, 0xee, 0x01, 
++      0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0x76, 0xf8, 0x29, 0x84, 0x00, 0x00, 0x76, 0xf8, 
++      0x29, 0x85, 0x00, 0x01, 0xe8, 0x00, 0x4e, 0xf8, 
++      0x2a, 0x0c, 0x76, 0xf8, 0x29, 0x86, 0x00, 0x00, 
++      0x76, 0xf8, 0x29, 0x87, 0x00, 0x00, 0x77, 0x11, 
++      0x29, 0x88, 0x76, 0x81, 0xaa, 0xaa, 0x76, 0xe1, 
++      0x00, 0x01, 0xaa, 0xaa, 0x76, 0xe1, 0x00, 0x02, 
++      0x00, 0x00, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0xee, 0xfc, 0xf4, 0x95, 0x71, 0x06, 0x00, 0x14, 
++      0x71, 0x07, 0x00, 0x13, 0x71, 0x08, 0x00, 0x12, 
++      0x71, 0x09, 0x00, 0x15, 0x77, 0x10, 0x00, 0xff, 
++      0xf4, 0xaa, 0xf8, 0x30, 0x0d, 0x44, 0x49, 0x13, 
++      0x53, 0xf8, 0x2a, 0x0c, 0x4f, 0xf8, 0x2a, 0x0c, 
++      0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d, 
++      0x89, 0x11, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x01, 
++      0x71, 0xe1, 0x24, 0x00, 0x00, 0x11, 0xf4, 0xa9, 
++      0xf8, 0x30, 0x0d, 0x17, 0x77, 0x10, 0x00, 0x02, 
++      0xf4, 0xa9, 0xf8, 0x30, 0x0c, 0xec, 0x77, 0x11, 
++      0x29, 0x8a, 0x76, 0x81, 0x00, 0x00, 0xe8, 0x00, 
++      0x77, 0x14, 0x00, 0x00, 0x77, 0x13, 0x00, 0x00, 
++      0xf0, 0x73, 0x0d, 0x48, 0x6c, 0x83, 0x0c, 0xfa, 
++      0x77, 0x11, 0x29, 0x8a, 0x48, 0x12, 0xf0, 0xe8, 
++      0xf0, 0x40, 0x80, 0x00, 0x80, 0x81, 0xe8, 0x00, 
++      0x77, 0x14, 0x00, 0x00, 0xf0, 0x73, 0x0d, 0x48, 
++      0x49, 0x13, 0xf3, 0x40, 0x80, 0x00, 0x81, 0xf8, 
++      0x29, 0x8a, 0x61, 0xf8, 0x00, 0x15, 0x00, 0x01, 
++      0xf8, 0x20, 0x0d, 0x07, 0x69, 0xf8, 0x29, 0x8a, 
++      0x40, 0x00, 0x61, 0xf8, 0x00, 0x14, 0x00, 0x01, 
++      0xf8, 0x20, 0x0d, 0x0f, 0x69, 0xf8, 0x29, 0x8a, 
++      0x20, 0x00, 0x77, 0x11, 0x29, 0x8a, 0x49, 0x12, 
++      0xf3, 0xe8, 0x1b, 0x81, 0x81, 0x81, 0xf0, 0x73, 
++      0x0d, 0x48, 0x11, 0xf8, 0x29, 0x84, 0xf8, 0x4c, 
++      0x0d, 0x37, 0x77, 0x11, 0x29, 0x88, 0x76, 0x81, 
++      0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 0xf3, 0x10, 
++      0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 0x81, 0xe1, 
++      0x00, 0x01, 0x76, 0x00, 0x00, 0x02, 0x80, 0x01, 
++      0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 0x00, 0x13, 
++      0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0x48, 0x11, 
++      0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 0xf0, 0x73, 
++      0x0d, 0x73, 0x76, 0x00, 0x00, 0x00, 0x80, 0x01, 
++      0x76, 0x02, 0x00, 0x00, 0x70, 0x03, 0x00, 0x13, 
++      0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 0xe8, 0x00, 
++      0xf0, 0x73, 0x0d, 0x73, 0x77, 0x11, 0x29, 0x8a, 
++      0x70, 0x81, 0x00, 0x13, 0x11, 0xf8, 0x29, 0x84, 
++      0xf8, 0x4c, 0x0d, 0x68, 0x77, 0x11, 0x29, 0x88, 
++      0x76, 0x81, 0xaa, 0xaa, 0x11, 0xf8, 0x29, 0x85, 
++      0xf3, 0x10, 0x00, 0x01, 0xf3, 0x40, 0xaa, 0x00, 
++      0x81, 0xe1, 0x00, 0x01, 0x76, 0x00, 0x00, 0x03, 
++      0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 
++      0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 
++      0x48, 0x11, 0x71, 0xf8, 0x29, 0x85, 0x29, 0x84, 
++      0xf0, 0x73, 0x0d, 0x73, 0x76, 0x00, 0x00, 0x01, 
++      0x80, 0x01, 0x70, 0x02, 0x00, 0x14, 0x70, 0x03, 
++      0x00, 0x13, 0xf2, 0x74, 0x0b, 0x28, 0xf4, 0x95, 
++      0x48, 0x11, 0x6b, 0xf8, 0x29, 0x84, 0xff, 0xff, 
++      0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0xf5, 0x40, 0xf4, 0x95, 0x48, 0x0b, 0xf4, 0x78, 
++      0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe1, 
++      0xff, 0xb9, 0x0d, 0x88, 0xf2, 0x73, 0x0d, 0xa5, 
++      0xf4, 0x95, 0xe8, 0x60, 0xf2, 0x00, 0x00, 0x06, 
++      0x61, 0xf8, 0x00, 0x11, 0x00, 0x20, 0xf8, 0x30, 
++      0x0d, 0x98, 0x61, 0xf8, 0x00, 0x0b, 0x00, 0x01, 
++      0xf8, 0x20, 0x0d, 0xa3, 0xf2, 0x00, 0x00, 0x07, 
++      0xf0, 0x73, 0x0d, 0xa3, 0x61, 0xf8, 0x00, 0x0b, 
++      0x00, 0x01, 0xf8, 0x20, 0x0d, 0xa1, 0xf2, 0x73, 
++      0x0d, 0xa3, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 
++      0x00, 0x02, 0x48, 0x08, 0xf4, 0x7f, 0x8a, 0x11, 
++      0xfc, 0x00, 0xee, 0xff, 0xf0, 0x74, 0x07, 0xfd, 
++      0xf0, 0x74, 0x07, 0x44, 0xf0, 0x74, 0x0d, 0xb4, 
++      0xf0, 0x74, 0x02, 0x05, 0xf0, 0x74, 0x04, 0x60, 
++      0xf0, 0x73, 0x0d, 0xaa, 0xee, 0xfd, 0x10, 0xf8, 
++      0x2a, 0xa3, 0xf8, 0x44, 0x0d, 0xcb, 0x10, 0xf8, 
++      0x2a, 0xa4, 0xf8, 0x45, 0x0d, 0xd7, 0x76, 0x00, 
++      0x02, 0x00, 0xf2, 0x74, 0x09, 0xe8, 0xf0, 0x20, 
++      0x22, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00, 
++      0x76, 0xf8, 0x2a, 0xa7, 0x00, 0x00, 0xf0, 0x73, 
++      0x0d, 0xd7, 0x76, 0x00, 0x02, 0x00, 0xf2, 0x74, 
++      0x09, 0xe8, 0xf0, 0x20, 0x20, 0x00, 0x76, 0xf8, 
++      0x2a, 0xa3, 0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa7, 
++      0x00, 0x01, 0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 
++      0xf0, 0x10, 0x3a, 0x98, 0xf8, 0x47, 0x0d, 0xe1, 
++      0x76, 0xf8, 0x27, 0x6e, 0x00, 0x00, 0xee, 0x03, 
++      0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 0x77, 0x11, 
++      0x20, 0x00, 0x76, 0x00, 0xaa, 0xaa, 0x76, 0x01, 
++      0x02, 0x00, 0xf2, 0x74, 0x06, 0x6c, 0xf4, 0x95, 
++      0x48, 0x11, 0x76, 0x00, 0x55, 0x55, 0x76, 0x01, 
++      0x02, 0x00, 0x48, 0x11, 0xf2, 0x74, 0x06, 0x6c, 
++      0xf0, 0x00, 0x02, 0x00, 0x76, 0xf8, 0x2a, 0xa3, 
++      0x00, 0x00, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x00, 
++      0xe8, 0x00, 0x4e, 0x00, 0xfb, 0x80, 0x15, 0x3e, 
++      0xf4, 0x95, 0xe8, 0x04, 0x80, 0xf8, 0x2a, 0xa5, 
++      0x76, 0x00, 0x2a, 0xa8, 0xf9, 0x80, 0x14, 0x87, 
++      0x76, 0x00, 0x2a, 0xad, 0xfb, 0x80, 0x13, 0x62, 
++      0xf4, 0x95, 0xe8, 0x02, 0x10, 0xf8, 0x2a, 0xa5, 
++      0xf9, 0x80, 0x14, 0x63, 0xfb, 0x80, 0x16, 0x66, 
++      0xf4, 0x95, 0xe8, 0x1c, 0xfb, 0x80, 0x16, 0x87, 
++      0xf4, 0x95, 0xe8, 0x1c, 0xe8, 0x01, 0x4e, 0x00, 
++      0xfb, 0x80, 0x17, 0xd6, 0xf4, 0x95, 0xe8, 0x00, 
++      0x80, 0xf8, 0x2a, 0xa6, 0x76, 0x00, 0x2a, 0xb7, 
++      0xf9, 0x80, 0x16, 0xaa, 0x10, 0xf8, 0x2a, 0xa6, 
++      0xf9, 0x80, 0x17, 0x5c, 0x10, 0xf8, 0x2a, 0xa6, 
++      0xf9, 0x80, 0x17, 0x6f, 0xee, 0x02, 0x8a, 0x11, 
++      0xfc, 0x00, 0xf4, 0x95, 0x4a, 0x08, 0x4a, 0x09, 
++      0x4a, 0x0a, 0x4a, 0x07, 0x4a, 0x1d, 0x68, 0xf8, 
++      0x00, 0x07, 0x7d, 0x3f, 0x69, 0xf8, 0x00, 0x07, 
++      0x40, 0x00, 0x68, 0xf8, 0x00, 0x1d, 0xff, 0xfc, 
++      0x10, 0xf8, 0x2a, 0xa7, 0xf8, 0x44, 0x0e, 0x4b, 
++      0x76, 0xf8, 0x2a, 0xa3, 0x00, 0x01, 0xf0, 0x73, 
++      0x0e, 0x4e, 0x76, 0xf8, 0x2a, 0xa4, 0x00, 0x01, 
++      0x8a, 0x1d, 0x8a, 0x07, 0x8a, 0x0a, 0x8a, 0x09, 
++      0x8a, 0x08, 0xf4, 0xeb, 0x4a, 0x11, 0x4a, 0x16, 
++      0x4a, 0x17, 0xee, 0xfe, 0x88, 0x0e, 0x71, 0x08, 
++      0x00, 0x16, 0x71, 0x06, 0x00, 0x17, 0x11, 0x07, 
++      0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 0x25, 0xa0, 
++      0x88, 0x11, 0x76, 0x01, 0x00, 0x06, 0x81, 0x00, 
++      0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 0x00, 0x01, 
++      0x76, 0x01, 0x00, 0x06, 0x70, 0x00, 0x00, 0x16, 
++      0x48, 0x11, 0xf2, 0x74, 0x06, 0xce, 0xf0, 0x00, 
++      0x00, 0x07, 0x70, 0x81, 0x00, 0x17, 0xee, 0x02, 
++      0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xfc, 0x00, 
++      0x4a, 0x11, 0x88, 0x0e, 0x71, 0x02, 0x00, 0x12, 
++      0x11, 0x03, 0xf0, 0x66, 0x00, 0x0d, 0xf0, 0x00, 
++      0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 0x70, 0x81, 
++      0x00, 0x12, 0x6e, 0xe2, 0xff, 0xfe, 0x0e, 0x8d, 
++      0xf4, 0x95, 0xe8, 0x00, 0xe8, 0x01, 0x80, 0xe1, 
++      0x00, 0x02, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 
++      0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 
++      0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0c, 
++      0x00, 0x00, 0x81, 0xe1, 0x00, 0x01, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 0x88, 0x0e, 
++      0xf4, 0x95, 0xf1, 0x66, 0x00, 0x0d, 0xf3, 0x00, 
++      0x24, 0x00, 0x89, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
++      0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 
++      0x00, 0x0b, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
++      0x00, 0x01, 0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 
++      0x00, 0x00, 0x80, 0x02, 0x76, 0x03, 0x00, 0x00, 
++      0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0xe8, 0x00, 
++      0xee, 0x04, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0x88, 0x19, 0xf4, 0x95, 0x73, 0x19, 0x00, 0x0e, 
++      0xf1, 0x66, 0x00, 0x0d, 0xf2, 0x00, 0x24, 0x00, 
++      0x77, 0x15, 0x25, 0xa0, 0x77, 0x14, 0x00, 0x00, 
++      0x77, 0x1a, 0x00, 0x1f, 0xf0, 0x72, 0x0f, 0x14, 
++      0xf6, 0xb8, 0x49, 0x19, 0x09, 0x85, 0xf8, 0x4c, 
++      0x0f, 0x13, 0xf1, 0x00, 0x00, 0x05, 0x89, 0x11, 
++      0x49, 0x15, 0xf3, 0x00, 0x00, 0x01, 0x89, 0x13, 
++      0x49, 0x15, 0xf3, 0x00, 0x00, 0x07, 0x89, 0x12, 
++      0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++      0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++      0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++      0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++      0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x10, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x80, 0x0f, 0x13, 
++      0x11, 0x93, 0x1d, 0x91, 0x19, 0x92, 0x89, 0x11, 
++      0xf4, 0x95, 0xf4, 0x95, 0x6c, 0x81, 0x0f, 0x13, 
++      0x6d, 0x94, 0x6d, 0xed, 0x00, 0x0d, 0x48, 0x14, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
++      0x4a, 0x17, 0xee, 0xf8, 0x88, 0x17, 0x10, 0x0d, 
++      0x80, 0x04, 0x10, 0x0c, 0x80, 0x05, 0x71, 0x0e, 
++      0x00, 0x16, 0x73, 0x17, 0x00, 0x0e, 0xf0, 0x66, 
++      0x00, 0x0d, 0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 
++      0x10, 0xf8, 0x27, 0x63, 0xf8, 0x45, 0x0f, 0x32, 
++      0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
++      0x10, 0xf8, 0x27, 0x60, 0xf8, 0x44, 0x0f, 0x3d, 
++      0x60, 0xe1, 0x00, 0x02, 0x00, 0x01, 0xf8, 0x20, 
++      0x0f, 0x6d, 0xf0, 0x73, 0x11, 0x33, 0x10, 0x04, 
++      0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f, 
++      0x11, 0x04, 0xf3, 0x00, 0x00, 0x01, 0x81, 0x04, 
++      0x6d, 0x8e, 0x77, 0x10, 0x00, 0x01, 0x71, 0xe1, 
++      0x00, 0x02, 0x00, 0x12, 0xf4, 0xaa, 0xf8, 0x30, 
++      0x0f, 0x62, 0x77, 0x10, 0x00, 0x02, 0xf4, 0xaa, 
++      0xf8, 0x30, 0x0f, 0x6d, 0x45, 0xe1, 0x00, 0x0b, 
++      0x88, 0x10, 0x43, 0xe1, 0x00, 0x0c, 0x83, 0xf8, 
++      0x00, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xaa, 
++      0xf8, 0x30, 0x0f, 0x6d, 0xf0, 0x73, 0x0f, 0x96, 
++      0xf5, 0x00, 0x81, 0x04, 0x49, 0x16, 0xf5, 0x20, 
++      0x89, 0x16, 0x76, 0xe1, 0x00, 0x0c, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x48, 0x16, 
++      0xf8, 0x45, 0x11, 0x33, 0xf7, 0xb8, 0x71, 0xe1, 
++      0x00, 0x02, 0x00, 0x12, 0x10, 0xf8, 0x00, 0x12, 
++      0xf0, 0x10, 0x00, 0x03, 0xf8, 0x46, 0x0f, 0x8c, 
++      0x10, 0xf8, 0x00, 0x12, 0xf0, 0x10, 0x00, 0x03, 
++      0xf8, 0x45, 0x10, 0x16, 0x77, 0x10, 0x00, 0x01, 
++      0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0x9c, 0x77, 0x10, 
++      0x00, 0x02, 0xf4, 0xaa, 0xf8, 0x30, 0x0f, 0xa8, 
++      0xf0, 0x73, 0x0f, 0x96, 0x77, 0x10, 0x00, 0x04, 
++      0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xb7, 0x77, 0x10, 
++      0x00, 0x05, 0xf4, 0xaa, 0xf8, 0x30, 0x10, 0xbc, 
++      0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
++      0xf0, 0x73, 0x11, 0x31, 0x76, 0xe1, 0x00, 0x0c, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 
++      0x00, 0x02, 0x00, 0x02, 0x11, 0xe1, 0x00, 0x0c, 
++      0xe8, 0x03, 0xf6, 0x20, 0x89, 0x12, 0xf4, 0x95, 
++      0x77, 0x10, 0x00, 0x03, 0xf5, 0xaa, 0xf8, 0x30, 
++      0x0f, 0xb6, 0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 
++      0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 0xf5, 0xae, 
++      0xf8, 0x20, 0x0f, 0xbd, 0x48, 0x16, 0x80, 0x06, 
++      0x88, 0x13, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x03, 
++      0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xc8, 0x6b, 0xf8, 
++      0x27, 0x6f, 0x00, 0x01, 0x12, 0x06, 0xf8, 0x45, 
++      0x10, 0x00, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00, 
++      0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02, 
++      0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74, 
++      0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06, 
++      0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04, 
++      0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
++      0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04, 
++      0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 
++      0x88, 0x16, 0x89, 0x13, 0xf4, 0x95, 0x77, 0x10, 
++      0x00, 0x03, 0xf6, 0xab, 0xf8, 0x20, 0x0f, 0xf5, 
++      0x6b, 0xf8, 0x27, 0x6f, 0x00, 0x01, 0x77, 0x10, 
++      0x00, 0x0c, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 
++      0xf6, 0xab, 0xf8, 0x20, 0x10, 0x00, 0x6b, 0xf8, 
++      0x27, 0x6f, 0x00, 0x01, 0x6c, 0xe2, 0xff, 0xfd, 
++      0x11, 0x31, 0xf6, 0xb8, 0x6f, 0xe1, 0x00, 0x05, 
++      0x0c, 0x48, 0x6f, 0xe1, 0x00, 0x06, 0x0c, 0x18, 
++      0xf0, 0x30, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x03, 
++      0x80, 0xe1, 0x00, 0x0b, 0x76, 0xe1, 0x00, 0x02, 
++      0x00, 0x03, 0x48, 0x16, 0xf8, 0x45, 0x11, 0x33, 
++      0x71, 0xe1, 0x00, 0x0c, 0x00, 0x12, 0x10, 0xe1, 
++      0x00, 0x0b, 0x49, 0x12, 0xf6, 0x20, 0x88, 0x13, 
++      0xe8, 0x0c, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95, 
++      0xf4, 0x95, 0xf5, 0xab, 0xf8, 0x20, 0x10, 0x27, 
++      0x48, 0x13, 0x80, 0x06, 0x88, 0x10, 0xf4, 0x95, 
++      0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0x30, 
++      0x70, 0x06, 0x00, 0x16, 0x12, 0x06, 0xf8, 0x45, 
++      0x10, 0x5f, 0x10, 0xe1, 0x00, 0x04, 0x80, 0x00, 
++      0x10, 0x05, 0x80, 0x01, 0x10, 0x04, 0x80, 0x02, 
++      0x10, 0x06, 0x80, 0x03, 0x48, 0x11, 0xf2, 0x74, 
++      0x07, 0x1e, 0xf0, 0x00, 0x00, 0x05, 0x10, 0x06, 
++      0x00, 0xe1, 0x00, 0x04, 0x80, 0xe1, 0x00, 0x04, 
++      0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
++      0x00, 0x0c, 0x88, 0x12, 0x11, 0x06, 0x10, 0x04, 
++      0xf6, 0x00, 0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 
++      0x88, 0x16, 0xf4, 0x95, 0x77, 0x10, 0x00, 0x0c, 
++      0x71, 0xe1, 0x00, 0x04, 0x00, 0x13, 0xf6, 0xab, 
++      0xf8, 0x20, 0x10, 0x5f, 0x6b, 0xf8, 0x27, 0x6f, 
++      0x00, 0x01, 0x77, 0x10, 0x00, 0x0c, 0xf6, 0xaa, 
++      0xf8, 0x20, 0x10, 0x6b, 0xf2, 0x74, 0x0e, 0x9f, 
++      0xf4, 0x95, 0x48, 0x17, 0x71, 0xe1, 0x00, 0x0c, 
++      0x00, 0x12, 0x77, 0x10, 0x00, 0x0c, 0xf4, 0xaa, 
++      0xf8, 0x30, 0x10, 0x7c, 0x77, 0x10, 0x00, 0x0c, 
++      0x71, 0xe1, 0x00, 0x0b, 0x00, 0x13, 0xf6, 0xab, 
++      0xf8, 0x30, 0x10, 0xb4, 0xe7, 0x30, 0xf7, 0xaa, 
++      0xf8, 0x30, 0x10, 0xb4, 0xf2, 0x74, 0x0e, 0xc1, 
++      0xf4, 0x95, 0x48, 0x17, 0x88, 0x12, 0xf4, 0x95, 
++      0xf4, 0x95, 0x6c, 0x82, 0x10, 0x8d, 0x76, 0xe1, 
++      0x00, 0x04, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
++      0x00, 0x05, 0xf0, 0x73, 0x10, 0xb4, 0x76, 0xe1, 
++      0x00, 0x02, 0x00, 0x04, 0x77, 0x10, 0x00, 0x0c, 
++      0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf5, 0xaa, 
++      0xf8, 0x20, 0x10, 0x9a, 0xf0, 0x73, 0x10, 0x9c, 
++      0x77, 0x12, 0x00, 0x0c, 0x76, 0x00, 0x00, 0x00, 
++      0x70, 0x01, 0x00, 0x12, 0x70, 0x02, 0x00, 0x17, 
++      0x76, 0x03, 0x00, 0x01, 0x48, 0x11, 0xf2, 0x74, 
++      0x0c, 0xb9, 0xf0, 0x00, 0x00, 0x05, 0x76, 0xe1, 
++      0x00, 0x04, 0x00, 0x00, 0x77, 0x10, 0x00, 0x0c, 
++      0x71, 0xe1, 0x00, 0x0b, 0x00, 0x12, 0xf6, 0xaa, 
++      0xf8, 0x20, 0x11, 0x1c, 0x48, 0x16, 0xf8, 0x45, 
++      0x11, 0x33, 0x60, 0xe1, 0x00, 0x02, 0x00, 0x05, 
++      0xf8, 0x20, 0x10, 0xdf, 0x10, 0xe1, 0x00, 0x0b, 
++      0x08, 0xe1, 0x00, 0x0c, 0x11, 0xe1, 0x00, 0x04, 
++      0xf8, 0x4d, 0x10, 0xc7, 0x6b, 0xf8, 0x27, 0x6f, 
++      0x00, 0x01, 0x88, 0x10, 0xf4, 0x95, 0xf4, 0x95, 
++      0xf5, 0xae, 0xf8, 0x20, 0x10, 0xcf, 0x48, 0x16, 
++      0xf4, 0x95, 0x48, 0x08, 0xf8, 0x45, 0x11, 0x16, 
++      0x6f, 0xe1, 0x00, 0x0c, 0x0d, 0x00, 0x81, 0xe1, 
++      0x00, 0x0c, 0x11, 0x04, 0xf5, 0x00, 0x81, 0x04, 
++      0x49, 0x16, 0xf5, 0x20, 0x89, 0x16, 0xf0, 0x73, 
++      0x11, 0x0e, 0x10, 0xe1, 0x00, 0x0b, 0x71, 0xe1, 
++      0x00, 0x0c, 0x00, 0x12, 0x88, 0x10, 0xf4, 0x95, 
++      0xf4, 0x95, 0xf6, 0xaa, 0xf8, 0x30, 0x11, 0x16, 
++      0x49, 0x12, 0xf6, 0x20, 0x88, 0x10, 0xf4, 0x95, 
++      0xf4, 0x95, 0xf5, 0xae, 0xf8, 0x20, 0x10, 0xf3, 
++      0x48, 0x16, 0x80, 0x06, 0x48, 0x08, 0xf8, 0x45, 
++      0x11, 0x16, 0x10, 0x04, 0x70, 0x02, 0x00, 0x17, 
++      0x80, 0x00, 0x76, 0x03, 0x00, 0x00, 0x10, 0x06, 
++      0x80, 0x01, 0x10, 0x05, 0xf0, 0x74, 0x0c, 0xb9, 
++      0x10, 0x06, 0x00, 0xe1, 0x00, 0x0c, 0x80, 0xe1, 
++      0x00, 0x0c, 0x11, 0x06, 0x10, 0x04, 0xf6, 0x00, 
++      0x80, 0x04, 0x48, 0x16, 0xf6, 0x20, 0x88, 0x16, 
++      0x10, 0xe1, 0x00, 0x0c, 0x08, 0xe1, 0x00, 0x0b, 
++      0xf8, 0x45, 0x11, 0x1c, 0xf0, 0x73, 0x11, 0x31, 
++      0xf2, 0x74, 0x0e, 0x9f, 0xf4, 0x95, 0x48, 0x17, 
++      0xf0, 0x73, 0x11, 0x33, 0x76, 0xe1, 0x00, 0x0c, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0x02, 0x00, 0x01, 0x10, 0x04, 
++      0x80, 0x00, 0x10, 0x05, 0xf0, 0x74, 0x06, 0x9f, 
++      0x88, 0x12, 0xf4, 0x95, 0x77, 0x10, 0x00, 0xff, 
++      0xf4, 0xaa, 0xf8, 0x30, 0x11, 0x33, 0x6c, 0x86, 
++      0x0f, 0x70, 0xee, 0x08, 0x8a, 0x17, 0x8a, 0x16, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfc, 
++      0xf4, 0x95, 0x71, 0x06, 0x00, 0x12, 0x88, 0x11, 
++      0x73, 0x12, 0x00, 0x0e, 0xf1, 0x66, 0x00, 0x0d, 
++      0xf3, 0x00, 0x24, 0x00, 0x89, 0x14, 0x13, 0x81, 
++      0xf7, 0x7a, 0xf3, 0x30, 0x00, 0x01, 0x81, 0xf8, 
++      0x27, 0x60, 0x13, 0xe1, 0x00, 0x01, 0xf7, 0x7c, 
++      0xf3, 0x30, 0x00, 0x03, 0x81, 0xf8, 0x27, 0x61, 
++      0xe9, 0x0f, 0x19, 0xe1, 0x00, 0x01, 0x81, 0xf8, 
++      0x27, 0x62, 0x71, 0xe4, 0x00, 0x03, 0x00, 0x13, 
++      0xf6, 0xb8, 0x49, 0x13, 0xf3, 0x00, 0x00, 0x01, 
++      0xf3, 0x30, 0x00, 0x0f, 0x49, 0x0b, 0x09, 0xf8, 
++      0x27, 0x62, 0xf8, 0x4d, 0x11, 0x75, 0x77, 0x10, 
++      0x00, 0xff, 0xf4, 0xab, 0xf8, 0x30, 0x11, 0x75, 
++      0x57, 0xf8, 0x27, 0x6c, 0xf3, 0x00, 0x00, 0x01, 
++      0x4f, 0xf8, 0x27, 0x6c, 0x76, 0xf8, 0x27, 0x63, 
++      0x00, 0x01, 0xf0, 0x73, 0x11, 0x78, 0x76, 0xf8, 
++      0x27, 0x63, 0x00, 0x00, 0x70, 0xe4, 0x00, 0x03, 
++      0x27, 0x62, 0x76, 0xf8, 0x27, 0x64, 0x00, 0x00, 
++      0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 0x00, 0x0b, 
++      0x00, 0x02, 0xf8, 0x20, 0x11, 0x8d, 0xe9, 0x01, 
++      0x6f, 0xe1, 0x00, 0x02, 0x0f, 0x18, 0x81, 0xf8, 
++      0x27, 0x64, 0x11, 0xf8, 0x27, 0x61, 0x61, 0xf8, 
++      0x00, 0x0b, 0x00, 0x01, 0xf8, 0x20, 0x11, 0xa9, 
++      0x10, 0xf8, 0x27, 0x64, 0xf1, 0x00, 0x00, 0x04, 
++      0x89, 0x13, 0xe9, 0xb8, 0xf5, 0x20, 0x81, 0xf8, 
++      0x27, 0x65, 0x60, 0x84, 0x00, 0x02, 0xf8, 0x20, 
++      0x11, 0xa9, 0x70, 0x00, 0x00, 0x11, 0x70, 0x01, 
++      0x00, 0x13, 0x70, 0x02, 0x27, 0x65, 0xf2, 0x74, 
++      0x0f, 0x18, 0xf4, 0x95, 0x48, 0x12, 0xee, 0x04, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 
++      0x4a, 0x17, 0xee, 0xfc, 0xe8, 0x00, 0x4e, 0xf8, 
++      0x27, 0x66, 0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x68, 
++      0xe8, 0x00, 0x4e, 0xf8, 0x27, 0x6c, 0xe8, 0x00, 
++      0x4e, 0xf8, 0x27, 0x6a, 0x77, 0x12, 0x27, 0x40, 
++      0x77, 0x11, 0x24, 0x00, 0x77, 0x1a, 0x00, 0x1f, 
++      0xf0, 0x72, 0x11, 0xdb, 0x70, 0x92, 0x00, 0x11, 
++      0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 0x76, 0x81, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 0x76, 0xe1, 
++      0x00, 0x0c, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 
++      0x6d, 0xe9, 0x00, 0x0d, 0xf0, 0x20, 0x25, 0xa0, 
++      0xf1, 0x00, 0x00, 0x07, 0x89, 0x11, 0xf1, 0x00, 
++      0x00, 0x01, 0x81, 0x02, 0x88, 0x16, 0xf4, 0x95, 
++      0x77, 0x17, 0x00, 0x20, 0x76, 0x86, 0x00, 0xff, 
++      0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 
++      0x10, 0x02, 0xf0, 0x74, 0x06, 0x6c, 0x76, 0x00, 
++      0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74, 
++      0x06, 0x6c, 0xf4, 0x95, 0x48, 0x11, 0x10, 0x02, 
++      0xf0, 0x00, 0x00, 0x0d, 0x80, 0x02, 0x6d, 0xe9, 
++      0x00, 0x0d, 0x6d, 0xee, 0x00, 0x0d, 0x6c, 0xef, 
++      0xff, 0xff, 0x11, 0xe8, 0xf0, 0x74, 0x0c, 0x9d, 
++      0xee, 0x04, 0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 
++      0xfc, 0x00, 0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 
++      0xee, 0xfa, 0x88, 0x11, 0x10, 0x0a, 0x49, 0x11, 
++      0xf8, 0x4d, 0x12, 0x9f, 0x48, 0x08, 0xf8, 0x45, 
++      0x12, 0x9f, 0x80, 0x04, 0x12, 0x81, 0xf5, 0x78, 
++      0x89, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x6c, 0xe2, 
++      0xff, 0xb9, 0x12, 0x8a, 0x61, 0xf8, 0x00, 0x08, 
++      0x00, 0x80, 0xf8, 0x30, 0x12, 0x8a, 0x13, 0xe1, 
++      0x00, 0x01, 0xf0, 0xe8, 0xf7, 0x78, 0xf1, 0xa0, 
++      0xf2, 0x30, 0x1f, 0xff, 0x88, 0x17, 0xf4, 0x95, 
++      0x77, 0x12, 0x24, 0x00, 0x77, 0x16, 0x00, 0x00, 
++      0x77, 0x13, 0x00, 0x20, 0xf6, 0xb8, 0x48, 0x17, 
++      0x08, 0xe2, 0x00, 0x01, 0xf8, 0x45, 0x12, 0x42, 
++      0x6d, 0xea, 0x00, 0x0d, 0x6d, 0x96, 0x6c, 0xeb, 
++      0xff, 0xff, 0x12, 0x34, 0xf0, 0x73, 0x12, 0x90, 
++      0x56, 0xf8, 0x27, 0x6a, 0xf0, 0x00, 0x00, 0x01, 
++      0x4e, 0xf8, 0x27, 0x6a, 0x60, 0x82, 0x00, 0x01, 
++      0xf8, 0x30, 0x12, 0x54, 0x70, 0x00, 0x00, 0x16, 
++      0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11, 
++      0xf0, 0x73, 0x12, 0x90, 0x70, 0x00, 0x00, 0x16, 
++      0xf2, 0x74, 0x11, 0x38, 0xf4, 0x95, 0x48, 0x11, 
++      0x72, 0x10, 0x2a, 0x9e, 0xf4, 0x95, 0xf4, 0xaf, 
++      0xf8, 0x30, 0x12, 0x6e, 0x76, 0x00, 0x00, 0x00, 
++      0x76, 0x01, 0x00, 0xbc, 0x70, 0x02, 0x00, 0x16, 
++      0x76, 0x03, 0x00, 0x00, 0xf2, 0x74, 0x0c, 0xb9, 
++      0xf4, 0x95, 0x48, 0x11, 0xf0, 0x73, 0x12, 0x90, 
++      0x10, 0xf8, 0x27, 0x6e, 0xf8, 0x44, 0x12, 0x90, 
++      0x76, 0x00, 0x00, 0x00, 0x76, 0x01, 0x00, 0xbc, 
++      0x70, 0x02, 0x00, 0x16, 0x76, 0x03, 0x00, 0x00, 
++      0xf2, 0x74, 0x0c, 0xb9, 0xf4, 0x95, 0x48, 0x11, 
++      0xf0, 0x74, 0x0c, 0x5e, 0xf0, 0xe0, 0xf0, 0x10, 
++      0x13, 0x88, 0xf8, 0x42, 0x12, 0x90, 0x76, 0xf8, 
++      0x27, 0x6e, 0x00, 0x01, 0xf0, 0x73, 0x12, 0x90, 
++      0x56, 0xf8, 0x27, 0x66, 0xf0, 0x00, 0x00, 0x01, 
++      0x4e, 0xf8, 0x27, 0x66, 0x6d, 0xe9, 0x00, 0x5e, 
++      0x56, 0xf8, 0x27, 0x68, 0xf0, 0x00, 0x00, 0x01, 
++      0x4e, 0xf8, 0x27, 0x68, 0x71, 0x04, 0x00, 0x12, 
++      0x6e, 0xea, 0xff, 0xff, 0x12, 0x18, 0x70, 0x04, 
++      0x00, 0x12, 0xee, 0x06, 0x8a, 0x17, 0x8a, 0x16, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xee, 0xfe, 
++      0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d, 
++      0xf0, 0x00, 0x25, 0xa0, 0x88, 0x11, 0xf4, 0x95, 
++      0xf4, 0x95, 0x76, 0x81, 0x00, 0xff, 0x76, 0x00, 
++      0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0xf2, 0x74, 
++      0x06, 0x6c, 0xf0, 0x00, 0x00, 0x01, 0x76, 0x00, 
++      0x00, 0x00, 0x76, 0x01, 0x00, 0x06, 0x48, 0x11, 
++      0xf2, 0x74, 0x06, 0x6c, 0xf0, 0x00, 0x00, 0x07, 
++      0xee, 0x02, 0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 
++      0x88, 0x0e, 0xf4, 0x95, 0xf0, 0x66, 0x00, 0x0d, 
++      0xf0, 0x00, 0x24, 0x00, 0x88, 0x11, 0xf4, 0x95, 
++      0xf4, 0x95, 0x76, 0xe1, 0x00, 0x01, 0xff, 0xff, 
++      0x76, 0x81, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0x03, 0x00, 0xff, 
++      0x8a, 0x11, 0xfc, 0x00, 0x4a, 0x11, 0xf4, 0x95, 
++      0x13, 0x03, 0x88, 0x11, 0xfa, 0x4d, 0x12, 0xec, 
++      0x71, 0x02, 0x00, 0x12, 0xf3, 0x10, 0x00, 0x01, 
++      0x89, 0x1a, 0xf4, 0x95, 0xf0, 0x72, 0x12, 0xeb, 
++      0x70, 0x91, 0x00, 0x12, 0x8a, 0x11, 0xfc, 0x00, 
++      0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d, 
++      0xf7, 0xb8, 0xee, 0xfe, 0x10, 0xf8, 0x00, 0x08, 
++      0x11, 0x06, 0xf1, 0xc0, 0x83, 0x00, 0xf4, 0x85, 
++      0x11, 0x06, 0xf7, 0x85, 0x81, 0x06, 0xf6, 0xb8, 
++      0xec, 0x0f, 0x1e, 0x06, 0x61, 0x00, 0x80, 0x00, 
++      0xf8, 0x20, 0x13, 0x05, 0xf4, 0x84, 0xee, 0x02, 
++      0x8a, 0x0d, 0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 
++      0xf4, 0x95, 0x4a, 0x0b, 0x4a, 0x0c, 0x4a, 0x0d, 
++      0xee, 0xfe, 0xf7, 0xb8, 0x80, 0x00, 0x10, 0xf8, 
++      0x00, 0x08, 0xf4, 0x85, 0x11, 0x06, 0xf7, 0x85, 
++      0x81, 0x06, 0xf6, 0xb8, 0xec, 0x0f, 0x1e, 0x06, 
++      0xf0, 0xf0, 0x61, 0x00, 0x80, 0x00, 0xf8, 0x20, 
++      0x13, 0x20, 0xf4, 0x84, 0xee, 0x02, 0x8a, 0x0d, 
++      0x8a, 0x0c, 0x8a, 0x0b, 0xfc, 0x00, 0x4a, 0x11, 
++      0x77, 0x11, 0x00, 0x7b, 0x76, 0x81, 0x2e, 0xec, 
++      0x77, 0x11, 0x00, 0x7b, 0xee, 0xff, 0x71, 0x81, 
++      0x00, 0x11, 0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0x04, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1, 
++      0x00, 0x62, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x76, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0x92, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0x94, 0x00, 0x00, 0x76, 0xe1, 
++      0x00, 0xb0, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xb3, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0xbe, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0xbf, 0x00, 0x00, 0x76, 0xe1, 
++      0x00, 0xc1, 0x00, 0x00, 0x76, 0xe1, 0x00, 0xc3, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0xc5, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0xc7, 0x00, 0x00, 0x76, 0x81, 
++      0x00, 0x00, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++      0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xff, 
++      0xf4, 0x95, 0x71, 0x06, 0x00, 0x16, 0xfb, 0x80, 
++      0x16, 0xa2, 0x88, 0x17, 0xf4, 0x95, 0xf7, 0xb8, 
++      0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02, 
++      0xfa, 0x46, 0x13, 0x88, 0x77, 0x11, 0x00, 0x00, 
++      0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x02, 
++      0xf8, 0x45, 0x13, 0xf9, 0x10, 0xf8, 0x00, 0x17, 
++      0xf8, 0x45, 0x14, 0x39, 0x10, 0xf8, 0x00, 0x17, 
++      0xf0, 0x10, 0x00, 0x01, 0xf8, 0x45, 0x14, 0x1f, 
++      0xf0, 0x73, 0x14, 0x52, 0x10, 0xf8, 0x00, 0x17, 
++      0xf0, 0x10, 0x00, 0x03, 0xf8, 0x45, 0x13, 0xd3, 
++      0x10, 0xf8, 0x00, 0x17, 0xf0, 0x10, 0x00, 0x06, 
++      0xf8, 0x44, 0x14, 0x52, 0x77, 0x12, 0x00, 0x7b, 
++      0x71, 0x82, 0x00, 0x14, 0x61, 0xe4, 0x00, 0x07, 
++      0x00, 0x40, 0xf8, 0x30, 0x14, 0x52, 0x49, 0x14, 
++      0x48, 0x17, 0xf6, 0x00, 0x88, 0x12, 0xf4, 0x95, 
++      0x77, 0x13, 0x00, 0x55, 0x77, 0x11, 0x00, 0x57, 
++      0x6d, 0xea, 0x00, 0x3b, 0xe5, 0x01, 0x10, 0xe6, 
++      0x00, 0x06, 0x80, 0x81, 0x48, 0x14, 0x00, 0xf8, 
++      0x00, 0x17, 0x88, 0x12, 0xf4, 0x95, 0x77, 0x11, 
++      0x00, 0x55, 0x10, 0xe2, 0x00, 0x40, 0x80, 0x81, 
++      0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x07, 
++      0x80, 0x81, 0x77, 0x11, 0x00, 0x55, 0x10, 0xe2, 
++      0x00, 0x45, 0x80, 0x81, 0x10, 0xe6, 0x00, 0x08, 
++      0x77, 0x11, 0x00, 0x57, 0x80, 0x81, 0x77, 0x11, 
++      0x00, 0x55, 0x10, 0xe2, 0x00, 0x4a, 0x80, 0x81, 
++      0x77, 0x11, 0x00, 0x57, 0x10, 0xe6, 0x00, 0x09, 
++      0x80, 0x81, 0xf2, 0x73, 0x14, 0x52, 0x77, 0x11, 
++      0x03, 0xc0, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82, 
++      0xf0, 0x00, 0x00, 0x07, 0x88, 0x13, 0xf4, 0x95, 
++      0xf4, 0x95, 0x96, 0x1b, 0xf8, 0x30, 0x14, 0x52, 
++      0x10, 0xe3, 0x00, 0x35, 0x77, 0x12, 0x00, 0x55, 
++      0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
++      0x00, 0x04, 0x80, 0x82, 0x77, 0x12, 0x00, 0x55, 
++      0x10, 0xe3, 0x00, 0x37, 0x80, 0x82, 0x77, 0x12, 
++      0x00, 0x57, 0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 
++      0x48, 0x11, 0xf0, 0x40, 0x00, 0x10, 0xf2, 0x73, 
++      0x14, 0x50, 0xf0, 0x40, 0x00, 0x20, 0x77, 0x12, 
++      0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07, 
++      0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0d, 
++      0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x34, 
++      0x77, 0x13, 0x00, 0x55, 0x80, 0x83, 0x77, 0x13, 
++      0x00, 0x57, 0x10, 0xe6, 0x00, 0x02, 0x80, 0x83, 
++      0x10, 0xe2, 0x00, 0x36, 0x77, 0x12, 0x00, 0x55, 
++      0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
++      0x00, 0x03, 0x80, 0x82, 0x48, 0x11, 0xf0, 0x40, 
++      0x00, 0x04, 0xf2, 0x73, 0x14, 0x50, 0xf0, 0x40, 
++      0x00, 0x08, 0x77, 0x12, 0x00, 0x7b, 0x10, 0x82, 
++      0xf0, 0x00, 0x00, 0x07, 0x88, 0x12, 0xf4, 0x95, 
++      0xf4, 0x95, 0x96, 0x0e, 0xf8, 0x30, 0x14, 0x52, 
++      0x10, 0xe2, 0x00, 0x33, 0x77, 0x12, 0x00, 0x55, 
++      0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0x10, 0xe6, 
++      0x00, 0x01, 0x80, 0x82, 0x48, 0x11, 0xf2, 0x73, 
++      0x14, 0x50, 0xf0, 0x40, 0x00, 0x02, 0x77, 0x12, 
++      0x00, 0x7b, 0x10, 0x82, 0xf0, 0x00, 0x00, 0x07, 
++      0x88, 0x12, 0xf4, 0x95, 0xf4, 0x95, 0x96, 0x0f, 
++      0xf8, 0x30, 0x14, 0x52, 0x10, 0xe2, 0x00, 0x32, 
++      0x77, 0x12, 0x00, 0x55, 0x77, 0x13, 0x00, 0x57, 
++      0x80, 0x82, 0x48, 0x11, 0xe7, 0x62, 0xf0, 0x40, 
++      0x00, 0x01, 0xe5, 0x01, 0x88, 0x11, 0xf4, 0x95, 
++      0x77, 0x12, 0x00, 0x7b, 0x48, 0x11, 0x71, 0x82, 
++      0x00, 0x12, 0x1a, 0xe2, 0x00, 0x07, 0x80, 0xe2, 
++      0x00, 0x07, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
++      0x8a, 0x17, 0x48, 0x11, 0x8a, 0x16, 0x8a, 0x11, 
++      0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0x77, 0x0e, 
++      0x00, 0x05, 0x77, 0x12, 0x00, 0x55, 0xe8, 0x04, 
++      0xf6, 0xb8, 0x28, 0xe1, 0x00, 0x02, 0xee, 0xff, 
++      0x80, 0x82, 0x77, 0x12, 0x00, 0x57, 0xf0, 0x20, 
++      0x80, 0x00, 0xee, 0x01, 0x1a, 0x82, 0x77, 0x12, 
++      0x00, 0x57, 0x80, 0x82, 0xe8, 0x01, 0x32, 0xe1, 
++      0x00, 0x02, 0xf5, 0x82, 0x77, 0x11, 0x00, 0x54, 
++      0xf6, 0x93, 0x18, 0x81, 0x77, 0x11, 0x00, 0x54, 
++      0xf2, 0xa0, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
++      0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 
++      0x71, 0x04, 0x00, 0x11, 0xfb, 0x80, 0x16, 0xa2, 
++      0x88, 0x16, 0xf4, 0x95, 0x77, 0x12, 0x00, 0x55, 
++      0x10, 0xe6, 0x00, 0x03, 0x80, 0x82, 0x77, 0x12, 
++      0x00, 0x56, 0x10, 0xe1, 0x00, 0x02, 0x77, 0x13, 
++      0x00, 0x56, 0x80, 0x82, 0x77, 0x12, 0x00, 0x56, 
++      0x10, 0xe1, 0x00, 0x03, 0x80, 0x82, 0x10, 0xe1, 
++      0x00, 0x04, 0x77, 0x12, 0x00, 0x56, 0x80, 0x82, 
++      0x77, 0x12, 0x00, 0x56, 0x10, 0xe1, 0x00, 0x01, 
++      0x80, 0x82, 0xe7, 0x12, 0xe5, 0x01, 0xf9, 0x80, 
++      0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 
++      0x4a, 0x11, 0x4a, 0x16, 0x4a, 0x17, 0xee, 0xf9, 
++      0x77, 0x11, 0x00, 0x7b, 0x76, 0x00, 0x00, 0x16, 
++      0x76, 0x01, 0x00, 0x17, 0x76, 0x02, 0x00, 0x1a, 
++      0x76, 0x03, 0x00, 0x1b, 0x76, 0x04, 0x00, 0x1c, 
++      0x76, 0x05, 0x00, 0x1d, 0x71, 0x81, 0x00, 0x17, 
++      0x71, 0xe7, 0x00, 0x06, 0x00, 0x11, 0x10, 0x81, 
++      0xf8, 0x44, 0x14, 0xdf, 0xf9, 0x80, 0x16, 0x53, 
++      0xf6, 0xb8, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x20, 
++      0xff, 0xff, 0xf6, 0xb8, 0xfb, 0x80, 0x16, 0x08, 
++      0xf0, 0x20, 0xff, 0xff, 0x77, 0x11, 0x00, 0x7b, 
++      0x71, 0x81, 0x00, 0x17, 0x76, 0xe7, 0x00, 0x06, 
++      0x00, 0x01, 0x48, 0x17, 0x77, 0x16, 0x00, 0x00, 
++      0x77, 0x10, 0x00, 0x04, 0x77, 0x15, 0x00, 0x03, 
++      0x77, 0x14, 0x00, 0x02, 0x77, 0x13, 0x00, 0x01, 
++      0xf0, 0x00, 0x00, 0x39, 0x76, 0xe7, 0x00, 0x08, 
++      0x00, 0x1f, 0x76, 0xe7, 0x00, 0x07, 0x00, 0x00, 
++      0x88, 0x0e, 0x77, 0x1a, 0x00, 0x05, 0x48, 0x17, 
++      0xf0, 0x00, 0x00, 0x09, 0x88, 0x12, 0x48, 0x18, 
++      0x88, 0x19, 0xe8, 0x00, 0xf0, 0x72, 0x15, 0x2c, 
++      0x73, 0x19, 0x00, 0x11, 0x76, 0x82, 0x00, 0x00, 
++      0x11, 0x91, 0x73, 0x11, 0x00, 0x19, 0x70, 0xe2, 
++      0x00, 0x03, 0x00, 0x16, 0x70, 0xe2, 0x00, 0x04, 
++      0x00, 0x13, 0x70, 0xe2, 0x00, 0x05, 0x00, 0x14, 
++      0x81, 0xe2, 0x00, 0x01, 0x70, 0xe2, 0x00, 0x06, 
++      0x00, 0x15, 0x70, 0xe2, 0x00, 0x07, 0x00, 0x10, 
++      0x80, 0xe2, 0x00, 0x02, 0x73, 0x0e, 0x00, 0x11, 
++      0xf1, 0x00, 0x00, 0x1e, 0x6d, 0xee, 0x00, 0x05, 
++      0x6d, 0xeb, 0x00, 0x05, 0x6d, 0xec, 0x00, 0x05, 
++      0x6d, 0xed, 0x00, 0x05, 0x6d, 0xe8, 0x00, 0x05, 
++      0xf0, 0x00, 0x00, 0x01, 0x81, 0x91, 0x6d, 0xea, 
++      0x00, 0x08, 0x73, 0x11, 0x00, 0x0e, 0xee, 0x07, 
++      0x76, 0xe7, 0x00, 0x41, 0x00, 0x24, 0x76, 0xe7, 
++      0x00, 0x46, 0x00, 0x25, 0x76, 0xe7, 0x00, 0x4b, 
++      0x00, 0x26, 0x76, 0xe7, 0x00, 0x50, 0x00, 0x27, 
++      0x8a, 0x17, 0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 
++      0x4a, 0x11, 0x4a, 0x16, 0xee, 0xfe, 0x88, 0x11, 
++      0x56, 0x06, 0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 
++      0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 0xf0, 0x10, 
++      0xff, 0xff, 0xfa, 0x45, 0x15, 0x60, 0x77, 0x16, 
++      0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 0x49, 0x11, 
++      0x10, 0x82, 0xf6, 0x03, 0xf0, 0x00, 0x00, 0x09, 
++      0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
++      0xf8, 0x44, 0x15, 0x71, 0xf2, 0x73, 0x15, 0x71, 
++      0xf4, 0x95, 0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 
++      0x10, 0x81, 0xf0, 0x00, 0x00, 0x09, 0x88, 0x11, 
++      0xf4, 0x95, 0x77, 0x12, 0x00, 0x06, 0x10, 0x81, 
++      0xf8, 0x45, 0x15, 0x5c, 0x6e, 0xea, 0xff, 0xff, 
++      0x15, 0x69, 0x6d, 0xe9, 0x00, 0x08, 0x76, 0x86, 
++      0x00, 0x01, 0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 
++      0x10, 0xf8, 0x00, 0x0b, 0xf8, 0x45, 0x15, 0x7e, 
++      0xfb, 0x80, 0x15, 0x85, 0xf4, 0x95, 0x48, 0x16, 
++      0xf9, 0x80, 0x16, 0x9a, 0xee, 0x02, 0x48, 0x16, 
++      0x8a, 0x16, 0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 
++      0xee, 0xff, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
++      0xf4, 0x95, 0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 
++      0xf8, 0x30, 0x15, 0xc4, 0x10, 0xe1, 0x00, 0x03, 
++      0x77, 0x12, 0x00, 0x55, 0x80, 0x82, 0x77, 0x12, 
++      0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
++      0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
++      0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
++      0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x77, 0x12, 
++      0x00, 0x56, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
++      0x00, 0x02, 0xf0, 0x00, 0x00, 0x08, 0x32, 0xf8, 
++      0x00, 0x08, 0x77, 0x12, 0x00, 0x54, 0xe8, 0x01, 
++      0xf4, 0x82, 0xf4, 0x93, 0x18, 0x82, 0x77, 0x12, 
++      0x00, 0x54, 0xf0, 0x40, 0x00, 0x00, 0x80, 0x82, 
++      0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x76, 
++      0x10, 0xe1, 0x00, 0x01, 0xf9, 0x80, 0x16, 0x66, 
++      0xf0, 0x73, 0x16, 0x03, 0x77, 0x11, 0x00, 0x7b, 
++      0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 0x00, 0x07, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
++      0x00, 0x09, 0xf9, 0x80, 0x15, 0x85, 0x77, 0x11, 
++      0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
++      0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
++      0x00, 0x08, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81, 
++      0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80, 
++      0x15, 0x85, 0xf0, 0x00, 0x00, 0x10, 0x77, 0x11, 
++      0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
++      0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
++      0x00, 0x18, 0x77, 0x11, 0x00, 0x7b, 0x71, 0x81, 
++      0x00, 0x11, 0x10, 0xe1, 0x00, 0x09, 0xfb, 0x80, 
++      0x15, 0x85, 0xf0, 0x00, 0x00, 0x20, 0x77, 0x11, 
++      0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x10, 0xe1, 
++      0x00, 0x09, 0xfb, 0x80, 0x15, 0x85, 0xf0, 0x00, 
++      0x00, 0x28, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
++      0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 
++      0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 
++      0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 
++      0x16, 0x41, 0x77, 0x11, 0x00, 0x55, 0x76, 0x81, 
++      0x00, 0x1e, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0x76, 0x81, 
++      0x00, 0x00, 0x77, 0x11, 0x00, 0x56, 0xf2, 0x73, 
++      0x16, 0x4e, 0x76, 0x81, 0x00, 0x00, 0x77, 0x11, 
++      0x00, 0x7b, 0x71, 0x81, 0x00, 0x11, 0x71, 0xe1, 
++      0x00, 0x07, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 
++      0x10, 0xe1, 0x00, 0x39, 0xf9, 0x80, 0x16, 0x08, 
++      0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 
++      0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 
++      0x10, 0x81, 0xf0, 0x00, 0x00, 0x04, 0x88, 0x11, 
++      0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 
++      0x16, 0x63, 0xf4, 0x95, 0xee, 0xff, 0x76, 0x81, 
++      0x00, 0x01, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4, 
++      0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8, 
++      0x00, 0x08, 0xee, 0xff, 0x77, 0x11, 0x00, 0x01, 
++      0xe8, 0x01, 0xee, 0x01, 0xf4, 0x82, 0x1a, 0x81, 
++      0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++      0xf0, 0x10, 0x00, 0x10, 0x4a, 0x11, 0x32, 0xf8, 
++      0x00, 0x08, 0xee, 0xff, 0xe8, 0x01, 0x77, 0x11, 
++      0x00, 0x00, 0xf4, 0x82, 0xee, 0x01, 0xf4, 0x93, 
++      0x18, 0x81, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
++      0xf4, 0xe4, 0x4a, 0x11, 0xf0, 0x10, 0x00, 0x10, 
++      0x77, 0x11, 0x00, 0x00, 0x32, 0xf8, 0x00, 0x08, 
++      0xee, 0xff, 0x11, 0x81, 0xe8, 0x01, 0xee, 0x01, 
++      0x77, 0x11, 0x00, 0x00, 0xf4, 0x82, 0xf2, 0xa0, 
++      0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++      0xf2, 0x73, 0x16, 0x9e, 0xf6, 0xbb, 0xf4, 0x95, 
++      0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4, 
++      0xf2, 0x73, 0x16, 0xa6, 0xf7, 0xbb, 0xf4, 0x95, 
++      0xf4, 0x95, 0xf4, 0x95, 0xf4, 0x95, 0xf4, 0xe4, 
++      0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 0x71, 0x04, 
++      0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
++      0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x0e, 0x10, 0xe6, 0x00, 0x0e, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 
++      0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x0d, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
++      0x10, 0xe6, 0x00, 0x0d, 0x80, 0x82, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0c, 
++      0x10, 0xe6, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 0x10, 0xe6, 
++      0x00, 0x0b, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
++      0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x10, 0xe6, 0x00, 0x0a, 0x80, 0x82, 
++      0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x09, 0x10, 0xe6, 0x00, 0x09, 0x71, 0xe1, 
++      0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x08, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 
++      0x00, 0x08, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 0x10, 0xe6, 
++      0x00, 0x07, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
++      0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x10, 0xe6, 0x00, 0x06, 0x80, 0x82, 
++      0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x05, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 
++      0x10, 0xe6, 0x00, 0x05, 0x80, 0x82, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x04, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 
++      0x00, 0x04, 0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 0x71, 0xe1, 
++      0x00, 0x06, 0x00, 0x12, 0x10, 0xe6, 0x00, 0x03, 
++      0x80, 0x82, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x02, 0x10, 0xe6, 0x00, 0x02, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 
++      0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x01, 0x10, 0xe6, 0x00, 0x01, 0x71, 0xe1, 
++      0x00, 0x06, 0x00, 0x12, 0x80, 0x82, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x13, 0xe7, 0x62, 
++      0xe5, 0x01, 0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 
++      0x8a, 0x11, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 
++      0xf4, 0x95, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 
++      0x00, 0x12, 0xee, 0xff, 0x76, 0x82, 0x00, 0x00, 
++      0xee, 0x01, 0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 
++      0x69, 0x81, 0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 
++      0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xf4, 0x95, 
++      0xf4, 0x95, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0xee, 0xff, 0x76, 0x82, 0x00, 0x01, 0xee, 0x01, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x11, 0x69, 0x81, 
++      0x00, 0x01, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++      0x4a, 0x11, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
++      0xf0, 0x00, 0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 
++      0xf4, 0x95, 0x10, 0x81, 0xfa, 0x44, 0x17, 0x9c, 
++      0xf4, 0x95, 0xee, 0xff, 0xf9, 0x80, 0x16, 0x53, 
++      0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 
++      0x00, 0x94, 0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 
++      0x76, 0x81, 0x00, 0x01, 0xee, 0x01, 0x76, 0xe1, 
++      0x00, 0x01, 0x00, 0x00, 0x76, 0xe1, 0x00, 0x02, 
++      0x00, 0x21, 0x76, 0xe1, 0x00, 0x03, 0x00, 0x20, 
++      0x76, 0xe1, 0x00, 0x04, 0x00, 0x23, 0x76, 0xe1, 
++      0x00, 0x05, 0x00, 0x22, 0x76, 0xe1, 0x00, 0x06, 
++      0x00, 0x38, 0x76, 0xe1, 0x00, 0x07, 0x00, 0x39, 
++      0x76, 0xe1, 0x00, 0x08, 0x00, 0x15, 0x76, 0xe1, 
++      0x00, 0x09, 0x00, 0x14, 0x76, 0xe1, 0x00, 0x0a, 
++      0x00, 0x00, 0x76, 0xe1, 0x00, 0x0b, 0x00, 0x41, 
++      0x76, 0xe1, 0x00, 0x0c, 0x00, 0x40, 0x76, 0xe1, 
++      0x00, 0x0d, 0x00, 0x43, 0x76, 0xe1, 0x00, 0x0e, 
++      0x00, 0x42, 0x76, 0xe1, 0x00, 0x0f, 0x00, 0x48, 
++      0x76, 0xe1, 0x00, 0x10, 0x00, 0x49, 0x76, 0xe1, 
++      0x00, 0x11, 0x00, 0x1b, 0x76, 0xe1, 0x00, 0x12, 
++      0x00, 0x1a, 0x8a, 0x11, 0xf4, 0x95, 0xf4, 0xe4, 
++      0x4a, 0x11, 0xee, 0xfd, 0x88, 0x11, 0x56, 0x06, 
++      0x4e, 0x00, 0xf9, 0x80, 0x16, 0xa2, 0x77, 0x12, 
++      0x00, 0x7b, 0x77, 0x0e, 0x00, 0x09, 0x10, 0x82, 
++      0x28, 0xf8, 0x00, 0x11, 0xf0, 0x00, 0x00, 0x95, 
++      0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
++      0xf8, 0x45, 0x17, 0xf0, 0xf2, 0x73, 0x17, 0xfd, 
++      0x77, 0x11, 0xff, 0xff, 0x76, 0x81, 0x00, 0x01, 
++      0xe9, 0x01, 0x56, 0x00, 0xf1, 0x80, 0x10, 0xf8, 
++      0x00, 0x0b, 0xf8, 0x45, 0x17, 0xfd, 0xfb, 0x80, 
++      0x18, 0x10, 0xf4, 0x95, 0x48, 0x11, 0xf9, 0x80, 
++      0x16, 0x9a, 0xee, 0x03, 0x48, 0x11, 0x8a, 0x11, 
++      0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 
++      0xf4, 0x95, 0xee, 0xff, 0x71, 0xe1, 0x00, 0x01, 
++      0x00, 0x11, 0xee, 0x01, 0x10, 0x81, 0x8a, 0x11, 
++      0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 
++      0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 
++      0x77, 0x10, 0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 
++      0x18, 0xc3, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x02, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x03, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x04, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x05, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x06, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x01, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x07, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++      0x20, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x08, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x09, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x0a, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0b, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x0c, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x71, 0xe1, 
++      0x00, 0x05, 0x00, 0x12, 0x76, 0x82, 0x00, 0x0d, 
++      0x71, 0xe1, 0x00, 0x06, 0x00, 0x12, 0x76, 0x82, 
++      0x00, 0x00, 0x71, 0xe1, 0x00, 0x05, 0x00, 0x12, 
++      0x76, 0x82, 0x00, 0x0e, 0x71, 0xe1, 0x00, 0x06, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x00, 0x10, 0xe1, 
++      0x00, 0x07, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1, 
++      0x00, 0x08, 0xf9, 0x80, 0x16, 0x76, 0x10, 0xe1, 
++      0x00, 0x07, 0xf9, 0x80, 0x16, 0x66, 0x10, 0xe1, 
++      0x00, 0x08, 0xf9, 0x80, 0x16, 0x66, 0xf0, 0x73, 
++      0x18, 0xd1, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
++      0xfb, 0x80, 0x18, 0x10, 0xf0, 0x00, 0x00, 0x95, 
++      0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 0xfb, 0x80, 
++      0x18, 0x10, 0xf0, 0x00, 0x00, 0x9e, 0xf9, 0x80, 
++      0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 0xf4, 0xe4, 
++      0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 0xf4, 0x95, 
++      0x10, 0x04, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x11, 
++      0xee, 0x01, 0x80, 0x81, 0x8a, 0x11, 0xf4, 0x95, 
++      0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 0xf4, 0x95, 
++      0x71, 0x04, 0x00, 0x16, 0xfb, 0x80, 0x16, 0xa2, 
++      0x88, 0x11, 0xf4, 0x95, 0x71, 0xe1, 0x00, 0x02, 
++      0x00, 0x12, 0x76, 0x82, 0x00, 0x10, 0x10, 0xe6, 
++      0x00, 0x01, 0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 
++      0x80, 0x82, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12, 
++      0x10, 0xe6, 0x00, 0x02, 0x80, 0x82, 0xe7, 0x62, 
++      0x71, 0xe1, 0x00, 0x02, 0x00, 0x13, 0xe5, 0x01, 
++      0xf9, 0x80, 0x16, 0x9a, 0x8a, 0x16, 0x8a, 0x11, 
++      0xf4, 0xe4, 0x4a, 0x11, 0x88, 0x11, 0xee, 0xff, 
++      0xee, 0x01, 0x10, 0xe1, 0x00, 0x01, 0x8a, 0x11, 
++      0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x77, 0x11, 
++      0x00, 0x7b, 0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 
++      0x88, 0x11, 0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 
++      0xfa, 0x44, 0x19, 0x2a, 0xf4, 0x95, 0xee, 0xff, 
++      0xf9, 0x80, 0x16, 0x53, 0x77, 0x11, 0x00, 0x7b, 
++      0x10, 0x81, 0xf0, 0x00, 0x00, 0xb3, 0x88, 0x11, 
++      0xf4, 0x95, 0xf4, 0x95, 0x76, 0x81, 0x00, 0x01, 
++      0xee, 0x01, 0x76, 0xe1, 0x00, 0x01, 0x00, 0x00, 
++      0x76, 0xe1, 0x00, 0x02, 0x00, 0x13, 0x76, 0xe1, 
++      0x00, 0x03, 0x00, 0x26, 0x76, 0xe1, 0x00, 0x04, 
++      0x00, 0x25, 0x76, 0xe1, 0x00, 0x05, 0x00, 0x24, 
++      0x76, 0xe1, 0x00, 0x06, 0x00, 0x00, 0x76, 0xe1, 
++      0x00, 0x07, 0x00, 0x17, 0x76, 0xe1, 0x00, 0x08, 
++      0x00, 0x32, 0x76, 0xe1, 0x00, 0x09, 0x00, 0x31, 
++      0x76, 0xe1, 0x00, 0x0a, 0x00, 0x30, 0x8a, 0x11, 
++      0xf4, 0x95, 0xf4, 0xe4, 0x4a, 0x11, 0x4a, 0x16, 
++      0x4a, 0x17, 0xee, 0xff, 0xf4, 0x95, 0x71, 0x06, 
++      0x00, 0x17, 0xfb, 0x80, 0x16, 0xa2, 0x88, 0x11, 
++      0xf4, 0x95, 0xf7, 0xb8, 0x10, 0xf8, 0x00, 0x11, 
++      0xf0, 0x10, 0xff, 0xff, 0xfa, 0x45, 0x19, 0x73, 
++      0x77, 0x16, 0xff, 0xff, 0x77, 0x12, 0x00, 0x7b, 
++      0x77, 0x0e, 0x00, 0x05, 0x10, 0x82, 0x28, 0xf8, 
++      0x00, 0x11, 0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 
++      0xf4, 0x95, 0xf4, 0x95, 0x10, 0x81, 0xf8, 0x44, 
++      0x19, 0x84, 0xf2, 0x73, 0x19, 0x84, 0xf4, 0x95, 
++      0xe7, 0x16, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
++      0xf0, 0x00, 0x00, 0xb4, 0x88, 0x11, 0xf4, 0x95, 
++      0x77, 0x12, 0x00, 0x02, 0x10, 0x81, 0xf8, 0x45, 
++      0x19, 0x6f, 0x6e, 0xea, 0xff, 0xff, 0x19, 0x7c, 
++      0x6d, 0xe9, 0x00, 0x05, 0x61, 0xf8, 0x00, 0x17, 
++      0x00, 0x01, 0xfa, 0x20, 0x19, 0x8f, 0x76, 0x86, 
++      0x00, 0x01, 0xfb, 0x80, 0x19, 0x97, 0xf4, 0x95, 
++      0x48, 0x16, 0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 
++      0x8a, 0x17, 0x48, 0x16, 0x8a, 0x16, 0x8a, 0x11, 
++      0xf4, 0xe4, 0x4a, 0x11, 0xee, 0xff, 0xfb, 0x80, 
++      0x16, 0xa2, 0x88, 0x11, 0xf4, 0x95, 0x77, 0x10, 
++      0xff, 0xff, 0xf4, 0xa9, 0xf8, 0x30, 0x19, 0xcc, 
++      0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 0x69, 0x82, 
++      0x00, 0x10, 0x71, 0xe1, 0x00, 0x02, 0x00, 0x12, 
++      0x68, 0x82, 0xf7, 0xff, 0x71, 0xe1, 0x00, 0x02, 
++      0x00, 0x12, 0x68, 0x82, 0xfb, 0xff, 0x71, 0xe1, 
++      0x00, 0x02, 0x00, 0x12, 0x68, 0x82, 0xff, 0xf0, 
++      0x71, 0xe1, 0x00, 0x03, 0x00, 0x12, 0x76, 0x82, 
++      0xff, 0xff, 0x71, 0xe1, 0x00, 0x04, 0x00, 0x12, 
++      0x76, 0x82, 0xff, 0xff, 0x71, 0xe1, 0x00, 0x02, 
++      0x00, 0x12, 0x69, 0x82, 0x00, 0x20, 0x71, 0xe1, 
++      0x00, 0x02, 0x00, 0x11, 0xf2, 0x73, 0x19, 0xda, 
++      0x68, 0x81, 0xff, 0xef, 0x77, 0x11, 0x00, 0x7b, 
++      0x10, 0x81, 0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 
++      0x00, 0xb4, 0x77, 0x11, 0x00, 0x7b, 0x10, 0x81, 
++      0xfb, 0x80, 0x19, 0x97, 0xf0, 0x00, 0x00, 0xb9, 
++      0xf9, 0x80, 0x16, 0x9a, 0xee, 0x01, 0x8a, 0x11, 
++      0xf4, 0xe4, 0x00, 0xa4, 0x00, 0x00, 0x19, 0xdf, 
++      0x00, 0x01, 0x2a, 0xe6, 0x00, 0x00, 0x00, 0x01, 
++      0x2a, 0xe7, 0x00, 0x00, 0x00, 0x03, 0x2a, 0x12, 
++      0x0c, 0x01, 0xc3, 0x4f, 0x00, 0x00, 0x00, 0x01, 
++      0x2a, 0x15, 0x00, 0x00, 0x00, 0x02, 0x2a, 0x16, 
++      0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x2a, 0x5d, 
++      0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 
++      0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 
++      0x00, 0x74, 0x00, 0x20, 0x00, 0x54, 0x00, 0x65, 
++      0x00, 0x63, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x6f, 
++      0x00, 0x54, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 
++      0x00, 0x64, 0x00, 0x20, 0x00, 0x41, 0x00, 0x47, 
++      0x00, 0x00, 0x00, 0x04, 0x2a, 0x76, 0x00, 0x30, 
++      0x00, 0x2e, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0c, 
++      0x2a, 0x7a, 0x00, 0x46, 0x00, 0x65, 0x00, 0x62, 
++      0x00, 0x20, 0x00, 0x32, 0x00, 0x37, 0x00, 0x20, 
++      0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 
++      0x00, 0x00, 0x00, 0x09, 0x2a, 0x86, 0x00, 0x31, 
++      0x00, 0x34, 0x00, 0x3a, 0x00, 0x33, 0x00, 0x35, 
++      0x00, 0x3a, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 
++      0x00, 0x0f, 0x2a, 0x8f, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 
++      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x00, 0x00, 0x01, 0x2a, 0x9e, 0x00, 0x00, 
++      0x00, 0x01, 0x2a, 0x9f, 0x00, 0x00, 0x00, 0x01, 
++      0x2a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x2a, 0xa1, 
++      0x00, 0x00, 0x00, 0x01, 0x2a, 0xa2, 0x00, 0x00, 
++      0x00, 0x01, 0x29, 0x7e, 0x00, 0x00, 0x00, 0x02, 
++      0x29, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
++      0x29, 0x82, 0xff, 0xff, 0x00, 0x01, 0x2a, 0xa7, 
++      0x00, 0x00, 0x00, 0x05, 0x2a, 0xa8, 0x71, 0x41, 
++      0x20, 0x00, 0x20, 0x00, 0x00, 0x23, 0x04, 0x00, 
++      0x00, 0x0a, 0x2a, 0xad, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x0f, 0x2a, 0xb7, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x00, 0x00, 0x40, 0x00, 0xa0, 0x82, 0x40, 
++      0x00, 0x08, 0x30, 0x7f, 0x00, 0x80, 0x01, 0x80, 
++      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x00, 0x00, 0x01, 0x27, 0x6e, 0x00, 0x00, 
++      0x00, 0x01, 0x27, 0x6f, 0x00, 0x00, 0x00, 0x00, 
++      0x00, 0x09, 0x00, 0x00, 0x1a, 0x83, 0x04, 0xe8, 
++      0x04, 0xcf, 0x04, 0xc5, 0x04, 0xba, 0x04, 0xb0, 
++      0x04, 0xac, 0x04, 0x9c, 0x04, 0x8c, 0x04, 0x81, 
++      0x00, 0x78, 0x00, 0x00, 0x01, 0x00, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xaa, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x02, 0x23, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x05, 0xe5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x02, 0xb5, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x0e, 0x33, 0xf4, 0x95, 0xf4, 0x95, 0xf2, 0x73, 
++      0x07, 0xef, 0xf4, 0x95, 0xf4, 0x95, 0x00, 0x00, 
++};
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-budget/Kconfig  2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,11 @@
++config DVB_TTUSB_BUDGET
++      tristate "Technotrend/Hauppauge Nova-USB devices"
++      depends on DVB_CORE && USB
++      help
++        Support for external USB adapters designed by Technotrend and
++        produced by Hauppauge, shipped under the brand name 'Nova-USB'.
++
++          These devices don't have a MPEG decoder built in, so you need
++        an external software decoder to watch TV.       
++
++        Say Y if you own such a device and want to use it.
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-budget/Makefile 2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,3 @@
++obj-$(CONFIG_DVB_TTUSB_BUDGET) += dvb-ttusb-budget.o
++
++EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/dec2000_frontend.c  2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,180 @@
++/*
++ * TTUSB DEC-2000-t Frontend
++ *
++ * Copyright (C) 2003 Alex Woods <linux-dvb@giblets.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++
++#include "dvb_frontend.h"
++#include "dvb_functions.h"
++
++static int debug = 0;
++
++#define dprintk       if (debug) printk
++
++static struct dvb_frontend_info dec2000_frontend_info = {
++      name:                   "TechnoTrend/Hauppauge DEC-2000-t Frontend",
++      type:                   FE_OFDM,
++      frequency_min:          51000000,
++      frequency_max:          858000000,
++      frequency_stepsize:     62500,
++      caps:   FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
++              FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
++              FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
++              FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
++              FE_CAN_HIERARCHY_AUTO,
++};
++
++static int dec2000_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
++                                void *arg)
++{
++      dprintk("%s\n", __FUNCTION__);
++
++      switch (cmd) {
++
++      case FE_GET_INFO:
++              dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
++              memcpy(arg, &dec2000_frontend_info,
++                     sizeof (struct dvb_frontend_info));
++              break;
++
++      case FE_READ_STATUS: {
++                      fe_status_t *status = (fe_status_t *)arg;
++                      dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
++                      *status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
++                                FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
++                      break;
++              }
++
++      case FE_READ_BER: {
++                      u32 *ber = (u32 *)arg;
++                      dprintk("%s: FE_READ_BER\n", __FUNCTION__);
++                      *ber = 0;
++                      return -ENOSYS;
++                      break;
++              }
++
++      case FE_READ_SIGNAL_STRENGTH: {
++                      dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
++                      *(s32 *)arg = 0xFF;
++                      return -ENOSYS;
++                      break;
++              }
++
++      case FE_READ_SNR:
++              dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
++              *(s32 *)arg = 0;
++              return -ENOSYS;
++              break;
++
++      case FE_READ_UNCORRECTED_BLOCKS:
++              dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
++              *(u32 *)arg = 0;
++              return -ENOSYS;
++              break;
++
++      case FE_SET_FRONTEND:{
++                      struct dvb_frontend_parameters *p =
++                              (struct dvb_frontend_parameters *)arg;
++                      u8 b[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
++                                 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
++                                 0x00, 0xff, 0x00, 0x00, 0x00, 0xff };
++                      u32 freq;
++                      struct i2c_msg msg = { addr: 0x71, flags: 0, len:20 };
++
++                      dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
++
++                      dprintk("            frequency->%d\n", p->frequency);
++                      dprintk("            symbol_rate->%d\n",
++                              p->u.qam.symbol_rate);
++                      dprintk("            inversion->%d\n", p->inversion);
++
++                      freq = htonl(p->frequency / 1000);
++                      memcpy(&b[4], &freq, sizeof (int));
++                      msg.buf = b;
++                      fe->i2c->xfer(fe->i2c, &msg, 1);
++
++                      break;
++              }
++
++      case FE_GET_FRONTEND:
++              dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
++              break;
++
++      case FE_SLEEP:
++              dprintk("%s: FE_SLEEP\n", __FUNCTION__);
++              return -ENOSYS;
++              break;
++
++      case FE_INIT:
++              dprintk("%s: FE_INIT\n", __FUNCTION__);
++              break;
++
++      case FE_RESET:
++              dprintk("%s: FE_RESET\n", __FUNCTION__);
++              break;
++
++      default:
++              dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
++              return -EINVAL;
++
++      }
++
++      return 0;
++}
++
++static int dec2000_frontend_attach(struct dvb_i2c_bus *i2c)
++{
++      dprintk("%s\n", __FUNCTION__);
++
++      dvb_register_frontend(dec2000_frontend_ioctl, i2c, NULL,
++                            &dec2000_frontend_info);
++
++      return 0;
++}
++
++static void dec2000_frontend_detach(struct dvb_i2c_bus *i2c)
++{
++      dprintk("%s\n", __FUNCTION__);
++
++      dvb_unregister_frontend(dec2000_frontend_ioctl, i2c);
++}
++
++static int __init dec2000_frontend_init(void)
++{
++      return dvb_register_i2c_device(THIS_MODULE, dec2000_frontend_attach,
++                                     dec2000_frontend_detach);
++}
++
++static void __exit dec2000_frontend_exit(void)
++{
++      dvb_unregister_i2c_device(dec2000_frontend_attach);
++}
++
++module_init(dec2000_frontend_init);
++module_exit(dec2000_frontend_exit);
++
++MODULE_DESCRIPTION("TechnoTrend/Hauppauge DEC-2000-t Frontend");
++MODULE_AUTHOR("Alex Woods <linux-dvb@giblets.org");
++MODULE_LICENSE("GPL");
++
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "Debug level");
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/fdump.c     2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,36 @@
++#include <stdio.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <unistd.h>
++
++
++int main (int argc, char **argv)
++{
++      unsigned char buf[8];
++      unsigned int i, count, bytes = 0;
++      int fd;
++
++      if (argc != 3) {
++              fprintf (stderr, "\n\tusage: %s <ucode.bin> <array_name>\n\n",
++                       argv[0]);
++              return -1;
++      }
++
++      fd = open (argv[1], O_RDONLY);
++
++      printf ("\n#include <asm/types.h>\n\nu8 %s [] __initdata = {",
++              argv[2]);
++
++      while ((count = read (fd, buf, 8)) > 0) {
++              printf ("\n\t");
++              for (i=0;i<count;i++, bytes++)
++                      printf ("0x%02x, ", buf[i]);
++      }
++
++      printf ("\n};\n\n");
++      close (fd);
++
++      return 0;
++}
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/Kconfig     2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,24 @@
++config DVB_TTUSB_DEC
++      tristate "Technotrend/Hauppauge USB DEC2000-T devices"
++      depends on DVB_CORE && USB
++      help
++        Support for external USB adapters designed by Technotrend and
++        produced by Hauppauge, shipped under the brand name 'DEC2000-T'.
++
++          Even if these devices have a MPEG decoder built in, they transmit
++        only compressed MPEG data over the USB bus, so you need
++        an external software decoder to watch TV on your computer.      
++
++        Say Y if you own such a device and want to use it.
++
++config DVB_TTUSB_DEC_FIRMWARE_FILE
++      string "Full pathname of dec2000t.bin firmware file"
++      depends on DVB_TTUSB_DEC
++      default "/etc/dvb/dec2000t.bin"
++      help
++        The DEC2000-T requires a firmware in order to boot into a mode in
++        which it is a slave to the PC.  The firmware file can obtained as
++        follows:
++          wget http://hauppauge.lightpath.net/de/dec215a.exe
++          unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_T.bin
++          mv STB_PC_T.bin /etc/dvb/dec2000t.bin
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/Makefile    2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,11 @@
++
++obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o dec2000_frontend.o
++
++EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
++
++host-progs    := fdump
++
++$(obj)/ttusb_dec.o: $(obj)/dsp_dec2000.h
++
++$(obj)/dsp_dec2000.h: $(patsubst "%", %, $(CONFIG_DVB_TTUSB_DEC_FIRMWARE_FILE)) $(obj)/fdump
++      $(obj)/fdump $< dsp_dec2000 > $@
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,991 @@
++/*
++ * TTUSB DEC Driver
++ *
++ * Copyright (C) 2003 Alex Woods <linux-dvb@giblets.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/pci.h>
++#include <linux/slab.h>
++#include <linux/usb.h>
++
++#include "ttusb_dec.h"
++#include "dvb_frontend.h"
++
++static int debug = 0;
++
++#define dprintk       if (debug) printk
++
++static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command,
++                                int param_length, const u8 params[],
++                                int *result_length, u8 cmd_result[])
++{
++      int result, actual_len, i;
++      u8 b[COMMAND_PACKET_SIZE + 4];
++      u8 c[COMMAND_PACKET_SIZE + 4];
++
++      dprintk("%s\n", __FUNCTION__);
++
++      if ((result = down_interruptible(&dec->usb_sem))) {
++              printk("%s: Failed to down usb semaphore.\n", __FUNCTION__);
++              return result;
++      }
++
++      b[0] = 0xaa;
++      b[1] = ++dec->trans_count;
++      b[2] = command;
++      b[3] = param_length;
++
++      if (params)
++              memcpy(&b[4], params, param_length);
++
++      if (debug) {
++              printk("%s: command: ", __FUNCTION__);
++              for (i = 0; i < param_length + 4; i++)
++                      printk("0x%02X ", b[i]);
++              printk("\n");
++      }
++
++      result = usb_bulk_msg(dec->udev, dec->command_pipe, b, sizeof(b),
++                            &actual_len, HZ);
++
++      if (result) {
++              printk("%s: command bulk message failed: error %d\n",
++                     __FUNCTION__, result);
++              up(&dec->usb_sem);
++              return result;
++      }
++
++      result = usb_bulk_msg(dec->udev, dec->result_pipe, c, sizeof(c),
++                            &actual_len, HZ);
++
++      if (result) {
++              printk("%s: result bulk message failed: error %d\n",
++                     __FUNCTION__, result);
++              up(&dec->usb_sem);
++              return result;
++      } else {
++              if (debug) {
++                      printk("%s: result: ", __FUNCTION__);
++                      for (i = 0; i < actual_len; i++)
++                              printk("0x%02X ", c[i]);
++                      printk("\n");
++              }
++
++              if (result_length)
++                      *result_length = c[3];
++              if (cmd_result && c[3] > 0)
++                      memcpy(cmd_result, &c[4], c[3]);
++
++              up(&dec->usb_sem);
++
++              return 0;
++      }
++}
++
++static int ttusb_dec_av_pes2ts_cb(void *priv, unsigned char *data)
++{
++      struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)priv;
++
++      dvbdmxfeed->cb.ts(data, 188, 0, 0, &dvbdmxfeed->feed.ts, DMX_OK);
++
++      return 0;
++}
++
++static void ttusb_dec_set_pids(struct ttusb_dec *dec)
++{
++      u8 b[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
++                 0xff, 0xff };
++
++      u16 pcr = htons(dec->pid[DMX_PES_PCR]);
++      u16 audio = htons(dec->pid[DMX_PES_AUDIO]);
++      u16 video = htons(dec->pid[DMX_PES_VIDEO]);
++
++      dprintk("%s\n", __FUNCTION__);
++
++      memcpy(&b[0], &pcr, 2);
++      memcpy(&b[2], &audio, 2);
++      memcpy(&b[4], &video, 2);
++
++      ttusb_dec_send_command(dec, 0x50, sizeof(b), b, NULL, NULL);
++
++      if (!down_interruptible(&dec->pes2ts_sem)) {
++              dvb_filter_pes2ts_init(&dec->a_pes2ts, dec->pid[DMX_PES_AUDIO],
++                                     ttusb_dec_av_pes2ts_cb, dec->demux.feed);
++              dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO],
++                                     ttusb_dec_av_pes2ts_cb, dec->demux.feed);
++
++              up(&dec->pes2ts_sem);
++      }
++}
++
++static int ttusb_dec_i2c_master_xfer(struct dvb_i2c_bus *i2c,
++                                   const struct i2c_msg msgs[], int num)
++{
++      int result, i;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      for (i = 0; i < num; i++)
++              if ((result = ttusb_dec_send_command(i2c->data, msgs[i].addr,
++                                                   msgs[i].len, msgs[i].buf,
++                                                   NULL, NULL)))
++                      return result;
++
++      return 0;
++}
++
++static void ttusb_dec_process_av_pes(struct ttusb_dec * dec, u8 * av_pes,
++                                   int length)
++{
++      int i;
++      u16 csum = 0;
++      u8 c;
++
++      if (length < 16) {
++              printk("%s: packet too short.\n", __FUNCTION__);
++              return;
++      }
++
++      for (i = 0; i < length; i += 2) {
++              csum ^= le16_to_cpup((u16 *)(av_pes + i));
++              c = av_pes[i];
++              av_pes[i] = av_pes[i + 1];
++              av_pes[i + 1] = c;
++      }
++
++      if (csum) {
++              printk("%s: checksum failed.\n", __FUNCTION__);
++              return;
++      }
++
++      if (length > 8 + MAX_AV_PES_LENGTH + 4) {
++              printk("%s: packet too long.\n", __FUNCTION__);
++              return;
++      }
++
++      if (!(av_pes[0] == 'A' && av_pes[1] == 'V')) {
++              printk("%s: invalid AV_PES packet.\n", __FUNCTION__);
++              return;
++      }
++
++      switch (av_pes[2]) {
++
++      case 0x01: {            /* VideoStream */
++                      int prebytes = av_pes[5] & 0x03;
++                      int postbytes = (av_pes[5] & 0x0c) >> 2;
++                      u16 v_pes_payload_length;
++
++                      if (dec->v_pes_postbytes > 0 &&
++                          dec->v_pes_postbytes == prebytes) {
++                              memcpy(&dec->v_pes[dec->v_pes_length],
++                                     &av_pes[12], prebytes);
++
++                              if (!down_interruptible(&dec->pes2ts_sem)) {
++                                      dvb_filter_pes2ts(&dec->v_pes2ts,
++                                                        dec->v_pes,
++                                                        dec->v_pes_length +
++                                                        prebytes);
++
++                                      up(&dec->pes2ts_sem);
++                              }
++                      }
++
++                      if (av_pes[5] & 0x10) {
++                              dec->v_pes[7] = 0x80;
++                              dec->v_pes[8] = 0x05;
++
++                              dec->v_pes[9] = 0x21 |
++                                              ((av_pes[8] & 0xc0) >> 5);
++                              dec->v_pes[10] = ((av_pes[8] & 0x3f) << 2) |
++                                               ((av_pes[9] & 0xc0) >> 6);
++                              dec->v_pes[11] = 0x01 |
++                                               ((av_pes[9] & 0x3f) << 2) |
++                                               ((av_pes[10] & 0x80) >> 6);
++                              dec->v_pes[12] = ((av_pes[10] & 0x7f) << 1) |
++                                               ((av_pes[11] & 0xc0) >> 7);
++                              dec->v_pes[13] = 0x01 |
++                                               ((av_pes[11] & 0x7f) << 1);
++
++                              memcpy(&dec->v_pes[14], &av_pes[12 + prebytes],
++                                     length - 16 - prebytes);
++                              dec->v_pes_length = 14 + length - 16 - prebytes;
++                      } else {
++                              dec->v_pes[7] = 0x00;
++                              dec->v_pes[8] = 0x00;
++
++                              memcpy(&dec->v_pes[9], &av_pes[8], length - 12);
++                              dec->v_pes_length = 9 + length - 12;
++                      }
++
++                      dec->v_pes_postbytes = postbytes;
++
++                      if (dec->v_pes[9 + dec->v_pes[8]] == 0x00 &&
++                          dec->v_pes[10 + dec->v_pes[8]] == 0x00 &&
++                          dec->v_pes[11 + dec->v_pes[8]] == 0x01)
++                              dec->v_pes[6] = 0x84;
++                      else
++                              dec->v_pes[6] = 0x80;
++
++                      v_pes_payload_length = htons(dec->v_pes_length - 6 +
++                                                   postbytes);
++                      memcpy(&dec->v_pes[4], &v_pes_payload_length, 2);
++
++                      if (postbytes == 0) {
++                              if (!down_interruptible(&dec->pes2ts_sem)) {
++                                      dvb_filter_pes2ts(&dec->v_pes2ts,
++                                                        dec->v_pes,
++                                                        dec->v_pes_length);
++
++                                      up(&dec->pes2ts_sem);
++                              }
++                      }
++
++                      break;
++              }
++
++      case 0x02:              /* MainAudioStream */
++              dvb_filter_pes2ts(&dec->a_pes2ts, &av_pes[8], length - 12);
++              break;
++
++      default:
++              printk("%s: unknown AV_PES type: %02x.\n", __FUNCTION__,
++                     av_pes[2]);
++              break;
++
++      }
++}
++
++static void ttusb_dec_process_urb_frame(struct ttusb_dec * dec, u8 * b,
++                                      int length)
++{
++      while (length) {
++              switch (dec->av_pes_state) {
++
++              case 0:
++              case 1:
++              case 3:
++                      if (*b++ == 0xaa) {
++                              dec->av_pes_state++;
++                              if (dec->av_pes_state == 4)
++                                      dec->av_pes_length = 0;
++                      } else {
++                              dec->av_pes_state = 0;
++                      }
++
++                      length--;
++                      break;
++
++              case 2:
++                      if (*b++ == 0x00) {
++                              dec->av_pes_state++;
++                      } else {
++                              dec->av_pes_state = 0;
++                      }
++
++                      length--;
++                      break;
++
++              case 4:
++                      dec->av_pes[dec->av_pes_length++] = *b++;
++
++                      if (dec->av_pes_length == 8) {
++                              dec->av_pes_state++;
++                              dec->av_pes_payload_length = le16_to_cpup(
++                                              (u16 *)(dec->av_pes + 6));
++                      }
++
++                      length--;
++                      break;
++
++              case 5: {
++                              int remainder = dec->av_pes_payload_length +
++                                              8 - dec->av_pes_length;
++
++                              if (length >= remainder) {
++                                      memcpy(dec->av_pes + dec->av_pes_length,
++                                             b, remainder);
++                                      dec->av_pes_length += remainder;
++                                      b += remainder;
++                                      length -= remainder;
++                                      dec->av_pes_state++;
++                              } else {
++                                      memcpy(&dec->av_pes[dec->av_pes_length],
++                                             b, length);
++                                      dec->av_pes_length += length;
++                                      length = 0;
++                              }
++
++                              break;
++                      }
++
++              case 6:
++                      dec->av_pes[dec->av_pes_length++] = *b++;
++
++                      if (dec->av_pes_length ==
++                          8 + dec->av_pes_payload_length + 4) {
++                              ttusb_dec_process_av_pes(dec, dec->av_pes,
++                                                       dec->av_pes_length);
++                              dec->av_pes_state = 0;
++                      }
++
++                      length--;
++                      break;
++
++              default:
++                      printk("%s: illegal packet state encountered.\n",
++                             __FUNCTION__);
++                      dec->av_pes_state = 0;
++
++              }
++
++      }
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void ttusb_dec_process_urb(struct urb *urb)
++#else
++static void ttusb_dec_process_urb(struct urb *urb, struct pt_regs *ptregs)
++#endif
++{
++      struct ttusb_dec *dec = urb->context;
++
++      if (!urb->status) {
++              int i;
++
++              for (i = 0; i < FRAMES_PER_ISO_BUF; i++) {
++                      struct usb_iso_packet_descriptor *d;
++                      u8 *b;
++                      int length;
++
++                      d = &urb->iso_frame_desc[i];
++                      b = urb->transfer_buffer + d->offset;
++                      length = d->actual_length;
++
++                      ttusb_dec_process_urb_frame(dec, b, length);
++              }
++      } else {
++               /* -ENOENT is expected when unlinking urbs */
++              if (urb->status != -ENOENT)
++                      dprintk("%s: urb error: %d\n", __FUNCTION__,
++                              urb->status);
++      }
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++      if (dec->iso_stream_count)
++              usb_submit_urb(urb, GFP_KERNEL);
++#endif
++}
++
++static void ttusb_dec_setup_urbs(struct ttusb_dec *dec)
++{
++      int i, j, buffer_offset = 0;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      for (i = 0; i < ISO_BUF_COUNT; i++) {
++              int frame_offset = 0;
++              struct urb *urb = dec->iso_urb[i];
++
++              urb->dev = dec->udev;
++              urb->context = dec;
++              urb->complete = ttusb_dec_process_urb;
++              urb->pipe = dec->stream_pipe;
++              urb->transfer_flags = URB_ISO_ASAP;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++              urb->interval = 1;
++#endif
++              urb->number_of_packets = FRAMES_PER_ISO_BUF;
++              urb->transfer_buffer_length = ISO_FRAME_SIZE *
++                                            FRAMES_PER_ISO_BUF;
++              urb->transfer_buffer = dec->iso_buffer + buffer_offset;
++              buffer_offset += ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF;
++
++              for (j = 0; j < FRAMES_PER_ISO_BUF; j++) {
++                      urb->iso_frame_desc[j].offset = frame_offset;
++                      urb->iso_frame_desc[j].length = ISO_FRAME_SIZE;
++                      frame_offset += ISO_FRAME_SIZE;
++              }
++      }
++}
++
++static void ttusb_dec_stop_iso_xfer(struct ttusb_dec *dec)
++{
++      int i;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      if (down_interruptible(&dec->iso_sem))
++              return;
++
++      dec->iso_stream_count--;
++
++      if (!dec->iso_stream_count) {
++              u8 b0[] = { 0x00 };
++
++              for (i = 0; i < ISO_BUF_COUNT; i++)
++                      usb_unlink_urb(dec->iso_urb[i]);
++
++              ttusb_dec_send_command(dec, 0x81, sizeof(b0), b0, NULL, NULL);
++      }
++
++      up(&dec->iso_sem);
++}
++
++/* Setting the interface of the DEC tends to take down the USB communications
++ * for a short period, so it's important not to call this function just before
++ * trying to talk to it.
++ */
++static void ttusb_dec_set_streaming_interface(struct ttusb_dec *dec)
++{
++      if (!dec->interface) {
++              usb_set_interface(dec->udev, 0, 8);
++              dec->interface = 8;
++      }
++}
++
++static int ttusb_dec_start_iso_xfer(struct ttusb_dec *dec)
++{
++      int i, result;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      if (down_interruptible(&dec->iso_sem))
++              return -EAGAIN;
++
++      if (!dec->iso_stream_count) {
++              u8 b0[] = { 0x05 };
++
++              ttusb_dec_send_command(dec, 0x80, sizeof(b0), b0, NULL, NULL);
++
++              ttusb_dec_setup_urbs(dec);
++
++              for (i = 0; i < ISO_BUF_COUNT; i++) {
++                      if ((result = usb_submit_urb(dec->iso_urb[i]
++                                                  , GFP_KERNEL))) {
++                              printk("%s: failed urb submission %d: "
++                                     "error %d\n", __FUNCTION__, i, result);
++
++                              while (i) {
++                                      usb_unlink_urb(dec->iso_urb[i - 1]);
++                                      i--;
++                              }
++
++                              up(&dec->iso_sem);
++                              return result;
++                      }
++              }
++
++              dec->av_pes_state = 0;
++              dec->v_pes_postbytes = 0;
++      }
++
++      dec->iso_stream_count++;
++
++      up(&dec->iso_sem);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++      ttusb_dec_set_streaming_interface(dec);
++#endif
++
++      return 0;
++}
++
++static int ttusb_dec_start_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++      struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
++      struct ttusb_dec *dec = dvbdmx->priv;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      if (!dvbdmx->dmx.frontend)
++              return -EINVAL;
++
++      dprintk("  pid: 0x%04X\n", dvbdmxfeed->pid);
++
++      switch (dvbdmxfeed->type) {
++
++      case DMX_TYPE_TS:
++              dprintk("  type: DMX_TYPE_TS\n");
++              break;
++
++      case DMX_TYPE_SEC:
++              dprintk("  type: DMX_TYPE_SEC\n");
++              break;
++
++      default:
++              dprintk("  type: unknown (%d)\n", dvbdmxfeed->type);
++              return -EINVAL;
++
++      }
++
++      dprintk("  ts_type:");
++
++      if (dvbdmxfeed->ts_type & TS_DECODER)
++              dprintk(" TS_DECODER");
++
++      if (dvbdmxfeed->ts_type & TS_PACKET)
++              dprintk(" TS_PACKET");
++
++      if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)
++              dprintk(" TS_PAYLOAD_ONLY");
++
++      dprintk("\n");
++
++      switch (dvbdmxfeed->pes_type) {
++
++      case DMX_TS_PES_VIDEO:
++              dprintk("  pes_type: DMX_TS_PES_VIDEO\n");
++              dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
++              dec->pid[DMX_PES_VIDEO] = dvbdmxfeed->pid;
++              ttusb_dec_set_pids(dec);
++              break;
++
++      case DMX_TS_PES_AUDIO:
++              dprintk("  pes_type: DMX_TS_PES_AUDIO\n");
++              dec->pid[DMX_PES_AUDIO] = dvbdmxfeed->pid;
++              ttusb_dec_set_pids(dec);
++              break;
++
++      case DMX_TS_PES_TELETEXT:
++              dec->pid[DMX_PES_TELETEXT] = dvbdmxfeed->pid;
++              dprintk("  pes_type: DMX_TS_PES_TELETEXT\n");
++              break;
++
++      case DMX_TS_PES_PCR:
++              dprintk("  pes_type: DMX_TS_PES_PCR\n");
++              dec->pid[DMX_PES_PCR] = dvbdmxfeed->pid;
++              ttusb_dec_set_pids(dec);
++              break;
++
++      case DMX_TS_PES_OTHER:
++              dprintk("  pes_type: DMX_TS_PES_OTHER\n");
++              break;
++
++      default:
++              dprintk("  pes_type: unknown (%d)\n", dvbdmxfeed->pes_type);
++              return -EINVAL;
++
++      }
++
++      ttusb_dec_start_iso_xfer(dec);
++
++      return 0;
++}
++
++static int ttusb_dec_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++      struct ttusb_dec *dec = dvbdmxfeed->demux->priv;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      ttusb_dec_stop_iso_xfer(dec);
++
++      return 0;
++}
++
++static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec)
++{
++      int i;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      for (i = 0; i < ISO_BUF_COUNT; i++)
++              if (dec->iso_urb[i])
++                      usb_free_urb(dec->iso_urb[i]);
++
++      pci_free_consistent(NULL,
++                          ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF *
++                                            ISO_BUF_COUNT),
++                          dec->iso_buffer, dec->iso_dma_handle);
++}
++
++static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec)
++{
++      int i;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      dec->iso_buffer = pci_alloc_consistent(NULL,
++                                             ISO_FRAME_SIZE *
++                                             (FRAMES_PER_ISO_BUF *
++                                              ISO_BUF_COUNT),
++                                             &dec->iso_dma_handle);
++
++      memset(dec->iso_buffer, 0,
++             sizeof(ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * ISO_BUF_COUNT)));
++
++      for (i = 0; i < ISO_BUF_COUNT; i++) {
++              struct urb *urb;
++
++              if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_KERNEL))) {
++                      ttusb_dec_free_iso_urbs(dec);
++                      return -ENOMEM;
++              }
++
++              dec->iso_urb[i] = urb;
++      }
++
++      ttusb_dec_setup_urbs(dec);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++      for (i = 0; i < ISO_BUF_COUNT; i++) {
++              int next = (i + 1) % ISO_BUF_COUNT;
++              dec->iso_urb[i]->next = dec->iso_urb[next];
++      }
++#endif
++
++      return 0;
++}
++
++static void ttusb_dec_init_v_pes(struct ttusb_dec *dec)
++{
++      dprintk("%s\n", __FUNCTION__);
++
++      dec->v_pes[0] = 0x00;
++      dec->v_pes[1] = 0x00;
++      dec->v_pes[2] = 0x01;
++      dec->v_pes[3] = 0xe0;
++}
++
++static void ttusb_dec_init_usb(struct ttusb_dec *dec)
++{
++      dprintk("%s\n", __FUNCTION__);
++
++      sema_init(&dec->usb_sem, 1);
++      sema_init(&dec->iso_sem, 1);
++
++      dec->command_pipe = usb_sndbulkpipe(dec->udev, COMMAND_PIPE);
++      dec->result_pipe = usb_rcvbulkpipe(dec->udev, RESULT_PIPE);
++      dec->stream_pipe = usb_rcvisocpipe(dec->udev, STREAM_PIPE);
++
++      ttusb_dec_alloc_iso_urbs(dec);
++}
++
++#include "dsp_dec2000.h"
++
++static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
++{
++      int i, j, actual_len, result, size, trans_count;
++      u8 b0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xc8, 0x61,
++                  0x00 };
++      u8 b1[] = { 0x61 };
++      u8 b[ARM_PACKET_SIZE];
++      u32 dsp_length = htonl(sizeof(dsp_dec2000));
++
++      dprintk("%s\n", __FUNCTION__);
++
++      memcpy(b0, &dsp_length, 4);
++
++      result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL);
++
++      if (result)
++              return result;
++
++      trans_count = 0;
++      j = 0;
++
++      for (i = 0; i < sizeof(dsp_dec2000); i += COMMAND_PACKET_SIZE) {
++              size = sizeof(dsp_dec2000) - i;
++              if (size > COMMAND_PACKET_SIZE)
++                      size = COMMAND_PACKET_SIZE;
++
++              b[j + 0] = 0xaa;
++              b[j + 1] = trans_count++;
++              b[j + 2] = 0xf0;
++              b[j + 3] = size;
++              memcpy(&b[j + 4], &dsp_dec2000[i], size);
++
++              j += COMMAND_PACKET_SIZE + 4;
++
++              if (j >= ARM_PACKET_SIZE) {
++                      result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
++                                            ARM_PACKET_SIZE, &actual_len,
++                                            HZ / 10);
++                      j = 0;
++              } else if (size < COMMAND_PACKET_SIZE) {
++                      result = usb_bulk_msg(dec->udev, dec->command_pipe, b,
++                                            j - COMMAND_PACKET_SIZE + size,
++                                            &actual_len, HZ / 10);
++              }
++      }
++
++      result = ttusb_dec_send_command(dec, 0x43, sizeof(b1), b1, NULL, NULL);
++
++      return result;
++}
++
++static void ttusb_dec_init_stb(struct ttusb_dec *dec)
++{
++      u8 c[COMMAND_PACKET_SIZE];
++      int c_length;
++      int result;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c);
++
++      if (!result)
++              if (c_length != 0x0c || (c_length == 0x0c && c[9] != 0x63))
++                      ttusb_dec_boot_dsp(dec);
++}
++
++static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
++{
++      int result;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      if ((result = dvb_register_adapter(&dec->adapter, "dec2000")) < 0) {
++              printk("%s: dvb_register_adapter failed: error %d\n",
++                     __FUNCTION__, result);
++
++              return result;
++      }
++
++      if (!(dec->i2c_bus = dvb_register_i2c_bus(ttusb_dec_i2c_master_xfer,
++                                                dec, dec->adapter, 0))) {
++              printk("%s: dvb_register_i2c_bus failed\n", __FUNCTION__);
++
++              dvb_unregister_adapter(dec->adapter);
++
++              return -ENOMEM;
++      }
++
++      dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
++
++      dec->demux.priv = (void *)dec;
++      dec->demux.filternum = 31;
++      dec->demux.feednum = 31;
++      dec->demux.start_feed = ttusb_dec_start_feed;
++      dec->demux.stop_feed = ttusb_dec_stop_feed;
++      dec->demux.write_to_decoder = NULL;
++
++      if ((result = dvb_dmx_init(&dec->demux)) < 0) {
++              printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
++                     result);
++
++              dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
++                                     0);
++              dvb_unregister_adapter(dec->adapter);
++
++              return result;
++      }
++
++      dec->dmxdev.filternum = 32;
++      dec->dmxdev.demux = &dec->demux.dmx;
++      dec->dmxdev.capabilities = 0;
++
++      if ((result = dvb_dmxdev_init(&dec->dmxdev, dec->adapter)) < 0) {
++              printk("%s: dvb_dmxdev_init failed: error %d\n",
++                     __FUNCTION__, result);
++
++              dvb_dmx_release(&dec->demux);
++              dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
++                                     0);
++              dvb_unregister_adapter(dec->adapter);
++
++              return result;
++      }
++
++      dec->frontend.source = DMX_FRONTEND_0;
++
++      if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx,
++                                                &dec->frontend)) < 0) {
++              printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
++                     result);
++
++              dvb_dmxdev_release(&dec->dmxdev);
++              dvb_dmx_release(&dec->demux);
++              dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
++                                     0);
++              dvb_unregister_adapter(dec->adapter);
++
++              return result;
++      }
++
++      if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx,
++                                                    &dec->frontend)) < 0) {
++              printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
++                     result);
++
++              dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
++              dvb_dmxdev_release(&dec->dmxdev);
++              dvb_dmx_release(&dec->demux);
++              dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
++                                     0);
++              dvb_unregister_adapter(dec->adapter);
++
++              return result;
++      }
++
++      sema_init(&dec->pes2ts_sem, 1);
++
++      dvb_net_init(dec->adapter, &dec->dvb_net, &dec->demux.dmx);
++
++      return 0;
++}
++
++static void ttusb_dec_exit_dvb(struct ttusb_dec *dec)
++{
++      dprintk("%s\n", __FUNCTION__);
++
++      dvb_net_release(&dec->dvb_net);
++      dec->demux.dmx.close(&dec->demux.dmx);
++      dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
++      dvb_dmxdev_release(&dec->dmxdev);
++      dvb_dmx_release(&dec->demux);
++      dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter, 0);
++      dvb_unregister_adapter(dec->adapter);
++}
++
++static void ttusb_dec_exit_usb(struct ttusb_dec *dec)
++{
++      int i;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      dec->iso_stream_count = 0;
++
++      for (i = 0; i < ISO_BUF_COUNT; i++)
++              usb_unlink_urb(dec->iso_urb[i]);
++
++      ttusb_dec_free_iso_urbs(dec);
++}
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void *ttusb_dec_probe(struct usb_device *udev, unsigned int ifnum,
++                           const struct usb_device_id *id)
++{
++      struct ttusb_dec *dec;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      if (ifnum != 0)
++              return NULL;
++
++      if (!(dec = kmalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
++              printk("%s: couldn't allocate memory.\n", __FUNCTION__);
++              return NULL;
++      }
++
++      memset(dec, 0, sizeof(struct ttusb_dec));
++
++      dec->udev = udev;
++
++      ttusb_dec_init_usb(dec);
++      ttusb_dec_init_stb(dec);
++      ttusb_dec_init_dvb(dec);
++      ttusb_dec_init_v_pes(dec);
++
++      return (void *)dec;
++}
++#else
++static int ttusb_dec_probe(struct usb_interface *intf,
++                         const struct usb_device_id *id)
++{
++      struct usb_device *udev;
++      struct ttusb_dec *dec;
++
++      dprintk("%s\n", __FUNCTION__);
++
++      udev = interface_to_usbdev(intf);
++
++      if (!(dec = kmalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
++              printk("%s: couldn't allocate memory.\n", __FUNCTION__);
++              return -ENOMEM;
++      }
++
++      memset(dec, 0, sizeof(struct ttusb_dec));
++
++      dec->udev = udev;
++
++      ttusb_dec_init_usb(dec);
++      ttusb_dec_init_stb(dec);
++      ttusb_dec_init_dvb(dec);
++      ttusb_dec_init_v_pes(dec);
++
++      usb_set_intfdata(intf, (void *)dec);
++      ttusb_dec_set_streaming_interface(dec);
++
++      return 0;
++}
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++static void ttusb_dec_disconnect(struct usb_device *udev, void *data)
++{
++      struct ttusb_dec *dec = data;
++#else
++static void ttusb_dec_disconnect(struct usb_interface *intf)
++{
++      struct ttusb_dec *dec = usb_get_intfdata(intf);
++
++      usb_set_intfdata(intf, NULL);
++#endif
++
++      dprintk("%s\n", __FUNCTION__);
++
++      ttusb_dec_exit_usb(dec);
++      ttusb_dec_exit_dvb(dec);
++
++      kfree(dec);
++}
++
++static struct usb_device_id ttusb_dec_table[] = {
++      {USB_DEVICE(0x0b48, 0x1006)},   /* Unconfirmed */
++      {USB_DEVICE(0x0b48, 0x1007)},   /* Unconfirmed */
++      {USB_DEVICE(0x0b48, 0x1008)},   /* DEC 2000 t */
++      {}
++};
++
++static struct usb_driver ttusb_dec_driver = {
++      name:           DRIVER_NAME,
++      probe:          ttusb_dec_probe,
++      disconnect:     ttusb_dec_disconnect,
++      id_table:               ttusb_dec_table,
++};
++
++static int __init ttusb_dec_init(void)
++{
++      int result;
++
++      if ((result = usb_register(&ttusb_dec_driver)) < 0) {
++              printk("%s: initialisation failed: error %d.\n", __FUNCTION__,
++                     result);
++              return result;
++      }
++
++      return 0;
++}
++
++static void __exit ttusb_dec_exit(void)
++{
++      usb_deregister(&ttusb_dec_driver);
++}
++
++module_init(ttusb_dec_init);
++module_exit(ttusb_dec_exit);
++
++MODULE_AUTHOR("Alex Woods <linux-dvb@giblets.org>");
++MODULE_DESCRIPTION(DRIVER_NAME);
++MODULE_LICENSE("GPL");
++MODULE_DEVICE_TABLE(usb, ttusb_dec_table);
++
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "Debug level");
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/dvb/ttusb-dec/ttusb_dec.h 2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,87 @@
++/*
++ * TTUSB DEC Driver
++ *
++ * Copyright (C) 2003 Alex Woods <linux-dvb@giblets.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#ifndef _TTUSB_DEC_H
++#define _TTUSB_DEC_H
++
++#include "asm/semaphore.h"
++#include "dmxdev.h"
++#include "dvb_demux.h"
++#include "dvb_filter.h"
++#include "dvb_i2c.h"
++#include "dvb_net.h"
++
++#define DRIVER_NAME           "TechnoTrend/Hauppauge DEC USB"
++
++#define COMMAND_PIPE          0x03
++#define RESULT_PIPE           0x84
++#define STREAM_PIPE           0x88
++
++#define COMMAND_PACKET_SIZE   0x3c
++#define ARM_PACKET_SIZE               0x1000
++
++#define ISO_BUF_COUNT         0x04
++#define FRAMES_PER_ISO_BUF    0x04
++#define ISO_FRAME_SIZE                0x0380
++
++#define       MAX_AV_PES_LENGTH       6144
++
++struct ttusb_dec {
++      /* DVB bits */
++      struct dvb_adapter      *adapter;
++      struct dmxdev           dmxdev;
++      struct dvb_demux        demux;
++      struct dmx_frontend     frontend;
++      struct dvb_i2c_bus      *i2c_bus;
++      struct dvb_net          dvb_net;
++
++      u16                     pid[DMX_PES_OTHER];
++
++      /* USB bits */
++      struct usb_device       *udev;
++      u8                      trans_count;
++      unsigned int            command_pipe;
++      unsigned int            result_pipe;
++      unsigned int            stream_pipe;
++      int                     interface;
++      struct semaphore        usb_sem;
++
++      void                    *iso_buffer;
++      dma_addr_t              iso_dma_handle;
++      struct urb              *iso_urb[ISO_BUF_COUNT];
++      int                     iso_stream_count;
++      struct semaphore        iso_sem;
++
++      u8                      av_pes[MAX_AV_PES_LENGTH + 4];
++      int                     av_pes_state;
++      int                     av_pes_length;
++      int                     av_pes_payload_length;
++
++      struct dvb_filter_pes2ts        a_pes2ts;
++      struct dvb_filter_pes2ts        v_pes2ts;
++      struct semaphore                pes2ts_sem;
++
++      u8                      v_pes[16 + MAX_AV_PES_LENGTH];
++      int                     v_pes_length;
++      int                     v_pes_postbytes;
++};
++
++#endif
+--- linux-2.6.0-test1/drivers/media/video/dpc7146.c    2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/video/dpc7146.c   2003-07-19 17:03:50.000000000 -0700
+@@ -173,6 +173,8 @@ static int dpc_init_done(struct saa7146_
+       return 0;
+ }
++static struct saa7146_ext_vv vv_data;
++
+ /* this function only gets called when the probing was successful */
+ static int dpc_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
+ {
+@@ -183,7 +185,7 @@ static int dpc_attach(struct saa7146_dev
+       /* checking for i2c-devices can be omitted here, because we
+          already did this in "dpc_vl42_probe" */
+-      saa7146_vv_init(dev);
++      saa7146_vv_init(dev,&vv_data);
+       if( 0 != saa7146_register_device(&dpc->video_dev, dev, "dpc", VFL_TYPE_GRABBER)) {
+               ERR(("cannot register capture v4l2 device. skipping.\n"));
+               return -1;
+@@ -246,8 +248,9 @@ int dpc_vbi_bypass(struct saa7146_dev* d
+ }
+ #endif
+-static int dpc_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
++static int dpc_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
+ {
++      struct saa7146_dev *dev = fh->dev;
+       struct dpc* dpc = (struct dpc*)dev->ext_priv;
+ /*
+       struct saa7146_vv *vv = dev->vv_data; 
+@@ -307,23 +310,32 @@ static int std_callback(struct saa7146_d
+ }
+ static struct saa7146_standard standard[] = {
+-      { "PAL-BG",     V4L2_STD_PAL_BG,        SAA7146_PAL_VALUES },
+-      { "PAL-I",      V4L2_STD_PAL_I,         SAA7146_PAL_VALUES },
+-      { "NTSC",       V4L2_STD_NTSC,          SAA7146_NTSC_VALUES },
+-      { "SECAM",      V4L2_STD_SECAM,         SAA7146_SECAM_VALUES },
++      {
++              .name   = "PAL",        .id     = V4L2_STD_PAL,
++              .v_offset       = 0x17, .v_field        = 288,  .v_calc         = 576,
++              .h_offset       = 0x14, .h_pixels       = 680,  .h_calc         = 680+1,
++              .v_max_out      = 576,  .h_max_out      = 768,
++      }, {
++              .name   = "NTSC",       .id     = V4L2_STD_NTSC,
++              .v_offset       = 0x16, .v_field        = 240,  .v_calc         = 480,
++              .h_offset       = 0x06, .h_pixels       = 708,  .h_calc         = 708+1,
++              .v_max_out      = 480,  .h_max_out      = 640,
++      }, {
++              .name   = "SECAM",      .id     = V4L2_STD_SECAM,
++              .v_offset       = 0x14, .v_field        = 288,  .v_calc         = 576,
++              .h_offset       = 0x14, .h_pixels       = 720,  .h_calc         = 720+1,
++              .v_max_out      = 576,  .h_max_out      = 768,
++      }
+ };
+-static
+-struct saa7146_extension extension;
++static struct saa7146_extension extension;
+-static
+-struct saa7146_pci_extension_data dpc = {
++static struct saa7146_pci_extension_data dpc = {
+         .ext_priv = "Multimedia eXtension Board",
+         .ext = &extension,
+ };
+-static
+-struct pci_device_id pci_tbl[] = {
++static struct pci_device_id pci_tbl[] = {
+       {
+               .vendor    = PCI_VENDOR_ID_PHILIPS,
+               .device    = PCI_DEVICE_ID_PHILIPS_SAA7146,
+@@ -337,8 +349,7 @@ struct pci_device_id pci_tbl[] = {
+ MODULE_DEVICE_TABLE(pci, pci_tbl);
+-static
+-struct saa7146_ext_vv vv_data = {
++static struct saa7146_ext_vv vv_data = {
+       .inputs         = DPC_INPUTS,
+       .capabilities   = V4L2_CAP_VBI_CAPTURE,
+       .stds           = &standard[0],
+@@ -348,14 +359,12 @@ struct saa7146_ext_vv vv_data = {
+       .ioctl          = dpc_ioctl,
+ };
+-static
+-struct saa7146_extension extension = {
++static struct saa7146_extension extension = {
+       .name           = "dpc7146 demonstration board",
+       .flags          = SAA7146_USE_I2C_IRQ,
+       
+       .pci_tbl        = &pci_tbl[0],
+       .module         = THIS_MODULE,
+-      .ext_vv_data    = &vv_data,
+       .probe          = dpc_probe,
+       .attach         = dpc_attach,
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium_gemini.c     2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,411 @@
++/*
++    hexium_gemini.c - v4l2 driver for Hexium Gemini frame grabber cards
++               
++    Visit http://www.mihu.de/linux/saa7146/ and follow the link
++    to "hexium" for further details about this card.
++    
++    Copyright (C) 2003 Michael Hunold <michael@mihu.de>
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#define DEBUG_VARIABLE debug
++
++#include <media/saa7146_vv.h>
++
++static int debug = 255;
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "debug verbosity");
++
++/* global variables */
++int hexium_num = 0;
++
++#include "hexium_gemini.h"
++
++/* bring hardware to a sane state. this has to be done, just in case someone
++   wants to capture from this device before it has been properly initialized.
++   the capture engine would badly fail, because no valid signal arrives on the
++   saa7146, thus leading to timeouts and stuff. */
++static int hexium_init_done(struct saa7146_dev *dev)
++{
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++      union i2c_smbus_data data;
++      int i = 0;
++
++      DEB_D(("hexium_init_done called.\n"));
++
++      /* initialize the helper ics to useful values */
++      for (i = 0; i < sizeof(hexium_ks0127b); i++) {
++              data.byte = hexium_ks0127b[i];
++              if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x6c, 0, I2C_SMBUS_WRITE, i, I2C_SMBUS_BYTE_DATA, &data)) {
++                      printk("failed for address 0x%02x\n", i);
++              }
++      }
++
++      return 0;
++}
++
++static int hexium_set_input(struct hexium *hexium, int input)
++{
++      union i2c_smbus_data data;
++
++      DEB_D((".\n"));
++
++      data.byte = hexium_input_select[input].byte;
++      if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x6c, 0, I2C_SMBUS_WRITE, hexium_input_select[input].adr, I2C_SMBUS_BYTE_DATA, &data)) {
++              return -1;
++      }
++
++      return 0;
++}
++
++static int hexium_set_standard(struct hexium *hexium, struct hexium_data *vdec)
++{
++      union i2c_smbus_data data;
++      int i = 0;
++
++      DEB_D((".\n"));
++
++      while (vdec[i].adr != -1) {
++              data.byte = vdec[i].byte;
++              if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x6c, 0, I2C_SMBUS_WRITE, vdec[i].adr, I2C_SMBUS_BYTE_DATA, &data)) {
++                      printk("failed for address 0x%02x\n", i);
++                      return -1;
++              }
++              i++;
++      }
++      return 0;
++}
++
++static struct saa7146_ext_vv vv_data;
++
++/* this function only gets called when the probing was successful */
++static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
++{
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++      DEB_EE((".\n"));
++
++      hexium = (struct hexium *) kmalloc(sizeof(struct hexium), GFP_KERNEL);
++      if (NULL == hexium) {
++              printk("hexium_v4l2.o: hexium_probe: not enough kernel memory.\n");
++              return -ENOMEM;
++      }
++      memset(hexium, 0x0, sizeof(struct hexium));
++      (struct hexium *) dev->ext_priv = hexium;
++
++      /* FIXME: enable i2c-port pins, video-port-pins
++         video port pins should be enabled here ?! */
++      saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
++
++      saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
++      if (i2c_add_adapter(&hexium->i2c_adapter) < 0) {
++              DEB_S(("cannot register i2c-device. skipping.\n"));
++              kfree(hexium);
++              return -EFAULT;
++      }
++
++      /*  set HWControl GPIO number 2 */
++      saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI);
++
++      saa7146_write(dev, DD1_INIT, 0x07000700);
++      saa7146_write(dev, DD1_STREAM_B, 0x00000000);
++      saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
++
++      /* the rest */
++      hexium->cur_input = 0;
++      hexium_init_done(dev);
++
++      hexium_set_standard(hexium, hexium_pal);
++      hexium->cur_std = V4L2_STD_PAL;
++
++      hexium_set_input(hexium, 0);
++      hexium->cur_input = 0;
++
++      saa7146_vv_init(dev, &vv_data);
++      if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium", VFL_TYPE_GRABBER)) {
++              ERR(("cannot register capture v4l2 device. skipping.\n"));
++              return -1;
++      }
++
++      printk("hexium: found 'hexium frame grabber'-%d.\n", hexium_num);
++      hexium_num++;
++
++      return 0;
++}
++
++static int hexium_detach(struct saa7146_dev *dev)
++{
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++      DEB_EE(("dev:%p\n", dev));
++
++      saa7146_unregister_device(&hexium->video_dev, dev);
++      saa7146_vv_release(dev);
++
++      hexium_num--;
++
++      i2c_del_adapter(&hexium->i2c_adapter);
++      kfree(hexium);
++      return 0;
++}
++
++static int hexium_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg)
++{
++      struct saa7146_dev *dev = fh->dev;
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++/*
++      struct saa7146_vv *vv = dev->vv_data; 
++*/
++      switch (cmd) {
++      case VIDIOC_ENUMINPUT:
++              {
++                      struct v4l2_input *i = arg;
++                      DEB_EE(("VIDIOC_ENUMINPUT %d.\n", i->index));
++
++                      if (i->index < 0 || i->index >= HEXIUM_INPUTS) {
++                              return -EINVAL;
++                      }
++
++                      memcpy(i, &hexium_inputs[i->index], sizeof(struct v4l2_input));
++
++                      DEB_D(("v4l2_ioctl: VIDIOC_ENUMINPUT %d.\n", i->index));
++                      return 0;
++              }
++      case VIDIOC_G_INPUT:
++              {
++                      int *input = (int *) arg;
++                      *input = hexium->cur_input;
++
++                      DEB_D(("VIDIOC_G_INPUT: %d\n", *input));
++                      return 0;
++              }
++      case VIDIOC_S_INPUT:
++              {
++                      int input = *(int *) arg;
++
++                      DEB_EE(("VIDIOC_S_INPUT %d.\n", input));
++
++                      if (input < 0 || input >= HEXIUM_INPUTS) {
++                              return -EINVAL;
++                      }
++
++                      hexium->cur_input = input;
++                      hexium_set_input(hexium, input);
++
++                      return 0;
++              }
++              /* the saa7146 provides some controls (brightness, contrast, saturation)
++                 which gets registered *after* this function. because of this we have
++                 to return with a value != 0 even if the function succeded.. */
++      case VIDIOC_QUERYCTRL:
++              {
++                      struct v4l2_queryctrl *qc = arg;
++                      int i;
++
++                      for (i = HEXIUM_CONTROLS - 1; i >= 0; i--) {
++                              if (hexium_controls[i].id == qc->id) {
++                                      *qc = hexium_controls[i];
++                                      DEB_D(("VIDIOC_QUERYCTRL %d.\n", qc->id));
++                                      return 0;
++                              }
++                      }
++                      return -EAGAIN;
++              }
++      case VIDIOC_G_CTRL:
++              {
++                      struct v4l2_control *vc = arg;
++                      int i;
++
++                      for (i = HEXIUM_CONTROLS - 1; i >= 0; i--) {
++                              if (hexium_controls[i].id == vc->id) {
++                                      break;
++                              }
++                      }
++
++                      if (i < 0) {
++                              return -EAGAIN;
++                      }
++
++                      switch (vc->id) {
++                      case V4L2_CID_PRIVATE_BASE:{
++                                      vc->value = hexium->cur_bw;
++                                      DEB_D(("VIDIOC_G_CTRL BW:%d.\n", vc->value));
++                                      return 0;
++                              }
++                      }
++                      return -EINVAL;
++              }
++
++      case VIDIOC_S_CTRL:
++              {
++                      struct v4l2_control *vc = arg;
++                      int i = 0;
++
++                      for (i = HEXIUM_CONTROLS - 1; i >= 0; i--) {
++                              if (hexium_controls[i].id == vc->id) {
++                                      break;
++                              }
++                      }
++
++                      if (i < 0) {
++                              return -EAGAIN;
++                      }
++
++                      switch (vc->id) {
++                      case V4L2_CID_PRIVATE_BASE:{
++                                      hexium->cur_bw = vc->value;
++                                      break;
++                              }
++                      }
++
++                      DEB_D(("VIDIOC_S_CTRL BW:%d.\n", hexium->cur_bw));
++
++                      if (0 == hexium->cur_bw && V4L2_STD_PAL == hexium->cur_std) {
++                              hexium_set_standard(hexium, hexium_pal);
++                              return 0;
++                      }
++                      if (0 == hexium->cur_bw && V4L2_STD_NTSC == hexium->cur_std) {
++                              hexium_set_standard(hexium, hexium_ntsc);
++                              return 0;
++                      }
++                      if (0 == hexium->cur_bw && V4L2_STD_SECAM == hexium->cur_std) {
++                              hexium_set_standard(hexium, hexium_secam);
++                              return 0;
++                      }
++                      if (1 == hexium->cur_bw && V4L2_STD_PAL == hexium->cur_std) {
++                              hexium_set_standard(hexium, hexium_pal_bw);
++                              return 0;
++                      }
++                      if (1 == hexium->cur_bw && V4L2_STD_NTSC == hexium->cur_std) {
++                              hexium_set_standard(hexium, hexium_ntsc_bw);
++                              return 0;
++                      }
++                      if (1 == hexium->cur_bw && V4L2_STD_SECAM == hexium->cur_std) {
++                              /* fixme: is there no bw secam mode? */
++                              return -EINVAL;
++                      }
++
++                      return -EINVAL;
++              }
++      default:
++/*
++              DEB_D(("v4l2_ioctl does not handle this ioctl.\n"));
++*/
++              return -ENOIOCTLCMD;
++      }
++      return 0;
++}
++
++static int std_callback(struct saa7146_dev *dev, struct saa7146_standard *std)
++{
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++      if (V4L2_STD_PAL == std->id) {
++              hexium_set_standard(hexium, hexium_pal);
++              hexium->cur_std = V4L2_STD_PAL;
++              return 0;
++      } else if (V4L2_STD_NTSC == std->id) {
++              hexium_set_standard(hexium, hexium_ntsc);
++              hexium->cur_std = V4L2_STD_NTSC;
++              return 0;
++      } else if (V4L2_STD_SECAM == std->id) {
++              hexium_set_standard(hexium, hexium_secam);
++              hexium->cur_std = V4L2_STD_SECAM;
++              return 0;
++      }
++
++      return -1;
++}
++
++static struct saa7146_extension hexium_extension;
++
++static struct saa7146_pci_extension_data hexium_gemini_4bnc = {
++      .ext_priv = "Hexium Gemini (4 BNC)",
++      .ext = &hexium_extension,
++};
++
++static struct saa7146_pci_extension_data hexium_gemini_dual_4bnc = {
++      .ext_priv = "Hexium Gemini Dual (4 BNC)",
++      .ext = &hexium_extension,
++};
++
++static struct pci_device_id pci_tbl[] = {
++      {
++       .vendor = PCI_VENDOR_ID_PHILIPS,
++       .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++       .subvendor = 0x17c8,
++       .subdevice = 0x2401,
++       .driver_data = (unsigned long) &hexium_gemini_4bnc,
++       },
++      {
++       .vendor = PCI_VENDOR_ID_PHILIPS,
++       .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++       .subvendor = 0x17c8,
++       .subdevice = 0x2402,
++       .driver_data = (unsigned long) &hexium_gemini_dual_4bnc,
++       },
++      {
++       .vendor = 0,
++       }
++};
++
++MODULE_DEVICE_TABLE(pci, pci_tbl);
++
++static struct saa7146_ext_vv vv_data = {
++      .inputs = HEXIUM_INPUTS,
++      .capabilities = 0,
++      .stds = &hexium_standards[0],
++      .num_stds = sizeof(hexium_standards) / sizeof(struct saa7146_standard),
++      .std_callback = &std_callback,
++      .ioctls = &ioctls[0],
++      .ioctl = hexium_ioctl,
++};
++
++static struct saa7146_extension hexium_extension = {
++      .name = "hexium gemini",
++      .flags = SAA7146_USE_I2C_IRQ,
++
++      .pci_tbl = &pci_tbl[0],
++      .module = THIS_MODULE,
++
++      .attach = hexium_attach,
++      .detach = hexium_detach,
++
++      .irq_mask = 0,
++      .irq_func = NULL,
++};
++
++int __init hexium_init_module(void)
++{
++      if (0 != saa7146_register_extension(&hexium_extension)) {
++              DEB_S(("failed to register extension.\n"));
++              return -ENODEV;
++      }
++
++      return 0;
++}
++
++void __exit hexium_cleanup_module(void)
++{
++      saa7146_unregister_extension(&hexium_extension);
++}
++
++module_init(hexium_init_module);
++module_exit(hexium_cleanup_module);
++
++MODULE_DESCRIPTION("video4linux-2 driver for Hexium Gemini frame grabber cards");
++MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
++MODULE_LICENSE("GPL");
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium_gemini.h     2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,103 @@
++#ifndef __HEXIUM_GEMINI__
++#define __HEXIUM_GEMINI__
++
++#include "hexium.h"
++
++static struct saa7146_extension_ioctls ioctls[] = {
++      { VIDIOC_G_INPUT,       SAA7146_EXCLUSIVE },
++      { VIDIOC_S_INPUT,       SAA7146_EXCLUSIVE },
++      { VIDIOC_QUERYCTRL,     SAA7146_BEFORE },
++      { VIDIOC_ENUMINPUT,     SAA7146_EXCLUSIVE },
++      { VIDIOC_S_STD,         SAA7146_AFTER },
++      { VIDIOC_G_CTRL,        SAA7146_BEFORE },
++      { VIDIOC_S_CTRL,        SAA7146_BEFORE },
++      { 0,                    0 }
++};
++
++#define HEXIUM_CONTROLS       1
++static struct v4l2_queryctrl hexium_controls[] = {
++      { V4L2_CID_PRIVATE_BASE, V4L2_CTRL_TYPE_BOOLEAN, "B/W", 0, 1, 1, 0, 0 },
++};
++
++#define HEXIUM_GEMUINI_V_1_0          1
++#define HEXIUM_GEMUINI_DUAL_V_1_0     2
++
++struct hexium
++{
++      int type;
++      struct video_device     video_dev;
++      struct i2c_adapter      i2c_adapter;
++              
++      int             cur_input;      /* current input */
++      v4l2_std_id     cur_std;        /* current standard */
++      int             cur_bw;         /* current black/white status */
++};
++
++/* Samsung KS0127B decoder default registers */
++static u8 hexium_ks0127b[0x100]={
++/*00*/ 0x00,0x52,0x30,0x40,0x01,0x0C,0x2A,0x10,
++/*08*/ 0x00,0x00,0x00,0x60,0x00,0x00,0x0F,0x06,
++/*10*/ 0x00,0x00,0xE4,0xC0,0x00,0x00,0x00,0x00,
++/*18*/ 0x14,0x9B,0xFE,0xFF,0xFC,0xFF,0x03,0x22,
++/*20*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*28*/ 0x00,0x00,0x00,0x00,0x00,0x2C,0x9B,0x00,
++/*30*/ 0x00,0x00,0x10,0x80,0x80,0x10,0x80,0x80,
++/*38*/ 0x01,0x04,0x00,0x00,0x00,0x29,0xC0,0x00,
++/*40*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*48*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*50*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*58*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*60*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*68*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*70*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*78*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*80*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*88*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*90*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*98*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*A0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*A8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*B0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*B8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*C0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*C8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*D0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*D8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*E0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*E8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*F0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++/*F8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
++};
++
++static struct hexium_data hexium_pal[] = {
++      { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_pal_bw[] = {
++      { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_ntsc[] = {
++      { 0x01, 0x53 }, { 0x12, 0x04 }, { 0x2D, 0x23 }, { 0x2E, 0x81 }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_ntsc_bw[] = {
++      { 0x01, 0x53 }, { 0x12, 0x04 }, { 0x2D, 0x23 }, { 0x2E, 0x81 }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_secam[] = {
++      { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF }
++};
++
++static struct hexium_data hexium_input_select[] = {
++      { 0x02, 0x60 },
++      { 0x02, 0x64 },
++      { 0x02, 0x61 },
++      { 0x02, 0x65 },
++      { 0x02, 0x62 },
++      { 0x02, 0x66 },
++      { 0x02, 0x68 },
++      { 0x02, 0x69 },
++      { 0x02, 0x6A },
++};
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium.h    2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,51 @@
++#ifndef __HEXIUM__
++#define __HEXIUM__
++
++#define HEXIUM_HV_PCI6_ORION          1
++#define HEXIUM_ORION_1SVHS_3BNC               2
++#define HEXIUM_ORION_4BNC             3
++#define HEXIUM_GEMUINI                        4
++#define HEXIUM_GEMUINI_DUAL           5
++
++static struct saa7146_standard hexium_standards[] = {
++      {
++              .name   = "PAL",        .id     = V4L2_STD_PAL,
++              .v_offset       = 0x17, .v_field        = 288,  .v_calc         = 576,
++              .h_offset       = 0x14, .h_pixels       = 680,  .h_calc         = 680+1,
++              .v_max_out      = 576,  .h_max_out      = 768,
++      }, {
++              .name   = "NTSC",       .id     = V4L2_STD_NTSC,
++              .v_offset       = 0x17, .v_field        = 240,  .v_calc         = 480,
++              .h_offset       = 0x06, .h_pixels       = 640,  .h_calc         = 641+1,
++              .v_max_out      = 480,  .h_max_out      = 640,
++      }, {
++              .name   = "SECAM",      .id     = V4L2_STD_SECAM,
++              .v_offset       = 0x14, .v_field        = 288,  .v_calc         = 576,
++              .h_offset       = 0x14, .h_pixels       = 720,  .h_calc         = 720+1,
++              .v_max_out      = 576,  .h_max_out      = 768,
++      }
++};            
++
++
++#define HEXIUM_INPUTS 9
++static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = {
++      { 0, "CVBS 1",  V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++      { 1, "CVBS 2",  V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++      { 2, "CVBS 3",  V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++      { 3, "CVBS 4",  V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++      { 4, "CVBS 5",  V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++      { 5, "CVBS 6",  V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++      { 6, "Y/C 1",   V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++      { 7, "Y/C 2",   V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++      { 8, "Y/C 3",   V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
++};
++
++#define HEXIUM_AUDIOS 0
++
++struct hexium_data
++{
++      s8 adr;
++      u8 byte;
++};
++
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium_orion.c      2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,328 @@
++/*
++    hexium_orion.c - v4l2 driver for the Hexium Orion frame grabber cards
++
++    Visit http://www.mihu.de/linux/saa7146/ and follow the link
++    to "hexium" for further details about this card.
++    
++    Copyright (C) 2003 Michael Hunold <michael@mihu.de>
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#define DEBUG_VARIABLE debug
++
++#include <media/saa7146_vv.h>
++
++static int debug = 255;
++MODULE_PARM(debug, "i");
++MODULE_PARM_DESC(debug, "debug verbosity");
++
++/* global variables */
++int hexium_num = 0;
++
++#include "hexium_orion.h"
++
++/* this is only called for old HV-PCI6/Orion cards
++   without eeprom */
++static int hexium_probe(struct saa7146_dev *dev)
++{
++      struct hexium *hexium = 0;
++      union i2c_smbus_data data;
++      int err = 0;
++
++      DEB_EE((".\n"));
++
++      /* there are no hexium orion cards with revision 0 saa7146s */
++      if (0 == dev->revision) {
++              return -EFAULT;
++      }
++
++      hexium = (struct hexium *) kmalloc(sizeof(struct hexium), GFP_KERNEL);
++      if (NULL == hexium) {
++              printk("hexium_orion.o: hexium_probe: not enough kernel memory.\n");
++              return -ENOMEM;
++      }
++      memset(hexium, 0x0, sizeof(struct hexium));
++
++      /* FIXME: enable i2c-port pins, video-port-pins
++         video port pins should be enabled here ?! */
++      saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
++
++      saa7146_write(dev, DD1_INIT, 0x02000200);
++      saa7146_write(dev, DD1_STREAM_B, 0x00000000);
++      saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
++
++      saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
++      if (i2c_add_adapter(&hexium->i2c_adapter) < 0) {
++              DEB_S(("cannot register i2c-device. skipping.\n"));
++              kfree(hexium);
++              return -EFAULT;
++      }
++
++      /* set SAA7110 control GPIO 0 */
++      saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTHI);
++      /*  set HWControl GPIO number 2 */
++      saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI);
++
++      mdelay(10);
++
++      /* detect newer Hexium Orion cards by subsystem ids */
++      if (0x17c8 == dev->pci->subsystem_vendor && 0x0101 == dev->pci->subsystem_device) {
++              printk("hexium_orion.o: device is a Hexium Orion w/ 1 SVHS + 3 BNC inputs.\n");
++              /* we store the pointer in our private data field */
++              (struct hexium *) dev->ext_priv = hexium;
++              hexium->type = HEXIUM_ORION_1SVHS_3BNC;
++              return 0;
++      }
++
++      if (0x17c8 == dev->pci->subsystem_vendor && 0x2101 == dev->pci->subsystem_device) {
++              printk("hexium_orion.o: device is a Hexium Orion w/ 4 BNC inputs.\n");
++              /* we store the pointer in our private data field */
++              (struct hexium *) dev->ext_priv = hexium;
++              hexium->type = HEXIUM_ORION_4BNC;
++              return 0;
++      }
++
++      /* check if this is an old hexium Orion card by looking at 
++         a saa7110 at address 0x4e */
++      if (0 == (err = i2c_smbus_xfer(&hexium->i2c_adapter, 0x4e, 0, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))) {
++              printk("hexium_orion.o: device is a Hexium HV-PCI6/Orion (old).\n");
++              /* we store the pointer in our private data field */
++              (struct hexium *) dev->ext_priv = hexium;
++              hexium->type = HEXIUM_HV_PCI6_ORION;
++              return 0;
++      }
++
++      i2c_del_adapter(&hexium->i2c_adapter);
++      kfree(hexium);
++      return -EFAULT;
++}
++
++/* bring hardware to a sane state. this has to be done, just in case someone
++   wants to capture from this device before it has been properly initialized.
++   the capture engine would badly fail, because no valid signal arrives on the
++   saa7146, thus leading to timeouts and stuff. */
++static int hexium_init_done(struct saa7146_dev *dev)
++{
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++      union i2c_smbus_data data;
++      int i = 0;
++
++      DEB_D(("hexium_init_done called.\n"));
++
++      /* initialize the helper ics to useful values */
++      for (i = 0; i < sizeof(hexium_saa7110); i++) {
++              data.byte = hexium_saa7110[i];
++              if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x4e, 0, I2C_SMBUS_WRITE, i, I2C_SMBUS_BYTE_DATA, &data)) {
++                      printk("hexium_orion: failed for address 0x%02x\n", i);
++              }
++      }
++
++      return 0;
++}
++
++static struct saa7146_ext_vv vv_data;
++
++/* this function only gets called when the probing was successful */
++static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
++{
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++      DEB_EE((".\n"));
++
++      saa7146_vv_init(dev, &vv_data);
++      if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium", VFL_TYPE_GRABBER)) {
++              ERR(("cannot register capture v4l2 device. skipping.\n"));
++              return -1;
++      }
++
++      printk("hexium_orion.o: found 'hexium orion' frame grabber-%d.\n", hexium_num);
++      hexium_num++;
++
++      /* the rest */
++      hexium->cur_input = 0;
++      hexium_init_done(dev);
++
++      return 0;
++}
++
++static int hexium_detach(struct saa7146_dev *dev)
++{
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++
++      DEB_EE(("dev:%p\n", dev));
++
++      saa7146_unregister_device(&hexium->video_dev, dev);
++      saa7146_vv_release(dev);
++
++      hexium_num--;
++
++      i2c_del_adapter(&hexium->i2c_adapter);
++      kfree(hexium);
++      return 0;
++}
++
++static int hexium_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg)
++{
++      struct saa7146_dev *dev = fh->dev;
++      struct hexium *hexium = (struct hexium *) dev->ext_priv;
++/*
++      struct saa7146_vv *vv = dev->vv_data; 
++*/
++      switch (cmd) {
++      case VIDIOC_ENUMINPUT:
++              {
++                      struct v4l2_input *i = arg;
++                      DEB_EE(("VIDIOC_ENUMINPUT %d.\n", i->index));
++
++                      if (i->index < 0 || i->index >= HEXIUM_INPUTS) {
++                              return -EINVAL;
++                      }
++
++                      memcpy(i, &hexium_inputs[i->index], sizeof(struct v4l2_input));
++
++                      DEB_D(("v4l2_ioctl: VIDIOC_ENUMINPUT %d.\n", i->index));
++                      return 0;
++              }
++      case VIDIOC_G_INPUT:
++              {
++                      int *input = (int *) arg;
++                      *input = hexium->cur_input;
++
++                      DEB_D(("VIDIOC_G_INPUT: %d\n", *input));
++                      return 0;
++              }
++      case VIDIOC_S_INPUT:
++              {
++                      int input = *(int *) arg;
++
++                      if (input < 0 || input >= HEXIUM_INPUTS) {
++                              return -EINVAL;
++                      }
++
++                      hexium->cur_input = input;
++
++                      /* fixme: switch input here, switch audio, too! */
++//              saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source, input_port_selection[input].hps_sync);
++                      printk("hexium_orion.o: VIDIOC_S_INPUT: fixme switch input.\n");
++
++                      return 0;
++              }
++      default:
++/*
++              DEB_D(("v4l2_ioctl does not handle this ioctl.\n"));
++*/
++              return -ENOIOCTLCMD;
++      }
++      return 0;
++}
++
++static int std_callback(struct saa7146_dev *dev, struct saa7146_standard *std)
++{
++      return 0;
++}
++
++static struct saa7146_extension extension;
++
++static struct saa7146_pci_extension_data hexium_hv_pci6 = {
++      .ext_priv = "Hexium HV-PCI6 / Orion",
++      .ext = &extension,
++};
++
++static struct saa7146_pci_extension_data hexium_orion_1svhs_3bnc = {
++      .ext_priv = "Hexium HV-PCI6 / Orion (1 SVHS/3 BNC)",
++      .ext = &extension,
++};
++
++static struct saa7146_pci_extension_data hexium_orion_4bnc = {
++      .ext_priv = "Hexium HV-PCI6 / Orion (4 BNC)",
++      .ext = &extension,
++};
++
++static struct pci_device_id pci_tbl[] = {
++      {
++       .vendor = PCI_VENDOR_ID_PHILIPS,
++       .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++       .subvendor = 0x0000,
++       .subdevice = 0x0000,
++       .driver_data = (unsigned long) &hexium_hv_pci6,
++       },
++      {
++       .vendor = PCI_VENDOR_ID_PHILIPS,
++       .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++       .subvendor = 0x17c8,
++       .subdevice = 0x0101,
++       .driver_data = (unsigned long) &hexium_orion_1svhs_3bnc,
++       },
++      {
++       .vendor = PCI_VENDOR_ID_PHILIPS,
++       .device = PCI_DEVICE_ID_PHILIPS_SAA7146,
++       .subvendor = 0x17c8,
++       .subdevice = 0x2101,
++       .driver_data = (unsigned long) &hexium_orion_4bnc,
++       },
++      {
++       .vendor = 0,
++       }
++};
++
++MODULE_DEVICE_TABLE(pci, pci_tbl);
++
++static struct saa7146_ext_vv vv_data = {
++      .inputs = HEXIUM_INPUTS,
++      .capabilities = 0,
++      .stds = &hexium_standards[0],
++      .num_stds = sizeof(hexium_standards) / sizeof(struct saa7146_standard),
++      .std_callback = &std_callback,
++      .ioctls = &ioctls[0],
++      .ioctl = hexium_ioctl,
++};
++
++static struct saa7146_extension extension = {
++      .name = "hexium HV-PCI6/Orion",
++      .flags = 0,             // SAA7146_USE_I2C_IRQ,
++
++      .pci_tbl = &pci_tbl[0],
++      .module = THIS_MODULE,
++
++      .probe = hexium_probe,
++      .attach = hexium_attach,
++      .detach = hexium_detach,
++
++      .irq_mask = 0,
++      .irq_func = NULL,
++};
++
++int __init hexium_init_module(void)
++{
++      if (0 != saa7146_register_extension(&extension)) {
++              DEB_S(("failed to register extension.\n"));
++              return -ENODEV;
++      }
++
++      return 0;
++}
++
++void __exit hexium_cleanup_module(void)
++{
++      saa7146_unregister_extension(&extension);
++}
++
++module_init(hexium_init_module);
++module_exit(hexium_cleanup_module);
++
++MODULE_DESCRIPTION("video4linux-2 driver for Hexium Orion frame grabber cards");
++MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
++MODULE_LICENSE("GPL");
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/media/video/hexium_orion.h      2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,138 @@
++#ifndef __HEXIUM_ORION__
++#define __HEXIUM_ORION__
++
++#include "hexium.h"
++
++static struct saa7146_extension_ioctls ioctls[] = {
++      { VIDIOC_G_INPUT,       SAA7146_EXCLUSIVE },
++      { VIDIOC_S_INPUT,       SAA7146_EXCLUSIVE },
++      { VIDIOC_ENUMINPUT,     SAA7146_EXCLUSIVE },
++      { VIDIOC_S_STD,         SAA7146_AFTER },
++      { 0,                    0 }
++};
++
++struct hexium
++{
++      int type;
++      struct video_device     video_dev;
++      struct i2c_adapter      i2c_adapter;    
++      int cur_input;  /* current input */
++};
++
++/* Philips SAA7110 decoder default registers */
++static u8 hexium_saa7110[53]={
++/*00*/ 0x4C,0x3C,0x0D,0xEF,0xBD,0xF0,0x00,0x00,
++/*08*/ 0xF8,0xF8,0x60,0x60,0x40,0x86,0x18,0x90,
++/*10*/ 0x00,0x2C,0x40,0x46,0x42,0x1A,0xFF,0xDA,
++/*18*/ 0xF0,0x8B,0x00,0x00,0x00,0x00,0x00,0x00,
++/*20*/ 0xD9,0x17,0x40,0x41,0x80,0x41,0x80,0x4F,
++/*28*/ 0xFE,0x01,0x0F,0x0F,0x03,0x01,0x81,0x03,
++/*30*/ 0x44,0x75,0x01,0x8C,0x03
++};
++
++static struct {
++      struct hexium_data data[8];     
++} hexium_input_select[] = {
++{
++      { /* input 0 */
++              { 0x06, 0x00 },
++              { 0x20, 0xD9 },
++              { 0x21, 0x17 }, // 0x16,
++              { 0x22, 0x40 },
++              { 0x2C, 0x03 },
++              { 0x30, 0x44 },
++              { 0x31, 0x75 }, // ??
++              { 0x21, 0x16 }, // 0x03,
++      }
++}, {
++      { /* input 1 */
++              { 0x06, 0x00 },
++              { 0x20, 0xD8 },
++              { 0x21, 0x17 }, // 0x16,
++              { 0x22, 0x40 },
++              { 0x2C, 0x03 },
++              { 0x30, 0x44 },
++              { 0x31, 0x75 }, // ??
++              { 0x21, 0x16 }, // 0x03,
++      }
++}, {
++      { /* input 2 */
++              { 0x06, 0x00 },
++              { 0x20, 0xBA },
++              { 0x21, 0x07 }, // 0x05,
++              { 0x22, 0x91 },
++              { 0x2C, 0x03 },
++              { 0x30, 0x60 },
++              { 0x31, 0xB5 }, // ??
++              { 0x21, 0x05 }, // 0x03,
++      }
++}, {
++      { /* input 3 */
++              { 0x06, 0x00 },
++              { 0x20, 0xB8 },
++              { 0x21, 0x07 }, // 0x05,
++              { 0x22, 0x91 },
++              { 0x2C, 0x03 },
++              { 0x30, 0x60 },
++              { 0x31, 0xB5 }, // ??
++              { 0x21, 0x05 }, // 0x03,
++      }
++}, {
++      { /* input 4 */
++              { 0x06, 0x00 },
++              { 0x20, 0x7C },
++              { 0x21, 0x07 }, // 0x03
++              { 0x22, 0xD2 },
++              { 0x2C, 0x83 },
++              { 0x30, 0x60 },
++              { 0x31, 0xB5 }, // ??
++              { 0x21, 0x03 },
++      } 
++}, {
++      { /* input 5 */
++              { 0x06, 0x00 },
++              { 0x20, 0x78 },
++              { 0x21, 0x07 }, // 0x03,
++              { 0x22, 0xD2 },
++              { 0x2C, 0x83 },
++              { 0x30, 0x60 },
++              { 0x31, 0xB5 }, // ?
++              { 0x21, 0x03 },
++      }
++}, {
++      { /* input 6 */
++              { 0x06, 0x80 },
++              { 0x20, 0x59 },
++              { 0x21, 0x17 },
++              { 0x22, 0x42 },
++              { 0x2C, 0xA3 },
++              { 0x30, 0x44 },
++              { 0x31, 0x75 },
++              { 0x21, 0x12 },
++      }
++}, {
++      { /* input 7 */
++              { 0x06, 0x80 },
++              { 0x20, 0x9A },
++              { 0x21, 0x17 },
++              { 0x22, 0xB1 },
++              { 0x2C, 0x13 },
++              { 0x30, 0x60 },
++              { 0x31, 0xB5 },
++              { 0x21, 0x14 },
++      }
++}, {
++      { /* input 8 */
++              { 0x06, 0x80 },
++              { 0x20, 0x3C },
++              { 0x21, 0x27 },
++              { 0x22, 0xC1 },
++              { 0x2C, 0x23 },
++              { 0x30, 0x44 },
++              { 0x31, 0x75 },
++              { 0x21, 0x21 },
++      }
++}     
++};
++
++#endif
+--- linux-2.6.0-test1/drivers/media/video/Kconfig      2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/media/video/Kconfig     2003-07-19 17:03:50.000000000 -0700
+@@ -257,5 +257,30 @@ config VIDEO_DPC
+         whenever you want). If you want to compile it as a module, say M
+         here and read <file:Documentation/modules.txt>.
++config VIDEO_HEXIUM_ORION
++      tristate "Hexium HV-PCI6 and Orion frame grabber"
++      depends on VIDEO_DEV && PCI
++      ---help---
++        This is a video4linux driver for the Hexium HV-PCI6 and
++        Orion frame grabber cards by Hexium.
++        
++        This driver is available as a module called hexium_orion
++        ( = code which can be inserted in and removed from the
++        running kernel whenever you want). If you want to compile
++        it as a module, say M here and read <file:Documentation/modules.txt>.
++
++config VIDEO_HEXIUM_GEMINI
++      tristate "Hexium Gemini frame grabber"
++      depends on VIDEO_DEV && PCI
++      ---help---
++        This is a video4linux driver for the Hexium Gemini frame
++        grabber card by Hexium. Please note that the Gemini Dual
++        card is *not* fully supported.
++        
++        This driver is available as a module called hexium_gemini
++        ( = code which can be inserted in and removed from the
++        running kernel whenever you want). If you want to compile
++        it as a module, say M here and read <file:Documentation/modules.txt>.
++
+ endmenu
+--- linux-2.6.0-test1/drivers/media/video/Makefile     2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/media/video/Makefile    2003-07-19 17:03:50.000000000 -0700
+@@ -31,6 +31,8 @@ obj-$(CONFIG_VIDEO_CPIA_USB) += cpia_usb
+ obj-$(CONFIG_VIDEO_MEYE) += meye.o
+ obj-$(CONFIG_VIDEO_SAA7134) += saa7134/
+ obj-$(CONFIG_VIDEO_MXB) += saa7111.o tuner.o tda9840.o tea6415c.o tea6420.o mxb.o
++obj-$(CONFIG_VIDEO_HEXIUM_ORION) += hexium_orion.o
++obj-$(CONFIG_VIDEO_HEXIUM_GEMINI) += hexium_gemini.o
+ obj-$(CONFIG_VIDEO_DPC) += saa7111.o dpc7146.o
+ obj-$(CONFIG_TUNER_3036) += tuner-3036.o
+--- linux-2.6.0-test1/drivers/media/video/mxb.c        2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/media/video/mxb.c       2003-07-19 17:03:50.000000000 -0700
+@@ -81,7 +81,7 @@ MODULE_PARM_DESC(debug, "debug verbosity
+ enum { TUNER, AUX1, AUX3, AUX3_YC };
+ static struct v4l2_input mxb_inputs[MXB_INPUTS] = {
+-      { TUNER,        "Tuner",                V4L2_INPUT_TYPE_TUNER,  1, 1, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, 
++      { TUNER,        "Tuner",                V4L2_INPUT_TYPE_TUNER,  1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, 
+       { AUX1,         "AUX1",                 V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+       { AUX3,         "AUX3 Composite",       V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+       { AUX3_YC,      "AUX3 S-Video",         V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+@@ -101,8 +101,8 @@ static struct {
+ /* this array holds the information of the audio source (mxb_audios),
+    which has to be switched corresponding to the video source (mxb_channels) */
+-static int video_audio_connect[MXB_AUDIOS] =
+-      { 0, 1, 2, 3, 3 };
++static int video_audio_connect[MXB_INPUTS] =
++      { 0, 1, 3, 3 };
+ /* these are the necessary input-output-pins for bringing one audio source
+ (see above) to the CD-output */
+@@ -173,8 +173,7 @@ struct mxb
+       int     cur_mute;       /* current mute status */
+ };
+-static
+-struct saa7146_extension extension;
++static struct saa7146_extension extension;
+ static int mxb_vbi_bypass(struct saa7146_dev* dev)
+ {
+@@ -431,10 +430,11 @@ static int mxb_init_done(struct saa7146_
+                  polling method ... */
+               extension.flags &= ~SAA7146_USE_I2C_IRQ;
+               for(i = 1;;i++) {
+-                      msg.len = mxb_saa7740_init[i].length;           
+-                      if (msg.len == -1U) {
++                      if( -1 == mxb_saa7740_init[i].length ) {
+                               break;
+                       }
++
++                      msg.len = mxb_saa7740_init[i].length;           
+                       msg.buf = &mxb_saa7740_init[i].data[0];
+                       if( 1 != (err = i2c_transfer(&mxb->i2c_adapter, &msg, 1))) {
+                               DEB_D(("failed to initialize 'sound arena module'.\n"));
+@@ -472,6 +472,8 @@ void mxb_irq_bh(struct saa7146_dev* dev,
+ }
+ */
++static struct saa7146_ext_vv vv_data;
++
+ /* this function only gets called when the probing was successful */
+ static int mxb_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
+ {
+@@ -482,7 +484,7 @@ static int mxb_attach(struct saa7146_dev
+       /* checking for i2c-devices can be omitted here, because we
+          already did this in "mxb_vl42_probe" */
+-      saa7146_vv_init(dev);
++      saa7146_vv_init(dev,&vv_data);
+       if( 0 != saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_GRABBER)) {
+               ERR(("cannot register capture v4l2 device. skipping.\n"));
+               return -1;
+@@ -566,8 +568,9 @@ static int saa7111_set_gpio(struct saa71
+       return 0;
+ }
+-static int mxb_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
++static int mxb_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg) 
+ {
++      struct saa7146_dev *dev = fh->dev;
+       struct mxb* mxb = (struct mxb*)dev->ext_priv;
+       struct saa7146_vv *vv = dev->vv_data; 
+       
+@@ -1002,20 +1005,35 @@ static int std_callback(struct saa7146_d
+ }
+ static struct saa7146_standard standard[] = {
+-      { "PAL-BG",     V4L2_STD_PAL_BG,        SAA7146_PAL_VALUES },
+-      { "PAL-I",      V4L2_STD_PAL_I,         SAA7146_PAL_VALUES },
+-      { "NTSC",       V4L2_STD_NTSC,          SAA7146_NTSC_VALUES },
+-      { "SECAM",      V4L2_STD_SECAM,         SAA7146_SECAM_VALUES },
++      {
++              .name   = "PAL-BG",     .id     = V4L2_STD_PAL_BG,
++              .v_offset       = 0x17, .v_field        = 288,  .v_calc         = 576,
++              .h_offset       = 0x14, .h_pixels       = 680,  .h_calc         = 680+1,
++              .v_max_out      = 576,  .h_max_out      = 768,
++      }, {
++              .name   = "PAL-I",      .id     = V4L2_STD_PAL_I,
++              .v_offset       = 0x17, .v_field        = 288,  .v_calc         = 576,
++              .h_offset       = 0x14, .h_pixels       = 680,  .h_calc         = 680+1,
++              .v_max_out      = 576,  .h_max_out      = 768,
++      }, {
++              .name   = "NTSC",       .id     = V4L2_STD_NTSC,
++              .v_offset       = 0x16, .v_field        = 240,  .v_calc         = 480,
++              .h_offset       = 0x06, .h_pixels       = 708,  .h_calc         = 708+1,
++              .v_max_out      = 480,  .h_max_out      = 640,
++      }, {
++              .name   = "SECAM",      .id     = V4L2_STD_SECAM,
++              .v_offset       = 0x14, .v_field        = 288,  .v_calc         = 576,
++              .h_offset       = 0x14, .h_pixels       = 720,  .h_calc         = 720+1,
++              .v_max_out      = 576,  .h_max_out      = 768,
++      }
+ };
+-static
+-struct saa7146_pci_extension_data mxb = {
++static struct saa7146_pci_extension_data mxb = {
+         .ext_priv = "Multimedia eXtension Board",
+         .ext = &extension,
+ };
+-static
+-struct pci_device_id pci_tbl[] = {
++static struct pci_device_id pci_tbl[] = {
+       {
+               .vendor    = PCI_VENDOR_ID_PHILIPS,
+               .device    = PCI_DEVICE_ID_PHILIPS_SAA7146,
+@@ -1029,8 +1047,7 @@ struct pci_device_id pci_tbl[] = {
+ MODULE_DEVICE_TABLE(pci, pci_tbl);
+-static
+-struct saa7146_ext_vv vv_data = {
++static struct saa7146_ext_vv vv_data = {
+       .inputs         = MXB_INPUTS,
+       .capabilities   = V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE,
+       .stds           = &standard[0],
+@@ -1040,14 +1057,12 @@ struct saa7146_ext_vv vv_data = {
+       .ioctl          = mxb_ioctl,
+ };
+-static
+-struct saa7146_extension extension = {
++static struct saa7146_extension extension = {
+       .name           = MXB_IDENTIFIER,
+       .flags          = SAA7146_USE_I2C_IRQ,
+       
+       .pci_tbl        = &pci_tbl[0],
+       .module         = THIS_MODULE,
+-      .ext_vv_data    = &vv_data,
+       .probe          = mxb_probe,
+       .attach         = mxb_attach,
+--- linux-2.6.0-test1/drivers/media/video/pms.c        2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/media/video/pms.c       2003-07-19 17:03:50.000000000 -0700
+@@ -12,6 +12,10 @@
+  *    Most of this code is directly derived from his userspace driver.
+  *    His driver works so send any reports to alan@redhat.com unless the
+  *    userspace driver also doesn't work for you...
++ *      
++ *      Changes:
++ *      08/07/2003        Daniele Bellucci <bellucda@tiscali.it>
++ *                        - pms_capture: report back -EFAULT 
+  */
+ #include <linux/module.h>
+@@ -659,7 +663,8 @@ static int pms_capture(struct pms_device
+                       if(dt+len>count)
+                               dt=count-len;
+                       cnt += dev->height;
+-                      copy_to_user(buf, tmp+32, dt);
++                      if (copy_to_user(buf, tmp+32, dt))
++                              return -EFAULT;
+                       buf += dt;    
+                       len += dt;
+               }
+--- linux-2.6.0-test1/drivers/message/fusion/mptctl.c  2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/message/fusion/mptctl.c 2003-07-19 17:03:50.000000000 -0700
+@@ -88,7 +88,6 @@
+ #include <linux/kdev_t.h>     /* needed for access to Scsi_Host struct */
+ #include <linux/blkdev.h>
+-#include <linux/blk.h>          /* for io_request_lock (spinlock) decl */
+ #include "../../scsi/scsi.h"
+ #include "../../scsi/hosts.h"
+--- linux-2.6.0-test1/drivers/message/fusion/mptscsih.c        2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/message/fusion/mptscsih.c       2003-07-19 17:03:50.000000000 -0700
+@@ -72,7 +72,6 @@
+ #include <linux/errno.h>
+ #include <linux/kdev_t.h>
+ #include <linux/blkdev.h>
+-#include <linux/blk.h>                /* for io_request_lock (spinlock) decl */
+ #include <linux/delay.h>      /* for mdelay */
+ #include <linux/interrupt.h>  /* needed for in_interrupt() proto */
+ #include <linux/reboot.h>     /* notifier code */
+--- linux-2.6.0-test1/drivers/message/i2o/i2o_block.c  2003-06-14 12:18:28.000000000 -0700
++++ 25/drivers/message/i2o/i2o_block.c 2003-07-19 17:03:50.000000000 -0700
+@@ -87,8 +87,6 @@
+ #define MAJOR_NR I2O_MAJOR
+-#include <linux/blk.h>
+-
+ #define MAX_I2OB      16
+ #define MAX_I2OB_DEPTH        8
+--- linux-2.6.0-test1/drivers/message/i2o/i2o_scsi.c   2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/message/i2o/i2o_scsi.c  2003-07-19 17:03:50.000000000 -0700
+@@ -54,7 +54,7 @@
+ #include <asm/system.h>
+ #include <asm/io.h>
+ #include <asm/atomic.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/i2o.h>
+ #include "../../scsi/scsi.h"
+ #include "../../scsi/hosts.h"
+--- linux-2.6.0-test1/drivers/mtd/devices/blkmtd.c     2003-06-26 22:07:24.000000000 -0700
++++ 25/drivers/mtd/devices/blkmtd.c    2003-07-19 17:07:03.000000000 -0700
+@@ -1189,6 +1189,7 @@ static int __init init_blkmtd(void)
+   INIT_LIST_HEAD(&mtd_rawdevice->as.locked_pages);
+   mtd_rawdevice->as.host = NULL;
+   init_MUTEX(&(mtd_rawdevice->as.i_shared_sem));
++  atomic_set(&(mtd_rawdevice->as.truncate_count), 0);
+   mtd_rawdevice->as.a_ops = &blkmtd_aops;
+   INIT_LIST_HEAD(&mtd_rawdevice->as.i_mmap);
+--- linux-2.6.0-test1/drivers/mtd/mtd_blkdevs.c        2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/mtd/mtd_blkdevs.c       2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,6 @@
+ #include <linux/mtd/blktrans.h>
+ #include <linux/mtd/mtd.h>
+ #include <linux/blkdev.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/spinlock.h>
+ #include <linux/hdreg.h>
+--- linux-2.6.0-test1/drivers/net/3c59x.c      2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/net/3c59x.c     2003-07-19 17:06:13.000000000 -0700
+@@ -291,8 +291,6 @@ MODULE_PARM(global_full_duplex, "i");
+ MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i");
+ MODULE_PARM(hw_checksums, "1-" __MODULE_STRING(8) "i");
+ MODULE_PARM(flow_ctrl, "1-" __MODULE_STRING(8) "i");
+-MODULE_PARM(global_enable_wol, "i");
+-MODULE_PARM(enable_wol, "1-" __MODULE_STRING(8) "i");
+ MODULE_PARM(rx_copybreak, "i");
+ MODULE_PARM(max_interrupt_work, "i");
+ MODULE_PARM(compaq_ioaddr, "i");
+@@ -306,8 +304,6 @@ MODULE_PARM_DESC(full_duplex, "3c59x ful
+ MODULE_PARM_DESC(global_full_duplex, "3c59x: same as full_duplex, but applies to all NICs if options is unset");
+ MODULE_PARM_DESC(hw_checksums, "3c59x Hardware checksum checking by adapter(s) (0-1)");
+ MODULE_PARM_DESC(flow_ctrl, "3c59x 802.3x flow control usage (PAUSE only) (0-1)");
+-MODULE_PARM_DESC(enable_wol, "3c59x: Turn on Wake-on-LAN for adapter(s) (0-1)");
+-MODULE_PARM_DESC(global_enable_wol, "3c59x: same as enable_wol, but applies to all NICs if options is unset");
+ MODULE_PARM_DESC(rx_copybreak, "3c59x copy breakpoint for copy-only-tiny-frames");
+ MODULE_PARM_DESC(max_interrupt_work, "3c59x maximum events handled per interrupt");
+ MODULE_PARM_DESC(compaq_ioaddr, "3c59x PCI I/O base address (Compaq BIOS problem workaround)");
+@@ -484,10 +480,8 @@ static struct vortex_chip_info {
+ } vortex_info_tbl[] __devinitdata = {
+       {"3c590 Vortex 10Mbps",
+        PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
+-#define EISA_3C592_OFFSET 1           /* Offset of this entry for vortex_eisa_init */
+       {"3c592 EISA 10Mbps Demon/Vortex",                                      /* AKPM: from Don's 3c59x_cb.c 0.49H */
+        PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
+-#define EISA_3C597_OFFSET 2           /* Offset of this entry for vortex_eisa_init */
+       {"3c597 EISA Fast Demon/Vortex",                                        /* AKPM: from Don's 3c59x_cb.c 0.49H */
+        PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
+       {"3c595 Vortex 100baseTx",
+@@ -819,7 +813,6 @@ struct vortex_private {
+               flow_ctrl:1,                                    /* Use 802.3x flow control (PAUSE only) */
+               partner_flow_ctrl:1,                    /* Partner supports flow control */
+               has_nway:1,
+-              enable_wol:1,                                   /* Wake-on-LAN is enabled */
+               pm_state_valid:1,                               /* power_state[] has sane contents */
+               open:1,
+               medialock:1,
+@@ -915,10 +908,8 @@ static int options[MAX_UNITS] = { -1, -1
+ static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+ static int hw_checksums[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+ static int flow_ctrl[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+-static int enable_wol[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+ static int global_options = -1;
+ static int global_full_duplex = -1;
+-static int global_enable_wol = -1;
+ /* #define dev_alloc_skb dev_alloc_skb_debug */
+@@ -960,8 +951,8 @@ static int vortex_resume (struct pci_dev
+ #ifdef CONFIG_EISA
+ static struct eisa_device_id vortex_eisa_ids[] = {
+-      { "TCM5920", EISA_3C592_OFFSET },
+-      { "TCM5970", EISA_3C597_OFFSET },
++      { "TCM5920", CH_3C592 },
++      { "TCM5970", CH_3C597 },
+       { "" }
+ };
+@@ -1138,8 +1129,6 @@ static int __devinit vortex_probe1(struc
+                       vortex_debug = 7;
+               if (option & 0x4000)
+                       vortex_debug = 2;
+-              if (option & 0x0400)
+-                      vp->enable_wol = 1;
+       }
+       print_info = (vortex_debug > 1);
+@@ -1227,16 +1216,12 @@ static int __devinit vortex_probe1(struc
+       if (global_full_duplex > 0)
+               vp->full_duplex = 1;
+-      if (global_enable_wol > 0)
+-              vp->enable_wol = 1;
+       if (card_idx < MAX_UNITS) {
+               if (full_duplex[card_idx] > 0)
+                       vp->full_duplex = 1;
+               if (flow_ctrl[card_idx] > 0)
+                       vp->flow_ctrl = 1;
+-              if (enable_wol[card_idx] > 0)
+-                      vp->enable_wol = 1;
+       }
+       vp->force_fd = vp->full_duplex;
+@@ -1379,7 +1364,7 @@ static int __devinit vortex_probe1(struc
+       } else
+               dev->if_port = vp->default_media;
+-      if ((vp->available_media & 0x4b) || (vci->drv_flags & HAS_NWAY) ||
++      if ((vp->available_media & 0x40) || (vci->drv_flags & HAS_NWAY) ||
+               dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) {
+               int phy, phy_idx = 0;
+               EL3WINDOW(4);
+@@ -1463,7 +1448,7 @@ static int __devinit vortex_probe1(struc
+       dev->set_multicast_list = set_rx_mode;
+       dev->tx_timeout = vortex_tx_timeout;
+       dev->watchdog_timeo = (watchdog * HZ) / 1000;
+-      if (pdev && vp->enable_wol) {
++      if (pdev) {
+               vp->pm_state_valid = 1;
+               pci_save_state(VORTEX_PCI(vp), vp->power_state);
+               acpi_set_WOL(dev);
+@@ -1520,7 +1505,7 @@ vortex_up(struct net_device *dev)
+       unsigned int config;
+       int i;
+-      if (VORTEX_PCI(vp) && vp->enable_wol) {
++      if (VORTEX_PCI(vp)) {
+               pci_set_power_state(VORTEX_PCI(vp), 0); /* Go active */
+               pci_restore_state(VORTEX_PCI(vp), vp->power_state);
+       }
+@@ -2669,7 +2654,7 @@ vortex_down(struct net_device *dev)
+       if (vp->full_bus_master_tx)
+               outl(0, ioaddr + DownListPtr);
+-      if (VORTEX_PCI(vp) && vp->enable_wol) {
++      if (VORTEX_PCI(vp)) {
+               pci_save_state(VORTEX_PCI(vp), vp->power_state);
+               acpi_set_WOL(dev);
+       }
+@@ -3059,7 +3044,7 @@ static void __devexit vortex_remove_one 
+       /* Should really use issue_and_wait() here */
+       outw(TotalReset|0x14, dev->base_addr + EL3_CMD);
+-      if (VORTEX_PCI(vp) && vp->enable_wol) {
++      if (VORTEX_PCI(vp)) {
+               pci_set_power_state(VORTEX_PCI(vp), 0); /* Go active */
+               if (vp->pm_state_valid)
+                       pci_restore_state(VORTEX_PCI(vp), vp->power_state);
+--- linux-2.6.0-test1/drivers/net/eql.c        2003-06-14 12:18:33.000000000 -0700
++++ 25/drivers/net/eql.c       2003-07-19 17:03:50.000000000 -0700
+@@ -162,22 +162,12 @@ static void eql_timer(unsigned long para
+ static char version[] __initdata = 
+       "Equalizer2002: Simon Janes (simon@ncm.com) and David S. Miller (davem@redhat.com)\n";
+-static int __init eql_init(struct net_device *dev)
++static void __init eql_setup(struct net_device *dev)
+ {
+-      static unsigned int version_printed;
+-      equalizer_t *eql;
++      equalizer_t *eql = dev->priv;
+       SET_MODULE_OWNER(dev);
+-      if (version_printed++ == 0)
+-              printk(version);
+-
+-      dev->priv = kmalloc(sizeof (equalizer_t), GFP_KERNEL);
+-      if (dev->priv == NULL)
+-              return -ENOMEM;
+-      memset(dev->priv, 0, sizeof (equalizer_t));
+-      eql = dev->priv;
+-
+       init_timer(&eql->timer);
+       eql->timer.data         = (unsigned long) dev->priv;
+       eql->timer.expires      = jiffies + EQL_DEFAULT_RESCHED_IVAL;
+@@ -203,8 +193,6 @@ static int __init eql_init(struct net_de
+       dev->type               = ARPHRD_SLIP;
+       dev->tx_queue_len       = 5;            /* Hands them off fast */
+-
+-      return 0;
+ }
+ static int eql_open(struct net_device *dev)
+@@ -598,23 +586,28 @@ static int eql_s_master_cfg(struct net_d
+       return -EINVAL;
+ }
+-static struct net_device dev_eql;
++static struct net_device *dev_eql;
+ static int __init eql_init_module(void)
+ {
+-      strcpy(dev_eql.name, "eql");
+-      dev_eql.init = eql_init;
+-      if (register_netdev(&dev_eql) != 0) {
+-              printk("eql: register_netdev() returned non-zero.\n");
+-              return -EIO;
+-      }
+-      return 0;
++      int err;
++
++      printk(version);
++
++      dev_eql = alloc_netdev(sizeof(equalizer_t), "eql", eql_setup);
++      if (!dev_eql)
++              return -ENOMEM;
++
++      err = register_netdev(dev_eql);
++      if (err) 
++              kfree(dev_eql);
++      return err;
+ }
+ static void __exit eql_cleanup_module(void)
+ {
+-      kfree(dev_eql.priv);
+-      unregister_netdev(&dev_eql);
++      unregister_netdev(dev_eql);
++      kfree(dev_eql);
+ }
+ module_init(eql_init_module);
+--- linux-2.6.0-test1/drivers/net/fc/iph5526.c 2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/net/fc/iph5526.c        2003-07-19 17:03:50.000000000 -0700
+@@ -48,7 +48,6 @@ static const char *version =
+ #include <linux/timer.h>
+ #include <linux/spinlock.h>
+ #include <linux/netdevice.h>
+-#include <linux/blk.h>
+ #include <linux/fcdevice.h> /* had the declarations for init_fcdev among
+                              others + includes if_fcdevice.h */
+--- linux-2.6.0-test1/drivers/net/irda/vlsi_ir.c       2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/net/irda/vlsi_ir.c      2003-07-19 17:03:50.000000000 -0700
+@@ -474,10 +474,8 @@ static ssize_t vlsi_proc_read(struct fil
+       if (pos + nbytes > size)
+               nbytes = size - pos;
+-      if (!access_ok(VERIFY_WRITE, buf, nbytes))
+-              return -EINVAL;
+-
+-      copy_to_user(buf, procdata->data + pos, nbytes);
++      if (copy_to_user(buf, procdata->data + pos, nbytes))
++              return -EFAULT;
+       *ppos += nbytes;
+--- linux-2.6.0-test1/drivers/net/Kconfig      2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/net/Kconfig     2003-07-19 17:03:50.000000000 -0700
+@@ -1153,7 +1153,7 @@ config ZNET
+ config SEEQ8005
+       tristate "SEEQ8005 support (EXPERIMENTAL)"
+-      depends on NET_ISA && OBSOLETE && EXPERIMENTAL
++      depends on NET_ISA && EXPERIMENTAL
+       help
+         This is a driver for the SEEQ 8005 network (Ethernet) card.  If this
+         is for you, read the Ethernet-HOWTO, available from
+--- linux-2.6.0-test1/drivers/net/ni65.c       2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/net/ni65.c      2003-07-19 17:03:50.000000000 -0700
+@@ -245,6 +245,7 @@ struct priv
+       int cmdr_addr;
+       int cardno;
+       int features;
++      spinlock_t ring_lock;
+ };
+ static int  ni65_probe1(struct net_device *dev,int);
+@@ -299,7 +300,7 @@ static int ni65_open(struct net_device *
+       int irqval = request_irq(dev->irq, &ni65_interrupt,0,
+                         cards[p->cardno].cardname,dev);
+       if (irqval) {
+-              printk ("%s: unable to get IRQ %d (irqval=%d).\n",
++              printk(KERN_ERR "%s: unable to get IRQ %d (irqval=%d).\n",
+                         dev->name,dev->irq, irqval);
+               return -EAGAIN;
+       }
+@@ -409,12 +410,14 @@ static int __init ni65_probe1(struct net
+       p = (struct priv *) dev->priv;
+       p->cmdr_addr = ioaddr + cards[i].cmd_offset;
+       p->cardno = i;
++      spin_lock_init(&p->ring_lock);
+-      printk("%s: %s found at %#3x, ", dev->name, cards[p->cardno].cardname , ioaddr);
++      printk(KERN_INFO "%s: %s found at %#3x, ", dev->name, cards[p->cardno].cardname , ioaddr);
+       outw(inw(PORT+L_RESET),PORT+L_RESET); /* first: reset the card */
+       if( (j=readreg(CSR0)) != 0x4) {
+-               printk(KERN_ERR "can't RESET card: %04x\n",j);
++               printk("failed.\n");
++               printk(KERN_ERR "%s: Can't RESET card: %04x\n", dev->name, j);
+                ni65_free_buffer(p);
+                release_region(ioaddr, cards[p->cardno].total_size);
+                return -EAGAIN;
+@@ -467,7 +470,8 @@ static int __init ni65_probe1(struct net
+                                       break;
+                       }
+                       if(i == 5) {
+-                              printk("Can't detect DMA channel!\n");
++                              printk("failed.\n");
++                              printk(KERN_ERR "%s: Can't detect DMA channel!\n", dev->name);
+                               ni65_free_buffer(p);
+                               release_region(ioaddr, cards[p->cardno].total_size);
+                               return -EAGAIN;
+@@ -480,13 +484,13 @@ static int __init ni65_probe1(struct net
+               if(dev->irq < 2)
+               {
+-                      unsigned long irq_mask, delay;
++                      unsigned long irq_mask;
+                       ni65_init_lance(p,dev->dev_addr,0,0);
+                       irq_mask = probe_irq_on();
+                       writereg(CSR0_INIT|CSR0_INEA,CSR0); /* trigger interrupt */
+-                      delay = jiffies + HZ/50;
+-                      while (time_before(jiffies, delay)) ;
++                      set_current_state(TASK_UNINTERRUPTIBLE);
++                      schedule_timeout(HZ/50);
+                       dev->irq = probe_irq_off(irq_mask);
+                       if(!dev->irq)
+                       {
+@@ -503,7 +507,7 @@ static int __init ni65_probe1(struct net
+       if(request_dma(dev->dma, cards[p->cardno].cardname ) != 0)
+       {
+-              printk("%s: Can't request dma-channel %d\n",dev->name,(int) dev->dma);
++              printk(KERN_ERR "%s: Can't request dma-channel %d\n",dev->name,(int) dev->dma);
+               ni65_free_buffer(p);
+               release_region(ioaddr, cards[p->cardno].total_size);
+               return -EAGAIN;
+@@ -570,7 +574,7 @@ static void *ni65_alloc_mem(struct net_d
+       if(type) {
+               ret = skb = alloc_skb(2+16+size,GFP_KERNEL|GFP_DMA);
+               if(!skb) {
+-                      printk("%s: unable to allocate %s memory.\n",dev->name,what);
++                      printk(KERN_WARNING "%s: unable to allocate %s memory.\n",dev->name,what);
+                       return NULL;
+               }
+               skb->dev = dev;
+@@ -581,12 +585,12 @@ static void *ni65_alloc_mem(struct net_d
+       else {
+               ret = ptr = kmalloc(T_BUF_SIZE,GFP_KERNEL | GFP_DMA);
+               if(!ret) {
+-                      printk("%s: unable to allocate %s memory.\n",dev->name,what);
++                      printk(KERN_WARNING "%s: unable to allocate %s memory.\n",dev->name,what);
+                       return NULL;
+               }
+       }
+       if( (u32) virt_to_phys(ptr+size) > 0x1000000) {
+-              printk("%s: unable to allocate %s memory in lower 16MB!\n",dev->name,what);
++              printk(KERN_WARNING "%s: unable to allocate %s memory in lower 16MB!\n",dev->name,what);
+               if(type)
+                       kfree_skb(skb);
+               else
+@@ -692,7 +696,7 @@ static void ni65_stop_start(struct net_d
+       writedatareg(CSR0_STOP);
+       if(debuglevel > 1)
+-              printk("ni65_stop_start\n");
++              printk(KERN_DEBUG "ni65_stop_start\n");
+       if(p->features & INIT_RING_BEFORE_START) {
+               int i;
+@@ -846,6 +850,8 @@ static irqreturn_t ni65_interrupt(int ir
+       p = (struct priv *) dev->priv;
++      spin_lock(&p->ring_lock);
++      
+       while(--bcnt) {
+               csr0 = inw(PORT+L_DATAREG);
+@@ -867,7 +873,7 @@ static irqreturn_t ni65_interrupt(int ir
+               {
+                       struct priv *p = (struct priv *) dev->priv;
+                       if(debuglevel > 1)
+-                              printk("%s: general error: %04x.\n",dev->name,csr0);
++                              printk(KERN_ERR "%s: general error: %04x.\n",dev->name,csr0);
+                       if(csr0 & CSR0_BABL)
+                               p->stats.tx_errors++;
+                       if(csr0 & CSR0_MISS) {
+@@ -879,7 +885,7 @@ static irqreturn_t ni65_interrupt(int ir
+                       }
+                       if(csr0 & CSR0_MERR) {
+                               if(debuglevel > 1)
+-                                      printk("%s: Ooops .. memory error: %04x.\n",dev->name,csr0);
++                                      printk(KERN_ERR "%s: Ooops .. memory error: %04x.\n",dev->name,csr0);
+                               ni65_stop_start(dev,p);
+                       }
+               }
+@@ -932,12 +938,13 @@ static irqreturn_t ni65_interrupt(int ir
+ #endif
+       if( (csr0 & (CSR0_RXON | CSR0_TXON)) != (CSR0_RXON | CSR0_TXON) ) {
+-              printk("%s: RX or TX was offline -> restart\n",dev->name);
++              printk(KERN_DEBUG "%s: RX or TX was offline -> restart\n",dev->name);
+               ni65_stop_start(dev,p);
+       }
+       else
+               writedatareg(CSR0_INEA);
++      spin_unlock(&p->ring_lock);
+       return IRQ_HANDLED;
+ }
+@@ -1147,9 +1154,7 @@ static int ni65_send_packet(struct sk_bu
+                               memset((char *)p->tmdbounce[p->tmdbouncenum]+skb->len, 0, len-skb->len);
+                       dev_kfree_skb (skb);
+-                      save_flags(flags);
+-                      cli();
+-
++                      spin_lock_irqsave(&p->ring_lock, flags);
+                       tmdp = p->tmdhead + p->tmdnum;
+                       tmdp->u.buffer = (u32) isa_virt_to_bus(p->tmdbounce[p->tmdbouncenum]);
+                       p->tmdbouncenum = (p->tmdbouncenum + 1) & (TMDNUM - 1);
+@@ -1157,8 +1162,7 @@ static int ni65_send_packet(struct sk_bu
+ #ifdef XMT_VIA_SKB
+               }
+               else {
+-                      save_flags(flags);
+-                      cli();
++                      spin_lock_irqsave(&p->ring_lock, flags);
+                       tmdp = p->tmdhead + p->tmdnum;
+                       tmdp->u.buffer = (u32) isa_virt_to_bus(skb->data);
+@@ -1178,8 +1182,8 @@ static int ni65_send_packet(struct sk_bu
+                       
+               p->lock = 0;
+               dev->trans_start = jiffies;
+-
+-              restore_flags(flags);
++              
++              spin_unlock_irqrestore(&p->ring_lock, flags);
+       }
+       return 0;
+@@ -1238,10 +1242,8 @@ void cleanup_module(void)
+ {
+       struct priv *p;
+       p = (struct priv *) dev_ni65.priv;
+-      if(!p) {
+-              printk("Ooops .. no private struct\n");
+-              return;
+-      }
++      if(!p)
++              BUG();
+       disable_dma(dev_ni65.dma);
+       free_dma(dev_ni65.dma);
+       unregister_netdev(&dev_ni65);
+@@ -1250,6 +1252,7 @@ void cleanup_module(void)
+       dev_ni65.priv = NULL;
+ }
+ #endif /* MODULE */
++
+ MODULE_LICENSE("GPL");
+ /*
+--- linux-2.6.0-test1/drivers/net/ni65.h       2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/net/ni65.h      2003-07-19 17:03:50.000000000 -0700
+@@ -20,32 +20,32 @@
+ #define CSR0_BABL     0x4000  /* Babble transmitter timeout error (RC) */
+ #define CSR0_CERR     0x2000  /* Collision Error (RC) */
+ #define CSR0_MISS     0x1000  /* Missed packet (RC) */
+-#define CSR0_MERR     0x0800  /* Memory Error (RC) */ 
++#define CSR0_MERR     0x0800  /* Memory Error (RC) */
+ #define CSR0_RINT     0x0400  /* Receiver Interrupt (RC) */
+-#define CSR0_TINT       0x0200        /* Transmit Interrupt (RC) */ 
++#define CSR0_TINT       0x0200        /* Transmit Interrupt (RC) */
+ #define CSR0_IDON     0x0100  /* Initialization Done (RC) */
+ #define CSR0_INTR     0x0080  /* Interrupt Flag (R) */
+ #define CSR0_INEA     0x0040  /* Interrupt Enable (RW) */
+ #define CSR0_RXON     0x0020  /* Receiver on (R) */
+-#define CSR0_TXON     0x0010  /* Transmitter on (R) */
++#define CSR0_TXON     0x0010  /* Transmitter on (R) */
+ #define CSR0_TDMD     0x0008  /* Transmit Demand (RS) */
+-#define CSR0_STOP     0x0004  /* Stop (RS) */
++#define CSR0_STOP     0x0004  /* Stop (RS) */
+ #define CSR0_STRT     0x0002  /* Start (RS) */
+ #define CSR0_INIT     0x0001  /* Initialize (RS) */
+-#define CSR0_CLRALL    0x7f00  /* mask for all clearable bits */
++#define CSR0_CLRALL    0x7f00 /* mask for all clearable bits */
+ /*
+  *    Initialization Block  Mode operation Bit Definitions.
+  */
+ #define M_PROM                0x8000  /* Promiscuous Mode */
+-#define M_INTL                0x0040  /* Internal Loopback */
+-#define M_DRTY                0x0020  /* Disable Retry */ 
++#define M_INTL                0x0040  /* Internal Loopback */
++#define M_DRTY                0x0020  /* Disable Retry */
+ #define M_COLL                0x0010  /* Force Collision */
+ #define M_DTCR                0x0008  /* Disable Transmit CRC) */
+ #define M_LOOP                0x0004  /* Loopback */
+-#define M_DTX         0x0002  /* Disable the Transmitter */ 
+-#define M_DRX         0x0001  /* Disable the Receiver */
++#define M_DTX         0x0002  /* Disable the Transmitter */
++#define M_DRX         0x0001  /* Disable the Receiver */
+ /*
+@@ -56,7 +56,7 @@
+ #define RCV_ERR               0x40    /* Error Summary */
+ #define RCV_FRAM      0x20    /* Framing Error */
+ #define RCV_OFLO      0x10    /* Overflow Error */
+-#define RCV_CRC               0x08    /* CRC Error */ 
++#define RCV_CRC               0x08    /* CRC Error */
+ #define RCV_BUF_ERR   0x04    /* Buffer Error */
+ #define RCV_START     0x02    /* Start of Packet */
+ #define RCV_END               0x01    /* End of Packet */
+@@ -67,7 +67,7 @@
+  */
+ #define XMIT_OWN      0x80    /* owner bit 0 = host, 1 = lance */
+-#define XMIT_ERR      0x40    /* Error Summary */
++#define XMIT_ERR      0x40    /* Error Summary */
+ #define XMIT_RETRY    0x10    /* more the 1 retry needed to Xmit */
+ #define XMIT_1_RETRY  0x08    /* one retry needed to Xmit */
+ #define XMIT_DEF      0x04    /* Deferred */
+@@ -78,53 +78,44 @@
+  * transmit status (2) (valid if XMIT_ERR == 1)
+  */
+-#define XMIT_TDRMASK    0x03ff  /* time-domain-reflectometer-value */
+-#define XMIT_RTRY     0x0400  /* Failed after 16 retransmissions  */
+-#define XMIT_LCAR     0x0800  /* Loss of Carrier */
+-#define XMIT_LCOL     0x1000  /* Late collision */
+-#define XMIT_RESERV   0x2000  /* Reserved */
+-#define XMIT_UFLO     0x4000  /* Underflow (late memory) */
+-#define XMIT_BUFF     0x8000  /* Buffering error (no ENP) */
+-
+-struct init_block 
+-{
+-  unsigned short mode;
+-  unsigned char eaddr[6];
+-  unsigned char filter[8];
+-  /* bit 29-31: number of rmd's (power of 2) */
+-  u32 rrp;   /* receive ring pointer (align 8) */
+-  /* bit 29-31: number of tmd's (power of 2) */
+-  u32 trp;   /* transmit ring pointer (align 8) */
++#define XMIT_TDRMASK    0x03ff        /* time-domain-reflectometer-value */
++#define XMIT_RTRY     0x0400  /* Failed after 16 retransmissions  */
++#define XMIT_LCAR     0x0800  /* Loss of Carrier */
++#define XMIT_LCOL     0x1000  /* Late collision */
++#define XMIT_RESERV   0x2000  /* Reserved */
++#define XMIT_UFLO     0x4000  /* Underflow (late memory) */
++#define XMIT_BUFF     0x8000  /* Buffering error (no ENP) */
++
++struct init_block {
++      unsigned short mode;
++      unsigned char eaddr[6];
++      unsigned char filter[8];
++      /* bit 29-31: number of rmd's (power of 2) */
++      u32 rrp;                /* receive ring pointer (align 8) */
++      /* bit 29-31: number of tmd's (power of 2) */
++      u32 trp;                /* transmit ring pointer (align 8) */
+ };
+-struct rmd /* Receive Message Descriptor */
+-{ 
+-  union
+-  {
+-    volatile u32 buffer;
+-    struct 
+-    {
+-      volatile unsigned char dummy[3];
+-      volatile unsigned char status; 
+-    } s;
+-  } u;
+-  volatile short blen;
+-  volatile unsigned short mlen;
++struct rmd {                  /* Receive Message Descriptor */
++      union {
++              volatile u32 buffer;
++              struct {
++                      volatile unsigned char dummy[3];
++                      volatile unsigned char status;
++              } s;
++      } u;
++      volatile short blen;
++      volatile unsigned short mlen;
+ };
+-struct tmd
+-{
+-  union 
+-  {
+-    volatile u32 buffer;
+-    struct 
+-    {
+-      volatile unsigned char dummy[3];
+-      volatile unsigned char status;
+-    } s;
+-  } u;
+-  volatile unsigned short blen;
+-  volatile unsigned short status2;
++struct tmd {
++      union {
++              volatile u32 buffer;
++              struct {
++                      volatile unsigned char dummy[3];
++                      volatile unsigned char status;
++              } s;
++      } u;
++      volatile unsigned short blen;
++      volatile unsigned short status2;
+ };
+-
+-
+--- linux-2.6.0-test1/drivers/net/pcmcia/Kconfig       2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/net/pcmcia/Kconfig      2003-07-19 17:03:50.000000000 -0700
+@@ -113,7 +113,7 @@ config PCMCIA_XIRC2PS
+         If unsure, say N.
+ config PCMCIA_AXNET
+-      tristate "broken NS8390-cards support"
++      tristate "Asix AX88190 PCMCIA support"
+       depends on NET_PCMCIA && PCMCIA
+       ---help---
+         Say Y here if you intend to attach an Asix AX88190-based PCMCIA
+--- linux-2.6.0-test1/drivers/net/seeq8005.c   2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/net/seeq8005.c  2003-07-19 17:03:50.000000000 -0700
+@@ -700,7 +700,8 @@ static void hardware_send_packet(struct 
+  * wait_for_buffer
+  *
+  * This routine waits for the SEEQ chip to assert that the FIFO is ready
+- * by checking for a window interrupt, and then clearing it
++ * by checking for a window interrupt, and then clearing it. This has to
++ * occur in the interrupt handler!
+  */
+ inline void wait_for_buffer(struct net_device * dev)
+ {
+@@ -710,7 +711,7 @@ inline void wait_for_buffer(struct net_d
+       
+       tmp = jiffies + HZ;
+       while ( ( ((status=inw(SEEQ_STATUS)) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, tmp))
+-              mb();
++              cpu_relax();
+               
+       if ( (status & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
+               outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
+--- linux-2.6.0-test1/drivers/net/wan/comx-hw-comx.c   2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/net/wan/comx-hw-comx.c  2003-07-19 17:03:50.000000000 -0700
+@@ -11,6 +11,7 @@
+  *
+  * Contributors:
+  * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 0.86
++ * Daniele Bellucci         <bellucda@tiscali.it>   - 0.87
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+@@ -42,9 +43,12 @@
+  *            - printk cleanups
+  * Version 0.86 (00/08/15):
+  *            - resource release on failure at COMX_init
++ *
++ * Version 0.87 (03/07/09)
++ *              - audit copy_from_user in comxhw_write_proc
+  */
+-#define VERSION "0.86"
++#define VERSION "0.87"
+ #include <linux/module.h>
+ #include <linux/version.h>
+@@ -1084,7 +1088,8 @@ static int comxhw_write_proc(struct file
+               if (hw->firmware->data) {
+                       kfree(hw->firmware->data);
+               }
+-              copy_from_user(tmp + file->f_pos, buffer, count);
++              if (copy_from_user(tmp + file->f_pos, buffer, count))
++                      return -EFAULT;
+               hw->firmware->len = entry->size = file->f_pos + count;
+               hw->firmware->data = tmp;
+               file->f_pos += count;
+--- linux-2.6.0-test1/drivers/net/wan/sdladrv.c        2003-06-14 12:18:03.000000000 -0700
++++ 25/drivers/net/wan/sdladrv.c       2003-07-19 17:03:50.000000000 -0700
+@@ -160,10 +160,6 @@
+ /****** Function Prototypes *************************************************/
+-/* Module entry points. These are called by the OS and must be public. */
+-int init_module (void);
+-void cleanup_module (void);
+-
+ /* Hardware-specific functions */
+ static int sdla_detect        (sdlahw_t* hw);
+ static int sdla_autodpm       (sdlahw_t* hw);
+@@ -325,11 +321,7 @@ static int pci_slot_ar[MAX_S514_CARDS];
+  * Context:   process
+  */
+-#ifdef MODULE
+-int init_module (void)
+-#else
+ int sdladrv_init(void)
+-#endif
+ {
+       int i=0;
+@@ -354,9 +346,12 @@ int sdladrv_init(void)
+  * Module 'remove' entry point.
+  * o release all remaining system resources
+  */
+-void cleanup_module (void)
++static void sdladrv_cleanup(void)
+ {
+ }
++
++module_init(sdladrv_init);
++module_cleanup(sdladrv_cleanup);
+ #endif
+ /******* Kernel APIs ********************************************************/
+--- linux-2.6.0-test1/drivers/net/wan/sdlamain.c       2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/net/wan/sdlamain.c      2003-07-19 17:03:50.000000000 -0700
+@@ -177,10 +177,6 @@ static void dbg_kfree(void * v, int line
+ extern void disable_irq(unsigned int);
+ extern void enable_irq(unsigned int);
+  
+-/* Module entry points */
+-int init_module (void);
+-void cleanup_module (void);
+-
+ /* WAN link driver entry points */
+ static int setup(struct wan_device* wandev, wandev_conf_t* conf);
+ static int shutdown(struct wan_device* wandev);
+@@ -246,11 +242,7 @@ static int wanpipe_bh_critical=0;
+  * Context:   process
+  */
+  
+-#ifdef MODULE
+-int init_module (void)
+-#else
+ int wanpipe_init(void)
+-#endif
+ {
+       int cnt, err = 0;
+@@ -313,7 +305,7 @@ int wanpipe_init(void)
+  * o unregister all adapters from the WAN router
+  * o release all remaining system resources
+  */
+-void cleanup_module (void)
++static void wanpipe_cleanup(void)
+ {
+       int i;
+@@ -329,6 +321,8 @@ void cleanup_module (void)
+       printk(KERN_INFO "\nwanpipe: WANPIPE Modules Unloaded.\n");
+ }
++module_init(wanpipe_init);
++module_exit(wanpipe_cleanup);
+ #endif
+ /******* WAN Device Driver Entry Points *************************************/
+--- linux-2.6.0-test1/drivers/net/wan/syncppp.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/net/wan/syncppp.c       2003-07-19 17:03:50.000000000 -0700
+@@ -161,7 +161,7 @@ static int debug;
+  * then put the packet into tx_queue, and call sppp_flush_xmit()
+  * after spinlock is released.
+  */
+-static void sppp_flush_xmit()
++static void sppp_flush_xmit(void)
+ {
+       struct sk_buff *skb;
+       while ((skb = skb_dequeue(&tx_queue)) != NULL)
+--- linux-2.6.0-test1/drivers/net/wireless/airo.c      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/net/wireless/airo.c     2003-07-19 17:06:31.000000000 -0700
+@@ -927,9 +927,8 @@ static int enable_MAC( struct airo_info 
+ static void disable_MAC(struct airo_info *ai);
+ static void enable_interrupts(struct airo_info*);
+ static void disable_interrupts(struct airo_info*);
+-static u16 issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp);
+-static u16 sendcommand(struct airo_info *ai, Cmd *pCmd);
+-static void completecommand(struct airo_info *ai, Resp *pRsp);
++static int issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp);
++static int issuecommand_nolock(struct airo_info*, Cmd *pCmd, Resp *pRsp);
+ static int bap_setup(struct airo_info*, u16 rid, u16 offset, int whichbap);
+ static int aux_bap_read(struct airo_info*, u16 *pu16Dst, int bytelen,
+                       int whichbap);
+@@ -939,13 +938,14 @@ static int bap_write(struct airo_info*, 
+                    int whichbap);
+ static int PC4500_accessrid(struct airo_info*, u16 rid, u16 accmd);
+ static int PC4500_readrid(struct airo_info*, u16 rid, void *pBuf, int len);
++static int PC4500_readrid_nolock(struct airo_info*, u16 rid, void *pBuf, int len);
+ static int PC4500_writerid(struct airo_info*, u16 rid, const void
+                          *pBuf, int len);
+ static int do_writerid( struct airo_info*, u16 rid, const void *rid_data,
+                       int len );
+ static u16 transmit_allocate(struct airo_info*, int lenPayload, int raw);
+-static int transmit_802_3_packet(struct airo_info*, int len, char *pPacket);
+-static int transmit_802_11_packet(struct airo_info*, int len, char *pPacket);
++static int transmit_802_3_packet(struct airo_info*, u16 txFid, char *pPacket, int len);
++static int transmit_802_11_packet(struct airo_info*, u16 txFid, char *pPacket, int len);
+ static irqreturn_t airo_interrupt( int irq, void* dev_id, struct pt_regs
+                           *regs);
+@@ -981,12 +981,11 @@ struct airo_info {
+       struct timer_list timer;
+       struct proc_dir_entry *proc_entry;
+       struct airo_info *next;
+-        spinlock_t aux_lock;
++      spinlock_t main_lock;
+         unsigned long flags;
+ #define FLAG_PROMISC   IFF_PROMISC    /* 0x100 - include/linux/if.h */
+ #define FLAG_RADIO_OFF 0x02           /* User disabling of MAC */
+ #define FLAG_RADIO_DOWN 0x08          /* ifup/ifdown disabling of MAC */
+-#define FLAG_LOCKED    2              /* 0x04 - use as a bit offset */
+ #define FLAG_FLASHING  0x10
+ #define FLAG_ADHOC        0x01 /* Needed by MIC */
+ #define FLAG_MIC_CAPABLE  0x20
+@@ -997,14 +996,8 @@ struct airo_info {
+                       int whichbap);
+       unsigned short *flash;
+       tdsRssiEntry *rssi;
+-      struct semaphore sem;
+       struct task_struct *task;
+       struct work_struct promisc_task;
+-      struct {
+-              struct sk_buff *skb;
+-              int fid;
+-              struct work_struct task;
+-      } xmit, xmit11;
+       struct net_device *wifidev;
+ #ifdef WIRELESS_EXT
+       struct iw_statistics    wstats;         // wireless stats
+@@ -1045,10 +1038,8 @@ static int readBSSListRid(struct airo_in
+       if (first == 1) {
+                       memset(&cmd, 0, sizeof(cmd));
+                       cmd.cmd=CMD_LISTBSS;
+-                      if (down_interruptible(&ai->sem))
+-                              return -ERESTARTSYS;
+                       issuecommand(ai, &cmd, &rsp);
+-                      up(&ai->sem);
++
+                       /* Let the command take effect */
+                       set_current_state (TASK_INTERRUPTIBLE);
+                       ai->task = current;
+@@ -1193,7 +1184,7 @@ static int readStatusRid(struct airo_inf
+       statr->len = le16_to_cpu(statr->len);
+       for(s = &statr->mode; s <= &statr->SSIDlen; s++) *s = le16_to_cpu(*s);
+-      for(s = &statr->beaconPeriod; s <= &statr->_reserved[9]; s++)
++      for(s = &statr->beaconPeriod; s <= &statr->_reserved1; s++)
+               *s = le16_to_cpu(*s);
+       return rc;
+@@ -1306,44 +1297,15 @@ static void get_tx_error(struct airo_inf
+       }
+ }
+-static void airo_do_xmit(struct net_device *dev) {
+-      u16 status;
+-      int i;
+-      struct airo_info *priv = dev->priv;
+-      struct sk_buff *skb = priv->xmit.skb;
+-      int fid = priv->xmit.fid;
+-      u32 *fids = priv->fids;
+-
+-      if (down_trylock(&priv->sem) != 0) {
+-              netif_stop_queue(dev);
+-              priv->xmit.task.func = (void (*)(void *))airo_do_xmit;
+-              priv->xmit.task.data = (void *)dev;
+-              schedule_work(&priv->xmit.task);
+-              return;
+-      }
+-      status = transmit_802_3_packet (priv, fids[fid], skb->data);
+-      up(&priv->sem);
+-
+-      i = 0;
+-      if ( status == SUCCESS ) {
+-              dev->trans_start = jiffies;
+-              for (; i < MAX_FIDS / 2 && (priv->fids[i] & 0xffff0000); i++);
+-      } else {
+-              priv->fids[fid] &= 0xffff;
+-              priv->stats.tx_window_errors++;
+-      }
+-      if (i < MAX_FIDS / 2)
+-              netif_wake_queue(dev);
+-      else
+-              netif_stop_queue(dev);
+-      dev_kfree_skb(skb);
+-}
+-
+-static int airo_start_xmit(struct sk_buff *skb, struct net_device *dev) {
+-      s16 len;
++static int airo_start_xmit(struct sk_buff *skb, struct net_device *dev)
++{
++      int len;
+       int i;
++      int ret = 0;
++      int status;
++      unsigned long flags;
+       struct airo_info *priv = dev->priv;
+-      u32 *fids = priv->fids;
++      int *fids = priv->fids;
+       if ( skb == NULL ) {
+               printk( KERN_ERR "airo:  skb == NULL!!!\n" );
+@@ -1351,61 +1313,50 @@ static int airo_start_xmit(struct sk_buf
+       }
+       /* Find a vacant FID */
+-      for( i = 0; i < MAX_FIDS / 2 && (fids[i] & 0xffff0000); i++ );
+-
+-      if ( i == MAX_FIDS / 2 ) {
+-              priv->stats.tx_fifo_errors++;
+-              dev_kfree_skb(skb);
+-      } else {
+-              /* check min length*/
+-              len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
+-              /* Mark fid as used & save length for later */
+-              fids[i] |= (len << 16);
+-              priv->xmit.skb = skb;
+-              priv->xmit.fid = i;
+-              airo_do_xmit(dev);
+-      }
+-      return 0;
+-}
++      spin_lock_irqsave(&priv->main_lock, flags);
++      for (i = 0; i < MAX_FIDS / 2 && (fids[i] & 0xffff0000); i++);
+-static void airo_do_xmit11(struct net_device *dev) {
+-      u16 status;
+-      int i;
+-      struct airo_info *priv = dev->priv;
+-      struct sk_buff *skb = priv->xmit11.skb;
+-      int fid = priv->xmit11.fid;
+-      u32 *fids = priv->fids;
+-
+-      if (down_trylock(&priv->sem) != 0) {
++      if (i + 1 >= MAX_FIDS / 2) {
+               netif_stop_queue(dev);
+-              priv->xmit11.task.func = (void (*)(void *))airo_do_xmit11;
+-              priv->xmit11.task.data = (void *)dev;
+-              schedule_work(&priv->xmit11.task);
+-              return;
++
++              /* we cannot transmit */
++              if (i == MAX_FIDS / 2) {
++                      priv->stats.tx_fifo_errors++;
++                      ret = 1;
++                      goto tx_done;
++              }
+       }
+-      status = transmit_802_11_packet (priv, fids[fid], skb->data);
+-      up(&priv->sem);
+-      i = MAX_FIDS / 2;
+-      if ( status == SUCCESS ) {
++      /* check min length*/
++      len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
++      status = transmit_802_3_packet (priv, fids[i], skb->data, len);
++
++      if (status == SUCCESS) {
++              /* Mark fid as used & save length for later */
++              fids[i] |= (len << 16);
+               dev->trans_start = jiffies;
+-              for (; i < MAX_FIDS && (priv->fids[i] & 0xffff0000); i++);
+-      } else {
+-              priv->fids[fid] &= 0xffff;
++      }
++      else {
+               priv->stats.tx_window_errors++;
++              ret = 1;
+       }
+-      if (i < MAX_FIDS)
+-              netif_wake_queue(dev);
+-      else
+-              netif_stop_queue(dev);
+-      dev_kfree_skb(skb);
++
++tx_done:
++      spin_unlock_irqrestore(&priv->main_lock, flags);
++      if (!ret)
++              dev_kfree_skb(skb);
++      return ret;
+ }
+-static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev) {
+-      s16 len;
++static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev)
++{
++      int len;
+       int i;
++      int ret = 0;
++      int status;
++      unsigned long flags;
+       struct airo_info *priv = dev->priv;
+-      u32 *fids = priv->fids;
++      int *fids = priv->fids;
+       if ( skb == NULL ) {
+               printk( KERN_ERR "airo:  skb == NULL!!!\n" );
+@@ -1413,21 +1364,39 @@ static int airo_start_xmit11(struct sk_b
+       }
+       /* Find a vacant FID */
++      spin_lock_irqsave(&priv->main_lock, flags);
+       for( i = MAX_FIDS / 2; i < MAX_FIDS && (fids[i] & 0xffff0000); i++ );
+-      if ( i == MAX_FIDS ) {
+-              priv->stats.tx_fifo_errors++;
+-              dev_kfree_skb(skb);
+-      } else {
+-              /* check min length*/
+-              len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
+-              /* Mark fid as used & save length for later */
++      if (i + 1 >= MAX_FIDS) {
++              netif_stop_queue(dev);
++
++              /* we cannot transmit */
++              if (i == MAX_FIDS) {
++                      priv->stats.tx_fifo_errors++;
++                      ret = 1;
++                      goto tx_done;
++              }
++      }
++
++      /* check min length*/
++      len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
++      status = transmit_802_11_packet (priv, fids[i], skb->data, len);
++
++      if (status == SUCCESS) {
++              /* Mark fid as used & save length for later */
+               fids[i] |= (len << 16);
+-              priv->xmit11.skb = skb;
+-              priv->xmit11.fid = i;
+-              airo_do_xmit11(dev);
++              dev->trans_start = jiffies;
+       }
+-      return 0;
++      else {
++              priv->stats.tx_window_errors++;
++              ret = 1;
++      }
++
++tx_done:
++      spin_unlock_irqrestore(&priv->main_lock, flags);
++      if (!ret)
++              dev_kfree_skb(skb);
++      return ret;
+ }
+ struct net_device_stats *airo_get_stats(struct net_device *dev)
+@@ -1457,36 +1426,19 @@ struct net_device_stats *airo_get_stats(
+       return &local->stats;
+ }
+-static void airo_end_promisc(struct airo_info *ai) {
+-      Resp rsp;
+-
+-      if ((IN4500(ai, EVSTAT) & EV_CMD) != 0) {
+-              completecommand(ai, &rsp);
+-              up(&ai->sem);
+-      } else {
+-              ai->promisc_task.func = (void (*)(void *))airo_end_promisc;
+-              ai->promisc_task.data = (void *)ai;
+-              schedule_work(&ai->promisc_task);
+-      }
+-}
+-
+-static void airo_set_promisc(struct airo_info *ai) {
++static void airo_set_promisc(struct airo_info *ai)
++{
+       Cmd cmd;
++      Resp rsp;
+-      if (down_trylock(&ai->sem) == 0) {
+-              memset(&cmd, 0, sizeof(cmd));
+-              cmd.cmd=CMD_SETMODE;
+-              cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC;
+-              sendcommand(ai, &cmd);
+-              airo_end_promisc(ai);
+-      } else {
+-              ai->promisc_task.func = (void (*)(void *))airo_set_promisc;
+-              ai->promisc_task.data = (void *)ai;
+-              schedule_work(&ai->promisc_task);
+-      }
++      memset(&cmd, 0, sizeof(cmd));
++      cmd.cmd = CMD_SETMODE;
++      cmd.parm0 = (ai->flags & IFF_PROMISC) ? PROMISC : NOPROMISC;
++      issuecommand(ai, &cmd, &rsp);
+ }
+-static void airo_set_multicast_list(struct net_device *dev) {
++static void airo_set_multicast_list(struct net_device *dev)
++{
+       struct airo_info *ai = dev->priv;
+       if ((dev->flags ^ ai->flags) & IFF_PROMISC) {
+@@ -1551,11 +1503,10 @@ void stop_airo_card( struct net_device *
+ {
+       struct airo_info *ai = dev->priv;
+       flush_scheduled_work();
+-      if (ai->flash)
+-              kfree(ai->flash);
+-      if (ai->rssi)
+-              kfree(ai->rssi);
+-      takedown_proc_entry( dev, ai );
++
++      disable_interrupts(ai);
++      free_irq(dev->irq, dev);
++
+       if (ai->registered) {
+               unregister_netdev( dev );
+               if (ai->wifidev) {
+@@ -1565,9 +1516,15 @@ void stop_airo_card( struct net_device *
+               }
+               ai->registered = 0;
+       }
+-      disable_interrupts(ai);
+-      free_irq( dev->irq, dev );
+-      if (auto_wep) del_timer_sync(&ai->timer);
++
++      if (ai->flash)
++              kfree(ai->flash);
++      if (ai->rssi)
++              kfree(ai->rssi);
++      takedown_proc_entry( dev, ai );
++
++      if (auto_wep)
++              del_timer_sync(&ai->timer);
+       if (freeres) {
+               /* PCMCIA frees this stuff, so only for PCI and ISA */
+               release_region( dev->base_addr, 64 );
+@@ -1664,8 +1621,7 @@ struct net_device *init_airo_card( unsig
+       ai->wifidev = 0;
+       ai->registered = 0;
+         ai->dev = dev;
+-      ai->aux_lock = SPIN_LOCK_UNLOCKED;
+-      sema_init(&ai->sem, 1);
++      ai->main_lock = SPIN_LOCK_UNLOCKED;
+       ai->need_commit = 0;
+       ai->config.len = 0;
+       rc = add_airo_dev( dev );
+@@ -1730,7 +1686,6 @@ struct net_device *init_airo_card( unsig
+                       ai->fids[i] = transmit_allocate(ai,2312,i>=MAX_FIDS/2);
+       setup_proc_entry( dev, dev->priv ); /* XXX check for failure */
+-      netif_start_queue(dev);
+       SET_MODULE_OWNER(dev);
+       return dev;
+@@ -1794,47 +1749,31 @@ int reset_airo_card( struct net_device *
+ EXPORT_SYMBOL(reset_airo_card);
+ #if WIRELESS_EXT > 13
++/* must be called with lock held */
+ static void airo_send_event(struct net_device *dev) {
+       struct airo_info *ai = dev->priv;
+       union iwreq_data wrqu;
+       StatusRid status_rid;
+-      if (down_trylock(&ai->sem) == 0) {
+-              __set_bit(FLAG_LOCKED, &ai->flags);
+-              PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid));
+-              clear_bit(FLAG_LOCKED, &ai->flags);
+-              up(&ai->sem);
+-              wrqu.data.length = 0;
+-              wrqu.data.flags = 0;
+-              memcpy(wrqu.ap_addr.sa_data, status_rid.bssid[0], ETH_ALEN);
+-              wrqu.ap_addr.sa_family = ARPHRD_ETHER;
++      PC4500_readrid_nolock(ai, RID_STATUS, &status_rid, sizeof(status_rid));
+-              /* Send event to user space */
+-              wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
+-      } else {
+-              ai->event_task.func = (void (*)(void *))airo_send_event;
+-              ai->event_task.data = (void *)dev;
+-              schedule_work(&ai->event_task);
+-      }
++      wrqu.data.length = 0;
++      wrqu.data.flags = 0;
++      memcpy(wrqu.ap_addr.sa_data, status_rid.bssid[0], ETH_ALEN);
++      wrqu.ap_addr.sa_family = ARPHRD_ETHER;
++
++      /* Send event to user space */
++      wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
+ }
+ #endif
+ static void airo_read_mic(struct airo_info *ai) {
++#ifdef MICSUPPORT
+       MICRid mic_rid;
+-      if (down_trylock(&ai->sem) == 0) {
+-              __set_bit(FLAG_LOCKED, &ai->flags);
+-              PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid));
+-              clear_bit(FLAG_LOCKED, &ai->flags);
+-              up(&ai->sem);
+-#ifdef MICSUPPORT
+-              micinit (ai, &mic_rid);
++      PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid));
++      micinit (ai, &mic_rid);
+ #endif
+-      } else {
+-              ai->mic_task.func = (void (*)(void *))airo_read_mic;
+-              ai->mic_task.data = (void *)ai;
+-              schedule_work(&ai->mic_task);
+-      }
+ }
+ static irqreturn_t airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) {
+@@ -1848,6 +1787,7 @@ static irqreturn_t airo_interrupt ( int 
+       if (!netif_device_present(dev))
+               return IRQ_NONE;
++      spin_lock(&apriv->main_lock);
+       for (;;) {
+               status = IN4500( apriv, EVSTAT );
+               if ( !(status & STATUS_INTS) || status == 0xffff ) break;
+@@ -1866,7 +1806,8 @@ static irqreturn_t airo_interrupt ( int 
+               if ( status & EV_MIC ) {
+                       OUT4500( apriv, EVACK, EV_MIC );
+-                      airo_read_mic( apriv );
++                      if (apriv->flags & FLAG_MIC_CAPABLE)
++                              airo_read_mic( apriv );
+               }
+               if ( status & EV_LINK ) {
+ #if WIRELESS_EXT > 13
+@@ -2115,10 +2056,14 @@ static irqreturn_t airo_interrupt ( int 
+                                       index = i;
+                                       /* Set up to be used again */
+                                       apriv->fids[i] &= 0xffff;
++
++                                      if (i < MAX_FIDS / 2)
++                                              netif_wake_queue(dev);
++                                      else
++                                              netif_wake_queue(apriv->wifidev);
+                               }
+                       }
+                       if (index != -1) {
+-                              netif_wake_queue(dev);
+                               if (status & EV_TXEXC)
+                                       get_tx_error(apriv, index);
+                       }
+@@ -2134,6 +2079,7 @@ static irqreturn_t airo_interrupt ( int 
+       if (savedInterrupts)
+               OUT4500( apriv, EVINTEN, savedInterrupts );
++      spin_unlock(&apriv->main_lock);
+       /* done.. */
+       return IRQ_RETVAL(handled);
+@@ -2169,8 +2115,8 @@ static u16 IN4500( struct airo_info *ai,
+       return rc;
+ }
+-static int enable_MAC( struct airo_info *ai, Resp *rsp ) {
+-      int rc;
++static int enable_MAC( struct airo_info *ai, Resp *rsp )
++{
+         Cmd cmd;
+       /* FLAG_RADIO_OFF : Radio disabled via /proc or Wireless Extensions
+@@ -2182,45 +2128,41 @@ static int enable_MAC( struct airo_info 
+       if (ai->flags & (FLAG_RADIO_OFF|FLAG_RADIO_DOWN)) return SUCCESS;
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.cmd = MAC_ENABLE;
+-      if (test_bit(FLAG_LOCKED, &ai->flags) != 0)
+-              return issuecommand(ai, &cmd, rsp);
+-
+-      if (down_interruptible(&ai->sem))
+-              return -ERESTARTSYS;
+-      rc = issuecommand(ai, &cmd, rsp);
+-      up(&ai->sem);
+-      return rc;
++      return issuecommand(ai, &cmd, rsp);
+ }
+-static void disable_MAC( struct airo_info *ai ) {
++static void disable_MAC(struct airo_info *ai)
++{
+         Cmd cmd;
+       Resp rsp;
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.cmd = MAC_DISABLE; // disable in case already enabled
+-      if (test_bit(FLAG_LOCKED, &ai->flags) != 0) {
+-              issuecommand(ai, &cmd, &rsp);
+-              return;
+-      }
+-
+-      if (down_interruptible(&ai->sem))
+-              return;
+       issuecommand(ai, &cmd, &rsp);
+-      up(&ai->sem);
+ }
+-static void enable_interrupts( struct airo_info *ai ) {
++static void enable_interrupts(struct airo_info *ai)
++{
++      unsigned long flags;
++      u16 status;
++      spin_lock_irqsave(&ai->main_lock, flags);
++
+       /* Reset the status register */
+-      u16 status = IN4500( ai, EVSTAT );
++      status = IN4500( ai, EVSTAT );
+       OUT4500( ai, EVACK, status );
++
+       /* Enable the interrupts */
+       OUT4500( ai, EVINTEN, STATUS_INTS );
+-      /* Note there is a race condition between the last two lines that
+-         I don't know how to get rid of right now... */
++
++      spin_unlock_irqrestore(&ai->main_lock, flags);
+ }
+-static void disable_interrupts( struct airo_info *ai ) {
++static void disable_interrupts(struct airo_info *ai)
++{
++      unsigned long flags;
++      spin_lock_irqsave(&ai->main_lock, flags);
+       OUT4500( ai, EVINTEN, 0 );
++      spin_unlock_irqrestore(&ai->main_lock, flags);
+ }
+ static u16 setup_card(struct airo_info *ai, u8 *mac)
+@@ -2243,23 +2185,20 @@ static u16 setup_card(struct airo_info *
+       /* The NOP is the first step in getting the card going */
+       cmd.cmd = NOP;
+       cmd.parm0 = cmd.parm1 = cmd.parm2 = 0;
+-      if (down_interruptible(&ai->sem))
++      if (spin_is_locked(&ai->main_lock))
+               return ERROR;
+-      if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) {
+-              up(&ai->sem);
++      if (issuecommand(ai, &cmd, &rsp) != SUCCESS)
+               return ERROR;
+-      }
++
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.cmd = MAC_DISABLE; // disable in case already enabled
+-      if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) {
+-              up(&ai->sem);
++      if (issuecommand( ai, &cmd, &rsp) != SUCCESS )
+               return ERROR;
+-      }
++
+       // Let's figure out if we need to use the AUX port
+       cmd.cmd = CMD_ENABLEAUX;
+       if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
+-              up(&ai->sem);
+               printk(KERN_ERR "airo: Error checking for AUX port\n");
+               return ERROR;
+       }
+@@ -2270,7 +2209,7 @@ static u16 setup_card(struct airo_info *
+               ai->bap_read = aux_bap_read;
+               printk(KERN_DEBUG "airo: Doing AUX bap_reads\n");
+       }
+-      up(&ai->sem);
++
+       if (ai->config.len == 0) {
+               tdsRssiRid rssi_rid;
+               CapabilityRid cap_rid;
+@@ -2375,50 +2314,35 @@ static u16 setup_card(struct airo_info *
+       }
+       return SUCCESS;
+ }
++static int issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
++      int rc;
++      unsigned long flags;
+-static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
+-        // Im really paranoid about letting it run forever!
+-      int max_tries = 600000;
+-
+-      if (sendcommand(ai, pCmd) == (u16)ERROR)
+-              return ERROR;
+-
+-      while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) {
+-              if (!in_interrupt() && (max_tries & 255) == 0)
+-                      schedule();
+-      }
+-      if ( max_tries == -1 ) {
+-              printk( KERN_ERR
+-                      "airo: Max tries exceeded waiting for command\n" );
+-                return ERROR;
+-      }
+-      completecommand(ai, pRsp);
+-      return SUCCESS;
++      spin_lock_irqsave(&ai->main_lock, flags);
++      rc = issuecommand_nolock(ai, pCmd, pRsp);
++      spin_unlock_irqrestore(&ai->main_lock, flags);
++      return rc;
+ }
+-static u16 sendcommand(struct airo_info *ai, Cmd *pCmd) {
+-        // Im really paranoid about letting it run forever!
++static int issuecommand_nolock(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
++      // Im really paranoid about letting it run forever!
+       int max_tries = 600000;
+-      u16 cmd;
+       OUT4500(ai, PARAM0, pCmd->parm0);
+       OUT4500(ai, PARAM1, pCmd->parm1);
+       OUT4500(ai, PARAM2, pCmd->parm2);
+       OUT4500(ai, COMMAND, pCmd->cmd);
+-      while ( max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0 &&
+-              (cmd = IN4500(ai, COMMAND)) != 0 )
+-                      if (cmd == pCmd->cmd)
+-                              // PC4500 didn't notice command, try again
+-                              OUT4500(ai, COMMAND, pCmd->cmd);
+-      if ( max_tries == -1 ) {
++      while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) {
++              if (IN4500(ai, COMMAND) == pCmd->cmd) {
++                      // PC4500 didn't notice command, try again
++                      OUT4500(ai, COMMAND, pCmd->cmd);
++              }
++      }
++      if (max_tries == -1) {
+               printk( KERN_ERR
+                       "airo: Max tries exceeded when issueing command\n" );
+                 return ERROR;
+       }
+-      return SUCCESS;
+-}
+-
+-static void completecommand(struct airo_info *ai, Resp *pRsp) {
+       // command completed
+       pRsp->status = IN4500(ai, STATUS);
+       pRsp->rsp0 = IN4500(ai, RESP0);
+@@ -2431,8 +2355,10 @@ static void completecommand(struct airo_
+       }
+       // acknowledge processing the status/response
+       OUT4500(ai, EVACK, EV_CMD);
++      return SUCCESS;
+ }
++
+ /* Sets up the bap to start exchange data.  whichbap should
+  * be one of the BAP0 or BAP1 defines.  Locks should be held before
+  * calling! */
+@@ -2497,9 +2423,7 @@ static int aux_bap_read(struct airo_info
+       u16 next;
+       int words;
+       int i;
+-      unsigned long flags;
+-      spin_lock_irqsave(&ai->aux_lock, flags);
+       page = IN4500(ai, SWS0+whichbap);
+       offset = IN4500(ai, SWS2+whichbap);
+       next = aux_setup(ai, page, offset, &len);
+@@ -2519,7 +2443,6 @@ static int aux_bap_read(struct airo_info
+                       next = aux_setup(ai, next, 4, &len);
+               }
+       }
+-      spin_unlock_irqrestore(&ai->aux_lock, flags);
+       return SUCCESS;
+ }
+@@ -2558,7 +2481,7 @@ static int PC4500_accessrid(struct airo_
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.cmd = accmd;
+       cmd.parm0 = rid;
+-      status = issuecommand(ai, &cmd, &rsp);
++      status = issuecommand_nolock(ai, &cmd, &rsp);
+       if (status != 0) return status;
+       if ( (rsp.status & 0x7F00) != 0) {
+               return (accmd << 8) + (rsp.rsp0 & 0xFF);
+@@ -2567,25 +2490,16 @@ static int PC4500_accessrid(struct airo_
+ }
+ /*  Note, that we are using BAP1 which is also used by transmit, so
+- *  we must get a lock. */
+-static int PC4500_readrid(struct airo_info *ai, u16 rid, void *pBuf, int len)
++ *  it must be called with main_lock held. */
++static int PC4500_readrid_nolock(struct airo_info *ai, u16 rid, void *pBuf, int len)
+ {
+-      u16 status, dolock = 0;
+-        int rc = SUCCESS;
++      u16 status;
++
++      if ((status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != SUCCESS)
++                return status;
++      if (bap_setup(ai, rid, 0, BAP1) != SUCCESS)
++                return ERROR;
+-      if (test_bit(FLAG_LOCKED, &ai->flags) == 0) {
+-              dolock = 1;
+-              if (down_interruptible(&ai->sem))
+-                      return ERROR;
+-      }
+-      if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != SUCCESS) {
+-                rc = status;
+-                goto done;
+-        }
+-      if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) {
+-              rc = ERROR;
+-                goto done;
+-        }
+       // read the rid length field
+       bap_read(ai, pBuf, 2, BAP1);
+       // length for remaining part of rid
+@@ -2596,30 +2510,34 @@ static int PC4500_readrid(struct airo_in
+                       "airo: Rid %x has a length of %d which is too short\n",
+                       (int)rid,
+                       (int)len );
+-              rc = ERROR;
+-                goto done;
++              return ERROR;
+       }
+       // read remainder of the rid
+-      rc = bap_read(ai, ((u16*)pBuf)+1, len, BAP1);
+-done:
+-      if (dolock)
+-              up(&ai->sem);
+-      return rc;
++      return bap_read(ai, ((u16*)pBuf)+1, len, BAP1);
+ }
++static int PC4500_readrid(struct airo_info *ai, u16 rid, void *pBuf, int len)
++{
++      unsigned long flags;
++      int rc;
++
++      spin_lock_irqsave(&ai->main_lock, flags);
++      rc = PC4500_readrid_nolock(ai, rid, pBuf, len);
++      spin_unlock_irqrestore(&ai->main_lock, flags);
++      return rc;
++}
+ /*  Note, that we are using BAP1 which is also used by transmit, so
+  *  make sure this isnt called when a transmit is happening */
+ static int PC4500_writerid(struct airo_info *ai, u16 rid,
+                          const void *pBuf, int len)
+ {
+-      u16 status, dolock = 0;
++      u16 status;
++      unsigned long flags;
+       int rc = SUCCESS;
+-      if (test_bit(FLAG_LOCKED, &ai->flags) == 0) {
+-              dolock = 1;
+-              if (down_interruptible(&ai->sem))
+-                      return ERROR;
+-      }
++      *(u16*)pBuf = cpu_to_le16((u16)len);
++
++      spin_lock_irqsave(&ai->main_lock, flags);
+       // --- first access so that we can write the rid data
+       if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != 0) {
+                 rc = status;
+@@ -2633,9 +2551,8 @@ static int PC4500_writerid(struct airo_i
+       bap_write(ai, pBuf, len, BAP1);
+       // ---now commit the rid data
+       rc = PC4500_accessrid(ai, rid, 0x100|CMD_ACCESS);
+- done:
+-      if (dolock)
+-              up(&ai->sem);
++done:
++      spin_unlock_irqrestore(&ai->main_lock, flags);
+         return rc;
+ }
+@@ -2643,6 +2560,8 @@ static int PC4500_writerid(struct airo_i
+    one for now. */
+ static u16 transmit_allocate(struct airo_info *ai, int lenPayload, int raw)
+ {
++      unsigned long flags;
++      unsigned int loop = 3000;
+       Cmd cmd;
+       Resp rsp;
+       u16 txFid;
+@@ -2650,20 +2569,25 @@ static u16 transmit_allocate(struct airo
+       cmd.cmd = CMD_ALLOCATETX;
+       cmd.parm0 = lenPayload;
+-      if (down_interruptible(&ai->sem))
+-              return ERROR;
+-      if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
+-              txFid = 0;
++      spin_lock_irqsave(&ai->main_lock, flags);
++      if (issuecommand_nolock(ai, &cmd, &rsp) != SUCCESS) {
++              txFid = ERROR;
+               goto done;
+       }
+       if ( (rsp.status & 0xFF00) != 0) {
+-              txFid = 0;
++              txFid = ERROR;
+               goto done;
+       }
++
+       /* wait for the allocate event/indication
+-       * It makes me kind of nervous that this can just sit here and spin,
+-       * but in practice it only loops like four times. */
+-      while ( (IN4500(ai, EVSTAT) & EV_ALLOC) == 0) ;
++       * in practice it only loops like four times. */
++      while (((IN4500(ai, EVSTAT) & EV_ALLOC) == 0) && --loop)
++             ; /* nada */
++      if (!loop) {
++              txFid = ERROR;
++              goto done;
++      }
++
+       // get the allocated fid and acknowledge
+       txFid = IN4500(ai, TXALLOCFID);
+       OUT4500(ai, EVACK, EV_ALLOC);
+@@ -2685,7 +2609,7 @@ static u16 transmit_allocate(struct airo
+               bap_write(ai, &txControl, sizeof(txControl), BAP1);
+ done:
+-      up(&ai->sem);
++      spin_unlock_irqrestore(&ai->main_lock, flags);
+       return txFid;
+ }
+@@ -2693,17 +2617,14 @@ done:
+ /* In general BAP1 is dedicated to transmiting packets.  However,
+    since we need a BAP when accessing RIDs, we also use BAP1 for that.
+    Make sure the BAP1 spinlock is held when this is called. */
+-static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket)
++static int transmit_802_3_packet(struct airo_info *ai, u16 txFid, char *pPacket, int len)
+ {
+       u16 payloadLen;
+       Cmd cmd;
+       Resp rsp;
+       int miclen = 0;
+-      u16 txFid = len;
+       MICBuffer pMic;
+-      len >>= 16;
+-
+       if (len < ETH_ALEN * 2) {
+               printk( KERN_WARNING "Short packet %d\n", len );
+               return ERROR;
+@@ -2734,12 +2655,12 @@ static int transmit_802_3_packet(struct 
+       memset( &cmd, 0, sizeof( cmd ) );
+       cmd.cmd = CMD_TRANSMIT;
+       cmd.parm0 = txFid;
+-      if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
++      if (issuecommand_nolock(ai, &cmd, &rsp) != SUCCESS) return ERROR;
+       if ( (rsp.status & 0xFF00) != 0) return ERROR;
+       return SUCCESS;
+ }
+-static int transmit_802_11_packet(struct airo_info *ai, int len, char *pPacket)
++static int transmit_802_11_packet(struct airo_info *ai, u16 txFid, char *pPacket, int len)
+ {
+       u16 fc, payloadLen;
+       Cmd cmd;
+@@ -2750,8 +2671,6 @@ static int transmit_802_11_packet(struct
+               u16 gaplen;
+               u8 gap[6];
+       } gap;
+-      u16 txFid = len;
+-      len >>= 16;
+       gap.gaplen = 6;
+       fc = le16_to_cpu(*(const u16*)pPacket);
+@@ -2793,7 +2712,7 @@ static int transmit_802_11_packet(struct
+       memset( &cmd, 0, sizeof( cmd ) );
+       cmd.cmd = CMD_TRANSMIT;
+       cmd.parm0 = txFid;
+-      if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
++      if (issuecommand_nolock(ai, &cmd, &rsp) != SUCCESS) return ERROR;
+       if ( (rsp.status & 0xFF00) != 0) return ERROR;
+       return SUCCESS;
+ }
+@@ -3857,10 +3776,7 @@ static int proc_BSSList_open( struct ino
+                       memset(&cmd, 0, sizeof(cmd));
+                       cmd.cmd=CMD_LISTBSS;
+-                      if (down_interruptible(&ai->sem))
+-                              return -ERESTARTSYS;
+                       issuecommand(ai, &cmd, &rsp);
+-                      up(&ai->sem);
+                       data->readlen = 0;
+                       return 0;
+               }
+@@ -3923,13 +3839,6 @@ static void timer_func( u_long data ) {
+       if (!(apriv->flags & FLAG_FLASHING) && (linkstat != 0x400)) {
+ /* We don't have a link so try changing the authtype */
+-              if (down_trylock(&apriv->sem) != 0) {
+-                      apriv->timer.expires = RUN_AT(1);
+-                      add_timer(&apriv->timer);
+-                      return;
+-              }
+-              __set_bit(FLAG_LOCKED, &apriv->flags);
+-
+               readConfigRid(apriv);
+               disable_MAC(apriv);
+               switch(apriv->config.authType) {
+@@ -3955,8 +3864,6 @@ static void timer_func( u_long data ) {
+               apriv->need_commit = 1;
+               writeConfigRid(apriv);
+               enable_MAC(apriv, &rsp);
+-              clear_bit(FLAG_LOCKED, &apriv->flags);
+-              up(&apriv->sem);
+ /* Schedule check to see if the change worked */
+               apriv->timer.expires = RUN_AT(HZ*3);
+@@ -4135,7 +4042,11 @@ static int airo_get_freq(struct net_devi
+       struct airo_info *local = dev->priv;
+       StatusRid status_rid;           /* Card status info */
+-      readStatusRid(local, &status_rid);
++      if (local->config.opmode & MODE_STA_ESS)
++              status_rid.channel = local->config.channelSet;
++      else
++              readStatusRid(local, &status_rid);
++
+       /* Will return zero in infrastructure mode */
+ #ifdef WEXT_USECHANNELS
+@@ -4246,11 +4157,8 @@ static int airo_set_wap(struct net_devic
+               return -EINVAL;
+       else if (!memcmp(bcast, awrq->sa_data, ETH_ALEN)) {
+               memset(&cmd, 0, sizeof(cmd));
+-              cmd.cmd=CMD_LOSE_SYNC;
+-              if (down_interruptible(&local->sem))
+-                      return -ERESTARTSYS;
++              cmd.cmd = CMD_LOSE_SYNC;
+               issuecommand(local, &cmd, &rsp);
+-              up(&local->sem);
+       } else {
+               memset(&APList_rid, 0, sizeof(APList_rid));
+               APList_rid.len = sizeof(APList_rid);
+@@ -5132,11 +5040,8 @@ static int airo_set_scan(struct net_devi
+       /* Initiate a scan command */
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.cmd=CMD_LISTBSS;
+-      if (down_interruptible(&ai->sem))
+-              return -ERESTARTSYS;
+       issuecommand(ai, &cmd, &rsp);
+       ai->scan_timestamp = jiffies;
+-      up(&ai->sem);
+       /* At this point, just return to the user. */
+--- linux-2.6.0-test1/drivers/net/wireless/ray_cs.c    2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/net/wireless/ray_cs.c   2003-07-19 17:03:50.000000000 -0700
+@@ -25,6 +25,8 @@
+  * - reorganize kmallocs in ray_attach, checking all for failure
+  *   and releasing the previous allocations if one fails
+  *
++ * Daniele Bellucci <bellucda@tiscali.it> - 07/10/2003
++ * - Audit copy_to_user in ioctl(SIOCGIWESSID)
+  * 
+ =============================================================================*/
+@@ -1315,7 +1317,8 @@ static int ray_dev_ioctl(struct net_devi
+         /* Push it out ! */
+         wrq->u.data.length = strlen(essid) + 1;
+         wrq->u.data.flags = 1; /* active */
+-        copy_to_user(wrq->u.data.pointer, essid, sizeof(essid));
++        if (copy_to_user(wrq->u.data.pointer, essid, sizeof(essid)))
++                err = -EFAULT;
+       }
+       break;
+--- linux-2.6.0-test1/drivers/parisc/led.c     2003-06-16 22:32:21.000000000 -0700
++++ 25/drivers/parisc/led.c    2003-07-19 17:03:50.000000000 -0700
+@@ -14,6 +14,10 @@
+  * TODO:
+  *    - speed-up calculations with inlined assembler
+  *    - interface to write to second row of LCD from /proc (if technically possible)
++ *
++ * Changes:
++ *      - Audit copy_from_user in led_proc_write.
++ *                                Daniele Bellucci <bellucda@tiscali.it>
+  */
+ #include <linux/config.h>
+@@ -160,7 +164,9 @@ static int led_proc_write(struct file *f
+       memset(lbuf, 0, count);
+-      copy_from_user(lbuf, buf, count);
++      if (copy_from_user(lbuf, buf, count))
++              return -EFAULT;
++
+       cur = lbuf;
+       /* skip initial spaces */
+--- linux-2.6.0-test1/drivers/parport/parport_pc.c     2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/parport/parport_pc.c    2003-07-19 17:03:50.000000000 -0700
+@@ -94,7 +94,8 @@ static struct superio_struct {       /* For Su
+ } superios[NR_SUPERIOS] __devinitdata = { {0,},};
+ static int user_specified __devinitdata = 0;
+-#if defined(CONFIG_PARPORT_PC_FIFO) || defined(CONFIG_PARPORT_PC_SUPERIO)
++#if defined(CONFIG_PARPORT_PC_SUPERIO) || \
++       (defined(CONFIG_PARPORT_1284) && defined(CONFIG_PARPORT_PC_FIFO))
+ static int verbose_probing;
+ #endif
+ static int registered_parport;
+@@ -3116,7 +3117,8 @@ MODULE_PARM_DESC(irq, "IRQ line");
+ MODULE_PARM(irq, "1-" __MODULE_STRING(PARPORT_PC_MAX_PORTS) "s");
+ MODULE_PARM_DESC(dma, "DMA channel");
+ MODULE_PARM(dma, "1-" __MODULE_STRING(PARPORT_PC_MAX_PORTS) "s");
+-#if defined(CONFIG_PARPORT_PC_FIFO) || defined(CONFIG_PARPORT_PC_SUPERIO)
++#if defined(CONFIG_PARPORT_PC_SUPERIO) || \
++       (defined(CONFIG_PARPORT_1284) && defined(CONFIG_PARPORT_PC_FIFO))
+ MODULE_PARM_DESC(verbose_probing, "Log chit-chat during initialisation");
+ MODULE_PARM(verbose_probing, "i");
+ #endif
+--- linux-2.6.0-test1/drivers/pci/hotplug/acpiphp_glue.c       2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/pci/hotplug/acpiphp_glue.c      2003-07-19 17:03:50.000000000 -0700
+@@ -607,7 +607,7 @@ find_p2p_bridge (acpi_handle handle, u32
+       /* check if this bridge has ejectable slots */
+       if (detect_ejectable_slots(handle) > 0) {
+-              dbg("found PCI-to-PCI bridge at PCI %s\n", dev->slot_name);
++              dbg("found PCI-to-PCI bridge at PCI %s\n", pci_name(dev));
+               add_p2p_bridge(handle, seg, bus, device, function);
+       }
+@@ -693,7 +693,7 @@ static int power_on_slot (struct acpiphp
+               if (func->flags & FUNC_HAS_PS0) {
+                       dbg("%s: executing _PS0 on %s\n", __FUNCTION__,
+-                          func->pci_dev->slot_name);
++                          pci_name(func->pci_dev));
+                       status = acpi_evaluate_object(func->handle, "_PS0", NULL, NULL);
+                       if (ACPI_FAILURE(status)) {
+                               warn("%s: _PS0 failed\n", __FUNCTION__);
+--- linux-2.6.0-test1/drivers/pci/hotplug/acpiphp_pci.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/pci/hotplug/acpiphp_pci.c       2003-07-19 17:03:50.000000000 -0700
+@@ -212,7 +212,7 @@ static int detect_used_resource (struct 
+       int count;
+       struct pci_resource *res;
+-      dbg("Device %s\n", dev->slot_name);
++      dbg("Device %s\n", pci_name(dev));
+       for (count = 0; address[count]; count++) {      /* for 6 BARs */
+               pci_read_config_dword(dev, address[count], &bar);
+@@ -337,7 +337,7 @@ int acpiphp_init_func_resource (struct a
+       struct pci_dev *dev;
+       dev = func->pci_dev;
+-      dbg("Hot-pluggable device %s\n", dev->slot_name);
++      dbg("Hot-pluggable device %s\n", pci_name(dev));
+       for (count = 0; address[count]; count++) {      /* for 6 BARs */
+               pci_read_config_dword(dev, address[count], &bar);
+--- linux-2.6.0-test1/drivers/pci/hotplug.c    2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/hotplug.c   2003-07-19 17:03:50.000000000 -0700
+@@ -10,8 +10,6 @@
+ #define DBG(x...)
+ #endif
+-static void pci_free_resources(struct pci_dev *dev);
+-
+ int pci_hotplug (struct device *dev, char **envp, int num_envp,
+                char *buffer, int buffer_size)
+ {
+@@ -57,7 +55,7 @@ int pci_hotplug (struct device *dev, cha
+       envp[i++] = scratch;
+       length += snprintf (scratch, buffer_size - length, "PCI_SLOT_NAME=%s",
+-                          pdev->slot_name);
++                          pci_name(pdev));
+       if ((buffer_size - length <= 0) || (i >= num_envp))
+               return -ENOMEM;
+@@ -172,105 +170,3 @@ int pci_visit_dev (struct pci_visit *fn,
+ }
+ EXPORT_SYMBOL(pci_visit_dev);
+-static void pci_destroy_dev(struct pci_dev *dev)
+-{
+-      pci_proc_detach_device(dev);
+-      device_unregister(&dev->dev);
+-
+-      /* Remove the device from the device lists, and prevent any further
+-       * list accesses from this device */
+-      spin_lock(&pci_bus_lock);
+-      list_del(&dev->bus_list);
+-      list_del(&dev->global_list);
+-      dev->bus_list.next = dev->bus_list.prev = NULL;
+-      dev->global_list.next = dev->global_list.prev = NULL;
+-      spin_unlock(&pci_bus_lock);
+-
+-      pci_free_resources(dev);
+-      pci_dev_put(dev);
+-}
+-
+-/**
+- * pci_remove_device_safe - remove an unused hotplug device
+- * @dev: the device to remove
+- *
+- * Delete the device structure from the device lists and 
+- * notify userspace (/sbin/hotplug), but only if the device
+- * in question is not being used by a driver.
+- * Returns 0 on success.
+- */
+-int pci_remove_device_safe(struct pci_dev *dev)
+-{
+-      if (pci_dev_driver(dev))
+-              return -EBUSY;
+-      pci_destroy_dev(dev);
+-      return 0;
+-}
+-EXPORT_SYMBOL(pci_remove_device_safe);
+-
+-static void
+-pci_free_resources(struct pci_dev *dev)
+-{
+-      int i;
+-
+-      for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+-              struct resource *res = dev->resource + i;
+-              if (res->parent)
+-                      release_resource(res);
+-      }
+-}
+-
+-/**
+- * pci_remove_bus_device - remove a PCI device and any children
+- * @dev: the device to remove
+- *
+- * Remove a PCI device from the device lists, informing the drivers
+- * that the device has been removed.  We also remove any subordinate
+- * buses and children in a depth-first manner.
+- *
+- * For each device we remove, delete the device structure from the
+- * device lists, remove the /proc entry, and notify userspace
+- * (/sbin/hotplug).
+- */
+-void pci_remove_bus_device(struct pci_dev *dev)
+-{
+-      if (dev->subordinate) {
+-              struct pci_bus *b = dev->subordinate;
+-
+-              pci_remove_behind_bridge(dev);
+-              pci_proc_detach_bus(b);
+-
+-              spin_lock(&pci_bus_lock);
+-              list_del(&b->node);
+-              spin_unlock(&pci_bus_lock);
+-
+-              kfree(b);
+-              dev->subordinate = NULL;
+-      }
+-
+-      pci_destroy_dev(dev);
+-}
+-
+-/**
+- * pci_remove_behind_bridge - remove all devices behind a PCI bridge
+- * @dev: PCI bridge device
+- *
+- * Remove all devices on the bus, except for the parent bridge.
+- * This also removes any child buses, and any devices they may
+- * contain in a depth-first manner.
+- */
+-void pci_remove_behind_bridge(struct pci_dev *dev)
+-{
+-      struct list_head *l, *n;
+-
+-      if (dev->subordinate) {
+-              list_for_each_safe(l, n, &dev->subordinate->devices) {
+-                      struct pci_dev *dev = pci_dev_b(l);
+-
+-                      pci_remove_bus_device(dev);
+-              }
+-      }
+-}
+-
+-EXPORT_SYMBOL(pci_remove_bus_device);
+-EXPORT_SYMBOL(pci_remove_behind_bridge);
+--- linux-2.6.0-test1/drivers/pci/hotplug/cpci_hotplug_core.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/hotplug/cpci_hotplug_core.c 2003-07-19 17:03:50.000000000 -0700
+@@ -427,34 +427,6 @@ cpci_hp_unregister_bus(struct pci_bus *b
+       return 0;
+ }
+-struct slot *
+-cpci_find_slot(struct pci_bus *bus, unsigned int devfn)
+-{
+-      struct slot *slot;
+-      struct slot *found;
+-      struct list_head *tmp;
+-
+-      if(!bus) {
+-              return NULL;
+-      }
+-
+-      spin_lock(&list_lock);
+-      if(!slots) {
+-              spin_unlock(&list_lock);
+-              return NULL;
+-      }
+-      found = NULL;
+-      list_for_each(tmp, &slot_list) {
+-              slot = list_entry(tmp, struct slot, slot_list);
+-              if(slot->bus == bus && slot->devfn == devfn) {
+-                      found = slot;
+-                      break;
+-              }
+-      }
+-      spin_unlock(&list_lock);
+-      return found;
+-}
+-
+ /* This is the interrupt mode interrupt handler */
+ irqreturn_t
+ cpci_hp_intr(int irq, void *data, struct pt_regs *regs)
+@@ -924,6 +896,5 @@ EXPORT_SYMBOL_GPL(cpci_hp_register_contr
+ EXPORT_SYMBOL_GPL(cpci_hp_unregister_controller);
+ EXPORT_SYMBOL_GPL(cpci_hp_register_bus);
+ EXPORT_SYMBOL_GPL(cpci_hp_unregister_bus);
+-EXPORT_SYMBOL_GPL(cpci_find_slot);
+ EXPORT_SYMBOL_GPL(cpci_hp_start);
+ EXPORT_SYMBOL_GPL(cpci_hp_stop);
+--- linux-2.6.0-test1/drivers/pci/hotplug/cpci_hotplug.h       2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/pci/hotplug/cpci_hotplug.h      2003-07-19 17:03:50.000000000 -0700
+@@ -75,7 +75,6 @@ extern int cpci_hp_register_controller(s
+ extern int cpci_hp_unregister_controller(struct cpci_hp_controller *controller);
+ extern int cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last);
+ extern int cpci_hp_unregister_bus(struct pci_bus *bus);
+-extern struct slot *cpci_find_slot(struct pci_bus *bus, unsigned int devfn);
+ extern int cpci_hp_start(void);
+ extern int cpci_hp_stop(void);
+--- linux-2.6.0-test1/drivers/pci/hotplug/cpci_hotplug_pci.c   2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/pci/hotplug/cpci_hotplug_pci.c  2003-07-19 17:03:50.000000000 -0700
+@@ -448,7 +448,7 @@ static int cpci_configure_bridge(struct 
+ }
+ static int configure_visit_pci_dev(struct pci_dev_wrapped *wrapped_dev,
+-                      struct pci_bus_wrapped *wrapped_bus)
++                                 struct pci_bus_wrapped *wrapped_bus)
+ {
+       int rc;
+       struct pci_dev *dev = wrapped_dev->dev;
+@@ -461,8 +461,8 @@ static int configure_visit_pci_dev(struc
+        * We need to fix up the hotplug representation with the Linux
+        * representation.
+        */
+-      slot = cpci_find_slot(dev->bus, dev->devfn);
+-      if(slot) {
++      if(wrapped_dev->data) {
++              slot = (struct slot*) wrapped_dev->data;
+               slot->dev = dev;
+       }
+@@ -494,9 +494,7 @@ static int unconfigure_visit_pci_dev_pha
+               return -ENODEV;
+       /* Remove the Linux representation */
+-      if(pci_remove_device_safe(dev) == 0) {
+-              kfree(dev);
+-      } else {
++      if(pci_remove_device_safe(dev)) {
+               err("Could not remove device\n");
+               return -1;
+       }
+@@ -504,8 +502,8 @@ static int unconfigure_visit_pci_dev_pha
+       /*
+        * Now remove the hotplug representation.
+        */
+-      slot = cpci_find_slot(dev->bus, dev->devfn);
+-      if(slot) {
++      if(wrapped_dev->data) {
++              slot = (struct slot*) wrapped_dev->data;
+               slot->dev = NULL;
+       } else {
+               dbg("No hotplug representation for %02x:%02x.%x",
+@@ -574,13 +572,18 @@ int cpci_configure_slot(struct slot* slo
+       /* Still NULL? Well then scan for it! */
+       if(slot->dev == NULL) {
++              int n;
+               dbg("pci_dev still null");
+               /*
+                * This will generate pci_dev structures for all functions, but
+                * we will only call this case when lookup fails.
+                */
+-              slot->dev = pci_scan_slot(slot->bus, slot->devfn);
++              n = pci_scan_slot(slot->bus, slot->devfn);
++              dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n);
++              if(n > 0)
++                      pci_bus_add_devices(slot->bus);
++              slot->dev = pci_find_slot(slot->bus->number, slot->devfn);
+               if(slot->dev == NULL) {
+                       err("Could not find PCI device for slot %02x", slot->number);
+                       return 0;
+@@ -603,6 +606,10 @@ int cpci_configure_slot(struct slot* slo
+                               continue;
+                       wrapped_dev.dev = dev;
+                       wrapped_bus.bus = slot->dev->bus;
++                      if(i)
++                              wrapped_dev.data = NULL;
++                      else
++                              wrapped_dev.data = (void*) slot;
+                       rc = pci_visit_dev(&configure_functions, &wrapped_dev, &wrapped_bus);
+               }
+       }
+@@ -635,9 +642,14 @@ int cpci_unconfigure_slot(struct slot* s
+               if(dev) {
+                       wrapped_dev.dev = dev;
+                       wrapped_bus.bus = dev->bus;
++                      if(i)
++                              wrapped_dev.data = NULL;
++                      else
++                              wrapped_dev.data = (void*) slot;
+                       dbg("%s - unconfigure phase 2", __FUNCTION__);
+                       rc = pci_visit_dev(&unconfigure_functions_phase2,
+-                                         &wrapped_dev, &wrapped_bus);
++                                         &wrapped_dev,
++                                         &wrapped_bus);
+                       if(rc)
+                               break;
+               }
+--- linux-2.6.0-test1/drivers/pci/hotplug/Kconfig      2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/hotplug/Kconfig     2003-07-19 17:03:50.000000000 -0700
+@@ -99,22 +99,17 @@ config HOTPLUG_PCI_ACPI
+         When in doubt, say N.
+ config HOTPLUG_PCI_CPCI
+-      tristate "CompactPCI Hotplug driver"
++      bool "CompactPCI Hotplug driver"
+       depends on HOTPLUG_PCI
+       help
+         Say Y here if you have a CompactPCI system card with CompactPCI
+         hotswap support per the PICMG 2.1 specification.
+-        This code is also available as a module ( = code which can be
+-        inserted in and removed from the running kernel whenever you want).
+-        The module will be called cpci_hotplug. If you want to compile it
+-        as a module, say M here and read <file:Documentation/modules.txt>.
+-
+         When in doubt, say N.
+ config HOTPLUG_PCI_CPCI_ZT5550
+       tristate "Ziatech ZT5550 CompactPCI Hotplug driver"
+-      depends on HOTPLUG_PCI_CPCI && X86
++      depends on HOTPLUG_PCI && HOTPLUG_PCI_CPCI && X86
+       help
+         Say Y here if you have an Performance Technologies (formerly Intel,
+           formerly just Ziatech) Ziatech ZT5550 CompactPCI system card.
+@@ -128,7 +123,7 @@ config HOTPLUG_PCI_CPCI_ZT5550
+ config HOTPLUG_PCI_CPCI_GENERIC
+       tristate "Generic port I/O CompactPCI Hotplug driver"
+-      depends on HOTPLUG_PCI_CPCI && X86
++      depends on HOTPLUG_PCI && HOTPLUG_PCI_CPCI && X86
+       help
+         Say Y here if you have a CompactPCI system card that exposes the #ENUM
+         hotswap signal as a bit in a system register that can be read through
+--- linux-2.6.0-test1/drivers/pci/Makefile     2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/Makefile    2003-07-19 17:03:50.000000000 -0700
+@@ -2,7 +2,7 @@
+ # Makefile for the PCI bus specific drivers.
+ #
+-obj-y         += access.o bus.o probe.o pci.o pool.o quirks.o \
++obj-y         += access.o bus.o probe.o remove.o pci.o pool.o quirks.o \
+                       names.o pci-driver.o search.o pci-sysfs.o
+ obj-$(CONFIG_PM)  += power.o
+ obj-$(CONFIG_PROC_FS) += proc.o
+--- linux-2.6.0-test1/drivers/pci/pci.c        2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pci/pci.c       2003-07-19 17:03:50.000000000 -0700
+@@ -506,7 +506,7 @@ err_out:
+               pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem",
+               bar + 1, /* PCI BAR # */
+               pci_resource_len(pdev, bar), pci_resource_start(pdev, bar),
+-              pdev->slot_name);
++              pci_name(pdev));
+       return -EBUSY;
+ }
+@@ -555,7 +555,7 @@ err_out:
+               pci_resource_flags(pdev, i) & IORESOURCE_IO ? "I/O" : "mem",
+               i + 1, /* PCI BAR # */
+               pci_resource_len(pdev, i), pci_resource_start(pdev, i),
+-              pdev->slot_name);
++              pci_name(pdev));
+       while(--i >= 0)
+               pci_release_region(pdev, i);
+               
+@@ -576,7 +576,7 @@ pci_set_master(struct pci_dev *dev)
+       pci_read_config_word(dev, PCI_COMMAND, &cmd);
+       if (! (cmd & PCI_COMMAND_MASTER)) {
+-              DBG("PCI: Enabling bus mastering for device %s\n", dev->slot_name);
++              DBG("PCI: Enabling bus mastering for device %s\n", pci_name(dev));
+               cmd |= PCI_COMMAND_MASTER;
+               pci_write_config_word(dev, PCI_COMMAND, cmd);
+       }
+@@ -620,7 +620,7 @@ pci_generic_prep_mwi(struct pci_dev *dev
+               return 0;
+       printk(KERN_WARNING "PCI: cache line size of %d is not supported "
+-             "by device %s\n", pci_cache_line_size << 2, dev->slot_name);
++             "by device %s\n", pci_cache_line_size << 2, pci_name(dev));
+       return -EINVAL;
+ }
+@@ -653,7 +653,7 @@ pci_set_mwi(struct pci_dev *dev)
+       pci_read_config_word(dev, PCI_COMMAND, &cmd);
+       if (! (cmd & PCI_COMMAND_INVALIDATE)) {
+-              DBG("PCI: Enabling Mem-Wr-Inval for device %s\n", dev->slot_name);
++              DBG("PCI: Enabling Mem-Wr-Inval for device %s\n", pci_name(dev));
+               cmd |= PCI_COMMAND_INVALIDATE;
+               pci_write_config_word(dev, PCI_COMMAND, cmd);
+       }
+--- linux-2.6.0-test1/drivers/pci/pool.c       2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/pci/pool.c      2003-07-19 17:03:50.000000000 -0700
+@@ -233,7 +233,7 @@ pci_pool_destroy (struct pci_pool *pool)
+                               struct pci_page, page_list);
+               if (is_page_busy (pool->blocks_per_page, page->bitmap)) {
+                       printk (KERN_ERR "pci_pool_destroy %s/%s, %p busy\n",
+-                              pool->dev ? pool->dev->slot_name : NULL,
++                              pool->dev ? pci_name(pool->dev) : NULL,
+                               pool->name, page->vaddr);
+                       /* leak the still-in-use consistent memory */
+                       list_del (&page->page_list);
+@@ -359,7 +359,7 @@ pci_pool_free (struct pci_pool *pool, vo
+       if ((page = pool_find_page (pool, dma)) == 0) {
+               printk (KERN_ERR "pci_pool_free %s/%s, %p/%lx (bad dma)\n",
+-                      pool->dev ? pool->dev->slot_name : NULL,
++                      pool->dev ? pci_name(pool->dev) : NULL,
+                       pool->name, vaddr, (unsigned long) dma);
+               return;
+       }
+@@ -372,13 +372,13 @@ pci_pool_free (struct pci_pool *pool, vo
+ #ifdef        CONFIG_DEBUG_SLAB
+       if (((dma - page->dma) + (void *)page->vaddr) != vaddr) {
+               printk (KERN_ERR "pci_pool_free %s/%s, %p (bad vaddr)/%Lx\n",
+-                      pool->dev ? pool->dev->slot_name : NULL,
++                      pool->dev ? pci_name(pool->dev) : NULL,
+                       pool->name, vaddr, (unsigned long long) dma);
+               return;
+       }
+       if (page->bitmap [map] & (1UL << block)) {
+               printk (KERN_ERR "pci_pool_free %s/%s, dma %Lx already free\n",
+-                      pool->dev ? pool->dev->slot_name : NULL,
++                      pool->dev ? pci_name(pool->dev) : NULL,
+                       pool->name, (unsigned long long)dma);
+               return;
+       }
+--- linux-2.6.0-test1/drivers/pci/probe.c      2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/pci/probe.c     2003-07-19 17:04:50.000000000 -0700
+@@ -176,7 +176,7 @@ void __devinit pci_read_bridge_bases(str
+               limit |= (io_limit_hi << 16);
+       }
+-      if (base && base <= limit) {
++      if (base <= limit) {
+               res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
+               res->start = base;
+               res->end = limit + 0xfff;
+@@ -187,7 +187,7 @@ void __devinit pci_read_bridge_bases(str
+       pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
+       base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
+       limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16;
+-      if (base && base <= limit) {
++      if (base <= limit) {
+               res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
+               res->start = base;
+               res->end = limit + 0xfffff;
+@@ -213,7 +213,7 @@ void __devinit pci_read_bridge_bases(str
+               }
+ #endif
+       }
+-      if (base && base <= limit) {
++      if (base <= limit) {
+               res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
+               res->start = base;
+               res->end = limit + 0xfffff;
+--- linux-2.6.0-test1/drivers/pci/quirks.c     2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/pci/quirks.c    2003-07-19 17:03:50.000000000 -0700
+@@ -33,7 +33,7 @@ static void __devinit quirk_passive_rele
+       while ((d = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, d))) {
+               pci_read_config_byte(d, 0x82, &dlc);
+               if (!(dlc & 1<<1)) {
+-                      printk(KERN_ERR "PCI: PIIX3: Enabling Passive Release on %s\n", d->slot_name);
++                      printk(KERN_ERR "PCI: PIIX3: Enabling Passive Release on %s\n", pci_name(d));
+                       dlc |= 1<<1;
+                       pci_write_config_byte(d, 0x82, dlc);
+               }
+@@ -437,7 +437,7 @@ static void __devinit quirk_via_irqpic(s
+       if (new_irq != irq) {
+               printk(KERN_INFO "PCI: Via IRQ fixup for %s, from %d to %d\n",
+-                     dev->slot_name, irq, new_irq);
++                     pci_name(dev), irq, new_irq);
+               udelay(15);
+               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq);
+@@ -598,7 +598,7 @@ static void __devinit quirk_ide_bases(st
+                return;
+        printk(KERN_INFO "PCI: Ignoring BAR%d-%d of IDE controller %s\n",
+-              first_bar, last_bar, dev->slot_name);
++              first_bar, last_bar, pci_name(dev));
+ }
+ /*
+@@ -856,7 +856,7 @@ static void pci_do_fixups(struct pci_dev
+                   (f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) &&
+                   (f->device == dev->device || f->device == (u16) PCI_ANY_ID)) {
+ #ifdef DEBUG
+-                      printk(KERN_INFO "PCI: Calling quirk %p for %s\n", f->hook, dev->slot_name);
++                      printk(KERN_INFO "PCI: Calling quirk %p for %s\n", f->hook, pci_name(dev));
+ #endif
+                       f->hook(dev);
+               }
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/pci/remove.c    2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,113 @@
++#include <linux/pci.h>
++#include <linux/module.h>
++#include "pci.h"
++
++#undef DEBUG
++
++#ifdef DEBUG
++#define DBG(x...) printk(x)
++#else
++#define DBG(x...)
++#endif
++
++static void pci_free_resources(struct pci_dev *dev)
++{
++      int i;
++
++      for (i = 0; i < PCI_NUM_RESOURCES; i++) {
++              struct resource *res = dev->resource + i;
++              if (res->parent)
++                      release_resource(res);
++      }
++}
++
++static void pci_destroy_dev(struct pci_dev *dev)
++{
++      pci_proc_detach_device(dev);
++      device_unregister(&dev->dev);
++
++      /* Remove the device from the device lists, and prevent any further
++       * list accesses from this device */
++      spin_lock(&pci_bus_lock);
++      list_del(&dev->bus_list);
++      list_del(&dev->global_list);
++      dev->bus_list.next = dev->bus_list.prev = NULL;
++      dev->global_list.next = dev->global_list.prev = NULL;
++      spin_unlock(&pci_bus_lock);
++
++      pci_free_resources(dev);
++      pci_dev_put(dev);
++}
++
++/**
++ * pci_remove_device_safe - remove an unused hotplug device
++ * @dev: the device to remove
++ *
++ * Delete the device structure from the device lists and 
++ * notify userspace (/sbin/hotplug), but only if the device
++ * in question is not being used by a driver.
++ * Returns 0 on success.
++ */
++int pci_remove_device_safe(struct pci_dev *dev)
++{
++      if (pci_dev_driver(dev))
++              return -EBUSY;
++      pci_destroy_dev(dev);
++      return 0;
++}
++EXPORT_SYMBOL(pci_remove_device_safe);
++
++/**
++ * pci_remove_bus_device - remove a PCI device and any children
++ * @dev: the device to remove
++ *
++ * Remove a PCI device from the device lists, informing the drivers
++ * that the device has been removed.  We also remove any subordinate
++ * buses and children in a depth-first manner.
++ *
++ * For each device we remove, delete the device structure from the
++ * device lists, remove the /proc entry, and notify userspace
++ * (/sbin/hotplug).
++ */
++void pci_remove_bus_device(struct pci_dev *dev)
++{
++      if (dev->subordinate) {
++              struct pci_bus *b = dev->subordinate;
++
++              pci_remove_behind_bridge(dev);
++              pci_proc_detach_bus(b);
++
++              spin_lock(&pci_bus_lock);
++              list_del(&b->node);
++              spin_unlock(&pci_bus_lock);
++
++              kfree(b);
++              dev->subordinate = NULL;
++      }
++
++      pci_destroy_dev(dev);
++}
++
++/**
++ * pci_remove_behind_bridge - remove all devices behind a PCI bridge
++ * @dev: PCI bridge device
++ *
++ * Remove all devices on the bus, except for the parent bridge.
++ * This also removes any child buses, and any devices they may
++ * contain in a depth-first manner.
++ */
++void pci_remove_behind_bridge(struct pci_dev *dev)
++{
++      struct list_head *l, *n;
++
++      if (dev->subordinate) {
++              list_for_each_safe(l, n, &dev->subordinate->devices) {
++                      struct pci_dev *dev = pci_dev_b(l);
++
++                      pci_remove_bus_device(dev);
++              }
++      }
++}
++
++EXPORT_SYMBOL(pci_remove_bus_device);
++EXPORT_SYMBOL(pci_remove_behind_bridge);
+--- linux-2.6.0-test1/drivers/pci/setup-bus.c  2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/pci/setup-bus.c 2003-07-19 17:03:50.000000000 -0700
+@@ -81,7 +81,7 @@ pci_setup_cardbus(struct pci_bus *bus)
+       struct pci_bus_region region;
+       printk("PCI: Bus %d, cardbus bridge: %s\n",
+-              bus->number, bridge->slot_name);
++              bus->number, pci_name(bridge));
+       pcibios_resource_to_bus(bridge, &region, bus->resource[0]);
+       if (bus->resource[0]->flags & IORESOURCE_IO) {
+@@ -344,7 +344,7 @@ pbus_size_mem(struct pci_bus *bus, unsig
+                       if (order > 11) {
+                               printk(KERN_WARNING "PCI: region %s/%d "
+                                      "too large: %lx-%lx\n",
+-                                     dev->slot_name, i, r->start, r->end);
++                                     pci_name(dev), i, r->start, r->end);
+                               r->flags = 0;
+                               continue;
+                       }
+@@ -513,7 +513,7 @@ pci_bus_assign_resources(struct pci_bus 
+               default:
+                       printk(KERN_INFO "PCI: not setting up bridge %s "
+-                             "for bus %d\n", dev->slot_name, b->number);
++                             "for bus %d\n", pci_name(dev), b->number);
+                       break;
+               }
+       }
+--- linux-2.6.0-test1/drivers/pci/setup-res.c  2003-06-14 12:18:32.000000000 -0700
++++ 25/drivers/pci/setup-res.c 2003-07-19 17:03:50.000000000 -0700
+@@ -68,7 +68,7 @@ pci_update_resource(struct pci_dev *dev,
+       if ((new ^ check) & mask) {
+               printk(KERN_ERR "PCI: Error while updating region "
+-                     "%s/%d (%08x != %08x)\n", dev->slot_name, resno,
++                     "%s/%d (%08x != %08x)\n", pci_name(dev), resno,
+                      new, check);
+       }
+@@ -80,7 +80,7 @@ pci_update_resource(struct pci_dev *dev,
+               if (check != new) {
+                       printk(KERN_ERR "PCI: Error updating region "
+                              "%s/%d (high %08x != %08x)\n",
+-                             dev->slot_name, resno, new, check);
++                             pci_name(dev), resno, new, check);
+               }
+       }
+ }
+@@ -101,7 +101,7 @@ pci_claim_resource(struct pci_dev *dev, 
+               printk(KERN_ERR "PCI: %s region %d of %s %s [%lx:%lx]\n",
+                      root ? "Address space collision on" :
+                             "No parent found for",
+-                     resource, dtype, dev->slot_name, res->start, res->end);
++                     resource, dtype, pci_name(dev), res->start, res->end);
+       }
+       return err;
+@@ -139,7 +139,7 @@ int pci_assign_resource(struct pci_dev *
+       if (ret) {
+               printk(KERN_ERR "PCI: Failed to allocate resource %d(%lx-%lx) for %s\n",
+-                     resno, res->start, res->end, dev->slot_name);
++                     resno, res->start, res->end, pci_name(dev));
+       } else if (resno < PCI_BRIDGE_RESOURCES) {
+               pci_update_resource(dev, res, resno);
+       }
+--- linux-2.6.0-test1/drivers/pcmcia/hd64465_ss.c      2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/pcmcia/hd64465_ss.c     2003-07-19 17:03:50.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * $Id: 2.6.0-test1-mm2.patch,v 1.1.2.2 2003/07/22 07:20:21 braam Exp $
++ * $Id: 2.6.0-test1-mm2.patch,v 1.1.2.2 2003/07/22 07:20:21 braam Exp $
+  *
+  * Device driver for the PCMCIA controller module of the
+  * Hitachi HD64465 handheld companion chip.
+@@ -24,7 +24,6 @@
+  *
+  * by Greg Banks <gbanks@pocketpenguins.com>
+  * (c) 2000 PocketPenguins Inc
+- *
+  */
+ #include <linux/types.h>
+@@ -37,28 +36,26 @@
+ #include <linux/vmalloc.h>
+ #include <asm/errno.h>
+ #include <linux/irq.h>
+-#include <linux/workqueue.h>
++#include <linux/interrupt.h>
+ #include <linux/device.h>
+ #include <asm/io.h>
+-#include <asm/hd64465.h>
++#include <asm/hd64465/hd64465.h>
++#include <asm/hd64465/io.h>
+ #include <pcmcia/version.h>
+ #include <pcmcia/cs_types.h>
+ #include <pcmcia/cs.h>
++#include <pcmcia/cistpl.h>
++#include <pcmcia/ds.h>
+ #include <pcmcia/ss.h>
+ #include <pcmcia/bulkmem.h>
+-#include <pcmcia/cistpl.h>
+ #include "cs_internal.h"
+ #define MODNAME "hd64465_ss"
+ /* #define HD64465_DEBUG 1 */
+-#ifndef HD64465_DEBUG
+-#define HD64465_DEBUG 0
+-#endif
+-
+ #if HD64465_DEBUG
+ #define DPRINTK(args...)      printk(MODNAME ": " args)
+ #else
+@@ -66,7 +63,8 @@
+ #endif
+ extern int hd64465_io_debug;
+-
++extern void * p3_ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);
++extern void p3_iounmap(void *addr);
+ /*============================================================*/
+@@ -74,37 +72,22 @@ extern int hd64465_io_debug;
+ typedef struct hs_socket_t
+ {
++    unsigned int      number;
+     u_int             irq;
+     u_long            mem_base;
++    void              *io_base;
+     u_long            mem_length;
+-    void              (*handler)(void *info, u_int events);
+-    void              *handler_info;
+-    u_int             pending_events;
+     u_int             ctrl_base;
+     socket_state_t    state;
+     pccard_io_map             io_maps[MAX_IO_WIN];
+     pccard_mem_map    mem_maps[MAX_WIN];
+-    struct vm_struct  *io_vma;    /* allocated kernel vm for mapping IO space */
++    struct pcmcia_socket      socket;
+ } hs_socket_t;
+-#define HS_MAX_SOCKETS 2
+-static hs_socket_t hs_sockets[HS_MAX_SOCKETS];
+-static spinlock_t hs_pending_event_lock = SPIN_LOCK_UNLOCKED;
+-/* Calculate socket number from ptr into hs_sockets[] */
+-#define hs_sockno(sp)         (sp - hs_sockets)
+-static socket_cap_t hs_socket_cap =
+-{
+-    SS_CAP_PCCARD         /* support 16 bit cards */
+-    |SS_CAP_STATIC_MAP      /* mappings are fixed in host memory */
+-    ,
+-    0xffde/*0xffff*/,             /* IRQs mapped in s/w so can do any, really */
+-    HD64465_PCC_WINDOW,     /* 16MB fixed window size */
+-    0,                            /* no PCI support */
+-    0,                            /* no CardBus support */
+-    0                     /* no bus operations needed */
+-};
++#define HS_MAX_SOCKETS 2
++static hs_socket_t hs_sockets[HS_MAX_SOCKETS];
+ #define hs_in(sp, r)      inb((sp)->ctrl_base + (r))
+ #define hs_out(sp, v, r)    outb(v, (sp)->ctrl_base + (r))
+@@ -179,7 +162,7 @@ static void hs_socket_enable_ireq(hs_soc
+ {
+       unsigned short cscier;
+       
+-      DPRINTK("hs_socket_enable_ireq(sock=%d)\n", hs_sockno(sp));
++      DPRINTK("hs_socket_enable_ireq(sock=%d)\n", sp->number);
+       cscier = hs_in(sp, CSCIER);
+       cscier &= ~HD64465_PCCCSCIER_PIREQE_MASK;
+@@ -191,7 +174,7 @@ static void hs_socket_disable_ireq(hs_so
+ {
+       unsigned short cscier;
+       
+-      DPRINTK("hs_socket_disable_ireq(sock=%d)\n", hs_sockno(sp));
++      DPRINTK("hs_socket_disable_ireq(sock=%d)\n", sp->number);
+       
+       cscier = hs_in(sp, CSCIER);
+       cscier &= ~HD64465_PCCCSCIER_PIREQE_MASK;
+@@ -255,7 +238,7 @@ static struct hw_interrupt_type hd64465_
+  */
+ static void hs_map_irq(hs_socket_t *sp, unsigned int irq)
+ {
+-      DPRINTK("hs_map_irq(sock=%d irq=%d)\n", hs_sockno(sp), irq);
++      DPRINTK("hs_map_irq(sock=%d irq=%d)\n", sp->number, irq);
+       
+       if (irq >= HS_NUM_MAPPED_IRQS)
+           return;
+@@ -272,7 +255,7 @@ static void hs_map_irq(hs_socket_t *sp, 
+  */
+ static void hs_unmap_irq(hs_socket_t *sp, unsigned int irq)
+ {
+-      DPRINTK("hs_unmap_irq(sock=%d irq=%d)\n", hs_sockno(sp), irq);
++      DPRINTK("hs_unmap_irq(sock=%d irq=%d)\n", sp->number, irq);
+       
+       if (irq >= HS_NUM_MAPPED_IRQS)
+           return;
+@@ -301,7 +284,7 @@ static int hs_set_voltages(hs_socket_t *
+ {
+       u_int psr;
+       u_int vcci = 0;
+-      u_int sock = hs_sockno(sp);
++      u_int sock = sp->number;
+       
+       DPRINTK("hs_set_voltage(%d, %d, %d)\n", sock, Vcc, Vpp);
+@@ -359,13 +342,12 @@ static void hs_reset_socket(hs_socket_t 
+ /*============================================================*/
+-static int hs_init(unsigned int sock)
++static int hs_init(struct pcmcia_socket *s)
+ {
+-      hs_socket_t *sp = &hs_sockets[sock];
++      hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+       
+-      DPRINTK("hs_init(%d)\n", sock);
++      DPRINTK("hs_init(%d)\n", sp->number);
+       
+-      sp->pending_events = 0;
+       sp->state.Vcc = 0;
+       sp->state.Vpp = 0;
+       hs_set_voltages(sp, 0, 0);
+@@ -375,9 +357,12 @@ static int hs_init(unsigned int sock)
+ /*============================================================*/
+-static int hs_suspend(unsigned int sock)
++static int hs_suspend(struct pcmcia_socket *s)
+ {
+-      DPRINTK("hs_suspend(%d)\n", sock);
++#ifdef HD64465_DEBUG
++      hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
++      DPRINTK("hs_suspend(%d)\n", sp->number);
++#endif
+       /* TODO */
+       
+@@ -386,32 +371,10 @@ static int hs_suspend(unsigned int sock)
+ /*============================================================*/
+-static int hs_register_callback(unsigned int sock,
+-          void (*handler)(void *, unsigned int), void * info)
+-{
+-      hs_socket_t *sp = &hs_sockets[sock];
+-      
+-      DPRINTK("hs_register_callback(%d)\n", sock);
+-      sp->handler = handler;
+-      sp->handler_info = info;
+-      return 0;
+-}
+-
+-/*============================================================*/
+-static int hs_inquire_socket(unsigned int sock, socket_cap_t *cap)
++static int hs_get_status(struct pcmcia_socket *s, u_int *value)
+ {
+-      DPRINTK("hs_inquire_socket(%d)\n", sock);
+-
+-      *cap = hs_socket_cap;
+-      return 0;
+-}
+-
+-/*============================================================*/
+-
+-static int hs_get_status(unsigned int sock, u_int *value)
+-{
+-      hs_socket_t *sp = &hs_sockets[sock];
++      hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+       unsigned int isr;
+       u_int status = 0;
+       
+@@ -473,9 +436,9 @@ static int hs_get_status(unsigned int so
+ /*============================================================*/
+-static int hs_get_socket(unsigned int sock, socket_state_t *state)
++static int hs_get_socket(struct pcmcia_socket *s, socket_state_t *state)
+ {
+-      hs_socket_t *sp = &hs_sockets[sock];
++      hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+       DPRINTK("hs_get_socket(%d)\n", sock);
+       
+@@ -485,9 +448,9 @@ static int hs_get_socket(unsigned int so
+ /*============================================================*/
+-static int hs_set_socket(unsigned int sock, socket_state_t *state)
++static int hs_set_socket(struct pcmcia_socket *s, socket_state_t *state)
+ {
+-      hs_socket_t *sp = &hs_sockets[sock];
++      hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+       u_long flags;
+       u_int changed;
+       unsigned short cscier;
+@@ -495,12 +458,12 @@ static int hs_set_socket(unsigned int so
+       DPRINTK("hs_set_socket(sock=%d, flags=%x, csc_mask=%x, Vcc=%d, Vpp=%d, io_irq=%d)\n",
+           sock, state->flags, state->csc_mask, state->Vcc, state->Vpp, state->io_irq);
+       
+-      save_and_cli(flags);    /* Don't want interrupts happening here */
++      local_irq_save(flags);  /* Don't want interrupts happening here */
+       if (state->Vpp != sp->state.Vpp ||
+           state->Vcc != sp->state.Vcc) {
+           if (!hs_set_voltages(sp, state->Vcc, state->Vpp)) {
+-              restore_flags(flags);
++              local_irq_restore(flags);
+               return -EINVAL;
+           }
+       }
+@@ -588,7 +551,7 @@ static int hs_set_socket(unsigned int so
+ /*            hd64465_io_debug = 0; */
+       sp->state = *state;
+           
+-      restore_flags(flags);
++      local_irq_restore(flags);
+ #if HD64465_DEBUG > 10
+       if (state->flags & SS_OUTPUT_ENA)   
+@@ -599,10 +562,11 @@ static int hs_set_socket(unsigned int so
+ /*============================================================*/
+-static int hs_set_io_map(unsigned int sock, struct pccard_io_map *io)
++static int hs_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
+ {
+-      hs_socket_t *sp = &hs_sockets[sock];
++      hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+       int map = io->map;
++      int sock = sp->number;
+       struct pccard_io_map *sio;
+       pgprot_t prot;
+@@ -639,10 +603,9 @@ static int hs_set_io_map(unsigned int so
+           printk(KERN_INFO MODNAME ": MAP_0WS unimplemented\n");
+       if (io->flags & MAP_ACTIVE) {
+-          unsigned long pstart, psize, paddrbase, vaddrbase;
++          unsigned long pstart, psize, paddrbase;
+           
+           paddrbase = virt_to_phys((void*)(sp->mem_base + 2 * HD64465_PCC_WINDOW));
+-          vaddrbase = (unsigned long)sp->io_vma->addr;
+           pstart = io->start & PAGE_MASK;
+           psize = ((io->stop + PAGE_SIZE) & PAGE_MASK) - pstart;
+@@ -653,26 +616,17 @@ static int hs_set_io_map(unsigned int so
+            * page will be mapped.  But the code allows for weird cards
+            * that might want IO ports > 4K.
+            */
+-          DPRINTK("remap_page_range(vaddr=0x%08lx, paddr=0x%08lx, size=0x%08lxx)\n",
+-              vaddrbase + pstart, paddrbase + pstart, psize);
+-#error This does not work.  Firstly remap_page_range() uses current->mm for
+-#error the address space, which is wrong for kernel mappings.  remap_page_range
+-#error also does flush_{cache,tlb}_range() which ONLY works for user mappings.
+-#error Next, remap_page_range() now wants to take a vm_area_struct arg.
+-          remap_page_range(vaddrbase + pstart, paddrbase + pstart, psize, prot);
++          sp->io_base = p3_ioremap(paddrbase + pstart, psize, pgprot_val(prot));
+           
+           /*
+            * Change the mapping used by inb() outb() etc
+            */
+-          hd64465_port_map(
+-              io->start,
++          hd64465_port_map(io->start,
+               io->stop - io->start + 1,
+-              vaddrbase + io->start,0);
++              (unsigned long)sp->io_base + io->start, 0);
+       } else {
+-          hd64465_port_unmap(
+-              sio->start,
+-              sio->stop - sio->start + 1);
+-          /* TODO: remap_page_range() to mark pages not present ? */
++          hd64465_port_unmap(sio->start, sio->stop - sio->start + 1);
++          p3_iounmap(sp->io_base);
+       }
+       
+       *sio = *io;
+@@ -681,9 +635,9 @@ static int hs_set_io_map(unsigned int so
+ /*============================================================*/
+-static int hs_set_mem_map(unsigned int sock, struct pccard_mem_map *mem)
++static int hs_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem)
+ {
+-      hs_socket_t *sp = &hs_sockets[sock];
++      hs_socket_t *sp = container_of(s, struct hs_socket_t, socket);
+       struct pccard_mem_map *smem;
+       int map = mem->map;
+       unsigned long paddr, size;
+@@ -722,13 +676,6 @@ static int hs_set_mem_map(unsigned int s
+ /*============================================================*/
+-static void hs_proc_setup(unsigned int sock, struct proc_dir_entry *base)
+-{
+-      DPRINTK("hs_proc_setup(%d)\n", sock);
+-}
+-
+-/*============================================================*/
+-
+ /*
+  * This function is registered with the HD64465 glue code to do a
+  * secondary demux step on the PCMCIA interrupts.  It handles 
+@@ -756,35 +703,9 @@ static int hs_irq_demux(int irq, void *d
+ /*
+  * Interrupt handling routine.
+- *
+- * This uses the schedule_work() technique to cause reportable events
+- * such as card insertion and removal to be handled in keventd's
+- * process context.
+  */
+  
+-
+-static void hs_events_bh(void *dummy)
+-{
+-      hs_socket_t *sp;
+-      u_int events;
+-      int i;
+-
+-      for (i=0; i<HS_MAX_SOCKETS; i++) {
+-          sp = &hs_sockets[i];
+-
+-          spin_lock_irq(&hs_pending_event_lock);
+-          events = sp->pending_events;
+-          sp->pending_events = 0;
+-          spin_unlock_irq(&hs_pending_event_lock);
+-          
+-          if (sp->handler)
+-              sp->handler(sp->handler_info, events);
+-      }
+-}
+-
+-static DECLARE_WORK(hs_events_task, hs_events_bh, NULL);
+-
+-static void hs_interrupt(int irq, void *dev, struct pt_regs *regs)
++static irqreturn_t hs_interrupt(int irq, void *dev, struct pt_regs *regs)
+ {
+       hs_socket_t *sp = (hs_socket_t *)dev;
+       u_int events = 0;
+@@ -801,7 +722,7 @@ static void hs_interrupt(int irq, void *
+           if ((hs_in(sp, ISR) & HD64465_PCCISR_PCD_MASK) != 0) {
+               printk(KERN_NOTICE MODNAME
+                   ": socket %d, card not a supported card type or not inserted correctly\n",
+-                  hs_sockno(sp));
++                  sp->number);
+               /* Don't do the rest unless a card is present */
+               cscr &= ~(HD64465_PCCCSCR_PCDC|
+                         HD64465_PCCCSCR_PRC|
+@@ -839,34 +760,22 @@ static void hs_interrupt(int irq, void *
+       hs_out(sp, cscr, CSCR);
+-      if (events) {
+-          /*
+-           * Arrange for events to be reported to the registered
+-           * event handler function (from CardServices) in a process
+-           * context (keventd) "soon".
+-           */
+-          spin_lock(&hs_pending_event_lock);
+-          sp->pending_events |= events;
+-          spin_unlock(&hs_pending_event_lock);
+-          
+-          schedule_work(&hs_events_task);
+-      }
++      if (events)
++              pcmcia_parse_events(&sp->socket, events);
++
++      return IRQ_HANDLED;
+ }
+ /*============================================================*/
+ static struct pccard_operations hs_operations = {
+-      .owner                  = THIS_MODULE,
+       .init                   = hs_init,
+       .suspend                = hs_suspend,
+-      .register_callback      = hs_register_callback,
+-      .inquire_socket         = hs_inquire_socket,
+       .get_status             = hs_get_status,
+       .get_socket             = hs_get_socket,
+       .set_socket             = hs_set_socket,
+       .set_io_map             = hs_set_io_map,
+       .set_mem_map            = hs_set_mem_map,
+-      .proc_setup             = hs_proc_setup,
+ };
+ static int hs_init_socket(hs_socket_t *sp, int irq, unsigned long mem_base,
+@@ -886,9 +795,6 @@ static int hs_init_socket(hs_socket_t *s
+       for (i=0 ; i<MAX_WIN ; i++)
+           sp->mem_maps[i].map = i;
+       
+-      if ((sp->io_vma = get_vm_area(HS_IO_MAP_SIZE, VM_IOREMAP)) == 0)
+-          return -ENOMEM;
+-
+       hd64465_register_irq_demux(sp->irq, hs_irq_demux, sp);
+       
+       if ((err = request_irq(sp->irq, hs_interrupt, SA_INTERRUPT, MODNAME, sp)) < 0)
+@@ -925,9 +831,8 @@ static int hs_init_socket(hs_socket_t *s
+       
+       hs_reset_socket(sp, 1);
+-      printk(KERN_INFO "HD64465 PCMCIA bridge socket %d at 0x%08lx irq %d io window %ldK@0x%08lx\n",
+-              i, sp->mem_base, sp->irq,
+-              sp->io_vma->size>>10, (unsigned long)sp->io_vma->addr);
++      printk(KERN_INFO "HD64465 PCMCIA bridge socket %d at 0x%08lx irq %d\n",
++              i, sp->mem_base, sp->irq);
+       return 0;
+ }
+@@ -935,7 +840,10 @@ static int hs_init_socket(hs_socket_t *s
+ static void hs_exit_socket(hs_socket_t *sp)
+ {
+       unsigned short cscier, gcr;
++      unsigned long flags;
+       
++      local_irq_save(flags);
++
+       /* turn off interrupts in hardware */
+       cscier = hs_in(sp, CSCIER);
+       cscier = (cscier & IER_MASK) | IER_OFF;
+@@ -955,19 +863,13 @@ static void hs_exit_socket(hs_socket_t *
+           free_irq(sp->irq, hs_interrupt);
+           hd64465_unregister_irq_demux(sp->irq);
+       }
+-      if (sp->io_vma != 0)
+-          vfree(sp->io_vma->addr);
+-}
+-static struct pcmcia_socket_class_data hd64465_data = {
+-      .nsock = HS_MAX_SOCKETS,
+-      .ops = &hs_operations,
+-};
++      local_irq_restore(flags);
++}
+ static struct device_driver hd64465_driver = {
+       .name = "hd64465-pcmcia",
+       .bus = &platform_bus_type,
+-      .devclass = &pcmcia_socket_class,
+       .suspend = pcmcia_socket_dev_suspend,
+       .resume = pcmcia_socket_dev_resume,
+ };
+@@ -996,7 +898,8 @@ static int __init init_hs(void)
+       }
+ /*    hd64465_io_debug = 1; */
+-      register_driver(&hd64465_driver);
++      if (driver_register(&hd64465_driver))
++              return -EINVAL;
+       
+       /* Wake both sockets out of STANDBY mode */
+       /* TODO: wait 15ms */
+@@ -1014,14 +917,22 @@ static int __init init_hs(void)
+       v |= HD64465_PCCCSCR_PSWSEL;
+       outb(v, HD64465_REG_PCC0CSCR);
+-      hs_set_voltages(&hs_sockets[0], 0, 0);
+-      hs_set_voltages(&hs_sockets[1], 0, 0);
+-      
+       /*
+        * Setup hs_sockets[] structures and request system resources.
+        * TODO: on memory allocation failure, power down the socket
+        *       before quitting.
+        */
++      for (i=0; i<HS_MAX_SOCKETS; i++) {
++              hs_set_voltages(&hs_sockets[i], 0, 0);
++
++              hs_sockets[i].socket.features |=  SS_CAP_PCCARD | SS_CAP_STATIC_MAP;      /* mappings are fixed in host memory */
++              hs_sockets[i].socket.irq_mask =  0xffde;/*0xffff*/          /* IRQs mapped in s/w so can do any, really */
++              hs_sockets[i].socket.map_size = HD64465_PCC_WINDOW;     /* 16MB fixed window size */
++
++              hs_sockets[i].socket.owner = THIS_MODULE;
++              hs_sockets[i].socket.ss_entry = &hs_operations;
++      }
++
+       i = hs_init_socket(&hs_sockets[0],
+           HD64465_IRQ_PCMCIA0,
+           HD64465_PCC0_BASE,
+@@ -1040,27 +951,31 @@ static int __init init_hs(void)
+       }
+ /*    hd64465_io_debug = 0; */
+-      hd64465_device.dev.class_data = &hd64465_data;
++
+       platform_device_register(&hd64465_device);
+-      return 0;
++      for (i=0; i<HS_MAX_SOCKETS; i++) {
++              unsigned int ret;
++              hs_sockets[i].socket.dev.dev = &hd64465_device.dev;             
++              hs_sockets[i].number = i;
++              ret = pcmcia_register_socket(&hs_sockets[i].socket);
++              if (ret && i)
++                      pcmcia_unregister_socket(&hs_sockets[0].socket);
++      }
++
++      return 0;
+ }
+ static void __exit exit_hs(void)
+ {
+-      u_long flags;
+       int i;
+-      
+-      save_and_cli(flags);
+-      /*
+-       * Release kernel resources
+-       */
+-      for (i=0 ; i<HS_MAX_SOCKETS ; i++)
+-          hs_exit_socket(&hs_sockets[i]);
++      for (i=0 ; i<HS_MAX_SOCKETS ; i++) {
++              pcmcia_unregister_socket(&hs_sockets[i].socket);
++              hs_exit_socket(&hs_sockets[i]);
++      }
++
+       platform_device_unregister(&hd64465_device);
+-      
+-      restore_flags(flags);
+       unregister_driver(&hd64465_driver);
+ }
+--- linux-2.6.0-test1/drivers/pcmcia/ricoh.h   2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/pcmcia/ricoh.h  2003-07-19 17:03:50.000000000 -0700
+@@ -116,6 +116,8 @@
+ #define  RL5C4XX_CMD_SHIFT            4
+ #define  RL5C4XX_HOLD_MASK            0x1c00
+ #define  RL5C4XX_HOLD_SHIFT           10
++#define  RL5C4XX_MISC_CONTROL           0x2F /* 8 bit */
++#define  RL5C4XX_ZV_ENABLE              0x08
+ #ifdef __YENTA_H
+@@ -125,10 +127,41 @@
+ #define rl_mem(socket)                ((socket)->private[3])
+ #define rl_config(socket)     ((socket)->private[4])
++static void ricoh_zoom_video(struct pcmcia_socket *sock, int onoff)
++{
++        u8 reg;
++      struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++
++        reg = config_readb(socket, RL5C4XX_MISC_CONTROL);
++        if (onoff)
++                /* Zoom zoom, we will all go together, zoom zoom, zoom zoom */
++                reg |=  RL5C4XX_ZV_ENABLE;
++        else
++                reg &= ~RL5C4XX_ZV_ENABLE;
++      
++        config_writeb(socket, RL5C4XX_MISC_CONTROL, reg);
++}
++
++static void ricoh_set_zv(struct pcmcia_socket *sock)
++{
++      struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++        if(socket->dev->vendor == PCI_VENDOR_ID_RICOH)
++        {
++                switch(socket->dev->device)
++                {
++                        /* There may be more .. */
++              case  PCI_DEVICE_ID_RICOH_RL5C478:
++                      sock->zoom_video = ricoh_zoom_video;
++                      break;  
++                }
++        }
++}
++
+ static int ricoh_init(struct pcmcia_socket *sock)
+ {
+       struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+       yenta_init(sock);
++      ricoh_set_zv(sock);
+       config_writew(socket, RL5C4XX_MISC, rl_misc(socket));
+       config_writew(socket, RL5C4XX_16BIT_CTL, rl_ctl(socket));
+--- linux-2.6.0-test1/drivers/pcmcia/ti113x.h  2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/pcmcia/ti113x.h 2003-07-19 17:03:50.000000000 -0700
+@@ -148,14 +148,96 @@ static int ti_intctl(struct yenta_socket
+       return 0;
+ }
++/*
++ *    Zoom video control for TI122x/113x chips
++ */
++
++static void ti_zoom_video(struct pcmcia_socket *sock, int onoff)
++{
++      u8 reg;
++      struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++
++      /* If we don't have a Zoom Video switch this is harmless,
++         we just tristate the unused (ZV) lines */
++      reg = config_readb(socket, TI113X_CARD_CONTROL);
++      if (onoff)
++              /* Zoom zoom, we will all go together, zoom zoom, zoom zoom */
++              reg |= TI113X_CCR_ZVENABLE;
++      else
++              reg &= ~TI113X_CCR_ZVENABLE;
++      config_writeb(socket, TI113X_CARD_CONTROL, reg);
++}
++
++/*
++ *    The 145x series can also use this. They have an additional
++ *    ZV autodetect mode we don't use but don't actually need.
++ *    FIXME: manual says its in func0 and func1 but disagrees with
++ *    itself about this - do we need to force func0, if so we need
++ *    to know a lot more about socket pairings in pcmcia_socket than
++ *    we do now.. uggh.
++ */
++ 
++static void ti1250_zoom_video(struct pcmcia_socket *sock, int onoff)
++{     
++      struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++      int shift = 0;
++      u8 reg;
++
++      ti_zoom_video(sock, onoff);
++
++      reg = config_readb(socket, 0x84);
++      reg |= (1<<7);  /* ZV bus enable */
++
++      if(PCI_FUNC(socket->dev->devfn)==1)
++              shift = 1;
++      
++      if(onoff)
++      {
++              reg &= ~(1<<6);         /* Clear select bit */
++              reg |= shift<<6;        /* Favour our socket */
++              reg |= 1<<shift;        /* Socket zoom video on */
++      }
++      else
++      {
++              reg &= ~(1<<6);         /* Clear select bit */
++              reg |= (1^shift)<<6;    /* Favour other socket */
++              reg &= ~(1<<shift);     /* Socket zoon video off */
++      }
++
++      config_writeb(socket, 0x84, reg);
++}
++
++static void ti_set_zv(struct pcmcia_socket *sock)
++{
++      struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
++      if(socket->dev->vendor == PCI_VENDOR_ID_TI)
++      {
++              switch(socket->dev->device)
++              {
++                      /* There may be more .. */
++                      case PCI_DEVICE_ID_TI_1220:
++                      case PCI_DEVICE_ID_TI_1221:
++                      case PCI_DEVICE_ID_TI_1225:
++                              sock->zoom_video = ti_zoom_video;
++                              break;  
++                      case PCI_DEVICE_ID_TI_1250:
++                      case PCI_DEVICE_ID_TI_1251A:
++                      case PCI_DEVICE_ID_TI_1251B:
++                      case PCI_DEVICE_ID_TI_1450:
++                              sock->zoom_video = ti1250_zoom_video;
++              }
++      }
++}
+ static int ti_init(struct pcmcia_socket *sock)
+ {
+       struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+       yenta_init(sock);
++      ti_set_zv(sock);
+       ti_intctl(socket);
+       return 0;
+ }
++
+ /*
+  * Generic TI init - TI has an extension for the
+  * INTCTL register that sets the PCI CSC interrupt.
+@@ -176,9 +258,6 @@ static int ti_override(struct yenta_sock
+       if (new != reg)
+               exca_writeb(socket, I365_INTCTL, new);
+-#if 0
+-      /* THIS CAUSES HANGS! Disabled for now, do not know why */
+-
+       /*
+        * If ISA interrupts don't work, then fall back to routing card
+        * interrupts to the PCI interrupt of the socket.
+@@ -190,7 +269,7 @@ static int ti_override(struct yenta_sock
+               u8 irqmux, devctl;
+               devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
+-              if (devctl & TI113X_DCR_IMODE_MASK != TI12XX_DCR_IMODE_ALL_SERIAL) {
++              if ((devctl & TI113X_DCR_IMODE_MASK) != TI12XX_DCR_IMODE_ALL_SERIAL) {
+                       printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
+                       devctl &= ~TI113X_DCR_IMODE_MASK;
+@@ -203,7 +282,6 @@ static int ti_override(struct yenta_sock
+                       config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+               }
+       }
+-#endif
+       socket->socket.ops->init = ti_init;
+       return 0;
+@@ -220,6 +298,7 @@ static int ti113x_init(struct pcmcia_soc
+ {
+       struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+       yenta_init(sock);
++      ti_set_zv(sock);
+       config_writel(socket, TI113X_SYSTEM_CONTROL, ti_sysctl(socket));
+       config_writeb(socket, TI113X_CARD_CONTROL, ti_cardctl(socket));
+@@ -248,6 +327,7 @@ static int ti1250_init(struct pcmcia_soc
+       struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+       yenta_init(sock);
+       ti113x_init(sock);
++      ti_set_zv(sock);
+       ti_irqmux(socket) = config_readl(socket, TI122X_IRQMUX);
+       ti_irqmux(socket) = (ti_irqmux(socket) & ~0x0f) | 0x02; /* route INTA */
+       if (!(ti_sysctl(socket) & TI122X_SCR_INTRTIE))
+--- linux-2.6.0-test1/drivers/pcmcia/yenta_socket.c    2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/pcmcia/yenta_socket.c   2003-07-19 17:03:50.000000000 -0700
+@@ -297,6 +297,8 @@ static int yenta_set_socket(struct pcmci
+               }
+               exca_writeb(socket, I365_CSCINT, reg);
+               exca_readb(socket, I365_CSC);
++              if(sock->zoom_video)
++                      sock->zoom_video(sock, state->flags & SS_ZVCARD);
+       }
+       config_writew(socket, CB_BRIDGE_CONTROL, bridge);
+       /* Socket event mask: get card insert/remove events.. */
+--- linux-2.6.0-test1/drivers/pnp/isapnp/core.c        2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/pnp/isapnp/core.c       2003-07-19 17:03:50.000000000 -0700
+@@ -255,14 +255,22 @@ static void __init isapnp_peek(unsigned 
+ static int isapnp_next_rdp(void)
+ {
+       int rdp = isapnp_rdp;
++      static int old_rdp = 0;
++      
++      if(old_rdp)
++      {
++              release_region(old_rdp, 1);
++              old_rdp = 0;
++      }
+       while (rdp <= 0x3ff) {
+               /*
+                *      We cannot use NE2000 probe spaces for ISAPnP or we
+                *      will lock up machines.
+                */
+-              if ((rdp < 0x280 || rdp >  0x380) && !check_region(rdp, 1))
++              if ((rdp < 0x280 || rdp >  0x380) && request_region(rdp, 1, "ISAPnP"))
+               {
+                       isapnp_rdp = rdp;
++                      old_rdp = rdp;
+                       return 0;
+               }
+               rdp += RDP_STEP;
+--- linux-2.6.0-test1/drivers/s390/block/dasd.c        2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/s390/block/dasd.c       2003-07-19 17:03:50.000000000 -0700
+@@ -16,7 +16,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/ctype.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
+ #include <linux/slab.h>
+ #include <linux/buffer_head.h>
+--- linux-2.6.0-test1/drivers/s390/block/dasd_genhd.c  2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/s390/block/dasd_genhd.c 2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+  *
+  * Dealing with devices registered to multiple major numbers.
+  *
+- * $Revision: 1.1.2.2 $
++ * $Revision: 1.1.2.2 $
+  */
+ #include <linux/config.h>
+@@ -17,7 +17,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
+ #include <asm/uaccess.h>
+@@ -200,7 +199,6 @@ void
+ dasd_destroy_partitions(struct dasd_device * device)
+ {
+       del_gendisk(device->gdp);
+-      put_disk(device->gdp);
+ }
+ int
+--- linux-2.6.0-test1/drivers/s390/block/dasd_int.h    2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/s390/block/dasd_int.h   2003-07-19 17:06:39.000000000 -0700
+@@ -14,7 +14,8 @@
+ #ifdef __KERNEL__
+-#define DASD_PER_MAJOR ( 1U<<(MINORBITS-DASD_PARTN_BITS))
++#define DASD_MINORBITS 8
++#define DASD_PER_MAJOR ( 1U<<(DASD_MINORBITS-DASD_PARTN_BITS))
+ #define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
+ /*
+--- linux-2.6.0-test1/drivers/s390/block/dasd_ioctl.c  2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/s390/block/dasd_ioctl.c 2003-07-19 17:03:50.000000000 -0700
+@@ -14,7 +14,6 @@
+ #include <linux/major.h>
+ #include <linux/fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
+ #include <asm/ccwdev.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/s390/block/xpram.c       2003-07-02 14:53:14.000000000 -0700
++++ 25/drivers/s390/block/xpram.c      2003-07-19 17:03:50.000000000 -0700
+@@ -31,7 +31,6 @@
+ #include <linux/errno.h>
+ #include <linux/init.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
+ #include <linux/blkpg.h>
+ #include <linux/hdreg.h>  /* HDIO_GETGEO */
+ #include <linux/sysdev.h>
+--- linux-2.6.0-test1/drivers/s390/char/sclp.c 2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/s390/char/sclp.c        2003-07-19 17:04:07.000000000 -0700
+@@ -468,17 +468,17 @@ static struct sclp_register sclp_state_c
+  * SCLP quiesce event handler
+  */
+ #ifdef CONFIG_SMP
+-static volatile unsigned long cpu_quiesce_map;
++static cpumask_t cpu_quiesce_map;
+ static void
+ do_load_quiesce_psw(void * __unused)
+ {
+       psw_t quiesce_psw;
+-      clear_bit(smp_processor_id(), &cpu_quiesce_map);
++      cpu_clear(smp_processor_id(), cpu_quiesce_map);
+       if (smp_processor_id() == 0) {
+               /* Wait for all other cpus to enter do_load_quiesce_psw */
+-              while (cpu_quiesce_map != 0);
++              while (!cpus_empty(cpu_quiesce_map));
+               /* Quiesce the last cpu with the special psw */
+               quiesce_psw.mask = PSW_BASE_BITS | PSW_MASK_WAIT;
+               quiesce_psw.addr = 0xfff;
+--- linux-2.6.0-test1/drivers/s390/char/tape_block.c   2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/s390/char/tape_block.c  2003-07-19 17:03:50.000000000 -0700
+@@ -13,7 +13,6 @@
+ #include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/blkdev.h>
+-#include <linux/blk.h>
+ #include <linux/interrupt.h>
+ #include <linux/buffer_head.h>
+--- linux-2.6.0-test1/drivers/s390/cio/chsc.c  2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/chsc.c 2003-07-19 17:03:50.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  *  drivers/s390/cio/chsc.c
+  *   S/390 common I/O routines -- channel subsystem call
+- *   $Revision: 1.1.2.2 $
++ *   $Revision: 1.1.2.2 $
+  *
+  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
+  *                          IBM Corporation
+@@ -206,6 +206,7 @@ chsc_get_sch_descriptions(void)
+       if (!page)
+               return -ENOMEM;
++      err = 0;
+       for (irq = 0; irq <= highest_subchannel; irq++) {
+               /*
+                * retrieve information for each sch
+@@ -222,13 +223,14 @@ chsc_get_sch_descriptions(void)
+                                      "not work\n", err);
+                               cio_chsc_err_msg = 1;
+                       }
+-                      return err;
++                      goto out;
+               }
+               clear_page(page);
+       }
+       cio_chsc_desc_avail = 1;
++out:
+       free_page((unsigned long)page);
+-      return 0;
++      return err;
+ }
+ __initcall(chsc_get_sch_descriptions);
+@@ -428,7 +430,7 @@ s390_process_res_acc (u8 chpid, __u16 fl
+                       ret = css_probe_device(irq);
+                       if (ret == -ENXIO)
+                               /* We're through */
+-                              return;
++                              break;
+                       continue;
+               }
+       
+--- linux-2.6.0-test1/drivers/s390/cio/cio.c   2003-06-14 12:18:48.000000000 -0700
++++ 25/drivers/s390/cio/cio.c  2003-07-19 17:03:50.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  *  drivers/s390/cio/cio.c
+  *   S/390 common I/O routines -- low level i/o calls
+- *   $Revision: 1.1.2.2 $
++ *   $Revision: 1.1.2.2 $
+  *
+  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
+  *                          IBM Corporation
+@@ -16,10 +16,12 @@
+ #include <linux/init.h>
+ #include <linux/slab.h>
+ #include <linux/device.h>
++#include <linux/kernel_stat.h>
+ #include <asm/hardirq.h>
+ #include <asm/cio.h>
+ #include <asm/delay.h>
++#include <asm/irq.h>
+ #include "airq.h"
+ #include "cio.h"
+@@ -442,6 +444,11 @@ cio_enable_subchannel (struct subchannel
+                       if (sch->schib.pmcw.ena)
+                               break;
+               }
++              if (ret == -EBUSY) {
++                      struct irb irb;
++                      if (tsch(sch->irq, &irb) != 0)
++                              break;
++              }
+       }
+       sprintf (dbf_txt, "ret:%d", ret);
+       CIO_TRACE_EVENT (2, dbf_txt);
+@@ -608,6 +615,7 @@ do_IRQ (struct pt_regs regs)
+       tpi_info = (struct tpi_info *) __LC_SUBCHANNEL_ID;
+       irb = (struct irb *) __LC_IRB;
+       do {
++              kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++;
+               /*
+                * Non I/O-subchannel thin interrupts are processed differently
+                */
+--- linux-2.6.0-test1/drivers/s390/cio/device.c        2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/device.c       2003-07-19 17:03:50.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  *  drivers/s390/cio/device.c
+  *  bus driver for ccw devices
+- *   $Revision: 1.1.2.2 $
++ *   $Revision: 1.1.2.2 $
+  *
+  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
+  *                     IBM Corporation
+@@ -434,6 +434,13 @@ ccw_device_register(struct ccw_device *c
+       return ret;
+ }
++void
++ccw_device_unregister(void *data)
++{
++      device_unregister((struct device *)data);
++}
++      
++
+ static void
+ ccw_device_release(struct device *dev)
+ {
+@@ -513,17 +520,11 @@ io_subchannel_recog_done(struct ccw_devi
+               wake_up(&ccw_device_init_wq);
+ }
+-static void
++static int
+ io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch)
+ {
+       int rc;
+-      if (!get_device(&sch->dev)) {
+-              if (cdev->dev.release)
+-                      cdev->dev.release(&cdev->dev);
+-              return;
+-      }
+-
+       sch->dev.driver_data = cdev;
+       sch->driver = &io_subchannel_driver;
+       cdev->ccwlock = &sch->lock;
+@@ -540,9 +541,6 @@ io_subchannel_recog(struct ccw_device *c
+       snprintf (cdev->dev.bus_id, DEVICE_ID_SIZE, "0:%04x",
+                 sch->schib.pmcw.dev);
+-      /* Do first half of device_register. */
+-      device_initialize(&cdev->dev);
+-
+       /* Increase counter of devices currently in recognition. */
+       atomic_inc(&ccw_device_init_count);
+@@ -551,13 +549,10 @@ io_subchannel_recog(struct ccw_device *c
+       rc = ccw_device_recognition(cdev);
+       spin_unlock_irq(cdev->ccwlock);
+       if (rc) {
+-              sch->dev.driver_data = 0;
+-              put_device(&sch->dev);
+-              if (cdev->dev.release)
+-                      cdev->dev.release(&cdev->dev);
+               if (atomic_dec_and_test(&ccw_device_init_count))
+                       wake_up(&ccw_device_init_wq);
+       }
++      return rc;
+ }
+ static int
+@@ -565,6 +560,7 @@ io_subchannel_probe (struct device *pdev
+ {
+       struct subchannel *sch;
+       struct ccw_device *cdev;
++      int rc;
+       sch = to_subchannel(pdev);
+       if (sch->dev.driver_data) {
+@@ -573,8 +569,20 @@ io_subchannel_probe (struct device *pdev
+                * Register it and exit. This happens for all early
+                * device, e.g. the console.
+                */
+-              ccw_device_register(sch->dev.driver_data);
++              cdev = sch->dev.driver_data;
++              device_initialize(&cdev->dev);
++              ccw_device_register(cdev);
+               subchannel_add_files(&sch->dev);
++              /*
++               * Check if the device is already online. If it is
++               * the reference count needs to be corrected
++               * (see ccw_device_online and css_init_done for the
++               * ugly details).
++               */
++              if (cdev->private->state != DEV_STATE_NOT_OPER &&
++                  cdev->private->state != DEV_STATE_OFFLINE &&
++                  cdev->private->state != DEV_STATE_BOXED)
++                      get_device(&cdev->dev);
+               return 0;
+       }
+       cdev  = kmalloc (sizeof(*cdev), GFP_KERNEL);
+@@ -592,7 +600,23 @@ io_subchannel_probe (struct device *pdev
+               .parent = pdev,
+               .release = ccw_device_release,
+       };
+-      io_subchannel_recog(cdev, to_subchannel(pdev));
++      /* Do first half of device_register. */
++      device_initialize(&cdev->dev);
++
++      if (!get_device(&sch->dev)) {
++              if (cdev->dev.release)
++                      cdev->dev.release(&cdev->dev);
++              return 0;
++      }
++
++      rc = io_subchannel_recog(cdev, to_subchannel(pdev));
++      if (rc) {
++              sch->dev.driver_data = 0;
++              put_device(&sch->dev);
++              if (cdev->dev.release)
++                      cdev->dev.release(&cdev->dev);
++      }
++
+       return 0;
+ }
+@@ -604,6 +628,8 @@ static int console_cdev_in_use;
+ static int
+ ccw_device_console_enable (struct ccw_device *cdev, struct subchannel *sch)
+ {
++      int rc;
++
+       /* Initialize the ccw_device structure. */
+       cdev->dev = (struct device) {
+               .parent = &sch->dev,
+@@ -613,7 +639,11 @@ ccw_device_console_enable (struct ccw_de
+               .parent = &css_bus_device,
+               .bus    = &css_bus_type,
+       };
+-      io_subchannel_recog(cdev, sch);
++
++      rc = io_subchannel_recog(cdev, sch);
++      if (rc)
++              return rc;
++
+       /* Now wait for the async. recognition to come to an end. */
+       while (!dev_fsm_final_state(cdev))
+               wait_cons_dev();
+--- linux-2.6.0-test1/drivers/s390/cio/device_fsm.c    2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/device_fsm.c   2003-07-19 17:03:50.000000000 -0700
+@@ -188,7 +188,7 @@ ccw_device_done(struct ccw_device *cdev,
+       wake_up(&cdev->private->wait_q);
+-      if (state != DEV_STATE_ONLINE)
++      if (css_init_done && state != DEV_STATE_ONLINE)
+               put_device (&cdev->dev);
+ }
+@@ -293,7 +293,7 @@ ccw_device_online(struct ccw_device *cde
+       if (cdev->private->state != DEV_STATE_OFFLINE)
+               return -EINVAL;
+       sch = to_subchannel(cdev->dev.parent);
+-      if (!get_device(&cdev->dev))
++      if (css_init_done && !get_device(&cdev->dev))
+               return -ENODEV;
+       if (cio_enable_subchannel(sch, sch->schib.pmcw.isc) != 0) {
+               /* Couldn't enable the subchannel for i/o. Sick device. */
+@@ -384,7 +384,9 @@ static void
+ ccw_device_offline_notoper(struct ccw_device *cdev, enum dev_event dev_event)
+ {
+       cdev->private->state = DEV_STATE_NOT_OPER;
+-      device_unregister(&cdev->dev);
++      INIT_WORK(&cdev->private->kick_work,
++                ccw_device_unregister, (void *) &cdev->dev);
++      queue_work(ccw_device_work, &cdev->private->kick_work);
+       wake_up(&cdev->private->wait_q);
+ }
+@@ -403,8 +405,10 @@ ccw_device_online_notoper(struct ccw_dev
+               // FIXME: not-oper indication to device driver ?
+               ccw_device_call_handler(cdev);
+       }
++      INIT_WORK(&cdev->private->kick_work,
++                ccw_device_unregister, (void *) &cdev->dev);
++      queue_work(ccw_device_work, &cdev->private->kick_work);
+       wake_up(&cdev->private->wait_q);
+-      device_unregister(&cdev->dev);
+ }
+ /*
+--- linux-2.6.0-test1/drivers/s390/cio/device.h        2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/device.h       2003-07-19 17:03:50.000000000 -0700
+@@ -65,6 +65,8 @@ extern struct workqueue_struct *ccw_devi
+ void io_subchannel_recog_done(struct ccw_device *cdev);
++void ccw_device_unregister(void *);
++
+ int ccw_device_recognition(struct ccw_device *);
+ int ccw_device_online(struct ccw_device *);
+ int ccw_device_offline(struct ccw_device *);
+--- linux-2.6.0-test1/drivers/s390/cio/qdio.c  2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/cio/qdio.c 2003-07-19 17:03:50.000000000 -0700
+@@ -55,7 +55,7 @@
+ #include "ioasm.h"
+ #include "chsc.h"
+-#define VERSION_QDIO_C "$Revision: 1.1.2.2 $"
++#define VERSION_QDIO_C "$Revision: 1.1.2.2 $"
+ /****************** MODULE PARAMETER VARIABLES ********************/
+ MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>");
+@@ -1643,6 +1643,7 @@ qdio_timeout_handler(struct ccw_device *
+       default:
+               BUG();
+       }
++      ccw_device_set_timeout(cdev, 0);
+       wake_up(&cdev->private->wait_q);
+ }
+@@ -1891,26 +1892,25 @@ tiqdio_check_chsc_availability(void)
+               result=-EIO;
+               goto exit;
+       }
+-      /* 4: request block
+-       * 2: general char
+-       * 512: chsc char */
+-      if ((scsc_area->general_char[1] & 0x00800000) != 0x00800000) {
++      /* Check for bit 41. */
++      if ((scsc_area->general_char[1] & 0x00400000) != 0x00400000) {
+               QDIO_PRINT_WARN("Adapter interruption facility not " \
+                               "installed.\n");
+               result=-ENOENT;
+               goto exit;
+       }
+-      if ((scsc_area->chsc_char[2] & 0x00180000) != 0x00180000) {
++      /* Check for bits 107 and 108. */
++      if ((scsc_area->chsc_char[3] & 0x00180000) != 0x00180000) {
+               QDIO_PRINT_WARN("Set Chan Subsys. Char. & Fast-CHSCs " \
+                               "not available.\n");
+               result=-ENOENT;
+               goto exit;
+       }
+-      /* Check for hydra thin interrupts. */
++      /* Check for hydra thin interrupts (bit 67). */
+       hydra_thinints = ((scsc_area->general_char[2] & 0x10000000)
+               == 0x10000000);
+-      sprintf(dbf_text,"hydra_ti%1x", hydra_thinints);
++      sprintf(dbf_text,"hydrati%1x", hydra_thinints);
+       QDIO_DBF_TEXT0(0,setup,dbf_text);
+ exit:
+       free_page ((unsigned long) scsc_area);
+@@ -2413,8 +2413,10 @@ qdio_establish_handle_irq(struct ccw_dev
+       QDIO_DBF_TEXT0(0,setup,dbf_text);
+       QDIO_DBF_TEXT0(0,trace,dbf_text);
+-      if (qdio_establish_irq_check_for_errors(cdev, cstat, dstat))
++      if (qdio_establish_irq_check_for_errors(cdev, cstat, dstat)) {
++              ccw_device_set_timeout(cdev, 0);
+               return;
++      }
+       irq_ptr = cdev->private->qdio_data;
+@@ -2439,7 +2441,7 @@ qdio_establish_handle_irq(struct ccw_dev
+       qdio_initialize_set_siga_flags_output(irq_ptr);
+       qdio_set_state(irq_ptr,QDIO_IRQ_STATE_ESTABLISHED);
+-
++      ccw_device_set_timeout(cdev, 0);
+ }
+ int
+@@ -2698,6 +2700,8 @@ qdio_establish(struct ccw_device *cdev)
+                            "returned %i, next try returned %i\n",
+                            irq_ptr->irq,result,result2);
+               result=result2;
++              if (result)
++                      ccw_device_set_timeout(cdev, 0);
+       }
+       spin_unlock_irqrestore(get_ccwdev_lock(cdev),saveflags);
+@@ -3000,7 +3004,6 @@ qdio_perf_procfile_read(char *buffer, ch
+                       int buffer_length, int *eof, void *data)
+ {
+         int c=0;
+-      int irq;
+         /* we are always called with buffer_length=4k, so we all
+            deliver on the first read */
+@@ -3020,7 +3023,7 @@ qdio_perf_procfile_read(char *buffer, ch
+                perf_stats.siga_ins);
+       _OUTP_IT("Number of SIGA out's issued                     : %u\n",
+                perf_stats.siga_outs);
+-      _OUTP_IT("Number of PCIs caught                          : %u\n",
++      _OUTP_IT("Number of PCIs caught                           : %u\n",
+                perf_stats.pcis);
+       _OUTP_IT("Number of adapter interrupts caught             : %u\n",
+                perf_stats.thinints);
+@@ -3037,27 +3040,6 @@ qdio_perf_procfile_read(char *buffer, ch
+                perf_stats.outbound_cnt);
+       _OUTP_IT("\n");
+-      /* 
+-       * FIXME: Rather use driver_for_each_dev, if we had it. 
+-       * I know this loop destroys our layering, but at least gets the 
+-       * performance stats out...
+-       */
+-      for (irq=0;irq <= highest_subchannel; irq++) {
+-              struct qdio_irq *irq_ptr;
+-              struct ccw_device *cdev;
+-
+-              if (!ioinfo[irq])
+-                      continue;
+-              cdev = ioinfo[irq]->dev.driver_data;
+-              if (!cdev)
+-                      continue;
+-              irq_ptr = cdev->private->qdio_data;
+-              if (!irq_ptr)
+-                      continue;
+-              _OUTP_IT("Polling time on irq %4x                        " \
+-                       ": %u\n",
+-                       irq_ptr->irq,irq_ptr->input_qs[0]->timing.threshold);
+-      }
+         return c;
+ }
+--- linux-2.6.0-test1/drivers/s390/net/qeth.c  2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/net/qeth.c 2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ /*
+  *
+- * linux/drivers/s390/net/qeth.c ($Revision: 1.1.2.2 $)
++ * linux/drivers/s390/net/qeth.c ($Revision: 1.1.2.2 $)
+  *
+  * Linux on zSeries OSA Express and HiperSockets support
+  *
+@@ -165,7 +165,7 @@ MODULE_PARM_DESC(qeth_sparebufs, "the nu
+                "reserved for low memory situations");
+ /****************** MODULE STUFF **********************************/
+-#define VERSION_QETH_C "$Revision: 1.1.2.2 $"
++#define VERSION_QETH_C "$Revision: 1.1.2.2 $"
+ static const char *version = "qeth S/390 OSA-Express driver ("
+     VERSION_QETH_C "/" VERSION_QETH_H "/" VERSION_QETH_MPC_H
+     QETH_VERSION_IPV6 QETH_VERSION_VLAN ")";
+@@ -1156,7 +1156,7 @@ qeth_get_skb(unsigned int len)
+       return skb;
+ }
+-static struct sk_buff *
++static inline struct sk_buff *
+ qeth_get_next_skb(struct qeth_card *card,
+                 int *element_ptr, int *pos_in_el_ptr,
+                 void **hdr_ptr, struct qdio_buffer *buffer)
+@@ -1464,8 +1464,21 @@ __qeth_rebuild_skb(struct qeth_card *car
+       skb->ip_summed = card->options.checksum_type;
+       if (card->options.checksum_type == HW_CHECKSUMMING) {
+               /* do we have a checksummed packet? */
+-              if (*(__u8 *) (hdr_ptr + 11) & QETH_EXT_HEADER_CSUM_TRANSP_REQ) {
+-                      /* skb->ip_summed is set already */
++
++              /* 
++               * we only check for TCP/UDP checksums when the pseudo
++               * header was also checked successfully -- for the
++               * rest of the packets, it's not clear, whether the
++               * upper layer csum is alright. And they shouldn't
++               * occur too often anyway in real life 
++               */
++
++              if ((*(__u8*)(hdr_ptr+11) & (QETH_EXT_HEADER_CSUM_HDR_REQ |
++                                           QETH_EXT_HEADER_CSUM_TRANSP_REQ)) ==
++                  (QETH_EXT_HEADER_CSUM_HDR_REQ |
++                   QETH_EXT_HEADER_CSUM_TRANSP_REQ)) {
++#if 0
++                      /* csum does not need to be set inbound anyway */
+                       
+                       /* 
+                        * vlan is not an issue here, it's still in
+@@ -1485,11 +1498,15 @@ __qeth_rebuild_skb(struct qeth_card *car
+                                       (&skb->data[ip_len +
+                                                   QETH_TCP_CSUM_OFFSET]);
+                       }
++#endif /* 0 */
++                      skb->ip_summed=CHECKSUM_UNNECESSARY;
+               } else {
+                       /* make the stack check it */
+                       skb->ip_summed = SW_CHECKSUMMING;
+               }
+-      }
++      } else
++              skb->ip_summed=card->options.checksum_type;
++
+       __qeth_rebuild_skb_vlan(card, skb, hdr_ptr);
+ }
+@@ -1596,7 +1613,7 @@ __qeth_fill_header_add_vlan(struct qeth_
+ #endif
+ }
+-static __u8
++static inline __u8
+ __qeth_get_flags_v4(int multicast)
+ {
+       if (multicast == RTN_MULTICAST)
+@@ -1606,7 +1623,7 @@ __qeth_get_flags_v4(int multicast)
+       return QETH_CAST_UNICAST;
+ }
+-static __u8
++static inline __u8
+ __qeth_get_flags_v6(int multicast)
+ {
+       if (multicast == RTN_MULTICAST)
+@@ -1625,7 +1642,7 @@ __qeth_get_flags_v6(int multicast)
+               QETH_HEADER_IPV6;
+ }
+-static void
++static inline void
+ qeth_fill_header(struct qeth_hdr *hdr, struct sk_buff *skb,
+                int version, int multicast)
+ {
+@@ -1681,7 +1698,7 @@ qeth_fill_header(struct qeth_hdr *hdr, s
+                     __max(QETH_DBF_DATA_LEN, QETH_DBF_DATA_LEN));
+ }
+-static int inline
++static inline int
+ qeth_fill_buffer(struct qdio_buffer *buffer, char *dataptr,
+                int length, int element)
+ {
+@@ -1735,7 +1752,7 @@ qeth_fill_buffer(struct qdio_buffer *buf
+       return element;
+ }
+-static void
++static inline void
+ qeth_flush_packed_packets(struct qeth_card *card, int queue, int under_int)
+ {
+       struct qdio_buffer *buffer;
+@@ -1900,7 +1917,7 @@ qeth_determine_send_error(int cc, int qd
+       return ERROR_LINK_FAILURE;      /* should never happen */
+ }
+-static void
++static inline void
+ qeth_free_buffer(struct qeth_card *card, int queue, int bufno,
+                int qdio_error, int siga_error)
+ {
+@@ -2013,7 +2030,7 @@ qeth_free_buffer(struct qeth_card *card,
+       card->send_retries[queue][bufno] = 0;
+ }
+-static void
++static inline void
+ qeth_free_all_skbs(struct qeth_card *card)
+ {
+       int q, b;
+@@ -2049,7 +2066,7 @@ qeth_flush_buffer(struct qeth_card *card
+ }
+ #ifdef QETH_VLAN
+-void
++static inline void
+ qeth_insert_ipv6_vlan_tag(struct sk_buff *__skb)
+ {
+@@ -2088,7 +2105,7 @@ __qeth_add_vlan_tag(struct qeth_card *ca
+ #endif
+ }
+-static void
++static inline void
+ qeth_send_packet_fast(struct qeth_card *card, struct sk_buff *skb,
+                     struct net_device *dev,
+                     int queue, int version, int multicast)
+@@ -2183,7 +2200,7 @@ qeth_send_packet_fast(struct qeth_card *
+ /* no checks, if all elements are used, as then we would not be here (at most
+    127 buffers are enqueued) */
+-static void
++static inline void
+ qeth_send_packet_packed(struct qeth_card *card, struct sk_buff *skb,
+                       struct net_device *dev,
+                       int queue, int version, int multicast)
+@@ -2391,7 +2408,7 @@ __qeth_switch_state_if_needed(struct qet
+       }
+ }
+-static int
++static inline int
+ qeth_do_send_packet(struct qeth_card *card, struct sk_buff *skb,
+                   struct net_device *dev)
+ {
+@@ -2829,23 +2846,27 @@ qeth_send_ipa_cmd(struct qeth_card *card
+       if (!buffer) {
+               if (atomic_read(&card->escape_softsetup))
+-                      result = 0;
++                      return 0;
+               else
+-                      result = -1;
+-      } else {
+-              reply = (struct ipa_cmd *) PDU_ENCAPSULATION(buffer);
+-              if ((update_cmd) && (reply))
+-                      memcpy(cmd, reply, sizeof (struct ipa_cmd));
+-              result = reply->return_code;
+-
+-              /* some special sausages: */
+-              if ((ipa_cmd == IPA_CMD_SETASSPARMS) && (result == 0)) {
+-                      result = reply->data.setassparms.return_code;
+-              }
+-              if ((ipa_cmd == IPA_CMD_SETADAPTERPARMS) && (result == 0)) {
+-                      result = reply->data.setadapterparms.return_code;
+-              }
++                      return -1;
++      }
++      reply = (struct ipa_cmd *) PDU_ENCAPSULATION(buffer);
++      if ((update_cmd) && (reply))
++              memcpy(cmd, reply, sizeof (struct ipa_cmd));
++      result = reply->return_code;
++
++      /* some special sausages: */
++      if ((ipa_cmd == IPA_CMD_SETASSPARMS) && (result == 0)) {
++              result = reply->data.setassparms.return_code;
++              if ((reply->data.setassparms.assist_no==IPA_INBOUND_CHECKSUM) &&
++                  (reply->data.setassparms.command_code == IPA_CMD_ASS_START))
++                      card->csum_enable_mask =
++                              reply->data.setassparms.data.flags_32bit;
++      }
++      if ((ipa_cmd == IPA_CMD_SETADAPTERPARMS) && (result == 0)) {
++              result = reply->data.setadapterparms.return_code;
+       }
++
+       return result;
+ }
+@@ -5599,7 +5620,7 @@ go_on_filt:
+                       }
+                       result=qeth_send_setassparms_simple_with_data
+                               (card,IPA_INBOUND_CHECKSUM,
+-                               IPA_CMD_ASS_ENABLE, IPA_CHECKSUM_ENABLE_MASK);
++                               IPA_CMD_ASS_ENABLE, card->csum_enable_mask);
+                       if (result) {
+                               PRINT_WARN("Could not enable inbound " \
+                                          "checksumming on %s: 0x%x, " \
+@@ -6881,6 +6902,14 @@ qeth_peer_func_level(int level)
+       return level;           /* hmmm... don't know what to do with that level. */
+ }
++/* returns last four digits of bus_id */
++static inline __u16
++__raw_devno_from_bus_id(char *id)
++{
++      id += (strlen(id) - 4); 
++      return (__u16) simple_strtoul(id, &id, 16);
++}
++
+ static int
+ qeth_idx_activate_read(struct qeth_card *card)
+ {
+@@ -6905,7 +6934,7 @@ qeth_idx_activate_read(struct qeth_card 
+       memcpy(QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->sendbuf),
+              &card->func_level, 2);
+-      temp = _ccw_device_get_device_number(card->ddev);
++      temp = __raw_devno_from_bus_id(card->ddev->dev.bus_id);
+       memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(card->dma_stuff->sendbuf), &temp, 2);
+       temp = (card->cula << 8) + card->unit_addr2;
+       memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(card->dma_stuff->sendbuf),
+@@ -7501,10 +7530,8 @@ qeth_verify_dev(struct net_device *dev)
+       for (; tmp && (!result); tmp = tmp->next) {
+               if (atomic_read(&tmp->shutdown_phase))
+                       continue;
+-              if (dev == tmp->dev) {
+-                      result = QETH_VERIFY_IS_REAL_DEV;
+-              }
+-              result = __qeth_verify_dev_vlan(dev, tmp);
++              result = (dev == tmp->dev)?
++                      QETH_VERIFY_IS_REAL_DEV:__qeth_verify_dev_vlan(dev, tmp);
+       }
+       read_unlock(&list_lock);
+       return result;
+@@ -8547,6 +8574,8 @@ qeth_alloc_card(void)
+       card->ip_mc_new_state.ipm6_ifa = NULL;
+ #endif /* QETH_IPV6 */
++      card->csum_enable_mask = IPA_CHECKSUM_DEFAULT_ENABLE_MASK;
++
+       /* setup net_device stuff */
+       card->dev->priv = card;
+@@ -9087,21 +9116,19 @@ qeth_procfile_open(struct inode *inode, 
+               /* FIXME: this is really a mess... */
+ #ifdef QETH_IPV6
+-              if (atomic_read(&card->rt4fld) && atomic_read(&card->rt6fld))
+-                      strcpy(router_str, "no");
+-              else if (atomic_read(&card->rt4fld)
+-                       || atomic_read(&card->rt6fld))
+-                      strcpy(router_str, "mix");
++              if (atomic_read(&card->rt4fld) || atomic_read(&card->rt6fld))
++                      strcpy(router_str, "FLD");
+ #else/* QETH_IPV6 */
+               if (atomic_read(&card->rt4fld))
+-                      strcpy(router_str, "no");
++                      strcpy(router_str, "FLD");
+ #endif /* QETH_IPV6 */
+               else if (((card->options.routing_type4 & ROUTER_MASK) ==
+                         PRIMARY_ROUTER)
+ #ifdef QETH_IPV6
+                        &&
+-                       ((card->options.routing_type6 & ROUTER_MASK) ==
+-                        PRIMARY_ROUTER)
++                       (((card->options.routing_type6 & ROUTER_MASK) ==
++                        PRIMARY_ROUTER) ||
++                        (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+                   ) {
+                       strcpy(router_str, "pri");
+@@ -9110,8 +9137,9 @@ qeth_procfile_open(struct inode *inode, 
+                        SECONDARY_ROUTER)
+ #ifdef QETH_IPV6
+                       &&
+-                      ((card->options.routing_type6 & ROUTER_MASK) ==
+-                       SECONDARY_ROUTER)
++                      (((card->options.routing_type6 & ROUTER_MASK) ==
++                       SECONDARY_ROUTER) ||
++                       (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+                   ) {
+                       strcpy(router_str, "sec");
+@@ -9120,8 +9148,9 @@ qeth_procfile_open(struct inode *inode, 
+                        MULTICAST_ROUTER)
+ #ifdef QETH_IPV6
+                       &&
+-                      ((card->options.routing_type6 & ROUTER_MASK) ==
+-                       MULTICAST_ROUTER)
++                      (((card->options.routing_type6 & ROUTER_MASK) ==
++                       MULTICAST_ROUTER) ||
++                       (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+                   ) {
+                       strcpy(router_str, "mc");
+@@ -9130,8 +9159,9 @@ qeth_procfile_open(struct inode *inode, 
+                        PRIMARY_CONNECTOR)
+ #ifdef QETH_IPV6
+                       &&
+-                      ((card->options.routing_type6 & ROUTER_MASK) ==
+-                       PRIMARY_CONNECTOR)
++                      (((card->options.routing_type6 & ROUTER_MASK) ==
++                       PRIMARY_CONNECTOR) ||
++                       (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+                   ) {
+                       strcpy(router_str, "p.c");
+@@ -9140,8 +9170,9 @@ qeth_procfile_open(struct inode *inode, 
+                        SECONDARY_CONNECTOR)
+ #ifdef QETH_IPV6
+                       &&
+-                      ((card->options.routing_type6 & ROUTER_MASK) ==
+-                       SECONDARY_CONNECTOR)
++                      (((card->options.routing_type6 & ROUTER_MASK) ==
++                       SECONDARY_CONNECTOR) ||
++                       (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+                   ) {
+                       strcpy(router_str, "s.c");
+@@ -9150,8 +9181,9 @@ qeth_procfile_open(struct inode *inode, 
+                        NO_ROUTER)
+ #ifdef QETH_IPV6
+                       &&
+-                      ((card->options.routing_type6 & ROUTER_MASK) ==
+-                       NO_ROUTER)
++                      (((card->options.routing_type6 & ROUTER_MASK) ==
++                       NO_ROUTER) ||
++                       (!qeth_is_supported(IPA_IPv6)))
+ #endif /* QETH_IPV6 */
+                   ) {
+                       strcpy(router_str, "no");
+@@ -10115,7 +10147,7 @@ qeth_route4_show(struct device *dev, cha
+               return -EINVAL;
+       if (atomic_read(&card->rt4fld))
+-              return sprintf(buf, "%s\n", "no");
++              return sprintf(buf, "%s\n", "FLD");
+       switch (card->options.routing_type4 & ROUTER_MASK) {
+       case PRIMARY_ROUTER:
+@@ -10202,7 +10234,10 @@ qeth_route6_show(struct device *dev, cha
+               return -EINVAL;
+       if (atomic_read(&card->rt6fld))
+-              return sprintf(buf, "%s\n", "no");
++              return sprintf(buf, "%s\n", "FLD");
++
++      if (!qeth_is_supported(IPA_IPv6))
++              return sprintf(buf, "%s\n", "n/a");
+       switch (card->options.routing_type6 & ROUTER_MASK) {
+       case PRIMARY_ROUTER:
+@@ -11061,6 +11096,10 @@ qeth_set_offline(struct ccwgroup_device 
+       QETH_DBF_TEXT4(0, trace, "freecard");
++      memset(card->dev, 0, sizeof (struct net_device));
++      card->dev->priv = card;
++      strncpy(card->dev->name, card->dev_name, IFNAMSIZ);
++
+       ccw_device_set_offline(card->ddev);
+       ccw_device_set_offline(card->wdev);
+       ccw_device_set_offline(card->rdev);
+--- linux-2.6.0-test1/drivers/s390/net/qeth.h  2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/net/qeth.h 2003-07-19 17:03:50.000000000 -0700
+@@ -14,7 +14,7 @@
+ #define QETH_NAME " qeth"
+-#define VERSION_QETH_H "$Revision: 1.1.2.2 $"
++#define VERSION_QETH_H "$Revision: 1.1.2.2 $"
+ /******************** CONFIG STUFF ***********************/
+ //#define QETH_DBF_LIKE_HELL
+@@ -938,6 +938,8 @@ struct qeth_card { /* pointed to by dev-
+       __u32 ipa6_enabled;
+       __u32 adp_supported;
++      __u32 csum_enable_mask;
++
+       atomic_t startlan_attempts;
+       atomic_t enable_routing_attempts4;
+       atomic_t rt4fld;
+@@ -1021,7 +1023,7 @@ qeth_get_arphrd_type(int cardtype, int l
+               case QETH_MPC_LINK_TYPE_LANE_TR:
+                       /* fallthrough */
+               case QETH_MPC_LINK_TYPE_HSTR:
+-                      return ARPHRD_IEEE802;
++                      return ARPHRD_IEEE802_TR;
+               default:
+                       return ARPHRD_ETHER;
+               }
+--- linux-2.6.0-test1/drivers/s390/net/qeth_mpc.h      2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/s390/net/qeth_mpc.h     2003-07-19 17:03:50.000000000 -0700
+@@ -10,7 +10,7 @@
+ #ifndef __QETH_MPC_H__
+ #define __QETH_MPC_H__
+-#define VERSION_QETH_MPC_H "$Revision: 1.1.2.2 $"
++#define VERSION_QETH_MPC_H "$Revision: 1.1.2.2 $"
+ #define QETH_IPA_TIMEOUT (card->ipa_timeout)
+ #define QETH_MPC_TIMEOUT 2000
+@@ -188,7 +188,7 @@ extern unsigned char DM_ACT[];
+ #define IPA_CMD_ASS_ARP_QUERY_INFO 0x0104
+ #define IPA_CMD_ASS_ARP_QUERY_STATS 0x0204
+-#define IPA_CHECKSUM_ENABLE_MASK 0x001a
++#define IPA_CHECKSUM_DEFAULT_ENABLE_MASK 0x001a
+ #define IPA_CMD_ASS_FILTER_SET_TYPES 0x0003
+--- linux-2.6.0-test1/drivers/sbus/char/envctrl.c      2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/sbus/char/envctrl.c     2003-07-19 17:03:50.000000000 -0700
+@@ -14,6 +14,9 @@
+  *
+  * EB - Added support for CP1500 Global Address and PS/Voltage monitoring.
+  *            Eric Brower <ebrower@usa.net>
++ *
++ * DB - Audit every copy_to_user in envctrl_read.
++ *              Daniele Bellucci <bellucda@tiscali.it>
+  */
+ #include <linux/config.h>
+@@ -571,7 +574,8 @@ envctrl_read(struct file *file, char *bu
+               data[0] = (unsigned char)(warning_temperature);
+               ret = 1;
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       case ENVCTRL_RD_SHUTDOWN_TEMPERATURE:
+@@ -580,14 +584,16 @@ envctrl_read(struct file *file, char *bu
+               data[0] = (unsigned char)(shutdown_temperature);
+               ret = 1;
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       case ENVCTRL_RD_MTHRBD_TEMPERATURE:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_MTHRBDTEMP_MON)))
+                       return 0;
+               ret = envctrl_read_noncpu_info(pchild, ENVCTRL_MTHRBDTEMP_MON, data);
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       case ENVCTRL_RD_CPU_TEMPERATURE:
+@@ -596,7 +602,8 @@ envctrl_read(struct file *file, char *bu
+               ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUTEMP_MON, data);
+               /* Reset cpu to the default cpu0. */
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       case ENVCTRL_RD_CPU_VOLTAGE:
+@@ -605,21 +612,24 @@ envctrl_read(struct file *file, char *bu
+               ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUVOLTAGE_MON, data);
+               /* Reset cpu to the default cpu0. */
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       case ENVCTRL_RD_SCSI_TEMPERATURE:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_SCSITEMP_MON)))
+                       return 0;
+               ret = envctrl_read_noncpu_info(pchild, ENVCTRL_SCSITEMP_MON, data);
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       case ENVCTRL_RD_ETHERNET_TEMPERATURE:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_ETHERTEMP_MON)))
+                       return 0;
+               ret = envctrl_read_noncpu_info(pchild, ENVCTRL_ETHERTEMP_MON, data);
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       case ENVCTRL_RD_FAN_STATUS:
+@@ -627,7 +637,8 @@ envctrl_read(struct file *file, char *bu
+                       return 0;
+               data[0] = envctrl_i2c_read_8574(pchild->addr);
+               ret = envctrl_i2c_fan_status(pchild,data[0], data);
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       
+       case ENVCTRL_RD_GLOBALADDRESS:
+@@ -635,7 +646,8 @@ envctrl_read(struct file *file, char *bu
+                       return 0;
+               data[0] = envctrl_i2c_read_8574(pchild->addr);
+               ret = envctrl_i2c_globaladdr(pchild, data[0], data);
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       case ENVCTRL_RD_VOLTAGE_STATUS:
+@@ -645,7 +657,8 @@ envctrl_read(struct file *file, char *bu
+                               return 0;
+               data[0] = envctrl_i2c_read_8574(pchild->addr);
+               ret = envctrl_i2c_voltage_status(pchild, data[0], data);
+-              copy_to_user((unsigned char *)buf, data, ret);
++              if (copy_to_user((unsigned char *)buf, data, ret))
++                      ret = -EFAULT;
+               break;
+       default:
+--- linux-2.6.0-test1/drivers/sbus/char/jsflash.c      2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/sbus/char/jsflash.c     2003-07-19 17:03:50.000000000 -0700
+@@ -38,12 +38,8 @@
+ #include <linux/smp_lock.h>
+ #include <linux/genhd.h>
+-/*
+- * <linux/blk.h> is controlled from the outside with these definitions.
+- */
+ #define MAJOR_NR      JSFD_MAJOR
+-#include <linux/blk.h>
+ #include <asm/uaccess.h>
+ #include <asm/pgtable.h>
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/3w-xxxx.c   2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/scsi/3w-xxxx.c  2003-07-19 17:03:50.000000000 -0700
+@@ -187,7 +187,7 @@ MODULE_LICENSE("GPL");
+ #include <linux/proc_fs.h>
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/hdreg.h>
+ #include <linux/string.h>
+ #include <linux/delay.h>
+--- linux-2.6.0-test1/drivers/scsi/53c700.c    2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/53c700.c   2003-07-19 17:03:50.000000000 -0700
+@@ -131,7 +131,7 @@
+ #include <asm/io.h>
+ #include <asm/pgtable.h>
+ #include <asm/byteorder.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/module.h>
+ #include <linux/interrupt.h>
+@@ -172,7 +172,7 @@ STATIC void NCR_700_chip_reset(struct Sc
+ STATIC int NCR_700_slave_configure(Scsi_Device *SDpnt);
+ STATIC void NCR_700_slave_destroy(Scsi_Device *SDpnt);
+-static struct device_attribute **NCR_700_dev_attrs = NULL;
++STATIC struct device_attribute *NCR_700_dev_attrs[];
+ static char *NCR_700_phase[] = {
+       "",
+@@ -2027,25 +2027,12 @@ static struct device_attribute NCR_700_a
+       .show = NCR_700_show_active_tags,
+ };
+-STATIC int __init
+-NCR_700_init(void)
+-{
+-      scsi_sysfs_modify_sdev_attribute(&NCR_700_dev_attrs,
+-                                       &NCR_700_queue_depth_attr);
+-      scsi_sysfs_modify_sdev_attribute(&NCR_700_dev_attrs,
+-                                       &NCR_700_active_tags_attr);
+-      return 0;
+-}
+-
+-/* NULL exit routine to keep modutils happy */
+-STATIC void __exit
+-NCR_700_exit(void)
+-{
+-}
++STATIC struct device_attribute *NCR_700_dev_attrs[] = {
++      &NCR_700_queue_depth_attr,
++      &NCR_700_active_tags_attr,
++      NULL,
++};
+ EXPORT_SYMBOL(NCR_700_detect);
+ EXPORT_SYMBOL(NCR_700_release);
+ EXPORT_SYMBOL(NCR_700_intr);
+-
+-module_init(NCR_700_init);
+-module_exit(NCR_700_exit);
+--- linux-2.6.0-test1/drivers/scsi/53c7xx.c    2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/scsi/53c7xx.c   2003-07-19 17:03:50.000000000 -0700
+@@ -249,7 +249,7 @@
+ #include <linux/mm.h>
+ #include <linux/ioport.h>
+ #include <linux/time.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <linux/interrupt.h>
+ #include <asm/pgtable.h>
+--- linux-2.6.0-test1/drivers/scsi/a2091.c     2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/scsi/a2091.c    2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/a3000.c     2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/a3000.c    2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/aacraid/aachba.c    2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/aacraid/aachba.c   2003-07-19 17:03:50.000000000 -0700
+@@ -33,7 +33,7 @@
+ #include <linux/completion.h>
+ #include <asm/semaphore.h>
+ #include <asm/uaccess.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/aacraid/commctrl.c  2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/aacraid/commctrl.c 2003-07-19 17:03:50.000000000 -0700
+@@ -37,7 +37,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+ #include <linux/completion.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/semaphore.h>
+ #include <asm/uaccess.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/aacraid/comminit.c  2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/aacraid/comminit.c 2003-07-19 17:03:50.000000000 -0700
+@@ -37,7 +37,7 @@
+ #include <linux/pci.h>
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/completion.h>
+ #include <linux/mm.h>
+ #include <asm/semaphore.h>
+--- linux-2.6.0-test1/drivers/scsi/aacraid/commsup.c   2003-06-14 12:18:28.000000000 -0700
++++ 25/drivers/scsi/aacraid/commsup.c  2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #include <linux/slab.h>
+ #include <linux/completion.h>
+ #include <asm/semaphore.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/aacraid/dpcsup.c    2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/scsi/aacraid/dpcsup.c   2003-07-19 17:03:50.000000000 -0700
+@@ -38,7 +38,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+ #include <linux/completion.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/semaphore.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/aacraid/linit.c     2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/aacraid/linit.c    2003-07-19 17:05:05.000000000 -0700
+@@ -50,7 +50,7 @@
+ #include <linux/completion.h>
+ #include <linux/interrupt.h>
+ #include <asm/semaphore.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsicam.h>
+@@ -295,7 +295,6 @@ static int aac_detect(Scsi_Host_Template
+                       printk(KERN_WARNING "aacraid: unable to register \"aac\" device.\n");
+       }
+-      template->present = aac_count; /* # of cards of this type found */
+       return aac_count;
+ }
+--- linux-2.6.0-test1/drivers/scsi/aacraid/rx.c        2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/scsi/aacraid/rx.c       2003-07-19 17:03:50.000000000 -0700
+@@ -36,7 +36,7 @@
+ #include <linux/pci.h>
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/completion.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/aacraid/sa.c        2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/scsi/aacraid/sa.c       2003-07-19 17:03:50.000000000 -0700
+@@ -36,7 +36,7 @@
+ #include <linux/pci.h>
+ #include <linux/spinlock.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/completion.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/advansys.c  2003-06-14 12:18:06.000000000 -0700
++++ 25/drivers/scsi/advansys.c 2003-07-19 17:03:50.000000000 -0700
+@@ -798,7 +798,7 @@
+ #include <linux/mm.h>
+ #include <linux/proc_fs.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/stat.h>
+ #include <linux/spinlock.h>
+--- linux-2.6.0-test1/drivers/scsi/aha152x.c   2003-06-26 22:07:24.000000000 -0700
++++ 25/drivers/scsi/aha152x.c  2003-07-19 17:03:50.000000000 -0700
+@@ -225,7 +225,7 @@
+ #include <asm/irq.h>
+ #include <asm/io.h>
+ #include <linux/version.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <asm/system.h>
+@@ -241,9 +241,7 @@
+ #include <linux/isapnp.h>
+ #include <linux/spinlock.h>
+ #include <linux/workqueue.h>
+-#include <linux/blk.h>
+ #include <asm/semaphore.h>
+-#include <asm/io.h>
+ #include <scsi/scsicam.h>
+ #include "scsi.h"
+@@ -941,7 +939,8 @@ static irqreturn_t swintr(int irqno, voi
+       struct Scsi_Host *shpnt = lookup_irq(irqno);
+       if (!shpnt) {
+-              printk(KERN_ERR "aha152x%d: catched software interrupt %d for unknown controller.\n", HOSTNO, irqno);
++              /* no point using HOSTNO here! */
++              printk(KERN_ERR "aha152x: catched software interrupt %d for unknown controller.\n", irqno);
+               return IRQ_NONE;
+       }
+@@ -1049,6 +1048,10 @@ struct Scsi_Host *aha152x_probe_one(stru
+       printk(KERN_INFO "aha152x%d: trying software interrupt, ",
+                        shost->host_no);
++
++      /* need to have host registered before triggering any interrupt */
++      aha152x_host[registered_count] = shost;
++      mb();
+       SETPORT(DMACNTRL0, SWINT|INTEN);
+       mdelay(1000);
+       free_irq(shost->irq, shost);
+@@ -1064,7 +1067,7 @@ struct Scsi_Host *aha152x_probe_one(stru
+               printk(KERN_ERR "aha152x%d: IRQ %d possibly wrong.  "
+                               "Please verify.\n", shost->host_no, shost->irq);
+-              goto out_release_region;
++              goto out_unregister_host;
+       }
+       printk("ok.\n");
+@@ -1077,12 +1080,12 @@ struct Scsi_Host *aha152x_probe_one(stru
+                               "aha152x", shost) < 0) {
+               printk(KERN_ERR "aha152x%d: failed to reassign interrupt.\n",
+                               shost->host_no);
+-              goto out_release_region;
++              goto out_unregister_host;
+       }
+-
+-      aha152x_host[registered_count] = shost;
+       return shost;   /* the pcmcia stub needs the return value; */
++out_unregister_host:
++      aha152x_host[registered_count] = NULL;
+ out_release_region:
+       release_region(shost->io_port, IO_RANGE);
+ out_unregister:
+--- linux-2.6.0-test1/drivers/scsi/aha1542.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/aha1542.c  2003-07-19 17:03:50.000000000 -0700
+@@ -38,7 +38,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/pci.h>
+ #include <linux/isapnp.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/mca.h>
+ #include <linux/mca-legacy.h>
+--- linux-2.6.0-test1/drivers/scsi/aha1542.h   2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/scsi/aha1542.h  2003-07-19 17:03:50.000000000 -0700
+@@ -130,7 +130,6 @@ struct ccb {                       /* Command Control Block 
+ };
+ static int aha1542_detect(Scsi_Host_Template *);
+-static int aha1542_command(Scsi_Cmnd *);
+ static int aha1542_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
+ static int aha1542_abort(Scsi_Cmnd * SCpnt);
+ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt);
+--- linux-2.6.0-test1/drivers/scsi/aha1740.c   2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/aha1740.c  2003-07-19 17:03:50.000000000 -0700
+@@ -34,7 +34,7 @@
+  * are deemed to be part of the source code.
+  */
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+@@ -375,7 +375,7 @@ static int aha1740_queuecommand(Scsi_Cmn
+ #endif
+       /* locate an available ecb */
+-      spin_lock_irqsave(&SCpnt->device->host->host_lock, flags);
++      spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+       ecbno = host->last_ecb_used + 1; /* An optimization */
+       if (ecbno >= AHA1740_ECBS)
+               ecbno = 0;
+@@ -394,7 +394,7 @@ static int aha1740_queuecommand(Scsi_Cmn
+                                                   doubles as reserved flag */
+       host->last_ecb_used = ecbno;    
+-      spin_unlock_irqrestore(&SCpnt->device->host->host_lock, flags);
++      spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+ #ifdef DEBUG
+       printk("Sending command (%d %x)...", ecbno, done);
+@@ -491,7 +491,7 @@ static int aha1740_queuecommand(Scsi_Cmn
+               unsigned int base = SCpnt->device->host->io_port;
+               DEB(printk("aha1740[%d] critical section\n",ecbno));
+-              spin_lock_irqsave(&SCpnt->device->host->host_lock, flags);
++              spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+               for (loopcnt = 0; ; loopcnt++) {
+                       if (inb(G2STAT(base)) & G2STAT_MBXOUT) break;
+                       if (loopcnt == LOOPCNT_WARN) {
+@@ -511,7 +511,7 @@ static int aha1740_queuecommand(Scsi_Cmn
+                               panic("aha1740.c: attn wait failed!\n");
+               }
+               outb(ATTN_START | (target & 7), ATTN(base)); /* Start it up */
+-              spin_unlock_irqrestore(&SCpnt->device->host->host_lock, flags);
++              spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+               DEB(printk("aha1740[%d] request queued.\n",ecbno));
+       } else
+               printk(KERN_ALERT "aha1740_queuecommand: done can't be NULL\n");
+@@ -594,7 +594,7 @@ static int aha1740_probe (struct device 
+       if (!request_region(slotbase, SLOTSIZE, "aha1740")) /* See if in use */
+               return -EBUSY;
+       if (!aha1740_test_port(slotbase))
+-              goto err_release;
++              goto err_release_region;
+       aha1740_getconfig(slotbase,&irq_level,&translation);
+       if ((inb(G2STAT(slotbase)) &
+            (G2STAT_MBXOUT|G2STAT_BUSY)) != G2STAT_MBXOUT) {
+@@ -609,7 +609,7 @@ static int aha1740_probe (struct device 
+       shpnt = scsi_host_alloc(&aha1740_template,
+                             sizeof(struct aha1740_hostdata));
+       if(shpnt == NULL)
+-              goto err_release;
++              goto err_release_region;
+       shpnt->base = 0;
+       shpnt->io_port = slotbase;
+@@ -625,21 +625,27 @@ static int aha1740_probe (struct device 
+       if (!host->ecb_dma_addr) {
+               printk (KERN_ERR "aha1740_probe: Couldn't map ECB, giving up\n");
+               scsi_unregister (shpnt);
+-              goto err_release;
++              goto err_host_put;
+       }
+       
+       DEB(printk("aha1740_probe: enable interrupt channel %d\n",irq_level));
+       if (request_irq(irq_level,aha1740_intr_handle,0,"aha1740",shpnt)) {
+               printk(KERN_ERR "aha1740_probe: Unable to allocate IRQ %d.\n",
+                      irq_level);
+-              goto err_release;
++              goto err_unmap;
+       }
+       eisa_set_drvdata (edev, shpnt);
+-      scsi_add_host (shpnt, dev);
++      scsi_add_host (shpnt, dev); /* XXX handle failure */
++      scsi_scan_host (shpnt);
+       return 0;
+- err_release:
++ err_unmap:
++      dma_unmap_single (&edev->dev, host->ecb_dma_addr,
++                        sizeof (host->ecb), DMA_BIDIRECTIONAL);
++ err_host_put:
++      scsi_host_put (shpnt);
++ err_release_region:
+       release_region(slotbase, SLOTSIZE);
+       return -ENODEV;
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aic79xx_osm.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aic79xx_osm.c      2003-07-19 17:03:50.000000000 -0700
+@@ -2173,7 +2173,8 @@ ahd_linux_register_host(struct ahd_softc
+       ahd_unlock(ahd, &s);
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-      scsi_add_host(host, &ahd->dev_softc->dev);
++      scsi_add_host(host, &ahd->dev_softc->dev); /* XXX handle failure */
++      scsi_scan_host(host);
+ #endif
+       return (0);
+ }
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aic79xx_osm.h       2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aic79xx_osm.h      2003-07-19 17:03:50.000000000 -0700
+@@ -43,7 +43,6 @@
+ #define _AIC79XX_LINUX_H_
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aic7xxx_osm.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aic7xxx_osm.c      2003-07-19 17:03:50.000000000 -0700
+@@ -139,7 +139,7 @@
+ #endif
+ #include <linux/mm.h>         /* For fetching system memory size */
+-#include <linux/blk.h>                /* For block_size() */
++#include <linux/blkdev.h>             /* For block_size() */
+ /*
+  * Lock protecting manipulation of the ahc softc list.
+@@ -1811,7 +1811,8 @@ ahc_linux_register_host(struct ahc_softc
+       ahc_unlock(ahc, &s);
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-      scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL));
++      scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL)); /* XXX handle failure */
++      scsi_scan_host(host);
+ #endif
+       return (0);
+ }
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aic7xxx_osm.h       2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aic7xxx_osm.h      2003-07-19 17:03:50.000000000 -0700
+@@ -60,7 +60,6 @@
+ #define _AIC7XXX_LINUX_H_
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx/aiclib.c    2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/scsi/aic7xxx/aiclib.c   2003-07-19 17:03:50.000000000 -0700
+@@ -30,7 +30,6 @@
+  * $Id: 2.6.0-test1-mm2.patch,v 1.1.2.2 2003/07/22 07:20:21 braam Exp $
+  */
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/version.h>
+--- linux-2.6.0-test1/drivers/scsi/aic7xxx_old.c       2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/scsi/aic7xxx_old.c      2003-07-19 17:03:50.000000000 -0700
+@@ -233,11 +233,10 @@
+ #include <linux/sched.h>
+ #include <linux/pci.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/spinlock.h>
+ #include <linux/smp.h>
+-#include <linux/blk.h>
+ #include <linux/interrupt.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/AM53C974.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/AM53C974.c 2003-07-19 17:03:50.000000000 -0700
+@@ -7,7 +7,7 @@
+ #include <linux/errno.h>
+ #include <linux/pci.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/spinlock.h>
+--- linux-2.6.0-test1/drivers/scsi/amiga7xx.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/amiga7xx.c 2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+  */
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/config.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/acornscsi.c     2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/acornscsi.c    2003-07-19 17:03:50.000000000 -0700
+@@ -138,7 +138,7 @@
+ #include <linux/errno.h>
+ #include <linux/proc_fs.h>
+ #include <linux/ioport.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+@@ -3043,9 +3043,13 @@ acornscsi_probe(struct expansion_card *e
+       acornscsi_resetcard(ashost);
+       ret = scsi_add_host(host, &ec->dev);
+-      if (ret == 0)
+-              goto out;
++      if (ret)
++              goto err_7;
++
++      scsi_scan_host(host);
++      goto out;
++ err_7:
+       free_irq(host->irq, ashost);
+  err_6:
+       release_region(host->io_port, 2048);
+--- linux-2.6.0-test1/drivers/scsi/arm/arxescsi.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/arxescsi.c     2003-07-19 17:03:50.000000000 -0700
+@@ -19,7 +19,7 @@
+  *  22-10-2000  SH            Updated for new registering scheme.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/cumana_1.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/cumana_1.c     2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <asm/ecard.h>
+@@ -297,9 +297,13 @@ cumanascsi1_probe(struct expansion_card 
+       printk("\n");
+       ret = scsi_add_host(host, &ec->dev);
+-      if (ret == 0)
+-              goto out;
++      if (ret)
++              goto out_free_irq;
++
++      scsi_scan_host(host);
++      goto out;
++ out_free_irq:
+       free_irq(host->irq, host);
+  out_release:
+       release_region(host->io_port, host->n_io_port);
+--- linux-2.6.0-test1/drivers/scsi/arm/cumana_2.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/cumana_2.c     2003-07-19 17:03:50.000000000 -0700
+@@ -17,7 +17,7 @@
+  *   02-04-2000       RMK     0.0.4   Updated for new error handling code.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/ecoscsi.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/ecoscsi.c      2003-07-19 17:03:50.000000000 -0700
+@@ -27,7 +27,7 @@
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include <asm/system.h>
+@@ -205,7 +205,8 @@ static int __init ecoscsi_init(void)
+       NCR5380_print_options(host);
+       printk("\n");
+-      scsi_add_host(host, NULL);
++      scsi_add_host(host, NULL); /* XXX handle failure */
++      scsi_scan_host(host);
+       return 0;
+ release_reg:
+--- linux-2.6.0-test1/drivers/scsi/arm/eesox.c 2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/eesox.c        2003-07-19 17:03:50.000000000 -0700
+@@ -23,7 +23,7 @@
+  *                            error handling code.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/fas216.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/fas216.c       2003-07-19 17:03:50.000000000 -0700
+@@ -35,7 +35,7 @@
+  *                    condition status from targets.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+@@ -2861,6 +2861,8 @@ int fas216_add(struct Scsi_Host *host, s
+       ret = scsi_add_host(host, dev);
+       if (ret)
+               fas216_writeb(info, REG_CMD, CMD_RESETCHIP);
++      else
++              scsi_scan_host(host);
+       return ret;
+ }
+--- linux-2.6.0-test1/drivers/scsi/arm/oak.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/oak.c  2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <asm/ecard.h>
+@@ -158,9 +158,13 @@ oakscsi_probe(struct expansion_card *ec,
+       printk("\n");
+       ret = scsi_add_host(host, &ec->dev);
+-      if (ret == 0)
+-              goto out;
++      if (ret)
++              goto out_release;
++
++      scsi_scan_host(host);
++      goto out;
++ out_release:
+       release_region(host->io_port, host->n_io_port);
+  unreg:
+       scsi_host_put(host);
+--- linux-2.6.0-test1/drivers/scsi/arm/powertec.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/arm/powertec.c     2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,7 @@
+  * published by the Free Software Foundation.
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/arm/queue.c 2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/scsi/arm/queue.c        2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,7 @@
+  *   30-Aug-2000 RMK  Use Linux list handling and spinlocks
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+--- linux-2.6.0-test1/drivers/scsi/atari_scsi.c        2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/scsi/atari_scsi.c       2003-07-19 17:03:50.000000000 -0700
+@@ -86,7 +86,7 @@
+ #include <linux/ctype.h>
+ #include <linux/delay.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/atp870u.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/atp870u.c  2003-07-19 17:03:50.000000000 -0700
+@@ -26,7 +26,7 @@
+ #include <linux/proc_fs.h>
+ #include <linux/spinlock.h>
+ #include <linux/pci.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/stat.h>
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/scsi/blz1230.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/blz1230.c  2003-07-19 17:03:50.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/blz2060.c   2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/scsi/blz2060.c  2003-07-19 17:03:50.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/BusLogic.c  2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/scsi/BusLogic.c 2003-07-19 17:03:50.000000000 -0700
+@@ -36,7 +36,6 @@
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/types.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/bvme6000.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/bvme6000.c 2003-07-19 17:03:50.000000000 -0700
+@@ -5,7 +5,7 @@
+  */
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/zorro.h>
+--- linux-2.6.0-test1/drivers/scsi/constants.c 2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/constants.c        2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/module.h>
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/cpqfcTScontrol.c    2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/cpqfcTScontrol.c   2003-07-19 17:03:50.000000000 -0700
+@@ -30,7 +30,7 @@
+ #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>  // request_region() prototype
+--- linux-2.6.0-test1/drivers/scsi/cpqfcTSinit.c       2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/cpqfcTSinit.c      2003-07-19 17:03:50.000000000 -0700
+@@ -35,7 +35,7 @@
+ #include <linux/interrupt.h>  
+ #include <linux/module.h>
+ #include <linux/version.h> 
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/types.h>
+--- linux-2.6.0-test1/drivers/scsi/cpqfcTSworker.c     2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/cpqfcTSworker.c    2003-07-19 17:03:50.000000000 -0700
+@@ -26,7 +26,7 @@
+ #include <linux/ioport.h>
+ #include <linux/kernel.h>
+ #include <linux/stat.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/delay.h>
+ #include <linux/smp_lock.h>
+--- linux-2.6.0-test1/drivers/scsi/cyberstorm.c        2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/cyberstorm.c       2003-07-19 17:03:50.000000000 -0700
+@@ -25,7 +25,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/cyberstormII.c      2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/scsi/cyberstormII.c     2003-07-19 17:03:50.000000000 -0700
+@@ -21,7 +21,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/dc395x.c    2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/dc395x.c   2003-07-19 17:03:50.000000000 -0700
+@@ -50,7 +50,7 @@
+ #include <linux/moduleparam.h>
+ #include <linux/delay.h>
+ #include <linux/ctype.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include "scsi.h"
+ #include "hosts.h"
+@@ -6214,7 +6214,8 @@ int __devinit dc395x_init_one(struct pci
+       pci_set_drvdata(pdev, scsi_host);
+       /* get the scsi mid level to scan for new devices on the bus */
+-      scsi_add_host(scsi_host, &pdev->dev);
++      scsi_add_host(scsi_host, &pdev->dev);   /* XXX handle failure */
++      scsi_scan_host(scsi_host);
+       return 0;
+ }
+--- linux-2.6.0-test1/drivers/scsi/dec_esp.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/dec_esp.c  2003-07-19 17:03:50.000000000 -0700
+@@ -24,7 +24,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+--- linux-2.6.0-test1/drivers/scsi/dmx3191d.c  2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/scsi/dmx3191d.c 2003-07-19 17:03:50.000000000 -0700
+@@ -22,7 +22,7 @@
+ #include <asm/io.h>
+ #include <asm/system.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/ioport.h>
+ #include <linux/module.h>
+--- linux-2.6.0-test1/drivers/scsi/dpt_i2o.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/dpt_i2o.c  2003-07-19 17:03:50.000000000 -0700
+@@ -47,7 +47,7 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Dri
+ #include <linux/config.h>     /* for CONFIG_PCI */
+ #include <linux/pci.h>                /* for PCI support */
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>      /* for udelay */
+ #include <linux/interrupt.h>
+ #include <linux/kernel.h>     /* for printk */
+--- linux-2.6.0-test1/drivers/scsi/dtc.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/dtc.c      2003-07-19 17:03:50.000000000 -0700
+@@ -76,7 +76,7 @@
+ #include <linux/module.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/stat.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/eata.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/eata.c     2003-07-19 17:03:50.000000000 -0700
+@@ -486,7 +486,7 @@
+ #include <asm/system.h>
+ #include <asm/byteorder.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/drivers/scsi/eata_pio.c  2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/scsi/eata_pio.c 2003-07-19 17:03:50.000000000 -0700
+@@ -58,7 +58,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/esp.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/esp.c      2003-07-19 17:03:50.000000000 -0700
+@@ -19,7 +19,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/fastlane.c  2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/fastlane.c 2003-07-19 17:03:50.000000000 -0700
+@@ -30,7 +30,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/fcal.c      2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/fcal.c     2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/fd_mcs.c    2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/fd_mcs.c   2003-07-19 17:03:50.000000000 -0700
+@@ -79,7 +79,7 @@
+ #include <linux/module.h>
+ #include <linux/interrupt.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/errno.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/fdomain.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/fdomain.c  2003-07-19 17:03:50.000000000 -0700
+@@ -270,7 +270,7 @@
+ #include <linux/module.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <linux/errno.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/gdth.c      2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/gdth.c     2003-07-19 17:03:50.000000000 -0700
+@@ -357,11 +357,8 @@
+ #include <asm/spinlock.h>
+ #endif
+-#if LINUX_VERSION_CODE >= 0x010300
+-#include <linux/blk.h>
+-#else
+-#include "../block/blk.h"
+-#endif
++#include <linux/blkdev.h>
++
+ #include "scsi.h"
+ #include "hosts.h"
+ #if LINUX_VERSION_CODE < 0x020503
+--- linux-2.6.0-test1/drivers/scsi/g_NCR5380.c 2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/scsi/g_NCR5380.c        2003-07-19 17:03:50.000000000 -0700
+@@ -105,7 +105,7 @@
+ #include <asm/io.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include "g_NCR5380.h"
+--- linux-2.6.0-test1/drivers/scsi/gvp11.c     2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/scsi/gvp11.c    2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/hosts.c     2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/hosts.c    2003-07-19 17:05:05.000000000 -0700
+@@ -81,19 +81,15 @@ int scsi_add_host(struct Scsi_Host *shos
+       printk(KERN_INFO "scsi%d : %s\n", shost->host_no,
+                       sht->info ? sht->info(shost) : sht->name);
+-      error = scsi_sysfs_add_host(shost, dev);
+-
+       if (!shost->can_queue) {
+               printk(KERN_ERR "%s: can_queue = 0 no longer supported\n",
+                               sht->name);
+               error = -EINVAL;
+       }
+-      if (!error) {
++      error = scsi_sysfs_add_host(shost, dev);
++      if (!error)
+               scsi_proc_host_add(shost);
+-              scsi_scan_host(shost);
+-      }
+-                      
+       return error;
+ }
+@@ -112,7 +108,7 @@ void scsi_free_shost(struct Scsi_Host *s
+               shost->eh_notify = NULL;
+       }
+-      shost->hostt->present--;
++      scsi_proc_hostdir_rm(shost->hostt);
+       scsi_destroy_command_freelist(shost);
+       kfree(shost);
+ }
+@@ -151,12 +147,6 @@ struct Scsi_Host *scsi_host_alloc(struct
+               dump_stack();
+         }
+-      /* if its not set in the template, use the default */
+-      if (!sht->shost_attrs)
+-               sht->shost_attrs = scsi_sysfs_shost_attrs;
+-      if (!sht->sdev_attrs)
+-               sht->sdev_attrs = scsi_sysfs_sdev_attrs;
+-
+       shost = kmalloc(sizeof(struct Scsi_Host) + privsize, gfp_mask);
+       if (!shost)
+               return NULL;
+@@ -219,7 +209,7 @@ struct Scsi_Host *scsi_host_alloc(struct
+       kernel_thread((int (*)(void *))scsi_error_handler, shost, 0);
+       wait_for_completion(&complete);
+       shost->eh_notify = NULL;
+-      shost->hostt->present++;
++      scsi_proc_hostdir_add(shost->hostt);
+       return shost;
+  fail:
+       kfree(shost);
+@@ -283,8 +273,8 @@ struct Scsi_Host *scsi_host_lookup(unsig
+  **/
+ void scsi_host_get(struct Scsi_Host *shost)
+ {
+-      get_device(&shost->host_gendev);
+-      class_device_get(&shost->class_dev);
++      get_device(&shost->shost_gendev);
++      class_device_get(&shost->shost_classdev);
+ }
+ /**
+@@ -293,6 +283,6 @@ void scsi_host_get(struct Scsi_Host *sho
+  **/
+ void scsi_host_put(struct Scsi_Host *shost)
+ {
+-      class_device_put(&shost->class_dev);
+-      put_device(&shost->host_gendev);
++      class_device_put(&shost->shost_classdev);
++      put_device(&shost->shost_gendev);
+ }
+--- linux-2.6.0-test1/drivers/scsi/i91uscsi.c  2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/scsi/i91uscsi.c 2003-07-19 17:03:50.000000000 -0700
+@@ -81,7 +81,7 @@
+ #include <linux/jiffies.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include "i91uscsi.h"
+--- linux-2.6.0-test1/drivers/scsi/ibmmca.c    2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/ibmmca.c   2003-07-19 17:03:50.000000000 -0700
+@@ -32,7 +32,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/ioport.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/mca.h>
+--- linux-2.6.0-test1/drivers/scsi/ide-scsi.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/ide-scsi.c 2003-07-19 17:03:50.000000000 -0700
+@@ -978,8 +978,10 @@ static int idescsi_attach(ide_drive_t *d
+               idescsi_setup (drive, idescsi);
+               drive->disk->fops = &idescsi_ops;
+               err = scsi_add_host(host, &idescsi_primary);
+-              if (!err)
++              if (!err) {
++                      scsi_scan_host(host);
+                       return 0;
++              }
+               /* fall through on error */
+               ide_unregister_subdriver(drive);
+       }
+--- linux-2.6.0-test1/drivers/scsi/imm.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/imm.c      2003-07-19 17:03:50.000000000 -0700
+@@ -24,7 +24,7 @@
+ void imm_reset_pulse(unsigned int base);
+ static int device_check(int host_no);
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include <linux/parport.h>
+ #include <linux/workqueue.h>
+--- linux-2.6.0-test1/drivers/scsi/imm.h       2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/scsi/imm.h      2003-07-19 17:03:50.000000000 -0700
+@@ -75,7 +75,7 @@
+ #include  <linux/delay.h>
+ #include  <linux/proc_fs.h>
+ #include  <linux/stat.h>
+-#include  <linux/blk.h>
++#include  <linux/blkdev.h>
+ #include  <linux/sched.h>
+ #include  <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/in2000.c    2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/in2000.c   2003-07-19 17:03:50.000000000 -0700
+@@ -114,7 +114,6 @@
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
+ #include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/ini9100u.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/ini9100u.c 2003-07-19 17:03:50.000000000 -0700
+@@ -119,7 +119,7 @@
+ #include <linux/delay.h>
+ #include <linux/pci.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <linux/stat.h>
+ #include <linux/config.h>
+--- linux-2.6.0-test1/drivers/scsi/inia100.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/inia100.c  2003-07-19 17:03:50.000000000 -0700
+@@ -74,7 +74,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/pci.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include <linux/stat.h>
+ #include <linux/kernel.h>
+--- linux-2.6.0-test1/drivers/scsi/ips.c       2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/ips.c      2003-07-19 17:03:50.000000000 -0700
+@@ -167,7 +167,7 @@
+ #include <linux/reboot.h>
+ #include <linux/interrupt.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/types.h>
+ #include <scsi/sg.h>
+--- linux-2.6.0-test1/drivers/scsi/ips.h       2003-06-14 12:18:03.000000000 -0700
++++ 25/drivers/scsi/ips.h      2003-07-19 17:03:50.000000000 -0700
+@@ -111,7 +111,7 @@
+    #else
+       #define IPS_REGISTER_HOSTS(SHT)      (!ips_detect(SHT))
+       #define IPS_UNREGISTER_HOSTS(SHT)
+-      #define IPS_ADD_HOST(shost,device)   scsi_add_host(shost,device)
++      #define IPS_ADD_HOST(shost,device)   do { scsi_add_host(shost,device); scsi_scan_host(shost); } while (0)
+       #define IPS_REMOVE_HOST(shost)       scsi_remove_host(shost)
+       #define IPS_SCSI_SET_DEVICE(sh,ha)   scsi_set_device(sh, &(ha)->pcidev->dev)
+       #define IPS_PRINTK(level, pcidev, format, arg...)                 \
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_1000.h     2003-07-19 17:06:32.000000000 -0700
+@@ -0,0 +1,3224 @@
++/* @(#)asm_1000.h 1.2 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */ 
++
++#ifndef       ISP_TARGET_MODE
++/*
++ *    Firmware Version 1.37.00 (11:28 Aug 28, 2000)
++ */
++static const u_int16_t isp_1000_risc_code[] = {
++      0x0078, 0x1041, 0x0000, 0x2757, 0x0000, 0x12ff, 0x2043, 0x4f50,
++      0x5952, 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932,
++      0x2c31, 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749,
++      0x4320, 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049,
++      0x5350, 0x3130, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520,
++      0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3337, 0x2020,
++      0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3135,
++      0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2000, 0x3030,
++      0x2024, 0x20b9, 0x1212, 0x20c1, 0x0008, 0x2071, 0x0010, 0x70c3,
++      0x0004, 0x20c9, 0x5cff, 0x2089, 0x10ee, 0x70c7, 0x4953, 0x70cb,
++      0x5020, 0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00, 0x70d6, 0x2031,
++      0x0030, 0x2079, 0x3800, 0x7863, 0x0000, 0x2fa0, 0x2009, 0x031b,
++      0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x1062,
++      0x789b, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0bb8,
++      0x2009, 0x3835, 0x200b, 0x0003, 0x78bb, 0x0000, 0x78bf, 0x0000,
++      0x78c3, 0x0000, 0x2069, 0x3840, 0x00a8, 0x1085, 0x681b, 0x003c,
++      0x2009, 0x1313, 0x21b8, 0x0078, 0x1087, 0x681b, 0x0028, 0x6807,
++      0x0007, 0x680b, 0x00fa, 0x680f, 0x0008, 0x6813, 0x0005, 0x681f,
++      0x0000, 0x6823, 0x0006, 0x6817, 0x0008, 0x6827, 0x0000, 0x2069,
++      0x3a80, 0x2011, 0x0020, 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f,
++      0x0019, 0x6803, 0xdd00, 0x6807, 0x001a, 0x6a1a, 0x2d00, 0xa0e8,
++      0x0008, 0xa290, 0x0004, 0x8109, 0x00c0, 0x109d, 0x2069, 0x3b00,
++      0x2009, 0x0002, 0x20a9, 0x0100, 0x683f, 0x0000, 0x2001, 0x0008,
++      0x8007, 0x6832, 0x6837, 0x000a, 0x680b, 0x0040, 0x6817, 0x0100,
++      0x681f, 0x0064, 0xade8, 0x0010, 0x0070, 0x10c8, 0x0078, 0x10b4,
++      0x8109, 0x00c0, 0x10b2, 0x1078, 0x1b64, 0x1078, 0x31c0, 0x1078,
++      0x1747, 0x1078, 0x368b, 0x3200, 0xa085, 0x000d, 0x2090, 0x70c3,
++      0x0000, 0x0090, 0x10e2, 0x70c0, 0xa086, 0x0002, 0x00c0, 0x10e2,
++      0x1078, 0x11e0, 0x1078, 0x1112, 0x1078, 0x18f2, 0x1078, 0x1aaf,
++      0x1078, 0x34fd, 0x1078, 0x184d, 0x0078, 0x10e2, 0x10f6, 0x10f8,
++      0x1d05, 0x1d05, 0x321e, 0x321e, 0x1d05, 0x1d05, 0x0078, 0x10f6,
++      0x0078, 0x10f8, 0x0078, 0x10fa, 0x0078, 0x10fc, 0x7008, 0x800c,
++      0x00c8, 0x110d, 0x7007, 0x0002, 0xa08c, 0x000c, 0x00c0, 0x110e,
++      0x8004, 0x8004, 0x00c8, 0x110d, 0x087a, 0x097a, 0x70c3, 0x4002,
++      0x0078, 0x11e3, 0x7814, 0xa005, 0x00c0, 0x111a, 0x0010, 0x1156,
++      0x0078, 0x1155, 0x2009, 0x3868, 0x2104, 0xa005, 0x00c0, 0x1155,
++      0x7814, 0xa086, 0x0001, 0x00c0, 0x1127, 0x1078, 0x15ae, 0x7817,
++      0x0000, 0x2009, 0x386f, 0x2104, 0xa065, 0x0040, 0x1143, 0x2009,
++      0x386a, 0x211c, 0x8108, 0x2114, 0x8108, 0x2104, 0xa210, 0xa399,
++      0x0000, 0x2009, 0x0018, 0x6083, 0x0103, 0x1078, 0x16d7, 0x00c0,
++      0x114f, 0x1078, 0x173e, 0x2009, 0x386f, 0x200b, 0x0000, 0x2009,
++      0x3869, 0x2104, 0x200b, 0x0000, 0xa005, 0x0040, 0x1153, 0x2001,
++      0x4005, 0x0078, 0x11e2, 0x0078, 0x11e0, 0x007c, 0x2061, 0x0000,
++      0x6018, 0xa084, 0x0001, 0x0040, 0x115e, 0x007c, 0x70c3, 0x0000,
++      0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000, 0x70c0, 0xa0bc,
++      0xffc0, 0x00c0, 0x11ae, 0x2038, 0x0079, 0x116e, 0x11e0, 0x122e,
++      0x11fc, 0x122e, 0x127f, 0x127f, 0x11f3, 0x1608, 0x128a, 0x11ef,
++      0x1200, 0x1202, 0x1204, 0x1206, 0x160d, 0x11ef, 0x1292, 0x12ba,
++      0x15bc, 0x1602, 0x1208, 0x14e3, 0x1505, 0x151f, 0x1548, 0x149c,
++      0x14aa, 0x14be, 0x14d2, 0x1357, 0x1332, 0x12e2, 0x12e9, 0x12ee,
++      0x12f3, 0x12f9, 0x12fe, 0x1303, 0x1308, 0x130d, 0x1311, 0x1326,
++      0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x1363, 0x136c, 0x137b,
++      0x13a1, 0x13ab, 0x13b2, 0x13d8, 0x13e7, 0x13f6, 0x1408, 0x147a,
++      0x11ef, 0x148a, 0x11ef, 0x11ef, 0x11ef, 0x1491, 0xa0bc, 0xffa0,
++      0x00c0, 0x11ef, 0x2038, 0xa084, 0x001f, 0x0079, 0x11b7, 0x11ef,
++      0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef,
++      0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x1665, 0x1674, 0x11ef,
++      0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef, 0x11ef,
++      0x11ef, 0x16b3, 0x16bd, 0x16c1, 0x16cf, 0x167f, 0x169c, 0x72ca,
++      0x71c6, 0x2001, 0x4006, 0x0078, 0x11e2, 0x73ce, 0x72ca, 0x71c6,
++      0x2001, 0x4000, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091,
++      0x5000, 0x2091, 0x4080, 0x007c, 0x71c6, 0x0078, 0x11e2, 0x70c3,
++      0x4001, 0x0078, 0x11e3, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9,
++      0x0005, 0x53a3, 0x0078, 0x11e0, 0x70c4, 0x70c3, 0x0004, 0x007a,
++      0x0078, 0x11e0, 0x0078, 0x11e0, 0x0078, 0x11e0, 0x0078, 0x11e0,
++      0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020,
++      0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00, 0x70d6, 0x2079, 0x0000,
++      0x781b, 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457,
++      0x2051, 0x0470, 0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000,
++      0x2091, 0x5000, 0x2091, 0x4080, 0x0078, 0x0455, 0x71d0, 0x72c8,
++      0x73cc, 0x70c4, 0x20a0, 0x2098, 0x2031, 0x0030, 0x81ff, 0x0040,
++      0x11e0, 0x7007, 0x0004, 0x731a, 0x721e, 0x2051, 0x0012, 0x2049,
++      0x125d, 0x2041, 0x11e0, 0x7003, 0x0002, 0xa786, 0x0001, 0x00c0,
++      0x124f, 0x2049, 0x126b, 0x2041, 0x1277, 0x7003, 0x0003, 0x7017,
++      0x0000, 0x810b, 0x7112, 0x00c8, 0x1257, 0x7017, 0x0001, 0x7007,
++      0x0001, 0xa786, 0x0001, 0x0040, 0x126b, 0x700c, 0xa084, 0x007f,
++      0x8004, 0x2009, 0x0020, 0xa102, 0x0942, 0x094a, 0x20a8, 0x26a0,
++      0x53a6, 0x0078, 0x10fe, 0x700c, 0xa084, 0x007f, 0x0040, 0x126b,
++      0x80ac, 0x0048, 0x126b, 0x2698, 0x53a5, 0x0078, 0x10fe, 0x700c,
++      0xa084, 0x007f, 0x80ac, 0x2698, 0x53a5, 0x0078, 0x11e0, 0x71c4,
++      0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1287, 0x200a, 0x72ca,
++      0x0078, 0x11df, 0x70c7, 0x0125, 0x70cb, 0x0000, 0x70cf, 0x0f00,
++      0x0078, 0x11e0, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca,
++      0x73ce, 0x74d2, 0xa005, 0x0040, 0x12b4, 0x8001, 0x7872, 0xa084,
++      0xfc00, 0x0040, 0x12ab, 0x7898, 0xa085, 0x0001, 0x789a, 0x2001,
++      0x4005, 0x0078, 0x11e2, 0x7a7a, 0x7b7e, 0x7c76, 0x7898, 0xa084,
++      0xfffc, 0x789a, 0x0078, 0x12b8, 0x7898, 0xa085, 0x0001, 0x789a,
++      0x0078, 0x11e0, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca,
++      0x73ce, 0x74d6, 0xa005, 0x0040, 0x12dc, 0x8001, 0x7886, 0xa084,
++      0xfc00, 0x0040, 0x12d3, 0x7898, 0xa085, 0x0100, 0x789a, 0x2001,
++      0x4005, 0x0078, 0x11e2, 0x7a8e, 0x7b92, 0x7c8a, 0x7898, 0xa084,
++      0xfcff, 0x789a, 0x0078, 0x12e0, 0x7898, 0xa085, 0x0100, 0x789a,
++      0x0078, 0x11e0, 0x2009, 0x3859, 0x210c, 0x2011, 0x0372, 0x0078,
++      0x11de, 0x2009, 0x3841, 0x210c, 0x0078, 0x11df, 0x2009, 0x3842,
++      0x210c, 0x0078, 0x11df, 0x2061, 0x3840, 0x610c, 0x6210, 0x0078,
++      0x11de, 0x2009, 0x3845, 0x210c, 0x0078, 0x11df, 0x2009, 0x3846,
++      0x210c, 0x0078, 0x11df, 0x2009, 0x3847, 0x210c, 0x0078, 0x11df,
++      0x2009, 0x3848, 0x210c, 0x0078, 0x11df, 0x7908, 0x7a0c, 0x0078,
++      0x11de, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xa0e8, 0x3a80, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x1323,
++      0x6b08, 0x0078, 0x1324, 0x6b0c, 0x0078, 0x11dd, 0x77c4, 0x1078,
++      0x1758, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++      0x0078, 0x11dd, 0x2091, 0x8000, 0x7848, 0xa005, 0x00c0, 0x1346,
++      0x2061, 0x3b00, 0x20a9, 0x0100, 0x603c, 0xa005, 0x00c0, 0x1346,
++      0xace0, 0x0010, 0x00f0, 0x133c, 0x0078, 0x134e, 0x2019, 0x0000,
++      0x2011, 0x0000, 0x2009, 0x0000, 0x0078, 0x1353, 0x7bb8, 0x7abc,
++      0x79c0, 0x78c3, 0x0000, 0x2091, 0x8001, 0x0078, 0x11dd, 0x77c4,
++      0x1078, 0x1758, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091,
++      0x8001, 0x0078, 0x11dd, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x11d8,
++      0x1078, 0x1be8, 0x0078, 0x11dd, 0x71c4, 0xa182, 0x0010, 0x00c8,
++      0x11d8, 0x2011, 0x3841, 0x2204, 0x007e, 0x2112, 0x1078, 0x1ba1,
++      0x017f, 0x0078, 0x11df, 0x71c4, 0x2011, 0x1399, 0x20a9, 0x0008,
++      0x2204, 0xa106, 0x0040, 0x138b, 0x8210, 0x0070, 0x1389, 0x0078,
++      0x1380, 0x0078, 0x11d8, 0xa292, 0x1399, 0x027e, 0x2011, 0x3842,
++      0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x1bad, 0x017f, 0x0078,
++      0x11df, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
++      0x004b, 0x2061, 0x3840, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
++      0x6012, 0x0078, 0x11de, 0x2061, 0x3840, 0x6114, 0x70c4, 0x6016,
++      0x0078, 0x11df, 0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186,
++      0x0028, 0x0040, 0x13cb, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186,
++      0x0032, 0x0040, 0x13cb, 0x2011, 0x0006, 0x2019, 0x1313, 0xa186,
++      0x003c, 0x00c0, 0x11d8, 0x2061, 0x3840, 0x6018, 0x007e, 0x611a,
++      0x23b8, 0x1078, 0x1bbe, 0x1078, 0x368b, 0x017f, 0x0078, 0x11df,
++      0x71c4, 0xa184, 0xffcf, 0x00c0, 0x11d8, 0x2011, 0x3847, 0x2204,
++      0x2112, 0x007e, 0x1078, 0x1be0, 0x017f, 0x0078, 0x11df, 0x71c4,
++      0xa182, 0x0010, 0x00c8, 0x11d8, 0x2011, 0x3848, 0x2204, 0x007e,
++      0x2112, 0x1078, 0x1bcf, 0x017f, 0x0078, 0x11df, 0x71c4, 0x72c8,
++      0xa184, 0xfffd, 0x00c0, 0x11d7, 0xa284, 0xfffd, 0x00c0, 0x11d7,
++      0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x11de,
++      0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
++      0x3a80, 0x2019, 0x0000, 0x72c8, 0x6800, 0x007e, 0xa226, 0x0040,
++      0x1440, 0xa284, 0x0001, 0x0040, 0x1422, 0x2220, 0xa39d, 0x0002,
++      0xa294, 0xfffe, 0x6a02, 0xa484, 0x2000, 0x0040, 0x1429, 0xa39d,
++      0x0010, 0xa484, 0x1000, 0x0040, 0x142f, 0xa39d, 0x0008, 0xa484,
++      0x4000, 0x0040, 0x1440, 0x810f, 0xa284, 0x4000, 0x0040, 0x143c,
++      0x1078, 0x1c02, 0x0078, 0x1440, 0x1078, 0x1bf4, 0x0078, 0x1440,
++      0x72cc, 0x82ff, 0x0040, 0x1472, 0x6808, 0xa206, 0x0040, 0x1472,
++      0xa2a4, 0x00ff, 0x2061, 0x3840, 0x6118, 0xa186, 0x0028, 0x0040,
++      0x1459, 0xa186, 0x0032, 0x0040, 0x145f, 0xa186, 0x003c, 0x0040,
++      0x1465, 0xa482, 0x0064, 0x0048, 0x146f, 0x0078, 0x1469, 0xa482,
++      0x0050, 0x0048, 0x146f, 0x0078, 0x1469, 0xa482, 0x0043, 0x0048,
++      0x146f, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x11d9, 0x6a0a,
++      0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
++      0x0078, 0x11dd, 0x77c4, 0x1078, 0x1758, 0x2091, 0x8000, 0x6a14,
++      0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
++      0x0078, 0x11dd, 0x2011, 0x3835, 0x220c, 0x70c4, 0x2012, 0x0078,
++      0x11df, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x11d8,
++      0x1078, 0x1c10, 0x0078, 0x11dd, 0x77c4, 0x1078, 0x1758, 0x2091,
++      0x8000, 0x6a08, 0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708,
++      0x0078, 0x11de, 0x77c4, 0x1078, 0x1758, 0x2091, 0x8000, 0x6a08,
++      0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x14b9, 0x1078,
++      0x1b49, 0x2091, 0x8001, 0x2708, 0x0078, 0x11de, 0x77c4, 0x1078,
++      0x1758, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804,
++      0xa005, 0x0040, 0x14cd, 0x1078, 0x1b49, 0x2091, 0x8001, 0x2708,
++      0x0078, 0x11de, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051,
++      0x0020, 0x2091, 0x8000, 0x1078, 0x1765, 0x2091, 0x8001, 0x2708,
++      0x6a08, 0x0078, 0x11de, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca,
++      0x73ce, 0x1078, 0x17e6, 0x00c0, 0x1501, 0x6818, 0xa005, 0x0040,
++      0x14fb, 0x2708, 0x1078, 0x1c20, 0x00c0, 0x14fb, 0x7817, 0xffff,
++      0x2091, 0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078,
++      0x11e2, 0x2091, 0x8001, 0x0078, 0x11e0, 0x77c4, 0x77c6, 0x2041,
++      0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
++      0x1765, 0x2061, 0x3840, 0x60a3, 0x0003, 0x67b6, 0x60a7, 0x0000,
++      0x7817, 0xffff, 0x1078, 0x1b49, 0x2091, 0x8001, 0x007c, 0x77c8,
++      0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2061,
++      0x3840, 0x60a3, 0x0002, 0x60a7, 0x0000, 0x67b6, 0x7817, 0xffff,
++      0x1078, 0x1b49, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0004,
++      0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x1765, 0x70c8, 0x683e,
++      0x8738, 0xa784, 0x001f, 0x00c0, 0x153c, 0x2091, 0x8001, 0x007c,
++      0x7898, 0xa084, 0x0003, 0x00c0, 0x156c, 0x2039, 0x0000, 0x2041,
++      0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x1758, 0x2091,
++      0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784,
++      0x001f, 0x00c0, 0x1555, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f,
++      0xa784, 0x0f00, 0x00c0, 0x1555, 0x2091, 0x8000, 0x2069, 0x0100,
++      0x6830, 0xa084, 0x0040, 0x0040, 0x1595, 0x684b, 0x0004, 0x20a9,
++      0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x1582, 0x0070, 0x1582,
++      0x0078, 0x1579, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084,
++      0x0001, 0x0040, 0x158f, 0x0070, 0x158f, 0x0078, 0x1586, 0x20a9,
++      0x00fa, 0x0070, 0x1595, 0x0078, 0x1591, 0x2079, 0x3800, 0x7817,
++      0x0001, 0x2061, 0x3840, 0x60a3, 0x0001, 0x60a7, 0x0000, 0x60c3,
++      0x000f, 0x7898, 0xa085, 0x0002, 0x789a, 0x6808, 0xa084, 0xfffd,
++      0x680a, 0x681b, 0x0046, 0x2091, 0x8001, 0x007c, 0x7898, 0xa084,
++      0xfffd, 0x789a, 0xa084, 0x0001, 0x00c0, 0x15b8, 0x1078, 0x1830,
++      0x71c4, 0x71c6, 0x794a, 0x007c, 0x74c4, 0x73c8, 0x72cc, 0x74c6,
++      0x73ca, 0x72ce, 0x2079, 0x3800, 0x2009, 0x0040, 0x1078, 0x1735,
++      0x0040, 0x15fe, 0x1078, 0x1705, 0x0040, 0x15d2, 0x1078, 0x173e,
++      0x0078, 0x15fe, 0x6010, 0x2091, 0x8000, 0x7817, 0xffff, 0x2009,
++      0x3868, 0x200b, 0x0005, 0x8108, 0x200b, 0x0000, 0x8108, 0x230a,
++      0x8108, 0x220a, 0x8108, 0x240a, 0x8108, 0x200a, 0x8108, 0x200b,
++      0x0000, 0x8108, 0x2c0a, 0xa02e, 0x2530, 0x0e7e, 0x1078, 0x3199,
++      0x0e7f, 0x6592, 0x65a2, 0x6696, 0x66a6, 0x60ab, 0x0000, 0x60af,
++      0x0000, 0x1078, 0x1b49, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005,
++      0x0078, 0x11e3, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x11e0,
++      0x71c4, 0x71c6, 0x2168, 0x0078, 0x160f, 0x2069, 0x1000, 0x690c,
++      0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1611, 0xa285,
++      0x0000, 0x00c0, 0x161f, 0x70c3, 0x4000, 0x0078, 0x1621, 0x70c3,
++      0x4003, 0x70ca, 0x0078, 0x11e3, 0x71c4, 0x72c8, 0x73cc, 0x2100,
++      0xa184, 0xfffc, 0x00c0, 0x11ef, 0x2100, 0x0079, 0x162f, 0x1646,
++      0x165b, 0x165d, 0x165f, 0x70c3, 0x4003, 0x71ce, 0x72d2, 0x73d6,
++      0x0078, 0x1642, 0x70c3, 0x4000, 0x70cf, 0x0000, 0x70d3, 0x0000,
++      0x70d7, 0x0000, 0x77c6, 0x71ca, 0x0078, 0x11e0, 0x2031, 0x1661,
++      0x2624, 0x8630, 0x2412, 0x2204, 0xa446, 0x00c0, 0x1633, 0xa484,
++      0xffff, 0x00c0, 0x1648, 0x2031, 0x1661, 0x8210, 0x8319, 0xa384,
++      0xffff, 0x00c0, 0x1648, 0x0078, 0x163a, 0x0078, 0x163a, 0x0078,
++      0x163a, 0x5555, 0xaaaa, 0xffff, 0x0000, 0x77c4, 0x1078, 0x1758,
++      0x2091, 0x8000, 0x6830, 0xa084, 0xff00, 0x8007, 0x2010, 0x2091,
++      0x8001, 0x2708, 0x0078, 0x11de, 0x77c4, 0x1078, 0x1758, 0x2091,
++      0x8000, 0x6a34, 0x2091, 0x8001, 0x2708, 0x0078, 0x11de, 0x77c4,
++      0x077e, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0x72c8, 0x8217, 0xa294,
++      0xff00, 0x1078, 0x1758, 0x2091, 0x8000, 0x6c30, 0x6a32, 0x2091,
++      0x8001, 0x8738, 0x00f0, 0x1689, 0x077f, 0x2708, 0x8427, 0xa4a4,
++      0x00ff, 0x2410, 0x0078, 0x11de, 0x77c4, 0x077e, 0xa7bc, 0xff00,
++      0x20a9, 0x0020, 0x72c8, 0x1078, 0x1758, 0x2091, 0x8000, 0x6c34,
++      0x6a36, 0x2091, 0x8001, 0x8738, 0x00f0, 0x16a3, 0x077f, 0x2708,
++      0x2410, 0x0078, 0x11de, 0x7960, 0x71c6, 0x71c4, 0xa182, 0x0003,
++      0x00c8, 0x11d8, 0x7962, 0x0078, 0x11e0, 0x7960, 0x71c6, 0x0078,
++      0x11e0, 0x7954, 0x71c6, 0x71c4, 0x7956, 0x7958, 0x71ca, 0x71c8,
++      0x795a, 0x795c, 0x71ce, 0x71cc, 0x795e, 0x0078, 0x11e0, 0x7954,
++      0x71c6, 0x7958, 0x71ca, 0x795c, 0x71ce, 0x0078, 0x11e0, 0x700c,
++      0xa084, 0x007f, 0x0040, 0x16e3, 0x7007, 0x0004, 0x7004, 0xa084,
++      0x0004, 0x00c0, 0x16de, 0x7017, 0x0000, 0x7112, 0x721a, 0x731e,
++      0x8108, 0x810c, 0x81a9, 0x8c98, 0x20a1, 0x0030, 0x6080, 0x20a2,
++      0x53a6, 0x780c, 0xa085, 0x0000, 0x7002, 0x7007, 0x0001, 0x7108,
++      0x8104, 0x00c8, 0x16f7, 0x7007, 0x0002, 0xa184, 0x000c, 0x710c,
++      0xa184, 0x0300, 0x7003, 0x0000, 0x007c, 0x700c, 0xa084, 0x007f,
++      0x0040, 0x1711, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++      0x170c, 0x7017, 0x0000, 0x7112, 0x721a, 0x731e, 0x2099, 0x0030,
++      0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
++      0x7008, 0x800c, 0x00c8, 0x1720, 0x7007, 0x0002, 0xa08c, 0x000c,
++      0x00c0, 0x1732, 0x710c, 0xa184, 0x0300, 0x00c0, 0x1732, 0x2ca0,
++      0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x7850, 0xa065, 0x0040,
++      0x173d, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079,
++      0x3800, 0x7850, 0x2062, 0x2c00, 0x7852, 0x0f7f, 0x007c, 0x2011,
++      0x5d00, 0x7a52, 0x2019, 0x0372, 0x8319, 0x0040, 0x1755, 0xa280,
++      0x002f, 0x2012, 0x2010, 0x0078, 0x174c, 0x2013, 0x0000, 0x007c,
++      0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003,
++      0x8003, 0xa105, 0xa0e8, 0x3b00, 0x007c, 0x1078, 0x1758, 0x2900,
++      0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, 0x690a,
++      0x2091, 0x8000, 0x2009, 0x384f, 0x210c, 0x6804, 0xa005, 0x0040,
++      0x1784, 0xa116, 0x00c0, 0x1784, 0x2060, 0x6000, 0x6806, 0x017e,
++      0x200b, 0x0000, 0x0078, 0x1787, 0x2009, 0x0000, 0x017e, 0x6804,
++      0xa065, 0x0040, 0x1798, 0x6000, 0x6806, 0x1078, 0x17ad, 0x1078,
++      0x18a4, 0x1078, 0x2b27, 0x6810, 0x8001, 0x6812, 0x00c0, 0x1787,
++      0x1078, 0x2b27, 0x017f, 0x6902, 0x6906, 0x2091, 0x8001, 0x007c,
++      0xa065, 0x0040, 0x17ac, 0x6098, 0x609b, 0x0000, 0x2008, 0x1078,
++      0x173e, 0x2100, 0x0078, 0x17a0, 0x007c, 0x6003, 0x0103, 0x20a9,
++      0x001c, 0xac80, 0x0004, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
++      0x6016, 0x682c, 0x601e, 0x007c, 0x0e7e, 0x2071, 0x3840, 0x7040,
++      0xa08c, 0x0200, 0x00c0, 0x17ca, 0xa088, 0x3880, 0x2d0a, 0x8000,
++      0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x3840, 0x2009,
++      0x3880, 0x7240, 0x8221, 0x8211, 0x0048, 0x17e4, 0x2104, 0x8108,
++      0xad06, 0x00c0, 0x17d3, 0x8119, 0x211e, 0x8108, 0x8318, 0x8211,
++      0x00c8, 0x17dc, 0x7442, 0xa006, 0x0e7f, 0x007c, 0x1078, 0x1758,
++      0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040, 0x182f, 0x0078,
++      0x17f7, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040, 0x182f, 0x600c,
++      0xa306, 0x00c0, 0x17f1, 0x6008, 0xa206, 0x00c0, 0x17f1, 0x2c28,
++      0x2001, 0x384f, 0x2004, 0xac06, 0x0040, 0x182f, 0x6804, 0xac06,
++      0x00c0, 0x1814, 0x6000, 0x2060, 0x6806, 0xa005, 0x00c0, 0x1814,
++      0x6803, 0x0000, 0x0078, 0x181e, 0x6400, 0x781c, 0x2060, 0x6402,
++      0xa486, 0x0000, 0x00c0, 0x181e, 0x2c00, 0x6802, 0x2560, 0x1078,
++      0x17ad, 0x6017, 0x0005, 0x601f, 0x0020, 0x1078, 0x18a4, 0x1078,
++      0x2b27, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff, 0xa005, 0x007c,
++      0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
++      0x2091, 0x8000, 0x1078, 0x1765, 0x8738, 0xa784, 0x001f, 0x00c0,
++      0x183a, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00,
++      0x00c0, 0x183a, 0x2091, 0x8001, 0x007c, 0x0068, 0x185c, 0x2061,
++      0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x185c, 0x78ac, 0x78af,
++      0x0000, 0xa005, 0x00c0, 0x185d, 0x007c, 0xa08c, 0xfff0, 0x0040,
++      0x1863, 0x1078, 0x1ce7, 0x0079, 0x1865, 0x1875, 0x1877, 0x187d,
++      0x1881, 0x1875, 0x1885, 0x1875, 0x1875, 0x188b, 0x1875, 0x1892,
++      0x1896, 0x1875, 0x1875, 0x1875, 0x1875, 0x1078, 0x1ce7, 0x1078,
++      0x1830, 0x2001, 0x8001, 0x0078, 0x189c, 0x2001, 0x8003, 0x0078,
++      0x189c, 0x2001, 0x8004, 0x0078, 0x189c, 0x1078, 0x1830, 0x2001,
++      0x8006, 0x0078, 0x189c, 0x2001, 0x8009, 0x2011, 0x382c, 0x220c,
++      0x0078, 0x11ec, 0x2001, 0x800c, 0x0078, 0x189c, 0x1078, 0x1830,
++      0x2001, 0x800d, 0x0078, 0x189c, 0x70c2, 0x2061, 0x0000, 0x601b,
++      0x0001, 0x2091, 0x4080, 0x007c, 0x2c04, 0x6082, 0x2c08, 0x2063,
++      0x0000, 0x7864, 0x8000, 0x7866, 0x7868, 0xa005, 0x796a, 0x0040,
++      0x18b4, 0x2c02, 0x0078, 0x18b5, 0x796e, 0x007c, 0x0c7e, 0x2061,
++      0x3800, 0x6883, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6064, 0x8000,
++      0x6066, 0x6068, 0xa005, 0x616a, 0x0040, 0x18c9, 0x2d02, 0x0078,
++      0x18cc, 0x616e, 0x1078, 0x2b41, 0x0c7f, 0x007c, 0x1078, 0x18df,
++      0x0040, 0x18de, 0x0c7e, 0x6098, 0xa065, 0x0040, 0x18d9, 0x1078,
++      0x17a0, 0x0c7f, 0x609b, 0x0000, 0x1078, 0x173e, 0x007c, 0x786c,
++      0xa065, 0x0040, 0x18f1, 0x2091, 0x8000, 0x7864, 0x8001, 0x7866,
++      0x2c04, 0x786e, 0xa005, 0x00c0, 0x18ef, 0x786a, 0x8000, 0x2091,
++      0x8001, 0x007c, 0x7898, 0xa005, 0x00c0, 0x194d, 0x7974, 0x70d0,
++      0x0005, 0x0005, 0x72d0, 0xa206, 0x00c0, 0x18f7, 0x2200, 0xa106,
++      0x00c0, 0x190e, 0x7804, 0xa005, 0x0040, 0x194d, 0x7807, 0x0000,
++      0x0068, 0x194d, 0x2091, 0x4080, 0x0078, 0x194d, 0x1078, 0x1735,
++      0x0040, 0x194d, 0x7a7c, 0x7b78, 0xa184, 0xff00, 0x0040, 0x1921,
++      0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078,
++      0x1924, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0x2009,
++      0x0040, 0x1078, 0x1705, 0x0040, 0x1944, 0x1078, 0x173e, 0x7880,
++      0x8000, 0x7882, 0xa086, 0x0002, 0x00c0, 0x194d, 0x2091, 0x8000,
++      0x78af, 0x0002, 0x7883, 0x0000, 0x7898, 0xa085, 0x0003, 0x789a,
++      0x2091, 0x8001, 0x0078, 0x194d, 0x7883, 0x0000, 0x1078, 0x1a99,
++      0x6000, 0xa084, 0x0007, 0x0079, 0x194e, 0x007c, 0x1956, 0x1965,
++      0x1985, 0x1956, 0x1997, 0x1956, 0x1956, 0x1956, 0x2039, 0x0400,
++      0x78a8, 0xa705, 0x78aa, 0x6004, 0xa705, 0x6006, 0x1078, 0x19e2,
++      0x6018, 0x78a6, 0x1078, 0x1a81, 0x007c, 0x78a8, 0xa084, 0x0100,
++      0x0040, 0x196c, 0x0078, 0x1956, 0x78ab, 0x0000, 0x6000, 0x8007,
++      0xa084, 0x00ff, 0x789e, 0x8001, 0x609b, 0x0000, 0x0040, 0x1982,
++      0x1078, 0x19e2, 0x0040, 0x1982, 0x78a8, 0xa085, 0x0100, 0x78aa,
++      0x0078, 0x1984, 0x1078, 0x1a06, 0x007c, 0x78a8, 0xa08c, 0x0e00,
++      0x00c0, 0x198e, 0xa084, 0x0100, 0x00c0, 0x1990, 0x0078, 0x1956,
++      0x1078, 0x19e2, 0x00c0, 0x1996, 0x1078, 0x1a06, 0x007c, 0x78a8,
++      0xa084, 0x0100, 0x0040, 0x199e, 0x0078, 0x1956, 0x78ab, 0x0000,
++      0x6710, 0x2011, 0x0001, 0x20a9, 0x0001, 0x6014, 0xa084, 0x00ff,
++      0xa005, 0x0040, 0x19c1, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9,
++      0x0020, 0xa08e, 0x0001, 0x0040, 0x19c1, 0x2039, 0x0000, 0x2011,
++      0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, 0x19c1, 0x0078,
++      0x19df, 0x1078, 0x1758, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000,
++      0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a, 0x2d00, 0xa080,
++      0x0010, 0x2068, 0x2091, 0x8001, 0x0070, 0x19d8, 0x0078, 0x19c4,
++      0x8211, 0x0040, 0x19df, 0x20a9, 0x0100, 0x0078, 0x19c4, 0x1078,
++      0x173e, 0x007c, 0x78a0, 0xa06d, 0x00c0, 0x19ed, 0x2c00, 0x78a2,
++      0x78a6, 0x609b, 0x0000, 0x0078, 0x19f9, 0x2c00, 0x689a, 0x609b,
++      0x0000, 0x78a2, 0x2d00, 0x6002, 0x78a4, 0xad06, 0x00c0, 0x19f9,
++      0x6002, 0x789c, 0x8001, 0x789e, 0x00c0, 0x1a05, 0x78a8, 0xa084,
++      0x0000, 0x78aa, 0x78a4, 0x2060, 0xa006, 0x007c, 0xa02e, 0x2530,
++      0x6118, 0xa184, 0x0060, 0x619e, 0x0040, 0x1a12, 0x0e7e, 0x1078,
++      0x3199, 0x0e7f, 0x6592, 0x65a2, 0x6696, 0x66a6, 0x60ab, 0x0000,
++      0x60af, 0x0000, 0x6710, 0x1078, 0x1758, 0x2091, 0x8000, 0x6808,
++      0xa084, 0x0001, 0x0040, 0x1a34, 0x2091, 0x8001, 0x1078, 0x17ad,
++      0x2091, 0x8000, 0x1078, 0x18a4, 0x2091, 0x8001, 0x78a3, 0x0000,
++      0x78a7, 0x0000, 0x0078, 0x1a80, 0x6020, 0xa096, 0x0001, 0x00c0,
++      0x1a3b, 0x8000, 0x6022, 0x6a10, 0x6814, 0x2091, 0x8001, 0xa202,
++      0x0048, 0x1a4a, 0x0040, 0x1a4a, 0x2039, 0x0200, 0x1078, 0x1a81,
++      0x0078, 0x1a80, 0x2c08, 0x2091, 0x8000, 0x6800, 0xa065, 0x0040,
++      0x1a52, 0x6102, 0x6902, 0x00c0, 0x1a56, 0x6906, 0x2160, 0x6003,
++      0x0000, 0x6810, 0x8000, 0x6812, 0x78b8, 0x8000, 0x78ba, 0x2091,
++      0x8001, 0x6808, 0xa08c, 0x0040, 0x0040, 0x1a76, 0xa086, 0x0040,
++      0x680a, 0x1078, 0x17bc, 0x017e, 0x007e, 0x6930, 0x2100, 0x810f,
++      0xa105, 0x6832, 0x6934, 0x693a, 0x007f, 0x017f, 0x2091, 0x8000,
++      0x1078, 0x1b49, 0x2091, 0x8001, 0x78a7, 0x0000, 0x78a3, 0x0000,
++      0x007c, 0x6004, 0xa705, 0x6006, 0x2091, 0x8000, 0x1078, 0x18a4,
++      0x2091, 0x8001, 0x78a4, 0xa065, 0x0040, 0x1a94, 0x6098, 0x78a6,
++      0x609b, 0x0000, 0x0078, 0x1a84, 0x78a3, 0x0000, 0x78a7, 0x0000,
++      0x007c, 0x7970, 0x7874, 0x8000, 0xa10a, 0x00c8, 0x1aa0, 0xa006,
++      0x7876, 0x70d2, 0x7804, 0xa005, 0x0040, 0x1aae, 0x8001, 0x7806,
++      0x00c0, 0x1aae, 0x0068, 0x1aae, 0x2091, 0x4080, 0x007c, 0x0068,
++      0x1ac9, 0x2029, 0x0000, 0x786c, 0xa065, 0x0040, 0x1ac4, 0x1078,
++      0x1aca, 0x0040, 0x1ac4, 0x057e, 0x1078, 0x1ae8, 0x057f, 0x00c0,
++      0x1ac4, 0x8528, 0x0078, 0x1ab3, 0x85ff, 0x0040, 0x1ac9, 0x2091,
++      0x4080, 0x007c, 0x2091, 0x8000, 0x7b84, 0x7988, 0x72d4, 0x0005,
++      0x0005, 0x70d4, 0xa206, 0x00c0, 0x1ace, 0x2200, 0xa102, 0x00c0,
++      0x1ade, 0x2300, 0x2091, 0x8001, 0xa005, 0x007c, 0x0048, 0x1ae4,
++      0xa302, 0x2091, 0x8001, 0x007c, 0x8002, 0x2091, 0x8001, 0x007c,
++      0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1b3f,
++      0x7008, 0x7208, 0xa206, 0x00c0, 0x1b3f, 0xa286, 0x0002, 0x00c0,
++      0x1b3f, 0x2071, 0x0010, 0xa184, 0xff00, 0x0040, 0x1b08, 0x810f,
++      0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078, 0x1b0b,
++      0x8107, 0x8004, 0x8004, 0x7a90, 0x7b8c, 0xa210, 0xa399, 0x0000,
++      0x2009, 0x0018, 0x6024, 0xa005, 0x0040, 0x1b18, 0x2009, 0x0040,
++      0x1078, 0x16d7, 0x0040, 0x1b31, 0x7894, 0x8000, 0x7896, 0xa086,
++      0x0002, 0x00c0, 0x1b3f, 0x2091, 0x8000, 0x78af, 0x0003, 0x7897,
++      0x0000, 0x7898, 0xa085, 0x0300, 0x789a, 0x2091, 0x8001, 0x0078,
++      0x1b3f, 0x7897, 0x0000, 0x1078, 0x18ce, 0x7984, 0x7888, 0x8000,
++      0xa10a, 0x00c8, 0x1b3c, 0xa006, 0x788a, 0x70d6, 0xa006, 0x2071,
++      0x0010, 0x2091, 0x8001, 0x007c, 0x2009, 0x3868, 0x2091, 0x8000,
++      0x200a, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3840, 0x2104, 0xa086,
++      0x0000, 0x00c0, 0x1b62, 0x2009, 0x3812, 0x2104, 0xa005, 0x00c0,
++      0x1b62, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1b62, 0x0018, 0x1b62,
++      0x781b, 0x0044, 0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300, 0x2071,
++      0x3840, 0x2079, 0x0100, 0x2019, 0x305e, 0x20a1, 0x012b, 0x2304,
++      0xa005, 0x0040, 0x1b7c, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398,
++      0x53a6, 0x3318, 0x0078, 0x1b6f, 0x789b, 0x0020, 0x20a9, 0x0010,
++      0x78af, 0x0000, 0x78af, 0x0220, 0x0070, 0x1b88, 0x0078, 0x1b80,
++      0x7003, 0x0000, 0x1078, 0x1c87, 0x7004, 0xa084, 0x000f, 0xa085,
++      0x6280, 0x7806, 0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080,
++      0x780b, 0x0008, 0x7047, 0x387f, 0x7043, 0x0000, 0x127f, 0x2000,
++      0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0,
++      0xa105, 0x2012, 0x1078, 0x1c87, 0x007c, 0x2011, 0x0101, 0x20a9,
++      0x0009, 0x810b, 0x0070, 0x1bb6, 0x0078, 0x1bb1, 0xa18c, 0x0e00,
++      0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101,
++      0x20a9, 0x0005, 0x8213, 0x0070, 0x1bc7, 0x0078, 0x1bc2, 0xa294,
++      0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011,
++      0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x1bd8, 0x0078, 0x1bd3,
++      0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c,
++      0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c,
++      0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a,
++      0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022,
++      0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae,
++      0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061,
++      0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c,
++      0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a,
++      0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c,
++      0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x1c65,
++      0x2061, 0x5c00, 0x1078, 0x1c6d, 0x0040, 0x1c53, 0x20a9, 0x0000,
++      0x2061, 0x5b00, 0x0c7e, 0x1078, 0x1c6d, 0x0040, 0x1c3f, 0x0c7f,
++      0x8c60, 0x0070, 0x1c3d, 0x0078, 0x1c32, 0x0078, 0x1c65, 0x007f,
++      0xa082, 0x5b00, 0x2071, 0x3840, 0x70ba, 0x601c, 0xa085, 0x0800,
++      0x601e, 0x71b6, 0x60a7, 0x0000, 0x2001, 0x0004, 0x70a2, 0x1078,
++      0x1b44, 0x0078, 0x1c61, 0x2071, 0x3840, 0x601c, 0xa085, 0x0800,
++      0x601e, 0x71b6, 0x60a7, 0x0000, 0x2001, 0x0006, 0x70a2, 0x1078,
++      0x1b44, 0x2001, 0x0000, 0x0078, 0x1c67, 0x2001, 0x0001, 0x2091,
++      0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040,
++      0x1c84, 0x2060, 0x600c, 0xa306, 0x00c0, 0x1c81, 0x6008, 0xa206,
++      0x00c0, 0x1c81, 0x6010, 0xa106, 0x00c0, 0x1c81, 0xa006, 0x0078,
++      0x1c86, 0x6000, 0x0078, 0x1c6e, 0xa085, 0x0001, 0x007c, 0x2011,
++      0x3841, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084,
++      0x0100, 0x0040, 0x1c96, 0x2021, 0xff00, 0x2122, 0x007c, 0x0e7e,
++      0x68e4, 0xa08c, 0x0020, 0x0040, 0x1ce5, 0xa084, 0x0006, 0x00c0,
++      0x1ce5, 0x6010, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xa0f0, 0x3a80, 0x7004, 0xa084, 0x000a, 0x00c0, 0x1ce5, 0x7108,
++      0xa194, 0xff00, 0x0040, 0x1ce5, 0xa18c, 0x00ff, 0x7104, 0xa084,
++      0x0014, 0x00c0, 0x1cd2, 0x017e, 0x611c, 0xa18d, 0x0002, 0x611e,
++      0x017f, 0xa085, 0x0014, 0x7006, 0x2001, 0x000c, 0xa106, 0x0040,
++      0x1cce, 0x2100, 0x8003, 0x2008, 0x0078, 0x1ce2, 0x2009, 0x0019,
++      0x0078, 0x1ce2, 0x2011, 0x0000, 0x7000, 0xa084, 0xdfff, 0x7002,
++      0x7004, 0xa084, 0xffef, 0x7006, 0x017e, 0x611c, 0xa18d, 0x0002,
++      0x611e, 0x017f, 0x2100, 0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068,
++      0x1ce7, 0x007e, 0x2071, 0x0000, 0x7018, 0xa084, 0x0001, 0x00c0,
++      0x1cec, 0x007f, 0x2e08, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6,
++      0x70c3, 0x8002, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
++      0x007f, 0x2070, 0x007f, 0x0078, 0x1d03, 0x107e, 0x007e, 0x127e,
++      0x2091, 0x2300, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0xa594, 0x003f,
++      0xa484, 0x4000, 0x0040, 0x1d1a, 0xa784, 0x007c, 0x00c0, 0x3022,
++      0x1078, 0x1ce7, 0xa49c, 0x000f, 0xa382, 0x0004, 0x0050, 0x1d22,
++      0x1078, 0x1ce7, 0x8507, 0xa084, 0x000f, 0x0079, 0x1d27, 0x21a1,
++      0x2251, 0x2277, 0x24cf, 0x2787, 0x27cf, 0x2808, 0x2883, 0x28dd,
++      0x2962, 0x1d4d, 0x1d37, 0x1fb8, 0x208d, 0x2766, 0x1d37, 0x1078,
++      0x1ce7, 0x0018, 0x1d0a, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f,
++      0x007c, 0x7003, 0x0000, 0x703f, 0x0000, 0x7030, 0xa005, 0x0040,
++      0x1d4b, 0x7033, 0x0000, 0x0018, 0x1d0a, 0x705c, 0xa005, 0x00c0,
++      0x1df8, 0x70a0, 0xa084, 0x001f, 0x0079, 0x1d56, 0x1e18, 0x1d5e,
++      0x1d6c, 0x1d8d, 0x1db3, 0x1ddf, 0x1ddd, 0x1d5e, 0x7808, 0xa084,
++      0xfffd, 0x780a, 0x2009, 0x0046, 0x1078, 0x260f, 0x00c0, 0x1d6a,
++      0x7003, 0x0004, 0x0078, 0x1d39, 0x1078, 0x2fe4, 0x00c0, 0x1d8b,
++      0x70b4, 0x8007, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0x78ab,
++      0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009,
++      0x00f7, 0x1078, 0x260d, 0x00c0, 0x1d8b, 0x7003, 0x0004, 0x70c3,
++      0x000f, 0x7033, 0x3870, 0x0078, 0x1d39, 0x1078, 0x2fe4, 0x00c0,
++      0x1db1, 0x71b4, 0x8107, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010,
++      0xa18c, 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b,
++      0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078,
++      0x260d, 0x00c0, 0x1db1, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033,
++      0x3870, 0x0078, 0x1d39, 0x1078, 0x2fe4, 0x00c0, 0x1ddb, 0x71b4,
++      0x8107, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x0007,
++      0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab,
++      0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009,
++      0x00f7, 0x1078, 0x260d, 0x00c0, 0x1ddb, 0x7003, 0x0004, 0x70c3,
++      0x000f, 0x7033, 0x3870, 0x0078, 0x1d39, 0x0078, 0x1d8d, 0x1078,
++      0x2fe4, 0x00c0, 0x1d39, 0x70bc, 0x2068, 0x789b, 0x0010, 0x6f10,
++      0x1078, 0x2f11, 0x2c50, 0x6810, 0xa084, 0x001f, 0xa085, 0x0080,
++      0x78aa, 0x6e18, 0x2041, 0x0001, 0x2001, 0x0004, 0x0078, 0x1f41,
++      0x1078, 0x2fe4, 0x00c0, 0x1d39, 0x789b, 0x0010, 0x705c, 0x2068,
++      0x6f10, 0x1078, 0x2f11, 0x2c50, 0x6008, 0xa085, 0x0010, 0x600a,
++      0x6810, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x2031, 0x0020,
++      0x2041, 0x0001, 0x1078, 0x304b, 0x2001, 0x0003, 0x0078, 0x1f2c,
++      0x0018, 0x1d0a, 0x7440, 0xa485, 0x0000, 0x0040, 0x1e32, 0xa080,
++      0x3880, 0x2030, 0x7144, 0x8108, 0xa12a, 0x0048, 0x1e29, 0x2009,
++      0x3880, 0x2164, 0x6504, 0x85ff, 0x00c0, 0x1e3f, 0x8421, 0x00c0,
++      0x1e23, 0x7146, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x1d39,
++      0x7640, 0xa6b0, 0x3880, 0x7144, 0x2600, 0x0078, 0x1e2e, 0x7146,
++      0x2568, 0x2558, 0x753e, 0x2c50, 0x603c, 0xa085, 0x0000, 0x00c0,
++      0x1e3c, 0x6708, 0x7736, 0xa784, 0x033f, 0x0040, 0x1e75, 0xa784,
++      0x0021, 0x00c0, 0x1e3c, 0xa784, 0x0002, 0x0040, 0x1e5e, 0xa784,
++      0x0004, 0x0040, 0x1e3c, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008,
++      0x00c0, 0x1e3c, 0xa784, 0x0010, 0x00c0, 0x1e3c, 0xa184, 0x0200,
++      0x00c0, 0x1e3c, 0xa784, 0x0100, 0x0040, 0x1e75, 0x6018, 0xa005,
++      0x00c0, 0x1e3c, 0xa7bc, 0xfeff, 0x670a, 0x681f, 0x0000, 0x6e18,
++      0xa684, 0x000e, 0x6118, 0x0040, 0x1e85, 0x601c, 0xa102, 0x0048,
++      0x1e92, 0x0040, 0x1e92, 0x0078, 0x1e38, 0x81ff, 0x0040, 0x1e92,
++      0x6828, 0x8007, 0xa084, 0x00ff, 0xa082, 0x0003, 0x0040, 0x1e92,
++      0x00c0, 0x1e38, 0xa184, 0x0400, 0x00c0, 0x1ea1, 0x6130, 0xa18c,
++      0xff00, 0x810f, 0x6030, 0xa084, 0xff00, 0xa105, 0x6032, 0x0078,
++      0x1ea5, 0x6034, 0x603a, 0xa7bc, 0xfbff, 0xa784, 0x0080, 0x00c0,
++      0x1eab, 0x700c, 0x6022, 0xa7bc, 0xff7f, 0x670a, 0x6b10, 0x8307,
++      0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3a80, 0x2060,
++      0x2048, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x2a60, 0x0018,
++      0x1d0a, 0x789b, 0x0010, 0xa046, 0x1078, 0x2fe4, 0x00c0, 0x1d39,
++      0x6b10, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0x704c, 0xa084, 0x8000,
++      0x0040, 0x1ed6, 0xa684, 0x0001, 0x0040, 0x1ed8, 0xa39c, 0xffbf,
++      0xa684, 0x0010, 0x0040, 0x1ede, 0xa39d, 0x0020, 0x7baa, 0x8840,
++      0xa684, 0x000e, 0x00c0, 0x1ee9, 0xa7bd, 0x0010, 0x670a, 0x0078,
++      0x1f2a, 0x714c, 0xa18c, 0x0800, 0x0040, 0x2b74, 0x2011, 0x0021,
++      0x8004, 0x8004, 0x0048, 0x1f00, 0x2011, 0x0022, 0x8004, 0x0048,
++      0x1f00, 0x2011, 0x0020, 0x8004, 0x0048, 0x1f00, 0x0040, 0x1f2a,
++      0x7aaa, 0x8840, 0x1078, 0x2ffd, 0x6a10, 0x610c, 0x8108, 0xa18c,
++      0x00ff, 0xa1e0, 0x5b00, 0x2c64, 0x8cff, 0x0040, 0x1f21, 0x6010,
++      0xa206, 0x00c0, 0x1f0b, 0x60b4, 0x8001, 0x60b6, 0x00c0, 0x1f06,
++      0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078,
++      0x1e18, 0x1078, 0x2fe4, 0x00c0, 0x1d39, 0x2a60, 0x610e, 0x79aa,
++      0x8840, 0x712e, 0x2001, 0x0001, 0x007e, 0x7150, 0xa184, 0x0018,
++      0x0040, 0x1f40, 0xa184, 0x0010, 0x0040, 0x1f3a, 0x1078, 0x2d3d,
++      0x00c0, 0x1f40, 0xa184, 0x0008, 0x0040, 0x1f40, 0x1078, 0x2c58,
++      0x007f, 0x7002, 0xa68c, 0x0060, 0x88ff, 0x0040, 0x1f49, 0xa18d,
++      0x0004, 0x795a, 0x69b2, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b,
++      0x0061, 0x6814, 0xa085, 0x8000, 0x6816, 0x78aa, 0x157e, 0x137e,
++      0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
++      0x000a, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6810, 0x8007,
++      0x789b, 0x007e, 0x78aa, 0x6d90, 0x7dd6, 0x7dde, 0x6e94, 0x7ed2,
++      0x7eda, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1f78, 0x0098, 0x1f80,
++      0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2ffd, 0x0078, 0x1d41,
++      0x7200, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x1f8d, 0x781b,
++      0x0049, 0x1078, 0x2ffd, 0x0078, 0x1f9e, 0x6ab0, 0xa295, 0x2000,
++      0x7a5a, 0x781b, 0x0049, 0x1078, 0x2ffd, 0x7200, 0x2500, 0xa605,
++      0x0040, 0x1f9e, 0xa284, 0x0007, 0x1079, 0x1fae, 0xad80, 0x0008,
++      0x7032, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x1fac, 0x6018,
++      0x8000, 0x601a, 0x1078, 0x2b4b, 0x0078, 0x1d39, 0x1fb6, 0x3376,
++      0x3376, 0x3365, 0x3376, 0x1fb6, 0x1fb6, 0x1fb6, 0x1078, 0x1ce7,
++      0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e, 0x2079, 0x3800, 0x7898,
++      0x0f7f, 0xa084, 0x0001, 0x0040, 0x1fde, 0x70a0, 0xa086, 0x0001,
++      0x00c0, 0x1fcd, 0x70a2, 0x0078, 0x2071, 0x70a0, 0xa086, 0x0005,
++      0x00c0, 0x1fdc, 0x70bc, 0x2068, 0x6817, 0x0004, 0x6813, 0x0000,
++      0x681c, 0xa085, 0x0008, 0x681e, 0x70a3, 0x0000, 0x157e, 0x2011,
++      0x0004, 0x71a0, 0xa186, 0x0001, 0x0040, 0x2000, 0xa186, 0x0007,
++      0x00c0, 0x1ff0, 0x2009, 0x382b, 0x200b, 0x0005, 0x0078, 0x2000,
++      0x2009, 0x3813, 0x2104, 0x2009, 0x3812, 0x200a, 0x2009, 0x382b,
++      0x200b, 0x0001, 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x2002,
++      0x70a3, 0x0000, 0x1078, 0x314d, 0x20a9, 0x0010, 0x2039, 0x0000,
++      0x1078, 0x2e16, 0xa7b8, 0x0100, 0x0070, 0x2010, 0x0078, 0x2008,
++      0x7000, 0x2020, 0x0079, 0x2014, 0x2042, 0x202b, 0x202b, 0x201e,
++      0x2042, 0x2042, 0x201c, 0x201c, 0x1078, 0x1ce7, 0x2021, 0x3857,
++      0x2404, 0xa005, 0x0040, 0x202b, 0xad06, 0x00c0, 0x202b, 0x6800,
++      0x2022, 0x0078, 0x203b, 0x681c, 0xa084, 0x0001, 0x00c0, 0x2037,
++      0x6f10, 0x1078, 0x2f11, 0x1078, 0x2b06, 0x0078, 0x203b, 0x7054,
++      0x2060, 0x6800, 0x6002, 0x6a16, 0x681c, 0xa085, 0x0008, 0x681e,
++      0x1078, 0x18b6, 0x2021, 0x5c00, 0x1078, 0x2077, 0x2021, 0x3857,
++      0x1078, 0x2077, 0x20a9, 0x0000, 0x2021, 0x5b00, 0x1078, 0x2077,
++      0x8420, 0x0070, 0x2055, 0x0078, 0x204e, 0x1078, 0x2b55, 0x2061,
++      0x3b00, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0xa102,
++      0x6012, 0x601b, 0x0000, 0xace0, 0x0010, 0x0070, 0x2069, 0x0078,
++      0x205d, 0x2009, 0x382f, 0x200b, 0x0000, 0x8421, 0x00c0, 0x205b,
++      0x157f, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x1d39, 0x047e,
++      0x2404, 0xa005, 0x0040, 0x2089, 0x2068, 0x6800, 0x007e, 0x6a16,
++      0x681c, 0xa085, 0x0008, 0x681e, 0x1078, 0x18b6, 0x007f, 0x0078,
++      0x2079, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050,
++      0x2093, 0x1078, 0x1ce7, 0x2300, 0x0079, 0x2096, 0x2099, 0x210c,
++      0x211a, 0xa282, 0x0002, 0x0040, 0x209f, 0x1078, 0x1ce7, 0x70a0,
++      0x70a3, 0x0000, 0x70c3, 0x0000, 0x0079, 0x20a6, 0x20ae, 0x20ae,
++      0x20b0, 0x20e4, 0x2b7a, 0x20ae, 0x20e4, 0x20ae, 0x1078, 0x1ce7,
++      0x77b4, 0x1078, 0x2e16, 0x77b4, 0xa7bc, 0x0f00, 0x1078, 0x2f11,
++      0x6018, 0xa005, 0x0040, 0x20db, 0x2021, 0x5c00, 0x2009, 0x0004,
++      0x2011, 0x0010, 0x1078, 0x216a, 0x0040, 0x20db, 0x157e, 0x20a9,
++      0x0000, 0x2021, 0x5b00, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010,
++      0x1078, 0x216a, 0x047f, 0x0040, 0x20da, 0x8420, 0x0070, 0x20da,
++      0x0078, 0x20cb, 0x157f, 0x8738, 0xa784, 0x001f, 0x00c0, 0x20b6,
++      0x0078, 0x1d41, 0x0078, 0x1d41, 0x77b4, 0x1078, 0x2f11, 0x6018,
++      0xa005, 0x0040, 0x210a, 0x2021, 0x5c00, 0x2009, 0x0005, 0x2011,
++      0x0020, 0x1078, 0x216a, 0x0040, 0x210a, 0x157e, 0x20a9, 0x0000,
++      0x2021, 0x5b00, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078,
++      0x216a, 0x047f, 0x0040, 0x2109, 0x8420, 0x0070, 0x2109, 0x0078,
++      0x20fa, 0x157f, 0x0078, 0x1d41, 0x2200, 0x0079, 0x210f, 0x2112,
++      0x2114, 0x2114, 0x1078, 0x1ce7, 0x70a3, 0x0000, 0x70a7, 0x0001,
++      0x0078, 0x1d39, 0x2200, 0x0079, 0x211d, 0x2122, 0x2114, 0x2120,
++      0x1078, 0x1ce7, 0x1078, 0x261c, 0x70a0, 0xa086, 0x0002, 0x00c0,
++      0x2159, 0x77b4, 0x1078, 0x2e16, 0x77b4, 0xa7bc, 0x0f00, 0x1078,
++      0x2f11, 0x6018, 0xa005, 0x0040, 0x2154, 0x2021, 0x5c00, 0x2009,
++      0x0005, 0x2011, 0x0020, 0x1078, 0x216a, 0x0040, 0x2154, 0x157e,
++      0x20a9, 0x0000, 0x2021, 0x5b00, 0x047e, 0x2009, 0x0005, 0x2011,
++      0x0020, 0x1078, 0x216a, 0x047f, 0x0040, 0x2153, 0x8420, 0x0070,
++      0x2153, 0x0078, 0x2144, 0x157f, 0x8738, 0xa784, 0x001f, 0x00c0,
++      0x212f, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2acd, 0x1078, 0x2b1e,
++      0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2ac0, 0x0040, 0x2acd,
++      0x0078, 0x1e18, 0x2404, 0xa005, 0x0040, 0x219d, 0x2068, 0x2d04,
++      0x007e, 0x6810, 0xa706, 0x0040, 0x2179, 0x2d20, 0x007f, 0x0078,
++      0x216b, 0x007f, 0x2022, 0x6916, 0x6814, 0xa086, 0x0050, 0x00c0,
++      0x218c, 0x6817, 0x0006, 0x2200, 0xa086, 0x0010, 0x00c0, 0x218c,
++      0x681c, 0xa084, 0xffef, 0x681e, 0x681c, 0xa205, 0x681e, 0x1078,
++      0x18b6, 0x1078, 0x2b27, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084,
++      0xffef, 0x600a, 0x1078, 0x2b1e, 0x007c, 0xa085, 0x0001, 0x0078,
++      0x219c, 0x2300, 0x0079, 0x21a4, 0x21a9, 0x21a7, 0x21ec, 0x1078,
++      0x1ce7, 0x78e4, 0xa005, 0x00d0, 0x21cc, 0x0018, 0x21cc, 0x2008,
++      0xa084, 0x0030, 0x00c0, 0x21b8, 0x781b, 0x0049, 0x0078, 0x1d39,
++      0x78ec, 0xa084, 0x0003, 0x0040, 0x21b4, 0x2100, 0xa084, 0x0007,
++      0x0079, 0x21c2, 0x21da, 0x21e0, 0x21d4, 0x21ca, 0x2fde, 0x2fde,
++      0x21ca, 0x21e6, 0x1078, 0x1ce7, 0x7000, 0xa005, 0x0040, 0x1d41,
++      0x2001, 0x0003, 0x0078, 0x24e3, 0x1078, 0x2df9, 0x781b, 0x0055,
++      0x0078, 0x1d39, 0x1078, 0x2df9, 0x781b, 0x00dc, 0x0078, 0x1d39,
++      0x1078, 0x2df9, 0x781b, 0x00e3, 0x0078, 0x1d39, 0x1078, 0x2df9,
++      0x781b, 0x009d, 0x0078, 0x1d39, 0xa584, 0x000f, 0x00c0, 0x2216,
++      0x1078, 0x261c, 0x7000, 0x0079, 0x21f5, 0x21fd, 0x220a, 0x21fd,
++      0x2acd, 0x21ff, 0x2acd, 0x21fd, 0x21fd, 0x1078, 0x1ce7, 0x71a0,
++      0x70a3, 0x0000, 0xa186, 0x0004, 0x00c0, 0x2208, 0x0078, 0x2b7a,
++      0x0078, 0x2acd, 0x1078, 0x2b1e, 0x6008, 0xa084, 0xffef, 0x600a,
++      0x1078, 0x2ac0, 0x0040, 0x2acd, 0x0078, 0x1e18, 0x78e4, 0xa005,
++      0x00d0, 0x21cc, 0x0018, 0x21cc, 0x2008, 0xa084, 0x0030, 0x00c0,
++      0x2225, 0x781b, 0x0049, 0x0078, 0x1d39, 0x78ec, 0xa084, 0x0003,
++      0x0040, 0x2221, 0x2100, 0xa184, 0x0007, 0x0079, 0x222f, 0x223f,
++      0x2245, 0x2239, 0x2237, 0x2fde, 0x2fde, 0x2237, 0x2fd6, 0x1078,
++      0x1ce7, 0x1078, 0x2e01, 0x781b, 0x0055, 0x0078, 0x1d39, 0x1078,
++      0x2e01, 0x781b, 0x00dc, 0x0078, 0x1d39, 0x1078, 0x2e01, 0x781b,
++      0x00e3, 0x0078, 0x1d39, 0x1078, 0x2e01, 0x781b, 0x009d, 0x0078,
++      0x1d39, 0x2300, 0x0079, 0x2254, 0x2259, 0x2257, 0x225b, 0x1078,
++      0x1ce7, 0x0078, 0x2883, 0x6817, 0x0008, 0x78a3, 0x0000, 0x79e4,
++      0xa184, 0x0030, 0x0040, 0x2883, 0x78ec, 0xa084, 0x0003, 0x0040,
++      0x2883, 0xa184, 0x0007, 0x0079, 0x226d, 0x21da, 0x21e0, 0x21d4,
++      0x2fb6, 0x2fde, 0x2fde, 0x2275, 0x2fd6, 0x1078, 0x1ce7, 0xa282,
++      0x0005, 0x0050, 0x227d, 0x1078, 0x1ce7, 0x2300, 0x0079, 0x2280,
++      0x2283, 0x24b7, 0x24c3, 0x2200, 0x0079, 0x2286, 0x228b, 0x228d,
++      0x22a0, 0x228b, 0x249c, 0x1078, 0x1ce7, 0x789b, 0x0018, 0x78a8,
++      0xa084, 0x00ff, 0xa082, 0x0020, 0x0048, 0x2dda, 0xa08a, 0x0004,
++      0x00c8, 0x2dda, 0x0079, 0x229c, 0x2dda, 0x2dda, 0x2dda, 0x2d7c,
++      0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x22b5, 0xa184,
++      0x0018, 0x0040, 0x22b1, 0x0078, 0x2dda, 0x7000, 0xa005, 0x00c0,
++      0x22ab, 0x2011, 0x0003, 0x0078, 0x2970, 0xa184, 0x00ff, 0xa08c,
++      0x0080, 0x0040, 0x22e9, 0x7000, 0xa086, 0x0001, 0x00c0, 0x22c8,
++      0x1078, 0x2b1e, 0x1078, 0x314d, 0x7034, 0x600a, 0x0078, 0x22cd,
++      0x7000, 0xa086, 0x0003, 0x0040, 0x22c2, 0x7003, 0x0005, 0x2001,
++      0x5c10, 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003,
++      0x0000, 0x8000, 0x0070, 0x22de, 0x0078, 0x22d7, 0x157f, 0x6813,
++      0x0000, 0x68b3, 0x0700, 0x681f, 0x0800, 0x6823, 0x0003, 0x0078,
++      0x2dda, 0xa08a, 0x0010, 0x00c8, 0x2dda, 0x0079, 0x22ef, 0x2301,
++      0x22ff, 0x2317, 0x2319, 0x23ab, 0x2dda, 0x2dda, 0x23ad, 0x2dda,
++      0x2dda, 0x2498, 0x2498, 0x2dda, 0x2dda, 0x2dda, 0x249a, 0x1078,
++      0x1ce7, 0xa684, 0x1000, 0x0040, 0x230e, 0x2001, 0x0300, 0x8000,
++      0x8000, 0x783a, 0x781b, 0x009a, 0x0078, 0x1d39, 0x6814, 0xa084,
++      0x8000, 0x0040, 0x2315, 0x6817, 0x0003, 0x0078, 0x2fb6, 0x1078,
++      0x1ce7, 0x691c, 0x691e, 0xa684, 0x1800, 0x00c0, 0x2333, 0x681c,
++      0xa084, 0x0001, 0x00c0, 0x233b, 0x6814, 0xa086, 0x0008, 0x00c0,
++      0x232b, 0x6817, 0x0000, 0xa684, 0x0400, 0x0040, 0x23a7, 0x781b,
++      0x0058, 0x0078, 0x1d39, 0xa684, 0x1000, 0x0040, 0x233b, 0x781b,
++      0x0058, 0x0078, 0x1d39, 0xa684, 0x0060, 0x0040, 0x23a3, 0xa684,
++      0x0800, 0x0040, 0x23a3, 0xa684, 0x8000, 0x00c0, 0x2349, 0x0078,
++      0x2363, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb2, 0x789b, 0x0074, 0x7aac,
++      0x79ac, 0x78ac, 0x801b, 0x00c8, 0x2356, 0x8000, 0xa084, 0x003f,
++      0xa108, 0xa291, 0x0000, 0x6b94, 0x2100, 0xa302, 0x68ae, 0x6b90,
++      0x2200, 0xa303, 0x68aa, 0xa684, 0x4000, 0x0040, 0x236b, 0xa6b4,
++      0xbfff, 0x7e5a, 0x6eb2, 0x7000, 0xa086, 0x0003, 0x00c0, 0x2378,
++      0x1078, 0x31c0, 0x1078, 0x3365, 0x781b, 0x0067, 0x0078, 0x1d39,
++      0xa006, 0x1078, 0x3414, 0x6aac, 0x69a8, 0x6c94, 0x6b90, 0x2200,
++      0xa105, 0x0040, 0x2387, 0x2200, 0xa422, 0x2100, 0xa31b, 0x7cd2,
++      0x7bd6, 0x2300, 0xa405, 0x00c0, 0x2395, 0xa6b5, 0x4000, 0x7e5a,
++      0x6eb2, 0x781b, 0x0067, 0x0078, 0x1d39, 0x781b, 0x0067, 0x2200,
++      0xa115, 0x00c0, 0x239f, 0x1078, 0x3376, 0x0078, 0x1d39, 0x1078,
++      0x339d, 0x0078, 0x1d39, 0x781b, 0x006a, 0x0078, 0x1d39, 0x781b,
++      0x0058, 0x0078, 0x1d39, 0x1078, 0x1ce7, 0x0078, 0x240a, 0x691c,
++      0xa184, 0x0100, 0x0040, 0x23c5, 0xa18c, 0xfeff, 0x691e, 0x0c7e,
++      0x7048, 0x2060, 0x6000, 0xa084, 0xefff, 0x6002, 0x6004, 0xa084,
++      0xfff5, 0x6006, 0x0c7f, 0x0078, 0x23f9, 0xa184, 0x0200, 0x0040,
++      0x23f9, 0xa18c, 0xfdff, 0x691e, 0x0c7e, 0x7048, 0x2060, 0x6000,
++      0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef, 0x6006, 0x2008,
++      0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x23f9, 0x1078, 0x2f0d,
++      0x1078, 0x2c58, 0x88ff, 0x0040, 0x23f9, 0x789b, 0x0060, 0x2800,
++      0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++      0x23f5, 0x781b, 0x0055, 0x0078, 0x1d39, 0x781b, 0x0069, 0x0078,
++      0x1d39, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2402, 0x781b, 0x0058,
++      0x0078, 0x1d39, 0x781b, 0x006a, 0x0078, 0x1d39, 0x0078, 0x2de0,
++      0x0078, 0x2de0, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040,
++      0x2408, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
++      0x00c0, 0x242d, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
++      0x2425, 0x0048, 0x2425, 0x0078, 0x2427, 0x0078, 0x23af, 0x24a8,
++      0x7aa8, 0x00f0, 0x2427, 0x0078, 0x2413, 0xa284, 0x00f0, 0xa086,
++      0x0020, 0x00c0, 0x2489, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040,
++      0x243d, 0x0048, 0x243d, 0x0078, 0x2486, 0xa286, 0x0023, 0x0040,
++      0x2408, 0x6818, 0xa084, 0xfff1, 0x681a, 0x7e58, 0xa684, 0xfff1,
++      0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, 0x0010, 0x600a,
++      0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184,
++      0x0010, 0x0040, 0x2461, 0x1078, 0x2f0d, 0x1078, 0x2d3d, 0x0078,
++      0x2470, 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f,
++      0xa184, 0x0008, 0x0040, 0x23f9, 0x1078, 0x2f0d, 0x1078, 0x2c58,
++      0x88ff, 0x0040, 0x23f9, 0x789b, 0x0060, 0x2800, 0x78aa, 0xa6b5,
++      0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2482, 0x781b, 0x0055,
++      0x0078, 0x1d39, 0x781b, 0x0069, 0x0078, 0x1d39, 0x7aa8, 0x0078,
++      0x2413, 0x8318, 0x2300, 0xa102, 0x0040, 0x2492, 0x0048, 0x2492,
++      0x0078, 0x2413, 0xa284, 0x0080, 0x00c0, 0x2de6, 0x0078, 0x2de0,
++      0x0078, 0x2de6, 0x0078, 0x2dda, 0x789b, 0x0018, 0x78a8, 0xa084,
++      0x00ff, 0xa08e, 0x0001, 0x0040, 0x24a7, 0x1078, 0x1ce7, 0x7aa8,
++      0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8,
++      0x2dda, 0x0079, 0x24b3, 0x2dda, 0x2bab, 0x2dda, 0x2cd8, 0xa282,
++      0x0000, 0x00c0, 0x24bd, 0x1078, 0x1ce7, 0x1078, 0x2df9, 0x781b,
++      0x0069, 0x0078, 0x1d39, 0xa282, 0x0003, 0x00c0, 0x24c9, 0x1078,
++      0x1ce7, 0x1078, 0x2e09, 0x781b, 0x0069, 0x0078, 0x1d39, 0xa282,
++      0x0004, 0x0050, 0x24d5, 0x1078, 0x1ce7, 0x2300, 0x0079, 0x24d8,
++      0x24db, 0x25c6, 0x25f7, 0xa286, 0x0003, 0x0040, 0x24e1, 0x1078,
++      0x1ce7, 0x2001, 0x0000, 0x703a, 0x7000, 0xa084, 0x0007, 0x0079,
++      0x24e9, 0x24f1, 0x24f3, 0x24f3, 0x2703, 0x274c, 0x26cd, 0x24f1,
++      0x24f1, 0x1078, 0x1ce7, 0xa684, 0x1000, 0x00c0, 0x24fb, 0x1078,
++      0x314d, 0x0040, 0x25a0, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2557,
++      0xa186, 0x0008, 0x00c0, 0x2512, 0x6008, 0xa084, 0xffef, 0x600a,
++      0x1078, 0x2ac0, 0x0040, 0x2557, 0x1078, 0x2b1e, 0x1078, 0x314d,
++      0x0078, 0x253e, 0xa186, 0x0028, 0x00c0, 0x2557, 0x1078, 0x314d,
++      0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2b34, 0x6018, 0xa005,
++      0x0040, 0x253e, 0x8001, 0x601a, 0xa005, 0x0040, 0x2534, 0x8001,
++      0xa005, 0x0040, 0x2534, 0x601e, 0x0078, 0x253e, 0x6813, 0x0028,
++      0x6817, 0x0000, 0x0078, 0x25b5, 0x6030, 0xa084, 0x00ff, 0xa005,
++      0x0040, 0x252e, 0x6008, 0xa085, 0x0200, 0x600a, 0x681c, 0xa084,
++      0x0001, 0x0040, 0x1d41, 0x681c, 0xa084, 0xfffe, 0x681e, 0x7054,
++      0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005,
++      0x2d00, 0x00c0, 0x2554, 0x6002, 0x6006, 0x0078, 0x1d41, 0x017e,
++      0x1078, 0x261c, 0x017f, 0xa684, 0xdf00, 0x681a, 0x6827, 0x0000,
++      0x6f10, 0x81ff, 0x0040, 0x25a0, 0xa186, 0x0002, 0x00c0, 0x2598,
++      0xa684, 0x0800, 0x00c0, 0x2574, 0xa684, 0x0060, 0x0040, 0x2574,
++      0x78d8, 0x7adc, 0x682e, 0x6a2a, 0x8717, 0xa294, 0x000f, 0x8213,
++      0x8213, 0x8213, 0xa290, 0x3a80, 0xa290, 0x0000, 0x221c, 0xa384,
++      0x0100, 0x00c0, 0x2585, 0x0078, 0x258b, 0x8210, 0x2204, 0xa085,
++      0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2598, 0x689c,
++      0xa084, 0x0100, 0x00c0, 0x2598, 0x1078, 0x268c, 0x0078, 0x1d41,
++      0xa186, 0x0018, 0x0040, 0x25a0, 0xa186, 0x0014, 0x0040, 0x1d41,
++      0x6912, 0x6814, 0xa084, 0x8000, 0x0040, 0x25a8, 0x7038, 0x6816,
++      0xa68c, 0xdf00, 0x691a, 0x1078, 0x2b0d, 0x1078, 0x2b1e, 0x00c0,
++      0x25b5, 0x6008, 0xa084, 0xffef, 0x600a, 0x681c, 0xa084, 0x0001,
++      0x00c0, 0x25be, 0x1078, 0x2b06, 0x0078, 0x25c2, 0x7054, 0x2060,
++      0x6800, 0x6002, 0x1078, 0x18b6, 0x0078, 0x1d41, 0xa282, 0x0004,
++      0x0048, 0x25cc, 0x1078, 0x1ce7, 0x2200, 0x0079, 0x25cf, 0x25d3,
++      0x25d5, 0x25e2, 0x25d5, 0x1078, 0x1ce7, 0x7000, 0xa086, 0x0005,
++      0x0040, 0x25de, 0x1078, 0x2df9, 0x781b, 0x0069, 0x781b, 0x006a,
++      0x0078, 0x1d39, 0x7890, 0x8007, 0x8001, 0xa084, 0x0007, 0xa080,
++      0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186, 0x0003, 0x0040,
++      0x25f3, 0x0078, 0x2dda, 0x781b, 0x006a, 0x0078, 0x1d39, 0x681c,
++      0xa085, 0x0004, 0x681e, 0x82ff, 0x00c0, 0x2602, 0x1078, 0x2df9,
++      0x0078, 0x2609, 0x8211, 0x0040, 0x2607, 0x1078, 0x1ce7, 0x1078,
++      0x2e09, 0x781b, 0x0069, 0x0078, 0x1d39, 0x1078, 0x2ffd, 0x7830,
++      0xa084, 0x00c0, 0x00c0, 0x2619, 0x0018, 0x2619, 0x791a, 0xa006,
++      0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060, 0x00c0, 0x2626,
++      0x682f, 0x0000, 0x682b, 0x0000, 0x0078, 0x268b, 0xa684, 0x0800,
++      0x00c0, 0x2635, 0x68b0, 0xa084, 0x4800, 0xa635, 0xa684, 0x0800,
++      0x00c0, 0x2635, 0x1078, 0x314d, 0x007c, 0xa684, 0x0020, 0x0040,
++      0x265f, 0x78d0, 0x8003, 0x00c8, 0x2643, 0xa006, 0x1078, 0x3414,
++      0x78d4, 0x1078, 0x3479, 0xa684, 0x4000, 0x0040, 0x264d, 0x682f,
++      0x0000, 0x682b, 0x0000, 0x0078, 0x2632, 0x68b0, 0xa084, 0x4800,
++      0xa635, 0xa684, 0x4000, 0x00c0, 0x2647, 0x7038, 0xa005, 0x00c0,
++      0x2659, 0x79d8, 0x7adc, 0x692e, 0x6a2a, 0x0078, 0x2632, 0xa684,
++      0x4000, 0x0040, 0x2669, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078,
++      0x2632, 0x68b0, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0,
++      0x2663, 0x7038, 0xa005, 0x00c0, 0x2675, 0x79d8, 0x7adc, 0x78d0,
++      0x80f3, 0x00c8, 0x267c, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
++      0x0000, 0x692e, 0x6a2a, 0x2100, 0xa205, 0x00c0, 0x2689, 0x0078,
++      0x2632, 0x1078, 0x3414, 0x007c, 0xa384, 0x0200, 0x0040, 0x2694,
++      0x6008, 0xa085, 0x0002, 0x600a, 0x6817, 0x0006, 0x6a28, 0x692c,
++      0x6a3a, 0x693e, 0x682b, 0x0300, 0x682f, 0x0000, 0x6833, 0x2000,
++      0x6893, 0x0000, 0x6897, 0x0020, 0x7000, 0x0079, 0x26a7, 0x26af,
++      0x26b1, 0x26ba, 0x26af, 0x26af, 0x26af, 0x26af, 0x26af, 0x1078,
++      0x1ce7, 0x681c, 0xa084, 0x0001, 0x00c0, 0x26ba, 0x1078, 0x2b06,
++      0x0078, 0x26c0, 0x7054, 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60,
++      0x2021, 0x3857, 0x2404, 0xa005, 0x0040, 0x26c9, 0x2020, 0x0078,
++      0x26c2, 0x2d22, 0x206b, 0x0000, 0x007c, 0x77b4, 0x1078, 0x2e16,
++      0xa7bc, 0x0f00, 0x1078, 0x2f11, 0x6018, 0xa005, 0x0040, 0x26fc,
++      0x0d7e, 0x2001, 0x5c10, 0x2068, 0x0d7f, 0x2021, 0x5c00, 0x2009,
++      0x0004, 0x2011, 0x0010, 0x1078, 0x216a, 0x0040, 0x26fc, 0x157e,
++      0x20a9, 0x0000, 0x2021, 0x5b00, 0x047e, 0x2009, 0x0004, 0x2011,
++      0x0010, 0x1078, 0x216a, 0x047f, 0x0040, 0x26fb, 0x8420, 0x0070,
++      0x26fb, 0x0078, 0x26ec, 0x157f, 0x8738, 0xa784, 0x001f, 0x00c0,
++      0x26d2, 0x0078, 0x1d41, 0x1078, 0x2b0d, 0x1078, 0x2b1e, 0x6827,
++      0x0000, 0x789b, 0x000e, 0x6f10, 0x1078, 0x344a, 0x017e, 0xad88,
++      0x0010, 0xa188, 0x0006, 0x2104, 0x017f, 0x8007, 0xa084, 0x00ff,
++      0xa082, 0x0047, 0x0040, 0x271e, 0x0078, 0x272f, 0x0c7e, 0x6810,
++      0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0, 0x3a80,
++      0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x1078, 0x2f6b, 0x6813,
++      0x0002, 0xa684, 0x0800, 0x0040, 0x2739, 0x6918, 0xa18d, 0x2000,
++      0x691a, 0x6814, 0xa084, 0x8000, 0x0040, 0x2740, 0x6817, 0x0000,
++      0x2021, 0x3857, 0x6800, 0x2022, 0x6a38, 0x693c, 0x6a2a, 0x692e,
++      0x1078, 0x18b6, 0x0078, 0x1d41, 0x1078, 0x261c, 0x6827, 0x0000,
++      0x789b, 0x000e, 0x6f10, 0x1078, 0x3002, 0xa08c, 0x00ff, 0x6912,
++      0x6814, 0xa084, 0x8000, 0x0040, 0x275f, 0x7038, 0x6816, 0xa68c,
++      0xdf00, 0x691a, 0x70a3, 0x0000, 0x0078, 0x1d41, 0xa006, 0x1078,
++      0x314d, 0x6813, 0x0000, 0x6817, 0x0001, 0xa68c, 0xdf00, 0x691a,
++      0x6827, 0x0000, 0x7000, 0x0079, 0x2775, 0x277d, 0x277f, 0x277f,
++      0x2781, 0x2781, 0x2781, 0x277d, 0x277d, 0x1078, 0x1ce7, 0x1078,
++      0x2b1e, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x2ad8, 0x2300,
++      0x0079, 0x278a, 0x278d, 0x278f, 0x27cd, 0x1078, 0x1ce7, 0x7000,
++      0x0079, 0x2792, 0x279a, 0x279c, 0x279c, 0x27a7, 0x279c, 0x27ae,
++      0x279a, 0x279a, 0x1078, 0x1ce7, 0xa684, 0x2000, 0x00c0, 0x27a7,
++      0xa6b5, 0x2000, 0x7e5a, 0x1078, 0x3376, 0x0078, 0x2fb6, 0x6814,
++      0xa084, 0x8000, 0x0040, 0x27ae, 0x6817, 0x0007, 0x2009, 0x3818,
++      0x210c, 0xa186, 0x0000, 0x0040, 0x27c3, 0xa186, 0x0001, 0x0040,
++      0x27c7, 0x2009, 0x382b, 0x200b, 0x000b, 0x70a3, 0x0001, 0x781b,
++      0x0046, 0x0078, 0x1d39, 0x781b, 0x00dd, 0x0078, 0x1d39, 0x2009,
++      0x382b, 0x200b, 0x000a, 0x0078, 0x1d39, 0x1078, 0x1ce7, 0x2300,
++      0x0079, 0x27d2, 0x27d5, 0x27d7, 0x27fa, 0x1078, 0x1ce7, 0x7000,
++      0x0079, 0x27da, 0x27e2, 0x27e4, 0x27e4, 0x27ef, 0x27e4, 0x27f6,
++      0x27e2, 0x27e2, 0x1078, 0x1ce7, 0xa684, 0x2000, 0x00c0, 0x27ef,
++      0xa6b5, 0x2000, 0x7e5a, 0x1078, 0x3376, 0x0078, 0x2fb6, 0x6814,
++      0xa084, 0x8000, 0x0040, 0x27f6, 0x6817, 0x0007, 0x781b, 0x00e4,
++      0x0078, 0x1d39, 0x681c, 0xa085, 0x0004, 0x681e, 0x1078, 0x2f6b,
++      0xa6b5, 0x0800, 0x1078, 0x2df9, 0x781b, 0x0069, 0x0078, 0x1d39,
++      0x2300, 0x0079, 0x280b, 0x280e, 0x2810, 0x2812, 0x1078, 0x1ce7,
++      0x1078, 0x1ce7, 0xa684, 0x0400, 0x00c0, 0x2831, 0x782b, 0x3009,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4,
++      0xa184, 0x0020, 0x0040, 0x2829, 0x78ec, 0xa084, 0x0003, 0x00c0,
++      0x282d, 0x2001, 0x0014, 0x0078, 0x24e3, 0xa184, 0x0007, 0x0079,
++      0x2869, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff,
++      0x0040, 0x2867, 0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0,
++      0x2858, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, 0x284b, 0x2009,
++      0xfff7, 0x0078, 0x2851, 0xa386, 0x0003, 0x00c0, 0x2858, 0x2009,
++      0xffef, 0x0c7e, 0x7048, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b,
++      0x3009, 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x691e, 0x0078,
++      0x2fb6, 0x21da, 0x21e0, 0x2873, 0x287b, 0x2871, 0x2871, 0x2871,
++      0x2fb6, 0x1078, 0x1ce7, 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++      0x691e, 0x0078, 0x2fbe, 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++      0x691e, 0x0078, 0x2fb6, 0x79e4, 0xa184, 0x0030, 0x0040, 0x288d,
++      0x78ec, 0xa084, 0x0003, 0x00c0, 0x2895, 0x6814, 0xa085, 0x8000,
++      0x6816, 0x2001, 0x0014, 0x0078, 0x24e3, 0xa184, 0x0007, 0x0079,
++      0x2899, 0x2fb6, 0x2fb6, 0x28a1, 0x2fb6, 0x2fde, 0x2fde, 0x2fb6,
++      0x2fb6, 0xa684, 0x0400, 0x00c0, 0x28d2, 0x681c, 0xa084, 0x0001,
++      0x0040, 0x2fbe, 0xa68c, 0x2060, 0xa18c, 0xfffb, 0x795a, 0x69b2,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6814, 0xa085,
++      0x8000, 0x6816, 0x78aa, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012c,
++      0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000a, 0x2098, 0x53a6,
++      0x147f, 0x137f, 0x157f, 0x6810, 0x8007, 0x789b, 0x007e, 0x78aa,
++      0x0078, 0x2fbe, 0x6814, 0xa084, 0x8000, 0x0040, 0x28d9, 0x6817,
++      0x0008, 0x781b, 0x00d8, 0x0078, 0x1d39, 0x2300, 0x0079, 0x28e0,
++      0x28e5, 0x2960, 0x28e3, 0x1078, 0x1ce7, 0x7000, 0xa084, 0x0007,
++      0x0079, 0x28ea, 0x28f2, 0x28f4, 0x2910, 0x28f2, 0x28f2, 0x26cd,
++      0x28f2, 0x28f2, 0x1078, 0x1ce7, 0x691c, 0xa18d, 0x0001, 0x691e,
++      0x6800, 0x6006, 0xa005, 0x00c0, 0x28fe, 0x6002, 0x6818, 0xa084,
++      0x000e, 0x0040, 0x290a, 0x7014, 0x68b6, 0x712c, 0xa188, 0x5b00,
++      0x0078, 0x290c, 0x2009, 0x5c00, 0x2104, 0x6802, 0x2d0a, 0x7156,
++      0x6eb2, 0xa684, 0x0060, 0x0040, 0x295e, 0xa684, 0x0800, 0x00c0,
++      0x2922, 0xa684, 0x7fff, 0x68b2, 0x6890, 0x6894, 0x1078, 0x314d,
++      0x0078, 0x295e, 0xa684, 0x0020, 0x0040, 0x2934, 0xa006, 0x1078,
++      0x3414, 0x78d0, 0x8003, 0x00c8, 0x2930, 0x78d4, 0x1078, 0x3479,
++      0x79d8, 0x7adc, 0x0078, 0x2938, 0x1078, 0x2f1e, 0x1078, 0x3414,
++      0xa684, 0x8000, 0x0040, 0x295e, 0xa684, 0x7fff, 0x68b2, 0x789b,
++      0x0074, 0x1078, 0x3002, 0x2010, 0x1078, 0x3002, 0x2008, 0xa684,
++      0x0020, 0x00c0, 0x2956, 0x1078, 0x3002, 0x801b, 0x00c8, 0x2951,
++      0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b94, 0x2100,
++      0xa302, 0x68ae, 0x6b90, 0x2200, 0xa303, 0x68aa, 0x0078, 0x1d41,
++      0x0078, 0x2de6, 0x7033, 0x0000, 0xa282, 0x0005, 0x0050, 0x296a,
++      0x1078, 0x1ce7, 0x2300, 0x0079, 0x296d, 0x2970, 0x297a, 0x299d,
++      0x2200, 0x0079, 0x2973, 0x2978, 0x2de6, 0x2978, 0x29c6, 0x2a17,
++      0x1078, 0x1ce7, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2987, 0x1078,
++      0x2b1e, 0x1078, 0x314d, 0x7034, 0x600a, 0x0078, 0x298c, 0x7000,
++      0xa086, 0x0003, 0x0040, 0x2981, 0x7003, 0x0005, 0x2001, 0x5c10,
++      0x2068, 0x703e, 0x7032, 0x2200, 0x0079, 0x2996, 0x2de6, 0x299b,
++      0x29c6, 0x299b, 0x2de6, 0x1078, 0x1ce7, 0x7000, 0xa086, 0x0001,
++      0x00c0, 0x29aa, 0x1078, 0x2b1e, 0x1078, 0x314d, 0x7034, 0x600a,
++      0x0078, 0x29af, 0x7000, 0xa086, 0x0003, 0x0040, 0x29a4, 0x7003,
++      0x0005, 0x2001, 0x5c10, 0x2068, 0x703e, 0x7032, 0x2200, 0x0079,
++      0x29b9, 0x29c0, 0x29be, 0x29c0, 0x29be, 0x29c0, 0x1078, 0x1ce7,
++      0x1078, 0x2e09, 0x781b, 0x0069, 0x0078, 0x1d39, 0x7000, 0xa086,
++      0x0001, 0x00c0, 0x29d3, 0x1078, 0x2b1e, 0x1078, 0x314d, 0x7034,
++      0x600a, 0x0078, 0x29d8, 0x7000, 0xa086, 0x0003, 0x0040, 0x29cd,
++      0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
++      0xa484, 0x001f, 0xa215, 0x2069, 0x5c00, 0x2d04, 0x2d08, 0x7156,
++      0x2068, 0xa005, 0x0040, 0x29f3, 0x6810, 0xa206, 0x0040, 0x2a0c,
++      0x6800, 0x0078, 0x29e6, 0x7003, 0x0005, 0x2001, 0x5c10, 0x2068,
++      0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000,
++      0x0070, 0x2a04, 0x0078, 0x29fd, 0x157f, 0x6a12, 0x68b3, 0x0700,
++      0x681f, 0x0800, 0x6823, 0x0003, 0x6eb0, 0x7e5a, 0x681c, 0xa084,
++      0x0c00, 0x0040, 0x2a6d, 0x1078, 0x2e01, 0x0078, 0x2a6d, 0x7000,
++      0xa086, 0x0001, 0x00c0, 0x2a24, 0x1078, 0x2b1e, 0x1078, 0x314d,
++      0x7034, 0x600a, 0x0078, 0x2a29, 0x7000, 0xa086, 0x0003, 0x0040,
++      0x2a1e, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
++      0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c, 0x00ff,
++      0xa1e8, 0x5b00, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005, 0x0040,
++      0x2a48, 0x6810, 0xa206, 0x0040, 0x2a61, 0x6800, 0x0078, 0x2a3b,
++      0x7003, 0x0005, 0x2001, 0x5c10, 0x2068, 0x703e, 0x7032, 0x157e,
++      0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x2a59, 0x0078,
++      0x2a52, 0x157f, 0x6a12, 0x68b3, 0x0700, 0x681f, 0x0800, 0x6823,
++      0x0003, 0x6eb0, 0x7e5a, 0x681c, 0xa084, 0x0c00, 0x0040, 0x2a6d,
++      0x1078, 0x2dfd, 0x7e58, 0x0078, 0x2a6d, 0x027e, 0x8207, 0xa084,
++      0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3a80, 0x2060, 0x704a,
++      0x6000, 0x704e, 0x6004, 0x7052, 0xa684, 0x0060, 0x0040, 0x2aa4,
++      0x6b94, 0x6c90, 0x69a8, 0x68ac, 0xa105, 0x00c0, 0x2a92, 0x7bd2,
++      0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff, 0x7e5a, 0x1078, 0x3376,
++      0x0078, 0x2aa4, 0x68ac, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305,
++      0x0040, 0x2aa4, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68ac, 0xa6b4,
++      0xbfff, 0x7e5a, 0x1078, 0x339d, 0x077f, 0x1078, 0x2f11, 0x2009,
++      0x006a, 0xa684, 0x0008, 0x0040, 0x2aaf, 0x2009, 0x0069, 0xa6b5,
++      0x2000, 0x7e5a, 0x791a, 0x2d00, 0x703e, 0x8207, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa080, 0x3a80, 0x2048, 0x0078, 0x1d39,
++      0x6020, 0xa005, 0x0040, 0x2acc, 0x8001, 0x6022, 0x6008, 0xa085,
++      0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006, 0x1078, 0x314d,
++      0x6813, 0x0000, 0x6817, 0x0001, 0x681f, 0x0040, 0x681b, 0x0100,
++      0x7000, 0xa084, 0x0007, 0x0079, 0x2add, 0x2ae5, 0x2ae7, 0x2ae7,
++      0x2b02, 0x2aef, 0x2ae5, 0x2ae5, 0x2ae5, 0x1078, 0x1ce7, 0x1078,
++      0x2b0d, 0x1078, 0x2b06, 0x1078, 0x18b6, 0x0078, 0x1d41, 0x70a0,
++      0x70a3, 0x0000, 0x0079, 0x2af4, 0x2afe, 0x2afe, 0x2afc, 0x2afc,
++      0x2afc, 0x2afe, 0x2afc, 0x2afe, 0x0079, 0x20a6, 0x70a3, 0x0000,
++      0x0078, 0x1d41, 0x6817, 0x0000, 0x0078, 0x2703, 0x6800, 0xa005,
++      0x00c0, 0x2b0b, 0x6002, 0x6006, 0x007c, 0x1078, 0x2b27, 0x6010,
++      0xa005, 0x0040, 0x2b18, 0x8001, 0x00d0, 0x2b18, 0x1078, 0x1ce7,
++      0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x1078, 0x2b34,
++      0x6018, 0xa005, 0x0040, 0x2b26, 0x8001, 0x601a, 0x007c, 0x017e,
++      0x007e, 0x2009, 0x382e, 0x2104, 0xa005, 0x0040, 0x2b31, 0x8001,
++      0x200a, 0x007f, 0x017f, 0x007c, 0x017e, 0x007e, 0x2009, 0x382f,
++      0x2104, 0xa005, 0x0040, 0x2b3e, 0x8001, 0x200a, 0x007f, 0x017f,
++      0x007c, 0x017e, 0x007e, 0x2009, 0x3830, 0x2104, 0x8000, 0x200a,
++      0x007f, 0x017f, 0x007c, 0x017e, 0x007e, 0x2009, 0x382f, 0x2104,
++      0x8000, 0x200a, 0x007f, 0x017f, 0x007c, 0x027e, 0x037e, 0x007e,
++      0x2009, 0x382e, 0x2114, 0x2019, 0x382f, 0x2304, 0xa202, 0x200a,
++      0x201b, 0x0000, 0x2009, 0x3830, 0x007f, 0x037f, 0x027f, 0x007c,
++      0x1078, 0x2ffd, 0x6817, 0x0018, 0x0078, 0x2b98, 0x1078, 0x2ffd,
++      0x6817, 0x0019, 0x0078, 0x2b98, 0x1078, 0x2ffd, 0x6817, 0x001a,
++      0x0078, 0x2b98, 0x77b4, 0x1078, 0x2f11, 0x71b8, 0xa18c, 0x00ff,
++      0xa1e8, 0x5b00, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, 0x2b8a,
++      0x0078, 0x1d41, 0x6810, 0x72b4, 0xa206, 0x0040, 0x2b92, 0x6800,
++      0x0078, 0x2b83, 0x6800, 0x200a, 0x6817, 0x0005, 0x70bf, 0x0000,
++      0x1078, 0x2b0d, 0x681c, 0xa084, 0x0001, 0x00c0, 0x2ba1, 0x1078,
++      0x2b06, 0x1078, 0x2b1e, 0x681b, 0x0000, 0x681f, 0x0020, 0x1078,
++      0x18b6, 0x0078, 0x1d41, 0xa282, 0x0003, 0x00c0, 0x2dda, 0x7da8,
++      0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x691c, 0xa18d, 0x0080,
++      0x691e, 0xa184, 0x0100, 0x0040, 0x2c0b, 0xa18c, 0xfeff, 0x691e,
++      0xa6b4, 0x00ff, 0x0040, 0x2bf5, 0xa682, 0x000f, 0x0048, 0x2bcc,
++      0x0040, 0x2bcc, 0x2031, 0x000f, 0x852b, 0x852b, 0x1078, 0x2e94,
++      0x0040, 0x2bd6, 0x1078, 0x2ca4, 0x0078, 0x2bfe, 0x1078, 0x2e4f,
++      0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x2cc8,
++      0x0c7f, 0x691c, 0xa18d, 0x0100, 0x691e, 0x7e58, 0xa6b5, 0x0004,
++      0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2bf1, 0x781b, 0x0055, 0x0078,
++      0x1d39, 0x781b, 0x0069, 0x0078, 0x1d39, 0x0c7e, 0x2960, 0x6004,
++      0xa084, 0xfff5, 0x6006, 0x1078, 0x2cc8, 0x0c7f, 0x7e58, 0xa684,
++      0x0400, 0x00c0, 0x2c07, 0x781b, 0x0058, 0x0078, 0x1d39, 0x781b,
++      0x006a, 0x0078, 0x1d39, 0x0c7e, 0x7048, 0x2060, 0x6100, 0xa18c,
++      0x1000, 0x0040, 0x2c4b, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282,
++      0x000f, 0x0048, 0x2c1f, 0x0040, 0x2c1f, 0x2011, 0x000f, 0x2600,
++      0xa202, 0x00c8, 0x2c24, 0x2230, 0x6208, 0xa294, 0x00ff, 0x7018,
++      0xa086, 0x0028, 0x00c0, 0x2c34, 0xa282, 0x0019, 0x00c8, 0x2c3a,
++      0x2011, 0x0019, 0x0078, 0x2c3a, 0xa282, 0x000c, 0x00c8, 0x2c3a,
++      0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x2c3f, 0x2228, 0x1078,
++      0x2e53, 0x852b, 0x852b, 0x1078, 0x2e94, 0x0040, 0x2c4b, 0x1078,
++      0x2ca4, 0x0078, 0x2c4f, 0x1078, 0x2e4f, 0x1078, 0x2cc8, 0x7858,
++      0xa085, 0x0004, 0x785a, 0x0c7f, 0x781b, 0x0069, 0x0078, 0x1d39,
++      0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x2c72, 0xa084,
++      0x0040, 0x00c0, 0x2c6c, 0xa18c, 0x0002, 0x00c0, 0x2c6c, 0xa18c,
++      0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000,
++      0x0078, 0x2c94, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028,
++      0x00c0, 0x2c82, 0xa282, 0x0019, 0x00c8, 0x2c88, 0x2011, 0x0019,
++      0x0078, 0x2c88, 0xa282, 0x000c, 0x00c8, 0x2c88, 0x2011, 0x000c,
++      0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000f, 0x0048, 0x2c94,
++      0x0040, 0x2c94, 0x2019, 0x000f, 0x78ab, 0x0001, 0x78ab, 0x0003,
++      0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x681c, 0xa085,
++      0x0100, 0x681e, 0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008,
++      0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612,
++      0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016,
++      0x788a, 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff,
++      0xa605, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c,
++      0x0c7e, 0x7048, 0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0,
++      0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c,
++      0xa282, 0x0002, 0x00c0, 0x2dda, 0x7aa8, 0x691c, 0xa18d, 0x0080,
++      0x691e, 0xa184, 0x0200, 0x0040, 0x2d1d, 0xa18c, 0xfdff, 0x691e,
++      0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x2dda, 0x1078, 0x2d63,
++      0x1078, 0x2cc8, 0xa980, 0x0001, 0x200c, 0x1078, 0x2f0d, 0x1078,
++      0x2c58, 0x88ff, 0x0040, 0x2d10, 0x789b, 0x0060, 0x2800, 0x78aa,
++      0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2d0c,
++      0x781b, 0x0055, 0x0078, 0x1d39, 0x781b, 0x0069, 0x0078, 0x1d39,
++      0x7e58, 0xa684, 0x0400, 0x00c0, 0x2d19, 0x781b, 0x0058, 0x0078,
++      0x1d39, 0x781b, 0x006a, 0x0078, 0x1d39, 0xa282, 0x0002, 0x00c8,
++      0x2d25, 0xa284, 0x0001, 0x0040, 0x2d2f, 0x7148, 0xa188, 0x0000,
++      0x210c, 0xa18c, 0x2000, 0x00c0, 0x2d2f, 0x2011, 0x0000, 0x1078,
++      0x2e41, 0x1078, 0x2d63, 0x1078, 0x2cc8, 0x7858, 0xa085, 0x0004,
++      0x785a, 0x781b, 0x0069, 0x0078, 0x1d39, 0x0c7e, 0x027e, 0x2960,
++      0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x2d53, 0xa084,
++      0x0080, 0x00c0, 0x2d51, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078,
++      0x2d60, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++      0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x681c, 0xa085, 0x0200, 0x681e,
++      0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff, 0x0040,
++      0x2d6b, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4,
++      0xa084, 0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084,
++      0xffef, 0x6006, 0x0c7f, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003,
++      0x0040, 0x2d85, 0x007f, 0x0078, 0x2d88, 0x007f, 0x0078, 0x2dd6,
++      0xa684, 0x0020, 0x0040, 0x2dd6, 0x7888, 0xa084, 0x0040, 0x0040,
++      0x2dd6, 0x78a8, 0x8001, 0x0040, 0x2d95, 0x7bb8, 0xa384, 0x003f,
++      0x831b, 0x00c8, 0x2d9c, 0x8000, 0xa005, 0x0040, 0x2dbd, 0x831b,
++      0x00c8, 0x2da5, 0x8001, 0x0040, 0x2dd2, 0xa006, 0x1078, 0x3414,
++      0x78b4, 0x1078, 0x3479, 0x0078, 0x2dd6, 0xa684, 0x4000, 0x0040,
++      0x2dbd, 0x78b8, 0x801b, 0x00c8, 0x2db6, 0x8000, 0xa084, 0x003f,
++      0x00c0, 0x2dd2, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc, 0x2001,
++      0x0001, 0xa108, 0x00c8, 0x2dc6, 0xa291, 0x0000, 0x79d2, 0x79da,
++      0x7ad6, 0x7ade, 0x1078, 0x3414, 0x781b, 0x0067, 0x1078, 0x32e4,
++      0x0078, 0x1d39, 0x781b, 0x0067, 0x0078, 0x1d39, 0x781b, 0x006a,
++      0x0078, 0x1d39, 0x1078, 0x2e0d, 0x781b, 0x0069, 0x0078, 0x1d39,
++      0x1078, 0x2df9, 0x781b, 0x0069, 0x0078, 0x1d39, 0x6823, 0x0002,
++      0x1078, 0x2e01, 0x691c, 0xa18d, 0x0020, 0x691e, 0x6814, 0xa084,
++      0x8000, 0x0040, 0x2df5, 0x6817, 0x0005, 0x781b, 0x0069, 0x0078,
++      0x1d39, 0x2001, 0x0005, 0x0078, 0x2e0f, 0x2001, 0x000c, 0x0078,
++      0x2e0f, 0x2001, 0x0006, 0x0078, 0x2e0f, 0x2001, 0x000d, 0x0078,
++      0x2e0f, 0x2001, 0x0009, 0x0078, 0x2e0f, 0x2001, 0x0007, 0x789b,
++      0x007f, 0x78aa, 0xa6b5, 0x0008, 0x7e5a, 0x007c, 0x077e, 0x873f,
++      0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0, 0x3a80, 0xa7b8,
++      0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040, 0x2e2f, 0xa184,
++      0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008, 0x6006, 0x8738,
++      0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040, 0x2e3f, 0xa184,
++      0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010, 0x6006, 0x077f,
++      0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++      0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, 0x007c, 0x2031,
++      0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab,
++      0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab,
++      0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003,
++      0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0, 0x2001, 0x3846,
++      0x2004, 0xa082, 0x0028, 0x0040, 0x2e7d, 0x2021, 0x2ef4, 0x2019,
++      0x0014, 0x20a9, 0x000c, 0x0078, 0x2e83, 0x2021, 0x2f00, 0x2019,
++      0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404, 0xa084, 0xfff0,
++      0xa106, 0x0040, 0x2e92, 0x8420, 0x2300, 0xa210, 0x0070, 0x2e92,
++      0x0078, 0x2e85, 0x157f, 0x007c, 0x157e, 0x2011, 0x3846, 0x2214,
++      0xa282, 0x0032, 0x0048, 0x2ea8, 0x0040, 0x2eac, 0x2021, 0x2ee6,
++      0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x0078, 0x2ebc,
++      0xa282, 0x0028, 0x0040, 0x2eb4, 0x2021, 0x2ef4, 0x2019, 0x0014,
++      0x20a9, 0x000c, 0x0078, 0x2eba, 0x2021, 0x2f00, 0x2019, 0x0019,
++      0x20a9, 0x000d, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x2ecc,
++      0x0048, 0x2ecc, 0x8420, 0x2300, 0xa210, 0x0070, 0x2ec9, 0x0078,
++      0x2ebc, 0x157f, 0xa006, 0x007c, 0x157f, 0xa582, 0x0064, 0x00c8,
++      0x2ed5, 0x7808, 0xa085, 0x0070, 0x780a, 0x78ec, 0xa084, 0x0300,
++      0x0040, 0x2ee3, 0x2404, 0xa09e, 0x1201, 0x00c0, 0x2ee3, 0x2001,
++      0x2101, 0x0078, 0x2ee4, 0x2404, 0xa005, 0x007c, 0x1201, 0x3002,
++      0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806,
++      0x7a06, 0x0a07, 0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202,
++      0x7202, 0x6605, 0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05,
++      0x2202, 0x3202, 0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604,
++      0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046,
++      0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003,
++      0x8003, 0x8003, 0xa105, 0xa0e0, 0x3b00, 0x007c, 0x79d8, 0x7adc,
++      0x78d0, 0x801b, 0x00c8, 0x2f25, 0x8000, 0xa084, 0x003f, 0xa108,
++      0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3840,
++      0x2091, 0x8000, 0x2104, 0x0079, 0x2f35, 0x2f67, 0x2f3f, 0x2f3f,
++      0x2f3f, 0x2f3f, 0x2f3f, 0x2f3d, 0x2f3d, 0x1078, 0x1ce7, 0x784b,
++      0x0004, 0x7848, 0xa084, 0x0004, 0x00c0, 0x2f41, 0x784b, 0x0008,
++      0x7848, 0xa084, 0x0008, 0x00c0, 0x2f48, 0x68b0, 0xa085, 0x4000,
++      0x68b2, 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080,
++      0x00c0, 0x2f67, 0x0018, 0x2f67, 0x6818, 0xa084, 0x0020, 0x00c0,
++      0x2f65, 0x781b, 0x00dd, 0x0078, 0x2f67, 0x781b, 0x00e4, 0x2091,
++      0x8001, 0x0f7f, 0x007c, 0x0c7e, 0x6810, 0x8007, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa0e0, 0x3a80, 0x6004, 0xa084, 0x000a,
++      0x00c0, 0x2fb4, 0x6108, 0xa194, 0xff00, 0x0040, 0x2fb4, 0xa18c,
++      0x00ff, 0x6004, 0xa084, 0x0014, 0x00c0, 0x2f9d, 0xa085, 0x0014,
++      0x6006, 0x017e, 0x691c, 0xa18d, 0x0002, 0x691e, 0x017f, 0x2001,
++      0x000c, 0xa106, 0x0040, 0x2f99, 0x2100, 0x8003, 0x2008, 0x0078,
++      0x2fad, 0x2009, 0x0019, 0x0078, 0x2fad, 0x2011, 0x0000, 0x6000,
++      0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef, 0x6006, 0x017e,
++      0x691c, 0xa18d, 0x0002, 0x691e, 0x017f, 0x2100, 0xa205, 0x600a,
++      0x6004, 0xa085, 0x000a, 0x6006, 0x0c7f, 0x007c, 0x781b, 0x006a,
++      0x0078, 0x1d39, 0x781b, 0x0069, 0x0078, 0x1d39, 0x781b, 0x0058,
++      0x0078, 0x1d39, 0x781b, 0x0055, 0x0078, 0x1d39, 0x781b, 0x00dd,
++      0x0078, 0x1d39, 0x781b, 0x00dc, 0x0078, 0x1d39, 0x781b, 0x00e4,
++      0x0078, 0x1d39, 0x781b, 0x00e3, 0x0078, 0x1d39, 0x781b, 0x009e,
++      0x0078, 0x1d39, 0x781b, 0x009d, 0x0078, 0x1d39, 0x70a3, 0x0001,
++      0x781b, 0x0046, 0x0078, 0x1d39, 0x007e, 0x7830, 0xa084, 0x00c0,
++      0x00c0, 0x2ffb, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005,
++      0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x2ffb, 0x7808,
++      0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0x7808, 0xa085, 0x0002,
++      0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3002, 0x0098,
++      0x300b, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005,
++      0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x301a,
++      0x0098, 0x3018, 0x78ac, 0x007e, 0x7808, 0xa085, 0x0002, 0x780a,
++      0x007f, 0x007c, 0xa784, 0x0070, 0x0040, 0x302e, 0x0c7e, 0x2d60,
++      0x2f68, 0x1078, 0x1c97, 0x2d78, 0x2c68, 0x0c7f, 0x6817, 0x0003,
++      0x7858, 0xa084, 0x3f00, 0x681a, 0x682f, 0x0000, 0x682b, 0x0000,
++      0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x21cc, 0xa084, 0x0020,
++      0x0040, 0x21cc, 0x78ec, 0xa084, 0x0003, 0x0040, 0x21cc, 0x0018,
++      0x21cc, 0x0078, 0x2de0, 0x0c7e, 0x6810, 0x8007, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa080, 0x3a80, 0x2060, 0x2048, 0x704a,
++      0x6000, 0x704e, 0x6004, 0x7052, 0x0c7f, 0x007c, 0x0020, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0062, 0x0009, 0x0014, 0x0014, 0x9847, 0x0014, 0x0014, 0x98f5,
++      0x98e7, 0x0014, 0x0014, 0x0080, 0x00bf, 0x0100, 0x0402, 0x2008,
++      0xf880, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0xa200, 0x8838,
++      0x817e, 0x842a, 0x84a0, 0x3806, 0x8839, 0x28c2, 0x9cc3, 0xa805,
++      0x0864, 0xa83b, 0x3008, 0x28c1, 0x9cc3, 0xa201, 0x300c, 0x2847,
++      0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2,
++      0x9ca0, 0xa8f3, 0x0864, 0xa829, 0x300c, 0xa801, 0x3008, 0x28e1,
++      0x9ca0, 0x280d, 0xa204, 0x64c0, 0x67a0, 0x6fc0, 0x1814, 0x883b,
++      0x7023, 0x8576, 0x8677, 0xa80f, 0x786e, 0x883e, 0xa80c, 0x282b,
++      0xa205, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576,
++      0x8677, 0xa801, 0x883e, 0x2069, 0x28c1, 0x9cc3, 0x2044, 0x2103,
++      0x20a2, 0x2081, 0xa8dc, 0xa207, 0x0014, 0xa203, 0x8000, 0x84a8,
++      0x85a4, 0x1872, 0x849a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e,
++      0x866f, 0x0704, 0x3008, 0x9ca0, 0x0014, 0xa202, 0x8000, 0x85a4,
++      0x3009, 0x84a8, 0x19e2, 0xf848, 0x8174, 0x86eb, 0x85eb, 0x872e,
++      0x87a9, 0x883f, 0x08e6, 0xa8f1, 0xf861, 0xa8e8, 0xf801, 0x0014,
++      0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014,
++      0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014,
++      0xa206, 0x6865, 0x817f, 0x842a, 0x1dc1, 0x8823, 0x0016, 0x6042,
++      0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf021, 0x3008,
++      0x84a8, 0x1dc6, 0x20d7, 0x8822, 0x0016, 0x8000, 0x2848, 0x1011,
++      0xa8fc, 0x3008, 0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd, 0xa887,
++      0x3008, 0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017, 0x300c, 0x8000,
++      0x85a4, 0x1de2, 0xdac1, 0x0014, 0x26e0, 0x873a, 0xfaa2, 0x19f2,
++      0x1fe2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x817e, 0x842a, 0x84a0,
++      0x3806, 0x0210, 0x9ccd, 0x0704, 0x0000, 0x127e, 0x2091, 0x2200,
++      0x2049, 0x314d, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215, 0x7008,
++      0xa084, 0xfffd, 0xa205, 0x0040, 0x315f, 0x0078, 0x3164, 0x7003,
++      0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084, 0x0001, 0x00c0,
++      0x3192, 0x7108, 0x8104, 0x00c8, 0x3171, 0x1078, 0x322e, 0x0078,
++      0x3169, 0x700c, 0xa08c, 0x007f, 0x0040, 0x3192, 0x7004, 0x8004,
++      0x00c8, 0x3189, 0x7014, 0xa005, 0x00c0, 0x3185, 0x7010, 0xa005,
++      0x0040, 0x3189, 0xa102, 0x00c8, 0x3169, 0x7007, 0x0010, 0x0078,
++      0x3192, 0x8aff, 0x0040, 0x3192, 0x1078, 0x33eb, 0x00c0, 0x318c,
++      0x0040, 0x3169, 0x1078, 0x31dc, 0x7003, 0x0000, 0x127f, 0x2000,
++      0x007c, 0x6424, 0x84ff, 0x0040, 0x31b6, 0x2c70, 0x2039, 0x31bb,
++      0x2704, 0xae68, 0x680c, 0xa630, 0x6808, 0xa529, 0x8421, 0x0040,
++      0x31b6, 0x8738, 0x2704, 0xa005, 0x00c0, 0x31a1, 0x7098, 0xa075,
++      0x0040, 0x31b6, 0x2039, 0x31b8, 0x0078, 0x31a0, 0x007c, 0x0000,
++      0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018, 0x001c, 0x0000,
++      0x127e, 0x2091, 0x2200, 0x2079, 0x3800, 0x2071, 0x0010, 0x7007,
++      0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071, 0x0020, 0x7007,
++      0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049, 0x0000, 0x78b7,
++      0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x31dc, 0x7004, 0x8004,
++      0x00c8, 0x3208, 0x7007, 0x0012, 0x7108, 0x7008, 0xa106, 0x00c0,
++      0x31e4, 0xa184, 0x0030, 0x0040, 0x31f1, 0xa086, 0x0030, 0x00c0,
++      0x31e4, 0x7000, 0xa084, 0x0001, 0x00c0, 0x3208, 0x7008, 0xa084,
++      0x000c, 0x00c0, 0x3206, 0x710c, 0xa184, 0x0300, 0x00c0, 0x3206,
++      0xa184, 0x007f, 0x00c0, 0x31dc, 0x0078, 0x3208, 0x6817, 0x0003,
++      0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0,
++      0x320c, 0x7007, 0x0012, 0x7108, 0x8104, 0x0048, 0x3211, 0x78b7,
++      0x0000, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e,
++      0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x322e, 0x157f,
++      0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x2118,
++      0x7108, 0x700c, 0xa084, 0x0300, 0x00c0, 0x3270, 0xa184, 0x000c,
++      0x00c0, 0x3270, 0x8213, 0x8213, 0x8213, 0x8213, 0xa284, 0x0100,
++      0xa10d, 0x810b, 0x810b, 0x810f, 0xa184, 0x0007, 0x0079, 0x3248,
++      0x3252, 0x3262, 0x3270, 0x3262, 0x3284, 0x3284, 0x3270, 0x3282,
++      0x1078, 0x1ce7, 0x7007, 0x0002, 0x8aff, 0x00c0, 0x325b, 0x2049,
++      0x0000, 0x0078, 0x325f, 0x1078, 0x33eb, 0x00c0, 0x325b, 0x78b7,
++      0x0000, 0x007c, 0x7007, 0x0002, 0x8aff, 0x00c0, 0x3269, 0x0078,
++      0x326d, 0x1078, 0x33eb, 0x00c0, 0x3269, 0x78b7, 0x0000, 0x007c,
++      0x7007, 0x0002, 0x1078, 0x31dc, 0x1078, 0x2f2b, 0x6814, 0xa084,
++      0x8000, 0x0040, 0x327d, 0x6817, 0x0002, 0x007c, 0x1078, 0x1ce7,
++      0x1078, 0x1ce7, 0x1078, 0x32d6, 0x7210, 0x7114, 0x700c, 0xa09c,
++      0x007f, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x78b4, 0xa005,
++      0x0040, 0x3296, 0x78b7, 0x0000, 0x0078, 0x32b9, 0x1078, 0x32d6,
++      0x2704, 0x2c58, 0xac60, 0x630c, 0x2200, 0xa322, 0x6308, 0x2100,
++      0xa31b, 0x2400, 0xa305, 0x0040, 0x32af, 0x00c8, 0x32af, 0x8412,
++      0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x3296, 0x2b60,
++      0x8a07, 0xa7ba, 0x31b8, 0xa73d, 0x2c00, 0x6882, 0x6f86, 0x6c8e,
++      0x6b8a, 0x7007, 0x0012, 0x1078, 0x31dc, 0x007c, 0x8738, 0x2704,
++      0xa005, 0x00c0, 0x32ca, 0x6098, 0xa005, 0x0040, 0x32d3, 0x2060,
++      0x2039, 0x31b8, 0x8a51, 0x0040, 0x32d2, 0x7008, 0xa084, 0x00c0,
++      0xa086, 0x00c0, 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50, 0x8739,
++      0x2704, 0xa004, 0x00c0, 0x32e3, 0x2039, 0x31be, 0x6000, 0xa064,
++      0x00c0, 0x32e3, 0x2d60, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200,
++      0x0d7f, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c, 0x8057, 0xaad4,
++      0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x31b8, 0x7e08, 0xa6b5, 0x000c,
++      0x6818, 0xa084, 0x0040, 0x0040, 0x32ff, 0xa6b5, 0x0001, 0x0f7e,
++      0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, 0x0040, 0x0040, 0x330e,
++      0xa684, 0x0001, 0x00c0, 0x330e, 0xa6b5, 0x0001, 0x7007, 0x0004,
++      0x7004, 0xa084, 0x0004, 0x00c0, 0x3310, 0x7000, 0xa005, 0x0040,
++      0x331b, 0x1078, 0x1ce7, 0x2400, 0xa305, 0x00c0, 0x3321, 0x0078,
++      0x335e, 0x2c58, 0x2704, 0xac60, 0x6004, 0xa400, 0x007e, 0x701a,
++      0x6000, 0xa301, 0x701e, 0x2009, 0x04fd, 0x2104, 0xa086, 0x04fd,
++      0x007f, 0x00c0, 0x334e, 0xa084, 0x0001, 0x0040, 0x334e, 0xa684,
++      0x0001, 0x00c0, 0x334e, 0x7013, 0x0001, 0x7017, 0x0000, 0x7602,
++      0x7007, 0x0001, 0x78b7, 0x0001, 0xa4a0, 0x0001, 0xa399, 0x0000,
++      0x6004, 0xa400, 0x701a, 0x6000, 0xa301, 0x701e, 0x620c, 0x2400,
++      0xa202, 0x7012, 0x6208, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007,
++      0x0001, 0x2b60, 0x1078, 0x32be, 0x0078, 0x3360, 0x1078, 0x33eb,
++      0x00c0, 0x335e, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091,
++      0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++      0x336c, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e,
++      0x2091, 0x2200, 0x0d7f, 0x2049, 0x3376, 0x7007, 0x0004, 0x7004,
++      0xa084, 0x0004, 0x00c0, 0x337f, 0x7e08, 0xa6b5, 0x000c, 0x6818,
++      0xa084, 0x0040, 0x0040, 0x338e, 0xa6b5, 0x0001, 0x6824, 0xa005,
++      0x0040, 0x339a, 0x2050, 0x2039, 0x31bb, 0x2d60, 0x1078, 0x33eb,
++      0x00c0, 0x3396, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
++      0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5,
++      0x000c, 0x6818, 0xa084, 0x0040, 0x0040, 0x33b0, 0xa6b5, 0x0001,
++      0x2049, 0x339d, 0x6824, 0xa055, 0x0040, 0x33e8, 0x2d70, 0x2e60,
++      0x2039, 0x31bb, 0x2704, 0xae68, 0x680c, 0xa422, 0x6808, 0xa31b,
++      0x0048, 0x33d5, 0x8a51, 0x00c0, 0x33c7, 0x1078, 0x1ce7, 0x8738,
++      0x2704, 0xa005, 0x00c0, 0x33bb, 0x7098, 0xa075, 0x2060, 0x0040,
++      0x33e8, 0x2039, 0x31b8, 0x0078, 0x33ba, 0x8422, 0x8420, 0x831a,
++      0xa399, 0x0000, 0x690c, 0x2400, 0xa122, 0x6908, 0x2300, 0xa11b,
++      0x00c8, 0x33e4, 0x1078, 0x1ce7, 0x2071, 0x0020, 0x0078, 0x330e,
++      0x127f, 0x2000, 0x007c, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0,
++      0x0040, 0x3413, 0x2704, 0xac08, 0x2104, 0x701e, 0x8108, 0x2104,
++      0x701a, 0x8108, 0x2104, 0x7016, 0x8108, 0x2104, 0x7012, 0x0f7e,
++      0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, 0x0040, 0x0040, 0x340e,
++      0xa684, 0x0001, 0x00c0, 0x340e, 0xa6b5, 0x0001, 0x7602, 0x7007,
++      0x0001, 0x1078, 0x32be, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091,
++      0x2200, 0x2049, 0x3414, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x00c0,
++      0x00c0, 0x342a, 0x6824, 0xa005, 0x0040, 0x343a, 0x0078, 0x3164,
++      0x0078, 0x343a, 0x7108, 0x8104, 0x00c8, 0x3432, 0x1078, 0x322e,
++      0x0078, 0x341d, 0x7007, 0x0010, 0x7108, 0x8104, 0x00c8, 0x3434,
++      0x1078, 0x322e, 0x7008, 0xa086, 0x0002, 0x00c0, 0x341d, 0x7000,
++      0xa005, 0x00c0, 0x341d, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f,
++      0x2000, 0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0d7e, 0x2091,
++      0x2200, 0x0d7f, 0x2049, 0x344a, 0xad80, 0x0010, 0x20a0, 0x2099,
++      0x0031, 0x700c, 0xa084, 0x007f, 0x6826, 0x7007, 0x0008, 0x7007,
++      0x0002, 0x7003, 0x0001, 0x0040, 0x3468, 0x8000, 0x80ac, 0x53a5,
++      0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x346a, 0x2049,
++      0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000,
++      0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049,
++      0x3479, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c, 0x8057, 0xaad4,
++      0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x31b8, 0x7e08, 0xa6b5, 0x0004,
++      0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x3492, 0x2c58,
++      0x2704, 0xac60, 0x6004, 0xa400, 0x701a, 0x6000, 0xa301, 0x701e,
++      0x7013, 0x0001, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x007f,
++      0x8007, 0x2009, 0x0031, 0x200a, 0x00a0, 0x34ac, 0x7108, 0x7007,
++      0x0002, 0x810c, 0x00c8, 0x34ac, 0x810c, 0x0048, 0x34b9, 0x0078,
++      0x3270, 0xa4a0, 0x0001, 0xa399, 0x0000, 0x6b8a, 0x6c8e, 0x7007,
++      0x0004, 0x2049, 0x0000, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c,
++      0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x34d1,
++      0xa200, 0x00f0, 0x34cc, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9,
++      0x0010, 0xa005, 0x0040, 0x34f7, 0xa11a, 0x00c8, 0x34f7, 0x8213,
++      0x818d, 0x0048, 0x34ea, 0xa11a, 0x00c8, 0x34eb, 0x00f0, 0x34df,
++      0x0078, 0x34ef, 0xa11a, 0x2308, 0x8210, 0x00f0, 0x34df, 0x007e,
++      0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e,
++      0x3200, 0xa085, 0x0800, 0x0078, 0x34f3, 0x00e0, 0x3563, 0x2091,
++      0x6000, 0x7820, 0x8001, 0x7822, 0x00c0, 0x355b, 0x7824, 0x7822,
++      0x2009, 0x3834, 0x2104, 0xa005, 0x00c0, 0x3510, 0x2001, 0x0010,
++      0x8001, 0x200a, 0x077e, 0x803f, 0x1078, 0x2f11, 0x077f, 0x20a9,
++      0x0020, 0x601f, 0x0064, 0xace0, 0x0010, 0x00f0, 0x3519, 0x2091,
++      0x8000, 0x2069, 0x3840, 0x6800, 0xa084, 0x0007, 0x0040, 0x3538,
++      0xa086, 0x0002, 0x0040, 0x3538, 0x6830, 0xa00d, 0x0040, 0x3538,
++      0x2104, 0xa005, 0x0040, 0x3538, 0x8001, 0x200a, 0x0040, 0x3640,
++      0x2061, 0x3b00, 0x2009, 0x0002, 0x20a9, 0x0100, 0x603c, 0xa005,
++      0x0040, 0x354e, 0x8001, 0x603e, 0x00c0, 0x354e, 0x6010, 0xa005,
++      0x0040, 0x354e, 0x017e, 0x1078, 0x1b49, 0x017f, 0xace0, 0x0010,
++      0x0070, 0x3554, 0x0078, 0x353e, 0x8109, 0x0040, 0x355b, 0x20a9,
++      0x0100, 0x0078, 0x353e, 0x1078, 0x3578, 0x1078, 0x3566, 0x1078,
++      0x359d, 0x1078, 0x3707, 0x2091, 0x8001, 0x007c, 0x783c, 0x8001,
++      0x783e, 0x00c0, 0x3577, 0x7840, 0x783e, 0x7848, 0xa005, 0x0040,
++      0x3577, 0x8001, 0x784a, 0x00c0, 0x3577, 0x1078, 0x1b49, 0x007c,
++      0x7834, 0x8001, 0x7836, 0x00c0, 0x359c, 0x7838, 0x7836, 0x2091,
++      0x8000, 0x7844, 0xa005, 0x00c0, 0x3587, 0x2001, 0x0101, 0x8001,
++      0x7846, 0xa080, 0x5b00, 0x2040, 0x2004, 0xa065, 0x0040, 0x359c,
++      0x6020, 0xa005, 0x0040, 0x3598, 0x8001, 0x6022, 0x0040, 0x35cc,
++      0x6000, 0x2c40, 0x0078, 0x358d, 0x007c, 0x7828, 0x8001, 0x782a,
++      0x00c0, 0x35cb, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x35aa,
++      0x2001, 0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003,
++      0xa090, 0x3b00, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040,
++      0x35cb, 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x35c3, 0x8001,
++      0x2012, 0x00c0, 0x35cb, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080,
++      0x201a, 0x1078, 0x1b49, 0x007c, 0x2069, 0x3840, 0x6800, 0xa005,
++      0x0040, 0x35d6, 0x683c, 0xac06, 0x0040, 0x3640, 0x6710, 0x6fb6,
++      0x1078, 0x1758, 0x6808, 0xa084, 0x0020, 0x00c0, 0x363d, 0x2009,
++      0x382b, 0x2104, 0xa005, 0x0040, 0x35e9, 0x6023, 0x0001, 0x0078,
++      0x363d, 0x6808, 0xa084, 0xffef, 0xa085, 0x0021, 0x6017, 0x0006,
++      0x60b0, 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff, 0xa085,
++      0x0060, 0x601e, 0x6000, 0x2042, 0x6710, 0x6fb6, 0x1078, 0x1758,
++      0x6818, 0xa005, 0x0040, 0x3606, 0x8001, 0x681a, 0x6808, 0xa084,
++      0xffef, 0x680a, 0x6810, 0x8001, 0x00d0, 0x3610, 0x1078, 0x1ce7,
++      0x6812, 0x602f, 0x0000, 0x602b, 0x0000, 0x2c68, 0x1078, 0x18b6,
++      0x2069, 0x3840, 0x6710, 0xa784, 0x0f00, 0x68b6, 0x2001, 0x0002,
++      0x1078, 0x1b44, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0030,
++      0x1078, 0x1765, 0x2011, 0x3835, 0x2214, 0x6a3e, 0x8738, 0xa784,
++      0x001f, 0x00c0, 0x3622, 0x2009, 0x382b, 0x200b, 0x0008, 0x2009,
++      0x382c, 0x2069, 0x3840, 0x68b4, 0x200a, 0x2091, 0x8001, 0x007c,
++      0x2009, 0x384f, 0x2164, 0x2069, 0x0100, 0x1078, 0x1c97, 0x6017,
++      0x0006, 0x6858, 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff,
++      0xa085, 0x0048, 0x601e, 0x602f, 0x0000, 0x602b, 0x0000, 0x6830,
++      0xa084, 0x0040, 0x0040, 0x367c, 0x684b, 0x0004, 0x20a9, 0x0014,
++      0x6848, 0xa084, 0x0004, 0x0040, 0x3669, 0x0070, 0x3669, 0x0078,
++      0x3660, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001,
++      0x0040, 0x3676, 0x0070, 0x3676, 0x0078, 0x366d, 0x20a9, 0x00fa,
++      0x0070, 0x367c, 0x0078, 0x3678, 0x6808, 0xa084, 0xfffd, 0x680a,
++      0x681b, 0x0046, 0x2009, 0x3868, 0x200b, 0x0007, 0x784c, 0x784a,
++      0x2091, 0x8001, 0x007c, 0x2079, 0x3800, 0x1078, 0x36de, 0x1078,
++      0x36a6, 0x1078, 0x36b4, 0x1078, 0x36c9, 0x1078, 0x36f3, 0x2009,
++      0x3833, 0x200b, 0x0000, 0x2009, 0x3834, 0x200b, 0x0000, 0x7833,
++      0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x007c, 0x2019, 0x0003,
++      0x2011, 0x3846, 0x2204, 0xa086, 0x003c, 0x0040, 0x36b1, 0x2019,
++      0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019, 0x0030, 0x2011, 0x3846,
++      0x2204, 0xa086, 0x0032, 0x0040, 0x36c6, 0x2019, 0x0039, 0x2204,
++      0xa086, 0x003c, 0x0040, 0x36c6, 0x2019, 0x0027, 0x7b36, 0x7b3a,
++      0x007c, 0x2019, 0x000f, 0x2011, 0x3846, 0x2204, 0xa086, 0x003c,
++      0x0040, 0x36db, 0x2019, 0x000d, 0x2204, 0xa086, 0x0032, 0x0040,
++      0x36db, 0x2019, 0x000a, 0x7b3e, 0x7b42, 0x007c, 0x2019, 0x2faf,
++      0x2011, 0x3846, 0x2204, 0xa086, 0x0032, 0x0040, 0x36f0, 0x2019,
++      0x3971, 0x2204, 0xa086, 0x003c, 0x0040, 0x36f0, 0x2019, 0x2626,
++      0x7b22, 0x7b26, 0x007c, 0x2019, 0x0001, 0x2011, 0x3846, 0x2204,
++      0xa086, 0x003c, 0x0040, 0x36fe, 0x2019, 0x0001, 0x017e, 0x2009,
++      0x3831, 0x230a, 0x2009, 0x3832, 0x230a, 0x017f, 0x007c, 0x2009,
++      0x3831, 0x2104, 0x8001, 0x200a, 0xa005, 0x00c0, 0x3755, 0x2009,
++      0x3832, 0x2104, 0x2009, 0x3831, 0x200a, 0x2009, 0x3833, 0x2104,
++      0xa005, 0x00c0, 0x371d, 0x2001, 0x0200, 0x8001, 0x200a, 0x8003,
++      0x8003, 0x8003, 0x8003, 0xa090, 0x3b00, 0x2208, 0xa298, 0x0002,
++      0x2304, 0xa084, 0x0200, 0x0040, 0x3755, 0xa290, 0x000e, 0x2204,
++      0xa005, 0x0040, 0x3740, 0x8001, 0x0040, 0x3740, 0x8001, 0x0040,
++      0x3740, 0x8001, 0x0040, 0x3740, 0x8001, 0x2012, 0x00c0, 0x3755,
++      0x2012, 0x2304, 0xa084, 0xfdff, 0xa085, 0x0400, 0x201a, 0xa188,
++      0x000c, 0x2104, 0x007e, 0xa084, 0x00ff, 0x8001, 0x027f, 0xa294,
++      0xff00, 0xa205, 0x200a, 0x1078, 0x1b49, 0x007c, 0x6ed0
++};
++#else
++/*
++ * Flakey, not quite functional, target mode code for ISP1000
++ * hacked out of PCI 7.55 initiator/target mode code.
++ */
++static const u_int16_t isp_1000_risc_code[] = {
++      0x0078, 0x103a, 0x0000, 0x3c1f, 0x0000, 0x2043, 0x4f50, 0x5952,
++      0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
++      0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++      0x3130, 0x3030, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
++      0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x372e, 0x3535,
++      0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
++      0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
++      0x3031, 0x2024, 0x3700, 0xa086, 0xffff, 0x0040, 0x1043, 0x2079,
++      0x4d00, 0x7803, 0x0001, 0x20c1, 0x0008, 0x2071, 0x0010, 0x70c3,
++      0x0004, 0x20c9, 0x73ff, 0x2089, 0x116f, 0x70c7, 0x4953, 0x70cb,
++      0x5020, 0x70cf, 0x2020, 0x70d3, 0x0007, 0x3f00, 0x70d6, 0x20c1,
++      0x0008, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5,
++      0xa1ec, 0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54,
++      0x205b, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10b5, 0xa386,
++      0x000f, 0x0040, 0x107b, 0x2c6a, 0x2a5a, 0x20c1, 0x0000, 0x2019,
++      0x000f, 0x0078, 0x105b, 0x2c6a, 0x2a5a, 0x20c1, 0x0008, 0x2009,
++      0x7fff, 0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc, 0x3fff, 0x2734,
++      0x203b, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040, 0x109f, 0x284a,
++      0x263a, 0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134, 0x200b, 0x5050,
++      0x2114, 0xa286, 0x5050, 0x0040, 0x10a0, 0x0078, 0x1177, 0x284a,
++      0x263a, 0x98c0, 0xa188, 0x1000, 0x212c, 0x200b, 0xa5a5, 0x2114,
++      0xa286, 0xa5a5, 0x0040, 0x10b2, 0x250a, 0xa18a, 0x1000, 0x98c1,
++      0x0078, 0x10b7, 0x250a, 0x0078, 0x10b7, 0x2c6a, 0x2a5a, 0x2130,
++      0xa18a, 0x0040, 0x2128, 0xa1a2, 0x4d00, 0x8424, 0x8424, 0x8424,
++      0x8424, 0x8424, 0x8424, 0xa192, 0x7400, 0x2009, 0x0000, 0x2001,
++      0x0031, 0x1078, 0x1bd8, 0x2218, 0x2079, 0x4d00, 0x2fa0, 0x2408,
++      0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10d2,
++      0x7ef2, 0x8528, 0x7de6, 0x7cea, 0x7bee, 0x7883, 0x0000, 0x2031,
++      0x0030, 0x78cf, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f,
++      0x0003, 0x2069, 0x4d40, 0x00a8, 0x10f1, 0x681b, 0x003c, 0x0078,
++      0x10f3, 0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f,
++      0x0008, 0x6813, 0x0005, 0x6823, 0x0000, 0x6827, 0x0006, 0x6817,
++      0x0008, 0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x4f80, 0x2011,
++      0x0020, 0x2009, 0x0010, 0x680b, 0x080c, 0x680f, 0x0019, 0x6803,
++      0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290,
++      0x0004, 0x8109, 0x00c0, 0x110b, 0x2069, 0x5000, 0x2009, 0x0002,
++      0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bf0, 0xa386,
++      0xfeff, 0x00c0, 0x1131, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078,
++      0x1135, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x0070,
++      0x113b, 0x0078, 0x1122, 0x8109, 0x00c0, 0x1120, 0x1078, 0x20d8,
++      0x1078, 0x43d1, 0x1078, 0x18a9, 0x1078, 0x48d9, 0x3200, 0xa085,
++      0x000d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x1155, 0x70c0, 0xa086,
++      0x0002, 0x00c0, 0x1155, 0x1078, 0x126d, 0x1078, 0x117f, 0x78cc,
++      0xa005, 0x00c0, 0x1163, 0x1078, 0x1c01, 0x0010, 0x1169, 0x0068,
++      0x1169, 0x1078, 0x1fbd, 0x0010, 0x1169, 0x0068, 0x1169, 0x1078,
++      0x198e, 0x00e0, 0x1155, 0x1078, 0x4760, 0x0078, 0x1155, 0x1177,
++      0x1179, 0x22cc, 0x22cc, 0x4452, 0x4452, 0x22cc, 0x22cc, 0x0078,
++      0x1177, 0x0078, 0x1179, 0x0078, 0x117b, 0x0078, 0x117d, 0x0068,
++      0x11ea, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x11ea,
++      0x7814, 0xa005, 0x00c0, 0x1190, 0x0010, 0x11eb, 0x0078, 0x11ea,
++      0x2009, 0x4d5b, 0x2104, 0xa005, 0x00c0, 0x11ea, 0x2009, 0x4d64,
++      0x200b, 0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11b5, 0x7816,
++      0x2009, 0x4d62, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014,
++      0x70ca, 0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105,
++      0x70ce, 0x1078, 0x188e, 0x0078, 0x11e8, 0x7814, 0xa086, 0x0018,
++      0x00c0, 0x11bc, 0x1078, 0x15e0, 0x7817, 0x0000, 0x2009, 0x4d62,
++      0x2104, 0xa065, 0x0040, 0x11d8, 0x0c7e, 0x609c, 0x2060, 0x1078,
++      0x18f9, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x16a2, 0x2009, 0x000e,
++      0x6007, 0x0103, 0x1078, 0x186a, 0x00c0, 0x11e4, 0x1078, 0x188e,
++      0x2009, 0x4d62, 0x200b, 0x0000, 0x2009, 0x4d5c, 0x2104, 0x200b,
++      0x0000, 0xa005, 0x0040, 0x11e8, 0x2001, 0x4005, 0x0078, 0x126f,
++      0x0078, 0x126d, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb,
++      0x0000, 0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x123b,
++      0x2038, 0x0079, 0x11fb, 0x126d, 0x12c4, 0x1292, 0x12d3, 0x12e2,
++      0x12e8, 0x1289, 0x16ba, 0x12ec, 0x1281, 0x1296, 0x1298, 0x129a,
++      0x129c, 0x16bf, 0x1281, 0x12f4, 0x1313, 0x15ee, 0x16b4, 0x129e,
++      0x1517, 0x1533, 0x154f, 0x157a, 0x14d0, 0x14de, 0x14f2, 0x1506,
++      0x1384, 0x1281, 0x1332, 0x1338, 0x133d, 0x1342, 0x1348, 0x134d,
++      0x1352, 0x1357, 0x135c, 0x1360, 0x1375, 0x1381, 0x1281, 0x1281,
++      0x1281, 0x1281, 0x1390, 0x1399, 0x13a8, 0x13ce, 0x13d8, 0x13df,
++      0x141a, 0x1429, 0x1438, 0x144a, 0x14b0, 0x14c0, 0x1281, 0x1281,
++      0x1281, 0x1281, 0x14c5, 0xa0bc, 0xffa0, 0x00c0, 0x1281, 0x2038,
++      0xa084, 0x001f, 0x0079, 0x1244, 0x16f8, 0x16fb, 0x170b, 0x1281,
++      0x1281, 0x1846, 0x1858, 0x1281, 0x1281, 0x1281, 0x185c, 0x1864,
++      0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281, 0x1281,
++      0x1281, 0x16d6, 0x16ea, 0x1281, 0x1797, 0x1281, 0x1822, 0x182c,
++      0x1830, 0x183e, 0x1281, 0x1281, 0x72ca, 0x71c6, 0x2001, 0x4006,
++      0x0078, 0x126f, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2,
++      0x0068, 0x1270, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000,
++      0x00e0, 0x1278, 0x00e0, 0x127a, 0x0068, 0x127a, 0x2091, 0x4080,
++      0x007c, 0x70c3, 0x4001, 0x0078, 0x1270, 0x70c3, 0x4006, 0x0078,
++      0x1270, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3,
++      0x0078, 0x126d, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x126d,
++      0x0078, 0x126d, 0x0078, 0x126d, 0x0078, 0x126d, 0x2091, 0x8000,
++      0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020,
++      0x70d3, 0x0007, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001,
++      0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470,
++      0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000,
++      0x2091, 0x4080, 0x0078, 0x0455, 0x2029, 0x0000, 0x2520, 0x71d0,
++      0x73c8, 0x72cc, 0x70c4, 0x1078, 0x19d3, 0x0040, 0x126d, 0x70c3,
++      0x4002, 0x0078, 0x126d, 0x2029, 0x0000, 0x2520, 0x71d0, 0x73c8,
++      0x72cc, 0x70c4, 0x1078, 0x1a1f, 0x0040, 0x126d, 0x70c3, 0x4002,
++      0x0078, 0x126d, 0x71c4, 0x70c8, 0x2114, 0x200a, 0x0078, 0x126b,
++      0x71c4, 0x2114, 0x0078, 0x126b, 0x70c7, 0x0007, 0x70cb, 0x0037,
++      0x70cf, 0x0000, 0x0078, 0x126d, 0x2029, 0x0000, 0x2530, 0x70c4,
++      0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005,
++      0x0040, 0x130d, 0x8001, 0x7892, 0x7a9a, 0x7b9e, 0x7c96, 0x78cc,
++      0xa084, 0xfffc, 0x78ce, 0x0078, 0x1311, 0x78cc, 0xa085, 0x0001,
++      0x78ce, 0x0078, 0x126d, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8,
++      0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040,
++      0x132c, 0x8001, 0x78ae, 0x7ab6, 0x7bba, 0x7cb2, 0x78cc, 0xa084,
++      0xfcff, 0x78ce, 0x0078, 0x1330, 0x78cc, 0xa085, 0x0100, 0x78ce,
++      0x0078, 0x126d, 0x2009, 0x4d61, 0x210c, 0x7aec, 0x0078, 0x126b,
++      0x2009, 0x4d41, 0x210c, 0x0078, 0x126c, 0x2009, 0x4d42, 0x210c,
++      0x0078, 0x126c, 0x2061, 0x4d40, 0x610c, 0x6210, 0x0078, 0x126b,
++      0x2009, 0x4d45, 0x210c, 0x0078, 0x126c, 0x2009, 0x4d46, 0x210c,
++      0x0078, 0x126c, 0x2009, 0x4d48, 0x210c, 0x0078, 0x126c, 0x2009,
++      0x4d49, 0x210c, 0x0078, 0x126c, 0x7908, 0x7a0c, 0x0078, 0x126b,
++      0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
++      0x4f80, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x1372, 0x6b08,
++      0x0078, 0x1373, 0x6b0c, 0x0078, 0x126a, 0x77c4, 0x1078, 0x18b9,
++      0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078,
++      0x126a, 0x794c, 0x0078, 0x126c, 0x77c4, 0x1078, 0x18b9, 0x2091,
++      0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078, 0x126a,
++      0x71c4, 0xa182, 0x0010, 0x00c8, 0x1265, 0x1078, 0x21a3, 0x0078,
++      0x126a, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x1265, 0x2011, 0x4d41,
++      0x2204, 0x007e, 0x2112, 0x1078, 0x215c, 0x017f, 0x0078, 0x126c,
++      0x71c4, 0x2011, 0x13c6, 0x20a9, 0x0008, 0x2204, 0xa106, 0x0040,
++      0x13b8, 0x8210, 0x0070, 0x13b6, 0x0078, 0x13ad, 0x0078, 0x1265,
++      0xa292, 0x13c6, 0x027e, 0x2011, 0x4d42, 0x2204, 0x2112, 0x017f,
++      0x007e, 0x1078, 0x2168, 0x017f, 0x0078, 0x126c, 0x03e8, 0x00fa,
++      0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061, 0x4d40,
++      0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078, 0x126b,
++      0x2061, 0x4d40, 0x6114, 0x70c4, 0x6016, 0x0078, 0x126c, 0x2061,
++      0x4d40, 0x71c4, 0x2011, 0x0004, 0x601f, 0x0019, 0x2019, 0x1212,
++      0xa186, 0x0028, 0x0040, 0x1400, 0x2011, 0x0005, 0x601f, 0x0019,
++      0x2019, 0x1212, 0xa186, 0x0032, 0x0040, 0x1400, 0x2011, 0x0006,
++      0x601f, 0x000c, 0x2019, 0x2222, 0xa186, 0x003c, 0x00c0, 0x1265,
++      0x6018, 0x007e, 0x611a, 0x7800, 0xa084, 0x0001, 0x00c0, 0x1410,
++      0x0028, 0x140c, 0x0078, 0x1410, 0x2019, 0x2222, 0x0078, 0x1412,
++      0x2019, 0x1212, 0x23b8, 0x1078, 0x2179, 0x1078, 0x48d9, 0x017f,
++      0x0078, 0x126c, 0x71c4, 0xa184, 0xffcf, 0x00c0, 0x1265, 0x2011,
++      0x4d48, 0x2204, 0x2112, 0x007e, 0x1078, 0x219b, 0x017f, 0x0078,
++      0x126c, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x1265, 0x2011, 0x4d49,
++      0x2204, 0x007e, 0x2112, 0x1078, 0x218a, 0x017f, 0x0078, 0x126c,
++      0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x1264, 0xa284, 0xfffd,
++      0x00c0, 0x1264, 0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e,
++      0x0078, 0x126b, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003,
++      0x8003, 0xa0e8, 0x4f80, 0x2019, 0x0000, 0x72c8, 0x6800, 0x007e,
++      0xa226, 0x0040, 0x1479, 0x6a02, 0xa484, 0x2000, 0x0040, 0x1462,
++      0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x1468, 0xa39d, 0x0008,
++      0xa484, 0x4000, 0x0040, 0x1479, 0x810f, 0xa284, 0x4000, 0x0040,
++      0x1475, 0x1078, 0x21bd, 0x0078, 0x1479, 0x1078, 0x21af, 0x0078,
++      0x1479, 0x72cc, 0x6808, 0xa206, 0x0040, 0x14a8, 0xa2a4, 0x00ff,
++      0x2061, 0x4d40, 0x6118, 0xa186, 0x0028, 0x0040, 0x148f, 0xa186,
++      0x0032, 0x0040, 0x1495, 0xa186, 0x003c, 0x0040, 0x149b, 0xa482,
++      0x0064, 0x0048, 0x14a5, 0x0078, 0x149f, 0xa482, 0x0050, 0x0048,
++      0x14a5, 0x0078, 0x149f, 0xa482, 0x0043, 0x0048, 0x14a5, 0x71c4,
++      0x71c6, 0x027f, 0x72ca, 0x0078, 0x1266, 0x6a0a, 0xa39d, 0x000a,
++      0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x0078, 0x126a,
++      0x77c4, 0x1078, 0x18b9, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091,
++      0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, 0x126a,
++      0x70c4, 0x794c, 0x784e, 0x0078, 0x126c, 0x71c4, 0x72c8, 0x73cc,
++      0xa182, 0x0010, 0x00c8, 0x1265, 0x1078, 0x21cb, 0x0078, 0x126a,
++      0x77c4, 0x1078, 0x18b9, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002,
++      0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x126b, 0x77c4, 0x1078,
++      0x18b9, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804,
++      0xa005, 0x0040, 0x14ed, 0x1078, 0x20a0, 0x2091, 0x8001, 0x2708,
++      0x0078, 0x126b, 0x77c4, 0x1078, 0x18b9, 0x2091, 0x8000, 0x6a08,
++      0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1501, 0x1078,
++      0x20a0, 0x2091, 0x8001, 0x2708, 0x0078, 0x126b, 0x77c4, 0x2041,
++      0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
++      0x18c6, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x126b, 0x77c4,
++      0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078, 0x1927, 0x00c0,
++      0x152f, 0x6818, 0xa005, 0x0040, 0x152f, 0x2708, 0x1078, 0x21db,
++      0x00c0, 0x152f, 0x7817, 0x0015, 0x2091, 0x8001, 0x007c, 0x2091,
++      0x8001, 0x0078, 0x126d, 0x77c4, 0x77c6, 0x2041, 0x0021, 0x2049,
++      0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, 0x18c6, 0x2061,
++      0x4d40, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f, 0x6073, 0x0000,
++      0x7817, 0x0016, 0x1078, 0x20a0, 0x2091, 0x8001, 0x007c, 0x77c8,
++      0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2061,
++      0x4d40, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782, 0x6093, 0x000f,
++      0x7817, 0x0017, 0x1078, 0x20a0, 0x2091, 0x8001, 0x2041, 0x0021,
++      0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x18c6,
++      0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0, 0x156e, 0x2091,
++      0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0, 0x159e, 0x2039,
++      0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078,
++      0x18b9, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001,
++      0x8738, 0xa784, 0x001f, 0x00c0, 0x1587, 0xa7bc, 0xff00, 0x873f,
++      0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1587, 0x2091, 0x8000,
++      0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040, 0x15c7, 0x684b,
++      0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x15b4,
++      0x0070, 0x15b4, 0x0078, 0x15ab, 0x684b, 0x0009, 0x20a9, 0x0014,
++      0x6848, 0xa084, 0x0001, 0x0040, 0x15c1, 0x0070, 0x15c1, 0x0078,
++      0x15b8, 0x20a9, 0x00fa, 0x0070, 0x15c7, 0x0078, 0x15c3, 0x2079,
++      0x4d00, 0x7817, 0x0018, 0x2061, 0x4d40, 0x606f, 0x0001, 0x6073,
++      0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002, 0x78ce, 0x6808,
++      0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091, 0x8001, 0x007c,
++      0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001, 0x00c0, 0x15ea,
++      0x1078, 0x1971, 0x71c4, 0x71c6, 0x794a, 0x007c, 0x2029, 0x0000,
++      0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079,
++      0x4d00, 0x1078, 0x1874, 0x0040, 0x169e, 0x20a9, 0x0005, 0x20a1,
++      0x4d18, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020,
++      0x1078, 0x186f, 0x0040, 0x1610, 0x1078, 0x188e, 0x0078, 0x169e,
++      0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x166d, 0x0c7e,
++      0x2c68, 0x1078, 0x1874, 0x0040, 0x163e, 0x2c00, 0x689e, 0x8109,
++      0x00c0, 0x1618, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7218, 0x731c,
++      0x2c68, 0x689c, 0xa065, 0x0040, 0x166c, 0x2009, 0x0020, 0x1078,
++      0x186f, 0x00c0, 0x1655, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0002,
++      0x00c0, 0x163e, 0x2d00, 0x6002, 0x0078, 0x1626, 0x0c7f, 0x0c7e,
++      0x609c, 0x2060, 0x1078, 0x18f9, 0x0c7f, 0x609f, 0x0000, 0x1078,
++      0x16a2, 0x2009, 0x000e, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078,
++      0x186a, 0x1078, 0x188e, 0x0078, 0x169e, 0x0c7f, 0x0c7e, 0x609c,
++      0x2060, 0x1078, 0x18f9, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x16a2,
++      0x2009, 0x000e, 0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x186a,
++      0x1078, 0x188e, 0x0078, 0x169e, 0x0c7f, 0x74c4, 0x73c8, 0x72cc,
++      0x6014, 0x2091, 0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x4d40,
++      0x706f, 0x0005, 0x7073, 0x0000, 0x7376, 0x727a, 0x747e, 0x7082,
++      0x7087, 0x0000, 0x2c00, 0x708a, 0x708f, 0x0000, 0xa02e, 0x2530,
++      0x611c, 0x61a2, 0xa184, 0x0060, 0x0040, 0x1690, 0x1078, 0x4367,
++      0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3,
++      0x0000, 0x1078, 0x20a0, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005,
++      0x0078, 0x1270, 0x20a9, 0x0005, 0x2099, 0x4d18, 0x2091, 0x8000,
++      0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1,
++      0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7906,
++      0x0078, 0x126d, 0x71c4, 0x71c6, 0x2168, 0x0078, 0x16c1, 0x2069,
++      0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0,
++      0x16c3, 0xa285, 0x0000, 0x00c0, 0x16d1, 0x70c3, 0x4000, 0x0078,
++      0x16d3, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x1270, 0x2011, 0x4d67,
++      0x220c, 0x70c4, 0x8003, 0x0048, 0x16e3, 0x1078, 0x398d, 0xa184,
++      0x7fff, 0x0078, 0x16e7, 0x1078, 0x3980, 0xa185, 0x8000, 0x2012,
++      0x0078, 0x126c, 0x71c4, 0x1078, 0x3977, 0x6100, 0x2001, 0x4d67,
++      0x2004, 0xa084, 0x8000, 0xa10d, 0x6204, 0x6308, 0x0078, 0x126a,
++      0x79e4, 0x0078, 0x126c, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042,
++      0x20a9, 0x0004, 0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004,
++      0x53a3, 0x0078, 0x126d, 0x70c4, 0x2068, 0x2079, 0x4d00, 0x1078,
++      0x1874, 0x0040, 0x1793, 0x6007, 0x0001, 0x600b, 0x0000, 0x602b,
++      0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f, 0xa284, 0x00f0,
++      0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016, 0xa284, 0x0800,
++      0x0040, 0x172e, 0x601b, 0x000a, 0x0078, 0x1734, 0xa284, 0x1000,
++      0x0040, 0x1734, 0x601b, 0x000c, 0xa284, 0x0300, 0x0040, 0x173d,
++      0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085, 0x0001, 0x601e,
++      0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400, 0x0040, 0x174a,
++      0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b, 0x20a0, 0xad80,
++      0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0, 0x175f, 0x604a,
++      0x6046, 0x6052, 0x604e, 0x6096, 0x609a, 0x0078, 0x1769, 0x6800,
++      0x604a, 0x6804, 0x6046, 0x6e08, 0x6652, 0x6d0c, 0x654e, 0x6596,
++      0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042, 0x2c08, 0x2061,
++      0x4d40, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077, 0x0000, 0x607b,
++      0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284, 0x0400, 0x608e,
++      0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007,
++      0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000, 0x1078, 0x20a0,
++      0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1270, 0x0c7e,
++      0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071, 0x4d40, 0x2079,
++      0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040, 0x1818, 0x6a04,
++      0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x17b2, 0xa286, 0x000f,
++      0x00c0, 0x1818, 0x6920, 0xa184, 0x0080, 0x00c0, 0x1818, 0x6824,
++      0xa18c, 0xff00, 0xa085, 0x0019, 0x6826, 0x71b8, 0x81ff, 0x0040,
++      0x17d3, 0x0d7e, 0x2069, 0x0020, 0x6908, 0x6808, 0xa106, 0x00c0,
++      0x17c4, 0x690c, 0x680c, 0xa106, 0x00c0, 0x17c9, 0xa184, 0x00ff,
++      0x00c0, 0x17c9, 0x0d7f, 0x78b8, 0xa084, 0x801f, 0x00c0, 0x17d3,
++      0x7848, 0xa085, 0x000c, 0x784a, 0x71b8, 0x81ff, 0x0040, 0x17f6,
++      0x70bb, 0x0000, 0x0d7e, 0x2069, 0x0020, 0x6807, 0x0008, 0x6804,
++      0xa084, 0x0008, 0x00c0, 0x17e7, 0x6807, 0x0008, 0x6804, 0xa084,
++      0x0008, 0x00c0, 0x17ee, 0x6807, 0x0002, 0x0d7f, 0x61c4, 0x62c8,
++      0x63cc, 0x61c6, 0x62ca, 0x63ce, 0x0e7e, 0x2071, 0x4d00, 0x7266,
++      0x736a, 0xae80, 0x0019, 0x0e7f, 0x1078, 0x42b7, 0x78a3, 0x0000,
++      0x7858, 0xa084, 0xedff, 0x785a, 0x70bc, 0xa080, 0x00da, 0x781a,
++      0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x0078, 0x126d,
++      0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x2001, 0x4005,
++      0x0078, 0x126f, 0x7980, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8,
++      0x1265, 0x7982, 0x0078, 0x126d, 0x7980, 0x71c6, 0x0078, 0x126d,
++      0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978, 0x71ca, 0x71c8, 0x797a,
++      0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078, 0x126d, 0x7974, 0x71c6,
++      0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078, 0x126d, 0x7900, 0x71c6,
++      0x71c4, 0x7902, 0x00a8, 0x1856, 0xa18c, 0x0001, 0x00c0, 0x1854,
++      0x20b9, 0x2222, 0x0078, 0x1856, 0x20b9, 0x1212, 0x0078, 0x126d,
++      0x7900, 0x71c6, 0x0078, 0x126d, 0x2009, 0x4d74, 0x2104, 0x70c6,
++      0x70c4, 0x200a, 0x0078, 0x126d, 0x2009, 0x4d74, 0x2104, 0x70c6,
++      0x0078, 0x126d, 0xac80, 0x0001, 0x1078, 0x1a3d, 0x007c, 0xac80,
++      0x0001, 0x1078, 0x19f1, 0x007c, 0x7850, 0xa065, 0x0040, 0x187c,
++      0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x4d00,
++      0x7850, 0xa06d, 0x0040, 0x188c, 0x2d04, 0x7852, 0x6803, 0x0000,
++      0x6807, 0x0000, 0x680b, 0x0000, 0x0f7f, 0x007c, 0x2091, 0x8000,
++      0x0f7e, 0x2079, 0x4d00, 0x7850, 0x2062, 0x2c00, 0xa005, 0x00c0,
++      0x189b, 0x1078, 0x22ac, 0x7852, 0x0f7f, 0x2091, 0x8001, 0x007c,
++      0x0f7e, 0x2079, 0x4d00, 0x7850, 0x206a, 0x2d00, 0x7852, 0x0f7f,
++      0x007c, 0x2011, 0x7400, 0x7a52, 0x7bec, 0x8319, 0x0040, 0x18b6,
++      0xa280, 0x0031, 0x2012, 0x2010, 0x0078, 0x18ad, 0x2013, 0x0000,
++      0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003,
++      0x8003, 0x8003, 0xa105, 0xa0e8, 0x5000, 0x007c, 0x1078, 0x18b9,
++      0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d,
++      0x690a, 0x2009, 0x4d52, 0x210c, 0x6804, 0xa005, 0x0040, 0x18f8,
++      0xa116, 0x00c0, 0x18e3, 0x2060, 0x6000, 0x6806, 0x017e, 0x200b,
++      0x0000, 0x0078, 0x18e6, 0x2009, 0x0000, 0x017e, 0x6804, 0xa065,
++      0x0040, 0x18f5, 0x6000, 0x6806, 0x1078, 0x1906, 0x1078, 0x1b7d,
++      0x6810, 0x8001, 0x6812, 0x00c0, 0x18e6, 0x017f, 0x6902, 0x6906,
++      0x007c, 0xa065, 0x0040, 0x1905, 0x609c, 0x609f, 0x0000, 0x2008,
++      0x1078, 0x188e, 0x2100, 0x0078, 0x18f9, 0x007c, 0x6007, 0x0103,
++      0x608f, 0x0000, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001,
++      0x0000, 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e,
++      0x2071, 0x4d40, 0x704c, 0xa08c, 0x0200, 0x00c0, 0x1925, 0xa088,
++      0x4d80, 0x2d0a, 0x8000, 0x704e, 0xa006, 0x0e7f, 0x007c, 0x1078,
++      0x18b9, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040, 0x1970,
++      0x0078, 0x1938, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040, 0x1970,
++      0x6010, 0xa306, 0x00c0, 0x1932, 0x600c, 0xa206, 0x00c0, 0x1932,
++      0x2c28, 0x2001, 0x4d52, 0x2004, 0xac06, 0x00c0, 0x1949, 0x0078,
++      0x196e, 0x6804, 0xac06, 0x00c0, 0x1956, 0x6000, 0xa065, 0x6806,
++      0x00c0, 0x1960, 0x6803, 0x0000, 0x0078, 0x1960, 0x6400, 0x781c,
++      0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1960, 0x2c00, 0x6802,
++      0x2560, 0x1078, 0x1906, 0x601b, 0x0005, 0x6023, 0x0020, 0x1078,
++      0x1b7d, 0x6810, 0x8001, 0x1050, 0x22ac, 0x6812, 0xa085, 0xffff,
++      0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
++      0x0008, 0x2091, 0x8000, 0x1078, 0x18c6, 0x8738, 0xa784, 0x001f,
++      0x00c0, 0x197b, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784,
++      0x0f00, 0x00c0, 0x197b, 0x2091, 0x8001, 0x007c, 0x2061, 0x0000,
++      0x6018, 0xa084, 0x0001, 0x00c0, 0x199f, 0x2091, 0x8000, 0x78e0,
++      0x78e3, 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0, 0x19a0, 0x007c,
++      0xa08c, 0xfff0, 0x0040, 0x19a6, 0x1078, 0x22ac, 0x0079, 0x19a8,
++      0x19b8, 0x19bb, 0x19c1, 0x19c5, 0x19b9, 0x19c9, 0x19cf, 0x19b9,
++      0x19b9, 0x1b47, 0x1b6b, 0x1b6f, 0x19b9, 0x19b9, 0x19b9, 0x19b9,
++      0x007c, 0x1078, 0x22ac, 0x1078, 0x1971, 0x2001, 0x8001, 0x0078,
++      0x1b75, 0x2001, 0x8003, 0x0078, 0x1b75, 0x2001, 0x8004, 0x0078,
++      0x1b75, 0x1078, 0x1971, 0x2001, 0x8006, 0x0078, 0x1b75, 0x2001,
++      0x8007, 0x0078, 0x1b75, 0x2030, 0x2138, 0xa782, 0x0021, 0x0048,
++      0x19db, 0x2009, 0x0020, 0x2600, 0x1078, 0x19f1, 0x00c0, 0x19f0,
++      0xa7ba, 0x0020, 0x0048, 0x19ef, 0x0040, 0x19ef, 0x2708, 0xa6b0,
++      0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0x0078, 0x19d5, 0xa006,
++      0x007c, 0x81ff, 0x0040, 0x1a1c, 0x2099, 0x0030, 0x20a0, 0x700c,
++      0xa084, 0x00ff, 0x0040, 0x1a03, 0x7007, 0x0004, 0x7004, 0xa084,
++      0x0004, 0x00c0, 0x19fe, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112,
++      0x721a, 0x731e, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
++      0x7008, 0x800c, 0x00c8, 0x1a10, 0x7007, 0x0002, 0xa08c, 0x000c,
++      0x00c0, 0x1a1c, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x2030,
++      0x2138, 0xa782, 0x0021, 0x0048, 0x1a27, 0x2009, 0x0020, 0x2600,
++      0x1078, 0x1a3d, 0x00c0, 0x1a3c, 0xa7ba, 0x0020, 0x0048, 0x1a3b,
++      0x0040, 0x1a3b, 0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399,
++      0x0000, 0x0078, 0x1a21, 0xa006, 0x007c, 0x81ff, 0x0040, 0x1a6e,
++      0x2098, 0x20a1, 0x0030, 0x700c, 0xa084, 0x00ff, 0x0040, 0x1a4f,
++      0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x1a4a, 0x21a8,
++      0x7017, 0x0000, 0x810b, 0x7112, 0x721a, 0x731e, 0x780c, 0xa085,
++      0x0000, 0x7002, 0x53a6, 0x7007, 0x0001, 0x7010, 0xa084, 0xf000,
++      0x0040, 0x1a66, 0x7007, 0x0008, 0x0078, 0x1a6a, 0x7108, 0x8104,
++      0x00c8, 0x1a5d, 0x7007, 0x0002, 0xa184, 0x000c, 0x7003, 0x0000,
++      0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0004, 0x00c8, 0x1a7a,
++      0x0078, 0x1a7d, 0xa006, 0x0078, 0x1a7f, 0xa085, 0x0001, 0x007c,
++      0x0e7e, 0x2071, 0x4d00, 0x2d08, 0x7058, 0x6802, 0xa005, 0x00c0,
++      0x1a8a, 0x715e, 0x715a, 0x0e7f, 0x007c, 0x2c08, 0x7858, 0x6002,
++      0xa005, 0x00c0, 0x1a94, 0x795e, 0x795a, 0x007c, 0x2091, 0x8000,
++      0x6003, 0x0000, 0x2c08, 0x785c, 0xa065, 0x00c0, 0x1aa2, 0x795a,
++      0x0078, 0x1aa3, 0x6102, 0x795e, 0x2091, 0x8001, 0x1078, 0x20bd,
++      0x007c, 0x0e7e, 0x2071, 0x4d00, 0x7058, 0xa06d, 0x0040, 0x1ab7,
++      0x6800, 0x705a, 0xa005, 0x00c0, 0x1ab6, 0x705e, 0x8dff, 0x0e7f,
++      0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x4d00, 0xaf80, 0x0016,
++      0x2060, 0x6000, 0xa005, 0x0040, 0x1ae7, 0x2068, 0x6814, 0xa306,
++      0x00c0, 0x1ad0, 0x6828, 0xa084, 0x00ff, 0xa406, 0x0040, 0x1ad3,
++      0x2d60, 0x0078, 0x1ac1, 0x6800, 0xa005, 0x6002, 0x00c0, 0x1adf,
++      0xaf80, 0x0016, 0xac06, 0x0040, 0x1ade, 0x2c00, 0x785e, 0x0d7e,
++      0x689c, 0xa005, 0x0040, 0x1ae6, 0x1078, 0x18f9, 0x007f, 0x0f7f,
++      0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079,
++      0x4d00, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005, 0x0040, 0x1b16,
++      0x2068, 0x6814, 0xa084, 0x00ff, 0xa306, 0x0040, 0x1b02, 0x2d60,
++      0x0078, 0x1af4, 0x6800, 0xa005, 0x6002, 0x00c0, 0x1b0e, 0xaf80,
++      0x0016, 0xac06, 0x0040, 0x1b0d, 0x2c00, 0x785e, 0x0d7e, 0x689c,
++      0xa005, 0x0040, 0x1b15, 0x1078, 0x18f9, 0x007f, 0x0f7f, 0x0c7f,
++      0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x4d00,
++      0xaf80, 0x0016, 0x2060, 0x6000, 0xa06d, 0x0040, 0x1b42, 0x6814,
++      0xa306, 0x0040, 0x1b2e, 0x2d60, 0x0078, 0x1b23, 0x6800, 0xa005,
++      0x6002, 0x00c0, 0x1b3a, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1b39,
++      0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x1b41, 0x1078,
++      0x18f9, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x2091,
++      0x8000, 0x2069, 0x4d40, 0x6800, 0xa086, 0x0000, 0x0040, 0x1b55,
++      0x2091, 0x8001, 0x78e3, 0x0009, 0x007c, 0x6880, 0xa0bc, 0xff00,
++      0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078, 0x18c6,
++      0x8738, 0xa784, 0x001f, 0x00c0, 0x1b5e, 0x2091, 0x8001, 0x2001,
++      0x800a, 0x0078, 0x1b75, 0x2001, 0x800c, 0x0078, 0x1b75, 0x1078,
++      0x1971, 0x2001, 0x800d, 0x0078, 0x1b75, 0x70c2, 0x2061, 0x0000,
++      0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0x6004, 0x2c08, 0x2063,
++      0x0000, 0x7884, 0x8000, 0x7886, 0x7888, 0xa005, 0x798a, 0x0040,
++      0x1b8c, 0x2c02, 0x0078, 0x1b8d, 0x798e, 0x007c, 0x6807, 0x0103,
++      0x0c7e, 0x2061, 0x4d00, 0x2d08, 0x206b, 0x0000, 0x6084, 0x8000,
++      0x6086, 0x6088, 0xa005, 0x618a, 0x0040, 0x1ba1, 0x2d02, 0x0078,
++      0x1ba2, 0x618e, 0x0c7f, 0x007c, 0x1078, 0x1bb5, 0x0040, 0x1bb4,
++      0x0c7e, 0x609c, 0xa065, 0x0040, 0x1baf, 0x1078, 0x18f9, 0x0c7f,
++      0x609f, 0x0000, 0x1078, 0x188e, 0x007c, 0x788c, 0xa065, 0x0040,
++      0x1bc7, 0x2091, 0x8000, 0x7884, 0x8001, 0x7886, 0x2c04, 0x788e,
++      0xa005, 0x00c0, 0x1bc5, 0x788a, 0x8000, 0x2091, 0x8001, 0x007c,
++      0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x1bd1,
++      0xa200, 0x0070, 0x1bd5, 0x0078, 0x1bcc, 0x8086, 0x818e, 0x007c,
++      0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x1bfb, 0xa11a, 0x00c8,
++      0x1bfb, 0x8213, 0x818d, 0x0048, 0x1bec, 0xa11a, 0x00c8, 0x1bed,
++      0x0070, 0x1bf3, 0x0078, 0x1be1, 0xa11a, 0x2308, 0x8210, 0x0070,
++      0x1bf3, 0x0078, 0x1be1, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080,
++      0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078,
++      0x1bf7, 0x7994, 0x70d0, 0xa106, 0x0040, 0x1c6d, 0x2091, 0x8000,
++      0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1c6d, 0x7008, 0x7208,
++      0xa206, 0x00c0, 0x1c6d, 0xa286, 0x0002, 0x00c0, 0x1c6d, 0x2071,
++      0x0010, 0x1078, 0x1874, 0x0040, 0x1c6d, 0x7a9c, 0x7b98, 0xa184,
++      0xff00, 0x0040, 0x1c3b, 0x2031, 0x0000, 0x810b, 0x86b5, 0x810b,
++      0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b,
++      0x86b5, 0x2100, 0xa210, 0x2600, 0xa319, 0xa4a1, 0x0000, 0xa5a9,
++      0x0000, 0x0078, 0x1c45, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399,
++      0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x2009, 0x0020, 0x1078,
++      0x186f, 0x2091, 0x8001, 0x0040, 0x1c64, 0x1078, 0x188e, 0x78a8,
++      0x8000, 0x78aa, 0xa086, 0x0002, 0x00c0, 0x1c6d, 0x2091, 0x8000,
++      0x78e3, 0x0002, 0x78ab, 0x0000, 0x78cc, 0xa085, 0x0003, 0x78ce,
++      0x2091, 0x8001, 0x0078, 0x1c6d, 0x78ab, 0x0000, 0x1078, 0x1fa1,
++      0x6004, 0xa084, 0x000f, 0x0079, 0x1c72, 0x2071, 0x0010, 0x2091,
++      0x8001, 0x007c, 0x1c82, 0x1c91, 0x1cb1, 0x1c82, 0x1cce, 0x1c82,
++      0x1e29, 0x1e40, 0x1c82, 0x1c82, 0x1c82, 0x1d16, 0x1d7f, 0x1dcf,
++      0x1de1, 0x1c82, 0x2039, 0x0400, 0x78dc, 0xa705, 0x78de, 0x6008,
++      0xa705, 0x600a, 0x1078, 0x1ebc, 0x609c, 0x78da, 0x1078, 0x1f89,
++      0x007c, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1c98, 0x0078, 0x1c82,
++      0x78df, 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001,
++      0x609f, 0x0000, 0x0040, 0x1cae, 0x1078, 0x1ebc, 0x0040, 0x1cae,
++      0x78dc, 0xa085, 0x0100, 0x78de, 0x0078, 0x1cb0, 0x1078, 0x1ee0,
++      0x007c, 0x78dc, 0xa08c, 0x0e00, 0x00c0, 0x1cba, 0xa084, 0x0100,
++      0x00c0, 0x1cbc, 0x0078, 0x1c82, 0x1078, 0x1ebc, 0x00c0, 0x1ccd,
++      0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x1e72, 0xa186,
++      0x000f, 0x0040, 0x1e72, 0x1078, 0x1ee0, 0x007c, 0x78dc, 0xa084,
++      0x0100, 0x0040, 0x1cd5, 0x0078, 0x1c82, 0x78df, 0x0000, 0x6714,
++      0x2011, 0x0001, 0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff, 0xa005,
++      0x0040, 0x1cf8, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020,
++      0xa08e, 0x0001, 0x0040, 0x1cf8, 0x2039, 0x0000, 0x2011, 0x0002,
++      0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, 0x1cf8, 0x0078, 0x1d13,
++      0x1078, 0x18b9, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
++      0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001,
++      0x0070, 0x1d0c, 0x0078, 0x1cfa, 0x8211, 0x0040, 0x1d13, 0x20a9,
++      0x0100, 0x0078, 0x1cfa, 0x1078, 0x188e, 0x007c, 0x2001, 0x4d67,
++      0x2004, 0xa084, 0x8000, 0x0040, 0x1ea1, 0x6114, 0x1078, 0x1fb7,
++      0x6900, 0xa184, 0x0001, 0x0040, 0x1d37, 0x6028, 0xa084, 0x00ff,
++      0x00c0, 0x1e99, 0x6800, 0xa084, 0x0001, 0x0040, 0x1ea1, 0x6803,
++      0x0000, 0x680b, 0x0000, 0x6807, 0x0000, 0x0078, 0x1ea9, 0x2011,
++      0x0001, 0x601c, 0xa084, 0x4000, 0x0040, 0x1d40, 0xa295, 0x0002,
++      0x601c, 0xa084, 0x0100, 0x0040, 0x1d47, 0xa295, 0x0008, 0x6020,
++      0xa084, 0x0002, 0x0040, 0x1d4e, 0xa295, 0x0004, 0x602c, 0xa08c,
++      0x00ff, 0xa182, 0x0002, 0x0048, 0x1ea5, 0xa182, 0x0019, 0x00c8,
++      0x1ea5, 0x690e, 0x602c, 0x8007, 0xa08c, 0x00ff, 0xa182, 0x0002,
++      0x0048, 0x1ea5, 0xa182, 0x0019, 0x00c8, 0x1ea5, 0x6912, 0x6030,
++      0xa005, 0x00c0, 0x1d6d, 0x2001, 0x001e, 0x8000, 0x6816, 0x6028,
++      0xa084, 0x00ff, 0x0040, 0x1ea1, 0x6806, 0x6028, 0x8007, 0xa084,
++      0x00ff, 0x0040, 0x1ea1, 0x680a, 0x6a02, 0x0078, 0x1ea9, 0x2001,
++      0x4d67, 0x2004, 0xa084, 0x8000, 0x0040, 0x1ea1, 0x6114, 0x1078,
++      0x1fb7, 0x2091, 0x8000, 0x6a04, 0x6b08, 0x6418, 0xa484, 0x0003,
++      0x0040, 0x1da5, 0x6128, 0xa18c, 0x00ff, 0x8001, 0x00c0, 0x1d9e,
++      0x2100, 0xa210, 0x0048, 0x1dcb, 0x0078, 0x1da5, 0x8001, 0x00c0,
++      0x1dcb, 0x2100, 0xa212, 0x0048, 0x1dcb, 0xa484, 0x000c, 0x0040,
++      0x1dbf, 0x6128, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0,
++      0x1db7, 0x2100, 0xa318, 0x0048, 0x1dcb, 0x0078, 0x1dbf, 0xa082,
++      0x0004, 0x00c0, 0x1dcb, 0x2100, 0xa31a, 0x0048, 0x1dcb, 0x6030,
++      0xa005, 0x0040, 0x1dc5, 0x8000, 0x6816, 0x6a06, 0x6b0a, 0x2091,
++      0x8001, 0x0078, 0x1ea9, 0x2091, 0x8001, 0x0078, 0x1ea5, 0x6114,
++      0x1078, 0x1fb7, 0x2091, 0x8000, 0x6b08, 0x8318, 0x0048, 0x1ddd,
++      0x6b0a, 0x2091, 0x8001, 0x0078, 0x1eb8, 0x2091, 0x8001, 0x0078,
++      0x1ea5, 0x6024, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1dff, 0xa086,
++      0x0080, 0x00c0, 0x1e27, 0x20a9, 0x0008, 0x2069, 0x7110, 0x2091,
++      0x8000, 0x6800, 0xa084, 0xfcff, 0x6802, 0xade8, 0x0008, 0x0070,
++      0x1dfb, 0x0078, 0x1df1, 0x2091, 0x8001, 0x0078, 0x1ea9, 0x6028,
++      0xa015, 0x0040, 0x1e27, 0x6114, 0x1078, 0x1fb7, 0x0d7e, 0xade8,
++      0x0007, 0x2091, 0x8000, 0x6800, 0xa00d, 0x0040, 0x1e24, 0xa206,
++      0x0040, 0x1e15, 0x2168, 0x0078, 0x1e0b, 0x0c7e, 0x2160, 0x6000,
++      0x6802, 0x1078, 0x188e, 0x0c7f, 0x0d7f, 0x6808, 0x8000, 0x680a,
++      0x2091, 0x8001, 0x0078, 0x1eb8, 0x2091, 0x8001, 0x0d7f, 0x0078,
++      0x1ea1, 0x6114, 0x1078, 0x1fb7, 0x6800, 0xa084, 0x0001, 0x0040,
++      0x1e91, 0x2091, 0x8000, 0x6a04, 0x8210, 0x0048, 0x1e3c, 0x6a06,
++      0x2091, 0x8001, 0x0078, 0x1eb8, 0x2091, 0x8001, 0x0078, 0x1ea5,
++      0x6114, 0x1078, 0x1fb7, 0x60be, 0x6900, 0xa184, 0x0008, 0x0040,
++      0x1e4d, 0x601c, 0xa085, 0x0100, 0x601e, 0xa184, 0x0001, 0x0040,
++      0x1ea1, 0xa184, 0x0100, 0x00c0, 0x1e8d, 0xa184, 0x0200, 0x00c0,
++      0x1e89, 0x681c, 0xa005, 0x00c0, 0x1e95, 0x78df, 0x0000, 0x6004,
++      0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f, 0x0000, 0x0040,
++      0x1e72, 0x1078, 0x1ebc, 0x0040, 0x1e72, 0x78dc, 0xa085, 0x0100,
++      0x78de, 0x007c, 0x78d7, 0x0000, 0x78db, 0x0000, 0x6024, 0xa084,
++      0xff00, 0x6026, 0x6020, 0xa084, 0x8000, 0x0040, 0x1e85, 0x1078,
++      0x37e7, 0x0040, 0x1c01, 0x0078, 0x1e91, 0x1078, 0x1a96, 0x0078,
++      0x1c01, 0x2009, 0x0017, 0x0078, 0x1eab, 0x2009, 0x000e, 0x0078,
++      0x1eab, 0x2009, 0x0007, 0x0078, 0x1eab, 0x2009, 0x0035, 0x0078,
++      0x1eab, 0x2009, 0x003e, 0x0078, 0x1eab, 0x2009, 0x0004, 0x0078,
++      0x1eab, 0x2009, 0x0006, 0x0078, 0x1eab, 0x2009, 0x0016, 0x0078,
++      0x1eab, 0x2009, 0x0001, 0x6024, 0xa084, 0xff00, 0xa105, 0x6026,
++      0x2091, 0x8000, 0x1078, 0x1b7d, 0x2091, 0x8001, 0x0078, 0x1c01,
++      0x1078, 0x188e, 0x0078, 0x1c01, 0x78d4, 0xa06d, 0x00c0, 0x1ec7,
++      0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000, 0x0078, 0x1ed3, 0x2c00,
++      0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00, 0x6002, 0x78d8, 0xad06,
++      0x00c0, 0x1ed3, 0x6002, 0x78d0, 0x8001, 0x78d2, 0x00c0, 0x1edf,
++      0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8, 0x2060, 0xa006, 0x007c,
++      0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xe1ff, 0x601e, 0xa184,
++      0x0060, 0x0040, 0x1eef, 0x0e7e, 0x1078, 0x4367, 0x0e7f, 0x6596,
++      0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714,
++      0x1078, 0x18b9, 0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x00c0,
++      0x1f16, 0x6808, 0xa084, 0x0001, 0x0040, 0x1f16, 0x2091, 0x8001,
++      0x1078, 0x1906, 0x2091, 0x8000, 0x1078, 0x1b7d, 0x2091, 0x8001,
++      0x78d7, 0x0000, 0x78db, 0x0000, 0x0078, 0x1f88, 0x6024, 0xa096,
++      0x0001, 0x00c0, 0x1f1d, 0x8000, 0x6026, 0x6a10, 0x6814, 0x2091,
++      0x8001, 0xa202, 0x0048, 0x1f2c, 0x0040, 0x1f2c, 0x2039, 0x0200,
++      0x1078, 0x1f89, 0x0078, 0x1f88, 0x2c08, 0x2091, 0x8000, 0x60a0,
++      0xa084, 0x8000, 0x0040, 0x1f59, 0x6800, 0xa065, 0x0040, 0x1f5e,
++      0x6a04, 0x0e7e, 0x2071, 0x4d40, 0x7000, 0xa084, 0x0001, 0x0040,
++      0x1f53, 0x7048, 0xa206, 0x00c0, 0x1f53, 0x6b04, 0x231c, 0x2160,
++      0x6302, 0x2300, 0xa005, 0x00c0, 0x1f4e, 0x6902, 0x2260, 0x6102,
++      0x0e7f, 0x0078, 0x1f65, 0x2160, 0x6202, 0x6906, 0x0e7f, 0x0078,
++      0x1f65, 0x6800, 0xa065, 0x0040, 0x1f5e, 0x6102, 0x6902, 0x00c0,
++      0x1f62, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160, 0x60a0, 0xa084,
++      0x8000, 0x0040, 0x1f6f, 0x6808, 0xa084, 0xfffc, 0x680a, 0x6810,
++      0x8000, 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c, 0x0040, 0x0040,
++      0x1f7e, 0xa086, 0x0040, 0x680a, 0x1078, 0x1917, 0x2091, 0x8000,
++      0x1078, 0x20a0, 0x2091, 0x8001, 0x78db, 0x0000, 0x78d7, 0x0000,
++      0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x1b7d,
++      0x2091, 0x8001, 0x78d8, 0xa065, 0x0040, 0x1f9c, 0x609c, 0x78da,
++      0x609f, 0x0000, 0x0078, 0x1f8c, 0x78d7, 0x0000, 0x78db, 0x0000,
++      0x007c, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8, 0x1fa8, 0xa006,
++      0x7896, 0x70d2, 0x7804, 0xa005, 0x0040, 0x1fb6, 0x8001, 0x7806,
++      0x00c0, 0x1fb6, 0x0068, 0x1fb6, 0x2091, 0x4080, 0x007c, 0x0c7e,
++      0x1078, 0x3977, 0x2c68, 0x0c7f, 0x007c, 0x0010, 0x202e, 0x0068,
++      0x202e, 0x2029, 0x0000, 0x78cb, 0x0000, 0x788c, 0xa065, 0x0040,
++      0x2027, 0x2009, 0x4d74, 0x2104, 0xa084, 0x0001, 0x0040, 0x1ff5,
++      0x6004, 0xa086, 0x0103, 0x00c0, 0x1ff5, 0x6018, 0xa005, 0x00c0,
++      0x1ff5, 0x6014, 0xa005, 0x00c0, 0x1ff5, 0x0d7e, 0x2069, 0x0000,
++      0x6818, 0xa084, 0x0001, 0x00c0, 0x1ff4, 0x6010, 0x70c6, 0x600c,
++      0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, 0x4080, 0x0d7f,
++      0x1078, 0x1ba4, 0x0078, 0x202c, 0x0d7f, 0x1078, 0x202f, 0x0040,
++      0x2027, 0x6204, 0xa294, 0x00ff, 0xa296, 0x0003, 0x0040, 0x2007,
++      0x6204, 0xa296, 0x0110, 0x00c0, 0x2015, 0x78cb, 0x0001, 0x6204,
++      0xa294, 0xff00, 0x8217, 0x8211, 0x0040, 0x2015, 0x85ff, 0x00c0,
++      0x2027, 0x8210, 0xa202, 0x00c8, 0x2027, 0x057e, 0x1078, 0x203e,
++      0x057f, 0x0040, 0x2022, 0x78e0, 0xa086, 0x0003, 0x0040, 0x2027,
++      0x0078, 0x2015, 0x8528, 0x78c8, 0xa005, 0x0040, 0x1fc5, 0x85ff,
++      0x0040, 0x202e, 0x2091, 0x4080, 0x78b0, 0x70d6, 0x007c, 0x7bac,
++      0x79b0, 0x70d4, 0xa102, 0x00c0, 0x2038, 0x2300, 0xa005, 0x007c,
++      0x0048, 0x203c, 0xa302, 0x007c, 0x8002, 0x007c, 0x2001, 0x04fd,
++      0x2004, 0xa082, 0x0005, 0x00c8, 0x2058, 0x2091, 0x8000, 0x2071,
++      0x0020, 0x7004, 0xa005, 0x00c0, 0x208d, 0x7008, 0x7208, 0xa206,
++      0x00c0, 0x208d, 0xa286, 0x0002, 0x00c0, 0x208d, 0x2071, 0x0010,
++      0x1078, 0x2092, 0x2009, 0x0020, 0x6004, 0xa086, 0x0103, 0x00c0,
++      0x2067, 0x6028, 0xa005, 0x00c0, 0x2067, 0x2009, 0x000e, 0x1078,
++      0x186a, 0x0040, 0x2080, 0x78c4, 0x8000, 0x78c6, 0xa086, 0x0002,
++      0x00c0, 0x208d, 0x2091, 0x8000, 0x78e3, 0x0003, 0x78c7, 0x0000,
++      0x78cc, 0xa085, 0x0300, 0x78ce, 0x2091, 0x8001, 0x0078, 0x208d,
++      0x78c7, 0x0000, 0x1078, 0x1ba4, 0x79ac, 0x78b0, 0x8000, 0xa10a,
++      0x00c8, 0x208b, 0xa006, 0x78b2, 0xa006, 0x2071, 0x0010, 0x2091,
++      0x8001, 0x007c, 0x8107, 0x8004, 0x8004, 0x7ab8, 0x7bb4, 0xa210,
++      0xa399, 0x0000, 0x007c, 0x2009, 0x4d5b, 0x2091, 0x8000, 0x200a,
++      0x0f7e, 0x0e7e, 0x2071, 0x4d40, 0x7000, 0xa086, 0x0000, 0x00c0,
++      0x20ba, 0x2009, 0x4d12, 0x2104, 0xa005, 0x00c0, 0x20ba, 0x2079,
++      0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x20ba, 0x0018, 0x20ba,
++      0x781b, 0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x2071,
++      0x4d40, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000, 0x00c0, 0x20d3,
++      0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x20d3, 0x0018,
++      0x20d3, 0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f, 0x0f7f, 0x007c,
++      0x127e, 0x2091, 0x2300, 0x2071, 0x4d40, 0x2079, 0x0100, 0x784b,
++      0x000f, 0x0098, 0x20e6, 0x7838, 0x0078, 0x20df, 0x20a9, 0x0040,
++      0x7800, 0xa082, 0x0004, 0x0048, 0x20ef, 0x20a9, 0x0060, 0x789b,
++      0x0000, 0x78af, 0x0000, 0x78af, 0x0000, 0x0070, 0x20f9, 0x0078,
++      0x20f1, 0x7800, 0xa082, 0x0004, 0x0048, 0x2108, 0x70bf, 0x009f,
++      0x2019, 0x4ab1, 0x1078, 0x2137, 0x702f, 0x8001, 0x0078, 0x2114,
++      0x70bf, 0x0000, 0x2019, 0x4916, 0x1078, 0x2137, 0x2019, 0x4955,
++      0x1078, 0x2137, 0x702f, 0x8000, 0x7003, 0x0000, 0x1078, 0x2240,
++      0x7004, 0xa084, 0x000f, 0x017e, 0x0028, 0x2122, 0xa085, 0x6280,
++      0x0078, 0x2124, 0xa085, 0x62c0, 0x017f, 0x7806, 0x780f, 0xb204,
++      0x7843, 0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x0008,
++      0x7053, 0x4d7f, 0x704f, 0x0000, 0x127f, 0x2000, 0x007c, 0x137e,
++      0x147e, 0x157e, 0x047e, 0x20a1, 0x012b, 0x2304, 0xa005, 0x789a,
++      0x0040, 0x2157, 0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484,
++      0xff00, 0x0040, 0x214f, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020,
++      0x53a6, 0xa005, 0x00c0, 0x2146, 0x3318, 0x0078, 0x213d, 0x047f,
++      0x157f, 0x147f, 0x137f, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101,
++      0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x2240, 0x007c,
++      0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x2171, 0x0078,
++      0x216c, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012,
++      0x007c, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x2182,
++      0x0078, 0x217d, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205,
++      0x200a, 0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070,
++      0x2193, 0x0078, 0x218e, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff,
++      0xa105, 0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf,
++      0xa105, 0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e,
++      0x2061, 0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103,
++      0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4,
++      0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080,
++      0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020,
++      0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e,
++      0x2061, 0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae,
++      0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818,
++      0xa005, 0x0040, 0x221e, 0x2061, 0x7100, 0x1078, 0x2226, 0x0040,
++      0x220a, 0x20a9, 0x0000, 0x2061, 0x7000, 0x0c7e, 0x1078, 0x2226,
++      0x0040, 0x21fa, 0x0c7f, 0x8c60, 0x0070, 0x21f8, 0x0078, 0x21ed,
++      0x0078, 0x221e, 0x007f, 0xa082, 0x7000, 0x2071, 0x4d40, 0x7086,
++      0x7182, 0x2001, 0x0004, 0x706e, 0x7093, 0x000f, 0x1078, 0x209b,
++      0x0078, 0x221a, 0x60c0, 0xa005, 0x00c0, 0x221e, 0x2071, 0x4d40,
++      0x7182, 0x2c00, 0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f,
++      0x1078, 0x209b, 0x2001, 0x0000, 0x0078, 0x2220, 0x2001, 0x0001,
++      0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005,
++      0x0040, 0x223d, 0x2060, 0x6010, 0xa306, 0x00c0, 0x223a, 0x600c,
++      0xa206, 0x00c0, 0x223a, 0x6014, 0xa106, 0x00c0, 0x223a, 0xa006,
++      0x0078, 0x223f, 0x6000, 0x0078, 0x2227, 0xa085, 0x0001, 0x007c,
++      0x2011, 0x4d41, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204,
++      0xa084, 0x0100, 0x0040, 0x2256, 0x2021, 0xff04, 0x2122, 0x810b,
++      0x810b, 0x810b, 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e,
++      0x68e4, 0xa08c, 0x0020, 0x0040, 0x22aa, 0xa084, 0x0006, 0x00c0,
++      0x22aa, 0x6014, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xa0f0, 0x4f80, 0x7004, 0xa084, 0x000a, 0x00c0, 0x22aa, 0x7108,
++      0xa194, 0xff00, 0x0040, 0x22aa, 0xa18c, 0x00ff, 0x2001, 0x000c,
++      0xa106, 0x0040, 0x2291, 0x2001, 0x0012, 0xa106, 0x0040, 0x2295,
++      0x2001, 0x0014, 0xa106, 0x0040, 0x2299, 0x2001, 0x0019, 0xa106,
++      0x0040, 0x229d, 0x2001, 0x0032, 0xa106, 0x0040, 0x22a1, 0x0078,
++      0x22a5, 0x2009, 0x0012, 0x0078, 0x22a7, 0x2009, 0x0014, 0x0078,
++      0x22a7, 0x2009, 0x0019, 0x0078, 0x22a7, 0x2009, 0x0020, 0x0078,
++      0x22a7, 0x2009, 0x003f, 0x0078, 0x22a7, 0x2011, 0x0000, 0x2100,
++      0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068, 0x22ac, 0x2091, 0x8000,
++      0x2071, 0x0000, 0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x22b3,
++      0x007f, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002,
++      0x70db, 0x0737, 0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001,
++      0x2091, 0x4080, 0x0078, 0x22ca, 0x107e, 0x007e, 0x127e, 0x2091,
++      0x2300, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca,
++      0x75ce, 0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079,
++      0x22e1, 0x22f3, 0x22f3, 0x22f3, 0x2624, 0x3741, 0x22f1, 0x2322,
++      0x232c, 0x22f1, 0x22f1, 0x22f1, 0x22f1, 0x22f1, 0x22f1, 0x22f1,
++      0x22f1, 0x1078, 0x22ac, 0x8507, 0xa084, 0x001f, 0x0079, 0x22f8,
++      0x2336, 0x2624, 0x27d8, 0x28d5, 0x28fd, 0x2b6d, 0x2e18, 0x2e5b,
++      0x2ea6, 0x2f2b, 0x2fb1, 0x3056, 0x2322, 0x26fc, 0x2ded, 0x2318,
++      0x3a92, 0x3ab2, 0x3be5, 0x3bf1, 0x3ca2, 0x2318, 0x2318, 0x3d53,
++      0x3d57, 0x3a90, 0x2318, 0x3b8c, 0x2318, 0x399a, 0x232c, 0x2318,
++      0x1078, 0x22ac, 0x0018, 0x22d1, 0x127f, 0x2091, 0x8001, 0x007f,
++      0x107f, 0x007c, 0x2019, 0x4a07, 0x1078, 0x2137, 0x702f, 0x0001,
++      0x781b, 0x004f, 0x0078, 0x231a, 0x2019, 0x4955, 0x1078, 0x2137,
++      0x702f, 0x8000, 0x781b, 0x00e1, 0x0078, 0x231a, 0x7242, 0x2009,
++      0x4d0f, 0x200b, 0x0000, 0xa584, 0x0001, 0x00c0, 0x39a6, 0x0040,
++      0x2353, 0x1078, 0x22ac, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043,
++      0x0000, 0x7037, 0x0000, 0x1078, 0x371d, 0x0018, 0x22d1, 0x2009,
++      0x4d0f, 0x200b, 0x0000, 0x7068, 0xa005, 0x00c0, 0x2426, 0x706c,
++      0xa084, 0x0007, 0x0079, 0x235c, 0x245d, 0x2364, 0x2370, 0x238f,
++      0x23b3, 0x2404, 0x23db, 0x2364, 0x1078, 0x3705, 0x2009, 0x0048,
++      0x1078, 0x2cc3, 0x00c0, 0x236e, 0x7003, 0x0004, 0x0078, 0x231a,
++      0x1078, 0x3705, 0x00c0, 0x238d, 0x7080, 0x8007, 0x789b, 0x0080,
++      0x78aa, 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab,
++      0x0001, 0x785b, 0x0004, 0x2009, 0x00f2, 0x1078, 0x2cb7, 0x00c0,
++      0x238d, 0x7003, 0x0004, 0x7093, 0x000f, 0x0078, 0x231a, 0x1078,
++      0x3705, 0x00c0, 0x23b1, 0x7180, 0x8107, 0x789b, 0x0080, 0x78aa,
++      0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab,
++      0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009,
++      0x00f2, 0x1078, 0x2cb7, 0x00c0, 0x23b1, 0x7003, 0x0004, 0x7093,
++      0x000f, 0x0078, 0x231a, 0x1078, 0x3705, 0x00c0, 0x23d9, 0x7180,
++      0x8107, 0x789b, 0x0080, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x001f,
++      0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184, 0x79aa, 0x78ab,
++      0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009,
++      0x00f2, 0x1078, 0x2cb7, 0x00c0, 0x23d9, 0x7003, 0x0004, 0x7093,
++      0x000f, 0x0078, 0x231a, 0x1078, 0x3705, 0x00c0, 0x2402, 0x7180,
++      0x8107, 0x789b, 0x0080, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x001f,
++      0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab,
++      0x0002, 0x785b, 0x0004, 0x2009, 0x00f2, 0x1078, 0x2cb7, 0x00c0,
++      0x2402, 0x7088, 0x708b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0002,
++      0x7093, 0x000f, 0x0078, 0x231a, 0x1078, 0x3705, 0x00c0, 0x231a,
++      0x7088, 0x2068, 0x6f14, 0x1078, 0x35fc, 0x2c50, 0x1078, 0x37b5,
++      0x789b, 0x0010, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa,
++      0x6e1c, 0x2041, 0x0001, 0x708c, 0xa084, 0x0400, 0x2001, 0x0004,
++      0x0040, 0x2424, 0x2001, 0x0006, 0x0078, 0x2545, 0x1078, 0x3705,
++      0x00c0, 0x231a, 0x789b, 0x0010, 0x7068, 0x2068, 0x6f14, 0x1078,
++      0x35fc, 0x2c50, 0x1078, 0x37b5, 0x6008, 0xa085, 0x0010, 0x600a,
++      0x6824, 0xa005, 0x0040, 0x2444, 0xa082, 0x0006, 0x0048, 0x2442,
++      0x0078, 0x2444, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f, 0xa39d,
++      0x00c0, 0x7058, 0xa084, 0x8000, 0x0040, 0x2452, 0xa684, 0x0001,
++      0x0040, 0x2454, 0xa39c, 0xffbf, 0x7baa, 0x2031, 0x0020, 0x2041,
++      0x0001, 0x2001, 0x0003, 0x0078, 0x2545, 0x0018, 0x22d1, 0x744c,
++      0xa485, 0x0000, 0x0040, 0x2477, 0xa080, 0x4d80, 0x2030, 0x7150,
++      0x8108, 0xa12a, 0x0048, 0x246e, 0x2009, 0x4d80, 0x2164, 0x6504,
++      0x85ff, 0x00c0, 0x2488, 0x8421, 0x00c0, 0x2468, 0x7152, 0x7003,
++      0x0000, 0x704b, 0x0000, 0x7040, 0xa005, 0x0040, 0x39a6, 0x0078,
++      0x231a, 0x764c, 0xa6b0, 0x4d80, 0x7150, 0x2600, 0x0078, 0x2473,
++      0x7152, 0x2568, 0x2558, 0x754a, 0x2c50, 0x6034, 0xa085, 0x0000,
++      0x00c0, 0x2485, 0x6708, 0x773a, 0xa784, 0x033f, 0x0040, 0x24be,
++      0xa784, 0x0021, 0x00c0, 0x2485, 0xa784, 0x0002, 0x0040, 0x24a7,
++      0xa784, 0x0004, 0x0040, 0x2485, 0xa7bc, 0xfffb, 0x670a, 0xa784,
++      0x0008, 0x00c0, 0x2485, 0xa784, 0x0010, 0x00c0, 0x2485, 0xa784,
++      0x0200, 0x00c0, 0x2485, 0xa784, 0x0100, 0x0040, 0x24be, 0x6018,
++      0xa005, 0x00c0, 0x2485, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000,
++      0x6e1c, 0xa684, 0x000e, 0x6118, 0x0040, 0x24ce, 0x601c, 0xa102,
++      0x0048, 0x24d1, 0x0040, 0x24d1, 0x0078, 0x2481, 0x81ff, 0x00c0,
++      0x2481, 0x68c3, 0x0000, 0xa784, 0x0080, 0x00c0, 0x24d9, 0x700c,
++      0x6022, 0xa7bc, 0xff7f, 0x670a, 0x1078, 0x37b5, 0x0018, 0x22d1,
++      0x789b, 0x0010, 0xa046, 0x1078, 0x3705, 0x00c0, 0x231a, 0x6b14,
++      0xa39c, 0x001f, 0xa39d, 0x00c0, 0x7058, 0xa084, 0x8000, 0x0040,
++      0x24f5, 0xa684, 0x0001, 0x0040, 0x24f7, 0xa39c, 0xffbf, 0xa684,
++      0x0010, 0x0040, 0x24fd, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684,
++      0x000e, 0x00c0, 0x2508, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x2543,
++      0x7158, 0xa18c, 0x0800, 0x0040, 0x322a, 0x2011, 0x0020, 0xa684,
++      0x0008, 0x00c0, 0x2519, 0x8210, 0xa684, 0x0002, 0x00c0, 0x2519,
++      0x8210, 0x7aaa, 0x8840, 0x1078, 0x371d, 0x6a14, 0x610c, 0x8108,
++      0xa18c, 0x00ff, 0xa1e0, 0x7000, 0x2c64, 0x8cff, 0x0040, 0x253a,
++      0x6014, 0xa206, 0x00c0, 0x2524, 0x60b8, 0x8001, 0x60ba, 0x00c0,
++      0x251f, 0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f,
++      0x0078, 0x245d, 0x1078, 0x3705, 0x00c0, 0x231a, 0x2a60, 0x610e,
++      0x79aa, 0x8840, 0x7132, 0x2001, 0x0001, 0x007e, 0x715c, 0xa184,
++      0x0018, 0x0040, 0x2560, 0xa184, 0x0010, 0x0040, 0x2553, 0x1078,
++      0x3429, 0x00c0, 0x2583, 0xa184, 0x0008, 0x0040, 0x2560, 0x69a0,
++      0xa184, 0x0600, 0x00c0, 0x2560, 0x1078, 0x331a, 0x0078, 0x2583,
++      0x69a0, 0xa184, 0x0800, 0x0040, 0x2577, 0x0c7e, 0x027e, 0x2960,
++      0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106,
++      0x027f, 0x0c7f, 0x1078, 0x3429, 0x00c0, 0x2583, 0x69a0, 0xa184,
++      0x0200, 0x0040, 0x257f, 0x1078, 0x3369, 0x0078, 0x2583, 0xa184,
++      0x0400, 0x00c0, 0x255c, 0x69a0, 0xa184, 0x1000, 0x0040, 0x258e,
++      0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x21af, 0x007f, 0x7002,
++      0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x259c, 0xa086, 0x0060,
++      0x00c0, 0x259c, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x25a1, 0xa18d,
++      0x0004, 0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b,
++      0x0061, 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, 0x8008, 0x810c,
++      0x0040, 0x3230, 0xa18c, 0x00f8, 0x00c0, 0x3230, 0x157e, 0x137e,
++      0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
++      0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0x8007,
++      0x789b, 0x0080, 0x78aa, 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2,
++      0x7eda, 0x1078, 0x3705, 0x00c0, 0x25e6, 0x702c, 0x8003, 0x0048,
++      0x25df, 0x2019, 0x4955, 0x1078, 0x2137, 0x702f, 0x8000, 0x7830,
++      0xa084, 0x00c0, 0x00c0, 0x25e6, 0x0098, 0x25ee, 0x6008, 0xa084,
++      0xffef, 0x600a, 0x1078, 0x371d, 0x0078, 0x2343, 0x7200, 0xa284,
++      0x0007, 0xa086, 0x0001, 0x00c0, 0x25fb, 0x781b, 0x004f, 0x1078,
++      0x371d, 0x0078, 0x260c, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b,
++      0x004f, 0x1078, 0x371d, 0x7200, 0x2500, 0xa605, 0x0040, 0x260c,
++      0xa284, 0x0007, 0x1079, 0x261a, 0xad80, 0x0009, 0x7036, 0xa284,
++      0x0007, 0xa086, 0x0001, 0x00c0, 0x231a, 0x6018, 0x8000, 0x601a,
++      0x0078, 0x231a, 0x2622, 0x45ed, 0x45ed, 0x45dc, 0x45ed, 0x2622,
++      0x45dc, 0x2622, 0x1078, 0x22ac, 0x1078, 0x3705, 0x0f7e, 0x2079,
++      0x4d00, 0x78cc, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2648, 0x706c,
++      0xa086, 0x0001, 0x00c0, 0x2637, 0x706e, 0x0078, 0x26d9, 0x706c,
++      0xa086, 0x0005, 0x00c0, 0x2646, 0x7088, 0x2068, 0x681b, 0x0004,
++      0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x706f, 0x0000,
++      0x2011, 0x0004, 0x716c, 0xa186, 0x0001, 0x0040, 0x2669, 0xa186,
++      0x0007, 0x00c0, 0x2659, 0x2009, 0x4d38, 0x200b, 0x0005, 0x0078,
++      0x2669, 0x2009, 0x4d13, 0x2104, 0x2009, 0x4d12, 0x200a, 0x2009,
++      0x4d38, 0x200b, 0x0001, 0x706f, 0x0000, 0x7073, 0x0001, 0x0078,
++      0x266b, 0x706f, 0x0000, 0x1078, 0x431b, 0x157e, 0x20a9, 0x0010,
++      0x2039, 0x0000, 0x1078, 0x34f9, 0xa7b8, 0x0100, 0x0070, 0x267a,
++      0x0078, 0x2672, 0x157f, 0x7000, 0x0079, 0x267e, 0x26aa, 0x2693,
++      0x2693, 0x2686, 0x26aa, 0x26aa, 0x26aa, 0x26aa, 0x2021, 0x4d5a,
++      0x2404, 0xa005, 0x0040, 0x26aa, 0xad06, 0x00c0, 0x2693, 0x6800,
++      0x2022, 0x0078, 0x26a3, 0x6820, 0xa084, 0x0001, 0x00c0, 0x269f,
++      0x6f14, 0x1078, 0x35fc, 0x1078, 0x3201, 0x0078, 0x26a3, 0x7060,
++      0x2060, 0x6800, 0x6002, 0x6a1a, 0x6820, 0xa085, 0x0008, 0x6822,
++      0x1078, 0x1b8e, 0x2021, 0x7100, 0x1078, 0x26e6, 0x2021, 0x4d5a,
++      0x1078, 0x26e6, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7000, 0x1078,
++      0x26e6, 0x8420, 0x0070, 0x26be, 0x0078, 0x26b7, 0x2061, 0x5000,
++      0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0x81ff, 0x0040,
++      0x26cd, 0xa102, 0x0050, 0x26cd, 0x6012, 0x601b, 0x0000, 0xace0,
++      0x0010, 0x0070, 0x26d5, 0x0078, 0x26c4, 0x8421, 0x00c0, 0x26c2,
++      0x157f, 0x709c, 0xa084, 0x8000, 0x0040, 0x26e0, 0x1078, 0x3810,
++      0x7003, 0x0000, 0x704b, 0x0000, 0x0078, 0x231a, 0x047e, 0x2404,
++      0xa005, 0x0040, 0x26f8, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6820,
++      0xa085, 0x0008, 0x6822, 0x1078, 0x1b8e, 0x007f, 0x0078, 0x26e8,
++      0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x2702,
++      0x1078, 0x22ac, 0x2300, 0x0079, 0x2705, 0x2708, 0x277b, 0x2798,
++      0xa282, 0x0002, 0x0040, 0x270e, 0x1078, 0x22ac, 0x706c, 0x706f,
++      0x0000, 0x7093, 0x0000, 0x0079, 0x2715, 0x271d, 0x271d, 0x271f,
++      0x2753, 0x3236, 0x271d, 0x2753, 0x271d, 0x1078, 0x22ac, 0x7780,
++      0x1078, 0x34f9, 0x7780, 0xa7bc, 0x0f00, 0x1078, 0x35fc, 0x6018,
++      0xa005, 0x0040, 0x274a, 0x2021, 0x7100, 0x2009, 0x0004, 0x2011,
++      0x0010, 0x1078, 0x27b3, 0x0040, 0x274a, 0x157e, 0x20a9, 0x0000,
++      0x2021, 0x7000, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078,
++      0x27b3, 0x047f, 0x0040, 0x2749, 0x8420, 0x0070, 0x2749, 0x0078,
++      0x273a, 0x157f, 0x8738, 0xa784, 0x001f, 0x00c0, 0x2725, 0x0078,
++      0x2343, 0x0078, 0x2343, 0x7780, 0x1078, 0x35fc, 0x6018, 0xa005,
++      0x0040, 0x2779, 0x2021, 0x7100, 0x2009, 0x0005, 0x2011, 0x0020,
++      0x1078, 0x27b3, 0x0040, 0x2779, 0x157e, 0x20a9, 0x0000, 0x2021,
++      0x7000, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x27b3,
++      0x047f, 0x0040, 0x2778, 0x8420, 0x0070, 0x2778, 0x0078, 0x2769,
++      0x157f, 0x0078, 0x2343, 0x2200, 0x0079, 0x277e, 0x2781, 0x2783,
++      0x2783, 0x1078, 0x22ac, 0x2009, 0x0012, 0x706c, 0xa086, 0x0002,
++      0x0040, 0x278c, 0x2009, 0x000e, 0x6818, 0xa084, 0x8000, 0x0040,
++      0x2792, 0x691a, 0x706f, 0x0000, 0x7073, 0x0001, 0x0078, 0x3693,
++      0x2200, 0x0079, 0x279b, 0x27a0, 0x2783, 0x279e, 0x1078, 0x22ac,
++      0x1078, 0x431b, 0x7000, 0xa086, 0x0001, 0x00c0, 0x31c6, 0x1078,
++      0x3217, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x31b9, 0x0040,
++      0x31c6, 0x0078, 0x245d, 0x2404, 0xa005, 0x0040, 0x27d4, 0x2068,
++      0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x27c2, 0x2d20, 0x007f,
++      0x0078, 0x27b4, 0x007f, 0x2022, 0x691a, 0x6820, 0xa205, 0x6822,
++      0x1078, 0x1b8e, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef,
++      0x600a, 0x1078, 0x3217, 0x007c, 0xa085, 0x0001, 0x0078, 0x27d3,
++      0x2300, 0x0079, 0x27db, 0x27e0, 0x27de, 0x2879, 0x1078, 0x22ac,
++      0x78ec, 0xa084, 0x0001, 0x00c0, 0x27f4, 0x7000, 0xa086, 0x0004,
++      0x00c0, 0x27ec, 0x0078, 0x2817, 0x1078, 0x3217, 0x6008, 0xa084,
++      0xffef, 0x600a, 0x0078, 0x31c6, 0x78e4, 0xa005, 0x00d0, 0x2817,
++      0x0018, 0x2817, 0x2008, 0xa084, 0x0030, 0x00c0, 0x2803, 0x781b,
++      0x004f, 0x0078, 0x231a, 0x78ec, 0xa084, 0x0003, 0x0040, 0x27ff,
++      0x2100, 0xa084, 0x0007, 0x0079, 0x280d, 0x2850, 0x285b, 0x2841,
++      0x2815, 0x36f8, 0x36f8, 0x2815, 0x286a, 0x1078, 0x22ac, 0x7000,
++      0xa086, 0x0004, 0x00c0, 0x2831, 0x706c, 0xa086, 0x0002, 0x00c0,
++      0x2827, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x26fc, 0x706c,
++      0xa086, 0x0006, 0x0040, 0x2821, 0x706c, 0xa086, 0x0004, 0x0040,
++      0x2821, 0x79e4, 0xa184, 0x0030, 0x0040, 0x283b, 0x78ec, 0xa084,
++      0x0003, 0x00c0, 0x283d, 0x0078, 0x2ded, 0x2001, 0x0003, 0x0078,
++      0x2b81, 0x6818, 0xa084, 0x8000, 0x0040, 0x2848, 0x681b, 0x001d,
++      0x1078, 0x34d8, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078, 0x231a,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x2857, 0x681b, 0x001d, 0x1078,
++      0x34d8, 0x0078, 0x36c3, 0x6818, 0xa084, 0x8000, 0x0040, 0x2862,
++      0x681b, 0x001d, 0x1078, 0x34d8, 0x782b, 0x3008, 0x781b, 0x00de,
++      0x0078, 0x231a, 0x6818, 0xa084, 0x8000, 0x0040, 0x2871, 0x681b,
++      0x001d, 0x1078, 0x34d8, 0x782b, 0x3008, 0x781b, 0x009c, 0x0078,
++      0x231a, 0xa584, 0x000f, 0x00c0, 0x2896, 0x7000, 0x0079, 0x2880,
++      0x2343, 0x288a, 0x2888, 0x31c6, 0x31c6, 0x31c6, 0x31c6, 0x2888,
++      0x1078, 0x22ac, 0x1078, 0x3217, 0x6008, 0xa084, 0xffef, 0x600a,
++      0x1078, 0x31b9, 0x0040, 0x31c6, 0x0078, 0x245d, 0x78e4, 0xa005,
++      0x00d0, 0x2817, 0x0018, 0x2817, 0x2008, 0xa084, 0x0030, 0x00c0,
++      0x28a5, 0x781b, 0x004f, 0x0078, 0x231a, 0x78ec, 0xa084, 0x0003,
++      0x0040, 0x28a1, 0x2100, 0xa184, 0x0007, 0x0079, 0x28af, 0x28c1,
++      0x28c5, 0x28b9, 0x28b7, 0x36f8, 0x36f8, 0x28b7, 0x36ee, 0x1078,
++      0x22ac, 0x1078, 0x34e0, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078,
++      0x231a, 0x1078, 0x34e0, 0x0078, 0x36c3, 0x1078, 0x34e0, 0x782b,
++      0x3008, 0x781b, 0x00de, 0x0078, 0x231a, 0x1078, 0x34e0, 0x782b,
++      0x3008, 0x781b, 0x009c, 0x0078, 0x231a, 0x2300, 0x0079, 0x28d8,
++      0x28dd, 0x28db, 0x28df, 0x1078, 0x22ac, 0x0078, 0x2f2b, 0x681b,
++      0x0008, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x2f2b,
++      0x78ec, 0xa084, 0x0003, 0x0040, 0x2f2b, 0xa184, 0x0007, 0x0079,
++      0x28f1, 0x28f9, 0x28c5, 0x2841, 0x3693, 0x36f8, 0x36f8, 0x28f9,
++      0x36ee, 0x1078, 0x36a7, 0x0078, 0x231a, 0xa282, 0x0005, 0x0050,
++      0x2903, 0x1078, 0x22ac, 0x2300, 0x0079, 0x2906, 0x2909, 0x2b2e,
++      0x2b3c, 0x2200, 0x0079, 0x290c, 0x2926, 0x2913, 0x2926, 0x2911,
++      0x2b13, 0x1078, 0x22ac, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
++      0xa082, 0x0020, 0x0048, 0x34be, 0xa08a, 0x0004, 0x00c8, 0x34be,
++      0x0079, 0x2922, 0x34be, 0x34be, 0x34be, 0x346c, 0x789b, 0x0018,
++      0x79a8, 0xa184, 0x0080, 0x0040, 0x2937, 0x0078, 0x34be, 0x7000,
++      0xa005, 0x00c0, 0x292d, 0x2011, 0x0004, 0x0078, 0x3069, 0xa184,
++      0x00ff, 0xa08a, 0x0010, 0x00c8, 0x34be, 0x0079, 0x293f, 0x2951,
++      0x294f, 0x2969, 0x296d, 0x29ff, 0x34be, 0x34be, 0x2a01, 0x34be,
++      0x34be, 0x2b0f, 0x2b0f, 0x34be, 0x34be, 0x34be, 0x2b11, 0x1078,
++      0x22ac, 0xa684, 0x1000, 0x0040, 0x295e, 0x2001, 0x0500, 0x8000,
++      0x8000, 0x783a, 0x781b, 0x009a, 0x0078, 0x231a, 0x6818, 0xa084,
++      0x8000, 0x0040, 0x2967, 0x681b, 0x001d, 0x0078, 0x2955, 0x0078,
++      0x3693, 0x681b, 0x001d, 0x0078, 0x34ce, 0x6920, 0x6922, 0xa684,
++      0x1800, 0x00c0, 0x2987, 0x6820, 0xa084, 0x0001, 0x00c0, 0x298d,
++      0x6818, 0xa086, 0x0008, 0x00c0, 0x297f, 0x681b, 0x0000, 0xa684,
++      0x0400, 0x0040, 0x29fb, 0x781b, 0x005d, 0x0078, 0x231a, 0xa684,
++      0x1000, 0x0040, 0x298d, 0x0078, 0x231a, 0xa684, 0x0060, 0x0040,
++      0x29f7, 0xa684, 0x0800, 0x0040, 0x29f7, 0xa684, 0x8000, 0x00c0,
++      0x299b, 0x0078, 0x29b5, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x789b,
++      0x0076, 0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x29a8, 0x8000,
++      0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
++      0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, 0x0040,
++      0x29bd, 0xa6b4, 0xbfff, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003,
++      0x00c0, 0x29ca, 0x1078, 0x43d1, 0x1078, 0x45dc, 0x781b, 0x006c,
++      0x0078, 0x231a, 0xa006, 0x1078, 0x46d8, 0x6ab0, 0x69ac, 0x6c98,
++      0x6b94, 0x2200, 0xa105, 0x0040, 0x29d9, 0x2200, 0xa422, 0x2100,
++      0xa31b, 0x6caa, 0x7cd2, 0x6ba6, 0x7bd6, 0x2300, 0xa405, 0x00c0,
++      0x29e9, 0xa6b5, 0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x006c, 0x0078,
++      0x231a, 0x781b, 0x006c, 0x2200, 0xa115, 0x00c0, 0x29f3, 0x1078,
++      0x45ed, 0x0078, 0x231a, 0x1078, 0x4638, 0x0078, 0x231a, 0x781b,
++      0x006d, 0x0078, 0x231a, 0x781b, 0x005d, 0x0078, 0x231a, 0x1078,
++      0x22ac, 0x0078, 0x2a62, 0x6920, 0xa184, 0x0100, 0x0040, 0x2a19,
++      0xa18c, 0xfeff, 0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084,
++      0xefff, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078,
++      0x2a51, 0xa184, 0x0200, 0x0040, 0x2a51, 0xa18c, 0xfdff, 0x6922,
++      0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004,
++      0xa084, 0xffef, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008,
++      0x0040, 0x2a51, 0x1078, 0x35f8, 0x1078, 0x331a, 0x88ff, 0x0040,
++      0x2a51, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004,
++      0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2a4b, 0x782b, 0x3008, 0x781b,
++      0x005b, 0x0078, 0x231a, 0x782b, 0x3008, 0x781b, 0x006d, 0x0078,
++      0x231a, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2a5a, 0x781b, 0x005d,
++      0x0078, 0x231a, 0x781b, 0x006d, 0x0078, 0x231a, 0x0078, 0x34c6,
++      0x0078, 0x34c6, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040,
++      0x2a60, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
++      0x00c0, 0x2aa0, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
++      0x2a98, 0x0048, 0x2a7d, 0x0078, 0x2a9a, 0xa380, 0x0002, 0xa102,
++      0x00c8, 0x2a98, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x7054,
++      0x2060, 0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084, 0xffe5,
++      0x6006, 0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x2a52,
++      0x0078, 0x2a03, 0x24a8, 0x7aa8, 0x00f0, 0x2a9a, 0x0078, 0x2a6b,
++      0xa284, 0x00f0, 0xa086, 0x0020, 0x00c0, 0x2b00, 0x8318, 0x8318,
++      0x2300, 0xa102, 0x0040, 0x2ab0, 0x0048, 0x2ab0, 0x0078, 0x2afd,
++      0xa286, 0x0023, 0x0040, 0x2a60, 0x681c, 0xa084, 0xfff1, 0x681e,
++      0x7e58, 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008,
++      0xa085, 0x0010, 0x600a, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008,
++      0x2c48, 0x0c7f, 0xa184, 0x0010, 0x0040, 0x2ad4, 0x1078, 0x35f8,
++      0x1078, 0x3429, 0x0078, 0x2ae3, 0x0c7e, 0x7054, 0x2060, 0x6004,
++      0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2a51, 0x1078,
++      0x35f8, 0x1078, 0x331a, 0x88ff, 0x0040, 0x2a51, 0x789b, 0x0060,
++      0x2800, 0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++      0x2af7, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078, 0x231a, 0x782b,
++      0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x7aa8, 0x0078, 0x2a6b,
++      0x8318, 0x2300, 0xa102, 0x0040, 0x2b09, 0x0048, 0x2b09, 0x0078,
++      0x2a6b, 0xa284, 0x0080, 0x00c0, 0x34ce, 0x0078, 0x34c6, 0x0078,
++      0x34ce, 0x0078, 0x34be, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
++      0xa08e, 0x0001, 0x0040, 0x2b1e, 0x1078, 0x22ac, 0x7aa8, 0xa294,
++      0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x34be,
++      0x0079, 0x2b2a, 0x34be, 0x3267, 0x34be, 0x33be, 0xa282, 0x0000,
++      0x00c0, 0x2b34, 0x1078, 0x22ac, 0x1078, 0x34d8, 0x782b, 0x3008,
++      0x781b, 0x006d, 0x0078, 0x231a, 0xa282, 0x0003, 0x00c0, 0x2b42,
++      0x1078, 0x22ac, 0xa484, 0x8000, 0x00c0, 0x2b65, 0x706c, 0xa005,
++      0x0040, 0x2b4c, 0x1078, 0x22ac, 0x6f14, 0x7782, 0xa7bc, 0x0f00,
++      0x1078, 0x35fc, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784,
++      0x001f, 0x00c0, 0x2b50, 0x1078, 0x34dc, 0x706f, 0x0002, 0x2009,
++      0x4d38, 0x200b, 0x0009, 0x0078, 0x2b67, 0x1078, 0x34e8, 0x782b,
++      0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0xa282, 0x0004, 0x0050,
++      0x2b73, 0x1078, 0x22ac, 0x2300, 0x0079, 0x2b76, 0x2b79, 0x2c6c,
++      0x2c9f, 0xa286, 0x0003, 0x0040, 0x2b7f, 0x1078, 0x22ac, 0x2001,
++      0x0000, 0x007e, 0x68c0, 0xa005, 0x0040, 0x2b88, 0x7003, 0x0003,
++      0x68a0, 0xa084, 0x2000, 0x0040, 0x2b91, 0x6008, 0xa085, 0x0002,
++      0x600a, 0x007f, 0x703e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2b98,
++      0x2343, 0x2ba2, 0x2ba2, 0x2d97, 0x2dd3, 0x2343, 0x2dd3, 0x2ba0,
++      0x1078, 0x22ac, 0xa684, 0x1000, 0x00c0, 0x2baa, 0x1078, 0x431b,
++      0x0040, 0x2c46, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2bf2, 0xa186,
++      0x0008, 0x00c0, 0x2bc1, 0x1078, 0x3217, 0x6008, 0xa084, 0xffef,
++      0x600a, 0x1078, 0x31b9, 0x0040, 0x2bf2, 0x1078, 0x431b, 0x0078,
++      0x2bd9, 0xa186, 0x0028, 0x00c0, 0x2bf2, 0x1078, 0x431b, 0x6008,
++      0xa084, 0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2bd9, 0x8001,
++      0x601a, 0xa005, 0x0040, 0x2bd9, 0x8001, 0xa005, 0x0040, 0x2bd9,
++      0x601e, 0x6820, 0xa084, 0x0001, 0x0040, 0x2343, 0x6820, 0xa084,
++      0xfffe, 0x6822, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f,
++      0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x2bef, 0x6002, 0x6006,
++      0x0078, 0x2343, 0x017e, 0x1078, 0x2cd0, 0x017f, 0xa684, 0xdf00,
++      0x681e, 0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2c46, 0xa186,
++      0x0002, 0x00c0, 0x2c3e, 0xa684, 0x0800, 0x00c0, 0x2c0f, 0xa684,
++      0x0060, 0x0040, 0x2c0f, 0x78d8, 0x7adc, 0x6832, 0x6a2e, 0x6820,
++      0xa084, 0x0800, 0x00c0, 0x2c46, 0x8717, 0xa294, 0x000f, 0x8213,
++      0x8213, 0x8213, 0xa290, 0x4f80, 0xa290, 0x0000, 0x221c, 0xa384,
++      0x0100, 0x00c0, 0x2c25, 0x0078, 0x2c2b, 0x8210, 0x2204, 0xa085,
++      0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2c38, 0x68a0,
++      0xa084, 0x0100, 0x00c0, 0x2c38, 0x1078, 0x2d4a, 0x0078, 0x2343,
++      0x6008, 0xa085, 0x0002, 0x600a, 0x0078, 0x2c46, 0xa186, 0x0018,
++      0x0040, 0x2c46, 0xa186, 0x0014, 0x0040, 0x2343, 0x6916, 0x6818,
++      0xa084, 0x8000, 0x0040, 0x2c4e, 0x703c, 0x681a, 0xa68c, 0xdf00,
++      0x691e, 0x1078, 0x3208, 0x1078, 0x3217, 0x00c0, 0x2c5b, 0x6008,
++      0xa084, 0xffef, 0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2c64,
++      0x1078, 0x3201, 0x0078, 0x2c68, 0x7060, 0x2060, 0x6800, 0x6002,
++      0x1078, 0x1b8e, 0x0078, 0x2343, 0xa282, 0x0004, 0x0048, 0x2c72,
++      0x1078, 0x22ac, 0x2200, 0x0079, 0x2c75, 0x2c70, 0x2c79, 0x2c86,
++      0x2c79, 0x7000, 0xa086, 0x0005, 0x0040, 0x2c82, 0x1078, 0x34d8,
++      0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x7890, 0x8007,
++      0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
++      0x00ff, 0xa186, 0x0003, 0x0040, 0x2c9b, 0xa186, 0x0000, 0x0040,
++      0x2c9b, 0x0078, 0x34be, 0x781b, 0x006d, 0x0078, 0x231a, 0x6820,
++      0xa085, 0x0004, 0x6822, 0x82ff, 0x00c0, 0x2caa, 0x1078, 0x34d8,
++      0x0078, 0x2cb1, 0x8211, 0x0040, 0x2caf, 0x1078, 0x22ac, 0x1078,
++      0x34e8, 0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x702c,
++      0x8003, 0x0048, 0x2cc1, 0x2019, 0x4955, 0x1078, 0x2137, 0x702f,
++      0x8000, 0x1078, 0x371d, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2ccd,
++      0x0018, 0x2ccd, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c,
++      0xa684, 0x0060, 0x00c0, 0x2cda, 0x6833, 0x0000, 0x682f, 0x0000,
++      0x0078, 0x2d49, 0xa684, 0x0800, 0x00c0, 0x2cf2, 0x68b4, 0xa084,
++      0x4800, 0xa635, 0xa684, 0x0800, 0x00c0, 0x2cf2, 0x6998, 0x6a94,
++      0x6932, 0x6a2e, 0x7000, 0xa086, 0x0006, 0x0040, 0x2cf1, 0x1078,
++      0x431b, 0x007c, 0xa684, 0x0020, 0x0040, 0x2d14, 0xa684, 0x4000,
++      0x0040, 0x2d00, 0x6833, 0x0000, 0x682f, 0x0000, 0x0078, 0x2cea,
++      0x68b4, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2cfa,
++      0x703c, 0xa005, 0x00c0, 0x2d0e, 0x703f, 0x0015, 0x79d8, 0x7adc,
++      0x6932, 0x6a2e, 0x0078, 0x2cea, 0xa684, 0x4000, 0x0040, 0x2d1e,
++      0x6833, 0x0000, 0x682f, 0x0000, 0x0078, 0x2cea, 0x68b4, 0xa084,
++      0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2d18, 0x703c, 0xa005,
++      0x00c0, 0x2d2c, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb,
++      0x00c8, 0x2d33, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++      0x6932, 0x6a2e, 0x2100, 0xa205, 0x00c0, 0x2d40, 0x0078, 0x2cea,
++      0x7000, 0xa086, 0x0006, 0x0040, 0x2d49, 0x1078, 0x46d8, 0x0078,
++      0x2cea, 0x007c, 0x6008, 0xa085, 0x0200, 0x600a, 0xa384, 0x0200,
++      0x0040, 0x2d56, 0x6008, 0xa085, 0x0002, 0x600a, 0x681b, 0x0006,
++      0x688f, 0x0000, 0x6893, 0x0000, 0x6a2c, 0x6930, 0x6a3e, 0x6942,
++      0x682f, 0x0300, 0x6833, 0x0000, 0x6837, 0x2000, 0x6897, 0x0000,
++      0x689b, 0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079,
++      0x2d71, 0x2343, 0x2d7b, 0x2d84, 0x2d79, 0x2d79, 0x2d79, 0x2d79,
++      0x2d79, 0x1078, 0x22ac, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2d84,
++      0x1078, 0x3201, 0x0078, 0x2d8a, 0x7060, 0x2c50, 0x2060, 0x6800,
++      0x6002, 0x2a60, 0x2021, 0x4d5a, 0x2404, 0xa005, 0x0040, 0x2d93,
++      0x2020, 0x0078, 0x2d8c, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078,
++      0x3208, 0x1078, 0x3217, 0x6008, 0xa084, 0xfdff, 0x600a, 0x682b,
++      0x0000, 0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x472f,
++      0xa684, 0x0800, 0x0040, 0x2db0, 0x691c, 0xa18d, 0x2000, 0x691e,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x2dc0, 0x7868, 0xa08c, 0x00ff,
++      0x0040, 0x2dbe, 0x681b, 0x001e, 0x0078, 0x2dc0, 0x681b, 0x0000,
++      0x2021, 0x4d5a, 0x2404, 0xad06, 0x0040, 0x2dc7, 0x7460, 0x6800,
++      0x2022, 0x68c3, 0x0000, 0x6a3c, 0x6940, 0x6a2e, 0x6932, 0x1078,
++      0x1b8e, 0x0078, 0x2343, 0x1078, 0x2cd0, 0x682b, 0x0000, 0x789b,
++      0x000e, 0x6f14, 0x1078, 0x3723, 0xa08c, 0x00ff, 0x6916, 0x6818,
++      0xa084, 0x8000, 0x0040, 0x2de6, 0x703c, 0x681a, 0xa68c, 0xdf00,
++      0x691e, 0x706f, 0x0000, 0x0078, 0x2343, 0x7000, 0xa005, 0x00c0,
++      0x2df3, 0x0078, 0x2343, 0xa006, 0x1078, 0x431b, 0x6817, 0x0000,
++      0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
++      0xa085, 0x00ff, 0x6822, 0x7000, 0x0079, 0x2e06, 0x2343, 0x2e10,
++      0x2e10, 0x2e12, 0x2e12, 0x2e12, 0x2e12, 0x2e0e, 0x1078, 0x22ac,
++      0x1078, 0x3217, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x31d1,
++      0x2300, 0x0079, 0x2e1b, 0x2e1e, 0x2e20, 0x2e59, 0x1078, 0x22ac,
++      0x7000, 0x0079, 0x2e23, 0x2343, 0x2e2d, 0x2e2d, 0x2e48, 0x2e2d,
++      0x2e55, 0x2e48, 0x2e2b, 0x1078, 0x22ac, 0xa684, 0x0060, 0xa086,
++      0x0060, 0x00c0, 0x2e44, 0xa6b4, 0xffdf, 0xa6b4, 0xbfff, 0xa6b5,
++      0x2000, 0x7e5a, 0x681c, 0xa084, 0xffdf, 0x681e, 0x1078, 0x431b,
++      0x1078, 0x45ed, 0x0078, 0x3693, 0xa684, 0x2000, 0x0040, 0x2e37,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x2e55, 0x681b, 0x0015, 0xa684,
++      0x4000, 0x0040, 0x2e55, 0x681b, 0x0007, 0x1078, 0x36a7, 0x0078,
++      0x231a, 0x1078, 0x22ac, 0x2300, 0x0079, 0x2e5e, 0x2e61, 0x2e63,
++      0x2e96, 0x1078, 0x22ac, 0x7000, 0x0079, 0x2e66, 0x2343, 0x2e70,
++      0x2e70, 0x2e8b, 0x2e70, 0x2e92, 0x2e8b, 0x2e6e, 0x1078, 0x22ac,
++      0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x2e87, 0xa6b4, 0xffbf,
++      0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x681c, 0xa084, 0xffbf,
++      0x681e, 0x1078, 0x431b, 0x1078, 0x45ed, 0x0078, 0x3693, 0xa684,
++      0x2000, 0x0040, 0x2e7a, 0x6818, 0xa084, 0x8000, 0x0040, 0x2e92,
++      0x681b, 0x0007, 0x781b, 0x00de, 0x0078, 0x231a, 0x6820, 0xa085,
++      0x0004, 0x6822, 0x1078, 0x365e, 0xa6b5, 0x0800, 0x1078, 0x34d8,
++      0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x2300, 0x0079,
++      0x2ea9, 0x2eac, 0x2eae, 0x2eb0, 0x1078, 0x22ac, 0x1078, 0x22ac,
++      0xa684, 0x0400, 0x00c0, 0x2ed9, 0x79e4, 0xa184, 0x0020, 0x0040,
++      0x2ec0, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2ec0, 0x782b, 0x3009,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4,
++      0xa184, 0x0020, 0x0040, 0x2ed1, 0x78ec, 0xa084, 0x0003, 0x00c0,
++      0x2ed5, 0x2001, 0x0014, 0x0078, 0x2b81, 0xa184, 0x0007, 0x0079,
++      0x2f11, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff,
++      0x0040, 0x2f0f, 0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0,
++      0x2f00, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, 0x2ef3, 0x2009,
++      0xfff7, 0x0078, 0x2ef9, 0xa386, 0x0003, 0x00c0, 0x2f00, 0x2009,
++      0xffef, 0x0c7e, 0x7054, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b,
++      0x3009, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078,
++      0x3693, 0x2850, 0x285b, 0x2f1b, 0x2f23, 0x2f19, 0x2f19, 0x2f19,
++      0x3693, 0x1078, 0x22ac, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++      0x6922, 0x0078, 0x369d, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++      0x6922, 0x0078, 0x3693, 0x79e4, 0xa184, 0x0030, 0x0040, 0x2f35,
++      0x78ec, 0xa084, 0x0003, 0x00c0, 0x2f57, 0x7000, 0xa086, 0x0004,
++      0x00c0, 0x2f4f, 0x706c, 0xa086, 0x0002, 0x00c0, 0x2f45, 0x2011,
++      0x0002, 0x2019, 0x0000, 0x0078, 0x26fc, 0x706c, 0xa086, 0x0006,
++      0x0040, 0x2f3f, 0x706c, 0xa086, 0x0004, 0x0040, 0x2f3f, 0x6818,
++      0xa085, 0x8000, 0x681a, 0x2001, 0x0014, 0x0078, 0x2b81, 0xa184,
++      0x0007, 0x0079, 0x2f5b, 0x3693, 0x3693, 0x2f63, 0x3693, 0x36f8,
++      0x36f8, 0x3693, 0x3693, 0xa684, 0x0400, 0x00c0, 0x2fa6, 0x6820,
++      0xa084, 0x0001, 0x0040, 0x369d, 0xa68c, 0x0060, 0xa684, 0x0060,
++      0x0040, 0x2f78, 0xa086, 0x0060, 0x00c0, 0x2f78, 0xa18d, 0x4000,
++      0xa18c, 0xfffb, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000,
++      0x789b, 0x0061, 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, 0x8008,
++      0x810c, 0x0040, 0x3230, 0xa18c, 0x00f8, 0x00c0, 0x3230, 0x157e,
++      0x137e, 0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac,
++      0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814,
++      0x8007, 0x789b, 0x0080, 0x78aa, 0x0078, 0x369d, 0x6818, 0xa084,
++      0x8000, 0x0040, 0x2fad, 0x681b, 0x0008, 0x781b, 0x00d4, 0x0078,
++      0x231a, 0x2300, 0x0079, 0x2fb4, 0x2fb9, 0x3054, 0x2fb7, 0x1078,
++      0x22ac, 0x7000, 0xa084, 0x0007, 0x0079, 0x2fbe, 0x2343, 0x2fc8,
++      0x2ffd, 0x2fd3, 0x2fc6, 0x2343, 0x2fc6, 0x2fc6, 0x1078, 0x22ac,
++      0x681c, 0xa084, 0x2000, 0x0040, 0x2fe1, 0x6008, 0xa085, 0x0002,
++      0x600a, 0x0078, 0x2fe1, 0x68c0, 0xa005, 0x00c0, 0x2ffd, 0x6920,
++      0xa18d, 0x0001, 0x6922, 0x68c3, 0x0001, 0x6800, 0x706a, 0x0078,
++      0x2ff7, 0x6920, 0xa18d, 0x0001, 0x6922, 0x6800, 0x6006, 0xa005,
++      0x00c0, 0x2feb, 0x6002, 0x681c, 0xa084, 0x000e, 0x0040, 0x2ff7,
++      0x7014, 0x68ba, 0x7130, 0xa188, 0x7000, 0x0078, 0x2ff9, 0x2009,
++      0x7100, 0x2104, 0x6802, 0x2d0a, 0x7162, 0x6eb6, 0xa684, 0x0060,
++      0x0040, 0x3052, 0xa684, 0x0800, 0x00c0, 0x3011, 0xa684, 0x7fff,
++      0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x431b, 0x0078,
++      0x3052, 0xa684, 0x0020, 0x0040, 0x3026, 0x68c0, 0xa005, 0x0040,
++      0x301d, 0x1078, 0x472f, 0x0078, 0x3020, 0xa006, 0x1078, 0x46d8,
++      0x79d8, 0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x302c, 0x1078, 0x3609,
++      0x69aa, 0x6aa6, 0x1078, 0x46d8, 0xa684, 0x8000, 0x0040, 0x3052,
++      0xa684, 0x7fff, 0x68b6, 0x789b, 0x0076, 0x1078, 0x3723, 0x2010,
++      0x1078, 0x3723, 0x2008, 0xa684, 0x0020, 0x00c0, 0x304a, 0x1078,
++      0x3723, 0x801b, 0x00c8, 0x3045, 0x8000, 0xa084, 0x003f, 0xa108,
++      0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++      0xa303, 0x68ae, 0x0078, 0x2343, 0x0078, 0x34ce, 0x7037, 0x0000,
++      0xa282, 0x0006, 0x0050, 0x305e, 0x1078, 0x22ac, 0x7000, 0xa084,
++      0x0007, 0x10c0, 0x37c7, 0x2300, 0x0079, 0x3066, 0x3069, 0x308f,
++      0x30a1, 0x2200, 0x0079, 0x306c, 0x308d, 0x34ce, 0x3072, 0x308d,
++      0x30bb, 0x30fa, 0x7003, 0x0005, 0x2001, 0x7210, 0x2068, 0x704a,
++      0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3082,
++      0x0078, 0x307b, 0x157f, 0x6817, 0x0000, 0x68b7, 0x0700, 0x6823,
++      0x0800, 0x6827, 0x0003, 0x0078, 0x34be, 0x1078, 0x22ac, 0x7003,
++      0x0005, 0x2001, 0x7210, 0x2068, 0x704a, 0x7036, 0x2200, 0x0079,
++      0x3099, 0x34ce, 0x309f, 0x309f, 0x30bb, 0x309f, 0x34ce, 0x1078,
++      0x22ac, 0x7003, 0x0005, 0x2001, 0x7210, 0x2068, 0x704a, 0x7036,
++      0x2200, 0x0079, 0x30ab, 0x30b3, 0x30b1, 0x30b1, 0x30b3, 0x30b1,
++      0x30b3, 0x1078, 0x22ac, 0x1078, 0x34e8, 0x782b, 0x3008, 0x781b,
++      0x006d, 0x0078, 0x231a, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00,
++      0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x7100,
++      0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005, 0x0040, 0x30d6, 0x6814,
++      0xa206, 0x0040, 0x30ef, 0x6800, 0x0078, 0x30c9, 0x7003, 0x0005,
++      0x2001, 0x7210, 0x2068, 0x704a, 0x7036, 0x157e, 0x20a9, 0x0031,
++      0x2003, 0x0000, 0x8000, 0x0070, 0x30e7, 0x0078, 0x30e0, 0x157f,
++      0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4,
++      0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x3146, 0x1078, 0x34e0,
++      0x0078, 0x3146, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
++      0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c,
++      0x00ff, 0xa1e8, 0x7000, 0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005,
++      0x0040, 0x3119, 0x6814, 0xa206, 0x0040, 0x3131, 0x6800, 0x0078,
++      0x310c, 0x7003, 0x0005, 0x2001, 0x7210, 0x2068, 0x704a, 0x157e,
++      0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3129, 0x0078,
++      0x3122, 0x157f, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
++      0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x3146,
++      0xa084, 0x0800, 0x0040, 0x3140, 0x1078, 0x34e4, 0x0078, 0x3146,
++      0x1078, 0x34e0, 0x708b, 0x0000, 0x0078, 0x3146, 0x027e, 0x8207,
++      0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x4f80, 0x2060,
++      0x7056, 0x6000, 0x705a, 0x6004, 0x705e, 0xa684, 0x0060, 0x0040,
++      0x319e, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0, 0x3180,
++      0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff, 0x7e5a, 0xa684,
++      0x0060, 0xa086, 0x0060, 0x0040, 0x319e, 0x68c0, 0xa005, 0x0040,
++      0x3179, 0x7003, 0x0003, 0x682b, 0x0000, 0x1078, 0x45dc, 0x0078,
++      0x317b, 0x1078, 0x45ed, 0xa6b5, 0x2000, 0x7e5a, 0x0078, 0x319e,
++      0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x319e,
++      0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xa6b4, 0xbfff, 0x7e5a,
++      0x007e, 0x68c0, 0xa005, 0x007f, 0x0040, 0x319c, 0x7003, 0x0003,
++      0x1078, 0x45dc, 0x0078, 0x319e, 0x1078, 0x4638, 0x077f, 0x1078,
++      0x35fc, 0x2009, 0x006d, 0xa684, 0x0004, 0x0040, 0x31ab, 0x782b,
++      0x3008, 0x2009, 0x006d, 0x791a, 0x2d00, 0x704a, 0x8207, 0xa084,
++      0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x4f80, 0x2048, 0x0078,
++      0x231a, 0x6020, 0xa005, 0x0040, 0x31c5, 0x8001, 0x6022, 0x6008,
++      0xa085, 0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006, 0x1078,
++      0x431b, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, 0x681f,
++      0x0100, 0x7000, 0xa084, 0x0007, 0x0079, 0x31d6, 0x2343, 0x31e0,
++      0x31e0, 0x31fd, 0x31e8, 0x31e6, 0x31e8, 0x31de, 0x1078, 0x22ac,
++      0x1078, 0x3208, 0x1078, 0x3201, 0x1078, 0x1b8e, 0x0078, 0x2343,
++      0x706c, 0x706f, 0x0000, 0x7093, 0x0000, 0x0079, 0x31ef, 0x31f9,
++      0x31f9, 0x31f7, 0x31f7, 0x31f7, 0x31f9, 0x31f7, 0x31f9, 0x0079,
++      0x2715, 0x706f, 0x0000, 0x0078, 0x2343, 0x681b, 0x0000, 0x0078,
++      0x2d97, 0x6800, 0xa005, 0x00c0, 0x3206, 0x6002, 0x6006, 0x007c,
++      0x6010, 0xa005, 0x0040, 0x3211, 0x8001, 0x00d0, 0x3211, 0x1078,
++      0x22ac, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x6018,
++      0xa005, 0x0040, 0x321d, 0x8001, 0x601a, 0x007c, 0x1078, 0x371d,
++      0x681b, 0x0018, 0x0078, 0x3254, 0x1078, 0x371d, 0x681b, 0x0019,
++      0x0078, 0x3254, 0x1078, 0x371d, 0x681b, 0x001a, 0x0078, 0x3254,
++      0x1078, 0x371d, 0x681b, 0x0003, 0x0078, 0x3254, 0x7780, 0x1078,
++      0x35fc, 0x7184, 0xa18c, 0x00ff, 0xa1e8, 0x7000, 0x2d04, 0x2d08,
++      0x2068, 0xa005, 0x00c0, 0x3246, 0x0078, 0x2343, 0x6814, 0x7280,
++      0xa206, 0x0040, 0x324e, 0x6800, 0x0078, 0x323f, 0x6800, 0x200a,
++      0x681b, 0x0005, 0x708b, 0x0000, 0x1078, 0x3208, 0x6820, 0xa084,
++      0x0001, 0x00c0, 0x325d, 0x1078, 0x3201, 0x1078, 0x3217, 0x681f,
++      0x0000, 0x6823, 0x0020, 0x1078, 0x1b8e, 0x0078, 0x2343, 0xa282,
++      0x0003, 0x00c0, 0x34be, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4,
++      0x00ff, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0100, 0x0040,
++      0x32cb, 0xa18c, 0xfeff, 0x6922, 0xa4a4, 0x00ff, 0x0040, 0x32b5,
++      0xa482, 0x000c, 0x0048, 0x3288, 0x0040, 0x3288, 0x2021, 0x000c,
++      0x852b, 0x852b, 0x1078, 0x3577, 0x0040, 0x3292, 0x1078, 0x3384,
++      0x0078, 0x32be, 0x1078, 0x3532, 0x0c7e, 0x2960, 0x6004, 0xa084,
++      0xfff5, 0x6006, 0x1078, 0x33ab, 0x0c7f, 0x6920, 0xa18d, 0x0100,
++      0x6922, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++      0x32af, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078, 0x231a, 0x782b,
++      0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x0c7e, 0x2960, 0x6004,
++      0xa084, 0xfff5, 0x6006, 0x1078, 0x33ab, 0x0c7f, 0x7e58, 0xa684,
++      0x0400, 0x00c0, 0x32c7, 0x781b, 0x005d, 0x0078, 0x231a, 0x781b,
++      0x006d, 0x0078, 0x231a, 0x0c7e, 0x7054, 0x2060, 0x6100, 0xa18c,
++      0x1000, 0x0040, 0x330b, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282,
++      0x000c, 0x0048, 0x32df, 0x0040, 0x32df, 0x2011, 0x000c, 0x2400,
++      0xa202, 0x00c8, 0x32e4, 0x2220, 0x6208, 0xa294, 0x00ff, 0x7018,
++      0xa086, 0x0028, 0x00c0, 0x32f4, 0xa282, 0x0019, 0x00c8, 0x32fa,
++      0x2011, 0x0019, 0x0078, 0x32fa, 0xa282, 0x000c, 0x00c8, 0x32fa,
++      0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x32ff, 0x2228, 0x1078,
++      0x3536, 0x852b, 0x852b, 0x1078, 0x3577, 0x0040, 0x330b, 0x1078,
++      0x3384, 0x0078, 0x330f, 0x1078, 0x3532, 0x1078, 0x33ab, 0x7858,
++      0xa085, 0x0004, 0x785a, 0x0c7f, 0x782b, 0x3008, 0x781b, 0x006d,
++      0x0078, 0x231a, 0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, 0x00c0,
++      0x3332, 0x6010, 0xa084, 0x000f, 0x00c0, 0x332c, 0x6104, 0xa18c,
++      0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000,
++      0x0078, 0x3359, 0x68a0, 0xa084, 0x0200, 0x00c0, 0x332c, 0x6208,
++      0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x3347, 0xa282,
++      0x0019, 0x00c8, 0x334d, 0x2011, 0x0019, 0x0078, 0x334d, 0xa282,
++      0x000c, 0x00c8, 0x334d, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c,
++      0x00ff, 0xa382, 0x000c, 0x0048, 0x3359, 0x0040, 0x3359, 0x2019,
++      0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa,
++      0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f,
++      0x007c, 0x0c7e, 0x2960, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032,
++      0x2019, 0x0000, 0x0078, 0x3374, 0x78ab, 0x0001, 0x78ab, 0x0003,
++      0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085,
++      0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7154, 0x2160, 0x1078,
++      0x338b, 0x0c7f, 0x007c, 0x2008, 0xa084, 0xfff0, 0xa425, 0x7c86,
++      0x6018, 0x789a, 0x7cae, 0x6412, 0x78a4, 0xa084, 0xfff8, 0xa18c,
++      0x0007, 0xa105, 0x78a6, 0x6016, 0x788a, 0xa4a4, 0x000f, 0x8427,
++      0x8204, 0x8004, 0xa084, 0x00ff, 0xa405, 0x600e, 0x6004, 0xa084,
++      0xfff5, 0x6006, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x33b2,
++      0x0c7f, 0x007c, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6,
++      0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x007c, 0xa282, 0x0002,
++      0x00c0, 0x34be, 0x7aa8, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184,
++      0x0200, 0x0040, 0x3407, 0xa18c, 0xfdff, 0x6922, 0xa294, 0x00ff,
++      0xa282, 0x0002, 0x00c8, 0x34be, 0x1078, 0x3450, 0x1078, 0x33ab,
++      0xa980, 0x0001, 0x200c, 0x1078, 0x35f8, 0x1078, 0x331a, 0x88ff,
++      0x0040, 0x33fa, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5,
++      0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x33f4, 0x782b, 0x3008,
++      0x781b, 0x005b, 0x0078, 0x231a, 0x782b, 0x3008, 0x781b, 0x006d,
++      0x0078, 0x231a, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x3403, 0x781b,
++      0x005d, 0x0078, 0x231a, 0x781b, 0x006d, 0x0078, 0x231a, 0xa282,
++      0x0002, 0x00c8, 0x340f, 0xa284, 0x0001, 0x0040, 0x3419, 0x7154,
++      0xa188, 0x0000, 0x210c, 0xa18c, 0x2000, 0x00c0, 0x3419, 0x2011,
++      0x0000, 0x1078, 0x3524, 0x1078, 0x3450, 0x1078, 0x33ab, 0x7858,
++      0xa085, 0x0004, 0x785a, 0x782b, 0x3008, 0x781b, 0x006d, 0x0078,
++      0x231a, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xa084,
++      0x2000, 0x00c0, 0x3440, 0x6014, 0xa084, 0x0040, 0x00c0, 0x343e,
++      0xa18c, 0xffef, 0x6106, 0xa006, 0x0078, 0x344d, 0x2011, 0x0000,
++      0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0,
++      0x0004, 0x6820, 0xa085, 0x0200, 0x6822, 0x027f, 0x0c7f, 0x007c,
++      0x0c7e, 0x7054, 0x2060, 0x1078, 0x3457, 0x0c7f, 0x007c, 0x82ff,
++      0x0040, 0x345c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a,
++      0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6, 0x788a, 0x6016, 0x6004,
++      0xa084, 0xffef, 0x6006, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003,
++      0x0040, 0x3475, 0x007f, 0x0078, 0x3478, 0x007f, 0x0078, 0x34ba,
++      0xa684, 0x0020, 0x0040, 0x34ba, 0x7888, 0xa084, 0x0040, 0x0040,
++      0x34ba, 0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x3488, 0x8000,
++      0xa005, 0x0040, 0x349e, 0x831b, 0x00c8, 0x3491, 0x8001, 0x0040,
++      0x34b6, 0xa684, 0x4000, 0x0040, 0x349e, 0x78b8, 0x801b, 0x00c8,
++      0x349a, 0x8000, 0xa084, 0x003f, 0x00c0, 0x34b6, 0xa6b4, 0xbfff,
++      0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x34aa,
++      0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x46d8,
++      0x781b, 0x006c, 0x1078, 0x4568, 0x0078, 0x231a, 0x781b, 0x006c,
++      0x0078, 0x231a, 0x781b, 0x006d, 0x0078, 0x231a, 0x1078, 0x34ec,
++      0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x1078, 0x34d8,
++      0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x6827, 0x0002,
++      0x1078, 0x34e0, 0x782b, 0x3008, 0x781b, 0x006d, 0x0078, 0x231a,
++      0x2001, 0x0005, 0x0078, 0x34ee, 0x2001, 0x000c, 0x0078, 0x34ee,
++      0x2001, 0x0006, 0x0078, 0x34ee, 0x2001, 0x000d, 0x0078, 0x34ee,
++      0x2001, 0x0009, 0x0078, 0x34ee, 0x2001, 0x0007, 0x789b, 0x0010,
++      0x78aa, 0x789b, 0x0060, 0x78ab, 0x0001, 0xa6b5, 0x0004, 0x7e5a,
++      0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703,
++      0xa0e0, 0x4f80, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f,
++      0x0040, 0x3512, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085,
++      0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040,
++      0x0040, 0x3522, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085,
++      0x0010, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001,
++      0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab,
++      0x0004, 0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010,
++      0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa,
++      0x789b, 0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084,
++      0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c,
++      0xfff0, 0x2001, 0x4d46, 0x2004, 0xa082, 0x0028, 0x0040, 0x3560,
++      0x2021, 0x35df, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x3566,
++      0x2021, 0x35eb, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064,
++      0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, 0x3575, 0x8420, 0x2300,
++      0xa210, 0x0070, 0x3575, 0x0078, 0x3568, 0x157f, 0x007c, 0x157e,
++      0x2009, 0x4d46, 0x210c, 0xa182, 0x0032, 0x0048, 0x358b, 0x0040,
++      0x358f, 0x2009, 0x35d1, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
++      0x0032, 0x0078, 0x35a1, 0xa182, 0x0028, 0x0040, 0x3599, 0x2009,
++      0x35df, 0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064, 0x0078,
++      0x35a1, 0x2009, 0x35eb, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011,
++      0x0064, 0x2200, 0xa502, 0x0040, 0x35b1, 0x0048, 0x35b1, 0x8108,
++      0x2300, 0xa210, 0x0070, 0x35ae, 0x0078, 0x35a1, 0x157f, 0xa006,
++      0x007c, 0x157f, 0xa582, 0x0064, 0x00c8, 0x35c0, 0x7808, 0xa085,
++      0x0070, 0x780a, 0x7044, 0xa085, 0x0070, 0x7046, 0x0078, 0x35c0,
++      0x78ec, 0xa084, 0x0300, 0x0040, 0x35ce, 0x2104, 0xa09e, 0x1201,
++      0x00c0, 0x35ce, 0x2001, 0x2101, 0x0078, 0x35cf, 0x2104, 0xa005,
++      0x007c, 0x1201, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404, 0x5604,
++      0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07, 0x3202,
++      0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805, 0x7a05,
++      0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202, 0x5404,
++      0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04,
++      0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800b, 0xa784,
++      0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0, 0x5000,
++      0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x3610, 0x8000,
++      0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079,
++      0x0100, 0x2009, 0x4d40, 0x2091, 0x8000, 0x2104, 0x0079, 0x3620,
++      0x3656, 0x362a, 0x362a, 0x362a, 0x362a, 0x362a, 0x362a, 0x365a,
++      0x1078, 0x22ac, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x00c0,
++      0x362c, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3633,
++      0x68b4, 0xa085, 0x4000, 0x68b6, 0x7858, 0xa085, 0x4000, 0x785a,
++      0x7830, 0xa084, 0x0080, 0x00c0, 0x3656, 0x0018, 0x3656, 0x681c,
++      0xa084, 0x0020, 0x00c0, 0x3654, 0x0e7e, 0x2071, 0x4d40, 0x1078,
++      0x36a7, 0x0e7f, 0x0078, 0x3656, 0x781b, 0x00de, 0x2091, 0x8001,
++      0x0f7f, 0x007c, 0x1078, 0x3886, 0x0078, 0x3656, 0x0c7e, 0x6814,
++      0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0, 0x4f80,
++      0x6004, 0xa084, 0x000a, 0x00c0, 0x3691, 0x6108, 0xa194, 0xff00,
++      0x0040, 0x3691, 0xa18c, 0x00ff, 0x2001, 0x0019, 0xa106, 0x0040,
++      0x3680, 0x2001, 0x0032, 0xa106, 0x0040, 0x3684, 0x0078, 0x3688,
++      0x2009, 0x0020, 0x0078, 0x368a, 0x2009, 0x003f, 0x0078, 0x368a,
++      0x2011, 0x0000, 0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002,
++      0x6006, 0x0c7f, 0x007c, 0x781b, 0x006d, 0x0078, 0x231a, 0x782b,
++      0x3008, 0x781b, 0x006d, 0x0078, 0x231a, 0x781b, 0x005d, 0x0078,
++      0x231a, 0x782b, 0x3008, 0x781b, 0x005b, 0x0078, 0x231a, 0x2009,
++      0x4d20, 0x210c, 0xa186, 0x0000, 0x0040, 0x36bb, 0xa186, 0x0001,
++      0x0040, 0x36be, 0x2009, 0x4d38, 0x200b, 0x000b, 0x706f, 0x0001,
++      0x781b, 0x0048, 0x007c, 0x781b, 0x00d8, 0x007c, 0x2009, 0x4d38,
++      0x200b, 0x000a, 0x007c, 0x2009, 0x4d20, 0x210c, 0xa186, 0x0000,
++      0x0040, 0x36de, 0xa186, 0x0001, 0x0040, 0x36d8, 0x2009, 0x4d38,
++      0x200b, 0x000b, 0x706f, 0x0001, 0x781b, 0x0048, 0x0078, 0x231a,
++      0x2009, 0x4d38, 0x200b, 0x000a, 0x0078, 0x231a, 0x782b, 0x3008,
++      0x781b, 0x00d8, 0x0078, 0x231a, 0x781b, 0x00de, 0x0078, 0x231a,
++      0x782b, 0x3008, 0x781b, 0x00de, 0x0078, 0x231a, 0x781b, 0x009c,
++      0x0078, 0x231a, 0x782b, 0x3008, 0x781b, 0x009c, 0x0078, 0x231a,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x36ff, 0x681b, 0x001d, 0x706f,
++      0x0001, 0x781b, 0x0048, 0x0078, 0x231a, 0x007e, 0x7830, 0xa084,
++      0x00c0, 0x00c0, 0x371b, 0x7808, 0xa084, 0xfffc, 0x780a, 0x0005,
++      0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x371b,
++      0x7044, 0x780a, 0xa005, 0x007f, 0x007c, 0x7044, 0xa085, 0x0002,
++      0x7046, 0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3723,
++      0x0098, 0x372c, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a,
++      0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
++      0x373b, 0x0098, 0x3739, 0x78ac, 0x007e, 0x7044, 0x780a, 0x007f,
++      0x007c, 0xa784, 0x007d, 0x00c0, 0x3748, 0x2700, 0x1078, 0x22ac,
++      0xa784, 0x0001, 0x00c0, 0x2ded, 0xa784, 0x0070, 0x0040, 0x3758,
++      0x0c7e, 0x2d60, 0x2f68, 0x1078, 0x2257, 0x2d78, 0x2c68, 0x0c7f,
++      0xa784, 0x0008, 0x0040, 0x3765, 0x784b, 0x0008, 0x78ec, 0xa084,
++      0x0003, 0x0040, 0x2343, 0x0078, 0x3693, 0xa784, 0x0004, 0x0040,
++      0x3798, 0x78b8, 0xa084, 0x4001, 0x0040, 0x3798, 0x784b, 0x0008,
++      0x78ec, 0xa084, 0x0003, 0x0040, 0x2343, 0x78e4, 0xa084, 0x0007,
++      0xa086, 0x0001, 0x00c0, 0x3798, 0x78c0, 0xa085, 0x4800, 0x2030,
++      0x7e5a, 0x781b, 0x00de, 0x0078, 0x231a, 0x784b, 0x0008, 0x6818,
++      0xa084, 0x8000, 0x0040, 0x3794, 0x681b, 0x0015, 0xa684, 0x4000,
++      0x0040, 0x3794, 0x681b, 0x0007, 0x1078, 0x36a7, 0x0078, 0x231a,
++      0x681b, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x6833, 0x0000,
++      0x682f, 0x0000, 0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x2817,
++      0xa084, 0x0020, 0x0040, 0x2817, 0x78ec, 0xa084, 0x0003, 0x0040,
++      0x2817, 0x0018, 0x2817, 0x0078, 0x34c6, 0x6b14, 0x8307, 0xa084,
++      0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x4f80, 0x2060, 0x2048,
++      0x7056, 0x6000, 0x705a, 0x6004, 0x705e, 0x2a60, 0x007c, 0x0079,
++      0x37c9, 0x37d1, 0x37d2, 0x37d1, 0x37d4, 0x37d1, 0x37d1, 0x37d1,
++      0x37d9, 0x007c, 0x1078, 0x3217, 0x1078, 0x431b, 0x7038, 0x600a,
++      0x007c, 0x70a0, 0xa005, 0x0040, 0x37e6, 0x2068, 0x1078, 0x1a80,
++      0x1078, 0x42d4, 0x1078, 0x42db, 0x70a3, 0x0000, 0x007c, 0x0e7e,
++      0x2091, 0x8000, 0x2071, 0x4d40, 0x7000, 0xa086, 0x0007, 0x00c0,
++      0x3804, 0x6114, 0x70ac, 0xa106, 0x00c0, 0x3804, 0x6128, 0x70b0,
++      0xa106, 0x00c0, 0x3804, 0x2c00, 0x70a2, 0x0e7f, 0x1078, 0x1a8d,
++      0x1078, 0x380a, 0xa006, 0x007c, 0x2091, 0x8001, 0x0e7f, 0xa085,
++      0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x4d40, 0x0078, 0x20c8,
++      0x785b, 0x0000, 0x70b7, 0x000e, 0x2009, 0x0100, 0x017e, 0x70a0,
++      0xa06d, 0x0040, 0x381f, 0x70a3, 0x0000, 0x0078, 0x3825, 0x70bb,
++      0x0000, 0x1078, 0x1aa9, 0x0040, 0x382b, 0x70b4, 0x6826, 0x1078,
++      0x3906, 0x0078, 0x381f, 0x017f, 0x157e, 0x0c7e, 0x0d7e, 0x20a9,
++      0x0008, 0x2061, 0x7110, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d,
++      0x0040, 0x3843, 0x6800, 0x601e, 0x1078, 0x18a0, 0x6008, 0x8000,
++      0x600a, 0x0078, 0x3836, 0x6018, 0xa06d, 0x0040, 0x384d, 0x6800,
++      0x601a, 0x1078, 0x18a0, 0x0078, 0x3843, 0xace0, 0x0008, 0x0070,
++      0x3853, 0x0078, 0x3833, 0x709c, 0xa084, 0x8000, 0x0040, 0x385a,
++      0x1078, 0x3980, 0x0d7f, 0x0c7f, 0x157f, 0x007c, 0x127e, 0x2091,
++      0x2300, 0x6804, 0xa084, 0x000f, 0x0079, 0x3866, 0x3876, 0x3876,
++      0x3876, 0x3876, 0x3876, 0x3876, 0x3878, 0x387e, 0x3876, 0x3876,
++      0x3876, 0x3876, 0x3876, 0x3880, 0x3876, 0x3878, 0x1078, 0x22ac,
++      0x1078, 0x4172, 0x1078, 0x18a0, 0x0078, 0x3884, 0x6827, 0x000b,
++      0x1078, 0x4172, 0x1078, 0x3906, 0x127f, 0x007c, 0x127e, 0x2091,
++      0x2300, 0x0098, 0x38a2, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x38a2,
++      0x0d7e, 0x1078, 0x42e4, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001,
++      0x0000, 0x6827, 0x0084, 0x1078, 0x429c, 0x1078, 0x3906, 0x0d7f,
++      0x0078, 0x38d4, 0x7948, 0xa185, 0x4000, 0x784a, 0x0098, 0x38ab,
++      0x794a, 0x0078, 0x3890, 0x7828, 0xa086, 0x1834, 0x00c0, 0x38b4,
++      0xa185, 0x0004, 0x0078, 0x38bb, 0x7828, 0xa186, 0x1814, 0x00c0,
++      0x38a8, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e, 0x78ab, 0x0002,
++      0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a, 0x70bc, 0xa080,
++      0x008d, 0x781a, 0x6827, 0x0002, 0x6827, 0x0084, 0x2009, 0x0004,
++      0x2001, 0x0000, 0x1078, 0x429c, 0x127f, 0x007c, 0x0d7e, 0x6b14,
++      0x1078, 0x1b1b, 0x0040, 0x38e3, 0x2068, 0x6827, 0x0002, 0x1078,
++      0x3906, 0x0078, 0x38d8, 0x0d7f, 0x007c, 0x0d7e, 0x6b14, 0x6c28,
++      0xa4a4, 0x00ff, 0x1078, 0x1ab9, 0x0040, 0x38f3, 0x2068, 0x6827,
++      0x0002, 0x1078, 0x3906, 0x0d7f, 0x007c, 0x0d7e, 0x6b14, 0xa39c,
++      0x00ff, 0x1078, 0x1aec, 0x0040, 0x3904, 0x2068, 0x6827, 0x0002,
++      0x1078, 0x3906, 0x0078, 0x38f9, 0x0d7f, 0x007c, 0x0c7e, 0x6914,
++      0x1078, 0x3977, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0006, 0x0040,
++      0x3921, 0xa186, 0x000d, 0x0040, 0x3940, 0xa186, 0x0017, 0x00c0,
++      0x391d, 0x1078, 0x18a0, 0x0078, 0x391f, 0x1078, 0x1b90, 0x0c7f,
++      0x007c, 0x6004, 0x8001, 0x0048, 0x393e, 0x6006, 0x2009, 0x0000,
++      0xa684, 0x0001, 0x00c0, 0x392e, 0xa18d, 0x8000, 0xa684, 0x0004,
++      0x0040, 0x3934, 0xa18d, 0x0002, 0x6922, 0x681f, 0x0000, 0x7104,
++      0x810f, 0x6818, 0xa105, 0x681a, 0x0078, 0x391d, 0x1078, 0x22ac,
++      0x6018, 0xa005, 0x00c0, 0x394f, 0x6008, 0x8001, 0x0048, 0x394f,
++      0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078, 0x3965, 0xac88,
++      0x0006, 0x2104, 0xa005, 0x0040, 0x3958, 0x2008, 0x0078, 0x3951,
++      0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x391f, 0x600a, 0x6018,
++      0x2068, 0x6800, 0x601a, 0x0078, 0x3949, 0x157e, 0x137e, 0x147e,
++      0x0c7e, 0x0d7e, 0x1078, 0x187d, 0x2da0, 0x137f, 0x20a9, 0x0031,
++      0x53a3, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x0078, 0x391d, 0xa184,
++      0x001f, 0x8003, 0x8003, 0x8003, 0xa080, 0x7110, 0x2060, 0x007c,
++      0x2019, 0x4d51, 0x2304, 0xa085, 0x0001, 0x201a, 0x2019, 0x0102,
++      0x2304, 0xa085, 0x0001, 0x201a, 0x007c, 0x2019, 0x4d51, 0x2304,
++      0xa084, 0xfffe, 0x201a, 0x2019, 0x0102, 0x2304, 0xa084, 0xfffe,
++      0x201a, 0x007c, 0x0078, 0x231a, 0x70a3, 0x0000, 0x7003, 0x0000,
++      0x7043, 0x0001, 0x7037, 0x0000, 0x0018, 0x22d1, 0x1078, 0x1aa9,
++      0x0040, 0x39cf, 0x2009, 0x4d0f, 0x200b, 0x0000, 0x68bc, 0x2060,
++      0x6100, 0xa184, 0x0300, 0x0040, 0x39c1, 0x6827, 0x000e, 0xa084,
++      0x0200, 0x0040, 0x39bd, 0x6827, 0x0017, 0x1078, 0x3906, 0x0078,
++      0x399c, 0x6820, 0xa084, 0x8000, 0x0040, 0x3a11, 0x7000, 0xa086,
++      0x0007, 0x10c0, 0x22ac, 0x2d00, 0x70a2, 0x0078, 0x39d6, 0x7040,
++      0xa086, 0x0001, 0x0040, 0x2353, 0x0078, 0x231a, 0x2031, 0x0000,
++      0x6920, 0xa184, 0x0002, 0x0040, 0x39df, 0xa6b5, 0x0004, 0xa184,
++      0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3a8c, 0x2004, 0xa635,
++      0x681c, 0xa084, 0x0400, 0x0040, 0x39f7, 0x789b, 0x0018, 0x78ab,
++      0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0x681c,
++      0xa084, 0x8000, 0x0040, 0x3a03, 0xa6b5, 0x0400, 0x789b, 0x000e,
++      0x6824, 0x8007, 0x78aa, 0xa684, 0x0200, 0x0040, 0x3a0d, 0x6830,
++      0x78d2, 0x682c, 0x78d6, 0x1078, 0x42cc, 0x7e5a, 0x6eb6, 0x0078,
++      0x4303, 0x1078, 0x3705, 0x00c0, 0x3a86, 0x702c, 0x8004, 0x0048,
++      0x3a1f, 0x2019, 0x4a07, 0x1078, 0x2137, 0x702f, 0x0001, 0x2011,
++      0x0001, 0x2031, 0x1000, 0x789b, 0x0018, 0x6814, 0xa084, 0x001f,
++      0xa085, 0x0080, 0x78aa, 0x6920, 0xa184, 0x0002, 0x0040, 0x3a38,
++      0xa6b5, 0x0004, 0x78ab, 0x0020, 0x6828, 0x78aa, 0xa290, 0x0002,
++      0x681c, 0xa084, 0x8000, 0x0040, 0x3a46, 0xa6b5, 0x0400, 0x789b,
++      0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x3a54, 0x6820, 0xa084,
++      0x8000, 0x00c0, 0x3a54, 0xa6b5, 0x0800, 0x681c, 0xa084, 0x0100,
++      0x0040, 0x3a54, 0xa6b5, 0x4000, 0x6820, 0xa084, 0x00c0, 0x8003,
++      0x8003, 0x8007, 0xa080, 0x3a8c, 0x2004, 0xa635, 0x789b, 0x007e,
++      0x7eae, 0x6eb6, 0x6814, 0x8007, 0x78aa, 0x7aaa, 0x7830, 0xa084,
++      0x00c0, 0x00c0, 0x3a86, 0x0018, 0x3a86, 0x70bc, 0xa080, 0x00dd,
++      0x781a, 0x1078, 0x371d, 0xa684, 0x0200, 0x0040, 0x3a7d, 0x6830,
++      0x78d2, 0x682c, 0x78d6, 0x1078, 0x42cc, 0x2d00, 0x70a2, 0x7003,
++      0x0007, 0xad80, 0x000f, 0x7036, 0x0078, 0x231a, 0x1078, 0x1a80,
++      0x1078, 0x371d, 0x0078, 0x231a, 0x0000, 0x0300, 0x0200, 0x0000,
++      0x1078, 0x22ac, 0x2300, 0x0079, 0x3a95, 0x3a98, 0x3a98, 0x3a9a,
++      0x1078, 0x22ac, 0x1078, 0x42db, 0x6924, 0xa184, 0x00ff, 0xa086,
++      0x000a, 0x0040, 0x3aac, 0xa184, 0xff00, 0xa085, 0x000a, 0x6826,
++      0x1078, 0x1a80, 0x0078, 0x399c, 0x2001, 0x000a, 0x1078, 0x4254,
++      0x0078, 0x399c, 0xa282, 0x0005, 0x0050, 0x3ab8, 0x1078, 0x22ac,
++      0x7000, 0xa084, 0x0007, 0x10c0, 0x37c7, 0x1078, 0x187d, 0x6807,
++      0x0106, 0x680b, 0x0000, 0x689f, 0x0000, 0x6827, 0x0000, 0x1078,
++      0x3e02, 0x2d00, 0x70a2, 0x7003, 0x0007, 0x6014, 0x68ba, 0xad80,
++      0x002e, 0x7036, 0x6824, 0xa084, 0x0080, 0x0040, 0x3adb, 0x1078,
++      0x3ea9, 0x0078, 0x231a, 0x2300, 0x0079, 0x3ade, 0x3ae1, 0x3b59,
++      0x3b78, 0x2200, 0x0079, 0x3ae4, 0x3ae9, 0x3af9, 0x3b1f, 0x3b29,
++      0x3b4a, 0x2029, 0x0001, 0xa026, 0x2011, 0x0000, 0x1078, 0x3f97,
++      0x0079, 0x3af2, 0x3af7, 0x231a, 0x399c, 0x3af7, 0x3af7, 0x1078,
++      0x22ac, 0x7990, 0xa18c, 0x0007, 0x00c0, 0x3b00, 0x2009, 0x0008,
++      0x2011, 0x0001, 0xa684, 0x0004, 0x0040, 0x3b08, 0x2011, 0x0003,
++      0x2220, 0xa12a, 0x2011, 0x0001, 0x1078, 0x3f97, 0x0079, 0x3b10,
++      0x3b15, 0x231a, 0x399c, 0x3b1d, 0x3b17, 0x0078, 0x4309, 0x70ab,
++      0x3b1b, 0x0078, 0x231a, 0x0078, 0x3b15, 0x1078, 0x22ac, 0xa684,
++      0x0010, 0x0040, 0x3b27, 0x1078, 0x3e79, 0x0078, 0x231a, 0x0078,
++      0x3eda, 0x6000, 0xa084, 0x0002, 0x0040, 0x3b44, 0x70bc, 0xa080,
++      0x00c4, 0x781a, 0x0d7e, 0x1078, 0x42e4, 0x2d00, 0x682e, 0x6827,
++      0x0000, 0x1078, 0x3906, 0x0d7f, 0x1078, 0x18a0, 0x7003, 0x0000,
++      0x7037, 0x0000, 0x0078, 0x399c, 0xa684, 0x0004, 0x00c0, 0x3b4a,
++      0x0078, 0x4309, 0x6000, 0xa084, 0x0004, 0x00c0, 0x3b57, 0x70ab,
++      0x3b57, 0x2001, 0x0007, 0x1078, 0x424c, 0x0078, 0x430f, 0x0078,
++      0x4309, 0x2200, 0x0079, 0x3b5c, 0x3b61, 0x3b61, 0x3b61, 0x3b63,
++      0x3b61, 0x1078, 0x22ac, 0x70a7, 0x3b67, 0x0078, 0x4315, 0x2011,
++      0x0018, 0x1078, 0x3f91, 0x0079, 0x3b6d, 0x3b72, 0x231a, 0x399c,
++      0x3b74, 0x3b76, 0x1078, 0x22ac, 0x1078, 0x22ac, 0x1078, 0x22ac,
++      0x2200, 0x0079, 0x3b7b, 0x3b80, 0x3b80, 0x3b82, 0x3b80, 0x3b80,
++      0x1078, 0x22ac, 0x70ab, 0x3b8a, 0x2001, 0x0003, 0x1078, 0x424c,
++      0x0078, 0x430f, 0x0078, 0x4309, 0xa282, 0x0003, 0x0050, 0x3b92,
++      0x1078, 0x22ac, 0xa684, 0x0008, 0x0040, 0x3b98, 0x1078, 0x3e57,
++      0x7003, 0x0007, 0x2300, 0x0079, 0x3b9d, 0x3ba0, 0x3bcb, 0x3bd3,
++      0x2200, 0x0079, 0x3ba3, 0x3ba8, 0x3ba6, 0x3bc1, 0x1078, 0x22ac,
++      0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001, 0x1078, 0x3f97,
++      0x0079, 0x3bb2, 0x3bb7, 0x231a, 0x399c, 0x3bbf, 0x3bb9, 0x0078,
++      0x4309, 0x70ab, 0x3bbd, 0x0078, 0x231a, 0x0078, 0x3bb7, 0x1078,
++      0x22ac, 0xa684, 0x0010, 0x0040, 0x3bc9, 0x1078, 0x3e79, 0x0078,
++      0x231a, 0x0078, 0x3eda, 0x2200, 0x0079, 0x3bce, 0x3bd1, 0x3bd1,
++      0x3bd1, 0x1078, 0x22ac, 0x2200, 0x0079, 0x3bd6, 0x3bd9, 0x3bd9,
++      0x3bdb, 0x1078, 0x22ac, 0x70ab, 0x3be3, 0x2001, 0x0003, 0x1078,
++      0x424c, 0x0078, 0x430f, 0x0078, 0x4309, 0x2300, 0x0079, 0x3be8,
++      0x3bed, 0x3bef, 0x3beb, 0x1078, 0x22ac, 0x70a4, 0x007a, 0x70a4,
++      0x007a, 0xa282, 0x0002, 0x0050, 0x3bf7, 0x1078, 0x22ac, 0xa684,
++      0x0200, 0x0040, 0x3c01, 0x1078, 0x42d4, 0x1078, 0x3f79, 0x1078,
++      0x42db, 0x2300, 0x0079, 0x3c04, 0x3c07, 0x3c1d, 0x3c77, 0xa286,
++      0x0001, 0x0040, 0x3c0d, 0x1078, 0x22ac, 0xa684, 0x0200, 0x0040,
++      0x3c15, 0x1078, 0x42d4, 0x1078, 0x42db, 0x2001, 0x0001, 0x1078,
++      0x4254, 0x7003, 0x0000, 0x0078, 0x399c, 0x2200, 0x0079, 0x3c20,
++      0x3c22, 0x3c47, 0x70a7, 0x3c26, 0x0078, 0x4315, 0x2011, 0x000d,
++      0x1078, 0x3f91, 0x0079, 0x3c2c, 0x3c31, 0x231a, 0x399c, 0x3c39,
++      0x3c41, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078,
++      0x4303, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078,
++      0x4303, 0x70ab, 0x3c45, 0x0078, 0x231a, 0x0078, 0x3c31, 0x70a7,
++      0x3c4b, 0x0078, 0x4315, 0x2011, 0x0012, 0x1078, 0x3f91, 0x0079,
++      0x3c51, 0x3c57, 0x231a, 0x399c, 0x3c63, 0x3c6b, 0x3c71, 0xa6b4,
++      0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x70bc, 0xa080, 0x00a1,
++      0x781a, 0x0078, 0x231a, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6,
++      0x7e5a, 0x0078, 0x4303, 0x70ab, 0x3c6f, 0x0078, 0x231a, 0x0078,
++      0x3c57, 0x70ab, 0x3c75, 0x0078, 0x231a, 0x0078, 0x3c63, 0xa286,
++      0x0001, 0x0040, 0x3c7d, 0x1078, 0x22ac, 0x70a7, 0x3c81, 0x0078,
++      0x4315, 0x2011, 0x0015, 0x1078, 0x3f91, 0x0079, 0x3c87, 0x3c8c,
++      0x231a, 0x399c, 0x3c94, 0x3c9c, 0xa6b4, 0x00ff, 0xa6b5, 0x0400,
++      0x6eb6, 0x7e5a, 0x0078, 0x4303, 0xa6b4, 0x00ff, 0xa6b5, 0x0400,
++      0x6eb6, 0x7e5a, 0x0078, 0x4303, 0x70ab, 0x3ca0, 0x0078, 0x231a,
++      0x0078, 0x3c8c, 0xa282, 0x0002, 0x0050, 0x3ca8, 0x1078, 0x22ac,
++      0x2300, 0x0079, 0x3cab, 0x3cae, 0x3cd7, 0x3d26, 0xa286, 0x0001,
++      0x0040, 0x3cb4, 0x1078, 0x22ac, 0x6804, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x00c0, 0x3cc1, 0x1078, 0x3906, 0x7003, 0x0000, 0x0078,
++      0x399c, 0x6837, 0x0000, 0x683b, 0x0000, 0xa684, 0x0200, 0x0040,
++      0x3ccf, 0x1078, 0x42d4, 0x1078, 0x3f79, 0x1078, 0x42db, 0x2001,
++      0x0001, 0x1078, 0x4254, 0x7003, 0x0000, 0x0078, 0x399c, 0x2200,
++      0x0079, 0x3cda, 0x3cdc, 0x3d01, 0x70a7, 0x3ce0, 0x0078, 0x4315,
++      0x2011, 0x000d, 0x1078, 0x3f91, 0x0079, 0x3ce6, 0x3ceb, 0x231a,
++      0x399c, 0x3cf3, 0x3cfb, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6,
++      0x7e5a, 0x0078, 0x4303, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6,
++      0x7e5a, 0x0078, 0x4303, 0x70ab, 0x3cff, 0x0078, 0x231a, 0x0078,
++      0x3ceb, 0x70a7, 0x3d05, 0x0078, 0x4315, 0x2011, 0x0005, 0x1078,
++      0x3f91, 0x0079, 0x3d0b, 0x3d10, 0x231a, 0x399c, 0x3d18, 0x3d20,
++      0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4303,
++      0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4303,
++      0x70ab, 0x3d24, 0x0078, 0x231a, 0x0078, 0x3d10, 0xa286, 0x0001,
++      0x0040, 0x3d2c, 0x1078, 0x22ac, 0x70a7, 0x3d30, 0x0078, 0x4315,
++      0x2011, 0x0006, 0x1078, 0x3f91, 0x0079, 0x3d36, 0x3d3b, 0x231a,
++      0x399c, 0x3d41, 0x3d43, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078,
++      0x4303, 0x1078, 0x22ac, 0x70ab, 0x3d47, 0x0078, 0x231a, 0x0078,
++      0x3d3b, 0x2300, 0x0079, 0x3d4c, 0x3d51, 0x3d4f, 0x3d4f, 0x1078,
++      0x22ac, 0x1078, 0x22ac, 0x2300, 0x71a8, 0xa005, 0x017a, 0xa282,
++      0x0002, 0x0050, 0x3d5d, 0x1078, 0x22ac, 0x2300, 0x0079, 0x3d60,
++      0x3d63, 0x3d76, 0x3d94, 0x82ff, 0x00c0, 0x3d68, 0x1078, 0x22ac,
++      0xa684, 0x0200, 0x0040, 0x3d70, 0x1078, 0x42d4, 0x1078, 0x42db,
++      0x2001, 0x0001, 0x1078, 0x4254, 0x0078, 0x231a, 0x82ff, 0x0040,
++      0x3d7b, 0x1078, 0x22ac, 0x70a7, 0x3d7f, 0x0078, 0x4315, 0x2011,
++      0x0018, 0x1078, 0x3f91, 0x0079, 0x3d85, 0x3d8a, 0x231a, 0x399c,
++      0x3d8c, 0x3d8e, 0x0078, 0x4303, 0x0078, 0x4303, 0x70ab, 0x3d92,
++      0x0078, 0x231a, 0x0078, 0x3d8a, 0x2200, 0x0079, 0x3d97, 0x3d99,
++      0x3db2, 0x70a7, 0x3d9d, 0x0078, 0x4315, 0x2011, 0x0018, 0x1078,
++      0x3f91, 0x0079, 0x3da3, 0x3da8, 0x231a, 0x399c, 0x3daa, 0x3dac,
++      0x0078, 0x4303, 0x0078, 0x4303, 0x70ab, 0x3db0, 0x0078, 0x231a,
++      0x0078, 0x3da8, 0xa484, 0x8000, 0x00c0, 0x3df0, 0xa684, 0x0100,
++      0x0040, 0x3dc6, 0x1078, 0x42d4, 0x1078, 0x3f79, 0x1078, 0x42db,
++      0x7848, 0xa085, 0x000c, 0x784a, 0x0078, 0x3dca, 0x78d8, 0x78d2,
++      0x78dc, 0x78d6, 0xa6b4, 0xefff, 0x7e5a, 0x70a7, 0x3dd1, 0x0078,
++      0x4315, 0x2011, 0x000d, 0x1078, 0x3f91, 0x0079, 0x3dd7, 0x3ddc,
++      0x231a, 0x399c, 0x3ddc, 0x3dea, 0xa684, 0x0100, 0x0040, 0x3de8,
++      0x1078, 0x4291, 0x6830, 0x78d2, 0x682c, 0x78d6, 0x1078, 0x42cc,
++      0x0078, 0x4303, 0x70ab, 0x3dee, 0x0078, 0x231a, 0x0078, 0x3ddc,
++      0x1078, 0x42db, 0x70ab, 0x3dfa, 0x2001, 0x0003, 0x1078, 0x424c,
++      0x0078, 0x430f, 0x1078, 0x42cc, 0x6830, 0x78d2, 0x682c, 0x78d6,
++      0x0078, 0x4303, 0x681b, 0x0000, 0xa684, 0x0008, 0x0040, 0x3e20,
++      0x157e, 0x137e, 0x147e, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004,
++      0xa084, 0x000f, 0x681a, 0x80ac, 0x789b, 0x0000, 0xaf80, 0x002c,
++      0x2098, 0xad80, 0x000b, 0x20a0, 0x53a5, 0x147f, 0x137f, 0x157f,
++      0xa6c4, 0x0f00, 0xa684, 0x0002, 0x00c0, 0x3e2d, 0x692c, 0x810f,
++      0x810d, 0x810d, 0x810d, 0x0078, 0x3e3a, 0x789b, 0x0010, 0x79ac,
++      0x0078, 0x3e3a, 0x017e, 0x2009, 0x0005, 0x2001, 0x3d00, 0x1078,
++      0x429c, 0x017f, 0xa184, 0x001f, 0xa805, 0x6816, 0x1078, 0x3977,
++      0x68be, 0xa684, 0x0004, 0x0040, 0x3e4b, 0xa18c, 0xff00, 0x78a8,
++      0xa084, 0x00ff, 0xa105, 0x682a, 0xa6b4, 0x00ff, 0x6000, 0xa084,
++      0x0008, 0x0040, 0x3e55, 0xa6b5, 0x4000, 0x6eb6, 0x007c, 0x157e,
++      0x137e, 0x147e, 0x6918, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004,
++      0xa084, 0x000f, 0x007e, 0xa100, 0x681a, 0x007f, 0x8004, 0x0040,
++      0x3e75, 0x20a8, 0x8104, 0xa080, 0x000b, 0xad00, 0x20a0, 0x789b,
++      0x0000, 0xaf80, 0x002c, 0x2098, 0x53a5, 0x147f, 0x137f, 0x157f,
++      0x007c, 0x682c, 0xa084, 0x2000, 0x00c0, 0x3e81, 0x620c, 0x0078,
++      0x3e82, 0x6210, 0x6b18, 0x2300, 0xa202, 0x0040, 0x3ea0, 0x2018,
++      0xa382, 0x000e, 0x0048, 0x3e92, 0x0040, 0x3e92, 0x2019, 0x000e,
++      0x0078, 0x3e96, 0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b02,
++      0x7893, 0x0000, 0x7ba2, 0x70bc, 0xa080, 0x008a, 0x781a, 0x007c,
++      0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b02, 0x7893, 0x0000,
++      0x007c, 0x6807, 0x0117, 0x6914, 0x1078, 0x3977, 0x6100, 0x8104,
++      0x00c8, 0x3ec6, 0x601c, 0xa005, 0x0040, 0x3eba, 0x2001, 0x0800,
++      0x0078, 0x3ec8, 0x0d7e, 0x6824, 0x007e, 0x1078, 0x42e4, 0x007f,
++      0x6826, 0x2d00, 0x682e, 0x1078, 0x3906, 0x0d7f, 0x2001, 0x0200,
++      0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x681c, 0xa085, 0x8000,
++      0x681e, 0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71bc, 0xa188, 0x008d,
++      0x791a, 0x007c, 0x6914, 0x1078, 0x3977, 0x6100, 0x8104, 0x00c8,
++      0x3f27, 0xa184, 0x0300, 0x0040, 0x3ee9, 0x6807, 0x0117, 0x0078,
++      0x3f07, 0x6004, 0xa005, 0x00c0, 0x3f10, 0x6807, 0x0117, 0x601c,
++      0xa005, 0x00c0, 0x3efd, 0x0d7e, 0x1078, 0x42e4, 0x6827, 0x0034,
++      0x2d00, 0x682e, 0x1078, 0x3906, 0x0d7f, 0xa684, 0x0004, 0x0040,
++      0x3f07, 0x2031, 0x0400, 0x2001, 0x2800, 0x0078, 0x3f0b, 0x2031,
++      0x0400, 0x2001, 0x0800, 0x71bc, 0xa188, 0x008d, 0x0078, 0x3f56,
++      0x6018, 0xa005, 0x00c0, 0x3efd, 0x601c, 0xa005, 0x00c0, 0x3efd,
++      0x689f, 0x0000, 0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x3f64,
++      0xa6b5, 0x0800, 0x71bc, 0xa188, 0x00a5, 0x0078, 0x3f5f, 0x6807,
++      0x0117, 0x2031, 0x0400, 0x692c, 0x810f, 0xa18c, 0x00ff, 0xa186,
++      0x0012, 0x00c0, 0x3f39, 0x2001, 0x3f6f, 0x2009, 0x0001, 0x0078,
++      0x3f4a, 0xa186, 0x0003, 0x00c0, 0x3f43, 0x2001, 0x3f70, 0x2009,
++      0x0012, 0x0078, 0x3f4a, 0x2001, 0x0200, 0x71bc, 0xa188, 0x008d,
++      0x0078, 0x3f56, 0x1078, 0x42b7, 0x78a3, 0x0000, 0x6820, 0xa085,
++      0x0040, 0x6822, 0x71bc, 0xa188, 0x00da, 0xa006, 0x6826, 0x8007,
++      0x789b, 0x000e, 0x78aa, 0x681c, 0xa085, 0x8000, 0x681e, 0x6eb6,
++      0x7e5a, 0x791a, 0x0078, 0x231a, 0x6eb6, 0x1078, 0x3906, 0x6814,
++      0x70ae, 0x6828, 0x70b2, 0x7003, 0x0007, 0x0078, 0x231a, 0x0023,
++      0x0070, 0x0005, 0x0000, 0x0a00, 0x0000, 0x0000, 0x0025, 0x0000,
++      0x0000, 0x6837, 0x0000, 0x683b, 0x0000, 0xa684, 0x0200, 0x0040,
++      0x3f90, 0x78b8, 0xa08c, 0x001f, 0xa084, 0x8000, 0x0040, 0x3f89,
++      0x8108, 0x78d8, 0xa100, 0x683a, 0x78dc, 0xa081, 0x0000, 0x6836,
++      0x007c, 0x7990, 0x810f, 0xa5ac, 0x0007, 0x2021, 0x0000, 0xa480,
++      0x0010, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa184, 0x0080, 0x00c0,
++      0x3fbf, 0xa182, 0x0020, 0x00c8, 0x3fd9, 0xa182, 0x0012, 0x00c8,
++      0x4241, 0x2100, 0x1079, 0x3fad, 0x007c, 0x4241, 0x418a, 0x4241,
++      0x4241, 0x3fe6, 0x3fe9, 0x4023, 0x4063, 0x4093, 0x4096, 0x4241,
++      0x4241, 0x4045, 0x40b8, 0x40f3, 0x4241, 0x4241, 0x411b, 0xa18c,
++      0x001f, 0x6814, 0xa084, 0x001f, 0xa106, 0x0040, 0x3fd6, 0x70bc,
++      0xa080, 0x00c4, 0x781a, 0x2001, 0x0014, 0x1078, 0x4254, 0x1078,
++      0x42db, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000,
++      0x007c, 0xa182, 0x0024, 0x00c8, 0x4241, 0xa184, 0x0003, 0x1079,
++      0x3fad, 0x007c, 0x4241, 0x4241, 0x4241, 0x4241, 0x1078, 0x4241,
++      0x007c, 0x2200, 0x0079, 0x3fec, 0x411e, 0x411e, 0x4010, 0x4010,
++      0x4010, 0x4010, 0x4010, 0x4010, 0x4010, 0x4010, 0x400e, 0x4010,
++      0x4005, 0x4010, 0x4010, 0x4010, 0x4010, 0x4010, 0x4018, 0x401b,
++      0x411e, 0x401b, 0x4010, 0x4010, 0x4010, 0x0c7e, 0x077e, 0x6f14,
++      0x1078, 0x34f9, 0x077f, 0x0c7f, 0x0078, 0x4010, 0x1078, 0x41df,
++      0x6827, 0x02b3, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x414e,
++      0x1078, 0x4236, 0x007c, 0x6827, 0x0293, 0x2009, 0x000b, 0x2001,
++      0x4800, 0x0078, 0x413a, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x00c0, 0x402d, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078,
++      0x42e4, 0x6827, 0x0036, 0x810f, 0x6932, 0x2d00, 0x682e, 0x0d7e,
++      0x1078, 0x38d6, 0x1078, 0x4172, 0x2b68, 0x1078, 0x3906, 0x0d7f,
++      0x1078, 0x3906, 0x2001, 0x0002, 0x007c, 0x1078, 0x4172, 0x6904,
++      0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4056, 0xa186, 0x000f,
++      0x0040, 0x4056, 0x1078, 0x18a0, 0x70a3, 0x0000, 0x2009, 0x4d38,
++      0x200b, 0x0006, 0x70b7, 0x0017, 0x2009, 0x0200, 0x1078, 0x3816,
++      0x2001, 0x0001, 0x007c, 0x2200, 0x0079, 0x4066, 0x411e, 0x414b,
++      0x414b, 0x414b, 0x4085, 0x415b, 0x415b, 0x415b, 0x415b, 0x415e,
++      0x415e, 0x4163, 0x4163, 0x407f, 0x407f, 0x414b, 0x414b, 0x415b,
++      0x414b, 0x408b, 0x411e, 0x408b, 0x408b, 0x415b, 0x408b, 0x2009,
++      0x000b, 0x2001, 0x4300, 0x0078, 0x416d, 0x2009, 0x000b, 0x2001,
++      0x4300, 0x0078, 0x414e, 0x6827, 0x0293, 0x2009, 0x000b, 0x2001,
++      0x4300, 0x0078, 0x413a, 0x2001, 0x0000, 0x007c, 0x2200, 0x0079,
++      0x4099, 0x411e, 0x40b2, 0x40b2, 0x40b2, 0x40b2, 0x415b, 0x415b,
++      0x415b, 0x415b, 0x415b, 0x415b, 0x415b, 0x415b, 0x40b2, 0x40b2,
++      0x40b2, 0x40b2, 0x415b, 0x40b2, 0x40b2, 0x415b, 0x415b, 0x415b,
++      0x415b, 0x411e, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078, 0x413a,
++      0xa684, 0x0004, 0x00c0, 0x40cc, 0x6804, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x00c0, 0x4241, 0x1078, 0x4172, 0x6807, 0x0117, 0x1078,
++      0x3906, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040,
++      0x4241, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++      0x40db, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078, 0x42e4, 0x6827,
++      0x0036, 0x810f, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x38e5,
++      0x1078, 0x4172, 0x2b68, 0x1078, 0x3906, 0x0d7f, 0x1078, 0x3906,
++      0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040, 0x4241,
++      0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006, 0x00c0, 0x4102,
++      0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078, 0x42e4, 0x6827,
++      0x0036, 0x810f, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x38f5,
++      0x1078, 0x4172, 0x2b68, 0x1078, 0x3906, 0x0d7f, 0x1078, 0x3906,
++      0x2001, 0x0002, 0x007c, 0x1078, 0x4241, 0x007c, 0x70bc, 0xa080,
++      0x00c4, 0x781a, 0x2001, 0x0001, 0x1078, 0x4254, 0x1078, 0x42db,
++      0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x429c, 0x1078,
++      0x42d4, 0x1078, 0x3f79, 0x1078, 0x3ea9, 0x1078, 0x42db, 0x2001,
++      0x0001, 0x007c, 0x1078, 0x429c, 0x1078, 0x42d4, 0x1078, 0x3f79,
++      0x70bc, 0xa080, 0x00c4, 0x781a, 0x1078, 0x42db, 0x7003, 0x0000,
++      0x2001, 0x0002, 0x007c, 0x1078, 0x4241, 0x007c, 0x1078, 0x429c,
++      0x1078, 0x42d4, 0x1078, 0x3f79, 0x1078, 0x3ea9, 0x1078, 0x42db,
++      0x2001, 0x0001, 0x007c, 0x2001, 0x0003, 0x007c, 0x1078, 0x41df,
++      0x2001, 0x0000, 0x007c, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x34f9,
++      0x077f, 0x0c7f, 0x2001, 0x0000, 0x007c, 0x1078, 0x429c, 0x1078,
++      0x4241, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040,
++      0x417d, 0xa186, 0x000f, 0x00c0, 0x4181, 0x1078, 0x42d4, 0x1078,
++      0x3f79, 0x70bc, 0xa080, 0x00c4, 0x781a, 0x1078, 0x42db, 0x7003,
++      0x0000, 0x007c, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff,
++      0xa08a, 0x0004, 0x00c8, 0x4241, 0x1079, 0x4197, 0x007c, 0x4241,
++      0x419b, 0x4241, 0x41ed, 0xa282, 0x0003, 0x0040, 0x41a2, 0x1078,
++      0x4241, 0x007c, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff,
++      0xa482, 0x000c, 0x0048, 0x41b0, 0x0040, 0x41b0, 0x2021, 0x000c,
++      0x701c, 0xa502, 0x00c8, 0x41b5, 0x751c, 0x1078, 0x4227, 0x852b,
++      0x852b, 0x1078, 0x3577, 0x0040, 0x41c1, 0x1078, 0x41d1, 0x0078,
++      0x41c5, 0x1078, 0x4223, 0x1078, 0x41df, 0xa6b5, 0x1000, 0x789b,
++      0x007e, 0x7ea6, 0x70bc, 0xa080, 0x00b0, 0x781a, 0x2001, 0x0004,
++      0x007c, 0x0c7e, 0x6914, 0x810f, 0xa18c, 0x000f, 0x810b, 0x810b,
++      0x810b, 0xa1e0, 0x4f80, 0x1078, 0x338b, 0x0c7f, 0x007c, 0x0c7e,
++      0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
++      0x4f80, 0x1078, 0x33b2, 0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0,
++      0x4241, 0x7aa8, 0xa294, 0x00ff, 0xa284, 0xfffe, 0x0040, 0x41fa,
++      0x2011, 0x0001, 0x1078, 0x4215, 0x1078, 0x4207, 0x1078, 0x41df,
++      0x70bc, 0xa080, 0x00b0, 0x781a, 0x2001, 0x0004, 0x007c, 0x0c7e,
++      0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
++      0x4f80, 0x1078, 0x3457, 0x0c7f, 0x007c, 0x789b, 0x0018, 0x78ab,
++      0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0081,
++      0x78ab, 0x0004, 0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b,
++      0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
++      0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x007c, 0x2001, 0x0003,
++      0x1078, 0x424c, 0x70bc, 0xa080, 0x00b0, 0x781a, 0x2001, 0x0005,
++      0x007c, 0x2001, 0x0007, 0x1078, 0x424c, 0x70bc, 0xa080, 0x00b0,
++      0x781a, 0x2001, 0x0004, 0x007c, 0x789b, 0x0018, 0x78aa, 0x789b,
++      0x0081, 0x78ab, 0x0001, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa196,
++      0x0007, 0x0040, 0x4262, 0xa196, 0x000f, 0x0040, 0x4262, 0x1078,
++      0x18a0, 0x007c, 0x6924, 0xa194, 0x003f, 0x00c0, 0x426b, 0xa18c,
++      0xffc0, 0xa105, 0x6826, 0x1078, 0x3906, 0x6920, 0xa184, 0x0100,
++      0x0040, 0x4290, 0x6824, 0xa084, 0x0001, 0x0040, 0x4290, 0x6b14,
++      0xa184, 0x0002, 0x00c0, 0x4280, 0x1078, 0x1b1b, 0x0078, 0x4285,
++      0x6c28, 0xa4a4, 0x00ff, 0x1078, 0x1ab9, 0x0d7e, 0x2068, 0x1078,
++      0x18a0, 0x0d7f, 0x6914, 0x1078, 0x3977, 0x6204, 0x8210, 0x6206,
++      0x007c, 0x6930, 0x6838, 0x6832, 0xa112, 0x692c, 0x6834, 0x682e,
++      0xa11b, 0xa200, 0xa301, 0x007c, 0x0c7e, 0xade0, 0x0018, 0x6003,
++      0x7000, 0x810f, 0x6106, 0x600b, 0x0000, 0x600f, 0x000a, 0x6013,
++      0x0000, 0x6017, 0x0000, 0x8007, 0x601a, 0x601f, 0x0000, 0x6023,
++      0x0000, 0x0c7f, 0x6824, 0xa085, 0x0080, 0x6826, 0x007c, 0x157e,
++      0x137e, 0x147e, 0x2098, 0xaf80, 0x002d, 0x20a0, 0x81ac, 0x0040,
++      0x42c2, 0x53a6, 0xa184, 0x0001, 0x0040, 0x42c8, 0x3304, 0x78be,
++      0x147f, 0x137f, 0x157f, 0x007c, 0x70b8, 0xa005, 0x10c0, 0x22ac,
++      0x70bb, 0x8000, 0x0078, 0x45ed, 0x71b8, 0x81ff, 0x0040, 0x42da,
++      0x1078, 0x46d8, 0x007c, 0x71b8, 0x81ff, 0x0040, 0x42e3, 0x70bb,
++      0x0000, 0x1078, 0x431b, 0x007c, 0x0c7e, 0x0d7e, 0x1078, 0x187d,
++      0x0c7f, 0x157e, 0x137e, 0x147e, 0x2da0, 0x2c98, 0x20a9, 0x0031,
++      0x53a3, 0x147f, 0x137f, 0x157f, 0x6807, 0x010d, 0x680b, 0x0000,
++      0x7004, 0x8007, 0x681a, 0x681f, 0x0000, 0x6823, 0x0000, 0x689f,
++      0x0000, 0x0c7f, 0x007c, 0x70bc, 0xa080, 0x008d, 0x781a, 0x0078,
++      0x231a, 0x70bc, 0xa080, 0x007d, 0x781a, 0x0078, 0x231a, 0x70bc,
++      0xa080, 0x00b0, 0x781a, 0x0078, 0x231a, 0x70bc, 0xa080, 0x00ba,
++      0x781a, 0x0078, 0x231a, 0x127e, 0x2091, 0x2200, 0x2049, 0x431b,
++      0x7000, 0x7204, 0xa205, 0x720c, 0xa215, 0x7008, 0xa084, 0xfffd,
++      0xa205, 0x0040, 0x432d, 0x0078, 0x4332, 0x7003, 0x0000, 0x127f,
++      0x2000, 0x007c, 0x7000, 0xa084, 0x0001, 0x00c0, 0x4360, 0x7108,
++      0x8104, 0x00c8, 0x433f, 0x1078, 0x4462, 0x0078, 0x4337, 0x700c,
++      0xa08c, 0x00ff, 0x0040, 0x4360, 0x7004, 0x8004, 0x00c8, 0x4357,
++      0x7014, 0xa005, 0x00c0, 0x4353, 0x7010, 0xa005, 0x0040, 0x4357,
++      0xa102, 0x00c8, 0x4337, 0x7007, 0x0010, 0x0078, 0x4360, 0x8aff,
++      0x0040, 0x4360, 0x1078, 0x46ba, 0x00c0, 0x435a, 0x0040, 0x4337,
++      0x1078, 0x43eb, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x017e,
++      0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4373, 0xa18e,
++      0x000f, 0x00c0, 0x4376, 0x6040, 0x0078, 0x4377, 0x6428, 0x017f,
++      0x84ff, 0x0040, 0x43a1, 0x2c70, 0x7004, 0xa0bc, 0x000f, 0xa7b8,
++      0x43b1, 0x273c, 0x87fb, 0x00c0, 0x438f, 0x0048, 0x4389, 0x1078,
++      0x22ac, 0x609c, 0xa075, 0x0040, 0x43a1, 0x0078, 0x437c, 0x2704,
++      0xae68, 0x680c, 0xa630, 0x6808, 0xa529, 0x8421, 0x0040, 0x43a1,
++      0x8738, 0x2704, 0xa005, 0x00c0, 0x4390, 0x709c, 0xa075, 0x00c0,
++      0x437c, 0x007c, 0x0000, 0x0005, 0x0009, 0x000d, 0x0011, 0x0015,
++      0x0019, 0x001d, 0x0000, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b,
++      0x0000, 0x0000, 0x43a6, 0x43a3, 0x0000, 0x0000, 0x8000, 0x0000,
++      0x43a6, 0x0000, 0x43ae, 0x43ab, 0x0000, 0x0000, 0x0000, 0x0000,
++      0x43ae, 0x0000, 0x43a9, 0x43a9, 0x0000, 0x0000, 0x8000, 0x0000,
++      0x43a9, 0x0000, 0x43af, 0x43af, 0x0000, 0x0000, 0x0000, 0x0000,
++      0x43af, 0x127e, 0x2091, 0x2200, 0x2079, 0x4d00, 0x2071, 0x0010,
++      0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071, 0x0020,
++      0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049, 0x0000,
++      0x127f, 0x2000, 0x007c, 0x2049, 0x43eb, 0x2019, 0x0000, 0x7004,
++      0x8004, 0x00c8, 0x443e, 0x7007, 0x0012, 0x7108, 0x7008, 0xa106,
++      0x00c0, 0x43f5, 0xa184, 0x000c, 0x0040, 0x4400, 0x1078, 0x22ac,
++      0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x440b, 0xa184,
++      0x0000, 0x00c0, 0x43f5, 0xa19c, 0x0032, 0xa386, 0x0030, 0x0040,
++      0x4419, 0xa386, 0x0002, 0x0040, 0x4424, 0xa386, 0x0032, 0x00c0,
++      0x43f5, 0x7200, 0x8204, 0x0048, 0x4424, 0x730c, 0xa384, 0x00ff,
++      0x0040, 0x4424, 0x1078, 0x22ac, 0x7007, 0x0012, 0x7000, 0xa084,
++      0x0001, 0x00c0, 0x443e, 0x7008, 0xa084, 0x000c, 0x00c0, 0x443e,
++      0x7310, 0x7014, 0xa305, 0x0040, 0x443e, 0x710c, 0xa184, 0x0300,
++      0x00c0, 0x443e, 0xa184, 0x00ff, 0x00c0, 0x43eb, 0x7007, 0x0012,
++      0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, 0x4442, 0x7007,
++      0x0012, 0x7108, 0x8104, 0x0048, 0x4447, 0x7003, 0x0000, 0x2049,
++      0x0000, 0x007c, 0x107e, 0x007e, 0x127e, 0x157e, 0x2091, 0x2200,
++      0x7108, 0x1078, 0x4462, 0x157f, 0x127f, 0x2091, 0x8001, 0x007f,
++      0x107f, 0x007c, 0x7204, 0x7500, 0x730c, 0xa384, 0x0300, 0x00c0,
++      0x4497, 0xa184, 0x000c, 0x00c0, 0x44bb, 0x7108, 0xa184, 0x000c,
++      0x00c0, 0x44bb, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8,
++      0x447d, 0xa184, 0x0000, 0x00c0, 0x446d, 0xa184, 0x00c0, 0x8004,
++      0x8004, 0x8004, 0x8004, 0x8004, 0x8004, 0xa18c, 0x0030, 0xa18e,
++      0x0030, 0x00c0, 0x448d, 0xa085, 0x0004, 0x0079, 0x448f, 0x4499,
++      0x44ab, 0x4497, 0x44ab, 0x4497, 0x44f7, 0x4497, 0x44f5, 0x1078,
++      0x22ac, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff,
++      0x00c0, 0x44a6, 0x2049, 0x0000, 0x0078, 0x44aa, 0x1078, 0x46ba,
++      0x00c0, 0x44a6, 0x007c, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002,
++      0x7006, 0x8aff, 0x00c0, 0x44b6, 0x0078, 0x44ba, 0x1078, 0x46ba,
++      0x00c0, 0x44b6, 0x007c, 0x7007, 0x0012, 0x7108, 0x00e0, 0x44be,
++      0x2091, 0x6000, 0x00e0, 0x44c2, 0x2091, 0x6000, 0x7007, 0x0012,
++      0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, 0x44ca, 0x7007,
++      0x0012, 0x7108, 0x8104, 0x0048, 0x44cf, 0x7003, 0x0000, 0x7000,
++      0xa005, 0x00c0, 0x44e3, 0x7004, 0xa005, 0x00c0, 0x44e3, 0x700c,
++      0xa005, 0x0040, 0x44e5, 0x0078, 0x44c6, 0x2049, 0x0000, 0x1078,
++      0x3616, 0x6818, 0xa084, 0x8000, 0x0040, 0x44f0, 0x681b, 0x0002,
++      0x007c, 0x1078, 0x22ac, 0x1078, 0x22ac, 0x1078, 0x4553, 0x7210,
++      0x7114, 0x700c, 0xa09c, 0x00ff, 0x2800, 0xa300, 0xa211, 0xa189,
++      0x0000, 0x1078, 0x4553, 0x2704, 0x2c58, 0xac60, 0x630c, 0x2200,
++      0xa322, 0x6308, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x451a,
++      0x00c8, 0x451a, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60,
++      0x0078, 0x4501, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008,
++      0x0040, 0x4526, 0xa7ba, 0x43ab, 0x0078, 0x4528, 0xa7ba, 0x43a3,
++      0x007f, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007,
++      0x0012, 0x1078, 0x43eb, 0x007c, 0x8738, 0x2704, 0xa005, 0x00c0,
++      0x4547, 0x609c, 0xa005, 0x0040, 0x4550, 0x2060, 0x6004, 0xa084,
++      0x000f, 0xa080, 0x43b1, 0x203c, 0x87fb, 0x1040, 0x22ac, 0x8a51,
++      0x0040, 0x454f, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0, 0x007c,
++      0x2051, 0x0000, 0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0,
++      0x4567, 0x6000, 0xa064, 0x00c0, 0x455e, 0x2d60, 0x6004, 0xa084,
++      0x000f, 0xa080, 0x43c1, 0x203c, 0x87fb, 0x1040, 0x22ac, 0x007c,
++      0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888,
++      0x6b8c, 0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e,
++      0x6804, 0xa084, 0x0008, 0x007f, 0x0040, 0x4582, 0xa0b8, 0x43ab,
++      0x0078, 0x4584, 0xa0b8, 0x43a3, 0x7e08, 0xa6b5, 0x000c, 0x6904,
++      0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4592, 0xa18e, 0x000f,
++      0x00c0, 0x459b, 0x6820, 0xa084, 0x0040, 0x0040, 0x45a2, 0xa6b5,
++      0x0001, 0x0078, 0x45a2, 0x681c, 0xa084, 0x0040, 0x0040, 0x45a2,
++      0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++      0x45a4, 0x2400, 0xa305, 0x00c0, 0x45af, 0x0078, 0x45d5, 0x2c58,
++      0x2704, 0x6104, 0xac60, 0x6004, 0xa400, 0x701a, 0x6000, 0xa301,
++      0x701e, 0xa184, 0x0008, 0x0040, 0x45c5, 0x6014, 0xa081, 0x0000,
++      0x7022, 0x6010, 0xa081, 0x0000, 0x7026, 0x620c, 0x2400, 0xa202,
++      0x7012, 0x6208, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001,
++      0x2b60, 0x1078, 0x4534, 0x0078, 0x45d7, 0x1078, 0x46ba, 0x00c0,
++      0x45d5, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200,
++      0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x45e3,
++      0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091,
++      0x2200, 0x0d7f, 0x2049, 0x45ed, 0x7007, 0x0004, 0x7004, 0xa084,
++      0x0004, 0x00c0, 0x45f6, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c,
++      0x00ff, 0xa186, 0x0007, 0x0040, 0x4609, 0xa18e, 0x000f, 0x00c0,
++      0x4614, 0x6820, 0xa084, 0x0040, 0x0040, 0x4610, 0xa6b5, 0x0001,
++      0x6840, 0x2050, 0x0078, 0x461d, 0x681c, 0xa084, 0x0020, 0x00c0,
++      0x461b, 0xa6b5, 0x0001, 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc,
++      0x000f, 0xa7b8, 0x43b1, 0x273c, 0x87fb, 0x00c0, 0x4631, 0x0048,
++      0x462b, 0x1078, 0x22ac, 0x689c, 0xa065, 0x0040, 0x4635, 0x0078,
++      0x461e, 0x1078, 0x46ba, 0x00c0, 0x4631, 0x127f, 0x2000, 0x007c,
++      0x127e, 0x007e, 0x017e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f,
++      0x047f, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186,
++      0x0007, 0x0040, 0x464f, 0xa18e, 0x000f, 0x00c0, 0x4658, 0x6820,
++      0xa084, 0x0040, 0x0040, 0x465f, 0xa6b5, 0x0001, 0x0078, 0x465f,
++      0x681c, 0xa084, 0x0040, 0x0040, 0x465f, 0xa6b5, 0x0001, 0x2049,
++      0x4638, 0x017e, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040,
++      0x466d, 0xa18e, 0x000f, 0x00c0, 0x4670, 0x6840, 0x0078, 0x4671,
++      0x6828, 0x017f, 0xa055, 0x0040, 0x46b7, 0x2d70, 0x2e60, 0x7004,
++      0xa0bc, 0x000f, 0xa7b8, 0x43b1, 0x273c, 0x87fb, 0x00c0, 0x468b,
++      0x0048, 0x4684, 0x1078, 0x22ac, 0x709c, 0xa075, 0x2060, 0x0040,
++      0x46b7, 0x0078, 0x4677, 0x2704, 0xae68, 0x680c, 0xa422, 0x6808,
++      0xa31b, 0x0048, 0x46a4, 0x8a51, 0x00c0, 0x4698, 0x1078, 0x22ac,
++      0x8738, 0x2704, 0xa005, 0x00c0, 0x468c, 0x709c, 0xa075, 0x2060,
++      0x0040, 0x46b7, 0x0078, 0x4677, 0x8422, 0x8420, 0x831a, 0xa399,
++      0x0000, 0x690c, 0x2400, 0xa122, 0x6908, 0x2300, 0xa11b, 0x00c8,
++      0x46b3, 0x1078, 0x22ac, 0x2071, 0x0020, 0x0078, 0x45a2, 0x127f,
++      0x2000, 0x007c, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0, 0x0040,
++      0x46d7, 0x2704, 0xac08, 0x2104, 0x701e, 0x8108, 0x2104, 0x701a,
++      0x8108, 0x2104, 0x7016, 0x8108, 0x2104, 0x7012, 0x7602, 0x7004,
++      0xa084, 0x0010, 0xa085, 0x0001, 0x7006, 0x1078, 0x4534, 0x007c,
++      0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x46d8, 0x0d7f,
++      0x087f, 0x7108, 0xa184, 0x00c0, 0x00c0, 0x4702, 0x017e, 0x6904,
++      0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x46f2, 0xa18e, 0x000f,
++      0x00c0, 0x46f5, 0x6840, 0x0078, 0x46f6, 0x6828, 0x017f, 0xa005,
++      0x0040, 0x471f, 0x0078, 0x4332, 0x0020, 0x4702, 0x1078, 0x44f7,
++      0x0078, 0x471f, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4702, 0x017e,
++      0x017f, 0x810c, 0x00c8, 0x4711, 0x7108, 0x1078, 0x4462, 0x0078,
++      0x46e1, 0x7007, 0x0010, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4713,
++      0x017e, 0x017f, 0x810c, 0x00c8, 0x4713, 0x1078, 0x4462, 0x7008,
++      0xa086, 0x0002, 0x00c0, 0x46e1, 0x7000, 0xa005, 0x00c0, 0x46e1,
++      0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x127e,
++      0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091, 0x2200, 0x0d7f,
++      0x2049, 0x472f, 0xad80, 0x0011, 0x20a0, 0x2099, 0x0031, 0x700c,
++      0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003,
++      0x0001, 0x0040, 0x474e, 0x8000, 0x80ac, 0x53a5, 0x7007, 0x0004,
++      0x7004, 0xa084, 0x0004, 0x00c0, 0x4750, 0x0c7f, 0x2049, 0x0000,
++      0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000, 0x007c,
++      0x2091, 0x6000, 0x2091, 0x8000, 0x78cc, 0xa005, 0x0040, 0x4777,
++      0x7994, 0x70d0, 0xa106, 0x00c0, 0x4777, 0x7804, 0xa005, 0x0040,
++      0x4777, 0x7807, 0x0000, 0x0068, 0x4777, 0x2091, 0x4080, 0x7820,
++      0x8001, 0x7822, 0x00c0, 0x47d2, 0x7824, 0x7822, 0x2069, 0x4d40,
++      0x6800, 0xa084, 0x0007, 0x0040, 0x4795, 0xa086, 0x0002, 0x0040,
++      0x4795, 0x6834, 0xa00d, 0x0040, 0x4795, 0x2104, 0xa005, 0x0040,
++      0x4795, 0x8001, 0x200a, 0x0040, 0x487a, 0x7848, 0xa005, 0x0040,
++      0x47a3, 0x8001, 0x784a, 0x00c0, 0x47a3, 0x2009, 0x0102, 0x6844,
++      0x200a, 0x1078, 0x20a0, 0x6890, 0xa005, 0x0040, 0x47af, 0x8001,
++      0x6892, 0x00c0, 0x47af, 0x686f, 0x0000, 0x6873, 0x0001, 0x2061,
++      0x5000, 0x20a9, 0x0100, 0x2009, 0x0002, 0x6034, 0xa005, 0x0040,
++      0x47c5, 0x8001, 0x6036, 0x00c0, 0x47c5, 0x6010, 0xa005, 0x0040,
++      0x47c5, 0x017e, 0x1078, 0x20a0, 0x017f, 0xace0, 0x0010, 0x0070,
++      0x47cb, 0x0078, 0x47b5, 0x8109, 0x0040, 0x47d2, 0x20a9, 0x0100,
++      0x0078, 0x47b5, 0x1078, 0x47df, 0x1078, 0x4804, 0x2009, 0x4d51,
++      0x2104, 0x2009, 0x0102, 0x200a, 0x2091, 0x8001, 0x007c, 0x7834,
++      0x8001, 0x7836, 0x00c0, 0x4803, 0x7838, 0x7836, 0x2091, 0x8000,
++      0x7844, 0xa005, 0x00c0, 0x47ee, 0x2001, 0x0101, 0x8001, 0x7846,
++      0xa080, 0x7000, 0x2040, 0x2004, 0xa065, 0x0040, 0x4803, 0x6024,
++      0xa005, 0x0040, 0x47ff, 0x8001, 0x6026, 0x0040, 0x4833, 0x6000,
++      0x2c40, 0x0078, 0x47f4, 0x007c, 0x7828, 0x8001, 0x782a, 0x00c0,
++      0x4832, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x4811, 0x2001,
++      0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003, 0xa090,
++      0x5000, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040, 0x4832,
++      0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x482a, 0x8001, 0x2012,
++      0x00c0, 0x4832, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080, 0x201a,
++      0x1078, 0x20a0, 0x007c, 0x2069, 0x4d40, 0x6800, 0xa005, 0x0040,
++      0x483d, 0x6848, 0xac06, 0x0040, 0x487a, 0x601b, 0x0006, 0x60b4,
++      0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060,
++      0x6022, 0x6000, 0x2042, 0x6714, 0x6f82, 0x1078, 0x18b9, 0x6818,
++      0xa005, 0x0040, 0x4855, 0x8001, 0x681a, 0x6808, 0xa084, 0xffef,
++      0x680a, 0x6810, 0x8001, 0x00d0, 0x485f, 0x1078, 0x22ac, 0x6812,
++      0x6033, 0x0000, 0x602f, 0x0000, 0x2c68, 0x1078, 0x1b8e, 0x2069,
++      0x4d40, 0x7944, 0xa184, 0x0100, 0x2001, 0x0006, 0x686e, 0x00c0,
++      0x4875, 0x6986, 0x2001, 0x0004, 0x686e, 0x1078, 0x209b, 0x2091,
++      0x8001, 0x007c, 0x2069, 0x0100, 0x2009, 0x4d40, 0x2104, 0xa084,
++      0x0007, 0x0040, 0x48d6, 0xa086, 0x0007, 0x00c0, 0x4890, 0x0d7e,
++      0x2009, 0x4d52, 0x216c, 0x1078, 0x385e, 0x0d7f, 0x0078, 0x48d6,
++      0x2009, 0x4d52, 0x2164, 0x1078, 0x2257, 0x601b, 0x0006, 0x6858,
++      0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048,
++      0x6022, 0x6033, 0x0000, 0x602f, 0x0000, 0x6830, 0xa084, 0x0040,
++      0x0040, 0x48ca, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084,
++      0x0004, 0x0040, 0x48b7, 0x0070, 0x48b7, 0x0078, 0x48ae, 0x684b,
++      0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x48c4,
++      0x0070, 0x48c4, 0x0078, 0x48bb, 0x20a9, 0x00fa, 0x0070, 0x48ca,
++      0x0078, 0x48c6, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0048,
++      0x2009, 0x4d5b, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091, 0x8001,
++      0x007c, 0x2079, 0x4d00, 0x1078, 0x4904, 0x1078, 0x48e8, 0x1078,
++      0x48f6, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x007c,
++      0x2019, 0x0003, 0x2011, 0x4d46, 0x2204, 0xa086, 0x003c, 0x0040,
++      0x48f3, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019, 0x0039,
++      0x2011, 0x4d46, 0x2204, 0xa086, 0x003c, 0x0040, 0x4901, 0x2019,
++      0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971, 0x2011, 0x4d46,
++      0x2204, 0xa086, 0x003c, 0x0040, 0x490f, 0x2019, 0x2626, 0x7b22,
++      0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c, 0x0020, 0x002b,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014, 0x0014, 0x0014,
++      0x0014, 0x0014, 0x0014, 0x0080, 0x000f, 0x0000, 0x0201, 0x0604,
++      0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b, 0xa201, 0x0014,
++      0xa200, 0x0014, 0xa200, 0x0214, 0x0000, 0x006c, 0x0002, 0x0014,
++      0x98e1, 0x009e, 0x00ab, 0xa202, 0x8838, 0x8180, 0x842a, 0x84a0,
++      0x3806, 0x8839, 0x28c2, 0x9cc1, 0x985d, 0x0864, 0x9891, 0x28c1,
++      0x9cc1, 0xa203, 0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4,
++      0x1856, 0x883a, 0x986d, 0x28e2, 0x9c9e, 0x985d, 0x0864, 0x9891,
++      0x300c, 0x28e1, 0x9c9e, 0x2809, 0xa206, 0x64c0, 0x67a0, 0x6fc0,
++      0x1814, 0x883b, 0x782c, 0x786d, 0x9881, 0x282b, 0xa207, 0x64a0,
++      0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7822, 0x883e, 0x9885, 0x8576,
++      0x8677, 0x206b, 0x28c1, 0x9cc1, 0x2044, 0x2103, 0x20a2, 0x2081,
++      0x986d, 0xa209, 0x2901, 0x989a, 0x0014, 0xa205, 0x8000, 0x85a4,
++      0x1872, 0x879a, 0x883c, 0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704,
++      0x9c9e, 0x0014, 0xa204, 0x8000, 0x85a4, 0x84a8, 0x3009, 0x19e2,
++      0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6,
++      0x989e, 0xf881, 0x9899, 0xc801, 0x0014, 0xf8c1, 0x0016, 0x85b2,
++      0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241, 0x0014,
++      0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008,
++      0x1dc1, 0x0016, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf041, 0x3008,
++      0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d4, 0x8822, 0x0016,
++      0x8000, 0x2847, 0x1011, 0x98d4, 0x8000, 0xa000, 0x2802, 0x1011,
++      0x98da, 0x986d, 0x283e, 0x1011, 0x98de, 0xa20b, 0x0017, 0x300c,
++      0x8000, 0x85a4, 0x1de2, 0xdb81, 0x0014, 0x0210, 0x98ec, 0x0014,
++      0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x8180,
++      0x842a, 0x84a0, 0x3806, 0x0210, 0x9cc6, 0x0704, 0x0000, 0x006c,
++      0x0002, 0x984f, 0x0014, 0x009e, 0x00a3, 0x0017, 0x60ff, 0x300c,
++      0x8720, 0xa211, 0x9cc7, 0x8772, 0x8837, 0x2007, 0x10d2, 0x78e2,
++      0x9ccb, 0x9858, 0xd984, 0xf0e2, 0xf0a1, 0x98c4, 0x0014, 0x8831,
++      0xd167, 0x8830, 0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820,
++      0x9878, 0x2301, 0x9878, 0x10d2, 0x78e2, 0x9ccb, 0x986d, 0xf123,
++      0xf142, 0xf101, 0x98bd, 0x10d2, 0x70f8, 0x8832, 0x8203, 0x6001,
++      0x0014, 0x6845, 0x0214, 0xa21b, 0x9cc7, 0x2001, 0x98bc, 0x8202,
++      0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0x9889, 0x3027, 0x84a8,
++      0x1856, 0x8833, 0x0014, 0xa218, 0x6981, 0x9cb3, 0x6b2a, 0x6902,
++      0x1834, 0x9899, 0x1814, 0x8010, 0x8592, 0x8026, 0x84b9, 0x7021,
++      0x0014, 0x8000, 0x85a4, 0x84a8, 0x6946, 0xa213, 0x1462, 0xa213,
++      0x8000, 0x16e1, 0x98ac, 0x6969, 0xa214, 0x61c2, 0x8002, 0x14e1,
++      0x8004, 0x16e1, 0x0101, 0x300a, 0x8827, 0x0014, 0xa217, 0x9cb3,
++      0x0014, 0x8000, 0x85a4, 0x8181, 0x842a, 0x84a8, 0x1ce6, 0x0016,
++      0xa212, 0x9cc7, 0x10d2, 0x70e4, 0x0004, 0x8007, 0x9424, 0xcc1a,
++      0x9ccb, 0x98bc, 0x8827, 0x300a, 0x0013, 0x8000, 0x84a4, 0x84a8,
++      0x0016, 0x2002, 0x10d2, 0x98cb, 0x870e, 0xa21d, 0x0012, 0x878e,
++      0x85b2, 0x80f8, 0x9424, 0xa532, 0x84a4, 0x8000, 0x84a8, 0x0016,
++      0xa21c, 0x1035, 0x988d, 0xa210, 0x8180, 0x842a, 0x84a0, 0xa000,
++      0x8010, 0x8592, 0x853b, 0xd044, 0x8022, 0x3807, 0x84bb, 0x98ed,
++      0x8021, 0x3807, 0x84b9, 0x300c, 0x817e, 0x872b, 0x8772, 0x988d,
++      0x0000, 0x0020, 0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014,
++      0x0014, 0x98ee, 0x98d9, 0x0014, 0x0014, 0x0014, 0x0080, 0x013d,
++      0x0000, 0x0201, 0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018,
++      0x300b, 0xa201, 0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202,
++      0x8838, 0x3806, 0x8839, 0x28c2, 0x9cba, 0xa804, 0x0864, 0xa835,
++      0x28c1, 0x9cba, 0xa203, 0x300c, 0x2846, 0x8161, 0x846a, 0x8300,
++      0x1856, 0x883a, 0xa806, 0x28e2, 0x9c99, 0xa8f4, 0x0864, 0xa825,
++      0x300c, 0x28e1, 0x9c99, 0x2809, 0xa206, 0x64c0, 0x67a0, 0x6fc0,
++      0x1814, 0x883b, 0x782c, 0x786d, 0xa808, 0x282b, 0xa207, 0x64a0,
++      0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7822, 0x883e, 0xa802, 0x8576,
++      0x8677, 0x206b, 0x28c1, 0x9cba, 0x2044, 0x2103, 0x20a2, 0x2081,
++      0xa8e0, 0xa209, 0x2901, 0xa809, 0x0014, 0xa205, 0xa300, 0x1872,
++      0x879a, 0x883c, 0x1fe2, 0xc601, 0xa20a, 0x856e, 0x0704, 0x9c99,
++      0x0014, 0xa204, 0xa300, 0x3009, 0x19e2, 0xf868, 0x8176, 0x86eb,
++      0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6, 0xa8f3, 0xf881, 0xa8ec,
++      0xc801, 0x0014, 0xf8c1, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02,
++      0x1de2, 0x0014, 0x8532, 0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0,
++      0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300,
++      0x8160, 0x842a, 0xf041, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd,
++      0x0011, 0x20d5, 0x8822, 0x0016, 0x8000, 0x2847, 0x1011, 0xa8fc,
++      0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd, 0xa893, 0x283e, 0x1011,
++      0xa8fd, 0xa20b, 0x0017, 0x300c, 0xa300, 0x1de2, 0xdb81, 0x0014,
++      0x0210, 0xa801, 0x0014, 0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2,
++      0x0014, 0xa20d, 0x3806, 0x0210, 0x9cbf, 0x0704, 0x0017, 0x60ff,
++      0x300c, 0x8720, 0xa211, 0x9d63, 0x8772, 0x8837, 0x2007, 0x10d2,
++      0x78e2, 0x9d66, 0xa8fc, 0xd984, 0xf0e2, 0xf0a1, 0xa861, 0x0014,
++      0x8831, 0xd167, 0x8830, 0x8830, 0x800f, 0x9401, 0xb520, 0xc802,
++      0x8820, 0xa80d, 0x2301, 0xa80b, 0x10d2, 0x78e2, 0x9d66, 0xa8fc,
++      0xf123, 0xf142, 0xf101, 0xa845, 0x10d2, 0x70f8, 0x8832, 0x8203,
++      0x6001, 0x0014, 0x6845, 0x0214, 0xa21b, 0x9d63, 0x2001, 0xa838,
++      0x8202, 0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0xa801, 0x3027,
++      0x84a8, 0x1856, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d50, 0x6b2a,
++      0x6902, 0x1834, 0xa805, 0x1814, 0x8010, 0x8592, 0x8026, 0x84b9,
++      0x7021, 0x0014, 0xa300, 0x6946, 0xa213, 0x1462, 0xa213, 0x8000,
++      0x16e1, 0xa807, 0x6969, 0xa214, 0x61c2, 0x8002, 0x14e1, 0x8004,
++      0x16e1, 0x0101, 0x300a, 0x8827, 0x0014, 0xa217, 0x9d50, 0x0014,
++      0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6, 0x0016, 0xa212, 0x9d63,
++      0x10d2, 0x70e4, 0x0004, 0x8007, 0x9424, 0xcc1a, 0x9d66, 0xa8f8,
++      0x8827, 0x300a, 0x0013, 0x8000, 0x84a4, 0x0016, 0x2002, 0x10d2,
++      0xa8fd, 0x870e, 0xa21d, 0x0012, 0x878e, 0x85b2, 0x80f8, 0x9424,
++      0xa532, 0x84a4, 0x0016, 0xa21c, 0x1035, 0xa8b6, 0xa210, 0x3807,
++      0x300c, 0x817e, 0x872b, 0x8772, 0xa8af, 0x0000, 0xd66f
++};
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_1040.h     2003-07-19 17:06:32.000000000 -0700
+@@ -0,0 +1,3545 @@
++/* @(#)asm_1040.h 1.2 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */ 
++
++/************************************************************************
++ *                                                                    *
++ *                --- ISP1040 Initiator Firmware ---                  *
++ *                         32 LUN Support                             *
++ *                                                                    *
++ ************************************************************************/
++#ifndef       ISP_TARGET_MODE
++/*
++ *    Firmware Version 4.66.00 (14:49 Sep 05, 2000)
++ */
++static const u_int16_t isp_1040_risc_code[] = {
++      0x0078, 0x1041, 0x0000, 0x2cd0, 0x0000, 0x2043, 0x4f50, 0x5952,
++      0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
++      0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
++      0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
++      0x3130, 0x3230, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
++      0x6572, 0x7369, 0x6f6e, 0x2030, 0x342e, 0x3636, 0x2020, 0x2043,
++      0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
++      0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
++      0x2400, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048, 0x104c,
++      0x0038, 0x1052, 0x0078, 0x104e, 0x0028, 0x1052, 0x20b9, 0x1212,
++      0x0078, 0x1054, 0x20b9, 0x1313, 0x2071, 0x0010, 0x70c3, 0x0004,
++      0x20c9, 0x62ff, 0x2089, 0x1185, 0x70c7, 0x4953, 0x70cb, 0x5020,
++      0x70cf, 0x2020, 0x70d3, 0x0004, 0x3f00, 0x70d6, 0x20c1, 0x0008,
++      0x2019, 0x0000, 0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec,
++      0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54, 0x205b,
++      0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10c4, 0xa386, 0x000f,
++      0x0040, 0x108a, 0x2c6a, 0x2a5a, 0x20c1, 0x0000, 0x2019, 0x000f,
++      0x0078, 0x106a, 0x2c6a, 0x2a5a, 0x20c1, 0x0008, 0x2009, 0x7fff,
++      0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc, 0x3fff, 0x2734, 0x203b,
++      0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040, 0x10ae, 0x284a, 0x263a,
++      0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134, 0x200b, 0x5050, 0x2114,
++      0xa286, 0x5050, 0x0040, 0x10af, 0x0078, 0x118d, 0x284a, 0x263a,
++      0x98c0, 0xa188, 0x1000, 0x212c, 0x200b, 0xa5a5, 0x2114, 0xa286,
++      0xa5a5, 0x0040, 0x10c1, 0x250a, 0xa18a, 0x1000, 0x98c1, 0x0078,
++      0x10c6, 0x250a, 0x0078, 0x10c6, 0x2c6a, 0x2a5a, 0x2130, 0xa18a,
++      0x0040, 0x2128, 0xa1a2, 0x3d00, 0x8424, 0x8424, 0x8424, 0x8424,
++      0x8424, 0x8424, 0xa192, 0x6300, 0x2009, 0x0000, 0x2001, 0x002f,
++      0x1078, 0x1bc9, 0x2218, 0x2079, 0x3d00, 0x2fa0, 0x2408, 0x2011,
++      0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10e1, 0x7ee6,
++      0x8528, 0x7dda, 0x7cde, 0x7be2, 0x787b, 0x0000, 0x2031, 0x0030,
++      0x78c3, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0003,
++      0x7803, 0x0002, 0x2069, 0x3d40, 0x2001, 0x04fd, 0x2004, 0xa082,
++      0x0005, 0x0048, 0x1107, 0x0038, 0x1109, 0x0078, 0x110d, 0x00a8,
++      0x110d, 0x681b, 0x003c, 0x0078, 0x110f, 0x681b, 0x0028, 0x6807,
++      0x0007, 0x680b, 0x00fa, 0x680f, 0x0008, 0x6813, 0x0005, 0x681f,
++      0x0000, 0x6823, 0x0006, 0x6817, 0x0008, 0x6827, 0x0000, 0x2069,
++      0x3f80, 0x2011, 0x0020, 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f,
++      0x0019, 0x6803, 0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8,
++      0x0008, 0xa290, 0x0004, 0x8109, 0x00c0, 0x1125, 0x2069, 0x4000,
++      0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040,
++      0x7be4, 0xa386, 0xfeff, 0x00c0, 0x114b, 0x6817, 0x0100, 0x681f,
++      0x0064, 0x0078, 0x114f, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8,
++      0x0010, 0x0070, 0x1155, 0x0078, 0x113c, 0x8109, 0x00c0, 0x113a,
++      0x1078, 0x1f20, 0x1078, 0x3792, 0x1078, 0x19e0, 0x1078, 0x3c4a,
++      0x3200, 0xa085, 0x000d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x116f,
++      0x70c0, 0xa086, 0x0002, 0x00c0, 0x116f, 0x1078, 0x12a4, 0x1078,
++      0x11b6, 0x78c0, 0xa005, 0x00c0, 0x117b, 0x1078, 0x1bf2, 0x0068,
++      0x117f, 0x1078, 0x1e44, 0x0068, 0x117f, 0x1078, 0x1adf, 0x00e0,
++      0x116f, 0x1078, 0x3ac1, 0x0078, 0x116f, 0x118d, 0x1192, 0x20e8,
++      0x20e8, 0x380c, 0x380c, 0x20e8, 0x20e8, 0x0088, 0x118d, 0x2091,
++      0x8001, 0x007c, 0x0088, 0x1192, 0x2091, 0x8001, 0x007c, 0x0078,
++      0x1197, 0x0078, 0x1199, 0x2009, 0x0022, 0x2104, 0xa086, 0x4000,
++      0x0040, 0x11b1, 0x7008, 0x800b, 0x00c8, 0x11b1, 0x7007, 0x0002,
++      0xa08c, 0x01e0, 0x00c0, 0x11b2, 0xa084, 0x0008, 0x0040, 0x11b1,
++      0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x12a7, 0x0068, 0x1221,
++      0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1221, 0x7814,
++      0xa005, 0x00c0, 0x11c7, 0x0010, 0x1222, 0x0078, 0x1221, 0x2009,
++      0x3d68, 0x2104, 0xa005, 0x00c0, 0x1221, 0x2009, 0x3d71, 0x200b,
++      0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11ec, 0x7816, 0x2009,
++      0x3d6f, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
++      0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce,
++      0x1078, 0x19d2, 0x0078, 0x121f, 0x7814, 0xa086, 0x0018, 0x00c0,
++      0x11f3, 0x1078, 0x16cd, 0x7817, 0x0000, 0x2009, 0x3d6f, 0x2104,
++      0xa065, 0x0040, 0x120f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x1a30,
++      0x0c7f, 0x609f, 0x0000, 0x1078, 0x17b3, 0x2009, 0x0018, 0x6087,
++      0x0103, 0x1078, 0x1959, 0x00c0, 0x121b, 0x1078, 0x19d2, 0x2009,
++      0x3d6f, 0x200b, 0x0000, 0x2009, 0x3d69, 0x2104, 0x200b, 0x0000,
++      0xa005, 0x0040, 0x121f, 0x2001, 0x4005, 0x0078, 0x12a6, 0x0078,
++      0x12a4, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
++      0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1272, 0x2038,
++      0x0079, 0x1232, 0x12a4, 0x12ff, 0x12c3, 0x12ff, 0x1368, 0x1368,
++      0x12ba, 0x17cb, 0x1373, 0x12b2, 0x12c7, 0x12c9, 0x12cb, 0x12cd,
++      0x17d0, 0x12b2, 0x1385, 0x13c1, 0x16e5, 0x17c5, 0x12cf, 0x15fa,
++      0x161c, 0x163a, 0x1667, 0x15b3, 0x15c1, 0x15d5, 0x15e9, 0x1445,
++      0x12b2, 0x13f3, 0x13f9, 0x13fe, 0x1403, 0x1409, 0x140e, 0x1413,
++      0x1418, 0x141d, 0x1421, 0x1436, 0x1442, 0x12b2, 0x12b2, 0x12b2,
++      0x12b2, 0x1451, 0x145a, 0x1469, 0x148f, 0x1499, 0x14a0, 0x14e0,
++      0x14ef, 0x14fe, 0x1510, 0x1593, 0x15a3, 0x12b2, 0x12b2, 0x12b2,
++      0x12b2, 0x15a8, 0xa0bc, 0xffa0, 0x00c0, 0x12b2, 0x2038, 0xa084,
++      0x001f, 0x0079, 0x127b, 0x17e7, 0x17ea, 0x17fa, 0x189f, 0x18d8,
++      0x1914, 0x1931, 0x1886, 0x12b2, 0x12b2, 0x1935, 0x193d, 0x12b2,
++      0x12b2, 0x12b2, 0x12b2, 0x12f5, 0x135e, 0x137b, 0x13b7, 0x16db,
++      0x12b2, 0x12b2, 0x12b2, 0x12b2, 0x1943, 0x18f0, 0x18fa, 0x18fe,
++      0x190c, 0x12b2, 0x12b2, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
++      0x12a6, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
++      0x12a7, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091,
++      0x4080, 0x007c, 0x70c3, 0x4001, 0x0078, 0x12a7, 0x70c3, 0x4006,
++      0x0078, 0x12a7, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005,
++      0x53a3, 0x0078, 0x12a4, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078,
++      0x12a4, 0x0078, 0x12a4, 0x0078, 0x12a4, 0x0078, 0x12a4, 0x2091,
++      0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf,
++      0x2020, 0x70d3, 0x0004, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b,
++      0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051,
++      0x0470, 0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091,
++      0x5000, 0x2091, 0x4080, 0x0078, 0x0455, 0x1078, 0x1b4c, 0x00c0,
++      0x12b6, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1302, 0x2029,
++      0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, 0x2098,
++      0x2031, 0x0030, 0x81ff, 0x0040, 0x12a4, 0x7007, 0x0004, 0x731a,
++      0x721e, 0x7422, 0x7526, 0x2051, 0x0012, 0x2049, 0x133d, 0x2041,
++      0x12a4, 0x7003, 0x0002, 0xa786, 0x0001, 0x0040, 0x1325, 0xa786,
++      0x0050, 0x0040, 0x1325, 0x0078, 0x132b, 0x2049, 0x134a, 0x2041,
++      0x1356, 0x7003, 0x0003, 0x7017, 0x0000, 0x810b, 0x7112, 0x00c8,
++      0x1333, 0x7017, 0x0001, 0x7007, 0x0001, 0xa786, 0x0001, 0x0040,
++      0x134a, 0xa786, 0x0050, 0x0040, 0x134a, 0x700c, 0xa084, 0x007f,
++      0x2009, 0x0040, 0xa102, 0x8004, 0x094a, 0x20a8, 0x26a0, 0x53a6,
++      0x0078, 0x119b, 0x700c, 0xa084, 0x007f, 0x0040, 0x134a, 0x80ac,
++      0x0048, 0x134a, 0x2698, 0x53a5, 0x0078, 0x119b, 0x700c, 0xa084,
++      0x007f, 0x80ac, 0x2698, 0x53a5, 0x0078, 0x12a4, 0x1078, 0x1b4c,
++      0x00c0, 0x12b6, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1302,
++      0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1370, 0x200a,
++      0x72ca, 0x0078, 0x12a3, 0x70c7, 0x0004, 0x70cb, 0x0042, 0x70cf,
++      0x0000, 0x0078, 0x12a4, 0x1078, 0x1b4c, 0x00c0, 0x12b6, 0x75d8,
++      0x76dc, 0x75da, 0x76de, 0x0078, 0x1388, 0x2029, 0x0000, 0x2530,
++      0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2,
++      0xa005, 0x0040, 0x13b1, 0xa40a, 0x0040, 0x1398, 0x00c8, 0x13a2,
++      0x8001, 0x788a, 0xa084, 0xfc00, 0x0040, 0x13a6, 0x78c0, 0xa085,
++      0x0001, 0x78c2, 0x2001, 0x4005, 0x0078, 0x12a6, 0x7a92, 0x7b96,
++      0x7d9a, 0x7e9e, 0x7c8e, 0x78c0, 0xa084, 0xfffc, 0x78c2, 0x0078,
++      0x13b5, 0x78c0, 0xa085, 0x0001, 0x78c2, 0x0078, 0x12a4, 0x1078,
++      0x1b4c, 0x00c0, 0x12b6, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
++      0x13c4, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4,
++      0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x13ed, 0xa40a,
++      0x0040, 0x13d4, 0x00c8, 0x13de, 0x8001, 0x78a6, 0xa084, 0xfc00,
++      0x0040, 0x13e2, 0x78c0, 0xa085, 0x0100, 0x78c2, 0x2001, 0x4005,
++      0x0078, 0x12a6, 0x7aae, 0x7bb2, 0x7db6, 0x7eba, 0x7caa, 0x78c0,
++      0xa084, 0xfcff, 0x78c2, 0x0078, 0x13f1, 0x78c0, 0xa085, 0x0100,
++      0x78c2, 0x0078, 0x12a4, 0x2009, 0x3d5f, 0x210c, 0x7ae0, 0x0078,
++      0x12a2, 0x2009, 0x3d41, 0x210c, 0x0078, 0x12a3, 0x2009, 0x3d42,
++      0x210c, 0x0078, 0x12a3, 0x2061, 0x3d40, 0x610c, 0x6210, 0x0078,
++      0x12a2, 0x2009, 0x3d45, 0x210c, 0x0078, 0x12a3, 0x2009, 0x3d46,
++      0x210c, 0x0078, 0x12a3, 0x2009, 0x3d47, 0x210c, 0x0078, 0x12a3,
++      0x2009, 0x3d48, 0x210c, 0x0078, 0x12a3, 0x7908, 0x7a0c, 0x0078,
++      0x12a2, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xa0e8, 0x3f80, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x1433,
++      0x6b08, 0x0078, 0x1434, 0x6b0c, 0x0078, 0x12a1, 0x77c4, 0x1078,
++      0x19f0, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++      0x0078, 0x12a1, 0x794c, 0x0078, 0x12a3, 0x77c4, 0x1078, 0x19f0,
++      0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078,
++      0x12a1, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x129c, 0x1078, 0x1fb7,
++      0x0078, 0x12a1, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x129c, 0x2011,
++      0x3d41, 0x2204, 0x007e, 0x2112, 0x1078, 0x1f70, 0x017f, 0x0078,
++      0x12a3, 0x71c4, 0x2011, 0x1487, 0x20a9, 0x0008, 0x2204, 0xa106,
++      0x0040, 0x1479, 0x8210, 0x0070, 0x1477, 0x0078, 0x146e, 0x0078,
++      0x129c, 0xa292, 0x1487, 0x027e, 0x2011, 0x3d42, 0x2204, 0x2112,
++      0x017f, 0x007e, 0x1078, 0x1f7c, 0x017f, 0x0078, 0x12a3, 0x03e8,
++      0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061,
++      0x3d40, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078,
++      0x12a2, 0x2061, 0x3d40, 0x6114, 0x70c4, 0x6016, 0x0078, 0x12a3,
++      0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040,
++      0x14b9, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
++      0x14b9, 0x2011, 0x0006, 0x2019, 0x1313, 0xa186, 0x003c, 0x00c0,
++      0x129c, 0x2061, 0x3d40, 0x6018, 0x007e, 0x611a, 0x7800, 0xa084,
++      0x0001, 0x00c0, 0x14d6, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
++      0x0048, 0x14ce, 0x0038, 0x14d2, 0x0078, 0x14d6, 0x0028, 0x14d2,
++      0x0078, 0x14d6, 0x2019, 0x1313, 0x0078, 0x14d8, 0x2019, 0x1212,
++      0x23b8, 0x1078, 0x1f8d, 0x1078, 0x3c4a, 0x017f, 0x0078, 0x12a3,
++      0x71c4, 0xa184, 0xffcf, 0x00c0, 0x129c, 0x2011, 0x3d47, 0x2204,
++      0x2112, 0x007e, 0x1078, 0x1faf, 0x017f, 0x0078, 0x12a3, 0x71c4,
++      0xa182, 0x0010, 0x00c8, 0x129c, 0x2011, 0x3d48, 0x2204, 0x007e,
++      0x2112, 0x1078, 0x1f9e, 0x017f, 0x0078, 0x12a3, 0x71c4, 0x72c8,
++      0xa184, 0xfffd, 0x00c0, 0x129b, 0xa284, 0xfffd, 0x00c0, 0x129b,
++      0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x12a2,
++      0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
++      0x3f80, 0x2019, 0x0000, 0x72c8, 0xa284, 0x0080, 0x0040, 0x1526,
++      0x6c14, 0x84ff, 0x00c0, 0x1526, 0x6817, 0x0040, 0xa284, 0x0040,
++      0x0040, 0x1530, 0x6c10, 0x84ff, 0x00c0, 0x1530, 0x6813, 0x0001,
++      0x6800, 0x007e, 0xa226, 0x0040, 0x155c, 0xa284, 0x0001, 0x0040,
++      0x153e, 0x2220, 0xa39d, 0x0002, 0xa294, 0xfffe, 0x6a02, 0xa484,
++      0x2000, 0x0040, 0x1545, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040,
++      0x154b, 0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x155c, 0x810f,
++      0xa284, 0x4000, 0x0040, 0x1558, 0x1078, 0x1fd1, 0x0078, 0x155c,
++      0x1078, 0x1fc3, 0x0078, 0x155c, 0x72cc, 0x6808, 0xa206, 0x0040,
++      0x158b, 0xa2a4, 0x00ff, 0x2061, 0x3d40, 0x6118, 0xa186, 0x0028,
++      0x0040, 0x1572, 0xa186, 0x0032, 0x0040, 0x1578, 0xa186, 0x003c,
++      0x0040, 0x157e, 0xa482, 0x0064, 0x0048, 0x1588, 0x0078, 0x1582,
++      0xa482, 0x0050, 0x0048, 0x1588, 0x0078, 0x1582, 0xa482, 0x0043,
++      0x0048, 0x1588, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x129d,
++      0x6a0a, 0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c,
++      0x71c4, 0x0078, 0x12a1, 0x77c4, 0x1078, 0x19f0, 0x2091, 0x8000,
++      0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e,
++      0x2708, 0x0078, 0x12a1, 0x70c4, 0x794c, 0x784e, 0x0078, 0x12a3,
++      0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x129c, 0x1078,
++      0x1fdf, 0x0078, 0x12a1, 0x77c4, 0x1078, 0x19f0, 0x2091, 0x8000,
++      0x6a08, 0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078,
++      0x12a2, 0x77c4, 0x1078, 0x19f0, 0x2091, 0x8000, 0x6a08, 0xa294,
++      0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x15d0, 0x1078, 0x1f05,
++      0x2091, 0x8001, 0x2708, 0x0078, 0x12a2, 0x77c4, 0x1078, 0x19f0,
++      0x2091, 0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005,
++      0x0040, 0x15e4, 0x1078, 0x1f05, 0x2091, 0x8001, 0x2708, 0x0078,
++      0x12a2, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020,
++      0x2091, 0x8000, 0x1078, 0x19fd, 0x2091, 0x8001, 0x2708, 0x6a08,
++      0x0078, 0x12a2, 0x77c4, 0x73c8, 0x72cc, 0x77c6, 0x73ca, 0x72ce,
++      0x1078, 0x1a78, 0x00c0, 0x1618, 0x6818, 0xa005, 0x0040, 0x1612,
++      0x2708, 0x1078, 0x1fef, 0x00c0, 0x1612, 0x7817, 0x0015, 0x2091,
++      0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x12a6,
++      0x2091, 0x8001, 0x0078, 0x12a4, 0x77c4, 0x77c6, 0x2041, 0x0021,
++      0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, 0x19fd,
++      0x2061, 0x3d40, 0x60a3, 0x0003, 0x67b6, 0x60c7, 0x000f, 0x60a7,
++      0x0000, 0x7817, 0x0016, 0x2091, 0x8000, 0x1078, 0x1f05, 0x2091,
++      0x8001, 0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00,
++      0x2091, 0x8000, 0x2061, 0x3d40, 0x60a3, 0x0002, 0x60a7, 0x0000,
++      0x67b6, 0x60c7, 0x000f, 0x7817, 0x0017, 0x2091, 0x8000, 0x1078,
++      0x1f05, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
++      0x0010, 0x2091, 0x8000, 0x1078, 0x19fd, 0x70c8, 0x6836, 0x8738,
++      0xa784, 0x001f, 0x00c0, 0x165b, 0x2091, 0x8001, 0x007c, 0x78c0,
++      0xa084, 0x0003, 0x00c0, 0x168b, 0x2039, 0x0000, 0x2041, 0x0021,
++      0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x19f0, 0x2091, 0x8000,
++      0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x001f,
++      0x00c0, 0x1674, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784,
++      0x0f00, 0x00c0, 0x1674, 0x2091, 0x8000, 0x2069, 0x0100, 0x6830,
++      0xa084, 0x0040, 0x0040, 0x16b4, 0x684b, 0x0004, 0x20a9, 0x0014,
++      0x6848, 0xa084, 0x0004, 0x0040, 0x16a1, 0x0070, 0x16a1, 0x0078,
++      0x1698, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001,
++      0x0040, 0x16ae, 0x0070, 0x16ae, 0x0078, 0x16a5, 0x20a9, 0x00fa,
++      0x0070, 0x16b4, 0x0078, 0x16b0, 0x2079, 0x3d00, 0x7817, 0x0018,
++      0x2061, 0x3d40, 0x60a3, 0x0001, 0x60a7, 0x0000, 0x60c7, 0x000f,
++      0x78c0, 0xa085, 0x0002, 0x78c2, 0x6808, 0xa084, 0xfffd, 0x680a,
++      0x681b, 0x0047, 0x2091, 0x8001, 0x007c, 0x78c0, 0xa084, 0xfffd,
++      0x78c2, 0xa084, 0x0001, 0x00c0, 0x16d7, 0x1078, 0x1ac2, 0x71c4,
++      0x71c6, 0x794a, 0x007c, 0x1078, 0x1b4c, 0x00c0, 0x12b6, 0x75d8,
++      0x74dc, 0x75da, 0x74de, 0x0078, 0x16e8, 0x2029, 0x0000, 0x2520,
++      0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x3d00,
++      0x1078, 0x19c9, 0x0040, 0x17af, 0x20a9, 0x0005, 0x20a1, 0x3d16,
++      0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x1078,
++      0x1993, 0x0040, 0x1707, 0x1078, 0x19d2, 0x0078, 0x17af, 0x6004,
++      0xa08c, 0x00ff, 0xa18e, 0x0009, 0x00c0, 0x1712, 0x007e, 0x1078,
++      0x1e27, 0x007f, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x177d,
++      0x0c7e, 0x2c68, 0x1078, 0x19c9, 0x0040, 0x174c, 0x2c00, 0x689e,
++      0x8109, 0x00c0, 0x1719, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7218,
++      0x731c, 0x7420, 0x7524, 0x2c68, 0x689c, 0xa065, 0x0040, 0x177c,
++      0x2009, 0x0040, 0x1078, 0x1993, 0x00c0, 0x1765, 0x6004, 0xa084,
++      0x00ff, 0xa086, 0x0002, 0x00c0, 0x174c, 0x6004, 0xa084, 0x00ff,
++      0xa086, 0x000a, 0x00c0, 0x1748, 0x017e, 0x1078, 0x1e23, 0x017f,
++      0x2d00, 0x6002, 0x0078, 0x1727, 0x0c7f, 0x0c7e, 0x609c, 0x2060,
++      0x1078, 0x1a30, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x17b3, 0x2009,
++      0x0018, 0x6008, 0xa085, 0x0200, 0x600a, 0x6004, 0x6086, 0x1078,
++      0x1959, 0x1078, 0x19d2, 0x0078, 0x17af, 0x0c7f, 0x0c7e, 0x609c,
++      0x2060, 0x1078, 0x1a30, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x17b3,
++      0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003, 0x1078, 0x1959,
++      0x1078, 0x19d2, 0x0078, 0x17af, 0x0c7f, 0x74c4, 0x73c8, 0x72cc,
++      0x6014, 0x2091, 0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x3d40,
++      0x70a3, 0x0005, 0x70a7, 0x0000, 0x73aa, 0x72ae, 0x74b2, 0x70b6,
++      0x70bb, 0x0000, 0x2c00, 0x70be, 0x70c3, 0x0000, 0xa02e, 0x2530,
++      0x611c, 0xa184, 0x0060, 0x0040, 0x179f, 0x1078, 0x3736, 0x0e7f,
++      0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000,
++      0x2091, 0x8000, 0x1078, 0x1f05, 0x2091, 0x8001, 0x007c, 0x70c3,
++      0x4005, 0x0078, 0x12a7, 0x20a9, 0x0005, 0x2099, 0x3d16, 0x2091,
++      0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000,
++      0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000,
++      0x7906, 0x0078, 0x12a4, 0x71c4, 0x71c6, 0x2168, 0x0078, 0x17d2,
++      0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109,
++      0x00c0, 0x17d4, 0xa285, 0x0000, 0x00c0, 0x17e2, 0x70c3, 0x4000,
++      0x0078, 0x17e4, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x12a7, 0x79d8,
++      0x0078, 0x12a3, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9,
++      0x0004, 0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3,
++      0x0078, 0x12a4, 0x70c4, 0x2068, 0x2079, 0x3d00, 0x1078, 0x19c9,
++      0x00c0, 0x1806, 0x70c3, 0x4005, 0x0078, 0x12a7, 0x6007, 0x0001,
++      0x600b, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c,
++      0x000f, 0xa284, 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
++      0x6016, 0xa284, 0x0800, 0x0040, 0x1821, 0x601b, 0x000a, 0x0078,
++      0x1827, 0xa284, 0x1000, 0x0040, 0x1827, 0x601b, 0x000c, 0xa284,
++      0x0300, 0x0040, 0x1830, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004,
++      0xa085, 0x0001, 0x601e, 0x6023, 0x0000, 0x6027, 0x0000, 0xa284,
++      0x0400, 0x0040, 0x183d, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80,
++      0x000b, 0x20a0, 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300,
++      0x00c0, 0x1852, 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a,
++      0x0078, 0x185c, 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e,
++      0x6d0c, 0x6552, 0x6596, 0x669a, 0x6014, 0x2091, 0x8000, 0x7817,
++      0x0042, 0x2c08, 0x2061, 0x3d40, 0x60a3, 0x0005, 0x60a7, 0x0000,
++      0x60ab, 0x0000, 0x60af, 0x0000, 0x60b3, 0x0000, 0x60b6, 0x61be,
++      0xa284, 0x0400, 0x60c2, 0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020,
++      0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091,
++      0x8000, 0x1078, 0x1f05, 0x2091, 0x8001, 0x007c, 0x70c4, 0x2068,
++      0x2079, 0x3d00, 0x1078, 0x19c9, 0x0040, 0x189b, 0x6007, 0x0001,
++      0x600b, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x70c8, 0x6016,
++      0x6a10, 0x0078, 0x1819, 0x70c3, 0x4005, 0x0078, 0x12a7, 0x78ec,
++      0xa005, 0x0040, 0x12b2, 0x2091, 0x8000, 0x70c4, 0x800a, 0x2011,
++      0x0010, 0x810c, 0x0048, 0x18b1, 0x3a00, 0xa084, 0xfff7, 0x0078,
++      0x18b4, 0x3a00, 0xa085, 0x0008, 0x20d0, 0x0005, 0x0005, 0xa084,
++      0xfffb, 0x20d0, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
++      0x0005, 0x0005, 0xa085, 0x0004, 0x20d0, 0x0005, 0x0005, 0x0005,
++      0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x8211, 0x00c0, 0x18a9,
++      0x3a00, 0xa085, 0x0008, 0x20d0, 0x2091, 0x8001, 0x0078, 0x12a4,
++      0x2011, 0x04fd, 0x2204, 0xa082, 0x0004, 0x0048, 0x18ec, 0x78ef,
++      0x0001, 0x2009, 0xff01, 0x200a, 0x2001, 0x000c, 0x20d8, 0x2001,
++      0x000c, 0x20d0, 0x0078, 0x12a4, 0x2001, 0x4005, 0x0078, 0x12a6,
++      0x7978, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x129c, 0x797a,
++      0x0078, 0x12a4, 0x7978, 0x71c6, 0x0078, 0x12a4, 0x796c, 0x71c6,
++      0x71c4, 0x796e, 0x7970, 0x71ca, 0x71c8, 0x7972, 0x7974, 0x71ce,
++      0x71cc, 0x7976, 0x0078, 0x12a4, 0x796c, 0x71c6, 0x7970, 0x71ca,
++      0x7974, 0x71ce, 0x0078, 0x12a4, 0x7900, 0x71c6, 0x71c4, 0x7902,
++      0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048, 0x1923, 0x0038,
++      0x1925, 0x0078, 0x192f, 0x00a8, 0x192f, 0xa18c, 0x0001, 0x00c0,
++      0x192d, 0x20b9, 0x1313, 0x0078, 0x192f, 0x20b9, 0x1212, 0x0078,
++      0x12a4, 0x7900, 0x71c6, 0x0078, 0x12a4, 0x2009, 0x3d79, 0x2104,
++      0x70c6, 0x70c4, 0x200a, 0x0078, 0x12a4, 0x2009, 0x3d79, 0x2104,
++      0x70c6, 0x0078, 0x12a4, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003,
++      0x8003, 0x8003, 0xa0e8, 0x3f80, 0x6a14, 0xd2b4, 0x0040, 0x1954,
++      0x2011, 0x0001, 0x0078, 0x1956, 0x2011, 0x0000, 0x6b0c, 0x0078,
++      0x12a1, 0x700c, 0xa084, 0x00ff, 0x0040, 0x1965, 0x7007, 0x0004,
++      0x7004, 0xa084, 0x0004, 0x00c0, 0x1960, 0x7017, 0x0000, 0x7112,
++      0x721a, 0x731e, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c,
++      0x81a9, 0x8098, 0x20a1, 0x0030, 0x6084, 0x20a2, 0x53a6, 0x780c,
++      0xa085, 0x0000, 0x7002, 0x7007, 0x0001, 0x2009, 0x0022, 0x2104,
++      0xa084, 0x4000, 0x00c0, 0x197d, 0x7108, 0x8103, 0x00c8, 0x197d,
++      0x7014, 0xa005, 0x0040, 0x197d, 0x7007, 0x0002, 0xa184, 0x01e0,
++      0x7003, 0x0000, 0x007c, 0x700c, 0xa084, 0x00ff, 0x0040, 0x199f,
++      0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x199a, 0x7017,
++      0x0000, 0x7112, 0x721a, 0x7422, 0x7526, 0x731e, 0x2099, 0x0030,
++      0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
++      0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x19b0, 0x7008,
++      0x800b, 0x00c8, 0x19b0, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0,
++      0x19c6, 0xac80, 0x0001, 0x20a0, 0x53a5, 0xa006, 0x7003, 0x0000,
++      0x007c, 0x7850, 0xa065, 0x0040, 0x19d1, 0x2c04, 0x7852, 0x2063,
++      0x0000, 0x007c, 0x0f7e, 0x2079, 0x3d00, 0x7850, 0x2062, 0x2c00,
++      0xa005, 0x00c0, 0x19dd, 0x1078, 0x20c8, 0x7852, 0x0f7f, 0x007c,
++      0x2011, 0x6300, 0x7a52, 0x7be0, 0x8319, 0x0040, 0x19ed, 0xa280,
++      0x002f, 0x2012, 0x2010, 0x0078, 0x19e4, 0x2013, 0x0000, 0x007c,
++      0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003,
++      0x8003, 0xa105, 0xa0e8, 0x4000, 0x007c, 0x1078, 0x19f0, 0x2900,
++      0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, 0x690a,
++      0x2009, 0x3d4f, 0x210c, 0x6804, 0xa005, 0x0040, 0x1a1a, 0xa116,
++      0x00c0, 0x1a1a, 0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000,
++      0x0078, 0x1a1d, 0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040,
++      0x1a2c, 0x6000, 0x6806, 0x1078, 0x1a3d, 0x1078, 0x1b6d, 0x6810,
++      0x8001, 0x6812, 0x00c0, 0x1a1d, 0x017f, 0x6902, 0x6906, 0x007c,
++      0xa065, 0x0040, 0x1a3c, 0x609c, 0x609f, 0x0000, 0x2008, 0x1078,
++      0x19d2, 0x2100, 0x0078, 0x1a30, 0x007c, 0x6007, 0x0103, 0x608f,
++      0x0000, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000,
++      0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0x2071,
++      0x3d40, 0x7040, 0xa08c, 0x0200, 0x00c0, 0x1a5c, 0xa088, 0x3d80,
++      0x2d0a, 0x8000, 0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
++      0x3d40, 0x2009, 0x3d80, 0x7240, 0x8221, 0x8211, 0x0048, 0x1a76,
++      0x2104, 0x8108, 0xad06, 0x00c0, 0x1a65, 0x8119, 0x211e, 0x8108,
++      0x8318, 0x8211, 0x00c8, 0x1a6e, 0x7442, 0xa006, 0x0e7f, 0x007c,
++      0x1078, 0x19f0, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040,
++      0x1ac1, 0x0078, 0x1a89, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040,
++      0x1ac1, 0x6010, 0xa306, 0x00c0, 0x1a83, 0x600c, 0xa206, 0x00c0,
++      0x1a83, 0x2c28, 0x2001, 0x3d4f, 0x2004, 0xac06, 0x00c0, 0x1a9a,
++      0x0078, 0x1abe, 0x6804, 0xac06, 0x00c0, 0x1aa8, 0x6000, 0x2060,
++      0x6806, 0xa005, 0x00c0, 0x1aa8, 0x6803, 0x0000, 0x0078, 0x1ab2,
++      0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1ab2,
++      0x2c00, 0x6802, 0x2560, 0x1078, 0x1a3d, 0x601b, 0x0005, 0x6023,
++      0x0020, 0x1078, 0x1b6d, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff,
++      0xa005, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004,
++      0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x19fd, 0x8738, 0xa784,
++      0x001f, 0x00c0, 0x1acc, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f,
++      0xa784, 0x0f00, 0x00c0, 0x1acc, 0x2091, 0x8001, 0x007c, 0x2061,
++      0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1af0, 0x2091, 0x8000,
++      0x78d4, 0x78d7, 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0, 0x1af1,
++      0x007c, 0xa08c, 0xfff0, 0x0040, 0x1af7, 0x1078, 0x20c8, 0x0079,
++      0x1af9, 0x1b09, 0x1b0c, 0x1b12, 0x1b16, 0x1b0a, 0x1b1a, 0x1b0a,
++      0x1b20, 0x1b24, 0x1b28, 0x1b5b, 0x1b5f, 0x1b0a, 0x1b0a, 0x1b0a,
++      0x1b0a, 0x007c, 0x1078, 0x20c8, 0x1078, 0x1ac2, 0x2001, 0x8001,
++      0x0078, 0x1b65, 0x2001, 0x8003, 0x0078, 0x1b65, 0x2001, 0x8004,
++      0x0078, 0x1b65, 0x1078, 0x1ac2, 0x2001, 0x8006, 0x0078, 0x1b65,
++      0x2001, 0x8008, 0x0078, 0x1b65, 0x2001, 0x8009, 0x0078, 0x1b65,
++      0x2091, 0x8000, 0x2069, 0x3d40, 0x6800, 0xa086, 0x0000, 0x0040,
++      0x1b36, 0x2091, 0x8001, 0x78d7, 0x0009, 0x007c, 0x68b4, 0xa0bc,
++      0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078,
++      0x19fd, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1b3f, 0x2091, 0x8001,
++      0x2001, 0x800a, 0x0078, 0x1b65, 0x2001, 0x04fd, 0x2004, 0xa082,
++      0x0004, 0x00c8, 0x1b55, 0x0078, 0x1b58, 0xa006, 0x0078, 0x1b5a,
++      0xa085, 0x0001, 0x007c, 0x2001, 0x800c, 0x0078, 0x1b65, 0x1078,
++      0x1ac2, 0x2001, 0x800d, 0x0078, 0x1b65, 0x70c2, 0x2061, 0x0000,
++      0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0x6004, 0x6086, 0x2c08,
++      0x2063, 0x0000, 0x787c, 0x8000, 0x787e, 0x7880, 0xa005, 0x7982,
++      0x0040, 0x1b7d, 0x2c02, 0x0078, 0x1b7e, 0x7986, 0x007c, 0x0c7e,
++      0x2061, 0x3d00, 0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, 0x607c,
++      0x8000, 0x607e, 0x6080, 0xa005, 0x6182, 0x0040, 0x1b92, 0x2d02,
++      0x0078, 0x1b93, 0x6186, 0x0c7f, 0x007c, 0x1078, 0x1ba6, 0x0040,
++      0x1ba5, 0x0c7e, 0x609c, 0xa065, 0x0040, 0x1ba0, 0x1078, 0x1a30,
++      0x0c7f, 0x609f, 0x0000, 0x1078, 0x19d2, 0x007c, 0x7884, 0xa065,
++      0x0040, 0x1bb8, 0x2091, 0x8000, 0x787c, 0x8001, 0x787e, 0x2c04,
++      0x7886, 0xa005, 0x00c0, 0x1bb6, 0x7882, 0x8000, 0x2091, 0x8001,
++      0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8,
++      0x1bc2, 0xa200, 0x0070, 0x1bc6, 0x0078, 0x1bbd, 0x8086, 0x818e,
++      0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x1bec, 0xa11a,
++      0x00c8, 0x1bec, 0x8213, 0x818d, 0x0048, 0x1bdd, 0xa11a, 0x00c8,
++      0x1bde, 0x0070, 0x1be4, 0x0078, 0x1bd2, 0xa11a, 0x2308, 0x8210,
++      0x0070, 0x1be4, 0x0078, 0x1bd2, 0x007e, 0x3200, 0xa084, 0xf7ff,
++      0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800,
++      0x0078, 0x1be8, 0x798c, 0x70d0, 0x007e, 0x007f, 0xa106, 0x0040,
++      0x1c6e, 0x7800, 0xa084, 0x0002, 0x0040, 0x1c05, 0x2011, 0x04fd,
++      0x2204, 0xa082, 0x0005, 0x00c8, 0x1c18, 0x2091, 0x8000, 0x2071,
++      0x0020, 0x7004, 0xa005, 0x00c0, 0x1c6e, 0x7008, 0x7208, 0xa206,
++      0x00c0, 0x1c6e, 0xa286, 0x0008, 0x00c0, 0x1c6e, 0x2071, 0x0010,
++      0x1078, 0x19c9, 0x0040, 0x1c6e, 0x7a94, 0x7b90, 0x7c9c, 0x7d98,
++      0xa184, 0xff00, 0x0040, 0x1c3c, 0x2031, 0x0000, 0x810b, 0x86b5,
++      0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5,
++      0x810b, 0x86b5, 0x2100, 0xa210, 0x2600, 0xa319, 0xa4a1, 0x0000,
++      0xa5a9, 0x0000, 0x0078, 0x1c46, 0x8107, 0x8004, 0x8004, 0xa210,
++      0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x2009, 0x0040,
++      0x1078, 0x1993, 0x2091, 0x8001, 0x0040, 0x1c65, 0x1078, 0x19d2,
++      0x78a0, 0x8000, 0x78a2, 0xa086, 0x0002, 0x00c0, 0x1c6e, 0x2091,
++      0x8000, 0x78d7, 0x0002, 0x78a3, 0x0000, 0x78c0, 0xa085, 0x0003,
++      0x78c2, 0x2091, 0x8001, 0x0078, 0x1c6e, 0x78a3, 0x0000, 0x1078,
++      0x1e0d, 0x6004, 0xa084, 0x000f, 0x0079, 0x1c73, 0x2071, 0x0010,
++      0x2091, 0x8001, 0x007c, 0x1c83, 0x1ca5, 0x1ccb, 0x1c83, 0x1cdd,
++      0x1c92, 0x1c83, 0x1c83, 0x1c83, 0x1c9f, 0x1cc5, 0x1c83, 0x1c83,
++      0x1c83, 0x1c83, 0x1c83, 0x2039, 0x0400, 0x78d0, 0xa705, 0x78d2,
++      0x6008, 0xa705, 0x600a, 0x1078, 0x1d28, 0x609c, 0x78ce, 0x1078,
++      0x1df5, 0x007c, 0x78d0, 0xa084, 0x0100, 0x0040, 0x1c99, 0x0078,
++      0x1c83, 0x601c, 0xa085, 0x0080, 0x601e, 0x0078, 0x1cac, 0x1078,
++      0x1b4c, 0x00c0, 0x1c83, 0x1078, 0x1e27, 0x78d0, 0xa084, 0x0100,
++      0x0040, 0x1cac, 0x0078, 0x1c83, 0x78d3, 0x0000, 0x6004, 0x8007,
++      0xa084, 0x00ff, 0x78c6, 0x8001, 0x609f, 0x0000, 0x0040, 0x1cc2,
++      0x1078, 0x1d28, 0x0040, 0x1cc2, 0x78d0, 0xa085, 0x0100, 0x78d2,
++      0x0078, 0x1cc4, 0x1078, 0x1d4c, 0x007c, 0x1078, 0x1b4c, 0x00c0,
++      0x1c83, 0x1078, 0x1e23, 0x78d0, 0xa08c, 0x0e00, 0x00c0, 0x1cd4,
++      0xa084, 0x0100, 0x00c0, 0x1cd6, 0x0078, 0x1c83, 0x1078, 0x1d28,
++      0x00c0, 0x1cdc, 0x1078, 0x1d4c, 0x007c, 0x78d0, 0xa084, 0x0100,
++      0x0040, 0x1ce4, 0x0078, 0x1c83, 0x78d3, 0x0000, 0x6714, 0x2011,
++      0x0001, 0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040,
++      0x1d07, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e,
++      0x0001, 0x0040, 0x1d07, 0x2039, 0x0000, 0x2011, 0x0002, 0x20a9,
++      0x0100, 0xa08e, 0x0002, 0x0040, 0x1d07, 0x0078, 0x1d25, 0x1078,
++      0x19f0, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
++      0x6808, 0xa084, 0xffde, 0x680a, 0x2d00, 0xa080, 0x0010, 0x2068,
++      0x2091, 0x8001, 0x0070, 0x1d1e, 0x0078, 0x1d0a, 0x8211, 0x0040,
++      0x1d25, 0x20a9, 0x0100, 0x0078, 0x1d0a, 0x1078, 0x19d2, 0x007c,
++      0x78c8, 0xa06d, 0x00c0, 0x1d33, 0x2c00, 0x78ca, 0x78ce, 0x609f,
++      0x0000, 0x0078, 0x1d3f, 0x2c00, 0x689e, 0x609f, 0x0000, 0x78ca,
++      0x2d00, 0x6002, 0x78cc, 0xad06, 0x00c0, 0x1d3f, 0x6002, 0x78c4,
++      0x8001, 0x78c6, 0x00c0, 0x1d4b, 0x78d0, 0xa084, 0x0000, 0x78d2,
++      0x78cc, 0x2060, 0xa006, 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2,
++      0xa184, 0xe1ff, 0x601e, 0xa184, 0x0060, 0x0040, 0x1d5b, 0x0e7e,
++      0x1078, 0x3736, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af,
++      0x0000, 0x60b3, 0x0000, 0x6714, 0x1078, 0x19f0, 0x2091, 0x8000,
++      0x60a0, 0xa084, 0x8000, 0x00c0, 0x1d82, 0x6808, 0xa084, 0x0001,
++      0x0040, 0x1d82, 0x2091, 0x8001, 0x1078, 0x1a3d, 0x2091, 0x8000,
++      0x1078, 0x1b6d, 0x2091, 0x8001, 0x78cb, 0x0000, 0x78cf, 0x0000,
++      0x0078, 0x1df4, 0x6024, 0xa096, 0x0001, 0x00c0, 0x1d89, 0x8000,
++      0x6026, 0x6a10, 0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x1d98,
++      0x0040, 0x1d98, 0x2039, 0x0200, 0x1078, 0x1df5, 0x0078, 0x1df4,
++      0x2c08, 0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x0040, 0x1dc5,
++      0x6800, 0xa065, 0x0040, 0x1dca, 0x6a04, 0x0e7e, 0x2071, 0x3d40,
++      0x7000, 0xa084, 0x0001, 0x0040, 0x1dbf, 0x703c, 0xa206, 0x00c0,
++      0x1dbf, 0x6b04, 0x231c, 0x2160, 0x6302, 0x2300, 0xa005, 0x00c0,
++      0x1dba, 0x6902, 0x2260, 0x6102, 0x0e7f, 0x0078, 0x1dd1, 0x2160,
++      0x6202, 0x6906, 0x0e7f, 0x0078, 0x1dd1, 0x6800, 0xa065, 0x0040,
++      0x1dca, 0x6102, 0x6902, 0x00c0, 0x1dce, 0x6906, 0x2160, 0x6003,
++      0x0000, 0x2160, 0x60a0, 0xa084, 0x8000, 0x0040, 0x1ddb, 0x6808,
++      0xa084, 0xfffc, 0x680a, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001,
++      0x6808, 0xa08c, 0x0040, 0x0040, 0x1dea, 0xa086, 0x0040, 0x680a,
++      0x1078, 0x1a4e, 0x2091, 0x8000, 0x1078, 0x1f05, 0x2091, 0x8001,
++      0x78cf, 0x0000, 0x78cb, 0x0000, 0x007c, 0x6008, 0xa705, 0x600a,
++      0x2091, 0x8000, 0x1078, 0x1b6d, 0x2091, 0x8001, 0x78cc, 0xa065,
++      0x0040, 0x1e08, 0x609c, 0x78ce, 0x609f, 0x0000, 0x0078, 0x1df8,
++      0x78cb, 0x0000, 0x78cf, 0x0000, 0x007c, 0x7988, 0x788c, 0x8000,
++      0xa10a, 0x00c8, 0x1e14, 0xa006, 0x788e, 0x70d2, 0x7804, 0xa005,
++      0x0040, 0x1e22, 0x8001, 0x7806, 0x00c0, 0x1e22, 0x0068, 0x1e22,
++      0x2091, 0x4080, 0x007c, 0x2039, 0x1e3b, 0x0078, 0x1e29, 0x2039,
++      0x1e41, 0x2704, 0xa005, 0x0040, 0x1e3a, 0xac00, 0x2068, 0x6b08,
++      0x6c0c, 0x6910, 0x6a14, 0x690a, 0x6a0e, 0x6b12, 0x6c16, 0x8738,
++      0x0078, 0x1e29, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b,
++      0x0000, 0x0015, 0x001b, 0x0000, 0x0068, 0x1e8a, 0x2029, 0x0000,
++      0x7884, 0xa065, 0x0040, 0x1e85, 0x2009, 0x3d79, 0x2104, 0xa084,
++      0x0001, 0x0040, 0x1e78, 0x6084, 0xa086, 0x0103, 0x00c0, 0x1e78,
++      0x6018, 0xa005, 0x00c0, 0x1e78, 0x6014, 0xa005, 0x00c0, 0x1e78,
++      0x0d7e, 0x2069, 0x0000, 0x6818, 0xa084, 0x0001, 0x00c0, 0x1e77,
++      0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001,
++      0x2091, 0x4080, 0x0d7f, 0x1078, 0x1b95, 0x0078, 0x1e85, 0x0d7f,
++      0x1078, 0x1e8b, 0x0040, 0x1e85, 0x057e, 0x1078, 0x1e9c, 0x057f,
++      0x00c0, 0x1e85, 0x8528, 0x0078, 0x1e48, 0x85ff, 0x0040, 0x1e8a,
++      0x2091, 0x4080, 0x007c, 0x7ba4, 0x79a8, 0x70d4, 0x007e, 0x007f,
++      0xa102, 0x00c0, 0x1e96, 0x2300, 0xa005, 0x007c, 0x0048, 0x1e9a,
++      0xa302, 0x007c, 0x8002, 0x007c, 0x7800, 0xa084, 0x0002, 0x0040,
++      0x1ea8, 0x2011, 0x04fd, 0x2204, 0xa082, 0x0005, 0x00c8, 0x1ebb,
++      0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1eec,
++      0x7008, 0x7208, 0xa206, 0x00c0, 0x1eec, 0xa286, 0x0008, 0x00c0,
++      0x1eec, 0x2071, 0x0010, 0x1078, 0x1ef1, 0x2009, 0x0018, 0x6028,
++      0xa005, 0x0040, 0x1ec5, 0x2009, 0x0040, 0x1078, 0x1959, 0x0040,
++      0x1ede, 0x78bc, 0x8000, 0x78be, 0xa086, 0x0002, 0x00c0, 0x1eec,
++      0x2091, 0x8000, 0x78d7, 0x0003, 0x78bf, 0x0000, 0x78c0, 0xa085,
++      0x0300, 0x78c2, 0x2091, 0x8001, 0x0078, 0x1eec, 0x78bf, 0x0000,
++      0x1078, 0x1b95, 0x79a4, 0x78a8, 0x8000, 0xa10a, 0x00c8, 0x1ee9,
++      0xa006, 0x78aa, 0x70d6, 0xa006, 0x2071, 0x0010, 0x2091, 0x8001,
++      0x007c, 0x8107, 0x8004, 0x8004, 0x7ab0, 0x7bac, 0x7cb8, 0x7db4,
++      0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c,
++      0x2009, 0x3d68, 0x2091, 0x8000, 0x200a, 0x0f7e, 0x2079, 0x0100,
++      0x2009, 0x3d40, 0x2104, 0xa086, 0x0000, 0x00c0, 0x1f1e, 0x2009,
++      0x3d12, 0x2104, 0xa005, 0x00c0, 0x1f1e, 0x7830, 0xa084, 0x00c0,
++      0x00c0, 0x1f1e, 0x0018, 0x1f1e, 0x781b, 0x0045, 0x0f7f, 0x007c,
++      0x127e, 0x2091, 0x2300, 0x2071, 0x3d40, 0x2079, 0x0100, 0x784b,
++      0x000f, 0x2019, 0x35fc, 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040,
++      0x1f3a, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318,
++      0x0078, 0x1f2d, 0x789b, 0x0020, 0x20a9, 0x0010, 0x78af, 0x0000,
++      0x78af, 0x0020, 0x0070, 0x1f46, 0x0078, 0x1f3e, 0x7003, 0x0000,
++      0x1078, 0x205c, 0x7004, 0xa084, 0x000f, 0x017e, 0x2009, 0x04fd,
++      0x210c, 0xa18a, 0x0005, 0x0048, 0x1f5d, 0x0038, 0x1f59, 0x0078,
++      0x1f5d, 0xa085, 0x62c0, 0x0078, 0x1f5f, 0xa085, 0x6280, 0x017f,
++      0x7806, 0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080, 0x780b,
++      0x0008, 0x7047, 0x3d7f, 0x7043, 0x0000, 0x127f, 0x2000, 0x007c,
++      0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0, 0xa105,
++      0x2012, 0x1078, 0x205c, 0x007c, 0x2011, 0x0101, 0x20a9, 0x0009,
++      0x810b, 0x0070, 0x1f85, 0x0078, 0x1f80, 0xa18c, 0x0e00, 0x2204,
++      0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101, 0x20a9,
++      0x0005, 0x8213, 0x0070, 0x1f96, 0x0078, 0x1f91, 0xa294, 0x00e0,
++      0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011, 0x0101,
++      0x20a9, 0x000c, 0x810b, 0x0070, 0x1fa7, 0x0078, 0x1fa2, 0xa18c,
++      0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c, 0x2011,
++      0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x8103,
++      0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x62ac,
++      0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e,
++      0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f,
++      0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100,
++      0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x8103,
++      0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4,
++      0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c, 0x2091,
++      0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x203a, 0x2061,
++      0x6100, 0x1078, 0x2042, 0x0040, 0x2024, 0x20a9, 0x0000, 0x2061,
++      0x6000, 0x0c7e, 0x1078, 0x2042, 0x0040, 0x200e, 0x0c7f, 0x8c60,
++      0x0070, 0x200c, 0x0078, 0x2001, 0x0078, 0x203a, 0x007f, 0xa082,
++      0x6000, 0x2071, 0x3d40, 0x70ba, 0x6020, 0xa085, 0x0800, 0x6022,
++      0x71b6, 0x2001, 0x0004, 0x70a2, 0x70c7, 0x000f, 0x70a7, 0x0000,
++      0x1078, 0x1f00, 0x0078, 0x2036, 0x2071, 0x3d40, 0x6020, 0xa085,
++      0x0800, 0x6022, 0x71b6, 0x2c00, 0x70be, 0x2001, 0x0006, 0x70a2,
++      0x70c7, 0x000f, 0x70a7, 0x0000, 0x1078, 0x1f00, 0x2001, 0x0000,
++      0x0078, 0x203c, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f,
++      0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040, 0x2059, 0x2060, 0x6010,
++      0xa306, 0x00c0, 0x2056, 0x600c, 0xa206, 0x00c0, 0x2056, 0x6014,
++      0xa106, 0x00c0, 0x2056, 0xa006, 0x0078, 0x205b, 0x6000, 0x0078,
++      0x2043, 0xa085, 0x0001, 0x007c, 0x2011, 0x3d41, 0x220c, 0xa18c,
++      0x000f, 0x2011, 0x013b, 0x2204, 0xa084, 0x0100, 0x0040, 0x2072,
++      0x2021, 0xff04, 0x2122, 0x810b, 0x810b, 0x810b, 0x810b, 0xa18d,
++      0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4, 0xa08c, 0x0020, 0x0040,
++      0x20c6, 0xa084, 0x0006, 0x00c0, 0x20c6, 0x6014, 0x8007, 0xa084,
++      0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0, 0x3f80, 0x7004, 0xa084,
++      0x000a, 0x00c0, 0x20c6, 0x7108, 0xa194, 0xff00, 0x0040, 0x20c6,
++      0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106, 0x0040, 0x20ad, 0x2001,
++      0x0012, 0xa106, 0x0040, 0x20b1, 0x2001, 0x0014, 0xa106, 0x0040,
++      0x20b5, 0x2001, 0x0019, 0xa106, 0x0040, 0x20b9, 0x2001, 0x0032,
++      0xa106, 0x0040, 0x20bd, 0x0078, 0x20c1, 0x2009, 0x0012, 0x0078,
++      0x20c3, 0x2009, 0x0014, 0x0078, 0x20c3, 0x2009, 0x0019, 0x0078,
++      0x20c3, 0x2009, 0x0020, 0x0078, 0x20c3, 0x2009, 0x003f, 0x0078,
++      0x20c3, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x0e7f, 0x007c,
++      0x0068, 0x20c8, 0x2091, 0x8000, 0x2071, 0x0000, 0x007e, 0x7018,
++      0xa084, 0x0001, 0x00c0, 0x20cf, 0x007f, 0x2071, 0x0010, 0x70ca,
++      0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x0442, 0x70df, 0x0000,
++      0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x20e6,
++      0x107e, 0x007e, 0x127e, 0x2091, 0x2300, 0x7f3c, 0x7e58, 0x7c30,
++      0x7d38, 0x2009, 0x3d74, 0x78a0, 0x200a, 0x8108, 0x250a, 0x8108,
++      0x240a, 0x8108, 0x260a, 0x8108, 0x270a, 0xa594, 0x003f, 0xa484,
++      0x4000, 0x0040, 0x210c, 0xa784, 0x007d, 0x00c0, 0x3585, 0xd784,
++      0x00c0, 0x2d06, 0x1078, 0x20c8, 0xa49c, 0x000f, 0xa382, 0x0004,
++      0x0050, 0x2114, 0x1078, 0x20c8, 0x8507, 0xa084, 0x000f, 0x0079,
++      0x2119, 0x25cf, 0x268a, 0x26b2, 0x2946, 0x2bc0, 0x2c23, 0x2c81,
++      0x2d06, 0x2dad, 0x2e33, 0x2141, 0x2129, 0x2418, 0x24ef, 0x2b9b,
++      0x2129, 0x1078, 0x20c8, 0x0018, 0x20ed, 0x127f, 0x2091, 0x8001,
++      0x007f, 0x107f, 0x007c, 0x7003, 0x0000, 0x703f, 0x0000, 0x7030,
++      0xa005, 0x0040, 0x213d, 0x7033, 0x0000, 0x1078, 0x355b, 0x0018,
++      0x20ed, 0x2009, 0x3d0f, 0x200b, 0x0000, 0x705c, 0xa005, 0x00c0,
++      0x2216, 0x70a0, 0xa084, 0x0007, 0x0079, 0x214e, 0x2242, 0x2156,
++      0x2164, 0x2181, 0x21a3, 0x21f0, 0x21c9, 0x2156, 0x7808, 0xa084,
++      0xfffd, 0x780a, 0x2009, 0x0047, 0x1078, 0x2a7a, 0x00c0, 0x2162,
++      0x7003, 0x0004, 0x0078, 0x212b, 0x1078, 0x3542, 0x00c0, 0x217f,
++      0x70b4, 0x8007, 0x7882, 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b,
++      0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009, 0x00fa, 0x1078,
++      0x2a78, 0x00c0, 0x217f, 0x7003, 0x0004, 0x70c7, 0x000f, 0x0078,
++      0x212b, 0x1078, 0x3542, 0x00c0, 0x21a1, 0x71b4, 0x8107, 0x7882,
++      0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab,
++      0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009,
++      0x00fa, 0x1078, 0x2a78, 0x00c0, 0x21a1, 0x7003, 0x0004, 0x70c7,
++      0x000f, 0x0078, 0x212b, 0x1078, 0x3542, 0x00c0, 0x21c7, 0x71b4,
++      0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0,
++      0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab, 0x000d, 0x789b,
++      0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009, 0x00fa, 0x1078,
++      0x2a78, 0x00c0, 0x21c7, 0x7003, 0x0004, 0x70c7, 0x000f, 0x0078,
++      0x212b, 0x1078, 0x3542, 0x00c0, 0x21ee, 0x71b4, 0x8107, 0x7882,
++      0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab,
++      0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009,
++      0x00fa, 0x1078, 0x2a78, 0x00c0, 0x21ee, 0x70bc, 0x70bf, 0x0000,
++      0x2068, 0x703e, 0x7003, 0x0002, 0x70c7, 0x000f, 0x0078, 0x212b,
++      0x1078, 0x3542, 0x00c0, 0x212b, 0x70bc, 0x2068, 0x6f14, 0x1078,
++      0x3449, 0x2c50, 0x1078, 0x35ea, 0x789b, 0x0010, 0x6814, 0xa084,
++      0x001f, 0xa085, 0x0080, 0x007e, 0x007f, 0x78aa, 0x6e1c, 0x067e,
++      0x067f, 0x2041, 0x0001, 0x70c0, 0xa084, 0x0400, 0x2001, 0x0004,
++      0x0040, 0x2214, 0x2001, 0x0006, 0x0078, 0x2334, 0x1078, 0x3542,
++      0x00c0, 0x212b, 0x789b, 0x0010, 0x705c, 0x2068, 0x6f14, 0x1078,
++      0x3449, 0x2c50, 0x1078, 0x35ea, 0x6008, 0xa085, 0x0010, 0x600a,
++      0x6824, 0xa005, 0x0040, 0x2234, 0xa082, 0x0006, 0x0048, 0x2232,
++      0x0078, 0x2234, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, 0xa085,
++      0x0080, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003,
++      0x0078, 0x2334, 0x0018, 0x20ed, 0x7440, 0xa485, 0x0000, 0x0040,
++      0x226c, 0xa080, 0x3d80, 0x2030, 0x7144, 0x0018, 0x20ed, 0x8108,
++      0xa12a, 0x0048, 0x2255, 0x2009, 0x3d80, 0x2164, 0x6504, 0x85ff,
++      0x00c0, 0x2279, 0x8421, 0x00c0, 0x224d, 0x017e, 0x2009, 0x3d0f,
++      0x2104, 0xa005, 0x00c0, 0x226a, 0x017e, 0x2009, 0x3d10, 0x2104,
++      0x017f, 0x200a, 0x017f, 0x7146, 0x7003, 0x0000, 0x703f, 0x0000,
++      0x0078, 0x212b, 0x7640, 0xa6b0, 0x3d80, 0x7144, 0x2600, 0x0078,
++      0x225a, 0x7146, 0x2568, 0x2558, 0x753e, 0x2c50, 0x6034, 0xa085,
++      0x0000, 0x00c0, 0x2276, 0x6708, 0x7736, 0xa784, 0x013f, 0x0040,
++      0x22a7, 0xa784, 0x0021, 0x00c0, 0x2276, 0xa784, 0x0002, 0x0040,
++      0x2298, 0xa784, 0x0004, 0x0040, 0x2276, 0xa7bc, 0xfffb, 0x670a,
++      0xa784, 0x0018, 0x00c0, 0x2276, 0xa784, 0x0100, 0x0040, 0x22a7,
++      0x6018, 0xa005, 0x00c0, 0x2276, 0xa7bc, 0xfeff, 0x670a, 0x6823,
++      0x0000, 0x6e1c, 0xa684, 0x000e, 0x6118, 0x0040, 0x22b7, 0x601c,
++      0xa102, 0x0048, 0x22ba, 0x0040, 0x22ba, 0x0078, 0x2272, 0x81ff,
++      0x00c0, 0x2272, 0xa784, 0x0080, 0x00c0, 0x22c0, 0x700c, 0x6022,
++      0xa7bc, 0xff7f, 0x670a, 0x1078, 0x35ea, 0x0018, 0x20ed, 0x789b,
++      0x0010, 0xa046, 0x1078, 0x3542, 0x00c0, 0x212b, 0x6b14, 0xa39c,
++      0x001f, 0xa39d, 0x00c0, 0x704c, 0xa084, 0x8000, 0x0040, 0x22dc,
++      0xa684, 0x0001, 0x0040, 0x22de, 0xa39c, 0xffbf, 0xa684, 0x0010,
++      0x0040, 0x22e4, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e,
++      0x00c0, 0x22ef, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x2330, 0x714c,
++      0xa18c, 0x0800, 0x0040, 0x304e, 0x2011, 0x0021, 0x8004, 0x8004,
++      0x0048, 0x2306, 0x2011, 0x0022, 0x8004, 0x0048, 0x2306, 0x2011,
++      0x0020, 0x8004, 0x0048, 0x2306, 0x0040, 0x2330, 0x7aaa, 0x8840,
++      0x1078, 0x355b, 0x6a14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0xa1e0,
++      0x6000, 0x2c64, 0x8cff, 0x0040, 0x2327, 0x6014, 0xa206, 0x00c0,
++      0x2311, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x230c, 0x0c7e, 0x2a60,
++      0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078, 0x2242, 0x1078,
++      0x3542, 0x00c0, 0x212b, 0x2a60, 0x610e, 0x79aa, 0x8840, 0x712e,
++      0x0018, 0x20ed, 0x2001, 0x0001, 0x007e, 0x7150, 0xa184, 0x0018,
++      0x0040, 0x234f, 0xa184, 0x0010, 0x0040, 0x2342, 0x1078, 0x3273,
++      0x00c0, 0x2372, 0xa184, 0x0008, 0x0040, 0x234f, 0x69a0, 0xa184,
++      0x0600, 0x00c0, 0x234f, 0x1078, 0x316f, 0x0078, 0x2372, 0x69a0,
++      0xa184, 0x0800, 0x0040, 0x2366, 0x0c7e, 0x027e, 0x2960, 0x6000,
++      0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x027f,
++      0x0c7f, 0x1078, 0x3273, 0x00c0, 0x2372, 0x69a0, 0xa184, 0x0200,
++      0x0040, 0x236e, 0x1078, 0x31be, 0x0078, 0x2372, 0xa184, 0x0400,
++      0x00c0, 0x234b, 0x69a0, 0xa184, 0x1000, 0x0040, 0x237d, 0x6914,
++      0xa18c, 0xff00, 0x810f, 0x1078, 0x1fc3, 0x007f, 0x0018, 0x20ed,
++      0x7002, 0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x238d, 0xa086,
++      0x0060, 0x00c0, 0x238d, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x2392,
++      0xa18d, 0x0004, 0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa,
++      0x789b, 0x0061, 0x6818, 0xa08d, 0x8000, 0xa084, 0x7fff, 0x691a,
++      0xa68c, 0x0080, 0x0040, 0x23b1, 0x70cb, 0x0000, 0xa08a, 0x000d,
++      0x0050, 0x23af, 0xa08a, 0x000c, 0x71ca, 0x2001, 0x000c, 0x800c,
++      0x71ce, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3054, 0xa18c, 0x00f8,
++      0x00c0, 0x3054, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b,
++      0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f,
++      0x137f, 0x157f, 0x6814, 0x8007, 0x7882, 0x6d94, 0x7dd6, 0x7dde,
++      0x6e98, 0x7ed2, 0x7eda, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x23da,
++      0x0098, 0x23e2, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x355b,
++      0x0078, 0x2133, 0x7200, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0,
++      0x23ef, 0x781b, 0x004a, 0x1078, 0x355b, 0x0078, 0x2400, 0x6ab4,
++      0xa295, 0x2000, 0x7a5a, 0x781b, 0x004a, 0x1078, 0x355b, 0x7200,
++      0x2500, 0xa605, 0x0040, 0x2400, 0xa284, 0x0007, 0x1079, 0x240e,
++      0xad80, 0x0009, 0x7032, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0,
++      0x212b, 0x6018, 0x8000, 0x601a, 0x0078, 0x212b, 0x2416, 0x39a0,
++      0x39a0, 0x398f, 0x39a0, 0x2416, 0x398f, 0x2416, 0x1078, 0x20c8,
++      0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e, 0x2079, 0x3d00, 0x78c0,
++      0x0f7f, 0xa084, 0x0001, 0x0040, 0x243e, 0x70a0, 0xa086, 0x0001,
++      0x00c0, 0x242d, 0x70a2, 0x0078, 0x24d1, 0x70a0, 0xa086, 0x0005,
++      0x00c0, 0x243c, 0x70bc, 0x2068, 0x681b, 0x0004, 0x6817, 0x0000,
++      0x6820, 0xa085, 0x0008, 0x6822, 0x70a3, 0x0000, 0x157e, 0x2011,
++      0x0004, 0x71a0, 0xa186, 0x0001, 0x0040, 0x2460, 0xa186, 0x0007,
++      0x00c0, 0x2450, 0x2009, 0x3d35, 0x200b, 0x0005, 0x0078, 0x2460,
++      0x2009, 0x3d13, 0x2104, 0x2009, 0x3d12, 0x200a, 0x2009, 0x3d35,
++      0x200b, 0x0001, 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x2462,
++      0x70a3, 0x0000, 0x1078, 0x36ec, 0x20a9, 0x0010, 0x2039, 0x0000,
++      0x1078, 0x3340, 0xa7b8, 0x0100, 0x0070, 0x2470, 0x0078, 0x2468,
++      0x7000, 0x0079, 0x2473, 0x24a3, 0x248a, 0x248a, 0x247d, 0x24a3,
++      0x24a3, 0x24a3, 0x247b, 0x1078, 0x20c8, 0x2021, 0x3d57, 0x2404,
++      0xa005, 0x0040, 0x24a3, 0xad06, 0x00c0, 0x248a, 0x6800, 0x2022,
++      0x0078, 0x249a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2496, 0x6f14,
++      0x1078, 0x3449, 0x1078, 0x3025, 0x0078, 0x249a, 0x7054, 0x2060,
++      0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008,
++      0x6822, 0x1078, 0x1b7f, 0x2021, 0x6100, 0x1078, 0x24d7, 0x2021,
++      0x3d57, 0x1078, 0x24d7, 0x20a9, 0x0000, 0x2021, 0x6000, 0x1078,
++      0x24d7, 0x8420, 0x0070, 0x24b6, 0x0078, 0x24af, 0x2061, 0x4000,
++      0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0x81ff, 0x0040,
++      0x24c5, 0xa102, 0x0050, 0x24c5, 0x6012, 0x601b, 0x0000, 0xace0,
++      0x0010, 0x0070, 0x24cd, 0x0078, 0x24bc, 0x8421, 0x00c0, 0x24ba,
++      0x157f, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x212b, 0x047e,
++      0x2404, 0xa005, 0x0040, 0x24eb, 0x2068, 0x6800, 0x007e, 0x6a1a,
++      0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078, 0x1b7f,
++      0x007f, 0x0078, 0x24d9, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282,
++      0x0003, 0x0050, 0x24f5, 0x1078, 0x20c8, 0x2300, 0x0079, 0x24f8,
++      0x24fb, 0x256e, 0x258b, 0xa282, 0x0002, 0x0040, 0x2501, 0x1078,
++      0x20c8, 0x70a0, 0x70a3, 0x0000, 0x70c7, 0x0000, 0x0079, 0x2508,
++      0x2510, 0x2510, 0x2512, 0x2546, 0x305a, 0x2510, 0x2546, 0x2510,
++      0x1078, 0x20c8, 0x77b4, 0x1078, 0x3340, 0x77b4, 0xa7bc, 0x0f00,
++      0x1078, 0x3449, 0x6018, 0xa005, 0x0040, 0x253d, 0x2021, 0x6100,
++      0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x25a8, 0x0040, 0x253d,
++      0x157e, 0x20a9, 0x0000, 0x2021, 0x6000, 0x047e, 0x2009, 0x0004,
++      0x2011, 0x0010, 0x1078, 0x25a8, 0x047f, 0x0040, 0x253c, 0x8420,
++      0x0070, 0x253c, 0x0078, 0x252d, 0x157f, 0x8738, 0xa784, 0x001f,
++      0x00c0, 0x2518, 0x0078, 0x2133, 0x0078, 0x2133, 0x77b4, 0x1078,
++      0x3449, 0x6018, 0xa005, 0x0040, 0x256c, 0x2021, 0x6100, 0x2009,
++      0x0005, 0x2011, 0x0020, 0x1078, 0x25a8, 0x0040, 0x256c, 0x157e,
++      0x20a9, 0x0000, 0x2021, 0x6000, 0x047e, 0x2009, 0x0005, 0x2011,
++      0x0020, 0x1078, 0x25a8, 0x047f, 0x0040, 0x256b, 0x8420, 0x0070,
++      0x256b, 0x0078, 0x255c, 0x157f, 0x0078, 0x2133, 0x2200, 0x0079,
++      0x2571, 0x2574, 0x2576, 0x2576, 0x1078, 0x20c8, 0x2009, 0x0012,
++      0x70a0, 0xa086, 0x0002, 0x0040, 0x257f, 0x2009, 0x000e, 0x6818,
++      0xa084, 0x8000, 0x0040, 0x2585, 0x691a, 0x70a3, 0x0000, 0x70a7,
++      0x0001, 0x0078, 0x34da, 0x2200, 0x0079, 0x258e, 0x2593, 0x2576,
++      0x2591, 0x1078, 0x20c8, 0x7000, 0xa086, 0x0001, 0x00c0, 0x25a4,
++      0x1078, 0x303b, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2fdd,
++      0x0040, 0x25a4, 0x0078, 0x2242, 0x1078, 0x2a87, 0x0078, 0x2fea,
++      0x2404, 0xa005, 0x0040, 0x25cb, 0x2068, 0x2d04, 0x007e, 0x6814,
++      0xa706, 0x0040, 0x25b7, 0x2d20, 0x007f, 0x0078, 0x25a9, 0x007f,
++      0x2022, 0x691a, 0x6817, 0x0000, 0x6820, 0xa205, 0x6822, 0x1078,
++      0x1b7f, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a,
++      0x1078, 0x303b, 0x007c, 0xa085, 0x0001, 0x0078, 0x25ca, 0x2300,
++      0x0079, 0x25d2, 0x25d7, 0x25d5, 0x2630, 0x1078, 0x20c8, 0x78e4,
++      0xa005, 0x00d0, 0x25fa, 0x0018, 0x212b, 0x2008, 0xa084, 0x0030,
++      0x00c0, 0x25e6, 0x781b, 0x004a, 0x0078, 0x212b, 0x78ec, 0xa084,
++      0x0003, 0x0040, 0x25e2, 0x2100, 0xa084, 0x0007, 0x0079, 0x25f0,
++      0x260b, 0x2616, 0x25fe, 0x25f8, 0x3535, 0x3535, 0x25f8, 0x2623,
++      0x1078, 0x20c8, 0x2001, 0x0003, 0x0078, 0x295a, 0x6818, 0xa084,
++      0x8000, 0x0040, 0x2605, 0x681b, 0x001d, 0x1078, 0x3323, 0x781b,
++      0x0053, 0x0078, 0x212b, 0x6818, 0xa084, 0x8000, 0x0040, 0x2612,
++      0x681b, 0x001d, 0x1078, 0x3323, 0x0078, 0x3506, 0x6818, 0xa084,
++      0x8000, 0x0040, 0x261d, 0x681b, 0x001d, 0x1078, 0x3323, 0x781b,
++      0x00e3, 0x0078, 0x212b, 0x6818, 0xa084, 0x8000, 0x0040, 0x262a,
++      0x681b, 0x001d, 0x1078, 0x3323, 0x781b, 0x009e, 0x0078, 0x212b,
++      0xa584, 0x000f, 0x00c0, 0x2651, 0x7000, 0x0079, 0x2637, 0x263f,
++      0x2641, 0x263f, 0x264d, 0x264d, 0x264d, 0x264d, 0x263f, 0x1078,
++      0x20c8, 0x1078, 0x303b, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
++      0x2fdd, 0x0040, 0x264d, 0x0078, 0x2242, 0x1078, 0x2a87, 0x0078,
++      0x2fea, 0x78e4, 0xa005, 0x00d0, 0x25fa, 0x0018, 0x25fa, 0x2008,
++      0xa084, 0x0030, 0x00c0, 0x2660, 0x781b, 0x004a, 0x0078, 0x212b,
++      0x78ec, 0xa084, 0x0003, 0x0040, 0x265c, 0x2100, 0xa184, 0x0007,
++      0x0079, 0x266a, 0x267a, 0x267e, 0x2674, 0x2672, 0x3535, 0x3535,
++      0x2672, 0x352d, 0x1078, 0x20c8, 0x1078, 0x332b, 0x781b, 0x0053,
++      0x0078, 0x212b, 0x1078, 0x332b, 0x0078, 0x3506, 0x1078, 0x332b,
++      0x781b, 0x00e3, 0x0078, 0x212b, 0x1078, 0x332b, 0x781b, 0x009e,
++      0x0078, 0x212b, 0x2300, 0x0079, 0x268d, 0x2692, 0x2690, 0x2694,
++      0x1078, 0x20c8, 0x0078, 0x2d06, 0x681b, 0x0008, 0x78a3, 0x0000,
++      0x79e4, 0xa184, 0x0030, 0x0040, 0x2d06, 0x78ec, 0xa084, 0x0003,
++      0x0040, 0x2d06, 0xa184, 0x0007, 0x0079, 0x26a6, 0x26ae, 0x267e,
++      0x25fe, 0x34da, 0x3535, 0x3535, 0x26ae, 0x352d, 0x1078, 0x34ea,
++      0x0078, 0x212b, 0xa282, 0x0005, 0x0050, 0x26b8, 0x1078, 0x20c8,
++      0x2300, 0x0079, 0x26bb, 0x26be, 0x290b, 0x2917, 0x2200, 0x0079,
++      0x26c1, 0x26db, 0x26c8, 0x26db, 0x26c6, 0x28f0, 0x1078, 0x20c8,
++      0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0048,
++      0x3305, 0xa08a, 0x0004, 0x00c8, 0x3305, 0x0079, 0x26d7, 0x3305,
++      0x3305, 0x3305, 0x32b3, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080,
++      0x0040, 0x26ec, 0x0078, 0x3305, 0x7000, 0xa005, 0x00c0, 0x26e2,
++      0x2011, 0x0004, 0x0078, 0x2e41, 0xa184, 0x00ff, 0xa08a, 0x0010,
++      0x00c8, 0x3305, 0x0079, 0x26f4, 0x2706, 0x2704, 0x271e, 0x2722,
++      0x27dd, 0x3305, 0x3305, 0x27df, 0x3305, 0x3305, 0x28ec, 0x28ec,
++      0x3305, 0x3305, 0x3305, 0x28ee, 0x1078, 0x20c8, 0xa684, 0x1000,
++      0x0040, 0x2713, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a, 0x781b,
++      0x009b, 0x0078, 0x212b, 0x6818, 0xa084, 0x8000, 0x0040, 0x271c,
++      0x681b, 0x001d, 0x0078, 0x270a, 0x0078, 0x34da, 0x681b, 0x001d,
++      0x0078, 0x3311, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x2763,
++      0x6820, 0xa084, 0x0001, 0x00c0, 0x276b, 0x6818, 0xa086, 0x0008,
++      0x00c0, 0x2734, 0x681b, 0x0000, 0xa684, 0x0400, 0x0040, 0x27d9,
++      0xa684, 0x0080, 0x0040, 0x275f, 0x70cb, 0x0000, 0x6818, 0xa084,
++      0x003f, 0xa08a, 0x000d, 0x0050, 0x275f, 0xa08a, 0x000c, 0x71ca,
++      0x2001, 0x000c, 0x800c, 0x71ce, 0x789b, 0x0061, 0x78aa, 0x157e,
++      0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac,
++      0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x781b,
++      0x0056, 0x0078, 0x212b, 0xa684, 0x1000, 0x0040, 0x276b, 0x781b,
++      0x0068, 0x0078, 0x212b, 0xa684, 0x0060, 0x0040, 0x27d5, 0xa684,
++      0x0800, 0x0040, 0x27d5, 0xa684, 0x8000, 0x00c0, 0x2779, 0x0078,
++      0x2791, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0,
++      0x801b, 0x00c8, 0x2784, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
++      0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303,
++      0x68ae, 0xa684, 0x4000, 0x0040, 0x2799, 0xa6b4, 0xbfff, 0x7e5a,
++      0x6eb6, 0x7000, 0xa086, 0x0003, 0x00c0, 0x27a6, 0x1078, 0x3792,
++      0x1078, 0x398f, 0x781b, 0x0065, 0x0078, 0x212b, 0xa006, 0x1078,
++      0x3a5e, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040,
++      0x27b5, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda,
++      0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x00c0, 0x27c7, 0xa6b5,
++      0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x0065, 0x0078, 0x212b, 0x781b,
++      0x0065, 0x2200, 0xa115, 0x00c0, 0x27d1, 0x1078, 0x39a0, 0x0078,
++      0x212b, 0x1078, 0x39d5, 0x0078, 0x212b, 0x781b, 0x0068, 0x0078,
++      0x212b, 0x781b, 0x0056, 0x0078, 0x212b, 0x1078, 0x20c8, 0x0078,
++      0x283c, 0x6920, 0xa184, 0x0100, 0x0040, 0x27f7, 0xa18c, 0xfeff,
++      0x6922, 0x0c7e, 0x7048, 0x2060, 0x6000, 0xa084, 0xefff, 0x6002,
++      0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, 0x282b, 0xa184,
++      0x0200, 0x0040, 0x282b, 0xa18c, 0xfdff, 0x6922, 0x0c7e, 0x7048,
++      0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef,
++      0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x282b,
++      0x1078, 0x3445, 0x1078, 0x316f, 0x88ff, 0x0040, 0x282b, 0x789b,
++      0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684,
++      0x0400, 0x00c0, 0x2827, 0x781b, 0x0053, 0x0078, 0x212b, 0x781b,
++      0x0067, 0x0078, 0x212b, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2834,
++      0x781b, 0x0056, 0x0078, 0x212b, 0x781b, 0x0068, 0x0078, 0x212b,
++      0x0078, 0x330b, 0x0078, 0x330b, 0x2019, 0x0000, 0x7990, 0xa18c,
++      0x0007, 0x00c0, 0x284a, 0x6820, 0xa084, 0x0100, 0x0040, 0x283a,
++      0x2009, 0x0008, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286,
++      0x0001, 0x00c0, 0x2881, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102,
++      0x0040, 0x2879, 0x0048, 0x285e, 0x0078, 0x287b, 0xa380, 0x0002,
++      0xa102, 0x00c8, 0x2879, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e,
++      0x7048, 0x2060, 0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084,
++      0xffe5, 0x6006, 0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078,
++      0x282c, 0x0078, 0x27e1, 0x24a8, 0x7aa8, 0x00f0, 0x287b, 0x0078,
++      0x284c, 0xa284, 0x00f0, 0xa086, 0x0020, 0x00c0, 0x28dd, 0x8318,
++      0x8318, 0x2300, 0xa102, 0x0040, 0x2891, 0x0048, 0x2891, 0x0078,
++      0x28da, 0xa286, 0x0023, 0x0040, 0x283a, 0x681c, 0xa084, 0xfff1,
++      0x681e, 0x7e58, 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a,
++      0x6008, 0xa085, 0x0010, 0x600a, 0x0c7e, 0x7048, 0x2060, 0x6004,
++      0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0010, 0x0040, 0x28b5, 0x1078,
++      0x3445, 0x1078, 0x3273, 0x0078, 0x28c4, 0x0c7e, 0x7048, 0x2060,
++      0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x282b,
++      0x1078, 0x3445, 0x1078, 0x316f, 0x88ff, 0x0040, 0x282b, 0x789b,
++      0x0060, 0x2800, 0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400,
++      0x00c0, 0x28d6, 0x781b, 0x0053, 0x0078, 0x212b, 0x781b, 0x0067,
++      0x0078, 0x212b, 0x7aa8, 0x0078, 0x284c, 0x8318, 0x2300, 0xa102,
++      0x0040, 0x28e6, 0x0048, 0x28e6, 0x0078, 0x284c, 0xa284, 0x0080,
++      0x00c0, 0x3311, 0x0078, 0x330b, 0x0078, 0x3311, 0x0078, 0x3305,
++      0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040,
++      0x28fb, 0x1078, 0x20c8, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084,
++      0x00ff, 0xa08a, 0x0004, 0x00c8, 0x3305, 0x0079, 0x2907, 0x308b,
++      0x30c2, 0x3305, 0x320e, 0xa282, 0x0000, 0x00c0, 0x2911, 0x1078,
++      0x20c8, 0x1078, 0x3323, 0x781b, 0x0067, 0x0078, 0x212b, 0xa282,
++      0x0003, 0x00c0, 0x291d, 0x1078, 0x20c8, 0xa484, 0x8000, 0x00c0,
++      0x2940, 0x70a0, 0xa005, 0x0040, 0x2927, 0x1078, 0x20c8, 0x6f14,
++      0x77b6, 0xa7bc, 0x0f00, 0x1078, 0x3449, 0x6008, 0xa085, 0x0021,
++      0x600a, 0x8738, 0xa784, 0x001f, 0x00c0, 0x292b, 0x1078, 0x3327,
++      0x70a3, 0x0002, 0x2009, 0x3d35, 0x200b, 0x0009, 0x0078, 0x2942,
++      0x1078, 0x3333, 0x781b, 0x0067, 0x0078, 0x212b, 0xa282, 0x0004,
++      0x0050, 0x294c, 0x1078, 0x20c8, 0x2300, 0x0079, 0x294f, 0x2952,
++      0x2a33, 0x2a62, 0xa286, 0x0003, 0x0040, 0x2958, 0x1078, 0x20c8,
++      0x2001, 0x0000, 0x007e, 0x68a0, 0xa084, 0x2000, 0x0040, 0x2964,
++      0x6008, 0xa085, 0x0002, 0x600a, 0x007f, 0x703a, 0x7000, 0xa084,
++      0x0007, 0x0079, 0x296b, 0x2133, 0x2975, 0x2975, 0x2b50, 0x2b81,
++      0x2133, 0x2b81, 0x2973, 0x1078, 0x20c8, 0xa684, 0x1000, 0x00c0,
++      0x297d, 0x1078, 0x36ec, 0x0040, 0x2a0d, 0x7868, 0xa08c, 0x00ff,
++      0x0040, 0x29c3, 0xa186, 0x0008, 0x00c0, 0x2994, 0x6008, 0xa084,
++      0xffef, 0x600a, 0x1078, 0x2fdd, 0x0040, 0x29c3, 0x1078, 0x303b,
++      0x1078, 0x36ec, 0x0078, 0x29aa, 0xa186, 0x0028, 0x00c0, 0x29c3,
++      0x1078, 0x36ec, 0x6008, 0xa084, 0xffef, 0x600a, 0x6018, 0xa005,
++      0x0040, 0x29aa, 0x8001, 0x601a, 0x6008, 0xa085, 0x0008, 0x600a,
++      0x7010, 0x6026, 0x6820, 0xa084, 0x0001, 0x0040, 0x2133, 0x6820,
++      0xa084, 0xfffe, 0x6822, 0x7054, 0x0c7e, 0x2060, 0x6800, 0x6002,
++      0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x29c0, 0x6002,
++      0x6006, 0x0078, 0x2133, 0x017e, 0x1078, 0x2a87, 0x017f, 0xa684,
++      0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2a0d,
++      0xa186, 0x0002, 0x00c0, 0x2a0d, 0xa684, 0x0800, 0x00c0, 0x29e0,
++      0xa684, 0x0060, 0x0040, 0x29e0, 0x78d8, 0x7adc, 0x682e, 0x6a32,
++      0x6820, 0xa084, 0x0800, 0x00c0, 0x2a0d, 0x8717, 0xa294, 0x000f,
++      0x8213, 0x8213, 0x8213, 0xa290, 0x3f80, 0xa290, 0x0000, 0x221c,
++      0xa384, 0x0100, 0x00c0, 0x29f6, 0x0078, 0x29fc, 0x8210, 0x2204,
++      0xa085, 0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2a09,
++      0x68a0, 0xa084, 0x0100, 0x00c0, 0x2a09, 0x1078, 0x2b0b, 0x0078,
++      0x2133, 0x6008, 0xa085, 0x0002, 0x600a, 0x6916, 0x6818, 0xa084,
++      0x8000, 0x0040, 0x2a15, 0x7038, 0x681a, 0xa68c, 0xdf00, 0x691e,
++      0x1078, 0x302c, 0x1078, 0x303b, 0x00c0, 0x2a22, 0x6008, 0xa084,
++      0xffef, 0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2a2b, 0x1078,
++      0x3025, 0x0078, 0x2a2f, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078,
++      0x1b7f, 0x0078, 0x2133, 0xa282, 0x0004, 0x0048, 0x2a39, 0x1078,
++      0x20c8, 0x2200, 0x0079, 0x2a3c, 0x2a37, 0x2a40, 0x2a4d, 0x2a40,
++      0x7000, 0xa086, 0x0005, 0x0040, 0x2a49, 0x1078, 0x3323, 0x781b,
++      0x0067, 0x781b, 0x0068, 0x0078, 0x212b, 0x7890, 0x8007, 0x8001,
++      0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
++      0xa186, 0x0003, 0x0040, 0x2a5e, 0x0078, 0x3305, 0x781b, 0x0068,
++      0x0078, 0x212b, 0x6820, 0xa085, 0x0004, 0x6822, 0x82ff, 0x00c0,
++      0x2a6d, 0x1078, 0x3323, 0x0078, 0x2a74, 0x8211, 0x0040, 0x2a72,
++      0x1078, 0x20c8, 0x1078, 0x3333, 0x781b, 0x0067, 0x0078, 0x212b,
++      0x1078, 0x355b, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2a84, 0x0018,
++      0x2a84, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684,
++      0x0060, 0x00c0, 0x2a91, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
++      0x2b0a, 0xa684, 0x0800, 0x00c0, 0x2ab3, 0x68b4, 0xa084, 0x4800,
++      0xa635, 0xa684, 0x0800, 0x00c0, 0x2ab3, 0x6998, 0x6a94, 0x692e,
++      0x6a32, 0x7038, 0xa005, 0x00c0, 0x2aab, 0x2200, 0xa105, 0x0040,
++      0x2ab2, 0x703b, 0x0015, 0x7000, 0xa086, 0x0006, 0x0040, 0x2ab2,
++      0x1078, 0x36ec, 0x007c, 0xa684, 0x0020, 0x0040, 0x2ad5, 0xa684,
++      0x4000, 0x0040, 0x2ac1, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
++      0x2aab, 0x68b4, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0,
++      0x2abb, 0x7038, 0xa005, 0x00c0, 0x2acf, 0x703b, 0x0015, 0x79d8,
++      0x7adc, 0x692e, 0x6a32, 0x0078, 0x2aab, 0xa684, 0x4000, 0x0040,
++      0x2adf, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2aab, 0x68b4,
++      0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2ad9, 0x7038,
++      0xa005, 0x00c0, 0x2aed, 0x703b, 0x0015, 0x79d8, 0x7adc, 0x78d0,
++      0x80fb, 0x00c8, 0x2af4, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
++      0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x2b01, 0x0078,
++      0x2aab, 0x7000, 0xa086, 0x0006, 0x0040, 0x2b0a, 0x1078, 0x3a5e,
++      0x0078, 0x2aab, 0x007c, 0xa384, 0x0200, 0x0040, 0x2b13, 0x6008,
++      0xa085, 0x0002, 0x600a, 0x681b, 0x0006, 0x688f, 0x0000, 0x6893,
++      0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833,
++      0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020, 0x7000,
++      0x0079, 0x2b2a, 0x2b32, 0x2b34, 0x2b3d, 0x2b32, 0x2b32, 0x2b32,
++      0x2b32, 0x2b32, 0x1078, 0x20c8, 0x6820, 0xa084, 0x0001, 0x00c0,
++      0x2b3d, 0x1078, 0x3025, 0x0078, 0x2b43, 0x7054, 0x2c50, 0x2060,
++      0x6800, 0x6002, 0x2a60, 0x2021, 0x3d57, 0x2404, 0xa005, 0x0040,
++      0x2b4c, 0x2020, 0x0078, 0x2b45, 0x2d22, 0x206b, 0x0000, 0x007c,
++      0x1078, 0x302c, 0x1078, 0x303b, 0x682b, 0x0000, 0x789b, 0x000e,
++      0x6f14, 0x1078, 0x3a90, 0x6817, 0x0002, 0xa684, 0x0800, 0x0040,
++      0x2b65, 0x691c, 0xa18d, 0x2000, 0x691e, 0x6818, 0xa084, 0x8000,
++      0x0040, 0x2b75, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2b73, 0x681b,
++      0x001e, 0x0078, 0x2b75, 0x681b, 0x0000, 0x2021, 0x3d57, 0x6800,
++      0x2022, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078, 0x1b7f, 0x0078,
++      0x2133, 0x1078, 0x2a87, 0x682b, 0x0000, 0x2001, 0x000e, 0x6f14,
++      0x1078, 0x3560, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xa084, 0x8000,
++      0x0040, 0x2b94, 0x7038, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x70a3,
++      0x0000, 0x0078, 0x2133, 0xa006, 0x1078, 0x36ec, 0x6817, 0x0000,
++      0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
++      0xa085, 0x00ff, 0x6822, 0x7000, 0x0079, 0x2bae, 0x2bb6, 0x2bb8,
++      0x2bb8, 0x2bba, 0x2bba, 0x2bba, 0x2bba, 0x2bb6, 0x1078, 0x20c8,
++      0x1078, 0x303b, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x2ff5,
++      0x2300, 0x0079, 0x2bc3, 0x2bc6, 0x2bc8, 0x2c21, 0x1078, 0x20c8,
++      0xa684, 0x8000, 0x00c0, 0x2c06, 0x7000, 0x0079, 0x2bcf, 0x2bd7,
++      0x2bd9, 0x2bd9, 0x2bf5, 0x2bd9, 0x2c02, 0x2bf5, 0x2bd7, 0x1078,
++      0x20c8, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x2bf1, 0xa6b4,
++      0xffdf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x6eb6, 0x681c,
++      0xa084, 0xffdf, 0x681e, 0x1078, 0x36ec, 0x1078, 0x39a0, 0x0078,
++      0x34da, 0xa684, 0x2000, 0x0040, 0x2be3, 0x6818, 0xa084, 0x8000,
++      0x0040, 0x2c02, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, 0x2c02,
++      0x681b, 0x0007, 0x1078, 0x34ea, 0x0078, 0x212b, 0xa6b4, 0x7fff,
++      0x7e5a, 0x7adc, 0x79d8, 0x78d0, 0x79d2, 0x801b, 0x00c8, 0x2c11,
++      0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100,
++      0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0068,
++      0x007c, 0x1078, 0x20c8, 0x2300, 0x0079, 0x2c26, 0x2c29, 0x2c2b,
++      0x2c73, 0x1078, 0x20c8, 0xa684, 0x8000, 0x00c0, 0x2c62, 0x7000,
++      0x0079, 0x2c32, 0x2c39, 0x2c3b, 0x2c3b, 0x2c57, 0x2c3b, 0x2c57,
++      0x2c39, 0x1078, 0x20c8, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0,
++      0x2c53, 0xa6b4, 0xffbf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a,
++      0x6eb6, 0x681c, 0xa084, 0xffbf, 0x681e, 0x1078, 0x36ec, 0x1078,
++      0x39a0, 0x0078, 0x34da, 0xa684, 0x2000, 0x0040, 0x2c45, 0x6818,
++      0xa084, 0x8000, 0x0040, 0x2c5e, 0x681b, 0x0007, 0x781b, 0x00e4,
++      0x0078, 0x212b, 0xa6b4, 0x7fff, 0x7e5a, 0x7adc, 0x79d8, 0x6b98,
++      0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2,
++      0x781b, 0x0068, 0x007c, 0x6820, 0xa085, 0x0004, 0x6822, 0x1078,
++      0x34a7, 0xa6b5, 0x0800, 0x1078, 0x3323, 0x781b, 0x0067, 0x0078,
++      0x212b, 0x2300, 0x0079, 0x2c84, 0x2c87, 0x2c89, 0x2c8b, 0x1078,
++      0x20c8, 0x0078, 0x3311, 0xa684, 0x0400, 0x00c0, 0x2cb4, 0x79e4,
++      0xa184, 0x0020, 0x0040, 0x2c9b, 0x78ec, 0xa084, 0x0003, 0x0040,
++      0x2c9b, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
++      0xfffb, 0x785a, 0x79e4, 0xa184, 0x0020, 0x0040, 0x2cac, 0x78ec,
++      0xa084, 0x0003, 0x00c0, 0x2cb0, 0x2001, 0x0014, 0x0078, 0x295a,
++      0xa184, 0x0007, 0x0079, 0x2cec, 0x7a90, 0xa294, 0x0007, 0x789b,
++      0x0060, 0x79a8, 0x81ff, 0x0040, 0x2cea, 0x789b, 0x0010, 0x7ba8,
++      0xa384, 0x0001, 0x00c0, 0x2cdb, 0x7ba8, 0x7ba8, 0xa386, 0x0001,
++      0x00c0, 0x2cce, 0x2009, 0xfff7, 0x0078, 0x2cd4, 0xa386, 0x0003,
++      0x00c0, 0x2cdb, 0x2009, 0xffef, 0x0c7e, 0x7048, 0x2060, 0x6004,
++      0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
++      0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfdff, 0xa18c,
++      0xfeff, 0x6922, 0x0078, 0x34da, 0x260b, 0x2616, 0x2cf6, 0x2cfe,
++      0x2cf4, 0x2cf4, 0x34da, 0x34da, 0x1078, 0x20c8, 0x6920, 0xa18c,
++      0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x34e2, 0x6920, 0xa18c,
++      0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078, 0x34da, 0x79e4, 0xa184,
++      0x0030, 0x0040, 0x2d10, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x2d26,
++      0x70a0, 0xa086, 0x0002, 0x00c0, 0x2d19, 0x2011, 0x0002, 0x0078,
++      0x24ef, 0x7000, 0xa086, 0x0000, 0x0040, 0x212b, 0x6818, 0xa085,
++      0x8000, 0x681a, 0x2001, 0x0014, 0x0078, 0x295a, 0xa184, 0x0007,
++      0x0079, 0x2d2a, 0x34da, 0x34da, 0x2d32, 0x34da, 0x3535, 0x3535,
++      0x34da, 0x34da, 0xa684, 0x0080, 0x0040, 0x2d61, 0x71c8, 0x81ff,
++      0x0040, 0x2d61, 0xa182, 0x000d, 0x00d0, 0x2d42, 0x70cb, 0x0000,
++      0x0078, 0x2d47, 0xa182, 0x000c, 0x70ca, 0x2009, 0x000c, 0x789b,
++      0x0061, 0x79aa, 0x157e, 0x137e, 0x147e, 0x70cc, 0x8114, 0xa210,
++      0x72ce, 0xa080, 0x000b, 0xad00, 0x2098, 0x20a1, 0x012b, 0x789b,
++      0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f, 0x137f, 0x157f, 0x0078,
++      0x34e2, 0xa684, 0x0400, 0x00c0, 0x2da2, 0x6820, 0xa084, 0x0001,
++      0x0040, 0x34e2, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x2d76,
++      0xa086, 0x0060, 0x00c0, 0x2d76, 0xa18d, 0x4000, 0xa18c, 0xfffb,
++      0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061,
++      0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040,
++      0x3054, 0xa18c, 0x00f8, 0x00c0, 0x3054, 0x157e, 0x137e, 0x147e,
++      0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b,
++      0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0x8007, 0x7882,
++      0x0078, 0x34e2, 0x6818, 0xa084, 0x8000, 0x0040, 0x2da9, 0x681b,
++      0x0008, 0x781b, 0x00d8, 0x0078, 0x212b, 0x2300, 0x0079, 0x2db0,
++      0x2db5, 0x2e31, 0x2db3, 0x1078, 0x20c8, 0x7000, 0xa084, 0x0007,
++      0x0079, 0x2dba, 0x2dc2, 0x2dc4, 0x2de9, 0x2958, 0x2dc2, 0x2133,
++      0x2dc2, 0x2dc2, 0x1078, 0x20c8, 0x681c, 0xa084, 0x2000, 0x0040,
++      0x2dcd, 0x6008, 0xa085, 0x0002, 0x600a, 0x6920, 0xa18d, 0x0001,
++      0x6922, 0x6800, 0x6006, 0xa005, 0x00c0, 0x2dd7, 0x6002, 0x681c,
++      0xa084, 0x000e, 0x0040, 0x2de3, 0x7014, 0x68ba, 0x712c, 0xa188,
++      0x6000, 0x0078, 0x2de5, 0x2009, 0x6100, 0x2104, 0x6802, 0x2d0a,
++      0x7156, 0x6eb6, 0xa684, 0x0060, 0x0040, 0x2e2f, 0xa684, 0x0800,
++      0x00c0, 0x2dfd, 0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898,
++      0x68aa, 0x1078, 0x36ec, 0x0078, 0x2e2f, 0xa684, 0x0020, 0x0040,
++      0x2e0a, 0xa006, 0x1078, 0x3a5e, 0x79d8, 0x7adc, 0x69aa, 0x6aa6,
++      0x0078, 0x2e10, 0x1078, 0x3456, 0x69aa, 0x6aa6, 0x1078, 0x3a5e,
++      0xa684, 0x8000, 0x0040, 0x2e2f, 0xa684, 0x7fff, 0x68b6, 0x7adc,
++      0x79d8, 0xa684, 0x0020, 0x00c0, 0x2e27, 0x78d0, 0x801b, 0x00c8,
++      0x2e22, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98,
++      0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x0078,
++      0x2133, 0x0078, 0x3311, 0x7033, 0x0000, 0xa282, 0x0006, 0x0050,
++      0x2e3b, 0x1078, 0x20c8, 0x2300, 0x0079, 0x2e3e, 0x2e41, 0x2e6a,
++      0x2e90, 0x2200, 0x0079, 0x2e44, 0x2e4a, 0x3311, 0x2e4c, 0x2e4a,
++      0x2ebc, 0x2f0f, 0x1078, 0x20c8, 0x7003, 0x0005, 0x2001, 0x6110,
++      0x2068, 0x703e, 0x157e, 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000,
++      0x0070, 0x2e5c, 0x0078, 0x2e55, 0x157f, 0xad80, 0x0009, 0x7032,
++      0x6817, 0x0000, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003,
++      0x0078, 0x3305, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2e77, 0x1078,
++      0x303b, 0x1078, 0x36ec, 0x7034, 0x600a, 0x0078, 0x2e7c, 0x7000,
++      0xa086, 0x0003, 0x0040, 0x2e71, 0x7003, 0x0005, 0x2001, 0x6110,
++      0x2068, 0x703e, 0xad80, 0x0009, 0x7032, 0x2200, 0x0079, 0x2e88,
++      0x3311, 0x2e8e, 0x2e8e, 0x2ebc, 0x2e8e, 0x3311, 0x1078, 0x20c8,
++      0x7000, 0xa086, 0x0001, 0x00c0, 0x2e9d, 0x1078, 0x303b, 0x1078,
++      0x36ec, 0x7034, 0x600a, 0x0078, 0x2ea2, 0x7000, 0xa086, 0x0003,
++      0x0040, 0x2e97, 0x7003, 0x0005, 0x2001, 0x6110, 0x2068, 0x703e,
++      0xad80, 0x0009, 0x7032, 0x2200, 0x0079, 0x2eae, 0x2eb6, 0x2eb4,
++      0x2eb4, 0x2eb6, 0x2eb4, 0x2eb6, 0x1078, 0x20c8, 0x1078, 0x3333,
++      0x781b, 0x0067, 0x0078, 0x212b, 0x7000, 0xa086, 0x0001, 0x00c0,
++      0x2ec9, 0x1078, 0x303b, 0x1078, 0x36ec, 0x7034, 0x600a, 0x0078,
++      0x2ece, 0x7000, 0xa086, 0x0003, 0x0040, 0x2ec3, 0x7003, 0x0002,
++      0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f,
++      0xa215, 0x2069, 0x6100, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005,
++      0x0040, 0x2ee9, 0x6814, 0xa206, 0x0040, 0x2f04, 0x6800, 0x0078,
++      0x2edc, 0x7003, 0x0005, 0x2001, 0x6110, 0x2068, 0x703e, 0x157e,
++      0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x2ef9, 0x0078,
++      0x2ef2, 0x157f, 0xad80, 0x0009, 0x7032, 0x6a16, 0x68b7, 0x0700,
++      0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084,
++      0x0c00, 0x0040, 0x2f70, 0x1078, 0x332b, 0x0078, 0x2f70, 0x7000,
++      0xa086, 0x0001, 0x00c0, 0x2f1c, 0x1078, 0x303b, 0x1078, 0x36ec,
++      0x7034, 0x600a, 0x0078, 0x2f21, 0x7000, 0xa086, 0x0003, 0x0040,
++      0x2f16, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
++      0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c, 0x00ff,
++      0xa1e8, 0x6000, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005, 0x0040,
++      0x2f40, 0x6814, 0xa206, 0x0040, 0x2f5b, 0x6800, 0x0078, 0x2f33,
++      0x7003, 0x0005, 0x2001, 0x6110, 0x2068, 0x703e, 0x157e, 0x20a9,
++      0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x2f50, 0x0078, 0x2f49,
++      0x157f, 0xad80, 0x0009, 0x7032, 0x6a16, 0x68b7, 0x0700, 0x6823,
++      0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00,
++      0x0040, 0x2f70, 0xa084, 0x0800, 0x0040, 0x2f6a, 0x1078, 0x332f,
++      0x0078, 0x2f70, 0x1078, 0x332b, 0x70bf, 0x0000, 0x0078, 0x2f70,
++      0x027e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080,
++      0x3f80, 0x2060, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0xa684,
++      0x0060, 0x0040, 0x2fb0, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105,
++      0x00c0, 0x2f9e, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff,
++      0x7e5a, 0xa684, 0x0060, 0xa086, 0x0060, 0x0040, 0x2fb0, 0x1078,
++      0x39a0, 0xa6b5, 0x2000, 0x7e5a, 0x0078, 0x2fb0, 0x68b0, 0xa31a,
++      0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x2fb0, 0x7bd2, 0x7bda,
++      0x7cd6, 0x7cde, 0x68b0, 0xa6b4, 0xbfff, 0x7e5a, 0x1078, 0x39d5,
++      0x077f, 0x1078, 0x3449, 0x2009, 0x0068, 0xa684, 0x0008, 0x0040,
++      0x2fcf, 0x78e4, 0xa084, 0x0030, 0x0040, 0x2fc7, 0x78ec, 0xa084,
++      0x0003, 0x0040, 0x2fc7, 0x2009, 0x0067, 0x0078, 0x2fcf, 0x0f7e,
++      0x2079, 0x3d00, 0x1078, 0x36ec, 0x0f7f, 0x0078, 0x2133, 0x791a,
++      0x2d00, 0x703e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xa080, 0x3f80, 0x2048, 0x0078, 0x212b, 0x6020, 0xa005, 0x0040,
++      0x2fe9, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a, 0x7010,
++      0x6026, 0x007c, 0xa006, 0x1078, 0x36ec, 0x6817, 0x0000, 0x681b,
++      0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x0007,
++      0x0079, 0x2ffa, 0x3002, 0x3004, 0x3004, 0x3021, 0x300c, 0x3002,
++      0x300c, 0x3002, 0x1078, 0x20c8, 0x1078, 0x302c, 0x1078, 0x3025,
++      0x1078, 0x1b7f, 0x0078, 0x2133, 0x70a0, 0x70a3, 0x0000, 0x70c7,
++      0x0000, 0x0079, 0x3013, 0x301d, 0x301d, 0x301b, 0x301b, 0x301b,
++      0x301d, 0x301b, 0x301d, 0x0079, 0x2508, 0x70a3, 0x0000, 0x0078,
++      0x2133, 0x681b, 0x0000, 0x0078, 0x2b50, 0x6800, 0xa005, 0x00c0,
++      0x302a, 0x6002, 0x6006, 0x007c, 0x6010, 0xa005, 0x0040, 0x3035,
++      0x8001, 0x00d0, 0x3035, 0x1078, 0x20c8, 0x6012, 0x6008, 0xa084,
++      0xffef, 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, 0x3041, 0x8001,
++      0x601a, 0x007c, 0x1078, 0x355b, 0x681b, 0x0018, 0x0078, 0x3078,
++      0x1078, 0x355b, 0x681b, 0x0019, 0x0078, 0x3078, 0x1078, 0x355b,
++      0x681b, 0x001a, 0x0078, 0x3078, 0x1078, 0x355b, 0x681b, 0x0003,
++      0x0078, 0x3078, 0x77b4, 0x1078, 0x3449, 0x71b8, 0xa18c, 0x00ff,
++      0xa1e8, 0x6000, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, 0x306a,
++      0x0078, 0x2133, 0x6814, 0x72b4, 0xa206, 0x0040, 0x3072, 0x6800,
++      0x0078, 0x3063, 0x6800, 0x200a, 0x681b, 0x0005, 0x70bf, 0x0000,
++      0x1078, 0x302c, 0x6820, 0xa084, 0x0001, 0x00c0, 0x3081, 0x1078,
++      0x3025, 0x1078, 0x303b, 0x681f, 0x0000, 0x6823, 0x0020, 0x1078,
++      0x1b7f, 0x0078, 0x2133, 0xa282, 0x0005, 0x00c0, 0x3305, 0x78a8,
++      0xa084, 0x00ff, 0x802f, 0x78a8, 0xa084, 0x00ff, 0xa52d, 0x78a8,
++      0xa084, 0x00ff, 0x8037, 0x78a8, 0xa084, 0x00ff, 0xa635, 0x7cd8,
++      0x2600, 0xa420, 0x7bdc, 0x2500, 0xa319, 0x0048, 0x3305, 0x7cda,
++      0x7bde, 0x6caa, 0x7cd2, 0x6ba6, 0x7bd6, 0x1078, 0x3792, 0x1078,
++      0x398f, 0x781b, 0x0065, 0x0078, 0x212b, 0xa006, 0x1078, 0x3a5e,
++      0x781b, 0x0065, 0x0078, 0x212b, 0x78d0, 0x79d4, 0x1078, 0x39d5,
++      0x0078, 0x212b, 0xa282, 0x0003, 0x00c0, 0x3305, 0x7da8, 0xa5ac,
++      0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xa18d, 0x0080, 0x6922,
++      0xa184, 0x0100, 0x0040, 0x3122, 0xa18c, 0xfeff, 0x6922, 0xa6b4,
++      0x00ff, 0x0040, 0x310c, 0xa682, 0x000c, 0x0048, 0x30e3, 0x0040,
++      0x30e3, 0x2031, 0x000c, 0x852b, 0x852b, 0x1078, 0x33be, 0x0040,
++      0x30ed, 0x1078, 0x31da, 0x0078, 0x3115, 0x1078, 0x3379, 0x0c7e,
++      0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x31fe, 0x0c7f,
++      0x6920, 0xa18d, 0x0100, 0x6922, 0x7e58, 0xa6b5, 0x0004, 0x7e5a,
++      0xa684, 0x0400, 0x00c0, 0x3108, 0x781b, 0x0053, 0x0078, 0x212b,
++      0x781b, 0x0067, 0x0078, 0x212b, 0x0c7e, 0x2960, 0x6004, 0xa084,
++      0xfff5, 0x6006, 0x1078, 0x31fe, 0x0c7f, 0x7e58, 0xa684, 0x0400,
++      0x00c0, 0x311e, 0x781b, 0x0056, 0x0078, 0x212b, 0x781b, 0x0068,
++      0x0078, 0x212b, 0x0c7e, 0x7048, 0x2060, 0x6100, 0xa18c, 0x1000,
++      0x0040, 0x3162, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c,
++      0x0048, 0x3136, 0x0040, 0x3136, 0x2011, 0x000c, 0x2600, 0xa202,
++      0x00c8, 0x313b, 0x2230, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086,
++      0x0028, 0x00c0, 0x314b, 0xa282, 0x0019, 0x00c8, 0x3151, 0x2011,
++      0x0019, 0x0078, 0x3151, 0xa282, 0x000c, 0x00c8, 0x3151, 0x2011,
++      0x000c, 0x2200, 0xa502, 0x00c8, 0x3156, 0x2228, 0x1078, 0x337d,
++      0x852b, 0x852b, 0x1078, 0x33be, 0x0040, 0x3162, 0x1078, 0x31da,
++      0x0078, 0x3166, 0x1078, 0x3379, 0x1078, 0x31fe, 0x7858, 0xa085,
++      0x0004, 0x785a, 0x0c7f, 0x781b, 0x0067, 0x0078, 0x212b, 0x0c7e,
++      0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x3187, 0x6010, 0xa084,
++      0x000f, 0x00c0, 0x3181, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x0c7f,
++      0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x31ae, 0x68a0,
++      0xa084, 0x0200, 0x00c0, 0x3181, 0x6208, 0xa294, 0x00ff, 0x7018,
++      0xa086, 0x0028, 0x00c0, 0x319c, 0xa282, 0x0019, 0x00c8, 0x31a2,
++      0x2011, 0x0019, 0x0078, 0x31a2, 0xa282, 0x000c, 0x00c8, 0x31a2,
++      0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c,
++      0x0048, 0x31ae, 0x0040, 0x31ae, 0x2019, 0x000c, 0x78ab, 0x0001,
++      0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005,
++      0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x2960,
++      0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000,
++      0x0078, 0x31ca, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001,
++      0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822,
++      0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008, 0xa084, 0xfff0,
++      0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084,
++      0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016, 0x788a, 0xa6b4,
++      0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605, 0x600e,
++      0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e, 0x7048,
++      0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012,
++      0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c, 0xa282, 0x0002,
++      0x00c0, 0x3305, 0x7aa8, 0x6920, 0xa18d, 0x0080, 0x6922, 0xa184,
++      0x0200, 0x0040, 0x3253, 0xa18c, 0xfdff, 0x6922, 0xa294, 0x00ff,
++      0xa282, 0x0002, 0x00c8, 0x3305, 0x1078, 0x329a, 0x1078, 0x31fe,
++      0xa980, 0x0001, 0x200c, 0x1078, 0x3445, 0x1078, 0x316f, 0x88ff,
++      0x0040, 0x3246, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5,
++      0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x3242, 0x781b, 0x0053,
++      0x0078, 0x212b, 0x781b, 0x0067, 0x0078, 0x212b, 0x7e58, 0xa684,
++      0x0400, 0x00c0, 0x324f, 0x781b, 0x0056, 0x0078, 0x212b, 0x781b,
++      0x0068, 0x0078, 0x212b, 0xa282, 0x0002, 0x00c8, 0x325b, 0xa284,
++      0x0001, 0x0040, 0x3265, 0x7148, 0xa188, 0x0000, 0x210c, 0xa18c,
++      0x2000, 0x00c0, 0x3265, 0x2011, 0x0000, 0x1078, 0x336b, 0x1078,
++      0x329a, 0x1078, 0x31fe, 0x7858, 0xa085, 0x0004, 0x785a, 0x781b,
++      0x0067, 0x0078, 0x212b, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011,
++      0x0001, 0xa084, 0x2000, 0x00c0, 0x328a, 0x6014, 0xa084, 0x0040,
++      0x00c0, 0x3288, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078, 0x3297,
++      0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003,
++      0x7aaa, 0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200, 0x6822, 0x027f,
++      0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff, 0x0040, 0x32a2,
++      0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4, 0xa084,
++      0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084, 0xffef,
++      0x6006, 0x0c7f, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040,
++      0x32bc, 0x007f, 0x0078, 0x32bf, 0x007f, 0x0078, 0x3301, 0xa684,
++      0x0020, 0x0040, 0x3301, 0x7888, 0xa084, 0x0040, 0x0040, 0x3301,
++      0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x32cf, 0x8000, 0xa005,
++      0x0040, 0x32e5, 0x831b, 0x00c8, 0x32d8, 0x8001, 0x0040, 0x32fd,
++      0xa684, 0x4000, 0x0040, 0x32e5, 0x78b8, 0x801b, 0x00c8, 0x32e1,
++      0x8000, 0xa084, 0x003f, 0x00c0, 0x32fd, 0xa6b4, 0xbfff, 0x7e5a,
++      0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x32f1, 0xa291,
++      0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x3a5e, 0x781b,
++      0x0065, 0x1078, 0x392f, 0x0078, 0x212b, 0x781b, 0x0065, 0x0078,
++      0x212b, 0x781b, 0x0068, 0x0078, 0x212b, 0x1078, 0x3337, 0x781b,
++      0x0067, 0x0078, 0x212b, 0x1078, 0x3323, 0x781b, 0x0067, 0x0078,
++      0x212b, 0x6827, 0x0002, 0x1078, 0x332b, 0x78e4, 0xa084, 0x0030,
++      0x0040, 0x2133, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2133, 0x781b,
++      0x0067, 0x0078, 0x212b, 0x2001, 0x0005, 0x0078, 0x3339, 0x2001,
++      0x000c, 0x0078, 0x3339, 0x2001, 0x0006, 0x0078, 0x3339, 0x2001,
++      0x000d, 0x0078, 0x3339, 0x2001, 0x0009, 0x0078, 0x3339, 0x2001,
++      0x0007, 0x789b, 0x007e, 0x78aa, 0xa6b5, 0x0008, 0x7e5a, 0x007c,
++      0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0,
++      0x3f80, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040,
++      0x3359, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008,
++      0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040,
++      0x3369, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010,
++      0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab,
++      0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004,
++      0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab,
++      0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, 0x789b,
++      0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff,
++      0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0,
++      0x2001, 0x3d46, 0x2004, 0xa082, 0x0028, 0x0040, 0x33a7, 0x2021,
++      0x342c, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x33ad, 0x2021,
++      0x3438, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404,
++      0xa084, 0xfff0, 0xa106, 0x0040, 0x33bc, 0x8420, 0x2300, 0xa210,
++      0x0070, 0x33bc, 0x0078, 0x33af, 0x157f, 0x007c, 0x157e, 0x2011,
++      0x3d46, 0x2214, 0xa282, 0x0032, 0x0048, 0x33d2, 0x0040, 0x33d6,
++      0x2021, 0x341e, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032,
++      0x0078, 0x33e8, 0xa282, 0x0028, 0x0040, 0x33e0, 0x2021, 0x342c,
++      0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064, 0x0078, 0x33e8,
++      0x2021, 0x3438, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064,
++      0x2200, 0xa502, 0x0040, 0x33f8, 0x0048, 0x33f8, 0x8420, 0x2300,
++      0xa210, 0x0070, 0x33f5, 0x0078, 0x33e8, 0x157f, 0xa006, 0x007c,
++      0x157f, 0xa582, 0x0064, 0x00c8, 0x3403, 0x7808, 0xa085, 0x0070,
++      0x780a, 0x0078, 0x3403, 0x78ec, 0xa084, 0x0300, 0x0040, 0x340b,
++      0x2404, 0x0078, 0x341c, 0x2404, 0xa09e, 0x1102, 0x00c0, 0x341c,
++      0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048, 0x341b, 0x2001,
++      0x1201, 0x0078, 0x341c, 0x2404, 0xa005, 0x007c, 0x1102, 0x3002,
++      0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806,
++      0x7a06, 0x0c07, 0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202,
++      0x7202, 0x6605, 0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05,
++      0x2202, 0x3202, 0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604,
++      0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046,
++      0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003,
++      0x8003, 0x8003, 0xa105, 0xa0e0, 0x4000, 0x007c, 0x79d8, 0x7adc,
++      0x78d0, 0x801b, 0x00c8, 0x345d, 0x8000, 0xa084, 0x003f, 0xa108,
++      0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3d40,
++      0x2091, 0x8000, 0x2104, 0x0079, 0x346d, 0x34a3, 0x3477, 0x3477,
++      0x3477, 0x3477, 0x3477, 0x3477, 0x3475, 0x1078, 0x20c8, 0x784b,
++      0x0004, 0x7848, 0xa084, 0x0004, 0x00c0, 0x3479, 0x784b, 0x0008,
++      0x7848, 0xa084, 0x0008, 0x00c0, 0x3480, 0x68b4, 0xa085, 0x4000,
++      0x68b6, 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080,
++      0x00c0, 0x34a3, 0x0018, 0x34a3, 0x681c, 0xa084, 0x0020, 0x00c0,
++      0x34a1, 0x0e7e, 0x2071, 0x3d40, 0x1078, 0x34ea, 0x0e7f, 0x0078,
++      0x34a3, 0x781b, 0x00e4, 0x2091, 0x8001, 0x0f7f, 0x007c, 0x0c7e,
++      0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
++      0x3f80, 0x6004, 0xa084, 0x000a, 0x00c0, 0x34d8, 0x6108, 0xa194,
++      0xff00, 0x0040, 0x34d8, 0xa18c, 0x00ff, 0x2001, 0x0019, 0xa106,
++      0x0040, 0x34c9, 0x2001, 0x0032, 0xa106, 0x0040, 0x34cd, 0x0078,
++      0x34d1, 0x2009, 0x0020, 0x0078, 0x34d3, 0x2009, 0x003f, 0x0078,
++      0x34d3, 0x2011, 0x0000, 0x2100, 0xa205, 0x600a, 0x6004, 0x6006,
++      0x0c7f, 0x007c, 0x781b, 0x0068, 0x0078, 0x212b, 0x781b, 0x0067,
++      0x0078, 0x212b, 0x781b, 0x0056, 0x0078, 0x212b, 0x781b, 0x0053,
++      0x0078, 0x212b, 0x2009, 0x3d1e, 0x210c, 0xa186, 0x0000, 0x0040,
++      0x34fe, 0xa186, 0x0001, 0x0040, 0x3501, 0x2009, 0x3d35, 0x200b,
++      0x000b, 0x70a3, 0x0001, 0x781b, 0x0047, 0x007c, 0x781b, 0x00dd,
++      0x007c, 0x2009, 0x3d35, 0x200b, 0x000a, 0x007c, 0x2009, 0x3d1e,
++      0x210c, 0xa186, 0x0000, 0x0040, 0x3521, 0xa186, 0x0001, 0x0040,
++      0x351b, 0x2009, 0x3d35, 0x200b, 0x000b, 0x70a3, 0x0001, 0x781b,
++      0x0047, 0x0078, 0x212b, 0x2009, 0x3d35, 0x200b, 0x000a, 0x0078,
++      0x212b, 0x781b, 0x00dc, 0x0078, 0x212b, 0x781b, 0x00e4, 0x0078,
++      0x212b, 0x781b, 0x00e3, 0x0078, 0x212b, 0x781b, 0x009f, 0x0078,
++      0x212b, 0x781b, 0x009e, 0x0078, 0x212b, 0x6818, 0xa084, 0x8000,
++      0x0040, 0x353c, 0x681b, 0x001d, 0x70a3, 0x0001, 0x781b, 0x0047,
++      0x0078, 0x212b, 0x007e, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3559,
++      0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005,
++      0x78ec, 0xa084, 0x0021, 0x0040, 0x3559, 0x7808, 0xa085, 0x0002,
++      0x780a, 0x007f, 0x007c, 0x7808, 0xa085, 0x0002, 0x780a, 0x007c,
++      0x007e, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3561, 0x0098, 0x356c,
++      0x007f, 0x789a, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a,
++      0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
++      0x357b, 0x0098, 0x3579, 0x007f, 0x789a, 0x78ac, 0x007e, 0x7808,
++      0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0001, 0x00c0,
++      0x2b9b, 0xa784, 0x0070, 0x0040, 0x3595, 0x0c7e, 0x2d60, 0x2f68,
++      0x1078, 0x2073, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
++      0x35a2, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2133,
++      0x0078, 0x34da, 0xa784, 0x0004, 0x0040, 0x35d5, 0x78b8, 0xa084,
++      0x4001, 0x0040, 0x35d5, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
++      0x0040, 0x2133, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
++      0x35d5, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00e4,
++      0x0078, 0x212b, 0x784b, 0x0008, 0x6818, 0xa084, 0x8000, 0x0040,
++      0x35d1, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, 0x35d1, 0x681b,
++      0x0007, 0x1078, 0x34ea, 0x0078, 0x212b, 0x681b, 0x0003, 0x7858,
++      0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000, 0x784b,
++      0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x25fa, 0x0018, 0x212b,
++      0x0078, 0x330b, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
++      0x8003, 0xa080, 0x3f80, 0x2060, 0x2048, 0x704a, 0x6000, 0x704e,
++      0x6004, 0x7052, 0x2a60, 0x007c, 0x0020, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0062, 0x000a,
++      0x0014, 0x0014, 0x9848, 0x0014, 0x0014, 0x98f8, 0x98e7, 0x0014,
++      0x0014, 0x0014, 0x0080, 0x00bf, 0x0100, 0x0402, 0x2008, 0xf880,
++      0x0018, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0xa200, 0x8838,
++      0x3806, 0x8839, 0x28c2, 0x9cc0, 0xa805, 0x0864, 0xa83f, 0x3008,
++      0x28c1, 0x9cc0, 0xa201, 0x300c, 0x2847, 0x8161, 0x846a, 0x8000,
++      0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2, 0x9ca1, 0xa8f3, 0x0864,
++      0xa82d, 0x300c, 0xa801, 0x3008, 0x28e1, 0x9ca1, 0x280e, 0xa204,
++      0x64c0, 0x6de0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576,
++      0x8677, 0xa810, 0x7861, 0x883e, 0xa80d, 0x282c, 0xa205, 0x64a0,
++      0x6de0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576, 0x8677,
++      0xa801, 0x883e, 0x206b, 0x28c1, 0x9cc0, 0x2044, 0x2103, 0x20a2,
++      0x2081, 0xa8da, 0xa207, 0x2901, 0xa80a, 0x0014, 0xa203, 0x8000,
++      0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e,
++      0x866f, 0x0704, 0x3008, 0x9ca1, 0x0014, 0xa202, 0x8000, 0x85a4,
++      0x3009, 0x84a8, 0x19e2, 0xf844, 0x856e, 0x883f, 0x08e6, 0xa8f5,
++      0xf861, 0xa8ec, 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0,
++      0x9532, 0xfaa2, 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2,
++      0x84a8, 0xd6e0, 0x1fe6, 0x0014, 0xa206, 0x6865, 0x817e, 0x842a,
++      0x1dc1, 0x8823, 0x0016, 0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4,
++      0x8160, 0x842a, 0xf021, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd,
++      0x0011, 0x20d4, 0x8822, 0x0016, 0x8000, 0x2848, 0x1011, 0xa8fc,
++      0x3008, 0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd, 0xa885, 0x3008,
++      0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017, 0x300c, 0x8000, 0x85a4,
++      0x1de2, 0xdac1, 0x0014, 0x0210, 0xa801, 0x0014, 0x26e0, 0x873a,
++      0xfaa2, 0x19f2, 0x1fe2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x3806,
++      0x0210, 0x9cca, 0x0704, 0x0000, 0x127e, 0x2091, 0x2200, 0x2049,
++      0x36ec, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215, 0x7008, 0xa084,
++      0xfff7, 0xa205, 0x0040, 0x36fe, 0x0078, 0x3701, 0x127f, 0x2000,
++      0x007c, 0x7000, 0xa084, 0x0001, 0x00c0, 0x372f, 0x7108, 0x8103,
++      0x00c8, 0x370e, 0x1078, 0x381c, 0x0078, 0x3706, 0x700c, 0xa08c,
++      0x00ff, 0x0040, 0x372f, 0x7004, 0x8004, 0x00c8, 0x3726, 0x7014,
++      0xa005, 0x00c0, 0x3722, 0x7010, 0xa005, 0x0040, 0x3726, 0xa102,
++      0x00c8, 0x3706, 0x7007, 0x0010, 0x0078, 0x372f, 0x8aff, 0x0040,
++      0x372f, 0x1078, 0x3a35, 0x00c0, 0x3729, 0x0040, 0x3706, 0x1078,
++      0x37ac, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x6428, 0x84ff,
++      0x0040, 0x3762, 0x2c70, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3772,
++      0x273c, 0x87fb, 0x00c0, 0x3750, 0x0048, 0x3748, 0x1078, 0x20c8,
++      0x609c, 0xa075, 0x0040, 0x3762, 0x0078, 0x373b, 0x2039, 0x3767,
++      0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0040,
++      0x3762, 0x8738, 0x2704, 0xa005, 0x00c0, 0x3751, 0x709c, 0xa075,
++      0x00c0, 0x373b, 0x007c, 0x0000, 0x0005, 0x0009, 0x000d, 0x0011,
++      0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009, 0x000f, 0x0015,
++      0x001b, 0x0000, 0x0000, 0x3767, 0x3764, 0x0000, 0x0000, 0x8000,
++      0x0000, 0x3767, 0x0000, 0x376f, 0x376c, 0x0000, 0x0000, 0x0000,
++      0x0000, 0x376f, 0x0000, 0x376a, 0x376a, 0x0000, 0x0000, 0x8000,
++      0x0000, 0x376a, 0x0000, 0x3770, 0x3770, 0x0000, 0x0000, 0x0000,
++      0x0000, 0x3770, 0x127e, 0x2091, 0x2200, 0x2079, 0x3d00, 0x2071,
++      0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071,
++      0x0020, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049,
++      0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x37ac, 0x2019, 0x0000,
++      0x7004, 0x8004, 0x00c8, 0x37f8, 0x7007, 0x0012, 0x7108, 0x7008,
++      0xa106, 0x00c0, 0x37b6, 0xa184, 0x01e0, 0x0040, 0x37c1, 0x1078,
++      0x20c8, 0xa184, 0x4000, 0x00c0, 0x37b6, 0xa19c, 0x300c, 0xa386,
++      0x2004, 0x0040, 0x37d3, 0xa386, 0x0008, 0x0040, 0x37de, 0xa386,
++      0x200c, 0x00c0, 0x37b6, 0x7200, 0x8204, 0x0048, 0x37de, 0x730c,
++      0xa384, 0x00ff, 0x0040, 0x37de, 0x1078, 0x20c8, 0x7007, 0x0012,
++      0x7000, 0xa084, 0x0001, 0x00c0, 0x37f8, 0x7008, 0xa084, 0x01e0,
++      0x00c0, 0x37f8, 0x7310, 0x7014, 0xa305, 0x0040, 0x37f8, 0x710c,
++      0xa184, 0x0300, 0x00c0, 0x37f8, 0xa184, 0x00ff, 0x00c0, 0x37ac,
++      0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0,
++      0x37fc, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048, 0x3801, 0x7003,
++      0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e, 0x127e, 0x157e,
++      0x2091, 0x2200, 0x7108, 0x1078, 0x381c, 0x157f, 0x127f, 0x2091,
++      0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x7500, 0x730c, 0xa384,
++      0x0300, 0x00c0, 0x385e, 0xa184, 0x01e0, 0x00c0, 0x3882, 0x7108,
++      0xa184, 0x01e0, 0x00c0, 0x3882, 0x2001, 0x04fd, 0x2004, 0xa082,
++      0x0005, 0x00c8, 0x3852, 0xa184, 0x4000, 0x00c0, 0x3827, 0xa986,
++      0x3a5e, 0x00c0, 0x3852, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040,
++      0x3849, 0xa386, 0x0008, 0x0040, 0x3852, 0xa386, 0x200c, 0x00c0,
++      0x3827, 0x7200, 0x8204, 0x0048, 0x3852, 0x730c, 0xa384, 0x00ff,
++      0x00c0, 0x385e, 0xa184, 0x0007, 0x0079, 0x3856, 0x3860, 0x3872,
++      0x385e, 0x3872, 0x385e, 0x38be, 0x385e, 0x38bc, 0x1078, 0x20c8,
++      0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0,
++      0x386d, 0x2049, 0x0000, 0x0078, 0x3871, 0x1078, 0x3a35, 0x00c0,
++      0x386d, 0x007c, 0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006,
++      0x8aff, 0x00c0, 0x387d, 0x0078, 0x3881, 0x1078, 0x3a35, 0x00c0,
++      0x387d, 0x007c, 0x7007, 0x0012, 0x7108, 0x00e0, 0x3885, 0x2091,
++      0x6000, 0x00e0, 0x3889, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007,
++      0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, 0x3891, 0x7007, 0x0012,
++      0x7108, 0x8103, 0x0048, 0x3896, 0x7003, 0x0000, 0x7000, 0xa005,
++      0x00c0, 0x38aa, 0x7004, 0xa005, 0x00c0, 0x38aa, 0x700c, 0xa005,
++      0x0040, 0x38ac, 0x0078, 0x388d, 0x2049, 0x0000, 0x1078, 0x3463,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x38b7, 0x681b, 0x0002, 0x007c,
++      0x1078, 0x20c8, 0x1078, 0x20c8, 0x1078, 0x391a, 0x7210, 0x7114,
++      0x700c, 0xa09c, 0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000,
++      0x1078, 0x391a, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322,
++      0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x38e1, 0x00c8,
++      0x38e1, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078,
++      0x38c8, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040,
++      0x38ed, 0xa7ba, 0x376c, 0x0078, 0x38ef, 0xa7ba, 0x3764, 0x007f,
++      0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007, 0x0012,
++      0x1078, 0x37ac, 0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, 0x390e,
++      0x609c, 0xa005, 0x0040, 0x3917, 0x2060, 0x6004, 0xa084, 0x000f,
++      0xa080, 0x3772, 0x203c, 0x87fb, 0x1040, 0x20c8, 0x8a51, 0x0040,
++      0x3916, 0x7008, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051,
++      0x0000, 0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x392e,
++      0x6000, 0xa064, 0x00c0, 0x3925, 0x2d60, 0x6004, 0xa084, 0x000f,
++      0xa080, 0x3782, 0x203c, 0x87fb, 0x1040, 0x20c8, 0x007c, 0x127e,
++      0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c,
++      0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804,
++      0xa084, 0x0008, 0x007f, 0x0040, 0x3949, 0xa0b8, 0x376c, 0x0078,
++      0x394b, 0xa0b8, 0x3764, 0x7e08, 0xa6b5, 0x000c, 0x681c, 0xa084,
++      0x0040, 0x0040, 0x3955, 0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004,
++      0xa084, 0x0004, 0x00c0, 0x3957, 0x2400, 0xa305, 0x00c0, 0x3962,
++      0x0078, 0x3988, 0x2c58, 0x2704, 0x6104, 0xac60, 0x6000, 0xa400,
++      0x701a, 0x6004, 0xa301, 0x701e, 0xa184, 0x0008, 0x0040, 0x3978,
++      0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081, 0x0000, 0x7026,
++      0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300, 0xa203, 0x7016,
++      0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, 0x38fb, 0x0078, 0x398a,
++      0x1078, 0x3a35, 0x00c0, 0x3988, 0x127f, 0x2000, 0x007c, 0x127e,
++      0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084,
++      0x0004, 0x00c0, 0x3996, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c,
++      0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x39a0, 0x7007,
++      0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x39a9, 0x7e08, 0xa6b5,
++      0x000c, 0x681c, 0xa084, 0x0020, 0x00c0, 0x39b8, 0xa6b5, 0x0001,
++      0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x3772,
++      0x273c, 0x87fb, 0x00c0, 0x39ce, 0x0048, 0x39c8, 0x1078, 0x20c8,
++      0x689c, 0xa065, 0x0040, 0x39d2, 0x0078, 0x39bb, 0x1078, 0x3a35,
++      0x00c0, 0x39ce, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
++      0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5,
++      0x000c, 0x681c, 0xa084, 0x0040, 0x0040, 0x39e8, 0xa6b5, 0x0001,
++      0x2049, 0x39d5, 0x6828, 0xa055, 0x0040, 0x3a32, 0x2d70, 0x2e60,
++      0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3772, 0x273c, 0x87fb, 0x00c0,
++      0x3a04, 0x0048, 0x39fd, 0x1078, 0x20c8, 0x709c, 0xa075, 0x2060,
++      0x0040, 0x3a32, 0x0078, 0x39f0, 0x2704, 0xae68, 0x6808, 0xa422,
++      0x680c, 0xa31b, 0x0048, 0x3a1f, 0x8a51, 0x00c0, 0x3a11, 0x1078,
++      0x20c8, 0x8738, 0x2704, 0xa005, 0x00c0, 0x3a05, 0x709c, 0xa075,
++      0x2060, 0x0040, 0x3a32, 0x2039, 0x3764, 0x0078, 0x39f0, 0x8422,
++      0x8420, 0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c,
++      0x2300, 0xa11b, 0x00c8, 0x3a2e, 0x1078, 0x20c8, 0x2071, 0x0020,
++      0x0078, 0x3955, 0x127f, 0x2000, 0x007c, 0x7008, 0xa084, 0x0003,
++      0xa086, 0x0003, 0x0040, 0x3a5d, 0x2704, 0xac08, 0x2104, 0x701a,
++      0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012, 0x8108, 0x2104,
++      0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x3a54, 0x8108, 0x2104,
++      0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010,
++      0xa085, 0x0001, 0x7006, 0x1078, 0x38fb, 0x007c, 0x127e, 0x007e,
++      0x0d7e, 0x2091, 0x2200, 0x2049, 0x3a5e, 0x0d7f, 0x087f, 0x7108,
++      0xa184, 0x0003, 0x00c0, 0x3a72, 0x6828, 0xa005, 0x0040, 0x3a80,
++      0x0078, 0x3701, 0x00a0, 0x3a79, 0x7108, 0x1078, 0x381c, 0x0078,
++      0x3a67, 0x7007, 0x0010, 0x00a0, 0x3a7b, 0x7108, 0x1078, 0x381c,
++      0x7008, 0xa086, 0x0008, 0x00c0, 0x3a67, 0x7000, 0xa005, 0x00c0,
++      0x3a67, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
++      0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091, 0x2200,
++      0x0d7f, 0x2049, 0x3a90, 0xad80, 0x0011, 0x20a0, 0x2099, 0x0031,
++      0x700c, 0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002,
++      0x7003, 0x0001, 0x0040, 0x3aaf, 0x8000, 0x80ac, 0x53a5, 0x7007,
++      0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x3ab1, 0x0c7f, 0x2049,
++      0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000,
++      0x007c, 0x2091, 0x6000, 0x2091, 0x8000, 0x78c0, 0xa005, 0x00c0,
++      0x3ad8, 0x798c, 0x70d0, 0xa106, 0x00c0, 0x3ad8, 0x7804, 0xa005,
++      0x0040, 0x3ad8, 0x7807, 0x0000, 0x0068, 0x3ad8, 0x2091, 0x4080,
++      0x7820, 0x8001, 0x7822, 0x00c0, 0x3b5d, 0x7824, 0x7822, 0x783c,
++      0xa005, 0x0040, 0x3ae9, 0x8001, 0x783e, 0x00c0, 0x3ae9, 0x1078,
++      0x3c87, 0x78ec, 0xa005, 0x0040, 0x3b0d, 0x78d4, 0xa005, 0x00c0,
++      0x3b0d, 0x3a10, 0xa284, 0x0002, 0x00c0, 0x3afd, 0x78d7, 0x0007,
++      0x2009, 0xff01, 0x200a, 0x0078, 0x3b0d, 0xa284, 0x0001, 0x00c0,
++      0x3b05, 0x78eb, 0x0000, 0x0078, 0x3b0d, 0x78e8, 0xa005, 0x00c0,
++      0x3b0d, 0x78d7, 0x0008, 0x78eb, 0x0001, 0x2069, 0x3d40, 0x6800,
++      0xa084, 0x0007, 0x0040, 0x3b24, 0xa086, 0x0002, 0x0040, 0x3b24,
++      0x6830, 0xa00d, 0x0040, 0x3b24, 0x2104, 0xa005, 0x0040, 0x3b24,
++      0x8001, 0x200a, 0x0040, 0x3bff, 0x7848, 0xa005, 0x0040, 0x3b2e,
++      0x8001, 0x784a, 0x00c0, 0x3b2e, 0x1078, 0x1f05, 0x68c4, 0xa005,
++      0x0040, 0x3b3a, 0x8001, 0x68c6, 0x00c0, 0x3b3a, 0x68a3, 0x0000,
++      0x68a7, 0x0001, 0x2061, 0x4000, 0x2009, 0x0002, 0x20a9, 0x0100,
++      0x6034, 0xa005, 0x0040, 0x3b50, 0x8001, 0x6036, 0x00c0, 0x3b50,
++      0x6010, 0xa005, 0x0040, 0x3b50, 0x017e, 0x1078, 0x1f05, 0x017f,
++      0xace0, 0x0010, 0x0070, 0x3b56, 0x0078, 0x3b40, 0x8109, 0x0040,
++      0x3b5d, 0x20a9, 0x0100, 0x0078, 0x3b40, 0x1078, 0x3b64, 0x1078,
++      0x3b89, 0x2091, 0x8001, 0x007c, 0x7834, 0x8001, 0x7836, 0x00c0,
++      0x3b88, 0x7838, 0x7836, 0x2091, 0x8000, 0x7844, 0xa005, 0x00c0,
++      0x3b73, 0x2001, 0x0101, 0x8001, 0x7846, 0xa080, 0x6000, 0x2040,
++      0x2004, 0xa065, 0x0040, 0x3b88, 0x6024, 0xa005, 0x0040, 0x3b84,
++      0x8001, 0x6026, 0x0040, 0x3bb8, 0x6000, 0x2c40, 0x0078, 0x3b79,
++      0x007c, 0x7828, 0x8001, 0x782a, 0x00c0, 0x3bb7, 0x782c, 0x782a,
++      0x7830, 0xa005, 0x00c0, 0x3b96, 0x2001, 0x0200, 0x8001, 0x7832,
++      0x8003, 0x8003, 0x8003, 0x8003, 0xa090, 0x4000, 0xa298, 0x0002,
++      0x2304, 0xa084, 0x0008, 0x0040, 0x3bb7, 0xa290, 0x0009, 0x2204,
++      0xa005, 0x0040, 0x3baf, 0x8001, 0x2012, 0x00c0, 0x3bb7, 0x2304,
++      0xa084, 0xfff7, 0xa085, 0x0080, 0x201a, 0x1078, 0x1f05, 0x007c,
++      0x2069, 0x3d40, 0x6800, 0xa005, 0x0040, 0x3bc2, 0x683c, 0xac06,
++      0x0040, 0x3bff, 0x601b, 0x0006, 0x60b4, 0xa084, 0x3f00, 0x601e,
++      0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042,
++      0x6714, 0x6fb6, 0x1078, 0x19f0, 0x6818, 0xa005, 0x0040, 0x3bda,
++      0x8001, 0x681a, 0x6808, 0xa084, 0xffef, 0x680a, 0x6810, 0x8001,
++      0x00d0, 0x3be4, 0x1078, 0x20c8, 0x6812, 0x602f, 0x0000, 0x6033,
++      0x0000, 0x2c68, 0x1078, 0x1b7f, 0x2069, 0x3d40, 0x7944, 0xa184,
++      0x0100, 0x2001, 0x0006, 0x68a2, 0x00c0, 0x3bfa, 0x69ba, 0x2001,
++      0x0004, 0x68a2, 0x1078, 0x1f00, 0x2091, 0x8001, 0x007c, 0x2009,
++      0x3d4f, 0x2164, 0x2069, 0x0100, 0x1078, 0x2073, 0x601b, 0x0006,
++      0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
++      0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, 0x6830, 0xa084,
++      0x0040, 0x0040, 0x3c3b, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
++      0xa084, 0x0004, 0x0040, 0x3c28, 0x0070, 0x3c28, 0x0078, 0x3c1f,
++      0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040,
++      0x3c35, 0x0070, 0x3c35, 0x0078, 0x3c2c, 0x20a9, 0x00fa, 0x0070,
++      0x3c3b, 0x0078, 0x3c37, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b,
++      0x0047, 0x2009, 0x3d68, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091,
++      0x8001, 0x007c, 0x2079, 0x3d00, 0x1078, 0x3c75, 0x1078, 0x3c59,
++      0x1078, 0x3c67, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000,
++      0x007c, 0x2019, 0x0003, 0x2011, 0x3d46, 0x2204, 0xa086, 0x003c,
++      0x0040, 0x3c64, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019,
++      0x0039, 0x2011, 0x3d46, 0x2204, 0xa086, 0x003c, 0x0040, 0x3c72,
++      0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971, 0x2011,
++      0x3d46, 0x2204, 0xa086, 0x003c, 0x0040, 0x3c80, 0x2019, 0x2626,
++      0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c, 0x2069,
++      0x3d40, 0x6a40, 0xa285, 0x0000, 0x0040, 0x3cce, 0x6944, 0xa080,
++      0x3d80, 0x2164, 0x6304, 0x83ff, 0x00c0, 0x3ca1, 0x8211, 0x0040,
++      0x3ca4, 0x8108, 0xa11a, 0x0048, 0x3c91, 0x2009, 0x3d80, 0x0078,
++      0x3c91, 0x7940, 0x793e, 0x007c, 0x2011, 0x0002, 0x2039, 0x0000,
++      0x20a9, 0x0100, 0x1078, 0x19f0, 0x2d00, 0xa088, 0x0002, 0x2168,
++      0x682b, 0x0000, 0x682f, 0x0000, 0x2104, 0xa085, 0x0040, 0x200a,
++      0x2100, 0xa088, 0x0010, 0x0070, 0x3cbf, 0x0078, 0x3caf, 0x8211,
++      0x0040, 0x3cc6, 0x20a9, 0x0100, 0x0078, 0x3caf, 0x2009, 0x3d51,
++      0x200b, 0x3d7f, 0x2009, 0x3d50, 0x200b, 0x0000, 0x007c, 0x4de2
++};
++#else
++/************************************************************************
++ *                                                                    *
++ *            --- ISP1040 Initiator/Target Firmware ---               *
++ *                        32 LUN Support                              *
++ *                                                                    *
++ ************************************************************************/
++/*
++ *    Firmware Version 7.65.00 (14:17 Jul 20, 1999)
++ */
++static const u_int16_t isp_1040_risc_code[] = {
++      0x0078, 0x103a, 0x0000, 0x4057, 0x0000, 0x2043, 0x4f50, 0x5952,
++      0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
++      0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++      0x3130, 0x3230, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
++      0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x372e, 0x3635,
++      0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
++      0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
++      0x3031, 0x2024, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x0048,
++      0x1045, 0x0038, 0x104b, 0x0078, 0x1047, 0x0028, 0x104b, 0x20b9,
++      0x1212, 0x0078, 0x104d, 0x20b9, 0x2222, 0x20c1, 0x0008, 0x2071,
++      0x0010, 0x70c3, 0x0004, 0x20c9, 0x77ff, 0x2089, 0x1186, 0x70c7,
++      0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0007, 0x3f00,
++      0x70d6, 0x20c1, 0x0008, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100,
++      0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64, 0x206b, 0x0a0a, 0xaddc,
++      0x3fff, 0x2b54, 0x205b, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040,
++      0x10bf, 0xa386, 0x000f, 0x0040, 0x1085, 0x2c6a, 0x2a5a, 0x20c1,
++      0x0000, 0x2019, 0x000f, 0x0078, 0x1065, 0x2c6a, 0x2a5a, 0x20c1,
++      0x0008, 0x2009, 0x7fff, 0x2148, 0x2944, 0x204b, 0x0a0a, 0xa9bc,
++      0x3fff, 0x2734, 0x203b, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040,
++      0x10a9, 0x284a, 0x263a, 0x20c1, 0x0004, 0x2009, 0x3fff, 0x2134,
++      0x200b, 0x5050, 0x2114, 0xa286, 0x5050, 0x0040, 0x10aa, 0x0078,
++      0x118e, 0x284a, 0x263a, 0x98c0, 0xa188, 0x1000, 0x212c, 0x200b,
++      0xa5a5, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x10bc, 0x250a, 0xa18a,
++      0x1000, 0x98c1, 0x0078, 0x10c1, 0x250a, 0x0078, 0x10c1, 0x2c6a,
++      0x2a5a, 0x2130, 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x5100, 0x8424,
++      0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0xa192, 0x7800, 0x2009,
++      0x0000, 0x2001, 0x0031, 0x1078, 0x1cba, 0x2218, 0x2079, 0x5100,
++      0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109,
++      0x00c0, 0x10dc, 0x7ef2, 0x8528, 0x7de6, 0x7cea, 0x7bee, 0x7883,
++      0x0000, 0x2031, 0x0030, 0x78cf, 0x0101, 0x780b, 0x0002, 0x780f,
++      0x0002, 0x784f, 0x0003, 0x2069, 0x5140, 0x2001, 0x04fd, 0x2004,
++      0xa082, 0x0005, 0x0048, 0x1104, 0x0038, 0x1100, 0x0078, 0x1108,
++      0x681b, 0x003c, 0x0078, 0x110a, 0x00a8, 0x1108, 0x681b, 0x003c,
++      0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f, 0x0008,
++      0x6813, 0x0005, 0x6823, 0x0000, 0x6827, 0x0006, 0x6817, 0x0008,
++      0x682b, 0x0000, 0x681f, 0x0019, 0x2069, 0x5380, 0x2011, 0x0020,
++      0x2009, 0x0010, 0x680b, 0x080c, 0x680f, 0x0019, 0x6803, 0xfd00,
++      0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004,
++      0x8109, 0x00c0, 0x1122, 0x2069, 0x5400, 0x2009, 0x0002, 0x20a9,
++      0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bf0, 0xa386, 0xfeff,
++      0x00c0, 0x1148, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078, 0x114c,
++      0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x0070, 0x1152,
++      0x0078, 0x1139, 0x8109, 0x00c0, 0x1137, 0x1078, 0x220a, 0x1078,
++      0x482c, 0x1078, 0x1963, 0x1078, 0x4d22, 0x3200, 0xa085, 0x000d,
++      0x2090, 0x70c3, 0x0000, 0x0090, 0x116c, 0x70c0, 0xa086, 0x0002,
++      0x00c0, 0x116c, 0x1078, 0x1284, 0x1078, 0x1196, 0x78cc, 0xa005,
++      0x00c0, 0x117a, 0x1078, 0x1ce3, 0x0010, 0x1180, 0x0068, 0x1180,
++      0x1078, 0x20e9, 0x0010, 0x1180, 0x0068, 0x1180, 0x1078, 0x1a48,
++      0x00e0, 0x116c, 0x1078, 0x4ba9, 0x0078, 0x116c, 0x118e, 0x1190,
++      0x240b, 0x240b, 0x48ad, 0x48ad, 0x240b, 0x240b, 0x0078, 0x118e,
++      0x0078, 0x1190, 0x0078, 0x1192, 0x0078, 0x1194, 0x0068, 0x1201,
++      0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1201, 0x7814,
++      0xa005, 0x00c0, 0x11a7, 0x0010, 0x1202, 0x0078, 0x1201, 0x2009,
++      0x515b, 0x2104, 0xa005, 0x00c0, 0x1201, 0x2009, 0x5164, 0x200b,
++      0x0000, 0x7914, 0xa186, 0x0042, 0x00c0, 0x11cc, 0x7816, 0x2009,
++      0x5162, 0x2164, 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca,
++      0x611c, 0xa18c, 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce,
++      0x1078, 0x1948, 0x0078, 0x11ff, 0x7814, 0xa086, 0x0018, 0x00c0,
++      0x11d3, 0x1078, 0x165a, 0x7817, 0x0000, 0x2009, 0x5162, 0x2104,
++      0xa065, 0x0040, 0x11ef, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x19b3,
++      0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c, 0x6007,
++      0x0103, 0x1078, 0x1924, 0x00c0, 0x11fb, 0x1078, 0x1948, 0x2009,
++      0x5162, 0x200b, 0x0000, 0x2009, 0x515c, 0x2104, 0x200b, 0x0000,
++      0xa005, 0x0040, 0x11ff, 0x2001, 0x4005, 0x0078, 0x1286, 0x0078,
++      0x1284, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000,
++      0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1252, 0x2038,
++      0x0079, 0x1212, 0x1284, 0x12e5, 0x12a9, 0x12fe, 0x130d, 0x1313,
++      0x12a0, 0x1748, 0x1317, 0x1298, 0x12ad, 0x12af, 0x12b1, 0x12b3,
++      0x174d, 0x1298, 0x1329, 0x1360, 0x1672, 0x1742, 0x12b5, 0x1591,
++      0x15ad, 0x15c9, 0x15f4, 0x154a, 0x1558, 0x156c, 0x1580, 0x13df,
++      0x1298, 0x138d, 0x1393, 0x1398, 0x139d, 0x13a3, 0x13a8, 0x13ad,
++      0x13b2, 0x13b7, 0x13bb, 0x13d0, 0x13dc, 0x1298, 0x1298, 0x1298,
++      0x1298, 0x13eb, 0x13f4, 0x1403, 0x1429, 0x1433, 0x143a, 0x1480,
++      0x148f, 0x149e, 0x14b0, 0x152a, 0x153a, 0x1298, 0x1298, 0x1298,
++      0x1298, 0x153f, 0xa0bc, 0xffa0, 0x00c0, 0x1298, 0x2038, 0xa084,
++      0x001f, 0x0079, 0x125b, 0x1786, 0x1789, 0x1799, 0x1298, 0x1298,
++      0x18df, 0x18fc, 0x1298, 0x1298, 0x1298, 0x1900, 0x1908, 0x1298,
++      0x1298, 0x1298, 0x1298, 0x12db, 0x12f4, 0x131f, 0x1356, 0x1668,
++      0x1764, 0x1778, 0x1298, 0x1829, 0x190e, 0x18bb, 0x18c5, 0x18c9,
++      0x18d7, 0x1298, 0x1298, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078,
++      0x1286, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068,
++      0x1287, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x00e0,
++      0x128f, 0x00e0, 0x1291, 0x0068, 0x1291, 0x2091, 0x4080, 0x007c,
++      0x70c3, 0x4001, 0x0078, 0x1287, 0x70c3, 0x4006, 0x0078, 0x1287,
++      0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078,
++      0x1284, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x1284, 0x0078,
++      0x1284, 0x0078, 0x1284, 0x0078, 0x1284, 0x2091, 0x8000, 0x70c3,
++      0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
++      0x0007, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031,
++      0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061,
++      0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091,
++      0x4080, 0x0078, 0x0455, 0x1078, 0x1b53, 0x00c0, 0x129c, 0x75d8,
++      0x74dc, 0x75da, 0x74de, 0x0078, 0x12e8, 0x2029, 0x0000, 0x2520,
++      0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1a8d, 0x0040, 0x1284,
++      0x70c3, 0x4002, 0x0078, 0x1284, 0x1078, 0x1b53, 0x00c0, 0x129c,
++      0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1301, 0x2029, 0x0000,
++      0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1aed, 0x0040,
++      0x1284, 0x70c3, 0x4002, 0x0078, 0x1284, 0x71c4, 0x70c8, 0x2114,
++      0x200a, 0x0078, 0x1282, 0x71c4, 0x2114, 0x0078, 0x1282, 0x70c7,
++      0x0007, 0x70cb, 0x0041, 0x70cf, 0x0000, 0x0078, 0x1284, 0x1078,
++      0x1b53, 0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
++      0x132c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
++      0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x1350, 0x8001,
++      0x7892, 0xa084, 0xfc00, 0x0040, 0x1345, 0x78cc, 0xa085, 0x0001,
++      0x78ce, 0x2001, 0x4005, 0x0078, 0x1286, 0x7a9a, 0x7b9e, 0x7da2,
++      0x7ea6, 0x7c96, 0x78cc, 0xa084, 0xfffc, 0x78ce, 0x0078, 0x1354,
++      0x78cc, 0xa085, 0x0001, 0x78ce, 0x0078, 0x1284, 0x1078, 0x1b53,
++      0x00c0, 0x129c, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1363,
++      0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6,
++      0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1387, 0x8001, 0x78ae,
++      0xa084, 0xfc00, 0x0040, 0x137c, 0x78cc, 0xa085, 0x0100, 0x78ce,
++      0x2001, 0x4005, 0x0078, 0x1286, 0x7ab6, 0x7bba, 0x7dbe, 0x7ec2,
++      0x7cb2, 0x78cc, 0xa084, 0xfcff, 0x78ce, 0x0078, 0x138b, 0x78cc,
++      0xa085, 0x0100, 0x78ce, 0x0078, 0x1284, 0x2009, 0x5161, 0x210c,
++      0x7aec, 0x0078, 0x1282, 0x2009, 0x5141, 0x210c, 0x0078, 0x1283,
++      0x2009, 0x5142, 0x210c, 0x0078, 0x1283, 0x2061, 0x5140, 0x610c,
++      0x6210, 0x0078, 0x1282, 0x2009, 0x5145, 0x210c, 0x0078, 0x1283,
++      0x2009, 0x5146, 0x210c, 0x0078, 0x1283, 0x2009, 0x5148, 0x210c,
++      0x0078, 0x1283, 0x2009, 0x5149, 0x210c, 0x0078, 0x1283, 0x7908,
++      0x7a0c, 0x0078, 0x1282, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003,
++      0x8003, 0x8003, 0xa0e8, 0x5380, 0x6a00, 0x6804, 0xa084, 0x0008,
++      0x0040, 0x13cd, 0x6b08, 0x0078, 0x13ce, 0x6b0c, 0x0078, 0x1281,
++      0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091,
++      0x8001, 0x2708, 0x0078, 0x1281, 0x794c, 0x0078, 0x1283, 0x77c4,
++      0x1078, 0x1973, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091,
++      0x8001, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x127c,
++      0x1078, 0x22e2, 0x0078, 0x1281, 0x71c4, 0xa182, 0x0010, 0x00c8,
++      0x127c, 0x2011, 0x5141, 0x2204, 0x007e, 0x2112, 0x1078, 0x229b,
++      0x017f, 0x0078, 0x1283, 0x71c4, 0x2011, 0x1421, 0x20a9, 0x0008,
++      0x2204, 0xa106, 0x0040, 0x1413, 0x8210, 0x0070, 0x1411, 0x0078,
++      0x1408, 0x0078, 0x127c, 0xa292, 0x1421, 0x027e, 0x2011, 0x5142,
++      0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x22a7, 0x017f, 0x0078,
++      0x1283, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032,
++      0x004b, 0x2061, 0x5140, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8,
++      0x6012, 0x0078, 0x1282, 0x2061, 0x5140, 0x6114, 0x70c4, 0x6016,
++      0x0078, 0x1283, 0x2061, 0x5140, 0x71c4, 0x2011, 0x0004, 0x601f,
++      0x0019, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x145b, 0x2011,
++      0x0005, 0x601f, 0x0019, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040,
++      0x145b, 0x2011, 0x0006, 0x601f, 0x000c, 0x2019, 0x2222, 0xa186,
++      0x003c, 0x00c0, 0x127c, 0x6018, 0x007e, 0x611a, 0x7800, 0xa084,
++      0x0001, 0x00c0, 0x1476, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
++      0x0048, 0x146e, 0x0038, 0x1472, 0x0078, 0x1476, 0x0028, 0x1472,
++      0x0078, 0x1476, 0x2019, 0x2222, 0x0078, 0x1478, 0x2019, 0x1212,
++      0x23b8, 0x1078, 0x22b8, 0x1078, 0x4d22, 0x017f, 0x0078, 0x1283,
++      0x71c4, 0xa184, 0xffcf, 0x00c0, 0x127c, 0x2011, 0x5148, 0x2204,
++      0x2112, 0x007e, 0x1078, 0x22da, 0x017f, 0x0078, 0x1283, 0x71c4,
++      0xa182, 0x0010, 0x00c8, 0x127c, 0x2011, 0x5149, 0x2204, 0x007e,
++      0x2112, 0x1078, 0x22c9, 0x017f, 0x0078, 0x1283, 0x71c4, 0x72c8,
++      0xa184, 0xfffd, 0x00c0, 0x127b, 0xa284, 0xfffd, 0x00c0, 0x127b,
++      0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x1282,
++      0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8,
++      0x5380, 0x2019, 0x0000, 0x72c8, 0xa284, 0x0080, 0x0040, 0x14c6,
++      0x6c14, 0x84ff, 0x00c0, 0x14c6, 0x6817, 0x0040, 0xa284, 0x0040,
++      0x0040, 0x14d0, 0x6c10, 0x84ff, 0x00c0, 0x14d0, 0x6813, 0x0001,
++      0x6800, 0x007e, 0xa226, 0x0040, 0x14f3, 0x6a02, 0xa484, 0x2000,
++      0x0040, 0x14dc, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x14e2,
++      0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x14f3, 0x810f, 0xa284,
++      0x4000, 0x0040, 0x14ef, 0x1078, 0x22fc, 0x0078, 0x14f3, 0x1078,
++      0x22ee, 0x0078, 0x14f3, 0x72cc, 0x6808, 0xa206, 0x0040, 0x1522,
++      0xa2a4, 0x00ff, 0x2061, 0x5140, 0x6118, 0xa186, 0x0028, 0x0040,
++      0x1509, 0xa186, 0x0032, 0x0040, 0x150f, 0xa186, 0x003c, 0x0040,
++      0x1515, 0xa482, 0x0064, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482,
++      0x0050, 0x0048, 0x151f, 0x0078, 0x1519, 0xa482, 0x0043, 0x0048,
++      0x151f, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x127d, 0x6a0a,
++      0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4,
++      0x0078, 0x1281, 0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a14,
++      0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
++      0x0078, 0x1281, 0x70c4, 0x794c, 0x784e, 0x0078, 0x1283, 0x71c4,
++      0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x127c, 0x1078, 0x230a,
++      0x0078, 0x1281, 0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a08,
++      0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
++      0x77c4, 0x1078, 0x1973, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
++      0x6a0a, 0x6804, 0xa005, 0x0040, 0x1567, 0x1078, 0x21d2, 0x2091,
++      0x8001, 0x2708, 0x0078, 0x1282, 0x77c4, 0x1078, 0x1973, 0x2091,
++      0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040,
++      0x157b, 0x1078, 0x21d2, 0x2091, 0x8001, 0x2708, 0x0078, 0x1282,
++      0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
++      0x8000, 0x1078, 0x1980, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078,
++      0x1282, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078,
++      0x19e1, 0x00c0, 0x15a9, 0x6818, 0xa005, 0x0040, 0x15a9, 0x2708,
++      0x1078, 0x231a, 0x00c0, 0x15a9, 0x7817, 0x0015, 0x2091, 0x8001,
++      0x007c, 0x2091, 0x8001, 0x0078, 0x1284, 0x77c4, 0x77c6, 0x2041,
++      0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
++      0x1980, 0x2061, 0x5140, 0x606f, 0x0003, 0x6782, 0x6093, 0x000f,
++      0x6073, 0x0000, 0x7817, 0x0016, 0x1078, 0x21d2, 0x2091, 0x8001,
++      0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091,
++      0x8000, 0x2061, 0x5140, 0x606f, 0x0002, 0x6073, 0x0000, 0x6782,
++      0x6093, 0x000f, 0x7817, 0x0017, 0x1078, 0x21d2, 0x2091, 0x8001,
++      0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000,
++      0x1078, 0x1980, 0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0,
++      0x15e8, 0x2091, 0x8001, 0x007c, 0x78cc, 0xa084, 0x0003, 0x00c0,
++      0x1618, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
++      0x0008, 0x1078, 0x1973, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a,
++      0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1601, 0xa7bc,
++      0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1601,
++      0x2091, 0x8000, 0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040,
++      0x1641, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004,
++      0x0040, 0x162e, 0x0070, 0x162e, 0x0078, 0x1625, 0x684b, 0x0009,
++      0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x163b, 0x0070,
++      0x163b, 0x0078, 0x1632, 0x20a9, 0x00fa, 0x0070, 0x1641, 0x0078,
++      0x163d, 0x2079, 0x5100, 0x7817, 0x0018, 0x2061, 0x5140, 0x606f,
++      0x0001, 0x6073, 0x0000, 0x6093, 0x000f, 0x78cc, 0xa085, 0x0002,
++      0x78ce, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0048, 0x2091,
++      0x8001, 0x007c, 0x78cc, 0xa084, 0xfffd, 0x78ce, 0xa084, 0x0001,
++      0x00c0, 0x1664, 0x1078, 0x1a2b, 0x71c4, 0x71c6, 0x794a, 0x007c,
++      0x1078, 0x1b53, 0x00c0, 0x129c, 0x75d8, 0x74dc, 0x75da, 0x74de,
++      0x0078, 0x1675, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc,
++      0x71c6, 0x73ca, 0x72ce, 0x2079, 0x5100, 0x2091, 0x8000, 0x1078,
++      0x192e, 0x2091, 0x8001, 0x0040, 0x172c, 0x20a9, 0x0005, 0x20a1,
++      0x5118, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0020,
++      0x1078, 0x1929, 0x0040, 0x1698, 0x1078, 0x1948, 0x0078, 0x172c,
++      0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x16fb, 0x0c7e,
++      0x2c68, 0x2091, 0x8000, 0x1078, 0x192e, 0x2091, 0x8001, 0x0040,
++      0x16cc, 0x2c00, 0x689e, 0x8109, 0x00c0, 0x16a0, 0x609f, 0x0000,
++      0x0c7f, 0x0c7e, 0x7218, 0x731c, 0x7420, 0x7524, 0x2c68, 0x689c,
++      0xa065, 0x0040, 0x16fa, 0x2009, 0x0020, 0x1078, 0x1929, 0x00c0,
++      0x16e3, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x16cc,
++      0x2d00, 0x6002, 0x0078, 0x16b2, 0x0c7f, 0x0c7e, 0x609c, 0x2060,
++      0x1078, 0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009,
++      0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078, 0x1924, 0x1078,
++      0x1948, 0x0078, 0x172c, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078,
++      0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1730, 0x2009, 0x000c,
++      0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x1924, 0x1078, 0x1948,
++      0x0078, 0x172c, 0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091,
++      0x8000, 0x7817, 0x0012, 0x0e7e, 0x2071, 0x5140, 0x706f, 0x0005,
++      0x7073, 0x0000, 0x7376, 0x727a, 0x747e, 0x7082, 0x7087, 0x0000,
++      0x2c00, 0x708a, 0x708f, 0x0000, 0xa02e, 0x2530, 0x611c, 0x61a2,
++      0xa184, 0x0060, 0x0040, 0x171e, 0x1078, 0x47c2, 0x0e7f, 0x6596,
++      0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x1078,
++      0x21d2, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1287,
++      0x20a9, 0x0005, 0x2099, 0x5118, 0x2091, 0x8000, 0x530a, 0x2091,
++      0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
++      0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x1284,
++      0x71c4, 0x71c6, 0x2168, 0x0078, 0x174f, 0x2069, 0x1000, 0x690c,
++      0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1751, 0xa285,
++      0x0000, 0x00c0, 0x175f, 0x70c3, 0x4000, 0x0078, 0x1761, 0x70c3,
++      0x4003, 0x70ca, 0x0078, 0x1287, 0x2011, 0x5167, 0x220c, 0x70c4,
++      0x8003, 0x0048, 0x1771, 0x1078, 0x3b7f, 0xa184, 0x7fff, 0x0078,
++      0x1775, 0x1078, 0x3b72, 0xa185, 0x8000, 0x2012, 0x0078, 0x1283,
++      0x71c4, 0x1078, 0x3b69, 0x6100, 0x2001, 0x5167, 0x2004, 0xa084,
++      0x8000, 0xa10d, 0x6204, 0x6308, 0x0078, 0x1281, 0x79e4, 0x0078,
++      0x1283, 0x71c4, 0x71c6, 0x2198, 0x20a1, 0x0042, 0x20a9, 0x0004,
++      0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, 0x0004, 0x53a3, 0x0078,
++      0x1284, 0x70c4, 0x2068, 0x2079, 0x5100, 0x2091, 0x8000, 0x1078,
++      0x192e, 0x2091, 0x8001, 0x0040, 0x1825, 0x6007, 0x0001, 0x600b,
++      0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x000f,
++      0xa284, 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016,
++      0xa284, 0x0800, 0x0040, 0x17c0, 0x601b, 0x000a, 0x0078, 0x17c6,
++      0xa284, 0x1000, 0x0040, 0x17c6, 0x601b, 0x000c, 0xa284, 0x0300,
++      0x0040, 0x17cf, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085,
++      0x0001, 0x601e, 0x6023, 0x0000, 0x6027, 0x0000, 0xa284, 0x0400,
++      0x0040, 0x17dc, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b,
++      0x20a0, 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0,
++      0x17f1, 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078,
++      0x17fb, 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c,
++      0x6552, 0x6596, 0x669a, 0x6014, 0x2091, 0x8000, 0x7817, 0x0042,
++      0x2c08, 0x2061, 0x5140, 0x606f, 0x0005, 0x6073, 0x0000, 0x6077,
++      0x0000, 0x607b, 0x0000, 0x607f, 0x0000, 0x6082, 0x618a, 0xa284,
++      0x0400, 0x608e, 0x2091, 0x8001, 0x0e7e, 0x2071, 0x0020, 0x7007,
++      0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x2091, 0x8000,
++      0x1078, 0x21d2, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078,
++      0x1287, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000, 0x2071,
++      0x5140, 0x2079, 0x0100, 0x2061, 0x0010, 0x70a0, 0xa06d, 0x0040,
++      0x18b1, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0007, 0x0040, 0x1844,
++      0xa286, 0x000f, 0x00c0, 0x18b1, 0x691c, 0xa184, 0x0080, 0x00c0,
++      0x18b1, 0x6824, 0xa18c, 0xff00, 0xa085, 0x0019, 0x6826, 0x71b0,
++      0x81ff, 0x0040, 0x1867, 0x0d7e, 0x2069, 0x0020, 0x6807, 0x0010,
++      0x6908, 0x6808, 0xa106, 0x00c0, 0x1858, 0x690c, 0x680c, 0xa106,
++      0x00c0, 0x185d, 0xa184, 0x00ff, 0x00c0, 0x185d, 0x0d7f, 0x78b8,
++      0xa084, 0x801f, 0x00c0, 0x1867, 0x7848, 0xa085, 0x000c, 0x784a,
++      0x71b0, 0x81ff, 0x0040, 0x188a, 0x70b3, 0x0000, 0x0d7e, 0x2069,
++      0x0020, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008, 0x00c0, 0x187b,
++      0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1882, 0x6807,
++      0x0002, 0x0d7f, 0x61c4, 0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce,
++      0x0e7e, 0x2071, 0x5100, 0x7266, 0x736a, 0xae80, 0x0019, 0x0e7f,
++      0x7848, 0xa084, 0x000c, 0x00c0, 0x1898, 0x1078, 0x46db, 0x78a3,
++      0x0000, 0x7858, 0xa084, 0xedff, 0x785a, 0x70b4, 0xa080, 0x00df,
++      0x781a, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x0078,
++      0x1284, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x2001,
++      0x4005, 0x0078, 0x1286, 0x7980, 0x71c6, 0x71c4, 0xa182, 0x0003,
++      0x00c8, 0x127c, 0x7982, 0x0078, 0x1284, 0x7980, 0x71c6, 0x0078,
++      0x1284, 0x7974, 0x71c6, 0x71c4, 0x7976, 0x7978, 0x71ca, 0x71c8,
++      0x797a, 0x797c, 0x71ce, 0x71cc, 0x797e, 0x0078, 0x1284, 0x7974,
++      0x71c6, 0x7978, 0x71ca, 0x797c, 0x71ce, 0x0078, 0x1284, 0x7900,
++      0x71c6, 0x71c4, 0x7902, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
++      0x0048, 0x18ee, 0x0038, 0x18f0, 0x0078, 0x18fa, 0x00a8, 0x18fa,
++      0xa18c, 0x0001, 0x00c0, 0x18f8, 0x20b9, 0x2222, 0x0078, 0x18fa,
++      0x20b9, 0x1212, 0x0078, 0x1284, 0x7900, 0x71c6, 0x0078, 0x1284,
++      0x2009, 0x5174, 0x2104, 0x70c6, 0x70c4, 0x200a, 0x0078, 0x1284,
++      0x2009, 0x5174, 0x2104, 0x70c6, 0x0078, 0x1284, 0x71c4, 0x8107,
++      0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x5380, 0x6a14,
++      0xd2b4, 0x0040, 0x191f, 0x2011, 0x0001, 0x0078, 0x1921, 0x2011,
++      0x0000, 0x6b0c, 0x0078, 0x1281, 0xac80, 0x0001, 0x1078, 0x1b0f,
++      0x007c, 0xac80, 0x0001, 0x1078, 0x1aaf, 0x007c, 0x7850, 0xa065,
++      0x0040, 0x1936, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e,
++      0x2079, 0x5100, 0x7850, 0xa06d, 0x0040, 0x1946, 0x2d04, 0x7852,
++      0x6803, 0x0000, 0x6807, 0x0000, 0x680b, 0x0000, 0x0f7f, 0x007c,
++      0x2091, 0x8000, 0x0f7e, 0x2079, 0x5100, 0x7850, 0x2062, 0x2c00,
++      0xa005, 0x00c0, 0x1955, 0x1078, 0x23eb, 0x7852, 0x0f7f, 0x2091,
++      0x8001, 0x007c, 0x0f7e, 0x2079, 0x5100, 0x7850, 0x206a, 0x2d00,
++      0x7852, 0x0f7f, 0x007c, 0x2011, 0x7800, 0x7a52, 0x7bec, 0x8319,
++      0x0040, 0x1970, 0xa280, 0x0031, 0x2012, 0x2010, 0x0078, 0x1967,
++      0x2013, 0x0000, 0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
++      0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8, 0x5400, 0x007c,
++      0x1078, 0x1973, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084,
++      0xffef, 0xa80d, 0x690a, 0x2009, 0x5152, 0x210c, 0x6804, 0xa005,
++      0x0040, 0x19b2, 0xa116, 0x00c0, 0x199d, 0x2060, 0x6000, 0x6806,
++      0x017e, 0x200b, 0x0000, 0x0078, 0x19a0, 0x2009, 0x0000, 0x017e,
++      0x6804, 0xa065, 0x0040, 0x19af, 0x6000, 0x6806, 0x1078, 0x19c0,
++      0x1078, 0x1c5f, 0x6810, 0x8001, 0x6812, 0x00c0, 0x19a0, 0x017f,
++      0x6902, 0x6906, 0x007c, 0xa065, 0x0040, 0x19bf, 0x609c, 0x609f,
++      0x0000, 0x2008, 0x1078, 0x1948, 0x2100, 0x0078, 0x19b3, 0x007c,
++      0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c, 0xac80, 0x0005,
++      0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022,
++      0x007c, 0x0e7e, 0x2071, 0x5140, 0x704c, 0xa08c, 0x0200, 0x00c0,
++      0x19df, 0xa088, 0x5180, 0x2d0a, 0x8000, 0x704e, 0xa006, 0x0e7f,
++      0x007c, 0x1078, 0x1973, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065,
++      0x0040, 0x1a2a, 0x0078, 0x19f2, 0x2c00, 0x781e, 0x6000, 0xa065,
++      0x0040, 0x1a2a, 0x600c, 0xa306, 0x00c0, 0x19ec, 0x6010, 0xa206,
++      0x00c0, 0x19ec, 0x2c28, 0x2001, 0x5152, 0x2004, 0xac06, 0x00c0,
++      0x1a03, 0x0078, 0x1a28, 0x6804, 0xac06, 0x00c0, 0x1a10, 0x6000,
++      0xa065, 0x6806, 0x00c0, 0x1a1a, 0x6803, 0x0000, 0x0078, 0x1a1a,
++      0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1a1a,
++      0x2c00, 0x6802, 0x2560, 0x1078, 0x19c0, 0x601b, 0x0005, 0x6023,
++      0x0020, 0x1078, 0x1c5f, 0x6810, 0x8001, 0x1050, 0x23eb, 0x6812,
++      0xa085, 0xffff, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049,
++      0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1980, 0x8738,
++      0xa784, 0x001f, 0x00c0, 0x1a35, 0xa7bc, 0xff00, 0x873f, 0x8738,
++      0x873f, 0xa784, 0x0f00, 0x00c0, 0x1a35, 0x2091, 0x8001, 0x007c,
++      0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1a59, 0x2091,
++      0x8000, 0x78e0, 0x78e3, 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0,
++      0x1a5a, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1a60, 0x1078, 0x23eb,
++      0x0079, 0x1a62, 0x1a72, 0x1a75, 0x1a7b, 0x1a7f, 0x1a73, 0x1a83,
++      0x1a89, 0x1a73, 0x1a73, 0x1c29, 0x1c4d, 0x1c51, 0x1a73, 0x1a73,
++      0x1a73, 0x1a73, 0x007c, 0x1078, 0x23eb, 0x1078, 0x1a2b, 0x2001,
++      0x8001, 0x0078, 0x1c57, 0x2001, 0x8003, 0x0078, 0x1c57, 0x2001,
++      0x8004, 0x0078, 0x1c57, 0x1078, 0x1a2b, 0x2001, 0x8006, 0x0078,
++      0x1c57, 0x2001, 0x8007, 0x0078, 0x1c57, 0x2030, 0x2138, 0xa782,
++      0x0021, 0x0048, 0x1a95, 0x2009, 0x0020, 0x2600, 0x1078, 0x1aaf,
++      0x00c0, 0x1aae, 0xa7ba, 0x0020, 0x0048, 0x1aad, 0x0040, 0x1aad,
++      0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1,
++      0x0000, 0xa5a9, 0x0000, 0x0078, 0x1a8f, 0xa006, 0x007c, 0x81ff,
++      0x0040, 0x1aea, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x00ff,
++      0x0040, 0x1ac1, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++      0x1abc, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a, 0x731e,
++      0x7422, 0x7526, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001,
++      0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x1ade, 0x2009,
++      0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1ad0, 0x7008, 0x800b,
++      0x00c8, 0x1ad0, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0, 0x1aea,
++      0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x2030, 0x2138, 0xa782,
++      0x0021, 0x0048, 0x1af5, 0x2009, 0x0020, 0x2600, 0x1078, 0x1b0f,
++      0x00c0, 0x1b0e, 0xa7ba, 0x0020, 0x0048, 0x1b0d, 0x0040, 0x1b0d,
++      0x2708, 0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1,
++      0x0000, 0xa5a9, 0x0000, 0x0078, 0x1aef, 0xa006, 0x007c, 0x81ff,
++      0x0040, 0x1b50, 0x2098, 0x20a1, 0x0030, 0x700c, 0xa084, 0x00ff,
++      0x0040, 0x1b21, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0,
++      0x1b1c, 0x21a8, 0x7017, 0x0000, 0x810b, 0x7112, 0x721a, 0x731e,
++      0x7422, 0x7526, 0x780c, 0xa085, 0x0000, 0x7002, 0x53a6, 0x7007,
++      0x0001, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8, 0x1b3f,
++      0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x1b31, 0x7010,
++      0xa084, 0xf000, 0x0040, 0x1b48, 0x7007, 0x0008, 0x0078, 0x1b4c,
++      0x7108, 0x8103, 0x00c8, 0x1b31, 0x7007, 0x0002, 0xa184, 0x01e0,
++      0x7003, 0x0000, 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0004,
++      0x00c8, 0x1b5c, 0x0078, 0x1b5f, 0xa006, 0x0078, 0x1b61, 0xa085,
++      0x0001, 0x007c, 0x0e7e, 0x2071, 0x5100, 0x2d08, 0x7058, 0x6802,
++      0xa005, 0x00c0, 0x1b6c, 0x715e, 0x715a, 0x0e7f, 0x007c, 0x2c08,
++      0x7858, 0x6002, 0xa005, 0x00c0, 0x1b76, 0x795e, 0x795a, 0x007c,
++      0x2091, 0x8000, 0x6003, 0x0000, 0x2c08, 0x785c, 0xa065, 0x00c0,
++      0x1b84, 0x795a, 0x0078, 0x1b85, 0x6102, 0x795e, 0x2091, 0x8001,
++      0x1078, 0x21ef, 0x007c, 0x0e7e, 0x2071, 0x5100, 0x7058, 0xa06d,
++      0x0040, 0x1b99, 0x6800, 0x705a, 0xa005, 0x00c0, 0x1b98, 0x705e,
++      0x8dff, 0x0e7f, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0x2079, 0x5100,
++      0xaf80, 0x0016, 0x2060, 0x6000, 0xa005, 0x0040, 0x1bc9, 0x2068,
++      0x6814, 0xa306, 0x00c0, 0x1bb2, 0x6828, 0xa084, 0x00ff, 0xa406,
++      0x0040, 0x1bb5, 0x2d60, 0x0078, 0x1ba3, 0x6800, 0xa005, 0x6002,
++      0x00c0, 0x1bc1, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1bc0, 0x2c00,
++      0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x1bc8, 0x1078, 0x19b3,
++      0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e,
++      0x0f7e, 0x2079, 0x5100, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa005,
++      0x0040, 0x1bf8, 0x2068, 0x6814, 0xa084, 0x00ff, 0xa306, 0x0040,
++      0x1be4, 0x2d60, 0x0078, 0x1bd6, 0x6800, 0xa005, 0x6002, 0x00c0,
++      0x1bf0, 0xaf80, 0x0016, 0xac06, 0x0040, 0x1bef, 0x2c00, 0x785e,
++      0x0d7e, 0x689c, 0xa005, 0x0040, 0x1bf7, 0x1078, 0x19b3, 0x007f,
++      0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e,
++      0x2079, 0x5100, 0xaf80, 0x0016, 0x2060, 0x6000, 0xa06d, 0x0040,
++      0x1c24, 0x6814, 0xa306, 0x0040, 0x1c10, 0x2d60, 0x0078, 0x1c05,
++      0x6800, 0xa005, 0x6002, 0x00c0, 0x1c1c, 0xaf80, 0x0016, 0xac06,
++      0x0040, 0x1c1b, 0x2c00, 0x785e, 0x0d7e, 0x689c, 0xa005, 0x0040,
++      0x1c23, 0x1078, 0x19b3, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005,
++      0x007c, 0x2091, 0x8000, 0x2069, 0x5140, 0x6800, 0xa086, 0x0000,
++      0x0040, 0x1c37, 0x2091, 0x8001, 0x78e3, 0x0009, 0x007c, 0x6880,
++      0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
++      0x1078, 0x1980, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1c40, 0x2091,
++      0x8001, 0x2001, 0x800a, 0x0078, 0x1c57, 0x2001, 0x800c, 0x0078,
++      0x1c57, 0x1078, 0x1a2b, 0x2001, 0x800d, 0x0078, 0x1c57, 0x70c2,
++      0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0x6004,
++      0x2c08, 0x2063, 0x0000, 0x7884, 0x8000, 0x7886, 0x7888, 0xa005,
++      0x798a, 0x0040, 0x1c6e, 0x2c02, 0x0078, 0x1c6f, 0x798e, 0x007c,
++      0x6807, 0x0103, 0x0c7e, 0x2061, 0x5100, 0x2d08, 0x206b, 0x0000,
++      0x6084, 0x8000, 0x6086, 0x6088, 0xa005, 0x618a, 0x0040, 0x1c83,
++      0x2d02, 0x0078, 0x1c84, 0x618e, 0x0c7f, 0x007c, 0x1078, 0x1c97,
++      0x0040, 0x1c96, 0x0c7e, 0x609c, 0xa065, 0x0040, 0x1c91, 0x1078,
++      0x19b3, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1948, 0x007c, 0x788c,
++      0xa065, 0x0040, 0x1ca9, 0x2091, 0x8000, 0x7884, 0x8001, 0x7886,
++      0x2c04, 0x788e, 0xa005, 0x00c0, 0x1ca7, 0x788a, 0x8000, 0x2091,
++      0x8001, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e,
++      0x00c8, 0x1cb3, 0xa200, 0x0070, 0x1cb7, 0x0078, 0x1cae, 0x8086,
++      0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x1cdd,
++      0xa11a, 0x00c8, 0x1cdd, 0x8213, 0x818d, 0x0048, 0x1cce, 0xa11a,
++      0x00c8, 0x1ccf, 0x0070, 0x1cd5, 0x0078, 0x1cc3, 0xa11a, 0x2308,
++      0x8210, 0x0070, 0x1cd5, 0x0078, 0x1cc3, 0x007e, 0x3200, 0xa084,
++      0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085,
++      0x0800, 0x0078, 0x1cd9, 0x7994, 0x70d0, 0xa106, 0x0040, 0x1d51,
++      0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1d51,
++      0x7008, 0x7208, 0xa206, 0x00c0, 0x1d51, 0xa286, 0x0008, 0x00c0,
++      0x1d51, 0x2071, 0x0010, 0x1078, 0x192e, 0x0040, 0x1d51, 0x7a9c,
++      0x7b98, 0x7ca4, 0x7da0, 0xa184, 0xff00, 0x0040, 0x1d1f, 0x2031,
++      0x0000, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x810b,
++      0x86b5, 0x810b, 0x86b5, 0x810b, 0x86b5, 0x2100, 0xa210, 0x2600,
++      0xa319, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1d29, 0x8107,
++      0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
++      0x0000, 0x2009, 0x0020, 0x1078, 0x1929, 0x2091, 0x8001, 0x0040,
++      0x1d48, 0x1078, 0x1948, 0x78a8, 0x8000, 0x78aa, 0xa086, 0x0002,
++      0x00c0, 0x1d51, 0x2091, 0x8000, 0x78e3, 0x0002, 0x78ab, 0x0000,
++      0x78cc, 0xa085, 0x0003, 0x78ce, 0x2091, 0x8001, 0x0078, 0x1d51,
++      0x78ab, 0x0000, 0x1078, 0x20ac, 0x6004, 0xa084, 0x000f, 0x0079,
++      0x1d56, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x1d66, 0x1d88,
++      0x1dae, 0x1d66, 0x1dcb, 0x1d75, 0x1f2c, 0x1f47, 0x1d66, 0x1d82,
++      0x1da8, 0x1e13, 0x1e82, 0x1ed2, 0x1ee4, 0x1f43, 0x2039, 0x0400,
++      0x78dc, 0xa705, 0x78de, 0x6008, 0xa705, 0x600a, 0x1078, 0x1fc7,
++      0x609c, 0x78da, 0x1078, 0x2094, 0x007c, 0x78dc, 0xa084, 0x0100,
++      0x0040, 0x1d7c, 0x0078, 0x1d66, 0x601c, 0xa085, 0x0080, 0x601e,
++      0x0078, 0x1d8f, 0x1078, 0x1b53, 0x00c0, 0x1d66, 0x1078, 0x20c6,
++      0x78dc, 0xa084, 0x0100, 0x0040, 0x1d8f, 0x0078, 0x1d66, 0x78df,
++      0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f,
++      0x0000, 0x0040, 0x1da5, 0x1078, 0x1fc7, 0x0040, 0x1da5, 0x78dc,
++      0xa085, 0x0100, 0x78de, 0x0078, 0x1da7, 0x1078, 0x1feb, 0x007c,
++      0x1078, 0x1b53, 0x00c0, 0x1d66, 0x1078, 0x20c2, 0x78dc, 0xa08c,
++      0x0e00, 0x00c0, 0x1db7, 0xa084, 0x0100, 0x00c0, 0x1db9, 0x0078,
++      0x1d66, 0x1078, 0x1fc7, 0x00c0, 0x1dca, 0x6104, 0xa18c, 0x00ff,
++      0xa186, 0x0007, 0x0040, 0x1f84, 0xa186, 0x000f, 0x0040, 0x1f84,
++      0x1078, 0x1feb, 0x007c, 0x78dc, 0xa084, 0x0100, 0x0040, 0x1dd2,
++      0x0078, 0x1d66, 0x78df, 0x0000, 0x6714, 0x2011, 0x0001, 0x20a9,
++      0x0001, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, 0x1df5, 0x2011,
++      0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040,
++      0x1df5, 0x2039, 0x0000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e,
++      0x0002, 0x0040, 0x1df5, 0x0078, 0x1e10, 0x1078, 0x1973, 0x2091,
++      0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde,
++      0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x0070, 0x1e09, 0x0078,
++      0x1df7, 0x8211, 0x0040, 0x1e10, 0x20a9, 0x0100, 0x0078, 0x1df7,
++      0x1078, 0x1948, 0x007c, 0x2001, 0x5167, 0x2004, 0xa084, 0x8000,
++      0x0040, 0x1fac, 0x6114, 0x1078, 0x20e3, 0x6900, 0xa184, 0x0001,
++      0x0040, 0x1e34, 0x6028, 0xa084, 0x00ff, 0x00c0, 0x1fa4, 0x6800,
++      0xa084, 0x0001, 0x0040, 0x1fac, 0x6803, 0x0000, 0x680b, 0x0000,
++      0x6807, 0x0000, 0x0078, 0x1fb4, 0x2011, 0x0001, 0x6020, 0xd0f4,
++      0x0040, 0x1e3c, 0xa295, 0x0002, 0xd0c4, 0x0040, 0x1e41, 0xa295,
++      0x0008, 0xd0cc, 0x0040, 0x1e46, 0xa295, 0x0400, 0x601c, 0xa084,
++      0x0002, 0x0040, 0x1e4d, 0xa295, 0x0004, 0x602c, 0xa08c, 0x00ff,
++      0xa182, 0x0002, 0x0048, 0x1fb0, 0xa182, 0x001b, 0x00c8, 0x1fb0,
++      0x0040, 0x1fb0, 0x690e, 0x602c, 0x8007, 0xa08c, 0x00ff, 0xa182,
++      0x0002, 0x0048, 0x1fb0, 0xa182, 0x001b, 0x00c8, 0x1fb0, 0x0040,
++      0x1fb0, 0x6912, 0x6030, 0xa005, 0x00c0, 0x1e70, 0x2001, 0x001e,
++      0x8000, 0x6816, 0x6028, 0xa084, 0x00ff, 0x0040, 0x1fac, 0x6806,
++      0x6028, 0x8007, 0xa084, 0x00ff, 0x0040, 0x1fac, 0x680a, 0x6a02,
++      0x0078, 0x1fb4, 0x2001, 0x5167, 0x2004, 0xa084, 0x8000, 0x0040,
++      0x1fac, 0x6114, 0x1078, 0x20e3, 0x2091, 0x8000, 0x6a04, 0x6b08,
++      0x6418, 0xa484, 0x0003, 0x0040, 0x1ea8, 0x6128, 0xa18c, 0x00ff,
++      0x8001, 0x00c0, 0x1ea1, 0x2100, 0xa210, 0x0048, 0x1ece, 0x0078,
++      0x1ea8, 0x8001, 0x00c0, 0x1ece, 0x2100, 0xa212, 0x0048, 0x1ece,
++      0xa484, 0x000c, 0x0040, 0x1ec2, 0x6128, 0x810f, 0xa18c, 0x00ff,
++      0xa082, 0x0004, 0x00c0, 0x1eba, 0x2100, 0xa318, 0x0048, 0x1ece,
++      0x0078, 0x1ec2, 0xa082, 0x0004, 0x00c0, 0x1ece, 0x2100, 0xa31a,
++      0x0048, 0x1ece, 0x6030, 0xa005, 0x0040, 0x1ec8, 0x8000, 0x6816,
++      0x6a06, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x1fb4, 0x2091, 0x8001,
++      0x0078, 0x1fb0, 0x6114, 0x1078, 0x20e3, 0x2091, 0x8000, 0x6b08,
++      0x8318, 0x0048, 0x1ee0, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x1fc3,
++      0x2091, 0x8001, 0x0078, 0x1fb0, 0x6024, 0x8007, 0xa084, 0x00ff,
++      0x0040, 0x1f02, 0xa086, 0x0080, 0x00c0, 0x1f2a, 0x20a9, 0x0008,
++      0x2069, 0x7510, 0x2091, 0x8000, 0x6800, 0xa084, 0xfcff, 0x6802,
++      0xade8, 0x0008, 0x0070, 0x1efe, 0x0078, 0x1ef4, 0x2091, 0x8001,
++      0x0078, 0x1fb4, 0x6028, 0xa015, 0x0040, 0x1f2a, 0x6114, 0x1078,
++      0x20e3, 0x0d7e, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d,
++      0x0040, 0x1f27, 0xa206, 0x0040, 0x1f18, 0x2168, 0x0078, 0x1f0e,
++      0x0c7e, 0x2160, 0x6000, 0x6802, 0x1078, 0x1948, 0x0c7f, 0x0d7f,
++      0x6808, 0x8000, 0x680a, 0x2091, 0x8001, 0x0078, 0x1fc3, 0x2091,
++      0x8001, 0x0d7f, 0x0078, 0x1fac, 0x6114, 0x1078, 0x20e3, 0x6800,
++      0xa084, 0x0001, 0x0040, 0x1f9c, 0x2091, 0x8000, 0x6a04, 0x8210,
++      0x0048, 0x1f3f, 0x6a06, 0x2091, 0x8001, 0x0078, 0x1fc3, 0x2091,
++      0x8001, 0x0078, 0x1fb0, 0x1078, 0x1b53, 0x00c0, 0x1d66, 0x6114,
++      0x1078, 0x20e3, 0x60be, 0x60bb, 0x0000, 0x6900, 0xa184, 0x0008,
++      0x0040, 0x1f56, 0x6020, 0xa085, 0x0100, 0x6022, 0xa184, 0x0001,
++      0x0040, 0x1fac, 0xa184, 0x0100, 0x00c0, 0x1f98, 0xa184, 0x0200,
++      0x00c0, 0x1f94, 0x681c, 0xa005, 0x00c0, 0x1fa0, 0x6004, 0xa084,
++      0x00ff, 0xa086, 0x000f, 0x00c0, 0x1f6f, 0x1078, 0x20c6, 0x78df,
++      0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78d2, 0x8001, 0x609f,
++      0x0000, 0x0040, 0x1f84, 0x1078, 0x1fc7, 0x0040, 0x1f84, 0x78dc,
++      0xa085, 0x0100, 0x78de, 0x007c, 0x78d7, 0x0000, 0x78db, 0x0000,
++      0x6024, 0xa084, 0xff00, 0x6026, 0x1078, 0x39de, 0x0040, 0x1ce3,
++      0x1078, 0x1b78, 0x0078, 0x1ce3, 0x2009, 0x0017, 0x0078, 0x1fb6,
++      0x2009, 0x000e, 0x0078, 0x1fb6, 0x2009, 0x0007, 0x0078, 0x1fb6,
++      0x2009, 0x0035, 0x0078, 0x1fb6, 0x2009, 0x003e, 0x0078, 0x1fb6,
++      0x2009, 0x0004, 0x0078, 0x1fb6, 0x2009, 0x0006, 0x0078, 0x1fb6,
++      0x2009, 0x0016, 0x0078, 0x1fb6, 0x2009, 0x0001, 0x6024, 0xa084,
++      0xff00, 0xa105, 0x6026, 0x2091, 0x8000, 0x1078, 0x1c5f, 0x2091,
++      0x8001, 0x0078, 0x1ce3, 0x1078, 0x1948, 0x0078, 0x1ce3, 0x78d4,
++      0xa06d, 0x00c0, 0x1fd2, 0x2c00, 0x78d6, 0x78da, 0x609f, 0x0000,
++      0x0078, 0x1fde, 0x2c00, 0x689e, 0x609f, 0x0000, 0x78d6, 0x2d00,
++      0x6002, 0x78d8, 0xad06, 0x00c0, 0x1fde, 0x6002, 0x78d0, 0x8001,
++      0x78d2, 0x00c0, 0x1fea, 0x78dc, 0xa084, 0xfeff, 0x78de, 0x78d8,
++      0x2060, 0xa006, 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184,
++      0xe1ff, 0x601e, 0xa184, 0x0060, 0x0040, 0x1ffa, 0x0e7e, 0x1078,
++      0x47c2, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000,
++      0x60b3, 0x0000, 0x6714, 0x1078, 0x1973, 0x2091, 0x8000, 0x60a0,
++      0xa084, 0x8000, 0x00c0, 0x2021, 0x6808, 0xa084, 0x0001, 0x0040,
++      0x2021, 0x2091, 0x8001, 0x1078, 0x19c0, 0x2091, 0x8000, 0x1078,
++      0x1c5f, 0x2091, 0x8001, 0x78d7, 0x0000, 0x78db, 0x0000, 0x0078,
++      0x2093, 0x6024, 0xa096, 0x0001, 0x00c0, 0x2028, 0x8000, 0x6026,
++      0x6a10, 0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x2037, 0x0040,
++      0x2037, 0x2039, 0x0200, 0x1078, 0x2094, 0x0078, 0x2093, 0x2c08,
++      0x2091, 0x8000, 0x60a0, 0xa084, 0x8000, 0x0040, 0x2064, 0x6800,
++      0xa065, 0x0040, 0x2069, 0x6a04, 0x0e7e, 0x2071, 0x5140, 0x7000,
++      0xa084, 0x0001, 0x0040, 0x205e, 0x7048, 0xa206, 0x00c0, 0x205e,
++      0x6b04, 0x231c, 0x2160, 0x6302, 0x2300, 0xa005, 0x00c0, 0x2059,
++      0x6902, 0x2260, 0x6102, 0x0e7f, 0x0078, 0x2070, 0x2160, 0x6202,
++      0x6906, 0x0e7f, 0x0078, 0x2070, 0x6800, 0xa065, 0x0040, 0x2069,
++      0x6102, 0x6902, 0x00c0, 0x206d, 0x6906, 0x2160, 0x6003, 0x0000,
++      0x2160, 0x60a0, 0xa084, 0x8000, 0x0040, 0x207a, 0x6808, 0xa084,
++      0xfffc, 0x680a, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0x6808,
++      0xa08c, 0x0040, 0x0040, 0x2089, 0xa086, 0x0040, 0x680a, 0x1078,
++      0x19d1, 0x2091, 0x8000, 0x1078, 0x21d2, 0x2091, 0x8001, 0x78db,
++      0x0000, 0x78d7, 0x0000, 0x007c, 0x6008, 0xa705, 0x600a, 0x2091,
++      0x8000, 0x1078, 0x1c5f, 0x2091, 0x8001, 0x78d8, 0xa065, 0x0040,
++      0x20a7, 0x609c, 0x78da, 0x609f, 0x0000, 0x0078, 0x2097, 0x78d7,
++      0x0000, 0x78db, 0x0000, 0x007c, 0x7990, 0x7894, 0x8000, 0xa10a,
++      0x00c8, 0x20b3, 0xa006, 0x7896, 0x70d2, 0x7804, 0xa005, 0x0040,
++      0x20c1, 0x8001, 0x7806, 0x00c0, 0x20c1, 0x0068, 0x20c1, 0x2091,
++      0x4080, 0x007c, 0x2039, 0x20da, 0x0078, 0x20c8, 0x2039, 0x20e0,
++      0x2704, 0xa005, 0x0040, 0x20d9, 0xac00, 0x2068, 0x6b08, 0x6c0c,
++      0x6910, 0x6a14, 0x690a, 0x6a0e, 0x6b12, 0x6c16, 0x8738, 0x0078,
++      0x20c8, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000,
++      0x0015, 0x001b, 0x0000, 0x0c7e, 0x1078, 0x3b69, 0x2c68, 0x0c7f,
++      0x007c, 0x0010, 0x215a, 0x0068, 0x215a, 0x2029, 0x0000, 0x78cb,
++      0x0000, 0x788c, 0xa065, 0x0040, 0x2153, 0x2009, 0x5174, 0x2104,
++      0xa084, 0x0001, 0x0040, 0x2121, 0x6004, 0xa086, 0x0103, 0x00c0,
++      0x2121, 0x6018, 0xa005, 0x00c0, 0x2121, 0x6014, 0xa005, 0x00c0,
++      0x2121, 0x0d7e, 0x2069, 0x0000, 0x6818, 0xa084, 0x0001, 0x00c0,
++      0x2120, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b,
++      0x0001, 0x2091, 0x4080, 0x0d7f, 0x1078, 0x1c86, 0x0078, 0x2158,
++      0x0d7f, 0x1078, 0x215b, 0x0040, 0x2153, 0x6204, 0xa294, 0x00ff,
++      0xa296, 0x0003, 0x0040, 0x2133, 0x6204, 0xa296, 0x0110, 0x00c0,
++      0x2141, 0x78cb, 0x0001, 0x6204, 0xa294, 0xff00, 0x8217, 0x8211,
++      0x0040, 0x2141, 0x85ff, 0x00c0, 0x2153, 0x8210, 0xa202, 0x00c8,
++      0x2153, 0x057e, 0x1078, 0x216a, 0x057f, 0x0040, 0x214e, 0x78e0,
++      0xa086, 0x0003, 0x0040, 0x2153, 0x0078, 0x2141, 0x8528, 0x78c8,
++      0xa005, 0x0040, 0x20f1, 0x85ff, 0x0040, 0x215a, 0x2091, 0x4080,
++      0x78b0, 0x70d6, 0x007c, 0x7bac, 0x79b0, 0x70d4, 0xa102, 0x00c0,
++      0x2164, 0x2300, 0xa005, 0x007c, 0x0048, 0x2168, 0xa302, 0x007c,
++      0x8002, 0x007c, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x00c8,
++      0x2184, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0,
++      0x21b9, 0x7008, 0x7208, 0xa206, 0x00c0, 0x21b9, 0xa286, 0x0008,
++      0x00c0, 0x21b9, 0x2071, 0x0010, 0x1078, 0x21be, 0x2009, 0x0020,
++      0x6004, 0xa086, 0x0103, 0x00c0, 0x2193, 0x6028, 0xa005, 0x00c0,
++      0x2193, 0x2009, 0x000c, 0x1078, 0x1924, 0x0040, 0x21ac, 0x78c4,
++      0x8000, 0x78c6, 0xa086, 0x0002, 0x00c0, 0x21b9, 0x2091, 0x8000,
++      0x78e3, 0x0003, 0x78c7, 0x0000, 0x78cc, 0xa085, 0x0300, 0x78ce,
++      0x2091, 0x8001, 0x0078, 0x21b9, 0x78c7, 0x0000, 0x1078, 0x1c86,
++      0x79ac, 0x78b0, 0x8000, 0xa10a, 0x00c8, 0x21b7, 0xa006, 0x78b2,
++      0xa006, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x8107, 0x8004,
++      0x8004, 0x7ab8, 0x7bb4, 0x7cc0, 0x7dbc, 0xa210, 0xa399, 0x0000,
++      0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x2009, 0x515b, 0x2091,
++      0x8000, 0x200a, 0x0f7e, 0x0e7e, 0x2071, 0x5140, 0x7000, 0xa086,
++      0x0000, 0x00c0, 0x21ec, 0x2009, 0x5112, 0x2104, 0xa005, 0x00c0,
++      0x21ec, 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x21ec,
++      0x0018, 0x21ec, 0x781b, 0x004b, 0x0e7f, 0x0f7f, 0x007c, 0x0f7e,
++      0x0e7e, 0x2071, 0x5140, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000,
++      0x00c0, 0x2205, 0x2079, 0x0100, 0x7830, 0xa084, 0x00c0, 0x00c0,
++      0x2205, 0x0018, 0x2205, 0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f,
++      0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300, 0x2071, 0x5140, 0x2079,
++      0x0100, 0x784b, 0x000f, 0x0098, 0x2218, 0x7838, 0x0078, 0x2211,
++      0x20a9, 0x0040, 0x7800, 0xa082, 0x0004, 0x0048, 0x2221, 0x20a9,
++      0x0060, 0x789b, 0x0000, 0x78af, 0x0000, 0x78af, 0x0000, 0x0070,
++      0x222b, 0x0078, 0x2223, 0x7800, 0xa082, 0x0004, 0x0048, 0x223a,
++      0x70b7, 0x0096, 0x2019, 0x4ee7, 0x1078, 0x2276, 0x702f, 0x8001,
++      0x0078, 0x2246, 0x70b7, 0x0000, 0x2019, 0x4d5f, 0x1078, 0x2276,
++      0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x7003, 0x0000,
++      0x1078, 0x237f, 0x7004, 0xa084, 0x000f, 0x017e, 0x2009, 0x04fd,
++      0x210c, 0xa18a, 0x0005, 0x0048, 0x225b, 0x0038, 0x2261, 0xa085,
++      0x6280, 0x0078, 0x2263, 0x0028, 0x2261, 0xa085, 0x6280, 0x0078,
++      0x2263, 0xa085, 0x62c0, 0x017f, 0x7806, 0x780f, 0xb204, 0x7843,
++      0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x0008, 0x7053,
++      0x517f, 0x704f, 0x0000, 0x127f, 0x2000, 0x007c, 0x137e, 0x147e,
++      0x157e, 0x047e, 0x20a1, 0x012b, 0x2304, 0xa005, 0x789a, 0x0040,
++      0x2296, 0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484, 0xff00,
++      0x0040, 0x228e, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6,
++      0xa005, 0x00c0, 0x2285, 0x3318, 0x0078, 0x227c, 0x047f, 0x157f,
++      0x147f, 0x137f, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204,
++      0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x237f, 0x007c, 0x2011,
++      0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x22b0, 0x0078, 0x22ab,
++      0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c,
++      0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x22c1, 0x0078,
++      0x22bc, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a,
++      0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x22d2,
++      0x0078, 0x22cd, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105,
++      0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105,
++      0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061,
++      0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003,
++      0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084,
++      0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022,
++      0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae,
++      0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061,
++      0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018,
++      0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005,
++      0x0040, 0x235d, 0x2061, 0x7500, 0x1078, 0x2365, 0x0040, 0x2349,
++      0x20a9, 0x0000, 0x2061, 0x7400, 0x0c7e, 0x1078, 0x2365, 0x0040,
++      0x2339, 0x0c7f, 0x8c60, 0x0070, 0x2337, 0x0078, 0x232c, 0x0078,
++      0x235d, 0x007f, 0xa082, 0x7400, 0x2071, 0x5140, 0x7086, 0x7182,
++      0x2001, 0x0004, 0x706e, 0x7093, 0x000f, 0x1078, 0x21cd, 0x0078,
++      0x2359, 0x60c0, 0xa005, 0x00c0, 0x235d, 0x2071, 0x5140, 0x7182,
++      0x2c00, 0x708a, 0x2001, 0x0006, 0x706e, 0x7093, 0x000f, 0x1078,
++      0x21cd, 0x2001, 0x0000, 0x0078, 0x235f, 0x2001, 0x0001, 0x2091,
++      0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040,
++      0x237c, 0x2060, 0x600c, 0xa306, 0x00c0, 0x2379, 0x6010, 0xa206,
++      0x00c0, 0x2379, 0x6014, 0xa106, 0x00c0, 0x2379, 0xa006, 0x0078,
++      0x237e, 0x6000, 0x0078, 0x2366, 0xa085, 0x0001, 0x007c, 0x2011,
++      0x5141, 0x220c, 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084,
++      0x0100, 0x0040, 0x2395, 0x2021, 0xff04, 0x2122, 0x810b, 0x810b,
++      0x810b, 0x810b, 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4,
++      0xa08c, 0x0020, 0x0040, 0x23e9, 0xa084, 0x0006, 0x00c0, 0x23e9,
++      0x6014, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0,
++      0x5380, 0x7004, 0xa084, 0x000a, 0x00c0, 0x23e9, 0x7108, 0xa194,
++      0xff00, 0x0040, 0x23e9, 0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106,
++      0x0040, 0x23d0, 0x2001, 0x0012, 0xa106, 0x0040, 0x23d4, 0x2001,
++      0x0014, 0xa106, 0x0040, 0x23d8, 0x2001, 0x0019, 0xa106, 0x0040,
++      0x23dc, 0x2001, 0x0032, 0xa106, 0x0040, 0x23e0, 0x0078, 0x23e4,
++      0x2009, 0x0012, 0x0078, 0x23e6, 0x2009, 0x0014, 0x0078, 0x23e6,
++      0x2009, 0x0019, 0x0078, 0x23e6, 0x2009, 0x0020, 0x0078, 0x23e6,
++      0x2009, 0x003f, 0x0078, 0x23e6, 0x2011, 0x0000, 0x2100, 0xa205,
++      0x700a, 0x0e7f, 0x007c, 0x0068, 0x23eb, 0x2091, 0x8000, 0x2071,
++      0x0000, 0x007e, 0x7018, 0xa084, 0x0001, 0x00c0, 0x23f2, 0x007f,
++      0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db,
++      0x0741, 0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091,
++      0x4080, 0x0078, 0x2409, 0x107e, 0x007e, 0x127e, 0x2091, 0x2300,
++      0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x77c2, 0x74c6, 0x76ca, 0x75ce,
++      0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0079, 0x2420,
++      0x2432, 0x2432, 0x2432, 0x276c, 0x393b, 0x2430, 0x2461, 0x246b,
++      0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430, 0x2430,
++      0x1078, 0x23eb, 0x8507, 0xa084, 0x001f, 0x0079, 0x2437, 0x2475,
++      0x276c, 0x2926, 0x2a23, 0x2a4b, 0x2ced, 0x2f98, 0x2fdb, 0x3026,
++      0x30ab, 0x3163, 0x320c, 0x2461, 0x2848, 0x2f6d, 0x2457, 0x3cc8,
++      0x3ce8, 0x3eae, 0x3eba, 0x3f8f, 0x2457, 0x2457, 0x4062, 0x4066,
++      0x3cc6, 0x2457, 0x3e19, 0x2457, 0x3b8c, 0x246b, 0x2457, 0x1078,
++      0x23eb, 0x0018, 0x2410, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f,
++      0x007c, 0x2019, 0x4e3b, 0x1078, 0x2276, 0x702f, 0x0001, 0x781b,
++      0x004f, 0x0078, 0x2459, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f,
++      0x8000, 0x781b, 0x00d0, 0x0078, 0x2459, 0x7242, 0x2009, 0x510f,
++      0x200b, 0x0000, 0xa584, 0x0001, 0x00c0, 0x3ba0, 0x0040, 0x2492,
++      0x1078, 0x23eb, 0x7003, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000,
++      0x7037, 0x0000, 0x1078, 0x3912, 0x0018, 0x2410, 0x2009, 0x510f,
++      0x200b, 0x0000, 0x7068, 0xa005, 0x00c0, 0x255d, 0x706c, 0xa084,
++      0x0007, 0x0079, 0x249b, 0x2594, 0x24a3, 0x24af, 0x24cc, 0x24ee,
++      0x253b, 0x2514, 0x24a3, 0x1078, 0x38fa, 0x2009, 0x0048, 0x1078,
++      0x2e39, 0x00c0, 0x24ad, 0x7003, 0x0004, 0x0078, 0x2459, 0x1078,
++      0x38fa, 0x00c0, 0x24ca, 0x7080, 0x8007, 0x7882, 0x789b, 0x0010,
++      0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004,
++      0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x24ca, 0x7003, 0x0004,
++      0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x24ec,
++      0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d,
++      0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002,
++      0x785b, 0x0004, 0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x24ec,
++      0x7003, 0x0004, 0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa,
++      0x00c0, 0x2512, 0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c,
++      0x001f, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x7184, 0x79aa,
++      0x78ab, 0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004,
++      0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x2512, 0x7003, 0x0004,
++      0x7093, 0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x2539,
++      0x7180, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x001f, 0xa18d,
++      0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002,
++      0x785b, 0x0004, 0x2009, 0x00e0, 0x1078, 0x2e2d, 0x00c0, 0x2539,
++      0x7088, 0x708b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0002, 0x7093,
++      0x000f, 0x0078, 0x2459, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x7088,
++      0x2068, 0x6f14, 0x1078, 0x37ef, 0x2c50, 0x1078, 0x39ac, 0x789b,
++      0x0010, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x6e1c,
++      0x2041, 0x0001, 0x708c, 0xa084, 0x0400, 0x2001, 0x0004, 0x0040,
++      0x255b, 0x2001, 0x0006, 0x0078, 0x267c, 0x1078, 0x38fa, 0x00c0,
++      0x2459, 0x789b, 0x0010, 0x7068, 0x2068, 0x6f14, 0x1078, 0x37ef,
++      0x2c50, 0x1078, 0x39ac, 0x6008, 0xa085, 0x0010, 0x600a, 0x6824,
++      0xa005, 0x0040, 0x257b, 0xa082, 0x0006, 0x0048, 0x2579, 0x0078,
++      0x257b, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0,
++      0x7058, 0xa084, 0x8000, 0x0040, 0x2589, 0xa684, 0x0001, 0x0040,
++      0x258b, 0xa39c, 0xffbf, 0x7baa, 0x2031, 0x0020, 0x2041, 0x0001,
++      0x2001, 0x0003, 0x0078, 0x267c, 0x0018, 0x2410, 0x744c, 0xa485,
++      0x0000, 0x0040, 0x25ae, 0xa080, 0x5180, 0x2030, 0x7150, 0x8108,
++      0xa12a, 0x0048, 0x25a5, 0x2009, 0x5180, 0x2164, 0x6504, 0x85ff,
++      0x00c0, 0x25bf, 0x8421, 0x00c0, 0x259f, 0x7152, 0x7003, 0x0000,
++      0x704b, 0x0000, 0x7040, 0xa005, 0x0040, 0x3ba0, 0x0078, 0x2459,
++      0x764c, 0xa6b0, 0x5180, 0x7150, 0x2600, 0x0078, 0x25aa, 0x7152,
++      0x2568, 0x2558, 0x754a, 0x2c50, 0x6034, 0xa085, 0x0000, 0x00c0,
++      0x25bc, 0x6708, 0x773a, 0xa784, 0x033f, 0x0040, 0x25f5, 0xa784,
++      0x0021, 0x00c0, 0x25bc, 0xa784, 0x0002, 0x0040, 0x25de, 0xa784,
++      0x0004, 0x0040, 0x25bc, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008,
++      0x00c0, 0x25bc, 0xa784, 0x0010, 0x00c0, 0x25bc, 0xa784, 0x0200,
++      0x00c0, 0x25bc, 0xa784, 0x0100, 0x0040, 0x25f5, 0x6018, 0xa005,
++      0x00c0, 0x25bc, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000, 0x6e1c,
++      0xa684, 0x000e, 0x6118, 0x0040, 0x2605, 0x601c, 0xa102, 0x0048,
++      0x2608, 0x0040, 0x2608, 0x0078, 0x25b8, 0x81ff, 0x00c0, 0x25b8,
++      0x68c3, 0x0000, 0xa784, 0x0080, 0x00c0, 0x2610, 0x700c, 0x6022,
++      0xa7bc, 0xff7f, 0x670a, 0x1078, 0x39ac, 0x0018, 0x2410, 0x789b,
++      0x0010, 0xa046, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x6b14, 0xa39c,
++      0x001f, 0xa39d, 0x00c0, 0x7058, 0xa084, 0x8000, 0x0040, 0x262c,
++      0xa684, 0x0001, 0x0040, 0x262e, 0xa39c, 0xffbf, 0xa684, 0x0010,
++      0x0040, 0x2634, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e,
++      0x00c0, 0x263f, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x267a, 0x7158,
++      0xa18c, 0x0800, 0x0040, 0x3401, 0x2011, 0x0020, 0xa684, 0x0008,
++      0x00c0, 0x2650, 0x8210, 0xa684, 0x0002, 0x00c0, 0x2650, 0x8210,
++      0x7aaa, 0x8840, 0x1078, 0x3912, 0x6a14, 0x610c, 0x8108, 0xa18c,
++      0x00ff, 0xa1e0, 0x7400, 0x2c64, 0x8cff, 0x0040, 0x2671, 0x6014,
++      0xa206, 0x00c0, 0x265b, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2656,
++      0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078,
++      0x2594, 0x1078, 0x38fa, 0x00c0, 0x2459, 0x2a60, 0x610e, 0x79aa,
++      0x8840, 0x7132, 0x2001, 0x0001, 0x007e, 0x715c, 0xa184, 0x0018,
++      0x0040, 0x2697, 0xa184, 0x0010, 0x0040, 0x268a, 0x1078, 0x3604,
++      0x00c0, 0x26ba, 0xa184, 0x0008, 0x0040, 0x2697, 0x69a0, 0xa184,
++      0x0600, 0x00c0, 0x2697, 0x1078, 0x34f1, 0x0078, 0x26ba, 0x69a0,
++      0xa184, 0x0800, 0x0040, 0x26ae, 0x0c7e, 0x027e, 0x2960, 0x6000,
++      0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x027f,
++      0x0c7f, 0x1078, 0x3604, 0x00c0, 0x26ba, 0x69a0, 0xa184, 0x0200,
++      0x0040, 0x26b6, 0x1078, 0x3540, 0x0078, 0x26ba, 0xa184, 0x0400,
++      0x00c0, 0x2693, 0x69a0, 0xa184, 0x1000, 0x0040, 0x26c5, 0x6914,
++      0xa18c, 0xff00, 0x810f, 0x1078, 0x22ee, 0x007f, 0x7002, 0xa68c,
++      0x00e0, 0xa684, 0x0060, 0x0040, 0x26d3, 0xa086, 0x0060, 0x00c0,
++      0x26d3, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x26d8, 0xa18d, 0x0004,
++      0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061,
++      0x6818, 0xa08d, 0x8000, 0xa084, 0x7fff, 0x691a, 0xa68c, 0x0080,
++      0x0040, 0x26f7, 0x7097, 0x0000, 0xa08a, 0x000d, 0x0050, 0x26f5,
++      0xa08a, 0x000c, 0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x78aa,
++      0x8008, 0x810c, 0x0040, 0x3407, 0xa18c, 0x00f8, 0x00c0, 0x3407,
++      0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000,
++      0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f,
++      0x6814, 0x8007, 0x7882, 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2,
++      0x7eda, 0x1078, 0x38fa, 0x00c0, 0x272e, 0x702c, 0x8003, 0x0048,
++      0x2727, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x7830,
++      0xa084, 0x00c0, 0x00c0, 0x272e, 0x0098, 0x2736, 0x6008, 0xa084,
++      0xffef, 0x600a, 0x1078, 0x3912, 0x0078, 0x2482, 0x7200, 0xa284,
++      0x0007, 0xa086, 0x0001, 0x00c0, 0x2743, 0x781b, 0x004f, 0x1078,
++      0x3912, 0x0078, 0x2754, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b,
++      0x004f, 0x1078, 0x3912, 0x7200, 0x2500, 0xa605, 0x0040, 0x2754,
++      0xa284, 0x0007, 0x1079, 0x2762, 0xad80, 0x0009, 0x7036, 0xa284,
++      0x0007, 0xa086, 0x0001, 0x00c0, 0x2459, 0x6018, 0x8000, 0x601a,
++      0x0078, 0x2459, 0x276a, 0x4a3a, 0x4a3a, 0x4a29, 0x4a3a, 0x276a,
++      0x4a29, 0x276a, 0x1078, 0x23eb, 0x1078, 0x38fa, 0x0f7e, 0x2079,
++      0x5100, 0x78cc, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2790, 0x706c,
++      0xa086, 0x0001, 0x00c0, 0x277f, 0x706e, 0x0078, 0x2823, 0x706c,
++      0xa086, 0x0005, 0x00c0, 0x278e, 0x7088, 0x2068, 0x681b, 0x0004,
++      0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x706f, 0x0000,
++      0x2011, 0x0004, 0x716c, 0xa186, 0x0001, 0x0040, 0x27b1, 0xa186,
++      0x0007, 0x00c0, 0x27a1, 0x2009, 0x5138, 0x200b, 0x0005, 0x0078,
++      0x27b1, 0x2009, 0x5113, 0x2104, 0x2009, 0x5112, 0x200a, 0x2009,
++      0x5138, 0x200b, 0x0001, 0x706f, 0x0000, 0x7073, 0x0001, 0x0078,
++      0x27b3, 0x706f, 0x0000, 0x1078, 0x4776, 0x157e, 0x20a9, 0x0010,
++      0x2039, 0x0000, 0x1078, 0x36e2, 0xa7b8, 0x0100, 0x0070, 0x27c2,
++      0x0078, 0x27ba, 0x157f, 0x7000, 0x0079, 0x27c6, 0x27f4, 0x27db,
++      0x27db, 0x27ce, 0x27f4, 0x27f4, 0x27f4, 0x27f4, 0x2021, 0x515a,
++      0x2404, 0xa005, 0x0040, 0x27f4, 0xad06, 0x00c0, 0x27db, 0x6800,
++      0x2022, 0x0078, 0x27eb, 0x6820, 0xa084, 0x0001, 0x00c0, 0x27e7,
++      0x6f14, 0x1078, 0x37ef, 0x1078, 0x33d8, 0x0078, 0x27eb, 0x7060,
++      0x2060, 0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085,
++      0x0008, 0x6822, 0x1078, 0x1c70, 0x2021, 0x7500, 0x1078, 0x2830,
++      0x2021, 0x515a, 0x1078, 0x2830, 0x157e, 0x20a9, 0x0000, 0x2021,
++      0x7400, 0x1078, 0x2830, 0x8420, 0x0070, 0x2808, 0x0078, 0x2801,
++      0x2061, 0x5400, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110,
++      0x81ff, 0x0040, 0x2817, 0xa102, 0x0050, 0x2817, 0x6012, 0x601b,
++      0x0000, 0xace0, 0x0010, 0x0070, 0x281f, 0x0078, 0x280e, 0x8421,
++      0x00c0, 0x280c, 0x157f, 0x709c, 0xa084, 0x8000, 0x0040, 0x282a,
++      0x1078, 0x3a00, 0x7003, 0x0000, 0x704b, 0x0000, 0x0078, 0x2459,
++      0x047e, 0x2404, 0xa005, 0x0040, 0x2844, 0x2068, 0x6800, 0x007e,
++      0x6a1a, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078,
++      0x1c70, 0x007f, 0x0078, 0x2832, 0x047f, 0x2023, 0x0000, 0x007c,
++      0xa282, 0x0003, 0x0050, 0x284e, 0x1078, 0x23eb, 0x2300, 0x0079,
++      0x2851, 0x2854, 0x28c7, 0x28e4, 0xa282, 0x0002, 0x0040, 0x285a,
++      0x1078, 0x23eb, 0x706c, 0x706f, 0x0000, 0x7093, 0x0000, 0x0079,
++      0x2861, 0x2869, 0x2869, 0x286b, 0x289f, 0x340d, 0x2869, 0x289f,
++      0x2869, 0x1078, 0x23eb, 0x7780, 0x1078, 0x36e2, 0x7780, 0xa7bc,
++      0x0f00, 0x1078, 0x37ef, 0x6018, 0xa005, 0x0040, 0x2896, 0x2021,
++      0x7500, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x28ff, 0x0040,
++      0x2896, 0x157e, 0x20a9, 0x0000, 0x2021, 0x7400, 0x047e, 0x2009,
++      0x0004, 0x2011, 0x0010, 0x1078, 0x28ff, 0x047f, 0x0040, 0x2895,
++      0x8420, 0x0070, 0x2895, 0x0078, 0x2886, 0x157f, 0x8738, 0xa784,
++      0x001f, 0x00c0, 0x2871, 0x0078, 0x2482, 0x0078, 0x2482, 0x7780,
++      0x1078, 0x37ef, 0x6018, 0xa005, 0x0040, 0x28c5, 0x2021, 0x7500,
++      0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x28ff, 0x0040, 0x28c5,
++      0x157e, 0x20a9, 0x0000, 0x2021, 0x7400, 0x047e, 0x2009, 0x0005,
++      0x2011, 0x0020, 0x1078, 0x28ff, 0x047f, 0x0040, 0x28c4, 0x8420,
++      0x0070, 0x28c4, 0x0078, 0x28b5, 0x157f, 0x0078, 0x2482, 0x2200,
++      0x0079, 0x28ca, 0x28cd, 0x28cf, 0x28cf, 0x1078, 0x23eb, 0x2009,
++      0x0012, 0x706c, 0xa086, 0x0002, 0x0040, 0x28d8, 0x2009, 0x000e,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x28de, 0x691a, 0x706f, 0x0000,
++      0x7073, 0x0001, 0x0078, 0x3888, 0x2200, 0x0079, 0x28e7, 0x28ec,
++      0x28cf, 0x28ea, 0x1078, 0x23eb, 0x1078, 0x4776, 0x7000, 0xa086,
++      0x0001, 0x00c0, 0x339d, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef,
++      0x600a, 0x1078, 0x3390, 0x0040, 0x339d, 0x0078, 0x2594, 0x2404,
++      0xa005, 0x0040, 0x2922, 0x2068, 0x2d04, 0x007e, 0x6814, 0xa706,
++      0x0040, 0x290e, 0x2d20, 0x007f, 0x0078, 0x2900, 0x007f, 0x2022,
++      0x691a, 0x6817, 0x0000, 0x6820, 0xa205, 0x6822, 0x1078, 0x1c70,
++      0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078,
++      0x33ee, 0x007c, 0xa085, 0x0001, 0x0078, 0x2921, 0x2300, 0x0079,
++      0x2929, 0x292e, 0x292c, 0x29c7, 0x1078, 0x23eb, 0x78ec, 0xa084,
++      0x0001, 0x00c0, 0x2942, 0x7000, 0xa086, 0x0004, 0x00c0, 0x293a,
++      0x0078, 0x2965, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a,
++      0x0078, 0x339d, 0x78e4, 0xa005, 0x00d0, 0x2965, 0x0018, 0x2459,
++      0x2008, 0xa084, 0x0030, 0x00c0, 0x2951, 0x781b, 0x004f, 0x0078,
++      0x2459, 0x78ec, 0xa084, 0x0003, 0x0040, 0x294d, 0x2100, 0xa084,
++      0x0007, 0x0079, 0x295b, 0x299e, 0x29a9, 0x298f, 0x2963, 0x38ed,
++      0x38ed, 0x2963, 0x29b8, 0x1078, 0x23eb, 0x7000, 0xa086, 0x0004,
++      0x00c0, 0x297f, 0x706c, 0xa086, 0x0002, 0x00c0, 0x2975, 0x2011,
++      0x0002, 0x2019, 0x0000, 0x0078, 0x2848, 0x706c, 0xa086, 0x0006,
++      0x0040, 0x296f, 0x706c, 0xa086, 0x0004, 0x0040, 0x296f, 0x79e4,
++      0xa184, 0x0030, 0x0040, 0x2989, 0x78ec, 0xa084, 0x0003, 0x00c0,
++      0x298b, 0x0078, 0x2f6d, 0x2001, 0x0003, 0x0078, 0x2d01, 0x6818,
++      0xa084, 0x8000, 0x0040, 0x2996, 0x681b, 0x001d, 0x1078, 0x36c1,
++      0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x6818, 0xa084,
++      0x8000, 0x0040, 0x29a5, 0x681b, 0x001d, 0x1078, 0x36c1, 0x0078,
++      0x38b8, 0x6818, 0xa084, 0x8000, 0x0040, 0x29b0, 0x681b, 0x001d,
++      0x1078, 0x36c1, 0x782b, 0x3008, 0x781b, 0x00cd, 0x0078, 0x2459,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x29bf, 0x681b, 0x001d, 0x1078,
++      0x36c1, 0x782b, 0x3008, 0x781b, 0x008e, 0x0078, 0x2459, 0xa584,
++      0x000f, 0x00c0, 0x29e4, 0x7000, 0x0079, 0x29ce, 0x2482, 0x29d8,
++      0x29d6, 0x339d, 0x339d, 0x339d, 0x339d, 0x29d6, 0x1078, 0x23eb,
++      0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x3390,
++      0x0040, 0x339d, 0x0078, 0x2594, 0x78e4, 0xa005, 0x00d0, 0x2965,
++      0x0018, 0x2965, 0x2008, 0xa084, 0x0030, 0x00c0, 0x29f3, 0x781b,
++      0x004f, 0x0078, 0x2459, 0x78ec, 0xa084, 0x0003, 0x0040, 0x29ef,
++      0x2100, 0xa184, 0x0007, 0x0079, 0x29fd, 0x2a0f, 0x2a13, 0x2a07,
++      0x2a05, 0x38ed, 0x38ed, 0x2a05, 0x38e3, 0x1078, 0x23eb, 0x1078,
++      0x36c9, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x1078,
++      0x36c9, 0x0078, 0x38b8, 0x1078, 0x36c9, 0x782b, 0x3008, 0x781b,
++      0x00cd, 0x0078, 0x2459, 0x1078, 0x36c9, 0x782b, 0x3008, 0x781b,
++      0x008e, 0x0078, 0x2459, 0x2300, 0x0079, 0x2a26, 0x2a2b, 0x2a29,
++      0x2a2d, 0x1078, 0x23eb, 0x0078, 0x30ab, 0x681b, 0x0008, 0x78a3,
++      0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x30ab, 0x78ec, 0xa084,
++      0x0003, 0x0040, 0x30ab, 0xa184, 0x0007, 0x0079, 0x2a3f, 0x2a47,
++      0x2a13, 0x298f, 0x3888, 0x38ed, 0x38ed, 0x2a47, 0x38e3, 0x1078,
++      0x389c, 0x0078, 0x2459, 0xa282, 0x0005, 0x0050, 0x2a51, 0x1078,
++      0x23eb, 0x2300, 0x0079, 0x2a54, 0x2a57, 0x2cae, 0x2cbc, 0x2200,
++      0x0079, 0x2a5a, 0x2a74, 0x2a61, 0x2a74, 0x2a5f, 0x2c93, 0x1078,
++      0x23eb, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020,
++      0x0048, 0x369d, 0xa08a, 0x0004, 0x00c8, 0x369d, 0x0079, 0x2a70,
++      0x369d, 0x369d, 0x369d, 0x364b, 0x789b, 0x0018, 0x79a8, 0xa184,
++      0x0080, 0x0040, 0x2a85, 0x0078, 0x369d, 0x7000, 0xa005, 0x00c0,
++      0x2a7b, 0x2011, 0x0004, 0x0078, 0x321f, 0xa184, 0x00ff, 0xa08a,
++      0x0010, 0x00c8, 0x369d, 0x0079, 0x2a8d, 0x2a9f, 0x2a9d, 0x2ab7,
++      0x2abb, 0x2b78, 0x369d, 0x369d, 0x2b7a, 0x369d, 0x369d, 0x2c8f,
++      0x2c8f, 0x369d, 0x369d, 0x369d, 0x2c91, 0x1078, 0x23eb, 0xa684,
++      0x1000, 0x0040, 0x2aac, 0x2001, 0x0500, 0x8000, 0x8000, 0x783a,
++      0x781b, 0x008c, 0x0078, 0x2459, 0x6818, 0xa084, 0x8000, 0x0040,
++      0x2ab5, 0x681b, 0x001d, 0x0078, 0x2aa3, 0x0078, 0x3888, 0x681b,
++      0x001d, 0x0078, 0x36ad, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0,
++      0x2afc, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2b04, 0x6818, 0xa086,
++      0x0008, 0x00c0, 0x2acd, 0x681b, 0x0000, 0xa684, 0x0400, 0x0040,
++      0x2b74, 0xa684, 0x0080, 0x0040, 0x2af8, 0x7097, 0x0000, 0x6818,
++      0xa084, 0x003f, 0xa08a, 0x000d, 0x0050, 0x2af8, 0xa08a, 0x000c,
++      0x7196, 0x2001, 0x000c, 0x800c, 0x719a, 0x789b, 0x0061, 0x78aa,
++      0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000,
++      0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f,
++      0x781b, 0x0058, 0x0078, 0x2459, 0xa684, 0x1000, 0x0040, 0x2b04,
++      0x781b, 0x0065, 0x0078, 0x2459, 0xa684, 0x0060, 0x0040, 0x2b70,
++      0xa684, 0x0800, 0x0040, 0x2b70, 0xa684, 0x8000, 0x00c0, 0x2b12,
++      0x0078, 0x2b2c, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, 0x789b, 0x0076,
++      0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x2b1f, 0x8000, 0xa084,
++      0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
++      0x6b94, 0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, 0x0040, 0x2b34,
++      0xa6b4, 0xbfff, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003, 0x00c0,
++      0x2b41, 0x1078, 0x482c, 0x1078, 0x4a29, 0x781b, 0x0064, 0x0078,
++      0x2459, 0xa006, 0x1078, 0x4b30, 0x6ab0, 0x69ac, 0x6c98, 0x6b94,
++      0x2200, 0xa105, 0x0040, 0x2b50, 0x2200, 0xa422, 0x2100, 0xa31b,
++      0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405,
++      0x00c0, 0x2b62, 0xa6b5, 0x4000, 0x7e5a, 0x6eb6, 0x781b, 0x0064,
++      0x0078, 0x2459, 0x781b, 0x0064, 0x2200, 0xa115, 0x00c0, 0x2b6c,
++      0x1078, 0x4a3a, 0x0078, 0x2459, 0x1078, 0x4a85, 0x0078, 0x2459,
++      0x781b, 0x0065, 0x0078, 0x2459, 0x781b, 0x0058, 0x0078, 0x2459,
++      0x1078, 0x23eb, 0x0078, 0x2bdb, 0x6920, 0xa184, 0x0100, 0x0040,
++      0x2b92, 0xa18c, 0xfeff, 0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000,
++      0xa084, 0xefff, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f,
++      0x0078, 0x2bca, 0xa184, 0x0200, 0x0040, 0x2bca, 0xa18c, 0xfdff,
++      0x6922, 0x0c7e, 0x7054, 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002,
++      0x6004, 0xa084, 0xffef, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184,
++      0x0008, 0x0040, 0x2bca, 0x1078, 0x37eb, 0x1078, 0x34f1, 0x88ff,
++      0x0040, 0x2bca, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5,
++      0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2bc4, 0x782b, 0x3008,
++      0x781b, 0x0056, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x0065,
++      0x0078, 0x2459, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2bd3, 0x781b,
++      0x0058, 0x0078, 0x2459, 0x781b, 0x0065, 0x0078, 0x2459, 0x0078,
++      0x36a5, 0x0078, 0x36a5, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007,
++      0x00c0, 0x2be9, 0x6820, 0xa084, 0x0100, 0x0040, 0x2bd9, 0x2009,
++      0x0008, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001,
++      0x00c0, 0x2c20, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040,
++      0x2c18, 0x0048, 0x2bfd, 0x0078, 0x2c1a, 0xa380, 0x0002, 0xa102,
++      0x00c8, 0x2c18, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x7054,
++      0x2060, 0x6000, 0xa084, 0xefef, 0x6002, 0x6004, 0xa084, 0xffe5,
++      0x6006, 0x0c7f, 0x7e58, 0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x2bcb,
++      0x0078, 0x2b7c, 0x24a8, 0x7aa8, 0x00f0, 0x2c1a, 0x0078, 0x2beb,
++      0xa284, 0x00f0, 0xa086, 0x0020, 0x00c0, 0x2c80, 0x8318, 0x8318,
++      0x2300, 0xa102, 0x0040, 0x2c30, 0x0048, 0x2c30, 0x0078, 0x2c7d,
++      0xa286, 0x0023, 0x0040, 0x2bd9, 0x681c, 0xa084, 0xfff1, 0x681e,
++      0x7e58, 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008,
++      0xa085, 0x0010, 0x600a, 0x0c7e, 0x7054, 0x2060, 0x6004, 0x2008,
++      0x2c48, 0x0c7f, 0xa184, 0x0010, 0x0040, 0x2c54, 0x1078, 0x37eb,
++      0x1078, 0x3604, 0x0078, 0x2c63, 0x0c7e, 0x7054, 0x2060, 0x6004,
++      0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2bca, 0x1078,
++      0x37eb, 0x1078, 0x34f1, 0x88ff, 0x0040, 0x2bca, 0x789b, 0x0060,
++      0x2800, 0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++      0x2c77, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b,
++      0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x7aa8, 0x0078, 0x2beb,
++      0x8318, 0x2300, 0xa102, 0x0040, 0x2c89, 0x0048, 0x2c89, 0x0078,
++      0x2beb, 0xa284, 0x0080, 0x00c0, 0x36ad, 0x0078, 0x36a5, 0x0078,
++      0x36ad, 0x0078, 0x369d, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff,
++      0xa08e, 0x0001, 0x0040, 0x2c9e, 0x1078, 0x23eb, 0x7aa8, 0xa294,
++      0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x369d,
++      0x0079, 0x2caa, 0x369d, 0x343e, 0x369d, 0x3599, 0xa282, 0x0000,
++      0x00c0, 0x2cb4, 0x1078, 0x23eb, 0x1078, 0x36c1, 0x782b, 0x3008,
++      0x781b, 0x0065, 0x0078, 0x2459, 0xa282, 0x0003, 0x00c0, 0x2cc2,
++      0x1078, 0x23eb, 0xa484, 0x8000, 0x00c0, 0x2ce5, 0x706c, 0xa005,
++      0x0040, 0x2ccc, 0x1078, 0x23eb, 0x6f14, 0x7782, 0xa7bc, 0x0f00,
++      0x1078, 0x37ef, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784,
++      0x001f, 0x00c0, 0x2cd0, 0x1078, 0x36c5, 0x706f, 0x0002, 0x2009,
++      0x5138, 0x200b, 0x0009, 0x0078, 0x2ce7, 0x1078, 0x36d1, 0x782b,
++      0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0xa282, 0x0004, 0x0050,
++      0x2cf3, 0x1078, 0x23eb, 0x2300, 0x0079, 0x2cf6, 0x2cf9, 0x2de2,
++      0x2e15, 0xa286, 0x0003, 0x0040, 0x2cff, 0x1078, 0x23eb, 0x2001,
++      0x0000, 0x007e, 0x68c0, 0xa005, 0x0040, 0x2d08, 0x7003, 0x0003,
++      0x68a0, 0xa084, 0x2000, 0x0040, 0x2d11, 0x6008, 0xa085, 0x0002,
++      0x600a, 0x007f, 0x703e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2d18,
++      0x2482, 0x2d22, 0x2d22, 0x2f17, 0x2f53, 0x2482, 0x2f53, 0x2d20,
++      0x1078, 0x23eb, 0xa684, 0x1000, 0x00c0, 0x2d2a, 0x1078, 0x4776,
++      0x0040, 0x2dbc, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x2d72, 0xa186,
++      0x0008, 0x00c0, 0x2d41, 0x1078, 0x33ee, 0x6008, 0xa084, 0xffef,
++      0x600a, 0x1078, 0x3390, 0x0040, 0x2d72, 0x1078, 0x4776, 0x0078,
++      0x2d59, 0xa186, 0x0028, 0x00c0, 0x2d72, 0x1078, 0x4776, 0x6008,
++      0xa084, 0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2d59, 0x8001,
++      0x601a, 0xa005, 0x0040, 0x2d59, 0x8001, 0xa005, 0x0040, 0x2d59,
++      0x601e, 0x6820, 0xa084, 0x0001, 0x0040, 0x2482, 0x6820, 0xa084,
++      0xfffe, 0x6822, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f,
++      0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x2d6f, 0x6002, 0x6006,
++      0x0078, 0x2482, 0x017e, 0x1078, 0x2e46, 0x017f, 0xa684, 0xdf00,
++      0x681e, 0x682b, 0x0000, 0x6f14, 0x81ff, 0x0040, 0x2dbc, 0xa186,
++      0x0002, 0x00c0, 0x2dbc, 0xa684, 0x0800, 0x00c0, 0x2d8f, 0xa684,
++      0x0060, 0x0040, 0x2d8f, 0x78d8, 0x7adc, 0x682e, 0x6a32, 0x6820,
++      0xa084, 0x0800, 0x00c0, 0x2dbc, 0x8717, 0xa294, 0x000f, 0x8213,
++      0x8213, 0x8213, 0xa290, 0x5380, 0xa290, 0x0000, 0x221c, 0xa384,
++      0x0100, 0x00c0, 0x2da5, 0x0078, 0x2dab, 0x8210, 0x2204, 0xa085,
++      0x0018, 0x2012, 0x8211, 0xa384, 0x0400, 0x0040, 0x2db8, 0x68a0,
++      0xa084, 0x0100, 0x00c0, 0x2db8, 0x1078, 0x2eca, 0x0078, 0x2482,
++      0x6008, 0xa085, 0x0002, 0x600a, 0x6916, 0x6818, 0xa084, 0x8000,
++      0x0040, 0x2dc4, 0x703c, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078,
++      0x33df, 0x1078, 0x33ee, 0x00c0, 0x2dd1, 0x6008, 0xa084, 0xffef,
++      0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2dda, 0x1078, 0x33d8,
++      0x0078, 0x2dde, 0x7060, 0x2060, 0x6800, 0x6002, 0x1078, 0x1c70,
++      0x0078, 0x2482, 0xa282, 0x0004, 0x0048, 0x2de8, 0x1078, 0x23eb,
++      0x2200, 0x0079, 0x2deb, 0x2de6, 0x2def, 0x2dfc, 0x2def, 0x7000,
++      0xa086, 0x0005, 0x0040, 0x2df8, 0x1078, 0x36c1, 0x782b, 0x3008,
++      0x781b, 0x0065, 0x0078, 0x2459, 0x7890, 0x8007, 0x8001, 0xa084,
++      0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa186,
++      0x0003, 0x0040, 0x2e11, 0xa186, 0x0000, 0x0040, 0x2e11, 0x0078,
++      0x369d, 0x781b, 0x0065, 0x0078, 0x2459, 0x6820, 0xa085, 0x0004,
++      0x6822, 0x82ff, 0x00c0, 0x2e20, 0x1078, 0x36c1, 0x0078, 0x2e27,
++      0x8211, 0x0040, 0x2e25, 0x1078, 0x23eb, 0x1078, 0x36d1, 0x782b,
++      0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x702c, 0x8003, 0x0048,
++      0x2e37, 0x2019, 0x4d9e, 0x1078, 0x2276, 0x702f, 0x8000, 0x1078,
++      0x3912, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2e43, 0x0018, 0x2e43,
++      0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, 0x0060,
++      0x00c0, 0x2e50, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2ec9,
++      0xa684, 0x0800, 0x00c0, 0x2e72, 0x68b4, 0xa084, 0x4800, 0xa635,
++      0xa684, 0x0800, 0x00c0, 0x2e72, 0x6998, 0x6a94, 0x692e, 0x6a32,
++      0x703c, 0xa005, 0x00c0, 0x2e6a, 0x2200, 0xa105, 0x0040, 0x2e71,
++      0x703f, 0x0015, 0x7000, 0xa086, 0x0006, 0x0040, 0x2e71, 0x1078,
++      0x4776, 0x007c, 0xa684, 0x0020, 0x0040, 0x2e94, 0xa684, 0x4000,
++      0x0040, 0x2e80, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2e6a,
++      0x68b4, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2e7a,
++      0x703c, 0xa005, 0x00c0, 0x2e8e, 0x703f, 0x0015, 0x79d8, 0x7adc,
++      0x692e, 0x6a32, 0x0078, 0x2e6a, 0xa684, 0x4000, 0x0040, 0x2e9e,
++      0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x2e6a, 0x68b4, 0xa084,
++      0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2e98, 0x703c, 0xa005,
++      0x00c0, 0x2eac, 0x703f, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb,
++      0x00c8, 0x2eb3, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++      0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x2ec0, 0x0078, 0x2e6a,
++      0x7000, 0xa086, 0x0006, 0x0040, 0x2ec9, 0x1078, 0x4b30, 0x0078,
++      0x2e6a, 0x007c, 0x6008, 0xa085, 0x0200, 0x600a, 0xa384, 0x0200,
++      0x0040, 0x2ed6, 0x6008, 0xa085, 0x0002, 0x600a, 0x681b, 0x0006,
++      0x688f, 0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942,
++      0x682f, 0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000,
++      0x689b, 0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079,
++      0x2ef1, 0x2482, 0x2efb, 0x2f04, 0x2ef9, 0x2ef9, 0x2ef9, 0x2ef9,
++      0x2ef9, 0x1078, 0x23eb, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2f04,
++      0x1078, 0x33d8, 0x0078, 0x2f0a, 0x7060, 0x2c50, 0x2060, 0x6800,
++      0x6002, 0x2a60, 0x2021, 0x515a, 0x2404, 0xa005, 0x0040, 0x2f13,
++      0x2020, 0x0078, 0x2f0c, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078,
++      0x33df, 0x1078, 0x33ee, 0x6008, 0xa084, 0xfdff, 0x600a, 0x682b,
++      0x0000, 0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x4b78,
++      0xa684, 0x0800, 0x0040, 0x2f30, 0x691c, 0xa18d, 0x2000, 0x691e,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x2f40, 0x7868, 0xa08c, 0x00ff,
++      0x0040, 0x2f3e, 0x681b, 0x001e, 0x0078, 0x2f40, 0x681b, 0x0000,
++      0x2021, 0x515a, 0x2404, 0xad06, 0x0040, 0x2f47, 0x7460, 0x6800,
++      0x2022, 0x68c3, 0x0000, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078,
++      0x1c70, 0x0078, 0x2482, 0x1078, 0x2e46, 0x682b, 0x0000, 0x2001,
++      0x000e, 0x6f14, 0x1078, 0x3918, 0xa08c, 0x00ff, 0x6916, 0x6818,
++      0xa084, 0x8000, 0x0040, 0x2f66, 0x703c, 0x681a, 0xa68c, 0xdf00,
++      0x691e, 0x706f, 0x0000, 0x0078, 0x2482, 0x7000, 0xa005, 0x00c0,
++      0x2f73, 0x0078, 0x2482, 0xa006, 0x1078, 0x4776, 0x6817, 0x0000,
++      0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820,
++      0xa085, 0x00ff, 0x6822, 0x7000, 0x0079, 0x2f86, 0x2482, 0x2f90,
++      0x2f90, 0x2f92, 0x2f92, 0x2f92, 0x2f92, 0x2f8e, 0x1078, 0x23eb,
++      0x1078, 0x33ee, 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x33a8,
++      0x2300, 0x0079, 0x2f9b, 0x2f9e, 0x2fa0, 0x2fd9, 0x1078, 0x23eb,
++      0x7000, 0x0079, 0x2fa3, 0x2482, 0x2fad, 0x2fad, 0x2fc8, 0x2fad,
++      0x2fd5, 0x2fc8, 0x2fab, 0x1078, 0x23eb, 0xa684, 0x0060, 0xa086,
++      0x0060, 0x00c0, 0x2fc4, 0xa6b4, 0xffdf, 0xa6b4, 0xbfff, 0xa6b5,
++      0x2000, 0x7e5a, 0x681c, 0xa084, 0xffdf, 0x681e, 0x1078, 0x4776,
++      0x1078, 0x4a3a, 0x0078, 0x3888, 0xa684, 0x2000, 0x0040, 0x2fb7,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x2fd5, 0x681b, 0x0015, 0xa684,
++      0x4000, 0x0040, 0x2fd5, 0x681b, 0x0007, 0x1078, 0x389c, 0x0078,
++      0x2459, 0x1078, 0x23eb, 0x2300, 0x0079, 0x2fde, 0x2fe1, 0x2fe3,
++      0x3016, 0x1078, 0x23eb, 0x7000, 0x0079, 0x2fe6, 0x2482, 0x2ff0,
++      0x2ff0, 0x300b, 0x2ff0, 0x3012, 0x300b, 0x2fee, 0x1078, 0x23eb,
++      0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, 0x3007, 0xa6b4, 0xffbf,
++      0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, 0x681c, 0xa084, 0xffbf,
++      0x681e, 0x1078, 0x4776, 0x1078, 0x4a3a, 0x0078, 0x3888, 0xa684,
++      0x2000, 0x0040, 0x2ffa, 0x6818, 0xa084, 0x8000, 0x0040, 0x3012,
++      0x681b, 0x0007, 0x781b, 0x00cd, 0x0078, 0x2459, 0x6820, 0xa085,
++      0x0004, 0x6822, 0x1078, 0x3853, 0xa6b5, 0x0800, 0x1078, 0x36c1,
++      0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x2300, 0x0079,
++      0x3029, 0x302c, 0x302e, 0x3030, 0x1078, 0x23eb, 0x0078, 0x36ad,
++      0xa684, 0x0400, 0x00c0, 0x3059, 0x79e4, 0xa184, 0x0020, 0x0040,
++      0x3040, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3040, 0x782b, 0x3009,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4,
++      0xa184, 0x0020, 0x0040, 0x3051, 0x78ec, 0xa084, 0x0003, 0x00c0,
++      0x3055, 0x2001, 0x0014, 0x0078, 0x2d01, 0xa184, 0x0007, 0x0079,
++      0x3091, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff,
++      0x0040, 0x308f, 0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0,
++      0x3080, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, 0x3073, 0x2009,
++      0xfff7, 0x0078, 0x3079, 0xa386, 0x0003, 0x00c0, 0x3080, 0x2009,
++      0xffef, 0x0c7e, 0x7054, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b,
++      0x3009, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x6922, 0x0078,
++      0x3888, 0x299e, 0x29a9, 0x309b, 0x30a3, 0x3099, 0x3099, 0x3888,
++      0x3888, 0x1078, 0x23eb, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++      0x6922, 0x0078, 0x3892, 0x6920, 0xa18c, 0xfdff, 0xa18c, 0xfeff,
++      0x6922, 0x0078, 0x3888, 0x79e4, 0xa184, 0x0030, 0x0040, 0x30b5,
++      0x78ec, 0xa084, 0x0003, 0x00c0, 0x30dc, 0x7000, 0xa086, 0x0004,
++      0x00c0, 0x30cf, 0x706c, 0xa086, 0x0002, 0x00c0, 0x30c5, 0x2011,
++      0x0002, 0x2019, 0x0000, 0x0078, 0x2848, 0x706c, 0xa086, 0x0006,
++      0x0040, 0x30bf, 0x706c, 0xa086, 0x0004, 0x0040, 0x30bf, 0x7000,
++      0xa086, 0x0000, 0x0040, 0x2459, 0x6818, 0xa085, 0x8000, 0x681a,
++      0x2001, 0x0014, 0x0078, 0x2d01, 0xa184, 0x0007, 0x0079, 0x30e0,
++      0x3888, 0x3888, 0x30e8, 0x3888, 0x38ed, 0x38ed, 0x3888, 0x3888,
++      0xa684, 0x0080, 0x0040, 0x3117, 0x7194, 0x81ff, 0x0040, 0x3117,
++      0xa182, 0x000d, 0x00d0, 0x30f8, 0x7097, 0x0000, 0x0078, 0x30fd,
++      0xa182, 0x000c, 0x7096, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa,
++      0x157e, 0x137e, 0x147e, 0x7098, 0x8114, 0xa210, 0x729a, 0xa080,
++      0x000b, 0xad00, 0x2098, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8108,
++      0x81ac, 0x53a6, 0x147f, 0x137f, 0x157f, 0x0078, 0x3892, 0xa684,
++      0x0400, 0x00c0, 0x3158, 0x6820, 0xa084, 0x0001, 0x0040, 0x3892,
++      0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x312c, 0xa086, 0x0060,
++      0x00c0, 0x312c, 0xa18d, 0x4000, 0xa18c, 0xfffb, 0x795a, 0x69b6,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xa085,
++      0x8000, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3407, 0xa18c,
++      0x00f8, 0x00c0, 0x3407, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b,
++      0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6,
++      0x147f, 0x137f, 0x157f, 0x6814, 0x8007, 0x7882, 0x0078, 0x3892,
++      0x6818, 0xa084, 0x8000, 0x0040, 0x315f, 0x681b, 0x0008, 0x781b,
++      0x00c3, 0x0078, 0x2459, 0x2300, 0x0079, 0x3166, 0x316b, 0x320a,
++      0x3169, 0x1078, 0x23eb, 0x7000, 0xa084, 0x0007, 0x0079, 0x3170,
++      0x2482, 0x317a, 0x31af, 0x3185, 0x3178, 0x2482, 0x3178, 0x3178,
++      0x1078, 0x23eb, 0x681c, 0xa084, 0x2000, 0x0040, 0x3193, 0x6008,
++      0xa085, 0x0002, 0x600a, 0x0078, 0x3193, 0x68c0, 0xa005, 0x00c0,
++      0x31af, 0x6920, 0xa18d, 0x0001, 0x6922, 0x68c3, 0x0001, 0x6800,
++      0x706a, 0x0078, 0x31a9, 0x6920, 0xa18d, 0x0001, 0x6922, 0x6800,
++      0x6006, 0xa005, 0x00c0, 0x319d, 0x6002, 0x681c, 0xa084, 0x000e,
++      0x0040, 0x31a9, 0x7014, 0x68ba, 0x7130, 0xa188, 0x7400, 0x0078,
++      0x31ab, 0x2009, 0x7500, 0x2104, 0x6802, 0x2d0a, 0x7162, 0x6eb6,
++      0xa684, 0x0060, 0x0040, 0x3208, 0xa684, 0x0800, 0x00c0, 0x31c3,
++      0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078,
++      0x4776, 0x0078, 0x3208, 0xa684, 0x0020, 0x0040, 0x31d8, 0x68c0,
++      0xa005, 0x0040, 0x31cf, 0x1078, 0x4b78, 0x0078, 0x31d2, 0xa006,
++      0x1078, 0x4b30, 0x79d8, 0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x31de,
++      0x1078, 0x37fc, 0x69aa, 0x6aa6, 0x1078, 0x4b30, 0xa684, 0x8000,
++      0x0040, 0x3208, 0xa684, 0x7fff, 0x68b6, 0x2001, 0x0076, 0x1078,
++      0x3918, 0x2010, 0x2001, 0x0078, 0x1078, 0x3918, 0x2008, 0xa684,
++      0x0020, 0x00c0, 0x3200, 0x2001, 0x007a, 0x1078, 0x3918, 0x801b,
++      0x00c8, 0x31fb, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++      0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
++      0x0078, 0x2482, 0x0078, 0x36ad, 0x7037, 0x0000, 0xa282, 0x0006,
++      0x0050, 0x3214, 0x1078, 0x23eb, 0x7000, 0xa084, 0x0007, 0x10c0,
++      0x39be, 0x2300, 0x0079, 0x321c, 0x321f, 0x3248, 0x325c, 0x2200,
++      0x0079, 0x3222, 0x3246, 0x36ad, 0x3228, 0x3246, 0x3278, 0x32ba,
++      0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0x157e, 0x20a9,
++      0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x3238, 0x0078, 0x3231,
++      0x157f, 0xad80, 0x0009, 0x7036, 0x6817, 0x0000, 0x68b7, 0x0700,
++      0x6823, 0x0800, 0x6827, 0x0003, 0x0078, 0x369d, 0x1078, 0x23eb,
++      0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0xad80, 0x0009,
++      0x7036, 0x2200, 0x0079, 0x3254, 0x36ad, 0x325a, 0x325a, 0x3278,
++      0x325a, 0x36ad, 0x1078, 0x23eb, 0x7003, 0x0005, 0x2001, 0x7610,
++      0x2068, 0x704a, 0xad80, 0x0009, 0x7036, 0x2200, 0x0079, 0x3268,
++      0x3270, 0x326e, 0x326e, 0x3270, 0x326e, 0x3270, 0x1078, 0x23eb,
++      0x1078, 0x36d1, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078, 0x2459,
++      0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
++      0xa484, 0x001f, 0xa215, 0x2069, 0x7500, 0x2d04, 0x2d08, 0x7162,
++      0x2068, 0xa005, 0x0040, 0x3293, 0x6814, 0xa206, 0x0040, 0x32af,
++      0x6800, 0x0078, 0x3286, 0x7003, 0x0005, 0x2001, 0x7610, 0x2068,
++      0x704a, 0x7036, 0x157e, 0x20a9, 0x0031, 0x2003, 0x0000, 0x8000,
++      0x0070, 0x32a4, 0x0078, 0x329d, 0x157f, 0xad80, 0x0009, 0x7036,
++      0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4,
++      0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x3309, 0x1078, 0x36c9,
++      0x0078, 0x3309, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b,
++      0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x79a8, 0x79a8, 0xa18c,
++      0x00ff, 0xa1e8, 0x7400, 0x2d04, 0x2d08, 0x7162, 0x2068, 0xa005,
++      0x0040, 0x32d9, 0x6814, 0xa206, 0x0040, 0x32f4, 0x6800, 0x0078,
++      0x32cc, 0x7003, 0x0005, 0x2001, 0x7610, 0x2068, 0x704a, 0x157e,
++      0x20a9, 0x0031, 0x2003, 0x0000, 0x8000, 0x0070, 0x32e9, 0x0078,
++      0x32e2, 0x157f, 0xad80, 0x0009, 0x7036, 0x6a16, 0x68b7, 0x0700,
++      0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084,
++      0x0c00, 0x0040, 0x3309, 0xa084, 0x0800, 0x0040, 0x3303, 0x1078,
++      0x36cd, 0x0078, 0x3309, 0x1078, 0x36c9, 0x708b, 0x0000, 0x0078,
++      0x3309, 0x027e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xa080, 0x5380, 0x2060, 0x7056, 0x6000, 0x705a, 0x6004, 0x705e,
++      0xa684, 0x0060, 0x0040, 0x3361, 0x6b98, 0x6c94, 0x69ac, 0x68b0,
++      0xa105, 0x00c0, 0x3343, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4,
++      0xb7ff, 0x7e5a, 0xa684, 0x0060, 0xa086, 0x0060, 0x0040, 0x3361,
++      0x68c0, 0xa005, 0x0040, 0x333c, 0x7003, 0x0003, 0x682b, 0x0000,
++      0x1078, 0x4a29, 0x0078, 0x333e, 0x1078, 0x4a3a, 0xa6b5, 0x2000,
++      0x7e5a, 0x0078, 0x3361, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400,
++      0xa305, 0x0040, 0x3361, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0,
++      0xa6b4, 0xbfff, 0x7e5a, 0x007e, 0x68c0, 0xa005, 0x007f, 0x0040,
++      0x335f, 0x7003, 0x0003, 0x1078, 0x4a29, 0x0078, 0x3361, 0x1078,
++      0x4a85, 0x077f, 0x1078, 0x37ef, 0x2009, 0x0065, 0xa684, 0x0004,
++      0x0040, 0x3382, 0x78e4, 0xa084, 0x0030, 0x0040, 0x337a, 0x78ec,
++      0xa084, 0x0003, 0x0040, 0x337a, 0x782b, 0x3008, 0x2009, 0x0065,
++      0x0078, 0x3382, 0x0f7e, 0x2079, 0x5100, 0x1078, 0x4776, 0x0f7f,
++      0x0040, 0x2482, 0x791a, 0x2d00, 0x704a, 0x8207, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa080, 0x5380, 0x2048, 0x0078, 0x2459,
++      0x6020, 0xa005, 0x0040, 0x339c, 0x8001, 0x6022, 0x6008, 0xa085,
++      0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006, 0x1078, 0x4776,
++      0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100,
++      0x7000, 0xa084, 0x0007, 0x0079, 0x33ad, 0x2482, 0x33b7, 0x33b7,
++      0x33d4, 0x33bf, 0x33bd, 0x33bf, 0x33b5, 0x1078, 0x23eb, 0x1078,
++      0x33df, 0x1078, 0x33d8, 0x1078, 0x1c70, 0x0078, 0x2482, 0x706c,
++      0x706f, 0x0000, 0x7093, 0x0000, 0x0079, 0x33c6, 0x33d0, 0x33d0,
++      0x33ce, 0x33ce, 0x33ce, 0x33d0, 0x33ce, 0x33d0, 0x0079, 0x2861,
++      0x706f, 0x0000, 0x0078, 0x2482, 0x681b, 0x0000, 0x0078, 0x2f17,
++      0x6800, 0xa005, 0x00c0, 0x33dd, 0x6002, 0x6006, 0x007c, 0x6010,
++      0xa005, 0x0040, 0x33e8, 0x8001, 0x00d0, 0x33e8, 0x1078, 0x23eb,
++      0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x6018, 0xa005,
++      0x0040, 0x33f4, 0x8001, 0x601a, 0x007c, 0x1078, 0x3912, 0x681b,
++      0x0018, 0x0078, 0x342b, 0x1078, 0x3912, 0x681b, 0x0019, 0x0078,
++      0x342b, 0x1078, 0x3912, 0x681b, 0x001a, 0x0078, 0x342b, 0x1078,
++      0x3912, 0x681b, 0x0003, 0x0078, 0x342b, 0x7780, 0x1078, 0x37ef,
++      0x7184, 0xa18c, 0x00ff, 0xa1e8, 0x7400, 0x2d04, 0x2d08, 0x2068,
++      0xa005, 0x00c0, 0x341d, 0x0078, 0x2482, 0x6814, 0x7280, 0xa206,
++      0x0040, 0x3425, 0x6800, 0x0078, 0x3416, 0x6800, 0x200a, 0x681b,
++      0x0005, 0x708b, 0x0000, 0x1078, 0x33df, 0x6820, 0xa084, 0x0001,
++      0x00c0, 0x3434, 0x1078, 0x33d8, 0x1078, 0x33ee, 0x681f, 0x0000,
++      0x6823, 0x0020, 0x1078, 0x1c70, 0x0078, 0x2482, 0xa282, 0x0003,
++      0x00c0, 0x369d, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff,
++      0x6920, 0xa18d, 0x0080, 0x6922, 0xa184, 0x0100, 0x0040, 0x34a2,
++      0xa18c, 0xfeff, 0x6922, 0xa4a4, 0x00ff, 0x0040, 0x348c, 0xa482,
++      0x000c, 0x0048, 0x345f, 0x0040, 0x345f, 0x2021, 0x000c, 0x852b,
++      0x852b, 0x1078, 0x3760, 0x0040, 0x3469, 0x1078, 0x355b, 0x0078,
++      0x3495, 0x1078, 0x371b, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5,
++      0x6006, 0x1078, 0x3586, 0x0c7f, 0x6920, 0xa18d, 0x0100, 0x6922,
++      0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x3486,
++      0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b, 0x3008,
++      0x781b, 0x0065, 0x0078, 0x2459, 0x0c7e, 0x2960, 0x6004, 0xa084,
++      0xfff5, 0x6006, 0x1078, 0x3586, 0x0c7f, 0x7e58, 0xa684, 0x0400,
++      0x00c0, 0x349e, 0x781b, 0x0058, 0x0078, 0x2459, 0x781b, 0x0065,
++      0x0078, 0x2459, 0x0c7e, 0x7054, 0x2060, 0x6100, 0xa18c, 0x1000,
++      0x0040, 0x34e2, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c,
++      0x0048, 0x34b6, 0x0040, 0x34b6, 0x2011, 0x000c, 0x2400, 0xa202,
++      0x00c8, 0x34bb, 0x2220, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086,
++      0x0028, 0x00c0, 0x34cb, 0xa282, 0x0019, 0x00c8, 0x34d1, 0x2011,
++      0x0019, 0x0078, 0x34d1, 0xa282, 0x000c, 0x00c8, 0x34d1, 0x2011,
++      0x000c, 0x2200, 0xa502, 0x00c8, 0x34d6, 0x2228, 0x1078, 0x371f,
++      0x852b, 0x852b, 0x1078, 0x3760, 0x0040, 0x34e2, 0x1078, 0x355b,
++      0x0078, 0x34e6, 0x1078, 0x371b, 0x1078, 0x3586, 0x7858, 0xa085,
++      0x0004, 0x785a, 0x0c7f, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
++      0x2459, 0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x3509,
++      0x6010, 0xa084, 0x000f, 0x00c0, 0x3503, 0x6104, 0xa18c, 0xfff5,
++      0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078,
++      0x3530, 0x68a0, 0xa084, 0x0200, 0x00c0, 0x3503, 0x6208, 0xa294,
++      0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x351e, 0xa282, 0x0019,
++      0x00c8, 0x3524, 0x2011, 0x0019, 0x0078, 0x3524, 0xa282, 0x000c,
++      0x00c8, 0x3524, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff,
++      0xa382, 0x000c, 0x0048, 0x3530, 0x0040, 0x3530, 0x2019, 0x000c,
++      0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa,
++      0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, 0x007c,
++      0x0c7e, 0x2960, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019,
++      0x0000, 0x0078, 0x354b, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++      0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100,
++      0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7154, 0x2160, 0x1078, 0x3562,
++      0x0c7f, 0x007c, 0x2008, 0xa084, 0xfff0, 0xa425, 0x7c86, 0x6018,
++      0x789a, 0x7cae, 0x6412, 0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007,
++      0xa105, 0x78a6, 0x6016, 0x788a, 0xa4a4, 0x000f, 0x8427, 0x8204,
++      0x8004, 0xa084, 0x00ff, 0xa405, 0x600e, 0x78ec, 0xd08c, 0x00c0,
++      0x3585, 0x6004, 0xa084, 0xfff5, 0x6006, 0x007c, 0x0c7e, 0x7054,
++      0x2060, 0x1078, 0x358d, 0x0c7f, 0x007c, 0x6018, 0x789a, 0x78a4,
++      0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886,
++      0x007c, 0xa282, 0x0002, 0x00c0, 0x369d, 0x7aa8, 0x6920, 0xa18d,
++      0x0080, 0x6922, 0xa184, 0x0200, 0x0040, 0x35e2, 0xa18c, 0xfdff,
++      0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x369d, 0x1078,
++      0x362b, 0x1078, 0x3586, 0xa980, 0x0001, 0x200c, 0x1078, 0x37eb,
++      0x1078, 0x34f1, 0x88ff, 0x0040, 0x35d5, 0x789b, 0x0060, 0x2800,
++      0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0,
++      0x35cf, 0x782b, 0x3008, 0x781b, 0x0056, 0x0078, 0x2459, 0x782b,
++      0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x7e58, 0xa684, 0x0400,
++      0x00c0, 0x35de, 0x781b, 0x0058, 0x0078, 0x2459, 0x781b, 0x0065,
++      0x0078, 0x2459, 0xa282, 0x0002, 0x00c8, 0x35ea, 0xa284, 0x0001,
++      0x0040, 0x35f4, 0x7154, 0xa188, 0x0000, 0x210c, 0xa18c, 0x2000,
++      0x00c0, 0x35f4, 0x2011, 0x0000, 0x1078, 0x370d, 0x1078, 0x362b,
++      0x1078, 0x3586, 0x7858, 0xa085, 0x0004, 0x785a, 0x782b, 0x3008,
++      0x781b, 0x0065, 0x0078, 0x2459, 0x0c7e, 0x027e, 0x2960, 0x6000,
++      0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x361b, 0x6014, 0xa084,
++      0x0040, 0x00c0, 0x3619, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078,
++      0x3628, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++      0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200, 0x6822,
++      0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7054, 0x2060, 0x1078, 0x3632,
++      0x0c7f, 0x007c, 0x82ff, 0x0040, 0x3637, 0x2011, 0x0040, 0x6018,
++      0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6,
++      0x788a, 0x6016, 0x78ec, 0xd08c, 0x00c0, 0x364a, 0x6004, 0xa084,
++      0xffef, 0x6006, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040,
++      0x3654, 0x007f, 0x0078, 0x3657, 0x007f, 0x0078, 0x3699, 0xa684,
++      0x0020, 0x0040, 0x3699, 0x7888, 0xa084, 0x0040, 0x0040, 0x3699,
++      0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x3667, 0x8000, 0xa005,
++      0x0040, 0x367d, 0x831b, 0x00c8, 0x3670, 0x8001, 0x0040, 0x3695,
++      0xa684, 0x4000, 0x0040, 0x367d, 0x78b8, 0x801b, 0x00c8, 0x3679,
++      0x8000, 0xa084, 0x003f, 0x00c0, 0x3695, 0xa6b4, 0xbfff, 0x7e5a,
++      0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x3689, 0xa291,
++      0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x4b30, 0x781b,
++      0x0064, 0x1078, 0x49b5, 0x0078, 0x2459, 0x781b, 0x0064, 0x0078,
++      0x2459, 0x781b, 0x0065, 0x0078, 0x2459, 0x1078, 0x36d5, 0x782b,
++      0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x1078, 0x36c1, 0x782b,
++      0x3008, 0x781b, 0x0065, 0x0078, 0x2459, 0x6827, 0x0002, 0x1078,
++      0x36c9, 0x78e4, 0xa084, 0x0030, 0x0040, 0x2482, 0x78ec, 0xa084,
++      0x0003, 0x0040, 0x2482, 0x782b, 0x3008, 0x781b, 0x0065, 0x0078,
++      0x2459, 0x2001, 0x0005, 0x0078, 0x36d7, 0x2001, 0x000c, 0x0078,
++      0x36d7, 0x2001, 0x0006, 0x0078, 0x36d7, 0x2001, 0x000d, 0x0078,
++      0x36d7, 0x2001, 0x0009, 0x0078, 0x36d7, 0x2001, 0x0007, 0x789b,
++      0x0010, 0x78aa, 0x789b, 0x0060, 0x78ab, 0x0001, 0xa6b5, 0x0004,
++      0x7e5a, 0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b,
++      0x8703, 0xa0e0, 0x5380, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184,
++      0x000f, 0x0040, 0x36fb, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004,
++      0xa085, 0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184,
++      0x0040, 0x0040, 0x370b, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004,
++      0xa085, 0x0010, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab,
++      0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060,
++      0x78ab, 0x0004, 0x007c, 0x2021, 0x0000, 0x2029, 0x0032, 0x789b,
++      0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
++      0x7caa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007,
++      0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4,
++      0xa18c, 0xfff0, 0x2001, 0x5146, 0x2004, 0xa082, 0x0028, 0x0040,
++      0x3749, 0x2021, 0x37d2, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078,
++      0x374f, 0x2021, 0x37de, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011,
++      0x0064, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, 0x375e, 0x8420,
++      0x2300, 0xa210, 0x0070, 0x375e, 0x0078, 0x3751, 0x157f, 0x007c,
++      0x157e, 0x2009, 0x5146, 0x210c, 0xa182, 0x0032, 0x0048, 0x3774,
++      0x0040, 0x3778, 0x2009, 0x37c4, 0x2019, 0x0011, 0x20a9, 0x000e,
++      0x2011, 0x0032, 0x0078, 0x378a, 0xa182, 0x0028, 0x0040, 0x3782,
++      0x2009, 0x37d2, 0x2019, 0x0014, 0x20a9, 0x000c, 0x2011, 0x0064,
++      0x0078, 0x378a, 0x2009, 0x37de, 0x2019, 0x0019, 0x20a9, 0x000d,
++      0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x379a, 0x0048, 0x379a,
++      0x8108, 0x2300, 0xa210, 0x0070, 0x3797, 0x0078, 0x378a, 0x157f,
++      0xa006, 0x007c, 0x157f, 0xa582, 0x0064, 0x00c8, 0x37a9, 0x7808,
++      0xa085, 0x0070, 0x780a, 0x7044, 0xa085, 0x0070, 0x7046, 0x0078,
++      0x37a9, 0x78ec, 0xa084, 0x0300, 0x0040, 0x37b1, 0x2104, 0x0078,
++      0x37c2, 0x2104, 0xa09e, 0x1102, 0x00c0, 0x37c2, 0x2001, 0x04fd,
++      0x2004, 0xa082, 0x0005, 0x0048, 0x37c1, 0x2001, 0x1201, 0x0078,
++      0x37c2, 0x2104, 0xa005, 0x007c, 0x1102, 0x3002, 0x3202, 0x4203,
++      0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07,
++      0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202, 0x7202, 0x6605,
++      0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202,
++      0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04,
++      0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784,
++      0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003,
++      0xa105, 0xa0e0, 0x5400, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b,
++      0x00c8, 0x3803, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++      0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x5140, 0x2091, 0x8000,
++      0x2104, 0x0079, 0x3813, 0x3849, 0x381d, 0x381d, 0x381d, 0x381d,
++      0x381d, 0x381d, 0x384d, 0x1078, 0x23eb, 0x784b, 0x0004, 0x7848,
++      0xa084, 0x0004, 0x00c0, 0x381f, 0x784b, 0x0008, 0x7848, 0xa084,
++      0x0008, 0x00c0, 0x3826, 0x68b4, 0xa085, 0x4000, 0x68b6, 0x7858,
++      0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080, 0x00c0, 0x3849,
++      0x0018, 0x3849, 0x681c, 0xa084, 0x0020, 0x00c0, 0x3847, 0x0e7e,
++      0x2071, 0x5140, 0x1078, 0x389c, 0x0e7f, 0x0078, 0x3849, 0x781b,
++      0x00cd, 0x2091, 0x8001, 0x0f7f, 0x007c, 0x70b3, 0x0000, 0x1078,
++      0x3a76, 0x0078, 0x3849, 0x0c7e, 0x6814, 0x8007, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa0e0, 0x5380, 0x6004, 0xa084, 0x000a,
++      0x00c0, 0x3886, 0x6108, 0xa194, 0xff00, 0x0040, 0x3886, 0xa18c,
++      0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x3875, 0x2001, 0x0032,
++      0xa106, 0x0040, 0x3879, 0x0078, 0x387d, 0x2009, 0x0020, 0x0078,
++      0x387f, 0x2009, 0x003f, 0x0078, 0x387f, 0x2011, 0x0000, 0x2100,
++      0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c,
++      0x781b, 0x0065, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x0065,
++      0x0078, 0x2459, 0x781b, 0x0058, 0x0078, 0x2459, 0x782b, 0x3008,
++      0x781b, 0x0056, 0x0078, 0x2459, 0x2009, 0x5120, 0x210c, 0xa186,
++      0x0000, 0x0040, 0x38b0, 0xa186, 0x0001, 0x0040, 0x38b3, 0x2009,
++      0x5138, 0x200b, 0x000b, 0x706f, 0x0001, 0x781b, 0x0048, 0x007c,
++      0x781b, 0x00c7, 0x007c, 0x2009, 0x5138, 0x200b, 0x000a, 0x007c,
++      0x2009, 0x5120, 0x210c, 0xa186, 0x0000, 0x0040, 0x38d3, 0xa186,
++      0x0001, 0x0040, 0x38cd, 0x2009, 0x5138, 0x200b, 0x000b, 0x706f,
++      0x0001, 0x781b, 0x0048, 0x0078, 0x2459, 0x2009, 0x5138, 0x200b,
++      0x000a, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b, 0x00c7, 0x0078,
++      0x2459, 0x781b, 0x00cd, 0x0078, 0x2459, 0x782b, 0x3008, 0x781b,
++      0x00cd, 0x0078, 0x2459, 0x781b, 0x008e, 0x0078, 0x2459, 0x782b,
++      0x3008, 0x781b, 0x008e, 0x0078, 0x2459, 0x6818, 0xa084, 0x8000,
++      0x0040, 0x38f4, 0x681b, 0x001d, 0x706f, 0x0001, 0x781b, 0x0048,
++      0x0078, 0x2459, 0x007e, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3910,
++      0x7808, 0xa084, 0xfffc, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005,
++      0x78ec, 0xa084, 0x0021, 0x0040, 0x3910, 0x7044, 0x780a, 0xa005,
++      0x007f, 0x007c, 0x7044, 0xa085, 0x0002, 0x7046, 0x780a, 0x007c,
++      0x007e, 0x7830, 0xa084, 0x0040, 0x00c0, 0x3919, 0x0098, 0x3924,
++      0x007f, 0x789a, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a,
++      0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040,
++      0x3933, 0x0098, 0x3931, 0x007f, 0x789a, 0x78ac, 0x007e, 0x7044,
++      0x780a, 0x007f, 0x007c, 0x78ec, 0xa084, 0x0002, 0x00c0, 0x4760,
++      0xa784, 0x007d, 0x00c0, 0x3947, 0x2700, 0x1078, 0x23eb, 0xa784,
++      0x0001, 0x00c0, 0x2f6d, 0xa784, 0x0070, 0x0040, 0x3957, 0x0c7e,
++      0x2d60, 0x2f68, 0x1078, 0x2396, 0x2d78, 0x2c68, 0x0c7f, 0xa784,
++      0x0008, 0x0040, 0x3964, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
++      0x0040, 0x2482, 0x0078, 0x3888, 0xa784, 0x0004, 0x0040, 0x3997,
++      0x78b8, 0xa084, 0x4001, 0x0040, 0x3997, 0x784b, 0x0008, 0x78ec,
++      0xa084, 0x0003, 0x0040, 0x2482, 0x78e4, 0xa084, 0x0007, 0xa086,
++      0x0001, 0x00c0, 0x3997, 0x78c0, 0xa085, 0x4800, 0x2030, 0x7e5a,
++      0x781b, 0x00cd, 0x0078, 0x2459, 0x784b, 0x0008, 0x6818, 0xa084,
++      0x8000, 0x0040, 0x3993, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040,
++      0x3993, 0x681b, 0x0007, 0x1078, 0x389c, 0x0078, 0x2459, 0x681b,
++      0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833,
++      0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2965,
++      0x0018, 0x2459, 0x0078, 0x36a5, 0x6b14, 0x8307, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa080, 0x5380, 0x2060, 0x2048, 0x7056,
++      0x6000, 0x705a, 0x6004, 0x705e, 0x2a60, 0x007c, 0x0079, 0x39c0,
++      0x39c8, 0x39c9, 0x39c8, 0x39cb, 0x39c8, 0x39c8, 0x39c8, 0x39d0,
++      0x007c, 0x1078, 0x33ee, 0x1078, 0x4776, 0x7038, 0x600a, 0x007c,
++      0x70a0, 0xa005, 0x0040, 0x39dd, 0x2068, 0x1078, 0x1b62, 0x1078,
++      0x46f8, 0x1078, 0x46ff, 0x70a3, 0x0000, 0x007c, 0x0e7e, 0x2091,
++      0x8000, 0x2071, 0x5140, 0x7000, 0xa086, 0x0007, 0x00c0, 0x39f4,
++      0x6110, 0x70bc, 0xa106, 0x00c0, 0x39f4, 0x0e7f, 0x1078, 0x1b6f,
++      0x1078, 0x39fa, 0xa006, 0x007c, 0x2091, 0x8001, 0x0e7f, 0xa085,
++      0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x5140, 0x0078, 0x21fa,
++      0x785b, 0x0000, 0x70af, 0x000e, 0x2009, 0x0100, 0x017e, 0x70a0,
++      0xa06d, 0x0040, 0x3a0f, 0x70a3, 0x0000, 0x0078, 0x3a15, 0x70b3,
++      0x0000, 0x1078, 0x1b8b, 0x0040, 0x3a1b, 0x70ac, 0x6826, 0x1078,
++      0x3af8, 0x0078, 0x3a0f, 0x017f, 0x157e, 0x0c7e, 0x0d7e, 0x20a9,
++      0x0008, 0x2061, 0x7510, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d,
++      0x0040, 0x3a33, 0x6800, 0x601e, 0x1078, 0x195a, 0x6008, 0x8000,
++      0x600a, 0x0078, 0x3a26, 0x6018, 0xa06d, 0x0040, 0x3a3d, 0x6800,
++      0x601a, 0x1078, 0x195a, 0x0078, 0x3a33, 0xace0, 0x0008, 0x0070,
++      0x3a43, 0x0078, 0x3a23, 0x709c, 0xa084, 0x8000, 0x0040, 0x3a4a,
++      0x1078, 0x3b72, 0x0d7f, 0x0c7f, 0x157f, 0x007c, 0x127e, 0x2091,
++      0x2300, 0x6804, 0xa084, 0x000f, 0x0079, 0x3a56, 0x3a66, 0x3a66,
++      0x3a66, 0x3a66, 0x3a66, 0x3a66, 0x3a68, 0x3a6e, 0x3a66, 0x3a66,
++      0x3a66, 0x3a66, 0x3a66, 0x3a70, 0x3a66, 0x3a68, 0x1078, 0x23eb,
++      0x1078, 0x44d0, 0x1078, 0x195a, 0x0078, 0x3a74, 0x6827, 0x000b,
++      0x1078, 0x44d0, 0x1078, 0x3af8, 0x127f, 0x007c, 0x127e, 0x2091,
++      0x2300, 0x0098, 0x3a92, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3a92,
++      0x0d7e, 0x1078, 0x4708, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001,
++      0x0000, 0x6827, 0x0084, 0x1078, 0x46c1, 0x1078, 0x3af8, 0x0d7f,
++      0x0078, 0x3ac6, 0x7948, 0xa185, 0x4000, 0x784a, 0x0098, 0x3a9b,
++      0x794a, 0x0078, 0x3a80, 0x7828, 0xa086, 0x1834, 0x00c0, 0x3aa4,
++      0xa185, 0x0004, 0x0078, 0x3aab, 0x7828, 0xa086, 0x1814, 0x00c0,
++      0x3a98, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e, 0x78ab, 0x0002,
++      0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a, 0x70b4, 0xa080,
++      0x0091, 0x781a, 0x6827, 0x0284, 0x682c, 0x6836, 0x6830, 0x683a,
++      0x2009, 0x0004, 0x2001, 0x0000, 0x1078, 0x46c1, 0x127f, 0x007c,
++      0x0d7e, 0x6b14, 0x1078, 0x1bfd, 0x0040, 0x3ad5, 0x2068, 0x6827,
++      0x0002, 0x1078, 0x3af8, 0x0078, 0x3aca, 0x0d7f, 0x007c, 0x0d7e,
++      0x6b14, 0x6c28, 0xa4a4, 0x00ff, 0x1078, 0x1b9b, 0x0040, 0x3ae5,
++      0x2068, 0x6827, 0x0002, 0x1078, 0x3af8, 0x0d7f, 0x007c, 0x0d7e,
++      0x6b14, 0xa39c, 0x00ff, 0x1078, 0x1bce, 0x0040, 0x3af6, 0x2068,
++      0x6827, 0x0002, 0x1078, 0x3af8, 0x0078, 0x3aeb, 0x0d7f, 0x007c,
++      0x0c7e, 0x6914, 0x1078, 0x3b69, 0x6904, 0xa18c, 0x00ff, 0xa186,
++      0x0006, 0x0040, 0x3b13, 0xa186, 0x000d, 0x0040, 0x3b32, 0xa186,
++      0x0017, 0x00c0, 0x3b0f, 0x1078, 0x195a, 0x0078, 0x3b11, 0x1078,
++      0x1c72, 0x0c7f, 0x007c, 0x6004, 0x8001, 0x0048, 0x3b30, 0x6006,
++      0x2009, 0x0000, 0xa684, 0x0001, 0x00c0, 0x3b20, 0xa18d, 0x8000,
++      0xa684, 0x0004, 0x0040, 0x3b26, 0xa18d, 0x0002, 0x691e, 0x6823,
++      0x0000, 0x7104, 0x810f, 0x6818, 0xa105, 0x681a, 0x0078, 0x3b0f,
++      0x1078, 0x23eb, 0x6018, 0xa005, 0x00c0, 0x3b41, 0x6008, 0x8001,
++      0x0048, 0x3b41, 0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078,
++      0x3b57, 0xac88, 0x0006, 0x2104, 0xa005, 0x0040, 0x3b4a, 0x2008,
++      0x0078, 0x3b43, 0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x3b11,
++      0x600a, 0x6018, 0x2068, 0x6800, 0x601a, 0x0078, 0x3b3b, 0x157e,
++      0x137e, 0x147e, 0x0c7e, 0x0d7e, 0x1078, 0x1937, 0x2da0, 0x137f,
++      0x20a9, 0x0031, 0x53a3, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x0078,
++      0x3b0f, 0xa184, 0x001f, 0x8003, 0x8003, 0x8003, 0xa080, 0x7510,
++      0x2060, 0x007c, 0x2019, 0x5151, 0x2304, 0xa085, 0x0001, 0x201a,
++      0x2019, 0x0102, 0x2304, 0xa085, 0x0001, 0x201a, 0x007c, 0x2019,
++      0x5151, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2019, 0x0102, 0x2304,
++      0xa084, 0xfffe, 0x201a, 0x007c, 0x7990, 0xa18c, 0xfff8, 0x7992,
++      0x70b4, 0xa080, 0x00dd, 0x781a, 0x0078, 0x2459, 0x70a3, 0x0000,
++      0x7003, 0x0000, 0x7043, 0x0001, 0x7037, 0x0000, 0x0018, 0x2410,
++      0x1078, 0x1b8b, 0x0040, 0x3bc7, 0x2009, 0x510f, 0x200b, 0x0000,
++      0x68bc, 0x2060, 0x6100, 0xa184, 0x0300, 0x0040, 0x3bbb, 0x6827,
++      0x000e, 0xa084, 0x0200, 0x0040, 0x3bb7, 0x6827, 0x0017, 0x1078,
++      0x3af8, 0x0078, 0x3b96, 0x7000, 0xa086, 0x0007, 0x00c0, 0x3c29,
++      0x2d00, 0x70a2, 0xad80, 0x000f, 0x7036, 0x0078, 0x3bce, 0x7040,
++      0xa086, 0x0001, 0x0040, 0x2492, 0x0078, 0x2459, 0x2031, 0x0000,
++      0x691c, 0xa184, 0x0002, 0x0040, 0x3bd7, 0xa6b5, 0x0004, 0xa184,
++      0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x3cc2, 0x2004, 0xa635,
++      0x6820, 0xa084, 0x0400, 0x0040, 0x3bef, 0x789b, 0x0018, 0x78ab,
++      0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0x6820,
++      0xa084, 0x8000, 0x00c0, 0x3bfd, 0x681c, 0xa084, 0x8000, 0x00c0,
++      0x3c04, 0xa6b5, 0x0800, 0x0078, 0x3c04, 0xa6b5, 0x0400, 0x789b,
++      0x000e, 0x6824, 0x8007, 0x78aa, 0x6820, 0xa084, 0x0100, 0x0040,
++      0x3c0b, 0xa6b5, 0x4000, 0xa684, 0x0200, 0x0040, 0x3c25, 0x682c,
++      0x78d2, 0x6830, 0x78d6, 0xa684, 0x0100, 0x0040, 0x3c23, 0x682c,
++      0xa084, 0x0001, 0x0040, 0x3c23, 0x7888, 0xa084, 0x0040, 0x0040,
++      0x3c23, 0xa6b5, 0x8000, 0x1078, 0x46f0, 0x7e5a, 0x6eb6, 0x0078,
++      0x4727, 0x1078, 0x38fa, 0x00c0, 0x3cbc, 0x702c, 0x8004, 0x0048,
++      0x3c37, 0x2019, 0x4e3b, 0x1078, 0x2276, 0x702f, 0x0001, 0x2041,
++      0x0001, 0x2031, 0x1000, 0x789b, 0x0018, 0x6814, 0xa084, 0x001f,
++      0xa085, 0x0080, 0x78aa, 0x691c, 0xa184, 0x0002, 0x0040, 0x3c50,
++      0xa6b5, 0x0004, 0x78ab, 0x0020, 0x6828, 0x78aa, 0xa8c0, 0x0002,
++      0x681c, 0xd0f4, 0x0040, 0x3c59, 0x2c50, 0x1078, 0x39ac, 0x1078,
++      0x45ff, 0x6820, 0xa084, 0x8000, 0x0040, 0x3c67, 0xa6b5, 0x0400,
++      0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x3c6e, 0x681c,
++      0xa084, 0x8000, 0x00c0, 0x3c6e, 0xa6b5, 0x0800, 0x6820, 0xa084,
++      0x0100, 0x0040, 0x3c75, 0xa6b5, 0x4000, 0x681c, 0xa084, 0x00c0,
++      0x8003, 0x8003, 0x8007, 0xa080, 0x3cc2, 0x2004, 0xa635, 0xa684,
++      0x0100, 0x0040, 0x3c8f, 0x682c, 0xa084, 0x0001, 0x0040, 0x3c8f,
++      0x7888, 0xa084, 0x0040, 0x0040, 0x3c8f, 0xa6b5, 0x8000, 0x789b,
++      0x007e, 0x7eae, 0x6eb6, 0x6814, 0x8007, 0x78aa, 0x7882, 0x2810,
++      0x7aaa, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x3cbc, 0x0018, 0x3cbc,
++      0x70b4, 0xa080, 0x00e2, 0x781a, 0x1078, 0x3912, 0xa684, 0x0200,
++      0x0040, 0x3cb0, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x1078, 0x46f0,
++      0x2d00, 0x70a2, 0x704a, 0x6810, 0x70be, 0x7003, 0x0007, 0xad80,
++      0x000f, 0x7036, 0x0078, 0x2459, 0x1078, 0x1b62, 0x1078, 0x3912,
++      0x0078, 0x2459, 0x0000, 0x0300, 0x0200, 0x0000, 0x1078, 0x23eb,
++      0x2300, 0x0079, 0x3ccb, 0x3cce, 0x3cce, 0x3cd0, 0x1078, 0x23eb,
++      0x1078, 0x46ff, 0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x0040,
++      0x3ce2, 0xa184, 0xff00, 0xa085, 0x000a, 0x6826, 0x1078, 0x1b62,
++      0x0078, 0x3b96, 0x2001, 0x000a, 0x1078, 0x4691, 0x0078, 0x3b96,
++      0xa282, 0x0005, 0x0050, 0x3cee, 0x1078, 0x23eb, 0x7000, 0xa084,
++      0x0007, 0x10c0, 0x39be, 0x1078, 0x1937, 0x00c0, 0x3d0d, 0xa684,
++      0x0004, 0x0040, 0x3cff, 0x2001, 0x2800, 0x0078, 0x3d01, 0x2001,
++      0x0800, 0x71b4, 0xa188, 0x0091, 0x789b, 0x000e, 0x78aa, 0x2031,
++      0x0400, 0x7e5a, 0x791a, 0x0078, 0x2459, 0x6807, 0x0106, 0x680b,
++      0x0000, 0x689f, 0x0000, 0x6827, 0x0000, 0xa386, 0x0002, 0x00c0,
++      0x3d2e, 0xa286, 0x0002, 0x00c0, 0x3d2e, 0x78a0, 0xa005, 0x00c0,
++      0x3d2e, 0xa484, 0x8000, 0x00c0, 0x3d2e, 0x78e4, 0xa084, 0x0008,
++      0x0040, 0x3d2e, 0xa6b5, 0x0008, 0x2019, 0x0000, 0x1078, 0x411e,
++      0x2d00, 0x70a2, 0x704a, 0x7003, 0x0007, 0x7037, 0x0000, 0x6824,
++      0xa084, 0x0080, 0x0040, 0x3d40, 0x1078, 0x41d0, 0x0078, 0x2459,
++      0x2300, 0x0079, 0x3d43, 0x3d46, 0x3dc7, 0x3de6, 0x2200, 0x0079,
++      0x3d49, 0x3d4e, 0x3d5e, 0x3d84, 0x3d90, 0x3db3, 0x2029, 0x0001,
++      0xa026, 0x2011, 0x0000, 0x1078, 0x42f1, 0x0079, 0x3d57, 0x3d5c,
++      0x2459, 0x3b96, 0x3d5c, 0x3d5c, 0x1078, 0x23eb, 0x7990, 0xa18c,
++      0x0007, 0x00c0, 0x3d65, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684,
++      0x0004, 0x0040, 0x3d6d, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011,
++      0x0001, 0x1078, 0x42f1, 0x0079, 0x3d75, 0x3d7a, 0x2459, 0x3b96,
++      0x3d82, 0x3d7c, 0x0078, 0x472d, 0x70ab, 0x3d80, 0x0078, 0x2459,
++      0x0078, 0x3d7a, 0x1078, 0x23eb, 0xa684, 0x0010, 0x0040, 0x3d8e,
++      0x1078, 0x419f, 0x0040, 0x3d8e, 0x0078, 0x2459, 0x0078, 0x420c,
++      0x6000, 0xa084, 0x0002, 0x0040, 0x3dad, 0x70b4, 0xa080, 0x00d2,
++      0x781a, 0x0d7e, 0x1078, 0x4708, 0x2d00, 0x682e, 0x6827, 0x0000,
++      0x1078, 0x3af8, 0x0d7f, 0x1078, 0x195a, 0x7003, 0x0000, 0x7037,
++      0x0000, 0x704b, 0x0000, 0x0078, 0x3b96, 0xa684, 0x0004, 0x00c0,
++      0x3db3, 0x0078, 0x472d, 0x6000, 0xa084, 0x0004, 0x00c0, 0x3dc5,
++      0x6000, 0xa084, 0x0001, 0x0040, 0x3dc5, 0x70ab, 0x3dc5, 0x2001,
++      0x0007, 0x1078, 0x4689, 0x0078, 0x4733, 0x0078, 0x472d, 0x2200,
++      0x0079, 0x3dca, 0x3dcf, 0x3dcf, 0x3dcf, 0x3dd1, 0x3dcf, 0x1078,
++      0x23eb, 0x70a7, 0x3dd5, 0x0078, 0x4739, 0x2011, 0x0018, 0x1078,
++      0x42eb, 0x0079, 0x3ddb, 0x3de0, 0x2459, 0x3b96, 0x3de2, 0x3de4,
++      0x1078, 0x23eb, 0x1078, 0x23eb, 0x1078, 0x23eb, 0x2200, 0x0079,
++      0x3de9, 0x3dee, 0x3df0, 0x3df0, 0x3dee, 0x3dee, 0x1078, 0x23eb,
++      0x78e4, 0xa084, 0x0008, 0x0040, 0x3e05, 0x70a7, 0x3df9, 0x0078,
++      0x4739, 0x2011, 0x0004, 0x1078, 0x42eb, 0x0079, 0x3dff, 0x3e05,
++      0x2459, 0x3b96, 0x3e05, 0x3e0f, 0x3e13, 0x70ab, 0x3e0d, 0x2001,
++      0x0003, 0x1078, 0x4689, 0x0078, 0x4733, 0x0078, 0x472d, 0x70ab,
++      0x3e05, 0x0078, 0x2459, 0x70ab, 0x3e17, 0x0078, 0x2459, 0x0078,
++      0x3e0d, 0xa282, 0x0003, 0x0050, 0x3e1f, 0x1078, 0x23eb, 0xa386,
++      0x0002, 0x00c0, 0x3e38, 0xa286, 0x0002, 0x00c0, 0x3e3e, 0x78a0,
++      0xa005, 0x00c0, 0x3e3e, 0xa484, 0x8000, 0x00c0, 0x3e3e, 0x78e4,
++      0xa084, 0x0008, 0x0040, 0x3e38, 0xa6b5, 0x0008, 0x2019, 0x0000,
++      0xa684, 0x0008, 0x0040, 0x3e3e, 0x1078, 0x417c, 0x6810, 0x70be,
++      0x7003, 0x0007, 0x2300, 0x0079, 0x3e45, 0x3e48, 0x3e75, 0x3e7d,
++      0x2200, 0x0079, 0x3e4b, 0x3e50, 0x3e4e, 0x3e69, 0x1078, 0x23eb,
++      0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001, 0x1078, 0x42f1,
++      0x0079, 0x3e5a, 0x3e5f, 0x2459, 0x3b96, 0x3e67, 0x3e61, 0x0078,
++      0x472d, 0x70ab, 0x3e65, 0x0078, 0x2459, 0x0078, 0x3e5f, 0x1078,
++      0x23eb, 0xa684, 0x0010, 0x0040, 0x3e73, 0x1078, 0x419f, 0x0040,
++      0x3e73, 0x0078, 0x2459, 0x0078, 0x420c, 0x2200, 0x0079, 0x3e78,
++      0x3e7b, 0x3e7b, 0x3e7b, 0x1078, 0x23eb, 0x2200, 0x0079, 0x3e80,
++      0x3e83, 0x3e85, 0x3e85, 0x1078, 0x23eb, 0x78e4, 0xa084, 0x0008,
++      0x0040, 0x3e9a, 0x70a7, 0x3e8e, 0x0078, 0x4739, 0x2011, 0x0004,
++      0x1078, 0x42eb, 0x0079, 0x3e94, 0x3e9a, 0x2459, 0x3b96, 0x3e9a,
++      0x3ea4, 0x3ea8, 0x70ab, 0x3ea2, 0x2001, 0x0003, 0x1078, 0x4689,
++      0x0078, 0x4733, 0x0078, 0x472d, 0x70ab, 0x3e9a, 0x0078, 0x2459,
++      0x70ab, 0x3eac, 0x0078, 0x2459, 0x0078, 0x3ea2, 0x2300, 0x0079,
++      0x3eb1, 0x3eb6, 0x3eb8, 0x3eb4, 0x1078, 0x23eb, 0x70a4, 0x007a,
++      0x70a4, 0x007a, 0xa282, 0x0002, 0x0050, 0x3ec0, 0x1078, 0x23eb,
++      0xa684, 0x0200, 0x0040, 0x3eca, 0x1078, 0x46f8, 0x1078, 0x42d3,
++      0x1078, 0x46ff, 0x2300, 0x0079, 0x3ecd, 0x3ed0, 0x3ef4, 0x3f5a,
++      0xa286, 0x0001, 0x0040, 0x3ed6, 0x1078, 0x23eb, 0xa684, 0x0200,
++      0x0040, 0x3ede, 0x1078, 0x46f8, 0x1078, 0x46ff, 0x2001, 0x0001,
++      0x1078, 0x4691, 0x78b8, 0xa084, 0xc001, 0x0040, 0x3ef0, 0x7848,
++      0xa085, 0x0008, 0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3eeb,
++      0x7003, 0x0000, 0x0078, 0x3b96, 0x2200, 0x0079, 0x3ef7, 0x3ef9,
++      0x3f2a, 0x70a7, 0x3efd, 0x0078, 0x4739, 0x2011, 0x000d, 0x1078,
++      0x42eb, 0x0079, 0x3f03, 0x3f0a, 0x2459, 0x3b96, 0x3f12, 0x3f1a,
++      0x3f20, 0x3f22, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++      0x0078, 0x4727, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++      0x0078, 0x4727, 0x70ab, 0x3f1e, 0x0078, 0x2459, 0x0078, 0x3f0a,
++      0x1078, 0x23eb, 0x70ab, 0x3f26, 0x0078, 0x2459, 0x1078, 0x473f,
++      0x0078, 0x2459, 0x70a7, 0x3f2e, 0x0078, 0x4739, 0x2011, 0x0012,
++      0x1078, 0x42eb, 0x0079, 0x3f34, 0x3f3a, 0x2459, 0x3b96, 0x3f46,
++      0x3f4e, 0x3f54, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++      0x70b4, 0xa080, 0x00a6, 0x781a, 0x0078, 0x2459, 0xa6b4, 0x00ff,
++      0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0x70ab, 0x3f52,
++      0x0078, 0x2459, 0x0078, 0x3f3a, 0x70ab, 0x3f58, 0x0078, 0x2459,
++      0x0078, 0x3f46, 0xa286, 0x0001, 0x0040, 0x3f60, 0x1078, 0x23eb,
++      0x70a7, 0x3f64, 0x0078, 0x4739, 0x2011, 0x0015, 0x1078, 0x42eb,
++      0x0079, 0x3f6a, 0x3f6f, 0x2459, 0x3b96, 0x3f7d, 0x3f89, 0xa6b4,
++      0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x783b, 0x1301, 0x70b4,
++      0xa080, 0x00b4, 0x781a, 0x0078, 0x2459, 0xa6b4, 0x00ff, 0xa6b5,
++      0x0400, 0x6eb6, 0x7e5a, 0x70b4, 0xa080, 0x00a6, 0x781a, 0x0078,
++      0x2459, 0x70ab, 0x3f8d, 0x0078, 0x2459, 0x0078, 0x3f6f, 0xa282,
++      0x0003, 0x0050, 0x3f95, 0x1078, 0x23eb, 0x2300, 0x0079, 0x3f98,
++      0x3f9b, 0x3fd2, 0x402d, 0xa286, 0x0001, 0x0040, 0x3fa1, 0x1078,
++      0x23eb, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x3fae,
++      0x1078, 0x3af8, 0x7003, 0x0000, 0x0078, 0x3b96, 0x683b, 0x0000,
++      0x6837, 0x0000, 0xa684, 0x0200, 0x0040, 0x3fbc, 0x1078, 0x46f8,
++      0x1078, 0x42d3, 0x1078, 0x46ff, 0x2001, 0x0001, 0x1078, 0x4691,
++      0x78b8, 0xa084, 0xc001, 0x0040, 0x3fce, 0x7848, 0xa085, 0x0008,
++      0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x3fc9, 0x7003, 0x0000,
++      0x0078, 0x3b96, 0x2200, 0x0079, 0x3fd5, 0x3fd7, 0x4008, 0x70a7,
++      0x3fdb, 0x0078, 0x4739, 0x2011, 0x000d, 0x1078, 0x42eb, 0x0079,
++      0x3fe1, 0x3fe8, 0x2459, 0x3b96, 0x3ff0, 0x3ff8, 0x3ffe, 0x4000,
++      0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
++      0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
++      0x70ab, 0x3ffc, 0x0078, 0x2459, 0x0078, 0x3fe8, 0x1078, 0x23eb,
++      0x70ab, 0x4004, 0x0078, 0x2459, 0x1078, 0x473f, 0x0078, 0x2459,
++      0x70a7, 0x400c, 0x0078, 0x4739, 0x2011, 0x0005, 0x1078, 0x42eb,
++      0x0079, 0x4012, 0x4017, 0x2459, 0x3b96, 0x401f, 0x4027, 0xa6b4,
++      0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0xa6b4,
++      0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727, 0x70ab,
++      0x402b, 0x0078, 0x2459, 0x0078, 0x4017, 0xa286, 0x0001, 0x0040,
++      0x4033, 0x1078, 0x23eb, 0x70a7, 0x4037, 0x0078, 0x4739, 0x2011,
++      0x0006, 0x1078, 0x42eb, 0x0079, 0x403d, 0x4042, 0x2459, 0x3b96,
++      0x4048, 0x4052, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0078, 0x4727,
++      0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0xa6b5, 0x4000, 0x7e5a,
++      0x0078, 0x4727, 0x70ab, 0x4056, 0x0078, 0x2459, 0x0078, 0x4042,
++      0x2300, 0x0079, 0x405b, 0x4060, 0x405e, 0x405e, 0x1078, 0x23eb,
++      0x1078, 0x23eb, 0x2300, 0x71a8, 0xa005, 0x017a, 0x6810, 0x70be,
++      0xa282, 0x0003, 0x0050, 0x406e, 0x1078, 0x23eb, 0x2300, 0x0079,
++      0x4071, 0x4074, 0x4082, 0x40a4, 0xa684, 0x0200, 0x0040, 0x407c,
++      0x1078, 0x46f8, 0x1078, 0x46ff, 0x2001, 0x0001, 0x1078, 0x4691,
++      0x0078, 0x2459, 0xa296, 0x0002, 0x0040, 0x408b, 0x82ff, 0x0040,
++      0x408b, 0x1078, 0x23eb, 0x70a7, 0x408f, 0x0078, 0x4739, 0x2011,
++      0x0018, 0x1078, 0x42eb, 0x0079, 0x4095, 0x409a, 0x2459, 0x3b96,
++      0x409c, 0x409e, 0x0078, 0x4727, 0x0078, 0x4727, 0x70ab, 0x40a2,
++      0x0078, 0x2459, 0x0078, 0x409a, 0x2200, 0x0079, 0x40a7, 0x40a9,
++      0x40c2, 0x70a7, 0x40ad, 0x0078, 0x4739, 0x2011, 0x0017, 0x1078,
++      0x42eb, 0x0079, 0x40b3, 0x40b8, 0x2459, 0x3b96, 0x40ba, 0x40bc,
++      0x0078, 0x4727, 0x0078, 0x4727, 0x70ab, 0x40c0, 0x0078, 0x2459,
++      0x0078, 0x40b8, 0xa484, 0x8000, 0x00c0, 0x410c, 0xa684, 0x0100,
++      0x0040, 0x40d6, 0x1078, 0x46f8, 0x1078, 0x42d3, 0x1078, 0x46ff,
++      0x7848, 0xa085, 0x000c, 0x784a, 0x0078, 0x40da, 0x78d8, 0x78d2,
++      0x78dc, 0x78d6, 0xa6b4, 0xefff, 0x7e5a, 0x70a7, 0x40e1, 0x0078,
++      0x4739, 0x2011, 0x000d, 0x1078, 0x42eb, 0x0079, 0x40e7, 0x40ee,
++      0x2459, 0x3b96, 0x40ee, 0x40fc, 0x4102, 0x4104, 0xa684, 0x0100,
++      0x0040, 0x40fa, 0x1078, 0x46b6, 0x682c, 0x78d2, 0x6830, 0x78d6,
++      0x1078, 0x46f0, 0x0078, 0x4727, 0x70ab, 0x4100, 0x0078, 0x2459,
++      0x0078, 0x40ee, 0x1078, 0x23eb, 0x70ab, 0x4108, 0x0078, 0x2459,
++      0x1078, 0x473f, 0x0078, 0x2459, 0x1078, 0x46ff, 0x70ab, 0x4116,
++      0x2001, 0x0003, 0x1078, 0x4689, 0x0078, 0x4733, 0x1078, 0x46f0,
++      0x682c, 0x78d2, 0x6830, 0x78d6, 0x0078, 0x4727, 0x70b8, 0x6812,
++      0x70be, 0x8000, 0x70ba, 0x681b, 0x0000, 0xa684, 0x0008, 0x0040,
++      0x4141, 0x157e, 0x137e, 0x147e, 0x7890, 0x8004, 0x8004, 0x8004,
++      0x8004, 0xa084, 0x000f, 0x681a, 0x80ac, 0x789b, 0x0000, 0xaf80,
++      0x002b, 0x2098, 0xad80, 0x000b, 0x20a0, 0x53a5, 0x147f, 0x137f,
++      0x157f, 0xa6c4, 0x0f00, 0xa684, 0x0002, 0x00c0, 0x4150, 0x692c,
++      0x810d, 0x810d, 0x810d, 0xa184, 0x0007, 0x2008, 0x0078, 0x415f,
++      0x789b, 0x0010, 0x79ac, 0xa184, 0x0020, 0x0040, 0x415f, 0x017e,
++      0x2009, 0x0005, 0x2001, 0x3d00, 0x1078, 0x46c1, 0x017f, 0xa184,
++      0x001f, 0xa805, 0x6816, 0x1078, 0x3b69, 0x68be, 0xa684, 0x0004,
++      0x0040, 0x4170, 0xa18c, 0xff00, 0x78a8, 0xa084, 0x00ff, 0xa105,
++      0x682a, 0xa6b4, 0x00ff, 0x6000, 0xa084, 0x0008, 0x0040, 0x417a,
++      0xa6b5, 0x4000, 0x6eb6, 0x007c, 0x157e, 0x137e, 0x147e, 0x6918,
++      0x7890, 0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f, 0x007e,
++      0xa100, 0x681a, 0x007f, 0x8000, 0x8004, 0x0040, 0x419b, 0x20a8,
++      0x8104, 0xa080, 0x000b, 0xad00, 0x20a0, 0x789b, 0x0000, 0xaf80,
++      0x002b, 0x2098, 0x53a5, 0x147f, 0x137f, 0x157f, 0x007c, 0x682c,
++      0xa084, 0x0020, 0x00c0, 0x41a7, 0x620c, 0x0078, 0x41a8, 0x6210,
++      0x6b18, 0x2300, 0xa202, 0x0040, 0x41c8, 0x2018, 0xa382, 0x000e,
++      0x0048, 0x41b8, 0x0040, 0x41b8, 0x2019, 0x000e, 0x0078, 0x41bc,
++      0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b01, 0x7893, 0x0000,
++      0x7ba2, 0x70b4, 0xa080, 0x008e, 0x781a, 0xa085, 0x0001, 0x007c,
++      0x7858, 0xa084, 0xffef, 0x785a, 0x7893, 0x0000, 0xa006, 0x007c,
++      0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x41dd, 0xa196,
++      0x000f, 0x0040, 0x41dd, 0x6807, 0x0117, 0x6914, 0x1078, 0x3b69,
++      0x6100, 0x8104, 0x00c8, 0x41f8, 0x601c, 0xa005, 0x0040, 0x41ec,
++      0x2001, 0x0800, 0x0078, 0x41fa, 0x0d7e, 0x6824, 0x007e, 0x1078,
++      0x4708, 0x007f, 0x6826, 0x2d00, 0x682e, 0x1078, 0x3af8, 0x0d7f,
++      0x2001, 0x0200, 0x6826, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820,
++      0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71b4,
++      0xa188, 0x0091, 0x791a, 0x007c, 0xa6c4, 0x0f00, 0xa684, 0x0002,
++      0x00c0, 0x4220, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007,
++      0x2008, 0xa805, 0x6816, 0x1078, 0x3b69, 0x68be, 0x0078, 0x4223,
++      0x6914, 0x1078, 0x3b69, 0x6100, 0x8104, 0x00c8, 0x4280, 0xa184,
++      0x0300, 0x0040, 0x422f, 0x6807, 0x0117, 0x0078, 0x424d, 0x6004,
++      0xa005, 0x00c0, 0x4256, 0x6807, 0x0117, 0x601c, 0xa005, 0x00c0,
++      0x4243, 0x0d7e, 0x1078, 0x4708, 0x6827, 0x0034, 0x2d00, 0x682e,
++      0x1078, 0x3af8, 0x0d7f, 0xa684, 0x0004, 0x0040, 0x424d, 0x2031,
++      0x0400, 0x2001, 0x2800, 0x0078, 0x4251, 0x2031, 0x0400, 0x2001,
++      0x0800, 0x71b4, 0xa188, 0x0091, 0x0078, 0x42ae, 0x6018, 0xa005,
++      0x00c0, 0x4243, 0x601c, 0xa005, 0x00c0, 0x4243, 0x689f, 0x0000,
++      0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x42bc, 0xd694, 0x00c0,
++      0x4279, 0x6100, 0xd1d4, 0x0040, 0x4279, 0x692c, 0x81ff, 0x0040,
++      0x42bc, 0xa186, 0x0003, 0x0040, 0x42bc, 0xa186, 0x0012, 0x0040,
++      0x42bc, 0xa6b5, 0x0800, 0x71b4, 0xa188, 0x00af, 0x0078, 0x42b7,
++      0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c, 0x00ff, 0xa186,
++      0x0012, 0x00c0, 0x4291, 0x2001, 0x42c9, 0x2009, 0x0001, 0x0078,
++      0x42a2, 0xa186, 0x0003, 0x00c0, 0x429b, 0x2001, 0x42ca, 0x2009,
++      0x0012, 0x0078, 0x42a2, 0x2001, 0x0200, 0x71b4, 0xa188, 0x0091,
++      0x0078, 0x42ae, 0x1078, 0x46db, 0x78a3, 0x0000, 0x681c, 0xa085,
++      0x0040, 0x681e, 0x71b4, 0xa188, 0x00df, 0xa006, 0x6826, 0x8007,
++      0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x6eb6,
++      0x7e5a, 0x791a, 0x0078, 0x2459, 0x6eb6, 0x1078, 0x3af8, 0x6810,
++      0x70be, 0x7003, 0x0007, 0x70a3, 0x0000, 0x704b, 0x0000, 0x0078,
++      0x2459, 0x0023, 0x0070, 0x0005, 0x0000, 0x0a00, 0x0000, 0x0000,
++      0x0025, 0x0000, 0x0000, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684,
++      0x0200, 0x0040, 0x42ea, 0x78b8, 0xa08c, 0x001f, 0xa084, 0x8000,
++      0x0040, 0x42e3, 0x8108, 0x78d8, 0xa100, 0x6836, 0x78dc, 0xa081,
++      0x0000, 0x683a, 0x007c, 0x7990, 0x810f, 0xa5ac, 0x0007, 0x2021,
++      0x0000, 0xa480, 0x0010, 0x789a, 0x79a8, 0xa18c, 0x00ff, 0xa184,
++      0x0080, 0x00c0, 0x4319, 0xa182, 0x0020, 0x00c8, 0x4337, 0xa182,
++      0x0012, 0x00c8, 0x467b, 0x2100, 0x1079, 0x4307, 0x007c, 0x467b,
++      0x44e8, 0x467b, 0x467b, 0x4344, 0x4347, 0x4381, 0x43b7, 0x43eb,
++      0x43ee, 0x467b, 0x467b, 0x43a2, 0x4412, 0x444c, 0x467b, 0x467b,
++      0x4473, 0xa184, 0x0020, 0x00c0, 0x44a7, 0xa18c, 0x001f, 0x6814,
++      0xa084, 0x001f, 0xa106, 0x0040, 0x4334, 0x70b4, 0xa080, 0x00d2,
++      0x781a, 0x2001, 0x0014, 0x1078, 0x4691, 0x1078, 0x46ff, 0x7003,
++      0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000, 0x007c, 0xa182,
++      0x0024, 0x00c8, 0x467b, 0xa184, 0x0003, 0x1079, 0x4307, 0x007c,
++      0x467b, 0x467b, 0x467b, 0x467b, 0x1078, 0x467b, 0x007c, 0x2200,
++      0x0079, 0x434a, 0x4476, 0x4476, 0x436e, 0x436e, 0x436e, 0x436e,
++      0x436e, 0x436e, 0x436e, 0x436e, 0x436c, 0x436e, 0x4363, 0x436e,
++      0x436e, 0x436e, 0x436e, 0x436e, 0x4376, 0x4379, 0x4476, 0x4379,
++      0x436e, 0x436e, 0x436e, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x36e2,
++      0x077f, 0x0c7f, 0x0078, 0x436e, 0x1078, 0x458b, 0x6827, 0x02b3,
++      0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x44aa, 0x1078, 0x4670,
++      0x007c, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078,
++      0x4492, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++      0x438b, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078, 0x4708, 0x6827,
++      0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3ac8, 0x1078,
++      0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078, 0x3af8, 0x2001,
++      0x0002, 0x007c, 0x1078, 0x44d0, 0x2001, 0x0017, 0x1078, 0x4691,
++      0x70a3, 0x0000, 0x2009, 0x5138, 0x200b, 0x0006, 0x70af, 0x0017,
++      0x2009, 0x0200, 0x1078, 0x3a06, 0x2001, 0x0001, 0x007c, 0x2200,
++      0x0079, 0x43ba, 0x4476, 0x44a7, 0x44a7, 0x44a7, 0x43db, 0x44b7,
++      0x43e3, 0x44b7, 0x44b7, 0x44ba, 0x44ba, 0x44bf, 0x44bf, 0x43d3,
++      0x43d3, 0x44a7, 0x44a7, 0x44b7, 0x44a7, 0x43e3, 0x4476, 0x43e3,
++      0x43e3, 0x43e3, 0x43e3, 0x6827, 0x0084, 0x2009, 0x000b, 0x2001,
++      0x4300, 0x0078, 0x44c9, 0x6827, 0x000d, 0x2009, 0x000b, 0x2001,
++      0x4300, 0x0078, 0x44aa, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001,
++      0x4300, 0x0078, 0x4492, 0x2001, 0x0000, 0x007c, 0x2200, 0x0079,
++      0x43f1, 0x4476, 0x440a, 0x440a, 0x440a, 0x440a, 0x44b7, 0x44b7,
++      0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x44b7, 0x440a, 0x440a,
++      0x440a, 0x440a, 0x44b7, 0x440a, 0x440a, 0x44b7, 0x44b7, 0x44b7,
++      0x44b7, 0x4476, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4300,
++      0x0078, 0x4492, 0xa684, 0x0004, 0x00c0, 0x4426, 0x6804, 0xa084,
++      0x00ff, 0xa086, 0x0006, 0x00c0, 0x467b, 0x1078, 0x44d0, 0x6807,
++      0x0117, 0x1078, 0x3af8, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084,
++      0x0004, 0x0040, 0x467b, 0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x00c0, 0x4435, 0x6807, 0x0117, 0x6827, 0x0002, 0x1078,
++      0x4708, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
++      0x3ad7, 0x1078, 0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078,
++      0x3af8, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004, 0x0040,
++      0x467b, 0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006, 0x00c0,
++      0x445b, 0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078, 0x4708,
++      0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078, 0x3ae7,
++      0x1078, 0x44d0, 0x2b68, 0x1078, 0x3af8, 0x0d7f, 0x1078, 0x3af8,
++      0x2001, 0x0002, 0x007c, 0x1078, 0x467b, 0x007c, 0x70b4, 0xa080,
++      0x00d2, 0x781a, 0x2001, 0x0001, 0x1078, 0x4691, 0x1078, 0x46ff,
++      0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x46c1, 0x1078,
++      0x46f8, 0x1078, 0x42d3, 0x1078, 0x41d0, 0x1078, 0x46ff, 0x2001,
++      0x0001, 0x007c, 0x1078, 0x46c1, 0x1078, 0x46f8, 0x1078, 0x42d3,
++      0x70b4, 0xa080, 0x00d2, 0x781a, 0x2001, 0x0013, 0x1078, 0x4691,
++      0x1078, 0x46ff, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078,
++      0x467b, 0x007c, 0x1078, 0x46c1, 0x1078, 0x46f8, 0x1078, 0x42d3,
++      0x1078, 0x41d0, 0x1078, 0x46ff, 0x2001, 0x0001, 0x007c, 0x2001,
++      0x0003, 0x007c, 0x1078, 0x458b, 0x2001, 0x0000, 0x007c, 0x0c7e,
++      0x077e, 0x6f14, 0x1078, 0x36e2, 0x077f, 0x0c7f, 0x2001, 0x0000,
++      0x007c, 0x1078, 0x46c1, 0x1078, 0x467b, 0x2001, 0x0006, 0x007c,
++      0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x44db, 0xa186,
++      0x000f, 0x00c0, 0x44df, 0x1078, 0x46f8, 0x1078, 0x42d3, 0x70b4,
++      0xa080, 0x00d2, 0x781a, 0x1078, 0x46ff, 0x7003, 0x0000, 0x007c,
++      0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004,
++      0x00c8, 0x467b, 0x1079, 0x44f5, 0x007c, 0x467b, 0x44f9, 0x467b,
++      0x4592, 0xa282, 0x0003, 0x0040, 0x4500, 0x1078, 0x467b, 0x007c,
++      0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4, 0x00ff, 0x69b8, 0xa184,
++      0x0100, 0x0040, 0x453f, 0xa18c, 0xfeff, 0x69ba, 0x78a0, 0xa005,
++      0x00c0, 0x453f, 0xa4a4, 0x00ff, 0x0040, 0x4533, 0xa482, 0x000c,
++      0x0040, 0x451c, 0x00c8, 0x4526, 0x852b, 0x852b, 0x1078, 0x3760,
++      0x0040, 0x4526, 0x1078, 0x355b, 0x0078, 0x4535, 0x1078, 0x465d,
++      0x1078, 0x3586, 0x69b8, 0xa18d, 0x0100, 0x69ba, 0xa6b5, 0x1000,
++      0x7e5a, 0x0078, 0x4538, 0x1078, 0x3586, 0xa6b4, 0xefff, 0x7e5a,
++      0x70b4, 0xa080, 0x0091, 0x781a, 0x2001, 0x0001, 0x007c, 0x0c7e,
++      0x1078, 0x457f, 0x6200, 0xd2e4, 0x0040, 0x4570, 0x6208, 0x8217,
++      0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x4552, 0x0040, 0x4552,
++      0x2011, 0x000c, 0x2400, 0xa202, 0x00c8, 0x4557, 0x2220, 0x6208,
++      0xa294, 0x00ff, 0x701c, 0xa202, 0x00c8, 0x455f, 0x721c, 0x2200,
++      0xa502, 0x00c8, 0x4564, 0x2228, 0x1078, 0x4661, 0x852b, 0x852b,
++      0x1078, 0x3760, 0x0040, 0x4570, 0x1078, 0x3562, 0x0078, 0x4574,
++      0x1078, 0x465d, 0x1078, 0x358d, 0xa6b5, 0x1000, 0x7e5a, 0x70b4,
++      0xa080, 0x00be, 0x781a, 0x2001, 0x0004, 0x0c7f, 0x007c, 0x007e,
++      0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0,
++      0x5380, 0x007f, 0x007c, 0x0c7e, 0x1078, 0x457f, 0x1078, 0x358d,
++      0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0, 0x467b, 0x7aa8, 0xa294,
++      0x00ff, 0x69b8, 0xa184, 0x0200, 0x0040, 0x45c9, 0xa18c, 0xfdff,
++      0x69ba, 0x78a0, 0xa005, 0x00c0, 0x45c9, 0xa282, 0x0002, 0x00c8,
++      0x369d, 0x1078, 0x4627, 0x1078, 0x362b, 0x1078, 0x3586, 0xa684,
++      0x0100, 0x0040, 0x45bf, 0x682c, 0xa084, 0x0001, 0x0040, 0x45bf,
++      0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040, 0x45bf, 0xc6fd, 0xa6b5,
++      0x1000, 0x7e5a, 0x70b4, 0xa080, 0x0091, 0x781a, 0x2001, 0x0001,
++      0x007c, 0x0c7e, 0x1078, 0x457f, 0xa284, 0xfffe, 0x0040, 0x45d4,
++      0x2011, 0x0001, 0x0078, 0x45d8, 0xa284, 0x0001, 0x0040, 0x45de,
++      0x6100, 0xd1ec, 0x00c0, 0x45de, 0x2011, 0x0000, 0x1078, 0x4619,
++      0x1078, 0x3632, 0x1078, 0x358d, 0xa684, 0x0100, 0x0040, 0x45f4,
++      0x682c, 0xa084, 0x0001, 0x0040, 0x45f4, 0xc6fc, 0x7888, 0xa084,
++      0x0040, 0x0040, 0x45f4, 0xc6fd, 0xa6b5, 0x1000, 0x7e5a, 0x70b4,
++      0xa080, 0x00be, 0x781a, 0x2001, 0x0004, 0x0c7f, 0x007c, 0x0c7e,
++      0x2960, 0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x460a,
++      0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003,
++      0x7aaa, 0xa8c0, 0x0004, 0x68b8, 0xa085, 0x0200, 0x68ba, 0x0c7f,
++      0x007c, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++      0x0003, 0x7aaa, 0x789b, 0x0081, 0x78ab, 0x0004, 0x007c, 0x0c7e,
++      0x7054, 0x2060, 0x6000, 0xa084, 0x1000, 0x00c0, 0x4635, 0x2029,
++      0x0032, 0x2021, 0x0000, 0x0078, 0x4655, 0x6508, 0xa5ac, 0x00ff,
++      0x7018, 0xa086, 0x0028, 0x00c0, 0x4645, 0xa582, 0x0019, 0x00c8,
++      0x464b, 0x2029, 0x0019, 0x0078, 0x464b, 0xa582, 0x000c, 0x00c8,
++      0x464b, 0x2029, 0x000c, 0x6408, 0x8427, 0xa4a4, 0x00ff, 0xa482,
++      0x000c, 0x0048, 0x4655, 0x2021, 0x000c, 0x1078, 0x4661, 0x68b8,
++      0xa085, 0x0100, 0x68ba, 0x0c7f, 0x007c, 0x2021, 0x0000, 0x2029,
++      0x0032, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++      0x0001, 0x7daa, 0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x007c,
++      0x2001, 0x0003, 0x1078, 0x4689, 0x70b4, 0xa080, 0x00be, 0x781a,
++      0x2001, 0x0005, 0x007c, 0x2001, 0x0007, 0x1078, 0x4689, 0xa6b5,
++      0x1000, 0x7e5a, 0x70b4, 0xa080, 0x00be, 0x781a, 0x2001, 0x0004,
++      0x007c, 0x789b, 0x0018, 0x78aa, 0x789b, 0x0081, 0x78ab, 0x0001,
++      0x007c, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x469f,
++      0xa196, 0x000f, 0x0040, 0x469f, 0x1078, 0x195a, 0x007c, 0x6924,
++      0xa194, 0x003f, 0x00c0, 0x46a8, 0xa18c, 0xffc0, 0xa105, 0x6826,
++      0x1078, 0x3af8, 0x691c, 0xa184, 0x0100, 0x0040, 0x46b5, 0x6914,
++      0x1078, 0x3b69, 0x6204, 0x8210, 0x6206, 0x007c, 0x692c, 0x6834,
++      0x682e, 0xa112, 0x6930, 0x6838, 0x6832, 0xa11b, 0xa200, 0xa301,
++      0x007c, 0x0c7e, 0xade0, 0x0018, 0x6003, 0x0070, 0x6106, 0x600b,
++      0x0000, 0x600f, 0x0a00, 0x6013, 0x0000, 0x6017, 0x0000, 0x8007,
++      0x601a, 0x601f, 0x0000, 0x6023, 0x0000, 0x0c7f, 0x6824, 0xa085,
++      0x0080, 0x6826, 0x007c, 0x157e, 0x137e, 0x147e, 0x2098, 0xaf80,
++      0x002d, 0x20a0, 0x81ac, 0x0040, 0x46e6, 0x53a6, 0xa184, 0x0001,
++      0x0040, 0x46ec, 0x3304, 0x78be, 0x147f, 0x137f, 0x157f, 0x007c,
++      0x70b0, 0xa005, 0x10c0, 0x23eb, 0x70b3, 0x8000, 0x0078, 0x4a3a,
++      0x71b0, 0x81ff, 0x0040, 0x46fe, 0x1078, 0x4b30, 0x007c, 0x71b0,
++      0x81ff, 0x0040, 0x4707, 0x70b3, 0x0000, 0x1078, 0x4776, 0x007c,
++      0x0c7e, 0x0d7e, 0x1078, 0x1937, 0x0c7f, 0x157e, 0x137e, 0x147e,
++      0x2da0, 0x2c98, 0x20a9, 0x0031, 0x53a3, 0x147f, 0x137f, 0x157f,
++      0x6807, 0x010d, 0x680b, 0x0000, 0x7004, 0x8007, 0x681a, 0x6823,
++      0x0000, 0x681f, 0x0000, 0x689f, 0x0000, 0x0c7f, 0x007c, 0x70b4,
++      0xa080, 0x0091, 0x781a, 0x0078, 0x2459, 0x70b4, 0xa080, 0x0081,
++      0x781a, 0x0078, 0x2459, 0x70b4, 0xa080, 0x00be, 0x781a, 0x0078,
++      0x2459, 0x70b4, 0xa080, 0x00c8, 0x781a, 0x0078, 0x2459, 0x6904,
++      0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x474c, 0xa196, 0x000f,
++      0x0040, 0x474c, 0x6807, 0x0117, 0x2001, 0x0200, 0x6826, 0x8007,
++      0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x2031,
++      0x0400, 0x6eb6, 0x7e5a, 0x71b4, 0xa188, 0x0091, 0x791a, 0x007c,
++      0x1078, 0x46ff, 0x7848, 0xa085, 0x000c, 0x784a, 0x70b4, 0xa080,
++      0x00d2, 0x781a, 0x2009, 0x000b, 0x2001, 0x4400, 0x1078, 0x46c1,
++      0x2001, 0x0013, 0x1078, 0x4691, 0x0078, 0x3b96, 0x127e, 0x2091,
++      0x2200, 0x2049, 0x4776, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215,
++      0x7008, 0xa084, 0xfff7, 0xa205, 0x0040, 0x4788, 0x0078, 0x478d,
++      0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084, 0x0001,
++      0x00c0, 0x47bb, 0x7108, 0x8103, 0x00c8, 0x479a, 0x1078, 0x48bd,
++      0x0078, 0x4792, 0x700c, 0xa08c, 0x00ff, 0x0040, 0x47bb, 0x7004,
++      0x8004, 0x00c8, 0x47b2, 0x7014, 0xa005, 0x00c0, 0x47ae, 0x7010,
++      0xa005, 0x0040, 0x47b2, 0xa102, 0x00c8, 0x4792, 0x7007, 0x0010,
++      0x0078, 0x47bb, 0x8aff, 0x0040, 0x47bb, 0x1078, 0x4b07, 0x00c0,
++      0x47b5, 0x0040, 0x4792, 0x1078, 0x4846, 0x7003, 0x0000, 0x127f,
++      0x2000, 0x007c, 0x017e, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007,
++      0x0040, 0x47ce, 0xa18e, 0x000f, 0x00c0, 0x47d1, 0x6040, 0x0078,
++      0x47d2, 0x6428, 0x017f, 0x84ff, 0x0040, 0x47fc, 0x2c70, 0x7004,
++      0xa0bc, 0x000f, 0xa7b8, 0x480c, 0x273c, 0x87fb, 0x00c0, 0x47ea,
++      0x0048, 0x47e4, 0x1078, 0x23eb, 0x609c, 0xa075, 0x0040, 0x47fc,
++      0x0078, 0x47d7, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529,
++      0x8421, 0x0040, 0x47fc, 0x8738, 0x2704, 0xa005, 0x00c0, 0x47eb,
++      0x709c, 0xa075, 0x00c0, 0x47d7, 0x007c, 0x0000, 0x0005, 0x0009,
++      0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009,
++      0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4801, 0x47fe, 0x0000,
++      0x0000, 0x8000, 0x0000, 0x4801, 0x0000, 0x4809, 0x4806, 0x0000,
++      0x0000, 0x0000, 0x0000, 0x4809, 0x0000, 0x4804, 0x4804, 0x0000,
++      0x0000, 0x8000, 0x0000, 0x4804, 0x0000, 0x480a, 0x480a, 0x0000,
++      0x0000, 0x0000, 0x0000, 0x480a, 0x127e, 0x2091, 0x2200, 0x2079,
++      0x5100, 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
++      0x0000, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
++      0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x4846,
++      0x2019, 0x0000, 0x7004, 0x8004, 0x00c8, 0x4899, 0x7007, 0x0012,
++      0x7108, 0x7008, 0xa106, 0x00c0, 0x4850, 0xa184, 0x01e0, 0x0040,
++      0x485b, 0x1078, 0x23eb, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005,
++      0x00c8, 0x4866, 0xa184, 0x4000, 0x00c0, 0x4850, 0xa19c, 0x300c,
++      0xa386, 0x2004, 0x0040, 0x4874, 0xa386, 0x0008, 0x0040, 0x487f,
++      0xa386, 0x200c, 0x00c0, 0x4850, 0x7200, 0x8204, 0x0048, 0x487f,
++      0x730c, 0xa384, 0x00ff, 0x0040, 0x487f, 0x1078, 0x23eb, 0x7007,
++      0x0012, 0x7000, 0xa084, 0x0001, 0x00c0, 0x4899, 0x7008, 0xa084,
++      0x01e0, 0x00c0, 0x4899, 0x7310, 0x7014, 0xa305, 0x0040, 0x4899,
++      0x710c, 0xa184, 0x0300, 0x00c0, 0x4899, 0xa184, 0x00ff, 0x00c0,
++      0x4846, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008,
++      0x00c0, 0x489d, 0x7007, 0x0012, 0x7108, 0x8103, 0x0048, 0x48a2,
++      0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e, 0x127e,
++      0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x48bd, 0x157f, 0x127f,
++      0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x7500, 0x730c,
++      0xa384, 0x0300, 0x00c0, 0x48e4, 0xa184, 0x01e0, 0x00c0, 0x4908,
++      0x7108, 0xa184, 0x01e0, 0x00c0, 0x4908, 0x2001, 0x04fd, 0x2004,
++      0xa082, 0x0005, 0x00c8, 0x48d8, 0xa184, 0x4000, 0x00c0, 0x48c8,
++      0xa184, 0x0007, 0x0079, 0x48dc, 0x48e6, 0x48f8, 0x48e4, 0x48f8,
++      0x48e4, 0x4944, 0x48e4, 0x4942, 0x1078, 0x23eb, 0x7004, 0xa084,
++      0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0, 0x48f3, 0x2049,
++      0x0000, 0x0078, 0x48f7, 0x1078, 0x4b07, 0x00c0, 0x48f3, 0x007c,
++      0x7004, 0xa084, 0x0010, 0xa085, 0x0002, 0x7006, 0x8aff, 0x00c0,
++      0x4903, 0x0078, 0x4907, 0x1078, 0x4b07, 0x00c0, 0x4903, 0x007c,
++      0x7007, 0x0012, 0x7108, 0x00e0, 0x490b, 0x2091, 0x6000, 0x00e0,
++      0x490f, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
++      0xa084, 0x0008, 0x00c0, 0x4917, 0x7007, 0x0012, 0x7108, 0x8103,
++      0x0048, 0x491c, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x4930,
++      0x7004, 0xa005, 0x00c0, 0x4930, 0x700c, 0xa005, 0x0040, 0x4932,
++      0x0078, 0x4913, 0x2049, 0x0000, 0x1078, 0x3809, 0x6818, 0xa084,
++      0x8000, 0x0040, 0x493d, 0x681b, 0x0002, 0x007c, 0x1078, 0x23eb,
++      0x1078, 0x23eb, 0x1078, 0x49a0, 0x7210, 0x7114, 0x700c, 0xa09c,
++      0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x1078, 0x49a0,
++      0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c, 0x2100,
++      0xa31b, 0x2400, 0xa305, 0x0040, 0x4967, 0x00c8, 0x4967, 0x8412,
++      0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x494e, 0x2b60,
++      0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x4973, 0xa7ba,
++      0x4806, 0x0078, 0x4975, 0xa7ba, 0x47fe, 0x007f, 0xa73d, 0x2c00,
++      0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7007, 0x0012, 0x1078, 0x4846,
++      0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, 0x4994, 0x609c, 0xa005,
++      0x0040, 0x499d, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x480c,
++      0x203c, 0x87fb, 0x1040, 0x23eb, 0x8a51, 0x0040, 0x499c, 0x7008,
++      0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051, 0x0000, 0x007c,
++      0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x49b4, 0x6000, 0xa064,
++      0x00c0, 0x49ab, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x481c,
++      0x203c, 0x87fb, 0x1040, 0x23eb, 0x007c, 0x127e, 0x0d7e, 0x2091,
++      0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057,
++      0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084, 0x0008,
++      0x007f, 0x0040, 0x49cf, 0xa0b8, 0x4806, 0x0078, 0x49d1, 0xa0b8,
++      0x47fe, 0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186,
++      0x0007, 0x0040, 0x49df, 0xa18e, 0x000f, 0x00c0, 0x49e8, 0x681c,
++      0xa084, 0x0040, 0x0040, 0x49ef, 0xa6b5, 0x0001, 0x0078, 0x49ef,
++      0x681c, 0xa084, 0x0040, 0x0040, 0x49ef, 0xa6b5, 0x0001, 0x7007,
++      0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x49f1, 0x2400, 0xa305,
++      0x00c0, 0x49fc, 0x0078, 0x4a22, 0x2c58, 0x2704, 0x6104, 0xac60,
++      0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184, 0x0008,
++      0x0040, 0x4a12, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081,
++      0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300,
++      0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, 0x4981,
++      0x0078, 0x4a24, 0x1078, 0x4b07, 0x00c0, 0x4a22, 0x127f, 0x2000,
++      0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007, 0x0004,
++      0x7004, 0xa084, 0x0004, 0x00c0, 0x4a30, 0x7003, 0x0008, 0x127f,
++      0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049,
++      0x4a3a, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4a43,
++      0x7e08, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++      0x0040, 0x4a56, 0xa18e, 0x000f, 0x00c0, 0x4a61, 0x681c, 0xa084,
++      0x0040, 0x0040, 0x4a5d, 0xa6b5, 0x0001, 0x6840, 0x2050, 0x0078,
++      0x4a6a, 0x681c, 0xa084, 0x0020, 0x00c0, 0x4a68, 0xa6b5, 0x0001,
++      0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x480c,
++      0x273c, 0x87fb, 0x00c0, 0x4a7e, 0x0048, 0x4a78, 0x1078, 0x23eb,
++      0x689c, 0xa065, 0x0040, 0x4a82, 0x0078, 0x4a6b, 0x1078, 0x4b07,
++      0x00c0, 0x4a7e, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
++      0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5,
++      0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4a9c,
++      0xa18e, 0x000f, 0x00c0, 0x4aa5, 0x681c, 0xa084, 0x0040, 0x0040,
++      0x4aac, 0xa6b5, 0x0001, 0x0078, 0x4aac, 0x681c, 0xa084, 0x0040,
++      0x0040, 0x4aac, 0xa6b5, 0x0001, 0x2049, 0x4a85, 0x017e, 0x6904,
++      0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4aba, 0xa18e, 0x000f,
++      0x00c0, 0x4abd, 0x6840, 0x0078, 0x4abe, 0x6828, 0x017f, 0xa055,
++      0x0040, 0x4b04, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8,
++      0x480c, 0x273c, 0x87fb, 0x00c0, 0x4ad8, 0x0048, 0x4ad1, 0x1078,
++      0x23eb, 0x709c, 0xa075, 0x2060, 0x0040, 0x4b04, 0x0078, 0x4ac4,
++      0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048, 0x4af1,
++      0x8a51, 0x00c0, 0x4ae5, 0x1078, 0x23eb, 0x8738, 0x2704, 0xa005,
++      0x00c0, 0x4ad9, 0x709c, 0xa075, 0x2060, 0x0040, 0x4b04, 0x0078,
++      0x4ac4, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908, 0x2400,
++      0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4b00, 0x1078, 0x23eb,
++      0x2071, 0x0020, 0x0078, 0x49ef, 0x127f, 0x2000, 0x007c, 0x7008,
++      0xa084, 0x0003, 0xa086, 0x0003, 0x0040, 0x4b2f, 0x2704, 0xac08,
++      0x2104, 0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012,
++      0x8108, 0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x4b26,
++      0x8108, 0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7004,
++      0xa084, 0x0010, 0xa085, 0x0001, 0x7006, 0x1078, 0x4981, 0x007c,
++      0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x4b30, 0x0d7f,
++      0x087f, 0x7108, 0xa184, 0x0003, 0x00c0, 0x4b5a, 0x017e, 0x6904,
++      0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x4b4a, 0xa18e, 0x000f,
++      0x00c0, 0x4b4d, 0x6840, 0x0078, 0x4b4e, 0x6828, 0x017f, 0xa005,
++      0x0040, 0x4b68, 0x0078, 0x478d, 0x0020, 0x4b5a, 0x1078, 0x4944,
++      0x0078, 0x4b68, 0x00a0, 0x4b61, 0x7108, 0x1078, 0x48bd, 0x0078,
++      0x4b39, 0x7007, 0x0010, 0x00a0, 0x4b63, 0x7108, 0x1078, 0x48bd,
++      0x7008, 0xa086, 0x0008, 0x00c0, 0x4b39, 0x7000, 0xa005, 0x00c0,
++      0x4b39, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
++      0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x2091, 0x2200,
++      0x0d7f, 0x2049, 0x4b78, 0xad80, 0x0011, 0x20a0, 0x2099, 0x0031,
++      0x700c, 0xa084, 0x00ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002,
++      0x7003, 0x0001, 0x0040, 0x4b97, 0x8000, 0x80ac, 0x53a5, 0x7007,
++      0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4b99, 0x0c7f, 0x2049,
++      0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000,
++      0x007c, 0x2091, 0x6000, 0x2091, 0x8000, 0x78cc, 0xa005, 0x0040,
++      0x4bc0, 0x7994, 0x70d0, 0xa106, 0x00c0, 0x4bc0, 0x7804, 0xa005,
++      0x0040, 0x4bc0, 0x7807, 0x0000, 0x0068, 0x4bc0, 0x2091, 0x4080,
++      0x7820, 0x8001, 0x7822, 0x00c0, 0x4c1b, 0x7824, 0x7822, 0x2069,
++      0x5140, 0x6800, 0xa084, 0x0007, 0x0040, 0x4bde, 0xa086, 0x0002,
++      0x0040, 0x4bde, 0x6834, 0xa00d, 0x0040, 0x4bde, 0x2104, 0xa005,
++      0x0040, 0x4bde, 0x8001, 0x200a, 0x0040, 0x4cc3, 0x7848, 0xa005,
++      0x0040, 0x4bec, 0x8001, 0x784a, 0x00c0, 0x4bec, 0x2009, 0x0102,
++      0x6844, 0x200a, 0x1078, 0x21d2, 0x6890, 0xa005, 0x0040, 0x4bf8,
++      0x8001, 0x6892, 0x00c0, 0x4bf8, 0x686f, 0x0000, 0x6873, 0x0001,
++      0x2061, 0x5400, 0x20a9, 0x0100, 0x2009, 0x0002, 0x6034, 0xa005,
++      0x0040, 0x4c0e, 0x8001, 0x6036, 0x00c0, 0x4c0e, 0x6010, 0xa005,
++      0x0040, 0x4c0e, 0x017e, 0x1078, 0x21d2, 0x017f, 0xace0, 0x0010,
++      0x0070, 0x4c14, 0x0078, 0x4bfe, 0x8109, 0x0040, 0x4c1b, 0x20a9,
++      0x0100, 0x0078, 0x4bfe, 0x1078, 0x4c28, 0x1078, 0x4c4d, 0x2009,
++      0x5151, 0x2104, 0x2009, 0x0102, 0x200a, 0x2091, 0x8001, 0x007c,
++      0x7834, 0x8001, 0x7836, 0x00c0, 0x4c4c, 0x7838, 0x7836, 0x2091,
++      0x8000, 0x7844, 0xa005, 0x00c0, 0x4c37, 0x2001, 0x0101, 0x8001,
++      0x7846, 0xa080, 0x7400, 0x2040, 0x2004, 0xa065, 0x0040, 0x4c4c,
++      0x6024, 0xa005, 0x0040, 0x4c48, 0x8001, 0x6026, 0x0040, 0x4c7c,
++      0x6000, 0x2c40, 0x0078, 0x4c3d, 0x007c, 0x7828, 0x8001, 0x782a,
++      0x00c0, 0x4c7b, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x4c5a,
++      0x2001, 0x0200, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003,
++      0xa090, 0x5400, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040,
++      0x4c7b, 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x4c73, 0x8001,
++      0x2012, 0x00c0, 0x4c7b, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080,
++      0x201a, 0x1078, 0x21d2, 0x007c, 0x2069, 0x5140, 0x6800, 0xa005,
++      0x0040, 0x4c86, 0x6848, 0xac06, 0x0040, 0x4cc3, 0x601b, 0x0006,
++      0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
++      0x0060, 0x6022, 0x6000, 0x2042, 0x6714, 0x6f82, 0x1078, 0x1973,
++      0x6818, 0xa005, 0x0040, 0x4c9e, 0x8001, 0x681a, 0x6808, 0xa084,
++      0xffef, 0x680a, 0x6810, 0x8001, 0x00d0, 0x4ca8, 0x1078, 0x23eb,
++      0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x1c70,
++      0x2069, 0x5140, 0x7944, 0xa184, 0x0100, 0x2001, 0x0006, 0x686e,
++      0x00c0, 0x4cbe, 0x6986, 0x2001, 0x0004, 0x686e, 0x1078, 0x21cd,
++      0x2091, 0x8001, 0x007c, 0x2069, 0x0100, 0x2009, 0x5140, 0x2104,
++      0xa084, 0x0007, 0x0040, 0x4d1f, 0xa086, 0x0007, 0x00c0, 0x4cd9,
++      0x0d7e, 0x2009, 0x5152, 0x216c, 0x1078, 0x3a4e, 0x0d7f, 0x0078,
++      0x4d1f, 0x2009, 0x5152, 0x2164, 0x1078, 0x2396, 0x601b, 0x0006,
++      0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
++      0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, 0x6830, 0xa084,
++      0x0040, 0x0040, 0x4d13, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
++      0xa084, 0x0004, 0x0040, 0x4d00, 0x0070, 0x4d00, 0x0078, 0x4cf7,
++      0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040,
++      0x4d0d, 0x0070, 0x4d0d, 0x0078, 0x4d04, 0x20a9, 0x00fa, 0x0070,
++      0x4d13, 0x0078, 0x4d0f, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b,
++      0x0048, 0x2009, 0x515b, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091,
++      0x8001, 0x007c, 0x2079, 0x5100, 0x1078, 0x4d4d, 0x1078, 0x4d31,
++      0x1078, 0x4d3f, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000,
++      0x007c, 0x2019, 0x0003, 0x2011, 0x5146, 0x2204, 0xa086, 0x003c,
++      0x0040, 0x4d3c, 0x2019, 0x0002, 0x7b2a, 0x7b2e, 0x007c, 0x2019,
++      0x0039, 0x2011, 0x5146, 0x2204, 0xa086, 0x003c, 0x0040, 0x4d4a,
++      0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x3971, 0x2011,
++      0x5146, 0x2204, 0xa086, 0x003c, 0x0040, 0x4d58, 0x2019, 0x2626,
++      0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843, 0x000a, 0x007c, 0x0020,
++      0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014, 0x0014,
++      0x0014, 0x0014, 0x0014, 0x0014, 0x0080, 0x000f, 0x0000, 0x0201,
++      0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b, 0xa201,
++      0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0x0000, 0x006c, 0x0002,
++      0x0014, 0x98d0, 0x009e, 0x0096, 0xa202, 0x8838, 0x3806, 0x8839,
++      0x20c3, 0x0864, 0x9884, 0x28c1, 0x9cb1, 0xa203, 0x300c, 0x2846,
++      0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0x9865, 0x28f2, 0x9c90,
++      0x9858, 0x300c, 0x28e1, 0x9c90, 0x2802, 0xa206, 0x64c3, 0x282d,
++      0xa207, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7824, 0x68c1,
++      0x7864, 0x883e, 0x9878, 0x8576, 0x8677, 0x206b, 0x28c1, 0x9cb1,
++      0x2044, 0x2103, 0x20a2, 0x2081, 0x9865, 0xa209, 0x2901, 0x988c,
++      0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xc601,
++      0xa20a, 0x856e, 0x0704, 0x9c90, 0x0014, 0xa204, 0xa300, 0x3009,
++      0x19e2, 0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e, 0x87a9, 0x883f,
++      0x08e6, 0x9890, 0xf881, 0x988b, 0xc801, 0x0014, 0xf8c1, 0x0016,
++      0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241,
++      0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043,
++      0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a, 0xf041, 0x3008,
++      0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016,
++      0x8000, 0x2847, 0x1011, 0x98c3, 0x8000, 0xa000, 0x2802, 0x1011,
++      0x98c9, 0x9865, 0x283e, 0x1011, 0x98cd, 0xa20b, 0x0017, 0x300c,
++      0xa300, 0x1de2, 0xdb81, 0x0014, 0x0210, 0x98da, 0x0014, 0x26e0,
++      0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210,
++      0x9cb6, 0x0704, 0x0000, 0x006c, 0x0002, 0x984f, 0x0014, 0x009e,
++      0x00a5, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211, 0x9cd5, 0x8772,
++      0x8837, 0x2101, 0x987a, 0x10d2, 0x78e2, 0x9cd8, 0x9859, 0xd984,
++      0xf0e2, 0xf0a1, 0x98d2, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f,
++      0x9401, 0xb520, 0xc802, 0x8820, 0x987a, 0x2301, 0x987a, 0x10d2,
++      0x78e4, 0x9cd8, 0x8821, 0x8820, 0x9859, 0xf123, 0xf142, 0xf101,
++      0x98cb, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001,
++      0x0014, 0x6845, 0x0214, 0xa21b, 0x9cd5, 0x2001, 0x98ca, 0x8201,
++      0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0x988d, 0x3027, 0x84a8,
++      0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9cc1, 0x692a, 0x6902,
++      0x1834, 0x989d, 0x1a14, 0x8010, 0x8592, 0x8026, 0x84b9, 0x7021,
++      0x0014, 0xa300, 0x69e1, 0x9caa, 0x694c, 0xa213, 0x9cba, 0x1462,
++      0xa213, 0x8000, 0x16e1, 0x98b4, 0x8023, 0x16e1, 0x8001, 0x10f1,
++      0x0016, 0x6968, 0xa214, 0x9cba, 0x8004, 0x16e1, 0x0101, 0x300a,
++      0x8827, 0x0014, 0x9cba, 0x0014, 0x61c2, 0x8002, 0x14e1, 0x0016,
++      0xa217, 0x9cc1, 0x0014, 0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6,
++      0x882c, 0x0016, 0xa212, 0x9cd5, 0x10d2, 0x70e4, 0x0004, 0x8007,
++      0x9424, 0xcc1a, 0x9cd8, 0x98ca, 0x8827, 0x300a, 0x0013, 0x8000,
++      0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d, 0x0014, 0x878e,
++      0x0016, 0xa21c, 0x1035, 0x9891, 0xa210, 0xa000, 0x8010, 0x8592,
++      0x853b, 0xd044, 0x8022, 0x3807, 0x84bb, 0x98ef, 0x8021, 0x3807,
++      0x84b9, 0x300c, 0x817e, 0x872b, 0x8772, 0x9891, 0x0000, 0x0020,
++      0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014, 0x0014, 0x98e5,
++      0x98d0, 0x0014, 0x0014, 0x0014, 0x0080, 0x013f, 0x0000, 0x0201,
++      0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018, 0x300b, 0xa201,
++      0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202, 0x8838, 0x3806,
++      0x8839, 0x20c3, 0x0864, 0xa82e, 0x28c1, 0x9cb1, 0xa203, 0x300c,
++      0x2846, 0x8161, 0x846a, 0x8300, 0x1856, 0x883a, 0xa804, 0x28f2,
++      0x9c90, 0xa8f4, 0x300c, 0x28e1, 0x9c90, 0x2802, 0xa206, 0x64c3,
++      0x282d, 0xa207, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7824,
++      0x68c1, 0x7864, 0x883e, 0xa802, 0x8576, 0x8677, 0x206b, 0x28c1,
++      0x9cb1, 0x2044, 0x2103, 0x20a2, 0x2081, 0xa8e5, 0xa209, 0x2901,
++      0xa809, 0x0014, 0xa205, 0xa300, 0x1872, 0x879a, 0x883c, 0x1fe2,
++      0xc601, 0xa20a, 0x856e, 0x0704, 0x9c90, 0x0014, 0xa204, 0xa300,
++      0x3009, 0x19e2, 0xf868, 0x8176, 0x86eb, 0x85eb, 0x872e, 0x87a9,
++      0x883f, 0x08e6, 0xa8f3, 0xf881, 0xa8ec, 0xc801, 0x0014, 0xf8c1,
++      0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532,
++      0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208,
++      0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160, 0x842a, 0xf041,
++      0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822,
++      0x0016, 0x8000, 0x2847, 0x1011, 0xa8fc, 0x8000, 0xa000, 0x2802,
++      0x1011, 0xa8fd, 0xa898, 0x283e, 0x1011, 0xa8fd, 0xa20b, 0x0017,
++      0x300c, 0xa300, 0x1de2, 0xdb81, 0x0014, 0x0210, 0xa801, 0x0014,
++      0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d, 0x3806,
++      0x0210, 0x9cb6, 0x0704, 0x0017, 0x60ff, 0x300c, 0x8720, 0xa211,
++      0x9d6b, 0x8772, 0x8837, 0x2101, 0xa821, 0x10d2, 0x78e2, 0x9d6e,
++      0xa8fc, 0xd984, 0xf0e2, 0xf0a1, 0xa871, 0x0014, 0x8831, 0xd166,
++      0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820, 0xa80f, 0x2301,
++      0xa80d, 0x10d2, 0x78e4, 0x9d6e, 0x8821, 0x8820, 0xa8e6, 0xf123,
++      0xf142, 0xf101, 0xa854, 0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c,
++      0xd99e, 0x6001, 0x0014, 0x6845, 0x0214, 0xa21b, 0x9d6b, 0x2001,
++      0xa845, 0x8201, 0x1852, 0xd184, 0xd163, 0x8834, 0x8001, 0xa801,
++      0x3027, 0x84a8, 0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d57,
++      0x692a, 0x6902, 0x1834, 0xa805, 0x1a14, 0x8010, 0x8592, 0x8026,
++      0x84b9, 0x7021, 0x0014, 0xa300, 0x69e1, 0x9d40, 0x694c, 0xa213,
++      0x9d50, 0x1462, 0xa213, 0x8000, 0x16e1, 0xa80a, 0x8023, 0x16e1,
++      0x8001, 0x10f1, 0x0016, 0x6968, 0xa214, 0x9d50, 0x8004, 0x16e1,
++      0x0101, 0x300a, 0x8827, 0x0014, 0x9d50, 0x0014, 0x61c2, 0x8002,
++      0x14e1, 0x0016, 0xa217, 0x9d57, 0x0014, 0xa300, 0x8181, 0x842a,
++      0x84a8, 0x1ce6, 0x882c, 0x0016, 0xa212, 0x9d6b, 0x10d2, 0x70e4,
++      0x0004, 0x8007, 0x9424, 0xcc1a, 0x9d6e, 0xa8f8, 0x8827, 0x300a,
++      0x0013, 0x8000, 0x84a4, 0x0016, 0x11c2, 0x211e, 0x870e, 0xa21d,
++      0x0014, 0x878e, 0x0016, 0xa21c, 0x1035, 0xa8af, 0xa210, 0x3807,
++      0x300c, 0x817e, 0x872b, 0x8772, 0xa8a8, 0x0000, 0xdf21
++};
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_1080.h     2003-07-19 17:06:32.000000000 -0700
+@@ -0,0 +1,4554 @@
++/* @(#)asm_1080.h 1.2 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */ 
++
++#ifndef       ISP_TARGET_MODE
++/************************************************************************
++ *                                                                    *
++ *     --- ISP1240/ISP1080/ISP1280 Initiator Firmware ---             *
++ *                          32 LUN Support                            *
++ *                                                                    *
++ ************************************************************************/
++/*
++ *    Firmware Version 8.15.00 (14:35 Aug 22, 2000)
++ */
++static const u_int16_t isp_1080_risc_code[] = {
++      0x0078, 0x1041, 0x0000, 0x3d3b, 0x0000, 0x2043, 0x4f50, 0x5952,
++      0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
++      0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
++      0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
++      0x3132, 0x3430, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
++      0x6572, 0x7369, 0x6f6e, 0x2030, 0x382e, 0x3135, 0x2020, 0x2043,
++      0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
++      0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
++      0x2400, 0x20c9, 0x97ff, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1080,
++      0x00c0, 0x1054, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010,
++      0x2089, 0x1374, 0x0078, 0x106d, 0x2001, 0x04fc, 0x2004, 0xa086,
++      0x1280, 0x00c0, 0x1069, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2071,
++      0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010, 0x2089, 0x13f8, 0x0078,
++      0x106d, 0x20c1, 0x0020, 0x2089, 0x131c, 0x2071, 0x0010, 0x70c3,
++      0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
++      0x0008, 0x2001, 0x04fe, 0x70d6, 0x20c1, 0x0021, 0x2019, 0x0000,
++      0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64,
++      0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54, 0x205b, 0x5050, 0x2114,
++      0xa286, 0xa5a5, 0x0040, 0x10a4, 0xa386, 0x000f, 0x0040, 0x10a0,
++      0x2c6a, 0x2a5a, 0x20c1, 0x0020, 0x2019, 0x000f, 0x0078, 0x1080,
++      0x2c6a, 0x2a5a, 0x0078, 0x10a2, 0x2c6a, 0x2a5a, 0x2130, 0x2128,
++      0xa1a2, 0x4e00, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
++      0xa192, 0x9800, 0x2009, 0x0000, 0x2001, 0x0032, 0x1078, 0x207a,
++      0x2218, 0x2079, 0x4e00, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
++      0x0040, 0x42a4, 0x8109, 0x00c0, 0x10bf, 0x2009, 0xff00, 0x3400,
++      0xa102, 0x0048, 0x10cf, 0x0040, 0x10cf, 0x20a8, 0x42a4, 0x2001,
++      0x04fc, 0x2004, 0xa086, 0x1080, 0x00c0, 0x10e5, 0x2071, 0x0100,
++      0x0d7e, 0x2069, 0x4e40, 0x1078, 0x4cdd, 0x0d7f, 0x7810, 0xc0ed,
++      0x7812, 0x781b, 0x0064, 0x0078, 0x110a, 0x2001, 0x04fc, 0x2004,
++      0xa086, 0x1280, 0x00c0, 0x1105, 0x7814, 0xc0ed, 0xc0d5, 0x7816,
++      0x781b, 0x0064, 0x2071, 0x0200, 0x0d7e, 0x2069, 0x4e40, 0x1078,
++      0x4cdd, 0x2069, 0x4e80, 0x2071, 0x0100, 0x1078, 0x4cdd, 0x7814,
++      0xc0d4, 0x7816, 0x0d7f, 0x0078, 0x110a, 0x7814, 0xc0e5, 0x7816,
++      0x781b, 0x003c, 0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800,
++      0xc08d, 0x7802, 0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002,
++      0x7827, 0x0002, 0x2009, 0x0002, 0x2069, 0x4e40, 0x681b, 0x0003,
++      0x6823, 0x0007, 0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028,
++      0x6837, 0x0000, 0x683b, 0x0006, 0x6833, 0x0008, 0x683f, 0x0000,
++      0x8109, 0x0040, 0x115e, 0x68d3, 0x000a, 0x68c3, 0x4ec0, 0x2079,
++      0x4e00, 0x7814, 0xd0e4, 0x00c0, 0x1144, 0xd0ec, 0x00c0, 0x1148,
++      0x68d7, 0x7329, 0x0078, 0x114a, 0x68d7, 0x730d, 0x0078, 0x114a,
++      0x68d7, 0x732d, 0x68c7, 0x53c0, 0x68cb, 0x52c0, 0x68cf, 0x93c0,
++      0x68ab, 0x9644, 0x68af, 0x9649, 0x68b3, 0x9644, 0x68b7, 0x9644,
++      0x68a7, 0x0001, 0x2069, 0x4e80, 0x0078, 0x111e, 0x68d3, 0x000a,
++      0x68c3, 0x50c0, 0x7814, 0xd0e4, 0x00c0, 0x116a, 0x68d7, 0x7439,
++      0x0078, 0x116c, 0x68d7, 0x7419, 0x68c7, 0x73c0, 0x68cb, 0x5340,
++      0x68cf, 0x94d0, 0x68ab, 0x9649, 0x68af, 0x964e, 0x68b3, 0x9649,
++      0x68b7, 0x9649, 0x68a7, 0x0001, 0x7810, 0xd0ec, 0x00c0, 0x11c2,
++      0x7814, 0xd0e4, 0x00c0, 0x11b4, 0x0e7e, 0x2069, 0x52c0, 0x2071,
++      0x0200, 0x70ec, 0xd0e4, 0x00c0, 0x1195, 0x2019, 0x0c0c, 0x2021,
++      0x000c, 0x1078, 0x2009, 0x0078, 0x119b, 0x2019, 0x0c0a, 0x2021,
++      0x000a, 0x1078, 0x2009, 0x2069, 0x5340, 0x2071, 0x0100, 0x70ec,
++      0xd0e4, 0x00c0, 0x11ab, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078,
++      0x2009, 0x0078, 0x11b1, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078,
++      0x2009, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0c, 0x2021, 0x000c,
++      0x2069, 0x52c0, 0x1078, 0x2009, 0x2069, 0x5340, 0x1078, 0x2009,
++      0x0078, 0x11db, 0x2069, 0x52c0, 0x0e7e, 0x2071, 0x0100, 0x70ec,
++      0xd0e4, 0x00c0, 0x11d4, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078,
++      0x2009, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0a, 0x2021, 0x000a,
++      0x1078, 0x2009, 0x0e7f, 0x2011, 0x0002, 0x2069, 0x53c0, 0x2009,
++      0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bc8,
++      0xa386, 0xfeff, 0x00c0, 0x11f2, 0x6817, 0x0100, 0x681f, 0x0064,
++      0x0078, 0x11f6, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010,
++      0x00f0, 0x11e3, 0x8109, 0x00c0, 0x11e1, 0x8211, 0x0040, 0x1204,
++      0x2069, 0x73c0, 0x0078, 0x11df, 0x1078, 0x265b, 0x1078, 0x468e,
++      0x1078, 0x1dd4, 0x1078, 0x4c6f, 0x2091, 0x2100, 0x2079, 0x4e00,
++      0x7810, 0xd0ec, 0x0040, 0x1218, 0x2071, 0x0020, 0x0078, 0x121a,
++      0x2071, 0x0050, 0x2091, 0x2200, 0x2079, 0x4e00, 0x2071, 0x0020,
++      0x2091, 0x2300, 0x2079, 0x4e00, 0x7810, 0xd0ec, 0x0040, 0x122c,
++      0x2079, 0x0100, 0x0078, 0x122e, 0x2079, 0x0200, 0x2071, 0x4e40,
++      0x2091, 0x2400, 0x2079, 0x0100, 0x2071, 0x4e80, 0x2091, 0x2000,
++      0x2079, 0x4e00, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
++      0x2071, 0x0010, 0x70c3, 0x0000, 0x0090, 0x124d, 0x70c0, 0xa086,
++      0x0002, 0x00c0, 0x124d, 0x1078, 0x15ba, 0x2039, 0x0000, 0x7810,
++      0xd0ec, 0x00c0, 0x12cf, 0x1078, 0x148e, 0x78ac, 0xa005, 0x00c0,
++      0x126b, 0x0068, 0x1261, 0x786c, 0xa065, 0x0040, 0x1261, 0x1078,
++      0x2395, 0x1078, 0x20a1, 0x0068, 0x1278, 0x786c, 0xa065, 0x0040,
++      0x126b, 0x1078, 0x2395, 0x0068, 0x1278, 0x2009, 0x4e47, 0x2011,
++      0x4e87, 0x2104, 0x220c, 0xa105, 0x0040, 0x1278, 0x1078, 0x1f0a,
++      0x2071, 0x4e40, 0x70a4, 0xa005, 0x0040, 0x129d, 0x7450, 0xa485,
++      0x0000, 0x0040, 0x129d, 0x2079, 0x0200, 0x2091, 0x8000, 0x72d4,
++      0xa28c, 0x303d, 0x2190, 0x1078, 0x2b6a, 0x2091, 0x8000, 0x2091,
++      0x303d, 0x0068, 0x129d, 0x2079, 0x4e00, 0x786c, 0xa065, 0x0040,
++      0x129d, 0x2071, 0x0010, 0x1078, 0x2395, 0x00e0, 0x12a5, 0x2079,
++      0x4e00, 0x2071, 0x0010, 0x1078, 0x4a43, 0x2071, 0x4e80, 0x70a4,
++      0xa005, 0x0040, 0x12bd, 0x7050, 0xa025, 0x0040, 0x12bd, 0x2079,
++      0x0100, 0x2091, 0x8000, 0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078,
++      0x2b6a, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079, 0x4e00, 0x2071,
++      0x0010, 0x0068, 0x12c9, 0x786c, 0xa065, 0x0040, 0x12c9, 0x1078,
++      0x2395, 0x00e0, 0x1253, 0x1078, 0x4a43, 0x0078, 0x1253, 0x1078,
++      0x148e, 0x78ac, 0xa005, 0x00c0, 0x12e7, 0x0068, 0x12dd, 0x786c,
++      0xa065, 0x0040, 0x12dd, 0x1078, 0x2395, 0x1078, 0x20a1, 0x0068,
++      0x12f1, 0x786c, 0xa065, 0x0040, 0x12e7, 0x1078, 0x2395, 0x0068,
++      0x12f1, 0x2009, 0x4e47, 0x2104, 0xa005, 0x0040, 0x12f1, 0x1078,
++      0x1f0a, 0x2071, 0x4e40, 0x70a4, 0xa005, 0x0040, 0x130c, 0x7450,
++      0xa485, 0x0000, 0x0040, 0x130c, 0x2079, 0x0100, 0x2091, 0x8000,
++      0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078, 0x2b6a, 0x2091, 0x8000,
++      0x2091, 0x303d, 0x2079, 0x4e00, 0x2071, 0x0010, 0x0068, 0x1316,
++      0x786c, 0xa065, 0x0040, 0x1316, 0x1078, 0x2395, 0x00e0, 0x12cf,
++      0x1078, 0x4a43, 0x0078, 0x12cf, 0x133c, 0x133c, 0x133e, 0x133e,
++      0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363,
++      0x134b, 0x134b, 0x134b, 0x134b, 0x133c, 0x133c, 0x133e, 0x133e,
++      0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363,
++      0x134b, 0x134b, 0x134b, 0x134b, 0x0078, 0x133c, 0x007e, 0x107e,
++      0x127e, 0x2091, 0x2400, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
++      0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13c8,
++      0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
++      0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
++      0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300,
++      0x1078, 0x298a, 0x2091, 0x2400, 0x1078, 0x298a, 0x127f, 0x107f,
++      0x007f, 0x2091, 0x8001, 0x007c, 0x1394, 0x1394, 0x1396, 0x1396,
++      0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13ae, 0x13ae, 0x1396, 0x1396,
++      0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13af, 0x13af, 0x13af, 0x13af,
++      0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af,
++      0x13af, 0x13af, 0x13af, 0x13af, 0x0078, 0x1394, 0x007e, 0x107e,
++      0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f,
++      0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13d5,
++      0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007c, 0x107e,
++      0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x007e, 0x2071, 0x0100, 0x2069,
++      0x4e40, 0x2079, 0x4e00, 0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078,
++      0x4cdd, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007c,
++      0x3c00, 0xa084, 0x0007, 0x0079, 0x13cd, 0x13de, 0x13de, 0x13e0,
++      0x13e0, 0x13e5, 0x13e5, 0x13ea, 0x13ea, 0x3c00, 0xa084, 0x0003,
++      0x0079, 0x13da, 0x13de, 0x13de, 0x13f3, 0x13f3, 0x1078, 0x296b,
++      0x2091, 0x2200, 0x1078, 0x4768, 0x007c, 0x2091, 0x2100, 0x1078,
++      0x4768, 0x007c, 0x2091, 0x2100, 0x1078, 0x4768, 0x2091, 0x2200,
++      0x1078, 0x4768, 0x007c, 0x2091, 0x2100, 0x1078, 0x4768, 0x007c,
++      0x1418, 0x1418, 0x141a, 0x141a, 0x1427, 0x1427, 0x1427, 0x1427,
++      0x1432, 0x1432, 0x143f, 0x143f, 0x1427, 0x1427, 0x1427, 0x1427,
++      0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450,
++      0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450,
++      0x0078, 0x1418, 0x007e, 0x107e, 0x127e, 0x2091, 0x2400, 0x1078,
++      0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
++      0x107e, 0x127e, 0x1078, 0x13c8, 0x127f, 0x107f, 0x007f, 0x2091,
++      0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078,
++      0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e,
++      0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x2091, 0x2400,
++      0x1078, 0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c,
++      0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2079, 0x4e00,
++      0x2071, 0x0200, 0x2069, 0x4e40, 0x3d00, 0xd08c, 0x0040, 0x1466,
++      0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078, 0x4cdd, 0x3d00, 0xd084,
++      0x0040, 0x1474, 0x2069, 0x4e80, 0x2071, 0x0100, 0x70ec, 0xa084,
++      0x1c00, 0x78e6, 0x1078, 0x4cdd, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f,
++      0x107f, 0x007f, 0x007c, 0x7008, 0x800b, 0x00c8, 0x1489, 0x7007,
++      0x0002, 0xa08c, 0x01e0, 0x00c0, 0x148a, 0xd09c, 0x0040, 0x1489,
++      0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x15bd, 0x0068, 0x1513,
++      0x2061, 0x0000, 0x6018, 0xd084, 0x00c0, 0x1513, 0x7828, 0xa005,
++      0x00c0, 0x149e, 0x0010, 0x1514, 0x0078, 0x1513, 0x7910, 0xd1f4,
++      0x0040, 0x14a6, 0x2001, 0x4007, 0x0078, 0x15bc, 0x7914, 0xd1ec,
++      0x0040, 0x14c1, 0xd0fc, 0x0040, 0x14b7, 0x007e, 0x1078, 0x1d64,
++      0x007f, 0x0040, 0x14c1, 0x2001, 0x4007, 0x0078, 0x15bc, 0x007e,
++      0x1078, 0x1d54, 0x007f, 0x0040, 0x14c1, 0x2001, 0x4007, 0x0078,
++      0x15bc, 0x7910, 0xd0fc, 0x00c0, 0x14cb, 0x2061, 0x4e40, 0xc19c,
++      0xc7fc, 0x0078, 0x14cf, 0x2061, 0x4e80, 0xc19d, 0xc7fd, 0x6064,
++      0xa005, 0x00c0, 0x1513, 0x7912, 0x6083, 0x0000, 0x7828, 0xc0fc,
++      0xa086, 0x0018, 0x00c0, 0x14e0, 0x0c7e, 0x1078, 0x1b5b, 0x0c7f,
++      0x782b, 0x0000, 0x607c, 0xa065, 0x0040, 0x14f9, 0x0c7e, 0x609c,
++      0x1078, 0x1e49, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c84, 0x2009,
++      0x0018, 0x6087, 0x0103, 0x1078, 0x1d74, 0x00c0, 0x150d, 0x1078,
++      0x1dc6, 0x7810, 0xd09c, 0x00c0, 0x1501, 0x2061, 0x4e40, 0x0078,
++      0x1505, 0x2061, 0x4e80, 0xc09c, 0x7812, 0x607f, 0x0000, 0x60d4,
++      0xd0dc, 0x0040, 0x1511, 0xc0dc, 0x60d6, 0x2001, 0x4005, 0x0078,
++      0x15bc, 0x0078, 0x15ba, 0x007c, 0x7810, 0xd0f4, 0x0040, 0x151c,
++      0x2001, 0x4007, 0x0078, 0x15bc, 0xa006, 0x70c2, 0x70c6, 0x70ca,
++      0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a, 0x0040, 0x00c8, 0x152a,
++      0x0079, 0x1531, 0x2100, 0xa08a, 0x0040, 0x00c8, 0x15c8, 0x0079,
++      0x1571, 0x15ba, 0x1610, 0x15d9, 0x1648, 0x1680, 0x1680, 0x15d0,
++      0x1c9c, 0x168b, 0x15c8, 0x15dd, 0x15df, 0x15e1, 0x15e3, 0x1ca1,
++      0x15c8, 0x1699, 0x16f6, 0x1b7b, 0x1c96, 0x15e5, 0x19c0, 0x1a02,
++      0x1a3d, 0x1a8e, 0x197b, 0x1988, 0x199c, 0x19af, 0x17cb, 0x15c8,
++      0x172d, 0x173a, 0x1746, 0x1752, 0x1768, 0x1774, 0x1777, 0x1783,
++      0x178f, 0x1797, 0x17b3, 0x17bf, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++      0x17d8, 0x17ea, 0x1806, 0x183c, 0x1864, 0x1874, 0x1877, 0x18a8,
++      0x18d9, 0x18eb, 0x194a, 0x195a, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++      0x196a, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x1cc6, 0x1ccc,
++      0x15c8, 0x15c8, 0x15c8, 0x1cd0, 0x1d15, 0x15c8, 0x15c8, 0x15c8,
++      0x15c8, 0x160a, 0x167a, 0x1693, 0x16f0, 0x1b75, 0x15c8, 0x15c8,
++      0x1b3e, 0x15c8, 0x1d19, 0x1cb8, 0x1cc2, 0x15c8, 0x15c8, 0x15c8,
++      0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++      0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++      0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++      0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8,
++      0x15c8, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x15bc, 0x73ce,
++      0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068, 0x15bd, 0x2061,
++      0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c,
++      0x70c3, 0x4001, 0x0078, 0x15bd, 0x70c3, 0x4006, 0x0078, 0x15bd,
++      0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078,
++      0x15ba, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x15ba, 0x0078,
++      0x15ba, 0x0078, 0x15ba, 0x0078, 0x15ba, 0x2091, 0x8000, 0x70c3,
++      0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3,
++      0x0008, 0x2001, 0x000f, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001,
++      0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051, 0x0445,
++      0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091, 0x4080,
++      0x0078, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1613,
++      0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0,
++      0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e,
++      0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0040, 0x15ba, 0xa182,
++      0x0040, 0x00c8, 0x162d, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012,
++      0x7007, 0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0040, 0x1634,
++      0x7007, 0x0002, 0xa084, 0x01e0, 0x0040, 0x1642, 0x70c3, 0x4002,
++      0x0078, 0x15bd, 0x24a8, 0x53a5, 0x0078, 0x1624, 0x0078, 0x15ba,
++      0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x2098,
++      0x20a1, 0x0030, 0x7003, 0x0000, 0x7007, 0x0006, 0x731a, 0x721e,
++      0x7422, 0x7526, 0x2021, 0x0040, 0x7007, 0x0006, 0x81ff, 0x0040,
++      0x15ba, 0xa182, 0x0040, 0x00c8, 0x1667, 0x2120, 0xa006, 0x2008,
++      0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007, 0x0001, 0x7008, 0xd0fc,
++      0x0040, 0x166e, 0xa084, 0x01e0, 0x0040, 0x165c, 0x70c3, 0x4002,
++      0x0078, 0x15bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x164b,
++      0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1688, 0x200a,
++      0x72ca, 0x0078, 0x15b9, 0x70c7, 0x0008, 0x70cb, 0x000f, 0x70cf,
++      0x0000, 0x0078, 0x15ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078,
++      0x169c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
++      0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x16eb, 0xa40a,
++      0x0040, 0x16ac, 0x00c8, 0x16b5, 0x8001, 0x7872, 0xa084, 0xfc00,
++      0x0040, 0x16b9, 0x78ac, 0xc085, 0x78ae, 0x2001, 0x4005, 0x0078,
++      0x15bc, 0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76, 0xa48c, 0xff00,
++      0x0040, 0x16d1, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f,
++      0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, 0x0078,
++      0x16db, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1,
++      0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605,
++      0x0040, 0x16e5, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc,
++      0x78ae, 0x0078, 0x16ee, 0x78ac, 0xc085, 0x78ae, 0x0078, 0x15ba,
++      0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x16f9, 0x2029, 0x0000,
++      0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce,
++      0x74d6, 0xa005, 0x0040, 0x1728, 0xa40a, 0x0040, 0x1709, 0x00c8,
++      0x15bc, 0x8001, 0x7892, 0xa084, 0xfc00, 0x0040, 0x1716, 0x78ac,
++      0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0078, 0x15bc, 0x7a9a, 0x7b9e,
++      0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0040, 0x1721, 0x7a10, 0xc2c5,
++      0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0078, 0x172b,
++      0x78ac, 0xc0c5, 0x78ae, 0x0078, 0x15ba, 0x2009, 0x0000, 0x786c,
++      0xa065, 0x0040, 0x1737, 0x8108, 0x6000, 0x0078, 0x1730, 0x7ac4,
++      0x0078, 0x15b8, 0x2009, 0x4e48, 0x210c, 0x7810, 0xd0ec, 0x00c0,
++      0x15b9, 0x2011, 0x4e88, 0x2214, 0x0078, 0x15b8, 0x2009, 0x4e49,
++      0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, 0x4e89, 0x2214,
++      0x0078, 0x15b8, 0x2061, 0x4e40, 0x6128, 0x622c, 0x8214, 0x8214,
++      0x8214, 0x7810, 0xd0ec, 0x00c0, 0x1766, 0x2061, 0x4e80, 0x6328,
++      0x73da, 0x632c, 0x831c, 0x831c, 0x831c, 0x73de, 0x0078, 0x15b8,
++      0x2009, 0x4e4c, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011,
++      0x4e8c, 0x2214, 0x0078, 0x15b8, 0x7918, 0x0078, 0x15b9, 0x2009,
++      0x4e4d, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, 0x4e8d,
++      0x2214, 0x0078, 0x15b8, 0x2009, 0x4e4e, 0x210c, 0x7810, 0xd0ec,
++      0x00c0, 0x15b9, 0x2011, 0x4e8e, 0x2214, 0x0078, 0x15b8, 0x7920,
++      0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x7a24, 0x0078, 0x15b8, 0x71c4,
++      0xd1fc, 0x00c0, 0x179f, 0x2011, 0x52c0, 0x0078, 0x17a1, 0x2011,
++      0x5340, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268,
++      0x6a00, 0x6804, 0xd09c, 0x0040, 0x17b0, 0x6b08, 0x0078, 0x17b1,
++      0x6b0c, 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
++      0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b7, 0x2061,
++      0x4e40, 0x6118, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2061, 0x4e80,
++      0x6218, 0x0078, 0x15b8, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
++      0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091, 0x8001, 0x0078, 0x15b7,
++      0x71c4, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010, 0x00c8, 0x15b2,
++      0x1078, 0x277f, 0xa384, 0x4000, 0x0040, 0x17e8, 0xa295, 0x0020,
++      0x0078, 0x15b7, 0x71c4, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x00c8,
++      0x15b2, 0xd1bc, 0x00c0, 0x17f9, 0x2011, 0x4e48, 0x2204, 0x0078,
++      0x17fd, 0x2011, 0x4e88, 0x2204, 0xc0bd, 0x007e, 0x2100, 0xc0bc,
++      0x2012, 0x1078, 0x26dc, 0x017f, 0x0078, 0x15b9, 0x71c4, 0x2021,
++      0x4e49, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x1815, 0x71c8,
++      0x2021, 0x4e89, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1834, 0x20a9,
++      0x0008, 0x2204, 0xa106, 0x0040, 0x1824, 0x8210, 0x00f0, 0x1819,
++      0x71c4, 0x72c8, 0x0078, 0x15b1, 0xa292, 0x1834, 0x027e, 0x2122,
++      0x017f, 0x1078, 0x26fd, 0x7810, 0xd0ec, 0x00c0, 0x1832, 0xd3fc,
++      0x0040, 0x180f, 0x0078, 0x15ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee,
++      0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4e40, 0x6128, 0x622c,
++      0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003,
++      0x8003, 0x602e, 0x7810, 0xd0ec, 0x00c0, 0x1862, 0x027e, 0x017e,
++      0x2061, 0x4e80, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70d8,
++      0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, 0x72de,
++      0x017f, 0x027f, 0x0078, 0x15b8, 0x2061, 0x4e40, 0x6130, 0x70c4,
++      0x6032, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2061, 0x4e80, 0x6230,
++      0x70c8, 0x6032, 0x0078, 0x15b8, 0x7918, 0x0078, 0x15b9, 0x71c4,
++      0xa184, 0xffcf, 0x0040, 0x1883, 0x7810, 0xd0ec, 0x00c0, 0x15b2,
++      0x72c8, 0x0078, 0x15b1, 0x2011, 0x4e4d, 0x2204, 0x2112, 0x007e,
++      0x2019, 0x0000, 0x1078, 0x2764, 0x7810, 0xd0ec, 0x0040, 0x1893,
++      0x017f, 0x0078, 0x15b9, 0x71c8, 0xa184, 0xffcf, 0x0040, 0x189c,
++      0x2110, 0x71c4, 0x0078, 0x15b1, 0x2011, 0x4e8d, 0x2204, 0x2112,
++      0x007e, 0xc3fd, 0x1078, 0x2764, 0x027f, 0x017f, 0x0078, 0x15b8,
++      0x71c4, 0xa182, 0x0010, 0x0048, 0x18b4, 0x7810, 0xd0ec, 0x00c0,
++      0x15b2, 0x72c8, 0x0078, 0x15b1, 0x2011, 0x4e4e, 0x2204, 0x007e,
++      0x2112, 0x2019, 0x0000, 0x1078, 0x2742, 0x7810, 0xd0ec, 0x0040,
++      0x18c4, 0x017f, 0x0078, 0x15b9, 0x71c8, 0xa182, 0x0010, 0x0048,
++      0x18cd, 0x2110, 0x71c4, 0x0078, 0x15b1, 0x2011, 0x4e8e, 0x2204,
++      0x007e, 0x2112, 0xc3fd, 0x1078, 0x2742, 0x027f, 0x017f, 0x0078,
++      0x15b8, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x15b1, 0xa284,
++      0xfffd, 0x00c0, 0x15b1, 0x2100, 0x7920, 0x7822, 0x2200, 0x7a24,
++      0x7826, 0x0078, 0x15b8, 0x71c4, 0xd1fc, 0x00c0, 0x18f3, 0x2011,
++      0x52c0, 0x0078, 0x18f5, 0x2011, 0x5340, 0x8107, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa268, 0x2019, 0x0000, 0x72c8, 0x2091,
++      0x8000, 0x6800, 0x007e, 0xa226, 0x0040, 0x191e, 0x6a02, 0xd4ec,
++      0x0040, 0x190b, 0xc3a5, 0xd4e4, 0x0040, 0x190f, 0xc39d, 0xd4f4,
++      0x0040, 0x191e, 0x810f, 0xd2f4, 0x0040, 0x191a, 0x1078, 0x27c1,
++      0x0078, 0x191e, 0x1078, 0x279f, 0x0078, 0x191e, 0x72cc, 0x6808,
++      0xa206, 0x0040, 0x1940, 0xa2a4, 0x00ff, 0x7814, 0xd0e4, 0x00c0,
++      0x1931, 0xa482, 0x0028, 0x0048, 0x193d, 0x0040, 0x193d, 0x0078,
++      0x1935, 0xa482, 0x0043, 0x0048, 0x193d, 0x71c4, 0x71c6, 0x027f,
++      0x72ca, 0x2091, 0x8001, 0x0078, 0x15b3, 0x6a0a, 0xa39d, 0x000a,
++      0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x2091, 0x8001,
++      0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, 0x6a14,
++      0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708,
++      0x0078, 0x15b7, 0x70c4, 0x2061, 0x4e40, 0x6118, 0x601a, 0x7810,
++      0xd0ec, 0x00c0, 0x15b9, 0x70c8, 0x2061, 0x4e80, 0x6218, 0x601a,
++      0x0078, 0x15b8, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8,
++      0x15b2, 0x1078, 0x27e3, 0xa384, 0x4000, 0x0040, 0x1979, 0xa295,
++      0x0020, 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000,
++      0x6a08, 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b8,
++      0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
++      0x6a0a, 0x6804, 0xa005, 0x0040, 0x1997, 0x1078, 0x2628, 0x2091,
++      0x8001, 0x2708, 0x0078, 0x15b8, 0x77c4, 0x1078, 0x1de4, 0x2091,
++      0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x19aa,
++      0x1078, 0x2628, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b8, 0x77c4,
++      0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000,
++      0x1078, 0x1dff, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x15b8,
++      0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x19d4, 0xd7fc, 0x0040, 0x19ce,
++      0x1078, 0x1d64, 0x0040, 0x19d4, 0x0078, 0x15bc, 0x1078, 0x1d54,
++      0x0040, 0x19d4, 0x0078, 0x15bc, 0x73c8, 0x72cc, 0x77c6, 0x73ca,
++      0x72ce, 0x1078, 0x1e86, 0x00c0, 0x19fe, 0x6818, 0xa005, 0x0040,
++      0x19f8, 0x2708, 0x077e, 0x1078, 0x2813, 0x077f, 0x00c0, 0x19f8,
++      0x2001, 0x0015, 0xd7fc, 0x00c0, 0x19f1, 0x2061, 0x4e40, 0x0078,
++      0x19f4, 0xc0fd, 0x2061, 0x4e80, 0x782a, 0x2091, 0x8001, 0x007c,
++      0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15bc, 0x2091, 0x8001,
++      0x0078, 0x15ba, 0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x1a16, 0xd7fc,
++      0x0040, 0x1a10, 0x1078, 0x1d64, 0x0040, 0x1a16, 0x0078, 0x15bc,
++      0x1078, 0x1d54, 0x0040, 0x1a16, 0x0078, 0x15bc, 0x77c6, 0x2041,
++      0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078,
++      0x1dff, 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x1a2a, 0x2061, 0x4e40,
++      0x0078, 0x1a2d, 0x2061, 0x4e80, 0xc1fd, 0x6067, 0x0003, 0x607f,
++      0x0000, 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc, 0x61d6,
++      0x1078, 0x2628, 0x2091, 0x8001, 0x007c, 0x77c8, 0x77ca, 0x77c4,
++      0x77c6, 0x7814, 0xd0e4, 0x00c0, 0x1a54, 0xd7fc, 0x0040, 0x1a4e,
++      0x1078, 0x1d64, 0x0040, 0x1a54, 0x0078, 0x15bc, 0x1078, 0x1d54,
++      0x0040, 0x1a54, 0x0078, 0x15bc, 0xa7bc, 0xff00, 0x2091, 0x8000,
++      0x2009, 0x0017, 0xd7fc, 0x00c0, 0x1a61, 0x2061, 0x4e40, 0x0078,
++      0x1a64, 0x2061, 0x4e80, 0xc1fd, 0x607f, 0x0000, 0x6067, 0x0002,
++      0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc, 0x61d6, 0x1078,
++      0x2628, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051,
++      0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0040, 0x1a82, 0x60d4,
++      0xc0fd, 0x60d6, 0x1078, 0x1dff, 0x70c8, 0x6836, 0x8738, 0xa784,
++      0x001f, 0x00c0, 0x1a82, 0x2091, 0x8001, 0x007c, 0x2019, 0x0000,
++      0x7814, 0xd0e4, 0x00c0, 0x1aa4, 0x72c8, 0xd284, 0x0040, 0x1a9e,
++      0x1078, 0x1d64, 0x0040, 0x1aa4, 0x0078, 0x15bc, 0x1078, 0x1d54,
++      0x0040, 0x1aa4, 0x0078, 0x15bc, 0x72c8, 0x72ca, 0x78ac, 0xa084,
++      0x0003, 0x00c0, 0x1acf, 0x2039, 0x0000, 0xd284, 0x0040, 0x1ab1,
++      0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078,
++      0x1de4, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, 0x2091,
++      0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1ab7, 0xa7bc, 0xff00,
++      0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1ab7, 0x2091,
++      0x8000, 0x72c8, 0xd284, 0x00c0, 0x1ae1, 0x7810, 0xd0ec, 0x0040,
++      0x1add, 0x2069, 0x0100, 0x0078, 0x1ae3, 0x2069, 0x0200, 0x0078,
++      0x1ae3, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830,
++      0xd0b4, 0x0040, 0x1b03, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
++      0xd094, 0x0040, 0x1af5, 0x00f0, 0x1aef, 0x684b, 0x0009, 0x20a9,
++      0x0014, 0x6848, 0xd084, 0x0040, 0x1aff, 0x00f0, 0x1af9, 0x20a9,
++      0x00fa, 0x00f0, 0x1b01, 0x2079, 0x4e00, 0x2009, 0x0018, 0x72c8,
++      0xd284, 0x00c0, 0x1b0f, 0x2061, 0x4e40, 0x0078, 0x1b12, 0x2061,
++      0x4e80, 0xc1fd, 0x607f, 0x0000, 0x792a, 0x6067, 0x0001, 0x6083,
++      0x000f, 0x60a7, 0x0000, 0x60a8, 0x60b2, 0x60b6, 0x60d4, 0xd0b4,
++      0x0040, 0x1b2e, 0xc0b4, 0x60d6, 0x0c7e, 0x60b8, 0xa065, 0x6008,
++      0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x60d4, 0xa084,
++      0x77ff, 0x60d6, 0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0040, 0x1b39,
++      0x007c, 0x681b, 0x0047, 0x2091, 0x8001, 0x007c, 0x73cc, 0x1078,
++      0x1a90, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a, 0xa185, 0x0040,
++      0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff, 0x00f0, 0x1b4e,
++      0x8421, 0x00c0, 0x1b4c, 0x8319, 0x00c0, 0x1b4a, 0x69ee, 0x6a4a,
++      0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1b62, 0x2069, 0x4e40,
++      0x0078, 0x1b64, 0x2069, 0x4e80, 0x71c4, 0x71c6, 0x6916, 0x81ff,
++      0x00c0, 0x1b6c, 0x68a7, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084,
++      0x00c0, 0x1b74, 0x1078, 0x1ee6, 0x007c, 0x75d8, 0x74dc, 0x75da,
++      0x74de, 0x0078, 0x1b7e, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8,
++      0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x4e00, 0x7dde, 0x7cda,
++      0x7bd6, 0x7ad2, 0x1078, 0x1dbd, 0x0040, 0x1c80, 0x20a9, 0x0005,
++      0x20a1, 0x4e14, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009,
++      0x0040, 0x1078, 0x1fd1, 0x0040, 0x1ba1, 0x1078, 0x1dc6, 0x0078,
++      0x1c80, 0x6004, 0xa08c, 0x00ff, 0xa18e, 0x0009, 0x00c0, 0x1bac,
++      0x007e, 0x1078, 0x2378, 0x007f, 0xa084, 0xff00, 0x8007, 0x8009,
++      0x0040, 0x1c20, 0x0c7e, 0x2c68, 0x1078, 0x1dbd, 0x0040, 0x1bf2,
++      0x2c00, 0x689e, 0x8109, 0x00c0, 0x1bb3, 0x609f, 0x0000, 0x0c7f,
++      0x0c7e, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040, 0xa399,
++      0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda, 0x7bd6,
++      0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1c1f, 0x2009, 0x0040,
++      0x1078, 0x1fd1, 0x00c0, 0x1c09, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0002, 0x00c0, 0x1bf2, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a,
++      0x00c0, 0x1bee, 0x017e, 0x1078, 0x2374, 0x017f, 0x2d00, 0x6002,
++      0x0078, 0x1bc1, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e49, 0x0c7f,
++      0x609f, 0x0000, 0x1078, 0x1c84, 0x2009, 0x0018, 0x6008, 0xc0cd,
++      0x600a, 0x6004, 0x6086, 0x1078, 0x1d74, 0x1078, 0x1dc6, 0x0078,
++      0x1c80, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e49, 0x0c7f, 0x609f,
++      0x0000, 0x1078, 0x1c84, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b,
++      0x0003, 0x1078, 0x1d74, 0x1078, 0x1dc6, 0x0078, 0x1c80, 0x0c7f,
++      0x7814, 0xd0e4, 0x00c0, 0x1c45, 0x6114, 0xd1fc, 0x0040, 0x1c2e,
++      0x1078, 0x1d64, 0x0040, 0x1c45, 0x0078, 0x1c32, 0x1078, 0x1d54,
++      0x0040, 0x1c45, 0x2029, 0x0000, 0x2520, 0x2009, 0x0018, 0x73c8,
++      0x72cc, 0x6087, 0x0103, 0x601b, 0x0021, 0x1078, 0x1d74, 0x1078,
++      0x1dc6, 0x2001, 0x4007, 0x0078, 0x15bc, 0x74c4, 0x73c8, 0x72cc,
++      0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009, 0x0012, 0xd0fc, 0x00c0,
++      0x1c55, 0x2071, 0x4e40, 0x0078, 0x1c58, 0x2071, 0x4e80, 0xc1fd,
++      0x792a, 0x7067, 0x0005, 0x71d4, 0xc1dc, 0x71d6, 0x736a, 0x726e,
++      0x7472, 0x7076, 0x707b, 0x0000, 0x2c00, 0x707e, 0xa02e, 0x2530,
++      0x611c, 0xa184, 0x0060, 0x0040, 0x1c6f, 0x1078, 0x4632, 0x0e7f,
++      0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000,
++      0x6714, 0x6023, 0x0000, 0x1078, 0x2628, 0x2091, 0x8001, 0x007c,
++      0x70c3, 0x4005, 0x0078, 0x15bd, 0x20a9, 0x0005, 0x2099, 0x4e14,
++      0x2091, 0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399,
++      0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, 0x70c7,
++      0x0000, 0x791e, 0x0078, 0x15ba, 0x71c4, 0x71c6, 0x2168, 0x0078,
++      0x1ca3, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68,
++      0x8109, 0x00c0, 0x1ca5, 0xa285, 0x0000, 0x00c0, 0x1cb3, 0x70c3,
++      0x4000, 0x0078, 0x1cb5, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x15bd,
++      0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x15b2, 0x7966,
++      0x0078, 0x15ba, 0x7964, 0x71c6, 0x0078, 0x15ba, 0x7900, 0x71c6,
++      0x71c4, 0x7902, 0x0078, 0x15ba, 0x7900, 0x71c6, 0x0078, 0x15ba,
++      0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0040, 0x1ce5, 0x810c,
++      0x0048, 0x1ce1, 0x8210, 0x810c, 0x810c, 0x0048, 0x1ce1, 0x8210,
++      0x810c, 0x81ff, 0x00c0, 0x15b3, 0x8210, 0x7a0e, 0xd28c, 0x0040,
++      0x1d11, 0x7910, 0xc1cd, 0x7912, 0x2009, 0x0021, 0x2019, 0x0003,
++      0xd284, 0x0040, 0x1d0b, 0x8108, 0x2019, 0x0041, 0x2011, 0x964e,
++      0x2312, 0x2019, 0x0042, 0x8210, 0x2312, 0x2019, 0x0043, 0x8210,
++      0x2312, 0x2019, 0x0046, 0x8210, 0x2312, 0x2019, 0x0047, 0x8210,
++      0x2312, 0x2019, 0x0006, 0x2011, 0x9653, 0x2112, 0x2011, 0x9673,
++      0x2312, 0x7904, 0x7806, 0x0078, 0x15b9, 0x7804, 0x70c6, 0x0078,
++      0x15ba, 0x71c4, 0xd1fc, 0x00c0, 0x1d21, 0x2011, 0x52c0, 0x0078,
++      0x1d23, 0x2011, 0x5340, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003,
++      0x8003, 0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1d32, 0x2011, 0x0001,
++      0x0078, 0x1d34, 0x2011, 0x0000, 0x6b0c, 0x6800, 0x70da, 0x0078,
++      0x15b7, 0x017e, 0x7814, 0xd0f4, 0x0040, 0x1d46, 0x2001, 0x4007,
++      0x70db, 0x0000, 0xa18d, 0x0001, 0x0078, 0x1d52, 0xd0fc, 0x0040,
++      0x1d51, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078,
++      0x1d52, 0xa006, 0x017f, 0x007c, 0x017e, 0x7814, 0xd0f4, 0x0040,
++      0x1d61, 0x2001, 0x4007, 0x70db, 0x0000, 0xa18d, 0x0001, 0x0078,
++      0x1d62, 0xa006, 0x017f, 0x007c, 0x017e, 0x7814, 0xd0fc, 0x0040,
++      0x1d71, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078,
++      0x1d72, 0xa006, 0x017f, 0x007c, 0x7112, 0x721a, 0x731e, 0x7810,
++      0xd0c4, 0x0040, 0x1d7d, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108,
++      0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084,
++      0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0040,
++      0x1d9a, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
++      0x0078, 0x1d9d, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78,
++      0xa006, 0xa211, 0x7d10, 0xd5c4, 0x0040, 0x1daa, 0x7b84, 0xa319,
++      0x7c80, 0xa421, 0x7008, 0xd0fc, 0x0040, 0x1daa, 0x7003, 0x0001,
++      0x7007, 0x0006, 0x711a, 0x721e, 0x7d10, 0xd5c4, 0x0040, 0x1dba,
++      0x7322, 0x7426, 0xa084, 0x01e0, 0x007c, 0x7848, 0xa065, 0x0040,
++      0x1dc5, 0x2c04, 0x784a, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079,
++      0x4e00, 0x7848, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1dd1, 0x1078,
++      0x296b, 0x784a, 0x0f7f, 0x007c, 0x2011, 0x9800, 0x7a4a, 0x7bc4,
++      0x8319, 0x0040, 0x1de1, 0xa280, 0x0032, 0x2012, 0x2010, 0x0078,
++      0x1dd8, 0x2013, 0x0000, 0x007c, 0x017e, 0x027e, 0xd7fc, 0x00c0,
++      0x1ded, 0x2011, 0x53c0, 0x0078, 0x1def, 0x2011, 0x73c0, 0xa784,
++      0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x1dfa, 0x8003, 0x8003,
++      0x8003, 0x8003, 0xa105, 0xa268, 0x027f, 0x017f, 0x007c, 0x1078,
++      0x1de4, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef,
++      0xa80d, 0x690a, 0x0e7e, 0xd7fc, 0x00c0, 0x1e14, 0x2009, 0x4e53,
++      0x2071, 0x4e40, 0x0078, 0x1e18, 0x2009, 0x4e93, 0x2071, 0x4e80,
++      0x210c, 0x6804, 0xa005, 0x0040, 0x1e28, 0xa116, 0x00c0, 0x1e28,
++      0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x1e2b,
++      0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1e40, 0x6000,
++      0x6806, 0x1078, 0x1e5b, 0x1078, 0x201d, 0x6810, 0x7908, 0x8109,
++      0x790a, 0x8001, 0x6812, 0x00c0, 0x1e2b, 0x7910, 0xc1a5, 0x7912,
++      0x017f, 0x6902, 0x6906, 0x2d00, 0x2060, 0x1078, 0x2acc, 0x0e7f,
++      0x007c, 0xa065, 0x0040, 0x1e5a, 0x2008, 0x609c, 0xa005, 0x0040,
++      0x1e57, 0x2062, 0x609f, 0x0000, 0xa065, 0x0078, 0x1e4d, 0x7848,
++      0x794a, 0x2062, 0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
++      0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
++      0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0xd7fc, 0x00c0, 0x1e76,
++      0x2071, 0x4e40, 0x2031, 0x4ec0, 0x0078, 0x1e7a, 0x2071, 0x4e80,
++      0x2031, 0x50c0, 0x7050, 0xa08c, 0x0200, 0x00c0, 0x1e84, 0xa608,
++      0x2d0a, 0x8000, 0x7052, 0xa006, 0x0e7f, 0x007c, 0x0f7e, 0xd7fc,
++      0x00c0, 0x1e8e, 0x2079, 0x4e40, 0x0078, 0x1e90, 0x2079, 0x4e80,
++      0x1078, 0x1de4, 0x2091, 0x8000, 0x6804, 0x780a, 0xa065, 0x0040,
++      0x1ee4, 0x0078, 0x1ea2, 0x2c00, 0x780a, 0x2060, 0x6000, 0xa065,
++      0x0040, 0x1ee4, 0x6010, 0xa306, 0x00c0, 0x1e9b, 0x600c, 0xa206,
++      0x00c0, 0x1e9b, 0x2c28, 0x784c, 0xac06, 0x00c0, 0x1eb1, 0x0078,
++      0x1ee1, 0x6804, 0xac06, 0x00c0, 0x1ebf, 0x6000, 0x2060, 0x6806,
++      0xa005, 0x00c0, 0x1ebf, 0x6803, 0x0000, 0x0078, 0x1ec9, 0x6400,
++      0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1ec9, 0x2c00,
++      0x6802, 0x2560, 0x0f7f, 0x1078, 0x1e5b, 0x0f7e, 0x601b, 0x0005,
++      0x6023, 0x0020, 0x0f7f, 0x1078, 0x201d, 0x0f7e, 0x7908, 0x8109,
++      0x790a, 0x6810, 0x8001, 0x6812, 0x00c0, 0x1ee1, 0x7810, 0xc0a5,
++      0x7812, 0x2001, 0xffff, 0xa005, 0x0f7f, 0x007c, 0x077e, 0x2700,
++      0x2039, 0x0000, 0xd0fc, 0x0040, 0x1eee, 0xc7fd, 0x2041, 0x0021,
++      0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1dff,
++      0x8738, 0xa784, 0x001f, 0x00c0, 0x1ef6, 0xa7bc, 0xff00, 0x873f,
++      0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1ef6, 0x2091, 0x8001,
++      0x077f, 0x007c, 0x786c, 0x2009, 0x9674, 0x210c, 0xa10d, 0x0040,
++      0x1f14, 0xa065, 0x0078, 0x2395, 0x2061, 0x0000, 0x6018, 0xd084,
++      0x00c0, 0x1f34, 0x7810, 0xd08c, 0x0040, 0x1f25, 0xc08c, 0x7812,
++      0xc7fc, 0x2069, 0x4e40, 0x0078, 0x1f2a, 0xc08d, 0x7812, 0x2069,
++      0x4e80, 0xc7fd, 0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091,
++      0x8001, 0xa005, 0x00c0, 0x1f35, 0x007c, 0xa08c, 0xfff0, 0x0040,
++      0x1f3b, 0x1078, 0x296b, 0x0079, 0x1f3d, 0x1f4d, 0x1f50, 0x1f56,
++      0x1f5a, 0x1f4e, 0x1f5e, 0x1f4e, 0x1f4e, 0x1f4e, 0x1f64, 0x1f95,
++      0x1f99, 0x1f9f, 0x1fb4, 0x1f4e, 0x1f4e, 0x007c, 0x1078, 0x296b,
++      0x1078, 0x1ee6, 0x2001, 0x8001, 0x0078, 0x1fc0, 0x2001, 0x8003,
++      0x0078, 0x1fc0, 0x2001, 0x8004, 0x0078, 0x1fc0, 0x1078, 0x1ee6,
++      0x2001, 0x8006, 0x0078, 0x1fc0, 0x2091, 0x8000, 0x077e, 0xd7fc,
++      0x00c0, 0x1f70, 0x2069, 0x4e40, 0x2039, 0x0009, 0x0078, 0x1f74,
++      0x2069, 0x4e80, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000, 0x0040,
++      0x1f7e, 0x007f, 0x6f1e, 0x2091, 0x8001, 0x007c, 0x6874, 0x077f,
++      0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
++      0x1078, 0x1dff, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1f88, 0x2091,
++      0x8001, 0x2001, 0x800a, 0x0078, 0x1fc0, 0x2001, 0x800c, 0x0078,
++      0x1fc0, 0x1078, 0x1ee6, 0x2001, 0x800d, 0x0078, 0x1fc0, 0x7814,
++      0xd0e4, 0x00c0, 0x1fb2, 0xd0ec, 0x0040, 0x1fac, 0xd7fc, 0x0040,
++      0x1fac, 0x78e4, 0x0078, 0x1fad, 0x78e0, 0x70c6, 0x2001, 0x800e,
++      0x0078, 0x1fc0, 0x0078, 0x1f4e, 0xd7fc, 0x0040, 0x1fba, 0x78ec,
++      0x0078, 0x1fbb, 0x78e8, 0x70c6, 0x2001, 0x800f, 0x0078, 0x1fc0,
++      0x70c2, 0xd7fc, 0x00c0, 0x1fc8, 0x70db, 0x0000, 0x0078, 0x1fca,
++      0x70db, 0x0001, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080,
++      0x007c, 0xac80, 0x0001, 0x81ff, 0x0040, 0x1ffc, 0x2099, 0x0030,
++      0x20a0, 0x700c, 0xa084, 0x03ff, 0x0040, 0x1fde, 0x7018, 0x007e,
++      0x701c, 0x007e, 0x7020, 0x007e, 0x7024, 0x007e, 0x7112, 0x81ac,
++      0x721a, 0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001,
++      0x7008, 0x800b, 0x00c8, 0x1ff0, 0x7007, 0x0002, 0xa08c, 0x01e0,
++      0x00c0, 0x1ffc, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004,
++      0x007f, 0x7026, 0x007f, 0x7022, 0x007f, 0x701e, 0x007f, 0x701a,
++      0x007c, 0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x6803,
++      0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290,
++      0x0004, 0x8109, 0x00c0, 0x200d, 0x007c, 0x6004, 0x6086, 0x2c08,
++      0x2063, 0x0000, 0x7868, 0xa005, 0x796a, 0x0040, 0x202a, 0x2c02,
++      0x0078, 0x202b, 0x796e, 0x007c, 0x0c7e, 0x2061, 0x4e00, 0x6887,
++      0x0103, 0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040,
++      0x203c, 0x2d02, 0x0078, 0x203d, 0x616e, 0x0c7f, 0x007c, 0x2091,
++      0x8000, 0x2c04, 0x786e, 0xa005, 0x00c0, 0x2047, 0x786a, 0x2091,
++      0x8001, 0x609c, 0xa005, 0x0040, 0x2060, 0x0c7e, 0x2060, 0x2008,
++      0x609c, 0xa005, 0x0040, 0x205c, 0x2062, 0x609f, 0x0000, 0xa065,
++      0x609c, 0xa005, 0x00c0, 0x2054, 0x7848, 0x794a, 0x2062, 0x0c7f,
++      0x7848, 0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x00c0, 0x206a,
++      0x1078, 0x296b, 0x784a, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004,
++      0x8086, 0x818e, 0x00c8, 0x2075, 0xa200, 0x00f0, 0x2070, 0x8086,
++      0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x209b,
++      0xa11a, 0x00c8, 0x209b, 0x8213, 0x818d, 0x0048, 0x208e, 0xa11a,
++      0x00c8, 0x208f, 0x00f0, 0x2083, 0x0078, 0x2093, 0xa11a, 0x2308,
++      0x8210, 0x00f0, 0x2083, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080,
++      0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078,
++      0x2097, 0x7d74, 0x70d0, 0xa506, 0x0040, 0x2187, 0x7810, 0x2050,
++      0x7800, 0xd08c, 0x0040, 0x20c3, 0xdaec, 0x0040, 0x20c3, 0x0e7e,
++      0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x20c0,
++      0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x20c3, 0x0078, 0x2187,
++      0x0e7f, 0x0078, 0x2187, 0x1078, 0x1dbd, 0x0040, 0x2187, 0xa046,
++      0x7970, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x20d2,
++      0x0078, 0x20d9, 0x72d0, 0xa206, 0x0040, 0x20d9, 0x8840, 0x2009,
++      0x0080, 0x0c7e, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9,
++      0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0040,
++      0x20eb, 0x1078, 0x1dbd, 0x7008, 0xd0fc, 0x0040, 0x20eb, 0x7007,
++      0x0002, 0x2091, 0x8001, 0xa08c, 0x01e0, 0x00c0, 0x2122, 0x53a5,
++      0x8cff, 0x00c0, 0x2100, 0x88ff, 0x0040, 0x2171, 0x0078, 0x210a,
++      0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5,
++      0x0078, 0x2171, 0xa046, 0x7218, 0x731c, 0xdac4, 0x0040, 0x2112,
++      0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000,
++      0xa5ab, 0x0000, 0x721a, 0x731e, 0xdac4, 0x0040, 0x2122, 0x7422,
++      0x7526, 0xa006, 0x7007, 0x0004, 0x0040, 0x2171, 0x8cff, 0x0040,
++      0x212b, 0x1078, 0x1dc6, 0x0c7f, 0x1078, 0x1dc6, 0xa046, 0x7888,
++      0x8000, 0x788a, 0xa086, 0x0002, 0x0040, 0x2151, 0x7a7c, 0x7b78,
++      0xdac4, 0x0040, 0x213d, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004,
++      0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
++      0x721a, 0x731e, 0xdac4, 0x0040, 0x2187, 0x7422, 0x7526, 0x0078,
++      0x2187, 0x6014, 0xd0fc, 0x00c0, 0x2159, 0x2069, 0x4e40, 0x0078,
++      0x215b, 0x2069, 0x4e80, 0x2091, 0x8000, 0x681f, 0x0002, 0x88ff,
++      0x0040, 0x2167, 0xa046, 0x788c, 0x2060, 0x0078, 0x2151, 0x788b,
++      0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0078,
++      0x2187, 0x0c7f, 0x788b, 0x0000, 0x1078, 0x2346, 0x6004, 0xa084,
++      0x000f, 0x1078, 0x2188, 0x88ff, 0x0040, 0x2185, 0x788c, 0x2060,
++      0x6004, 0xa084, 0x000f, 0x1078, 0x2188, 0x0078, 0x20a1, 0x007c,
++      0x0079, 0x218a, 0x219a, 0x21b8, 0x21d6, 0x219a, 0x21e7, 0x21ab,
++      0x219a, 0x219a, 0x219a, 0x21b6, 0x21d4, 0x219a, 0x219a, 0x219a,
++      0x219a, 0x219a, 0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008,
++      0xa705, 0x600a, 0x1078, 0x222a, 0x609c, 0x78ba, 0x609f, 0x0000,
++      0x1078, 0x2330, 0x007c, 0x78bc, 0xd0c4, 0x0040, 0x21b1, 0x0078,
++      0x219a, 0x601c, 0xc0bd, 0x601e, 0x0078, 0x21be, 0x1078, 0x2378,
++      0x78bc, 0xd0c4, 0x0040, 0x21be, 0x0078, 0x219a, 0x78bf, 0x0000,
++      0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0040, 0x21d1,
++      0x1078, 0x222a, 0x0040, 0x21d1, 0x78bc, 0xc0c5, 0x78be, 0x0078,
++      0x21d3, 0x0078, 0x2249, 0x007c, 0x1078, 0x2374, 0x78bc, 0xa08c,
++      0x0e00, 0x00c0, 0x21de, 0xd0c4, 0x00c0, 0x21e0, 0x0078, 0x219a,
++      0x1078, 0x222a, 0x00c0, 0x21e6, 0x0078, 0x2249, 0x007c, 0x78bc,
++      0xd0c4, 0x0040, 0x21ed, 0x0078, 0x219a, 0x78bf, 0x0000, 0x6714,
++      0x2011, 0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040,
++      0x220d, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040,
++      0x220d, 0xa7bc, 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e,
++      0x0002, 0x0040, 0x220d, 0x0078, 0x2227, 0x1078, 0x1de4, 0x2d00,
++      0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084,
++      0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x00f0, 0x2210,
++      0x8211, 0x0040, 0x2227, 0x20a9, 0x0100, 0x0078, 0x2210, 0x1078,
++      0x1dc6, 0x007c, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6,
++      0x00c0, 0x2235, 0x78ba, 0x0078, 0x223d, 0x689e, 0x2d00, 0x6002,
++      0x78b8, 0xad06, 0x00c0, 0x223d, 0x6002, 0x78b0, 0x8001, 0x78b2,
++      0x00c0, 0x2248, 0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006,
++      0x007c, 0x0e7e, 0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2,
++      0x601c, 0x60a2, 0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060,
++      0x0040, 0x225c, 0x1078, 0x4632, 0x6596, 0x65a6, 0x669a, 0x66aa,
++      0x6714, 0x2071, 0x4e80, 0xd7fc, 0x00c0, 0x2268, 0x2071, 0x4e40,
++      0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x2273, 0x8003,
++      0x8003, 0x8003, 0x8003, 0xa105, 0x71c4, 0xa168, 0x2700, 0x8007,
++      0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x71c8, 0xa100, 0x60c2,
++      0x2091, 0x8000, 0x7814, 0xd0c4, 0x0040, 0x2298, 0xd0ec, 0x0040,
++      0x2294, 0xd7fc, 0x00c0, 0x2291, 0xd0f4, 0x00c0, 0x229f, 0x0078,
++      0x2298, 0xd0fc, 0x00c0, 0x229f, 0x7810, 0xd0f4, 0x00c0, 0x229f,
++      0x6e08, 0xd684, 0x0040, 0x22c9, 0xd9fc, 0x00c0, 0x22c9, 0x2091,
++      0x8001, 0x1078, 0x1e5b, 0x2091, 0x8000, 0x1078, 0x201d, 0x2091,
++      0x8001, 0x7814, 0xd0e4, 0x00c0, 0x232e, 0x7814, 0xd0c4, 0x0040,
++      0x232e, 0xd0ec, 0x0040, 0x22c1, 0xd7fc, 0x00c0, 0x22bc, 0xd0f4,
++      0x00c0, 0x22c5, 0x0078, 0x232e, 0xd0fc, 0x00c0, 0x22c5, 0x0078,
++      0x232e, 0x7810, 0xd0f4, 0x0040, 0x232e, 0x601b, 0x0021, 0x0078,
++      0x232e, 0x6024, 0xa096, 0x0001, 0x00c0, 0x22d0, 0x8000, 0x6026,
++      0x6a10, 0x6814, 0xa202, 0x0048, 0x22e3, 0x0040, 0x22e3, 0x2091,
++      0x8001, 0x2039, 0x0200, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078,
++      0x2330, 0x0078, 0x232e, 0x2c08, 0xd9fc, 0x0040, 0x230b, 0x6800,
++      0xa065, 0x0040, 0x230b, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0040,
++      0x2301, 0x704c, 0xa206, 0x00c0, 0x2301, 0x6b04, 0x2160, 0x2304,
++      0x6002, 0xa005, 0x00c0, 0x22fd, 0x6902, 0x2260, 0x6102, 0x0078,
++      0x2317, 0x2d00, 0x2060, 0x1078, 0x2acc, 0x6e08, 0x2160, 0x6202,
++      0x6906, 0x0078, 0x2317, 0x6800, 0x6902, 0xa065, 0x0040, 0x2313,
++      0x6102, 0x0078, 0x2314, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160,
++      0xd9fc, 0x0040, 0x231e, 0xa6b4, 0xfffc, 0x6e0a, 0x6810, 0x7d08,
++      0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0040,
++      0x232e, 0xa6b6, 0x0040, 0x6e0a, 0x1078, 0x1e6c, 0x0e7f, 0x007c,
++      0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x201d, 0x2091,
++      0x8001, 0x78b8, 0xa065, 0x0040, 0x2343, 0x609c, 0x78ba, 0x609f,
++      0x0000, 0x0078, 0x2330, 0x78b6, 0x78ba, 0x007c, 0x7970, 0x7874,
++      0x2818, 0xd384, 0x0040, 0x2350, 0x8000, 0xa112, 0x0048, 0x2355,
++      0x8000, 0xa112, 0x00c8, 0x2365, 0xc384, 0x7a7c, 0x721a, 0x7a78,
++      0x721e, 0xdac4, 0x0040, 0x2360, 0x7a84, 0x7222, 0x7a80, 0x7226,
++      0xa006, 0xd384, 0x0040, 0x2365, 0x8000, 0x7876, 0x70d2, 0x781c,
++      0xa005, 0x0040, 0x2373, 0x8001, 0x781e, 0x00c0, 0x2373, 0x0068,
++      0x2373, 0x2091, 0x4080, 0x007c, 0x2039, 0x238c, 0x0078, 0x237a,
++      0x2039, 0x2392, 0x2704, 0xa005, 0x0040, 0x238b, 0xac00, 0x2068,
++      0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e,
++      0x8738, 0x0078, 0x237a, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015,
++      0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x2041, 0x0000, 0x780c,
++      0x0079, 0x239a, 0x256c, 0x253f, 0x239e, 0x2417, 0x2039, 0x9674,
++      0x2734, 0x7d10, 0x0078, 0x23be, 0x6084, 0xa086, 0x0103, 0x00c0,
++      0x2400, 0x6114, 0x6018, 0xa105, 0x0040, 0x23b3, 0x86ff, 0x00c0,
++      0x23cf, 0x0078, 0x2400, 0x8603, 0xa080, 0x9655, 0x620c, 0x2202,
++      0x8000, 0x6210, 0x2202, 0x1078, 0x203f, 0x8630, 0xa68e, 0x000f,
++      0x0040, 0x248b, 0x786c, 0xa065, 0x00c0, 0x23a4, 0x7808, 0xa602,
++      0x00c8, 0x23cf, 0xd5ac, 0x00c0, 0x23cf, 0x263a, 0x007c, 0xa682,
++      0x0003, 0x00c8, 0x248b, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818,
++      0xd084, 0x00c0, 0x23fb, 0x2011, 0x9655, 0x2204, 0x70c6, 0x8210,
++      0x2204, 0x70ca, 0xd684, 0x00c0, 0x23eb, 0x8210, 0x2204, 0x70da,
++      0x8210, 0x2204, 0x70de, 0xa685, 0x8020, 0x70c2, 0x681b, 0x0001,
++      0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001,
++      0x203b, 0x0000, 0x007c, 0x7810, 0xc0ad, 0x7812, 0x0078, 0x248b,
++      0x263a, 0x1078, 0x2576, 0x00c0, 0x2599, 0x786c, 0xa065, 0x00c0,
++      0x23a4, 0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0040,
++      0x2412, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0078, 0x2599, 0x2039,
++      0x9674, 0x2734, 0x7d10, 0x0078, 0x2433, 0x6084, 0xa086, 0x0103,
++      0x00c0, 0x2474, 0x6114, 0x6018, 0xa105, 0x0040, 0x242c, 0x86ff,
++      0x00c0, 0x2444, 0x0078, 0x2474, 0xa680, 0x9655, 0x620c, 0x2202,
++      0x1078, 0x203f, 0x8630, 0xa68e, 0x001e, 0x0040, 0x248b, 0x786c,
++      0xa065, 0x00c0, 0x241d, 0x7808, 0xa602, 0x00c8, 0x2444, 0xd5ac,
++      0x00c0, 0x2444, 0x263a, 0x007c, 0xa682, 0x0006, 0x00c8, 0x248b,
++      0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x246f,
++      0x2011, 0x9655, 0x2009, 0x964e, 0x26a8, 0x211c, 0x2204, 0x201a,
++      0x8108, 0x8210, 0x00f0, 0x2455, 0xa685, 0x8030, 0x70c2, 0x681b,
++      0x0001, 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091,
++      0x8001, 0xa006, 0x2009, 0x9675, 0x200a, 0x203a, 0x007c, 0x7810,
++      0xc0ad, 0x7812, 0x0078, 0x248b, 0x263a, 0x1078, 0x2576, 0x00c0,
++      0x2599, 0x786c, 0xa065, 0x00c0, 0x241d, 0x2091, 0x8000, 0x7810,
++      0xa084, 0xffcf, 0x86ff, 0x0040, 0x2486, 0xc0ad, 0x7812, 0x2091,
++      0x8001, 0x0078, 0x2599, 0x2091, 0x8000, 0x7007, 0x0004, 0x7994,
++      0x70d4, 0xa102, 0x0048, 0x249c, 0x0040, 0x24a6, 0x7b90, 0xa302,
++      0x00c0, 0x24a6, 0x0078, 0x249f, 0x8002, 0x00c0, 0x24a6, 0x263a,
++      0x7810, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x007c, 0xa184, 0xff00,
++      0x0040, 0x24b3, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
++      0xa100, 0x0078, 0x24b6, 0x8107, 0x8004, 0x8004, 0x7a9c, 0xa210,
++      0x721a, 0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4, 0x0040, 0x24c6,
++      0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1, 0x0030,
++      0x7003, 0x0000, 0x2009, 0x9654, 0x260a, 0x8109, 0x2198, 0x2104,
++      0xd084, 0x0040, 0x24d4, 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6,
++      0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a,
++      0x00c8, 0x24e3, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0040,
++      0x24f2, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
++      0x0078, 0x24f5, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78,
++      0xa006, 0xa211, 0xd4c4, 0x0040, 0x2501, 0x7b84, 0xa319, 0x7c80,
++      0xa421, 0x7008, 0xd0fc, 0x0040, 0x2501, 0xa084, 0x01e0, 0x0040,
++      0x2526, 0x7d10, 0x2031, 0x9654, 0x2634, 0x78a8, 0x8000, 0x78aa,
++      0xd08c, 0x00c0, 0x251b, 0x7007, 0x0006, 0x7004, 0xd094, 0x00c0,
++      0x2515, 0x0078, 0x248d, 0x2069, 0x4e47, 0x206b, 0x0003, 0x78ac,
++      0xa085, 0x0300, 0x78ae, 0xa006, 0x0078, 0x252f, 0x2030, 0x75d6,
++      0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091,
++      0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a,
++      0x721e, 0xd5c4, 0x0040, 0x253e, 0x7322, 0x7426, 0x007c, 0x6084,
++      0xa086, 0x0103, 0x00c0, 0x2562, 0x6114, 0x6018, 0xa105, 0x00c0,
++      0x2562, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x2562, 0x600c,
++      0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091,
++      0x4080, 0x1078, 0x203f, 0x0068, 0x2561, 0x786c, 0xa065, 0x00c0,
++      0x253f, 0x007c, 0x1078, 0x2576, 0x00c0, 0x2599, 0x786c, 0xa065,
++      0x00c0, 0x253f, 0x0078, 0x2599, 0x1078, 0x2576, 0x00c0, 0x2599,
++      0x786c, 0xa065, 0x00c0, 0x256c, 0x0078, 0x2599, 0x6084, 0xa086,
++      0x0103, 0x00c0, 0x258a, 0x6018, 0xc0fc, 0x601a, 0xa086, 0x0004,
++      0x00c0, 0x258a, 0x7804, 0xd0a4, 0x0040, 0x258a, 0x1078, 0x203f,
++      0xa006, 0x007c, 0x1078, 0x259f, 0x00c0, 0x2591, 0xa085, 0x0001,
++      0x007c, 0x1078, 0x25ae, 0x00c0, 0x2597, 0x2041, 0x0001, 0x7d10,
++      0x007c, 0x88ff, 0x0040, 0x259e, 0x2091, 0x4080, 0x007c, 0x7b90,
++      0x7994, 0x70d4, 0xa102, 0x00c0, 0x25a8, 0xa385, 0x0000, 0x007c,
++      0x0048, 0x25ac, 0xa302, 0x007c, 0x8002, 0x007c, 0x7810, 0xd0ec,
++      0x0040, 0x25c6, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004,
++      0xa005, 0x00c0, 0x25c3, 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040,
++      0x25c6, 0x0078, 0x2617, 0x0e7f, 0x0078, 0x2617, 0xa184, 0xff00,
++      0x0040, 0x25d3, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
++      0xa100, 0x0078, 0x25d6, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98,
++      0x7ca4, 0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009,
++      0x0018, 0x6028, 0xa005, 0x0040, 0x25e7, 0x2009, 0x0040, 0x1078,
++      0x1d74, 0x0040, 0x2609, 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x00c0,
++      0x2617, 0x6014, 0xd0fc, 0x00c0, 0x25f9, 0x2069, 0x4e40, 0x0078,
++      0x25fb, 0x2069, 0x4e80, 0x2091, 0x8000, 0x681f, 0x0003, 0x78ab,
++      0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0078,
++      0x2617, 0x78ab, 0x0000, 0x1078, 0x203f, 0x7990, 0x7894, 0x8000,
++      0xa10a, 0x00c8, 0x2614, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071,
++      0x0010, 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x2623, 0x2009,
++      0x4e59, 0x0078, 0x2625, 0x2009, 0x4e99, 0x2091, 0x8000, 0x200a,
++      0x0f7e, 0xd7fc, 0x00c0, 0x263c, 0x2009, 0x4e40, 0x2001, 0x4e04,
++      0x2004, 0xd0ec, 0x0040, 0x2638, 0x2079, 0x0100, 0x0078, 0x2640,
++      0x2079, 0x0200, 0x0078, 0x2640, 0x2009, 0x4e80, 0x2079, 0x0100,
++      0x2104, 0xa086, 0x0000, 0x00c0, 0x2659, 0xd7fc, 0x00c0, 0x264c,
++      0x2009, 0x4e45, 0x0078, 0x264e, 0x2009, 0x4e85, 0x2104, 0xa005,
++      0x00c0, 0x2659, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2659, 0x781b,
++      0x0045, 0x0f7f, 0x007c, 0x2009, 0x0002, 0x2069, 0x4e00, 0x6810,
++      0xd0ec, 0x00c0, 0x26c8, 0x2071, 0x4e80, 0x2079, 0x0100, 0x2021,
++      0x50bf, 0x784b, 0x000f, 0x2019, 0x4457, 0xd184, 0x0040, 0x267c,
++      0x6810, 0xd0ec, 0x0040, 0x2678, 0x20a1, 0x012b, 0x0078, 0x267e,
++      0x20a1, 0x022b, 0x0078, 0x267e, 0x20a1, 0x012b, 0x2304, 0xa005,
++      0x0040, 0x268b, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6,
++      0x3318, 0x0078, 0x267e, 0x789b, 0x0020, 0x20a9, 0x0010, 0x6814,
++      0xd0e4, 0x0040, 0x269b, 0x78af, 0x0000, 0x78af, 0x9020, 0x00f0,
++      0x2693, 0x0078, 0x26a1, 0x78af, 0x0000, 0x78af, 0x8020, 0x00f0,
++      0x269b, 0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, 0x0000, 0x0040,
++      0x26aa, 0xc1bd, 0x1078, 0x289b, 0x017f, 0x7020, 0xa084, 0x000f,
++      0x007e, 0x6814, 0xd0e4, 0x007f, 0x00c0, 0x26ba, 0xa085, 0x6340,
++      0x0078, 0x26bc, 0xa085, 0x62c0, 0x7806, 0x780f, 0x9200, 0x7843,
++      0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7456, 0x7053, 0x0000,
++      0x8109, 0x0040, 0x26db, 0x2071, 0x4e40, 0x6810, 0xd0ec, 0x0040,
++      0x26d5, 0x2079, 0x0100, 0x0078, 0x26d7, 0x2079, 0x0200, 0x2021,
++      0x4ebf, 0x0078, 0x2669, 0x007c, 0x017e, 0xd1bc, 0x00c0, 0x26f0,
++      0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x26ec,
++      0x2011, 0x0101, 0x0078, 0x26f2, 0x2011, 0x0201, 0x0078, 0x26f2,
++      0x2011, 0x0101, 0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105,
++      0x2012, 0x017f, 0x1078, 0x289b, 0x007c, 0xd3fc, 0x00c0, 0x2710,
++      0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x270c,
++      0x2011, 0x0101, 0x0078, 0x2712, 0x2011, 0x0201, 0x0078, 0x2712,
++      0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x00f0, 0x2714, 0xa18c,
++      0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2019,
++      0x0002, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x0040, 0x272c, 0x8319,
++      0x2009, 0x0101, 0x0078, 0x272e, 0x2009, 0x0101, 0x20a9, 0x0005,
++      0x8213, 0x00f0, 0x2730, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f,
++      0xa205, 0x200a, 0x8319, 0x0040, 0x2741, 0x2009, 0x0201, 0x0078,
++      0x272e, 0x007c, 0xd3fc, 0x00c0, 0x2755, 0x007e, 0x2001, 0x4e04,
++      0x2004, 0xd0ec, 0x007f, 0x0040, 0x2751, 0x2011, 0x0101, 0x0078,
++      0x2757, 0x2011, 0x0201, 0x0078, 0x2757, 0x2011, 0x0101, 0x20a9,
++      0x000c, 0x810b, 0x00f0, 0x2759, 0xa18c, 0xf000, 0x2204, 0xa084,
++      0x0fff, 0xa105, 0x2012, 0x007c, 0xd3fc, 0x00c0, 0x2777, 0x007e,
++      0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2773, 0x2011,
++      0x0102, 0x0078, 0x2779, 0x2011, 0x0202, 0x0078, 0x2779, 0x2011,
++      0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x0c7e,
++      0xd1bc, 0x00c0, 0x2793, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x278f, 0x2061, 0x0100, 0x0078, 0x2795, 0x2061,
++      0x0200, 0x0078, 0x2795, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003,
++      0xa080, 0x0020, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x0c7e,
++      0xd1bc, 0x00c0, 0x27b3, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x27af, 0x2061, 0x0100, 0x0078, 0x27b5, 0x2061,
++      0x0200, 0x0078, 0x27b5, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003,
++      0xa080, 0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f,
++      0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x27d5, 0x007e, 0x2001, 0x4e04,
++      0x2004, 0xd0ec, 0x007f, 0x0040, 0x27d1, 0x2061, 0x0100, 0x0078,
++      0x27d7, 0x2061, 0x0200, 0x0078, 0x27d7, 0x2061, 0x0100, 0xc1bc,
++      0x8103, 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, 0xa085, 0x0020,
++      0x60ae, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x27f7, 0x007e,
++      0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x27f3, 0x2061,
++      0x0100, 0x0078, 0x27f9, 0x2061, 0x0200, 0x0078, 0x27f9, 0x2061,
++      0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4,
++      0xa28c, 0x0020, 0x0040, 0x2807, 0xc2ac, 0xa39d, 0x4000, 0xc3fc,
++      0xd3b4, 0x00c0, 0x280c, 0xc3fd, 0x62ae, 0x2010, 0x60a4, 0x63ae,
++      0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818,
++      0xa005, 0x0040, 0x2879, 0xd1fc, 0x0040, 0x2822, 0x2061, 0x95d0,
++      0x0078, 0x2824, 0x2061, 0x94c0, 0x1078, 0x2881, 0x0040, 0x285b,
++      0x20a9, 0x0101, 0xd1fc, 0x0040, 0x2831, 0x2061, 0x94d0, 0x0078,
++      0x2833, 0x2061, 0x93c0, 0x0c7e, 0x1078, 0x2881, 0x0040, 0x283e,
++      0x0c7f, 0x8c60, 0x00f0, 0x2833, 0x0078, 0x2879, 0x007f, 0xd1fc,
++      0x0040, 0x2848, 0xa082, 0x94d0, 0x2071, 0x4e80, 0x0078, 0x284c,
++      0xa082, 0x93c0, 0x2071, 0x4e40, 0x707a, 0x7176, 0x2138, 0x2001,
++      0x0004, 0x7066, 0x7083, 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x1078,
++      0x261c, 0x0078, 0x2875, 0xd1fc, 0x00c0, 0x2862, 0x2071, 0x4e40,
++      0x0078, 0x2864, 0x2071, 0x4e80, 0x6020, 0xc0dd, 0x6022, 0x7176,
++      0x2138, 0x2c00, 0x707e, 0x2001, 0x0006, 0x7066, 0x7083, 0x000f,
++      0x71d4, 0xc1dc, 0x71d6, 0x1078, 0x261c, 0x2001, 0x0000, 0x0078,
++      0x287b, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f,
++      0x007c, 0x2c04, 0xa005, 0x0040, 0x2898, 0x2060, 0x6010, 0xa306,
++      0x00c0, 0x2895, 0x600c, 0xa206, 0x00c0, 0x2895, 0x6014, 0xa106,
++      0x00c0, 0x2895, 0xa006, 0x0078, 0x289a, 0x6000, 0x0078, 0x2882,
++      0xa085, 0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0xd1bc, 0x00c0,
++      0x28b3, 0x2079, 0x4e40, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x28af, 0x2071, 0x0100, 0x0078, 0x28b7, 0x2071,
++      0x0200, 0x0078, 0x28b7, 0x2079, 0x4e80, 0x2071, 0x0100, 0x7920,
++      0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x00c0, 0x28c1, 0x017f, 0x0078,
++      0x28dc, 0x810b, 0x810b, 0x810b, 0x810b, 0x007f, 0xd0bc, 0x00c0,
++      0x28d9, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040,
++      0x28d5, 0xa18d, 0x0f00, 0x0078, 0x28db, 0xa18d, 0x0f00, 0x0078,
++      0x28db, 0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, 0x007c, 0x0e7e,
++      0x2001, 0x4e01, 0x2004, 0xd0ac, 0x00c0, 0x295c, 0x68e4, 0xd0ac,
++      0x0040, 0x295c, 0xa084, 0x0006, 0x00c0, 0x295c, 0x6014, 0xd0fc,
++      0x00c0, 0x28f6, 0x2071, 0x52c0, 0x0078, 0x28f8, 0x2071, 0x5340,
++      0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004,
++      0xa084, 0x000a, 0x00c0, 0x295c, 0x7108, 0xa194, 0xff00, 0x0040,
++      0x295c, 0xa18c, 0x00ff, 0x2001, 0x000a, 0xa106, 0x0040, 0x292b,
++      0x2001, 0x000c, 0xa106, 0x0040, 0x292f, 0x2001, 0x0012, 0xa106,
++      0x0040, 0x2933, 0x2001, 0x0014, 0xa106, 0x0040, 0x2937, 0x2001,
++      0x0019, 0xa106, 0x0040, 0x293b, 0x2001, 0x0032, 0xa106, 0x0040,
++      0x293f, 0x0078, 0x2943, 0x2009, 0x000c, 0x0078, 0x2945, 0x2009,
++      0x0012, 0x0078, 0x2945, 0x2009, 0x0014, 0x0078, 0x2945, 0x2009,
++      0x0019, 0x0078, 0x2945, 0x2009, 0x0020, 0x0078, 0x2945, 0x2009,
++      0x003f, 0x0078, 0x2945, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a,
++      0x2071, 0x4e00, 0x7004, 0xd0bc, 0x0040, 0x295c, 0x6014, 0xd0fc,
++      0x00c0, 0x2957, 0x70ea, 0x2071, 0x4e40, 0x0078, 0x295a, 0x70ee,
++      0x2071, 0x4e80, 0x701f, 0x000d, 0x0e7f, 0x007c, 0x2001, 0x4e05,
++      0x2004, 0xd0e4, 0x00c0, 0x296a, 0x7804, 0xa084, 0xff1f, 0xa085,
++      0x6340, 0x7806, 0x007c, 0x0068, 0x296b, 0x2091, 0x8000, 0x2071,
++      0x0000, 0x007e, 0x7018, 0xd084, 0x00c0, 0x2972, 0x007f, 0x2071,
++      0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x080f,
++      0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
++      0x0078, 0x2988, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708e,
++      0x7592, 0x7496, 0x769a, 0x779e, 0xa594, 0x003f, 0xd4f4, 0x0040,
++      0x299f, 0xa784, 0x007d, 0x00c0, 0x43cd, 0x1078, 0x296b, 0xa49c,
++      0x000f, 0xa382, 0x0004, 0x0050, 0x29aa, 0xa3a6, 0x0007, 0x00c0,
++      0x296b, 0x2418, 0x8507, 0xa084, 0x000f, 0x0079, 0x29af, 0x3028,
++      0x3119, 0x3144, 0x33b6, 0x379f, 0x3819, 0x38ce, 0x395f, 0x3a4d,
++      0x3b3c, 0x29c2, 0x29bf, 0x2df9, 0x2f1c, 0x3770, 0x29bf, 0x1078,
++      0x296b, 0x007c, 0xa006, 0x0078, 0x29cc, 0x7808, 0xc08d, 0x780a,
++      0xa006, 0x7002, 0x704e, 0x7046, 0x70d2, 0x7060, 0xa005, 0x00c0,
++      0x2b32, 0x7064, 0xa084, 0x0007, 0x0079, 0x29d6, 0x29de, 0x2a51,
++      0x2a5a, 0x2a65, 0x2a70, 0x2b18, 0x2a7b, 0x2a51, 0x7830, 0xd0bc,
++      0x00c0, 0x29c1, 0x71d4, 0xd1bc, 0x00c0, 0x29c1, 0xd1b4, 0x00c0,
++      0x2a2e, 0x70a4, 0xa086, 0x0001, 0x0040, 0x29c1, 0x70b4, 0xa06d,
++      0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808,
++      0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040,
++      0x2a04, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001,
++      0x0010, 0x0078, 0x2c8c, 0x7060, 0xa005, 0x00c0, 0x29c1, 0x0c7e,
++      0x0d7e, 0x70b4, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010,
++      0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
++      0xa886, 0x0001, 0x0040, 0x2a27, 0x69bc, 0x7daa, 0x79aa, 0x68c0,
++      0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0078, 0x2c8c, 0x1078, 0x4360,
++      0x00c0, 0x29c1, 0x781b, 0x005b, 0x70bc, 0xa06d, 0x68b4, 0x785a,
++      0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d,
++      0x780a, 0x68bc, 0x7042, 0xc1b4, 0x71d6, 0x70b8, 0xa065, 0x68c0,
++      0x705a, 0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046,
++      0x007c, 0x1078, 0x4360, 0x00c0, 0x2a59, 0x781b, 0x0047, 0x7003,
++      0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a64, 0x2011, 0x000c,
++      0x1078, 0x2a8b, 0x7003, 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0,
++      0x2a6f, 0x2011, 0x0006, 0x1078, 0x2a8b, 0x7003, 0x0004, 0x007c,
++      0x1078, 0x4360, 0x00c0, 0x2a7a, 0x2011, 0x000d, 0x1078, 0x2a8b,
++      0x7003, 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a8a, 0x2011,
++      0x0006, 0x1078, 0x2a8b, 0x707c, 0x707f, 0x0000, 0x2068, 0x704e,
++      0x7003, 0x0001, 0x007c, 0x7174, 0xc1fc, 0x8107, 0x7882, 0x789b,
++      0x0010, 0xa286, 0x000c, 0x00c0, 0x2a9a, 0x7aaa, 0x2001, 0x0001,
++      0x0078, 0x2aaf, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286,
++      0x000d, 0x0040, 0x2aa8, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2aaf,
++      0x78ab, 0x0020, 0x7178, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b,
++      0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x0116, 0x1078, 0x4383,
++      0x7083, 0x000f, 0x70d4, 0xd0b4, 0x0040, 0x2acb, 0xc0b4, 0x70d6,
++      0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
++      0x8001, 0x601a, 0x0c7f, 0x007c, 0x7014, 0xa005, 0x00c0, 0x2ada,
++      0x70d4, 0xd0b4, 0x0040, 0x2adb, 0x70b8, 0xac06, 0x00c0, 0x2adb,
++      0x1078, 0x2aba, 0x007c, 0x017e, 0x71a4, 0xa186, 0x0001, 0x0040,
++      0x2b0d, 0x0d7e, 0x027e, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b4,
++      0x2068, 0x6800, 0xac06, 0x0040, 0x2af4, 0x8211, 0x0040, 0x2b0b,
++      0x1078, 0x2b0f, 0x0078, 0x2ae9, 0x0c7e, 0x2100, 0x2011, 0x0001,
++      0xa212, 0x70b4, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef,
++      0x600a, 0x8211, 0x0040, 0x2b08, 0x1078, 0x2b0f, 0x0078, 0x2afb,
++      0x70a7, 0x0001, 0x0c7f, 0x027f, 0x0d7f, 0x017f, 0x007c, 0xade8,
++      0x0005, 0x70ac, 0xad06, 0x00c0, 0x2b17, 0x70a8, 0x2068, 0x007c,
++      0x1078, 0x4360, 0x00c0, 0x29c1, 0x707c, 0x2068, 0x7774, 0x1078,
++      0x41fe, 0x2c50, 0x1078, 0x4442, 0x789b, 0x0010, 0x6814, 0xa084,
++      0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004,
++      0x0078, 0x2c92, 0x1078, 0x4360, 0x00c0, 0x29c1, 0x789b, 0x0010,
++      0x7060, 0x2068, 0x6f14, 0x70d4, 0xd0b4, 0x0040, 0x2b4c, 0xc0b4,
++      0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a,
++      0x6018, 0x8001, 0x601a, 0x0c7f, 0x1078, 0x41fe, 0x2c50, 0x1078,
++      0x4442, 0x6824, 0xa005, 0x0040, 0x2b5d, 0xa082, 0x0006, 0x0048,
++      0x2b5b, 0x0078, 0x2b5d, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f,
++      0xc0bd, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003,
++      0x0078, 0x2c92, 0xc28d, 0x72d6, 0x72c0, 0xa200, 0xa015, 0x7154,
++      0x8108, 0xa12a, 0x0048, 0x2b75, 0x71c0, 0x2164, 0x6504, 0x85ff,
++      0x00c0, 0x2b8c, 0x7156, 0x8421, 0x00c0, 0x2b70, 0x70d4, 0xd08c,
++      0x0040, 0x2b88, 0x70d0, 0xa005, 0x00c0, 0x2b88, 0x70d3, 0x000a,
++      0x007c, 0x2200, 0x0078, 0x2b7a, 0x70d4, 0xc08c, 0x70d6, 0x70d3,
++      0x0000, 0x6034, 0xa005, 0x00c0, 0x2b89, 0x6708, 0xa784, 0x073f,
++      0x0040, 0x2bbb, 0xd7d4, 0x00c0, 0x2b89, 0xa784, 0x0021, 0x00c0,
++      0x2b89, 0xa784, 0x0002, 0x0040, 0x2bac, 0xa784, 0x0004, 0x0040,
++      0x2b89, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, 0x00c0, 0x2b89,
++      0xa784, 0x0100, 0x0040, 0x2bbb, 0x6018, 0xa005, 0x00c0, 0x2b89,
++      0xa7bc, 0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684,
++      0x000e, 0x6318, 0x0040, 0x2bcc, 0x601c, 0xa302, 0x0048, 0x2bcf,
++      0x0040, 0x2bcf, 0x0078, 0x2b89, 0x83ff, 0x00c0, 0x2b89, 0x2d58,
++      0x2c50, 0x7156, 0xd7bc, 0x00c0, 0x2bd8, 0x7028, 0x6022, 0x603a,
++      0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041,
++      0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0040,
++      0x2bec, 0xd684, 0x0040, 0x2bee, 0xa39c, 0xffbf, 0xd6a4, 0x0040,
++      0x2bf3, 0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2c3e, 0xc7a5,
++      0x670a, 0x2c00, 0x68c6, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c12,
++      0x70d4, 0xd0b4, 0x00c0, 0x2c12, 0x7000, 0xa082, 0x0002, 0x00c8,
++      0x2c12, 0x7830, 0xd0bc, 0x00c0, 0x2c12, 0x789b, 0x0010, 0x7baa,
++      0x0078, 0x2c8a, 0x8739, 0x77a6, 0x2750, 0x77b0, 0xa7b0, 0x0005,
++      0x70ac, 0xa606, 0x00c0, 0x2c1d, 0x76a8, 0x76b2, 0x2c3a, 0x8738,
++      0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830,
++      0xd0bc, 0x0040, 0x2c35, 0x2091, 0x8000, 0x2091, 0x303d, 0x70d4,
++      0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000, 0x0040,
++      0x2c3d, 0x8421, 0x2200, 0x00c0, 0x2b6f, 0x007c, 0xd1dc, 0x0040,
++      0x3e00, 0x2029, 0x0020, 0xd69c, 0x00c0, 0x2c4b, 0x8528, 0xd68c,
++      0x00c0, 0x2c4b, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c,
++      0x00ff, 0x70cc, 0xa160, 0x2c64, 0x8cff, 0x0040, 0x2c6a, 0x6014,
++      0xa706, 0x00c0, 0x2c53, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2c4e,
++      0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x00c0,
++      0x2b6f, 0x007c, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840,
++      0x6008, 0xc0d5, 0x600a, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c12,
++      0x70d4, 0xd0b4, 0x00c0, 0x2c12, 0x7000, 0xa082, 0x0002, 0x00c8,
++      0x2c12, 0x7830, 0xd0bc, 0x00c0, 0x2c12, 0x789b, 0x0010, 0x7baa,
++      0x7daa, 0x79aa, 0x2001, 0x0002, 0x007e, 0x6018, 0x8000, 0x601a,
++      0x0078, 0x2c93, 0x007e, 0x2960, 0x6104, 0x2a60, 0xa184, 0x0018,
++      0x0040, 0x2caf, 0xa184, 0x0010, 0x0040, 0x2ca2, 0x1078, 0x4011,
++      0x00c0, 0x2cd4, 0xa184, 0x0008, 0x0040, 0x2caf, 0x69a0, 0xa184,
++      0x0600, 0x00c0, 0x2caf, 0x1078, 0x3ef5, 0x0078, 0x2cd4, 0x69a0,
++      0xa184, 0x1e00, 0x0040, 0x2cdf, 0xa184, 0x0800, 0x0040, 0x2cc8,
++      0x0c7e, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d,
++      0x0010, 0x6106, 0x0c7f, 0x1078, 0x4011, 0x00c0, 0x2cd4, 0x69a0,
++      0xa184, 0x0200, 0x0040, 0x2cd0, 0x1078, 0x3f54, 0x0078, 0x2cd4,
++      0xa184, 0x0400, 0x00c0, 0x2cab, 0x69a0, 0xa184, 0x1000, 0x0040,
++      0x2cdf, 0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x279f, 0x027f,
++      0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x2cec, 0xa086, 0x0060,
++      0x00c0, 0x2cec, 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b,
++      0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0040,
++      0x2d07, 0xc0fc, 0x7087, 0x0000, 0xa08a, 0x000d, 0x0050, 0x2d05,
++      0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, 0x78aa,
++      0x3518, 0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0,
++      0x789b, 0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898,
++      0x25a0, 0xa286, 0x0020, 0x00c0, 0x2d3f, 0x70d4, 0xc0b5, 0x70d6,
++      0x2c00, 0x70ba, 0x2d00, 0x70be, 0x6814, 0xc0fc, 0x8007, 0x7882,
++      0xa286, 0x0002, 0x0040, 0x2d75, 0x70a4, 0x8000, 0x70a6, 0x74b4,
++      0xa498, 0x0005, 0x70ac, 0xa306, 0x00c0, 0x2d37, 0x73a8, 0x73b6,
++      0xa286, 0x0010, 0x0040, 0x29c1, 0x0d7f, 0x0c7f, 0x007c, 0x7000,
++      0xa005, 0x00c0, 0x2d1d, 0xa286, 0x0002, 0x00c0, 0x2d8f, 0x1078,
++      0x4360, 0x00c0, 0x2d1d, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091,
++      0x8000, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
++      0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a,
++      0x127e, 0x0d7e, 0x0c7e, 0x70d4, 0xa084, 0x2700, 0x2090, 0x0c7f,
++      0x0d7f, 0x127f, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003, 0x0002,
++      0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x7830, 0xd0bc, 0x0040,
++      0x2d81, 0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, 0x2091, 0x8000,
++      0x2090, 0x70a4, 0xa005, 0x00c0, 0x2d86, 0x007c, 0x8421, 0x0040,
++      0x2d85, 0x7250, 0x70c0, 0xa200, 0xa015, 0x0078, 0x2b6f, 0xa286,
++      0x0010, 0x00c0, 0x2dc0, 0x1078, 0x4360, 0x00c0, 0x2d1d, 0x6814,
++      0xc0fc, 0x8007, 0x7882, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894,
++      0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a,
++      0x70a4, 0x8000, 0x70a6, 0x74b4, 0xa490, 0x0005, 0x70ac, 0xa206,
++      0x00c0, 0x2db3, 0x72a8, 0x72b6, 0x2900, 0x705a, 0x68bc, 0x7042,
++      0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c,
++      0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882,
++      0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x005b,
++      0x2900, 0x705a, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605,
++      0x0040, 0x2deb, 0x70d4, 0xa084, 0x2700, 0xa086, 0x2300, 0x00c0,
++      0x2de5, 0x2009, 0x0000, 0x0078, 0x2de7, 0x2009, 0x0001, 0xa284,
++      0x000f, 0x1079, 0x2def, 0xad80, 0x0009, 0x7046, 0x007c, 0x2df7,
++      0x48bd, 0x48bd, 0x48aa, 0x48bd, 0x2df7, 0x2df7, 0x2df7, 0x1078,
++      0x296b, 0x7808, 0xa084, 0xfffd, 0x780a, 0x1078, 0x295e, 0x0f7e,
++      0x2079, 0x4e00, 0x78ac, 0x0f7f, 0xd084, 0x0040, 0x2e21, 0x7064,
++      0xa086, 0x0001, 0x00c0, 0x2e0f, 0x7066, 0x0078, 0x2ef8, 0x7064,
++      0xa086, 0x0005, 0x00c0, 0x2e1f, 0x707c, 0x2068, 0x681b, 0x0004,
++      0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7067,
++      0x0000, 0x70a7, 0x0000, 0x70a8, 0x70b2, 0x70b6, 0x1078, 0x2aba,
++      0x157e, 0x2011, 0x0004, 0x7164, 0xa186, 0x0001, 0x0040, 0x2e41,
++      0xa186, 0x0007, 0x00c0, 0x2e38, 0x701f, 0x0005, 0x0078, 0x2e41,
++      0x701f, 0x0001, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078,
++      0x2e43, 0x7067, 0x0000, 0x2001, 0x4e0a, 0x2004, 0xa084, 0x00ff,
++      0xa086, 0x0018, 0x0040, 0x2e53, 0x7018, 0x7016, 0xa005, 0x00c0,
++      0x2e53, 0x70a7, 0x0001, 0x067e, 0x1078, 0x4586, 0x20a9, 0x0010,
++      0x2039, 0x0000, 0x1078, 0x40f8, 0xa7b8, 0x0100, 0x00f0, 0x2e5a,
++      0x067f, 0x7000, 0x0079, 0x2e64, 0x2e9e, 0x2e79, 0x2e79, 0x2e6e,
++      0x2e9e, 0x2e9e, 0x2e9e, 0x2e6c, 0x1078, 0x296b, 0x7060, 0xa005,
++      0x0040, 0x2e9e, 0xad06, 0x00c0, 0x2e79, 0x6800, 0x7062, 0x0078,
++      0x2e8b, 0x6820, 0xd084, 0x00c0, 0x2e87, 0x6f14, 0x1078, 0x41fe,
++      0x6008, 0xc0d4, 0x600a, 0x1078, 0x3dd0, 0x0078, 0x2e8b, 0x705c,
++      0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc,
++      0x0040, 0x2e93, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820,
++      0xa084, 0x00ff, 0xc09d, 0x6822, 0x1078, 0x202c, 0xb284, 0x0400,
++      0x0040, 0x2ea6, 0x2021, 0x95d0, 0x0078, 0x2ea8, 0x2021, 0x94c0,
++      0x1078, 0x2efd, 0xb284, 0x0400, 0x0040, 0x2eb2, 0x2021, 0x4e98,
++      0x0078, 0x2eb4, 0x2021, 0x4e58, 0x1078, 0x2efd, 0x20a9, 0x0101,
++      0xb284, 0x0400, 0x0040, 0x2ec0, 0x2021, 0x94d0, 0x0078, 0x2ec2,
++      0x2021, 0x93c0, 0x1078, 0x2efd, 0x8420, 0x00f0, 0x2ec2, 0xb284,
++      0x0300, 0x0040, 0x2ecf, 0x2061, 0x53c0, 0x0078, 0x2ed1, 0x2061,
++      0x73c0, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0040,
++      0x2eee, 0x6018, 0x017e, 0x007e, 0x2011, 0x4e02, 0x220c, 0xa102,
++      0x2012, 0x007f, 0x017f, 0xa102, 0x0050, 0x2eee, 0x6012, 0x00c0,
++      0x2eee, 0x2011, 0x4e04, 0x2204, 0xc0a5, 0x2012, 0x601b, 0x0000,
++      0xace0, 0x0010, 0x00f0, 0x2ed5, 0x8421, 0x00c0, 0x2ed3, 0x157f,
++      0x7003, 0x0000, 0x704f, 0x0000, 0x007c, 0x047e, 0x2404, 0xa005,
++      0x0040, 0x2f18, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817, 0x0000,
++      0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084,
++      0x00ff, 0xc09d, 0x6822, 0x1078, 0x202c, 0x007f, 0x0078, 0x2eff,
++      0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x2f22,
++      0x1078, 0x296b, 0x2300, 0x0079, 0x2f25, 0x2f28, 0x2fb3, 0x2fd0,
++      0xa282, 0x0002, 0x0040, 0x2f2e, 0x1078, 0x296b, 0x7064, 0x7067,
++      0x0000, 0x7083, 0x0000, 0x0079, 0x2f35, 0x2f3d, 0x2f3d, 0x2f3f,
++      0x2f7f, 0x3e0c, 0x2f3d, 0x2f7f, 0x2f3d, 0x1078, 0x296b, 0x7774,
++      0x1078, 0x40f8, 0x7774, 0xa7bc, 0x8f00, 0x1078, 0x41fe, 0x6018,
++      0xa005, 0x0040, 0x2f76, 0xd7fc, 0x00c0, 0x2f52, 0x2021, 0x94c0,
++      0x0078, 0x2f54, 0x2021, 0x95d0, 0x2009, 0x0005, 0x2011, 0x0010,
++      0x1078, 0x2feb, 0x0040, 0x2f76, 0x157e, 0x20a9, 0x0101, 0xd7fc,
++      0x00c0, 0x2f66, 0x2021, 0x93c0, 0x0078, 0x2f68, 0x2021, 0x94d0,
++      0x047e, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078, 0x2feb, 0x047f,
++      0x0040, 0x2f75, 0x8420, 0x00f0, 0x2f68, 0x157f, 0x8738, 0xa784,
++      0x001f, 0x00c0, 0x2f45, 0x0078, 0x29c5, 0x0078, 0x29c5, 0x7774,
++      0x1078, 0x41fe, 0x6018, 0xa005, 0x0040, 0x2fb1, 0xd7fc, 0x00c0,
++      0x2f8d, 0x2021, 0x94c0, 0x0078, 0x2f8f, 0x2021, 0x95d0, 0x2009,
++      0x0005, 0x2011, 0x0020, 0x1078, 0x2feb, 0x0040, 0x2fb1, 0x157e,
++      0x20a9, 0x0101, 0xd7fc, 0x00c0, 0x2fa1, 0x2021, 0x93c0, 0x0078,
++      0x2fa3, 0x2021, 0x94d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020,
++      0x1078, 0x2feb, 0x047f, 0x0040, 0x2fb0, 0x8420, 0x00f0, 0x2fa3,
++      0x157f, 0x0078, 0x29c5, 0x2200, 0x0079, 0x2fb6, 0x2fb9, 0x2fbb,
++      0x2fbb, 0x1078, 0x296b, 0x2009, 0x0012, 0x7064, 0xa086, 0x0002,
++      0x0040, 0x2fc4, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0040, 0x2fc9,
++      0x691a, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078, 0x430d,
++      0x2200, 0x0079, 0x2fd3, 0x2fd8, 0x2fbb, 0x2fd6, 0x1078, 0x296b,
++      0x1078, 0x4586, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3d7e, 0x1078,
++      0x3ded, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3d6f, 0x0040,
++      0x3d7e, 0x0078, 0x29c5, 0x2404, 0xa005, 0x0040, 0x3024, 0x2068,
++      0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x2ffa, 0x2d20, 0x007f,
++      0x0078, 0x2fec, 0x007f, 0x2022, 0x691a, 0x6817, 0x0000, 0x682b,
++      0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, 0x00ff,
++      0xa205, 0x6822, 0x1078, 0x202c, 0x2021, 0x4e02, 0x241c, 0x8319,
++      0x2322, 0x6010, 0x8001, 0x6012, 0x00c0, 0x301b, 0x2021, 0x4e04,
++      0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x1078,
++      0x2adb, 0x1078, 0x3ded, 0x007c, 0xa085, 0x0001, 0x0078, 0x3023,
++      0x2300, 0x0079, 0x302b, 0x3030, 0x302e, 0x30b0, 0x1078, 0x296b,
++      0x78e4, 0xa005, 0x00d0, 0x3066, 0x3208, 0x007e, 0x2001, 0x4e04,
++      0x2004, 0xd0ec, 0x007f, 0x0040, 0x3041, 0xa18c, 0x0300, 0x0078,
++      0x3043, 0xa18c, 0x0400, 0x0040, 0x3049, 0x0018, 0x29c1, 0x0078,
++      0x304b, 0x0028, 0x29c1, 0x2008, 0xa084, 0x0030, 0x00c0, 0x3052,
++      0x0078, 0x3770, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3050, 0x2100,
++      0xa084, 0x0007, 0x0079, 0x305c, 0x3090, 0x309a, 0x3085, 0x3064,
++      0x4355, 0x4355, 0x3064, 0x30a5, 0x1078, 0x296b, 0x7000, 0xa086,
++      0x0004, 0x00c0, 0x3080, 0x7064, 0xa086, 0x0002, 0x00c0, 0x3076,
++      0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x2f1c, 0x7064, 0xa086,
++      0x0006, 0x0040, 0x3070, 0x7064, 0xa086, 0x0004, 0x0040, 0x3070,
++      0x79e4, 0x2001, 0x0003, 0x0078, 0x33fa, 0x6818, 0xd0fc, 0x0040,
++      0x308b, 0x681b, 0x001d, 0x1078, 0x40c8, 0x781b, 0x0064, 0x007c,
++      0x6818, 0xd0fc, 0x0040, 0x3096, 0x681b, 0x001d, 0x1078, 0x40c8,
++      0x0078, 0x4331, 0x6818, 0xd0fc, 0x0040, 0x30a0, 0x681b, 0x001d,
++      0x1078, 0x40c8, 0x781b, 0x00f8, 0x007c, 0x6818, 0xd0fc, 0x0040,
++      0x30ab, 0x681b, 0x001d, 0x1078, 0x40c8, 0x781b, 0x00c8, 0x007c,
++      0xa584, 0x000f, 0x00c0, 0x30cf, 0x1078, 0x295e, 0x7000, 0x0079,
++      0x30b9, 0x29c5, 0x30c1, 0x30c3, 0x3d7e, 0x3d7e, 0x3d7e, 0x30c1,
++      0x30c1, 0x1078, 0x296b, 0x1078, 0x3ded, 0x6008, 0xa084, 0xfbef,
++      0x600a, 0x1078, 0x3d6f, 0x0040, 0x3d7e, 0x0078, 0x29c5, 0x78e4,
++      0xa005, 0x00d0, 0x3066, 0x3208, 0x007e, 0x2001, 0x4e04, 0x2004,
++      0xd0ec, 0x007f, 0x0040, 0x30e0, 0xa18c, 0x0300, 0x0078, 0x30e2,
++      0xa18c, 0x0400, 0x0040, 0x30e8, 0x0018, 0x3066, 0x0078, 0x30ea,
++      0x0028, 0x3066, 0x2008, 0xa084, 0x0030, 0x00c0, 0x30f2, 0x781b,
++      0x005b, 0x007c, 0x78ec, 0xa084, 0x0003, 0x0040, 0x30ef, 0x2100,
++      0xa184, 0x0007, 0x0079, 0x30fc, 0x310b, 0x310f, 0x3106, 0x3104,
++      0x4355, 0x4355, 0x3104, 0x434f, 0x1078, 0x296b, 0x1078, 0x40d0,
++      0x781b, 0x0064, 0x007c, 0x1078, 0x40d0, 0x0078, 0x4331, 0x1078,
++      0x40d0, 0x781b, 0x00f8, 0x007c, 0x1078, 0x40d0, 0x781b, 0x00c8,
++      0x007c, 0x2300, 0x0079, 0x311c, 0x3121, 0x311f, 0x3123, 0x1078,
++      0x296b, 0x0078, 0x395f, 0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4,
++      0xa184, 0x0030, 0x0040, 0x395f, 0x78ec, 0xa084, 0x0003, 0x0040,
++      0x395f, 0xa184, 0x0100, 0x0040, 0x3127, 0xa184, 0x0007, 0x0079,
++      0x3139, 0x3141, 0x310f, 0x3085, 0x430d, 0x4355, 0x4355, 0x430d,
++      0x434f, 0x1078, 0x4319, 0x007c, 0xa282, 0x0005, 0x0050, 0x314a,
++      0x1078, 0x296b, 0x2300, 0x0079, 0x314d, 0x3150, 0x3380, 0x338b,
++      0x2200, 0x0079, 0x3153, 0x316d, 0x315a, 0x316d, 0x3158, 0x3363,
++      0x1078, 0x296b, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082,
++      0x0020, 0x0048, 0x40b7, 0xa08a, 0x0004, 0x00c8, 0x40b7, 0x0079,
++      0x3169, 0x40b7, 0x40b7, 0x40b7, 0x4061, 0x789b, 0x0018, 0x79a8,
++      0xa184, 0x0080, 0x0040, 0x317e, 0x0078, 0x40b7, 0x7000, 0xa005,
++      0x00c0, 0x3174, 0x2011, 0x0004, 0x0078, 0x3b4a, 0xa184, 0x00ff,
++      0xa08a, 0x0010, 0x00c8, 0x40b7, 0x0079, 0x3186, 0x3198, 0x3196,
++      0x31ad, 0x31b1, 0x3284, 0x40b7, 0x40b7, 0x3286, 0x40b7, 0x40b7,
++      0x335f, 0x335f, 0x40b7, 0x40b7, 0x40b7, 0x3361, 0x1078, 0x296b,
++      0xd6e4, 0x0040, 0x31a3, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a,
++      0x781b, 0x00c3, 0x007c, 0x6818, 0xd0fc, 0x0040, 0x31ab, 0x681b,
++      0x001d, 0x0078, 0x319b, 0x0078, 0x430d, 0x681b, 0x001d, 0x0078,
++      0x40c1, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x3216, 0x6820,
++      0xd084, 0x00c0, 0x321c, 0x6818, 0xa086, 0x0008, 0x00c0, 0x31c2,
++      0x681b, 0x0000, 0xd6d4, 0x0040, 0x3281, 0xd6bc, 0x0040, 0x3202,
++      0x7087, 0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0050,
++      0x3202, 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a,
++      0x789b, 0x0061, 0x78aa, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208,
++      0xa18c, 0x0300, 0x0040, 0x31f4, 0x007e, 0x2001, 0x4e04, 0x2004,
++      0xd0ec, 0x007f, 0x0040, 0x31f0, 0x20a1, 0x012b, 0x0078, 0x31f6,
++      0x20a1, 0x022b, 0x0078, 0x31f6, 0x20a1, 0x012b, 0x017f, 0x789b,
++      0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f,
++      0x137f, 0x157f, 0x6038, 0xa005, 0x00c0, 0x3211, 0x681c, 0xa084,
++      0x000e, 0x0040, 0x40c1, 0x1078, 0x40d7, 0x782b, 0x3008, 0x0078,
++      0x3213, 0x8001, 0x603a, 0x781b, 0x0067, 0x007c, 0xd6e4, 0x0040,
++      0x321c, 0x781b, 0x0079, 0x007c, 0xa684, 0x0060, 0x0040, 0x327e,
++      0xd6dc, 0x0040, 0x327e, 0xd6fc, 0x00c0, 0x3228, 0x0078, 0x323f,
++      0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8,
++      0x3232, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98,
++      0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4,
++      0x0040, 0x3245, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003,
++      0x00c0, 0x3253, 0x007e, 0x1078, 0x4586, 0x1078, 0x48bd, 0x007f,
++      0x781b, 0x0076, 0x007c, 0xa006, 0x1078, 0x49c3, 0x6ab0, 0x69ac,
++      0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, 0x3262, 0x2200, 0xa422,
++      0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde,
++      0x2300, 0xa405, 0x00c0, 0x3272, 0xc6f5, 0x7e5a, 0x6eb6, 0x781b,
++      0x0076, 0x007c, 0x781b, 0x0076, 0x2200, 0xa115, 0x00c0, 0x327b,
++      0x1078, 0x48bd, 0x007c, 0x1078, 0x48f5, 0x007c, 0x781b, 0x0079,
++      0x007c, 0x781b, 0x0067, 0x007c, 0x1078, 0x296b, 0x0078, 0x32d2,
++      0x6920, 0xd1c4, 0x0040, 0x329b, 0xc1c4, 0x6922, 0x0c7e, 0x7058,
++      0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006,
++      0x0c7f, 0x0078, 0x32c6, 0xd1cc, 0x0040, 0x32c6, 0xc1cc, 0x6922,
++      0x0c7e, 0x7058, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x6004, 0xc0a4,
++      0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x32c6, 0x1078,
++      0x41fa, 0x1078, 0x3ef5, 0x88ff, 0x0040, 0x32c6, 0x789b, 0x0060,
++      0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x32c3,
++      0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7e58, 0xd6d4,
++      0x00c0, 0x32cd, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079, 0x007c,
++      0x0078, 0x40bc, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x00c0,
++      0x32e0, 0x6820, 0xa084, 0x0100, 0x0040, 0x32d0, 0x2009, 0x0008,
++      0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0,
++      0x32fc, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x32f4,
++      0x0048, 0x32f4, 0x0078, 0x32f6, 0x0078, 0x3288, 0x24a8, 0x7aa8,
++      0x00f0, 0x32f6, 0x0078, 0x32e2, 0xa284, 0x00f0, 0xa086, 0x0020,
++      0x00c0, 0x3350, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, 0x330c,
++      0x0048, 0x330c, 0x0078, 0x334d, 0xa286, 0x0023, 0x0040, 0x32d0,
++      0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5,
++      0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x0c7e, 0x7058, 0x2060,
++      0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, 0x0040, 0x332d, 0x1078,
++      0x41fa, 0x1078, 0x4011, 0x0078, 0x333b, 0x0c7e, 0x7058, 0x2060,
++      0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x32c6, 0x1078,
++      0x41fa, 0x1078, 0x3ef5, 0x88ff, 0x0040, 0x32c6, 0x789b, 0x0060,
++      0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x334a, 0x781b,
++      0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7aa8, 0x0078, 0x32e2,
++      0x8318, 0x2300, 0xa102, 0x0040, 0x3359, 0x0048, 0x3359, 0x0078,
++      0x32e2, 0xa284, 0x0080, 0x00c0, 0x40c1, 0x0078, 0x40bc, 0x0078,
++      0x40c1, 0x0078, 0x40b7, 0x7058, 0xa04d, 0x789b, 0x0018, 0x78a8,
++      0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040, 0x3370, 0x1078, 0x296b,
++      0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004,
++      0x00c8, 0x40b7, 0x0079, 0x337c, 0x40b7, 0x3e46, 0x40b7, 0x3fb9,
++      0xa282, 0x0000, 0x00c0, 0x3386, 0x1078, 0x296b, 0x1078, 0x40c8,
++      0x781b, 0x0078, 0x007c, 0xa282, 0x0003, 0x00c0, 0x3391, 0x1078,
++      0x296b, 0xd4fc, 0x00c0, 0x33b1, 0x7064, 0xa005, 0x0040, 0x339a,
++      0x1078, 0x296b, 0x6f14, 0x7776, 0xa7bc, 0x8f00, 0x1078, 0x41fe,
++      0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x00c0,
++      0x339e, 0x1078, 0x40cc, 0x7067, 0x0002, 0x701f, 0x0009, 0x0078,
++      0x33b3, 0x1078, 0x40db, 0x781b, 0x0078, 0x007c, 0xa282, 0x0004,
++      0x0050, 0x33bc, 0x1078, 0x296b, 0x2300, 0x0079, 0x33bf, 0x33c2,
++      0x3582, 0x35c5, 0xa286, 0x0003, 0x0040, 0x33fa, 0x7200, 0x7cd8,
++      0x7ddc, 0x7fd0, 0x71d4, 0xd1bc, 0x00c0, 0x33f2, 0xd1b4, 0x0040,
++      0x33f2, 0x7868, 0xa084, 0x00ff, 0x00c0, 0x33f2, 0xa282, 0x0002,
++      0x00c8, 0x33f2, 0x0d7e, 0x783b, 0x8300, 0x781b, 0x004c, 0x70bc,
++      0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
++      0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x2001, 0x0000,
++      0x0078, 0x33fe, 0x783b, 0x1300, 0x781b, 0x004a, 0x2001, 0x0000,
++      0x0078, 0x33fe, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x704a, 0x68a0,
++      0xd0ec, 0x0040, 0x3406, 0x6008, 0xc08d, 0x600a, 0xa284, 0x000f,
++      0x0079, 0x340a, 0x3562, 0x3417, 0x3414, 0x36c8, 0x3754, 0x29c5,
++      0x3412, 0x3412, 0x1078, 0x296b, 0x6008, 0xc0d4, 0x600a, 0xd6e4,
++      0x0040, 0x341f, 0x7048, 0xa086, 0x0014, 0x00c0, 0x343f, 0x1078,
++      0x4586, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0040, 0x3428, 0x7048,
++      0xa086, 0x0014, 0x0040, 0x3439, 0x6818, 0xa086, 0x0008, 0x00c0,
++      0x351a, 0x7858, 0xd09c, 0x0040, 0x351a, 0x6820, 0xd0ac, 0x0040,
++      0x351a, 0x681b, 0x0014, 0x2009, 0x0002, 0x0078, 0x347e, 0x7868,
++      0xa08c, 0x00ff, 0x0040, 0x347e, 0xa186, 0x0008, 0x00c0, 0x3455,
++      0x6008, 0xc0a4, 0x600a, 0x1078, 0x3d6f, 0x0040, 0x347e, 0x1078,
++      0x3ded, 0x1078, 0x4586, 0x0078, 0x3466, 0xa186, 0x0028, 0x00c0,
++      0x347e, 0x6018, 0xa005, 0x0040, 0x3448, 0x8001, 0x0040, 0x3448,
++      0x8001, 0x0040, 0x3448, 0x601e, 0x0078, 0x3448, 0x6820, 0xd084,
++      0x0040, 0x29c5, 0xc084, 0x6822, 0x1078, 0x2acc, 0x705c, 0x0c7e,
++      0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00,
++      0x00c0, 0x347b, 0x6002, 0x6006, 0x0078, 0x29c5, 0x017e, 0x81ff,
++      0x00c0, 0x34c8, 0x7000, 0xa086, 0x0030, 0x0040, 0x34c8, 0x71d4,
++      0xd1bc, 0x00c0, 0x34c8, 0xd1b4, 0x00c0, 0x34af, 0x7060, 0xa005,
++      0x00c0, 0x34c8, 0x70a4, 0xa086, 0x0001, 0x0040, 0x34c8, 0x7003,
++      0x0000, 0x047e, 0x057e, 0x077e, 0x067e, 0x0c7e, 0x0d7e, 0x1078,
++      0x29ee, 0x0d7f, 0x0c7f, 0x067f, 0x077f, 0x057f, 0x047f, 0x71d4,
++      0xd1b4, 0x00c0, 0x34c8, 0x7003, 0x0040, 0x0078, 0x34c8, 0x1078,
++      0x4360, 0x00c0, 0x34c8, 0x781b, 0x005b, 0x0d7e, 0x70bc, 0xa06d,
++      0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da,
++      0xc1b4, 0x71d6, 0x7003, 0x0030, 0x7808, 0xc08d, 0x780a, 0x0d7f,
++      0x1078, 0x35ff, 0x017f, 0x81ff, 0x0040, 0x351a, 0xa684, 0xdf00,
++      0x681e, 0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x00c0, 0x351b,
++      0x6818, 0xa086, 0x0014, 0x00c0, 0x34e4, 0x2008, 0xd6e4, 0x0040,
++      0x34e4, 0x7868, 0xa08c, 0x00ff, 0x1078, 0x2aba, 0x1078, 0x2adb,
++      0x6820, 0xd0dc, 0x00c0, 0x351b, 0x8717, 0xa294, 0x000f, 0x8213,
++      0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x34fa, 0xa290, 0x52c0,
++      0x0078, 0x34fc, 0xa290, 0x5340, 0xa290, 0x0000, 0x221c, 0xd3c4,
++      0x00c0, 0x3504, 0x0078, 0x350a, 0x8210, 0x2204, 0xa085, 0x0018,
++      0x2012, 0x8211, 0xd3d4, 0x0040, 0x3515, 0x68a0, 0xd0c4, 0x00c0,
++      0x3515, 0x1078, 0x3679, 0x0078, 0x29c5, 0x6008, 0xc08d, 0x600a,
++      0x0078, 0x351b, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3522,
++      0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0040,
++      0x3537, 0x2009, 0x4e02, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412,
++      0x00c0, 0x3537, 0x2021, 0x4e04, 0x2404, 0xc0a5, 0x2022, 0x6018,
++      0xa005, 0x0040, 0x353f, 0x8001, 0x601a, 0x00c0, 0x3542, 0x6008,
++      0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x354e, 0x6800, 0xa005,
++      0x00c0, 0x354b, 0x6002, 0x6006, 0x0078, 0x3552, 0x705c, 0x2060,
++      0x6800, 0x6002, 0x2061, 0x4e00, 0x6887, 0x0103, 0x2d08, 0x206b,
++      0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x3561, 0x2d02, 0x0078,
++      0x3562, 0x616e, 0x7200, 0xa286, 0x0030, 0x0040, 0x3572, 0xa286,
++      0x0040, 0x00c0, 0x29c5, 0x7003, 0x0002, 0x704c, 0x2068, 0x68c4,
++      0x2060, 0x007c, 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc, 0x7042,
++      0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80, 0x0009,
++      0x7046, 0x007c, 0xa282, 0x0004, 0x0048, 0x3588, 0x1078, 0x296b,
++      0x2200, 0x0079, 0x358b, 0x358f, 0x35a0, 0x35ad, 0x35a0, 0xa586,
++      0x1300, 0x0040, 0x35a0, 0xa586, 0x8300, 0x00c0, 0x3586, 0x7003,
++      0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, 0x600a,
++      0x7000, 0xa086, 0x0005, 0x0040, 0x35aa, 0x1078, 0x40c8, 0x781b,
++      0x0078, 0x007c, 0x781b, 0x0079, 0x007c, 0x7890, 0x8007, 0x8001,
++      0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
++      0xa186, 0x0003, 0x0040, 0x35c2, 0xa186, 0x0000, 0x0040, 0x35c2,
++      0x0078, 0x40b7, 0x781b, 0x0079, 0x007c, 0x6820, 0xc095, 0x6822,
++      0x82ff, 0x00c0, 0x35cf, 0x1078, 0x40c8, 0x0078, 0x35d6, 0x8211,
++      0x0040, 0x35d4, 0x1078, 0x296b, 0x1078, 0x40db, 0x781b, 0x0078,
++      0x007c, 0x1078, 0x4383, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x35fc,
++      0x017e, 0x3208, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f,
++      0x0040, 0x35ee, 0xa18c, 0x0300, 0x0078, 0x35f0, 0xa18c, 0x0400,
++      0x017f, 0x0040, 0x35f7, 0x0018, 0x35fc, 0x0078, 0x35f9, 0x0028,
++      0x35fc, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684,
++      0x0060, 0x00c0, 0x3609, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
++      0x3678, 0xd6dc, 0x00c0, 0x3621, 0x68b4, 0xd0dc, 0x00c0, 0x3621,
++      0x6998, 0x6a94, 0x692e, 0x6a32, 0x7048, 0xa005, 0x00c0, 0x361e,
++      0x2200, 0xa105, 0x0040, 0x4586, 0x704b, 0x0015, 0x0078, 0x4586,
++      0x007c, 0xd6ac, 0x0040, 0x3647, 0xd6f4, 0x0040, 0x362d, 0x682f,
++      0x0000, 0x6833, 0x0000, 0x0078, 0x4586, 0x68b4, 0xa084, 0x4000,
++      0xa635, 0xd6f4, 0x00c0, 0x3627, 0x7048, 0xa005, 0x00c0, 0x363a,
++      0x704b, 0x0015, 0xd6dc, 0x00c0, 0x3643, 0x68b4, 0xd0dc, 0x0040,
++      0x3643, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, 0x0078, 0x4586, 0xd6f4,
++      0x0040, 0x3650, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x4586,
++      0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x00c0, 0x364a, 0x7048,
++      0xa005, 0x00c0, 0x365d, 0x704b, 0x0015, 0x2408, 0x2510, 0x2700,
++      0x80fb, 0x00c8, 0x3664, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291,
++      0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x3671, 0x0078,
++      0x4586, 0x7000, 0xa086, 0x0006, 0x0040, 0x3678, 0x0078, 0x4586,
++      0x007c, 0x6946, 0x6008, 0xc0cd, 0xd3cc, 0x0040, 0x3680, 0xc08d,
++      0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f, 0x0000, 0x6893,
++      0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833,
++      0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020, 0x7000,
++      0x0079, 0x369a, 0x29c5, 0x36ac, 0x36a4, 0x36a2, 0x36a2, 0x36a2,
++      0x36a2, 0x36a2, 0x1078, 0x296b, 0x6820, 0xd084, 0x00c0, 0x36ac,
++      0x1078, 0x3dd0, 0x0078, 0x36b2, 0x705c, 0x2c50, 0x2060, 0x6800,
++      0x6002, 0x2a60, 0x3208, 0xa18c, 0x0300, 0x0040, 0x36bb, 0x2021,
++      0x4e58, 0x0078, 0x36bd, 0x2021, 0x4e98, 0x2404, 0xa005, 0x0040,
++      0x36c4, 0x2020, 0x0078, 0x36bd, 0x2d22, 0x206b, 0x0000, 0x007c,
++      0x1078, 0x3dd7, 0x1078, 0x3ded, 0x6008, 0xc0cc, 0x600a, 0x682b,
++      0x0000, 0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, 0x6944, 0x6916,
++      0x3208, 0xa18c, 0x0300, 0x0040, 0x36e1, 0x2009, 0x0000, 0x0078,
++      0x36e3, 0x2009, 0x0001, 0x1078, 0x49f8, 0xd6dc, 0x0040, 0x36eb,
++      0x691c, 0xc1ed, 0x691e, 0x6818, 0xd0fc, 0x0040, 0x36fa, 0x7868,
++      0xa08c, 0x00ff, 0x0040, 0x36f8, 0x681b, 0x001e, 0x0078, 0x36fa,
++      0x681b, 0x0000, 0xb284, 0x0300, 0x00c0, 0x3702, 0x2021, 0x4e98,
++      0x0078, 0x3704, 0x2021, 0x4e58, 0x6800, 0x2022, 0x6a3c, 0x6940,
++      0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0040, 0x3744,
++      0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x0d7e, 0x0f7e,
++      0x157e, 0x147e, 0x2079, 0x4e00, 0x1078, 0x1dff, 0x147f, 0x157f,
++      0x0f7f, 0x70cc, 0x2010, 0x2009, 0x0101, 0x027e, 0x2204, 0xa06d,
++      0x0040, 0x3734, 0x6814, 0xa706, 0x0040, 0x3731, 0x6800, 0x0078,
++      0x3727, 0x6820, 0xc0d5, 0x6822, 0x027f, 0x8210, 0x8109, 0x00c0,
++      0x3725, 0x0d7f, 0x7067, 0x0003, 0x707f, 0x0000, 0x7776, 0x7083,
++      0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x6818, 0xa086, 0x0002, 0x00c0,
++      0x3750, 0x6817, 0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec, 0x681e,
++      0x1078, 0x202c, 0x0078, 0x29c5, 0x7cd8, 0x7ddc, 0x7fd0, 0x1078,
++      0x35ff, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078, 0x4387,
++      0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3769, 0x7048,
++      0x681a, 0xa68c, 0xdf00, 0x691e, 0x7067, 0x0000, 0x0078, 0x29c5,
++      0x7000, 0xa005, 0x00c0, 0x3776, 0x0078, 0x29c5, 0xa006, 0x1078,
++      0x4586, 0x6920, 0xd1ac, 0x00c0, 0x377f, 0x681b, 0x0014, 0xa68c,
++      0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822,
++      0x7000, 0x0079, 0x378b, 0x29c5, 0x3795, 0x3795, 0x3798, 0x3798,
++      0x3798, 0x3793, 0x3793, 0x1078, 0x296b, 0x6818, 0x0078, 0x33fa,
++      0x6008, 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0078, 0x3d95, 0x2300,
++      0x0079, 0x37a2, 0x37a5, 0x37a7, 0x3817, 0x1078, 0x296b, 0xd6fc,
++      0x00c0, 0x37fe, 0x7000, 0xa00d, 0x0079, 0x37ae, 0x29c5, 0x37b8,
++      0x37b8, 0x37e8, 0x37b8, 0x37fb, 0x37b6, 0x37b6, 0x1078, 0x296b,
++      0xa684, 0x0060, 0x0040, 0x37e8, 0xa086, 0x0060, 0x00c0, 0x37e5,
++      0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac, 0x681e,
++      0xa186, 0x0002, 0x0040, 0x37d7, 0x1078, 0x4586, 0x69ac, 0x68b0,
++      0xa115, 0x0040, 0x37d7, 0x1078, 0x48f5, 0x0078, 0x37d9, 0x1078,
++      0x48bd, 0x781b, 0x0079, 0x71d4, 0xd1b4, 0x00c0, 0x29c1, 0x70a4,
++      0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0xd6ec, 0x0040, 0x37c2,
++      0x6818, 0xd0fc, 0x0040, 0x37fb, 0xd6f4, 0x00c0, 0x37f5, 0x681b,
++      0x0015, 0x781b, 0x0079, 0x0078, 0x29c1, 0x681b, 0x0007, 0x682f,
++      0x0000, 0x6833, 0x0000, 0x1078, 0x4319, 0x007c, 0xc6fc, 0x7e5a,
++      0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8, 0x3807, 0x8000, 0xa084,
++      0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
++      0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0079, 0x007c, 0x1078,
++      0x296b, 0x2300, 0x0079, 0x381c, 0x3821, 0x3846, 0x38a6, 0x1078,
++      0x296b, 0x7000, 0x0079, 0x3824, 0x382c, 0x382e, 0x3837, 0x382c,
++      0x382c, 0x382c, 0x382c, 0x382c, 0x1078, 0x296b, 0x69ac, 0x68b0,
++      0xa115, 0x0040, 0x3837, 0x1078, 0x48f5, 0x0078, 0x3839, 0x1078,
++      0x48bd, 0x681c, 0xc0b4, 0x681e, 0x70d4, 0xd0b4, 0x00c0, 0x29c1,
++      0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0xd6fc, 0x00c0,
++      0x3896, 0x7000, 0xa00d, 0x0079, 0x384d, 0x29c5, 0x385d, 0x3857,
++      0x388d, 0x385d, 0x3893, 0x3855, 0x3855, 0x1078, 0x296b, 0x6894,
++      0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0x0040,
++      0x388d, 0xa086, 0x0060, 0x00c0, 0x388a, 0xa6b4, 0xbfbf, 0xc6ed,
++      0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0040, 0x3879, 0x1078, 0x4586,
++      0x69ac, 0x68b0, 0xa115, 0x0040, 0x3879, 0x1078, 0x48f5, 0x0078,
++      0x387b, 0x1078, 0x48bd, 0x781b, 0x0079, 0x681c, 0xc0b4, 0x681e,
++      0x71d4, 0xd1b4, 0x00c0, 0x29c1, 0x70a4, 0xa086, 0x0001, 0x00c0,
++      0x2a0b, 0x007c, 0xd6ec, 0x0040, 0x3867, 0x6818, 0xd0fc, 0x0040,
++      0x3893, 0x681b, 0x0007, 0x781b, 0x00f9, 0x007c, 0xc6fc, 0x7e5a,
++      0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++      0xa303, 0x68ae, 0x79d2, 0x781b, 0x0079, 0x007c, 0xd6dc, 0x0040,
++      0x38af, 0x782b, 0x3009, 0x781b, 0x0079, 0x0078, 0x29c1, 0x7884,
++      0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, 0x00c0, 0x38c2, 0xa484,
++      0x0200, 0x0040, 0x38bc, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0079,
++      0x0078, 0x29c1, 0x6820, 0xc095, 0x6822, 0x1078, 0x4292, 0xc6dd,
++      0x1078, 0x40c8, 0x781b, 0x0078, 0x0078, 0x29c1, 0x2300, 0x0079,
++      0x38d1, 0x38d4, 0x38d6, 0x38d8, 0x1078, 0x296b, 0x0078, 0x40c1,
++      0xd6d4, 0x00c0, 0x3913, 0x79e4, 0xd1ac, 0x0040, 0x38e6, 0x78ec,
++      0xa084, 0x0003, 0x0040, 0x38e6, 0x782b, 0x3009, 0x789b, 0x0060,
++      0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xd1ac, 0x0040,
++      0x38f6, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x390f, 0x2001, 0x4e04,
++      0x2004, 0xd0e4, 0x00c0, 0x390b, 0x6820, 0xd0c4, 0x0040, 0x390b,
++      0x0c7e, 0x7058, 0x2060, 0x6004, 0xc09d, 0x6006, 0x6008, 0xa084,
++      0x00ff, 0x600a, 0x0c7f, 0x2001, 0x0014, 0x0078, 0x33fa, 0xa184,
++      0x0007, 0x0079, 0x3949, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060,
++      0x79a8, 0x81ff, 0x0040, 0x3947, 0x789b, 0x0010, 0x7ba8, 0xa384,
++      0x0001, 0x00c0, 0x393a, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0,
++      0x392d, 0x2009, 0xfff7, 0x0078, 0x3933, 0xa386, 0x0003, 0x00c0,
++      0x393a, 0x2009, 0xffef, 0x0c7e, 0x7058, 0x2060, 0x6004, 0xa104,
++      0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb,
++      0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078,
++      0x430d, 0x3090, 0x309a, 0x3953, 0x3959, 0x3951, 0x3951, 0x430d,
++      0x430d, 0x1078, 0x296b, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078,
++      0x4313, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, 0x430d, 0x79e4,
++      0xa184, 0x0030, 0x0040, 0x3969, 0x78ec, 0xa084, 0x0003, 0x00c0,
++      0x399d, 0x7000, 0xa086, 0x0004, 0x00c0, 0x3983, 0x7064, 0xa086,
++      0x0002, 0x00c0, 0x3979, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078,
++      0x2f1c, 0x7064, 0xa086, 0x0006, 0x0040, 0x3973, 0x7064, 0xa086,
++      0x0004, 0x0040, 0x3973, 0x7000, 0xa086, 0x0000, 0x0040, 0x29c1,
++      0x6920, 0xa184, 0x0420, 0x0040, 0x3992, 0xc1d4, 0x6922, 0x6818,
++      0x0078, 0x33fa, 0x6818, 0xa08e, 0x0002, 0x0040, 0x399b, 0xc0fd,
++      0x681a, 0x2001, 0x0014, 0x0078, 0x33fa, 0xa184, 0x0007, 0x0079,
++      0x39a1, 0x430d, 0x430d, 0x39a9, 0x430d, 0x4355, 0x4355, 0x430d,
++      0x430d, 0xd6bc, 0x0040, 0x39eb, 0x7184, 0x81ff, 0x0040, 0x39eb,
++      0xa182, 0x000d, 0x00d0, 0x39b8, 0x7087, 0x0000, 0x0078, 0x39bd,
++      0xa182, 0x000c, 0x7086, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa,
++      0x157e, 0x137e, 0x147e, 0x7088, 0x8114, 0xa210, 0x728a, 0xa080,
++      0x000b, 0xad00, 0x2098, 0xb284, 0x0300, 0x0040, 0x39df, 0x007e,
++      0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x39db, 0x20a1,
++      0x012b, 0x0078, 0x39e1, 0x20a1, 0x022b, 0x0078, 0x39e1, 0x20a1,
++      0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f, 0x137f,
++      0x157f, 0x0078, 0x4313, 0xd6d4, 0x00c0, 0x3a3f, 0x6820, 0xd084,
++      0x0040, 0x4313, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x39fd,
++      0xa086, 0x0060, 0x00c0, 0x39fd, 0xc1f5, 0xc194, 0x795a, 0x69b6,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd,
++      0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3e06, 0xa18c, 0x00f8,
++      0x00c0, 0x3e06, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208, 0xa18c,
++      0x0300, 0x0040, 0x3a2b, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x3a27, 0x20a1, 0x012b, 0x0078, 0x3a2d, 0x20a1,
++      0x022b, 0x0078, 0x3a2d, 0x20a1, 0x012b, 0x017f, 0x789b, 0x0000,
++      0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f,
++      0x157f, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0078, 0x4313, 0x6818,
++      0xd0fc, 0x0040, 0x3a45, 0x681b, 0x0008, 0x6820, 0xc0ad, 0x6822,
++      0x1078, 0x40d0, 0x781b, 0x00ea, 0x007c, 0x2300, 0x0079, 0x3a50,
++      0x3a55, 0x3b2d, 0x3a53, 0x1078, 0x296b, 0x7cd8, 0x7ddc, 0x7fd0,
++      0x82ff, 0x00c0, 0x3a7e, 0x7200, 0xa286, 0x0003, 0x0040, 0x33c7,
++      0x71d4, 0xd1bc, 0x00c0, 0x3a81, 0xd1b4, 0x0040, 0x3a81, 0x0d7e,
++      0x783b, 0x8800, 0x781b, 0x004c, 0x70bc, 0xa06d, 0x68b4, 0xc0a5,
++      0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4,
++      0x71d6, 0x7003, 0x0030, 0x0d7f, 0x0078, 0x3a85, 0x7200, 0x0078,
++      0x3a85, 0x783b, 0x1800, 0x781b, 0x004a, 0xa284, 0x000f, 0x0079,
++      0x3a89, 0x3b18, 0x3ac7, 0x3a93, 0x33f6, 0x3a91, 0x3b18, 0x3a91,
++      0x3a91, 0x1078, 0x296b, 0x681c, 0xd0ec, 0x0040, 0x3a9a, 0x6008,
++      0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005,
++      0x00c0, 0x3aa3, 0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084,
++      0x000e, 0x00c0, 0x3ab7, 0xb284, 0x0300, 0x0040, 0x3ab3, 0x2009,
++      0x94c0, 0x0078, 0x3abc, 0x2009, 0x95d0, 0x0078, 0x3abc, 0x7030,
++      0x68ba, 0x7140, 0x70cc, 0xa108, 0x2104, 0x6802, 0x2d0a, 0x715e,
++      0xd6dc, 0x00c0, 0x3ac7, 0xc6fc, 0x6eb6, 0x0078, 0x3b18, 0x6eb6,
++      0xa684, 0x0060, 0x00c0, 0x3ad1, 0xa684, 0x7fff, 0x68b6, 0x0078,
++      0x3b18, 0xd6dc, 0x00c0, 0x3adf, 0xa684, 0x7fff, 0x68b6, 0x6894,
++      0x68a6, 0x6898, 0x68aa, 0x1078, 0x4586, 0x0078, 0x3b18, 0xd6ac,
++      0x0040, 0x3aeb, 0xa006, 0x1078, 0x4586, 0x2408, 0x2510, 0x69aa,
++      0x6aa6, 0x0078, 0x3afb, 0x2408, 0x2510, 0x2700, 0x801b, 0x00c8,
++      0x3af2, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x69aa,
++      0x6aa6, 0x1078, 0x4586, 0xd6fc, 0x0040, 0x3b18, 0xa684, 0x7fff,
++      0x68b6, 0x2510, 0x2408, 0xd6ac, 0x00c0, 0x3b10, 0x2700, 0x801b,
++      0x00c8, 0x3b0b, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++      0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae,
++      0x7000, 0xa086, 0x0030, 0x00c0, 0x29c5, 0x7003, 0x0002, 0x70bc,
++      0xa06d, 0x68bc, 0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00,
++      0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0xa586, 0x8800, 0x00c0,
++      0x3b3a, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084,
++      0xfbef, 0x600a, 0x0078, 0x40c1, 0x7047, 0x0000, 0xa282, 0x0006,
++      0x0050, 0x3b44, 0x1078, 0x296b, 0x2300, 0x0079, 0x3b47, 0x3b4a,
++      0x3b5c, 0x3b68, 0x2200, 0x0079, 0x3b4d, 0x3b53, 0x40c1, 0x3b55,
++      0x3b53, 0x3ba2, 0x3bf7, 0x1078, 0x296b, 0x7a80, 0xa294, 0x0f00,
++      0x1078, 0x3c81, 0x0078, 0x40b7, 0x1078, 0x3b79, 0x0079, 0x3b60,
++      0x40c1, 0x3b66, 0x3b66, 0x3ba2, 0x3b66, 0x40c1, 0x1078, 0x296b,
++      0x1078, 0x3b79, 0x0079, 0x3b6c, 0x3b74, 0x3b72, 0x3b72, 0x3b74,
++      0x3b72, 0x3b74, 0x1078, 0x296b, 0x1078, 0x40db, 0x781b, 0x0078,
++      0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3b8a, 0x1078, 0x3ded,
++      0x0078, 0x3b84, 0x1078, 0x4586, 0x6008, 0xa084, 0xfbef, 0x600a,
++      0x0078, 0x3b8f, 0x7000, 0xa086, 0x0003, 0x0040, 0x3b82, 0x7003,
++      0x0005, 0xb284, 0x0300, 0x0040, 0x3b99, 0x2001, 0x95e0, 0x0078,
++      0x3b9b, 0x2001, 0x9612, 0x2068, 0x704e, 0xad80, 0x0009, 0x7046,
++      0x2200, 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3bb4, 0x70d4,
++      0xc0b5, 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078, 0x3bb9,
++      0x1078, 0x4586, 0x0078, 0x3bb9, 0x7000, 0xa086, 0x0003, 0x0040,
++      0x3bb0, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
++      0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x94c0, 0xb284, 0x0300,
++      0x00c0, 0x3bcd, 0xc2fd, 0x2069, 0x95d0, 0x2d04, 0x2d08, 0x715e,
++      0xa06d, 0x0040, 0x3bda, 0x6814, 0xa206, 0x0040, 0x3bdc, 0x6800,
++      0x0078, 0x3bce, 0x1078, 0x3c81, 0x6eb4, 0x7e5a, 0x6920, 0xa184,
++      0x0c00, 0x0040, 0x3cab, 0x7064, 0xa086, 0x0006, 0x00c0, 0x3bee,
++      0x7074, 0xa206, 0x00c0, 0x3bee, 0x7066, 0x707e, 0x681b, 0x0005,
++      0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x40d0, 0x0078, 0x3cab, 0x7200,
++      0xa286, 0x0002, 0x00c0, 0x3c09, 0x70d4, 0xc0b5, 0x70d6, 0x2c00,
++      0x70ba, 0x2d00, 0x70be, 0x0078, 0x3c0d, 0x1078, 0x4586, 0x0078,
++      0x3c0d, 0xa286, 0x0003, 0x0040, 0x3c05, 0x7003, 0x0001, 0x7a80,
++      0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215,
++      0xb284, 0x0300, 0x00c0, 0x3c1d, 0xc2fd, 0x79a8, 0x79a8, 0xa18c,
++      0x00ff, 0x2118, 0x70cc, 0xa168, 0x2d04, 0x2d08, 0x715e, 0xa06d,
++      0x0040, 0x3c31, 0x6814, 0xa206, 0x0040, 0x3c5a, 0x6800, 0x0078,
++      0x3c25, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c3b, 0x2001,
++      0x95e0, 0x0078, 0x3c3d, 0x2001, 0x9612, 0x2068, 0x704e, 0x157e,
++      0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c42, 0x157f,
++      0xb284, 0x0300, 0x0040, 0x3c4f, 0xc2fc, 0x0078, 0x3c50, 0xc2fd,
++      0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800,
++      0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0040, 0x3cab,
++      0xd0dc, 0x0040, 0x3c76, 0x7064, 0xa086, 0x0004, 0x00c0, 0x3c72,
++      0x7074, 0xa206, 0x00c0, 0x3c72, 0x7078, 0xa306, 0x00c0, 0x3c72,
++      0x7066, 0x707e, 0x1078, 0x40d7, 0x0078, 0x3cab, 0x681b, 0x0005,
++      0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x40d0, 0x707f, 0x0000, 0x0078,
++      0x3cab, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c8b, 0x2001,
++      0x95e0, 0x0078, 0x3c8d, 0x2001, 0x9612, 0x2068, 0x704e, 0x157e,
++      0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c92, 0x157f,
++      0xb284, 0x0300, 0x0040, 0x3c9f, 0xc2fc, 0x0078, 0x3ca0, 0xc2fd,
++      0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800,
++      0x6827, 0x0003, 0x007c, 0xc6ec, 0xa6ac, 0x0060, 0x0040, 0x3cfd,
++      0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0, 0x3cd8, 0x7bd2,
++      0x7bda, 0x7cd6, 0x7cde, 0xa586, 0x0060, 0x0040, 0x3d02, 0xd6f4,
++      0x00c0, 0x3cc3, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079,
++      0xd69c, 0x0040, 0x3cd0, 0x2009, 0x0078, 0x2019, 0x0000, 0x2320,
++      0x791a, 0xd6ec, 0x0040, 0x3d0d, 0x1078, 0x48bd, 0x0078, 0x3d0d,
++      0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x3d04,
++      0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x00c0, 0x3ce9,
++      0xc6ed, 0xc6f4, 0x7e5a, 0x2011, 0x0079, 0xd69c, 0x0040, 0x3cf5,
++      0x2011, 0x0078, 0x2019, 0x0000, 0x2320, 0x7a1a, 0xd6ec, 0x0040,
++      0x3d0d, 0x1078, 0x48f5, 0x0078, 0x3d0d, 0x2019, 0x0000, 0x2320,
++      0x0078, 0x3d04, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079, 0xd69c,
++      0x0040, 0x3d0c, 0x2009, 0x0078, 0x791a, 0x68c0, 0x705a, 0x2d00,
++      0x704e, 0x68c4, 0x2060, 0x71d4, 0x2001, 0x4e01, 0x2004, 0xd0c4,
++      0x00c0, 0x3d62, 0x70d8, 0xa02d, 0x0040, 0x3d3b, 0xd1bc, 0x0040,
++      0x3d55, 0x7a80, 0xa294, 0x0f00, 0x70dc, 0xa206, 0x0040, 0x3d2c,
++      0x78e0, 0xa504, 0x00c0, 0x3d62, 0x70da, 0xc1bc, 0x71d6, 0x0078,
++      0x3d62, 0x2031, 0x0001, 0x852c, 0x0048, 0x3d3a, 0x8633, 0x8210,
++      0x0078, 0x3d33, 0x007c, 0x7de0, 0xa594, 0xff00, 0x0040, 0x3d48,
++      0x2011, 0x0008, 0x852f, 0x1078, 0x3d31, 0x8637, 0x0078, 0x3d4a,
++      0x1078, 0x3d31, 0x8217, 0x7880, 0xa084, 0x0f00, 0xa206, 0x0040,
++      0x3d62, 0x72de, 0x76da, 0x0078, 0x3d62, 0x7a80, 0xa294, 0x0f00,
++      0x70dc, 0xa236, 0x0040, 0x3d52, 0x78e0, 0xa534, 0x0040, 0x3d52,
++      0xc1bd, 0x71d6, 0xd1b4, 0x00c0, 0x29c1, 0x2300, 0xa405, 0x0040,
++      0x29c1, 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0x6020,
++      0xa005, 0x0040, 0x3d7d, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008,
++      0x600a, 0x700f, 0x0100, 0x702c, 0x6026, 0x007c, 0xa006, 0x1078,
++      0x4586, 0x7000, 0xa086, 0x0002, 0x0040, 0x3d8b, 0x7064, 0xa086,
++      0x0005, 0x00c0, 0x3d95, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b,
++      0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x000f,
++      0x0079, 0x3d9a, 0x29c5, 0x3daa, 0x3da4, 0x3dcc, 0x3db4, 0x29c5,
++      0x3da2, 0x3da2, 0x1078, 0x296b, 0x1078, 0x3dd7, 0x1078, 0x3dd0,
++      0x0078, 0x3db0, 0x1078, 0x3dd7, 0x705c, 0x2060, 0x6800, 0x6002,
++      0x1078, 0x202c, 0x0078, 0x29c5, 0x7064, 0x7067, 0x0000, 0x7083,
++      0x0000, 0x0079, 0x3dbb, 0x3dc8, 0x3dc8, 0x3dc3, 0x3dc3, 0x3dc3,
++      0x3dc8, 0x3dc3, 0x3dc8, 0x77d4, 0xc7dd, 0x77d6, 0x0079, 0x2f35,
++      0x7067, 0x0000, 0x0078, 0x29c5, 0x681b, 0x0000, 0x0078, 0x36c8,
++      0x6800, 0xa005, 0x00c0, 0x3dd5, 0x6002, 0x6006, 0x007c, 0x6410,
++      0x84ff, 0x0040, 0x3de9, 0x2009, 0x4e02, 0x2104, 0x8001, 0x200a,
++      0x8421, 0x6412, 0x00c0, 0x3de9, 0x2021, 0x4e04, 0x2404, 0xc0a5,
++      0x2022, 0x6008, 0xc0a4, 0x600a, 0x007c, 0x6018, 0xa005, 0x0040,
++      0x3df3, 0x8001, 0x601a, 0x007c, 0x1078, 0x4383, 0x681b, 0x0018,
++      0x0078, 0x3e34, 0x1078, 0x4383, 0x681b, 0x0019, 0x0078, 0x3e34,
++      0x1078, 0x4383, 0x681b, 0x001a, 0x0078, 0x3e34, 0x1078, 0x4383,
++      0x681b, 0x0003, 0x0078, 0x3e34, 0x7774, 0x1078, 0x41fe, 0x7178,
++      0xa18c, 0x00ff, 0x3210, 0xa294, 0x0300, 0x0040, 0x3e1b, 0xa1e8,
++      0x93c0, 0x0078, 0x3e1d, 0xa1e8, 0x94d0, 0x2d04, 0x2d08, 0x2068,
++      0xa005, 0x00c0, 0x3e26, 0x707e, 0x0078, 0x29c5, 0x6814, 0x7274,
++      0xa206, 0x0040, 0x3e2e, 0x6800, 0x0078, 0x3e1e, 0x6800, 0x200a,
++      0x681b, 0x0005, 0x707f, 0x0000, 0x1078, 0x3dd7, 0x6820, 0xd084,
++      0x00c0, 0x3e3c, 0x1078, 0x3dd0, 0x1078, 0x3ded, 0x681f, 0x0000,
++      0x6823, 0x0020, 0x1078, 0x202c, 0x0078, 0x29c5, 0xa282, 0x0003,
++      0x00c0, 0x40b7, 0x7da8, 0xa5ac, 0x00ff, 0x7e5a, 0x7ea8, 0xa6b4,
++      0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x0040, 0x3ea1, 0xc1c4,
++      0x6922, 0xa6b4, 0x00ff, 0x0040, 0x3e8e, 0xa682, 0x000c, 0x0048,
++      0x3e65, 0x0040, 0x3e65, 0x2031, 0x000c, 0x2500, 0xa086, 0x000a,
++      0x0040, 0x3e6c, 0x852b, 0x852b, 0x1078, 0x4190, 0x0040, 0x3e74,
++      0x1078, 0x3f6f, 0x0078, 0x3e97, 0x1078, 0x414b, 0x0c7e, 0x2960,
++      0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3fa5, 0x0c7f, 0x6920,
++      0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3e8b,
++      0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960,
++      0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3fa5, 0x0c7f, 0x7e58,
++      0xd6d4, 0x00c0, 0x3e9e, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079,
++      0x007c, 0x0c7e, 0x7058, 0x2060, 0x6100, 0xd1e4, 0x0040, 0x3eea,
++      0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x3eb4,
++      0x0040, 0x3eb4, 0x2011, 0x000c, 0x2600, 0xa202, 0x00c8, 0x3eb9,
++      0x2230, 0x6208, 0xa294, 0x00ff, 0x2001, 0x4e05, 0x2004, 0xd0e4,
++      0x00c0, 0x3ece, 0x78ec, 0xd0e4, 0x0040, 0x3ece, 0xa282, 0x000a,
++      0x00c8, 0x3ed4, 0x2011, 0x000a, 0x0078, 0x3ed4, 0xa282, 0x000c,
++      0x00c8, 0x3ed4, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x3ed9,
++      0x2228, 0x1078, 0x414f, 0x2500, 0xa086, 0x000a, 0x0040, 0x3ee2,
++      0x852b, 0x852b, 0x1078, 0x4190, 0x0040, 0x3eea, 0x1078, 0x3f6f,
++      0x0078, 0x3eee, 0x1078, 0x414b, 0x1078, 0x3fa5, 0x7858, 0xc095,
++      0x785a, 0x0c7f, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960, 0x6000,
++      0xd0e4, 0x00c0, 0x3f0b, 0xa084, 0x0040, 0x00c0, 0x3f05, 0x6104,
++      0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019,
++      0x0000, 0x0078, 0x3f36, 0x68a0, 0xd0cc, 0x00c0, 0x3f05, 0x6208,
++      0xa294, 0x00ff, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x3f24,
++      0x78ec, 0xd0e4, 0x0040, 0x3f24, 0xa282, 0x000b, 0x00c8, 0x3f24,
++      0x2011, 0x000a, 0x0078, 0x3f2a, 0xa282, 0x000c, 0x00c8, 0x3f2a,
++      0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c,
++      0x0048, 0x3f36, 0x0040, 0x3f36, 0x2019, 0x000c, 0x78ab, 0x0001,
++      0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005,
++      0x6820, 0xc0c5, 0x6822, 0x70d4, 0xd0b4, 0x0040, 0x3f52, 0xc0b4,
++      0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
++      0x8001, 0x601a, 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6104, 0xa18c,
++      0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3f60,
++      0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa,
++      0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x0c7f, 0x007c, 0x0c7e,
++      0x7158, 0x2160, 0x2018, 0xa08c, 0x0020, 0x0040, 0x3f78, 0xc0ac,
++      0x2008, 0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae,
++      0x6612, 0x78a4, 0xa084, 0xfff0, 0xa18c, 0x000f, 0xa105, 0xc0f4,
++      0xa39c, 0x0020, 0x0040, 0x3f8e, 0xa085, 0x4000, 0xc0fc, 0xd0b4,
++      0x00c0, 0x3f93, 0xc0fd, 0x78a6, 0x6016, 0x788a, 0xa6b4, 0x000f,
++      0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605, 0x600e, 0x6004,
++      0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060,
++      0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884,
++      0xa084, 0xfff0, 0x7886, 0x600c, 0xa084, 0x00ff, 0x600e, 0x0c7f,
++      0x007c, 0xa282, 0x0002, 0x00c0, 0x40b7, 0x7aa8, 0x6920, 0xc1bd,
++      0x6922, 0xd1cc, 0x0040, 0x3ff4, 0xc1cc, 0x6922, 0xa294, 0x00ff,
++      0xa282, 0x0002, 0x00c8, 0x40b7, 0x1078, 0x4044, 0x1078, 0x3fa5,
++      0xa980, 0x0001, 0x200c, 0x1078, 0x41fa, 0x1078, 0x3ef5, 0x88ff,
++      0x0040, 0x3fea, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695,
++      0x7e5a, 0xd6d4, 0x00c0, 0x3fe7, 0x781b, 0x0064, 0x007c, 0x781b,
++      0x0078, 0x007c, 0x7e58, 0xd6d4, 0x00c0, 0x3ff1, 0x781b, 0x0067,
++      0x007c, 0x781b, 0x0079, 0x007c, 0xa282, 0x0002, 0x00c8, 0x3ffc,
++      0xa284, 0x0001, 0x0040, 0x4005, 0x7158, 0xa188, 0x0000, 0x210c,
++      0xd1ec, 0x00c0, 0x4005, 0x2011, 0x0000, 0x1078, 0x412c, 0x1078,
++      0x4044, 0x1078, 0x3fa5, 0x7858, 0xc095, 0x785a, 0x781b, 0x0078,
++      0x007c, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec,
++      0x00c0, 0x4025, 0xa084, 0x0080, 0x00c0, 0x4023, 0xc1a4, 0x6106,
++      0xa006, 0x0078, 0x4041, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
++      0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x70d4, 0xd0b4,
++      0x0040, 0x403d, 0xc0b4, 0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084,
++      0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x6820, 0xa085, 0x0200,
++      0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x82ff,
++      0x0040, 0x404c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a,
++      0x78a4, 0xa084, 0xffbf, 0xa205, 0xc0fc, 0xd0b4, 0x00c0, 0x4059,
++      0xc0fd, 0x78a6, 0x6016, 0x788a, 0x6004, 0xc0a4, 0x6006, 0x0c7f,
++      0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x406a, 0x007f,
++      0x0078, 0x406d, 0x007f, 0x0078, 0x40b4, 0xd6ac, 0x0040, 0x40b4,
++      0x7888, 0xa084, 0x0040, 0x0040, 0x40b4, 0x7bb8, 0xa384, 0x003f,
++      0x831b, 0x00c8, 0x407c, 0x8000, 0xa005, 0x0040, 0x4091, 0x831b,
++      0x00c8, 0x4085, 0x8001, 0x0040, 0x40b1, 0xd6f4, 0x0040, 0x4091,
++      0x78b8, 0x801b, 0x00c8, 0x408d, 0x8000, 0xa084, 0x003f, 0x00c0,
++      0x40b1, 0xc6f4, 0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108,
++      0x00c8, 0x409c, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade,
++      0x1078, 0x49c3, 0x781b, 0x0076, 0xb284, 0x0300, 0x0040, 0x40ac,
++      0x2001, 0x0000, 0x0078, 0x40ae, 0x2001, 0x0001, 0x1078, 0x484b,
++      0x007c, 0x781b, 0x0076, 0x007c, 0x781b, 0x0079, 0x007c, 0x1078,
++      0x40df, 0x781b, 0x0078, 0x007c, 0x1078, 0x40c8, 0x781b, 0x0078,
++      0x007c, 0x6827, 0x0002, 0x1078, 0x40d0, 0x781b, 0x0078, 0x007c,
++      0x2001, 0x0005, 0x0078, 0x40e1, 0x2001, 0x000c, 0x0078, 0x40e1,
++      0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0078, 0x40e1, 0x2001,
++      0x000d, 0x0078, 0x40e1, 0x2001, 0x0009, 0x0078, 0x40e1, 0x2001,
++      0x0007, 0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d4, 0xd0b4,
++      0x0040, 0x40f7, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008,
++      0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c,
++      0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0x017e,
++      0xb28c, 0x0300, 0x0040, 0x4108, 0xa0e0, 0x52c0, 0x0078, 0x410a,
++      0xa0e0, 0x5340, 0x017f, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184,
++      0x000f, 0x0040, 0x411a, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004,
++      0xc09d, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040,
++      0x0040, 0x412a, 0xa184, 0xffbf, 0xc0fd, 0x78a6, 0x6016, 0x6004,
++      0xc0a5, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001,
++      0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab,
++      0x0004, 0x70d4, 0xd0b4, 0x0040, 0x414a, 0xc0b4, 0x70d6, 0x0c7e,
++      0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
++      0x601a, 0x0c7f, 0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b,
++      0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
++      0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x70d4, 0xd0b4, 0x0040,
++      0x416e, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084,
++      0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c, 0x157e,
++      0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a,
++      0x79a4, 0xa18c, 0xfff0, 0x2021, 0x41e3, 0x2019, 0x0011, 0x20a9,
++      0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040,
++      0x418e, 0x8420, 0x2300, 0xa210, 0x00f0, 0x4183, 0x157f, 0x007c,
++      0x157e, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x41c1, 0x2021,
++      0x41f1, 0x20a9, 0x0009, 0x2011, 0x0028, 0xa582, 0x0019, 0x0040,
++      0x41d7, 0x0048, 0x41d7, 0x8420, 0x95a9, 0x2011, 0x0032, 0xa582,
++      0x0032, 0x0040, 0x41d7, 0x0048, 0x41d7, 0x8420, 0x95a9, 0x2019,
++      0x000a, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x41d7, 0x0048,
++      0x41d7, 0x8420, 0x2300, 0xa210, 0x00f0, 0x41b3, 0x157f, 0x0078,
++      0x41d5, 0x2021, 0x41e3, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011,
++      0x0032, 0x2200, 0xa502, 0x0040, 0x41d7, 0x0048, 0x41d7, 0x8420,
++      0x2300, 0xa210, 0x00f0, 0x41c9, 0x157f, 0xa006, 0x007c, 0x157f,
++      0xa582, 0x0064, 0x00c8, 0x41e0, 0x7808, 0xa085, 0x0070, 0x780a,
++      0x2404, 0xa005, 0x007c, 0x1209, 0x3002, 0x3202, 0x4203, 0x4403,
++      0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07,
++      0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07,
++      0x7e07, 0x0e00, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00,
++      0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
++      0xd7fc, 0x0040, 0x420f, 0xa0e0, 0x73c0, 0x0078, 0x4211, 0xa0e0,
++      0x53c0, 0x007c, 0x0e7e, 0x0f7e, 0xd084, 0x0040, 0x421f, 0x2079,
++      0x0100, 0x2009, 0x4e80, 0x2071, 0x4e80, 0x0078, 0x422f, 0x2009,
++      0x4e40, 0x2071, 0x4e40, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x0040,
++      0x422d, 0x2079, 0x0100, 0x0078, 0x422f, 0x2079, 0x0200, 0x2091,
++      0x8000, 0x2104, 0xa084, 0x000f, 0x0079, 0x4236, 0x4240, 0x4240,
++      0x4240, 0x4240, 0x4240, 0x4240, 0x423e, 0x423e, 0x1078, 0x296b,
++      0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0040, 0x428f,
++      0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086,
++      0x1814, 0x00c0, 0x428f, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
++      0x00c0, 0x4255, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0,
++      0x425c, 0x7830, 0xd0bc, 0x00c0, 0x428f, 0x007e, 0x2001, 0x4e04,
++      0x2004, 0xd0ec, 0x007f, 0x0040, 0x4271, 0xb284, 0x0300, 0x0078,
++      0x4273, 0xb284, 0x0400, 0x0040, 0x4279, 0x0018, 0x428f, 0x0078,
++      0x427b, 0x0028, 0x428f, 0x79e4, 0xa184, 0x0030, 0x0040, 0x428f,
++      0x78ec, 0xa084, 0x0003, 0x0040, 0x428f, 0x681c, 0xd0ac, 0x00c0,
++      0x428d, 0x1078, 0x4319, 0x0078, 0x428f, 0x781b, 0x00f9, 0x0f7f,
++      0x0e7f, 0x007c, 0x0c7e, 0x2001, 0x4e01, 0x2004, 0xd0ac, 0x00c0,
++      0x430b, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xb28c, 0x0300, 0x0040, 0x42a8, 0xa0e0, 0x52c0, 0x0078, 0x42aa,
++      0xa0e0, 0x5340, 0x6004, 0xa084, 0x000a, 0x00c0, 0x430b, 0x6108,
++      0xa194, 0xff00, 0x0040, 0x430b, 0xa18c, 0x00ff, 0x2001, 0x000a,
++      0xa106, 0x0040, 0x42d6, 0x2001, 0x000c, 0xa106, 0x0040, 0x42da,
++      0x2001, 0x0012, 0xa106, 0x0040, 0x42de, 0x2001, 0x0014, 0xa106,
++      0x0040, 0x42e2, 0x2001, 0x0019, 0xa106, 0x0040, 0x42e6, 0x2001,
++      0x0032, 0xa106, 0x0040, 0x42ea, 0x0078, 0x42ee, 0x2009, 0x000c,
++      0x0078, 0x42f0, 0x2009, 0x0012, 0x0078, 0x42f0, 0x2009, 0x0014,
++      0x0078, 0x42f0, 0x2009, 0x0019, 0x0078, 0x42f0, 0x2009, 0x0020,
++      0x0078, 0x42f0, 0x2009, 0x003f, 0x0078, 0x42f0, 0x2011, 0x0000,
++      0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x2061,
++      0x4e00, 0x6004, 0xd0bc, 0x0040, 0x430b, 0x6814, 0xd0fc, 0x00c0,
++      0x4306, 0x60ea, 0x2061, 0x4e40, 0x0078, 0x4309, 0x60ee, 0x2061,
++      0x4e80, 0x601f, 0x800f, 0x0c7f, 0x007c, 0x781b, 0x0079, 0x007c,
++      0x781b, 0x0078, 0x007c, 0x781b, 0x0067, 0x007c, 0x781b, 0x0064,
++      0x007c, 0x2009, 0x4e19, 0x210c, 0xa186, 0x0000, 0x0040, 0x432b,
++      0xa186, 0x0001, 0x0040, 0x432e, 0x701f, 0x000b, 0x7067, 0x0001,
++      0x781b, 0x0047, 0x007c, 0x781b, 0x00f0, 0x007c, 0x701f, 0x000a,
++      0x007c, 0x2009, 0x4e19, 0x210c, 0xa186, 0x0000, 0x0040, 0x4346,
++      0xa186, 0x0001, 0x0040, 0x4343, 0x701f, 0x000b, 0x7067, 0x0001,
++      0x781b, 0x0047, 0x007c, 0x701f, 0x000a, 0x007c, 0x781b, 0x00ef,
++      0x007c, 0x781b, 0x00f9, 0x007c, 0x781b, 0x00f8, 0x007c, 0x781b,
++      0x00c9, 0x007c, 0x781b, 0x00c8, 0x007c, 0x6818, 0xd0fc, 0x0040,
++      0x435b, 0x681b, 0x001d, 0x7067, 0x0001, 0x781b, 0x0047, 0x007c,
++      0x7830, 0xa084, 0x00c0, 0x00c0, 0x4382, 0x7808, 0xc08c, 0x780a,
++      0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x00c0,
++      0x437f, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x437d, 0x7804,
++      0xa084, 0xff1f, 0xa085, 0x00e0, 0x7806, 0xa006, 0x007c, 0x7808,
++      0xc08d, 0x780a, 0x007c, 0x7808, 0xc08d, 0x780a, 0x007c, 0x7830,
++      0xa084, 0x0040, 0x00c0, 0x4387, 0x2001, 0x4e04, 0x2004, 0xd0ec,
++      0x0040, 0x4396, 0xb284, 0x0300, 0x0078, 0x4398, 0xb284, 0x0400,
++      0x0040, 0x439e, 0x0098, 0x43a2, 0x0078, 0x43a0, 0x00a8, 0x43a2,
++      0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005,
++      0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x43c5, 0x007e,
++      0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x43bb, 0xb284,
++      0x0300, 0x0078, 0x43bd, 0xb284, 0x0400, 0x0040, 0x43c3, 0x0098,
++      0x43bf, 0x0078, 0x43c5, 0x00a8, 0x43c3, 0x78ac, 0x007e, 0x7808,
++      0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0001, 0x00c0,
++      0x3770, 0xa784, 0x0070, 0x0040, 0x43dd, 0x0c7e, 0x2d60, 0x2f68,
++      0x1078, 0x28df, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040,
++      0x43ea, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3770,
++      0x0078, 0x430d, 0xa784, 0x0004, 0x0040, 0x4419, 0x78b8, 0xa084,
++      0x4001, 0x0040, 0x4419, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
++      0x0040, 0x3770, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0,
++      0x4419, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00f9,
++      0x007c, 0x784b, 0x0008, 0x6818, 0xd0fc, 0x0040, 0x4416, 0x681b,
++      0x0015, 0xd6f4, 0x0040, 0x4416, 0x681b, 0x0007, 0x1078, 0x4319,
++      0x007c, 0x681b, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f,
++      0x0000, 0x6833, 0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003,
++      0x0040, 0x3066, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f,
++      0x0040, 0x4436, 0xb284, 0x0300, 0x0078, 0x4438, 0xb284, 0x0400,
++      0x0040, 0x443e, 0x0018, 0x29c1, 0x0078, 0x4440, 0x0028, 0x29c1,
++      0x0078, 0x40bc, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003,
++      0x8003, 0xd3fc, 0x0040, 0x4450, 0xa080, 0x5340, 0x0078, 0x4452,
++      0xa080, 0x52c0, 0x2060, 0x2048, 0x705a, 0x2a60, 0x007c, 0x0020,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9848, 0x0014, 0x0014,
++      0x9914, 0x98fd, 0x0014, 0x0014, 0x0080, 0x00ff, 0x0100, 0x0402,
++      0x2008, 0xf880, 0x0018, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014,
++      0x2500, 0x0013, 0x2500, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
++      0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
++      0x0010, 0xa200, 0x3806, 0x7102, 0x805f, 0x9481, 0x8839, 0x20c4,
++      0x0864, 0xa856, 0x3008, 0x28c1, 0x9d1b, 0xa201, 0x300c, 0x2847,
++      0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2,
++      0x9ccb, 0xa8f3, 0x0864, 0xa844, 0x300c, 0xa801, 0x3008, 0x28e1,
++      0x9ccb, 0x2021, 0xa81d, 0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0,
++      0x6fc0, 0x63a4, 0x6c80, 0x0212, 0xa205, 0x883d, 0x7942, 0x8020,
++      0xa4a1, 0x882b, 0x1814, 0x883b, 0x80df, 0x94a1, 0x7027, 0x85f2,
++      0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa816, 0x883e, 0xa814,
++      0x2001, 0xa812, 0xa204, 0x64c0, 0x6de0, 0x67a0, 0x6fc0, 0x7942,
++      0x8020, 0xa4a1, 0x1814, 0x80df, 0x94a1, 0x883b, 0x7023, 0x8576,
++      0x8677, 0xa802, 0x7861, 0x883e, 0x206b, 0x28c1, 0x9d1b, 0x2044,
++      0x2103, 0x20a2, 0x2081, 0xa8c3, 0xa207, 0x0904, 0xa20e, 0xa809,
++      0xa203, 0x8000, 0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601,
++      0xa208, 0x856e, 0x866f, 0x7161, 0x0014, 0x0704, 0x3008, 0x9ccb,
++      0x0014, 0xa202, 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf844,
++      0x856e, 0x883f, 0x08e6, 0xa8f5, 0xf861, 0xa8ea, 0xf801, 0x0014,
++      0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014,
++      0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014,
++      0x3008, 0x8000, 0x284a, 0x1011, 0xa8fc, 0x3008, 0x9d33, 0x8000,
++      0xa000, 0x2802, 0x1011, 0xa8fd, 0x9d39, 0xa8bd, 0x3008, 0x9d33,
++      0x283b, 0x1011, 0xa8fd, 0xa209, 0x7102, 0x805f, 0x9481, 0x0017,
++      0x300c, 0xa209, 0x8000, 0x85a4, 0x1de2, 0xa209, 0xdac1, 0x0014,
++      0x0210, 0xa801, 0x0014, 0x26e0, 0x873a, 0xfaa3, 0x19f2, 0x26e0,
++      0x18f2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9d25,
++      0x0704, 0xa206, 0x6865, 0x817e, 0x842a, 0x1dc1, 0x8823, 0x0016,
++      0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf021,
++      0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d4, 0x8822,
++      0x0016, 0x7944, 0x8421, 0xa020, 0xa532, 0x84a1, 0x0016, 0x7944,
++      0x8421, 0xa0df, 0x9532, 0x84a1, 0x0016, 0x0000, 0x127e, 0x70d4,
++      0xa084, 0x4600, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205,
++      0x00c0, 0x45a2, 0x720c, 0x82ff, 0x0040, 0x459d, 0x8aff, 0x00c0,
++      0x45a2, 0x7200, 0xd284, 0x00c0, 0x45a2, 0x7003, 0x0008, 0x127f,
++      0x2000, 0x007c, 0x7000, 0xa084, 0x0003, 0x7002, 0xc69c, 0xd084,
++      0x0040, 0x45e5, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x45aa,
++      0xa184, 0x0003, 0x0040, 0x4616, 0xa184, 0x01e0, 0x00c0, 0x4616,
++      0xd1f4, 0x00c0, 0x45aa, 0xa184, 0x3000, 0xa086, 0x1000, 0x0040,
++      0x45aa, 0x2011, 0x0180, 0x710c, 0x8211, 0x0040, 0x45cf, 0x7008,
++      0xd0f4, 0x00c0, 0x45aa, 0x700c, 0xa106, 0x0040, 0x45c4, 0x7007,
++      0x0012, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x45d1, 0xa184,
++      0x0003, 0x0040, 0x4616, 0xd194, 0x0040, 0x45d1, 0xd1f4, 0x0040,
++      0x4616, 0x7007, 0x0002, 0x0078, 0x45aa, 0x7108, 0xd1fc, 0x0040,
++      0x45f0, 0x1078, 0x4769, 0x8aff, 0x0040, 0x458c, 0x0078, 0x45e5,
++      0x700c, 0xa08c, 0x03ff, 0x0040, 0x461b, 0x7004, 0xd084, 0x0040,
++      0x460d, 0x7014, 0xa005, 0x00c0, 0x4609, 0x7010, 0x7310, 0xa306,
++      0x00c0, 0x45fd, 0x2300, 0xa005, 0x0040, 0x460d, 0xa102, 0x00c8,
++      0x45e5, 0x7007, 0x0010, 0x0078, 0x4616, 0x8aff, 0x0040, 0x461b,
++      0x1078, 0x4970, 0x00c0, 0x4610, 0x0040, 0x45e5, 0x1078, 0x46b4,
++      0x127f, 0x2000, 0x007c, 0x7204, 0x7108, 0xc19c, 0x8103, 0x00c8,
++      0x462a, 0x7007, 0x0002, 0x0078, 0x461b, 0x7003, 0x0008, 0x127f,
++      0x2000, 0x007c, 0xa205, 0x00c0, 0x4616, 0x7003, 0x0008, 0x127f,
++      0x2000, 0x007c, 0x6428, 0x84ff, 0x0040, 0x465e, 0x2c70, 0x7004,
++      0xa0bc, 0x000f, 0xa7b8, 0x466e, 0x273c, 0x87fb, 0x00c0, 0x464c,
++      0x0048, 0x4644, 0x1078, 0x296b, 0x609c, 0xa075, 0x0040, 0x465e,
++      0x0078, 0x4637, 0x2039, 0x4663, 0x2704, 0xae68, 0x6808, 0xa630,
++      0x680c, 0xa529, 0x8421, 0x0040, 0x465e, 0x8738, 0x2704, 0xa005,
++      0x00c0, 0x464d, 0x709c, 0xa075, 0x00c0, 0x4637, 0x007c, 0x0000,
++      0x0005, 0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000,
++      0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4663,
++      0x4660, 0x0000, 0x0000, 0x8000, 0x0000, 0x4663, 0x0000, 0x466b,
++      0x4668, 0x0000, 0x0000, 0x0000, 0x0000, 0x466b, 0x0000, 0x4666,
++      0x4666, 0x0000, 0x0000, 0x8000, 0x0000, 0x4666, 0x0000, 0x466c,
++      0x466c, 0x0000, 0x0000, 0x0000, 0x0000, 0x466c, 0x2079, 0x4e00,
++      0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001,
++      0x7810, 0xd0ec, 0x0040, 0x46a2, 0x2009, 0x0001, 0x2071, 0x0020,
++      0x0078, 0x46a6, 0x2009, 0x0002, 0x2071, 0x0050, 0x7007, 0x000a,
++      0x7007, 0x0002, 0x7003, 0x0000, 0x8109, 0x0040, 0x46b3, 0x2071,
++      0x0020, 0x0078, 0x46a6, 0x007c, 0x7004, 0x8004, 0x00c8, 0x473d,
++      0x7108, 0x7008, 0xa106, 0x00c0, 0x46b8, 0xa184, 0x01e0, 0x0040,
++      0x46c5, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, 0x0012, 0x2019,
++      0x0000, 0x7108, 0x7008, 0xa106, 0x00c0, 0x46c9, 0xa184, 0x01e0,
++      0x0040, 0x46d6, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7810, 0xd0ec,
++      0x0040, 0x46f0, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0003, 0x00c0,
++      0x46f4, 0xa184, 0x4000, 0x0040, 0x46f8, 0xa382, 0x0003, 0x00c8,
++      0x46f8, 0xa184, 0x0004, 0x0040, 0x46c9, 0x8318, 0x0078, 0x46c9,
++      0x7814, 0xd0ec, 0x00c0, 0x46f8, 0xa184, 0x4000, 0x00c0, 0x46c9,
++      0xa19c, 0x300c, 0xa386, 0x2004, 0x0040, 0x4715, 0xa386, 0x0008,
++      0x0040, 0x4720, 0x7004, 0xd084, 0x00c0, 0x4711, 0x7108, 0x7008,
++      0xa106, 0x00c0, 0x4706, 0xa184, 0x0003, 0x0040, 0x4711, 0x0078,
++      0x47ac, 0xa386, 0x200c, 0x00c0, 0x46c9, 0x7200, 0x8204, 0x0048,
++      0x4720, 0x730c, 0xa384, 0x03ff, 0x0040, 0x4720, 0x1078, 0x296b,
++      0x7108, 0x7008, 0xa106, 0x00c0, 0x4720, 0xa184, 0x01e0, 0x0040,
++      0x472d, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, 0x0012, 0x7000,
++      0xd084, 0x00c0, 0x473d, 0x7310, 0x7014, 0xa305, 0x0040, 0x473d,
++      0x710c, 0xa184, 0x03ff, 0x00c0, 0x46b4, 0x7108, 0x7008, 0xa106,
++      0x00c0, 0x473d, 0xa184, 0x01e0, 0x0040, 0x474a, 0x1078, 0x47ac,
++      0x0078, 0x4765, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c,
++      0x00c0, 0x474e, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4752, 0xa184,
++      0x01e0, 0x0040, 0x475f, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007,
++      0x0012, 0x7108, 0x8103, 0x0048, 0x4752, 0x7003, 0x0008, 0x007c,
++      0x7108, 0xa184, 0x01e0, 0x00c0, 0x47ac, 0x7108, 0xa184, 0x01e0,
++      0x00c0, 0x47ac, 0xa184, 0x0007, 0x0079, 0x4776, 0x4780, 0x4790,
++      0x477e, 0x4790, 0x477e, 0x47ee, 0x477e, 0x47ec, 0x1078, 0x296b,
++      0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, 0x00c0, 0x478b,
++      0x2049, 0x0000, 0x007c, 0x1078, 0x4970, 0x00c0, 0x478b, 0x007c,
++      0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x00c0,
++      0x47a4, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4799, 0xa184, 0x0003,
++      0x0040, 0x47a4, 0x0078, 0x47ac, 0x8aff, 0x0040, 0x47ab, 0x1078,
++      0x4970, 0x00c0, 0x47a7, 0x007c, 0x7007, 0x0012, 0x7108, 0x00e0,
++      0x47af, 0x2091, 0x6000, 0x00e0, 0x47b3, 0x2091, 0x6000, 0x7007,
++      0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x47bb, 0x7007,
++      0x0012, 0x7108, 0xd1fc, 0x00c0, 0x47bf, 0x7003, 0x0000, 0x7000,
++      0xa005, 0x00c0, 0x47d3, 0x7004, 0xa005, 0x00c0, 0x47d3, 0x700c,
++      0xa005, 0x0040, 0x47d5, 0x0078, 0x47b7, 0x2049, 0x0000, 0xb284,
++      0x0100, 0x0040, 0x47df, 0x2001, 0x0000, 0x0078, 0x47e1, 0x2001,
++      0x0001, 0x1078, 0x4212, 0x681b, 0x0002, 0x2051, 0x0000, 0x007c,
++      0x1078, 0x296b, 0x1078, 0x296b, 0x1078, 0x4836, 0x7210, 0x7114,
++      0x700c, 0xa09c, 0x03ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000,
++      0x1078, 0x4836, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322,
++      0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x4811, 0x00c8,
++      0x4811, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078,
++      0x47f8, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040,
++      0x481d, 0xa7ba, 0x4668, 0x0078, 0x481f, 0xa7ba, 0x4660, 0x007f,
++      0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7108, 0x7008,
++      0xa106, 0x00c0, 0x4826, 0xa184, 0x01e0, 0x0040, 0x4831, 0x1078,
++      0x47ac, 0x7007, 0x0012, 0x1078, 0x46b4, 0x007c, 0x8a50, 0x8739,
++      0x2704, 0xa004, 0x00c0, 0x484a, 0x6000, 0xa064, 0x00c0, 0x4841,
++      0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x467e, 0x203c, 0x87fb,
++      0x1040, 0x296b, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, 0x4600,
++      0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90,
++      0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084,
++      0x0008, 0x007f, 0x0040, 0x4868, 0xa0b8, 0x4668, 0x0078, 0x486a,
++      0xa0b8, 0x4660, 0xb284, 0x0100, 0x0040, 0x4871, 0x7e20, 0x0078,
++      0x4872, 0x7e24, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040, 0x4879,
++      0xc685, 0x2400, 0xa305, 0x0040, 0x48a3, 0x2c58, 0x2704, 0x6104,
++      0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184,
++      0x0008, 0x0040, 0x4893, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014,
++      0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c,
++      0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078,
++      0x499b, 0x0078, 0x48a5, 0x1078, 0x4970, 0x00c0, 0x48a3, 0x127f,
++      0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004,
++      0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0, 0x48b4,
++      0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4,
++      0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f, 0x0d7f, 0x7e20,
++      0xb284, 0x0100, 0x00c0, 0x48cd, 0x7e24, 0xa6b5, 0x000c, 0x681c,
++      0xd0ac, 0x00c0, 0x48d8, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004,
++      0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x466e,
++      0x273c, 0x87fb, 0x00c0, 0x48ee, 0x0048, 0x48e8, 0x1078, 0x296b,
++      0x689c, 0xa065, 0x0040, 0x48f2, 0x0078, 0x48db, 0x1078, 0x4970,
++      0x00c0, 0x48ee, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e,
++      0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f,
++      0x7e20, 0xb284, 0x0100, 0x00c0, 0x4906, 0x7e24, 0x0d7f, 0x037f,
++      0x047f, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040, 0x4914, 0xc685,
++      0x7003, 0x0000, 0x7007, 0x0004, 0x2049, 0x48f5, 0x6828, 0xa055,
++      0x0d7e, 0x0040, 0x496c, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f,
++      0xa7b8, 0x466e, 0x273c, 0x87fb, 0x00c0, 0x4931, 0x0048, 0x492a,
++      0x1078, 0x296b, 0x709c, 0xa075, 0x2060, 0x0040, 0x496c, 0x0078,
++      0x491d, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048,
++      0x494a, 0x8a51, 0x00c0, 0x493e, 0x1078, 0x296b, 0x8738, 0x2704,
++      0xa005, 0x00c0, 0x4932, 0x709c, 0xa075, 0x2060, 0x0040, 0x496c,
++      0x0078, 0x491d, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908,
++      0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4959, 0x1078,
++      0x296b, 0xb284, 0x0100, 0x0040, 0x4967, 0x2001, 0x4e04, 0x2004,
++      0xd0ec, 0x00c0, 0x4967, 0x2071, 0x0050, 0x0078, 0x4969, 0x2071,
++      0x0020, 0x0d7f, 0x0078, 0x4879, 0x0d7f, 0x127f, 0x2000, 0x007c,
++      0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x4979, 0xa006,
++      0x007c, 0xa084, 0x0003, 0xa086, 0x0003, 0x00c0, 0x4980, 0x007c,
++      0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e, 0x7808, 0x7012,
++      0x780c, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x4993, 0x7810,
++      0x7022, 0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085,
++      0x7006, 0x2079, 0x4e00, 0x8a51, 0x0040, 0x49bf, 0x8738, 0x2704,
++      0xa005, 0x00c0, 0x49b1, 0x609c, 0xa005, 0x0040, 0x49c0, 0x2060,
++      0x6004, 0xa084, 0x000f, 0xa080, 0x466e, 0x203c, 0x87fb, 0x1040,
++      0x296b, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x49bb,
++      0xa006, 0x0078, 0x49c0, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c,
++      0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x70d4, 0xa084,
++      0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x0003,
++      0x00c0, 0x49d8, 0x6828, 0xa005, 0x0040, 0x49e8, 0x0078, 0x45a2,
++      0x7108, 0xd1fc, 0x0040, 0x49e0, 0x1078, 0x4769, 0x0078, 0x49cd,
++      0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x49e2, 0x1078, 0x4769,
++      0x7008, 0xa086, 0x0008, 0x00c0, 0x49cd, 0x7000, 0xa005, 0x00c0,
++      0x49cd, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
++      0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x70d4, 0xa084,
++      0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x49f8, 0xad80, 0x0011,
++      0x20a0, 0xb284, 0x0100, 0x0040, 0x4a1b, 0x2001, 0x4e04, 0x2004,
++      0xd0ec, 0x0040, 0x4a17, 0x2099, 0x0031, 0x0078, 0x4a1d, 0x2099,
++      0x0032, 0x0078, 0x4a1d, 0x2099, 0x0031, 0x700c, 0xa084, 0x03ff,
++      0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040,
++      0x4a2c, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x03ff, 0x0040,
++      0x4a38, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4a33,
++      0x0c7f, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f,
++      0x127f, 0x2000, 0x007c, 0x2091, 0x8000, 0x2091, 0x6000, 0x78ac,
++      0xa005, 0x00c0, 0x4a5a, 0x7974, 0x70d0, 0xa106, 0x00c0, 0x4a5a,
++      0x781c, 0xa005, 0x0040, 0x4a5a, 0x781f, 0x0000, 0x0068, 0x4a5a,
++      0x2091, 0x4080, 0x7830, 0x8001, 0x7832, 0x00c0, 0x4ae2, 0x7834,
++      0x7832, 0x7810, 0xd0ec, 0x00c0, 0x4adb, 0x2061, 0x73c0, 0x2069,
++      0x4e80, 0xc7fd, 0x68d0, 0xa005, 0x0040, 0x4a74, 0x8001, 0x68d2,
++      0x00c0, 0x4a74, 0x1078, 0x4cb0, 0x6800, 0xa084, 0x000f, 0x0040,
++      0x4a89, 0xa086, 0x0001, 0x0040, 0x4a89, 0x6844, 0xa00d, 0x0040,
++      0x4a89, 0x2104, 0xa005, 0x0040, 0x4a89, 0x8001, 0x200a, 0x0040,
++      0x4c23, 0x6814, 0xa005, 0x0040, 0x4aae, 0x8001, 0x6816, 0x00c0,
++      0x4aae, 0x68a7, 0x0001, 0x0f7e, 0xd7fc, 0x00c0, 0x4aa3, 0x7810,
++      0xd0ec, 0x0040, 0x4a9f, 0x2079, 0x0100, 0x0078, 0x4aa5, 0x2079,
++      0x0200, 0x0078, 0x4aa5, 0x2079, 0x0100, 0x1078, 0x4383, 0x0f7f,
++      0x6864, 0xa005, 0x0040, 0x4aae, 0x1078, 0x2628, 0x6880, 0xa005,
++      0x0040, 0x4abb, 0x8001, 0x6882, 0x00c0, 0x4abb, 0x6867, 0x0000,
++      0x68d4, 0xc0dd, 0x68d6, 0x68d4, 0xd0fc, 0x0040, 0x4ad8, 0xc0fc,
++      0x68d6, 0x20a9, 0x0200, 0x6034, 0xa005, 0x0040, 0x4ad4, 0x8001,
++      0x6036, 0x68d4, 0xc0fd, 0x68d6, 0x00c0, 0x4ad4, 0x6010, 0xa005,
++      0x0040, 0x4ad4, 0x1078, 0x2628, 0xace0, 0x0010, 0x00f0, 0x4ac3,
++      0xd7fc, 0x0040, 0x4ae2, 0x2061, 0x53c0, 0x2069, 0x4e40, 0xc7fc,
++      0x0078, 0x4a6a, 0x1078, 0x4b1e, 0x7838, 0x8001, 0x783a, 0x00c0,
++      0x4b04, 0x783c, 0x783a, 0x2061, 0x53c0, 0x2069, 0x4e40, 0xc7fc,
++      0x680c, 0xa005, 0x0040, 0x4af6, 0x1078, 0x4b88, 0xd7fc, 0x00c0,
++      0x4b04, 0x7810, 0xd0ec, 0x00c0, 0x4b04, 0x2061, 0x73c0, 0x2069,
++      0x4e80, 0xc7fd, 0x0078, 0x4af0, 0x7814, 0xd0e4, 0x00c0, 0x4b08,
++      0x7810, 0xd0cc, 0x0040, 0x4b1b, 0xd0ac, 0x00c0, 0x4b14, 0xd0a4,
++      0x0040, 0x4b1b, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0068, 0x4b1a,
++      0x1078, 0x2395, 0x007c, 0x2091, 0x8001, 0x007c, 0x7840, 0x8001,
++      0x7842, 0x00c0, 0x4b87, 0x7844, 0x7842, 0x2069, 0x4e40, 0xc7fc,
++      0x7810, 0x2079, 0x0200, 0xd0ec, 0x0040, 0x4b30, 0x2079, 0x0100,
++      0x68d8, 0xa005, 0x0040, 0x4b3c, 0x7de0, 0xa504, 0x00c0, 0x4b3c,
++      0x68da, 0x68d4, 0xc0bc, 0x68d6, 0x2079, 0x4e00, 0x6810, 0xa005,
++      0x00c0, 0x4b44, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0040,
++      0x4b4d, 0xa080, 0x94d0, 0x0078, 0x4b4f, 0xa080, 0x93c0, 0x2040,
++      0x2004, 0xa065, 0x0040, 0x4b79, 0x6024, 0xa005, 0x0040, 0x4b75,
++      0x8001, 0x6026, 0x00c0, 0x4b75, 0x6800, 0xa005, 0x0040, 0x4b68,
++      0x684c, 0xac06, 0x00c0, 0x4b68, 0x1078, 0x4c23, 0x0078, 0x4b79,
++      0x6864, 0xa005, 0x0040, 0x4b70, 0x6027, 0x0001, 0x0078, 0x4b75,
++      0x1078, 0x4bd6, 0x2804, 0x0078, 0x4b51, 0x6000, 0x2c40, 0x0078,
++      0x4b51, 0xd7fc, 0x00c0, 0x4b87, 0x7810, 0xd0ec, 0x00c0, 0x4b87,
++      0x2069, 0x4e80, 0xc7fd, 0x2079, 0x0100, 0x0078, 0x4b30, 0x007c,
++      0x2009, 0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0040, 0x4bc2,
++      0x6024, 0xa005, 0x0040, 0x4b98, 0x8001, 0x6026, 0x0078, 0x4bc0,
++      0x6008, 0xc09c, 0xd084, 0x00c0, 0x4ba0, 0xd0ac, 0x0040, 0x4bba,
++      0x600a, 0x6004, 0xa005, 0x0040, 0x4bc2, 0x0d7e, 0x0c7e, 0x017e,
++      0x2068, 0x6010, 0x8001, 0x6012, 0x1078, 0x3dd0, 0x2d00, 0x2c68,
++      0x2060, 0x1078, 0x1e5b, 0x1078, 0x201d, 0x017f, 0x0c7f, 0x0d7f,
++      0x0078, 0x4bc2, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0078, 0x4bc2,
++      0xa18d, 0x0100, 0xace0, 0x0010, 0x00f0, 0x4b8c, 0xa184, 0x0001,
++      0x0040, 0x4bd1, 0xa18c, 0xfffe, 0x690e, 0x1078, 0x2628, 0x0078,
++      0x4bd2, 0x690e, 0x007c, 0x00c0, 0x4bd2, 0x786c, 0x2c00, 0x687e,
++      0x6714, 0x6f76, 0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006,
++      0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085,
++      0x0060, 0x6022, 0x6000, 0x2042, 0x1078, 0x1de4, 0x6818, 0xa005,
++      0x0040, 0x4bf4, 0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810,
++      0x7908, 0x8109, 0x790a, 0x8001, 0x00d0, 0x4c00, 0x1078, 0x296b,
++      0x6812, 0x00c0, 0x4c06, 0x7910, 0xc1a5, 0x7912, 0x602f, 0x0000,
++      0x6033, 0x0000, 0x2c68, 0x1078, 0x202c, 0xd7fc, 0x00c0, 0x4c14,
++      0x2069, 0x4e40, 0x0078, 0x4c16, 0x2069, 0x4e80, 0x6910, 0xa184,
++      0x0100, 0x2001, 0x0006, 0x00c0, 0x4c20, 0x697a, 0x2001, 0x0004,
++      0x1078, 0x261c, 0x007c, 0x0d7e, 0x694c, 0x2160, 0xd7fc, 0x00c0,
++      0x4c35, 0x7810, 0xd0ec, 0x0040, 0x4c31, 0x2069, 0x0100, 0x0078,
++      0x4c37, 0x2069, 0x0200, 0x0078, 0x4c37, 0x2069, 0x0100, 0x1078,
++      0x28df, 0x601b, 0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020,
++      0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033,
++      0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x0040,
++      0x4c69, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0040,
++      0x4c5b, 0x00f0, 0x4c55, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848,
++      0xd084, 0x0040, 0x4c65, 0x00f0, 0x4c5f, 0x20a9, 0x00fa, 0x00f0,
++      0x4c67, 0x681b, 0x0047, 0x0d7f, 0x6867, 0x0007, 0x007c, 0x2079,
++      0x4e00, 0x1078, 0x4ca3, 0x1078, 0x4c89, 0x1078, 0x4c96, 0x2009,
++      0x0002, 0x2069, 0x4e80, 0x680f, 0x0000, 0x6813, 0x0000, 0x6817,
++      0x0000, 0x8109, 0x0040, 0x4c88, 0x2069, 0x4e40, 0x0078, 0x4c7b,
++      0x007c, 0x7810, 0xd0ec, 0x0040, 0x4c91, 0x2019, 0x00cc, 0x0078,
++      0x4c93, 0x2019, 0x007b, 0x7b3a, 0x7b3e, 0x007c, 0x7814, 0xd0e4,
++      0x00c0, 0x4c9e, 0x2019, 0x0040, 0x0078, 0x4ca0, 0x2019, 0x0026,
++      0x7b42, 0x7b46, 0x007c, 0x7814, 0xd0e4, 0x00c0, 0x4cab, 0x2019,
++      0x3f94, 0x0078, 0x4cad, 0x2019, 0x2624, 0x7b32, 0x7b36, 0x007c,
++      0x6a50, 0xa285, 0x0000, 0x0040, 0x4cdc, 0x6954, 0x6bc0, 0xa300,
++      0x0c7e, 0x2164, 0x6304, 0x83ff, 0x00c0, 0x4cc8, 0x8211, 0x0040,
++      0x4ccc, 0x8108, 0xa11a, 0x0048, 0x4cb9, 0x69c0, 0x0078, 0x4cb9,
++      0x68d3, 0x000a, 0x0c7f, 0x007c, 0x6950, 0x6ac0, 0x2264, 0x602b,
++      0x0000, 0x602f, 0x0000, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109,
++      0x00c0, 0x4cce, 0x6952, 0x0c7f, 0x007c, 0x00e0, 0x4cdd, 0x2091,
++      0x6000, 0x00e0, 0x4ce1, 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x00c0,
++      0x4cee, 0xd0d4, 0x0040, 0x4d17, 0x0078, 0x4d1a, 0x2008, 0x7810,
++      0xd0ec, 0x0040, 0x4d01, 0xd1c4, 0x00c0, 0x4d39, 0x7814, 0xc0c5,
++      0x7816, 0x7810, 0xc0f5, 0x7812, 0xd0ec, 0x0040, 0x4d35, 0x0078,
++      0x4d31, 0xae8e, 0x0100, 0x0040, 0x4d0e, 0x7814, 0xc0f5, 0xc0c5,
++      0x7816, 0xd0d4, 0x00c0, 0x4d35, 0x0078, 0x4d31, 0x7814, 0xc0fd,
++      0xc0c5, 0x7816, 0xd0d4, 0x00c0, 0x4d35, 0x0078, 0x4d31, 0xd0e4,
++      0x0040, 0x4d37, 0x00e0, 0x4d1a, 0x2091, 0x6000, 0x2009, 0x000c,
++      0x00e0, 0x4d20, 0x2091, 0x6000, 0x8109, 0x00c0, 0x4d20, 0x70e4,
++      0xa084, 0x01ff, 0xa086, 0x01ff, 0x00c0, 0x4d31, 0x70ec, 0x0078,
++      0x4cee, 0x7804, 0xd08c, 0x0040, 0x4d37, 0x681f, 0x000c, 0x70a0,
++      0x70a2, 0x007c, 0x205b
++};
++#else
++/************************************************************************
++ *                                                                    *
++ *     --- ISP1240/ISP1080/ISP1280 Initiator/Target Firmware ---      *
++ *                        32 LUN Support                              *
++ *                                                                    *
++ ************************************************************************/
++/*
++ *    Firmware Version 9.11.01 (15:46 May 23, 2000)
++ */
++
++static const u_int16_t isp_1080_risc_code[] = {
++      0x0078, 0x103a, 0x0000, 0x4f62, 0x0000, 0x2043, 0x4f50, 0x5952,
++      0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
++      0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++      0x3132, 0x3430, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
++      0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x392e, 0x3131,
++      0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
++      0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
++      0x3031, 0x2024, 0x20c9, 0xabff, 0x2001, 0x04fc, 0x2004, 0xa086,
++      0x1080, 0x00c0, 0x104d, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1,
++      0x0010, 0x2089, 0x136f, 0x0078, 0x1066, 0x2001, 0x04fc, 0x2004,
++      0xa086, 0x1280, 0x00c0, 0x1062, 0x2071, 0x0200, 0x70a0, 0x70a2,
++      0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010, 0x2089, 0x13f3,
++      0x0078, 0x1066, 0x20c1, 0x0020, 0x2089, 0x1317, 0x2071, 0x0010,
++      0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020,
++      0x70d3, 0x0009, 0x2001, 0x04fd, 0x70d6, 0x20c1, 0x0021, 0x2019,
++      0x0000, 0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec, 0x7fff,
++      0x2d64, 0x206b, 0x0a0a, 0xaddc, 0x3fff, 0x2b54, 0x205b, 0x5050,
++      0x2114, 0xa286, 0xa5a5, 0x0040, 0x109d, 0xa386, 0x000f, 0x0040,
++      0x1099, 0x2c6a, 0x2a5a, 0x20c1, 0x0020, 0x2019, 0x000f, 0x0078,
++      0x1079, 0x2c6a, 0x2a5a, 0x0078, 0x109b, 0x2c6a, 0x2a5a, 0x2130,
++      0x2128, 0xa1a2, 0x6000, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
++      0x8424, 0xa192, 0xac00, 0x2009, 0x0000, 0x2001, 0x0037, 0x1078,
++      0x22c0, 0x2218, 0x2079, 0x6000, 0x2fa0, 0x2408, 0x2011, 0x0000,
++      0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10b8, 0x2009, 0xff00,
++      0x3400, 0xa102, 0x0048, 0x10c8, 0x0040, 0x10c8, 0x20a8, 0x42a4,
++      0x2001, 0x04fc, 0x2004, 0xa086, 0x1080, 0x00c0, 0x10e0, 0x2071,
++      0x0100, 0x0d7e, 0x2069, 0x6040, 0x1078, 0x5d94, 0x0d7f, 0x7808,
++      0xc0ed, 0x780a, 0x7813, 0x0064, 0x2011, 0x000a, 0x0078, 0x1107,
++      0x2001, 0x04fc, 0x2004, 0xa086, 0x1280, 0x00c0, 0x1100, 0x780c,
++      0xc0ed, 0xc0d5, 0x780e, 0x7813, 0x0064, 0x2071, 0x0200, 0x0d7e,
++      0x2069, 0x6040, 0x1078, 0x5d94, 0x2069, 0x6080, 0x2071, 0x0100,
++      0x1078, 0x5d94, 0x780c, 0xc0d4, 0x780e, 0x0d7f, 0x0078, 0x1107,
++      0x780c, 0xc0e5, 0x780e, 0x7813, 0x003c, 0x2011, 0x000c, 0x2009,
++      0x604c, 0x220a, 0x2009, 0x608c, 0x220a, 0x7ece, 0x7cc6, 0x7bca,
++      0x785f, 0x0000, 0x7800, 0xc08d, 0x7802, 0x2031, 0x0030, 0x78b3,
++      0x0101, 0x781b, 0x0002, 0x781f, 0x0002, 0x2009, 0x0002, 0x2069,
++      0x6040, 0x6817, 0x0003, 0x681f, 0x0007, 0x6823, 0x00fa, 0x6827,
++      0x0008, 0x682b, 0x0028, 0x6837, 0x0006, 0x682f, 0x0008, 0x683b,
++      0x0000, 0x8109, 0x0040, 0x1158, 0x68ef, 0x000a, 0x68df, 0x60c0,
++      0x2079, 0x6000, 0x780c, 0xd0e4, 0x00c0, 0x1142, 0x68f3, 0x7329,
++      0x0078, 0x1144, 0x68f3, 0x730d, 0x68e3, 0x65c0, 0x68e7, 0x64c0,
++      0x68eb, 0xa5c0, 0x68c7, 0xaa8e, 0x68cb, 0xaa93, 0x68cf, 0xaa8e,
++      0x68d3, 0xaa8e, 0x68c3, 0x0001, 0x2069, 0x6080, 0x0078, 0x1121,
++      0x68ef, 0x000a, 0x68df, 0x62c0, 0x68f3, 0x7419, 0x68e3, 0x85c0,
++      0x68e7, 0x6540, 0x68eb, 0xa6d0, 0x68c7, 0xaa93, 0x68cb, 0xaa98,
++      0x68cf, 0xaa93, 0x68d3, 0xaa93, 0x68c3, 0x0001, 0x7808, 0xd0ec,
++      0x00c0, 0x11b4, 0x780c, 0xd0e4, 0x00c0, 0x11a6, 0x0e7e, 0x2069,
++      0x64c0, 0x2071, 0x0200, 0x70ec, 0xd0e4, 0x00c0, 0x1187, 0x2019,
++      0x0c0c, 0x2021, 0x000c, 0x1078, 0x222c, 0x0078, 0x118d, 0x2019,
++      0x0c0a, 0x2021, 0x000a, 0x1078, 0x222c, 0x2069, 0x6540, 0x2071,
++      0x0100, 0x70ec, 0xd0e4, 0x00c0, 0x119d, 0x2019, 0x0c0c, 0x2021,
++      0x000c, 0x1078, 0x222c, 0x0078, 0x11a3, 0x2019, 0x0c0a, 0x2021,
++      0x000a, 0x1078, 0x222c, 0x0e7f, 0x0078, 0x11cd, 0x2019, 0x0c0c,
++      0x2021, 0x000c, 0x2069, 0x64c0, 0x1078, 0x222c, 0x2069, 0x6540,
++      0x1078, 0x222c, 0x0078, 0x11cd, 0x2069, 0x64c0, 0x0e7e, 0x2071,
++      0x0100, 0x70ec, 0xd0e4, 0x00c0, 0x11c6, 0x2019, 0x0c0c, 0x2021,
++      0x000c, 0x1078, 0x222c, 0x0e7f, 0x0078, 0x11cd, 0x2019, 0x0c0a,
++      0x2021, 0x000a, 0x1078, 0x222c, 0x0e7f, 0x2011, 0x0002, 0x2069,
++      0x65c0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b,
++      0x0040, 0x7bcc, 0xa386, 0xfeff, 0x00c0, 0x11e4, 0x6817, 0x0100,
++      0x681f, 0x0064, 0x0078, 0x11e8, 0x6817, 0x0064, 0x681f, 0x0002,
++      0xade8, 0x0010, 0x00f0, 0x11d5, 0x8109, 0x00c0, 0x11d3, 0x8211,
++      0x0040, 0x11f6, 0x2069, 0x85c0, 0x0078, 0x11d1, 0x1078, 0x28df,
++      0x1078, 0x56b4, 0x1078, 0x1e5e, 0x1078, 0x5d2a, 0x2091, 0x2100,
++      0x2079, 0x6000, 0x7808, 0xd0ec, 0x0040, 0x120a, 0x2071, 0x0020,
++      0x0078, 0x120c, 0x2071, 0x0050, 0x2091, 0x2200, 0x2079, 0x6000,
++      0x2071, 0x0020, 0x2091, 0x2300, 0x2079, 0x6000, 0x7808, 0xd0ec,
++      0x0040, 0x121e, 0x2079, 0x0100, 0x0078, 0x1220, 0x2079, 0x0200,
++      0x2071, 0x6040, 0x2091, 0x2400, 0x2079, 0x0100, 0x2071, 0x6080,
++      0x2091, 0x2000, 0x2079, 0x6000, 0x2071, 0x0010, 0x3200, 0xa085,
++      0x303d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x123d, 0x70c0, 0xa086,
++      0x0002, 0x00c0, 0x123d, 0x1078, 0x15ae, 0x2039, 0x0000, 0x7808,
++      0xd0ec, 0x00c0, 0x12c7, 0x1078, 0x1477, 0x78b0, 0xa005, 0x00c0,
++      0x125f, 0x0068, 0x1253, 0x7868, 0xa065, 0x0040, 0x1253, 0x2029,
++      0x0000, 0x1078, 0x2774, 0x1078, 0x22e7, 0x0068, 0x126c, 0x7868,
++      0xa065, 0x0040, 0x125f, 0x2029, 0x0000, 0x1078, 0x2774, 0x0068,
++      0x126c, 0x2009, 0x6046, 0x2011, 0x6086, 0x2104, 0x220c, 0xa105,
++      0x0040, 0x126c, 0x1078, 0x1f9d, 0x0e7e, 0x0f7e, 0x2071, 0x6040,
++      0x70c0, 0xa005, 0x0040, 0x1295, 0x7454, 0xa485, 0x0000, 0x0040,
++      0x1295, 0x2079, 0x0200, 0x2091, 0x8000, 0x72f0, 0xa28c, 0x303d,
++      0x2190, 0x1078, 0x2e28, 0x2091, 0x8000, 0x2091, 0x303d, 0x0068,
++      0x1295, 0x0f7f, 0x7868, 0xa065, 0x0040, 0x1294, 0x0e7f, 0x2029,
++      0x0000, 0x1078, 0x2774, 0x0e7e, 0x0f7e, 0x00e0, 0x129d, 0x0f7f,
++      0x0e7f, 0x1078, 0x5b00, 0x0e7e, 0x0f7e, 0x2071, 0x6080, 0x70c0,
++      0xa005, 0x0040, 0x12b6, 0x7454, 0xa485, 0x0000, 0x0040, 0x12b6,
++      0x2079, 0x0100, 0x2091, 0x8000, 0x72f0, 0xa28c, 0x303d, 0x2190,
++      0x1078, 0x2e28, 0x2091, 0x8000, 0x2091, 0x303d, 0x0f7f, 0x0e7f,
++      0x0068, 0x12c1, 0x7868, 0xa065, 0x0040, 0x12c1, 0xa02e, 0x1078,
++      0x2774, 0x00e0, 0x1243, 0x1078, 0x5b00, 0x0078, 0x1243, 0x1078,
++      0x1477, 0x78b0, 0xa005, 0x00c0, 0x12e3, 0x0068, 0x12d7, 0x7868,
++      0xa065, 0x0040, 0x12d7, 0x2029, 0x0000, 0x1078, 0x2774, 0x1078,
++      0x22e7, 0x0068, 0x12ed, 0x7868, 0xa065, 0x0040, 0x12e3, 0x2029,
++      0x0000, 0x1078, 0x2774, 0x0068, 0x12ed, 0x2009, 0x6046, 0x2104,
++      0xa005, 0x0040, 0x12ed, 0x1078, 0x1f9d, 0x0e7e, 0x0f7e, 0x2071,
++      0x6040, 0x70c0, 0xa005, 0x0040, 0x1305, 0x7454, 0xa485, 0x0000,
++      0x0040, 0x1305, 0x2079, 0x0100, 0x2091, 0x8000, 0x72f0, 0x1078,
++      0x2e28, 0x2091, 0x8000, 0x2091, 0x303d, 0x0f7f, 0x0e7f, 0x0068,
++      0x1311, 0x7868, 0xa065, 0x0040, 0x1311, 0x2029, 0x0000, 0x1078,
++      0x2774, 0x00e0, 0x12c7, 0x1078, 0x5b00, 0x0078, 0x12c7, 0x1337,
++      0x1337, 0x1339, 0x1339, 0x1346, 0x1346, 0x1346, 0x1346, 0x1351,
++      0x1351, 0x135e, 0x135e, 0x1346, 0x1346, 0x1346, 0x1346, 0x1337,
++      0x1337, 0x1339, 0x1339, 0x1346, 0x1346, 0x1346, 0x1346, 0x1351,
++      0x1351, 0x135e, 0x135e, 0x1346, 0x1346, 0x1346, 0x1346, 0x0078,
++      0x1337, 0x007e, 0x107e, 0x127e, 0x2091, 0x2400, 0x1078, 0x2c19,
++      0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
++      0x127e, 0x1078, 0x13c3, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001,
++      0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x2c19,
++      0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
++      0x127e, 0x2091, 0x2300, 0x1078, 0x2c19, 0x2091, 0x2400, 0x1078,
++      0x2c19, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x138f,
++      0x138f, 0x1391, 0x1391, 0x139e, 0x139e, 0x139e, 0x139e, 0x13a9,
++      0x13a9, 0x1391, 0x1391, 0x139e, 0x139e, 0x139e, 0x139e, 0x13aa,
++      0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa,
++      0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x13aa, 0x0078,
++      0x138f, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x2c19,
++      0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e,
++      0x127e, 0x1078, 0x13d0, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001,
++      0x007c, 0x007c, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x007e,
++      0x2071, 0x0100, 0x2069, 0x6040, 0x2079, 0x6000, 0x70ec, 0xa084,
++      0x1c00, 0x78e6, 0x1078, 0x5d94, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f,
++      0x127f, 0x107f, 0x007c, 0x3c00, 0xa084, 0x0007, 0x0079, 0x13c8,
++      0x13d9, 0x13d9, 0x13db, 0x13db, 0x13e0, 0x13e0, 0x13e5, 0x13e5,
++      0x3c00, 0xa084, 0x0003, 0x0079, 0x13d5, 0x13d9, 0x13d9, 0x13ee,
++      0x13ee, 0x1078, 0x2bfa, 0x2091, 0x2200, 0x1078, 0x578c, 0x007c,
++      0x2091, 0x2100, 0x1078, 0x578c, 0x007c, 0x2091, 0x2100, 0x1078,
++      0x578c, 0x2091, 0x2200, 0x1078, 0x578c, 0x007c, 0x2091, 0x2100,
++      0x1078, 0x578c, 0x007c, 0x1413, 0x1413, 0x1415, 0x1415, 0x1422,
++      0x1422, 0x1422, 0x1422, 0x142d, 0x142d, 0x143a, 0x143a, 0x1422,
++      0x1422, 0x1422, 0x1422, 0x144b, 0x144b, 0x144b, 0x144b, 0x144b,
++      0x144b, 0x144b, 0x144b, 0x144b, 0x144b, 0x144b, 0x144b, 0x144b,
++      0x144b, 0x144b, 0x144b, 0x0078, 0x1413, 0x007e, 0x107e, 0x127e,
++      0x2091, 0x2400, 0x1078, 0x2c19, 0x127f, 0x107f, 0x007f, 0x2091,
++      0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13c3, 0x127f,
++      0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e,
++      0x2091, 0x2300, 0x1078, 0x2c19, 0x127f, 0x107f, 0x007f, 0x2091,
++      0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078,
++      0x2c19, 0x2091, 0x2400, 0x1078, 0x2c19, 0x127f, 0x107f, 0x007f,
++      0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e,
++      0x0f7e, 0x2079, 0x6000, 0x2071, 0x0200, 0x2069, 0x6040, 0x3d00,
++      0xd08c, 0x0040, 0x1461, 0x70ec, 0xa084, 0x1c00, 0x78e6, 0x1078,
++      0x5d94, 0x3d00, 0xd084, 0x0040, 0x146f, 0x2069, 0x6080, 0x2071,
++      0x0100, 0x70ec, 0xa084, 0x1c00, 0x78ea, 0x1078, 0x5d94, 0x0f7f,
++      0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007f, 0x007c, 0x007c, 0x0068,
++      0x14fd, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x14fd,
++      0x7820, 0xa005, 0x00c0, 0x1488, 0x0010, 0x14fe, 0x0078, 0x14fd,
++      0x7908, 0xd1f4, 0x0040, 0x1490, 0x2001, 0x4007, 0x0078, 0x15b0,
++      0x790c, 0xd1ec, 0x0040, 0x14ab, 0xd0fc, 0x0040, 0x14a1, 0x007e,
++      0x1078, 0x1dd3, 0x007f, 0x0040, 0x14ab, 0x2001, 0x4007, 0x0078,
++      0x15b0, 0x007e, 0x1078, 0x1dc7, 0x007f, 0x0040, 0x14ab, 0x2001,
++      0x4007, 0x0078, 0x15b0, 0x7908, 0xd0fc, 0x00c0, 0x14b5, 0x2061,
++      0x6040, 0xc19c, 0xc7fc, 0x0078, 0x14b9, 0x2061, 0x6080, 0xc19d,
++      0xc7fd, 0x6068, 0xa005, 0x00c0, 0x14fd, 0x790a, 0x6087, 0x0000,
++      0x7820, 0xc0fc, 0xa086, 0x0018, 0x00c0, 0x14ca, 0x0c7e, 0x1078,
++      0x1aed, 0x0c7f, 0x7823, 0x0000, 0x6080, 0xa065, 0x0040, 0x14e3,
++      0x0c7e, 0x609c, 0x1078, 0x1edb, 0x0c7f, 0x609f, 0x0000, 0x1078,
++      0x1c18, 0x2009, 0x000c, 0x6007, 0x0103, 0x1078, 0x1ddf, 0x00c0,
++      0x14f7, 0x1078, 0x1e43, 0x7808, 0xd09c, 0x00c0, 0x14eb, 0x2061,
++      0x6040, 0x0078, 0x14ee, 0x2061, 0x6080, 0xc09c, 0x6083, 0x0000,
++      0x780a, 0x60f0, 0xd0dc, 0x0040, 0x14fb, 0xc0dc, 0x60f2, 0x2001,
++      0x4005, 0x0078, 0x15b0, 0x0078, 0x15ae, 0x007c, 0x7808, 0xd0f4,
++      0x0040, 0x1506, 0x2001, 0x4007, 0x0078, 0x15b0, 0x70c3, 0x0000,
++      0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000, 0x70db, 0x0000,
++      0x71c4, 0x7a08, 0xd2ec, 0x0040, 0x1516, 0xc1fc, 0x70c0, 0xa03d,
++      0xa092, 0x0030, 0x00c8, 0x151e, 0x0079, 0x1525, 0x2200, 0xa092,
++      0x0050, 0x00c8, 0x15bc, 0x0079, 0x1555, 0x15ae, 0x1604, 0x15cd,
++      0x1619, 0x1628, 0x162e, 0x15c4, 0x1c30, 0x1632, 0x15bc, 0x15d1,
++      0x15d3, 0x15d5, 0x15d7, 0x1c35, 0x15bc, 0x1640, 0x1698, 0x1b0f,
++      0x1c2a, 0x15d9, 0x1949, 0x198b, 0x19c6, 0x1a13, 0x1902, 0x1910,
++      0x1924, 0x1938, 0x175e, 0x15bc, 0x16c9, 0x16cd, 0x16d9, 0x16e5,
++      0x16fb, 0x1707, 0x170a, 0x1716, 0x1722, 0x172a, 0x1746, 0x1752,
++      0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x176b, 0x177a, 0x1795, 0x17cb,
++      0x17f3, 0x1803, 0x1806, 0x182f, 0x1860, 0x1872, 0x18d4, 0x18e4,
++      0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x18f4, 0x15bc, 0x15bc, 0x15bc,
++      0x15bc, 0x15bc, 0x1d7e, 0x1d84, 0x15bc, 0x15bc, 0x15bc, 0x1d88,
++      0x1d8d, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15fe, 0x1613, 0x163a,
++      0x1692, 0x1b09, 0x1c4c, 0x1c72, 0x1ad0, 0x1c8a, 0x1d91, 0x1d70,
++      0x1d7a, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc,
++      0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc,
++      0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc,
++      0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc,
++      0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x15bc, 0x72ca, 0x71c6, 0x2001,
++      0x4006, 0x0078, 0x15b0, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000,
++      0x70c2, 0x0068, 0x15b1, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091,
++      0x5000, 0x2091, 0x4080, 0x007c, 0x70c3, 0x4001, 0x0078, 0x15b1,
++      0x70c3, 0x4006, 0x0078, 0x15b1, 0x2099, 0x0041, 0x20a1, 0x0041,
++      0x20a9, 0x0005, 0x53a3, 0x0078, 0x15ae, 0x70c4, 0x70c3, 0x0004,
++      0x007a, 0x0078, 0x15ae, 0x0078, 0x15ae, 0x0078, 0x15ae, 0x0078,
++      0x15ae, 0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb,
++      0x5020, 0x70cf, 0x2020, 0x70d3, 0x0009, 0x2001, 0x000b, 0x70d6,
++      0x2079, 0x0000, 0x781b, 0x0001, 0x2031, 0x0030, 0x2059, 0x1000,
++      0x2029, 0x041a, 0x2051, 0x0445, 0x2061, 0x0447, 0x20c1, 0x0020,
++      0x2091, 0x5000, 0x2091, 0x4080, 0x0078, 0x0418, 0x75d8, 0x74dc,
++      0x75da, 0x74de, 0x0078, 0x1607, 0x2029, 0x0000, 0x2520, 0x71d0,
++      0x73c8, 0x72cc, 0x70c4, 0x1078, 0x1ff2, 0x0040, 0x15ae, 0x70c3,
++      0x4002, 0x0078, 0x15ae, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078,
++      0x161c, 0x2029, 0x0000, 0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4,
++      0x1078, 0x203c, 0x0040, 0x15ae, 0x70c3, 0x4002, 0x0078, 0x15ae,
++      0x71c4, 0x70c8, 0x2114, 0x200a, 0x0078, 0x15ac, 0x71c4, 0x2114,
++      0x0078, 0x15ac, 0x70c7, 0x0009, 0x70cb, 0x000b, 0x70cf, 0x0001,
++      0x0078, 0x15ae, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1643,
++      0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6,
++      0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x168c, 0xa40a, 0x0040,
++      0x1653, 0x00c8, 0x15b0, 0x8001, 0x786e, 0xa084, 0xfc00, 0x0040,
++      0x1660, 0x78b0, 0xc085, 0x78b2, 0x2001, 0x4005, 0x0078, 0x15b0,
++      0x7a76, 0x7b7a, 0x7d7e, 0x7e82, 0x7c72, 0xa48c, 0xff00, 0x0040,
++      0x1678, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f, 0xa118,
++      0xa291, 0x0000, 0xa6b1, 0x0000, 0xa5a9, 0x0000, 0x0078, 0x1682,
++      0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1, 0x0000,
++      0xa5a9, 0x0000, 0x731a, 0x721e, 0x7622, 0x7526, 0x78b0, 0xa084,
++      0xfffc, 0x78b2, 0x0078, 0x1690, 0x78b0, 0xa085, 0x0001, 0x78b2,
++      0x0078, 0x15ae, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x169b,
++      0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6,
++      0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x16c3, 0xa40a, 0x0040,
++      0x16ab, 0x00c8, 0x15b0, 0x8001, 0x7892, 0xa084, 0xfc00, 0x0040,
++      0x16b8, 0x78b0, 0xc0c5, 0x78b2, 0x2001, 0x4005, 0x0078, 0x15b0,
++      0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x7c96, 0x78b0, 0xa084, 0xfcff,
++      0x78b2, 0x0078, 0x16c7, 0x78b0, 0xa085, 0x0100, 0x78b2, 0x0078,
++      0x15ae, 0x7960, 0x7ac8, 0x0078, 0x15ac, 0x2009, 0x6047, 0x210c,
++      0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x2011, 0x6087, 0x2214, 0x0078,
++      0x15ac, 0x2009, 0x6048, 0x210c, 0x7808, 0xd0ec, 0x00c0, 0x15ad,
++      0x2011, 0x6088, 0x2214, 0x0078, 0x15ac, 0x2061, 0x6040, 0x6124,
++      0x6228, 0x8214, 0x8214, 0x8214, 0x7808, 0xd0ec, 0x00c0, 0x16f9,
++      0x2061, 0x6080, 0x6324, 0x73da, 0x6328, 0x831c, 0x831c, 0x831c,
++      0x73de, 0x0078, 0x15ac, 0x2009, 0x604b, 0x210c, 0x7808, 0xd0ec,
++      0x00c0, 0x15ad, 0x2011, 0x608b, 0x2214, 0x0078, 0x15ac, 0x7910,
++      0x0078, 0x15ad, 0x2009, 0x0202, 0x210c, 0x7808, 0xd0ec, 0x00c0,
++      0x15ad, 0x2011, 0x0102, 0x2214, 0x0078, 0x15ac, 0x2009, 0x604d,
++      0x210c, 0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x2011, 0x608d, 0x2214,
++      0x0078, 0x15ac, 0x7918, 0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x7a1c,
++      0x0078, 0x15ac, 0xd1fc, 0x00c0, 0x1731, 0x2011, 0x64c0, 0x0078,
++      0x1733, 0x2011, 0x6540, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003,
++      0x8003, 0xa268, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x1743,
++      0x6b08, 0x0078, 0x1744, 0x6b0c, 0x0078, 0x15ab, 0x2138, 0x1078,
++      0x1e6e, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++      0x0078, 0x15ab, 0x2061, 0x6040, 0x6114, 0x7808, 0xd0ec, 0x00c0,
++      0x15ad, 0x2061, 0x6080, 0x6214, 0x0078, 0x15ac, 0x2138, 0x1078,
++      0x1e6e, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091,
++      0x8001, 0x0078, 0x15ab, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010,
++      0x00c8, 0x15a6, 0x1078, 0x2a23, 0xd3f4, 0x0040, 0x1778, 0xc2ad,
++      0x0078, 0x15ab, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x00c8, 0x15a6,
++      0xd1bc, 0x00c0, 0x1788, 0x2011, 0x6047, 0x2204, 0x0078, 0x178c,
++      0x2011, 0x6087, 0x2204, 0xc0bd, 0x007e, 0x2100, 0xc0bc, 0x2012,
++      0x1078, 0x297e, 0x017f, 0x0078, 0x15ad, 0x71c4, 0x2021, 0x6048,
++      0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x17a4, 0x71c8, 0x2021,
++      0x6088, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x17c3, 0x20a9, 0x0008,
++      0x2204, 0xa106, 0x0040, 0x17b3, 0x8210, 0x00f0, 0x17a8, 0x71c4,
++      0x72c8, 0x0078, 0x15a5, 0xa292, 0x17c3, 0x027e, 0x2122, 0x017f,
++      0x1078, 0x29a1, 0x7808, 0xd0ec, 0x00c0, 0x17c1, 0xd3fc, 0x0040,
++      0x179e, 0x0078, 0x15ae, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0004,
++      0x0001, 0x0002, 0x0003, 0x2061, 0x6040, 0x6124, 0x6228, 0x8214,
++      0x8214, 0x8214, 0x70c4, 0x6026, 0x70c8, 0x8003, 0x8003, 0x8003,
++      0x602a, 0x7808, 0xd0ec, 0x00c0, 0x17f1, 0x027e, 0x017e, 0x2061,
++      0x6080, 0x6124, 0x6228, 0x8214, 0x8214, 0x8214, 0x70d8, 0x6026,
++      0x70dc, 0x8003, 0x8003, 0x8003, 0x602a, 0x71da, 0x72de, 0x017f,
++      0x027f, 0x0078, 0x15ac, 0x2061, 0x6040, 0x612c, 0x70c4, 0x602e,
++      0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x2061, 0x6080, 0x622c, 0x70c8,
++      0x602e, 0x0078, 0x15ac, 0x7910, 0x0078, 0x15ad, 0x71c4, 0xa184,
++      0xffcf, 0x0040, 0x1812, 0x7808, 0xd0ec, 0x00c0, 0x15a6, 0x72c8,
++      0x0078, 0x15a5, 0x007e, 0x2019, 0x0000, 0x1078, 0x2a08, 0x7808,
++      0xd0ec, 0x0040, 0x181e, 0x017f, 0x0078, 0x15ad, 0x71c8, 0xa184,
++      0xffcf, 0x0040, 0x1827, 0x2110, 0x71c4, 0x0078, 0x15a5, 0x007e,
++      0xc3fd, 0x1078, 0x2a08, 0x027f, 0x017f, 0x0078, 0x15ac, 0x71c4,
++      0xa182, 0x0010, 0x0048, 0x183b, 0x7808, 0xd0ec, 0x00c0, 0x15a6,
++      0x72c8, 0x0078, 0x15a5, 0x2011, 0x604d, 0x2204, 0x007e, 0x2112,
++      0x2019, 0x0000, 0x1078, 0x29e6, 0x7808, 0xd0ec, 0x0040, 0x184b,
++      0x017f, 0x0078, 0x15ad, 0x71c8, 0xa182, 0x0010, 0x0048, 0x1854,
++      0x2110, 0x71c4, 0x0078, 0x15a5, 0x2011, 0x608d, 0x2204, 0x007e,
++      0x2112, 0xc3fd, 0x1078, 0x29e6, 0x027f, 0x017f, 0x0078, 0x15ac,
++      0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x15a5, 0xa284, 0xfffd,
++      0x00c0, 0x15a5, 0x2100, 0x7918, 0x781a, 0x2200, 0x7a1c, 0x781e,
++      0x0078, 0x15ac, 0x017e, 0xd1fc, 0x00c0, 0x187a, 0x2011, 0x64c0,
++      0x0078, 0x187c, 0x2011, 0x6540, 0x8107, 0xa084, 0x000f, 0x8003,
++      0x8003, 0x8003, 0xa268, 0xa01e, 0x72c8, 0x2091, 0x8000, 0x6800,
++      0x007e, 0xa226, 0x0040, 0x18a8, 0x6a02, 0xa484, 0x2000, 0x0040,
++      0x1893, 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x1899, 0xa39d,
++      0x0008, 0xa484, 0x4000, 0x0040, 0x18a8, 0x810f, 0xa284, 0x4000,
++      0x0040, 0x18a6, 0x1078, 0x2a65, 0x0078, 0x18a8, 0x1078, 0x2a43,
++      0x72cc, 0x6808, 0xa206, 0x0040, 0x18ca, 0xa2a4, 0x00ff, 0x780c,
++      0xd0e4, 0x00c0, 0x18bb, 0xa482, 0x0028, 0x0048, 0x18c7, 0x0040,
++      0x18c7, 0x0078, 0x18bf, 0xa482, 0x0043, 0x0048, 0x18c7, 0x027f,
++      0x72ca, 0x017f, 0x71c6, 0x2091, 0x8001, 0x0078, 0x15a7, 0x6a0a,
++      0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x017f,
++      0x2091, 0x8001, 0x0078, 0x15ab, 0x2138, 0x1078, 0x1e6e, 0x2091,
++      0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc,
++      0x681e, 0x2708, 0x0078, 0x15ab, 0x70c4, 0x2061, 0x6040, 0x6114,
++      0x6016, 0x7808, 0xd0ec, 0x00c0, 0x15ad, 0x70c8, 0x2061, 0x6080,
++      0x6214, 0x6016, 0x0078, 0x15ac, 0x72c8, 0x73cc, 0xa182, 0x0010,
++      0x00c8, 0x15a6, 0x1078, 0x2a87, 0xd3f4, 0x0040, 0x1900, 0xc2ad,
++      0x0078, 0x15ab, 0x2138, 0x1078, 0x1e6e, 0x2091, 0x8000, 0x6a08,
++      0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x15ac,
++      0x2138, 0x1078, 0x1e6e, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9,
++      0x6a0a, 0x6804, 0xa005, 0x0040, 0x191f, 0x1078, 0x2852, 0x2091,
++      0x8001, 0x2708, 0x0078, 0x15ac, 0x2138, 0x1078, 0x1e6e, 0x2091,
++      0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040,
++      0x1933, 0x1078, 0x2852, 0x2091, 0x8001, 0x2708, 0x0078, 0x15ac,
++      0x2138, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091,
++      0x8000, 0x1078, 0x1e83, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078,
++      0x15ac, 0x2138, 0x780c, 0xd0e4, 0x00c0, 0x195d, 0xd7fc, 0x0040,
++      0x1957, 0x1078, 0x1dd3, 0x0040, 0x195d, 0x0078, 0x15b0, 0x1078,
++      0x1dc7, 0x0040, 0x195d, 0x0078, 0x15b0, 0x73c8, 0x72cc, 0x77c6,
++      0x73ca, 0x72ce, 0x1078, 0x1f20, 0x00c0, 0x1987, 0x6818, 0xa005,
++      0x0040, 0x1981, 0x2708, 0x077e, 0x1078, 0x2ab0, 0x077f, 0x00c0,
++      0x1981, 0x2001, 0x0015, 0xd7fc, 0x00c0, 0x197a, 0x2061, 0x6040,
++      0x0078, 0x197d, 0xc0fd, 0x2061, 0x6080, 0x7822, 0x2091, 0x8001,
++      0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15b0, 0x2091,
++      0x8001, 0x0078, 0x15ae, 0x2138, 0x780c, 0xd0e4, 0x00c0, 0x199f,
++      0xd7fc, 0x0040, 0x1999, 0x1078, 0x1dd3, 0x0040, 0x199f, 0x0078,
++      0x15b0, 0x1078, 0x1dc7, 0x0040, 0x199f, 0x0078, 0x15b0, 0x77c6,
++      0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000,
++      0x1078, 0x1e83, 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x19b3, 0x2061,
++      0x6040, 0x0078, 0x19b6, 0x2061, 0x6080, 0xc1fd, 0x606b, 0x0003,
++      0x6083, 0x0000, 0x677a, 0x6087, 0x000f, 0x7922, 0x61f0, 0xc1dc,
++      0x61f2, 0x1078, 0x2852, 0x2091, 0x8001, 0x007c, 0x77c8, 0x77ca,
++      0x2138, 0x77c6, 0x780c, 0xd0e4, 0x00c0, 0x19dd, 0xd7fc, 0x0040,
++      0x19d7, 0x1078, 0x1dd3, 0x0040, 0x19dd, 0x0078, 0x15b0, 0x1078,
++      0x1dc7, 0x0040, 0x19dd, 0x0078, 0x15b0, 0xa7bc, 0xff00, 0x2091,
++      0x8000, 0x2009, 0x0017, 0xd7fc, 0x00c0, 0x19ea, 0x2061, 0x6040,
++      0x0078, 0x19ed, 0x2061, 0x6080, 0xc1fd, 0x6083, 0x0000, 0x606b,
++      0x0002, 0x677a, 0x6087, 0x000f, 0x7922, 0x61f0, 0xc1dc, 0x61f2,
++      0x1078, 0x2852, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0010,
++      0x70c8, 0xa005, 0x0040, 0x1a07, 0x60f0, 0xc0fd, 0x60f2, 0x1078,
++      0x1e83, 0x70c8, 0x6836, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1a07,
++      0x2091, 0x8001, 0x007c, 0x2019, 0x0000, 0x2011, 0x0000, 0x7808,
++      0xd0ec, 0x00c0, 0x1a2f, 0x72c8, 0x780c, 0xd0e4, 0x00c0, 0x1a2f,
++      0xd284, 0x0040, 0x1a29, 0x1078, 0x1dd3, 0x0040, 0x1a2f, 0x0078,
++      0x15b0, 0x1078, 0x1dc7, 0x0040, 0x1a2f, 0x0078, 0x15b0, 0x72ca,
++      0x78b0, 0xa084, 0x0003, 0x00c0, 0x1a59, 0x2039, 0x0000, 0xd284,
++      0x0040, 0x1a3b, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051,
++      0x0008, 0x1078, 0x1e6e, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d,
++      0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1a41,
++      0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0,
++      0x1a41, 0x2091, 0x8000, 0x7808, 0xd0ec, 0x0040, 0x1a63, 0x2069,
++      0x0100, 0x0078, 0x1a6d, 0x72c8, 0xd284, 0x00c0, 0x1a6b, 0x2069,
++      0x0200, 0x0078, 0x1a6d, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd,
++      0x680a, 0x6830, 0xa084, 0x0040, 0x0040, 0x1a90, 0x684b, 0x0004,
++      0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x1a81, 0x00f0,
++      0x1a7a, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001,
++      0x0040, 0x1a8c, 0x00f0, 0x1a85, 0x20a9, 0x00fa, 0x00f0, 0x1a8e,
++      0x2079, 0x6000, 0x2009, 0x0018, 0x7808, 0xd0ec, 0x00c0, 0x1a9c,
++      0x72c8, 0xd284, 0x00c0, 0x1aa0, 0x2061, 0x6040, 0x0078, 0x1aa3,
++      0x2061, 0x6080, 0xc1fd, 0x6083, 0x0000, 0x7922, 0x606b, 0x0001,
++      0x6087, 0x000f, 0x60c3, 0x0000, 0x60c4, 0x60ce, 0x60d2, 0x60f0,
++      0xd0b4, 0x0040, 0x1abf, 0xc0b4, 0x60f2, 0x0c7e, 0x60d4, 0xa065,
++      0x6008, 0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x60f0,
++      0xa084, 0x77ff, 0x60f2, 0x78b0, 0xa085, 0x0002, 0x78b2, 0x83ff,
++      0x0040, 0x1acb, 0x007c, 0x681b, 0x0048, 0x2091, 0x8001, 0x007c,
++      0x73cc, 0x1078, 0x1a15, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a,
++      0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff,
++      0x00f0, 0x1ae0, 0x8421, 0x00c0, 0x1ade, 0x8319, 0x00c0, 0x1adc,
++      0x69ee, 0x6a4a, 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1af4,
++      0x2069, 0x6040, 0x0078, 0x1af6, 0x2069, 0x6080, 0x71c4, 0x71c6,
++      0x6912, 0x81ff, 0x00c0, 0x1afe, 0x68c3, 0x0001, 0x78b0, 0xa084,
++      0xfffd, 0x78b2, 0xa084, 0x0001, 0x00c0, 0x1b08, 0x1078, 0x1f79,
++      0x007c, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1b12, 0x2029,
++      0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce,
++      0x2079, 0x6000, 0x7de2, 0x7cde, 0x7bda, 0x7ad6, 0x1078, 0x1e25,
++      0x0040, 0x1c14, 0x20a9, 0x0005, 0x20a1, 0x6012, 0x2091, 0x8000,
++      0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x1078, 0x21f4, 0x0040,
++      0x1b35, 0x1078, 0x1e43, 0x0078, 0x1c14, 0x6004, 0xa08c, 0x00ff,
++      0xa18e, 0x0009, 0x00c0, 0x1b40, 0x007e, 0x1078, 0x2750, 0x007f,
++      0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x1bb3, 0x0c7e, 0x2c68,
++      0x1078, 0x1e25, 0x0040, 0x1b86, 0x2c00, 0x689e, 0x8109, 0x00c0,
++      0x1b47, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7de0, 0x7cdc, 0x7bd8,
++      0x7ad4, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
++      0x0000, 0x7de2, 0x7cde, 0x7bda, 0x7ad6, 0x2c68, 0x689c, 0xa065,
++      0x0040, 0x1bb2, 0x2009, 0x0040, 0x1078, 0x21f4, 0x00c0, 0x1b9c,
++      0x6004, 0xa084, 0x00ff, 0xa086, 0x0002, 0x00c0, 0x1b86, 0x6004,
++      0xa084, 0x00ff, 0xa086, 0x000a, 0x00c0, 0x1b82, 0x017e, 0x1078,
++      0x274c, 0x017f, 0x2d00, 0x6002, 0x0078, 0x1b55, 0x0c7f, 0x0c7e,
++      0x609c, 0x1078, 0x1edb, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c18,
++      0x2009, 0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x1078, 0x1ddf,
++      0x1078, 0x1e43, 0x0078, 0x1c14, 0x0c7f, 0x0c7e, 0x609c, 0x1078,
++      0x1edb, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c18, 0x2009, 0x000c,
++      0x6007, 0x0103, 0x601b, 0x0003, 0x1078, 0x1ddf, 0x1078, 0x1e43,
++      0x0078, 0x1c14, 0x0c7f, 0x780c, 0xd0e4, 0x00c0, 0x1bd8, 0x6114,
++      0xd1fc, 0x0040, 0x1bc1, 0x1078, 0x1dd3, 0x0040, 0x1bd8, 0x0078,
++      0x1bc5, 0x1078, 0x1dc7, 0x0040, 0x1bd8, 0x2029, 0x0000, 0x2520,
++      0x2009, 0x0018, 0x73c8, 0x72cc, 0x6087, 0x0103, 0x601b, 0x0021,
++      0x1078, 0x1ddf, 0x1078, 0x1e43, 0x2001, 0x4007, 0x0078, 0x15b0,
++      0x74c4, 0x73c8, 0x72cc, 0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009,
++      0x0012, 0xd0fc, 0x00c0, 0x1be8, 0x2071, 0x6040, 0x0078, 0x1beb,
++      0x2071, 0x6080, 0xc1fd, 0x7922, 0x706b, 0x0005, 0x71f0, 0xc1dc,
++      0x71f2, 0x736e, 0x7272, 0x7476, 0x707a, 0x707f, 0x0000, 0x2c00,
++      0x7082, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0x0060, 0x0040,
++      0x1c03, 0x1078, 0x564a, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa,
++      0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000, 0x1078,
++      0x2852, 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x15b1,
++      0x20a9, 0x0005, 0x2099, 0x6012, 0x2091, 0x8000, 0x530a, 0x2091,
++      0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
++      0x0000, 0x007c, 0x71c4, 0x70c7, 0x0000, 0x7916, 0x0078, 0x15ae,
++      0x71c4, 0x71c6, 0x2168, 0x0078, 0x1c37, 0x2069, 0x1000, 0x690c,
++      0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1c39, 0xa285,
++      0x0000, 0x00c0, 0x1c47, 0x70c3, 0x4000, 0x0078, 0x1c49, 0x70c3,
++      0x4003, 0x70ca, 0x0078, 0x15b1, 0x2011, 0x6064, 0xa03e, 0x7908,
++      0xd1ec, 0x00c0, 0x1c6a, 0x77c8, 0xd7fc, 0x0040, 0x1c59, 0x2011,
++      0x60a4, 0x220c, 0x007e, 0x037e, 0x047e, 0x1078, 0x482c, 0x70c4,
++      0xd0fc, 0x047f, 0x037f, 0x007f, 0x00c0, 0x1c6a, 0xa184, 0x7fff,
++      0x0078, 0x1c6e, 0x1078, 0x480c, 0xa185, 0x8000, 0x2012, 0x2710,
++      0x0078, 0x15ac, 0x017e, 0x2100, 0xc1fc, 0x1078, 0x47fa, 0x017f,
++      0xd1fc, 0x00c0, 0x1c7f, 0x2001, 0x6064, 0x0078, 0x1c81, 0x2001,
++      0x60a4, 0x2004, 0xa084, 0x8000, 0x6100, 0xa10d, 0x6204, 0x6308,
++      0x0078, 0x15ab, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2091, 0x8000,
++      0x2061, 0x0010, 0x60c4, 0xd0fc, 0x00c0, 0x1ca8, 0x2071, 0x6040,
++      0x7808, 0xd0ec, 0x0040, 0x1ca2, 0x2079, 0x0100, 0x2019, 0x0020,
++      0x0078, 0x1cae, 0x2079, 0x0200, 0x2019, 0x0050, 0x0078, 0x1cae,
++      0x2071, 0x6080, 0x2079, 0x0100, 0x2019, 0x0020, 0x7094, 0xa06d,
++      0x0040, 0x1d66, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0007, 0x0040,
++      0x1cbd, 0xa286, 0x000f, 0x00c0, 0x1d66, 0x691c, 0xa184, 0x00c0,
++      0x0040, 0x1d66, 0xa186, 0x00c0, 0x0040, 0x1d66, 0x6824, 0xa084,
++      0xff00, 0xa085, 0x0019, 0x6826, 0x2368, 0x7830, 0xa084, 0x0040,
++      0x00c0, 0x1ccd, 0xa184, 0x0080, 0x00c0, 0x1d36, 0x78e4, 0xa084,
++      0x0007, 0x8001, 0x00c0, 0x1cd6, 0x71a4, 0x81ff, 0x0040, 0x1cec,
++      0x6807, 0x0010, 0x6908, 0x6808, 0xa106, 0x00c0, 0x1ce2, 0x6804,
++      0xa084, 0x0010, 0x00c0, 0x1ce7, 0x78b8, 0xa084, 0x801f, 0x00c0,
++      0x1cec, 0x7848, 0xa085, 0x000c, 0x784a, 0x71a4, 0x81ff, 0x0040,
++      0x1d0b, 0x70a7, 0x0000, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008,
++      0x00c0, 0x1cfd, 0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0,
++      0x1d04, 0x6807, 0x0002, 0x61c4, 0xa18c, 0x0003, 0x0040, 0x1d61,
++      0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce, 0x7848, 0xa084, 0x000c,
++      0x00c0, 0x1d15, 0x0e7e, 0x2071, 0x6000, 0x724e, 0x7352, 0xae80,
++      0x0013, 0x0e7f, 0x1078, 0x54f9, 0x78a3, 0x0000, 0x7858, 0xa084,
++      0xedff, 0x785a, 0x70a8, 0xa080, 0x00d9, 0x781a, 0x0f7f, 0x0e7f,
++      0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x0078, 0x15ae, 0x78e4, 0xa084,
++      0x0007, 0x00c0, 0x1d36, 0x78b8, 0xa084, 0x801f, 0x00c0, 0x1d3b,
++      0x7848, 0xa085, 0x000c, 0x784a, 0x7848, 0xa084, 0x000c, 0x00c0,
++      0x1d44, 0x71a4, 0x81ff, 0x0040, 0x1d61, 0x6807, 0x0010, 0x70a7,
++      0x0000, 0x6807, 0x0018, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1d53,
++      0x6807, 0x0008, 0x6804, 0xa084, 0x0008, 0x00c0, 0x1d5a, 0x6807,
++      0x0002, 0x70a8, 0xa080, 0x00a7, 0x0078, 0x1d2d, 0x0f7f, 0x0e7f,
++      0x0d7f, 0x0c7f, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15b0,
++      0x795c, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x15a6, 0x795e,
++      0x0078, 0x15ae, 0x795c, 0x71c6, 0x0078, 0x15ae, 0x7900, 0x71c6,
++      0x71c4, 0x7902, 0x0078, 0x15ae, 0x7900, 0x71c6, 0x0078, 0x15ae,
++      0x7904, 0x70c4, 0x7806, 0x0078, 0x15ad, 0x7804, 0x70c6, 0x0078,
++      0x15ae, 0xd1fc, 0x00c0, 0x1d98, 0x2011, 0x64c0, 0x0078, 0x1d9a,
++      0x2011, 0x6540, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1da9, 0x2011, 0x0001, 0x0078,
++      0x1dab, 0x2011, 0x0000, 0x6b0c, 0x6800, 0x70da, 0x0078, 0x15ab,
++      0x780c, 0xd0f4, 0x0040, 0x1dbb, 0x2001, 0x4007, 0x70db, 0x0000,
++      0xa005, 0x0078, 0x1dc6, 0xd0fc, 0x0040, 0x1dc5, 0x2001, 0x4007,
++      0x70db, 0x0001, 0xa005, 0x0078, 0x1dc6, 0xa006, 0x007c, 0x780c,
++      0xd0f4, 0x0040, 0x1dd1, 0x2001, 0x4007, 0x70db, 0x0000, 0x0078,
++      0x1dd2, 0xa006, 0x007c, 0x780c, 0xd0fc, 0x0040, 0x1ddd, 0x2001,
++      0x4007, 0x70db, 0x0001, 0x0078, 0x1dde, 0xa006, 0x007c, 0xac80,
++      0x0001, 0x1078, 0x205e, 0x007c, 0x7112, 0x7003, 0x0001, 0x7007,
++      0x0001, 0x2099, 0x0030, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0,
++      0x7008, 0xd0fc, 0x0040, 0x1df0, 0x7007, 0x0002, 0xa08c, 0x01e0,
++      0x00c0, 0x1e20, 0x53a5, 0x7888, 0xa005, 0x0040, 0x1e1f, 0x1078,
++      0x1e25, 0x0040, 0x1e0d, 0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80,
++      0x0001, 0x20a0, 0x53a5, 0x0078, 0x1e1f, 0x788b, 0x0000, 0x7218,
++      0x731c, 0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3,
++      0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e, 0x7422, 0x7526, 0xa006,
++      0x7003, 0x0000, 0x7007, 0x0004, 0x007c, 0x2091, 0x8000, 0x7840,
++      0xa065, 0x0040, 0x1e2f, 0x2c04, 0x7842, 0x2063, 0x0000, 0x2091,
++      0x8001, 0x007c, 0x0f7e, 0x2079, 0x6000, 0x7840, 0xa06d, 0x0040,
++      0x1e41, 0x2d04, 0x7842, 0x6803, 0x0000, 0x6807, 0x0000, 0x680b,
++      0x0000, 0x0f7f, 0x007c, 0x2091, 0x8000, 0x0f7e, 0x2079, 0x6000,
++      0x7840, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1e50, 0x1078, 0x2bfa,
++      0x7842, 0x0f7f, 0x2091, 0x8001, 0x007c, 0x0f7e, 0x2079, 0x6000,
++      0x7840, 0x206a, 0x2d00, 0x7842, 0x0f7f, 0x007c, 0x2011, 0xac00,
++      0x7a42, 0x7bc8, 0x8319, 0x0040, 0x1e6b, 0xa280, 0x0037, 0x2012,
++      0x2010, 0x0078, 0x1e62, 0x2013, 0x0000, 0x007c, 0x017e, 0x2069,
++      0x85c0, 0xd7fc, 0x00c0, 0x1e76, 0x2069, 0x65c0, 0xa784, 0x0f00,
++      0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
++      0xad68, 0x017f, 0x007c, 0x1078, 0x1e6e, 0x2900, 0x682a, 0x2a00,
++      0x682e, 0x6808, 0xa084, 0xf9ef, 0xa80d, 0x690a, 0x0e7e, 0xd7fc,
++      0x00c0, 0x1e98, 0x2009, 0x6054, 0x2071, 0x6040, 0x0078, 0x1e9c,
++      0x2009, 0x6094, 0x2071, 0x6080, 0x210c, 0x6804, 0xa005, 0x0040,
++      0x1eac, 0xa116, 0x00c0, 0x1eac, 0x2060, 0x6000, 0x6806, 0x017e,
++      0x200b, 0x0000, 0x0078, 0x1eaf, 0x2009, 0x0000, 0x017e, 0x6804,
++      0xa065, 0x0040, 0x1ebe, 0x6000, 0x6806, 0x1078, 0x1ef5, 0x1078,
++      0x2240, 0x6810, 0x8001, 0x6812, 0x00c0, 0x1eaf, 0x017f, 0x6902,
++      0x6906, 0x2d00, 0x2060, 0x1078, 0x2d8b, 0x0e7f, 0x007c, 0xa065,
++      0x0040, 0x1eda, 0x2008, 0x609c, 0xa005, 0x0040, 0x1ed5, 0x2062,
++      0x609f, 0x0000, 0xa065, 0x0078, 0x1ecb, 0x2079, 0x6000, 0x7840,
++      0x7942, 0x2062, 0x007c, 0xa065, 0x0040, 0x1ef4, 0x2008, 0x609c,
++      0xa005, 0x0040, 0x1ee9, 0x2062, 0x609f, 0x0000, 0xa065, 0x0078,
++      0x1edf, 0x0f7e, 0x2079, 0x6000, 0x2091, 0x8000, 0x7840, 0x7942,
++      0x0f7f, 0x2062, 0x2091, 0x8001, 0x007c, 0x6007, 0x0103, 0x608f,
++      0x0000, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000,
++      0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0xd7fc,
++      0x00c0, 0x1f10, 0x2071, 0x6040, 0x2031, 0x60c0, 0x0078, 0x1f14,
++      0x2071, 0x6080, 0x2031, 0x62c0, 0x7054, 0xa08c, 0x0200, 0x00c0,
++      0x1f1e, 0xa608, 0x2d0a, 0x8000, 0x7056, 0xa006, 0x0e7f, 0x007c,
++      0x0f7e, 0xd7fc, 0x00c0, 0x1f28, 0x2079, 0x6040, 0x0078, 0x1f2a,
++      0x2079, 0x6080, 0x1078, 0x1e6e, 0x2091, 0x8000, 0x6804, 0x7806,
++      0xa065, 0x0040, 0x1f77, 0x0078, 0x1f3b, 0x2c00, 0x7806, 0x6000,
++      0xa065, 0x0040, 0x1f77, 0x6010, 0xa306, 0x00c0, 0x1f35, 0x600c,
++      0xa206, 0x00c0, 0x1f35, 0x2c28, 0x7850, 0xac06, 0x00c0, 0x1f4a,
++      0x0078, 0x1f74, 0x6804, 0xac06, 0x00c0, 0x1f58, 0x6000, 0x2060,
++      0x6806, 0xa005, 0x00c0, 0x1f58, 0x6803, 0x0000, 0x0078, 0x1f62,
++      0x6400, 0x7804, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1f62,
++      0x2c00, 0x6802, 0x2560, 0x0f7f, 0x1078, 0x1ef5, 0x0f7e, 0x601b,
++      0x0005, 0x6023, 0x0020, 0x0f7f, 0x1078, 0x2240, 0x0f7e, 0x6810,
++      0x8001, 0x1050, 0x2bfa, 0x6812, 0xa085, 0xffff, 0xa005, 0x0f7f,
++      0x007c, 0x077e, 0x2700, 0x2039, 0x0000, 0xd0fc, 0x0040, 0x1f81,
++      0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x2091,
++      0x8000, 0x1078, 0x1e83, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1f89,
++      0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0,
++      0x1f89, 0x2091, 0x8001, 0x077f, 0x007c, 0x2061, 0x0000, 0x6018,
++      0xa084, 0x0001, 0x00c0, 0x1fbe, 0x7808, 0xd08c, 0x0040, 0x1faf,
++      0xc08c, 0x780a, 0xc7fc, 0x2069, 0x6040, 0x0078, 0x1fb4, 0xc08d,
++      0x780a, 0x2069, 0x6080, 0xc7fd, 0x2091, 0x8000, 0x6818, 0x681b,
++      0x0000, 0x2091, 0x8001, 0xa005, 0x00c0, 0x1fbf, 0x007c, 0xa08c,
++      0xfff0, 0x0040, 0x1fc5, 0x1078, 0x2bfa, 0x0079, 0x1fc7, 0x1fd7,
++      0x1fda, 0x1fe0, 0x1fe4, 0x1fd8, 0x1fe8, 0x1fee, 0x1fd8, 0x1fd8,
++      0x2193, 0x21c4, 0x21c8, 0x21ce, 0x1fd8, 0x1fd8, 0x1fd8, 0x007c,
++      0x1078, 0x2bfa, 0x1078, 0x1f79, 0x2001, 0x8001, 0x0078, 0x21e3,
++      0x2001, 0x8003, 0x0078, 0x21e3, 0x2001, 0x8004, 0x0078, 0x21e3,
++      0x1078, 0x1f79, 0x2001, 0x8006, 0x0078, 0x21e3, 0x2001, 0x8007,
++      0x0078, 0x21e3, 0x2030, 0x2138, 0xa782, 0x0021, 0x0048, 0x1ffa,
++      0x2009, 0x0020, 0x2600, 0x1078, 0x2014, 0x00c0, 0x2013, 0xa7ba,
++      0x0020, 0x0048, 0x2012, 0x0040, 0x2012, 0x2708, 0xa6b0, 0x0020,
++      0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
++      0x0078, 0x1ff4, 0xa006, 0x007c, 0x81ff, 0x0040, 0x2039, 0x2099,
++      0x0030, 0x20a0, 0x700c, 0xa084, 0x03ff, 0x0040, 0x2026, 0x7007,
++      0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x2021, 0x21a8, 0x810b,
++      0x7112, 0x7003, 0x0001, 0x7007, 0x0001, 0x7008, 0x800b, 0x00c8,
++      0x202d, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0, 0x2039, 0x53a5,
++      0xa006, 0x7003, 0x0000, 0x007c, 0x2030, 0x2138, 0xa782, 0x0021,
++      0x0048, 0x2044, 0x2009, 0x0020, 0x2600, 0x1078, 0x205e, 0x00c0,
++      0x205d, 0xa7ba, 0x0020, 0x0048, 0x205c, 0x0040, 0x205c, 0x2708,
++      0xa6b0, 0x0020, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000,
++      0xa5a9, 0x0000, 0x0078, 0x203e, 0xa006, 0x007c, 0x81ff, 0x0040,
++      0x2096, 0x2098, 0x20a1, 0x0030, 0x700c, 0xa084, 0x03ff, 0x0040,
++      0x2069, 0x21a8, 0x810b, 0x7112, 0x7018, 0x007e, 0x701c, 0x007e,
++      0x7020, 0x007e, 0x7024, 0x007e, 0x721a, 0x731e, 0x7422, 0x7526,
++      0x7003, 0x0000, 0x53a6, 0x7007, 0x0001, 0x7010, 0xa084, 0xf000,
++      0x0040, 0x2086, 0x7007, 0x0008, 0x0078, 0x208a, 0x7108, 0x8103,
++      0x00c8, 0x207d, 0x007f, 0x7026, 0x007f, 0x7022, 0x007f, 0x701e,
++      0x007f, 0x701a, 0x7007, 0x0002, 0xa184, 0x01e0, 0x7003, 0x0000,
++      0x7007, 0x0004, 0x007c, 0x0e7e, 0x6914, 0xd1fc, 0x0040, 0x20a4,
++      0x2071, 0x6080, 0x0078, 0x20a6, 0x2071, 0x6040, 0x2d08, 0x70b4,
++      0x6802, 0xa005, 0x00c0, 0x20ad, 0x71ba, 0x71b6, 0x0e7f, 0x007c,
++      0x0f7e, 0x6114, 0xd1fc, 0x0040, 0x20b9, 0x2079, 0x6080, 0x0078,
++      0x20bb, 0x2079, 0x6040, 0x2c08, 0x78b4, 0x6002, 0xa005, 0x00c0,
++      0x20c2, 0x79ba, 0x79b6, 0x0f7f, 0x007c, 0x2091, 0x8000, 0x0f7e,
++      0x6114, 0xd1fc, 0x0040, 0x20d0, 0x2079, 0x6080, 0x0078, 0x20d2,
++      0x2079, 0x6040, 0x6003, 0x0000, 0x2c08, 0x78b8, 0xa065, 0x00c0,
++      0x20dc, 0x79b6, 0x0078, 0x20dd, 0x6102, 0x79ba, 0x0f7f, 0x2091,
++      0x8001, 0x1078, 0x2885, 0x007c, 0x70b4, 0xa06d, 0x0040, 0x20ef,
++      0x6800, 0x70b6, 0xa005, 0x00c0, 0x20ee, 0x70ba, 0x8dff, 0x007c,
++      0x0d7e, 0x0c7e, 0x0f7e, 0xd3fc, 0x0040, 0x20fa, 0x2079, 0x6080,
++      0x0078, 0x20fc, 0x2079, 0x6040, 0xaf80, 0x002d, 0x2060, 0x6000,
++      0xa005, 0x0040, 0x2125, 0x2068, 0x6814, 0xa306, 0x00c0, 0x210e,
++      0x6828, 0xa084, 0x00ff, 0xa406, 0x0040, 0x2111, 0x2d60, 0x0078,
++      0x20ff, 0x6800, 0xa005, 0x6002, 0x00c0, 0x211d, 0xaf80, 0x002d,
++      0xac06, 0x0040, 0x211c, 0x2c00, 0x78ba, 0x0d7e, 0x689c, 0xa005,
++      0x0040, 0x2124, 0x1078, 0x1ec7, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f,
++      0xa005, 0x007c, 0x0d7e, 0x0c7e, 0x0f7e, 0xd0fc, 0x0040, 0x2134,
++      0x2079, 0x6080, 0x0078, 0x2136, 0x2079, 0x6040, 0xaf80, 0x002d,
++      0x2060, 0x6000, 0xa005, 0x0040, 0x215b, 0x2068, 0x6814, 0xa084,
++      0x00ff, 0xa306, 0x0040, 0x2147, 0x2d60, 0x0078, 0x2139, 0x6800,
++      0xa005, 0x6002, 0x00c0, 0x2153, 0xaf80, 0x002d, 0xac06, 0x0040,
++      0x2152, 0x2c00, 0x78ba, 0x0d7e, 0x689c, 0xa005, 0x0040, 0x215a,
++      0x1078, 0x1ec7, 0x007f, 0x0f7f, 0x0c7f, 0x0d7f, 0xa005, 0x007c,
++      0x0d7e, 0x0c7e, 0x0f7e, 0xd3fc, 0x0040, 0x216a, 0x2079, 0x6080,
++      0x0078, 0x216c, 0x2079, 0x6040, 0xaf80, 0x002d, 0x2060, 0x6000,
++      0xa06d, 0x0040, 0x218e, 0x6814, 0xa306, 0x0040, 0x217a, 0x2d60,
++      0x0078, 0x216f, 0x6800, 0xa005, 0x6002, 0x00c0, 0x2186, 0xaf80,
++      0x002d, 0xac06, 0x0040, 0x2185, 0x2c00, 0x78ba, 0x0d7e, 0x689c,
++      0xa005, 0x0040, 0x218d, 0x1078, 0x1ec7, 0x007f, 0x0f7f, 0x0c7f,
++      0x0d7f, 0xa005, 0x007c, 0x2091, 0x8000, 0xd7fc, 0x00c0, 0x219c,
++      0x2069, 0x6040, 0x0078, 0x219e, 0x2069, 0x6080, 0x6800, 0xa086,
++      0x0000, 0x0040, 0x21a8, 0x2091, 0x8001, 0x681b, 0x0009, 0x007c,
++      0x6878, 0xd7fc, 0x00c0, 0x21ae, 0x0078, 0x21af, 0xc0fd, 0xa0bc,
++      0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078,
++      0x1e83, 0x8738, 0xa784, 0x001f, 0x00c0, 0x21b7, 0x2091, 0x8001,
++      0x2001, 0x800a, 0x0078, 0x21e3, 0x2001, 0x800c, 0x0078, 0x21e3,
++      0x1078, 0x1f79, 0x2001, 0x800d, 0x0078, 0x21e3, 0x780c, 0xd0e4,
++      0x00c0, 0x21e1, 0xd0ec, 0x0040, 0x21db, 0xd7fc, 0x0040, 0x21db,
++      0x78e8, 0x0078, 0x21dc, 0x78e4, 0x70c6, 0x2001, 0x800e, 0x0078,
++      0x21e3, 0x0078, 0x1fd8, 0x70c2, 0xd7fc, 0x00c0, 0x21eb, 0x70db,
++      0x0000, 0x0078, 0x21ed, 0x70db, 0x0001, 0x2061, 0x0000, 0x601b,
++      0x0001, 0x2091, 0x4080, 0x007c, 0xac80, 0x0001, 0x81ff, 0x0040,
++      0x221f, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x03ff, 0x0040,
++      0x2201, 0x7018, 0x007e, 0x701c, 0x007e, 0x7020, 0x007e, 0x7024,
++      0x007e, 0x7112, 0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003,
++      0x0001, 0x7007, 0x0001, 0x7008, 0x800b, 0x00c8, 0x2213, 0x7007,
++      0x0002, 0xa08c, 0x01e0, 0x00c0, 0x221f, 0x53a5, 0xa006, 0x7003,
++      0x0000, 0x7007, 0x0004, 0x007f, 0x7026, 0x007f, 0x7022, 0x007f,
++      0x701e, 0x007f, 0x701a, 0x007c, 0x2011, 0x0020, 0x2009, 0x0010,
++      0x6b0a, 0x6c0e, 0x6803, 0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00,
++      0xa0e8, 0x0008, 0xa290, 0x0004, 0x8109, 0x00c0, 0x2230, 0x007c,
++      0x6004, 0x2c08, 0x2063, 0x0000, 0x7860, 0x8000, 0x7862, 0x7864,
++      0xa005, 0x7966, 0x0040, 0x224f, 0x2c02, 0x0078, 0x2250, 0x796a,
++      0x007c, 0x6807, 0x0103, 0x0c7e, 0x2061, 0x6000, 0x2d08, 0x206b,
++      0x0000, 0x6060, 0x8000, 0x6062, 0x6064, 0xa005, 0x6166, 0x0040,
++      0x2264, 0x2d02, 0x0078, 0x2265, 0x616a, 0x0c7f, 0x007c, 0x2091,
++      0x8000, 0x7860, 0x8001, 0x7862, 0x2c04, 0x786a, 0xa005, 0x00c0,
++      0x2272, 0x7866, 0x2091, 0x8001, 0x609c, 0xa005, 0x0040, 0x228f,
++      0x0c7e, 0x2060, 0x2008, 0x609c, 0xa005, 0x0040, 0x2287, 0x2062,
++      0x609f, 0x0000, 0xa065, 0x609c, 0xa005, 0x00c0, 0x227f, 0x2091,
++      0x8000, 0x7840, 0x7942, 0x2062, 0x2091, 0x8001, 0x0c7f, 0x2091,
++      0x8000, 0x7840, 0x2062, 0x609f, 0x0000, 0x2c00, 0xa005, 0x00c0,
++      0x229b, 0x1078, 0x2bfa, 0x7842, 0x2091, 0x8001, 0x007c, 0x7868,
++      0xa065, 0x0040, 0x22b1, 0x2091, 0x8000, 0x7860, 0x8001, 0x7862,
++      0x2c04, 0x786a, 0xa005, 0x00c0, 0x22af, 0x7866, 0x8000, 0x2091,
++      0x8001, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e,
++      0x00c8, 0x22bb, 0xa200, 0x00f0, 0x22b6, 0x8086, 0x818e, 0x007c,
++      0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x22e1, 0xa11a, 0x00c8,
++      0x22e1, 0x8213, 0x818d, 0x0048, 0x22d4, 0xa11a, 0x00c8, 0x22d5,
++      0x00f0, 0x22c9, 0x0078, 0x22d9, 0xa11a, 0x2308, 0x8210, 0x00f0,
++      0x22c9, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f,
++      0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x22dd, 0x7d70,
++      0x70d0, 0xa506, 0x0040, 0x237c, 0x7808, 0xd0ec, 0x0040, 0x2304,
++      0x0e7e, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0,
++      0x2301, 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x2304, 0x0078,
++      0x237c, 0x0e7f, 0x0078, 0x237c, 0x1078, 0x1e25, 0x0040, 0x237c,
++      0x796c, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x2313,
++      0xa006, 0x0078, 0x231b, 0x72d0, 0xa206, 0x0040, 0x231b, 0x788b,
++      0x0001, 0x2009, 0x0080, 0x0c7e, 0x1078, 0x1de4, 0x0c7f, 0x0040,
++      0x2364, 0x1078, 0x1e43, 0x788b, 0x0000, 0x7884, 0x8000, 0x7886,
++      0xa086, 0x0002, 0x0040, 0x2342, 0x8507, 0x8004, 0x8004, 0x7978,
++      0xa108, 0x711a, 0x00c8, 0x2340, 0x7974, 0xa189, 0x0000, 0x711e,
++      0x7980, 0xa189, 0x0000, 0x7122, 0x797c, 0xa189, 0x0000, 0x7126,
++      0x0078, 0x237c, 0x6014, 0xd0fc, 0x00c0, 0x234a, 0x2069, 0x6040,
++      0x0078, 0x234c, 0x2069, 0x6080, 0x2091, 0x8000, 0x681b, 0x0002,
++      0x7888, 0xa005, 0x0040, 0x235a, 0x788b, 0x0000, 0x788c, 0x2060,
++      0x0078, 0x2342, 0x7887, 0x0000, 0x78b0, 0xa085, 0x0003, 0x78b2,
++      0x2091, 0x8001, 0x0078, 0x237c, 0x7887, 0x0000, 0x1078, 0x2721,
++      0x6004, 0xa084, 0x000f, 0x1078, 0x237d, 0x7888, 0xa005, 0x0040,
++      0x2378, 0x788c, 0x2060, 0x6004, 0xa084, 0x000f, 0x1078, 0x237d,
++      0x788b, 0x0000, 0x0078, 0x22e7, 0x007c, 0x0079, 0x237f, 0x238f,
++      0x23ad, 0x23cd, 0x238f, 0x23ea, 0x239e, 0x2564, 0x257b, 0x238f,
++      0x23ab, 0x23cb, 0x2434, 0x24aa, 0x2502, 0x2514, 0x257b, 0x2039,
++      0x0400, 0x78c0, 0xa705, 0x78c2, 0x6008, 0xa705, 0x600a, 0x1078,
++      0x25ff, 0x609c, 0x78be, 0x1078, 0x2709, 0x007c, 0x78c0, 0xa084,
++      0x0100, 0x0040, 0x23a5, 0x0078, 0x238f, 0x601c, 0xa085, 0x0080,
++      0x601e, 0x0078, 0x23b4, 0x1078, 0x2750, 0x78c0, 0xa084, 0x0100,
++      0x0040, 0x23b4, 0x0078, 0x238f, 0x78c3, 0x0000, 0x6004, 0x8007,
++      0xa084, 0x00ff, 0x78b6, 0x8001, 0x0040, 0x23c8, 0x1078, 0x25ff,
++      0x0040, 0x23c8, 0x78c0, 0xa085, 0x0100, 0x78c2, 0x0078, 0x23ca,
++      0x0078, 0x261f, 0x007c, 0x1078, 0x274c, 0x78c0, 0xa08c, 0x0e00,
++      0x00c0, 0x23d6, 0xa084, 0x0100, 0x00c0, 0x23d8, 0x0078, 0x238f,
++      0x1078, 0x25ff, 0x00c0, 0x23e9, 0x6104, 0xa18c, 0x00ff, 0xa186,
++      0x0007, 0x0040, 0x25c0, 0xa186, 0x000f, 0x0040, 0x25c0, 0x0078,
++      0x261f, 0x007c, 0x78c0, 0xa084, 0x0100, 0x0040, 0x23f1, 0x0078,
++      0x238f, 0x78c3, 0x0000, 0x6714, 0x1078, 0x1e6e, 0x2011, 0x0001,
++      0x20a9, 0x0001, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, 0x2416,
++      0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001,
++      0x0040, 0x2416, 0xa7bc, 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100,
++      0xa08e, 0x0002, 0x0040, 0x2416, 0x0078, 0x2431, 0x157e, 0x1078,
++      0x1e6e, 0x157f, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
++      0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001,
++      0x00f0, 0x241a, 0x8211, 0x0040, 0x2431, 0x20a9, 0x0100, 0x0078,
++      0x241a, 0x1078, 0x1e43, 0x007c, 0x6114, 0x1078, 0x276d, 0x6900,
++      0xa184, 0x0001, 0x0040, 0x244e, 0x6028, 0xa084, 0x00ff, 0x00c0,
++      0x25df, 0x6800, 0xa084, 0x0001, 0x0040, 0x25e7, 0x6803, 0x0000,
++      0x680b, 0x0000, 0x6807, 0x0000, 0x0078, 0x25ef, 0x2011, 0x0001,
++      0x6020, 0xd0f4, 0x0040, 0x2456, 0xa295, 0x0002, 0xd0c4, 0x0040,
++      0x245b, 0xa295, 0x0008, 0xd0cc, 0x0040, 0x2460, 0xa295, 0x0400,
++      0x601c, 0xa084, 0x0002, 0x0040, 0x2467, 0xa295, 0x0004, 0x602c,
++      0xa08c, 0x00ff, 0xa182, 0x0002, 0x0048, 0x25eb, 0xa182, 0x001b,
++      0x00c8, 0x25eb, 0x0040, 0x25eb, 0x690e, 0x602c, 0x8007, 0xa08c,
++      0x00ff, 0xa182, 0x0002, 0x0048, 0x25eb, 0xa182, 0x001b, 0x00c8,
++      0x25eb, 0x0040, 0x25eb, 0x6912, 0x6134, 0xa184, 0x000f, 0x0040,
++      0x2491, 0x8000, 0xd0a4, 0x0040, 0x248e, 0x8001, 0xa18c, 0xfff0,
++      0xa10d, 0x6922, 0x6030, 0xa005, 0x00c0, 0x2498, 0x2001, 0x001e,
++      0x8000, 0x6816, 0x6028, 0xa084, 0x00ff, 0x0040, 0x25e7, 0x6806,
++      0x6028, 0x8007, 0xa084, 0x00ff, 0x0040, 0x25e7, 0x680a, 0x6a02,
++      0x0078, 0x25ef, 0x6014, 0xd0fc, 0x00c0, 0x24b2, 0x2001, 0x6064,
++      0x0078, 0x24b4, 0x2001, 0x60a4, 0x2004, 0xa084, 0x8000, 0x0040,
++      0x25e7, 0x6114, 0x1078, 0x276d, 0x2091, 0x8000, 0x6a04, 0x6b08,
++      0x6418, 0xa484, 0x0003, 0x0040, 0x24d8, 0x6128, 0xa18c, 0x00ff,
++      0x8001, 0x00c0, 0x24d1, 0x2100, 0xa210, 0x0048, 0x24fe, 0x0078,
++      0x24d8, 0x8001, 0x00c0, 0x24fe, 0x2100, 0xa212, 0x0048, 0x24fe,
++      0xa484, 0x000c, 0x0040, 0x24f2, 0x6128, 0x810f, 0xa18c, 0x00ff,
++      0xa082, 0x0004, 0x00c0, 0x24ea, 0x2100, 0xa318, 0x0048, 0x24fe,
++      0x0078, 0x24f2, 0xa082, 0x0004, 0x00c0, 0x24fe, 0x2100, 0xa31a,
++      0x0048, 0x24fe, 0x6030, 0xa005, 0x0040, 0x24f8, 0x8000, 0x6816,
++      0x6a06, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x25ef, 0x2091, 0x8001,
++      0x0078, 0x25eb, 0x6114, 0x1078, 0x276d, 0x2091, 0x8000, 0x6b08,
++      0x8318, 0x0048, 0x2510, 0x6b0a, 0x2091, 0x8001, 0x0078, 0x25fd,
++      0x2091, 0x8001, 0x0078, 0x25eb, 0x6024, 0x8007, 0xa084, 0x00ff,
++      0x0040, 0x253a, 0xa086, 0x0080, 0x00c0, 0x2562, 0x20a9, 0x0008,
++      0x6014, 0xd0fc, 0x00c0, 0x2528, 0x2069, 0xa7e0, 0x0078, 0x252a,
++      0x2069, 0xa900, 0x2091, 0x8000, 0x6800, 0xa084, 0xfcff, 0x6802,
++      0xade8, 0x0009, 0x0070, 0x2536, 0x0078, 0x252c, 0x2091, 0x8001,
++      0x0078, 0x25ef, 0x6028, 0xa015, 0x0040, 0x2562, 0x6114, 0x1078,
++      0x276d, 0x0d7e, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d,
++      0x0040, 0x255f, 0xa206, 0x0040, 0x2550, 0x2168, 0x0078, 0x2546,
++      0x0c7e, 0x2160, 0x6000, 0x6802, 0x1078, 0x1e43, 0x0c7f, 0x0d7f,
++      0x6808, 0x8000, 0x680a, 0x2091, 0x8001, 0x0078, 0x25fd, 0x2091,
++      0x8001, 0x0d7f, 0x0078, 0x25e7, 0x6114, 0x1078, 0x276d, 0x6800,
++      0xa084, 0x0001, 0x0040, 0x25d7, 0x2091, 0x8000, 0x6a04, 0x8210,
++      0x0048, 0x2577, 0x6a06, 0x2091, 0x8001, 0x0078, 0x25fd, 0x2091,
++      0x8001, 0x0078, 0x25eb, 0x6114, 0x1078, 0x276d, 0x60ce, 0x60bb,
++      0x0000, 0x6018, 0xa08c, 0xff00, 0x6820, 0xa084, 0x00ff, 0xa105,
++      0x601a, 0x6900, 0xa184, 0x0008, 0x0040, 0x2592, 0x6020, 0xa085,
++      0x0100, 0x6022, 0xa184, 0x0001, 0x0040, 0x25e7, 0xa184, 0x0100,
++      0x00c0, 0x25d3, 0xa184, 0x0200, 0x00c0, 0x25cf, 0x681c, 0xa005,
++      0x00c0, 0x25db, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000f, 0x00c0,
++      0x25ab, 0x1078, 0x2750, 0x78c3, 0x0000, 0x6004, 0x8007, 0xa084,
++      0x00ff, 0x78b6, 0x8001, 0x609f, 0x0000, 0x0040, 0x25c0, 0x1078,
++      0x25ff, 0x0040, 0x25c0, 0x78c0, 0xa085, 0x0100, 0x78c2, 0x007c,
++      0x78bb, 0x0000, 0x78bf, 0x0000, 0x6024, 0xa084, 0xff00, 0x6026,
++      0x1078, 0x4611, 0x00c0, 0x25cd, 0x007c, 0x0078, 0x20c5, 0x2009,
++      0x0017, 0x0078, 0x25f1, 0x2009, 0x000e, 0x0078, 0x25f1, 0x2009,
++      0x0007, 0x0078, 0x25f1, 0x2009, 0x0035, 0x0078, 0x25f1, 0x2009,
++      0x003e, 0x0078, 0x25f1, 0x2009, 0x0004, 0x0078, 0x25f1, 0x2009,
++      0x0006, 0x0078, 0x25f1, 0x2009, 0x0016, 0x0078, 0x25f1, 0x2009,
++      0x0001, 0x6024, 0xa084, 0xff00, 0xa105, 0x6026, 0x2091, 0x8000,
++      0x1078, 0x2240, 0x2091, 0x8001, 0x007c, 0x0078, 0x1e43, 0x609f,
++      0x0000, 0x78b8, 0xa06d, 0x2c00, 0x78ba, 0x00c0, 0x260a, 0x78be,
++      0x0078, 0x2612, 0x689e, 0x2d00, 0x6002, 0x78bc, 0xad06, 0x00c0,
++      0x2612, 0x6002, 0x78b4, 0x8001, 0x78b6, 0x00c0, 0x261e, 0x78c0,
++      0xa084, 0xfeff, 0x78c2, 0x78bc, 0x2060, 0xa006, 0x007c, 0x0e7e,
++      0xa02e, 0x2530, 0x65ae, 0x65b2, 0x601c, 0x60a2, 0x2048, 0xa984,
++      0xe1ff, 0x601e, 0xa984, 0x0060, 0x0040, 0x2630, 0x1078, 0x564a,
++      0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x6080, 0xd7fc,
++      0x00c0, 0x263c, 0x2071, 0x6040, 0xa784, 0x0f00, 0x800b, 0xa784,
++      0x001f, 0x0040, 0x2647, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105,
++      0x71e0, 0xa168, 0x2700, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003,
++      0x8003, 0x71e4, 0xa100, 0x60c6, 0x2091, 0x8000, 0x780c, 0xd0c4,
++      0x0040, 0x266c, 0xd0ec, 0x0040, 0x2668, 0xd7fc, 0x00c0, 0x2665,
++      0xd0f4, 0x00c0, 0x2673, 0x0078, 0x266c, 0xd0fc, 0x00c0, 0x2673,
++      0x7808, 0xd0f4, 0x00c0, 0x2673, 0x6e08, 0xd684, 0x0040, 0x26a1,
++      0xd9fc, 0x00c0, 0x26a1, 0x2091, 0x8001, 0x1078, 0x1ef5, 0x2091,
++      0x8000, 0x1078, 0x2240, 0x2091, 0x8001, 0x78bb, 0x0000, 0x78bf,
++      0x0000, 0x780c, 0xd0e4, 0x00c0, 0x2707, 0x780c, 0xd0c4, 0x0040,
++      0x2707, 0xd0ec, 0x0040, 0x2699, 0xd7fc, 0x00c0, 0x2694, 0xd0f4,
++      0x00c0, 0x269d, 0x0078, 0x2707, 0xd0fc, 0x00c0, 0x269d, 0x0078,
++      0x2707, 0x7808, 0xd0f4, 0x0040, 0x2707, 0x601b, 0x0021, 0x0078,
++      0x2707, 0x6024, 0xa096, 0x0001, 0x00c0, 0x26a8, 0x8000, 0x6026,
++      0x6a10, 0x6814, 0xa202, 0x0048, 0x26b7, 0x0040, 0x26b7, 0x2091,
++      0x8001, 0x2039, 0x0200, 0x1078, 0x2709, 0x0078, 0x2707, 0x2c08,
++      0xd9fc, 0x0040, 0x26df, 0x6800, 0xa065, 0x0040, 0x26df, 0x6a04,
++      0x7000, 0xa084, 0x0002, 0x0040, 0x26d5, 0x7050, 0xa206, 0x00c0,
++      0x26d5, 0x6b04, 0x2160, 0x2304, 0x6002, 0xa005, 0x00c0, 0x26d1,
++      0x6902, 0x2260, 0x6102, 0x0078, 0x26eb, 0x2d00, 0x2060, 0x1078,
++      0x2d8b, 0x6e08, 0x2160, 0x6202, 0x6906, 0x0078, 0x26eb, 0x6800,
++      0x6902, 0xa065, 0x0040, 0x26e7, 0x6102, 0x0078, 0x26e8, 0x6906,
++      0x2160, 0x6003, 0x0000, 0x2160, 0xd9fc, 0x0040, 0x26f6, 0xa6b4,
++      0xffdc, 0x6e0a, 0x682b, 0x0000, 0x682f, 0x0000, 0x6810, 0x8000,
++      0x6812, 0x2091, 0x8001, 0xd6b4, 0x0040, 0x2703, 0xa6b6, 0x0040,
++      0x6e0a, 0x1078, 0x1f06, 0x78bf, 0x0000, 0x78bb, 0x0000, 0x0e7f,
++      0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x2240,
++      0x2091, 0x8001, 0x78bc, 0xa065, 0x0040, 0x271c, 0x609c, 0x78be,
++      0x609f, 0x0000, 0x0078, 0x270c, 0x78bb, 0x0000, 0x78bf, 0x0000,
++      0x007c, 0x796c, 0x7870, 0x7b88, 0xd384, 0x0040, 0x272b, 0x8000,
++      0xa112, 0x0048, 0x2730, 0xc384, 0x8000, 0xa112, 0x00c8, 0x273d,
++      0x7a78, 0x721a, 0x7a74, 0x721e, 0x7a80, 0x7222, 0x7a7c, 0x7226,
++      0xa006, 0xd384, 0x0040, 0x273d, 0x8000, 0x7872, 0x70d2, 0x7814,
++      0xa005, 0x0040, 0x274b, 0x8001, 0x7816, 0x00c0, 0x274b, 0x0068,
++      0x274b, 0x2091, 0x4080, 0x007c, 0x2039, 0x2764, 0x0078, 0x2752,
++      0x2039, 0x276a, 0x2704, 0xa005, 0x0040, 0x2763, 0xac00, 0x2068,
++      0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e,
++      0x8738, 0x0078, 0x2752, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015,
++      0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x0c7e, 0x6014, 0x1078,
++      0x47fa, 0x2c68, 0x0c7f, 0x007c, 0x78af, 0x0000, 0x2009, 0x6001,
++      0x2104, 0xd084, 0x0040, 0x27a3, 0x6004, 0xa086, 0x0103, 0x00c0,
++      0x27a3, 0x6114, 0x6018, 0xa105, 0x00c0, 0x27a3, 0x0d7e, 0x2069,
++      0x0000, 0x6818, 0xd084, 0x00c0, 0x27a2, 0x600c, 0x70c6, 0x6010,
++      0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, 0x4080, 0x0d7f,
++      0x1078, 0x2267, 0x0068, 0x27d7, 0x7868, 0xa065, 0x00c0, 0x2776,
++      0x0078, 0x27d7, 0x0d7f, 0x1078, 0x27da, 0x0040, 0x27d2, 0x6204,
++      0xa294, 0x00ff, 0xa296, 0x0003, 0x0040, 0x27b5, 0x6204, 0xa296,
++      0x0110, 0x00c0, 0x27c3, 0x78af, 0x0001, 0x6204, 0xa294, 0xff00,
++      0x8217, 0x8211, 0x0040, 0x27c3, 0x85ff, 0x00c0, 0x27d2, 0x8210,
++      0xa202, 0x00c8, 0x27d2, 0x057e, 0x1078, 0x27e9, 0x057f, 0x00c0,
++      0x27d2, 0x8528, 0x78ac, 0xa005, 0x00c0, 0x27d2, 0x7868, 0xa065,
++      0x00c0, 0x2776, 0x85ff, 0x0040, 0x27d9, 0x2091, 0x4080, 0x7894,
++      0x70d6, 0x007c, 0x7b90, 0x7994, 0x70d4, 0xa102, 0x00c0, 0x27e3,
++      0x2300, 0xa005, 0x007c, 0x0048, 0x27e7, 0xa302, 0x007c, 0x8002,
++      0x007c, 0xa184, 0xff00, 0x0040, 0x27f6, 0x810f, 0x810c, 0x810c,
++      0x8004, 0x8004, 0x8007, 0xa100, 0x0078, 0x27f9, 0x8107, 0x8004,
++      0x8004, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0, 0xa210, 0xa006, 0xa319,
++      0xa421, 0xa529, 0x2009, 0x0020, 0x6004, 0xa086, 0x0103, 0x00c0,
++      0x280f, 0x6028, 0xa005, 0x00c0, 0x280f, 0x2009, 0x000c, 0x1078,
++      0x1ddf, 0x0040, 0x2832, 0x78a8, 0x8000, 0x78aa, 0xa086, 0x0002,
++      0x00c0, 0x2840, 0x6014, 0xd0fc, 0x00c0, 0x2822, 0x2069, 0x6040,
++      0x0078, 0x2824, 0x2069, 0x6080, 0x2091, 0x8000, 0x681b, 0x0003,
++      0x78ab, 0x0000, 0x78b0, 0xa085, 0x0300, 0x78b2, 0x2091, 0x8001,
++      0x0078, 0x2840, 0x78ab, 0x0000, 0x1078, 0x2267, 0x7990, 0x7894,
++      0x8000, 0xa10a, 0x00c8, 0x283d, 0xa006, 0x7896, 0x70d6, 0xa006,
++      0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x2138, 0xd7fc, 0x00c0,
++      0x284d, 0x2009, 0x605a, 0x0078, 0x284f, 0x2009, 0x609a, 0x2091,
++      0x8000, 0x200a, 0x0f7e, 0xd7fc, 0x00c0, 0x2866, 0x2009, 0x6040,
++      0x2001, 0x6002, 0x2004, 0xd0ec, 0x0040, 0x2862, 0x2079, 0x0100,
++      0x0078, 0x286a, 0x2079, 0x0200, 0x0078, 0x286a, 0x2009, 0x6080,
++      0x2079, 0x0100, 0x2104, 0xa086, 0x0000, 0x00c0, 0x2883, 0xd7fc,
++      0x00c0, 0x2876, 0x2009, 0x6044, 0x0078, 0x2878, 0x2009, 0x6084,
++      0x2104, 0xa005, 0x00c0, 0x2883, 0x7830, 0xa084, 0x00c0, 0x00c0,
++      0x2883, 0x781b, 0x004b, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x2c00,
++      0xa005, 0x00c0, 0x2890, 0xa188, 0x0005, 0x2104, 0x0078, 0x2891,
++      0x6014, 0xd0fc, 0x00c0, 0x28a4, 0x2071, 0x6040, 0x2001, 0x6002,
++      0x2004, 0xd0ec, 0x0040, 0x28a0, 0x2079, 0x0100, 0x0078, 0x28a8,
++      0x2079, 0x0200, 0x0078, 0x28a8, 0x2071, 0x6080, 0x2079, 0x0100,
++      0x2091, 0x8000, 0x7000, 0xa086, 0x0000, 0x00c0, 0x28da, 0x0078,
++      0x28ce, 0x2c00, 0xa005, 0x00c0, 0x28ba, 0xa188, 0x0005, 0x2104,
++      0x0078, 0x28bb, 0x6014, 0xd0fc, 0x00c0, 0x28cc, 0x2001, 0x6002,
++      0x2004, 0xd0ec, 0x0040, 0x28c8, 0x2079, 0x0100, 0x0078, 0x28ce,
++      0x2079, 0x0200, 0x0078, 0x28ce, 0x2079, 0x0100, 0x7830, 0xa084,
++      0x00c0, 0x00c0, 0x28da, 0x2c00, 0xa005, 0x00c0, 0x28d8, 0x2104,
++      0x781b, 0x004d, 0x2091, 0x8001, 0x0e7f, 0x0f7f, 0x007c, 0x2009,
++      0x0002, 0x2069, 0x6000, 0x6808, 0xd0ec, 0x00c0, 0x2942, 0x2071,
++      0x6080, 0x2079, 0x0100, 0x2021, 0x62bf, 0x784b, 0x000f, 0x0098,
++      0x28fb, 0x7838, 0x0078, 0x28ed, 0x784b, 0x000f, 0x00a8, 0x28fb,
++      0x7838, 0x0078, 0x28f4, 0x20a9, 0x0060, 0x789b, 0x0000, 0x78af,
++      0x0000, 0x78af, 0x0000, 0x00f0, 0x28ff, 0x70ab, 0x009d, 0x2019,
++      0x5df1, 0x1078, 0x2958, 0x680c, 0xd0e4, 0x0040, 0x2919, 0x789b,
++      0x0020, 0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x1020, 0x00f0,
++      0x2913, 0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, 0x0000, 0x0040,
++      0x2922, 0xc1bd, 0x1078, 0x2b31, 0x017f, 0x701c, 0xa084, 0x000f,
++      0x007e, 0x680c, 0xd0e4, 0x007f, 0x00c0, 0x2932, 0xa085, 0x6340,
++      0x0078, 0x2934, 0xa085, 0x62c0, 0x7806, 0x780f, 0xb204, 0x7843,
++      0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x704f, 0x0008, 0x745a,
++      0x7057, 0x0000, 0x8109, 0x0040, 0x2957, 0x2071, 0x6040, 0x6808,
++      0xd0ec, 0x0040, 0x2951, 0x2079, 0x0100, 0x2021, 0x60bf, 0x0078,
++      0x28ed, 0x2079, 0x0200, 0x2021, 0x60bf, 0x0078, 0x28f4, 0x007c,
++      0x137e, 0x147e, 0x157e, 0x047e, 0xaf80, 0x002b, 0x20a0, 0x2304,
++      0xa005, 0x789a, 0x0040, 0x2979, 0x8318, 0x2324, 0x8318, 0x2398,
++      0x24a8, 0xa484, 0xff00, 0x0040, 0x2971, 0xa482, 0x0100, 0x20a9,
++      0x0100, 0x2020, 0x53a6, 0xa005, 0x00c0, 0x2968, 0x3318, 0x0078,
++      0x295f, 0x047f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0f7e,
++      0xd1bc, 0x00c0, 0x2993, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x298f, 0x2079, 0x0100, 0x0078, 0x2995, 0x2079,
++      0x0200, 0x0078, 0x2995, 0x2079, 0x0100, 0xa18c, 0x000f, 0x7804,
++      0xa084, 0xfff0, 0xa105, 0x7806, 0x0f7f, 0x017f, 0x1078, 0x2b31,
++      0x007c, 0xd3fc, 0x00c0, 0x29b4, 0x007e, 0x2001, 0x6002, 0x2004,
++      0xd0ec, 0x007f, 0x0040, 0x29b0, 0x2011, 0x0101, 0x0078, 0x29b6,
++      0x2011, 0x0201, 0x0078, 0x29b6, 0x2011, 0x0101, 0x20a9, 0x0009,
++      0x810b, 0x00f0, 0x29b8, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff,
++      0xa105, 0x2012, 0x007c, 0x2019, 0x0002, 0x2001, 0x6002, 0x2004,
++      0xd0ec, 0x0040, 0x29d0, 0x8319, 0x2009, 0x0101, 0x0078, 0x29d2,
++      0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x00f0, 0x29d4, 0xa294,
++      0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0040,
++      0x29e5, 0x2009, 0x0201, 0x0078, 0x29d2, 0x007c, 0xd3fc, 0x00c0,
++      0x29f9, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++      0x29f5, 0x2011, 0x0101, 0x0078, 0x29fb, 0x2011, 0x0201, 0x0078,
++      0x29fb, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x00f0, 0x29fd,
++      0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c,
++      0xd3fc, 0x00c0, 0x2a1b, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x2a17, 0x2011, 0x0102, 0x0078, 0x2a1d, 0x2011,
++      0x0202, 0x0078, 0x2a1d, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf,
++      0xa105, 0x2012, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x2a37, 0x007e,
++      0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2a33, 0x2061,
++      0x0100, 0x0078, 0x2a39, 0x2061, 0x0200, 0x0078, 0x2a39, 0x2061,
++      0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x62ac,
++      0x63ac, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x2a57, 0x007e,
++      0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2a53, 0x2061,
++      0x0100, 0x0078, 0x2a59, 0x2061, 0x0200, 0x0078, 0x2a59, 0x2061,
++      0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4,
++      0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0,
++      0x2a79, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++      0x2a75, 0x2061, 0x0100, 0x0078, 0x2a7b, 0x2061, 0x0200, 0x0078,
++      0x2a7b, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022,
++      0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x0c7e,
++      0xd1bc, 0x00c0, 0x2a9b, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x2a97, 0x2061, 0x0100, 0x0078, 0x2a9d, 0x2061,
++      0x0200, 0x0078, 0x2a9d, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003,
++      0xa080, 0x0020, 0x609a, 0x60a4, 0xd2ac, 0x0040, 0x2aa9, 0xc2ac,
++      0xc3f5, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c,
++      0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x2b0f,
++      0xd1fc, 0x00c0, 0x2abf, 0x2061, 0xa6c0, 0x0078, 0x2ac1, 0x2061,
++      0xa7d0, 0x1078, 0x2b17, 0x0040, 0x2af4, 0x20a9, 0x0101, 0xd1fc,
++      0x00c0, 0x2ace, 0x2061, 0xa5c0, 0x0078, 0x2ad0, 0x2061, 0xa6d0,
++      0x0c7e, 0x1078, 0x2b17, 0x0040, 0x2adb, 0x0c7f, 0x8c60, 0x00f0,
++      0x2ad0, 0x0078, 0x2b0f, 0x007f, 0xd1fc, 0x00c0, 0x2ae5, 0x2071,
++      0x6040, 0xa082, 0xa5c0, 0x0078, 0x2ae9, 0x2071, 0x6080, 0xa082,
++      0xa6d0, 0x707e, 0x717a, 0x2001, 0x0004, 0x706a, 0x7087, 0x000f,
++      0x1078, 0x2845, 0x0078, 0x2b0b, 0x60d0, 0xa005, 0x00c0, 0x2b0f,
++      0xd1fc, 0x00c0, 0x2aff, 0x2071, 0x6040, 0x0078, 0x2b01, 0x2071,
++      0x6080, 0x717a, 0x2c00, 0x7082, 0x2001, 0x0006, 0x706a, 0x7087,
++      0x000f, 0x1078, 0x2845, 0x2001, 0x0000, 0x0078, 0x2b11, 0x2001,
++      0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2c04,
++      0xa005, 0x0040, 0x2b2e, 0x2060, 0x6010, 0xa306, 0x00c0, 0x2b2b,
++      0x600c, 0xa206, 0x00c0, 0x2b2b, 0x6014, 0xa106, 0x00c0, 0x2b2b,
++      0xa006, 0x0078, 0x2b30, 0x6000, 0x0078, 0x2b18, 0xa085, 0x0001,
++      0x007c, 0x0f7e, 0x0e7e, 0x017e, 0xd1bc, 0x00c0, 0x2b49, 0x2079,
++      0x6040, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++      0x2b45, 0x2071, 0x0100, 0x0078, 0x2b4d, 0x2071, 0x0200, 0x0078,
++      0x2b4d, 0x2079, 0x6080, 0x2071, 0x0100, 0x791c, 0xa18c, 0x000f,
++      0x70ec, 0xa084, 0x0100, 0x007f, 0x0040, 0x2b64, 0x810b, 0x810b,
++      0x810b, 0x810b, 0xd0bc, 0x00c0, 0x2b61, 0xa18d, 0x0f00, 0x0078,
++      0x2b63, 0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, 0x007c, 0x2001,
++      0x6001, 0x2004, 0xd0ac, 0x00c0, 0x2b78, 0x68e4, 0xa08c, 0x0020,
++      0x0040, 0x2b78, 0xa084, 0x0006, 0x00c0, 0x2b78, 0x1078, 0x2b79,
++      0x007c, 0x6014, 0x0e7e, 0x037e, 0x2018, 0x2071, 0x6540, 0xd0fc,
++      0x00c0, 0x2b84, 0x2071, 0x64c0, 0x8007, 0xa084, 0x000f, 0x8003,
++      0x8003, 0x8003, 0xae70, 0x7004, 0xa084, 0x000a, 0x00c0, 0x2bea,
++      0x7108, 0xa194, 0xff00, 0x0040, 0x2bea, 0xa18c, 0x00ff, 0x2001,
++      0x000a, 0xa106, 0x0040, 0x2bb7, 0x2001, 0x000c, 0xa106, 0x0040,
++      0x2bbb, 0x2001, 0x0012, 0xa106, 0x0040, 0x2bbf, 0x2001, 0x0014,
++      0xa106, 0x0040, 0x2bc3, 0x2001, 0x0019, 0xa106, 0x0040, 0x2bc7,
++      0x2001, 0x0032, 0xa106, 0x0040, 0x2bcb, 0x0078, 0x2bcf, 0x2009,
++      0x000c, 0x0078, 0x2bd0, 0x2009, 0x0012, 0x0078, 0x2bd0, 0x2009,
++      0x0014, 0x0078, 0x2bd0, 0x2009, 0x0019, 0x0078, 0x2bd0, 0x2009,
++      0x0020, 0x0078, 0x2bd0, 0x2009, 0x003f, 0x0078, 0x2bd0, 0xa016,
++      0x2100, 0xa205, 0x700a, 0x7004, 0xa085, 0x000a, 0x7006, 0x2071,
++      0x6000, 0x7004, 0xd0bc, 0x0040, 0x2bea, 0xd3fc, 0x00c0, 0x2be5,
++      0x73ee, 0x2071, 0x6040, 0x0078, 0x2be8, 0x73f2, 0x2071, 0x6080,
++      0x701b, 0x800f, 0x037f, 0x0e7f, 0x007c, 0x2001, 0x6003, 0x2004,
++      0xd0e4, 0x00c0, 0x2bf9, 0x7804, 0xa084, 0xff1f, 0xa085, 0x6340,
++      0x7806, 0x007c, 0x0068, 0x2bfa, 0x2091, 0x8000, 0x2071, 0x0000,
++      0x007e, 0x7018, 0xd084, 0x00c0, 0x2c01, 0x007f, 0x2071, 0x0010,
++      0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x090b, 0x70df,
++      0x0001, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078,
++      0x2c17, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0xa594, 0x003f, 0xa49c,
++      0x0003, 0xa484, 0x000f, 0x0079, 0x2c25, 0x2c37, 0x2c37, 0x2c37,
++      0x30a9, 0x4547, 0x2c35, 0x2c5f, 0x2c62, 0x2c35, 0x2c35, 0x2c35,
++      0x2c35, 0x2c35, 0x2c35, 0x2c35, 0x2c35, 0x1078, 0x2bfa, 0x8507,
++      0xa084, 0x001f, 0x0079, 0x2c3c, 0x2c65, 0x30a9, 0x32d8, 0x33f3,
++      0x341e, 0x36b7, 0x39f0, 0x3a6f, 0x3aed, 0x3b81, 0x3c6c, 0x3d13,
++      0x2c5f, 0x31d4, 0x39bf, 0x2c5c, 0x49b9, 0x49e0, 0x4bd7, 0x4be3,
++      0x4cc7, 0x2c5c, 0x2c5c, 0x4dae, 0x4db2, 0x49b7, 0x2c5c, 0x4b1d,
++      0x2c5c, 0x484c, 0x2c62, 0x2c5c, 0x1078, 0x2bfa, 0x007c, 0x781b,
++      0x004f, 0x007c, 0x781b, 0x00d6, 0x007c, 0x724a, 0xa584, 0x0001,
++      0x00c0, 0x485e, 0x0040, 0x2c78, 0x1078, 0x2bfa, 0x7003, 0x0000,
++      0x7053, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000, 0x1078, 0x44fa,
++      0x7064, 0xa06d, 0x0040, 0x2c85, 0x70f4, 0xa084, 0x0001, 0x7168,
++      0xa105, 0x00c0, 0x2c85, 0x0078, 0x2df1, 0x7068, 0xa084, 0x0007,
++      0x0079, 0x2c8a, 0x2c92, 0x2d10, 0x2d19, 0x2d24, 0x2d2f, 0x2dd7,
++      0x2d3a, 0x2d10, 0x7830, 0xd0bc, 0x00c0, 0x2c5e, 0x71f0, 0xd1bc,
++      0x00c0, 0x2c5e, 0xd1b4, 0x00c0, 0x2cee, 0x70c0, 0xa086, 0x0001,
++      0x0040, 0x2c5e, 0x1078, 0x44e0, 0x00c0, 0x2c5e, 0x70d0, 0xa06d,
++      0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808,
++      0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040,
++      0x2cbc, 0x69c0, 0x7daa, 0x79aa, 0x68c4, 0xa04d, 0x6e1c, 0x7830,
++      0xd0bc, 0x00c0, 0x2c5e, 0x2001, 0x0010, 0x0078, 0x2f58, 0x7064,
++      0xa005, 0x00c0, 0x2c5e, 0x1078, 0x44e0, 0x00c0, 0x2c5e, 0x0c7e,
++      0x0d7e, 0x70d0, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010,
++      0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
++      0xa886, 0x0001, 0x0040, 0x2ce7, 0x69c0, 0x7daa, 0x79aa, 0x68c4,
++      0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0078, 0x2f58, 0x1078, 0x44bc,
++      0x00c0, 0x2c5e, 0x70d8, 0xa06d, 0x6814, 0xc0fc, 0x8007, 0x7882,
++      0x68b4, 0x785a, 0x781b, 0x004f, 0x704c, 0xc08d, 0x780a, 0x68c0,
++      0x703e, 0x70f0, 0xc0b4, 0x70f2, 0x70d4, 0xa065, 0x68c4, 0x705e,
++      0x7003, 0x0002, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x007c,
++      0x1078, 0x44bc, 0x00c0, 0x2d18, 0x781b, 0x0048, 0x7003, 0x0004,
++      0x007c, 0x1078, 0x44bc, 0x00c0, 0x2d23, 0x2011, 0x000c, 0x1078,
++      0x2d4a, 0x7003, 0x0004, 0x007c, 0x1078, 0x44bc, 0x00c0, 0x2d2e,
++      0x2011, 0x0006, 0x1078, 0x2d4a, 0x7003, 0x0004, 0x007c, 0x1078,
++      0x44bc, 0x00c0, 0x2d39, 0x2011, 0x000d, 0x1078, 0x2d4a, 0x7003,
++      0x0004, 0x007c, 0x1078, 0x44bc, 0x00c0, 0x2d49, 0x2011, 0x0006,
++      0x1078, 0x2d4a, 0x7080, 0x7083, 0x0000, 0x2068, 0x7052, 0x7003,
++      0x0001, 0x007c, 0x7178, 0xc1fc, 0x8107, 0x7882, 0x789b, 0x0010,
++      0xa286, 0x000c, 0x00c0, 0x2d59, 0x7aaa, 0x2001, 0x0001, 0x0078,
++      0x2d6e, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, 0x000d,
++      0x0040, 0x2d67, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2d6e, 0x78ab,
++      0x0020, 0x717c, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b, 0x0060,
++      0x78aa, 0x785b, 0x0004, 0x781b, 0x00e7, 0x1078, 0x44fa, 0x7087,
++      0x000f, 0x70f0, 0xd0b4, 0x0040, 0x2d8a, 0xc0b4, 0x70f2, 0x0c7e,
++      0x70d4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
++      0x601a, 0x0c7f, 0x007c, 0x7010, 0xa005, 0x00c0, 0x2d99, 0x70f0,
++      0xd0b4, 0x0040, 0x2d9a, 0x70d4, 0xac06, 0x00c0, 0x2d9a, 0x1078,
++      0x2d79, 0x007c, 0x017e, 0x71c0, 0xa186, 0x0001, 0x0040, 0x2dcc,
++      0x0d7e, 0x027e, 0x2100, 0x2011, 0x0001, 0xa212, 0x70d0, 0x2068,
++      0x6800, 0xac06, 0x0040, 0x2db3, 0x8211, 0x0040, 0x2dca, 0x1078,
++      0x2dce, 0x0078, 0x2da8, 0x0c7e, 0x2100, 0x2011, 0x0001, 0xa212,
++      0x70d0, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a,
++      0x8211, 0x0040, 0x2dc7, 0x1078, 0x2dce, 0x0078, 0x2dba, 0x70c3,
++      0x0001, 0x0c7f, 0x027f, 0x0d7f, 0x017f, 0x007c, 0xade8, 0x0005,
++      0x70c8, 0xad06, 0x00c0, 0x2dd6, 0x70c4, 0x2068, 0x007c, 0x1078,
++      0x44bc, 0x00c0, 0x2c5e, 0x7080, 0x2068, 0x7778, 0x1078, 0x43a8,
++      0x2c50, 0x1078, 0x45c9, 0x789b, 0x0010, 0x6814, 0xa084, 0x001f,
++      0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004, 0x0078,
++      0x2f5e, 0x1078, 0x44bc, 0x00c0, 0x2c5e, 0x789b, 0x0010, 0x7064,
++      0x2068, 0x6f14, 0x1078, 0x2d79, 0x1078, 0x43a8, 0x2c50, 0x1078,
++      0x45c9, 0x6824, 0xa005, 0x0040, 0x2e0d, 0xa082, 0x0006, 0x0048,
++      0x2e0b, 0x0078, 0x2e0d, 0x6827, 0x0005, 0x6b14, 0xa39c, 0x001f,
++      0xa39d, 0x00c0, 0x2960, 0x6000, 0x2a60, 0xa084, 0x8000, 0x0040,
++      0x2e1d, 0xa684, 0x0001, 0x0040, 0x2e1f, 0xa39c, 0xffbf, 0x7baa,
++      0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0078, 0x2f5e,
++      0xc28d, 0x72f2, 0x72dc, 0xa200, 0xa015, 0x7158, 0x8108, 0xa12a,
++      0x0048, 0x2e33, 0x71dc, 0x2164, 0x6504, 0x85ff, 0x00c0, 0x2e4e,
++      0x715a, 0x8421, 0x00c0, 0x2e2e, 0x70f0, 0xd08c, 0x0040, 0x2e46,
++      0x70ec, 0xa005, 0x00c0, 0x2e46, 0x70ef, 0x000a, 0x7048, 0xa005,
++      0x0040, 0x485e, 0x007c, 0x2200, 0x0078, 0x2e38, 0x70f0, 0xc08c,
++      0x70f2, 0x70ef, 0x0000, 0x6034, 0xa005, 0x00c0, 0x2e4b, 0x6708,
++      0xa784, 0x073f, 0x0040, 0x2e78, 0xd7d4, 0x00c0, 0x2e4b, 0xa784,
++      0x0021, 0x00c0, 0x2e4b, 0xd78c, 0x0040, 0x2e6b, 0xd794, 0x0040,
++      0x2e4b, 0xc794, 0x670a, 0xa784, 0x0218, 0x00c0, 0x2e4b, 0xd7c4,
++      0x0040, 0x2e78, 0x6018, 0xa005, 0x00c0, 0x2e4b, 0xc7c4, 0x670a,
++      0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e, 0x6318, 0x0040,
++      0x2e89, 0x601c, 0xa302, 0x0048, 0x2e8c, 0x0040, 0x2e8c, 0x0078,
++      0x2e4b, 0x83ff, 0x00c0, 0x2e4b, 0x2d58, 0x2c50, 0x715a, 0x68d3,
++      0x0000, 0xd7bc, 0x00c0, 0x2e97, 0x7024, 0x6022, 0x603a, 0xc7bc,
++      0x670a, 0x68c4, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041, 0x0001,
++      0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0040, 0x2eab,
++      0xd684, 0x0040, 0x2ead, 0xa39c, 0xffbf, 0xd6a4, 0x0040, 0x2eb2,
++      0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2f03, 0xc7a5, 0x670a,
++      0x2c00, 0x68ca, 0x77c0, 0xa786, 0x0001, 0x00c0, 0x2ed9, 0x70f0,
++      0xd0b4, 0x00c0, 0x2ed9, 0x7000, 0xa082, 0x0001, 0x00c8, 0x2ed9,
++      0x7010, 0xa005, 0x00c0, 0x2ed9, 0x1078, 0x44e0, 0x00c0, 0x2ed9,
++      0x7830, 0xd0bc, 0x00c0, 0x2ed9, 0x789b, 0x0010, 0x7baa, 0x0078,
++      0x2f56, 0x8739, 0x77c2, 0x2750, 0x77cc, 0xa7b0, 0x0005, 0x70c8,
++      0xa606, 0x00c0, 0x2ee4, 0x76c4, 0x76ce, 0x2c3a, 0x8738, 0x2d3a,
++      0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc,
++      0x0040, 0x2efa, 0x2091, 0x303d, 0x70f0, 0xa084, 0x303d, 0x2091,
++      0x8000, 0x2090, 0xaad5, 0x0000, 0x0040, 0x2f02, 0x8421, 0x2200,
++      0x00c0, 0x2e2d, 0x007c, 0xd1dc, 0x0040, 0x3ffb, 0x2029, 0x0020,
++      0xd69c, 0x00c0, 0x2f10, 0x8528, 0xd68c, 0x00c0, 0x2f10, 0x8528,
++      0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0x70e8, 0xa160,
++      0x2c64, 0x8cff, 0x0040, 0x2f2e, 0x6014, 0xa706, 0x00c0, 0x2f18,
++      0x60bc, 0x8001, 0x60be, 0x00c0, 0x2f13, 0x2a60, 0x6008, 0xc0c5,
++      0x600a, 0x2200, 0x8421, 0x00c0, 0x2e2d, 0x007c, 0x2a60, 0x610e,
++      0x69c2, 0x2c00, 0x68ca, 0x8840, 0x6008, 0xc0d5, 0x600a, 0x77c0,
++      0xa786, 0x0001, 0x00c0, 0x2ed9, 0x70f0, 0xd0b4, 0x00c0, 0x2ed9,
++      0x7000, 0xa082, 0x0001, 0x00c8, 0x2ed9, 0x7010, 0xa005, 0x00c0,
++      0x2ed9, 0x1078, 0x44e0, 0x00c0, 0x2ed9, 0x7830, 0xd0bc, 0x00c0,
++      0x2ed9, 0x789b, 0x0010, 0x7baa, 0x7daa, 0x79aa, 0x2001, 0x0002,
++      0x007e, 0x6018, 0x8000, 0x601a, 0x0078, 0x2f5f, 0x007e, 0x2960,
++      0x6104, 0x2a60, 0xa184, 0x0018, 0x0040, 0x2f7a, 0xa184, 0x0010,
++      0x0040, 0x2f6e, 0x1078, 0x4201, 0x00c0, 0x2f9a, 0xd19c, 0x0040,
++      0x2f7a, 0x69a0, 0xa184, 0x0600, 0x00c0, 0x2f7a, 0x1078, 0x40f5,
++      0x0078, 0x2f9a, 0x69a0, 0xa184, 0x1e00, 0x0040, 0x2fa4, 0xd1dc,
++      0x0040, 0x2f90, 0x0c7e, 0x2960, 0x6000, 0xc0ed, 0x6002, 0x6104,
++      0xc1a5, 0x6106, 0x0c7f, 0x1078, 0x4201, 0x00c0, 0x2f9a, 0x69a0,
++      0xd1cc, 0x0040, 0x2f97, 0x1078, 0x4147, 0x0078, 0x2f9a, 0xd1d4,
++      0x00c0, 0x2f76, 0x69a0, 0xd1e4, 0x0040, 0x2fa4, 0x6914, 0xa18c,
++      0xff00, 0x810f, 0x1078, 0x2a43, 0x027f, 0xa68c, 0x00e0, 0xa684,
++      0x0060, 0x0040, 0x2fb0, 0xa086, 0x0060, 0x00c0, 0x2fb0, 0xc1f5,
++      0xa18d, 0x0104, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x6818,
++      0xc0fd, 0x681a, 0xd6bc, 0x0040, 0x2fcb, 0xc0fc, 0x708b, 0x0000,
++      0xa08a, 0x000d, 0x0050, 0x2fc9, 0xa08a, 0x000c, 0x718a, 0x2001,
++      0x000c, 0x800c, 0x718e, 0x78aa, 0x3518, 0x3340, 0x3428, 0x80ac,
++      0xaf80, 0x002b, 0x20a0, 0x789b, 0x0000, 0xad80, 0x000b, 0x2098,
++      0x53a6, 0x23a8, 0x2898, 0x25a0, 0xa286, 0x0020, 0x00c0, 0x2ffe,
++      0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da, 0xa286,
++      0x0002, 0x0040, 0x302a, 0x70c0, 0x8000, 0x70c2, 0x74d0, 0xa498,
++      0x0005, 0x70c8, 0xa306, 0x00c0, 0x2ff6, 0x73c4, 0x73d2, 0xa286,
++      0x0010, 0x0040, 0x2c5e, 0x0d7f, 0x0c7f, 0x007c, 0x7000, 0xa005,
++      0x00c0, 0x2fe0, 0xa286, 0x0002, 0x00c0, 0x3044, 0x1078, 0x44bc,
++      0x00c0, 0x2fe0, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x68b4, 0x785a,
++      0x781b, 0x004f, 0x704c, 0xc08d, 0x780a, 0x127e, 0x0d7e, 0x0c7e,
++      0x70f0, 0xa084, 0x2700, 0x2090, 0x0c7f, 0x0d7f, 0x127f, 0x2900,
++      0x705e, 0x68c0, 0x703e, 0x7003, 0x0002, 0x2d00, 0x7052, 0xad80,
++      0x0009, 0x7042, 0x7830, 0xd0bc, 0x0040, 0x3036, 0x2091, 0x303d,
++      0x70f0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0x70c0, 0xa005,
++      0x00c0, 0x303b, 0x007c, 0x8421, 0x0040, 0x303a, 0x7254, 0x70dc,
++      0xa200, 0xa015, 0x0078, 0x2e2d, 0xa286, 0x0010, 0x00c0, 0x306f,
++      0x1078, 0x44bc, 0x00c0, 0x2fe0, 0x6814, 0xc0fc, 0x8007, 0x7882,
++      0x68b4, 0x785a, 0x781b, 0x004f, 0x704c, 0xc08d, 0x780a, 0x70c0,
++      0x8000, 0x70c2, 0x74d0, 0xa490, 0x0005, 0x70c8, 0xa206, 0x00c0,
++      0x3062, 0x72c4, 0x72d2, 0x2900, 0x705e, 0x68c0, 0x703e, 0x7003,
++      0x0002, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x007c, 0x6bb4,
++      0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94,
++      0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x004f, 0x2900,
++      0x705e, 0x7202, 0x704c, 0xc08d, 0x780a, 0x7200, 0x2300, 0xa605,
++      0x0040, 0x309b, 0x70f0, 0xa084, 0x2700, 0xa086, 0x2300, 0x00c0,
++      0x3095, 0x2009, 0x0000, 0x0078, 0x3097, 0x2009, 0x0001, 0xa284,
++      0x000f, 0x1079, 0x309f, 0xad80, 0x0009, 0x7042, 0x007c, 0x30a7,
++      0x591e, 0x591e, 0x590b, 0x591e, 0x30a7, 0x30a7, 0x30a7, 0x1078,
++      0x2bfa, 0x1078, 0x44bc, 0x1078, 0x2bed, 0x7808, 0xa084, 0xfffc,
++      0x780a, 0x0f7e, 0x2079, 0x6000, 0x78b0, 0x0f7f, 0xd084, 0x0040,
++      0x30d2, 0x7068, 0xa086, 0x0001, 0x00c0, 0x30c0, 0x0078, 0x31a7,
++      0x7068, 0xa086, 0x0005, 0x00c0, 0x30d0, 0x7080, 0x2068, 0x681b,
++      0x0004, 0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822,
++      0x706b, 0x0000, 0x70c3, 0x0000, 0x70c4, 0x70ce, 0x70d2, 0x70f4,
++      0xc084, 0x70f6, 0x1078, 0x2d79, 0x2011, 0x0004, 0x7168, 0xa186,
++      0x0001, 0x0040, 0x30f2, 0xa186, 0x0007, 0x00c0, 0x30eb, 0x701b,
++      0x0005, 0x0078, 0x30f2, 0x701b, 0x0001, 0x70f0, 0xc0dd, 0x70f2,
++      0x0078, 0x30f2, 0x2001, 0x6008, 0x203c, 0xd7fc, 0x00c0, 0x30fe,
++      0xae86, 0x6040, 0x0040, 0x3102, 0x0078, 0x3108, 0xae86, 0x6080,
++      0x00c0, 0x3108, 0xa784, 0x00ff, 0xa086, 0x0018, 0x0040, 0x310f,
++      0x7014, 0x7012, 0xa005, 0x00c0, 0x310f, 0x70c3, 0x0001, 0x067e,
++      0x1078, 0x55ac, 0x157e, 0x20a9, 0x0010, 0x2039, 0x0000, 0x1078,
++      0x42de, 0xa7b8, 0x0100, 0x00f0, 0x3117, 0x157f, 0x067f, 0x7000,
++      0x0079, 0x3122, 0x315a, 0x3135, 0x3135, 0x312a, 0x315a, 0x315a,
++      0x315a, 0x315a, 0x7064, 0xa005, 0x0040, 0x315a, 0xad06, 0x00c0,
++      0x3135, 0x6800, 0x7066, 0x0078, 0x3147, 0x6820, 0xd084, 0x00c0,
++      0x3143, 0x6f14, 0x1078, 0x43a8, 0x6008, 0xc0d4, 0x600a, 0x1078,
++      0x3fd3, 0x0078, 0x3147, 0x7060, 0x2060, 0x6800, 0x6002, 0xa684,
++      0x5f00, 0x681e, 0x6818, 0xd0fc, 0x0040, 0x314f, 0x6a1a, 0x6817,
++      0x0000, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822,
++      0x1078, 0x2251, 0x2011, 0x0004, 0xb284, 0x0400, 0x00c0, 0x3164,
++      0x2021, 0xa6c0, 0x0078, 0x3166, 0x2021, 0xa7d0, 0x1078, 0x31b5,
++      0xb284, 0x0400, 0x0040, 0x3170, 0x2021, 0x6099, 0x0078, 0x3172,
++      0x2021, 0x6059, 0x1078, 0x31b5, 0x157e, 0x20a9, 0x0101, 0xb284,
++      0x0400, 0x00c0, 0x317f, 0x2021, 0xa5c0, 0x0078, 0x3181, 0x2021,
++      0xa6d0, 0x1078, 0x31b5, 0x8420, 0x00f0, 0x3181, 0xb284, 0x0300,
++      0x0040, 0x318e, 0x2061, 0x65c0, 0x0078, 0x3190, 0x2061, 0x85c0,
++      0x2021, 0x0002, 0x20a9, 0x0100, 0x6018, 0x6110, 0x81ff, 0x0040,
++      0x319d, 0xa102, 0x0050, 0x319d, 0x6012, 0x601b, 0x0000, 0xace0,
++      0x0010, 0x00f0, 0x3194, 0x8421, 0x00c0, 0x3192, 0x157f, 0x7090,
++      0xa084, 0x8000, 0x0040, 0x31ae, 0x1078, 0x4639, 0x706b, 0x0000,
++      0x7003, 0x0000, 0x7053, 0x0000, 0x007c, 0x047e, 0x2404, 0xa005,
++      0x0040, 0x31d0, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817, 0x0000,
++      0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084,
++      0x00ff, 0xc09d, 0x6822, 0x1078, 0x2251, 0x007f, 0x0078, 0x31b7,
++      0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x31da,
++      0x1078, 0x2bfa, 0x1078, 0x2bed, 0x2300, 0x0079, 0x31df, 0x31e2,
++      0x326d, 0x328a, 0xa282, 0x0002, 0x0040, 0x31e8, 0x1078, 0x2bfa,
++      0x7068, 0x706b, 0x0000, 0x7087, 0x0000, 0x0079, 0x31ef, 0x31f7,
++      0x31f7, 0x31f9, 0x3239, 0x4007, 0x31f7, 0x3239, 0x31f7, 0x1078,
++      0x2bfa, 0x7778, 0x1078, 0x42de, 0x7778, 0xa7bc, 0x8f00, 0x1078,
++      0x43a8, 0x6018, 0xa005, 0x0040, 0x3230, 0xd7fc, 0x00c0, 0x320c,
++      0x2021, 0xa6c0, 0x0078, 0x320e, 0x2021, 0xa7d0, 0x2009, 0x0005,
++      0x2011, 0x0010, 0x1078, 0x32a5, 0x0040, 0x3230, 0x157e, 0x20a9,
++      0x0101, 0xd7fc, 0x00c0, 0x3220, 0x2021, 0xa5c0, 0x0078, 0x3222,
++      0x2021, 0xa6d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078,
++      0x32a5, 0x047f, 0x0040, 0x322f, 0x8420, 0x00f0, 0x3222, 0x157f,
++      0x8738, 0xa784, 0x001f, 0x00c0, 0x31ff, 0x0078, 0x2c6e, 0x0078,
++      0x2c6e, 0x7778, 0x1078, 0x43a8, 0x6018, 0xa005, 0x0040, 0x326b,
++      0xd7fc, 0x00c0, 0x3247, 0x2021, 0xa6c0, 0x0078, 0x3249, 0x2021,
++      0xa7d0, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x32a5, 0x0040,
++      0x326b, 0x157e, 0x20a9, 0x0101, 0xd7fc, 0x00c0, 0x325b, 0x2021,
++      0xa5c0, 0x0078, 0x325d, 0x2021, 0xa6d0, 0x047e, 0x2009, 0x0005,
++      0x2011, 0x0020, 0x1078, 0x32a5, 0x047f, 0x0040, 0x326a, 0x8420,
++      0x00f0, 0x325d, 0x157f, 0x0078, 0x2c6e, 0x2200, 0x0079, 0x3270,
++      0x3273, 0x3275, 0x3275, 0x1078, 0x2bfa, 0x2009, 0x0012, 0x7068,
++      0xa086, 0x0002, 0x0040, 0x327e, 0x2009, 0x000e, 0x6818, 0xd0fc,
++      0x0040, 0x3283, 0x691a, 0x706b, 0x0000, 0x70f0, 0xc0dd, 0x70f2,
++      0x0078, 0x445a, 0x2200, 0x0079, 0x328d, 0x3292, 0x3275, 0x3290,
++      0x1078, 0x2bfa, 0x1078, 0x55ac, 0x7000, 0xa086, 0x0002, 0x00c0,
++      0x3f81, 0x1078, 0x3fe8, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078,
++      0x3f72, 0x0040, 0x3f81, 0x0078, 0x2c6e, 0x2404, 0xa005, 0x0040,
++      0x32d4, 0x2068, 0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x32b4,
++      0x2d20, 0x007f, 0x0078, 0x32a6, 0x007f, 0x2022, 0x6817, 0x0000,
++      0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x691a, 0x6820,
++      0xa084, 0x00ff, 0xa205, 0x6822, 0x682b, 0x0000, 0x1078, 0x2251,
++      0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x1078,
++      0x2d9a, 0x1078, 0x3fe8, 0x007c, 0xa085, 0x0001, 0x0078, 0x32d3,
++      0x2300, 0x0079, 0x32db, 0x32e0, 0x32de, 0x3385, 0x1078, 0x2bfa,
++      0x78ec, 0xa084, 0x0001, 0x00c0, 0x32f4, 0x7000, 0xa086, 0x0004,
++      0x00c0, 0x32ec, 0x0078, 0x332a, 0x1078, 0x3fe8, 0x6008, 0xa084,
++      0xf9ef, 0x600a, 0x0078, 0x3f81, 0x78e4, 0xa005, 0x00d0, 0x332a,
++      0x3208, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++      0x3305, 0xa18c, 0x0300, 0x0078, 0x3307, 0xa18c, 0x0400, 0x0040,
++      0x330d, 0x0018, 0x2c5e, 0x0078, 0x330f, 0x0028, 0x2c5e, 0x2008,
++      0xa084, 0x0030, 0x00c0, 0x3317, 0x781b, 0x004f, 0x007c, 0x78ec,
++      0xa084, 0x0003, 0x0040, 0x3314, 0xa184, 0x0007, 0x0079, 0x3320,
++      0x3361, 0x336b, 0x3354, 0x3328, 0x44b1, 0x44b1, 0x3328, 0x3378,
++      0x1078, 0x2bfa, 0x7000, 0xa086, 0x0004, 0x00c0, 0x3344, 0x7068,
++      0xa086, 0x0002, 0x00c0, 0x333a, 0x2011, 0x0002, 0x2019, 0x0000,
++      0x0078, 0x31d4, 0x7068, 0xa086, 0x0006, 0x0040, 0x3334, 0x7068,
++      0xa086, 0x0004, 0x0040, 0x3334, 0x79e4, 0xa184, 0x0030, 0x0040,
++      0x334e, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x3350, 0x0078, 0x39bf,
++      0x2001, 0x0003, 0x0078, 0x36cb, 0x6818, 0xd0fc, 0x0040, 0x335a,
++      0x681b, 0x001d, 0x1078, 0x42bd, 0x782b, 0x3008, 0x781b, 0x0058,
++      0x007c, 0x6818, 0xd0fc, 0x0040, 0x3367, 0x681b, 0x001d, 0x1078,
++      0x42bd, 0x0078, 0x4484, 0x6818, 0xd0fc, 0x0040, 0x3371, 0x681b,
++      0x001d, 0x1078, 0x42bd, 0x782b, 0x3008, 0x781b, 0x00d3, 0x007c,
++      0x6818, 0xd0fc, 0x0040, 0x337e, 0x681b, 0x001d, 0x1078, 0x42bd,
++      0x782b, 0x3008, 0x781b, 0x009b, 0x007c, 0xa584, 0x000f, 0x00c0,
++      0x33a4, 0x1078, 0x2bed, 0x7000, 0x0079, 0x338e, 0x2c6e, 0x3396,
++      0x3398, 0x3f81, 0x3f81, 0x3f81, 0x3396, 0x3396, 0x1078, 0x2bfa,
++      0x1078, 0x3fe8, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3f72,
++      0x0040, 0x3f81, 0x0078, 0x2c6e, 0x78e4, 0xa005, 0x00d0, 0x332a,
++      0x3208, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++      0x33b5, 0xa18c, 0x0300, 0x0078, 0x33b7, 0xa18c, 0x0400, 0x0040,
++      0x33bd, 0x0018, 0x332a, 0x0078, 0x33bf, 0x0028, 0x332a, 0x2008,
++      0xa084, 0x0030, 0x00c0, 0x33c7, 0x781b, 0x004f, 0x007c, 0x78ec,
++      0xa084, 0x0003, 0x0040, 0x33c4, 0xa184, 0x0007, 0x0079, 0x33d0,
++      0x33e1, 0x33e5, 0x33da, 0x33d8, 0x44b1, 0x44b1, 0x33d8, 0x44a9,
++      0x1078, 0x2bfa, 0x1078, 0x42c5, 0x782b, 0x3008, 0x781b, 0x0058,
++      0x007c, 0x1078, 0x42c5, 0x0078, 0x4484, 0x1078, 0x42c5, 0x782b,
++      0x3008, 0x781b, 0x00d3, 0x007c, 0x1078, 0x42c5, 0x782b, 0x3008,
++      0x781b, 0x009b, 0x007c, 0x2300, 0x0079, 0x33f6, 0x33fb, 0x33f9,
++      0x33fd, 0x1078, 0x2bfa, 0x0078, 0x3b81, 0x681b, 0x0016, 0x78a3,
++      0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x3b81, 0x78ec, 0xa084,
++      0x0003, 0x0040, 0x3b81, 0xa184, 0x0100, 0x0040, 0x3401, 0xa184,
++      0x0007, 0x0079, 0x3413, 0x341b, 0x33e5, 0x3354, 0x445a, 0x44b1,
++      0x44b1, 0x445a, 0x44a9, 0x1078, 0x446a, 0x007c, 0xa282, 0x0005,
++      0x0050, 0x3424, 0x1078, 0x2bfa, 0x2300, 0x0079, 0x3427, 0x342a,
++      0x367d, 0x368a, 0x2200, 0x0079, 0x342d, 0x3447, 0x3434, 0x3447,
++      0x3432, 0x3660, 0x1078, 0x2bfa, 0x789b, 0x0018, 0x78a8, 0xa084,
++      0x00ff, 0xa082, 0x0020, 0x0048, 0x429c, 0xa08a, 0x0004, 0x00c8,
++      0x429c, 0x0079, 0x3443, 0x429c, 0x429c, 0x429c, 0x4246, 0x789b,
++      0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x3458, 0x0078, 0x429c,
++      0x7000, 0xa005, 0x00c0, 0x344e, 0x2011, 0x0004, 0x0078, 0x3d26,
++      0xa184, 0x00ff, 0xa08a, 0x0010, 0x00c8, 0x429c, 0x0079, 0x3460,
++      0x3472, 0x3470, 0x3488, 0x348c, 0x355f, 0x429c, 0x429c, 0x3561,
++      0x429c, 0x429c, 0x365c, 0x365c, 0x429c, 0x429c, 0x429c, 0x365e,
++      0x1078, 0x2bfa, 0xa684, 0x1000, 0x0040, 0x347e, 0x2001, 0x0500,
++      0x8000, 0x8000, 0x783a, 0x781b, 0x0094, 0x007c, 0x6818, 0xd0fc,
++      0x0040, 0x3486, 0x681b, 0x001d, 0x0078, 0x3476, 0x0078, 0x445a,
++      0x681b, 0x001d, 0x0078, 0x42aa, 0x6920, 0x6922, 0xa684, 0x1800,
++      0x00c0, 0x34f1, 0x6820, 0xa084, 0x0001, 0x00c0, 0x34f7, 0x6818,
++      0xa086, 0x0008, 0x00c0, 0x349e, 0x681b, 0x0000, 0xd6d4, 0x0040,
++      0x355c, 0xd6bc, 0x0040, 0x34dd, 0x708b, 0x0000, 0x6818, 0xa084,
++      0x003f, 0xa08a, 0x000d, 0x0050, 0x34dd, 0xa08a, 0x000c, 0x718a,
++      0x2001, 0x000c, 0x800c, 0x718e, 0x789b, 0x0061, 0x78aa, 0x157e,
++      0x137e, 0x147e, 0x017e, 0xb28c, 0x0300, 0x0040, 0x34cf, 0x007e,
++      0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x34cb, 0x20a1,
++      0x012b, 0x0078, 0x34d1, 0x20a1, 0x022b, 0x0078, 0x34d1, 0x20a1,
++      0x012b, 0x017f, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b,
++      0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6038, 0xa005, 0x00c0,
++      0x34ec, 0x681c, 0xa084, 0x000e, 0x0040, 0x42aa, 0x1078, 0x42c9,
++      0x782b, 0x3008, 0x0078, 0x34ee, 0x8001, 0x603a, 0x781b, 0x005a,
++      0x007c, 0xd6e4, 0x0040, 0x34f7, 0x781b, 0x0067, 0x007c, 0xa684,
++      0x0060, 0x0040, 0x3559, 0xd6dc, 0x0040, 0x3559, 0xd6fc, 0x00c0,
++      0x3503, 0x0078, 0x351a, 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8,
++      0x78d0, 0x801b, 0x00c8, 0x350d, 0x8000, 0xa084, 0x003f, 0xa108,
++      0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++      0xa303, 0x68ae, 0xd6f4, 0x0040, 0x3520, 0xc6f4, 0x7e5a, 0x6eb6,
++      0x7000, 0xa086, 0x0003, 0x00c0, 0x352e, 0x007e, 0x1078, 0x55ac,
++      0x1078, 0x591e, 0x007f, 0x781b, 0x0066, 0x007c, 0xa006, 0x1078,
++      0x5a6b, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040,
++      0x353d, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda,
++      0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x00c0, 0x354d, 0xc6f5,
++      0x7e5a, 0x6eb6, 0x781b, 0x0066, 0x007c, 0x781b, 0x0066, 0x2200,
++      0xa115, 0x00c0, 0x3556, 0x1078, 0x591e, 0x007c, 0x1078, 0x5972,
++      0x007c, 0x781b, 0x0067, 0x007c, 0x781b, 0x005a, 0x007c, 0x1078,
++      0x2bfa, 0x0078, 0x35b1, 0x6920, 0xd1c4, 0x0040, 0x3576, 0xc1c4,
++      0x6922, 0x0c7e, 0x705c, 0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004,
++      0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, 0x35a5, 0xd1cc, 0x0040,
++      0x35a5, 0xc1cc, 0x6922, 0x0c7e, 0x705c, 0x2060, 0x6000, 0xc0ec,
++      0x6002, 0x6004, 0xc0a4, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c,
++      0x0040, 0x35a5, 0x1078, 0x43a4, 0x1078, 0x40f5, 0x88ff, 0x0040,
++      0x35a5, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
++      0xd6d4, 0x00c0, 0x35a0, 0x782b, 0x3008, 0x781b, 0x0058, 0x007c,
++      0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x7e58, 0xd6d4, 0x00c0,
++      0x35ac, 0x781b, 0x005a, 0x007c, 0x781b, 0x0067, 0x007c, 0x0078,
++      0x42a3, 0xa01e, 0x7990, 0xa18c, 0x0007, 0x00c0, 0x35be, 0x6820,
++      0xa084, 0x0100, 0x0040, 0x35af, 0x2009, 0x0008, 0x789b, 0x0010,
++      0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0, 0x35f5, 0x2300,
++      0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x35ed, 0x0048, 0x35d2,
++      0x0078, 0x35ef, 0xa380, 0x0002, 0xa102, 0x00c8, 0x35ed, 0x6920,
++      0xa18c, 0xfcff, 0x6922, 0x0c7e, 0x705c, 0x2060, 0x6000, 0xa084,
++      0xefef, 0x6002, 0x6004, 0xa084, 0xffe5, 0x6006, 0x0c7f, 0x7e58,
++      0xa6b4, 0xfffb, 0x7e5a, 0x0078, 0x35a6, 0x0078, 0x3563, 0x24a8,
++      0x7aa8, 0x00f0, 0x35ef, 0x0078, 0x35c0, 0xa284, 0x00f0, 0xa086,
++      0x0020, 0x00c0, 0x364d, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040,
++      0x3605, 0x0048, 0x3605, 0x0078, 0x364a, 0xa286, 0x0023, 0x0040,
++      0x35af, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1,
++      0xc0a5, 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x0c7e, 0x705c,
++      0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, 0x0040, 0x3626,
++      0x1078, 0x43a4, 0x1078, 0x4201, 0x0078, 0x3634, 0x0c7e, 0x705c,
++      0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x35a5,
++      0x1078, 0x43a4, 0x1078, 0x40f5, 0x88ff, 0x0040, 0x35a5, 0x789b,
++      0x0060, 0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3645,
++      0x782b, 0x3008, 0x781b, 0x0058, 0x007c, 0x782b, 0x3008, 0x781b,
++      0x0067, 0x007c, 0x7aa8, 0x0078, 0x35c0, 0x8318, 0x2300, 0xa102,
++      0x0040, 0x3656, 0x0048, 0x3656, 0x0078, 0x35c0, 0xa284, 0x0080,
++      0x00c0, 0x42aa, 0x0078, 0x42a3, 0x0078, 0x42aa, 0x0078, 0x429c,
++      0x705c, 0xa04d, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e,
++      0x0001, 0x0040, 0x366d, 0x1078, 0x2bfa, 0x7aa8, 0xa294, 0x00ff,
++      0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x429c, 0x0079,
++      0x3679, 0x429c, 0x4041, 0x429c, 0x41a4, 0xa282, 0x0000, 0x00c0,
++      0x3683, 0x1078, 0x2bfa, 0x1078, 0x42bd, 0x782b, 0x3008, 0x781b,
++      0x0067, 0x007c, 0xa282, 0x0003, 0x00c0, 0x3690, 0x1078, 0x2bfa,
++      0xd4fc, 0x00c0, 0x36b0, 0x7068, 0xa005, 0x0040, 0x3699, 0x1078,
++      0x2bfa, 0x6f14, 0x777a, 0xa7bc, 0x8f00, 0x1078, 0x43a8, 0x6008,
++      0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x00c0, 0x369d,
++      0x1078, 0x42c1, 0x706b, 0x0002, 0x701b, 0x0009, 0x0078, 0x36b2,
++      0x1078, 0x42cd, 0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0xa282,
++      0x0004, 0x0050, 0x36bd, 0x1078, 0x2bfa, 0x2300, 0x0079, 0x36c0,
++      0x36c3, 0x37f4, 0x3825, 0xa286, 0x0003, 0x0040, 0x36c9, 0x1078,
++      0x2bfa, 0x2001, 0x0000, 0x7046, 0x68d0, 0xa005, 0x0040, 0x36d2,
++      0x7003, 0x0003, 0x68a0, 0xd0ec, 0x0040, 0x36d9, 0x6008, 0xc08d,
++      0x600a, 0x7000, 0xa084, 0x000f, 0x0079, 0x36de, 0x2c6e, 0x36eb,
++      0x36e8, 0x390e, 0x39a6, 0x2c6e, 0x36e6, 0x36e6, 0x1078, 0x2bfa,
++      0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x00c0, 0x36f4, 0x1078, 0x55ac,
++      0x2009, 0x0000, 0x0078, 0x379c, 0x7868, 0xa08c, 0x00ff, 0x0040,
++      0x3733, 0xa186, 0x0008, 0x00c0, 0x370a, 0x6008, 0xc0a4, 0x600a,
++      0x1078, 0x3f72, 0x0040, 0x3733, 0x1078, 0x3fe8, 0x1078, 0x55ac,
++      0x0078, 0x371b, 0xa186, 0x0028, 0x00c0, 0x3733, 0x6018, 0xa005,
++      0x0040, 0x36fd, 0x8001, 0x0040, 0x36fd, 0x8001, 0x0040, 0x36fd,
++      0x601e, 0x0078, 0x36fd, 0x6820, 0xd084, 0x0040, 0x2c6e, 0xc084,
++      0x6822, 0x1078, 0x2d8b, 0x7060, 0x0c7e, 0x2060, 0x6800, 0x6002,
++      0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x3730, 0x6002,
++      0x6006, 0x0078, 0x2c6e, 0x017e, 0x81ff, 0x00c0, 0x3755, 0x71f0,
++      0xd1bc, 0x00c0, 0x3755, 0xd1b4, 0x0040, 0x3755, 0x1078, 0x44bc,
++      0x00c0, 0x3755, 0x0d7e, 0x70d8, 0xa06d, 0x6814, 0xc0fc, 0x8007,
++      0x7882, 0x68b4, 0x785a, 0x781b, 0x004f, 0x704c, 0xc08d, 0x780a,
++      0xc1b4, 0x71f2, 0x7003, 0x0030, 0x0d7f, 0x1078, 0x383b, 0x017f,
++      0x81ff, 0x0040, 0x379c, 0xa684, 0x5f00, 0x681e, 0x682b, 0x0000,
++      0x6f14, 0xa186, 0x0002, 0x00c0, 0x379d, 0x1078, 0x2d79, 0x1078,
++      0x2d9a, 0x6820, 0xa084, 0x0800, 0x00c0, 0x379d, 0x8717, 0xa294,
++      0x000f, 0x8213, 0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x377c,
++      0xa290, 0x64c0, 0x0078, 0x377e, 0xa290, 0x6540, 0xa290, 0x0000,
++      0x221c, 0xd3c4, 0x00c0, 0x3786, 0x0078, 0x378c, 0x8210, 0x2204,
++      0xa085, 0x0018, 0x2012, 0x8211, 0xd3d4, 0x0040, 0x3797, 0x68a0,
++      0xd0c4, 0x00c0, 0x3797, 0x1078, 0x38bd, 0x0078, 0x2c6e, 0x6008,
++      0xc08d, 0x600a, 0x0078, 0x379d, 0x692a, 0x6916, 0x6818, 0xd0fc,
++      0x0040, 0x37a4, 0x7044, 0x681a, 0xa68c, 0x5f00, 0x691e, 0x6010,
++      0xa005, 0x0040, 0x37b0, 0x8001, 0x00d0, 0x37b0, 0x1078, 0x2bfa,
++      0x6012, 0x6018, 0xa005, 0x0040, 0x37b9, 0x8001, 0x601a, 0x00c0,
++      0x37bc, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x37c8,
++      0x6800, 0xa005, 0x00c0, 0x37c5, 0x6002, 0x6006, 0x0078, 0x37cc,
++      0x7060, 0x2060, 0x6800, 0x6002, 0x2061, 0x6000, 0x6807, 0x0103,
++      0x2d08, 0x206b, 0x0000, 0x6060, 0x8000, 0x6062, 0x6064, 0xa005,
++      0x6166, 0x0040, 0x37de, 0x2d02, 0x0078, 0x37df, 0x616a, 0x7000,
++      0xa086, 0x0030, 0x00c0, 0x2c6e, 0x7003, 0x0002, 0x70d8, 0xa06d,
++      0x68c0, 0x703e, 0x70d4, 0xa065, 0x68c4, 0x705e, 0x2d00, 0x7052,
++      0xad80, 0x0009, 0x7042, 0x007c, 0xa282, 0x0004, 0x0048, 0x37fa,
++      0x1078, 0x2bfa, 0x2200, 0x0079, 0x37fd, 0x37f8, 0x3801, 0x380d,
++      0x3801, 0x7000, 0xa086, 0x0005, 0x0040, 0x380a, 0x1078, 0x42bd,
++      0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x7890, 0x8007, 0x8001,
++      0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff,
++      0xa186, 0x0003, 0x0040, 0x3822, 0xa186, 0x0000, 0x0040, 0x3822,
++      0x0078, 0x429c, 0x781b, 0x0067, 0x007c, 0x6820, 0xc095, 0x6822,
++      0x82ff, 0x00c0, 0x382f, 0x1078, 0x42bd, 0x0078, 0x3836, 0x8211,
++      0x0040, 0x3834, 0x1078, 0x2bfa, 0x1078, 0x42cd, 0x782b, 0x3008,
++      0x781b, 0x0067, 0x007c, 0xa684, 0x0060, 0x00c0, 0x3849, 0x2d00,
++      0xa005, 0x0040, 0x38bc, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078,
++      0x38bc, 0xd6dc, 0x00c0, 0x3861, 0x68b4, 0xd0dc, 0x00c0, 0x3861,
++      0x6998, 0x6a94, 0x692e, 0x6a32, 0x7044, 0xa005, 0x00c0, 0x385e,
++      0x2200, 0xa105, 0x0040, 0x3860, 0x7047, 0x0015, 0x0078, 0x55ac,
++      0x007c, 0xd6ac, 0x0040, 0x388b, 0xd6f4, 0x0040, 0x386d, 0x682f,
++      0x0000, 0x6833, 0x0000, 0x0078, 0x55ac, 0x68b4, 0xa084, 0x4000,
++      0xa635, 0xd6f4, 0x00c0, 0x3867, 0x7044, 0xa005, 0x00c0, 0x387a,
++      0x7047, 0x0015, 0xd6dc, 0x00c0, 0x3885, 0x68b4, 0xd0dc, 0x0040,
++      0x3885, 0x69a8, 0x6aa4, 0x0078, 0x3887, 0x79d8, 0x7adc, 0x692e,
++      0x6a32, 0x0078, 0x55ac, 0xd6f4, 0x0040, 0x3894, 0x682f, 0x0000,
++      0x6833, 0x0000, 0x0078, 0x55ac, 0x68b4, 0xa084, 0x4800, 0xa635,
++      0xd6f4, 0x00c0, 0x388e, 0x7044, 0xa005, 0x00c0, 0x38a1, 0x7047,
++      0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb, 0x00c8, 0x38a8, 0x8000,
++      0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a32, 0x2100,
++      0xa205, 0x00c0, 0x38b5, 0x0078, 0x55ac, 0x7000, 0xa086, 0x0006,
++      0x0040, 0x38bc, 0x0078, 0x55ac, 0x007c, 0x6008, 0xc0cd, 0xd3cc,
++      0x0040, 0x38c3, 0xc08d, 0x600a, 0x6818, 0x68ba, 0x681b, 0x0006,
++      0x688f, 0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942,
++      0x682f, 0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000,
++      0x689b, 0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0079,
++      0x38e1, 0x2c6e, 0x38f3, 0x38eb, 0x38e9, 0x38e9, 0x38e9, 0x38e9,
++      0x38e9, 0x1078, 0x2bfa, 0x6820, 0xd084, 0x00c0, 0x38f3, 0x1078,
++      0x3fd3, 0x0078, 0x38f9, 0x7060, 0x2c50, 0x2060, 0x6800, 0x6002,
++      0x2a60, 0xb28c, 0x0300, 0x0040, 0x3901, 0x2021, 0x6059, 0x0078,
++      0x3903, 0x2021, 0x6099, 0x2404, 0xa005, 0x0040, 0x390a, 0x2020,
++      0x0078, 0x3903, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078, 0x3fda,
++      0x1078, 0x3fe8, 0x6008, 0xc0cc, 0x600a, 0x789b, 0x000e, 0x6f14,
++      0x6817, 0x0002, 0xb28c, 0x0300, 0x0040, 0x3922, 0x2009, 0x0000,
++      0x0078, 0x3924, 0x2009, 0x0001, 0x1078, 0x5ab0, 0xd6dc, 0x0040,
++      0x392c, 0x691c, 0xc1ed, 0x691e, 0x68b8, 0xd0fc, 0x00c0, 0x3933,
++      0x681a, 0x0078, 0x3942, 0x6818, 0xd0fc, 0x0040, 0x3942, 0x7868,
++      0xa08c, 0x00ff, 0x0040, 0x3940, 0x681b, 0x001e, 0x0078, 0x3942,
++      0x681b, 0x0000, 0xb284, 0x0300, 0x00c0, 0x394a, 0x2021, 0x6099,
++      0x0078, 0x394c, 0x2021, 0x6059, 0x2404, 0xad06, 0x0040, 0x3951,
++      0x7460, 0x6800, 0x2022, 0x68d3, 0x0000, 0x70f4, 0xc084, 0x70f6,
++      0x6a3c, 0x6940, 0x6a32, 0x692e, 0x68c4, 0x2060, 0x6000, 0xd0a4,
++      0x0040, 0x3996, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020,
++      0x0d7e, 0x0f7e, 0x157e, 0x147e, 0x2079, 0x6000, 0x1078, 0x1e83,
++      0x147f, 0x157f, 0x0f7f, 0x70e8, 0x2010, 0x2009, 0x0101, 0x027e,
++      0x2204, 0xa06d, 0x0040, 0x3986, 0x6814, 0xa706, 0x0040, 0x3983,
++      0x6800, 0x0078, 0x3979, 0x6820, 0xc0d5, 0x6822, 0x027f, 0x8210,
++      0x8109, 0x00c0, 0x3977, 0x0d7f, 0x706b, 0x0003, 0x7083, 0x0000,
++      0x777a, 0x7087, 0x000f, 0x71f0, 0xc1dc, 0x71f2, 0x6818, 0xa086,
++      0x0002, 0x00c0, 0x39a2, 0x6817, 0x0000, 0x682b, 0x0000, 0x681c,
++      0xc0ec, 0x681e, 0x1078, 0x2251, 0x0078, 0x2c6e, 0x1078, 0x383b,
++      0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078, 0x44ff, 0xa08c,
++      0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x39b8, 0x7044, 0x681a,
++      0xa68c, 0x5f00, 0x691e, 0x706b, 0x0000, 0x0078, 0x2c6e, 0x7000,
++      0xa005, 0x00c0, 0x39c5, 0x0078, 0x2c6e, 0xa006, 0x1078, 0x55ac,
++      0x6817, 0x0000, 0x6920, 0xd1ac, 0x00c0, 0x39d0, 0x681b, 0x0014,
++      0xa68c, 0x5f00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff,
++      0x6822, 0x7000, 0x0079, 0x39dc, 0x2c6e, 0x39e9, 0x39e6, 0x39eb,
++      0x39eb, 0x39eb, 0x39e4, 0x39e4, 0x1078, 0x2bfa, 0x6008, 0xc0d4,
++      0x600a, 0x1078, 0x3fe8, 0x6008, 0xc0a4, 0x600a, 0x0078, 0x3f98,
++      0x2300, 0x0079, 0x39f3, 0x39f6, 0x39f8, 0x3a6d, 0x1078, 0x2bfa,
++      0xd6fc, 0x00c0, 0x3a53, 0x7000, 0xa00d, 0x0079, 0x39ff, 0x2c6e,
++      0x3a0f, 0x3a09, 0x3a3f, 0x3a0f, 0x3a4a, 0x3a07, 0x3a07, 0x1078,
++      0x2bfa, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684,
++      0x0060, 0x0040, 0x3a3f, 0xa086, 0x0060, 0x00c0, 0x3a3c, 0xc6ac,
++      0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac, 0x681e, 0xa186,
++      0x0002, 0x0040, 0x3a2e, 0x1078, 0x55ac, 0x69ac, 0x68b0, 0xa115,
++      0x0040, 0x3a2e, 0x1078, 0x5972, 0x0078, 0x3a30, 0x1078, 0x591e,
++      0x781b, 0x0067, 0x71f0, 0xd1b4, 0x00c0, 0x2c5e, 0x70c0, 0xa086,
++      0x0001, 0x00c0, 0x2cc7, 0x007c, 0xd6ec, 0x0040, 0x3a19, 0x6818,
++      0xd0fc, 0x0040, 0x3a4a, 0x681b, 0x0015, 0xd6f4, 0x0040, 0x3a4a,
++      0x681b, 0x0007, 0x1078, 0x446a, 0x007c, 0x78cb, 0x0000, 0x781b,
++      0x00cf, 0x0078, 0x2c5e, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x78d0,
++      0x79d2, 0x801b, 0x00c8, 0x3a5d, 0x8000, 0xa084, 0x003f, 0xa108,
++      0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++      0xa303, 0x68ae, 0x781b, 0x0067, 0x007c, 0x1078, 0x2bfa, 0x2300,
++      0x0079, 0x3a72, 0x3a75, 0x3a77, 0x3ad7, 0x1078, 0x2bfa, 0xd6fc,
++      0x00c0, 0x3ac7, 0x7000, 0xa00d, 0x0079, 0x3a7e, 0x2c6e, 0x3a8e,
++      0x3a88, 0x3abe, 0x3a8e, 0x3ac4, 0x3a86, 0x3a86, 0x1078, 0x2bfa,
++      0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060,
++      0x0040, 0x3abe, 0xa086, 0x0060, 0x00c0, 0x3abb, 0xa6b4, 0xbfbf,
++      0xc6ed, 0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0040, 0x3aaa, 0x1078,
++      0x55ac, 0x69ac, 0x68b0, 0xa115, 0x0040, 0x3aaa, 0x1078, 0x5972,
++      0x0078, 0x3aac, 0x1078, 0x591e, 0x781b, 0x0067, 0x681c, 0xc0b4,
++      0x681e, 0x71f0, 0xd1b4, 0x00c0, 0x2c5e, 0x70c0, 0xa086, 0x0001,
++      0x00c0, 0x2cc7, 0x007c, 0xd6ec, 0x0040, 0x3a98, 0x6818, 0xd0fc,
++      0x0040, 0x3ac4, 0x681b, 0x0007, 0x781b, 0x00d3, 0x007c, 0xc6fc,
++      0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94,
++      0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0067, 0x007c, 0xd6dc,
++      0x0040, 0x3ae0, 0x782b, 0x3009, 0x781b, 0x0067, 0x0078, 0x2c5e,
++      0x6820, 0xc095, 0x6822, 0x1078, 0x4450, 0xc6dd, 0x1078, 0x42bd,
++      0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x2300, 0x0079, 0x3af0,
++      0x3af3, 0x3af5, 0x3af7, 0x1078, 0x2bfa, 0x0078, 0x42aa, 0x7d98,
++      0xd6d4, 0x00c0, 0x3b34, 0x79e4, 0xd1ac, 0x0040, 0x3b06, 0x78ec,
++      0xa084, 0x0003, 0x0040, 0x3b06, 0x782b, 0x3009, 0x789b, 0x0060,
++      0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x7d9a, 0x79e4, 0xd1ac,
++      0x0040, 0x3b17, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x3b30, 0x2001,
++      0x6002, 0x2004, 0xd0e4, 0x00c0, 0x3b2c, 0x6820, 0xd0c4, 0x0040,
++      0x3b2c, 0x0c7e, 0x705c, 0x2060, 0x6004, 0xc09d, 0x6006, 0x6008,
++      0xa084, 0x00ff, 0x600a, 0x0c7f, 0x2001, 0x0014, 0x0078, 0x36cb,
++      0xa184, 0x0007, 0x0079, 0x3b6b, 0x7a90, 0xa294, 0x0007, 0x789b,
++      0x0060, 0x79a8, 0x81ff, 0x0040, 0x3b68, 0x789b, 0x0010, 0x7ba8,
++      0xa384, 0x0001, 0x00c0, 0x3b5b, 0x7ba8, 0x7ba8, 0xa386, 0x0001,
++      0x00c0, 0x3b4e, 0x2009, 0xfff7, 0x0078, 0x3b54, 0xa386, 0x0003,
++      0x00c0, 0x3b5b, 0x2009, 0xffef, 0x0c7e, 0x705c, 0x2060, 0x6004,
++      0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684,
++      0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922,
++      0x7d9a, 0x0078, 0x445a, 0x3361, 0x336b, 0x3b75, 0x3b7b, 0x3b73,
++      0x3b73, 0x445a, 0x445a, 0x1078, 0x2bfa, 0x6920, 0xa18c, 0xfcff,
++      0x6922, 0x0078, 0x4462, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078,
++      0x445a, 0x79e4, 0xa184, 0x0030, 0x0040, 0x3b8b, 0x78ec, 0xa084,
++      0x0003, 0x00c0, 0x3bb9, 0x7000, 0xa086, 0x0004, 0x00c0, 0x3ba5,
++      0x7068, 0xa086, 0x0002, 0x00c0, 0x3b9b, 0x2011, 0x0002, 0x2019,
++      0x0000, 0x0078, 0x31d4, 0x7068, 0xa086, 0x0006, 0x0040, 0x3b95,
++      0x7068, 0xa086, 0x0004, 0x0040, 0x3b95, 0x7000, 0xa086, 0x0000,
++      0x0040, 0x2c5e, 0x6820, 0xd0ac, 0x00c0, 0x36cb, 0x6818, 0xa08e,
++      0x0002, 0x0040, 0x3bb7, 0xc0fd, 0x681a, 0x2001, 0x0014, 0x0078,
++      0x36cb, 0xa184, 0x0007, 0x0079, 0x3bbd, 0x445a, 0x445a, 0x3bc5,
++      0x445a, 0x44b1, 0x44b1, 0x445a, 0x445a, 0xd6bc, 0x0040, 0x3c09,
++      0x7188, 0x81ff, 0x0040, 0x3c09, 0xa182, 0x000d, 0x00d0, 0x3bd4,
++      0x708b, 0x0000, 0x0078, 0x3bd9, 0xa182, 0x000c, 0x708a, 0x2009,
++      0x000c, 0x789b, 0x0061, 0x79aa, 0x157e, 0x137e, 0x147e, 0x708c,
++      0x8114, 0xa210, 0x728e, 0xa080, 0x000b, 0xad00, 0x2098, 0x017e,
++      0xb28c, 0x0300, 0x0040, 0x3bfc, 0x007e, 0x2001, 0x6002, 0x2004,
++      0xd0ec, 0x007f, 0x0040, 0x3bf8, 0x20a1, 0x012b, 0x0078, 0x3bfe,
++      0x20a1, 0x022b, 0x0078, 0x3bfe, 0x20a1, 0x012b, 0x017f, 0x789b,
++      0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f, 0x137f, 0x157f, 0x0078,
++      0x4462, 0xd6d4, 0x00c0, 0x3c5c, 0x6820, 0xd084, 0x0040, 0x4462,
++      0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x3c1b, 0xa086, 0x0060,
++      0x00c0, 0x3c1b, 0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060,
++      0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa,
++      0x8008, 0x810c, 0x0040, 0x4001, 0xa18c, 0x00f8, 0x00c0, 0x4001,
++      0x157e, 0x137e, 0x147e, 0x017e, 0xb28c, 0x0300, 0x0040, 0x3c48,
++      0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x3c44,
++      0x20a1, 0x012b, 0x0078, 0x3c4a, 0x20a1, 0x022b, 0x0078, 0x3c4a,
++      0x20a1, 0x012b, 0x017f, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
++      0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0xc0fc,
++      0x8007, 0x7882, 0x0078, 0x4462, 0x6818, 0xd0fc, 0x0040, 0x3c62,
++      0x681b, 0x0008, 0x6820, 0xc0ad, 0x6822, 0x1078, 0x42c5, 0x78cb,
++      0x0000, 0x781b, 0x00cb, 0x007c, 0x2300, 0x0079, 0x3c6f, 0x3c74,
++      0x3d11, 0x3c72, 0x1078, 0x2bfa, 0x7000, 0xa084, 0x000f, 0x0079,
++      0x3c79, 0x2c6e, 0x3cc1, 0x3c83, 0x3c8c, 0x3c81, 0x2c6e, 0x3c81,
++      0x3c81, 0x1078, 0x2bfa, 0x681c, 0xd0ec, 0x0040, 0x3c9d, 0x6008,
++      0xc08d, 0x600a, 0x0078, 0x3c9d, 0x68d0, 0xa005, 0x00c0, 0x3cc1,
++      0x6920, 0xa18d, 0x0001, 0x6922, 0x68d3, 0x0001, 0x70f4, 0xc085,
++      0x70f6, 0x6800, 0x7066, 0x0078, 0x3cae, 0x6920, 0xc185, 0x6922,
++      0x6800, 0x6006, 0xa005, 0x00c0, 0x3ca6, 0x6002, 0x6008, 0xc0d4,
++      0x600a, 0x681c, 0xa084, 0x000e, 0x00c0, 0x3cb8, 0x2009, 0xa7d0,
++      0xb284, 0x0300, 0x0040, 0x3cbd, 0x2009, 0xa6c0, 0x0078, 0x3cbd,
++      0x702c, 0x68be, 0x713c, 0x70e8, 0xa108, 0x2104, 0x6802, 0x2d0a,
++      0x7162, 0x6eb6, 0xa684, 0x0060, 0x00c0, 0x3ccb, 0xa684, 0x7fff,
++      0x68b6, 0x0078, 0x3d0f, 0xd6dc, 0x00c0, 0x3cd9, 0xa684, 0x7fff,
++      0x68b6, 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x55ac, 0x0078,
++      0x3d0f, 0xd6ac, 0x0040, 0x3cec, 0x68d0, 0xa005, 0x0040, 0x3ce4,
++      0x1078, 0x5ab0, 0x0078, 0x3ce6, 0x1078, 0x55ac, 0x79d8, 0x7adc,
++      0x69aa, 0x6aa6, 0x0078, 0x3cf2, 0x1078, 0x43bc, 0x69aa, 0x6aa6,
++      0x1078, 0x55ac, 0xd6fc, 0x0040, 0x3d0f, 0xa684, 0x7fff, 0x68b6,
++      0x7adc, 0x79d8, 0xd6ac, 0x00c0, 0x3d07, 0x78d0, 0x801b, 0x00c8,
++      0x3d02, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98,
++      0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x0078,
++      0x2c6e, 0x0078, 0x42aa, 0x7043, 0x0000, 0xa282, 0x0006, 0x0050,
++      0x3d1b, 0x1078, 0x2bfa, 0x7000, 0xa086, 0x0007, 0x1040, 0x45de,
++      0x2300, 0x0079, 0x3d23, 0x3d26, 0x3d5d, 0x3d7e, 0x2200, 0x0079,
++      0x3d29, 0x3d5b, 0x42aa, 0x3d2f, 0x3d5b, 0x3da1, 0x3e14, 0x7003,
++      0x0005, 0xb284, 0x0300, 0x0040, 0x3d39, 0x2001, 0xaa20, 0x0078,
++      0x3d3b, 0x2001, 0xaa57, 0x2068, 0x7052, 0x157e, 0x20a9, 0x0037,
++      0x2003, 0x0000, 0x8000, 0x00f0, 0x3d40, 0x157f, 0xad80, 0x0009,
++      0x7042, 0xb284, 0x0300, 0x0040, 0x3d51, 0x6817, 0x0000, 0x0078,
++      0x3d53, 0x6817, 0x8000, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
++      0x0003, 0x0078, 0x429c, 0x1078, 0x2bfa, 0x2200, 0xa086, 0x0003,
++      0x0040, 0x3da1, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3d6c,
++      0x2001, 0xaa20, 0x0078, 0x3d6e, 0x2001, 0xaa57, 0x2068, 0x7052,
++      0xad80, 0x0009, 0x7042, 0x2200, 0x0079, 0x3d76, 0x42aa, 0x3d7c,
++      0x3d7c, 0x3da1, 0x3d7c, 0x42aa, 0x1078, 0x2bfa, 0x7003, 0x0005,
++      0xb284, 0x0300, 0x0040, 0x3d88, 0x2001, 0xaa20, 0x0078, 0x3d8a,
++      0x2001, 0xaa57, 0x2068, 0x7052, 0xad80, 0x0009, 0x7042, 0x2200,
++      0x0079, 0x3d92, 0x3d9a, 0x3d98, 0x3d98, 0x3d9a, 0x3d98, 0x3d9a,
++      0x1078, 0x2bfa, 0x1078, 0x42cd, 0x782b, 0x3008, 0x781b, 0x0067,
++      0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3db3, 0x70f0, 0xc0b5,
++      0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da, 0x0078, 0x3db8, 0x1078,
++      0x55ac, 0x0078, 0x3db8, 0x7000, 0xa086, 0x0003, 0x0040, 0x3daf,
++      0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
++      0xa484, 0x001f, 0xa215, 0x2069, 0xa6c0, 0xb284, 0x0300, 0x00c0,
++      0x3dcc, 0xc2fd, 0x2069, 0xa7d0, 0x2d04, 0x2d08, 0x7162, 0xa06d,
++      0x0040, 0x3dd9, 0x6814, 0xa206, 0x0040, 0x3df9, 0x6800, 0x0078,
++      0x3dcd, 0x7003, 0x0005, 0xd2fc, 0x00c0, 0x3de2, 0x2001, 0xaa20,
++      0x0078, 0x3de4, 0x2001, 0xaa57, 0x2068, 0x7052, 0x157e, 0x20a9,
++      0x0037, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3de9, 0x157f, 0xad80,
++      0x0009, 0x7042, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827,
++      0x0003, 0x6eb4, 0x7e5a, 0x6920, 0xa184, 0x0c00, 0x0040, 0x3e9e,
++      0x7068, 0xa086, 0x0006, 0x00c0, 0x3e0b, 0x7078, 0xa206, 0x00c0,
++      0x3e0b, 0x706a, 0x7082, 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922,
++      0x1078, 0x42c5, 0x0078, 0x3e9e, 0x7200, 0xa286, 0x0002, 0x00c0,
++      0x3e26, 0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da,
++      0x0078, 0x3e2a, 0x1078, 0x55ac, 0x0078, 0x3e2a, 0xa286, 0x0003,
++      0x0040, 0x3e22, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b,
++      0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0xb284, 0x0300, 0x00c0,
++      0x3e3a, 0xc2fd, 0x79a8, 0x79a8, 0xa18c, 0x00ff, 0x2118, 0x70e8,
++      0xa168, 0x2d04, 0x2d08, 0x7162, 0xa06d, 0x0040, 0x3e4e, 0x6814,
++      0xa206, 0x0040, 0x3e77, 0x6800, 0x0078, 0x3e42, 0x7003, 0x0005,
++      0xb284, 0x0300, 0x0040, 0x3e58, 0x2001, 0xaa20, 0x0078, 0x3e5a,
++      0x2001, 0xaa57, 0x2068, 0x7052, 0x157e, 0x20a9, 0x0037, 0x2003,
++      0x0000, 0x8000, 0x00f0, 0x3e5f, 0x157f, 0xad80, 0x0009, 0x7042,
++      0xb284, 0x0300, 0x0040, 0x3e6f, 0xc2fc, 0x0078, 0x3e70, 0xc2fd,
++      0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4,
++      0x6920, 0xa184, 0x0c00, 0x0040, 0x3e9e, 0xd0dc, 0x0040, 0x3e93,
++      0x7068, 0xa086, 0x0004, 0x00c0, 0x3e8f, 0x7078, 0xa206, 0x00c0,
++      0x3e8f, 0x707c, 0xa306, 0x00c0, 0x3e8f, 0x706a, 0x7082, 0x1078,
++      0x42c9, 0x0078, 0x3e9e, 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922,
++      0x1078, 0x42c5, 0x7083, 0x0000, 0x0078, 0x3e9e, 0x68c4, 0x705e,
++      0xc6ec, 0xa684, 0x0060, 0x0040, 0x3ee9, 0x6b98, 0x6c94, 0x69ac,
++      0x68b0, 0xa105, 0x00c0, 0x3ecb, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde,
++      0xa684, 0x0060, 0xa086, 0x0060, 0x0040, 0x3eef, 0x68d0, 0xa005,
++      0x0040, 0x3ec3, 0x7003, 0x0003, 0x682b, 0x0000, 0xc6ed, 0x1078,
++      0x590b, 0x0078, 0x3eef, 0xd6f4, 0x00c0, 0x3eef, 0xc6ed, 0x1078,
++      0x591e, 0x0078, 0x3eef, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400,
++      0xa305, 0x0040, 0x3ef1, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68d0,
++      0xa005, 0x0040, 0x3ee1, 0x7003, 0x0003, 0x1078, 0x590b, 0x0078,
++      0x3ef1, 0xd6f4, 0x00c0, 0x3ee8, 0xc6ed, 0x68b0, 0x1078, 0x5972,
++      0xc6f4, 0x2019, 0x0000, 0x2021, 0x0000, 0x0078, 0x3ef1, 0xa6b4,
++      0xb7ff, 0x7e5a, 0x2009, 0x0067, 0xa684, 0x0004, 0x0040, 0x3f11,
++      0x78e4, 0xa084, 0x0030, 0x0040, 0x3f09, 0x78ec, 0xa084, 0x0003,
++      0x0040, 0x3f09, 0x782b, 0x3008, 0x2019, 0x0000, 0x2320, 0x0078,
++      0x3f11, 0x0f7e, 0x2079, 0x6000, 0x1078, 0x55ac, 0x0f7f, 0x0040,
++      0x2c6e, 0x791a, 0x2d00, 0x7052, 0x68c8, 0x2060, 0x71f0, 0x2001,
++      0x6001, 0x2004, 0xd0c4, 0x00c0, 0x3f65, 0x70f8, 0xa02d, 0x0040,
++      0x3f3e, 0xd1bc, 0x0040, 0x3f58, 0x7a80, 0xa294, 0x0f00, 0x70fc,
++      0xa206, 0x0040, 0x3f2f, 0x78e0, 0xa504, 0x00c0, 0x3f65, 0x70fa,
++      0xc1bc, 0x71f2, 0x0078, 0x3f65, 0x2031, 0x0001, 0x852c, 0x0048,
++      0x3f3d, 0x8633, 0x8210, 0x0078, 0x3f36, 0x007c, 0x7de0, 0xa594,
++      0xff00, 0x0040, 0x3f4b, 0x2011, 0x0008, 0x852f, 0x1078, 0x3f34,
++      0x8637, 0x0078, 0x3f4d, 0x1078, 0x3f34, 0x8217, 0x7880, 0xa084,
++      0x0f00, 0xa206, 0x0040, 0x3f65, 0x72fe, 0x76fa, 0x0078, 0x3f65,
++      0x7a80, 0xa294, 0x0f00, 0x70fc, 0xa236, 0x0040, 0x3f55, 0x78e0,
++      0xa534, 0x0040, 0x3f55, 0xc1bd, 0x71f2, 0xd1b4, 0x00c0, 0x2c5e,
++      0x2300, 0xa405, 0x0040, 0x2c5e, 0x70c0, 0xa086, 0x0001, 0x00c0,
++      0x2cc7, 0x007c, 0x6020, 0xa005, 0x0040, 0x3f80, 0x8001, 0x6022,
++      0x6008, 0xa085, 0x0008, 0x600a, 0x700b, 0x0100, 0x7028, 0x6026,
++      0x007c, 0xa006, 0x1078, 0x55ac, 0x7000, 0xa086, 0x0002, 0x0040,
++      0x3f8e, 0x7068, 0xa086, 0x0005, 0x00c0, 0x3f98, 0x682b, 0x0000,
++      0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100,
++      0x7000, 0xa084, 0x000f, 0x0079, 0x3f9d, 0x2c6e, 0x3fad, 0x3fa7,
++      0x3fcf, 0x3fb7, 0x3fb5, 0x3fa5, 0x3fa5, 0x1078, 0x2bfa, 0x1078,
++      0x3fda, 0x1078, 0x3fd3, 0x0078, 0x3fb3, 0x1078, 0x3fda, 0x7060,
++      0x2060, 0x6800, 0x6002, 0x1078, 0x2251, 0x0078, 0x2c6e, 0x7068,
++      0x706b, 0x0000, 0x7087, 0x0000, 0x0079, 0x3fbe, 0x3fcb, 0x3fcb,
++      0x3fc6, 0x3fc6, 0x3fc6, 0x3fcb, 0x3fc6, 0x3fcb, 0x77f0, 0xc7dd,
++      0x77f2, 0x0079, 0x31ef, 0x706b, 0x0000, 0x0078, 0x2c6e, 0x681b,
++      0x0000, 0x0078, 0x390e, 0x6800, 0xa005, 0x00c0, 0x3fd8, 0x6002,
++      0x6006, 0x007c, 0x6010, 0xa005, 0x0040, 0x3fe3, 0x8001, 0x00d0,
++      0x3fe3, 0x1078, 0x2bfa, 0x6012, 0x6008, 0xc0a4, 0x600a, 0x007c,
++      0x6018, 0xa005, 0x0040, 0x3fee, 0x8001, 0x601a, 0x007c, 0x1078,
++      0x44fa, 0x681b, 0x0018, 0x0078, 0x402d, 0x1078, 0x44fa, 0x681b,
++      0x0019, 0x0078, 0x402d, 0x1078, 0x44fa, 0x681b, 0x001a, 0x0078,
++      0x402d, 0x1078, 0x44fa, 0x681b, 0x0003, 0x0078, 0x402d, 0x7778,
++      0x1078, 0x43a8, 0x717c, 0xa18c, 0x00ff, 0xd7fc, 0x00c0, 0x4014,
++      0xa1e8, 0xa5c0, 0x0078, 0x4016, 0xa1e8, 0xa6d0, 0x2d04, 0x2d08,
++      0x2068, 0xa005, 0x00c0, 0x401f, 0x7082, 0x0078, 0x2c6e, 0x6814,
++      0x7278, 0xa206, 0x0040, 0x4027, 0x6800, 0x0078, 0x4017, 0x6800,
++      0x200a, 0x681b, 0x0005, 0x7083, 0x0000, 0x1078, 0x3fda, 0x6820,
++      0xd084, 0x00c0, 0x4035, 0x1078, 0x3fd3, 0x1078, 0x3fe8, 0x681f,
++      0x0000, 0x6823, 0x0020, 0x682b, 0x0000, 0x1078, 0x2251, 0x0078,
++      0x2c6e, 0xa282, 0x0003, 0x00c0, 0x429c, 0x7da8, 0xa5ac, 0x00ff,
++      0x7ca8, 0xa4a4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x0040,
++      0x409f, 0xc1c4, 0x6922, 0xa4a4, 0x00ff, 0x0040, 0x408c, 0xa482,
++      0x000c, 0x0048, 0x405f, 0x0040, 0x405f, 0x2021, 0x000c, 0x2500,
++      0xa086, 0x000a, 0x0040, 0x4066, 0x852b, 0x852b, 0x1078, 0x4334,
++      0x0040, 0x406e, 0x1078, 0x4162, 0x0078, 0x4095, 0x1078, 0x4320,
++      0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x418d,
++      0x0c7f, 0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4,
++      0x00c0, 0x4087, 0x782b, 0x3008, 0x781b, 0x0058, 0x007c, 0x782b,
++      0x3008, 0x781b, 0x0067, 0x007c, 0x0c7e, 0x2960, 0x6004, 0xa084,
++      0xfff5, 0x6006, 0x1078, 0x418d, 0x0c7f, 0x7e58, 0xd6d4, 0x00c0,
++      0x409c, 0x781b, 0x005a, 0x007c, 0x781b, 0x0067, 0x007c, 0x0c7e,
++      0x705c, 0x2060, 0x6100, 0xd1e4, 0x0040, 0x40e8, 0x6208, 0x8217,
++      0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x40b2, 0x0040, 0x40b2,
++      0x2011, 0x000c, 0x2400, 0xa202, 0x00c8, 0x40b7, 0x2220, 0x6208,
++      0xa294, 0x00ff, 0x2001, 0x6003, 0x2004, 0xd0e4, 0x00c0, 0x40cc,
++      0x78ec, 0xd0e4, 0x0040, 0x40cc, 0xa282, 0x000a, 0x00c8, 0x40d2,
++      0x2011, 0x000a, 0x0078, 0x40d2, 0xa282, 0x000c, 0x00c8, 0x40d2,
++      0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x40d7, 0x2228, 0x1078,
++      0x4324, 0x2500, 0xa086, 0x000a, 0x0040, 0x40e0, 0x852b, 0x852b,
++      0x1078, 0x4334, 0x0040, 0x40e8, 0x1078, 0x4162, 0x0078, 0x40ec,
++      0x1078, 0x4320, 0x1078, 0x418d, 0x7858, 0xc095, 0x785a, 0x0c7f,
++      0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x0c7e, 0x2960, 0x6000,
++      0xd0e4, 0x00c0, 0x410b, 0xa084, 0x0040, 0x00c0, 0x4105, 0x6104,
++      0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019,
++      0x0000, 0x0078, 0x4136, 0x68a0, 0xd0cc, 0x00c0, 0x4105, 0x6208,
++      0xa294, 0x00ff, 0x2001, 0x6003, 0x2004, 0xd0e4, 0x00c0, 0x4124,
++      0x78ec, 0xd0e4, 0x0040, 0x4124, 0xa282, 0x000b, 0x00c8, 0x4124,
++      0x2011, 0x000a, 0x0078, 0x412a, 0xa282, 0x000c, 0x00c8, 0x412a,
++      0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c,
++      0x0048, 0x4136, 0x0040, 0x4136, 0x2019, 0x000c, 0x78ab, 0x0001,
++      0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005,
++      0x6820, 0xc0c5, 0x6822, 0x1078, 0x2d79, 0x0c7f, 0x007c, 0x0c7e,
++      0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019,
++      0x0000, 0x0078, 0x4153, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++      0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822,
++      0x0c7f, 0x007c, 0x0c7e, 0x715c, 0x2160, 0x1078, 0x4169, 0x0c7f,
++      0x007c, 0x2008, 0xa084, 0xfff0, 0xa425, 0x7c86, 0x6018, 0x789a,
++      0x7cae, 0x6412, 0x78a4, 0xa084, 0xfff0, 0xa18c, 0x000f, 0xa105,
++      0x78a6, 0x6016, 0x788a, 0xa4a4, 0x000f, 0x8427, 0x8204, 0x8004,
++      0xa084, 0x00ff, 0xa405, 0x600e, 0x78ec, 0xd08c, 0x00c0, 0x418c,
++      0x6004, 0xa084, 0xfff5, 0x6006, 0x007c, 0x0c7e, 0x705c, 0x2060,
++      0x1078, 0x4194, 0x0c7f, 0x007c, 0x6018, 0x789a, 0x78a4, 0xa084,
++      0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x600c,
++      0xa084, 0x00ff, 0x600e, 0x007c, 0xa282, 0x0002, 0x00c0, 0x429c,
++      0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc, 0x0040, 0x41e3, 0xc1cc,
++      0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x429c, 0x1078,
++      0x4227, 0x1078, 0x418d, 0xa980, 0x0001, 0x200c, 0x1078, 0x43a4,
++      0x1078, 0x40f5, 0x88ff, 0x0040, 0x41d9, 0x789b, 0x0060, 0x2800,
++      0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x41d4, 0x782b,
++      0x3008, 0x781b, 0x0058, 0x007c, 0x782b, 0x3008, 0x781b, 0x0067,
++      0x007c, 0x7e58, 0xd6d4, 0x00c0, 0x41e0, 0x781b, 0x005a, 0x007c,
++      0x781b, 0x0067, 0x007c, 0xa282, 0x0002, 0x00c8, 0x41eb, 0xa284,
++      0x0001, 0x0040, 0x41f3, 0x715c, 0xa188, 0x0000, 0x210c, 0xd1ec,
++      0x00c0, 0x41f3, 0xa016, 0x1078, 0x4311, 0x1078, 0x4227, 0x1078,
++      0x418d, 0x7858, 0xc095, 0x785a, 0x782b, 0x3008, 0x781b, 0x0067,
++      0x007c, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec,
++      0x00c0, 0x4215, 0xa084, 0x0080, 0x00c0, 0x4213, 0xc1a4, 0x6106,
++      0xa006, 0x0078, 0x4224, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab,
++      0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x1078, 0x2d79,
++      0x6820, 0xa085, 0x0200, 0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e,
++      0x705c, 0x2060, 0x1078, 0x422e, 0x0c7f, 0x007c, 0x82ff, 0x0040,
++      0x4233, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4,
++      0xa084, 0xffbf, 0xa205, 0x78a6, 0x788a, 0x6016, 0x6004, 0x78ec,
++      0xd08c, 0x00c0, 0x4245, 0xc0a4, 0x6006, 0x007c, 0x007e, 0x7000,
++      0xa086, 0x0003, 0x0040, 0x424f, 0x007f, 0x0078, 0x4252, 0x007f,
++      0x0078, 0x4299, 0xd6ac, 0x0040, 0x4299, 0x7888, 0xa084, 0x0040,
++      0x0040, 0x4299, 0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x4261,
++      0x8000, 0xa005, 0x0040, 0x4276, 0x831b, 0x00c8, 0x426a, 0x8001,
++      0x0040, 0x4296, 0xd6f4, 0x0040, 0x4276, 0x78b8, 0x801b, 0x00c8,
++      0x4272, 0x8000, 0xa084, 0x003f, 0x00c0, 0x4296, 0xc6f4, 0x7e5a,
++      0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x4281, 0xa291,
++      0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x5a6b, 0x781b,
++      0x0066, 0xb284, 0x0300, 0x0040, 0x4291, 0x2001, 0x0000, 0x0078,
++      0x4293, 0x2001, 0x0001, 0x1078, 0x588c, 0x007c, 0x781b, 0x0066,
++      0x007c, 0x781b, 0x0067, 0x007c, 0x1078, 0x42d1, 0x782b, 0x3008,
++      0x781b, 0x0067, 0x007c, 0x1078, 0x42bd, 0x782b, 0x3008, 0x781b,
++      0x0067, 0x007c, 0x6827, 0x0002, 0x1078, 0x42c5, 0x78e4, 0xa084,
++      0x0030, 0x0040, 0x2c6e, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2c6e,
++      0x782b, 0x3008, 0x781b, 0x0067, 0x007c, 0x2001, 0x0005, 0x0078,
++      0x42d3, 0x2001, 0x000c, 0x0078, 0x42d3, 0x2001, 0x0006, 0x0078,
++      0x42d3, 0x2001, 0x000d, 0x0078, 0x42d3, 0x2001, 0x0009, 0x0078,
++      0x42d3, 0x2001, 0x0007, 0x789b, 0x0010, 0x78aa, 0x789b, 0x0060,
++      0x78ab, 0x0001, 0xc695, 0x7e5a, 0x0078, 0x2d79, 0x077e, 0x873f,
++      0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0x017e, 0xb28c, 0x0300,
++      0x0040, 0x42ee, 0xa0e0, 0x64c0, 0x0078, 0x42f0, 0xa0e0, 0x6540,
++      0x017f, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040,
++      0x4300, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xc09d, 0x6006,
++      0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040, 0x430f,
++      0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xc0a5, 0x6006, 0x077f,
++      0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++      0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, 0x0078, 0x2d79,
++      0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001,
++      0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b, 0x0060,
++      0x78ab, 0x0005, 0x0078, 0x2d79, 0x157e, 0x2001, 0x6003, 0x2004,
++      0xd0e4, 0x00c0, 0x4367, 0x2009, 0x439b, 0x20a9, 0x0009, 0x2510,
++      0xa582, 0x000a, 0x0040, 0x4362, 0x0048, 0x4362, 0x8108, 0x95a9,
++      0xa582, 0x0030, 0x0040, 0x437d, 0x0048, 0x437d, 0x8108, 0x95a9,
++      0x2019, 0x000a, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x437d,
++      0x0048, 0x437d, 0x8108, 0x2300, 0xa210, 0x00f0, 0x4354, 0x157f,
++      0x0078, 0x437b, 0x2510, 0x8213, 0x8213, 0x0078, 0x437d, 0x2009,
++      0x438d, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x2200,
++      0xa502, 0x0040, 0x437d, 0x0048, 0x437d, 0x8108, 0x2300, 0xa210,
++      0x00f0, 0x436f, 0x157f, 0xa006, 0x007c, 0x157f, 0xa582, 0x0064,
++      0x00c8, 0x438a, 0x7808, 0xa085, 0x0070, 0x780a, 0x704c, 0xa085,
++      0x0070, 0x704e, 0x2104, 0xa005, 0x007c, 0x1209, 0x3002, 0x3202,
++      0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06,
++      0x0c07, 0x0c07, 0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06,
++      0x6c06, 0x7c07, 0x7e07, 0x0e00, 0x789b, 0x0010, 0xa046, 0x007c,
++      0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003,
++      0x8003, 0xa105, 0xd7fc, 0x0040, 0x43b9, 0xa0e0, 0x85c0, 0x0078,
++      0x43bb, 0xa0e0, 0x65c0, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b,
++      0x00c8, 0x43c3, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000,
++      0x007c, 0x0e7e, 0x0f7e, 0xd084, 0x0040, 0x43d6, 0x2079, 0x0100,
++      0x2009, 0x6080, 0x2071, 0x6080, 0x0078, 0x43e6, 0x2001, 0x6002,
++      0x2004, 0xd0ec, 0x0040, 0x43e0, 0x2079, 0x0100, 0x0078, 0x43e2,
++      0x2079, 0x0200, 0x2009, 0x6040, 0x2071, 0x6040, 0x2091, 0x8000,
++      0x2104, 0xa084, 0x000f, 0x0079, 0x43ed, 0x43f7, 0x43f7, 0x43f7,
++      0x43f7, 0x43f7, 0x43f7, 0x43f5, 0x444a, 0x1078, 0x2bfa, 0x69b4,
++      0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0040, 0x4447, 0x7858,
++      0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086, 0x1814,
++      0x00c0, 0x4447, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x00c0,
++      0x440c, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0, 0x4413,
++      0x7830, 0xd0bc, 0x00c0, 0x4447, 0x3200, 0x007e, 0x2001, 0x6002,
++      0x2004, 0xd0ec, 0x007f, 0x0040, 0x4429, 0xa084, 0x0300, 0x0078,
++      0x442b, 0xa084, 0x0400, 0x0040, 0x4431, 0x0018, 0x4447, 0x0078,
++      0x4433, 0x0028, 0x4447, 0x79e4, 0xa184, 0x0030, 0x0040, 0x4447,
++      0x78ec, 0xa084, 0x0003, 0x0040, 0x4447, 0x681c, 0xd0ac, 0x00c0,
++      0x4445, 0x1078, 0x446a, 0x0078, 0x4447, 0x781b, 0x00d3, 0x0f7f,
++      0x0e7f, 0x007c, 0x70a7, 0x0000, 0x1078, 0x46d0, 0x0078, 0x4447,
++      0x2001, 0x6001, 0x2004, 0xd0ac, 0x00c0, 0x4459, 0x6814, 0x1078,
++      0x2b7a, 0x007c, 0x781b, 0x0067, 0x007c, 0x782b, 0x3008, 0x781b,
++      0x0067, 0x007c, 0x781b, 0x005a, 0x007c, 0x782b, 0x3008, 0x781b,
++      0x0058, 0x007c, 0x2009, 0x6017, 0x210c, 0xa186, 0x0000, 0x0040,
++      0x447c, 0xa186, 0x0001, 0x0040, 0x4481, 0x701b, 0x000b, 0x706b,
++      0x0001, 0x781b, 0x0048, 0x007c, 0x78cb, 0x0000, 0x781b, 0x00cf,
++      0x007c, 0x701b, 0x000a, 0x007c, 0x2009, 0x6017, 0x210c, 0xa186,
++      0x0000, 0x0040, 0x449a, 0xa186, 0x0001, 0x0040, 0x4497, 0x701b,
++      0x000b, 0x706b, 0x0001, 0x781b, 0x0048, 0x0078, 0x2c5e, 0x701b,
++      0x000a, 0x007c, 0x782b, 0x3008, 0x78cb, 0x0000, 0x781b, 0x00cf,
++      0x007c, 0x781b, 0x00d3, 0x007c, 0x782b, 0x3008, 0x781b, 0x00d3,
++      0x007c, 0x781b, 0x009b, 0x007c, 0x782b, 0x3008, 0x781b, 0x009b,
++      0x007c, 0x6818, 0xd0fc, 0x0040, 0x44b7, 0x681b, 0x001d, 0x706b,
++      0x0001, 0x781b, 0x0048, 0x007c, 0x7830, 0xa084, 0x00c0, 0x00c0,
++      0x44df, 0x7808, 0xa084, 0xfffc, 0x780a, 0x0005, 0x0005, 0x0005,
++      0x0005, 0x78ec, 0xa084, 0x0021, 0x00c0, 0x44dc, 0x2001, 0x6003,
++      0x2004, 0xd0e4, 0x00c0, 0x44da, 0x7804, 0xa084, 0xff1f, 0xa085,
++      0x00e0, 0x7806, 0xa006, 0x007c, 0x704c, 0xc08d, 0x780a, 0x007c,
++      0x7830, 0xa084, 0x0080, 0x00c0, 0x44f9, 0x78ec, 0xa084, 0x0002,
++      0x00c0, 0x44f9, 0x7808, 0xc08c, 0x780a, 0x0005, 0x0005, 0x0005,
++      0x0005, 0x78ec, 0xa084, 0x0002, 0x0040, 0x44f9, 0x7808, 0xc08d,
++      0x780a, 0x007c, 0x704c, 0xc08d, 0x704e, 0x780a, 0x007c, 0x7830,
++      0xa084, 0x0040, 0x00c0, 0x44ff, 0x3200, 0x007e, 0x2001, 0x6002,
++      0x2004, 0xd0ec, 0x007f, 0x0040, 0x4511, 0xa084, 0x0300, 0x0078,
++      0x4513, 0xa084, 0x0400, 0x0040, 0x4519, 0x0098, 0x451d, 0x0078,
++      0x451b, 0x00a8, 0x451d, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd,
++      0x780a, 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021,
++      0x0040, 0x4541, 0x3200, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x4537, 0xa084, 0x0300, 0x0078, 0x4539, 0xa084,
++      0x0400, 0x0040, 0x453f, 0x0098, 0x453b, 0x0078, 0x4541, 0x00a8,
++      0x453f, 0x78ac, 0x007e, 0x704c, 0x780a, 0x007f, 0x007c, 0x78ec,
++      0xa084, 0x0002, 0x00c0, 0x5596, 0xa784, 0x007d, 0x00c0, 0x4553,
++      0x2700, 0x1078, 0x2bfa, 0xa784, 0x0001, 0x00c0, 0x39bf, 0xa784,
++      0x0070, 0x0040, 0x4563, 0x0c7e, 0x2d60, 0x2f68, 0x1078, 0x2b67,
++      0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040, 0x4570, 0x784b,
++      0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x39bf, 0x0078, 0x445a,
++      0xa784, 0x0004, 0x0040, 0x459f, 0x78b8, 0xa084, 0x4001, 0x0040,
++      0x459f, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x39bf,
++      0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0, 0x459f, 0x78c0,
++      0xa085, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00d3, 0x007c, 0x784b,
++      0x0008, 0x6818, 0xd0fc, 0x0040, 0x459c, 0x681b, 0x0015, 0xd6f4,
++      0x0040, 0x459c, 0x681b, 0x0007, 0x1078, 0x446a, 0x007c, 0x681b,
++      0x0003, 0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833,
++      0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x332a,
++      0x3200, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x007f, 0x0040,
++      0x45bd, 0xa084, 0x0300, 0x0078, 0x45bf, 0xa084, 0x0400, 0x0040,
++      0x45c5, 0x0018, 0x2c5e, 0x0078, 0x45c7, 0x0028, 0x2c5e, 0x0078,
++      0x42a3, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0xd3fc, 0x0040, 0x45d7, 0xa080, 0x6540, 0x0078, 0x45d9, 0xa080,
++      0x64c0, 0x2060, 0x2048, 0x705e, 0x2a60, 0x007c, 0x7000, 0x0079,
++      0x45e1, 0x45e9, 0x45e9, 0x45ea, 0x45f2, 0x45e9, 0x45e9, 0x45e9,
++      0x45f5, 0x007c, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
++      0x601a, 0x007c, 0x1078, 0x55ac, 0x007c, 0x7094, 0xa005, 0x0040,
++      0x4610, 0x2068, 0xb284, 0x0300, 0x0040, 0x4602, 0x2009, 0x0000,
++      0x0078, 0x4604, 0x2009, 0x0001, 0x017e, 0x1078, 0x209b, 0x017f,
++      0x017e, 0x1078, 0x552b, 0x017f, 0x1078, 0x552c, 0x7097, 0x0000,
++      0x007c, 0x0e7e, 0x2091, 0x8000, 0x6014, 0xd0fc, 0x00c0, 0x461c,
++      0x2071, 0x6040, 0x0078, 0x461e, 0x2071, 0x6080, 0x7000, 0xa086,
++      0x0007, 0x00c0, 0x462f, 0x6110, 0x70b0, 0xa106, 0x00c0, 0x462f,
++      0x0e7f, 0x1078, 0x20b0, 0x1078, 0x4635, 0xa006, 0x007c, 0x2091,
++      0x8001, 0x0e7f, 0xa085, 0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x0078,
++      0x28b1, 0x785b, 0x0000, 0x70a3, 0x000e, 0x2009, 0x0100, 0x017e,
++      0x7094, 0xa06d, 0x0040, 0x4648, 0x7097, 0x0000, 0x0078, 0x464e,
++      0x70a7, 0x0000, 0x1078, 0x20e4, 0x0040, 0x4654, 0x70a0, 0x6826,
++      0x1078, 0x4781, 0x0078, 0x4648, 0x017f, 0x077e, 0x157e, 0x0c7e,
++      0x0d7e, 0x20a9, 0x0020, 0x3238, 0xa7bc, 0x0300, 0x0040, 0x4665,
++      0x2061, 0xa7e0, 0xc7fc, 0x0078, 0x4668, 0x2061, 0xa900, 0xc7fd,
++      0x6000, 0xa105, 0x6002, 0x601c, 0xa06d, 0x0040, 0x4678, 0x6800,
++      0x601e, 0x1078, 0x1e55, 0x6008, 0x8000, 0x600a, 0x0078, 0x466b,
++      0x6018, 0xa06d, 0x0040, 0x4682, 0x6800, 0x601a, 0x1078, 0x1e55,
++      0x0078, 0x4678, 0xace0, 0x0009, 0x0070, 0x4688, 0x0078, 0x4668,
++      0x7090, 0xa084, 0x8000, 0x0040, 0x468f, 0x1078, 0x480c, 0x0d7f,
++      0x0c7f, 0x157f, 0x077f, 0x007c, 0x6804, 0xa084, 0x000f, 0x0079,
++      0x4699, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46ab,
++      0x46bd, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46a9, 0x46cb, 0x46a9,
++      0x46ab, 0x1078, 0x2bfa, 0x007e, 0x7830, 0xd0b4, 0x0040, 0x46b6,
++      0x784b, 0x0004, 0x7848, 0xd094, 0x00c0, 0x46b2, 0x007f, 0x1078,
++      0x52d3, 0x1078, 0x1e55, 0x0078, 0x46cf, 0x6827, 0x000b, 0x007e,
++      0x7830, 0xd0b4, 0x0040, 0x46ca, 0x784b, 0x0004, 0x7848, 0xd094,
++      0x00c0, 0x46c6, 0x007f, 0x1078, 0x52d3, 0x1078, 0x4781, 0x007c,
++      0x0f7e, 0x6814, 0xd0fc, 0x00c0, 0x46e7, 0x2001, 0x6002, 0x2004,
++      0xd0ec, 0x0040, 0x46e1, 0x2079, 0x0100, 0x0098, 0x4706, 0x0078,
++      0x46eb, 0x2079, 0x0200, 0x00a8, 0x4706, 0x0078, 0x46eb, 0x2079,
++      0x0100, 0x0098, 0x4706, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x4706,
++      0x0d7e, 0x1078, 0x5539, 0x2d00, 0x682e, 0x2009, 0x0004, 0x2001,
++      0x0000, 0x6827, 0x0084, 0x1078, 0x54df, 0x1078, 0x4781, 0x0d7f,
++      0x70a8, 0xa080, 0x00af, 0x781a, 0x0078, 0x474f, 0x7948, 0x6814,
++      0xd0fc, 0x00c0, 0x4719, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x0040,
++      0x4715, 0x0098, 0x471e, 0x0078, 0x471b, 0x00a8, 0x471e, 0x0078,
++      0x471b, 0x0098, 0x471e, 0x794a, 0x0078, 0x46f0, 0x7948, 0x7828,
++      0x007e, 0xa084, 0xf000, 0xa086, 0x1000, 0x007f, 0x00c0, 0x471b,
++      0xd0b4, 0x00c0, 0x471b, 0xd0ac, 0x0040, 0x4732, 0xa185, 0x0004,
++      0x0078, 0x4734, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e, 0x78ab,
++      0x0002, 0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a, 0x70a8,
++      0xa080, 0x0097, 0x781a, 0x6827, 0x0284, 0x682c, 0x6836, 0x6830,
++      0x683a, 0x2009, 0x0004, 0x2001, 0x0000, 0x1078, 0x54df, 0x0f7f,
++      0x007c, 0x0d7e, 0x6b14, 0x1078, 0x2160, 0x0040, 0x475e, 0x2068,
++      0x6827, 0x0002, 0x1078, 0x4781, 0x0078, 0x4753, 0x0d7f, 0x007c,
++      0x0d7e, 0x6b14, 0x6c28, 0xa4a4, 0x00ff, 0x1078, 0x20f0, 0x0040,
++      0x476e, 0x2068, 0x6827, 0x0002, 0x1078, 0x4781, 0x0d7f, 0x007c,
++      0x0d7e, 0x6814, 0xa09c, 0x00ff, 0x1078, 0x212a, 0x0040, 0x477f,
++      0x2068, 0x6827, 0x0002, 0x1078, 0x4781, 0x0078, 0x4774, 0x0d7f,
++      0x007c, 0x0c7e, 0x6914, 0x6814, 0x1078, 0x47fa, 0x6904, 0xa18c,
++      0x00ff, 0xa186, 0x0006, 0x0040, 0x479d, 0xa186, 0x000d, 0x0040,
++      0x47c1, 0xa186, 0x0017, 0x00c0, 0x4799, 0x1078, 0x1e55, 0x0c7f,
++      0x007c, 0x1078, 0x2253, 0x0c7f, 0x007c, 0x6004, 0x8001, 0x0048,
++      0x47ba, 0x6006, 0x2009, 0x0000, 0xa684, 0x0001, 0x00c0, 0x47aa,
++      0xa18d, 0x8000, 0xa684, 0x0004, 0x0040, 0x47b0, 0xa18d, 0x0002,
++      0x691e, 0x6823, 0x0000, 0x711c, 0x810f, 0x6818, 0xa105, 0x681a,
++      0x0078, 0x4799, 0x6100, 0xa184, 0x0001, 0x0040, 0x4795, 0x1078,
++      0x2bfa, 0x6018, 0xa005, 0x00c0, 0x47d0, 0x6008, 0x8001, 0x0048,
++      0x47d0, 0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x0078, 0x47e8,
++      0xac88, 0x0006, 0x2104, 0xa005, 0x0040, 0x47d9, 0x2008, 0x0078,
++      0x47d2, 0x6802, 0x2d0a, 0x6008, 0x8001, 0x0048, 0x47e6, 0x600a,
++      0x6018, 0x2068, 0x6800, 0x601a, 0x0078, 0x47ca, 0x0c7f, 0x007c,
++      0x157e, 0x137e, 0x147e, 0x0c7e, 0x0d7e, 0x1078, 0x1e32, 0x2da0,
++      0x137f, 0x20a9, 0x0037, 0x53a3, 0x0c7f, 0x147f, 0x137f, 0x157f,
++      0x0078, 0x4799, 0xd0fc, 0x00c0, 0x4801, 0x2061, 0xa7e0, 0x0078,
++      0x4803, 0x2061, 0xa900, 0xa184, 0x001f, 0xac60, 0x8003, 0x8003,
++      0x8003, 0xac00, 0x2060, 0x007c, 0xd7fc, 0x00c0, 0x481f, 0x2019,
++      0x6053, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x0040, 0x481b, 0x2021,
++      0x0102, 0x0078, 0x4823, 0x2021, 0x0202, 0x0078, 0x4823, 0x2019,
++      0x6093, 0x2021, 0x0102, 0x2304, 0xa085, 0x0001, 0x201a, 0x2404,
++      0xa085, 0x0001, 0x2022, 0x007c, 0xd7fc, 0x00c0, 0x483f, 0x2019,
++      0x6053, 0x2001, 0x6002, 0x2004, 0xd0ec, 0x0040, 0x483b, 0x2021,
++      0x0102, 0x0078, 0x4843, 0x2021, 0x0202, 0x0078, 0x4843, 0x2019,
++      0x6093, 0x2021, 0x0102, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2404,
++      0xa084, 0xfffe, 0x2022, 0x007c, 0x7990, 0xa18c, 0xfff8, 0x7992,
++      0x70a8, 0xa080, 0x00d7, 0x781a, 0x0078, 0x2c5e, 0x7097, 0x0000,
++      0x7003, 0x0000, 0x704b, 0x0001, 0x7043, 0x0000, 0x1078, 0x20e4,
++      0x0040, 0x488c, 0x70ef, 0x0000, 0x68cc, 0x2060, 0x6100, 0xa184,
++      0x0300, 0x0040, 0x4877, 0x6827, 0x000e, 0xa084, 0x0200, 0x0040,
++      0x4873, 0x6827, 0x0017, 0x1078, 0x4781, 0x0078, 0x4856, 0x7000,
++      0xa086, 0x0007, 0x00c0, 0x4905, 0x6910, 0x70b0, 0xa106, 0x0040,
++      0x4885, 0x2d60, 0x1078, 0x20b0, 0x007c, 0x2d00, 0x7096, 0xad80,
++      0x000f, 0x7042, 0x0078, 0x4897, 0x7010, 0xa005, 0x00c0, 0x4895,
++      0x7048, 0xa086, 0x0001, 0x0040, 0x2c78, 0x0078, 0x2c5e, 0xa036,
++      0x691c, 0xa184, 0x0002, 0x0040, 0x489f, 0xa6b5, 0x0004, 0xa184,
++      0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x49b3, 0x2004, 0xa635,
++      0x1078, 0x2d79, 0x6820, 0xa084, 0x0400, 0x0040, 0x48b9, 0x789b,
++      0x0018, 0x78ab, 0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5,
++      0x5000, 0x6820, 0xa084, 0x8000, 0x0040, 0x48c7, 0xa6b5, 0x0400,
++      0x789b, 0x000e, 0x6824, 0x8007, 0x78aa, 0x0078, 0x48e7, 0x681c,
++      0xd0fc, 0x00c0, 0x48d5, 0xa6b5, 0x0800, 0x6820, 0xd0c4, 0x0040,
++      0x48e7, 0xa6b5, 0x4000, 0x0078, 0x48e7, 0x6820, 0xd0c4, 0x0040,
++      0x48dd, 0xa6b5, 0x4000, 0x0078, 0x48e7, 0x789b, 0x0018, 0x78ab,
++      0x0002, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0xa684,
++      0x0200, 0x0040, 0x4901, 0x682c, 0x78d2, 0x6830, 0x78d6, 0xa684,
++      0x0100, 0x0040, 0x48ff, 0x682c, 0xa084, 0x0001, 0x0040, 0x48ff,
++      0x7888, 0xa084, 0x0040, 0x0040, 0x48ff, 0xa6b5, 0x8000, 0x1078,
++      0x550e, 0x7e5a, 0x6eb6, 0x0078, 0x5558, 0x1078, 0x44bc, 0x00c0,
++      0x49ad, 0x2041, 0x0001, 0x2031, 0x1000, 0x1078, 0x2d79, 0x789b,
++      0x0018, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080, 0x78aa, 0x691c,
++      0xa184, 0x0002, 0x0040, 0x4924, 0xa6b5, 0x0004, 0x78ab, 0x0020,
++      0x6828, 0x78aa, 0xa8c0, 0x0002, 0x681c, 0xd0f4, 0x0040, 0x492d,
++      0x2c50, 0x1078, 0x45c9, 0x1078, 0x5424, 0x6820, 0xa084, 0x8000,
++      0x0040, 0x493b, 0xa6b5, 0x0400, 0x789b, 0x000e, 0x6824, 0x8007,
++      0x78aa, 0x0078, 0x4949, 0x681c, 0xa084, 0x8000, 0x00c0, 0x4949,
++      0xa6b5, 0x0800, 0x6820, 0xa084, 0x0100, 0x0040, 0x4949, 0xa6b5,
++      0x4000, 0x681c, 0xa084, 0x00c0, 0x8003, 0x8003, 0x8007, 0xa080,
++      0x49b3, 0x2004, 0xa635, 0xa684, 0x0100, 0x0040, 0x4963, 0x682c,
++      0xa084, 0x0001, 0x0040, 0x4963, 0x7888, 0xa084, 0x0040, 0x0040,
++      0x4963, 0xa6b5, 0x8000, 0x789b, 0x007e, 0x7eae, 0x6eb6, 0x6814,
++      0xc0fc, 0x8007, 0x78aa, 0x7882, 0x2810, 0x7aaa, 0x7830, 0xa084,
++      0x00c0, 0x00c0, 0x49ad, 0x6914, 0xd1fc, 0x00c0, 0x4985, 0x2001,
++      0x6002, 0x2004, 0xd0ec, 0x0040, 0x4981, 0x0018, 0x49ad, 0x0078,
++      0x4987, 0x0028, 0x49ad, 0x0078, 0x4987, 0x0018, 0x49ad, 0x127e,
++      0x0d7e, 0x0c7e, 0x70f0, 0xa084, 0x2700, 0x2090, 0x0c7f, 0x0d7f,
++      0x127f, 0xa684, 0x0200, 0x0040, 0x499b, 0x682c, 0x78d2, 0x6830,
++      0x78d6, 0x1078, 0x550e, 0x70a8, 0xa080, 0x00dc, 0x781a, 0x1078,
++      0x44fa, 0x2d00, 0x7096, 0x7052, 0x6810, 0x70b2, 0x7003, 0x0007,
++      0xad80, 0x000f, 0x7042, 0x0078, 0x2c5e, 0x1078, 0x209b, 0x1078,
++      0x44fa, 0x0078, 0x2c5e, 0x0000, 0x0300, 0x0200, 0x0000, 0x1078,
++      0x2bfa, 0x1078, 0x2bed, 0x2300, 0x0079, 0x49be, 0x49c3, 0x49c1,
++      0x49c8, 0x1078, 0x2bfa, 0x71a8, 0xa188, 0x0097, 0x791a, 0x007c,
++      0x1078, 0x552c, 0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x0040,
++      0x49da, 0xa184, 0xff00, 0xa085, 0x000a, 0x6826, 0x1078, 0x209b,
++      0x0078, 0x4856, 0x2001, 0x000a, 0x1078, 0x54ae, 0x0078, 0x4856,
++      0xa282, 0x0005, 0x0050, 0x49e6, 0x1078, 0x2bfa, 0x7000, 0xa084,
++      0x000f, 0x10c0, 0x45de, 0x1078, 0x1e32, 0x00c0, 0x4a08, 0x2069,
++      0xffff, 0xa684, 0x0004, 0x0040, 0x49f9, 0x2001, 0x2800, 0x0078,
++      0x49fb, 0x2001, 0x0800, 0x71a8, 0xa188, 0x0097, 0x789b, 0x000e,
++      0x8007, 0x78aa, 0x2031, 0x0400, 0x7e5a, 0x791a, 0x0078, 0x2c5e,
++      0x6807, 0x0106, 0x680b, 0x0000, 0x689f, 0x0000, 0x6827, 0x0000,
++      0xa386, 0x0002, 0x00c0, 0x4a28, 0xa286, 0x0002, 0x00c0, 0x4a28,
++      0x78a0, 0xa005, 0x00c0, 0x4a28, 0xd4fc, 0x00c0, 0x4a28, 0x78e4,
++      0xa084, 0x0008, 0x0040, 0x4a28, 0xa6b5, 0x0008, 0x2019, 0x0000,
++      0x1078, 0x4e89, 0x2d00, 0x7096, 0x7052, 0x7003, 0x0007, 0x7043,
++      0x0000, 0x6020, 0xa084, 0x000f, 0x680e, 0x6824, 0xa084, 0x0080,
++      0x0040, 0x4a3e, 0x1078, 0x4f59, 0x0078, 0x2c5e, 0x2300, 0x0079,
++      0x4a41, 0x4a44, 0x4ac5, 0x4ade, 0x2200, 0x0079, 0x4a47, 0x4a4c,
++      0x4a5c, 0x4a82, 0x4a8e, 0x4ab1, 0x2029, 0x0001, 0xa026, 0x2011,
++      0x0000, 0x1078, 0x5092, 0x0079, 0x4a55, 0x4a5a, 0x2c5e, 0x4856,
++      0x4a5a, 0x4a5a, 0x1078, 0x2bfa, 0x7990, 0xa18c, 0x0007, 0x00c0,
++      0x4a63, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684, 0x0004, 0x0040,
++      0x4a6b, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011, 0x0001, 0x1078,
++      0x5092, 0x0079, 0x4a73, 0x4a78, 0x2c5e, 0x4856, 0x4a80, 0x4a7a,
++      0x0078, 0x555e, 0x709f, 0x4a7e, 0x0078, 0x2c5e, 0x0078, 0x4a78,
++      0x1078, 0x2bfa, 0xa684, 0x0010, 0x0040, 0x4a8c, 0x1078, 0x4f1a,
++      0x0040, 0x4a8c, 0x0078, 0x2c5e, 0x0078, 0x4f9a, 0x6000, 0xa084,
++      0x0002, 0x0040, 0x4aab, 0x70a8, 0xa080, 0x0085, 0x781a, 0x0d7e,
++      0x1078, 0x5539, 0x2d00, 0x682e, 0x6827, 0x0000, 0x1078, 0x4781,
++      0x0d7f, 0x1078, 0x1e55, 0x7003, 0x0000, 0x7043, 0x0000, 0x7053,
++      0x0000, 0x0078, 0x4856, 0xa684, 0x0004, 0x00c0, 0x4ab1, 0x0078,
++      0x555e, 0x6000, 0xa084, 0x0004, 0x00c0, 0x4ac3, 0x6000, 0xa084,
++      0x0001, 0x0040, 0x4ac3, 0x709f, 0x4ac3, 0x2001, 0x0007, 0x1078,
++      0x54a6, 0x0078, 0x5564, 0x0078, 0x555e, 0x2200, 0x0079, 0x4ac8,
++      0x4acd, 0x4acf, 0x4acd, 0x4acd, 0x4acd, 0x1078, 0x2bfa, 0x709b,
++      0x4ad3, 0x0078, 0x556c, 0x78e4, 0xa084, 0x0008, 0x00c0, 0x4acf,
++      0x1078, 0x5496, 0x709f, 0x4adc, 0x0078, 0x555e, 0x2200, 0x0079,
++      0x4ae1, 0x4ae6, 0x4ae8, 0x4ae8, 0x4ae6, 0x4ae6, 0x1078, 0x2bfa,
++      0x78e4, 0xa084, 0x0008, 0x0040, 0x4afd, 0x709b, 0x4af1, 0x0078,
++      0x556c, 0x2011, 0x0004, 0x1078, 0x508c, 0x0079, 0x4af7, 0x4b09,
++      0x2c5e, 0x4856, 0x4b09, 0x4b13, 0x4b17, 0x690c, 0x81ff, 0x0040,
++      0x4b09, 0x8109, 0x00c0, 0x4b08, 0x6827, 0x000f, 0x0078, 0x4bbd,
++      0x690e, 0x709f, 0x4b11, 0x2001, 0x0003, 0x1078, 0x54a6, 0x0078,
++      0x5564, 0x0078, 0x555e, 0x709f, 0x4b09, 0x0078, 0x2c5e, 0x709f,
++      0x4b1b, 0x0078, 0x2c5e, 0x0078, 0x4b11, 0xa282, 0x0003, 0x0050,
++      0x4b23, 0x1078, 0x2bfa, 0xa386, 0x0002, 0x00c0, 0x4b3b, 0xa286,
++      0x0002, 0x00c0, 0x4b41, 0x78a0, 0xa005, 0x00c0, 0x4b41, 0xd4fc,
++      0x00c0, 0x4b41, 0x78e4, 0xa084, 0x0008, 0x0040, 0x4b3b, 0xa6b5,
++      0x0008, 0x2019, 0x0000, 0xa684, 0x0008, 0x0040, 0x4b41, 0x1078,
++      0x4ef7, 0x6810, 0x70b2, 0x7003, 0x0007, 0x2300, 0x0079, 0x4b48,
++      0x4b4b, 0x4b78, 0x4b80, 0x2200, 0x0079, 0x4b4e, 0x4b53, 0x4b51,
++      0x4b6c, 0x1078, 0x2bfa, 0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011,
++      0x0001, 0x1078, 0x5092, 0x0079, 0x4b5d, 0x4b62, 0x2c5e, 0x4856,
++      0x4b6a, 0x4b64, 0x0078, 0x555e, 0x709f, 0x4b68, 0x0078, 0x2c5e,
++      0x0078, 0x4b62, 0x1078, 0x2bfa, 0xa684, 0x0010, 0x0040, 0x4b76,
++      0x1078, 0x4f1a, 0x0040, 0x4b76, 0x0078, 0x2c5e, 0x0078, 0x4f9a,
++      0x2200, 0x0079, 0x4b7b, 0x4b7e, 0x4b7e, 0x4b7e, 0x1078, 0x2bfa,
++      0x2200, 0x0079, 0x4b83, 0x4b86, 0x4b88, 0x4b88, 0x1078, 0x2bfa,
++      0x78e4, 0xa084, 0x0008, 0x0040, 0x4b9d, 0x709b, 0x4b91, 0x0078,
++      0x556c, 0x2011, 0x0004, 0x1078, 0x508c, 0x0079, 0x4b97, 0x4ba9,
++      0x2c5e, 0x4856, 0x4ba9, 0x4bb3, 0x4bb7, 0x690c, 0x81ff, 0x0040,
++      0x4ba9, 0x8109, 0x00c0, 0x4ba8, 0x6827, 0x000f, 0x0078, 0x4bbd,
++      0x690e, 0x709f, 0x4bb1, 0x2001, 0x0003, 0x1078, 0x54a6, 0x0078,
++      0x5564, 0x0078, 0x555e, 0x709f, 0x4ba9, 0x0078, 0x2c5e, 0x709f,
++      0x4bbb, 0x0078, 0x2c5e, 0x0078, 0x4bb1, 0x70a8, 0xa080, 0x0085,
++      0x781a, 0x0d7e, 0x6824, 0x007e, 0x1078, 0x5539, 0x007f, 0x6826,
++      0x2d00, 0x682e, 0x1078, 0x4781, 0x0d7f, 0x1078, 0x54ae, 0x7003,
++      0x0000, 0x7043, 0x0000, 0x7053, 0x0000, 0x0078, 0x4856, 0x2300,
++      0x0079, 0x4bda, 0x4bdf, 0x4be1, 0x4bdd, 0x1078, 0x2bfa, 0x7098,
++      0x007a, 0x7098, 0x007a, 0xa282, 0x0002, 0x0050, 0x4be9, 0x1078,
++      0x2bfa, 0xa684, 0x0200, 0x0040, 0x4bf3, 0x1078, 0x552b, 0x1078,
++      0x5074, 0x1078, 0x552c, 0x2300, 0x0079, 0x4bf6, 0x4bf9, 0x4c2c,
++      0x4c92, 0xad86, 0xffff, 0x00c0, 0x4bfe, 0x007c, 0xa286, 0x0001,
++      0x0040, 0x4c04, 0x1078, 0x2bfa, 0xa684, 0x0200, 0x0040, 0x4c0c,
++      0x1078, 0x552b, 0x1078, 0x552c, 0x6924, 0xa184, 0x00ff, 0xa086,
++      0x000a, 0x00c0, 0x4c16, 0xa184, 0xff00, 0x6826, 0x2001, 0x0001,
++      0x1078, 0x54ae, 0x78b8, 0xa084, 0xc001, 0x0040, 0x4c28, 0x7848,
++      0xa085, 0x0008, 0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x4c23,
++      0x7003, 0x0000, 0x0078, 0x4856, 0x2200, 0x0079, 0x4c2f, 0x4c31,
++      0x4c62, 0x709b, 0x4c35, 0x0078, 0x556c, 0x2011, 0x000d, 0x1078,
++      0x508c, 0x0079, 0x4c3b, 0x4c42, 0x2c5e, 0x4856, 0x4c4a, 0x4c52,
++      0x4c58, 0x4c5a, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++      0x0078, 0x5558, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++      0x0078, 0x5558, 0x709f, 0x4c56, 0x0078, 0x2c5e, 0x0078, 0x4c42,
++      0x1078, 0x2bfa, 0x709f, 0x4c5e, 0x0078, 0x2c5e, 0x1078, 0x5572,
++      0x0078, 0x2c5e, 0x709b, 0x4c66, 0x0078, 0x556c, 0x2011, 0x0012,
++      0x1078, 0x508c, 0x0079, 0x4c6c, 0x4c72, 0x2c5e, 0x4856, 0x4c7e,
++      0x4c86, 0x4c8c, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++      0x70a8, 0xa080, 0x00af, 0x781a, 0x0078, 0x2c5e, 0xa6b4, 0x00ff,
++      0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x0078, 0x5558, 0x709f, 0x4c8a,
++      0x0078, 0x2c5e, 0x0078, 0x4c72, 0x709f, 0x4c90, 0x0078, 0x2c5e,
++      0x0078, 0x4c7e, 0xa286, 0x0001, 0x0040, 0x4c98, 0x1078, 0x2bfa,
++      0x709b, 0x4c9c, 0x0078, 0x556c, 0x2011, 0x0015, 0x1078, 0x508c,
++      0x0079, 0x4ca2, 0x4ca7, 0x2c5e, 0x4856, 0x4cb5, 0x4cc1, 0xa6b4,
++      0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x783b, 0x1301, 0x70a8,
++      0xa080, 0x00bb, 0x781a, 0x0078, 0x2c5e, 0xa6b4, 0x00ff, 0xa6b5,
++      0x0400, 0x6eb6, 0x7e5a, 0x70a8, 0xa080, 0x00af, 0x781a, 0x0078,
++      0x2c5e, 0x709f, 0x4cc5, 0x0078, 0x2c5e, 0x0078, 0x4ca7, 0xa282,
++      0x0003, 0x0050, 0x4ccd, 0x1078, 0x2bfa, 0x2300, 0x0079, 0x4cd0,
++      0x4cd3, 0x4d14, 0x4d79, 0xa286, 0x0001, 0x0040, 0x4cd9, 0x1078,
++      0x2bfa, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x4ce6,
++      0x1078, 0x4781, 0x7003, 0x0000, 0x0078, 0x4856, 0x683b, 0x0000,
++      0x6837, 0x0000, 0xa684, 0x0200, 0x0040, 0x4cf4, 0x1078, 0x552b,
++      0x1078, 0x5074, 0x1078, 0x552c, 0x6924, 0xa184, 0x00ff, 0xa086,
++      0x000a, 0x00c0, 0x4cfe, 0xa184, 0xff00, 0x6826, 0x2001, 0x0001,
++      0x1078, 0x54ae, 0x78b8, 0xa084, 0xc001, 0x0040, 0x4d10, 0x7848,
++      0xa085, 0x0008, 0x784a, 0x7848, 0xa084, 0x0008, 0x00c0, 0x4d0b,
++      0x7003, 0x0000, 0x0078, 0x4856, 0xa684, 0x0200, 0x0040, 0x4d1c,
++      0x1078, 0x5074, 0x1078, 0x552c, 0x2200, 0x0079, 0x4d1f, 0x4d21,
++      0x4d54, 0x709b, 0x4d25, 0x0078, 0x556c, 0x2011, 0x000d, 0x1078,
++      0x508c, 0x0079, 0x4d2b, 0x4d32, 0x2c5e, 0x4856, 0x4d3a, 0x4d42,
++      0x4d48, 0x4d4a, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a,
++      0x0078, 0x5558, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a,
++      0x0078, 0x5558, 0x709f, 0x4d46, 0x0078, 0x2c5e, 0x0078, 0x4d32,
++      0x1078, 0x2bfa, 0x709f, 0x4d50, 0x1078, 0x552c, 0x0078, 0x2c5e,
++      0x1078, 0x5572, 0x0078, 0x2c5e, 0x709b, 0x4d58, 0x0078, 0x556c,
++      0x2011, 0x0005, 0x1078, 0x508c, 0x0079, 0x4d5e, 0x4d63, 0x2c5e,
++      0x4856, 0x4d6b, 0x4d73, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6,
++      0x7e5a, 0x0078, 0x5558, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6,
++      0x7e5a, 0x0078, 0x5558, 0x709f, 0x4d77, 0x0078, 0x2c5e, 0x0078,
++      0x4d63, 0xa286, 0x0001, 0x0040, 0x4d7f, 0x1078, 0x2bfa, 0x709b,
++      0x4d83, 0x0078, 0x556c, 0x2011, 0x0006, 0x1078, 0x508c, 0x0079,
++      0x4d89, 0x4d8e, 0x2c5e, 0x4856, 0x4d94, 0x4d9e, 0xa6b5, 0x0800,
++      0x6eb6, 0x7e5a, 0x0078, 0x5558, 0xa6b4, 0x00ff, 0xa6b5, 0x0800,
++      0x6eb6, 0xa6b5, 0x4000, 0x7e5a, 0x0078, 0x5558, 0x709f, 0x4da2,
++      0x0078, 0x2c5e, 0x0078, 0x4d8e, 0x2300, 0x0079, 0x4da7, 0x4dac,
++      0x4daa, 0x4daa, 0x1078, 0x2bfa, 0x1078, 0x2bfa, 0x2300, 0x719c,
++      0xa005, 0x017a, 0x6810, 0x70b2, 0xa282, 0x0003, 0x0050, 0x4dba,
++      0x1078, 0x2bfa, 0x2300, 0x0079, 0x4dbd, 0x4dc0, 0x4dce, 0x4df0,
++      0xa684, 0x0200, 0x0040, 0x4dc8, 0x1078, 0x552b, 0x1078, 0x552c,
++      0x2001, 0x0001, 0x1078, 0x54ae, 0x0078, 0x2c5e, 0xa286, 0x0002,
++      0x0040, 0x4dd7, 0x82ff, 0x0040, 0x4dd7, 0x1078, 0x2bfa, 0x709b,
++      0x4ddb, 0x0078, 0x556c, 0x2011, 0x0018, 0x1078, 0x508c, 0x0079,
++      0x4de1, 0x4de6, 0x2c5e, 0x4856, 0x4de8, 0x4dea, 0x0078, 0x5558,
++      0x0078, 0x5558, 0x709f, 0x4dee, 0x0078, 0x2c5e, 0x0078, 0x4de6,
++      0x2200, 0x0079, 0x4df3, 0x4df5, 0x4e0e, 0x709b, 0x4df9, 0x0078,
++      0x556c, 0x2011, 0x0017, 0x1078, 0x508c, 0x0079, 0x4dff, 0x4e04,
++      0x2c5e, 0x4856, 0x4e06, 0x4e08, 0x0078, 0x5558, 0x0078, 0x5558,
++      0x709f, 0x4e0c, 0x0078, 0x2c5e, 0x0078, 0x4e04, 0xd4fc, 0x00c0,
++      0x4e6b, 0xa684, 0x0100, 0x0040, 0x4e19, 0x1078, 0x552b, 0x1078,
++      0x5074, 0x78d8, 0x78d2, 0x78dc, 0x78d6, 0xa6b4, 0xefff, 0x7e5a,
++      0x709b, 0x4e24, 0x0078, 0x556c, 0x2011, 0x000d, 0x1078, 0x508c,
++      0x0079, 0x4e2a, 0x4e31, 0x2c5e, 0x4856, 0x4e31, 0x4e59, 0x4e5f,
++      0x4e61, 0x78d8, 0x79dc, 0xa105, 0x00c0, 0x4e43, 0x78b8, 0xa084,
++      0x801f, 0x00c0, 0x4e43, 0x70a7, 0x0000, 0x7858, 0xa084, 0xfdff,
++      0x785a, 0x0078, 0x5558, 0xa684, 0x0100, 0x0040, 0x4e57, 0x1078,
++      0x552c, 0x1078, 0x54d4, 0x027e, 0x037e, 0x682c, 0x78d2, 0x6830,
++      0x78d6, 0x70a7, 0x0000, 0x017f, 0x007f, 0x1078, 0x5972, 0x0078,
++      0x5558, 0x709f, 0x4e5d, 0x0078, 0x2c5e, 0x0078, 0x4e31, 0x1078,
++      0x2bfa, 0x709f, 0x4e67, 0x1078, 0x552c, 0x0078, 0x2c5e, 0x1078,
++      0x5572, 0x0078, 0x2c5e, 0x1078, 0x552c, 0x6918, 0xd1a4, 0x0040,
++      0x4e79, 0x6827, 0x000f, 0x1078, 0x54ae, 0x1078, 0x552c, 0x0078,
++      0x2c5e, 0x709f, 0x4e81, 0x2001, 0x0003, 0x1078, 0x54a6, 0x0078,
++      0x5564, 0x1078, 0x550e, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x0078,
++      0x5558, 0x70ac, 0x6812, 0x70b2, 0x8000, 0x70ae, 0x681b, 0x0000,
++      0xa684, 0x0008, 0x0040, 0x4eac, 0x157e, 0x137e, 0x147e, 0x7890,
++      0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f, 0x681a, 0x80ac,
++      0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0xad80, 0x000b, 0x20a0,
++      0x53a5, 0x147f, 0x137f, 0x157f, 0xa6c4, 0x0f00, 0xa684, 0x0002,
++      0x00c0, 0x4ebb, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007,
++      0x2008, 0x0078, 0x4ece, 0x789b, 0x0010, 0x79ac, 0xa184, 0x0020,
++      0x0040, 0x4ece, 0x017e, 0x2009, 0x0005, 0x2001, 0x3d00, 0x1078,
++      0x54df, 0x6824, 0xa085, 0x003b, 0x6826, 0x017f, 0xa184, 0x001f,
++      0xa805, 0x017e, 0x3208, 0xa18c, 0x0300, 0x0040, 0x4eda, 0xc0fc,
++      0x0078, 0x4edb, 0xc0fd, 0x017f, 0x6816, 0x1078, 0x47fa, 0x68ce,
++      0xa684, 0x0004, 0x0040, 0x4eea, 0xa18c, 0xff00, 0x78a8, 0xa084,
++      0x00ff, 0xa105, 0x682a, 0xa6b4, 0x00ff, 0x6000, 0xa084, 0x0008,
++      0x0040, 0x4ef4, 0xa6b5, 0x4000, 0x6eb6, 0x7e5a, 0x007c, 0x157e,
++      0x137e, 0x147e, 0x6918, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004,
++      0xa084, 0x000f, 0x007e, 0xa100, 0x681a, 0x007f, 0x8000, 0x8004,
++      0x0040, 0x4f16, 0x20a8, 0x8104, 0xa080, 0x000b, 0xad00, 0x20a0,
++      0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0x53a5, 0x147f, 0x137f,
++      0x157f, 0x007c, 0x682c, 0xd0b4, 0x00c0, 0x4f29, 0xd0ac, 0x00c0,
++      0x4f25, 0x2011, 0x0010, 0x0078, 0x4f31, 0x2011, 0x000c, 0x0078,
++      0x4f31, 0xa084, 0x0020, 0x00c0, 0x4f30, 0x620c, 0x0078, 0x4f31,
++      0x6210, 0x6b18, 0x2300, 0xa202, 0x0040, 0x4f51, 0x2018, 0xa382,
++      0x000e, 0x0048, 0x4f41, 0x0040, 0x4f41, 0x2019, 0x000e, 0x0078,
++      0x4f45, 0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b01, 0x7893,
++      0x0000, 0x7ba2, 0x70a8, 0xa080, 0x0094, 0x781a, 0xa085, 0x0001,
++      0x007c, 0x7858, 0xa084, 0xffef, 0x785a, 0x7893, 0x0000, 0xa006,
++      0x007c, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040, 0x4f66,
++      0xa196, 0x000f, 0x0040, 0x4f66, 0x6807, 0x0117, 0x6914, 0x6814,
++      0x1078, 0x47fa, 0x6100, 0x8104, 0x00c8, 0x4f82, 0x601c, 0xa005,
++      0x0040, 0x4f76, 0x2001, 0x0800, 0x0078, 0x4f84, 0x0d7e, 0x6824,
++      0x007e, 0x1078, 0x5539, 0x007f, 0x6826, 0x2d00, 0x682e, 0x1078,
++      0x4781, 0x0d7f, 0x2001, 0x0200, 0x6924, 0xa18c, 0x00ff, 0xa10d,
++      0x6926, 0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000,
++      0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71a8, 0xa188, 0x0097,
++      0x791a, 0x007c, 0x1078, 0x2d79, 0x6814, 0x2040, 0xa684, 0x0002,
++      0x00c0, 0x4fb0, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184, 0x0007,
++      0x2008, 0xa805, 0x6816, 0x1078, 0x47fa, 0x68ce, 0x0078, 0x4fb4,
++      0x6914, 0x6814, 0x1078, 0x47fa, 0x6100, 0x8104, 0x00c8, 0x5012,
++      0xa184, 0x0300, 0x0040, 0x4fc0, 0x6807, 0x0117, 0x0078, 0x4fde,
++      0x6004, 0xa005, 0x00c0, 0x4fe7, 0x6807, 0x0117, 0x601c, 0xa005,
++      0x00c0, 0x4fd4, 0x0d7e, 0x1078, 0x5539, 0x6827, 0x0034, 0x2d00,
++      0x682e, 0x1078, 0x4781, 0x0d7f, 0xa684, 0x0004, 0x0040, 0x4fde,
++      0x2031, 0x0400, 0x2001, 0x2800, 0x0078, 0x4fe2, 0x2031, 0x0400,
++      0x2001, 0x0800, 0x71a8, 0xa188, 0x0097, 0x0078, 0x504f, 0x6018,
++      0xa005, 0x00c0, 0x4fd4, 0x601c, 0xa005, 0x00c0, 0x4fd4, 0x689f,
++      0x0000, 0x6827, 0x003d, 0xa684, 0x0001, 0x0040, 0x505d, 0xd694,
++      0x00c0, 0x500b, 0x6100, 0xd1d4, 0x0040, 0x500b, 0x692c, 0xa18c,
++      0x00ff, 0x0040, 0x505d, 0xa186, 0x0003, 0x0040, 0x505d, 0xa186,
++      0x0012, 0x0040, 0x505d, 0xa6b5, 0x0800, 0x71a8, 0xa188, 0x00b3,
++      0x0078, 0x5058, 0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c,
++      0x00ff, 0xa186, 0x0012, 0x00c0, 0x5023, 0x2001, 0x506a, 0x2009,
++      0x0001, 0x0078, 0x5034, 0xa186, 0x0003, 0x00c0, 0x502d, 0x2001,
++      0x506b, 0x2009, 0x0012, 0x0078, 0x5034, 0x2001, 0x0200, 0x71a8,
++      0xa188, 0x0097, 0x0078, 0x504f, 0x6a34, 0xa29d, 0x0000, 0x00c0,
++      0x503c, 0xa006, 0x0078, 0x502f, 0x007e, 0x2100, 0xa21a, 0x007f,
++      0x00c8, 0x5043, 0x2208, 0x1078, 0x54f9, 0x78a3, 0x0000, 0x681c,
++      0xa085, 0x0040, 0x681e, 0x71a8, 0xa188, 0x00d9, 0xa006, 0x6826,
++      0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822,
++      0x6eb6, 0x7e5a, 0x791a, 0x0078, 0x2c5e, 0x6eb6, 0x1078, 0x4781,
++      0x6810, 0x70b2, 0x7003, 0x0007, 0x7097, 0x0000, 0x7053, 0x0000,
++      0x0078, 0x2c5e, 0x0023, 0x0070, 0x0005, 0x0000, 0x0a00, 0x0000,
++      0x0000, 0x0025, 0x0000, 0x0000, 0x683b, 0x0000, 0x6837, 0x0000,
++      0xa684, 0x0200, 0x0040, 0x508b, 0x78b8, 0xa08c, 0x001f, 0xa084,
++      0x8000, 0x0040, 0x5084, 0x8108, 0x78d8, 0xa100, 0x6836, 0x78dc,
++      0xa081, 0x0000, 0x683a, 0x007c, 0x7990, 0x810f, 0xa5ac, 0x0007,
++      0x2021, 0x0000, 0xa480, 0x0010, 0x789a, 0x79a8, 0xa18c, 0x00ff,
++      0xa184, 0x0080, 0x00c0, 0x50ba, 0xa182, 0x0020, 0x00c8, 0x50d8,
++      0xa182, 0x0012, 0x00c8, 0x5496, 0x2100, 0x1079, 0x50a8, 0x007c,
++      0x5496, 0x52eb, 0x5496, 0x5496, 0x50e5, 0x50e8, 0x512f, 0x516d,
++      0x51a1, 0x51a4, 0x5496, 0x5496, 0x5150, 0x5213, 0x524d, 0x5496,
++      0x5496, 0x5274, 0xa184, 0x0020, 0x00c0, 0x52a8, 0xa18c, 0x001f,
++      0x6814, 0xa084, 0x001f, 0xa106, 0x0040, 0x50d5, 0x70a8, 0xa080,
++      0x0085, 0x781a, 0x2001, 0x0014, 0x1078, 0x54ae, 0x1078, 0x552c,
++      0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x2001, 0x0000, 0x007c,
++      0xa182, 0x0024, 0x00c8, 0x5496, 0xa184, 0x0003, 0x1079, 0x50a8,
++      0x007c, 0x5496, 0x5496, 0x5496, 0x5496, 0x1078, 0x5496, 0x007c,
++      0x2200, 0x0079, 0x50eb, 0x5277, 0x5277, 0x511c, 0x511c, 0x511c,
++      0x511c, 0x511c, 0x511c, 0x511c, 0x511c, 0x511a, 0x511c, 0x5104,
++      0x510d, 0x510d, 0x510d, 0x511c, 0x511c, 0x5124, 0x5127, 0x5277,
++      0x5127, 0x511c, 0x511c, 0x511c, 0x0c7e, 0x077e, 0x6f14, 0x1078,
++      0x42de, 0x077f, 0x0c7f, 0x0078, 0x511c, 0x6818, 0xd0a4, 0x0040,
++      0x511c, 0x6827, 0x0033, 0x1078, 0x54ae, 0x1078, 0x552c, 0x2001,
++      0x0001, 0x007c, 0x1078, 0x53ae, 0x6827, 0x02b3, 0x2009, 0x000b,
++      0x2001, 0x4800, 0x0078, 0x52ab, 0x1078, 0x5486, 0x007c, 0x6827,
++      0x0093, 0x2009, 0x000b, 0x2001, 0x4800, 0x0078, 0x5293, 0x2d58,
++      0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x5139, 0x6807,
++      0x0117, 0x6827, 0x0002, 0x1078, 0x5539, 0x6827, 0x0036, 0x6932,
++      0x2d00, 0x682e, 0x0d7e, 0x1078, 0x4751, 0x1078, 0x52d3, 0x2b68,
++      0x1078, 0x4781, 0x0d7f, 0x1078, 0x4781, 0x2001, 0x0002, 0x007c,
++      0x1078, 0x52d3, 0x2001, 0x0017, 0x1078, 0x54ae, 0x7097, 0x0000,
++      0x6914, 0xd1fc, 0x0040, 0x5160, 0x2009, 0x6086, 0x0078, 0x5162,
++      0x2009, 0x6046, 0x200b, 0x0006, 0x70a3, 0x0017, 0x2009, 0x0200,
++      0x1078, 0x463f, 0x2001, 0x0001, 0x007c, 0x2200, 0x0079, 0x5170,
++      0x5277, 0x52a8, 0x52a8, 0x52a8, 0x5191, 0x52ba, 0x5199, 0x52ba,
++      0x52ba, 0x52bd, 0x52bd, 0x52c2, 0x52c2, 0x5189, 0x5189, 0x52a8,
++      0x52a8, 0x52ba, 0x52a8, 0x5199, 0x5277, 0x5199, 0x5199, 0x5199,
++      0x5199, 0x6827, 0x0084, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078,
++      0x52cc, 0x6827, 0x000d, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078,
++      0x52ab, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4300, 0x0078,
++      0x5293, 0x2001, 0x0000, 0x007c, 0x2200, 0x0079, 0x51a7, 0x5277,
++      0x520b, 0x520b, 0x520b, 0x520b, 0x51c0, 0x51c0, 0x51c0, 0x51c0,
++      0x51c0, 0x51c0, 0x51c0, 0x51c0, 0x520b, 0x520b, 0x520b, 0x520b,
++      0x51e8, 0x520b, 0x520b, 0x51e8, 0x51e8, 0x51e8, 0x51e8, 0x5277,
++      0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x51e8, 0x690c,
++      0xa184, 0x000f, 0x0040, 0x52ba, 0x8001, 0x0040, 0x51d5, 0xa18c,
++      0xfff0, 0xa105, 0x680e, 0x0078, 0x52ba, 0x70a8, 0xa080, 0x0085,
++      0x781a, 0x6827, 0x000f, 0x1078, 0x4f59, 0x1078, 0x54ae, 0x7003,
++      0x0000, 0x7043, 0x0000, 0x7053, 0x0000, 0x2001, 0x0002, 0x007c,
++      0x6918, 0xa184, 0x000f, 0x0040, 0x52ba, 0x8001, 0x0040, 0x51f6,
++      0xa18c, 0xfff0, 0xa105, 0x681a, 0x0078, 0x52ba, 0x70a8, 0xa080,
++      0x0085, 0x781a, 0x6827, 0x008f, 0x2009, 0x000b, 0x2001, 0x4300,
++      0x1078, 0x54df, 0x1078, 0x54ae, 0x1078, 0x552c, 0x7003, 0x0000,
++      0x2001, 0x0002, 0x007c, 0x6827, 0x0093, 0x2009, 0x000b, 0x2001,
++      0x4300, 0x0078, 0x5293, 0xa684, 0x0004, 0x00c0, 0x5227, 0x6804,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x5496, 0x1078, 0x52d3,
++      0x6807, 0x0117, 0x1078, 0x4781, 0x2001, 0x0002, 0x007c, 0x6000,
++      0xa084, 0x0004, 0x0040, 0x5496, 0x2d58, 0x6804, 0xa084, 0x00ff,
++      0xa086, 0x0006, 0x00c0, 0x5236, 0x6807, 0x0117, 0x6827, 0x0002,
++      0x1078, 0x5539, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e,
++      0x1078, 0x4760, 0x1078, 0x52d3, 0x2b68, 0x1078, 0x4781, 0x0d7f,
++      0x1078, 0x4781, 0x2001, 0x0002, 0x007c, 0x6000, 0xa084, 0x0004,
++      0x0040, 0x5496, 0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006,
++      0x00c0, 0x525c, 0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x1078,
++      0x5539, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x0d7e, 0x1078,
++      0x4770, 0x1078, 0x52d3, 0x2b68, 0x1078, 0x4781, 0x0d7f, 0x1078,
++      0x4781, 0x2001, 0x0002, 0x007c, 0x1078, 0x5496, 0x007c, 0x70a8,
++      0xa080, 0x0085, 0x781a, 0x2001, 0x0001, 0x1078, 0x54ae, 0x1078,
++      0x552c, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c, 0x1078, 0x54df,
++      0x1078, 0x552b, 0x1078, 0x5074, 0x1078, 0x4f59, 0x1078, 0x552c,
++      0x2001, 0x0001, 0x007c, 0x1078, 0x54df, 0x1078, 0x552b, 0x1078,
++      0x5074, 0x70a8, 0xa080, 0x0085, 0x781a, 0x2001, 0x0013, 0x1078,
++      0x54ae, 0x1078, 0x552c, 0x7003, 0x0000, 0x2001, 0x0002, 0x007c,
++      0x1078, 0x5496, 0x007c, 0x1078, 0x54df, 0x1078, 0x552b, 0x1078,
++      0x5074, 0x1078, 0x4f59, 0x1078, 0x552c, 0x1078, 0x5572, 0x2001,
++      0x0001, 0x007c, 0x2001, 0x0003, 0x007c, 0x1078, 0x53ae, 0x2001,
++      0x0000, 0x007c, 0x0c7e, 0x077e, 0x6f14, 0x1078, 0x42de, 0x077f,
++      0x0c7f, 0x2001, 0x0000, 0x007c, 0x1078, 0x54df, 0x1078, 0x5496,
++      0x2001, 0x0006, 0x007c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++      0x0040, 0x52de, 0xa186, 0x000f, 0x00c0, 0x52e2, 0x1078, 0x552b,
++      0x1078, 0x5074, 0x70a8, 0xa080, 0x0085, 0x781a, 0x1078, 0x552c,
++      0x7003, 0x0000, 0x007c, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084,
++      0x00ff, 0xa08a, 0x0004, 0x00c8, 0x5496, 0x1079, 0x52f8, 0x007c,
++      0x5496, 0x52fc, 0x5496, 0x53b5, 0xa282, 0x0003, 0x0040, 0x5303,
++      0x1078, 0x5496, 0x007c, 0x7da8, 0xa5ac, 0x00ff, 0x7ca8, 0xa4a4,
++      0x00ff, 0x69b8, 0xa184, 0x0100, 0x0040, 0x5342, 0xa18c, 0xfeff,
++      0x69ba, 0x78a0, 0xa005, 0x00c0, 0x5342, 0xa4a4, 0x00ff, 0x0040,
++      0x5336, 0xa482, 0x000c, 0x0040, 0x531f, 0x00c8, 0x5329, 0x852b,
++      0x852b, 0x1078, 0x4334, 0x0040, 0x5329, 0x1078, 0x4162, 0x0078,
++      0x5338, 0x1078, 0x5474, 0x1078, 0x418d, 0x69b8, 0xa18d, 0x0100,
++      0x69ba, 0xa6b5, 0x1000, 0x7e5a, 0x0078, 0x533b, 0x1078, 0x418d,
++      0xa6b4, 0xefff, 0x7e5a, 0x70a8, 0xa080, 0x0097, 0x781a, 0x2001,
++      0x0001, 0x007c, 0x0c7e, 0x1078, 0x539c, 0x6200, 0xd2e4, 0x0040,
++      0x538b, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048,
++      0x5355, 0x0040, 0x5355, 0x2011, 0x000c, 0x2400, 0xa202, 0x00c8,
++      0x535a, 0x2220, 0x6208, 0xa294, 0x00ff, 0x2001, 0x6003, 0x2004,
++      0xd0e4, 0x00c0, 0x536f, 0x78ec, 0xd0e4, 0x0040, 0x536f, 0xa282,
++      0x000a, 0x00c8, 0x5375, 0x2011, 0x000a, 0x0078, 0x5375, 0xa282,
++      0x000c, 0x00c8, 0x5375, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8,
++      0x537a, 0x2228, 0x1078, 0x5477, 0x2500, 0xa086, 0x000a, 0x0040,
++      0x5383, 0x852b, 0x852b, 0x1078, 0x4334, 0x0040, 0x538b, 0x1078,
++      0x4169, 0x0078, 0x538f, 0x1078, 0x5474, 0x1078, 0x4194, 0xa6b5,
++      0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00c4, 0x781a,
++      0x2001, 0x0004, 0x0c7f, 0x007c, 0x6814, 0x8007, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0x6914, 0xd1fc, 0x00c0, 0x53ab, 0xa0e0,
++      0x64c0, 0x0078, 0x53ad, 0xa0e0, 0x6540, 0x007c, 0x0c7e, 0x1078,
++      0x539c, 0x1078, 0x4194, 0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0,
++      0x5496, 0x7aa8, 0xa294, 0x00ff, 0x69b8, 0xa184, 0x0200, 0x0040,
++      0x53ec, 0xa18c, 0xfdff, 0x69ba, 0x78a0, 0xa005, 0x00c0, 0x53ec,
++      0xa282, 0x0002, 0x00c8, 0x429c, 0x1078, 0x544c, 0x1078, 0x4227,
++      0x1078, 0x418d, 0xa684, 0x0100, 0x0040, 0x53e2, 0x682c, 0xa084,
++      0x0001, 0x0040, 0x53e2, 0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040,
++      0x53e2, 0xc6fd, 0xa6b5, 0x1000, 0x7e5a, 0x70a8, 0xa080, 0x0097,
++      0x781a, 0x2001, 0x0001, 0x007c, 0x0c7e, 0x1078, 0x539c, 0xa284,
++      0xfffe, 0x0040, 0x53f7, 0x2011, 0x0001, 0x0078, 0x53fb, 0xa284,
++      0x0001, 0x0040, 0x5401, 0x6100, 0xd1ec, 0x00c0, 0x5401, 0x2011,
++      0x0000, 0x1078, 0x543e, 0x1078, 0x422e, 0x1078, 0x4194, 0xa684,
++      0x0100, 0x0040, 0x5417, 0x682c, 0xa084, 0x0001, 0x0040, 0x5417,
++      0xc6fc, 0x7888, 0xa084, 0x0040, 0x0040, 0x5417, 0xc6fd, 0xa6b5,
++      0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00c4, 0x781a,
++      0x2001, 0x0004, 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6000, 0x2011,
++      0x0001, 0xa084, 0x2000, 0x00c0, 0x542f, 0x2011, 0x0000, 0x78ab,
++      0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004,
++      0x68b8, 0xa085, 0x0200, 0x68ba, 0x0c7f, 0x007c, 0x789b, 0x0018,
++      0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b,
++      0x0081, 0x78ab, 0x0004, 0x007c, 0x0c7e, 0x705c, 0x2060, 0x6000,
++      0xa084, 0x1000, 0x00c0, 0x545a, 0x2029, 0x0032, 0x2021, 0x0000,
++      0x0078, 0x546c, 0x6408, 0xa4ac, 0x00ff, 0xa582, 0x000c, 0x00c8,
++      0x5463, 0x2029, 0x000c, 0x8427, 0xa4a4, 0x00ff, 0xa482, 0x000c,
++      0x0048, 0x546c, 0x2021, 0x000c, 0x1078, 0x5477, 0x68b8, 0xa085,
++      0x0100, 0x68ba, 0x0c7f, 0x007c, 0xa026, 0x2029, 0x0032, 0x789b,
++      0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa,
++      0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x007c, 0x2001, 0x0003,
++      0x1078, 0x54a6, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8,
++      0xa080, 0x00c4, 0x781a, 0x2001, 0x0005, 0x007c, 0x2001, 0x0007,
++      0x1078, 0x54a6, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8,
++      0xa080, 0x00c4, 0x781a, 0x2001, 0x0004, 0x007c, 0x789b, 0x0018,
++      0x78aa, 0x789b, 0x0081, 0x78ab, 0x0001, 0x007c, 0x6904, 0xa18c,
++      0x00ff, 0xa196, 0x0007, 0x0040, 0x54bc, 0xa196, 0x000f, 0x0040,
++      0x54bc, 0x1078, 0x1e55, 0x007c, 0x6924, 0xa194, 0x003f, 0x00c0,
++      0x54c5, 0xa18c, 0xffc0, 0xa105, 0x6826, 0x1078, 0x4781, 0x691c,
++      0xa184, 0x0100, 0x0040, 0x54d3, 0x6914, 0x2100, 0x1078, 0x47fa,
++      0x6204, 0x8210, 0x6206, 0x007c, 0x692c, 0x6834, 0x682e, 0xa112,
++      0x6930, 0x6838, 0x6832, 0xa11b, 0xa200, 0xa301, 0x007c, 0x0c7e,
++      0xade0, 0x0018, 0x6003, 0x0070, 0x6106, 0x600b, 0x0000, 0x600f,
++      0x0a00, 0x6013, 0x0000, 0x6017, 0x0000, 0x8007, 0x601a, 0x601f,
++      0x0000, 0x6023, 0x0000, 0x0c7f, 0x6824, 0xa085, 0x0080, 0x6826,
++      0x007c, 0x157e, 0x137e, 0x147e, 0x2098, 0xaf80, 0x002d, 0x20a0,
++      0x81ac, 0x0040, 0x5504, 0x53a6, 0xa184, 0x0001, 0x0040, 0x550a,
++      0x3304, 0x78be, 0x147f, 0x137f, 0x157f, 0x007c, 0x70a4, 0x0e7e,
++      0x007e, 0x007f, 0x0e7f, 0xa005, 0x6918, 0x017e, 0x6914, 0x017e,
++      0x6928, 0x017e, 0x017f, 0x017f, 0x017f, 0x10c0, 0x2bfa, 0x70a7,
++      0x8000, 0x6814, 0xd0fc, 0x0040, 0x5528, 0xc185, 0x0078, 0x5529,
++      0xc184, 0x0078, 0x591e, 0x007c, 0x71a4, 0x81ff, 0x0040, 0x5538,
++      0x7848, 0xa085, 0x0008, 0x784a, 0x70a7, 0x0000, 0x1078, 0x55ac,
++      0x007c, 0x0c7e, 0x0d7e, 0x1078, 0x1e32, 0x0c7f, 0x157e, 0x137e,
++      0x147e, 0x2da0, 0x2c98, 0x20a9, 0x0037, 0x53a3, 0x147f, 0x137f,
++      0x157f, 0x6807, 0x010d, 0x680b, 0x0000, 0x701c, 0x8007, 0x681a,
++      0x6823, 0x0000, 0x681f, 0x0000, 0x689f, 0x0000, 0x0c7f, 0x007c,
++      0x70a8, 0xa080, 0x0097, 0x781a, 0x0078, 0x2c5e, 0x70a8, 0xa080,
++      0x0088, 0x781a, 0x0078, 0x2c5e, 0x783b, 0x1700, 0x70a8, 0xa080,
++      0x00c4, 0x781a, 0x0078, 0x2c5e, 0x70a8, 0xa080, 0x00cd, 0x781a,
++      0x0078, 0x2c5e, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0040,
++      0x557f, 0xa196, 0x000f, 0x0040, 0x557f, 0x6807, 0x0117, 0x6824,
++      0xa084, 0x00ff, 0xa085, 0x0200, 0x6826, 0x8007, 0x789b, 0x000e,
++      0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6,
++      0x7e5a, 0x71a8, 0xa188, 0x0097, 0x791a, 0x007c, 0x1078, 0x552c,
++      0x7848, 0xa085, 0x000c, 0x784a, 0x70a8, 0xa080, 0x0085, 0x781a,
++      0x2009, 0x000b, 0x2001, 0x4400, 0x1078, 0x54df, 0x2001, 0x0013,
++      0x1078, 0x54ae, 0x0078, 0x4856, 0x127e, 0x70f0, 0xa084, 0x4600,
++      0x8004, 0x2090, 0x7204, 0x700c, 0xa215, 0x7008, 0xc09c, 0xa205,
++      0x00c0, 0x55c1, 0x7007, 0x0004, 0x7003, 0x0000, 0x127f, 0x2000,
++      0x007c, 0x7000, 0xd084, 0x0040, 0x5600, 0x7108, 0x0005, 0x7008,
++      0xa106, 0x00c0, 0x55c5, 0xa184, 0x0003, 0x0040, 0x562c, 0xa184,
++      0x01e0, 0x00c0, 0x562c, 0xd1f4, 0x00c0, 0x55c5, 0xa184, 0x3000,
++      0xa086, 0x1000, 0x0040, 0x55c5, 0x2011, 0x0180, 0x710c, 0x8211,
++      0x0040, 0x55ea, 0x7008, 0xd0f4, 0x00c0, 0x55c5, 0x700c, 0xa106,
++      0x0040, 0x55df, 0x7007, 0x0012, 0x7108, 0x0005, 0x7008, 0xa106,
++      0x00c0, 0x55ec, 0xa184, 0x0003, 0x0040, 0x562c, 0xd194, 0x0040,
++      0x55ec, 0xd1f4, 0x0040, 0x562c, 0x7007, 0x0002, 0x0078, 0x55c5,
++      0x7108, 0xd1fc, 0x0040, 0x560b, 0x1078, 0x5792, 0x8aff, 0x0040,
++      0x55b2, 0x0078, 0x5600, 0x700c, 0xa08c, 0x03ff, 0x0040, 0x5631,
++      0x7004, 0xd084, 0x0040, 0x5623, 0x7014, 0xa005, 0x00c0, 0x561f,
++      0x7010, 0xa005, 0x0040, 0x5623, 0xa102, 0x00c8, 0x5600, 0x7007,
++      0x0010, 0x0078, 0x562c, 0x8aff, 0x0040, 0x5631, 0x1078, 0x5a15,
++      0x00c0, 0x5626, 0x0040, 0x5600, 0x1078, 0x56da, 0x127f, 0x2000,
++      0x007c, 0x7204, 0x700c, 0xa215, 0x7108, 0xc19c, 0x8103, 0x00c8,
++      0x5640, 0xa205, 0x00c0, 0x562c, 0x7007, 0x0002, 0x0078, 0x5631,
++      0xa205, 0x00c0, 0x562c, 0x7003, 0x0000, 0x7007, 0x0004, 0x127f,
++      0x2000, 0x007c, 0x017e, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007,
++      0x0040, 0x5656, 0xa18e, 0x000f, 0x00c0, 0x5659, 0x6040, 0x0078,
++      0x565a, 0x6428, 0x017f, 0x84ff, 0x0040, 0x5684, 0x2c70, 0x7004,
++      0xa0bc, 0x000f, 0xa7b8, 0x5694, 0x273c, 0x87fb, 0x00c0, 0x5672,
++      0x0048, 0x566c, 0x1078, 0x2bfa, 0x609c, 0xa075, 0x0040, 0x5684,
++      0x0078, 0x565f, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529,
++      0x8421, 0x0040, 0x5684, 0x8738, 0x2704, 0xa005, 0x00c0, 0x5673,
++      0x709c, 0xa075, 0x00c0, 0x565f, 0x007c, 0x0000, 0x0005, 0x0009,
++      0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009,
++      0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x5689, 0x5686, 0x0000,
++      0x0000, 0x8000, 0x0000, 0x5689, 0x0000, 0x5691, 0x568e, 0x0000,
++      0x0000, 0x0000, 0x0000, 0x5691, 0x0000, 0x568c, 0x568c, 0x0000,
++      0x0000, 0x8000, 0x0000, 0x568c, 0x0000, 0x5692, 0x5692, 0x0000,
++      0x0000, 0x0000, 0x0000, 0x5692, 0x2079, 0x6000, 0x2071, 0x0010,
++      0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x7808, 0xd0ec,
++      0x0040, 0x56c8, 0x2009, 0x0001, 0x2071, 0x0020, 0x0078, 0x56cc,
++      0x2009, 0x0002, 0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002,
++      0x7003, 0x0000, 0x8109, 0x0040, 0x56d9, 0x2071, 0x0020, 0x0078,
++      0x56cc, 0x007c, 0x2019, 0x0000, 0x7004, 0x8004, 0x00c8, 0x5761,
++      0x7108, 0x7008, 0xa106, 0x00c0, 0x56e0, 0xa184, 0x01e0, 0x0040,
++      0x56ed, 0x1078, 0x57d8, 0x0078, 0x5789, 0x7007, 0x0012, 0x7108,
++      0x7008, 0xa106, 0x00c0, 0x56ef, 0xa184, 0x01e0, 0x0040, 0x56fa,
++      0x1078, 0x57d8, 0x7808, 0xd0ec, 0x0040, 0x5714, 0x2001, 0x04fd,
++      0x2004, 0xa086, 0x0003, 0x00c0, 0x5718, 0xa184, 0x4000, 0x0040,
++      0x571c, 0xa382, 0x0003, 0x00c8, 0x571c, 0xa184, 0x0004, 0x0040,
++      0x56ef, 0x8318, 0x0078, 0x56ef, 0x780c, 0xd0ec, 0x00c0, 0x571c,
++      0xa184, 0x4000, 0x00c0, 0x56ef, 0xa19c, 0x300c, 0xa386, 0x2004,
++      0x0040, 0x5739, 0xa386, 0x0008, 0x0040, 0x5744, 0x7004, 0xd084,
++      0x00c0, 0x5735, 0x7108, 0x7008, 0xa106, 0x00c0, 0x572a, 0xa184,
++      0x0003, 0x0040, 0x5735, 0x0078, 0x57d8, 0xa386, 0x200c, 0x00c0,
++      0x56ef, 0x7200, 0x8204, 0x0048, 0x5744, 0x730c, 0xa384, 0x03ff,
++      0x0040, 0x5744, 0x1078, 0x2bfa, 0x7108, 0x7008, 0xa106, 0x00c0,
++      0x5744, 0xa184, 0x01e0, 0x0040, 0x5751, 0x1078, 0x57d8, 0x0078,
++      0x5789, 0x7007, 0x0012, 0x7000, 0xd084, 0x00c0, 0x5761, 0x7310,
++      0x7014, 0xa305, 0x0040, 0x5761, 0x710c, 0xa184, 0x03ff, 0x00c0,
++      0x56da, 0x7108, 0x7008, 0xa106, 0x00c0, 0x5761, 0xa184, 0x01e0,
++      0x0040, 0x576e, 0x1078, 0x57d8, 0x0078, 0x5789, 0x7007, 0x0012,
++      0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x5772, 0x7108, 0x7008,
++      0xa106, 0x00c0, 0x5776, 0xa184, 0x01e0, 0x0040, 0x5783, 0x1078,
++      0x57d8, 0x0078, 0x5789, 0x7007, 0x0012, 0x7108, 0xd1fc, 0x00c0,
++      0x5776, 0x7003, 0x0000, 0x007c, 0x157e, 0x7108, 0x1078, 0x5792,
++      0x157f, 0x007c, 0x7204, 0x7500, 0xa184, 0x01e0, 0x00c0, 0x57d8,
++      0x7108, 0xa184, 0x01e0, 0x00c0, 0x57d8, 0xa184, 0x0007, 0x0079,
++      0x57a1, 0x57ab, 0x57bc, 0x57a9, 0x57bc, 0x57a9, 0x582f, 0x57a9,
++      0x582d, 0x1078, 0x2bfa, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006,
++      0x8aff, 0x00c0, 0x57b7, 0x2049, 0x0000, 0x0078, 0x57bb, 0x1078,
++      0x5a15, 0x00c0, 0x57b7, 0x007c, 0x7004, 0xa084, 0x0010, 0xc08d,
++      0x7006, 0x7004, 0xd084, 0x00c0, 0x57d0, 0x7108, 0x7008, 0xa106,
++      0x00c0, 0x57c5, 0xa184, 0x0003, 0x0040, 0x57d0, 0x0078, 0x57d8,
++      0x8aff, 0x0040, 0x57d7, 0x1078, 0x5a15, 0x00c0, 0x57d3, 0x007c,
++      0x7007, 0x0012, 0x7108, 0x00e0, 0x57db, 0x2091, 0x6000, 0x00e0,
++      0x57df, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004,
++      0xd09c, 0x00c0, 0x57e7, 0x7007, 0x0012, 0x7108, 0xd1fc, 0x00c0,
++      0x57eb, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x57ff, 0x7004,
++      0xa005, 0x00c0, 0x57ff, 0x700c, 0xa005, 0x0040, 0x5801, 0x0078,
++      0x57e3, 0x2049, 0x0000, 0xb284, 0x0100, 0x0040, 0x580b, 0x2001,
++      0x0000, 0x0078, 0x580d, 0x2001, 0x0001, 0x1078, 0x43c9, 0xb284,
++      0x0100, 0x0040, 0x5817, 0x2001, 0x6064, 0x0078, 0x5819, 0x2001,
++      0x60a4, 0x2004, 0xa084, 0x8000, 0x0040, 0x5826, 0x6824, 0xa005,
++      0x00c0, 0x5828, 0x6827, 0x0004, 0x0078, 0x5828, 0x681b, 0x0002,
++      0x007c, 0x1078, 0x2bfa, 0x1078, 0x2bfa, 0x1078, 0x5877, 0x7210,
++      0x7114, 0x700c, 0xa09c, 0x03ff, 0x2800, 0xa300, 0xa211, 0xa189,
++      0x0000, 0x1078, 0x5877, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200,
++      0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x5852,
++      0x00c8, 0x5852, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60,
++      0x0078, 0x5839, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008,
++      0x0040, 0x585e, 0xa7ba, 0x568e, 0x0078, 0x5860, 0xa7ba, 0x5686,
++      0x007f, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7108,
++      0x7008, 0xa106, 0x00c0, 0x5867, 0xa184, 0x01e0, 0x0040, 0x5872,
++      0x1078, 0x57d8, 0x7007, 0x0012, 0x1078, 0x56da, 0x007c, 0x8a50,
++      0x8739, 0x2704, 0xa004, 0x00c0, 0x588b, 0x6000, 0xa064, 0x00c0,
++      0x5882, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x56a4, 0x203c,
++      0x87fb, 0x1040, 0x2bfa, 0x007c, 0x127e, 0x0d7e, 0x70f0, 0xa084,
++      0x4600, 0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c,
++      0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804,
++      0xa084, 0x0008, 0x007f, 0x0040, 0x58a9, 0xa0b8, 0x568e, 0x0078,
++      0x58ab, 0xa0b8, 0x5686, 0xb284, 0x0100, 0x0040, 0x58b2, 0x7e18,
++      0x0078, 0x58b3, 0x7e1c, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff,
++      0xa186, 0x0007, 0x0040, 0x58c0, 0xa18e, 0x000f, 0x00c0, 0x58c8,
++      0x681c, 0xa084, 0x0040, 0x0040, 0x58cd, 0xc685, 0x0078, 0x58cd,
++      0x681c, 0xd0b4, 0x0040, 0x58cd, 0xc685, 0x700c, 0xa084, 0x03ff,
++      0x0040, 0x58d8, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0, 0x58d4,
++      0x2400, 0xa305, 0x00c0, 0x58de, 0x0078, 0x5904, 0x2c58, 0x2704,
++      0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e,
++      0xa184, 0x0008, 0x0040, 0x58f4, 0x6010, 0xa081, 0x0000, 0x7022,
++      0x6014, 0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012,
++      0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60,
++      0x1078, 0x5a43, 0x0078, 0x5906, 0x1078, 0x5a15, 0x00c0, 0x5904,
++      0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70f0, 0xa084, 0x4600,
++      0x8004, 0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0,
++      0x5915, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e,
++      0x70f0, 0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x700c, 0xa084,
++      0x03ff, 0x0040, 0x5931, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0,
++      0x592d, 0x6814, 0xd0fc, 0x0040, 0x5938, 0x7e1c, 0x0078, 0x5939,
++      0x7e18, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++      0x0040, 0x5946, 0xa18e, 0x000f, 0x00c0, 0x5950, 0x681c, 0xa084,
++      0x0040, 0x0040, 0x594c, 0xc685, 0x6840, 0x2050, 0x0078, 0x5957,
++      0x681c, 0xd0ac, 0x00c0, 0x5955, 0xc685, 0x6828, 0x2050, 0x2d60,
++      0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x5694, 0x273c, 0x87fb, 0x00c0,
++      0x596b, 0x0048, 0x5965, 0x1078, 0x2bfa, 0x689c, 0xa065, 0x0040,
++      0x596f, 0x0078, 0x5958, 0x1078, 0x5a15, 0x00c0, 0x596b, 0x127f,
++      0x2000, 0x007c, 0x127e, 0x007e, 0x017e, 0x0d7e, 0x70f0, 0xa084,
++      0x4600, 0x8004, 0x2090, 0xb284, 0x0100, 0x0040, 0x5982, 0x7e18,
++      0x0078, 0x5983, 0x7e1c, 0x0d7f, 0x037f, 0x047f, 0xa6b5, 0x000c,
++      0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0040, 0x5993, 0xa18e,
++      0x000f, 0x00c0, 0x599b, 0x681c, 0xa084, 0x0040, 0x0040, 0x59a0,
++      0xc685, 0x0078, 0x59a0, 0x681c, 0xd0b4, 0x0040, 0x59a0, 0xc685,
++      0x2049, 0x5972, 0x017e, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++      0x0040, 0x59ae, 0xa18e, 0x000f, 0x00c0, 0x59b1, 0x6840, 0x0078,
++      0x59b2, 0x6828, 0x017f, 0xa055, 0x0d7e, 0x0040, 0x5a11, 0x2d70,
++      0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x5694, 0x273c, 0x87fb,
++      0x00c0, 0x59cd, 0x0048, 0x59c6, 0x1078, 0x2bfa, 0x709c, 0xa075,
++      0x2060, 0x0040, 0x5a11, 0x0078, 0x59b9, 0x2704, 0xae68, 0x6808,
++      0xa422, 0x680c, 0xa31b, 0x0048, 0x59e6, 0x8a51, 0x00c0, 0x59da,
++      0x1078, 0x2bfa, 0x8738, 0x2704, 0xa005, 0x00c0, 0x59ce, 0x709c,
++      0xa075, 0x2060, 0x0040, 0x5a11, 0x0078, 0x59b9, 0x8422, 0x8420,
++      0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
++      0xa11b, 0x00c8, 0x59f5, 0x1078, 0x2bfa, 0x017e, 0x3208, 0xa18c,
++      0x0100, 0x0040, 0x5a0b, 0x007e, 0x2001, 0x6002, 0x2004, 0xd0ec,
++      0x007f, 0x0040, 0x5a07, 0x2071, 0x0020, 0x0078, 0x5a0d, 0x2071,
++      0x0050, 0x0078, 0x5a0d, 0x2071, 0x0020, 0x017f, 0x0d7f, 0x0078,
++      0x58cd, 0x0d7f, 0x127f, 0x2000, 0x007c, 0x7008, 0x007e, 0xa084,
++      0x01e0, 0x007f, 0x0040, 0x5a1e, 0xa006, 0x007c, 0xa084, 0x0003,
++      0xa086, 0x0003, 0x00c0, 0x5a25, 0x007c, 0x2704, 0xac08, 0x2104,
++      0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012, 0x8108,
++      0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x5a3d, 0x8108,
++      0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7004, 0xa084,
++      0x0010, 0xc085, 0x7006, 0x8738, 0x2704, 0xa005, 0x00c0, 0x5a56,
++      0x609c, 0xa005, 0x0040, 0x5a68, 0x2060, 0x6004, 0xa084, 0x000f,
++      0xa080, 0x5694, 0x203c, 0x87fb, 0x1040, 0x2bfa, 0x8a51, 0x0040,
++      0x5a67, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x5a63,
++      0xa006, 0x0078, 0x5a68, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c,
++      0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x70f0, 0xa084,
++      0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x0003,
++      0x00c0, 0x5a90, 0x017e, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007,
++      0x0040, 0x5a86, 0xa18e, 0x000f, 0x00c0, 0x5a89, 0x6840, 0x0078,
++      0x5a8a, 0x6828, 0x017f, 0xa005, 0x0040, 0x5aa0, 0x0078, 0x55c1,
++      0x7108, 0xd1fc, 0x0040, 0x5a98, 0x1078, 0x5792, 0x0078, 0x5a75,
++      0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x5a9a, 0x1078, 0x5792,
++      0x7008, 0xa086, 0x0008, 0x00c0, 0x5a75, 0x7000, 0xa005, 0x00c0,
++      0x5a75, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c,
++      0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x70f0, 0xa084,
++      0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x5ab0, 0x69b0, 0xad80,
++      0x0011, 0xa100, 0x20a0, 0xb284, 0x0100, 0x0040, 0x5ad5, 0x2001,
++      0x6002, 0x2004, 0xd0ec, 0x0040, 0x5ad1, 0x2099, 0x0031, 0x0078,
++      0x5ad7, 0x2099, 0x0032, 0x0078, 0x5ad7, 0x2099, 0x0031, 0x700c,
++      0xa084, 0x03ff, 0x0040, 0x5af5, 0x6928, 0xa100, 0x682a, 0x7007,
++      0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040, 0x5aea, 0x8000,
++      0x80ac, 0x53a5, 0x700c, 0xa084, 0x03ff, 0x0040, 0x5af5, 0x7007,
++      0x0004, 0x7004, 0xd094, 0x00c0, 0x5af1, 0x0c7f, 0x2049, 0x0000,
++      0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000, 0x007c,
++      0x2091, 0x6000, 0x2091, 0x8000, 0x78b0, 0xa005, 0x00c0, 0x5b17,
++      0x7970, 0x70d0, 0xa106, 0x00c0, 0x5b17, 0x7814, 0xa005, 0x0040,
++      0x5b17, 0x7817, 0x0000, 0x0068, 0x5b17, 0x2091, 0x4080, 0x7828,
++      0x8001, 0x782a, 0x00c0, 0x5b9f, 0x782c, 0x782a, 0x7808, 0xd0ec,
++      0x00c0, 0x5b98, 0x2061, 0x85c0, 0x2069, 0x6080, 0xc7fd, 0x68ec,
++      0xa005, 0x0040, 0x5b32, 0x8001, 0x68ee, 0xa005, 0x00c0, 0x5b32,
++      0x1078, 0x5d6b, 0x6800, 0xa084, 0x000f, 0x0040, 0x5b47, 0xa086,
++      0x0001, 0x0040, 0x5b47, 0x6840, 0xa00d, 0x0040, 0x5b47, 0x2104,
++      0xa005, 0x0040, 0x5b47, 0x8001, 0x200a, 0x0040, 0x5cc9, 0x6810,
++      0xa005, 0x0040, 0x5b6b, 0x8001, 0x6812, 0x00c0, 0x5b6b, 0x68c3,
++      0x0001, 0xd7fc, 0x00c0, 0x5b60, 0x7808, 0xd0ec, 0x0040, 0x5b5c,
++      0x2009, 0x0102, 0x0078, 0x5b62, 0x2009, 0x0202, 0x0078, 0x5b62,
++      0x2009, 0x0102, 0x684c, 0xc08d, 0x200a, 0x6868, 0xa005, 0x0040,
++      0x5b6b, 0x1078, 0x2852, 0x6884, 0xa005, 0x0040, 0x5b78, 0x8001,
++      0x6886, 0x00c0, 0x5b78, 0x686b, 0x0000, 0x68f0, 0xc0dd, 0x68f2,
++      0x68f0, 0xd0fc, 0x0040, 0x5b95, 0xc0fc, 0x68f2, 0x20a9, 0x0200,
++      0x6034, 0xa005, 0x0040, 0x5b91, 0x8001, 0x6036, 0x68f0, 0xc0fd,
++      0x68f2, 0x00c0, 0x5b91, 0x6010, 0xa005, 0x0040, 0x5b91, 0x1078,
++      0x2852, 0xace0, 0x0010, 0x00f0, 0x5b80, 0xd7fc, 0x0040, 0x5b9f,
++      0x2061, 0x65c0, 0x2069, 0x6040, 0xc7fc, 0x0078, 0x5b27, 0x1078,
++      0x5bc8, 0x7830, 0x8001, 0x7832, 0x00c0, 0x5bc1, 0x7834, 0x7832,
++      0x2061, 0x65c0, 0x2069, 0x6040, 0xc7fc, 0x6808, 0xa005, 0x0040,
++      0x5bb3, 0x1078, 0x5c32, 0xd7fc, 0x00c0, 0x5bc1, 0x7808, 0xd0ec,
++      0x00c0, 0x5bc1, 0x2061, 0x85c0, 0x2069, 0x6080, 0xc7fd, 0x0078,
++      0x5bad, 0x780c, 0xd0e4, 0x00c0, 0x5bc5, 0x2091, 0x8001, 0x007c,
++      0x7838, 0x8001, 0x783a, 0x00c0, 0x5c31, 0x783c, 0x783a, 0x2069,
++      0x6040, 0xc7fc, 0x7808, 0x2079, 0x0200, 0xd0ec, 0x0040, 0x5bda,
++      0x2079, 0x0100, 0x68f8, 0xa005, 0x0040, 0x5be6, 0x7de0, 0xa504,
++      0x00c0, 0x5be6, 0x68fa, 0x68f0, 0xc0bc, 0x68f2, 0x2079, 0x6000,
++      0x680c, 0xa005, 0x00c0, 0x5bee, 0x2001, 0x0101, 0x8001, 0x680e,
++      0xd7fc, 0x00c0, 0x5bf7, 0xa080, 0xa5c0, 0x0078, 0x5bf9, 0xa080,
++      0xa6d0, 0x2040, 0x2004, 0xa065, 0x0040, 0x5c23, 0x6024, 0xa005,
++      0x0040, 0x5c1f, 0x8001, 0x6026, 0x00c0, 0x5c1f, 0x6800, 0xa005,
++      0x0040, 0x5c12, 0x6850, 0xac06, 0x00c0, 0x5c12, 0x1078, 0x5cc9,
++      0x0078, 0x5c23, 0x6868, 0xa005, 0x0040, 0x5c1a, 0x6027, 0x0001,
++      0x0078, 0x5c1f, 0x1078, 0x5c7c, 0x2804, 0x0078, 0x5bfb, 0x6000,
++      0x2c40, 0x0078, 0x5bfb, 0xd7fc, 0x00c0, 0x5c31, 0x7808, 0xd0ec,
++      0x00c0, 0x5c31, 0x2069, 0x6080, 0xc7fd, 0x2079, 0x0100, 0x0078,
++      0x5bda, 0x007c, 0xa00e, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0040,
++      0x5c6b, 0x6024, 0xa005, 0x0040, 0x5c41, 0x8001, 0x6026, 0x0078,
++      0x5c69, 0x6008, 0xc09c, 0xd084, 0x00c0, 0x5c49, 0xd0ac, 0x0040,
++      0x5c63, 0x600a, 0x6004, 0xa005, 0x0040, 0x5c6b, 0x0d7e, 0x0c7e,
++      0x017e, 0x2068, 0x6010, 0x8001, 0x6012, 0x1078, 0x3fd3, 0x2d00,
++      0x2c68, 0x2060, 0x1078, 0x1ef5, 0x1078, 0x2240, 0x017f, 0x0c7f,
++      0x0d7f, 0x0078, 0x5c6b, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0078,
++      0x5c6b, 0xa18d, 0x0100, 0xace0, 0x0010, 0x00f0, 0x5c35, 0xa184,
++      0x0001, 0x0040, 0x5c7a, 0xa18c, 0xfffe, 0x690a, 0x1078, 0x2852,
++      0x0078, 0x5c7b, 0x690a, 0x007c, 0x2c00, 0x6882, 0x6714, 0x6f7a,
++      0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x60b4, 0xa084,
++      0x5f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, 0x6022,
++      0x6000, 0x2042, 0x6860, 0xac06, 0x00c0, 0x5c98, 0x2800, 0x6862,
++      0x1078, 0x1e6e, 0x6818, 0xa005, 0x0040, 0x5cc8, 0x8001, 0x681a,
++      0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, 0x8001, 0x0050, 0x5cc8,
++      0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x2251,
++      0xd7fc, 0x00c0, 0x5cb7, 0x2069, 0x6040, 0x0078, 0x5cb9, 0x2069,
++      0x6080, 0x690c, 0xa184, 0x0100, 0x2001, 0x0006, 0x00c0, 0x5cc5,
++      0x6883, 0x0000, 0x697e, 0x2001, 0x0004, 0x2708, 0x1078, 0x2845,
++      0x007c, 0x0d7e, 0x0e7e, 0x2d70, 0xd7fc, 0x00c0, 0x5cdb, 0x7808,
++      0xd0ec, 0x0040, 0x5cd7, 0x2069, 0x0100, 0x0078, 0x5cdd, 0x2069,
++      0x0200, 0x0078, 0x5cdd, 0x2069, 0x0100, 0x7000, 0xa084, 0x000f,
++      0x0040, 0x5d27, 0xa086, 0x0007, 0x00c0, 0x5cef, 0x0f7e, 0x2d78,
++      0x7094, 0x2068, 0x1078, 0x4694, 0x0f7f, 0x0078, 0x5d27, 0x7050,
++      0x2060, 0x1078, 0x2b67, 0x601b, 0x0006, 0x6858, 0xa084, 0x5f00,
++      0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f,
++      0x0000, 0x6033, 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830,
++      0xd0b4, 0x0040, 0x5d23, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848,
++      0xd094, 0x0040, 0x5d15, 0x00f0, 0x5d0f, 0x684b, 0x0009, 0x20a9,
++      0x0014, 0x6848, 0xd084, 0x0040, 0x5d1f, 0x00f0, 0x5d19, 0x20a9,
++      0x00fa, 0x00f0, 0x5d21, 0x681b, 0x0048, 0x706b, 0x0007, 0x0e7f,
++      0x0d7f, 0x007c, 0x2079, 0x6000, 0x1078, 0x5d5e, 0x1078, 0x5d44,
++      0x1078, 0x5d51, 0x2009, 0x0002, 0x2069, 0x6080, 0x680b, 0x0000,
++      0x680f, 0x0000, 0x6813, 0x0000, 0x8109, 0x0040, 0x5d43, 0x2069,
++      0x6040, 0x0078, 0x5d36, 0x007c, 0x7808, 0xd0ec, 0x0040, 0x5d4c,
++      0x2019, 0x00cc, 0x0078, 0x5d4e, 0x2019, 0x007b, 0x7b32, 0x7b36,
++      0x007c, 0x780c, 0xd0e4, 0x00c0, 0x5d59, 0x2019, 0x0040, 0x0078,
++      0x5d5b, 0x2019, 0x0026, 0x7b3a, 0x7b3e, 0x007c, 0x780c, 0xd0e4,
++      0x00c0, 0x5d66, 0x2019, 0x3f94, 0x0078, 0x5d68, 0x2019, 0x2626,
++      0x7b2a, 0x7b2e, 0x007c, 0x6a54, 0xa285, 0x0000, 0x0040, 0x5d93,
++      0x6958, 0x6bdc, 0xa300, 0x0c7e, 0x2164, 0x6304, 0x83ff, 0x00c0,
++      0x5d83, 0x8211, 0x0040, 0x5d87, 0x8108, 0xa11a, 0x0048, 0x5d74,
++      0x69dc, 0x0078, 0x5d74, 0x68ef, 0x000a, 0x0c7f, 0x007c, 0x6954,
++      0x6adc, 0x2264, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109, 0x00c0,
++      0x5d89, 0x6956, 0x0c7f, 0x007c, 0x00e0, 0x5d94, 0x2091, 0x6000,
++      0x00e0, 0x5d98, 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x00c0, 0x5da5,
++      0xd0d4, 0x0040, 0x5dce, 0x0078, 0x5dd1, 0x2008, 0x7808, 0xd0ec,
++      0x0040, 0x5db8, 0xd1c4, 0x00c0, 0x5df0, 0x780c, 0xc0c5, 0x780e,
++      0x7808, 0xc0f5, 0x780a, 0xd0ec, 0x0040, 0x5dec, 0x0078, 0x5de8,
++      0xae8e, 0x0100, 0x0040, 0x5dc5, 0x780c, 0xc0f5, 0xc0c5, 0x780e,
++      0xd0d4, 0x00c0, 0x5dec, 0x0078, 0x5de8, 0x780c, 0xc0fd, 0xc0c5,
++      0x780e, 0xd0d4, 0x00c0, 0x5dec, 0x0078, 0x5de8, 0xd0e4, 0x0040,
++      0x5dee, 0x00e0, 0x5dd1, 0x2091, 0x6000, 0x2009, 0x000c, 0x00e0,
++      0x5dd7, 0x2091, 0x6000, 0x8109, 0x00c0, 0x5dd7, 0x70e4, 0xa084,
++      0x01ff, 0xa086, 0x01ff, 0x00c0, 0x5de8, 0x70ec, 0x0078, 0x5da5,
++      0x7804, 0xd08c, 0x0040, 0x5dee, 0x681b, 0x000c, 0x70a0, 0x70a2,
++      0x007c, 0x0020, 0x002b, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0014, 0x0014, 0x9849, 0x0014,
++      0x0014, 0x98ec, 0x98d6, 0x0014, 0x0014, 0x0014, 0x0080, 0x0140,
++      0x0000, 0x0201, 0x0604, 0x0c08, 0x2120, 0x4022, 0xf880, 0x0018,
++      0x300b, 0xa201, 0x0014, 0xa200, 0x0014, 0xa200, 0x0214, 0xa202,
++      0x3806, 0x7102, 0x805f, 0x9481, 0x8839, 0x20c3, 0x0864, 0xa834,
++      0x28c1, 0x9cb9, 0xa203, 0x300c, 0x2846, 0x8161, 0x846a, 0x8300,
++      0x1856, 0x883a, 0xa804, 0x28f2, 0x9c9d, 0xa8f4, 0x300c, 0x28e1,
++      0x9c9d, 0x2822, 0xa207, 0x64a4, 0x2001, 0xa811, 0xa206, 0x64c0,
++      0x6de0, 0x67a0, 0x6fc0, 0x882b, 0x1814, 0x883b, 0x7824, 0x68c1,
++      0x7864, 0x883e, 0xa802, 0x8576, 0x8677, 0x80df, 0x94a1, 0x206c,
++      0x28c1, 0x9cb9, 0x2045, 0x2104, 0x20a1, 0x2080, 0x7961, 0xa8df,
++      0xa209, 0x0904, 0xa20e, 0xa808, 0xa205, 0xa300, 0x1872, 0x879a,
++      0x883c, 0x1fe2, 0xc601, 0xa20a, 0x8000, 0x85a1, 0x806f, 0x9422,
++      0x84a2, 0x856e, 0x0704, 0x9c9d, 0x0014, 0xa204, 0xa300, 0x3009,
++      0x19e2, 0xf864, 0x856e, 0x883f, 0x08e6, 0xa8f7, 0xf881, 0xa8eb,
++      0xc007, 0xf8c1, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfb02, 0x1de2,
++      0x0014, 0x8532, 0xf241, 0x0014, 0x1de2, 0x84a8, 0xd7a0, 0x1fe6,
++      0x0014, 0xa208, 0x6043, 0x8008, 0x1dc1, 0x0016, 0x8300, 0x8160,
++      0x842a, 0xf041, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011,
++      0x20d5, 0x8822, 0x0016, 0x3008, 0x2845, 0x1011, 0xa8fd, 0x2802,
++      0x1011, 0xa8fd, 0xa894, 0x283e, 0x1011, 0xa8fd, 0xa20b, 0x7102,
++      0x805f, 0x9481, 0x0017, 0x300c, 0xa300, 0x1de2, 0xd387, 0x0210,
++      0xa800, 0x26e0, 0x873a, 0xfb02, 0x19f2, 0x1fe2, 0x0014, 0xa20d,
++      0x3806, 0x0210, 0x9cbe, 0x0704, 0x0017, 0x60ff, 0x300c, 0x8720,
++      0xa211, 0x7102, 0x805f, 0x9481, 0x8000, 0x8300, 0x8772, 0x8837,
++      0x2101, 0xa821, 0x10d2, 0x78e2, 0x9d5c, 0xa8fc, 0xd984, 0xf0e2,
++      0xf0a1, 0xa820, 0x0014, 0x8831, 0xd166, 0x8830, 0x800f, 0x9401,
++      0xb520, 0xc802, 0x8820, 0xa80f, 0x2301, 0xa80d, 0x10d2, 0x78e4,
++      0x9d5c, 0x8821, 0x8820, 0xa8e6, 0xf123, 0xf142, 0xf101, 0xa855,
++      0x10d2, 0x70f6, 0x8832, 0x8203, 0x870c, 0xd99e, 0x6001, 0x0014,
++      0x6848, 0x0214, 0x8827, 0x300a, 0x0013, 0xa21b, 0x8300, 0x2001,
++      0xa843, 0x8201, 0x1852, 0xd183, 0x8834, 0x8001, 0xa801, 0x3027,
++      0x84a8, 0x1a56, 0x8833, 0x0014, 0xa218, 0x6981, 0x9d63, 0x692b,
++      0x6902, 0x1a34, 0xa806, 0x8080, 0x9521, 0xc002, 0x1a94, 0xa801,
++      0x1a14, 0x7021, 0x0014, 0xa300, 0x69e4, 0x8023, 0x16e1, 0x8001,
++      0x10f1, 0x6946, 0xa213, 0x1462, 0xa213, 0x8000, 0x16e1, 0xa808,
++      0x6161, 0x0014, 0xa214, 0x61c2, 0x8002, 0x14e1, 0x8004, 0x16e1,
++      0x0101, 0x300a, 0x8827, 0x0014, 0x11c2, 0x211e, 0x870e, 0xa21d,
++      0x0014, 0x9d63, 0x0014, 0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6,
++      0x882c, 0x0016, 0xa212, 0x8300, 0x10d2, 0x70e4, 0x0004, 0x8007,
++      0x9424, 0xcc1a, 0x9d5c, 0xa8f8, 0x878e, 0x0016, 0xa21c, 0x1035,
++      0xa8bb, 0xa210, 0x3807, 0x300c, 0x817e, 0x872b, 0x8772, 0x0014,
++      0x0000, 0xd27a
++};
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_12160.h    2003-07-19 17:06:32.000000000 -0700
+@@ -0,0 +1,4198 @@
++/* @(#)asm_12160.h 1.3 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */ 
++
++/************************************************************************
++ *                                                                    *
++ *          --- ISP12160A Initiator/Target RISC Firmware ---          *
++ *                         32 LUN Support                             *
++ *                                                                    *
++ ************************************************************************/
++#ifndef       ISP_TARGET_MODE
++/*
++ *    Firmware Version 10.04.32 (12:03 May 09, 2001)
++ */
++static const u_int16_t isp_12160_risc_code[] = {
++      0x0804, 0x1041, 0x0000, 0x35e6, 0x0000, 0x2043, 0x4f50, 0x5952,
++      0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31,
++      0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320,
++      0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350,
++      0x3132, 0x3136, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
++      0x6572, 0x7369, 0x6f6e, 0x2031, 0x302e, 0x3034, 0x2020, 0x2043,
++      0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050,
++      0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020,
++      0x2400, 0x20c9, 0x8fff, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001,
++      0x01ff, 0x2004, 0xd0fc, 0x1120, 0x2071, 0x0100, 0x70a0, 0x70a2,
++      0x20c1, 0x0020, 0x2089, 0x1221, 0x2071, 0x0010, 0x70c3, 0x0004,
++      0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x000a,
++      0x2001, 0x04fd, 0x2004, 0x70d6, 0x2009, 0xfeff, 0x2130, 0x2128,
++      0xa1a2, 0x4600, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424,
++      0xa192, 0x9000, 0x2009, 0x0000, 0x2001, 0x0032, 0x080c, 0x1de8,
++      0x2218, 0x2079, 0x4600, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9,
++      0x0040, 0x42a4, 0x8109, 0x1dd8, 0x2009, 0xff00, 0x3400, 0xa102,
++      0x0218, 0x0110, 0x20a8, 0x42a4, 0x781b, 0x0064, 0x7814, 0xc0cd,
++      0xc0d5, 0x7816, 0x2071, 0x0200, 0x00d6, 0x2069, 0x4640, 0x080c,
++      0x459a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1130, 0x2069, 0x4680,
++      0x2071, 0x0100, 0x080c, 0x459a, 0x7814, 0xc0d4, 0x7816, 0x00de,
++      0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800, 0xc08d, 0x7802,
++      0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002, 0x7827, 0x0002,
++      0x2009, 0x0002, 0x2069, 0x4640, 0x681b, 0x0003, 0x6823, 0x0007,
++      0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028, 0x6837, 0x0006,
++      0x6833, 0x0008, 0x683b, 0x0000, 0x8109, 0x0500, 0x68cf, 0x000a,
++      0x68bf, 0x46c0, 0x2079, 0x4600, 0x68d3, 0x762d, 0x68c3, 0x4bc0,
++      0x68c7, 0x4ac0, 0x68cb, 0x8bc0, 0x68a7, 0x8e44, 0x68ab, 0x8e49,
++      0x68af, 0x8e44, 0x68b3, 0x8e44, 0x68a3, 0x0001, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x11c8, 0x2069, 0x4680, 0x0870, 0x68cf, 0x000a,
++      0x68bf, 0x48c0, 0x68d3, 0x7839, 0x68c3, 0x6bc0, 0x68c7, 0x4b40,
++      0x68cb, 0x8cd0, 0x68a7, 0x8e49, 0x68ab, 0x8e4e, 0x68af, 0x8e49,
++      0x68b3, 0x8e49, 0x68a3, 0x0001, 0x00e6, 0x2069, 0x4ac0, 0x2071,
++      0x0200, 0x70ec, 0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120,
++      0x2019, 0x180c, 0x2021, 0x000c, 0x080c, 0x1d58, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x1188, 0x2069, 0x4b40, 0x2071, 0x0100, 0x70ec,
++      0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120, 0x2019, 0x180c,
++      0x2021, 0x000c, 0x080c, 0x1d58, 0x00ee, 0x2011, 0x0002, 0x2069,
++      0x4bc0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b,
++      0x0040, 0x7bc8, 0xa386, 0xfeff, 0x1128, 0x6817, 0x0100, 0x681f,
++      0x0064, 0x0020, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010,
++      0x1f04, 0x1135, 0x8109, 0x1d38, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++      0x1128, 0x8211, 0x0118, 0x2069, 0x6bc0, 0x08d8, 0x080c, 0x22cf,
++      0x080c, 0x4015, 0x080c, 0x1b6d, 0x080c, 0x4553, 0x2091, 0x2200,
++      0x2079, 0x4600, 0x2071, 0x0050, 0x2091, 0x2400, 0x2079, 0x4600,
++      0x2071, 0x0020, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x4640,
++      0x2091, 0x2800, 0x2079, 0x0100, 0x2071, 0x4680, 0x2091, 0x2000,
++      0x2079, 0x4600, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090,
++      0x2071, 0x0010, 0x70c3, 0x0000, 0x1004, 0x118c, 0x70c0, 0xa086,
++      0x0002, 0x1110, 0x080c, 0x13ba, 0x2039, 0x0000, 0x080c, 0x12ab,
++      0x78ac, 0xa005, 0x1180, 0x0e04, 0x119a, 0x786c, 0xa065, 0x0110,
++      0x080c, 0x207a, 0x080c, 0x1e09, 0x0e04, 0x11af, 0x786c, 0xa065,
++      0x0110, 0x080c, 0x207a, 0x0e04, 0x11af, 0x2009, 0x4647, 0x2011,
++      0x4687, 0x2104, 0x220c, 0xa105, 0x0110, 0x080c, 0x1c7c, 0x2071,
++      0x4640, 0x70a0, 0xa005, 0x01e8, 0x744c, 0xa485, 0x0000, 0x01c8,
++      0x2079, 0x0200, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d, 0x2190,
++      0x080c, 0x2720, 0x2091, 0x8000, 0x2091, 0x303d, 0x0e04, 0x11d1,
++      0x2079, 0x4600, 0x786c, 0xa065, 0x0120, 0x2071, 0x0010, 0x080c,
++      0x207a, 0x1d04, 0x11d9, 0x2079, 0x4600, 0x2071, 0x0010, 0x080c,
++      0x4370, 0x2071, 0x4680, 0x70a0, 0xa005, 0x0188, 0x704c, 0xa025,
++      0x0170, 0x2079, 0x0100, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d,
++      0x2190, 0x080c, 0x2720, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079,
++      0x4600, 0x2071, 0x0010, 0x0e04, 0x11fa, 0x786c, 0xa065, 0x0110,
++      0x080c, 0x207a, 0x1d04, 0x118e, 0x080c, 0x4370, 0x0804, 0x118e,
++      0x3c00, 0xa084, 0x0007, 0x0002, 0x120c, 0x120c, 0x120e, 0x120e,
++      0x1213, 0x1213, 0x1218, 0x1218, 0x080c, 0x254c, 0x2091, 0x2400,
++      0x080c, 0x40ad, 0x0005, 0x2091, 0x2200, 0x080c, 0x40ad, 0x0005,
++      0x2091, 0x2200, 0x080c, 0x40ad, 0x2091, 0x2400, 0x080c, 0x40ad,
++      0x0005, 0x1241, 0x1241, 0x1242, 0x1242, 0x124d, 0x124d, 0x124d,
++      0x124d, 0x1256, 0x1256, 0x1261, 0x1261, 0x124d, 0x124d, 0x124d,
++      0x124d, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270,
++      0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270,
++      0x1270, 0x0cf8, 0x0006, 0x0106, 0x0126, 0x2091, 0x2800, 0x080c,
++      0x2569, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126,
++      0x080c, 0x1200, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106,
++      0x0126, 0x2091, 0x2600, 0x080c, 0x2569, 0x012e, 0x010e, 0x000e,
++      0x000d, 0x0006, 0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x2569,
++      0x2091, 0x2800, 0x080c, 0x2569, 0x012e, 0x010e, 0x000e, 0x000d,
++      0x0006, 0x0106, 0x0126, 0x00d6, 0x00e6, 0x00f6, 0x2079, 0x4600,
++      0x2071, 0x0200, 0x2069, 0x4640, 0x3d00, 0xd08c, 0x0130, 0x70ec,
++      0xa084, 0x1c00, 0x78e2, 0x080c, 0x459a, 0x3d00, 0xd084, 0x0150,
++      0x2069, 0x4680, 0x2071, 0x0100, 0x70ec, 0xa084, 0x1c00, 0x78e6,
++      0x080c, 0x459a, 0x080c, 0x24fd, 0x00fe, 0x00ee, 0x00de, 0x012e,
++      0x010e, 0x000e, 0x000d, 0x7008, 0x800b, 0x1240, 0x7007, 0x0002,
++      0xa08c, 0x01e0, 0x1120, 0xd09c, 0x0108, 0x0887, 0x0897, 0x70c3,
++      0x4002, 0x0804, 0x13bd, 0x0e04, 0x131e, 0x2061, 0x0000, 0x6018,
++      0xd084, 0x1904, 0x131e, 0x7828, 0xa005, 0x1120, 0x0004, 0x131f,
++      0x0804, 0x131e, 0xd0fc, 0x0130, 0x0006, 0x080c, 0x1b0a, 0x000e,
++      0x0150, 0x0028, 0x0006, 0x080c, 0x1aff, 0x000e, 0x0120, 0x2001,
++      0x4007, 0x0804, 0x13bc, 0x7910, 0xd0fc, 0x1128, 0x2061, 0x4640,
++      0xc19c, 0xc7fc, 0x0020, 0x2061, 0x4680, 0xc19d, 0xc7fd, 0x6060,
++      0xa005, 0x1904, 0x131e, 0x7912, 0x607e, 0x7828, 0xc0fc, 0xa086,
++      0x0018, 0x1120, 0x00c6, 0x080c, 0x1916, 0x00ce, 0x782b, 0x0000,
++      0x6078, 0xa065, 0x01e0, 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce,
++      0x609f, 0x0000, 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, 0x0103,
++      0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
++      0x080c, 0x1b15, 0x000e, 0x7812, 0x1198, 0x080c, 0x1b60, 0x7810,
++      0xd09c, 0x1118, 0x2061, 0x4640, 0x0020, 0x2061, 0x4680, 0xc09c,
++      0x7812, 0x607b, 0x0000, 0x60d0, 0xd0c4, 0x0130, 0xc0c4, 0x60d2,
++      0x2001, 0x4005, 0x0804, 0x13bc, 0x0804, 0x13ba, 0x0005, 0xa006,
++      0x70c2, 0x70c6, 0x70ca, 0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a,
++      0x0040, 0x1a04, 0x136c, 0x0002, 0x13ba, 0x1408, 0x13d6, 0x143c,
++      0x1470, 0x1470, 0x13ce, 0x1a59, 0x147a, 0x13c8, 0x13da, 0x13db,
++      0x13dc, 0x13dd, 0x1a5d, 0x13c8, 0x1487, 0x14db, 0x1931, 0x1a53,
++      0x13de, 0x17ba, 0x17f0, 0x1822, 0x1868, 0x1777, 0x1784, 0x1797,
++      0x17a9, 0x15b0, 0x13c8, 0x150d, 0x1518, 0x1526, 0x1534, 0x154b,
++      0x1559, 0x155c, 0x156a, 0x1578, 0x1582, 0x1596, 0x15a2, 0x13c8,
++      0x13c8, 0x13c8, 0x13c8, 0x15bd, 0x15ce, 0x15e8, 0x161c, 0x1645,
++      0x1657, 0x165a, 0x1685, 0x16be, 0x16d0, 0x1745, 0x1755, 0x13c8,
++      0x13c8, 0x13c8, 0x13c8, 0x1767, 0x2100, 0xa08a, 0x0040, 0x1a04,
++      0x13c8, 0x0002, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x1a7f,
++      0x1a85, 0x13c8, 0x13c8, 0x13c8, 0x1a89, 0x1ac9, 0x13c8, 0x13c8,
++      0x13c8, 0x13c8, 0x1403, 0x146b, 0x1482, 0x14d6, 0x192c, 0x13c8,
++      0x13c8, 0x18fb, 0x13c8, 0x1acd, 0x1a71, 0x1a7b, 0x13c8, 0x13c8,
++      0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
++      0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
++      0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
++      0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8,
++      0x13c8, 0x13c8, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0028, 0x73ce,
++      0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0e04, 0x13bd, 0x2061,
++      0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x0005,
++      0x70c3, 0x4001, 0x0c90, 0x70c3, 0x4006, 0x0c78, 0x2099, 0x0041,
++      0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0c20, 0x70c4, 0x70c3,
++      0x0004, 0x0807, 0x08f8, 0x08f0, 0x08e8, 0x08e0, 0x2091, 0x8000,
++      0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020,
++      0x70d3, 0x000a, 0x2001, 0x0004, 0x70d6, 0x2079, 0x0000, 0x781b,
++      0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051,
++      0x0445, 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091,
++      0x4080, 0x0804, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0018,
++      0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0,
++      0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e,
++      0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0904, 0x13ba, 0xa182,
++      0x0040, 0x1210, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x7007,
++      0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002,
++      0xa084, 0x01e0, 0x0120, 0x70c3, 0x4002, 0x0804, 0x13bd, 0x24a8,
++      0x53a5, 0x0c10, 0x0804, 0x13ba, 0x2029, 0x0000, 0x2520, 0x71d0,
++      0x72c8, 0x73cc, 0x70c4, 0x2098, 0x20a1, 0x0030, 0x7003, 0x0000,
++      0x7007, 0x0006, 0x731a, 0x721e, 0x7422, 0x7526, 0x2021, 0x0040,
++      0x7007, 0x0006, 0x81ff, 0x0904, 0x13ba, 0xa182, 0x0040, 0x1210,
++      0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007,
++      0x0001, 0x7008, 0xd0fc, 0x0de8, 0xa084, 0x01e0, 0x0d48, 0x70c3,
++      0x4002, 0x0804, 0x13bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0878,
++      0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x1108, 0x200a, 0x72ca,
++      0x0804, 0x13b9, 0x70c7, 0x000a, 0x70cb, 0x0004, 0x70cf, 0x0020,
++      0x0804, 0x13ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0018, 0x2029,
++      0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca,
++      0x73ce, 0x74d2, 0xa005, 0x05e8, 0xa40a, 0x0108, 0x1240, 0x8001,
++      0x7872, 0xa084, 0xfc00, 0x0138, 0x78ac, 0xc085, 0x78ae, 0x2001,
++      0x4005, 0x0804, 0x13bc, 0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76,
++      0xa48c, 0xff00, 0x0170, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c,
++      0x810f, 0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000,
++      0x0050, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1,
++      0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605,
++      0x0118, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc, 0x78ae,
++      0x0018, 0x78ac, 0xc085, 0x78ae, 0x0804, 0x13ba, 0x75d8, 0x76dc,
++      0x75da, 0x76de, 0x0018, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8,
++      0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0500,
++      0xa40a, 0x0110, 0x1a04, 0x13bc, 0x8001, 0x7892, 0xa084, 0xfc00,
++      0x0138, 0x78ac, 0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0804, 0x13bc,
++      0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0118, 0x7a10,
++      0xc2c5, 0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0018,
++      0x78ac, 0xc0c5, 0x78ae, 0x0804, 0x13ba, 0x2009, 0x0000, 0x786c,
++      0xa065, 0x0118, 0x8108, 0x6000, 0x0cd8, 0x7ac4, 0x0804, 0x13b8,
++      0x2009, 0x4648, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
++      0x13b9, 0x2011, 0x4688, 0x2214, 0x0804, 0x13b8, 0x2009, 0x4649,
++      0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011,
++      0x4689, 0x2214, 0x0804, 0x13b8, 0x2061, 0x4640, 0x6128, 0x622c,
++      0x8214, 0x8214, 0x8214, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1148,
++      0x2061, 0x4680, 0x6328, 0x73da, 0x632c, 0x831c, 0x831c, 0x831c,
++      0x73de, 0x0804, 0x13b8, 0x2009, 0x464c, 0x210c, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x468c, 0x2214, 0x0804,
++      0x13b8, 0x7918, 0x0804, 0x13b9, 0x2009, 0x0202, 0x210c, 0x2001,
++      0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x0102, 0x2214,
++      0x0804, 0x13b8, 0x2009, 0x464d, 0x210c, 0x2001, 0x01ff, 0x2004,
++      0xd0fc, 0x1904, 0x13b9, 0x2011, 0x468d, 0x2214, 0x0804, 0x13b8,
++      0x7920, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x7a24,
++      0x0804, 0x13b8, 0x2011, 0x4b40, 0x71c4, 0xd1fc, 0x1110, 0x2011,
++      0x4ac0, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268,
++      0x6a00, 0x6b08, 0x6c1c, 0x74da, 0x0804, 0x13b7, 0x77c4, 0x080c,
++      0x1b7b, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++      0x0804, 0x13b7, 0x2061, 0x4640, 0x6118, 0x2001, 0x01ff, 0x2004,
++      0xd0fc, 0x1904, 0x13b9, 0x2061, 0x4680, 0x6218, 0x0804, 0x13b8,
++      0x77c4, 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10,
++      0x77da, 0x2091, 0x8001, 0x0804, 0x13b7, 0x71c4, 0x2110, 0xa294,
++      0x000f, 0xa282, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x238b, 0xa384,
++      0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x71c4, 0x2100,
++      0xc0bc, 0xa082, 0x0010, 0x1a04, 0x13b3, 0xd1bc, 0x1120, 0x2011,
++      0x4648, 0x2204, 0x0020, 0x2011, 0x4688, 0x2204, 0xc0bd, 0x0006,
++      0x2100, 0xc0bc, 0x2012, 0x080c, 0x2331, 0x001e, 0x0804, 0x13b9,
++      0x71c4, 0x2021, 0x4649, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0030,
++      0x71c8, 0x2021, 0x4689, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1614,
++      0x20a9, 0x0008, 0x2204, 0xa106, 0x0138, 0x8210, 0x1f04, 0x15fa,
++      0x71c4, 0x72c8, 0x0804, 0x13b2, 0xa292, 0x1614, 0x0026, 0x2122,
++      0x001e, 0x080c, 0x2343, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1110,
++      0xd3fc, 0x09f0, 0x0804, 0x13ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee,
++      0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4640, 0x6128, 0x622c,
++      0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003,
++      0x8003, 0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11a0, 0x0026,
++      0x0016, 0x2061, 0x4680, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214,
++      0x70d8, 0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da,
++      0x72de, 0x001e, 0x002e, 0x0804, 0x13b8, 0x2061, 0x4640, 0x6130,
++      0x70c4, 0x6032, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9,
++      0x2061, 0x4680, 0x6230, 0x70c8, 0x6032, 0x0804, 0x13b8, 0x7918,
++      0x0804, 0x13b9, 0x71c4, 0xa184, 0xf0cf, 0x0148, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8, 0x0804, 0x13b2, 0x0006,
++      0x2019, 0x0000, 0x080c, 0x237f, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++      0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa184, 0xf0cf, 0x0128,
++      0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x0006, 0xc3fd, 0x080c,
++      0x237f, 0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0xa182, 0x0010,
++      0x0248, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8,
++      0x0804, 0x13b2, 0x2011, 0x464d, 0x2204, 0x0006, 0x8104, 0x1208,
++      0x8108, 0x2112, 0x2019, 0x0000, 0x080c, 0x236c, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa182,
++      0x0010, 0x0228, 0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x2011,
++      0x468d, 0x2204, 0x0006, 0x8104, 0x1208, 0x8108, 0x2112, 0xc3fd,
++      0x080c, 0x236c, 0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0x72c8,
++      0xa184, 0xfffd, 0x1904, 0x13b2, 0xa284, 0xfffd, 0x1904, 0x13b2,
++      0x2100, 0x7920, 0x7822, 0x2200, 0x7a24, 0x7826, 0x0804, 0x13b8,
++      0x2011, 0x4b40, 0x71c4, 0xd1fc, 0x1110, 0x2011, 0x4ac0, 0x8107,
++      0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, 0x72c8, 0x73cc,
++      0x74d8, 0x71c6, 0x6800, 0x70ca, 0x73ce, 0x74da, 0x2091, 0x8000,
++      0x6a02, 0xd2ac, 0x1118, 0x2021, 0x0000, 0x0090, 0xa484, 0x00ff,
++      0xa082, 0x0002, 0x1a04, 0x1741, 0x843f, 0xa7bc, 0x00ff, 0x0140,
++      0xa786, 0x0002, 0x1904, 0x1741, 0xa484, 0x00ff, 0x0904, 0x1741,
++      0x2061, 0x0200, 0xd1fc, 0x0110, 0x2061, 0x0100, 0x2029, 0x0009,
++      0x2031, 0x0062, 0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, 0xa084,
++      0x00ff, 0x1110, 0xa73d, 0x1138, 0x2041, 0x0019, 0xa384, 0x00ff,
++      0xa082, 0x001a, 0x0210, 0xa4a4, 0x00ff, 0x8307, 0xa084, 0x00ff,
++      0x0188, 0xa842, 0x02f0, 0xa086, 0x0010, 0x1120, 0xa39c, 0x00ff,
++      0xa39d, 0x0f00, 0xa3bc, 0x00ff, 0x2500, 0xa702, 0x0290, 0x2600,
++      0xa702, 0x1278, 0x2039, 0x003a, 0x6804, 0xa705, 0x6806, 0x6b0a,
++      0x6b0c, 0x73ce, 0x681c, 0x70da, 0x6c1e, 0x2091, 0x8001, 0x0804,
++      0x13ba, 0x2091, 0x8001, 0x0804, 0x13b4, 0x77c4, 0x080c, 0x1b7b,
++      0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816,
++      0x70cc, 0x681e, 0x2708, 0x0804, 0x13b7, 0x70c4, 0x2061, 0x4640,
++      0x6118, 0x601a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9,
++      0x70c8, 0x2061, 0x4680, 0x6218, 0x601a, 0x0804, 0x13b8, 0x71c4,
++      0x72c8, 0x73cc, 0xa182, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x23af,
++      0xa384, 0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x77c4,
++      0x080c, 0x1b7b, 0x2091, 0x8000, 0x6a08, 0xc28d, 0x6a0a, 0x2091,
++      0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4, 0x080c, 0x1b7b, 0x2091,
++      0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0110,
++      0x080c, 0x22ae, 0x2091, 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4,
++      0x080c, 0x1b7b, 0x2091, 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804,
++      0xa005, 0x0110, 0x080c, 0x22ae, 0x2091, 0x8001, 0x2708, 0x0804,
++      0x13b8, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020,
++      0x2091, 0x8000, 0x080c, 0x1b93, 0x2091, 0x8001, 0x2708, 0x6a08,
++      0x0804, 0x13b8, 0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b0a, 0x0138,
++      0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x73c8,
++      0x72cc, 0x77c6, 0x73ca, 0x72ce, 0x080c, 0x1c0b, 0x11e8, 0x6818,
++      0xa005, 0x01a0, 0x2708, 0x0076, 0x080c, 0x23ce, 0x007e, 0x1170,
++      0x2001, 0x0015, 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0xc0fd,
++      0x2061, 0x4680, 0x782a, 0x2091, 0x8001, 0x0005, 0x2091, 0x8001,
++      0x2001, 0x4005, 0x0804, 0x13bc, 0x2091, 0x8001, 0x0804, 0x13ba,
++      0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b0a, 0x0138, 0x0804, 0x13bc,
++      0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x77c6, 0x2041, 0x0021,
++      0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1b93,
++      0x2009, 0x0016, 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061,
++      0x4680, 0xc1fd, 0x6063, 0x0003, 0x607b, 0x0000, 0x6772, 0x607f,
++      0x000f, 0x792a, 0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22ae, 0x2091,
++      0x8001, 0x0005, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xd7fc, 0x0128,
++      0x080c, 0x1b0a, 0x0138, 0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110,
++      0x0804, 0x13bc, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2009, 0x0017,
++      0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, 0x4680, 0xc1fd,
++      0x607b, 0x0000, 0x6063, 0x0002, 0x6772, 0x607f, 0x000f, 0x792a,
++      0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22ae, 0x2091, 0x8001, 0x2041,
++      0x0021, 0x2049, 0x0005, 0x2051, 0x0030, 0x2091, 0x8000, 0x70c8,
++      0xa005, 0x0118, 0x60d0, 0xc0fd, 0x60d2, 0x080c, 0x1b93, 0x70c8,
++      0x6836, 0x8738, 0xa784, 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005,
++      0x2019, 0x0000, 0x72c8, 0xd284, 0x0128, 0x080c, 0x1b0a, 0x0138,
++      0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x72c8,
++      0x72ca, 0x78ac, 0xa084, 0x0003, 0x1508, 0x2039, 0x0000, 0xd284,
++      0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
++      0x080c, 0x1b7b, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a,
++      0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x1d90, 0xa7bc, 0xff00,
++      0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d50, 0x2091, 0x8000,
++      0x72c8, 0x2069, 0x0100, 0xd284, 0x1110, 0x2069, 0x0200, 0x6808,
++      0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b, 0x0004,
++      0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x18b2, 0x684b,
++      0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04, 0x18bb,
++      0x20a9, 0x00fa, 0x1f04, 0x18c2, 0x2079, 0x4600, 0x2009, 0x0018,
++      0x72c8, 0xd284, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, 0x4680,
++      0xc1fd, 0x607b, 0x0000, 0x792a, 0x6063, 0x0001, 0x607f, 0x000f,
++      0x60a3, 0x0000, 0x60a4, 0x60ae, 0x60b2, 0x60d0, 0xd0b4, 0x0160,
++      0xc0b4, 0x60d2, 0x00c6, 0x60b4, 0xa065, 0x6008, 0xc0d4, 0x600a,
++      0x6018, 0x8001, 0x601a, 0x00ce, 0x60d0, 0xa084, 0x7eff, 0x60d2,
++      0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0108, 0x0005, 0x681b, 0x0054,
++      0x2091, 0x8001, 0x0005, 0x73cc, 0x080c, 0x186a, 0x69ec, 0x6a48,
++      0xa185, 0x1800, 0x684a, 0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021,
++      0x0004, 0x20a9, 0x09ff, 0x1f04, 0x190b, 0x8421, 0x1dd0, 0x8319,
++      0x1db0, 0x69ee, 0x6a4a, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118,
++      0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x71c4, 0x71c6, 0x6916,
++      0x81ff, 0x1110, 0x68a3, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084,
++      0x1110, 0x080c, 0x1c5b, 0x0005, 0x75d8, 0x74dc, 0x75da, 0x74de,
++      0x0010, 0xa02e, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca,
++      0x72ce, 0x2079, 0x4600, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x080c,
++      0x1b58, 0x0904, 0x1a3d, 0x20a9, 0x0005, 0x20a1, 0x4614, 0x2091,
++      0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x080c, 0x1d24,
++      0x0120, 0x080c, 0x1b60, 0x0804, 0x1a3d, 0x6004, 0xa08c, 0x00ff,
++      0xa18e, 0x0009, 0x1120, 0x0006, 0x080c, 0x205f, 0x000e, 0xa084,
++      0xff00, 0x8007, 0x8009, 0x0904, 0x19e1, 0x00c6, 0x2c68, 0x080c,
++      0x1b58, 0x05a8, 0x2c00, 0x689e, 0x8109, 0x1dc0, 0x609f, 0x0000,
++      0x00ce, 0x00c6, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040,
++      0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda,
++      0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0904, 0x19e0, 0x2009,
++      0x0040, 0x080c, 0x1d24, 0x15a0, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0002, 0x1168, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, 0x1120,
++      0x0016, 0x080c, 0x205c, 0x001e, 0x2d00, 0x6002, 0x0898, 0x00ce,
++      0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, 0x609f, 0x0000, 0x080c,
++      0x1a41, 0x2009, 0x0018, 0x6008, 0xc0cd, 0x600a, 0x6004, 0x6086,
++      0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
++      0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, 0x1b60, 0x0804, 0x1a3d,
++      0x00ce, 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, 0x609f, 0x0000,
++      0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003,
++      0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812,
++      0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, 0x1b60, 0x0804, 0x1a3d,
++      0x00ce, 0x6114, 0xd1fc, 0x0120, 0x080c, 0x1b0a, 0x01f0, 0x0018,
++      0x080c, 0x1aff, 0x01d0, 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087,
++      0x0103, 0x601b, 0x0021, 0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff,
++      0x0110, 0xc0c5, 0x7812, 0x080c, 0x1b15, 0x000e, 0x7812, 0x080c,
++      0x1b60, 0x2001, 0x4007, 0x0804, 0x13bc, 0x74c4, 0x73c8, 0x72cc,
++      0x6014, 0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc, 0x1118,
++      0x2071, 0x4640, 0x0018, 0x2071, 0x4680, 0xc1fd, 0x792a, 0x7063,
++      0x0005, 0x71d0, 0xc1c4, 0x71d2, 0x7366, 0x726a, 0x746e, 0x7072,
++      0x7077, 0x0000, 0x2c00, 0x707a, 0xa02e, 0x2530, 0x611c, 0xa184,
++      0x0060, 0x0110, 0x080c, 0x3fc1, 0x00ee, 0x6596, 0x65a6, 0x669a,
++      0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000,
++      0x080c, 0x22ae, 0x2091, 0x8001, 0x0005, 0x70c3, 0x4005, 0x0804,
++      0x13bd, 0x20a9, 0x0005, 0x2099, 0x4614, 0x2091, 0x8000, 0x530a,
++      0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000,
++      0xa5a9, 0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, 0x791e, 0x0804,
++      0x13ba, 0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, 0x1000, 0x690c,
++      0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, 0xa285, 0x0000,
++      0x1118, 0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, 0x70ca, 0x0804,
++      0x13bd, 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x1a04, 0x13b3,
++      0x7966, 0x0804, 0x13ba, 0x7964, 0x71c6, 0x0804, 0x13ba, 0x7900,
++      0x71c6, 0x71c4, 0x7902, 0x0804, 0x13ba, 0x7900, 0x71c6, 0x0804,
++      0x13ba, 0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0160, 0x810c,
++      0x0230, 0x8210, 0x810c, 0x810c, 0x0210, 0x8210, 0x810c, 0x81ff,
++      0x1904, 0x13b4, 0x8210, 0x7a0e, 0xd28c, 0x0538, 0x7910, 0xc1cd,
++      0x7912, 0x2009, 0x0021, 0x2019, 0x0003, 0xd284, 0x01c0, 0x8108,
++      0x2019, 0x0041, 0x2011, 0x8e4e, 0x2312, 0x2019, 0x0042, 0x8210,
++      0x2312, 0x2019, 0x0043, 0x8210, 0x2312, 0x2019, 0x0046, 0x8210,
++      0x2312, 0x2019, 0x0047, 0x8210, 0x2312, 0x2019, 0x0006, 0x2011,
++      0x8e53, 0x2112, 0x2011, 0x8e73, 0x2312, 0x7904, 0x7806, 0x0804,
++      0x13b9, 0x7804, 0x70c6, 0x0804, 0x13ba, 0x71c4, 0xd1fc, 0x1118,
++      0x2011, 0x4ac0, 0x0010, 0x2011, 0x4b40, 0x8107, 0xa084, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa268, 0x2011, 0x0000, 0x6814, 0xd0fc,
++      0x0110, 0xa295, 0x0200, 0xd0b4, 0x0110, 0xa295, 0x0001, 0x6b0c,
++      0x6800, 0x70da, 0x0804, 0x13b7, 0x7814, 0xd0f4, 0x0130, 0x2001,
++      0x4007, 0x70db, 0x0000, 0xa005, 0x0048, 0xd0fc, 0x0130, 0x2001,
++      0x4007, 0x70db, 0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7814,
++      0xd0f4, 0x0130, 0x2001, 0x4007, 0x70db, 0x0000, 0xa005, 0x0008,
++      0xa006, 0x0005, 0x7814, 0xd0fc, 0x0130, 0x2001, 0x4007, 0x70db,
++      0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7112, 0x721a, 0x731e,
++      0x7810, 0xd0c4, 0x0110, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108,
++      0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084,
++      0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0140,
++      0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018,
++      0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211,
++      0x7d10, 0xd5c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008,
++      0xd0fc, 0x0de8, 0x7003, 0x0001, 0x7007, 0x0006, 0x711a, 0x721e,
++      0x7d10, 0xd5c4, 0x0110, 0x7322, 0x7426, 0xa084, 0x01e0, 0x0005,
++      0x7848, 0xa065, 0x0120, 0x2c04, 0x784a, 0x2063, 0x0000, 0x0005,
++      0x00f6, 0x2079, 0x4600, 0x7848, 0x2062, 0x2c00, 0xa005, 0x1110,
++      0x080c, 0x254c, 0x784a, 0x00fe, 0x0005, 0x2011, 0x9000, 0x7a4a,
++      0x7bc4, 0x8319, 0x0128, 0xa280, 0x0032, 0x2012, 0x2010, 0x0cc8,
++      0x2013, 0x0000, 0x0005, 0x0016, 0x0026, 0xd7fc, 0x1118, 0x2011,
++      0x4bc0, 0x0010, 0x2011, 0x6bc0, 0xa784, 0x0f00, 0x800b, 0xa784,
++      0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa268,
++      0x002e, 0x001e, 0x0005, 0x0c39, 0x2900, 0x682a, 0x2a00, 0x682e,
++      0x6808, 0xa084, 0xf9ef, 0xa80d, 0x690a, 0x00e6, 0xd7fc, 0x1128,
++      0x2009, 0x4652, 0x2071, 0x4640, 0x0020, 0x2009, 0x4692, 0x2071,
++      0x4680, 0x210c, 0x6804, 0xa005, 0x0148, 0xa116, 0x1138, 0x2060,
++      0x6000, 0x6806, 0x0016, 0x200b, 0x0000, 0x0018, 0x2009, 0x0000,
++      0x0016, 0x6804, 0xa065, 0x0178, 0x6000, 0x6806, 0x0421, 0x080c,
++      0x1d95, 0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x6812, 0x1d88,
++      0x7910, 0xc1a5, 0x7912, 0x001e, 0x6902, 0x6906, 0x2d00, 0x2060,
++      0x080c, 0x2693, 0x00ee, 0x0005, 0xa065, 0x0160, 0x2008, 0x609c,
++      0xa005, 0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x7848,
++      0x794a, 0x2062, 0x0005, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
++      0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
++      0x601a, 0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, 0x1128, 0x2071,
++      0x4640, 0x2031, 0x46c0, 0x0020, 0x2071, 0x4680, 0x2031, 0x48c0,
++      0x704c, 0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, 0x8000, 0x704e,
++      0xa006, 0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0x4640,
++      0x0010, 0x2079, 0x4680, 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6804,
++      0x780a, 0xa065, 0x05f0, 0x0030, 0x2c00, 0x780a, 0x2060, 0x6000,
++      0xa065, 0x05b8, 0x6010, 0xa306, 0x1db8, 0x600c, 0xa206, 0x1da0,
++      0x2c28, 0x7848, 0xac06, 0x1108, 0x0448, 0x6804, 0xac06, 0x1140,
++      0x6000, 0x2060, 0x6806, 0xa005, 0x1118, 0x6803, 0x0000, 0x0048,
++      0x6400, 0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x1110, 0x2c00,
++      0x6802, 0x2560, 0x080c, 0x1be3, 0x601b, 0x0005, 0x6023, 0x0020,
++      0x00fe, 0x080c, 0x1d95, 0x00f6, 0x7908, 0x8109, 0x790a, 0x6810,
++      0x8001, 0x6812, 0x1118, 0x7810, 0xc0a5, 0x7812, 0x2001, 0xffff,
++      0xa005, 0x00fe, 0x0005, 0x0076, 0x2700, 0x2039, 0x0000, 0xd0fc,
++      0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008,
++      0x2091, 0x8000, 0x080c, 0x1b93, 0x8738, 0xa784, 0x001f, 0x1dd0,
++      0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d90,
++      0x2091, 0x8001, 0x007e, 0x0005, 0x786c, 0x2009, 0x8e74, 0x210c,
++      0xa10d, 0x0118, 0xa065, 0x0804, 0x207a, 0x2061, 0x0000, 0x6018,
++      0xd084, 0x11b8, 0x7810, 0xd08c, 0x0130, 0xc08c, 0x7812, 0xc7fc,
++      0x2069, 0x4640, 0x0028, 0xc08d, 0x7812, 0x2069, 0x4680, 0xc7fd,
++      0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091, 0x8001, 0xa005,
++      0x1108, 0x0005, 0xa08c, 0xfff0, 0x0110, 0x080c, 0x254c, 0x0002,
++      0x1cb8, 0x1cbb, 0x1cc1, 0x1cc5, 0x1cb9, 0x1cc9, 0x1cb9, 0x1cb9,
++      0x1cb9, 0x1ccf, 0x1cfb, 0x1cfe, 0x1d03, 0x1d0c, 0x1cb9, 0x1cb9,
++      0x0005, 0x080c, 0x254c, 0x080c, 0x1c5b, 0x2001, 0x8001, 0x0804,
++      0x1d15, 0x2001, 0x8003, 0x0804, 0x1d15, 0x2001, 0x8004, 0x0804,
++      0x1d15, 0x080c, 0x1c5b, 0x2001, 0x8006, 0x0804, 0x1d15, 0x2091,
++      0x8000, 0x0076, 0xd7fc, 0x1128, 0x2069, 0x4640, 0x2039, 0x0009,
++      0x0020, 0x2069, 0x4680, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000,
++      0x0128, 0x000e, 0x6f1e, 0x2091, 0x8001, 0x0005, 0x6870, 0x007e,
++      0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010,
++      0x080c, 0x1b93, 0x8738, 0xa784, 0x001f, 0x1dd0, 0x2091, 0x8001,
++      0x2001, 0x800a, 0x00d0, 0x2001, 0x800c, 0x00b8, 0x080c, 0x1c5b,
++      0x2001, 0x800d, 0x0090, 0xd7fc, 0x0110, 0x78e4, 0x0008, 0x78e0,
++      0x70c6, 0x2001, 0x800e, 0x0048, 0xd7fc, 0x0110, 0x78ec, 0x0008,
++      0x78e8, 0x70c6, 0x2001, 0x800f, 0x0000, 0x70c2, 0xd7fc, 0x1118,
++      0x70db, 0x0000, 0x0010, 0x70db, 0x0001, 0x2061, 0x0000, 0x601b,
++      0x0001, 0x2091, 0x4080, 0x0005, 0xac80, 0x0001, 0x81ff, 0x0518,
++      0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x07ff, 0x0100, 0x7018,
++      0x0006, 0x701c, 0x0006, 0x7020, 0x0006, 0x7024, 0x0006, 0x7112,
++      0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007,
++      0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, 0x0002, 0xa08c, 0x01e0,
++      0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004, 0x000e,
++      0x7026, 0x000e, 0x7022, 0x000e, 0x701e, 0x000e, 0x701a, 0x0005,
++      0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x681f, 0x0201,
++      0x6803, 0xfd20, 0x6807, 0x0038, 0x6a1a, 0x2d00, 0xa0e8, 0x0008,
++      0xa290, 0x0004, 0x8109, 0x1d80, 0x0005, 0x70ec, 0xd0dc, 0x1520,
++      0x2029, 0x0001, 0x7814, 0xd0cc, 0x1160, 0x70ec, 0xd0e4, 0x2019,
++      0x0c0a, 0x2021, 0x000a, 0x1120, 0x2019, 0x0c0c, 0x2021, 0x000c,
++      0x0070, 0x70ec, 0xd0e4, 0x1128, 0x2019, 0x180c, 0x2021, 0x000c,
++      0x0030, 0x2019, 0x1809, 0x2021, 0x0009, 0xa5ad, 0x0200, 0x6b0a,
++      0x6c0e, 0x6d1e, 0x6807, 0x0038, 0x0005, 0x6004, 0x6086, 0x2c08,
++      0x2063, 0x0000, 0x7868, 0xa005, 0x796a, 0x0110, 0x2c02, 0x0008,
++      0x796e, 0x0005, 0x00c6, 0x2061, 0x4600, 0x6887, 0x0103, 0x2d08,
++      0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008,
++      0x616e, 0x00ce, 0x0005, 0x2091, 0x8000, 0x2c04, 0x786e, 0xa005,
++      0x1108, 0x786a, 0x2091, 0x8001, 0x609c, 0xa005, 0x0188, 0x00c6,
++      0x2060, 0x2008, 0x609c, 0xa005, 0x0138, 0x2062, 0x609f, 0x0000,
++      0xa065, 0x609c, 0xa005, 0x1dc8, 0x7848, 0x794a, 0x2062, 0x00ce,
++      0x7848, 0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x1110, 0x080c,
++      0x254c, 0x784a, 0x0005, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086,
++      0x818e, 0x1208, 0xa200, 0x1f04, 0x1ddf, 0x8086, 0x818e, 0x0005,
++      0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213,
++      0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x1def, 0x0028, 0xa11a,
++      0x2308, 0x8210, 0x1f04, 0x1def, 0x0006, 0x3200, 0xa084, 0xefff,
++      0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, 0x1000,
++      0x0cb8, 0x7d74, 0x70d0, 0xa506, 0x0904, 0x1ebd, 0x7810, 0x2050,
++      0x080c, 0x1b58, 0x0904, 0x1ebd, 0xa046, 0x7970, 0x2500, 0x8000,
++      0xa112, 0x2009, 0x0040, 0x1208, 0x0030, 0x72d0, 0xa206, 0x0118,
++      0x8840, 0x2009, 0x0080, 0x00c6, 0x7112, 0x7007, 0x0001, 0x2099,
++      0x0030, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000,
++      0x88ff, 0x0110, 0x080c, 0x1b58, 0x7008, 0xd0fc, 0x0de8, 0x7007,
++      0x0002, 0x2091, 0x8001, 0xa08c, 0x01e0, 0x1538, 0x53a5, 0x8cff,
++      0x1120, 0x88ff, 0x0904, 0x1eaa, 0x0050, 0x2c00, 0x788e, 0x20a9,
++      0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5, 0x0804, 0x1eaa, 0xa046,
++      0x7218, 0x731c, 0xdac4, 0x0110, 0x7420, 0x7524, 0xa292, 0x0040,
++      0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e,
++      0xdac4, 0x0118, 0x7422, 0x7526, 0xa006, 0x7007, 0x0004, 0x0904,
++      0x1eaa, 0x8cff, 0x0110, 0x080c, 0x1b60, 0x00ce, 0x080c, 0x1b60,
++      0xa046, 0x7888, 0x8000, 0x788a, 0xa086, 0x0002, 0x01c0, 0x7a7c,
++      0x7b78, 0xdac4, 0x0110, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004,
++      0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
++      0x721a, 0x731e, 0xdac4, 0x0588, 0x7422, 0x7526, 0x0470, 0x6014,
++      0xd0fc, 0x1118, 0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x2091,
++      0x8000, 0x681f, 0x0002, 0x88ff, 0x0120, 0xa046, 0x788c, 0x2060,
++      0x0c70, 0x788b, 0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091,
++      0x8001, 0x0098, 0x00ce, 0x788b, 0x0000, 0x080c, 0x2035, 0x6004,
++      0xa084, 0x000f, 0x0059, 0x88ff, 0x0130, 0x788c, 0x2060, 0x6004,
++      0xa084, 0x000f, 0x0019, 0x0804, 0x1e09, 0x0005, 0x0002, 0x1ecf,
++      0x1eea, 0x1f03, 0x1ecf, 0x1f10, 0x1ee0, 0x1ecf, 0x1ecf, 0x1ecf,
++      0x1ee8, 0x1f01, 0x1ecf, 0x1ecf, 0x1ecf, 0x1ecf, 0x1ecf, 0x2039,
++      0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705, 0x600a, 0x080c,
++      0x1f4c, 0x609c, 0x78ba, 0x609f, 0x0000, 0x080c, 0x2021, 0x0005,
++      0x78bc, 0xd0c4, 0x0108, 0x0c58, 0x601c, 0xc0bd, 0x601e, 0x0030,
++      0x080c, 0x205f, 0x78bc, 0xd0c4, 0x0108, 0x0c08, 0x78bf, 0x0000,
++      0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0138, 0x080c,
++      0x1f4c, 0x0120, 0x78bc, 0xc0c5, 0x78be, 0x0010, 0x0804, 0x1f67,
++      0x0005, 0x080c, 0x205c, 0x78bc, 0xa08c, 0x0e00, 0x1110, 0xd0c4,
++      0x1108, 0x0828, 0x080c, 0x1f4c, 0x1110, 0x0804, 0x1f67, 0x0005,
++      0x78bc, 0xd0c4, 0x0110, 0x0804, 0x1ecf, 0x78bf, 0x0000, 0x6714,
++      0x2011, 0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0188,
++      0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc,
++      0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108,
++      0x00c0, 0x080c, 0x1b7b, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000,
++      0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010,
++      0x2091, 0x8001, 0x1f04, 0x1f34, 0x8211, 0x0118, 0x20a9, 0x0100,
++      0x0c58, 0x080c, 0x1b60, 0x0005, 0x609f, 0x0000, 0x78b4, 0xa06d,
++      0x2c00, 0x78b6, 0x1110, 0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002,
++      0x78b8, 0xad06, 0x1108, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x1130,
++      0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6,
++      0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2, 0x601c, 0x60a2,
++      0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060, 0x0110, 0x080c,
++      0x3fc1, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x4680,
++      0xd7fc, 0x1110, 0x2071, 0x4640, 0xa784, 0x0f00, 0x800b, 0xa784,
++      0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x71c0,
++      0xa168, 0x2700, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003,
++      0x71c4, 0xa100, 0x60c2, 0x2091, 0x8000, 0x7814, 0xd0c4, 0x0138,
++      0xd7fc, 0x1118, 0xd0f4, 0x1140, 0x0010, 0xd0fc, 0x1128, 0x6e08,
++      0xd684, 0x01f0, 0xd9fc, 0x11e0, 0x2091, 0x8001, 0x080c, 0x1be3,
++      0x2091, 0x8000, 0x080c, 0x1d95, 0x2091, 0x8001, 0x7814, 0xd0c4,
++      0x0904, 0x201f, 0xd7fc, 0x1120, 0xd0f4, 0x1130, 0x0804, 0x201f,
++      0xd0fc, 0x1110, 0x0804, 0x201f, 0x601b, 0x0021, 0x0804, 0x201f,
++      0x6024, 0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x6a10, 0x6814,
++      0xa202, 0x0268, 0x0160, 0x2091, 0x8001, 0x2039, 0x0200, 0x609c,
++      0x78ba, 0x609f, 0x0000, 0x080c, 0x2021, 0x0804, 0x201f, 0x2c08,
++      0xd9fc, 0x01f0, 0x6800, 0xa065, 0x01d8, 0x6a04, 0x7000, 0xa084,
++      0x0002, 0x0168, 0x7048, 0xa206, 0x1150, 0x6b04, 0x2160, 0x2304,
++      0x6002, 0xa005, 0x1108, 0x6902, 0x2260, 0x6102, 0x0098, 0x2d00,
++      0x2060, 0x080c, 0x2693, 0x6e08, 0x2160, 0x6202, 0x6906, 0x0050,
++      0x6800, 0x6902, 0xa065, 0x0110, 0x6102, 0x0008, 0x6906, 0x2160,
++      0x6003, 0x0000, 0x2160, 0xd9fc, 0x0118, 0xa6b4, 0xfffc, 0x6e0a,
++      0x6810, 0x7d08, 0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001,
++      0xd6b4, 0x0128, 0xa6b6, 0x0040, 0x6e0a, 0x080c, 0x1bf4, 0x00ee,
++      0x0005, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x080c, 0x1d95,
++      0x2091, 0x8001, 0x78b8, 0xa065, 0x0128, 0x609c, 0x78ba, 0x609f,
++      0x0000, 0x0c78, 0x78b6, 0x78ba, 0x0005, 0x7970, 0x7874, 0x2818,
++      0xd384, 0x0118, 0x8000, 0xa112, 0x0220, 0x8000, 0xa112, 0x1278,
++      0xc384, 0x7a7c, 0x721a, 0x7a78, 0x721e, 0xdac4, 0x0120, 0x7a84,
++      0x7222, 0x7a80, 0x7226, 0xa006, 0xd384, 0x0108, 0x8000, 0x7876,
++      0x70d2, 0x781c, 0xa005, 0x0138, 0x8001, 0x781e, 0x1120, 0x0e04,
++      0x205b, 0x2091, 0x4080, 0x0005, 0x2039, 0x2071, 0x0010, 0x2039,
++      0x2077, 0x2704, 0xa005, 0x0160, 0xac00, 0x2068, 0x6908, 0x6810,
++      0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e, 0x8738, 0x0c88,
++      0x0005, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015,
++      0x001b, 0x0000, 0x2041, 0x0000, 0x780c, 0x0002, 0x2223, 0x21fe,
++      0x2082, 0x20f2, 0x2039, 0x8e74, 0x2734, 0x7d10, 0x00c0, 0x6084,
++      0xa086, 0x0103, 0x1904, 0x20dc, 0x6114, 0x6018, 0xa105, 0x0120,
++      0x86ff, 0x11d8, 0x0804, 0x20dc, 0x8603, 0xa080, 0x8e55, 0x620c,
++      0x2202, 0x8000, 0x6210, 0x2202, 0x080c, 0x1db3, 0x8630, 0xa68e,
++      0x000f, 0x0904, 0x215d, 0x786c, 0xa065, 0x1d08, 0x7808, 0xa602,
++      0x1220, 0xd5ac, 0x1110, 0x263a, 0x0005, 0xa682, 0x0003, 0x1a04,
++      0x215d, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x11f8,
++      0x2011, 0x8e55, 0x2204, 0x70c6, 0x8210, 0x2204, 0x70ca, 0xd684,
++      0x1130, 0x8210, 0x2204, 0x70da, 0x8210, 0x2204, 0x70de, 0xa685,
++      0x8020, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084,
++      0xffcf, 0x7812, 0x2091, 0x8001, 0x203b, 0x0000, 0x0005, 0x7810,
++      0xc0ad, 0x7812, 0x0804, 0x215d, 0x263a, 0x080c, 0x2229, 0x1904,
++      0x2245, 0x786c, 0xa065, 0x1904, 0x2087, 0x2091, 0x8000, 0x7810,
++      0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812, 0x2091, 0x8001,
++      0x0804, 0x2245, 0x2039, 0x8e74, 0x2734, 0x7d10, 0x00a0, 0x6084,
++      0xa086, 0x0103, 0x1904, 0x2147, 0x6114, 0x6018, 0xa105, 0x0120,
++      0x86ff, 0x11b8, 0x0804, 0x2147, 0xa680, 0x8e55, 0x620c, 0x2202,
++      0x080c, 0x1db3, 0x8630, 0xa68e, 0x001e, 0x0904, 0x215d, 0x786c,
++      0xa065, 0x1d28, 0x7808, 0xa602, 0x1220, 0xd5ac, 0x1110, 0x263a,
++      0x0005, 0xa682, 0x0006, 0x1a04, 0x215d, 0x2091, 0x8000, 0x2069,
++      0x0000, 0x6818, 0xd084, 0x11f8, 0x2011, 0x8e55, 0x2009, 0x8e4e,
++      0x26a8, 0x211c, 0x2204, 0x201a, 0x8108, 0x8210, 0x1f04, 0x2129,
++      0xa685, 0x8030, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810,
++      0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, 0xa006, 0x2009, 0x8e75,
++      0x200a, 0x203a, 0x0005, 0x7810, 0xc0ad, 0x7812, 0x00b0, 0x263a,
++      0x080c, 0x2229, 0x1904, 0x2245, 0x786c, 0xa065, 0x1904, 0x20f7,
++      0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad,
++      0x7812, 0x2091, 0x8001, 0x0804, 0x2245, 0x2091, 0x8000, 0x7007,
++      0x0004, 0x7994, 0x70d4, 0xa102, 0x0228, 0x0168, 0x7b90, 0xa302,
++      0x1150, 0x0010, 0x8002, 0x1138, 0x263a, 0x7810, 0xc0ad, 0x7812,
++      0x2091, 0x8001, 0x0005, 0xa184, 0xff00, 0x0140, 0x810f, 0x810c,
++      0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107, 0x8004,
++      0x8004, 0x7a9c, 0xa210, 0x721a, 0x7a98, 0xa006, 0xa211, 0x721e,
++      0xd4c4, 0x0130, 0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226,
++      0x20a1, 0x0030, 0x7003, 0x0000, 0x2009, 0x8e54, 0x260a, 0x8109,
++      0x2198, 0x2104, 0xd084, 0x0108, 0x8633, 0xa6b0, 0x0002, 0x26a8,
++      0x53a6, 0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000,
++      0xa10a, 0x1208, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0140,
++      0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018,
++      0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211,
++      0xd4c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, 0xd0fc,
++      0x0de8, 0xa084, 0x01e0, 0x01d0, 0x7d10, 0x2031, 0x8e54, 0x2634,
++      0x78a8, 0x8000, 0x78aa, 0xd08c, 0x1138, 0x7007, 0x0006, 0x7004,
++      0xd094, 0x1de8, 0x0804, 0x215f, 0x2069, 0x4647, 0x206b, 0x0003,
++      0x78ac, 0xa085, 0x0300, 0x78ae, 0xa006, 0x0048, 0x2030, 0x75d6,
++      0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091,
++      0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a,
++      0x721e, 0xd5c4, 0x0110, 0x7322, 0x7426, 0x0005, 0x6084, 0xa086,
++      0x0103, 0x11d8, 0x6114, 0x6018, 0xa105, 0x11b8, 0x2069, 0x0000,
++      0x6818, 0xd084, 0x1190, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3,
++      0x8020, 0x681b, 0x0001, 0x2091, 0x4080, 0x080c, 0x1db3, 0x0e04,
++      0x221c, 0x786c, 0xa065, 0x1d10, 0x0005, 0x0059, 0x1530, 0x786c,
++      0xa065, 0x19e0, 0x0410, 0x0029, 0x1500, 0x786c, 0xa065, 0x1dd8,
++      0x00e0, 0x6084, 0xa086, 0x0103, 0x1168, 0x6018, 0xc0fc, 0x601a,
++      0xa086, 0x0004, 0x1138, 0x7804, 0xd0a4, 0x0120, 0x080c, 0x1db3,
++      0xa006, 0x0005, 0x0079, 0x1118, 0xa085, 0x0001, 0x0005, 0x00b9,
++      0x1110, 0x2041, 0x0001, 0x7d10, 0x0005, 0x88ff, 0x0110, 0x2091,
++      0x4080, 0x0005, 0x7b90, 0x7994, 0x70d4, 0xa102, 0x1118, 0xa385,
++      0x0000, 0x0005, 0x0210, 0xa302, 0x0005, 0x8002, 0x0005, 0xa184,
++      0xff00, 0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007,
++      0xa100, 0x0018, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4,
++      0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018,
++      0x6028, 0xa005, 0x0110, 0x2009, 0x0040, 0x080c, 0x1b15, 0x01d0,
++      0x78a8, 0x8000, 0x78aa, 0xd08c, 0x1510, 0x6014, 0xd0fc, 0x1118,
++      0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x2091, 0x8000, 0x681f,
++      0x0003, 0x78ab, 0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091,
++      0x8001, 0x0068, 0x78ab, 0x0000, 0x080c, 0x1db3, 0x7990, 0x7894,
++      0x8000, 0xa10a, 0x1208, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071,
++      0x0010, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, 0x2009, 0x4658,
++      0x0010, 0x2009, 0x4698, 0x2091, 0x8000, 0x200a, 0x00f6, 0x2009,
++      0x4680, 0x2079, 0x0100, 0xd7fc, 0x1120, 0x2009, 0x4640, 0x2079,
++      0x0200, 0x2104, 0xa086, 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009,
++      0x4645, 0x0010, 0x2009, 0x4685, 0x2104, 0xa005, 0x1130, 0x7830,
++      0xa084, 0x00c0, 0x1110, 0x781b, 0x0052, 0x00fe, 0x0005, 0x2009,
++      0x0002, 0x2069, 0x4600, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
++      0x2324, 0x2071, 0x4680, 0x2079, 0x0100, 0x2021, 0x48bf, 0x784b,
++      0x000f, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118, 0x2019, 0x3e0f,
++      0x0030, 0x20a1, 0x012b, 0x2019, 0x3e0f, 0xd184, 0x0110, 0x20a1,
++      0x022b, 0x2304, 0xa005, 0x0140, 0x789a, 0x8318, 0x23ac, 0x8318,
++      0x2398, 0x53a6, 0x3318, 0x0ca8, 0x789b, 0x0000, 0x789b, 0x0020,
++      0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x2020, 0x1f04, 0x2302,
++      0x7003, 0x0000, 0x0016, 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd,
++      0x080c, 0x2443, 0x001e, 0x7020, 0xa084, 0x000f, 0xa085, 0x6300,
++      0x7806, 0x780f, 0x9000, 0x7843, 0x00d8, 0x7853, 0x0090, 0x780b,
++      0x2f08, 0x7452, 0x704f, 0x0000, 0x8109, 0x0140, 0x2071, 0x4640,
++      0x2079, 0x0200, 0x2021, 0x46bf, 0x0804, 0x22df, 0x080c, 0x24fd,
++      0x0005, 0x0016, 0x2011, 0x0101, 0xd1bc, 0x1110, 0x2011, 0x0201,
++      0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x001e,
++      0x080c, 0x2443, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, 0x2011,
++      0x0201, 0x20a9, 0x0009, 0x810b, 0x1f04, 0x234b, 0xa18c, 0x0e00,
++      0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x0005, 0x2019, 0x0002,
++      0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x1f04, 0x235c, 0xa294,
++      0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0118,
++      0x2009, 0x0201, 0x0c78, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110,
++      0x2011, 0x0201, 0x20a9, 0x000c, 0x810b, 0x1f04, 0x2374, 0xa18c,
++      0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x0005, 0x2011,
++      0x0102, 0xd3fc, 0x1110, 0x2011, 0x0202, 0x2204, 0xa084, 0xf0cf,
++      0xa105, 0x2012, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc, 0x1110,
++      0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a,
++      0x62ac, 0x63ac, 0x00ce, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc,
++      0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022,
++      0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x00ce, 0x0005, 0x00c6,
++      0x2061, 0x0100, 0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103,
++      0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0xa28c, 0x0020, 0x0118,
++      0xc2ac, 0xa39d, 0x4000, 0xc3ec, 0xd3b4, 0x1108, 0xc3ed, 0x62ae,
++      0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, 0x0005, 0x2091, 0x8000,
++      0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, 0x2427, 0xd1fc, 0x0118,
++      0x2061, 0x8dd0, 0x0010, 0x2061, 0x8cc0, 0x080c, 0x242f, 0x0560,
++      0x20a9, 0x0101, 0xd1fc, 0x0118, 0x2061, 0x8cd0, 0x0010, 0x2061,
++      0x8bc0, 0x00c6, 0x080c, 0x242f, 0x0128, 0x00ce, 0x8c60, 0x1f04,
++      0x23e9, 0x04a8, 0x000e, 0xd1fc, 0x0128, 0xa082, 0x8cd0, 0x2071,
++      0x4680, 0x0020, 0xa082, 0x8bc0, 0x2071, 0x4640, 0x7076, 0x7172,
++      0x2138, 0x2001, 0x0004, 0x7062, 0x707f, 0x000f, 0x71d0, 0xc1c4,
++      0x71d2, 0x080c, 0x22a4, 0x00c0, 0xd1fc, 0x1118, 0x2071, 0x4640,
++      0x0010, 0x2071, 0x4680, 0x6020, 0xc0dd, 0x6022, 0x7172, 0x2138,
++      0x2c00, 0x707a, 0x2001, 0x0006, 0x7062, 0x707f, 0x000f, 0x71d0,
++      0xc1c4, 0x71d2, 0x080c, 0x22a4, 0x2001, 0x0000, 0x0010, 0x2001,
++      0x0001, 0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, 0x0005, 0x2c04,
++      0xa005, 0x0170, 0x2060, 0x6010, 0xa306, 0x1140, 0x600c, 0xa206,
++      0x1128, 0x6014, 0xa106, 0x1110, 0xa006, 0x0020, 0x6000, 0x0c80,
++      0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x2079, 0x4680,
++      0x2071, 0x0100, 0xd1bc, 0x1120, 0x2079, 0x4640, 0x2071, 0x0200,
++      0x7920, 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x1110, 0x001e, 0x0060,
++      0x810b, 0x810b, 0x810b, 0x810b, 0x000e, 0xa18d, 0x0800, 0xd0bc,
++      0x1110, 0xa18d, 0x0f00, 0x2104, 0x00ee, 0x00fe, 0x0005, 0x2001,
++      0x4601, 0x2004, 0xd0ac, 0x1138, 0x68e4, 0xd0ac, 0x0120, 0xa084,
++      0x0006, 0x1108, 0x0009, 0x0005, 0x6014, 0x00e6, 0x0036, 0x2018,
++      0x2071, 0x4b40, 0xd0fc, 0x1110, 0x2071, 0x4ac0, 0x8007, 0xa084,
++      0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, 0xa084, 0x000a,
++      0x1904, 0x24fa, 0x7108, 0xa194, 0xff00, 0x0904, 0x24fa, 0xa18c,
++      0x00ff, 0x701c, 0xa084, 0xff00, 0x01c0, 0x7004, 0xa085, 0x003a,
++      0x7006, 0x2001, 0x0009, 0xa102, 0x16d8, 0x2001, 0x000a, 0xa102,
++      0x16d0, 0x2001, 0x000c, 0xa102, 0x16c8, 0x701c, 0xa084, 0x00ff,
++      0x701e, 0x7004, 0xa084, 0xffdf, 0x7006, 0x2001, 0x000a, 0xa106,
++      0x01a8, 0x2001, 0x000c, 0xa106, 0x01a0, 0x2001, 0x0012, 0xa106,
++      0x0198, 0x2001, 0x0014, 0xa106, 0x0190, 0x2001, 0x0019, 0xa106,
++      0x0188, 0x2001, 0x0032, 0xa106, 0x0180, 0x00d8, 0x2009, 0x000c,
++      0x00d0, 0x2009, 0x0012, 0x00b8, 0x2009, 0x0014, 0x00a0, 0x2009,
++      0x0019, 0x0088, 0x2009, 0x0020, 0x0070, 0x2009, 0x003f, 0x0058,
++      0x2009, 0x000a, 0x0040, 0x2009, 0x000c, 0x0028, 0x2009, 0x0019,
++      0x0010, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x7004, 0xa085,
++      0x000a, 0x7006, 0x2071, 0x4600, 0x7004, 0xd0bc, 0x0158, 0xd3fc,
++      0x1120, 0x73ea, 0x2071, 0x4640, 0x0018, 0x73ee, 0x2071, 0x4680,
++      0x701f, 0x000d, 0x003e, 0x00ee, 0x0005, 0x2001, 0x01ff, 0x2004,
++      0xd0fc, 0x11d0, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x12a0,
++      0x2071, 0x0200, 0x71ec, 0xa18c, 0x1c00, 0x810f, 0x810c, 0x810c,
++      0x2079, 0x0100, 0x78ec, 0xa084, 0x1c00, 0x8007, 0x8004, 0x8004,
++      0xa105, 0xa08a, 0x0007, 0x0208, 0x0005, 0x0002, 0x254b, 0x2532,
++      0x254b, 0x2532, 0x2525, 0x253f, 0x2525, 0x7008, 0xa084, 0xc3ff,
++      0xa085, 0x3000, 0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085, 0x3000,
++      0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x700a,
++      0x7808, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x780a, 0x0005, 0x7008,
++      0xa084, 0xc3ff, 0xa085, 0x0c00, 0x700a, 0x7808, 0xa084, 0xc3ff,
++      0xa085, 0x0c00, 0x780a, 0x0005, 0x0e04, 0x254c, 0x2091, 0x8000,
++      0x2071, 0x0000, 0x0006, 0x7018, 0xd084, 0x1de8, 0x000e, 0x2071,
++      0x0010, 0x70ca, 0x000e, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x0a04,
++      0x70df, 0x0020, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
++      0x0cf8, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708a, 0x758e,
++      0x7492, 0x7696, 0x779a, 0xa594, 0x003f, 0xd4f4, 0x0138, 0xd7bc,
++      0x1128, 0xa784, 0x007d, 0x1904, 0x3c74, 0x0871, 0xa49c, 0x000f,
++      0xa382, 0x0004, 0x0320, 0xa3a6, 0x0007, 0x1930, 0x2418, 0x8507,
++      0xa084, 0x000f, 0x0002, 0x2b49, 0x2c34, 0x2c72, 0x2ed8, 0x3256,
++      0x32ad, 0x3353, 0x33e2, 0x34b6, 0x3588, 0x259e, 0x259b, 0x2970,
++      0x2a56, 0x322a, 0x259b, 0x080c, 0x254c, 0x0005, 0xa006, 0x0038,
++      0x7808, 0xc08d, 0x780a, 0xa006, 0x7002, 0x704a, 0x7042, 0x70ce,
++      0x705c, 0xa005, 0x1904, 0x26ec, 0x7060, 0xa084, 0x0007, 0x0002,
++      0x25b8, 0x2626, 0x262e, 0x2637, 0x2640, 0x26d2, 0x2649, 0x2626,
++      0x7830, 0xd0bc, 0x1d10, 0x71d0, 0xd1bc, 0x19f8, 0xd1b4, 0x1904,
++      0x2603, 0x70a0, 0xa086, 0x0001, 0x09c0, 0x70b0, 0xa06d, 0x6800,
++      0xa065, 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa, 0x6808, 0xa045,
++      0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0118, 0x69bc,
++      0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0010, 0x0804,
++      0x281f, 0x705c, 0xa005, 0x1904, 0x259d, 0x00c6, 0x00d6, 0x70b0,
++      0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa,
++      0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001,
++      0x0118, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001,
++      0x0020, 0x0804, 0x281f, 0x080c, 0x3c33, 0x1904, 0x259d, 0x781b,
++      0x0068, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
++      0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, 0x68bc, 0x703e,
++      0xc1b4, 0x71d2, 0x70b4, 0xa065, 0x68c0, 0x7056, 0x7003, 0x0002,
++      0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005, 0x080c, 0x3c33,
++      0x1120, 0x781b, 0x0054, 0x7003, 0x0004, 0x0005, 0x080c, 0x3c33,
++      0x1128, 0x2011, 0x000c, 0x0419, 0x7003, 0x0004, 0x0005, 0x080c,
++      0x3c33, 0x1128, 0x2011, 0x0006, 0x00d1, 0x7003, 0x0004, 0x0005,
++      0x080c, 0x3c33, 0x1128, 0x2011, 0x000d, 0x0089, 0x7003, 0x0004,
++      0x0005, 0x080c, 0x3c33, 0x1150, 0x2011, 0x0006, 0x0041, 0x7078,
++      0x707b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0004, 0x0005, 0x7170,
++      0xc1fc, 0x8107, 0x7882, 0x789b, 0x0080, 0xa286, 0x000c, 0x1120,
++      0x7aaa, 0x2001, 0x0001, 0x0098, 0xa18c, 0x001f, 0xa18d, 0x00c0,
++      0x79aa, 0xa286, 0x000d, 0x0120, 0x7aaa, 0x2001, 0x0002, 0x0038,
++      0x78ab, 0x0020, 0x7174, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b,
++      0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x0113, 0x080c, 0x3c46,
++      0x707f, 0x000f, 0x70d0, 0xd0b4, 0x0168, 0xc0b4, 0x70d2, 0x00c6,
++      0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001,
++      0x601a, 0x00ce, 0x0005, 0x7014, 0xa005, 0x1138, 0x70d0, 0xd0b4,
++      0x0128, 0x70b4, 0xac06, 0x1110, 0x0c29, 0x0005, 0x0016, 0x71a0,
++      0xa186, 0x0001, 0x0528, 0x00d6, 0x0026, 0x2100, 0x2011, 0x0001,
++      0xa212, 0x70b0, 0x2068, 0x6800, 0xac06, 0x0120, 0x8211, 0x01b0,
++      0x00c9, 0x0cc8, 0x00c6, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b0,
++      0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a, 0x8211,
++      0x0110, 0x0041, 0x0cb0, 0x70a3, 0x0001, 0x00ce, 0x002e, 0x00de,
++      0x001e, 0x0005, 0xade8, 0x0005, 0x70a8, 0xad06, 0x1110, 0x70a4,
++      0x2068, 0x0005, 0x080c, 0x3c33, 0x1904, 0x259d, 0x7078, 0x2068,
++      0x7770, 0x080c, 0x3b6f, 0x2c50, 0x080c, 0x3cce, 0x789b, 0x0080,
++      0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001,
++      0x2001, 0x0004, 0x0804, 0x2824, 0x080c, 0x3c33, 0x1904, 0x259d,
++      0x789b, 0x0080, 0x705c, 0x2068, 0x6f14, 0x70d0, 0xd0b4, 0x0168,
++      0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef,
++      0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x080c, 0x3b6f, 0x2c50,
++      0x080c, 0x3cce, 0x6824, 0xa005, 0x0130, 0xa082, 0x0006, 0x0208,
++      0x0010, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa,
++      0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0804, 0x2824,
++      0xc28d, 0x72d2, 0x72bc, 0xa200, 0xa015, 0x7150, 0x8108, 0xa12a,
++      0x0208, 0x71bc, 0x2164, 0x6504, 0x85ff, 0x1170, 0x7152, 0x8421,
++      0x1da8, 0x70d0, 0xd08c, 0x0128, 0x70cc, 0xa005, 0x1110, 0x70cf,
++      0x000a, 0x0005, 0x2200, 0x0c90, 0x70d0, 0xc08c, 0x70d2, 0x70cf,
++      0x0000, 0x6034, 0xa005, 0x1db0, 0x6708, 0xa784, 0x073f, 0x01d0,
++      0xd7d4, 0x1d80, 0xa784, 0x0021, 0x1d68, 0xa784, 0x0002, 0x0130,
++      0xa784, 0x0004, 0x0d38, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218,
++      0x1d08, 0xa784, 0x0100, 0x0130, 0x6018, 0xa005, 0x19d8, 0xa7bc,
++      0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e,
++      0x6318, 0x0128, 0x601c, 0xa302, 0x0220, 0x0118, 0x0858, 0x83ff,
++      0x1948, 0x2d58, 0x2c50, 0x7152, 0xd7bc, 0x1120, 0x7028, 0x6022,
++      0x603a, 0x0010, 0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100,
++      0x2a60, 0x2041, 0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0,
++      0xd1fc, 0x0110, 0xd684, 0x0110, 0xa39c, 0xffbf, 0xd6a4, 0x0110,
++      0xa39d, 0x0020, 0xa684, 0x000e, 0x1904, 0x27d6, 0xc7a5, 0x670a,
++      0x2c00, 0x68c6, 0x77a0, 0xa786, 0x0001, 0x1178, 0x70d0, 0xd0b4,
++      0x1160, 0x7000, 0xa082, 0x0002, 0x1240, 0x7830, 0xd0bc, 0x1128,
++      0x789b, 0x0080, 0x7baa, 0x0804, 0x281d, 0x8739, 0x77a2, 0x2750,
++      0x77ac, 0xa7b0, 0x0005, 0x70a8, 0xa606, 0x1108, 0x76a4, 0x76ae,
++      0x2c3a, 0x8738, 0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738,
++      0x253a, 0x7830, 0xd0bc, 0x0150, 0x2091, 0x8000, 0x2091, 0x303d,
++      0x70d0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000,
++      0x0120, 0x8421, 0x2200, 0x1904, 0x2725, 0x0005, 0xd1dc, 0x0904,
++      0x37ce, 0x2029, 0x0020, 0xd69c, 0x1120, 0x8528, 0xd68c, 0x1108,
++      0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0x70c8,
++      0xa160, 0x2c64, 0x8cff, 0x0188, 0x6014, 0xa706, 0x1dd0, 0x60b8,
++      0x8001, 0x60ba, 0x1d88, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a,
++      0x2200, 0x8421, 0x1904, 0x2725, 0x0005, 0x2a60, 0x610e, 0x69be,
++      0x2c00, 0x68c6, 0x8840, 0x6008, 0xc0d5, 0x600a, 0x77a0, 0xa786,
++      0x0001, 0x1904, 0x27ad, 0x70d0, 0xd0b4, 0x1904, 0x27ad, 0x7000,
++      0xa082, 0x0002, 0x1a04, 0x27ad, 0x7830, 0xd0bc, 0x1904, 0x27ad,
++      0x789b, 0x0080, 0x7baa, 0x7daa, 0x79aa, 0x2001, 0x0002, 0x0006,
++      0x6018, 0x8000, 0x601a, 0x0008, 0x0006, 0x2960, 0x6104, 0x2a60,
++      0x080c, 0x3ce1, 0x1590, 0xa184, 0x0018, 0x0180, 0xa184, 0x0010,
++      0x0118, 0x080c, 0x3977, 0x1548, 0xa184, 0x0008, 0x0138, 0x69a0,
++      0xa184, 0x0600, 0x1118, 0x080c, 0x3895, 0x00f8, 0x69a0, 0xa184,
++      0x1e00, 0x0528, 0xa184, 0x0800, 0x0178, 0x00c6, 0x2960, 0x6000,
++      0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x00ce,
++      0x080c, 0x3977, 0x1150, 0x69a0, 0xa184, 0x0200, 0x0118, 0x080c,
++      0x38da, 0x0018, 0xa184, 0x0400, 0x19f0, 0x69a0, 0xa184, 0x1000,
++      0x0130, 0x6914, 0xa18c, 0xff00, 0x810f, 0x080c, 0x239c, 0x002e,
++      0xa68c, 0x00e0, 0xa684, 0x0060, 0x0128, 0xa086, 0x0060, 0x1110,
++      0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b, 0x0060, 0x2800,
++      0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0168, 0xc0fc, 0x7083,
++      0x0000, 0xa08a, 0x000d, 0x0328, 0xa08a, 0x000c, 0x7182, 0x2001,
++      0x000c, 0x800c, 0x7186, 0x78aa, 0x3518, 0x3340, 0x3428, 0x8000,
++      0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b, 0x0000, 0xad80, 0x000b,
++      0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0, 0xa286, 0x0020, 0x1508,
++      0x70d0, 0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00, 0x70ba, 0x6814,
++      0xc0fc, 0x8007, 0x7882, 0xa286, 0x0002, 0x0904, 0x28f5, 0x70a0,
++      0x8000, 0x70a2, 0x74b0, 0xa498, 0x0005, 0x70a8, 0xa306, 0x1108,
++      0x73a4, 0x73b2, 0xa286, 0x0010, 0x0904, 0x259d, 0x00de, 0x00ce,
++      0x0005, 0x7000, 0xa005, 0x19e0, 0xa286, 0x0002, 0x1904, 0x290c,
++      0x080c, 0x3c33, 0x19a8, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091,
++      0x8000, 0x781b, 0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de,
++      0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a,
++      0x0126, 0x00d6, 0x00c6, 0x70d0, 0xa084, 0x2e00, 0x2090, 0x00ce,
++      0x00de, 0x012e, 0x2900, 0x7056, 0x68bc, 0x703e, 0x7003, 0x0002,
++      0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x7830, 0xd0bc, 0x0140,
++      0x2091, 0x303d, 0x70d0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090,
++      0x70a0, 0xa005, 0x1108, 0x0005, 0x8421, 0x0de8, 0x724c, 0x70bc,
++      0xa200, 0xa015, 0x0804, 0x2725, 0xa286, 0x0010, 0x1560, 0x080c,
++      0x3c33, 0x1904, 0x28a0, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x781b,
++      0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
++      0x78da, 0x7808, 0xc08d, 0x780a, 0x70a0, 0x8000, 0x70a2, 0x74b0,
++      0xa490, 0x0005, 0x70a8, 0xa206, 0x1108, 0x72a4, 0x72b2, 0x2900,
++      0x7056, 0x68bc, 0x703e, 0x7003, 0x0002, 0x2d00, 0x704a, 0xad80,
++      0x0009, 0x7042, 0x0005, 0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814,
++      0xc0fc, 0x8007, 0x7882, 0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2,
++      0x7eda, 0x781b, 0x0068, 0x2900, 0x7056, 0x7202, 0x7808, 0xc08d,
++      0x780a, 0x2300, 0xa605, 0x0170, 0x70d0, 0xa084, 0x2e00, 0xa086,
++      0x2600, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009, 0x0001, 0xa284,
++      0x000f, 0x0023, 0xad80, 0x0009, 0x7042, 0x0005, 0x296e, 0x41d9,
++      0x41d9, 0x41c7, 0x41d9, 0x296e, 0x296e, 0x296e, 0x080c, 0x254c,
++      0x7808, 0xa084, 0xfffd, 0x780a, 0x00f6, 0x2079, 0x4600, 0x78ac,
++      0x00fe, 0xd084, 0x01b0, 0x7060, 0xa086, 0x0001, 0x0904, 0x2a32,
++      0x7060, 0xa086, 0x0005, 0x1158, 0x7078, 0x2068, 0x681b, 0x0004,
++      0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7063,
++      0x0000, 0x70a3, 0x0000, 0x70a4, 0x70ae, 0x70b2, 0x080c, 0x2682,
++      0x0156, 0x2011, 0x0004, 0x7160, 0xa186, 0x0001, 0x0160, 0xa186,
++      0x0007, 0x1118, 0x701f, 0x0005, 0x0030, 0x701f, 0x0001, 0x70d0,
++      0xc0c5, 0x70d2, 0x0000, 0x2001, 0x460a, 0x2004, 0xa084, 0x00ff,
++      0xa086, 0x0018, 0x0130, 0x7018, 0x7016, 0xa005, 0x1110, 0x70a3,
++      0x0001, 0x0066, 0x080c, 0x3f26, 0x20a9, 0x0010, 0x2039, 0x0000,
++      0x080c, 0x3a66, 0xa7b8, 0x0100, 0x1f04, 0x29c0, 0x006e, 0x7000,
++      0x0002, 0x29fd, 0x29db, 0x29db, 0x29d3, 0x29fd, 0x29fd, 0x29fd,
++      0x29d1, 0x080c, 0x254c, 0x705c, 0xa005, 0x0538, 0xad06, 0x1118,
++      0x6800, 0x705e, 0x0080, 0x6820, 0xd084, 0x1148, 0x6f14, 0x080c,
++      0x3b6f, 0x6008, 0xc0d4, 0x600a, 0x080c, 0x37a4, 0x0020, 0x7058,
++      0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc,
++      0x0108, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820, 0xa084,
++      0x00ff, 0xc09d, 0x6822, 0x080c, 0x1da2, 0x2011, 0x0004, 0x74c8,
++      0xa4a0, 0x0100, 0x04b1, 0xaea0, 0x0017, 0x0499, 0x20a9, 0x0101,
++      0x74c8, 0x0479, 0x8420, 0x1f04, 0x2a09, 0x70c0, 0x2060, 0x2021,
++      0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0198, 0x6018, 0x0016,
++      0x0006, 0x2011, 0x4602, 0x220c, 0xa102, 0x2012, 0x000e, 0x001e,
++      0xa102, 0x0338, 0x6012, 0x1128, 0x2011, 0x4604, 0x2204, 0xc0a5,
++      0x2012, 0x601b, 0x0000, 0xace0, 0x0010, 0x1f04, 0x2a13, 0x8421,
++      0x1d00, 0x015e, 0x7063, 0x0000, 0x7003, 0x0000, 0x704b, 0x0000,
++      0x0005, 0x0046, 0x2404, 0xa005, 0x01a8, 0x2068, 0x6800, 0x0006,
++      0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00,
++      0x681e, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1da2,
++      0x000e, 0x0c48, 0x004e, 0x2023, 0x0000, 0x0005, 0xa282, 0x0003,
++      0x0310, 0x080c, 0x254c, 0x2300, 0x0002, 0x2a60, 0x2add, 0x2af7,
++      0xa282, 0x0002, 0x0110, 0x080c, 0x254c, 0x7060, 0x7063, 0x0000,
++      0x707f, 0x0000, 0x0022, 0x77d0, 0xc7c5, 0x77d2, 0x0002, 0x2a77,
++      0x2a77, 0x2a79, 0x2ab1, 0x37d8, 0x2a77, 0x2ab1, 0x2a77, 0x080c,
++      0x254c, 0x7770, 0x080c, 0x3a66, 0x7770, 0xa7bc, 0x8f00, 0x080c,
++      0x3b6f, 0x6018, 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0x8cc0,
++      0x0010, 0x2021, 0x8dd0, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c,
++      0x2b11, 0x01b8, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021,
++      0x8bc0, 0x0010, 0x2021, 0x8cd0, 0x0046, 0x2009, 0x0005, 0x2011,
++      0x0010, 0x080c, 0x2b11, 0x004e, 0x0118, 0x8420, 0x1f04, 0x2a9c,
++      0x015e, 0x8738, 0xa784, 0x001f, 0x1990, 0x0804, 0x25a0, 0x0804,
++      0x25a0, 0x7770, 0x080c, 0x3b6f, 0x6018, 0xa005, 0x0520, 0xd7fc,
++      0x1118, 0x2021, 0x8cc0, 0x0010, 0x2021, 0x8dd0, 0x2009, 0x0005,
++      0x2011, 0x0020, 0x080c, 0x2b11, 0x01b0, 0x0156, 0x20a9, 0x0101,
++      0xd7fc, 0x1118, 0x2021, 0x8bc0, 0x0010, 0x2021, 0x8cd0, 0x0046,
++      0x2009, 0x0005, 0x2011, 0x0020, 0x04e1, 0x004e, 0x0118, 0x8420,
++      0x1f04, 0x2acf, 0x015e, 0x0804, 0x25a0, 0x2200, 0x0002, 0x2ae2,
++      0x2ae4, 0x2ae4, 0x080c, 0x254c, 0x2009, 0x0012, 0x7060, 0xa086,
++      0x0002, 0x0110, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0108, 0x691a,
++      0x7063, 0x0000, 0x70d0, 0xc0c5, 0x70d2, 0x0804, 0x3be5, 0x2200,
++      0x0002, 0x2afe, 0x2ae4, 0x2afc, 0x080c, 0x254c, 0x080c, 0x3f26,
++      0x7000, 0xa086, 0x0002, 0x1904, 0x375d, 0x080c, 0x37be, 0x6008,
++      0xa084, 0xfbef, 0x600a, 0x080c, 0x374f, 0x0904, 0x375d, 0x0804,
++      0x25a0, 0x2404, 0xa005, 0x0590, 0x2068, 0x2d04, 0x0006, 0x6814,
++      0xa706, 0x0118, 0x2d20, 0x000e, 0x0ca8, 0x000e, 0x2022, 0x691a,
++      0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e,
++      0x6820, 0xa084, 0x00ff, 0xa205, 0x6822, 0x080c, 0x1da2, 0x2021,
++      0x4602, 0x241c, 0x8319, 0x2322, 0x6010, 0x8001, 0x6012, 0x1128,
++      0x2021, 0x4604, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef,
++      0x600a, 0x080c, 0x269e, 0x080c, 0x37be, 0x0005, 0xa085, 0x0001,
++      0x0ce0, 0x2300, 0x0002, 0x2b50, 0x2b4e, 0x2bcb, 0x080c, 0x254c,
++      0x78e4, 0xa005, 0x17b0, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104,
++      0x259d, 0x0010, 0x0304, 0x259d, 0x2008, 0xa084, 0x0030, 0x1110,
++      0x0804, 0x322a, 0x78ec, 0xa084, 0x0003, 0x0dd0, 0x7884, 0xd0fc,
++      0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
++      0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
++      0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2bae,
++      0x2bb7, 0x2ba4, 0x2b87, 0x3c29, 0x3c29, 0x2b87, 0x2bc1, 0x080c,
++      0x254c, 0x7000, 0xa086, 0x0004, 0x1190, 0x7060, 0xa086, 0x0002,
++      0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x2a56, 0x7060,
++      0xa086, 0x0006, 0x0db0, 0x7060, 0xa086, 0x0004, 0x0d90, 0x79e4,
++      0x2001, 0x0003, 0x0804, 0x2f18, 0x6818, 0xd0fc, 0x0110, 0x681b,
++      0x001d, 0x080c, 0x3a3c, 0x781b, 0x006e, 0x0005, 0x6818, 0xd0fc,
++      0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, 0x0804, 0x3c07, 0x6818,
++      0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, 0x781b, 0x00fa,
++      0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c,
++      0x781b, 0x00cb, 0x0005, 0xa584, 0x000f, 0x11c0, 0x7000, 0x0002,
++      0x25a0, 0x2bd8, 0x2bda, 0x375d, 0x375d, 0x375d, 0x2bd8, 0x2bd8,
++      0x080c, 0x254c, 0x080c, 0x37be, 0x6008, 0xa084, 0xfbef, 0x600a,
++      0x080c, 0x374f, 0x0904, 0x375d, 0x0804, 0x25a0, 0x78e4, 0xa005,
++      0x1b04, 0x2b89, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104, 0x2b89,
++      0x0010, 0x0304, 0x2b89, 0x2008, 0xa084, 0x0030, 0x1118, 0x781b,
++      0x0068, 0x0005, 0x78ec, 0xa084, 0x0003, 0x0dc8, 0x7884, 0xd0fc,
++      0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
++      0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
++      0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2c26,
++      0x2c2a, 0x2c21, 0x2c1f, 0x3c29, 0x3c29, 0x2c1f, 0x3c23, 0x080c,
++      0x254c, 0x080c, 0x3a42, 0x781b, 0x006e, 0x0005, 0x080c, 0x3a42,
++      0x0804, 0x3c07, 0x080c, 0x3a42, 0x781b, 0x00fa, 0x0005, 0x080c,
++      0x3a42, 0x781b, 0x00cb, 0x0005, 0x2300, 0x0002, 0x2c3b, 0x2c39,
++      0x2c3d, 0x080c, 0x254c, 0x0804, 0x33e2, 0x681b, 0x0016, 0x78a3,
++      0x0000, 0x79e4, 0xa184, 0x0030, 0x0904, 0x33e2, 0x78ec, 0xa084,
++      0x0003, 0x0904, 0x33e2, 0xa184, 0x0100, 0x0d98, 0x7884, 0xd0fc,
++      0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004,
++      0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005,
++      0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2c6f,
++      0x2c2a, 0x2ba4, 0x3be5, 0x3c29, 0x3c29, 0x3be5, 0x3c23, 0x080c,
++      0x3bf1, 0x0005, 0xa282, 0x0005, 0x0310, 0x080c, 0x254c, 0x7898,
++      0x2040, 0x2300, 0x0002, 0x2c7e, 0x2ea8, 0x2eb2, 0x2200, 0x0002,
++      0x2c9a, 0x2c87, 0x2c9a, 0x2c85, 0x2e8a, 0x080c, 0x254c, 0x789b,
++      0x0018, 0x78a8, 0x2010, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0a04,
++      0x3a0b, 0xa08a, 0x0004, 0x1a04, 0x3a0b, 0x0002, 0x3a0b, 0x3a0b,
++      0x3a0b, 0x39c1, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0148,
++      0x0804, 0x3a0b, 0x7000, 0xa005, 0x1dd8, 0x2011, 0x0004, 0x0804,
++      0x3594, 0xa184, 0x00ff, 0xa08a, 0x0010, 0x1a04, 0x3a0b, 0x0002,
++      0x2cc2, 0x2cc0, 0x2cd4, 0x2cd8, 0x2d86, 0x3a0b, 0x3a0b, 0x2d88,
++      0x3a0b, 0x3a0b, 0x2e86, 0x2e86, 0x3a0b, 0x3a0b, 0x3a0b, 0x2e88,
++      0x080c, 0x254c, 0xd6e4, 0x0140, 0x2001, 0x0300, 0x8000, 0x8000,
++      0x783a, 0x781b, 0x00c7, 0x0005, 0x6818, 0xd0fc, 0x0118, 0x681b,
++      0x001d, 0x0c90, 0x0804, 0x3be5, 0x681b, 0x001d, 0x0804, 0x3a36,
++      0x6920, 0x6922, 0xa684, 0x1800, 0x1904, 0x2d29, 0x6820, 0xd084,
++      0x1904, 0x2d31, 0x6818, 0xa086, 0x0008, 0x1110, 0x681b, 0x0000,
++      0xd6d4, 0x0568, 0xd6bc, 0x0558, 0x7083, 0x0000, 0x6818, 0xa084,
++      0x003f, 0xa08a, 0x000d, 0x0718, 0xa08a, 0x000c, 0x7182, 0x2001,
++      0x000c, 0x800c, 0x7186, 0x789b, 0x0061, 0x78aa, 0x0156, 0x0136,
++      0x0146, 0x0016, 0x3208, 0xa18c, 0x0600, 0x0118, 0x20a1, 0x022b,
++      0x0010, 0x20a1, 0x012b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac,
++      0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6038,
++      0xa005, 0x1150, 0x681c, 0xa084, 0x000e, 0x0904, 0x3a36, 0x080c,
++      0x3a48, 0x782b, 0x3008, 0x0010, 0x8001, 0x603a, 0x781b, 0x0071,
++      0x0005, 0xd6e4, 0x0130, 0x781b, 0x0083, 0x0005, 0x781b, 0x0083,
++      0x0005, 0xa684, 0x0060, 0x0dd0, 0xd6dc, 0x0dc0, 0xd6fc, 0x01a0,
++      0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x8007, 0xa084,
++      0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
++      0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4, 0x0118, 0xc6f4, 0x7e5a,
++      0x6eb6, 0x7000, 0xa086, 0x0003, 0x1148, 0x0006, 0x080c, 0x3f26,
++      0x080c, 0x41d9, 0x000e, 0x781b, 0x0080, 0x0005, 0xa006, 0x080c,
++      0x42b5, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0120,
++      0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6,
++      0x7bd6, 0x7bde, 0x2300, 0xa405, 0x1130, 0xc6f5, 0x7e5a, 0x6eb6,
++      0x781b, 0x0080, 0x0005, 0x781b, 0x0080, 0x2200, 0xa115, 0x1118,
++      0x080c, 0x41d9, 0x0005, 0x080c, 0x4206, 0x0005, 0x080c, 0x254c,
++      0x0804, 0x2e1c, 0x00c6, 0x7054, 0x2060, 0x6920, 0xa18c, 0xecff,
++      0x6922, 0x6000, 0xa084, 0xcfdf, 0x6002, 0x080c, 0x38f4, 0xa006,
++      0x2040, 0x2038, 0x080c, 0x399c, 0x0804, 0x2e10, 0x00c6, 0x7054,
++      0x2060, 0x2c48, 0x7aa8, 0xa294, 0x00ff, 0xa286, 0x0004, 0x11d8,
++      0x6920, 0xd1e4, 0x1170, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031,
++      0x0000, 0xa006, 0x2010, 0x080c, 0x38f7, 0x080c, 0x399c, 0x0804,
++      0x2e10, 0xa18c, 0xecff, 0x6922, 0x6104, 0xa18c, 0xffdd, 0x6106,
++      0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003, 0x01d0, 0x6104, 0xa184,
++      0x0010, 0x0548, 0x080c, 0x3b6b, 0x080c, 0x3977, 0x88ff, 0x0518,
++      0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
++      0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005,
++      0x6920, 0xd1cc, 0x0130, 0xa18c, 0xfdff, 0x6922, 0x6000, 0xc0ec,
++      0x6002, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006,
++      0x2010, 0x080c, 0x399c, 0xa286, 0x0001, 0x0158, 0x6104, 0xa184,
++      0x0008, 0x01b0, 0x080c, 0x3b6b, 0x080c, 0x3895, 0x88ff, 0x1980,
++      0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c, 0xfeff, 0x6922, 0x6000,
++      0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7,
++      0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b,
++      0x0083, 0x0005, 0x0804, 0x3a32, 0x2808, 0x789b, 0x0080, 0x2019,
++      0x0080, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x11b8, 0x2300,
++      0xa102, 0xa086, 0x0001, 0x0904, 0x2d8a, 0x7ca8, 0xa4a4, 0x00ff,
++      0xa480, 0x0002, 0xa300, 0x2018, 0xa102, 0x0a04, 0x2d9e, 0x0904,
++      0x2d9e, 0x24a8, 0x7aa8, 0x1f04, 0x2e3a, 0x0c18, 0xa284, 0x00f0,
++      0xa082, 0x0020, 0x06b8, 0x2200, 0xa082, 0x0021, 0x1698, 0x7aa8,
++      0x8318, 0x8318, 0x2100, 0xa302, 0x0aa0, 0xa286, 0x0023, 0x0950,
++      0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5,
++      0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x78a0, 0x8001, 0x0904,
++      0x2e10, 0x20a8, 0x7998, 0x789b, 0x0060, 0x78aa, 0x2011, 0x0080,
++      0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa, 0x7a98, 0x1f04, 0x2e68,
++      0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b,
++      0x0082, 0x0005, 0x8318, 0x2100, 0xa302, 0x0a04, 0x2e21, 0xa284,
++      0x0080, 0x1904, 0x3a36, 0x78a0, 0xa005, 0x08c8, 0x0804, 0x3a36,
++      0x0804, 0x3a0b, 0x7054, 0xa04d, 0x789b, 0x0018, 0x78a8, 0xa084,
++      0x00ff, 0xa08e, 0x0001, 0x0110, 0x080c, 0x254c, 0x7aa8, 0xa294,
++      0x00ff, 0x784b, 0x0008, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0005,
++      0x1a04, 0x3a0b, 0x0002, 0x3a0b, 0x380c, 0x3a0b, 0x3927, 0x3d31,
++      0xa282, 0x0000, 0x1110, 0x080c, 0x254c, 0x080c, 0x3a3c, 0x781b,
++      0x0082, 0x0005, 0xa282, 0x0003, 0x1110, 0x080c, 0x254c, 0xd4fc,
++      0x11d0, 0x7060, 0xa005, 0x0110, 0x080c, 0x254c, 0x6f14, 0x7772,
++      0xa7bc, 0x8f00, 0x080c, 0x3b6f, 0x6008, 0xa085, 0x0021, 0x600a,
++      0x8738, 0xa784, 0x001f, 0x1db0, 0x080c, 0x3a3f, 0x7063, 0x0002,
++      0x701f, 0x0009, 0x0010, 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005,
++      0xa282, 0x0004, 0x0310, 0x080c, 0x254c, 0x2300, 0x0002, 0x2ee2,
++      0x3078, 0x30b4, 0xa286, 0x0003, 0x0598, 0x7200, 0x7cd8, 0x7ddc,
++      0x7fd0, 0x71d0, 0xd1b4, 0x0528, 0xd1bc, 0x1518, 0x2001, 0x4601,
++      0x2004, 0xd0c4, 0x11f0, 0x7868, 0xa084, 0x00ff, 0x11d0, 0xa282,
++      0x0002, 0x12b8, 0x00d6, 0x783b, 0x8300, 0x781b, 0x0059, 0x70b8,
++      0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
++      0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, 0x00de, 0x2001, 0x0000,
++      0x0058, 0x783b, 0x1300, 0x781b, 0x0057, 0x2001, 0x0000, 0x0020,
++      0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x7046, 0x68a0, 0xd0ec, 0x0118,
++      0x6008, 0xc08d, 0x600a, 0xa284, 0x000f, 0x0002, 0x3059, 0x2f33,
++      0x2f30, 0x3184, 0x320f, 0x25a0, 0x2f2e, 0x2f2e, 0x080c, 0x254c,
++      0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x0120, 0x7044, 0xa086, 0x0014,
++      0x11e8, 0x080c, 0x3f26, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0108,
++      0x7044, 0xa086, 0x0014, 0x0168, 0x6818, 0xa086, 0x0008, 0x1904,
++      0x301b, 0x7858, 0xd09c, 0x0904, 0x301b, 0x6820, 0xd0ac, 0x0904,
++      0x301b, 0x681b, 0x0014, 0x2009, 0x0002, 0x04a8, 0x7868, 0xa08c,
++      0x00ff, 0x0588, 0xa186, 0x0008, 0x1158, 0x6008, 0xc0a4, 0x600a,
++      0x080c, 0x374f, 0x0540, 0x080c, 0x37be, 0x080c, 0x3f26, 0x0060,
++      0xa186, 0x0028, 0x1500, 0x6018, 0xa005, 0x0d78, 0x8001, 0x0d68,
++      0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820, 0xd084, 0x0904, 0x25a0,
++      0xc084, 0x6822, 0x080c, 0x2693, 0x7058, 0x00c6, 0x2060, 0x6800,
++      0x6002, 0x00ce, 0x6004, 0x6802, 0xa005, 0x2d00, 0x1108, 0x6002,
++      0x6006, 0x0804, 0x25a0, 0x0016, 0x81ff, 0x15f0, 0x7000, 0xa086,
++      0x0030, 0x05d0, 0x71d0, 0xd1bc, 0x15b8, 0xd1b4, 0x11e8, 0x705c,
++      0xa005, 0x1590, 0x70a0, 0xa086, 0x0001, 0x0570, 0x7003, 0x0000,
++      0x0046, 0x0056, 0x0076, 0x0066, 0x00c6, 0x00d6, 0x080c, 0x25c5,
++      0x00de, 0x00ce, 0x006e, 0x007e, 0x005e, 0x004e, 0x71d0, 0xd1b4,
++      0x11d8, 0x7003, 0x0040, 0x00c0, 0x080c, 0x3c33, 0x11a8, 0x781b,
++      0x0068, 0x00d6, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6,
++      0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030,
++      0x7808, 0xc08d, 0x780a, 0x00de, 0x080c, 0x30dc, 0x001e, 0x81ff,
++      0x0904, 0x301b, 0xa684, 0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14,
++      0xa186, 0x0002, 0x1904, 0x301c, 0x6818, 0xa086, 0x0014, 0x1130,
++      0x2008, 0xd6e4, 0x0118, 0x7868, 0xa08c, 0x00ff, 0x080c, 0x3a55,
++      0x080c, 0x269e, 0x6820, 0xd0dc, 0x1578, 0x8717, 0xa294, 0x000f,
++      0x8213, 0x8213, 0x8213, 0xb284, 0x0600, 0x0118, 0xa290, 0x4ac0,
++      0x0010, 0xa290, 0x4b40, 0xa290, 0x0000, 0x221c, 0xd3c4, 0x0170,
++      0x6820, 0xd0e4, 0x0128, 0xa084, 0xefff, 0x6822, 0xc3ac, 0x2312,
++      0x8210, 0x2204, 0xa085, 0x0038, 0x2012, 0x8211, 0xd3d4, 0x0138,
++      0x68a0, 0xd0c4, 0x1120, 0x080c, 0x3144, 0x0804, 0x25a0, 0x6008,
++      0xc08d, 0x600a, 0x0008, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0110,
++      0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0168,
++      0x2009, 0x4602, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, 0x1128,
++      0x2021, 0x4604, 0x2404, 0xc0a5, 0x2022, 0x6018, 0xa005, 0x0118,
++      0x8001, 0x601a, 0x1118, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084,
++      0x1130, 0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0020, 0x7058,
++      0x2060, 0x6800, 0x6002, 0x2061, 0x4600, 0x6887, 0x0103, 0x2d08,
++      0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008,
++      0x616e, 0x7200, 0xa286, 0x0030, 0x0158, 0xa286, 0x0040, 0x1904,
++      0x25a0, 0x7003, 0x0002, 0x7048, 0x2068, 0x68c4, 0x2060, 0x0005,
++      0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc, 0x703e, 0x70b4, 0xa065,
++      0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005,
++      0xa282, 0x0004, 0x0210, 0x080c, 0x254c, 0x2200, 0x0002, 0x3083,
++      0x3092, 0x309e, 0x3092, 0xa586, 0x1300, 0x0160, 0xa586, 0x8300,
++      0x1d90, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084,
++      0xfbef, 0x600a, 0x7000, 0xa086, 0x0005, 0x0128, 0x080c, 0x3a3c,
++      0x781b, 0x0082, 0x0005, 0x781b, 0x0083, 0x0005, 0x7890, 0x8007,
++      0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
++      0x00ff, 0xa186, 0x0003, 0x0128, 0xa186, 0x0000, 0x0110, 0x0804,
++      0x3a0b, 0x781b, 0x0083, 0x0005, 0x6820, 0xc095, 0x6822, 0x82ff,
++      0x1118, 0x080c, 0x3a3c, 0x0030, 0x8211, 0x0110, 0x080c, 0x254c,
++      0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, 0x080c, 0x3c46, 0x7830,
++      0xa084, 0x00c0, 0x1170, 0x0016, 0x3208, 0xa18c, 0x0800, 0x001e,
++      0x0118, 0x0104, 0x30d9, 0x0010, 0x0304, 0x30d9, 0x791a, 0xa006,
++      0x0005, 0xa085, 0x0001, 0x0005, 0xa684, 0x0060, 0x1130, 0x682f,
++      0x0000, 0x6833, 0x0000, 0x0804, 0x3143, 0xd6dc, 0x1198, 0x68b4,
++      0xd0dc, 0x1180, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7044, 0xa005,
++      0x1130, 0x2200, 0xa105, 0x0904, 0x3f26, 0x7047, 0x0015, 0x0804,
++      0x3f26, 0x0005, 0xd6ac, 0x01f0, 0xd6f4, 0x0130, 0x682f, 0x0000,
++      0x6833, 0x0000, 0x0804, 0x3f26, 0x68b4, 0xa084, 0x4000, 0xa635,
++      0xd6f4, 0x1da0, 0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0xd6dc,
++      0x1128, 0x68b4, 0xd0dc, 0x0110, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32,
++      0x0804, 0x3f26, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833, 0x0000,
++      0x0804, 0x3f26, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x1da0,
++      0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0x2408, 0x2510, 0x2700,
++      0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a32,
++      0x2100, 0xa205, 0x1110, 0x0804, 0x3f26, 0x7000, 0xa086, 0x0006,
++      0x0110, 0x0804, 0x3f26, 0x0005, 0x6946, 0x6008, 0xc0cd, 0xd3cc,
++      0x0108, 0xc08d, 0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f,
++      0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f,
++      0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b,
++      0x0020, 0x7000, 0x0002, 0x25a0, 0x3173, 0x316d, 0x316b, 0x316b,
++      0x316b, 0x316b, 0x316b, 0x080c, 0x254c, 0x6820, 0xd084, 0x1118,
++      0x080c, 0x37a4, 0x0030, 0x7058, 0x2c50, 0x2060, 0x6800, 0x6002,
++      0x2a60, 0xaea0, 0x0017, 0x2404, 0xa005, 0x0110, 0x2020, 0x0cd8,
++      0x2d22, 0x206b, 0x0000, 0x0005, 0x080c, 0x37aa, 0x080c, 0x37be,
++      0x6008, 0xc0cc, 0x600a, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14,
++      0x6938, 0x691a, 0x6944, 0x6916, 0x2009, 0x0000, 0xae86, 0x4640,
++      0x0110, 0x2009, 0x0001, 0x080c, 0x42ec, 0xd6dc, 0x01c8, 0x691c,
++      0xc1ed, 0x691e, 0x6828, 0xa082, 0x000e, 0x0290, 0x6848, 0xa084,
++      0x000f, 0xa086, 0x000b, 0x1160, 0x685c, 0xa086, 0x0047, 0x1140,
++      0x2001, 0x4601, 0x2004, 0xd0ac, 0x1118, 0x2700, 0x080c, 0x2475,
++      0x6818, 0xd0fc, 0x0140, 0x681b, 0x0000, 0x7868, 0xa08c, 0x00ff,
++      0x0110, 0x681b, 0x001e, 0xaea0, 0x0017, 0x6800, 0x2022, 0x6a3c,
++      0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0580,
++      0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x00d6, 0x00f6,
++      0x0156, 0x0146, 0x2079, 0x4600, 0x080c, 0x1b93, 0x014e, 0x015e,
++      0x00fe, 0x70c8, 0x2010, 0x2009, 0x0101, 0x0026, 0x2204, 0xa06d,
++      0x0140, 0x6814, 0xa706, 0x0110, 0x6800, 0x0cc8, 0x6820, 0xc0d5,
++      0x6822, 0x002e, 0x8210, 0x8109, 0x1d80, 0x00de, 0x7063, 0x0003,
++      0x707b, 0x0000, 0x7772, 0x707f, 0x000f, 0x71d0, 0xc1c4, 0x71d2,
++      0x6818, 0xa086, 0x0002, 0x1138, 0x6817, 0x0000, 0x682b, 0x0000,
++      0x681c, 0xc0ec, 0x681e, 0x080c, 0x1da2, 0x0804, 0x25a0, 0x7cd8,
++      0x7ddc, 0x7fd0, 0x080c, 0x30dc, 0x682b, 0x0000, 0x789b, 0x000e,
++      0x6f14, 0x080c, 0x3c4a, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc,
++      0x0110, 0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x7063, 0x0000,
++      0x0804, 0x25a0, 0x7000, 0xa005, 0x1110, 0x0804, 0x25a0, 0xa006,
++      0x080c, 0x3f26, 0x6920, 0xd1ac, 0x1110, 0x681b, 0x0014, 0xa68c,
++      0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822,
++      0x7000, 0x0002, 0x25a0, 0x324c, 0x324c, 0x324f, 0x324f, 0x324f,
++      0x324a, 0x324a, 0x080c, 0x254c, 0x6818, 0x0804, 0x2f18, 0x6008,
++      0xc0a4, 0x600a, 0x6817, 0x0000, 0x0804, 0x3772, 0x2300, 0x0002,
++      0x325b, 0x325d, 0x32ab, 0x080c, 0x254c, 0xd6fc, 0x1904, 0x2d38,
++      0x7000, 0xa00d, 0x0002, 0x25a0, 0x326d, 0x326d, 0x3297, 0x326d,
++      0x32a8, 0x326b, 0x326b, 0x080c, 0x254c, 0xa684, 0x0060, 0x0538,
++      0xa086, 0x0060, 0x1510, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6,
++      0x681c, 0xc0ac, 0x681e, 0xa186, 0x0002, 0x0148, 0x080c, 0x3f26,
++      0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x4206, 0x0010, 0x080c,
++      0x41d9, 0x781b, 0x0083, 0x71d0, 0xd1b4, 0x1904, 0x259d, 0x70a0,
++      0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6ec, 0x09f0, 0x6818,
++      0xd0fc, 0x0170, 0xd6f4, 0x1130, 0x681b, 0x0015, 0x781b, 0x0083,
++      0x0804, 0x259d, 0x681b, 0x0007, 0x682f, 0x0000, 0x6833, 0x0000,
++      0x080c, 0x3bf1, 0x0005, 0x080c, 0x254c, 0x2300, 0x0002, 0x32b4,
++      0x32d6, 0x332e, 0x080c, 0x254c, 0x7000, 0x0002, 0x32be, 0x32c0,
++      0x32c7, 0x32be, 0x32be, 0x32be, 0x32be, 0x32be, 0x080c, 0x254c,
++      0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x4206, 0x0010, 0x080c,
++      0x41d9, 0x681c, 0xc0b4, 0x681e, 0x70d0, 0xd0b4, 0x1904, 0x259d,
++      0x70a0, 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6fc, 0x1904,
++      0x331e, 0x7000, 0xa00d, 0x0002, 0x25a0, 0x32ec, 0x32e6, 0x3316,
++      0x32ec, 0x331b, 0x32e4, 0x32e4, 0x080c, 0x254c, 0x6894, 0x78d6,
++      0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0x0538, 0xa086,
++      0x0060, 0x1510, 0xa6b4, 0xbfbf, 0xc6ed, 0x7e5a, 0x6eb6, 0xa186,
++      0x0002, 0x0148, 0x080c, 0x3f26, 0x69ac, 0x68b0, 0xa115, 0x0118,
++      0x080c, 0x4206, 0x0010, 0x080c, 0x41d9, 0x781b, 0x0083, 0x681c,
++      0xc0b4, 0x681e, 0x71d0, 0xd1b4, 0x1904, 0x259d, 0x70a0, 0xa086,
++      0x0001, 0x1904, 0x25e1, 0x0005, 0xd6ec, 0x09f0, 0x6818, 0xd0fc,
++      0x0110, 0x681b, 0x0007, 0x781b, 0x00fb, 0x0005, 0xc6fc, 0x7e5a,
++      0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++      0xa303, 0x68ae, 0x79d2, 0x781b, 0x0083, 0x0005, 0xd6dc, 0x0130,
++      0x782b, 0x3009, 0x781b, 0x0083, 0x0804, 0x259d, 0x7884, 0xc0ac,
++      0x7886, 0x78e4, 0xa084, 0x0008, 0x1150, 0xa484, 0x0200, 0x0108,
++      0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0083, 0x0804, 0x259d, 0x6820,
++      0xc095, 0x6822, 0x080c, 0x3bdc, 0xc6dd, 0x080c, 0x3a3c, 0x781b,
++      0x0082, 0x0804, 0x259d, 0x2300, 0x0002, 0x3358, 0x335a, 0x335c,
++      0x080c, 0x254c, 0x0804, 0x3a36, 0x7d98, 0xd6d4, 0x15a8, 0x79e4,
++      0xd1ac, 0x0130, 0x78ec, 0xa084, 0x0003, 0x0110, 0x782b, 0x3009,
++      0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x7d9a,
++      0x79e4, 0xd1ac, 0x0120, 0x78ec, 0xa084, 0x0003, 0x1120, 0x2001,
++      0x0014, 0x0804, 0x2f18, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
++      0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000,
++      0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007,
++      0x0010, 0x2001, 0x0001, 0x04c2, 0x7a90, 0xa294, 0x0007, 0x789b,
++      0x0060, 0x79a8, 0x81ff, 0x0568, 0x789b, 0x0080, 0x7ba8, 0xa384,
++      0x0001, 0x11d0, 0x7ba8, 0x7ba8, 0xa386, 0x0004, 0x1118, 0x2009,
++      0xffdf, 0x0058, 0xa386, 0x0001, 0x1118, 0x2009, 0xfff7, 0x0028,
++      0xa386, 0x0003, 0x1148, 0x2009, 0xffef, 0x00c6, 0x7054, 0x2060,
++      0x6004, 0xa104, 0x6006, 0x00ce, 0x789b, 0x0060, 0x78ab, 0x0000,
++      0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xecff,
++      0x6922, 0x7d9a, 0x0804, 0x3be5, 0x2bae, 0x2bb7, 0x33d6, 0x33dc,
++      0x33d4, 0x33d4, 0x3be5, 0x3be5, 0x080c, 0x254c, 0x6920, 0xa18c,
++      0xfcff, 0x6922, 0x0804, 0x3beb, 0x6920, 0xa18c, 0xfcff, 0x6922,
++      0x0804, 0x3be5, 0x79e4, 0xa184, 0x0030, 0x0120, 0x78ec, 0xa084,
++      0x0003, 0x1570, 0x7000, 0xa086, 0x0004, 0x1190, 0x7060, 0xa086,
++      0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x2a56,
++      0x7060, 0xa086, 0x0006, 0x0db0, 0x7060, 0xa086, 0x0004, 0x0d90,
++      0x7000, 0xa086, 0x0000, 0x0904, 0x259d, 0x6920, 0xa184, 0x0420,
++      0x0128, 0xc1d4, 0x6922, 0x6818, 0x0804, 0x2f18, 0x6818, 0xa08e,
++      0x0002, 0x0120, 0xc0fd, 0x681a, 0x2001, 0x0014, 0x0804, 0x2f18,
++      0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007,
++      0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007,
++      0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001,
++      0x0002, 0x3be5, 0x3be5, 0x3439, 0x3be5, 0x3c29, 0x3c29, 0x3be5,
++      0x3be5, 0xd6bc, 0x0570, 0x7180, 0x81ff, 0x0558, 0xa182, 0x000d,
++      0x1318, 0x7083, 0x0000, 0x0028, 0xa182, 0x000c, 0x7082, 0x2009,
++      0x000c, 0x789b, 0x0061, 0x79aa, 0x0156, 0x0136, 0x0146, 0x7084,
++      0x8114, 0xa210, 0x7286, 0xa080, 0x000b, 0xad00, 0x2098, 0xb284,
++      0x0600, 0x0118, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x789b,
++      0x0000, 0x8108, 0x81ac, 0x53a6, 0x014e, 0x013e, 0x015e, 0x0804,
++      0x3beb, 0xd6d4, 0x1904, 0x34ac, 0x6820, 0xd084, 0x0904, 0x3beb,
++      0xa68c, 0x0060, 0xa684, 0x0060, 0x0120, 0xa086, 0x0060, 0x1108,
++      0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000,
++      0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa, 0x8008, 0x810c,
++      0x0904, 0x37d3, 0xa18c, 0x00f8, 0x1904, 0x37d3, 0x0156, 0x0136,
++      0x0146, 0x0016, 0x20a1, 0x012b, 0x3208, 0xa18c, 0x0600, 0x0110,
++      0x20a1, 0x022b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80,
++      0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6814, 0xc0fc,
++      0x8007, 0x7882, 0x0804, 0x3beb, 0x6818, 0xd0fc, 0x0110, 0x681b,
++      0x0008, 0x080c, 0x3a3c, 0x781b, 0x00ed, 0x0005, 0x2300, 0x0002,
++      0x34bd, 0x357a, 0x34bb, 0x080c, 0x254c, 0x7cd8, 0x7ddc, 0x7fd0,
++      0x82ff, 0x1528, 0x7200, 0xa286, 0x0003, 0x0904, 0x2ee6, 0x71d0,
++      0xd1bc, 0x11f8, 0xd1b4, 0x01e8, 0x2001, 0x4601, 0x2004, 0xd0c4,
++      0x11c0, 0x00d6, 0x783b, 0x8800, 0x781b, 0x0059, 0x70b8, 0xa06d,
++      0x68b4, 0xc0a5, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2,
++      0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, 0x00de, 0x0030, 0x7200,
++      0x0020, 0x783b, 0x1800, 0x781b, 0x0057, 0xa284, 0x000f, 0x0002,
++      0x3565, 0x3522, 0x34fa, 0x2f15, 0x34f8, 0x3565, 0x34f8, 0x34f8,
++      0x080c, 0x254c, 0x681c, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a,
++      0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005, 0x1108, 0x6002,
++      0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084, 0x000e, 0x1120, 0x71c8,
++      0xa188, 0x0100, 0x0028, 0x7030, 0x68ba, 0x713c, 0x70c8, 0xa108,
++      0x2104, 0x6802, 0x2d0a, 0x715a, 0xd6dc, 0x1120, 0xc6fc, 0x6eb6,
++      0x0804, 0x3565, 0x6eb6, 0xa684, 0x0060, 0x1120, 0xa684, 0x7fff,
++      0x68b6, 0x04d8, 0xd6dc, 0x1150, 0xa684, 0x7fff, 0x68b6, 0x6894,
++      0x68a6, 0x6898, 0x68aa, 0x080c, 0x3f26, 0x0478, 0xd6ac, 0x0140,
++      0xa006, 0x080c, 0x3f26, 0x2408, 0x2510, 0x69aa, 0x6aa6, 0x0068,
++      0x2408, 0x2510, 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291,
++      0x0000, 0x69aa, 0x6aa6, 0x080c, 0x3f26, 0xd6fc, 0x01b0, 0xa684,
++      0x7fff, 0x68b6, 0x2510, 0x2408, 0xd6ac, 0x1138, 0x2700, 0x8007,
++      0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302,
++      0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x7000, 0xa086, 0x0030,
++      0x1904, 0x25a0, 0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc, 0x703e,
++      0x70b4, 0xa065, 0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80, 0x0009,
++      0x7042, 0x0005, 0xa586, 0x8800, 0x1148, 0x7003, 0x0000, 0x6018,
++      0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, 0x600a, 0x0804, 0x3a36,
++      0x7043, 0x0000, 0xa282, 0x0006, 0x0310, 0x080c, 0x254c, 0x2300,
++      0x0002, 0x3594, 0x35a5, 0x35af, 0x2200, 0x0002, 0x359c, 0x3a36,
++      0x359e, 0x359c, 0x35e0, 0x362e, 0x080c, 0x254c, 0x7a80, 0xa294,
++      0x0f00, 0x080c, 0x3682, 0x0804, 0x3a0b, 0x00c1, 0x0002, 0x3a36,
++      0x35ad, 0x35ad, 0x35e0, 0x35ad, 0x3a36, 0x080c, 0x254c, 0x0071,
++      0x0002, 0x35b9, 0x35b7, 0x35b7, 0x35b9, 0x35b7, 0x35b9, 0x080c,
++      0x254c, 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, 0x7000, 0xa086,
++      0x0002, 0x1150, 0x080c, 0x37be, 0x0010, 0x080c, 0x3f26, 0x6008,
++      0xa084, 0xfbef, 0x600a, 0x0020, 0x7000, 0xa086, 0x0003, 0x0da8,
++      0x7003, 0x0005, 0x2001, 0x8de0, 0xae8e, 0x4640, 0x0110, 0x2001,
++      0x8e12, 0x2068, 0x704a, 0xad80, 0x0009, 0x7042, 0x2200, 0x0005,
++      0x7000, 0xa086, 0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2, 0x2c00,
++      0x70b6, 0x2d00, 0x70ba, 0x0038, 0x080c, 0x3f26, 0x0020, 0x7000,
++      0xa086, 0x0003, 0x0dc8, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00,
++      0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x8cc0,
++      0xb284, 0x0600, 0x1118, 0xc2fd, 0x2069, 0x8dd0, 0x2d04, 0x2d08,
++      0x715a, 0xa06d, 0x0128, 0x6814, 0xa206, 0x0120, 0x6800, 0x0cb8,
++      0x080c, 0x3682, 0x6eb4, 0x7e5a, 0x6920, 0xa184, 0x0c00, 0x0904,
++      0x36a8, 0x7060, 0xa086, 0x0006, 0x1128, 0x7070, 0xa206, 0x1110,
++      0x7062, 0x707a, 0x681b, 0x0005, 0xc1ad, 0x681b, 0x0005, 0xc1ad,
++      0xc1d4, 0x6922, 0x080c, 0x3a42, 0x0804, 0x36a8, 0x7200, 0xa286,
++      0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00,
++      0x70ba, 0x0030, 0x080c, 0x3f26, 0x0018, 0xa286, 0x0003, 0x0dd0,
++      0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8,
++      0xa484, 0x001f, 0xa215, 0xae86, 0x4640, 0x0108, 0xc2fd, 0x79a8,
++      0x79a8, 0xa18c, 0x00ff, 0x2118, 0x70c8, 0xa168, 0x2d04, 0x2d08,
++      0x715a, 0xa06d, 0x0128, 0x6814, 0xa206, 0x0118, 0x6800, 0x0cb8,
++      0x0409, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0904, 0x36a8, 0xd0dc,
++      0x0178, 0x7060, 0xa086, 0x0004, 0x1140, 0x7070, 0xa206, 0x1128,
++      0x7074, 0xa306, 0x1110, 0x7062, 0x707a, 0x080c, 0x3a48, 0x0480,
++      0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x080c, 0x3a42, 0x707b,
++      0x0000, 0x0430, 0x7003, 0x0005, 0xb284, 0x0600, 0x0118, 0x2001,
++      0x8de0, 0x0010, 0x2001, 0x8e12, 0x2068, 0x704a, 0x0156, 0x20a9,
++      0x0032, 0x2003, 0x0000, 0x8000, 0x1f04, 0x3691, 0x015e, 0xb284,
++      0x0600, 0x0110, 0xc2fc, 0x0008, 0xc2fd, 0x6a16, 0xad80, 0x0009,
++      0x7042, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0005,
++      0xc6ec, 0xa6ac, 0x0060, 0x0904, 0x36ef, 0x6b98, 0x6c94, 0x69ac,
++      0x68b0, 0xa105, 0x11e0, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa586,
++      0x0060, 0x05c8, 0xd6f4, 0x1108, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a,
++      0x2009, 0x0083, 0xd69c, 0x0128, 0x2009, 0x0082, 0x2019, 0x0000,
++      0x2320, 0x791a, 0xd6ec, 0x0588, 0x080c, 0x41d9, 0x0470, 0x68b0,
++      0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x01f8, 0x7bd2, 0x7bda,
++      0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x1108, 0xc6ed, 0xc6f4, 0x7e5a,
++      0x2011, 0x0083, 0xd69c, 0x0128, 0x2011, 0x0082, 0x2019, 0x0000,
++      0x2320, 0x7a1a, 0xd6ec, 0x0188, 0x080c, 0x4206, 0x0070, 0x2019,
++      0x0000, 0x2320, 0x0010, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0083,
++      0xd69c, 0x0110, 0x2009, 0x0082, 0x791a, 0x68c0, 0x7056, 0x2d00,
++      0x704a, 0x68c4, 0x2060, 0x71d0, 0x2001, 0x4601, 0x2004, 0xd0c4,
++      0x15c8, 0x70d4, 0xa02d, 0x01b8, 0xd1bc, 0x0548, 0x7a80, 0xa294,
++      0x0f00, 0x70d8, 0xa206, 0x0118, 0x78e0, 0xa504, 0x1558, 0x70d6,
++      0xc1bc, 0x71d2, 0x0438, 0x2031, 0x0001, 0x852c, 0x0218, 0x8633,
++      0x8210, 0x0cd8, 0x0005, 0x7de0, 0xa594, 0xff00, 0x0130, 0x2011,
++      0x0008, 0x852f, 0x0c81, 0x8637, 0x0008, 0x0c69, 0x8217, 0x7880,
++      0xa084, 0x0f00, 0xa206, 0x0170, 0x72da, 0x76d6, 0x0058, 0x7a80,
++      0xa294, 0x0f00, 0x70d8, 0xa236, 0x0dc0, 0x78e0, 0xa534, 0x0da8,
++      0xc1bd, 0x71d2, 0xd1b4, 0x1904, 0x259d, 0x2300, 0xa405, 0x0904,
++      0x259d, 0x70a0, 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0x6020,
++      0xa005, 0x0150, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a,
++      0x700f, 0x0100, 0x702c, 0x6026, 0x0005, 0xa006, 0x080c, 0x3f26,
++      0x7000, 0xa086, 0x0002, 0x0120, 0x7060, 0xa086, 0x0005, 0x1150,
++      0x682b, 0x0000, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040,
++      0x681f, 0x0100, 0x7000, 0xa084, 0x000f, 0x0002, 0x25a0, 0x3783,
++      0x3780, 0x37a0, 0x378c, 0x25a0, 0x377e, 0x377e, 0x080c, 0x254c,
++      0x0449, 0x0411, 0x0028, 0x0431, 0x7058, 0x2060, 0x6800, 0x6002,
++      0x080c, 0x1da2, 0x0804, 0x25a0, 0x7060, 0x7063, 0x0000, 0x707f,
++      0x0000, 0x0002, 0x379c, 0x379c, 0x379a, 0x379a, 0x379a, 0x379c,
++      0x379a, 0x379c, 0x0804, 0x2a6b, 0x7063, 0x0000, 0x0804, 0x25a0,
++      0x681b, 0x0000, 0x0804, 0x3184, 0x6800, 0xa005, 0x1108, 0x6002,
++      0x6006, 0x0005, 0x6410, 0x84ff, 0x0168, 0x2009, 0x4602, 0x2104,
++      0x8001, 0x200a, 0x8421, 0x6412, 0x1128, 0x2021, 0x4604, 0x2404,
++      0xc0a5, 0x2022, 0x6008, 0xc0a4, 0x600a, 0x0005, 0x6018, 0xa005,
++      0x0110, 0x8001, 0x601a, 0x0005, 0x080c, 0x3c46, 0x681b, 0x0018,
++      0x0490, 0x080c, 0x3c46, 0x681b, 0x0019, 0x0468, 0x080c, 0x3c46,
++      0x681b, 0x001a, 0x0440, 0x080c, 0x3c46, 0x681b, 0x0003, 0x0418,
++      0x7770, 0x080c, 0x3b6f, 0x7174, 0xa18c, 0x00ff, 0x3210, 0xa294,
++      0x0600, 0x0118, 0xa1e8, 0x8bc0, 0x0010, 0xa1e8, 0x8cd0, 0x2d04,
++      0x2d08, 0x2068, 0xa005, 0x1118, 0x707a, 0x0804, 0x25a0, 0x6814,
++      0x7270, 0xa206, 0x0110, 0x6800, 0x0c98, 0x6800, 0x200a, 0x681b,
++      0x0005, 0x707b, 0x0000, 0x080c, 0x37aa, 0x6820, 0xd084, 0x1110,
++      0x080c, 0x37a4, 0x080c, 0x37be, 0x681f, 0x0000, 0x6823, 0x0020,
++      0x080c, 0x1da2, 0x0804, 0x25a0, 0xa282, 0x0003, 0x1904, 0x3a10,
++      0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xc1bd,
++      0x6922, 0xd1c4, 0x05b0, 0xc1c4, 0x6922, 0xa6b4, 0x00ff, 0x0530,
++      0xa682, 0x0018, 0x0218, 0x0110, 0x2031, 0x0018, 0xa686, 0x0010,
++      0x1108, 0x8630, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3ac9,
++      0x0118, 0x080c, 0x38f7, 0x00a0, 0x080c, 0x3a95, 0x080c, 0x38f4,
++      0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118,
++      0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x080c, 0x38f4,
++      0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083,
++      0x0005, 0x00c6, 0x7054, 0x2060, 0x6100, 0xd1e4, 0x0598, 0x6208,
++      0x8217, 0xa294, 0x00ff, 0xa282, 0x0018, 0x0218, 0x0110, 0x2011,
++      0x0018, 0x2600, 0xa202, 0x1208, 0x2230, 0xa686, 0x0010, 0x1108,
++      0x8630, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282,
++      0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c, 0x1210,
++      0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228, 0x080c, 0x3a99,
++      0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3ac9, 0x0118, 0x080c,
++      0x38f7, 0x0020, 0x080c, 0x3a95, 0x080c, 0x38f4, 0x7858, 0xc095,
++      0x785a, 0x00ce, 0x781b, 0x0082, 0x0005, 0x00c6, 0x2960, 0x6000,
++      0xd0e4, 0x1188, 0xd0b4, 0x1150, 0x6010, 0xa084, 0x000f, 0x1130,
++      0x6104, 0xa18c, 0xfff5, 0x6106, 0x00ce, 0x0005, 0x2011, 0x0032,
++      0x2019, 0x0000, 0x00f0, 0x68a0, 0xd0cc, 0x1dc0, 0x6208, 0xa294,
++      0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282, 0x000b, 0x1218, 0x2011,
++      0x000a, 0x0028, 0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x6308,
++      0x831f, 0xa39c, 0x00ff, 0xa382, 0x0018, 0x0218, 0x0110, 0x2019,
++      0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa,
++      0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x080c, 0x3a55,
++      0x00ce, 0x0005, 0x00c6, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106,
++      0x2011, 0x0032, 0x2019, 0x0000, 0x0000, 0x78ab, 0x0001, 0x78ab,
++      0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820,
++      0xc0c5, 0x6822, 0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x00c6,
++      0x7154, 0x2160, 0x2018, 0x2008, 0xa084, 0xffe0, 0xa635, 0x7e86,
++      0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084, 0x7770, 0xa18c,
++      0x000f, 0xa105, 0x2029, 0x4605, 0x252c, 0xd5cc, 0x0140, 0xd3a4,
++      0x0110, 0xa085, 0x0800, 0xd3fc, 0x0110, 0xa085, 0x8080, 0x78a6,
++      0x6016, 0x788a, 0xa6b4, 0x001f, 0x8637, 0x8204, 0x8004, 0xa605,
++      0x600e, 0x6004, 0xa084, 0xffd5, 0x6006, 0x00ce, 0x0005, 0xa282,
++      0x0002, 0x1904, 0x3a1a, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc,
++      0x0568, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x1a04,
++      0x3a0b, 0x080c, 0x399e, 0x080c, 0x38f4, 0xa980, 0x0001, 0x200c,
++      0x080c, 0x3b6b, 0x080c, 0x3895, 0x88ff, 0x0178, 0x789b, 0x0060,
++      0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b,
++      0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x7e58, 0xd6d4, 0x1118,
++      0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0xa282, 0x0002,
++      0x1218, 0xa284, 0x0001, 0x0140, 0x7154, 0xa188, 0x0000, 0x210c,
++      0xd1ec, 0x1110, 0x2011, 0x0000, 0x080c, 0x3a87, 0x0479, 0x080c,
++      0x38f4, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x00c6,
++      0x0026, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x1158, 0xd0bc,
++      0x1138, 0x6014, 0xd0b4, 0x1120, 0xc1a4, 0x6106, 0xa006, 0x0088,
++      0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003,
++      0x7aaa, 0xa8c0, 0x0004, 0x080c, 0x3a55, 0x6820, 0xa085, 0x0200,
++      0x6822, 0x002e, 0x00ce, 0x0005, 0x8807, 0xa715, 0x00c6, 0x2009,
++      0x0000, 0x7054, 0x2060, 0x82ff, 0x0110, 0x2009, 0x0040, 0x6018,
++      0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xff9f, 0xa105, 0xc0ec,
++      0xd0b4, 0x1108, 0xc0ed, 0x6100, 0xd1f4, 0x0110, 0xa085, 0x0020,
++      0x78a6, 0x6016, 0x788a, 0x6004, 0xa084, 0xffef, 0x6006, 0x00ce,
++      0x0005, 0x0006, 0x7000, 0xa086, 0x0003, 0x0110, 0x000e, 0x0010,
++      0x000e, 0x0488, 0xd6ac, 0x0578, 0x7888, 0xa084, 0x0040, 0x0558,
++      0x7bb8, 0x8307, 0xa084, 0x007f, 0x1508, 0x8207, 0xa084, 0x00ff,
++      0xa09e, 0x0001, 0x1904, 0x3a32, 0xd6f4, 0x11d0, 0x79d8, 0x7adc,
++      0xa108, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x080c,
++      0x42b5, 0x781b, 0x0080, 0xb284, 0x0600, 0x0118, 0x2001, 0x0000,
++      0x0010, 0x2001, 0x0001, 0x080c, 0x4172, 0x0005, 0x080c, 0x254c,
++      0x781b, 0x0080, 0x0005, 0x781b, 0x0083, 0x0005, 0x2039, 0x0000,
++      0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7,
++      0x080c, 0x399c, 0x7e58, 0x080c, 0x3a4e, 0x781b, 0x0082, 0x0005,
++      0x0cd1, 0x6820, 0xc0c4, 0x6822, 0x00c6, 0x7054, 0x2060, 0x080c,
++      0x3921, 0x00b0, 0x0c81, 0x6820, 0xc0cc, 0x6822, 0x00c6, 0x7054,
++      0x2060, 0x080c, 0x39bb, 0x0060, 0x0c31, 0x6820, 0xa084, 0xecff,
++      0x6822, 0x00c6, 0x7054, 0x2060, 0x6004, 0xa084, 0xffc5, 0x6006,
++      0x00ce, 0x0005, 0x0049, 0x781b, 0x0082, 0x0005, 0x6827, 0x0002,
++      0x0049, 0x781b, 0x0082, 0x0005, 0x2001, 0x0005, 0x0088, 0x2001,
++      0x000c, 0x0070, 0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0040,
++      0x2001, 0x000d, 0x0028, 0x2001, 0x0009, 0x0010, 0x2001, 0x0007,
++      0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d0, 0xd0b4, 0x0168,
++      0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef,
++      0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x0005, 0x0076, 0x873f,
++      0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0, 0x4ac0, 0xae8e,
++      0x4640, 0x0110, 0xa0e0, 0x4b40, 0xa7b8, 0x0020, 0x7f9a, 0x79a4,
++      0xa184, 0x7fe0, 0x78ae, 0x6012, 0x79a4, 0xa184, 0x773f, 0x78a6,
++      0x6016, 0x6004, 0xa085, 0x0038, 0x6006, 0x007e, 0x0005, 0x789b,
++      0x0080, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa,
++      0x789b, 0x0060, 0x78ab, 0x0004, 0x0800, 0x2031, 0x0000, 0x2029,
++      0x0032, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++      0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x0804,
++      0x3a55, 0x0156, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080,
++      0x0020, 0x789a, 0x79a4, 0xa18c, 0xffe0, 0x2021, 0x3b54, 0x2019,
++      0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xffe0,
++      0xa106, 0x0128, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3abd, 0x015e,
++      0x0005, 0x0156, 0x04f8, 0x2021, 0x3b62, 0x20a9, 0x0009, 0x2011,
++      0x0029, 0xa582, 0x0028, 0x0550, 0x8420, 0x95a9, 0x2011, 0x0033,
++      0xa582, 0x0033, 0x0618, 0x8420, 0x95a9, 0x2019, 0x000a, 0x2011,
++      0x0065, 0x2200, 0xa502, 0x02d0, 0x8420, 0x2300, 0xa210, 0x1f04,
++      0x3ae1, 0x015e, 0x0088, 0x2021, 0x3b54, 0x2019, 0x0011, 0x20a9,
++      0x000e, 0x2011, 0x0033, 0x2200, 0xa502, 0x0240, 0x8420, 0x2300,
++      0xa210, 0x1f04, 0x3af3, 0x015e, 0xa006, 0x0005, 0x8211, 0x015e,
++      0xa582, 0x0064, 0x1220, 0x7808, 0xa085, 0x0070, 0x780a, 0x2404,
++      0xa005, 0x0005, 0xa886, 0x0002, 0x01e8, 0x2021, 0x3b40, 0x20a9,
++      0x000d, 0x2011, 0x0028, 0xa582, 0x0028, 0x0d48, 0x8420, 0x2019,
++      0x0019, 0x2011, 0x0033, 0x2200, 0xa502, 0x0e00, 0x8420, 0x2300,
++      0xa210, 0x1f04, 0x3b1b, 0x015e, 0x2011, 0x0184, 0xa582, 0x0185,
++      0x0ab0, 0x0890, 0x2021, 0x3b4f, 0x20a9, 0x0003, 0x2011, 0x0024,
++      0xa586, 0x0024, 0x0960, 0x8420, 0x2011, 0x0028, 0xa586, 0x0028,
++      0x0930, 0x8420, 0x2019, 0x0019, 0x2011, 0x0033, 0x0804, 0x3af3,
++      0x1021, 0x2202, 0x3403, 0x4604, 0x5805, 0x6a06, 0x7c07, 0x4610,
++      0x4612, 0x5812, 0x5a12, 0x6a14, 0x6c14, 0x6e14, 0x7e17, 0x9021,
++      0xb002, 0xe204, 0xe210, 0xe210, 0x1209, 0x3002, 0x3202, 0x4203,
++      0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07,
++      0x0c07, 0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06,
++      0x7c07, 0x7e07, 0x0e00, 0x789b, 0x0080, 0xa046, 0x0005, 0xa784,
++      0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003,
++      0xa105, 0xd7fc, 0x0118, 0xa0e0, 0x6bc0, 0x0010, 0xa0e0, 0x4bc0,
++      0x0005, 0x00e6, 0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009,
++      0x4680, 0x2071, 0x4680, 0x0030, 0x2009, 0x4640, 0x2079, 0x0200,
++      0x2071, 0x4640, 0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002,
++      0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba0, 0x3ba0,
++      0x080c, 0x254c, 0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005,
++      0x0580, 0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828,
++      0xa086, 0x1814, 0x1530, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004,
++      0x1de0, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x1de0, 0x7830,
++      0xd0bc, 0x11b8, 0xb284, 0x0800, 0x0118, 0x0104, 0x3bd9, 0x0010,
++      0x0304, 0x3bd9, 0x79e4, 0xa184, 0x0030, 0x0158, 0x78ec, 0xa084,
++      0x0003, 0x0138, 0x681c, 0xd0ac, 0x1110, 0x00d9, 0x0010, 0x781b,
++      0x00fb, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x4601, 0x2004, 0xd0ac,
++      0x1118, 0x6814, 0x080c, 0x2475, 0x0005, 0x781b, 0x0083, 0x0005,
++      0x781b, 0x0082, 0x0005, 0x781b, 0x0071, 0x0005, 0x781b, 0x006e,
++      0x0005, 0x2009, 0x4619, 0x210c, 0xa186, 0x0000, 0x0150, 0xa186,
++      0x0001, 0x0150, 0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054,
++      0x0005, 0x781b, 0x00f3, 0x0005, 0x701f, 0x000a, 0x0005, 0x2009,
++      0x4619, 0x210c, 0xa186, 0x0000, 0x0168, 0xa186, 0x0001, 0x0138,
++      0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054, 0x0005, 0x701f,
++      0x000a, 0x0005, 0x781b, 0x00f2, 0x0005, 0x781b, 0x00fb, 0x0005,
++      0x781b, 0x00fa, 0x0005, 0x781b, 0x00cc, 0x0005, 0x781b, 0x00cb,
++      0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x7063, 0x0001,
++      0x781b, 0x0054, 0x0005, 0x7830, 0xa084, 0x00c0, 0x1170, 0x7808,
++      0xc08c, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084,
++      0x0021, 0x0118, 0x7808, 0xc08d, 0x780a, 0x0005, 0x7808, 0xc08d,
++      0x780a, 0x0005, 0x7830, 0xa084, 0x0040, 0x1de0, 0xb284, 0x0800,
++      0x0118, 0x1104, 0x3c58, 0x0010, 0x1304, 0x3c58, 0x78ac, 0x0005,
++      0x7808, 0xa084, 0xfffd, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000,
++      0x78ec, 0xa084, 0x0021, 0x0140, 0xb284, 0x0800, 0x0118, 0x1104,
++      0x3c67, 0x0010, 0x1304, 0x3c6a, 0x78ac, 0x0006, 0x7808, 0xa085,
++      0x0002, 0x780a, 0x000e, 0x0005, 0xa784, 0x0001, 0x1904, 0x322a,
++      0xa784, 0x0070, 0x0140, 0x00c6, 0x2d60, 0x2f68, 0x080c, 0x2467,
++      0x2d78, 0x2c68, 0x00ce, 0xa784, 0x0008, 0x0148, 0x784b, 0x0008,
++      0x78ec, 0xa084, 0x0003, 0x0904, 0x322a, 0x0804, 0x3be5, 0xa784,
++      0x0004, 0x01c8, 0x78b8, 0xa084, 0x8000, 0x01a8, 0x784b, 0x0008,
++      0x78ec, 0xa084, 0x0003, 0x0904, 0x322a, 0x78e4, 0xa084, 0x0007,
++      0xa086, 0x0001, 0x1140, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a,
++      0x781b, 0x00fb, 0x0005, 0xa784, 0x0080, 0x0140, 0x7884, 0xd0fc,
++      0x0128, 0x080c, 0x3a32, 0x681b, 0x0022, 0x0005, 0x681b, 0x0003,
++      0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000,
++      0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x2b89, 0xb284,
++      0x0800, 0x0110, 0x0104, 0x259d, 0x0304, 0x259d, 0x6b14, 0x8307,
++      0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xd3fc, 0x0118, 0xa080,
++      0x4b40, 0x0010, 0xa080, 0x4ac0, 0x2060, 0x2048, 0x7056, 0x2a60,
++      0x0005, 0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, 0x3d2f, 0x68a0,
++      0xd1ac, 0x1120, 0xa084, 0x0e00, 0x0904, 0x3d2d, 0x6108, 0x8117,
++      0xa18c, 0x00ff, 0x631c, 0x832f, 0xd0dc, 0x0110, 0xa39d, 0x0001,
++      0xd0cc, 0x11c8, 0xa584, 0x00ff, 0x0138, 0x78ec, 0xd0e4, 0x0110,
++      0x8213, 0x00b8, 0x2029, 0x0000, 0xa182, 0x000c, 0x1290, 0x78ec,
++      0xd0e4, 0x1118, 0x2009, 0x000c, 0x0060, 0xa182, 0x000b, 0x1248,
++      0x2009, 0x000a, 0x0030, 0x2009, 0x0032, 0x2011, 0x0000, 0x2029,
++      0x0000, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x79aa,
++      0x78ab, 0x0000, 0x7aaa, 0x7baa, 0x7daa, 0xa8c0, 0x0008, 0x6820,
++      0xa085, 0x1000, 0x6822, 0x080c, 0x3a55, 0xa085, 0x0001, 0x00ce,
++      0x0005, 0xa282, 0x0006, 0x1904, 0x3a24, 0x7da8, 0x7eac, 0x8637,
++      0xa5ac, 0x00ff, 0xa6b4, 0x00ff, 0x7fac, 0x8747, 0xa7bc, 0x00ff,
++      0xa8c4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, 0x0904, 0x3da3,
++      0xa18c, 0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x39fe, 0xa6b4,
++      0x00ff, 0x0904, 0x3da0, 0xa682, 0x0031, 0x1a04, 0x39fe, 0xa582,
++      0x0009, 0x0a04, 0x39fe, 0xa882, 0x0003, 0x1a04, 0x39fe, 0xa886,
++      0x0002, 0x01d0, 0xa886, 0x0000, 0x1904, 0x39fe, 0x2001, 0x000c,
++      0x79ec, 0xd1e4, 0x0110, 0x2001, 0x000a, 0xa502, 0x1290, 0x080c,
++      0x39fe, 0x00c6, 0x2960, 0x6004, 0xa085, 0x001a, 0x6006, 0x6000,
++      0xc0ac, 0x6002, 0x00ce, 0x0005, 0xa786, 0x0000, 0x0904, 0x39fe,
++      0x8634, 0xa682, 0x0018, 0x0228, 0x0120, 0x2031, 0x0018, 0x0804,
++      0x3df1, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x080c,
++      0x3ac9, 0x0904, 0x39fe, 0x080c, 0x38f7, 0x080c, 0x399c, 0x7e58,
++      0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005,
++      0x080c, 0x38f4, 0x0c90, 0xa886, 0x0002, 0x1108, 0x8634, 0x7154,
++      0xa188, 0x0000, 0x210c, 0xd1ac, 0x0904, 0x39fe, 0xd1ec, 0x1120,
++      0x2039, 0x0000, 0x2041, 0x0000, 0xd1e4, 0x1120, 0x2031, 0x0000,
++      0x2041, 0x0000, 0xa782, 0x0002, 0x12c8, 0x621c, 0xa284, 0x00ff,
++      0xa706, 0x0110, 0x2039, 0x0000, 0xa605, 0x0190, 0x6108, 0x811f,
++      0xa39c, 0x00ff, 0x0168, 0xa302, 0x1208, 0x2330, 0x8807, 0xa705,
++      0xa086, 0x0201, 0x0160, 0xa886, 0x0000, 0x0168, 0x2039, 0x0000,
++      0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x0070, 0xa284,
++      0xff00, 0x1108, 0x2040, 0xa184, 0x00ff, 0xa502, 0x0108, 0x2128,
++      0x852b, 0x852b, 0x080c, 0x3ac9, 0x0d58, 0x080c, 0x38f7, 0x080c,
++      0x399c, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab,
++      0x0004, 0x7daa, 0x78ab, 0x0000, 0x7eaa, 0x7faa, 0x2800, 0x78aa,
++      0x789b, 0x0060, 0x78ab, 0x0008, 0x6820, 0xc0e5, 0x6822, 0x080c,
++      0x3a55, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x0020,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000,
++      0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9855, 0x984d, 0x0014,
++      0x9911, 0x98ff, 0x0014, 0x0014, 0x0090, 0x00e7, 0x0100, 0x0402,
++      0x2008, 0xf880, 0x0018, 0x0017, 0x840f, 0xd8c1, 0x0014, 0x0016,
++      0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0x2500, 0x0013, 0x2500,
++      0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010,
++      0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0xa200, 0x3806,
++      0x8839, 0x20c4, 0x0864, 0xa850, 0x3008, 0x28c1, 0x9d18, 0xa201,
++      0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a,
++      0xa808, 0x28e2, 0x9cce, 0xa8f3, 0x0864, 0xa83e, 0x300c, 0xa801,
++      0x3008, 0x28e1, 0x9cce, 0x28a2, 0x7163, 0xa831, 0x2021, 0xa818,
++      0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0, 0x6fc0, 0x67a4, 0x6c80,
++      0x0212, 0xa205, 0x883d, 0x882b, 0x1814, 0x883b, 0x7027, 0x85f2,
++      0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa813, 0x883e, 0xa811,
++      0x2882, 0x7162, 0xa814, 0x280a, 0xa204, 0x64c0, 0x6de0, 0x67a0,
++      0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576, 0x8677, 0xa802, 0x7861,
++      0x883e, 0x206a, 0x28c1, 0x9d18, 0x2042, 0x2101, 0xa8ca, 0x2902,
++      0xa20e, 0xa80b, 0xa207, 0x0014, 0xa203, 0x8000, 0x85a4, 0x1872,
++      0x879a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e, 0x7121, 0x0014,
++      0x0704, 0x3008, 0x9cce, 0x0014, 0xa202, 0x8000, 0x85a4, 0x3009,
++      0x84a8, 0x19e2, 0xf844, 0x856e, 0x883f, 0x08e6, 0xa8f5, 0xf861,
++      0xa8eb, 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532,
++      0xfaa2, 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8,
++      0xd6e0, 0x1fe6, 0x0014, 0x3008, 0x8000, 0x2849, 0x1011, 0xa8fc,
++      0x3008, 0x8000, 0xa000, 0x2081, 0x2802, 0x1011, 0xa8fc, 0xa889,
++      0x3008, 0x20a1, 0x283c, 0x1011, 0xa8fc, 0xa209, 0x0017, 0x300c,
++      0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0x0210, 0xa801, 0x0014,
++      0x26e0, 0x873a, 0xfaa3, 0x19f2, 0x26e0, 0x18f2, 0x0014, 0xa20b,
++      0x0014, 0xa20d, 0x3806, 0x0210, 0x9d22, 0x0704, 0xa206, 0x6865,
++      0x817e, 0x842a, 0x1dc1, 0x8823, 0x0016, 0x6042, 0x8008, 0xa8fa,
++      0x8160, 0x842a, 0x8180, 0xf021, 0x3008, 0x84a8, 0x11d7, 0x7042,
++      0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x0000, 0x0126, 0x70d0,
++      0xa084, 0x4c00, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205,
++      0x11a0, 0x720c, 0x82ff, 0x0128, 0x8aff, 0x1178, 0x7200, 0xd284,
++      0x1160, 0x7804, 0xd0cc, 0x0110, 0x080c, 0x4328, 0x7007, 0x0008,
++      0x7003, 0x0008, 0x012e, 0x2000, 0x0005, 0x7000, 0xa084, 0x0003,
++      0x7002, 0xc69c, 0xd084, 0x0588, 0x7108, 0xe000, 0x7008, 0xa106,
++      0x1dd8, 0xa184, 0x0003, 0x0904, 0x3fa2, 0xa184, 0x01e0, 0x1904,
++      0x3fa2, 0xd1f4, 0x1d88, 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60,
++      0x2011, 0x0180, 0x710c, 0x8211, 0x0130, 0x7008, 0xd0f4, 0x1d20,
++      0x700c, 0xa106, 0x0dc0, 0x7007, 0x0012, 0x7108, 0xe000, 0x7008,
++      0xa106, 0x1dd8, 0xa184, 0x0003, 0x0568, 0xd194, 0x0db0, 0xd1f4,
++      0x0548, 0x7007, 0x0002, 0x0880, 0x0428, 0x7108, 0xd1fc, 0x0130,
++      0x080c, 0x40ae, 0x8aff, 0x0904, 0x3f2c, 0x0cb8, 0x700c, 0xa08c,
++      0x07ff, 0x01e8, 0x7004, 0xd084, 0x0178, 0x7014, 0xa005, 0x1148,
++      0x7010, 0x7310, 0xa306, 0x1de0, 0x2300, 0xa005, 0x0128, 0xa102,
++      0x1e20, 0x7007, 0x0010, 0x0030, 0x8aff, 0x0148, 0x080c, 0x426b,
++      0x1de8, 0x09d8, 0x080c, 0x4034, 0x012e, 0x2000, 0x0005, 0x7204,
++      0x7108, 0xc19c, 0x8103, 0x1218, 0x7007, 0x0002, 0x0cc0, 0xa205,
++      0x1d88, 0x7007, 0x0008, 0x7003, 0x0008, 0x0006, 0x2001, 0x4601,
++      0x2004, 0xd0cc, 0x0110, 0x080c, 0x4328, 0x000e, 0x012e, 0x2000,
++      0x0005, 0x6428, 0x84ff, 0x0508, 0x2c70, 0x7004, 0xa0bc, 0x000f,
++      0xa7b8, 0x3ff5, 0x273c, 0x87fb, 0x1148, 0x0210, 0x080c, 0x254c,
++      0x609c, 0xa075, 0x0190, 0x0c88, 0x2039, 0x3fea, 0x2704, 0xae68,
++      0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0138, 0x8738, 0x2704,
++      0xa005, 0x1da8, 0x709c, 0xa075, 0x1d00, 0x0005, 0x0000, 0x0005,
++      0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003,
++      0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x3fea, 0x3fe7,
++      0x0000, 0x0000, 0x8000, 0x0000, 0x3fea, 0x0000, 0x3ff2, 0x3fef,
++      0x0000, 0x0000, 0x0000, 0x0000, 0x3ff2, 0x0000, 0x3fed, 0x3fed,
++      0x0000, 0x0000, 0x8000, 0x0000, 0x3fed, 0x0000, 0x3ff3, 0x3ff3,
++      0x0000, 0x0000, 0x0000, 0x0000, 0x3ff3, 0x2079, 0x4600, 0x2071,
++      0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001, 0x2009,
++      0x0002, 0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003,
++      0x0000, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1128, 0x8109, 0x0118,
++      0x2071, 0x0020, 0x0c80, 0x0005, 0x7004, 0x8004, 0x1a04, 0x408a,
++      0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c,
++      0x40e6, 0x0804, 0x40aa, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108,
++      0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c, 0x40e6,
++      0x0804, 0x40aa, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0190, 0xa386,
++      0x0008, 0x01c0, 0x7004, 0xd084, 0x1148, 0x7108, 0x7008, 0xa106,
++      0x1de0, 0xa184, 0x0003, 0x0110, 0x0804, 0x40e6, 0xa386, 0x200c,
++      0x19f0, 0x7200, 0x8204, 0x0230, 0x730c, 0xa384, 0x07ff, 0x0110,
++      0x080c, 0x254c, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
++      0x0118, 0x080c, 0x40e6, 0x0470, 0x7007, 0x0012, 0x7000, 0xd084,
++      0x1148, 0x7310, 0x7014, 0xa305, 0x0128, 0x710c, 0xa184, 0x07ff,
++      0x1904, 0x4034, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
++      0x0118, 0x080c, 0x40e6, 0x00b0, 0x7007, 0x0012, 0x7007, 0x0008,
++      0x7004, 0xd09c, 0x1de8, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184,
++      0x01e0, 0x0118, 0x080c, 0x40e6, 0x0028, 0x7007, 0x0012, 0x7108,
++      0x8103, 0x0e88, 0x7003, 0x0008, 0x0005, 0x7108, 0xa184, 0x01e0,
++      0x15a8, 0x7108, 0xa184, 0x01e0, 0x1588, 0xa184, 0x0007, 0x0002,
++      0x40c2, 0x40d0, 0x40c0, 0x40d0, 0x40c0, 0x4120, 0x40c0, 0x411e,
++      0x080c, 0x254c, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff,
++      0x1118, 0x2049, 0x0000, 0x0005, 0x080c, 0x426b, 0x1de8, 0x0005,
++      0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x1140,
++      0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0108, 0x0030,
++      0x8aff, 0x0118, 0x080c, 0x426b, 0x1de8, 0x0005, 0x7007, 0x0012,
++      0x7108, 0x1d04, 0x40e9, 0x2091, 0x6000, 0x1d04, 0x40ed, 0x2091,
++      0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8,
++      0x7007, 0x0012, 0x7108, 0xd1fc, 0x1dd8, 0x7003, 0x0000, 0x7000,
++      0xa005, 0x1130, 0x7004, 0xa005, 0x1118, 0x700c, 0xa005, 0x0108,
++      0x0c40, 0x2049, 0x0000, 0xb284, 0x0200, 0x0118, 0x2001, 0x0000,
++      0x0010, 0x2001, 0x0001, 0x080c, 0x3b81, 0x681b, 0x0002, 0x2051,
++      0x0000, 0x0005, 0x080c, 0x254c, 0x080c, 0x254c, 0x080c, 0x415f,
++      0x7210, 0x7114, 0x700c, 0xa09c, 0x07ff, 0x2800, 0xa300, 0xa211,
++      0xa189, 0x0000, 0x04a1, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200,
++      0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0140, 0x1238,
++      0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0c58, 0x2b60,
++      0x8a07, 0x0006, 0x6004, 0xd09c, 0x0118, 0xa7ba, 0x3fef, 0x0010,
++      0xa7ba, 0x3fe7, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92,
++      0x6b8e, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0110,
++      0x080c, 0x40e6, 0x7007, 0x0012, 0x080c, 0x4034, 0x0005, 0x8a50,
++      0x8739, 0x2704, 0xa004, 0x1168, 0x6000, 0xa064, 0x1108, 0x2d60,
++      0x6004, 0xa084, 0x000f, 0xa080, 0x4005, 0x203c, 0x87fb, 0x090c,
++      0x254c, 0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004,
++      0x2090, 0x00de, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057,
++      0xaad4, 0x00ff, 0xa084, 0x00ff, 0x0006, 0x6804, 0xa084, 0x0008,
++      0x000e, 0x0118, 0xa0b8, 0x3fef, 0x0010, 0xa0b8, 0x3fe7, 0xb284,
++      0x0200, 0x0110, 0x7e20, 0x0008, 0x7e24, 0xa6b5, 0x000c, 0x681c,
++      0xd0b4, 0x0108, 0xc685, 0x2400, 0xa305, 0x0518, 0x2c58, 0x2704,
++      0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e,
++      0xd19c, 0x0140, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081,
++      0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300,
++      0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x080c, 0x4292,
++      0x0010, 0x080c, 0x426b, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126,
++      0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x7007,
++      0x0004, 0x7004, 0xd094, 0x1de8, 0x7003, 0x0008, 0x012e, 0x2000,
++      0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090,
++      0x00de, 0x7e20, 0xb284, 0x0200, 0x1108, 0x7e24, 0xa6b5, 0x000c,
++      0x681c, 0xd0ac, 0x1118, 0xc685, 0x7003, 0x0000, 0x6828, 0x2050,
++      0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x3ff5, 0x273c, 0x87fb,
++      0x1138, 0x0210, 0x080c, 0x254c, 0x689c, 0xa065, 0x0120, 0x0c88,
++      0x080c, 0x426b, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x0006,
++      0x0016, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x7e20,
++      0xb284, 0x0200, 0x1108, 0x7e24, 0x00de, 0x003e, 0x004e, 0xa6b5,
++      0x000c, 0x681c, 0xd0b4, 0x0128, 0xc685, 0x7003, 0x0000, 0x7007,
++      0x0004, 0x2049, 0x4206, 0x6828, 0xa055, 0x00d6, 0x0904, 0x4267,
++      0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3ff5, 0x273c,
++      0x87fb, 0x1140, 0x0210, 0x080c, 0x254c, 0x709c, 0xa075, 0x2060,
++      0x0570, 0x0c80, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b,
++      0x0268, 0x8a51, 0x1110, 0x080c, 0x254c, 0x8738, 0x2704, 0xa005,
++      0x1d90, 0x709c, 0xa075, 0x2060, 0x01d0, 0x08e0, 0x8422, 0x8420,
++      0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
++      0xa11b, 0x1210, 0x080c, 0x254c, 0xb284, 0x0200, 0x0118, 0x2071,
++      0x0050, 0x0010, 0x2071, 0x0020, 0x00de, 0x0804, 0x419b, 0x00de,
++      0x012e, 0x2000, 0x0005, 0x7008, 0x0006, 0xa084, 0x01e0, 0x000e,
++      0x0110, 0xa006, 0x0005, 0xa084, 0x0003, 0xa086, 0x0003, 0x1108,
++      0x0005, 0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e, 0x7808,
++      0x7012, 0x780c, 0x7016, 0x6004, 0xd09c, 0x0120, 0x7810, 0x7022,
++      0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085, 0x7006,
++      0x2079, 0x4600, 0x8a51, 0x01e8, 0x8738, 0x2704, 0xa005, 0x1168,
++      0x609c, 0xa005, 0x01b8, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080,
++      0x3ff5, 0x203c, 0x87fb, 0x090c, 0x254c, 0x7008, 0x0006, 0xa084,
++      0x01e0, 0x000e, 0x0110, 0xa006, 0x0028, 0xa084, 0x0003, 0xa086,
++      0x0003, 0x0005, 0x2051, 0x0000, 0x0005, 0x0126, 0x0006, 0x00d6,
++      0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x008e, 0x7108,
++      0xa184, 0x0003, 0x1128, 0x6828, 0xa005, 0x0178, 0x0804, 0x3f45,
++      0x7108, 0xd1fc, 0x0118, 0x080c, 0x40ae, 0x0c88, 0x7007, 0x0010,
++      0x7108, 0xd1fc, 0x0de8, 0x080c, 0x40ae, 0x7008, 0xa086, 0x0008,
++      0x1d30, 0x7000, 0xa005, 0x1d18, 0x7003, 0x0000, 0x2049, 0x0000,
++      0x0006, 0x2001, 0x4601, 0x2004, 0xd0cc, 0x0110, 0x080c, 0x4328,
++      0x000e, 0x012e, 0x2000, 0x0005, 0x0126, 0x0146, 0x0136, 0x0156,
++      0x00c6, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de,
++      0x2049, 0x42ec, 0xad80, 0x0011, 0x20a0, 0xb284, 0x0200, 0x0118,
++      0x2099, 0x0032, 0x0010, 0x2099, 0x0031, 0x700c, 0xa084, 0x07ff,
++      0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0118,
++      0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x07ff, 0x0130, 0x7007,
++      0x0004, 0x7004, 0xa084, 0x0004, 0x1de0, 0x00ce, 0x2049, 0x0000,
++      0x7003, 0x0000, 0x015e, 0x013e, 0x014e, 0x012e, 0x2000, 0x0005,
++      0x6814, 0xd0fc, 0x0904, 0x436b, 0x7000, 0xd084, 0x05e0, 0x7e24,
++      0xa6b5, 0x0004, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x1de0,
++      0x7118, 0x0016, 0x711c, 0x0016, 0x7120, 0x0016, 0x7124, 0x0016,
++      0x701b, 0x0000, 0x701f, 0x3fff, 0x7023, 0x0000, 0x7027, 0x0000,
++      0x7013, 0x0004, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x2001,
++      0xffff, 0x2009, 0x0031, 0x200a, 0x200a, 0x7108, 0x7008, 0xa106,
++      0x1de0, 0xd1fc, 0x0dd0, 0x002e, 0x7226, 0x002e, 0x7222, 0x002e,
++      0x721e, 0x002e, 0x721a, 0x7007, 0x0002, 0x7008, 0xa086, 0x0008,
++      0x0110, 0x0804, 0x40e6, 0x7007, 0x0004, 0x7003, 0x0000, 0x0005,
++      0x2091, 0x8000, 0x2091, 0x6000, 0x78ac, 0xa005, 0x1168, 0x7974,
++      0x70d0, 0xa106, 0x1148, 0x781c, 0xa005, 0x0130, 0x781f, 0x0000,
++      0x0e04, 0x4384, 0x2091, 0x4080, 0x2069, 0x4680, 0xd7fc, 0x1110,
++      0x2069, 0x4640, 0x6800, 0xa084, 0x000f, 0x1198, 0x68d0, 0xd0b4,
++      0x0180, 0xd0bc, 0x1170, 0x00f6, 0x2079, 0x0100, 0xd7fc, 0x1110,
++      0x2079, 0x0200, 0x7830, 0xa084, 0x00c0, 0x1110, 0x080c, 0x22ae,
++      0x00fe, 0x7830, 0x8001, 0x7832, 0x1904, 0x440b, 0x7834, 0x7832,
++      0x2061, 0x6bc0, 0x2069, 0x4680, 0xc7fd, 0x68cc, 0xa005, 0x0128,
++      0x8001, 0x68ce, 0x1110, 0x080c, 0x4577, 0x6800, 0xa084, 0x000f,
++      0x0168, 0xa086, 0x0001, 0x0150, 0x6840, 0xa00d, 0x0138, 0x2104,
++      0xa005, 0x0120, 0x8001, 0x200a, 0x0904, 0x4514, 0x6814, 0xa005,
++      0x01a8, 0x8001, 0x6816, 0x1190, 0x68a3, 0x0001, 0x00f6, 0xd7fc,
++      0x1118, 0x2079, 0x0200, 0x0010, 0x2079, 0x0100, 0x080c, 0x3c46,
++      0x00fe, 0x6860, 0xa005, 0x0110, 0x080c, 0x22ae, 0x687c, 0xa005,
++      0x0140, 0x8001, 0x687e, 0x1128, 0x6863, 0x0000, 0x68d0, 0xc0c5,
++      0x68d2, 0x68d0, 0xd0fc, 0x01b0, 0xc0fc, 0x68d2, 0x20a9, 0x0200,
++      0x6034, 0xa005, 0x0158, 0x8001, 0x6036, 0x68d0, 0xc0fd, 0x68d2,
++      0x1128, 0x6010, 0xa005, 0x0110, 0x080c, 0x22ae, 0xace0, 0x0010,
++      0x1f04, 0x43f0, 0xd7fc, 0x0138, 0x2061, 0x4bc0, 0x2069, 0x4640,
++      0xc7fc, 0x0804, 0x43ad, 0x0459, 0x7838, 0x8001, 0x783a, 0x11a0,
++      0x783c, 0x783a, 0x2061, 0x4bc0, 0x2069, 0x4640, 0xc7fc, 0x680c,
++      0xa005, 0x0110, 0x080c, 0x4487, 0xd7fc, 0x1130, 0x2061, 0x6bc0,
++      0x2069, 0x4680, 0xc7fd, 0x0c98, 0x7810, 0xd0cc, 0x0168, 0xd0ac,
++      0x1120, 0xd0a4, 0x0148, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0e04,
++      0x4433, 0x080c, 0x207a, 0x0005, 0x2091, 0x8001, 0x0005, 0x7840,
++      0x8001, 0x7842, 0x1904, 0x4486, 0x7844, 0x7842, 0x2069, 0x4640,
++      0xc7fc, 0x2079, 0x0200, 0x68d4, 0xa005, 0x0138, 0x7de0, 0xa504,
++      0x1120, 0x68d6, 0x68d0, 0xc0bc, 0x68d2, 0x2079, 0x4600, 0x6810,
++      0xa005, 0x1110, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0118,
++      0xa080, 0x8cd0, 0x0010, 0xa080, 0x8bc0, 0x2040, 0x2004, 0xa065,
++      0x01e0, 0x6024, 0xa005, 0x01b0, 0x8001, 0x6026, 0x1198, 0x6800,
++      0xa005, 0x0130, 0x6848, 0xac06, 0x1118, 0x080c, 0x4514, 0x0068,
++      0x6860, 0xa005, 0x0118, 0x6027, 0x0001, 0x0020, 0x080c, 0x44c8,
++      0x2804, 0x0c28, 0x6000, 0x2c40, 0x0c10, 0xd7fc, 0x1138, 0x2069,
++      0x4680, 0xc7fd, 0x2079, 0x0100, 0x0804, 0x4443, 0x0005, 0x2009,
++      0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0558, 0x6024, 0xa005,
++      0x0118, 0x8001, 0x6026, 0x0418, 0x6008, 0xc09c, 0xd084, 0x1110,
++      0xd0ac, 0x01c0, 0x600a, 0x6004, 0xa005, 0x01d8, 0x00d6, 0x00c6,
++      0x0016, 0x2068, 0x6010, 0x8001, 0x6012, 0x080c, 0x37a4, 0x2d00,
++      0x2c68, 0x2060, 0x080c, 0x1be3, 0x080c, 0x1d95, 0x001e, 0x00ce,
++      0x00de, 0x0038, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0010, 0xa18d,
++      0x0100, 0xace0, 0x0010, 0x1f04, 0x448b, 0xa184, 0x0001, 0x0130,
++      0xa18c, 0xfffe, 0x690e, 0x080c, 0x22ae, 0x0008, 0x690e, 0x0005,
++      0x2c00, 0x687a, 0x6714, 0x6f72, 0x6017, 0x0000, 0x602b, 0x0000,
++      0x601b, 0x0006, 0x60b4, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084,
++      0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6858, 0xac06,
++      0x1110, 0x2800, 0x685a, 0x080c, 0x1b7b, 0x6818, 0xa005, 0x0110,
++      0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, 0x7908, 0x8109,
++      0x790a, 0x8001, 0x1310, 0x080c, 0x254c, 0x6812, 0x1118, 0x7910,
++      0xc1a5, 0x7912, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x080c,
++      0x1da2, 0xd7fc, 0x1118, 0x2069, 0x4640, 0x0010, 0x2069, 0x4680,
++      0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x1118, 0x6976, 0x2001,
++      0x0004, 0x080c, 0x22a4, 0x0005, 0x00d6, 0x6948, 0x2160, 0xd7fc,
++      0x1118, 0x2069, 0x0200, 0x0010, 0x2069, 0x0100, 0x080c, 0x2467,
++      0x601b, 0x0006, 0x6858, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084,
++      0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000,
++      0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b,
++      0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x453b,
++      0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04,
++      0x4544, 0x20a9, 0x00fa, 0x1f04, 0x454b, 0x681b, 0x0054, 0x00de,
++      0x6863, 0x0007, 0x0005, 0x2079, 0x4600, 0x00e1, 0x0089, 0x00a9,
++      0x2009, 0x0002, 0x2069, 0x4680, 0x680f, 0x0000, 0x6813, 0x0000,
++      0x6817, 0x0000, 0x8109, 0x0118, 0x2069, 0x4640, 0x0ca8, 0x0005,
++      0x2019, 0x00a3, 0x7b3a, 0x7b3e, 0x0005, 0x2019, 0x0033, 0x7b42,
++      0x7b46, 0x0005, 0x2019, 0x32dd, 0x7b32, 0x7b36, 0x0005, 0x6a4c,
++      0xa285, 0x0000, 0x01f0, 0x6950, 0x6bbc, 0xa300, 0x00c6, 0x2164,
++      0x6304, 0x83ff, 0x1138, 0x8211, 0x0148, 0x8108, 0xa11a, 0x0eb8,
++      0x69bc, 0x0ca8, 0x68cf, 0x000a, 0x00ce, 0x0005, 0x694c, 0x6abc,
++      0x2264, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109, 0x1dc8, 0x694e,
++      0x00ce, 0x0005, 0x1d04, 0x459a, 0x2091, 0x6000, 0x1d04, 0x459e,
++      0x2091, 0x6000, 0x70ec, 0xd0dc, 0x1118, 0xd0d4, 0x0190, 0x0098,
++      0xae8e, 0x0100, 0x0138, 0x7814, 0xc0f5, 0xc0c5, 0x7816, 0xd0d4,
++      0x1578, 0x0458, 0x7814, 0xc0fd, 0xc0c5, 0x7816, 0xd0d4, 0x1540,
++      0x0420, 0xd0e4, 0x0538, 0x1d04, 0x45bb, 0x2091, 0x6000, 0x2009,
++      0x000c, 0x1d04, 0x45c1, 0x2091, 0x6000, 0x8109, 0x1dd0, 0x70e4,
++      0xa084, 0x01ff, 0xa086, 0x01ff, 0x1110, 0x70ec, 0x08c8, 0xae8e,
++      0x0100, 0x0128, 0x7814, 0xc0f4, 0xd0fc, 0x1130, 0x0020, 0x7814,
++      0xc0fc, 0xd0f4, 0x1108, 0xc0c4, 0x7816, 0x7804, 0xd08c, 0x0110,
++      0x681f, 0x000c, 0x70a0, 0x70a2, 0x0005, 0x7c12
++};
++#else
++/*
++ *    Firmware Version 11.12.01 (12:37 May 24, 2000)
++ */
++static const u_int16_t isp_12160_risc_code[] = {
++      0x0804, 0x103a, 0x0000, 0x4bd8, 0x0000, 0x2043, 0x4f50, 0x5952,
++      0x4947, 0x4854, 0x2031, 0x3939, 0x3520, 0x514c, 0x4f47, 0x4943,
++      0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++      0x3132, 0x3430, 0x2049, 0x2f54, 0x2046, 0x6972, 0x6d77, 0x6172,
++      0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2031, 0x312e, 0x3132,
++      0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20,
++      0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020,
++      0x3031, 0x2024, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x1120, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1,
++      0x0020, 0x2089, 0x128f, 0x0030, 0x2001, 0x04fc, 0x2004, 0xa086,
++      0x1216, 0x0d40, 0x2071, 0x0010, 0x70c3, 0x0004, 0x70c7, 0x4953,
++      0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x000b, 0x2001, 0x04fd,
++      0x70d6, 0x20c1, 0x0022, 0x20c9, 0x10ff, 0x2009, 0xfeff, 0x200b,
++      0xa5a5, 0xe000, 0xe000, 0x2114, 0xa286, 0xa5a5, 0x0120, 0x20c1,
++      0x0020, 0x20c9, 0x5cff, 0x2009, 0x0200, 0xa18e, 0x0400, 0x1168,
++      0x3808, 0xa18e, 0x0020, 0x1148, 0x70c3, 0x8010, 0x2061, 0x0000,
++      0x601b, 0x0001, 0x2091, 0x4080, 0x0cf8, 0x2009, 0xfeff, 0x2130,
++      0x2128, 0x3800, 0xa084, 0x0003, 0x0006, 0x0118, 0xa1a2, 0x1100,
++      0x0010, 0xa1a2, 0x5cff, 0x000e, 0x8424, 0x8424, 0x8424, 0x8424,
++      0x8424, 0x8424, 0x2009, 0xb33f, 0xa005, 0x0128, 0x2079, 0x1100,
++      0xa192, 0x1100, 0x0020, 0x2079, 0x5d00, 0xa192, 0x5d00, 0x2009,
++      0x0000, 0x2001, 0x0037, 0x080c, 0x20ea, 0x2218, 0x2fa0, 0x2408,
++      0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x1dd8, 0x2079,
++      0xb340, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1280, 0x11e8, 0x780c,
++      0xc0ed, 0xc0d5, 0x780e, 0x7813, 0x0064, 0x2071, 0x0200, 0x00d6,
++      0x2069, 0xb380, 0x080c, 0x59b8, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++      0x1130, 0x2069, 0xb3c0, 0x2071, 0x0100, 0x080c, 0x59b8, 0x780c,
++      0xc0d4, 0x780e, 0x00de, 0x0090, 0x2001, 0x04fc, 0x2004, 0xa086,
++      0x1216, 0x1128, 0x7813, 0x0064, 0x780c, 0xc0cd, 0x08c8, 0x780c,
++      0xc0e5, 0x780e, 0x7813, 0x003c, 0x2011, 0x000c, 0x2009, 0xb38c,
++      0x220a, 0x2009, 0xb3cc, 0x220a, 0x7eca, 0x7cc2, 0x7bc6, 0x785b,
++      0x0000, 0x7800, 0xc08d, 0x7802, 0x2031, 0x0030, 0x78af, 0x0101,
++      0x781b, 0x0002, 0x781f, 0x0002, 0x2009, 0x0002, 0x2069, 0xb380,
++      0x6817, 0x0003, 0x681f, 0x0007, 0x6823, 0x00fa, 0x6827, 0x0008,
++      0x682b, 0x0028, 0x6837, 0x0006, 0x682f, 0x0008, 0x683b, 0x0000,
++      0x8109, 0x0508, 0x68ef, 0x000a, 0x68df, 0xb400, 0x2079, 0xb340,
++      0x780c, 0xd0e4, 0x1118, 0x68f3, 0x7629, 0x0010, 0x68f3, 0x760d,
++      0x68e3, 0xba00, 0x68e7, 0xb800, 0x68eb, 0xfa00, 0x68c7, 0xfece,
++      0x68cb, 0xfed3, 0x68cf, 0xfece, 0x68d3, 0xfece, 0x68c3, 0x0001,
++      0x2069, 0xb3c0, 0x0868, 0x68ef, 0x000a, 0x68df, 0xb600, 0x68f3,
++      0x7819, 0x68e3, 0xda00, 0x68e7, 0xb900, 0x68eb, 0xfb10, 0x68c7,
++      0xfed3, 0x68cb, 0xfed8, 0x68cf, 0xfed3, 0x68d3, 0xfed3, 0x68c3,
++      0x0001, 0x00e6, 0x2069, 0xb800, 0x2071, 0x0200, 0x70ec, 0xd0e4,
++      0x2019, 0x1c09, 0x2021, 0x0009, 0x1120, 0x2019, 0x1c0c, 0x2021,
++      0x000c, 0x080c, 0x200a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1188,
++      0x2069, 0xb900, 0x2071, 0x0100, 0x70ec, 0xd0e4, 0x2019, 0x1c09,
++      0x2021, 0x0009, 0x1120, 0x2019, 0x1c0c, 0x2021, 0x000c, 0x080c,
++      0x200a, 0x00ee, 0x2011, 0x0002, 0x2069, 0xba00, 0x2009, 0x0002,
++      0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bc8, 0xa386,
++      0xfeff, 0x1128, 0x6817, 0x0100, 0x681f, 0x0064, 0x0020, 0x6817,
++      0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x1f04, 0x1182, 0x8109,
++      0x1d38, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1128, 0x8211, 0x0118,
++      0x2069, 0xda00, 0x08d8, 0x080c, 0x2680, 0x080c, 0x53c4, 0x080c,
++      0x1caf, 0x080c, 0x595f, 0x2091, 0x2200, 0x2079, 0xb340, 0x7808,
++      0xd0ec, 0x0118, 0x2071, 0x0020, 0x0010, 0x2071, 0x0050, 0x2091,
++      0x2400, 0x2079, 0xb340, 0x2071, 0x0020, 0x2091, 0x2600, 0x2079,
++      0xb340, 0x7808, 0xd0ec, 0x0118, 0x2079, 0x0100, 0x0010, 0x2079,
++      0x0200, 0x2071, 0xb380, 0x2091, 0x2800, 0x2079, 0x0100, 0x2071,
++      0xb3c0, 0x2091, 0x2000, 0x2079, 0xb340, 0x2071, 0x0010, 0x3200,
++      0xa085, 0x303d, 0x2090, 0x70c3, 0x0000, 0x1004, 0x11e5, 0x70c0,
++      0xa086, 0x0002, 0x1110, 0x080c, 0x142c, 0x2039, 0x0000, 0x080c,
++      0x130a, 0x78ac, 0xa005, 0x11a0, 0x0e04, 0x11f5, 0x7864, 0xa065,
++      0x0120, 0x2029, 0x0000, 0x080c, 0x252c, 0x080c, 0x210b, 0x0e04,
++      0x120c, 0x7864, 0xa065, 0x0120, 0x2029, 0x0000, 0x080c, 0x252c,
++      0x0e04, 0x120c, 0x2009, 0xb386, 0x2011, 0xb3c6, 0x2104, 0x220c,
++      0xa105, 0x0110, 0x080c, 0x1dd0, 0x00e6, 0x00f6, 0x2071, 0xb380,
++      0x70c0, 0xa005, 0x01f8, 0x7454, 0xa485, 0x0000, 0x01d8, 0x2079,
++      0x0200, 0x2091, 0x8000, 0x72f0, 0xa28c, 0x303d, 0x2190, 0x080c,
++      0x2b7f, 0x2091, 0x8000, 0x2091, 0x303d, 0x0e04, 0x1232, 0x00fe,
++      0x7864, 0xa065, 0x0130, 0x00ee, 0x2029, 0x0000, 0x080c, 0x252c,
++      0x00e6, 0x00f6, 0x1d04, 0x123a, 0x00fe, 0x00ee, 0x080c, 0x577e,
++      0x00e6, 0x00f6, 0x2071, 0xb3c0, 0x70c0, 0xa005, 0x0190, 0x7454,
++      0xa485, 0x0000, 0x0170, 0x2079, 0x0100, 0x2091, 0x8000, 0x72f0,
++      0xa28c, 0x303d, 0x2190, 0x080c, 0x2b7f, 0x2091, 0x8000, 0x2091,
++      0x303d, 0x00fe, 0x00ee, 0x0e04, 0x125b, 0x7864, 0xa065, 0x0118,
++      0xa02e, 0x080c, 0x252c, 0x1d04, 0x11e7, 0x080c, 0x577e, 0x0804,
++      0x11e7, 0x3c00, 0xa084, 0x0007, 0x0002, 0x1275, 0x1275, 0x1277,
++      0x1277, 0x127c, 0x127c, 0x1281, 0x1281, 0x3c00, 0xa084, 0x0003,
++      0x0002, 0x1275, 0x1275, 0x128a, 0x128a, 0x080c, 0x297f, 0x2091,
++      0x2400, 0x080c, 0x547f, 0x0005, 0x2091, 0x2200, 0x080c, 0x547f,
++      0x0005, 0x2091, 0x2200, 0x080c, 0x547f, 0x2091, 0x2400, 0x080c,
++      0x547f, 0x0005, 0x2091, 0x2200, 0x080c, 0x547f, 0x0005, 0x12af,
++      0x12af, 0x12b0, 0x12b0, 0x12bb, 0x12bb, 0x12bb, 0x12bb, 0x12c4,
++      0x12c4, 0x12cf, 0x12cf, 0x12bb, 0x12bb, 0x12bb, 0x12bb, 0x12de,
++      0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de,
++      0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x12de, 0x0cf8,
++      0x0006, 0x0106, 0x0126, 0x2091, 0x2800, 0x080c, 0x299c, 0x012e,
++      0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126, 0x080c, 0x1261,
++      0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126, 0x2091,
++      0x2600, 0x080c, 0x299c, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006,
++      0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x299c, 0x2091, 0x2800,
++      0x080c, 0x299c, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106,
++      0x0126, 0x00d6, 0x00e6, 0x00f6, 0x2079, 0xb340, 0x2071, 0x0200,
++      0x2069, 0xb380, 0x3d00, 0xd08c, 0x0130, 0x70ec, 0xa084, 0x1c00,
++      0x78e2, 0x080c, 0x59b8, 0x3d00, 0xd084, 0x0150, 0x2069, 0xb3c0,
++      0x2071, 0x0100, 0x70ec, 0xa084, 0x1c00, 0x78e6, 0x080c, 0x59b8,
++      0x080c, 0x2930, 0x00fe, 0x00ee, 0x00de, 0x012e, 0x010e, 0x000e,
++      0x000d, 0x0005, 0x0e04, 0x1381, 0x2061, 0x0000, 0x6018, 0xa084,
++      0x0001, 0x1904, 0x1381, 0x7820, 0xa005, 0x1120, 0x0004, 0x1382,
++      0x0804, 0x1381, 0x7908, 0xd1f4, 0x0120, 0x2001, 0x4007, 0x0804,
++      0x142e, 0x790c, 0xd1ec, 0x01a0, 0xd0fc, 0x0148, 0x0006, 0x080c,
++      0x1c2f, 0x000e, 0x0168, 0x2001, 0x4007, 0x0804, 0x142e, 0x0006,
++      0x080c, 0x1c25, 0x000e, 0x0120, 0x2001, 0x4007, 0x0804, 0x142e,
++      0x7908, 0xd0fc, 0x1128, 0x2061, 0xb380, 0xc19c, 0xc7fc, 0x0020,
++      0x2061, 0xb3c0, 0xc19d, 0xc7fd, 0x6068, 0xa005, 0x15d0, 0x790a,
++      0x6087, 0x0000, 0x7820, 0xc0fc, 0xa086, 0x0018, 0x1120, 0x00c6,
++      0x080c, 0x196b, 0x00ce, 0x7823, 0x0000, 0x6080, 0xa065, 0x0190,
++      0x00c6, 0x609c, 0x080c, 0x1d24, 0x00ce, 0x609f, 0x0000, 0x080c,
++      0x1a81, 0x2009, 0x000c, 0x6007, 0x0103, 0x080c, 0x1c39, 0x1198,
++      0x080c, 0x1c95, 0x7808, 0xd09c, 0x1118, 0x2061, 0xb380, 0x0018,
++      0x2061, 0xb3c0, 0xc09c, 0x6083, 0x0000, 0x780a, 0x60f0, 0xd0c4,
++      0x0130, 0xc0c4, 0x60f2, 0x2001, 0x4005, 0x0804, 0x142e, 0x0804,
++      0x142c, 0x0005, 0x7808, 0xd0f4, 0x0120, 0x2001, 0x4007, 0x0804,
++      0x142e, 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf,
++      0x0000, 0x70db, 0x0000, 0x71c4, 0x7a08, 0xd2ec, 0x0108, 0xc1fc,
++      0x70c0, 0xa03d, 0xa092, 0x0030, 0x1208, 0x0032, 0x2200, 0xa092,
++      0x0050, 0x1a04, 0x143a, 0x0482, 0x142c, 0x14a7, 0x1448, 0x14bb,
++      0x14ca, 0x14d0, 0x1440, 0x1a99, 0x14d4, 0x143a, 0x144c, 0x144d,
++      0x144e, 0x144f, 0x1a9d, 0x143a, 0x14e1, 0x1532, 0x1988, 0x1a93,
++      0x1450, 0x17f5, 0x182e, 0x1863, 0x18a8, 0x17b0, 0x17be, 0x17d1,
++      0x17e4, 0x1600, 0x143a, 0x155f, 0x1563, 0x1571, 0x157f, 0x1596,
++      0x15a4, 0x15a7, 0x15b5, 0x15c3, 0x15cd, 0x15e6, 0x15f2, 0x143a,
++      0x143a, 0x143a, 0x143a, 0x160d, 0x1618, 0x1631, 0x1665, 0x168e,
++      0x16a0, 0x16a3, 0x16cd, 0x1705, 0x1717, 0x1784, 0x1794, 0x143a,
++      0x1475, 0x143a, 0x143a, 0x17a6, 0x143a, 0x143a, 0x143a, 0x143a,
++      0x143a, 0x1bc9, 0x1bcf, 0x143a, 0x143a, 0x143a, 0x1bd3, 0x1be2,
++      0x143a, 0x143a, 0x143a, 0x143a, 0x14a2, 0x14b6, 0x14dc, 0x152d,
++      0x1983, 0x1ab1, 0x1ad3, 0x1950, 0x1ae9, 0x1bf0, 0x1bbb, 0x1bc5,
++      0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a,
++      0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a,
++      0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a,
++      0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a, 0x143a,
++      0x143a, 0x143a, 0x143a, 0x143a, 0x72ca, 0x71c6, 0x2001, 0x4006,
++      0x0028, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0e04,
++      0x142f, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091,
++      0x4080, 0x0005, 0x70c3, 0x4001, 0x0c90, 0x70c3, 0x4006, 0x0c78,
++      0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0c20,
++      0x70c4, 0x70c3, 0x0004, 0x0807, 0x08f8, 0x08f0, 0x08e8, 0x08e0,
++      0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020,
++      0x70cf, 0x2020, 0x70d3, 0x000b, 0x2001, 0x000c, 0x70d6, 0x2079,
++      0x0000, 0x781b, 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029,
++      0x041a, 0x2051, 0x0445, 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091,
++      0x5000, 0x2091, 0x4080, 0x0804, 0x0418, 0x00d6, 0x70c4, 0x7904,
++      0xd19c, 0x0180, 0x70c7, 0x0001, 0x2069, 0xfed8, 0x2d14, 0x72ca,
++      0x8d68, 0x2d14, 0x72ce, 0x8d68, 0x2d14, 0x72da, 0x8d68, 0x2d14,
++      0x72de, 0x0010, 0x70c7, 0x0000, 0xa005, 0x0178, 0xc19d, 0x72c8,
++      0x2069, 0xfed8, 0x226a, 0x72cc, 0x8d68, 0x226a, 0x72d8, 0x8d68,
++      0x226a, 0x72dc, 0x8d68, 0x226a, 0x0008, 0xc19c, 0x7906, 0x00de,
++      0x0804, 0x142c, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0018, 0x2029,
++      0x0000, 0x2520, 0x71d0, 0x73c8, 0x72cc, 0x70c4, 0x080c, 0x1e1f,
++      0x0904, 0x142c, 0x70c3, 0x4002, 0x0804, 0x142c, 0x75d8, 0x74dc,
++      0x75da, 0x74de, 0x0018, 0x2029, 0x0000, 0x2520, 0x71d0, 0x73c8,
++      0x72cc, 0x70c4, 0x080c, 0x1e5e, 0x0904, 0x142c, 0x70c3, 0x4002,
++      0x0804, 0x142c, 0x71c4, 0x70c8, 0x2114, 0x200a, 0x0804, 0x142a,
++      0x71c4, 0x2114, 0x0804, 0x142a, 0x70c7, 0x000b, 0x70cb, 0x000c,
++      0x70cf, 0x0001, 0x0804, 0x142c, 0x75d8, 0x76dc, 0x75da, 0x76de,
++      0x0018, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0,
++      0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x05c8, 0xa40a, 0x0110,
++      0x1a04, 0x142e, 0x8001, 0x786a, 0xa084, 0xfc00, 0x0138, 0x78ac,
++      0xc085, 0x78ae, 0x2001, 0x4005, 0x0804, 0x142e, 0x7a72, 0x7b76,
++      0x7d7a, 0x7e7e, 0x7c6e, 0xa48c, 0xff00, 0x0170, 0x8407, 0x8004,
++      0x8004, 0x810c, 0x810c, 0x810f, 0xa118, 0xa291, 0x0000, 0xa6b1,
++      0x0000, 0xa5a9, 0x0000, 0x0050, 0x8407, 0x8004, 0x8004, 0xa318,
++      0xa291, 0x0000, 0xa6b1, 0x0000, 0xa5a9, 0x0000, 0x731a, 0x721e,
++      0x7622, 0x7526, 0x78ac, 0xa084, 0xfffc, 0x78ae, 0x0020, 0x78ac,
++      0xa085, 0x0001, 0x78ae, 0x0804, 0x142c, 0x75d8, 0x76dc, 0x75da,
++      0x76de, 0x0018, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc,
++      0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x01d0, 0xa40a,
++      0x0110, 0x1a04, 0x142e, 0x8001, 0x788e, 0xa084, 0xfc00, 0x0138,
++      0x78ac, 0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0804, 0x142e, 0x7a96,
++      0x7b9a, 0x7d9e, 0x7ea2, 0x7c92, 0x78ac, 0xa084, 0xfcff, 0x78ae,
++      0x0020, 0x78ac, 0xa085, 0x0100, 0x78ae, 0x0804, 0x142c, 0x795c,
++      0x7ac4, 0x0804, 0x142a, 0x2009, 0xb387, 0x210c, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x1904, 0x142b, 0x2011, 0xb3c7, 0x2214, 0x0804,
++      0x142a, 0x2009, 0xb388, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++      0x1904, 0x142b, 0x2011, 0xb3c8, 0x2214, 0x0804, 0x142a, 0x2061,
++      0xb380, 0x6124, 0x6228, 0x8214, 0x8214, 0x8214, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x1148, 0x2061, 0xb3c0, 0x6324, 0x73da, 0x6328,
++      0x831c, 0x831c, 0x831c, 0x73de, 0x0804, 0x142a, 0x2009, 0xb38b,
++      0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x142b, 0x2011,
++      0xb3cb, 0x2214, 0x0804, 0x142a, 0x7910, 0x0804, 0x142b, 0x2009,
++      0x0202, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x142b,
++      0x2011, 0x0102, 0x2214, 0x0804, 0x142a, 0x2009, 0xb38d, 0x210c,
++      0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x142b, 0x2011, 0xb3cd,
++      0x2214, 0x0804, 0x142a, 0x7918, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++      0x1904, 0x142b, 0x7a1c, 0x0804, 0x142a, 0x2011, 0xb900, 0x71c4,
++      0xd1fc, 0x1110, 0x2011, 0xb800, 0x8107, 0xa084, 0x000f, 0x8003,
++      0x8003, 0x8003, 0x8003, 0xa268, 0x6a00, 0x6b08, 0x6c1c, 0x74da,
++      0xd29c, 0x0110, 0x6820, 0x70de, 0x0804, 0x1429, 0x2138, 0x080c,
++      0x1cc4, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708,
++      0x0804, 0x1429, 0x2061, 0xb380, 0x6114, 0x2001, 0x01ff, 0x2004,
++      0xd0fc, 0x1904, 0x142b, 0x2061, 0xb3c0, 0x6214, 0x0804, 0x142a,
++      0x2138, 0x080c, 0x1cc4, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10,
++      0x77da, 0x2091, 0x8001, 0x0804, 0x1429, 0x2110, 0xa294, 0x000f,
++      0xa282, 0x0010, 0x1a04, 0x1425, 0x080c, 0x27a4, 0x0804, 0x1429,
++      0x2100, 0xc0bc, 0xa082, 0x0010, 0x1a04, 0x1425, 0xd1bc, 0x1120,
++      0x2011, 0xb387, 0x2204, 0x0020, 0x2011, 0xb3c7, 0x2204, 0xc0bd,
++      0x0006, 0x2100, 0xc0bc, 0x2012, 0x080c, 0x2713, 0x001e, 0x0804,
++      0x142b, 0x71c4, 0x2021, 0xb388, 0x2404, 0x70c6, 0x2019, 0x0000,
++      0x0030, 0x71c8, 0x2021, 0xb3c8, 0x2404, 0x70ca, 0xc3fd, 0x2011,
++      0x165d, 0x20a9, 0x0008, 0x2205, 0xa106, 0x0138, 0x8210, 0x1f04,
++      0x1643, 0x71c4, 0x72c8, 0x0804, 0x1424, 0xa292, 0x165d, 0x0026,
++      0x2122, 0x001e, 0x080c, 0x2732, 0x2001, 0x01ff, 0x2004, 0xd0fc,
++      0x1110, 0xd3fc, 0x09f0, 0x0804, 0x142c, 0x03e8, 0x00fa, 0x01f4,
++      0x02ee, 0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0xb380, 0x6124,
++      0x6228, 0x8214, 0x8214, 0x8214, 0x70c4, 0x6026, 0x70c8, 0x8003,
++      0x8003, 0x8003, 0x602a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11a0,
++      0x0026, 0x0016, 0x2061, 0xb3c0, 0x6124, 0x6228, 0x8214, 0x8214,
++      0x8214, 0x70d8, 0x6026, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602a,
++      0x71da, 0x72de, 0x001e, 0x002e, 0x0804, 0x142a, 0x2061, 0xb380,
++      0x612c, 0x70c4, 0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904,
++      0x142b, 0x2061, 0xb3c0, 0x622c, 0x70c8, 0x602e, 0x0804, 0x142a,
++      0x7910, 0x0804, 0x142b, 0x71c4, 0xa184, 0xf0cf, 0x0148, 0x2001,
++      0x01ff, 0x2004, 0xd0fc, 0x1904, 0x1425, 0x72c8, 0x0804, 0x1424,
++      0x0006, 0x2019, 0x0000, 0x080c, 0x278d, 0x2001, 0x01ff, 0x2004,
++      0xd0fc, 0x0118, 0x001e, 0x0804, 0x142b, 0x71c8, 0xa184, 0xf0cf,
++      0x0120, 0x2110, 0x71c4, 0x0804, 0x1424, 0x0006, 0xc3fd, 0x080c,
++      0x278d, 0x002e, 0x001e, 0x0804, 0x142a, 0x71c4, 0xa182, 0x0010,
++      0x0248, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x1425, 0x72c8,
++      0x0804, 0x1424, 0x2011, 0xb38d, 0x2204, 0x0006, 0x8104, 0x1208,
++      0x8108, 0x2112, 0x2019, 0x0000, 0x080c, 0x276f, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x0118, 0x001e, 0x0804, 0x142b, 0x71c8, 0xa182,
++      0x0010, 0x0220, 0x2110, 0x71c4, 0x0804, 0x1424, 0x2011, 0xb3cd,
++      0x2204, 0x0006, 0x8104, 0x1208, 0x8108, 0x2112, 0xc3fd, 0x080c,
++      0x276f, 0x002e, 0x001e, 0x0804, 0x142a, 0x71c4, 0x72c8, 0xa184,
++      0xfffd, 0x1904, 0x1424, 0xa284, 0xfffd, 0x1904, 0x1424, 0x2100,
++      0x7918, 0x781a, 0x2200, 0x7a1c, 0x781e, 0x0804, 0x142a, 0x2011,
++      0xb900, 0x71c4, 0xd1fc, 0x1110, 0x2011, 0xb800, 0x8107, 0xa084,
++      0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa268, 0x72c8, 0x73cc,
++      0x74d8, 0xd29c, 0x0130, 0x75dc, 0x75de, 0x6d22, 0x2001, 0x0002,
++      0x682a, 0x71c6, 0x6800, 0x70ca, 0x73ce, 0x74da, 0x2091, 0x8000,
++      0x6a02, 0xd2ac, 0x1110, 0xa026, 0x0078, 0xa484, 0x00ff, 0xa082,
++      0x0002, 0x16f0, 0x843f, 0xa7bc, 0x00ff, 0x0130, 0xa786, 0x0002,
++      0x15b8, 0xa484, 0x00ff, 0x05a0, 0x2029, 0x0009, 0x2031, 0x0062,
++      0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, 0xa084, 0x00ff, 0x1110,
++      0xa73d, 0x1530, 0x2041, 0x001d, 0x8307, 0xa084, 0x00ff, 0x0188,
++      0xa842, 0x02f0, 0xa086, 0x0010, 0x1120, 0xa39c, 0x00ff, 0xa39d,
++      0x0f00, 0xa3bc, 0x00ff, 0x2500, 0xa702, 0x0290, 0x2600, 0xa702,
++      0x1278, 0x2039, 0x003a, 0x6804, 0xa705, 0x6806, 0x6b0a, 0x6b0c,
++      0x73ce, 0x681c, 0x70da, 0x6c1e, 0x2091, 0x8001, 0x0804, 0x142c,
++      0x2091, 0x8001, 0x0804, 0x1426, 0x2138, 0x080c, 0x1cc4, 0x2091,
++      0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc,
++      0x681e, 0x2708, 0x0804, 0x1429, 0x70c4, 0x2061, 0xb380, 0x6114,
++      0x6016, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x142b, 0x70c8,
++      0x2061, 0xb3c0, 0x6214, 0x6016, 0x0804, 0x142a, 0x72c8, 0x73cc,
++      0xa182, 0x0010, 0x1a04, 0x1425, 0x080c, 0x27de, 0x0804, 0x1429,
++      0x2138, 0x080c, 0x1cc4, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002,
++      0x6a0a, 0x2091, 0x8001, 0x2708, 0x0804, 0x142a, 0x2138, 0x080c,
++      0x1cc4, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804,
++      0xa005, 0x0110, 0x080c, 0x260c, 0x2091, 0x8001, 0x2708, 0x0804,
++      0x142a, 0x2138, 0x080c, 0x1cc4, 0x2091, 0x8000, 0x6a08, 0xa295,
++      0x0004, 0x6a0a, 0x6804, 0xa005, 0x0110, 0x080c, 0x260c, 0x2091,
++      0x8001, 0x2708, 0x0804, 0x142a, 0x2138, 0x2041, 0x0001, 0x2049,
++      0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1cd8, 0x2091,
++      0x8001, 0x2708, 0x6a08, 0x0804, 0x142a, 0x2138, 0x780c, 0xd0e4,
++      0x1160, 0xd7fc, 0x0128, 0x080c, 0x1c2f, 0x0138, 0x0804, 0x142e,
++      0x080c, 0x1c25, 0x0110, 0x0804, 0x142e, 0x73c8, 0x72cc, 0x77c6,
++      0x73ca, 0x72ce, 0x080c, 0x1d63, 0x11e8, 0x6818, 0xa005, 0x01a0,
++      0x2708, 0x0076, 0x080c, 0x27fe, 0x007e, 0x1170, 0x2001, 0x0015,
++      0xd7fc, 0x1118, 0x2061, 0xb380, 0x0018, 0xc0fd, 0x2061, 0xb3c0,
++      0x7822, 0x2091, 0x8001, 0x0005, 0x2091, 0x8001, 0x2001, 0x4005,
++      0x0804, 0x142e, 0x2091, 0x8001, 0x0804, 0x142c, 0x2138, 0x780c,
++      0xd0e4, 0x1160, 0xd7fc, 0x0128, 0x080c, 0x1c2f, 0x0138, 0x0804,
++      0x142e, 0x080c, 0x1c25, 0x0110, 0x0804, 0x142e, 0x77c6, 0x2041,
++      0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c,
++      0x1cd8, 0x2009, 0x0016, 0xd7fc, 0x1118, 0x2061, 0xb380, 0x0018,
++      0x2061, 0xb3c0, 0xc1fd, 0x606b, 0x0003, 0x6083, 0x0000, 0x677a,
++      0x6087, 0x000f, 0x7922, 0x61f0, 0xc1c4, 0x61f2, 0x080c, 0x260c,
++      0x2091, 0x8001, 0x0005, 0x77c8, 0x77ca, 0x2138, 0x77c6, 0x780c,
++      0xd0e4, 0x1160, 0xd7fc, 0x0128, 0x080c, 0x1c2f, 0x0138, 0x0804,
++      0x142e, 0x080c, 0x1c25, 0x0110, 0x0804, 0x142e, 0xa7bc, 0xff00,
++      0x2091, 0x8000, 0x2009, 0x0017, 0xd7fc, 0x1118, 0x2061, 0xb380,
++      0x0018, 0x2061, 0xb3c0, 0xc1fd, 0x6083, 0x0000, 0x606b, 0x0002,
++      0x677a, 0x6087, 0x000f, 0x7922, 0x61f0, 0xc1c4, 0x61f2, 0x080c,
++      0x260c, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0010, 0x70c8,
++      0xa005, 0x0118, 0x60f0, 0xc0fd, 0x60f2, 0x080c, 0x1cd8, 0x70c8,
++      0x6836, 0x8738, 0xa784, 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005,
++      0x2019, 0x0000, 0x2011, 0x0000, 0x7808, 0xd0ec, 0x1180, 0x72c8,
++      0x780c, 0xd0e4, 0x1160, 0xd284, 0x0128, 0x080c, 0x1c2f, 0x0138,
++      0x0804, 0x142e, 0x080c, 0x1c25, 0x0110, 0x0804, 0x142e, 0x72ca,
++      0x78ac, 0xa084, 0x0003, 0x1508, 0x2039, 0x0000, 0xd284, 0x0108,
++      0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x080c,
++      0x1cc4, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, 0x2091,
++      0x8001, 0x8738, 0xa784, 0x001f, 0x1d90, 0xa7bc, 0xff00, 0x873f,
++      0x8738, 0x873f, 0xa784, 0x0f00, 0x1d50, 0x2091, 0x8000, 0x7808,
++      0xd0ec, 0x0118, 0x2069, 0x0100, 0x0040, 0x72c8, 0xd284, 0x1118,
++      0x2069, 0x0200, 0x0010, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd,
++      0x680a, 0x6830, 0xa084, 0x0040, 0x01c0, 0x684b, 0x0004, 0x20a9,
++      0x0014, 0x6848, 0xa084, 0x0004, 0x0110, 0x1f04, 0x1901, 0x684b,
++      0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0110, 0x1f04,
++      0x190b, 0x20a9, 0x00fa, 0x1f04, 0x1913, 0x2079, 0xb340, 0x2009,
++      0x0018, 0x7808, 0xd0ec, 0x1118, 0x72c8, 0xd284, 0x1118, 0x2061,
++      0xb380, 0x0018, 0x2061, 0xb3c0, 0xc1fd, 0x6083, 0x0000, 0x7922,
++      0x606b, 0x0001, 0x6087, 0x000f, 0x60c3, 0x0000, 0x60c4, 0x60ce,
++      0x60d2, 0x60f0, 0xd0b4, 0x0160, 0xc0b4, 0x60f2, 0x00c6, 0x60d4,
++      0xa065, 0x6008, 0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce,
++      0x60f0, 0xa084, 0x7eff, 0x60f2, 0x78ac, 0xa085, 0x0002, 0x78ae,
++      0x83ff, 0x0108, 0x0005, 0x681b, 0x0050, 0x2091, 0x8001, 0x0005,
++      0x73cc, 0x080c, 0x18aa, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a,
++      0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff,
++      0x1f04, 0x1960, 0x8421, 0x1dd0, 0x8319, 0x1db0, 0x69ee, 0x6a4a,
++      0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, 0x2069, 0xb380, 0x0010,
++      0x2069, 0xb3c0, 0x71c4, 0x71c6, 0x6912, 0x81ff, 0x1110, 0x68c3,
++      0x0001, 0x78ac, 0xa084, 0xfffd, 0x78ae, 0xa084, 0x0001, 0x1110,
++      0x080c, 0x1daf, 0x0005, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0018,
++      0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca,
++      0x72ce, 0x2079, 0xb340, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x080c,
++      0x1c79, 0x0904, 0x1a7d, 0x20a9, 0x0005, 0x20a1, 0xb351, 0x2091,
++      0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x080c, 0x1fd6,
++      0x0120, 0x080c, 0x1c95, 0x0804, 0x1a7d, 0x6004, 0xa08c, 0x00ff,
++      0xa18e, 0x0009, 0x1120, 0x0006, 0x080c, 0x250a, 0x000e, 0xa084,
++      0xff00, 0x8007, 0x8009, 0x0904, 0x1a24, 0x00c6, 0x2c68, 0x080c,
++      0x1c79, 0x05a8, 0x2c00, 0x689e, 0x8109, 0x1dc0, 0x609f, 0x0000,
++      0x00ce, 0x00c6, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040,
++      0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda,
++      0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0904, 0x1a23, 0x2009,
++      0x0040, 0x080c, 0x1fd6, 0x1548, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0002, 0x1168, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, 0x1120,
++      0x0016, 0x080c, 0x2507, 0x001e, 0x2d00, 0x6002, 0x0898, 0x00ce,
++      0x00c6, 0x609c, 0x080c, 0x1d24, 0x00ce, 0x609f, 0x0000, 0x080c,
++      0x1a81, 0x2009, 0x000c, 0x6008, 0xa085, 0x0200, 0x600a, 0x080c,
++      0x1c39, 0x080c, 0x1c95, 0x0804, 0x1a7d, 0x00ce, 0x00c6, 0x609c,
++      0x080c, 0x1d24, 0x00ce, 0x609f, 0x0000, 0x080c, 0x1a81, 0x2009,
++      0x000c, 0x6007, 0x0103, 0x601b, 0x0003, 0x080c, 0x1c39, 0x080c,
++      0x1c95, 0x0804, 0x1a7d, 0x00ce, 0x780c, 0xd0e4, 0x11e8, 0x6114,
++      0xd1fc, 0x0120, 0x080c, 0x1c2f, 0x01b8, 0x0018, 0x080c, 0x1c25,
++      0x0198, 0x2029, 0x0000, 0x2520, 0x2009, 0x0018, 0x73c8, 0x72cc,
++      0x6087, 0x0103, 0x601b, 0x0021, 0x080c, 0x1c39, 0x080c, 0x1c95,
++      0x2001, 0x4007, 0x0804, 0x142e, 0x74c4, 0x73c8, 0x72cc, 0x6014,
++      0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc, 0x1118, 0x2071,
++      0xb380, 0x0018, 0x2071, 0xb3c0, 0xc1fd, 0x7922, 0x706b, 0x0005,
++      0x71f0, 0xc1c4, 0x71f2, 0x736e, 0x7272, 0x7476, 0x707a, 0x707f,
++      0x0000, 0x2c00, 0x7082, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184,
++      0x0060, 0x0110, 0x080c, 0x5365, 0x00ee, 0x6596, 0x65a6, 0x669a,
++      0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000,
++      0x080c, 0x260c, 0x2091, 0x8001, 0x0005, 0x70c3, 0x4005, 0x0804,
++      0x142f, 0x20a9, 0x0005, 0x2099, 0xb351, 0x2091, 0x8000, 0x530a,
++      0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000,
++      0xa5a9, 0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, 0x7916, 0x0804,
++      0x142c, 0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, 0x1000, 0x690c,
++      0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, 0xa285, 0x0000,
++      0x1118, 0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, 0x70ca, 0x0804,
++      0x142f, 0x2011, 0xb3a4, 0xa03e, 0x7908, 0xd1ec, 0x11a0, 0x77c8,
++      0xd7fc, 0x0110, 0x2011, 0xb3e4, 0x220c, 0x0006, 0x0036, 0x0046,
++      0x080c, 0x44c8, 0x70c4, 0xd0fc, 0x004e, 0x003e, 0x000e, 0x1118,
++      0xa184, 0x7fff, 0x0020, 0x080c, 0x44ac, 0xa185, 0x8000, 0x2012,
++      0x2710, 0x0804, 0x142a, 0x0016, 0x2100, 0xc1fc, 0x080c, 0x449c,
++      0x001e, 0xd1fc, 0x1118, 0x2001, 0xb3a4, 0x0010, 0x2001, 0xb3e4,
++      0x2004, 0xa084, 0x8000, 0x6100, 0xa10d, 0x6204, 0x6308, 0x0804,
++      0x1429, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2091, 0x8000, 0x2061,
++      0x0010, 0x60c4, 0xd0fc, 0x1178, 0x2071, 0xb380, 0x7808, 0xd0ec,
++      0x0128, 0x2079, 0x0100, 0x2019, 0x0020, 0x0058, 0x2079, 0x0200,
++      0x2019, 0x0050, 0x0030, 0x2071, 0xb3c0, 0x2079, 0x0100, 0x2019,
++      0x0020, 0x7094, 0xa06d, 0x0904, 0x1bb1, 0x6a04, 0xa294, 0x00ff,
++      0xa286, 0x0007, 0x0120, 0xa286, 0x000f, 0x1904, 0x1bb1, 0x691c,
++      0xa184, 0x00c0, 0x0904, 0x1bb1, 0xa186, 0x00c0, 0x0904, 0x1bb1,
++      0x6824, 0xa084, 0xff00, 0xa085, 0x0019, 0x6826, 0x2368, 0x7830,
++      0xa084, 0x0040, 0x1de0, 0xa184, 0x0080, 0x1904, 0x1b87, 0x78e4,
++      0xa084, 0x0007, 0x8001, 0x1dd8, 0x71a4, 0x81ff, 0x0150, 0x6807,
++      0x0010, 0x6908, 0x6808, 0xa106, 0x1de0, 0x6804, 0xa084, 0x0010,
++      0x1de0, 0x78b8, 0x8007, 0xa084, 0x007f, 0x1dd8, 0x7848, 0xa085,
++      0x000c, 0x784a, 0x71a4, 0x81ff, 0x0180, 0x70a7, 0x0000, 0x6807,
++      0x0018, 0x6804, 0xa084, 0x0008, 0x1de0, 0x6807, 0x0008, 0x6804,
++      0xa084, 0x0008, 0x1de0, 0x6807, 0x0002, 0x61c4, 0xa18c, 0x0003,
++      0x0904, 0x1bad, 0x62c8, 0x63cc, 0x61c6, 0x62ca, 0x63ce, 0x7848,
++      0xa084, 0x000c, 0x1de0, 0x00e6, 0x2071, 0xb340, 0x724a, 0x734e,
++      0xae80, 0x0012, 0x00ee, 0x080c, 0x51f4, 0x78a3, 0x0000, 0x7858,
++      0xa084, 0xedff, 0x785a, 0x70a8, 0xa080, 0x00f3, 0x781a, 0x00fe,
++      0x00ee, 0x00de, 0x00ce, 0x2091, 0x8001, 0x0804, 0x142c, 0x78e4,
++      0xa084, 0x0007, 0x1de0, 0x78b8, 0x8007, 0xa084, 0x007f, 0x1dd8,
++      0x7848, 0xa085, 0x000c, 0x784a, 0x7848, 0xa084, 0x000c, 0x1de0,
++      0x71a4, 0x81ff, 0x0190, 0x6807, 0x0010, 0x70a7, 0x0000, 0x6807,
++      0x0018, 0x6804, 0xa084, 0x0008, 0x1de0, 0x6807, 0x0008, 0x6804,
++      0xa084, 0x0008, 0x1de0, 0x6807, 0x0002, 0x70a8, 0xa080, 0x00b7,
++      0x0868, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x2091, 0x8001, 0x2001,
++      0x4005, 0x0804, 0x142e, 0x7958, 0x71c6, 0x71c4, 0xa182, 0x0003,
++      0x1a04, 0x1425, 0x795a, 0x0804, 0x142c, 0x7958, 0x71c6, 0x0804,
++      0x142c, 0x7900, 0x71c6, 0x71c4, 0x7902, 0x0804, 0x142c, 0x7900,
++      0x71c6, 0x0804, 0x142c, 0x7904, 0x70c4, 0x7806, 0xd094, 0x0140,
++      0x70c8, 0x78f2, 0x70cc, 0x78f6, 0x70d8, 0x78fa, 0x70dc, 0x78fe,
++      0x0804, 0x142b, 0x7804, 0x70c6, 0xd094, 0x0140, 0x78f0, 0x70ca,
++      0x78f4, 0x70ce, 0x78f8, 0x70da, 0x78fc, 0x70de, 0x0804, 0x142c,
++      0x71c4, 0xd1fc, 0x1118, 0x2011, 0xb800, 0x0010, 0x2011, 0xb900,
++      0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa268,
++      0x2011, 0x0000, 0x6814, 0xd0fc, 0x0110, 0xa295, 0x0200, 0xd0b4,
++      0x0110, 0xa295, 0x0001, 0x6b0c, 0x6800, 0x70da, 0x6820, 0x70de,
++      0x0804, 0x1429, 0x780c, 0xd0f4, 0x0130, 0x2001, 0x4007, 0x70db,
++      0x0000, 0xa005, 0x0048, 0xd0fc, 0x0130, 0x2001, 0x4007, 0x70db,
++      0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x780c, 0xd0f4, 0x0128,
++      0x2001, 0x4007, 0x70db, 0x0000, 0x0008, 0xa006, 0x0005, 0x780c,
++      0xd0fc, 0x0128, 0x2001, 0x4007, 0x70db, 0x0001, 0x0008, 0xa006,
++      0x0005, 0xac80, 0x0001, 0x080c, 0x1e7a, 0x0005, 0x7112, 0x7003,
++      0x0001, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, 0x0020, 0xac80,
++      0x0001, 0x20a0, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002, 0xa08c,
++      0x01e0, 0x1510, 0x53a5, 0x7884, 0xa005, 0x01e8, 0x0411, 0x0148,
++      0x2c00, 0x788a, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5,
++      0x0090, 0x7887, 0x0000, 0x7218, 0x731c, 0x7420, 0x7524, 0xa292,
++      0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab, 0x0000, 0x721a,
++      0x731e, 0x7422, 0x7526, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004,
++      0x0005, 0x2091, 0x8000, 0x783c, 0xa065, 0x0120, 0x2c04, 0x783e,
++      0x2063, 0x0000, 0x2091, 0x8001, 0x0005, 0x00f6, 0x2079, 0xb340,
++      0x783c, 0xa06d, 0x0140, 0x2d04, 0x783e, 0x6803, 0x0000, 0x6807,
++      0x0000, 0x680b, 0x0000, 0x00fe, 0x0005, 0x2091, 0x8000, 0x00f6,
++      0x2079, 0xb340, 0x783c, 0x2062, 0x2c00, 0xa005, 0x1110, 0x080c,
++      0x297f, 0x783e, 0x00fe, 0x2091, 0x8001, 0x0005, 0x00f6, 0x2079,
++      0xb340, 0x783c, 0x206a, 0x2d00, 0x783e, 0x00fe, 0x0005, 0x3800,
++      0xa084, 0x0003, 0x0118, 0x2011, 0x1100, 0x0010, 0x2011, 0x5d00,
++      0x7a3e, 0x7bc4, 0x8319, 0x0128, 0xa280, 0x0037, 0x2012, 0x2010,
++      0x0cc8, 0x2013, 0x0000, 0x0005, 0x0016, 0x2069, 0xda00, 0xd7fc,
++      0x1110, 0x2069, 0xba00, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
++      0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xad68, 0x001e, 0x0005,
++      0x0c59, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef,
++      0xa80d, 0x690a, 0x00e6, 0xd7fc, 0x1128, 0x2009, 0xb394, 0x2071,
++      0xb380, 0x0020, 0x2009, 0xb3d4, 0x2071, 0xb3c0, 0x210c, 0x6804,
++      0xa005, 0x0148, 0xa116, 0x1138, 0x2060, 0x6000, 0x6806, 0x0016,
++      0x200b, 0x0000, 0x0018, 0x2009, 0x0000, 0x0016, 0x6804, 0xa065,
++      0x0148, 0x6000, 0x6806, 0x04b9, 0x080c, 0x2076, 0x6810, 0x8001,
++      0x6812, 0x1da0, 0x001e, 0x6902, 0x6906, 0x2d00, 0x2060, 0x080c,
++      0x2af4, 0x00ee, 0x0005, 0xa065, 0x0170, 0x2008, 0x609c, 0xa005,
++      0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x2079, 0xb340,
++      0x783c, 0x793e, 0x2062, 0x0005, 0xa065, 0x01a0, 0x2008, 0x609c,
++      0xa005, 0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x00f6,
++      0x2079, 0xb340, 0x2091, 0x8000, 0x783c, 0x793e, 0x00fe, 0x2062,
++      0x2091, 0x8001, 0x0005, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9,
++      0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828,
++      0x601a, 0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, 0x1128, 0x2071,
++      0xb380, 0x2031, 0xb400, 0x0020, 0x2071, 0xb3c0, 0x2031, 0xb600,
++      0x7054, 0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, 0x8000, 0x7056,
++      0xa006, 0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0xb380,
++      0x0010, 0x2079, 0xb3c0, 0x080c, 0x1cc4, 0x2091, 0x8000, 0x6804,
++      0x7806, 0xa065, 0x05d0, 0x0028, 0x2c00, 0x7806, 0x6000, 0xa065,
++      0x05a0, 0x6010, 0xa306, 0x1dc0, 0x600c, 0xa206, 0x1da8, 0x2c28,
++      0x7850, 0xac06, 0x1108, 0x0430, 0x6804, 0xac06, 0x1140, 0x6000,
++      0x2060, 0x6806, 0xa005, 0x1118, 0x6803, 0x0000, 0x0048, 0x6400,
++      0x7804, 0x2060, 0x6402, 0xa486, 0x0000, 0x1110, 0x2c00, 0x6802,
++      0x2560, 0x00fe, 0x080c, 0x1d3b, 0x00f6, 0x601b, 0x0005, 0x6023,
++      0x0020, 0x00fe, 0x080c, 0x2076, 0x00f6, 0x6810, 0x8001, 0x0b0c,
++      0x297f, 0x6812, 0xa085, 0xffff, 0xa005, 0x00fe, 0x0005, 0x0076,
++      0x2700, 0x2039, 0x0000, 0xd0fc, 0x0108, 0xc7fd, 0x2041, 0x0021,
++      0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x080c, 0x1cd8,
++      0x8738, 0xa784, 0x001f, 0x1dd0, 0xa7bc, 0xff00, 0x873f, 0x8738,
++      0x873f, 0xa784, 0x0f00, 0x1d90, 0x2091, 0x8001, 0x007e, 0x0005,
++      0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x11b8, 0x7808, 0xd08c,
++      0x0130, 0xc08c, 0x780a, 0xc7fc, 0x2069, 0xb380, 0x0028, 0xc08d,
++      0x780a, 0x2069, 0xb3c0, 0xc7fd, 0x2091, 0x8000, 0x6818, 0x681b,
++      0x0000, 0x2091, 0x8001, 0xa005, 0x1108, 0x0005, 0xa08c, 0xfff0,
++      0x0110, 0x080c, 0x297f, 0x0002, 0x1e04, 0x1e07, 0x1e0d, 0x1e11,
++      0x1e05, 0x1e15, 0x1e1b, 0x1e05, 0x1e05, 0x1f85, 0x1faf, 0x1fb2,
++      0x1fb7, 0x1e05, 0x1e05, 0x1e05, 0x0005, 0x080c, 0x297f, 0x080c,
++      0x1daf, 0x2001, 0x8001, 0x0804, 0x1fc7, 0x2001, 0x8003, 0x0804,
++      0x1fc7, 0x2001, 0x8004, 0x0804, 0x1fc7, 0x080c, 0x1daf, 0x2001,
++      0x8006, 0x0804, 0x1fc7, 0x2001, 0x8007, 0x0804, 0x1fc7, 0x2030,
++      0x2138, 0xa782, 0x0021, 0x0210, 0x2009, 0x0020, 0x2600, 0x0099,
++      0x1188, 0xa7ba, 0x0020, 0x0268, 0x0160, 0x2708, 0xa6b0, 0x0020,
++      0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
++      0x0c40, 0xa006, 0x0005, 0x81ff, 0x01f0, 0x2099, 0x0030, 0x20a0,
++      0x700c, 0xa084, 0x07ff, 0x0130, 0x7007, 0x0004, 0x7004, 0xa084,
++      0x0004, 0x1de0, 0x21a8, 0x810b, 0x7112, 0x7003, 0x0001, 0x7007,
++      0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, 0x0002, 0xa08c, 0x01e0,
++      0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, 0x0005, 0x2030, 0x2138,
++      0xa782, 0x0021, 0x0210, 0x2009, 0x0020, 0x2600, 0x0099, 0x1188,
++      0xa7ba, 0x0020, 0x0268, 0x0160, 0x2708, 0xa6b0, 0x0020, 0xa290,
++      0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0c40,
++      0xa006, 0x0005, 0x81ff, 0x0588, 0x2098, 0x20a1, 0x0030, 0x700c,
++      0xa084, 0x07ff, 0x0100, 0x21a8, 0x810b, 0x7112, 0x7018, 0x0006,
++      0x701c, 0x0006, 0x7020, 0x0006, 0x7024, 0x0006, 0x721a, 0x731e,
++      0x7422, 0x7526, 0x7003, 0x0000, 0x53a6, 0x7007, 0x0001, 0x7010,
++      0xa084, 0xf000, 0x0118, 0x7007, 0x0008, 0x0018, 0x7108, 0x8103,
++      0x1eb0, 0x000e, 0x7026, 0x000e, 0x7022, 0x000e, 0x701e, 0x000e,
++      0x701a, 0x7007, 0x0002, 0xa184, 0x01e0, 0x7003, 0x0000, 0x7007,
++      0x0004, 0x0005, 0x00e6, 0x6914, 0xd1fc, 0x0118, 0x2071, 0xb3c0,
++      0x0010, 0x2071, 0xb380, 0x2d08, 0x70b4, 0x6802, 0xa005, 0x1108,
++      0x71ba, 0x71b6, 0x00ee, 0x0005, 0x00f6, 0x6114, 0xd1fc, 0x0118,
++      0x2079, 0xb3c0, 0x0010, 0x2079, 0xb380, 0x2c08, 0x78b4, 0x6002,
++      0xa005, 0x1108, 0x79ba, 0x79b6, 0x00fe, 0x0005, 0x2091, 0x8000,
++      0x00f6, 0x6114, 0xd1fc, 0x0118, 0x2079, 0xb3c0, 0x0010, 0x2079,
++      0xb380, 0x6003, 0x0000, 0x2c08, 0x78b8, 0xa065, 0x1110, 0x79b6,
++      0x0008, 0x6102, 0x79ba, 0x00fe, 0x2091, 0x8001, 0x080c, 0x2636,
++      0x0005, 0x70b4, 0xa06d, 0x0130, 0x6800, 0x70b6, 0xa005, 0x1108,
++      0x70ba, 0x8dff, 0x0005, 0x00d6, 0x00c6, 0x00f6, 0xd3fc, 0x0118,
++      0x2079, 0xb3c0, 0x0010, 0x2079, 0xb380, 0xaf80, 0x002d, 0x2060,
++      0x6000, 0xa005, 0x01e0, 0x2068, 0x6814, 0xa306, 0x1128, 0x6828,
++      0xa084, 0x00ff, 0xa406, 0x0110, 0x2d60, 0x0c90, 0x6800, 0xa005,
++      0x6002, 0x1130, 0xaf80, 0x002d, 0xac06, 0x0108, 0x2c00, 0x78ba,
++      0x00d6, 0x689c, 0xa005, 0x0110, 0x080c, 0x1d13, 0x000e, 0x00fe,
++      0x00ce, 0x00de, 0xa005, 0x0005, 0x00d6, 0x00c6, 0x00f6, 0xd0fc,
++      0x0118, 0x2079, 0xb3c0, 0x0010, 0x2079, 0xb380, 0xaf80, 0x002d,
++      0x2060, 0x6000, 0xa005, 0x01c8, 0x2068, 0x6814, 0xa084, 0x00ff,
++      0xa306, 0x0110, 0x2d60, 0x0ca8, 0x6800, 0xa005, 0x6002, 0x1130,
++      0xaf80, 0x002d, 0xac06, 0x0108, 0x2c00, 0x78ba, 0x00d6, 0x689c,
++      0xa005, 0x0110, 0x080c, 0x1d13, 0x000e, 0x00fe, 0x00ce, 0x00de,
++      0xa005, 0x0005, 0x00d6, 0x00c6, 0x00f6, 0xd3fc, 0x0118, 0x2079,
++      0xb3c0, 0x0010, 0x2079, 0xb380, 0xaf80, 0x002d, 0x2060, 0x6000,
++      0xa06d, 0x01b0, 0x6814, 0xa306, 0x0110, 0x2d60, 0x0cc0, 0x6800,
++      0xa005, 0x6002, 0x1130, 0xaf80, 0x002d, 0xac06, 0x0108, 0x2c00,
++      0x78ba, 0x00d6, 0x689c, 0xa005, 0x0110, 0x080c, 0x1d13, 0x000e,
++      0x00fe, 0x00ce, 0x00de, 0xa005, 0x0005, 0x2091, 0x8000, 0xd7fc,
++      0x1118, 0x2069, 0xb380, 0x0010, 0x2069, 0xb3c0, 0x6800, 0xa086,
++      0x0000, 0x0128, 0x2091, 0x8001, 0x681b, 0x0009, 0x0005, 0x6878,
++      0xd7fc, 0x1108, 0x0008, 0xc0fd, 0xa0bc, 0xff00, 0x2041, 0x0021,
++      0x2049, 0x0004, 0x2051, 0x0010, 0x080c, 0x1cd8, 0x8738, 0xa784,
++      0x001f, 0x1dd0, 0x2091, 0x8001, 0x2001, 0x800a, 0x00c0, 0x2001,
++      0x800c, 0x00a8, 0x080c, 0x1daf, 0x2001, 0x800d, 0x0080, 0x780c,
++      0xd0e4, 0x1158, 0xd0ec, 0x0120, 0xd7fc, 0x0110, 0x78e4, 0x0008,
++      0x78e0, 0x70c6, 0x2001, 0x800e, 0x0010, 0x0804, 0x1e05, 0x70c2,
++      0xd7fc, 0x1118, 0x70db, 0x0000, 0x0010, 0x70db, 0x0001, 0x2061,
++      0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x0005, 0xac80, 0x0001,
++      0x81ff, 0x0518, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x07ff,
++      0x0100, 0x7018, 0x0006, 0x701c, 0x0006, 0x7020, 0x0006, 0x7024,
++      0x0006, 0x7112, 0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003,
++      0x0001, 0x7007, 0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, 0x0002,
++      0xa08c, 0x01e0, 0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007,
++      0x0004, 0x000e, 0x7026, 0x000e, 0x7022, 0x000e, 0x701e, 0x000e,
++      0x701a, 0x0005, 0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e,
++      0x681f, 0x0201, 0x6803, 0xfd20, 0x6807, 0x0038, 0x6a1a, 0x6823,
++      0x0200, 0x6827, 0x0000, 0x2d00, 0xa0e8, 0x0010, 0xa290, 0x0004,
++      0x8109, 0x1d60, 0x0005, 0x70ec, 0xd0dc, 0x1520, 0x2029, 0x0001,
++      0x780c, 0xd0cc, 0x1160, 0x70ec, 0xd0e4, 0x2019, 0x0c0a, 0x2021,
++      0x000a, 0x1120, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x0070, 0x70ec,
++      0xd0e4, 0x1128, 0x2019, 0x1c0c, 0x2021, 0x000c, 0x0030, 0x2019,
++      0x1c09, 0x2021, 0x0009, 0xa5ad, 0x0200, 0x6b0a, 0x6c0e, 0x6d1e,
++      0x6807, 0x0038, 0x0005, 0x7018, 0x0006, 0x701c, 0x0006, 0x7020,
++      0x0006, 0x7024, 0x0006, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003,
++      0x0000, 0x7007, 0x0001, 0x7010, 0xa084, 0xf000, 0x0118, 0x7007,
++      0x0008, 0x0018, 0x7108, 0x8103, 0x1eb0, 0x000e, 0x7026, 0x000e,
++      0x7022, 0x000e, 0x701e, 0x000e, 0x701a, 0x7007, 0x0002, 0xa184,
++      0x01e0, 0x7003, 0x0000, 0x7007, 0x0004, 0x0005, 0x6004, 0x2c08,
++      0x2063, 0x0000, 0x785c, 0x8000, 0x785e, 0x7860, 0xa005, 0x7962,
++      0x0110, 0x2c02, 0x0008, 0x7966, 0x0005, 0x6807, 0x0103, 0x00c6,
++      0x2061, 0xb340, 0x2d08, 0x206b, 0x0000, 0x605c, 0x8000, 0x605e,
++      0x6060, 0xa005, 0x6162, 0x0110, 0x2d02, 0x0008, 0x6166, 0x00ce,
++      0x0005, 0x2091, 0x8000, 0x785c, 0x8001, 0x785e, 0x2c04, 0x7866,
++      0xa005, 0x1108, 0x7862, 0x2091, 0x8001, 0x609c, 0xa005, 0x01a8,
++      0x00c6, 0x2060, 0x2008, 0x609c, 0xa005, 0x0138, 0x2062, 0x609f,
++      0x0000, 0xa065, 0x609c, 0xa005, 0x1dc8, 0x2091, 0x8000, 0x783c,
++      0x793e, 0x2062, 0x2091, 0x8001, 0x00ce, 0x2091, 0x8000, 0x783c,
++      0x2062, 0x609f, 0x0000, 0x2c00, 0xa005, 0x1110, 0x080c, 0x297f,
++      0x783e, 0x2091, 0x8001, 0x0005, 0x7864, 0xa065, 0x0168, 0x2091,
++      0x8000, 0x785c, 0x8001, 0x785e, 0x2c04, 0x7866, 0xa005, 0x1110,
++      0x7862, 0x8000, 0x2091, 0x8001, 0x0005, 0x20a9, 0x0010, 0xa006,
++      0x8004, 0x8086, 0x818e, 0x1208, 0xa200, 0x1f04, 0x20e1, 0x8086,
++      0x818e, 0x0005, 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a,
++      0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x20f1,
++      0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04, 0x20f1, 0x0006, 0x3200,
++      0xa084, 0xefff, 0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200,
++      0xa085, 0x1000, 0x0cb8, 0x7d6c, 0x70d0, 0xa506, 0x0904, 0x218e,
++      0x7808, 0xd0ec, 0x0190, 0x00e6, 0x2091, 0x8000, 0x2071, 0x0020,
++      0x7004, 0xa005, 0x1138, 0x7008, 0x00ee, 0xa086, 0x0008, 0x0128,
++      0x0804, 0x218e, 0x00ee, 0x0804, 0x218e, 0x080c, 0x1c79, 0x0904,
++      0x218e, 0x7968, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x1210,
++      0xa006, 0x0038, 0x72d0, 0xa206, 0x0120, 0x7887, 0x0001, 0x2009,
++      0x0080, 0x00c6, 0x080c, 0x1c3e, 0x00ce, 0x05d8, 0x080c, 0x1c95,
++      0x7887, 0x0000, 0x7880, 0x8000, 0x7882, 0xa086, 0x0002, 0x01a0,
++      0x8507, 0x8004, 0x8004, 0x7974, 0xa108, 0x711a, 0x1260, 0x7970,
++      0xa189, 0x0000, 0x711e, 0x797c, 0xa189, 0x0000, 0x7122, 0x7978,
++      0xa189, 0x0000, 0x7126, 0x0490, 0x6014, 0xd0fc, 0x1118, 0x2069,
++      0xb380, 0x0010, 0x2069, 0xb3c0, 0x2091, 0x8000, 0x681b, 0x0002,
++      0x7884, 0xa005, 0x0128, 0x7887, 0x0000, 0x7888, 0x2060, 0x0c60,
++      0x7883, 0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001,
++      0x00a8, 0x7883, 0x0000, 0x080c, 0x24c9, 0x6004, 0xa084, 0x000f,
++      0x0071, 0x7884, 0xa005, 0x0130, 0x7888, 0x2060, 0x6004, 0xa084,
++      0x000f, 0x0029, 0x7887, 0x0000, 0x0804, 0x210b, 0x0005, 0x0002,
++      0x21a0, 0x21bb, 0x21d6, 0x21a0, 0x21ef, 0x21af, 0x2341, 0x2357,
++      0x21a0, 0x21b9, 0x21d4, 0x2232, 0x22a0, 0x22e9, 0x22fa, 0x2357,
++      0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705, 0x600a,
++      0x080c, 0x23ca, 0x609c, 0x78ba, 0x080c, 0x24b3, 0x0005, 0x78bc,
++      0xa084, 0x0100, 0x0108, 0x0c60, 0x601c, 0xa085, 0x0080, 0x601e,
++      0x0038, 0x080c, 0x250a, 0x78bc, 0xa084, 0x0100, 0x0108, 0x0c00,
++      0x78bf, 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001,
++      0x0140, 0x080c, 0x23ca, 0x0128, 0x78bc, 0xa085, 0x0100, 0x78be,
++      0x0010, 0x0804, 0x23e6, 0x0005, 0x080c, 0x2507, 0x78bc, 0xa08c,
++      0x0e00, 0x1118, 0xa084, 0x0100, 0x1108, 0x0810, 0x080c, 0x23ca,
++      0x1168, 0x6104, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0904, 0x2394,
++      0xa186, 0x000f, 0x0904, 0x2394, 0x0804, 0x23e6, 0x0005, 0x78bc,
++      0xa084, 0x0100, 0x0110, 0x0804, 0x21a0, 0x78bf, 0x0000, 0x6714,
++      0x080c, 0x1cc4, 0x2011, 0x0001, 0x20a9, 0x0001, 0x6018, 0xa084,
++      0x00ff, 0xa005, 0x0198, 0x2011, 0x0001, 0xa7bc, 0xff00, 0x20a9,
++      0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc, 0x8000, 0x2011, 0x0002,
++      0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108, 0x00c8, 0x0156, 0x080c,
++      0x1cc4, 0x015e, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000,
++      0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001,
++      0x1f04, 0x221a, 0x8211, 0x0118, 0x20a9, 0x0100, 0x0c58, 0x080c,
++      0x1c95, 0x0005, 0x6114, 0x080c, 0x2525, 0x6900, 0xa184, 0x0001,
++      0x0190, 0x6028, 0xa084, 0x00ff, 0x1904, 0x23ae, 0x6800, 0xa084,
++      0x0001, 0x0904, 0x23b4, 0x6803, 0x0000, 0x680b, 0x0000, 0x6807,
++      0x0000, 0x0804, 0x23ba, 0x2011, 0x0001, 0x6020, 0xd0f4, 0x0110,
++      0xa295, 0x0002, 0xd0c4, 0x0110, 0xa295, 0x0008, 0xd0cc, 0x0110,
++      0xa295, 0x0400, 0x601c, 0xa084, 0x0002, 0x0110, 0xa295, 0x0004,
++      0x602c, 0xa08c, 0x00ff, 0xa182, 0x0002, 0x0a04, 0x23b7, 0xa182,
++      0x001b, 0x1a04, 0x23b7, 0x0904, 0x23b7, 0x690e, 0x602c, 0x8007,
++      0xa08c, 0x00ff, 0xa182, 0x0002, 0x0a04, 0x23b7, 0xa182, 0x001b,
++      0x1a04, 0x23b7, 0x0904, 0x23b7, 0x6912, 0x6134, 0xa184, 0x000f,
++      0x0138, 0x8000, 0xd0a4, 0x0108, 0x8001, 0xa18c, 0xfff0, 0xa10d,
++      0x6922, 0x6030, 0xa005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6816,
++      0x6028, 0xa084, 0x00ff, 0x0904, 0x23b4, 0x6806, 0x6028, 0x8007,
++      0xa084, 0x00ff, 0x0904, 0x23b4, 0x680a, 0x6a02, 0x0804, 0x23ba,
++      0x6014, 0xd0fc, 0x1118, 0x2001, 0xb3a4, 0x0010, 0x2001, 0xb3e4,
++      0x2004, 0xa084, 0x8000, 0x0904, 0x23b4, 0x6114, 0x080c, 0x2525,
++      0x2091, 0x8000, 0x6a04, 0x6b08, 0x6418, 0xa484, 0x0003, 0x0170,
++      0x6128, 0xa18c, 0x00ff, 0x8001, 0x1120, 0x2100, 0xa210, 0x0628,
++      0x0028, 0x8001, 0x1510, 0x2100, 0xa212, 0x02f8, 0xa484, 0x000c,
++      0x0188, 0x6128, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x1120,
++      0x2100, 0xa318, 0x0290, 0x0030, 0xa082, 0x0004, 0x1170, 0x2100,
++      0xa31a, 0x0258, 0x6030, 0xa005, 0x0110, 0x8000, 0x6816, 0x6a06,
++      0x6b0a, 0x2091, 0x8001, 0x0804, 0x23ba, 0x2091, 0x8001, 0x0804,
++      0x23b7, 0x6114, 0x080c, 0x2525, 0x2091, 0x8000, 0x6b08, 0x8318,
++      0x0228, 0x6b0a, 0x2091, 0x8001, 0x0804, 0x23c8, 0x2091, 0x8001,
++      0x0804, 0x23b7, 0x6024, 0x8007, 0xa084, 0x00ff, 0x01e0, 0xa086,
++      0x0080, 0x15e8, 0x20a9, 0x0008, 0x6014, 0xd0fc, 0x1118, 0x2069,
++      0xfc20, 0x0010, 0x2069, 0xfd40, 0x2091, 0x8000, 0x6800, 0xa084,
++      0xfcff, 0x6802, 0xade8, 0x0009, 0x0f04, 0x2317, 0x0cb8, 0x2091,
++      0x8001, 0x0804, 0x23ba, 0x6028, 0xa015, 0x0508, 0x6114, 0x080c,
++      0x2525, 0x00d6, 0xade8, 0x0007, 0x2091, 0x8000, 0x6800, 0xa00d,
++      0x0198, 0xa206, 0x0110, 0x2168, 0x0cc8, 0x00c6, 0x2160, 0x6000,
++      0x6802, 0x080c, 0x1c95, 0x00ce, 0x00de, 0x6808, 0x8000, 0x680a,
++      0x2091, 0x8001, 0x0804, 0x23c8, 0x2091, 0x8001, 0x00de, 0x0804,
++      0x23b4, 0x6114, 0x080c, 0x2525, 0x6800, 0xa084, 0x0001, 0x0904,
++      0x23a8, 0x2091, 0x8000, 0x6a04, 0x8210, 0x0228, 0x6a06, 0x2091,
++      0x8001, 0x0804, 0x23c8, 0x2091, 0x8001, 0x0804, 0x23b7, 0x6114,
++      0x080c, 0x2525, 0x60ce, 0x60bb, 0x0000, 0x6018, 0xa08c, 0xff00,
++      0x6820, 0xa084, 0x00ff, 0xa105, 0x601a, 0x6900, 0xa184, 0x0008,
++      0x0120, 0x6020, 0xa085, 0x0100, 0x6022, 0xa184, 0x0001, 0x0904,
++      0x23b4, 0xa184, 0x0100, 0x1588, 0xa184, 0x0200, 0x1558, 0x681c,
++      0xa005, 0x1588, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000f, 0x1110,
++      0x080c, 0x250a, 0x78bf, 0x0000, 0x6004, 0x8007, 0xa084, 0x00ff,
++      0x78b2, 0x8001, 0x609f, 0x0000, 0x0138, 0x04e1, 0x0128, 0x78bc,
++      0xa085, 0x0100, 0x78be, 0x0005, 0x78b7, 0x0000, 0x78bb, 0x0000,
++      0x6024, 0xa084, 0xff00, 0x6026, 0x080c, 0x42ef, 0x1108, 0x0005,
++      0x0804, 0x1ed6, 0x2009, 0x0017, 0x00b8, 0x2009, 0x000e, 0x00a0,
++      0x2009, 0x0007, 0x0088, 0x2009, 0x0035, 0x0070, 0x2009, 0x003e,
++      0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, 0x2009,
++      0x0016, 0x0010, 0x2009, 0x0001, 0x6024, 0xa084, 0xff00, 0xa105,
++      0x6026, 0x2091, 0x8000, 0x080c, 0x2076, 0x2091, 0x8001, 0x0005,
++      0x0804, 0x1c95, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6,
++      0x1110, 0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002, 0x78b8, 0xad06,
++      0x1108, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x1138, 0x78bc, 0xa084,
++      0xfeff, 0x78be, 0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6, 0xa02e,
++      0x2530, 0x65ae, 0x65b2, 0x601c, 0x60a2, 0x2048, 0xa984, 0xe1ff,
++      0x601e, 0xa984, 0x0060, 0x0110, 0x080c, 0x5365, 0x6596, 0x65a6,
++      0x669a, 0x66aa, 0x6714, 0x2071, 0xb3c0, 0xd7fc, 0x1110, 0x2071,
++      0xb380, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x0120, 0x8003,
++      0x8003, 0x8003, 0x8003, 0xa105, 0x71e0, 0xa168, 0x2700, 0x8007,
++      0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0x71e4, 0xa100,
++      0x60c6, 0x2091, 0x8000, 0x780c, 0xd0c4, 0x0160, 0xd0ec, 0x0138,
++      0xd7fc, 0x1118, 0xd0f4, 0x1158, 0x0028, 0xd0fc, 0x1140, 0x7808,
++      0xd0f4, 0x1128, 0x6e08, 0xd684, 0x0560, 0xd9fc, 0x1550, 0x2091,
++      0x8001, 0x080c, 0x1d3b, 0x2091, 0x8000, 0x080c, 0x2076, 0x2091,
++      0x8001, 0x78b7, 0x0000, 0x78bb, 0x0000, 0x780c, 0xd0e4, 0x1904,
++      0x24b1, 0x780c, 0xd0c4, 0x0904, 0x24b1, 0xd0ec, 0x0150, 0xd7fc,
++      0x1120, 0xd0f4, 0x1150, 0x0804, 0x24b1, 0xd0fc, 0x1130, 0x0804,
++      0x24b1, 0x7808, 0xd0f4, 0x0904, 0x24b1, 0x601b, 0x0021, 0x0804,
++      0x24b1, 0x6024, 0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x6a10,
++      0x6814, 0xa202, 0x0248, 0x0140, 0x2091, 0x8001, 0x2039, 0x0200,
++      0x080c, 0x24b3, 0x0804, 0x24b1, 0x2c08, 0xd9fc, 0x01f0, 0x6800,
++      0xa065, 0x01d8, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0168, 0x7050,
++      0xa206, 0x1150, 0x6b04, 0x2160, 0x2304, 0x6002, 0xa005, 0x1108,
++      0x6902, 0x2260, 0x6102, 0x0098, 0x2d00, 0x2060, 0x080c, 0x2af4,
++      0x6e08, 0x2160, 0x6202, 0x6906, 0x0050, 0x6800, 0x6902, 0xa065,
++      0x0110, 0x6102, 0x0008, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160,
++      0xd9fc, 0x0138, 0xa6b4, 0xffdc, 0x6e0a, 0x682b, 0x0000, 0x682f,
++      0x0000, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0128,
++      0xa6b6, 0x0040, 0x6e0a, 0x080c, 0x1d4c, 0x78bb, 0x0000, 0x78b7,
++      0x0000, 0x00ee, 0x0005, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000,
++      0x080c, 0x2076, 0x2091, 0x8001, 0x78b8, 0xa065, 0x0128, 0x609c,
++      0x78ba, 0x609f, 0x0000, 0x0c90, 0x78b7, 0x0000, 0x78bb, 0x0000,
++      0x0005, 0x7968, 0x786c, 0x7b84, 0xd384, 0x0118, 0x8000, 0xa112,
++      0x0220, 0xc384, 0x8000, 0xa112, 0x1260, 0x7a74, 0x721a, 0x7a70,
++      0x721e, 0x7a7c, 0x7222, 0x7a78, 0x7226, 0xa006, 0xd384, 0x0108,
++      0x8000, 0x786e, 0x70d2, 0x7904, 0xd19c, 0x01b0, 0x0146, 0x00c6,
++      0x20a1, 0x0030, 0x20a2, 0x20a3, 0x0000, 0x7013, 0x0004, 0x2061,
++      0xfed8, 0x2c14, 0x8c60, 0x2c1c, 0x8c60, 0x2c24, 0x8c60, 0x2c2c,
++      0x080c, 0x204b, 0x00ce, 0x014e, 0x7814, 0xa005, 0x0138, 0x8001,
++      0x7816, 0x1120, 0x0e04, 0x2506, 0x2091, 0x4080, 0x0005, 0x2039,
++      0x251c, 0x0010, 0x2039, 0x2522, 0x2704, 0xa005, 0x0160, 0xac00,
++      0x2068, 0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916,
++      0x680e, 0x8738, 0x0c88, 0x0005, 0x0003, 0x0009, 0x000f, 0x0015,
++      0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x00c6, 0x6014, 0x080c,
++      0x449c, 0x2c68, 0x00ce, 0x0005, 0x78ab, 0x0000, 0x2009, 0xb341,
++      0x2104, 0xd084, 0x0510, 0x6004, 0xa086, 0x0103, 0x11f0, 0x6114,
++      0x6018, 0xa105, 0x11d0, 0x00d6, 0x2069, 0x0000, 0x6818, 0xd084,
++      0x1198, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b,
++      0x0001, 0x2091, 0x4080, 0x00de, 0x080c, 0x2099, 0x0e04, 0x257e,
++      0x7864, 0xa065, 0x19d8, 0x0450, 0x00de, 0x0459, 0x0518, 0x6204,
++      0xa294, 0x00ff, 0xa296, 0x0003, 0x0130, 0x6204, 0xa296, 0x0110,
++      0x1168, 0x78ab, 0x0001, 0x6204, 0xa294, 0xff00, 0x8217, 0x8211,
++      0x0128, 0x85ff, 0x1178, 0x8210, 0xa202, 0x1260, 0x0056, 0x00f1,
++      0x005e, 0x1140, 0x8528, 0x78a8, 0xa005, 0x1120, 0x7864, 0xa065,
++      0x1904, 0x252e, 0x85ff, 0x0120, 0x2091, 0x4080, 0x7890, 0x70d6,
++      0x0005, 0x7b8c, 0x7990, 0x70d4, 0xa102, 0x1118, 0x2300, 0xa005,
++      0x0005, 0x0210, 0xa302, 0x0005, 0x8002, 0x0005, 0xa184, 0xff00,
++      0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100,
++      0x0018, 0x8107, 0x8004, 0x8004, 0x7a98, 0x7b94, 0x7ca0, 0x7d9c,
++      0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0020, 0x6004,
++      0xa086, 0x0103, 0x1128, 0x6028, 0xa005, 0x1110, 0x2009, 0x000c,
++      0x080c, 0x1c39, 0x01e0, 0x78a4, 0x8000, 0x78a6, 0xa086, 0x0002,
++      0x1904, 0x25fc, 0x6014, 0xd0fc, 0x1118, 0x2069, 0xb380, 0x0010,
++      0x2069, 0xb3c0, 0x2091, 0x8000, 0x681b, 0x0003, 0x78a7, 0x0000,
++      0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0468, 0x78a7,
++      0x0000, 0x080c, 0x2099, 0x798c, 0x7890, 0x8000, 0xa10a, 0x1208,
++      0xa006, 0x7892, 0x70d6, 0x7904, 0xd19c, 0x01e8, 0x0006, 0x0146,
++      0x00c6, 0x20a1, 0x0030, 0x20a2, 0xa006, 0x20a2, 0x7013, 0x0004,
++      0x2061, 0xfed8, 0x2c14, 0xa290, 0x0004, 0x8c60, 0x2c1c, 0xa319,
++      0x8c60, 0x2c24, 0xa421, 0x8c60, 0x2c2c, 0xa529, 0x080c, 0x204b,
++      0x00ce, 0x014e, 0x000e, 0xa006, 0x2071, 0x0010, 0x2091, 0x8001,
++      0x0005, 0x2138, 0xd7fc, 0x1118, 0x2009, 0xb39a, 0x0010, 0x2009,
++      0xb3da, 0x2091, 0x8000, 0x200a, 0x00f6, 0xd7fc, 0x1168, 0x2009,
++      0xb380, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x0118, 0x2079, 0x0100,
++      0x0038, 0x2079, 0x0200, 0x0020, 0x2009, 0xb3c0, 0x2079, 0x0100,
++      0x2104, 0xa086, 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009, 0xb384,
++      0x0010, 0x2009, 0xb3c4, 0x2104, 0xa005, 0x1130, 0x7830, 0xa084,
++      0x00c0, 0x1110, 0x781b, 0x0053, 0x00fe, 0x0005, 0x00f6, 0x00e6,
++      0x2c00, 0xa005, 0x1120, 0xa188, 0x0005, 0x2104, 0x0008, 0x6014,
++      0xd0fc, 0x1168, 0x2071, 0xb380, 0x2001, 0xb342, 0x2004, 0xd0ec,
++      0x0118, 0x2079, 0x0100, 0x0038, 0x2079, 0x0200, 0x0020, 0x2071,
++      0xb3c0, 0x2079, 0x0100, 0x2091, 0x8000, 0x7000, 0xa086, 0x0000,
++      0x1510, 0x00b8, 0x2c00, 0xa005, 0x1120, 0xa188, 0x0005, 0x2104,
++      0x0008, 0x6014, 0xd0fc, 0x1158, 0x2001, 0xb342, 0x2004, 0xd0ec,
++      0x0118, 0x2079, 0x0100, 0x0028, 0x2079, 0x0200, 0x0010, 0x2079,
++      0x0100, 0x7830, 0xa084, 0x00c0, 0x1130, 0x2c00, 0xa005, 0x1108,
++      0x2104, 0x781b, 0x0055, 0x2091, 0x8001, 0x00ee, 0x00fe, 0x0005,
++      0x2009, 0x0002, 0x2069, 0xb340, 0x6808, 0xd0ec, 0x1904, 0x26d5,
++      0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x26d5, 0x2071, 0xb3c0,
++      0x2079, 0x0100, 0x2021, 0xb5ff, 0x784b, 0x000f, 0x1104, 0x26a0,
++      0x7838, 0x0cd0, 0x784b, 0x000f, 0x1304, 0x26a0, 0x7838, 0x0cd0,
++      0x20a9, 0x0060, 0x789b, 0x0000, 0x78af, 0x0000, 0x78af, 0x0000,
++      0x1f04, 0x26a4, 0x70ab, 0x009d, 0x2019, 0x5a04, 0x04e1, 0x7003,
++      0x0000, 0x0016, 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd, 0x080c,
++      0x286a, 0x001e, 0x701c, 0xa084, 0x000f, 0x0006, 0x680c, 0xd0e4,
++      0x000e, 0x1118, 0xa085, 0x6300, 0x0010, 0xa085, 0x62c0, 0x7806,
++      0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080, 0x780b, 0x2f08,
++      0x704f, 0x2f08, 0x745a, 0x7057, 0x0000, 0x8109, 0x0188, 0x2071,
++      0xb380, 0x6808, 0xd0ec, 0x0130, 0x2079, 0x0100, 0x2021, 0xb3ff,
++      0x0804, 0x2694, 0x2079, 0x0200, 0x2021, 0xb3ff, 0x0804, 0x269a,
++      0x080c, 0x2930, 0x0005, 0x0136, 0x0146, 0x0156, 0x0046, 0x0016,
++      0x3808, 0x20c1, 0x0020, 0xaf80, 0x002b, 0x20a0, 0x2304, 0xa005,
++      0x789a, 0x0190, 0x8318, 0x2324, 0x8318, 0x2398, 0x24a8, 0xa484,
++      0xff00, 0x0120, 0xa482, 0x0100, 0x20a9, 0x0100, 0x2020, 0x53a6,
++      0xa005, 0x1da0, 0x3318, 0x0c50, 0x21c0, 0x001e, 0x004e, 0x015e,
++      0x014e, 0x013e, 0x0005, 0x0016, 0x00f6, 0xd1bc, 0x1168, 0x0006,
++      0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x2079, 0x0100,
++      0x0028, 0x2079, 0x0200, 0x0010, 0x2079, 0x0100, 0xa18c, 0x000f,
++      0x7804, 0xa084, 0xfff0, 0xa105, 0x7806, 0x00fe, 0x001e, 0x080c,
++      0x286a, 0x0005, 0xd3fc, 0x1168, 0x0006, 0x2001, 0xb342, 0x2004,
++      0xd0ec, 0x000e, 0x0118, 0x2011, 0x0101, 0x0028, 0x2011, 0x0201,
++      0x0010, 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x1f04, 0x2745,
++      0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x0005,
++      0x2019, 0x0002, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x0120, 0x8319,
++      0x2009, 0x0101, 0x0010, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213,
++      0x1f04, 0x275f, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205,
++      0x200a, 0x8319, 0x0118, 0x2009, 0x0201, 0x0c78, 0x0005, 0xd3fc,
++      0x1168, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++      0x2011, 0x0101, 0x0028, 0x2011, 0x0201, 0x0010, 0x2011, 0x0101,
++      0x20a9, 0x000c, 0x810b, 0x1f04, 0x2782, 0xa18c, 0xf000, 0x2204,
++      0xa084, 0x0fff, 0xa105, 0x2012, 0x0005, 0xd3fc, 0x1168, 0x0006,
++      0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x2011, 0x0102,
++      0x0028, 0x2011, 0x0202, 0x0010, 0x2011, 0x0102, 0x2204, 0xa084,
++      0xf0cf, 0xa105, 0x2012, 0x0005, 0x00c6, 0xd1bc, 0x1168, 0x0006,
++      0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x2061, 0x0100,
++      0x0028, 0x2061, 0x0200, 0x0010, 0x2061, 0x0100, 0xc1bc, 0x8103,
++      0x8003, 0xa080, 0x0020, 0x609a, 0x62ac, 0x63ac, 0x00ce, 0x0005,
++      0x00c6, 0xd1bc, 0x1168, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec,
++      0x000e, 0x0118, 0x2061, 0x0100, 0x0028, 0x2061, 0x0200, 0x0010,
++      0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022, 0x609a,
++      0x60a4, 0xa084, 0xffdf, 0x60ae, 0x00ce, 0x0005, 0x00c6, 0xd1bc,
++      0x1168, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++      0x2061, 0x0100, 0x0028, 0x2061, 0x0200, 0x0010, 0x2061, 0x0100,
++      0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0x62ae,
++      0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, 0x0005, 0x2091, 0x8000,
++      0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, 0x284e, 0xd1fc, 0x1118,
++      0x2061, 0xfb00, 0x0010, 0x2061, 0xfc10, 0x080c, 0x2856, 0x0538,
++      0x20a9, 0x0101, 0xd1fc, 0x1118, 0x2061, 0xfa00, 0x0010, 0x2061,
++      0xfb10, 0x00c6, 0x04d9, 0x0128, 0x00ce, 0x8c60, 0x1f04, 0x2819,
++      0x0468, 0x000e, 0xd1fc, 0x1128, 0x2071, 0xb380, 0xa082, 0xfa00,
++      0x0020, 0x2071, 0xb3c0, 0xa082, 0xfb10, 0x707e, 0x717a, 0x2001,
++      0x0004, 0x706a, 0x7087, 0x000f, 0x080c, 0x2601, 0x00a0, 0x60d0,
++      0xa005, 0x11a0, 0xd1fc, 0x1118, 0x2071, 0xb380, 0x0010, 0x2071,
++      0xb3c0, 0x717a, 0x2c00, 0x7082, 0x2001, 0x0006, 0x706a, 0x7087,
++      0x000f, 0x080c, 0x2601, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001,
++      0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, 0x0005, 0x2c04, 0xa005,
++      0x0170, 0x2060, 0x6010, 0xa306, 0x1140, 0x600c, 0xa206, 0x1128,
++      0x6014, 0xa106, 0x1110, 0xa006, 0x0020, 0x6000, 0x0c80, 0xa085,
++      0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, 0xd1bc, 0x1178, 0x2079,
++      0xb380, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++      0x2071, 0x0100, 0x0038, 0x2071, 0x0200, 0x0020, 0x2079, 0xb3c0,
++      0x2071, 0x0100, 0x791c, 0xa18c, 0x000f, 0x70ec, 0xa084, 0x0100,
++      0x000e, 0x0160, 0x810b, 0x810b, 0x810b, 0x810b, 0xd0bc, 0x1118,
++      0xa18d, 0x0f00, 0x0010, 0xa18d, 0x0800, 0x2104, 0x00ee, 0x00fe,
++      0x0005, 0x2001, 0xb341, 0x2004, 0xd0ac, 0x1140, 0x68e4, 0xa08c,
++      0x0020, 0x0120, 0xa084, 0x0006, 0x1108, 0x0009, 0x0005, 0x6014,
++      0x00e6, 0x0036, 0x2018, 0x2071, 0xb900, 0xd0fc, 0x1110, 0x2071,
++      0xb800, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x8003,
++      0xae70, 0x7004, 0xa084, 0x000a, 0x1904, 0x292d, 0x7108, 0xa194,
++      0xff00, 0x0904, 0x292d, 0xa18c, 0x00ff, 0x701c, 0xa084, 0xff00,
++      0x01c0, 0x7004, 0xa085, 0x003a, 0x7006, 0x2001, 0x0009, 0xa102,
++      0x16d8, 0x2001, 0x000a, 0xa102, 0x16d0, 0x2001, 0x000c, 0xa102,
++      0x16c8, 0x701c, 0xa084, 0x00ff, 0x701e, 0x7004, 0xa084, 0xffdf,
++      0x7006, 0x2001, 0x000a, 0xa106, 0x01a8, 0x2001, 0x000c, 0xa106,
++      0x01a0, 0x2001, 0x0012, 0xa106, 0x0198, 0x2001, 0x0014, 0xa106,
++      0x0190, 0x2001, 0x0019, 0xa106, 0x0188, 0x2001, 0x0032, 0xa106,
++      0x0180, 0x00d8, 0x2009, 0x000c, 0x00c8, 0x2009, 0x0012, 0x00b0,
++      0x2009, 0x0014, 0x0098, 0x2009, 0x0019, 0x0080, 0x2009, 0x0020,
++      0x0068, 0x2009, 0x003f, 0x0050, 0x2009, 0x000a, 0x0038, 0x2009,
++      0x000c, 0x0020, 0x2009, 0x0019, 0x0008, 0xa016, 0x2100, 0xa205,
++      0x700a, 0x7004, 0xa085, 0x000a, 0x7006, 0x2071, 0xb340, 0x7004,
++      0xd0bc, 0x0158, 0xd3fc, 0x1120, 0x73ea, 0x2071, 0xb380, 0x0018,
++      0x73ee, 0x2071, 0xb3c0, 0x701b, 0x800f, 0x003e, 0x00ee, 0x0005,
++      0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11d0, 0x2001, 0x04fd, 0x2004,
++      0xa082, 0x0005, 0x12a0, 0x2071, 0x0200, 0x71ec, 0xa18c, 0x1c00,
++      0x810f, 0x810c, 0x810c, 0x2079, 0x0100, 0x78ec, 0xa084, 0x1c00,
++      0x8007, 0x8004, 0x8004, 0xa105, 0xa08a, 0x0007, 0x0208, 0x0005,
++      0x0002, 0x297e, 0x2965, 0x297e, 0x2965, 0x2958, 0x2972, 0x2958,
++      0x7008, 0xa084, 0xc3ff, 0xa085, 0x3000, 0x700a, 0x7808, 0xa084,
++      0xc3ff, 0xa085, 0x3000, 0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff,
++      0xa085, 0x2000, 0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085, 0x2000,
++      0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff, 0xa085, 0x0c00, 0x700a,
++      0x7808, 0xa084, 0xc3ff, 0xa085, 0x0c00, 0x780a, 0x0005, 0x0e04,
++      0x297f, 0x2091, 0x8000, 0x2071, 0x0000, 0x0006, 0x7018, 0xd084,
++      0x1de8, 0x000e, 0x2071, 0x0010, 0x70ca, 0x000e, 0x70c6, 0x70c3,
++      0x8002, 0x70db, 0x0b0c, 0x70df, 0x0001, 0x2071, 0x0000, 0x701b,
++      0x0001, 0x2091, 0x4080, 0x0cf8, 0x7f3c, 0x7e58, 0x7c30, 0x7d38,
++      0xa594, 0x003f, 0xa49c, 0x0003, 0xa484, 0x000f, 0x0002, 0x29b8,
++      0x29b8, 0x29b8, 0x2dbc, 0x4117, 0x29b7, 0x29e0, 0x29e3, 0x29b7,
++      0x29b7, 0x29b7, 0x29b7, 0x29b7, 0x29b7, 0x29b7, 0x29b7, 0x0839,
++      0x8507, 0xa084, 0x003f, 0x0002, 0x29e6, 0x2dbc, 0x2fa8, 0x30d0,
++      0x310e, 0x338a, 0x3681, 0x36f3, 0x3767, 0x3804, 0x38ee, 0x397e,
++      0x29e0, 0x2ec1, 0x3653, 0x29dd, 0x464c, 0x466f, 0x4832, 0x483d,
++      0x4910, 0x29dd, 0x29dd, 0x49e6, 0x49ea, 0x464a, 0x29dd, 0x478d,
++      0x29dd, 0x44e4, 0x29e3, 0x4ad8, 0x4af6, 0x080c, 0x297f, 0x0005,
++      0x781b, 0x0057, 0x0005, 0x781b, 0x00e1, 0x0005, 0x724a, 0xa584,
++      0x0001, 0x1904, 0x44f6, 0x0160, 0x080c, 0x297f, 0x7003, 0x0000,
++      0x7053, 0x0000, 0x704b, 0x0000, 0x7043, 0x0000, 0x080c, 0x40d4,
++      0x7064, 0xa06d, 0x0140, 0x70f4, 0xa084, 0x0001, 0x7168, 0xa105,
++      0x1110, 0x0804, 0x2b4d, 0x7068, 0xa084, 0x0007, 0x0002, 0x2a0f,
++      0x2a87, 0x2a8f, 0x2a98, 0x2aa1, 0x2b33, 0x2aaa, 0x2a87, 0x7830,
++      0xd0bc, 0x1968, 0x71f0, 0xd1bc, 0x1950, 0xd1b4, 0x1904, 0x2a65,
++      0x70c0, 0xa086, 0x0001, 0x0918, 0x080c, 0x40bd, 0x1900, 0x70d0,
++      0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0090, 0x6b0c, 0x7baa,
++      0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001,
++      0x0118, 0x69c0, 0x7daa, 0x79aa, 0x68c4, 0xa04d, 0x6e1c, 0x7830,
++      0xd0bc, 0x1904, 0x29df, 0x2001, 0x0010, 0x0804, 0x2c89, 0x7064,
++      0xa005, 0x1904, 0x29df, 0x080c, 0x40bd, 0x1904, 0x29df, 0x00c6,
++      0x00d6, 0x70d0, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0090,
++      0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d,
++      0xa886, 0x0001, 0x0118, 0x69c0, 0x7daa, 0x79aa, 0x68c4, 0xa04d,
++      0x6e1c, 0x2001, 0x0020, 0x0804, 0x2c89, 0x080c, 0x40a8, 0x1904,
++      0x29df, 0x70d8, 0xa06d, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x68b4,
++      0x785a, 0x781b, 0x0057, 0x704c, 0xc08d, 0x780a, 0x68c0, 0x703e,
++      0x70f0, 0xc0b4, 0x70f2, 0x70d4, 0xa065, 0x68c4, 0x705e, 0x7003,
++      0x0002, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x0005, 0x080c,
++      0x40a8, 0x1120, 0x781b, 0x0050, 0x7003, 0x0004, 0x0005, 0x080c,
++      0x40a8, 0x1128, 0x2011, 0x000c, 0x0419, 0x7003, 0x0004, 0x0005,
++      0x080c, 0x40a8, 0x1128, 0x2011, 0x0006, 0x00d1, 0x7003, 0x0004,
++      0x0005, 0x080c, 0x40a8, 0x1128, 0x2011, 0x000d, 0x0089, 0x7003,
++      0x0004, 0x0005, 0x080c, 0x40a8, 0x1150, 0x2011, 0x0006, 0x0041,
++      0x7080, 0x7083, 0x0000, 0x2068, 0x7052, 0x7003, 0x0001, 0x0005,
++      0x7178, 0xc1fc, 0x8107, 0x7882, 0x789b, 0x0090, 0xa286, 0x000c,
++      0x1120, 0x7aaa, 0x2001, 0x0001, 0x0098, 0xa18c, 0x001f, 0xa18d,
++      0x00c0, 0x79aa, 0xa286, 0x000d, 0x0120, 0x7aaa, 0x2001, 0x0002,
++      0x0038, 0x78ab, 0x0020, 0x717c, 0x79aa, 0x7aaa, 0x2001, 0x0004,
++      0x789b, 0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x00ef, 0x080c,
++      0x40d4, 0x7087, 0x000f, 0x70f0, 0xd0b4, 0x0168, 0xc0b4, 0x70f2,
++      0x00c6, 0x70d4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018,
++      0x8001, 0x601a, 0x00ce, 0x0005, 0x7010, 0xa005, 0x1138, 0x70f0,
++      0xd0b4, 0x0128, 0x70d4, 0xac06, 0x1110, 0x0c29, 0x0005, 0x0016,
++      0x71c0, 0xa186, 0x0001, 0x0528, 0x00d6, 0x0026, 0x2100, 0x2011,
++      0x0001, 0xa212, 0x70d0, 0x2068, 0x6800, 0xac06, 0x0120, 0x8211,
++      0x01b0, 0x00c9, 0x0cc8, 0x00c6, 0x2100, 0x2011, 0x0001, 0xa212,
++      0x70d0, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a,
++      0x8211, 0x0110, 0x0041, 0x0cb0, 0x70c3, 0x0001, 0x00ce, 0x002e,
++      0x00de, 0x001e, 0x0005, 0xade8, 0x0005, 0x70c8, 0xad06, 0x1110,
++      0x70c4, 0x2068, 0x0005, 0x080c, 0x40a8, 0x1904, 0x29df, 0x7080,
++      0x2068, 0x7778, 0x080c, 0x3fb3, 0x2c50, 0x080c, 0x418d, 0x789b,
++      0x0090, 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041,
++      0x0001, 0x2001, 0x0004, 0x0804, 0x2c8e, 0x080c, 0x40a8, 0x1904,
++      0x29df, 0x789b, 0x0090, 0x7064, 0x2068, 0x6f14, 0x080c, 0x2ae3,
++      0x080c, 0x3fb3, 0x2c50, 0x080c, 0x418d, 0x6824, 0xa005, 0x0130,
++      0xa082, 0x0006, 0x0208, 0x0010, 0x6827, 0x0005, 0x6b14, 0xa39c,
++      0x001f, 0xa39d, 0x00c0, 0x2960, 0x6000, 0x2a60, 0xa084, 0x8000,
++      0x0118, 0xa684, 0x0001, 0x0110, 0xa39c, 0xffbf, 0x7baa, 0x2031,
++      0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0804, 0x2c8e, 0xc28d,
++      0x72f2, 0x72dc, 0xa200, 0xa015, 0x7158, 0x8108, 0xa12a, 0x0208,
++      0x71dc, 0x2164, 0x6504, 0x85ff, 0x1190, 0x715a, 0x8421, 0x1da8,
++      0x70f0, 0xd08c, 0x0128, 0x70ec, 0xa005, 0x1110, 0x70ef, 0x000a,
++      0x7048, 0xa005, 0x0904, 0x44f6, 0x0005, 0x2200, 0x0c70, 0x70f0,
++      0xc08c, 0x70f2, 0x70ef, 0x0000, 0x6034, 0xa005, 0x1db0, 0x6708,
++      0xa784, 0x073f, 0x01a8, 0xd7d4, 0x1d80, 0xa784, 0x0021, 0x1d68,
++      0xd78c, 0x0120, 0xd794, 0x0d48, 0xc794, 0x670a, 0xa784, 0x0218,
++      0x1d20, 0xd7c4, 0x0128, 0x6018, 0xa005, 0x19f8, 0xc7c4, 0x670a,
++      0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e, 0x6318, 0x0128,
++      0x601c, 0xa302, 0x0220, 0x0118, 0x0880, 0x83ff, 0x1970, 0x2d58,
++      0x2c50, 0x715a, 0x68d3, 0x0000, 0xd7bc, 0x1118, 0x7024, 0x6022,
++      0x603a, 0xc7bc, 0x670a, 0x68c4, 0xa065, 0xa04d, 0x6100, 0x2a60,
++      0x2041, 0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc,
++      0x0110, 0xd684, 0x0110, 0xa39c, 0xffbf, 0xd6a4, 0x0110, 0xa39d,
++      0x0020, 0xa684, 0x000e, 0x1904, 0x2c39, 0xc7a5, 0x670a, 0x2c00,
++      0x68ca, 0x77c0, 0xa786, 0x0001, 0x11a8, 0x70f0, 0xd0b4, 0x1190,
++      0x7000, 0xa082, 0x0001, 0x1270, 0x7010, 0xa005, 0x1158, 0x080c,
++      0x40bd, 0x1140, 0x7830, 0xd0bc, 0x1128, 0x789b, 0x0090, 0x7baa,
++      0x0804, 0x2c87, 0x8739, 0x77c2, 0x2750, 0x77cc, 0xa7b0, 0x0005,
++      0x70c8, 0xa606, 0x1108, 0x76c4, 0x76ce, 0x2c3a, 0x8738, 0x2d3a,
++      0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc,
++      0x0140, 0x2091, 0x303d, 0x70f0, 0xa084, 0x303d, 0x2091, 0x8000,
++      0x2090, 0xaad5, 0x0000, 0x0120, 0x8421, 0x2200, 0x1904, 0x2b84,
++      0x0005, 0xd1dc, 0x0904, 0x3c0a, 0x2029, 0x0020, 0xd69c, 0x1120,
++      0x8528, 0xd68c, 0x1108, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108,
++      0xa18c, 0x00ff, 0x70e8, 0xa160, 0x2c64, 0x8cff, 0x0180, 0x6014,
++      0xa706, 0x1dd0, 0x60bc, 0x8001, 0x60be, 0x1d88, 0x2a60, 0x6008,
++      0xc0c5, 0x600a, 0x2200, 0x8421, 0x1904, 0x2b84, 0x0005, 0x2a60,
++      0x610e, 0x69c2, 0x2c00, 0x68ca, 0x8840, 0x6008, 0xc0d5, 0x600a,
++      0x77c0, 0xa786, 0x0001, 0x1904, 0x2c12, 0x70f0, 0xd0b4, 0x1904,
++      0x2c12, 0x7000, 0xa082, 0x0001, 0x1a04, 0x2c12, 0x7010, 0xa005,
++      0x1904, 0x2c12, 0x080c, 0x40bd, 0x1904, 0x2c12, 0x7830, 0xd0bc,
++      0x1904, 0x2c12, 0x789b, 0x0090, 0x7baa, 0x7daa, 0x79aa, 0x2001,
++      0x0002, 0x0006, 0x6018, 0x8000, 0x601a, 0x0008, 0x0006, 0x2960,
++      0x6104, 0x2a60, 0x080c, 0x41d0, 0x1560, 0xa184, 0x0018, 0x0178,
++      0xa184, 0x0010, 0x0118, 0x080c, 0x3dc6, 0x1518, 0xd19c, 0x0138,
++      0x69a0, 0xa184, 0x0600, 0x1118, 0x080c, 0x3cd1, 0x00d0, 0x69a0,
++      0xa184, 0x1e00, 0x01f8, 0xd1dc, 0x0168, 0x00c6, 0x2960, 0x6000,
++      0xc0ed, 0x6002, 0x6104, 0xc1a5, 0x6106, 0x00ce, 0x080c, 0x3dc6,
++      0x1140, 0x69a0, 0xd1cc, 0x0118, 0x080c, 0x3d18, 0x0010, 0xd1d4,
++      0x1d18, 0x69a0, 0xd1e4, 0x0130, 0x6914, 0xa18c, 0xff00, 0x810f,
++      0x080c, 0x27c0, 0x002e, 0xa68c, 0x00e0, 0xa684, 0x0060, 0x0120,
++      0xa086, 0x0060, 0x1108, 0xc1f5, 0xa18d, 0x0104, 0x69b6, 0x789b,
++      0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0168,
++      0xc0fc, 0x708b, 0x0000, 0xa08a, 0x000d, 0x0328, 0xa08a, 0x000c,
++      0x718a, 0x2001, 0x000c, 0x800c, 0x718e, 0x78aa, 0x3518, 0x3340,
++      0x3428, 0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b, 0x0000, 0xad80,
++      0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0, 0xa286, 0x0020,
++      0x11e0, 0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da,
++      0xa286, 0x0002, 0x05d8, 0x70c0, 0x8000, 0x70c2, 0x74d0, 0xa498,
++      0x0005, 0x70c8, 0xa306, 0x1108, 0x73c4, 0x73d2, 0xa286, 0x0010,
++      0x0904, 0x29df, 0x00de, 0x00ce, 0x0005, 0x7000, 0xa005, 0x1d08,
++      0xa286, 0x0002, 0x15d0, 0x080c, 0x40a8, 0x19d8, 0x6814, 0xc0fc,
++      0x8007, 0x7882, 0x68b4, 0x785a, 0x781b, 0x0057, 0x704c, 0xc08d,
++      0x780a, 0x0126, 0x00d6, 0x00c6, 0x70f0, 0xa084, 0x2e00, 0x2090,
++      0x00ce, 0x00de, 0x012e, 0x2900, 0x705e, 0x68c0, 0x703e, 0x7003,
++      0x0002, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x7830, 0xd0bc,
++      0x0140, 0x2091, 0x303d, 0x70f0, 0xa084, 0x303d, 0x2091, 0x8000,
++      0x2090, 0x70c0, 0xa005, 0x1108, 0x0005, 0x8421, 0x0de8, 0x7254,
++      0x70dc, 0xa200, 0xa015, 0x0804, 0x2b84, 0xa286, 0x0010, 0x1530,
++      0x080c, 0x40a8, 0x1904, 0x2d01, 0x6814, 0xc0fc, 0x8007, 0x7882,
++      0x68b4, 0x785a, 0x781b, 0x0057, 0x704c, 0xc08d, 0x780a, 0x70c0,
++      0x8000, 0x70c2, 0x74d0, 0xa490, 0x0005, 0x70c8, 0xa206, 0x1108,
++      0x72c4, 0x72d2, 0x2900, 0x705e, 0x68c0, 0x703e, 0x7003, 0x0002,
++      0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x0005, 0x6bb4, 0xa39d,
++      0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94, 0x7bd6,
++      0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x0057, 0x2900, 0x705e,
++      0x7202, 0x704c, 0xc08d, 0x780a, 0x7200, 0x2300, 0xa605, 0x0170,
++      0x70f0, 0xa084, 0x2e00, 0xa086, 0x2600, 0x1118, 0x2009, 0x0000,
++      0x0010, 0x2009, 0x0001, 0xa284, 0x000f, 0x0023, 0xad80, 0x0009,
++      0x7042, 0x0005, 0x2dba, 0x55dc, 0x55dc, 0x55ca, 0x55dc, 0x2dba,
++      0x2dba, 0x2dba, 0x080c, 0x297f, 0x080c, 0x40a8, 0x7808, 0xa084,
++      0xfffc, 0x780a, 0x00f6, 0x2079, 0xb340, 0x78ac, 0x00fe, 0xd084,
++      0x01b8, 0x7068, 0xa086, 0x0001, 0x1110, 0x0804, 0x2e97, 0x7068,
++      0xa086, 0x0005, 0x1158, 0x7080, 0x2068, 0x681b, 0x0004, 0x6817,
++      0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x706b, 0x0000,
++      0x70c3, 0x0000, 0x70c4, 0x70ce, 0x70d2, 0x70f4, 0xc084, 0x70f6,
++      0x080c, 0x2ae3, 0x2011, 0x0004, 0x7168, 0xa186, 0x0001, 0x0160,
++      0xa186, 0x0007, 0x1118, 0x701b, 0x0005, 0x0030, 0x701b, 0x0001,
++      0x70f0, 0xc0c5, 0x70f2, 0x0000, 0x2001, 0xb348, 0x203c, 0xd7fc,
++      0x1120, 0xae86, 0xb380, 0x0120, 0x0040, 0xae86, 0xb3c0, 0x1128,
++      0xa784, 0x00ff, 0xa086, 0x0018, 0x0130, 0x7014, 0x7012, 0xa005,
++      0x1110, 0x70c3, 0x0001, 0x0066, 0x080c, 0x52e3, 0x0156, 0x20a9,
++      0x0010, 0x2039, 0x0000, 0x080c, 0x3ec6, 0xa7b8, 0x0100, 0x1f04,
++      0x2e1b, 0x015e, 0x006e, 0x7000, 0x0002, 0x2e57, 0x2e35, 0x2e35,
++      0x2e2d, 0x2e57, 0x2e57, 0x2e57, 0x2e57, 0x7064, 0xa005, 0x0538,
++      0xad06, 0x1118, 0x6800, 0x7066, 0x0080, 0x6820, 0xd084, 0x1148,
++      0x6f14, 0x080c, 0x3fb3, 0x6008, 0xc0d4, 0x600a, 0x080c, 0x3be8,
++      0x0020, 0x7060, 0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e,
++      0x6818, 0xd0fc, 0x0108, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000,
++      0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x2085, 0x2011,
++      0x0004, 0xb284, 0x0800, 0x1118, 0x2021, 0xfb00, 0x0010, 0x2021,
++      0xfc10, 0x080c, 0x2ea4, 0xb284, 0x0800, 0x0118, 0x2021, 0xb3d9,
++      0x0010, 0x2021, 0xb399, 0x04c1, 0x0156, 0x20a9, 0x0101, 0xb284,
++      0x0800, 0x1118, 0x2021, 0xfa00, 0x0010, 0x2021, 0xfb10, 0x0461,
++      0x8420, 0x1f04, 0x2e77, 0xb284, 0x0600, 0x0118, 0x2061, 0xba00,
++      0x0010, 0x2061, 0xda00, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6018,
++      0x6110, 0x81ff, 0x0118, 0xa102, 0x0308, 0x6012, 0x601b, 0x0000,
++      0xace0, 0x0010, 0x1f04, 0x2e87, 0x8421, 0x1d78, 0x015e, 0x7090,
++      0xa084, 0x8000, 0x0110, 0x080c, 0x4312, 0x706b, 0x0000, 0x7003,
++      0x0000, 0x7053, 0x0000, 0x0005, 0x0046, 0x2404, 0xa005, 0x01a8,
++      0x2068, 0x6800, 0x0006, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000,
++      0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, 0x00ff, 0xc09d,
++      0x6822, 0x080c, 0x2085, 0x000e, 0x0c48, 0x004e, 0x2023, 0x0000,
++      0x0005, 0xa282, 0x0003, 0x0310, 0x080c, 0x297f, 0x2300, 0x0002,
++      0x2ecb, 0x2f45, 0x2f5f, 0xa282, 0x0002, 0x0110, 0x080c, 0x297f,
++      0x7068, 0x706b, 0x0000, 0x7087, 0x0000, 0x000a, 0x0002, 0x2edf,
++      0x2edf, 0x2ee1, 0x2f19, 0x3c14, 0x2edf, 0x2f19, 0x2edf, 0x080c,
++      0x297f, 0x7778, 0x080c, 0x3ec6, 0x7778, 0xa7bc, 0x8f00, 0x080c,
++      0x3fb3, 0x6018, 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0xfb00,
++      0x0010, 0x2021, 0xfc10, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c,
++      0x2f79, 0x01b8, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021,
++      0xfa00, 0x0010, 0x2021, 0xfb10, 0x0046, 0x2009, 0x0005, 0x2011,
++      0x0010, 0x080c, 0x2f79, 0x004e, 0x0118, 0x8420, 0x1f04, 0x2f04,
++      0x015e, 0x8738, 0xa784, 0x001f, 0x1990, 0x0804, 0x29ee, 0x0804,
++      0x29ee, 0x7778, 0x080c, 0x3fb3, 0x6018, 0xa005, 0x0520, 0xd7fc,
++      0x1118, 0x2021, 0xfb00, 0x0010, 0x2021, 0xfc10, 0x2009, 0x0005,
++      0x2011, 0x0020, 0x080c, 0x2f79, 0x01b0, 0x0156, 0x20a9, 0x0101,
++      0xd7fc, 0x1118, 0x2021, 0xfa00, 0x0010, 0x2021, 0xfb10, 0x0046,
++      0x2009, 0x0005, 0x2011, 0x0020, 0x04e1, 0x004e, 0x0118, 0x8420,
++      0x1f04, 0x2f37, 0x015e, 0x0804, 0x29ee, 0x2200, 0x0002, 0x2f4a,
++      0x2f4c, 0x2f4c, 0x080c, 0x297f, 0x2009, 0x0012, 0x7068, 0xa086,
++      0x0002, 0x0110, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0108, 0x691a,
++      0x706b, 0x0000, 0x70f0, 0xc0c5, 0x70f2, 0x0804, 0x404b, 0x2200,
++      0x0002, 0x2f66, 0x2f4c, 0x2f64, 0x080c, 0x297f, 0x080c, 0x52e3,
++      0x7000, 0xa086, 0x0002, 0x1904, 0x3b9e, 0x080c, 0x3bfa, 0x6008,
++      0xa084, 0xfbef, 0x600a, 0x080c, 0x3b90, 0x0904, 0x3b9e, 0x0804,
++      0x29ee, 0x2404, 0xa005, 0x0548, 0x2068, 0x2d04, 0x0006, 0x6814,
++      0xa706, 0x0118, 0x2d20, 0x000e, 0x0ca8, 0x000e, 0x2022, 0x6817,
++      0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x691a,
++      0x6820, 0xa084, 0x00ff, 0xa205, 0x6822, 0x682b, 0x0000, 0x080c,
++      0x2085, 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xf9ef, 0x600a,
++      0x080c, 0x2aff, 0x080c, 0x3bfa, 0x0005, 0xa085, 0x0001, 0x0ce0,
++      0x2300, 0x0002, 0x2faf, 0x2fad, 0x3057, 0x080c, 0x297f, 0x78ec,
++      0xa084, 0x0001, 0x1170, 0x7000, 0xa086, 0x0004, 0x1110, 0x0804,
++      0x3006, 0x080c, 0x3bfa, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x0804,
++      0x3b9e, 0x78e4, 0xa005, 0x1b04, 0x3006, 0x3208, 0x0006, 0x2001,
++      0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0xa18c, 0x0600, 0x0010,
++      0xa18c, 0x0800, 0x0118, 0x0104, 0x29df, 0x0010, 0x0304, 0x29df,
++      0x2008, 0xa084, 0x0030, 0x1118, 0x781b, 0x0057, 0x0005, 0x78ec,
++      0xa084, 0x0003, 0x0dc8, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
++      0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000,
++      0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007,
++      0x0010, 0x2001, 0x0001, 0x0002, 0x3036, 0x303f, 0x302a, 0x3004,
++      0x409e, 0x409e, 0x3004, 0x304b, 0x080c, 0x297f, 0x7000, 0xa086,
++      0x0004, 0x1190, 0x7068, 0xa086, 0x0002, 0x1130, 0x2011, 0x0002,
++      0x2019, 0x0000, 0x0804, 0x2ec1, 0x7068, 0xa086, 0x0006, 0x0db0,
++      0x7068, 0xa086, 0x0004, 0x0d90, 0x79e4, 0xa184, 0x0030, 0x0120,
++      0x78ec, 0xa084, 0x0003, 0x1110, 0x0804, 0x3653, 0x2001, 0x0003,
++      0x0804, 0x339b, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c,
++      0x3eaa, 0x782b, 0x3008, 0x781b, 0x005d, 0x0005, 0x6818, 0xd0fc,
++      0x0110, 0x681b, 0x001d, 0x080c, 0x3eaa, 0x0804, 0x4073, 0x6818,
++      0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3eaa, 0x782b, 0x3008,
++      0x781b, 0x00dd, 0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d,
++      0x080c, 0x3eaa, 0x782b, 0x3008, 0x781b, 0x00a4, 0x0005, 0xa584,
++      0x000f, 0x11c0, 0x7000, 0x0002, 0x29ee, 0x3064, 0x3066, 0x3b9e,
++      0x3b9e, 0x3b9e, 0x3064, 0x3064, 0x080c, 0x297f, 0x080c, 0x3bfa,
++      0x6008, 0xa084, 0xfbef, 0x600a, 0x080c, 0x3b90, 0x0904, 0x3b9e,
++      0x0804, 0x29ee, 0x78e4, 0xa005, 0x1b04, 0x3006, 0x3208, 0x0006,
++      0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0xa18c, 0x0600,
++      0x0010, 0xa18c, 0x0800, 0x0118, 0x0104, 0x3006, 0x0010, 0x0304,
++      0x3006, 0x2008, 0xa084, 0x0030, 0x1118, 0x781b, 0x0057, 0x0005,
++      0x78ec, 0xa084, 0x0003, 0x0dc8, 0x7884, 0xd0fc, 0x1118, 0xa184,
++      0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001,
++      0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184,
++      0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x30be, 0x30c2, 0x30b7,
++      0x30b5, 0x409e, 0x409e, 0x30b5, 0x4096, 0x080c, 0x297f, 0x080c,
++      0x3eb0, 0x782b, 0x3008, 0x781b, 0x005d, 0x0005, 0x080c, 0x3eb0,
++      0x0804, 0x4073, 0x080c, 0x3eb0, 0x782b, 0x3008, 0x781b, 0x00dd,
++      0x0005, 0x080c, 0x3eb0, 0x782b, 0x3008, 0x781b, 0x00a4, 0x0005,
++      0x2300, 0x0002, 0x30d7, 0x30d5, 0x30d9, 0x080c, 0x297f, 0x0804,
++      0x3804, 0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030,
++      0x0904, 0x3804, 0x78ec, 0xa084, 0x0003, 0x0904, 0x3804, 0xa184,
++      0x0100, 0x0d98, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090,
++      0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050,
++      0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010,
++      0x2001, 0x0001, 0x0002, 0x310b, 0x30c2, 0x302a, 0x404b, 0x409e,
++      0x409e, 0x404b, 0x4096, 0x080c, 0x405b, 0x0005, 0xa282, 0x0005,
++      0x0310, 0x080c, 0x297f, 0x7898, 0x2040, 0x2300, 0x0002, 0x311a,
++      0x3356, 0x3362, 0x2200, 0x0002, 0x3136, 0x3123, 0x3136, 0x3121,
++      0x3338, 0x080c, 0x297f, 0x789b, 0x0018, 0x78a8, 0x2010, 0xa084,
++      0x00ff, 0xa082, 0x0020, 0x0a04, 0x3e69, 0xa08a, 0x0004, 0x1a04,
++      0x3e69, 0x0002, 0x3e69, 0x3e69, 0x3e69, 0x3e1d, 0x789b, 0x0018,
++      0x79a8, 0xa184, 0x0080, 0x0148, 0x0804, 0x3e69, 0x7000, 0xa005,
++      0x1dd8, 0x2011, 0x0004, 0x0804, 0x398f, 0xa184, 0x00ff, 0xa08a,
++      0x0010, 0x1a04, 0x3e69, 0x0002, 0x315e, 0x315c, 0x3171, 0x3175,
++      0x3234, 0x3e69, 0x3e69, 0x3236, 0x3e69, 0x3e69, 0x3334, 0x3334,
++      0x3e69, 0x3e69, 0x3e69, 0x3336, 0x080c, 0x297f, 0xa684, 0x1000,
++      0x0140, 0x2001, 0x0500, 0x8000, 0x8000, 0x783a, 0x781b, 0x009d,
++      0x0005, 0x6818, 0xd0fc, 0x0118, 0x681b, 0x001d, 0x0c90, 0x0804,
++      0x404b, 0x681b, 0x001d, 0x0804, 0x3e98, 0x6920, 0x6922, 0xa684,
++      0x1800, 0x1904, 0x31d1, 0x6820, 0xa084, 0x0001, 0x1904, 0x31d6,
++      0x6818, 0xa086, 0x0008, 0x1110, 0x681b, 0x0000, 0xd6d4, 0x0904,
++      0x3231, 0xd6bc, 0x05a0, 0x708b, 0x0000, 0x6818, 0xa084, 0x003f,
++      0xa08a, 0x000d, 0x0760, 0xa08a, 0x000c, 0x718a, 0x2001, 0x000c,
++      0x800c, 0x718e, 0x789b, 0x0061, 0x78aa, 0x0156, 0x0136, 0x0146,
++      0x0016, 0xb28c, 0x0600, 0x0168, 0x0006, 0x2001, 0xb342, 0x2004,
++      0xd0ec, 0x000e, 0x0118, 0x20a1, 0x012b, 0x0028, 0x20a1, 0x022b,
++      0x0010, 0x20a1, 0x012b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac,
++      0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6038,
++      0xa005, 0x1150, 0x681c, 0xa084, 0x000e, 0x0904, 0x3e98, 0x080c,
++      0x3eb3, 0x782b, 0x3008, 0x0010, 0x8001, 0x603a, 0x781b, 0x005f,
++      0x0005, 0xd6e4, 0x0118, 0x781b, 0x006c, 0x0005, 0xa684, 0x0060,
++      0x0904, 0x322e, 0xd6dc, 0x0904, 0x322e, 0xd6fc, 0x1108, 0x00a0,
++      0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x8007, 0xa084,
++      0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2,
++      0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4, 0x0118, 0xc6f4, 0x7e5a,
++      0x6eb6, 0x7000, 0xa086, 0x0003, 0x1148, 0x0006, 0x080c, 0x52e3,
++      0x080c, 0x55dc, 0x000e, 0x781b, 0x006b, 0x0005, 0xa006, 0x080c,
++      0x56fb, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0120,
++      0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6,
++      0x7bd6, 0x7bde, 0x2300, 0xa405, 0x1130, 0xc6f5, 0x7e5a, 0x6eb6,
++      0x781b, 0x006b, 0x0005, 0x781b, 0x006b, 0x2200, 0xa115, 0x1118,
++      0x080c, 0x55dc, 0x0005, 0x080c, 0x5622, 0x0005, 0x781b, 0x006c,
++      0x0005, 0x781b, 0x005f, 0x0005, 0x080c, 0x297f, 0x0804, 0x32cc,
++      0x00c6, 0x705c, 0x2060, 0x6920, 0xa18c, 0xecff, 0x6922, 0x6000,
++      0xa084, 0xcfdf, 0x6002, 0x080c, 0x3d32, 0xa006, 0x2040, 0x2038,
++      0x080c, 0x3de9, 0x0804, 0x32c0, 0x00c6, 0x705c, 0x2060, 0x2c48,
++      0x7aa8, 0xa294, 0x00ff, 0xa286, 0x0004, 0x11e8, 0x6920, 0xd1e4,
++      0x1180, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006,
++      0x2010, 0x080c, 0x3d35, 0x2029, 0x0000, 0x080c, 0x3de9, 0x0804,
++      0x32c0, 0xa18c, 0xecff, 0x6922, 0x6104, 0xa18c, 0xffdd, 0x6106,
++      0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003, 0x01c0, 0x6104, 0xa184,
++      0x0010, 0x0548, 0x080c, 0x3faf, 0x080c, 0x3dc6, 0x88ff, 0x0518,
++      0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a,
++      0xd6d4, 0x1110, 0x0804, 0x4056, 0x0804, 0x3ccc, 0x6920, 0xd1cc,
++      0x0130, 0xa18c, 0xfdff, 0x6922, 0x6000, 0xc0ec, 0x6002, 0x2039,
++      0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x2029,
++      0x0000, 0x080c, 0x3de9, 0xa286, 0x0001, 0x0158, 0x6104, 0xa184,
++      0x0008, 0x01b0, 0x080c, 0x3faf, 0x080c, 0x3cd1, 0x88ff, 0x1980,
++      0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c, 0xfeff, 0x6922, 0x6000,
++      0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x3d35,
++      0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x005f, 0x0005, 0x781b,
++      0x006c, 0x0005, 0x0804, 0x3e92, 0x2808, 0x789b, 0x0090, 0x2019,
++      0x0090, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x11b8, 0x2300,
++      0xa102, 0xa086, 0x0001, 0x0904, 0x3238, 0x7ca8, 0xa4a4, 0x00ff,
++      0xa480, 0x0002, 0xa300, 0x2018, 0xa102, 0x0a04, 0x324c, 0x0904,
++      0x324c, 0x24a8, 0x7aa8, 0x1f04, 0x32ea, 0x0c18, 0xa284, 0x00f0,
++      0xa082, 0x0020, 0x06a8, 0x2200, 0xa082, 0x0021, 0x1688, 0x7aa8,
++      0x8318, 0x8318, 0x2100, 0xa302, 0x0aa0, 0xa286, 0x0023, 0x0950,
++      0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5,
++      0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x78a0, 0x8001, 0x0904,
++      0x32c0, 0x20a8, 0x7998, 0x789b, 0x0060, 0x78aa, 0x2011, 0x0090,
++      0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa, 0x7a98, 0x1f04, 0x3318,
++      0xc695, 0x7e5a, 0xd6d4, 0x1110, 0x0804, 0x4056, 0x0804, 0x3ccc,
++      0x8318, 0x2100, 0xa302, 0x0a04, 0x32d1, 0xa284, 0x0080, 0x1904,
++      0x3e98, 0x78a0, 0xa005, 0x08d8, 0x0804, 0x3e98, 0x0804, 0x3e69,
++      0x705c, 0xa04d, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e,
++      0x0001, 0x0110, 0x080c, 0x297f, 0x7aa8, 0xa294, 0x00ff, 0x784b,
++      0x0008, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0005, 0x1a04, 0x3e69,
++      0x0002, 0x3e69, 0x3c48, 0x3e69, 0x3d77, 0x4218, 0xa282, 0x0000,
++      0x1110, 0x080c, 0x297f, 0x080c, 0x3eaa, 0x782b, 0x3008, 0x781b,
++      0x006c, 0x0005, 0xa282, 0x0003, 0x1110, 0x080c, 0x297f, 0xd4fc,
++      0x11d0, 0x7068, 0xa005, 0x0110, 0x080c, 0x297f, 0x6f14, 0x777a,
++      0xa7bc, 0x8f00, 0x080c, 0x3fb3, 0x6008, 0xa085, 0x0021, 0x600a,
++      0x8738, 0xa784, 0x001f, 0x1db0, 0x080c, 0x3ead, 0x706b, 0x0002,
++      0x701b, 0x0009, 0x0010, 0x080c, 0x3eb6, 0x782b, 0x3008, 0x781b,
++      0x006c, 0x0005, 0xa282, 0x0004, 0x0310, 0x080c, 0x297f, 0x2300,
++      0x0002, 0x3394, 0x34a8, 0x34d4, 0xa286, 0x0003, 0x0110, 0x080c,
++      0x297f, 0x2001, 0x0000, 0x7046, 0x68d0, 0xa005, 0x0110, 0x7003,
++      0x0003, 0x68a0, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a, 0x7000,
++      0xa084, 0x000f, 0x0002, 0x29ee, 0x33b8, 0x33b5, 0x359e, 0x363b,
++      0x29ee, 0x33b3, 0x33b3, 0x080c, 0x297f, 0x6008, 0xc0d4, 0x600a,
++      0xd6e4, 0x1130, 0x080c, 0x52e3, 0x2009, 0x0000, 0x0804, 0x345a,
++      0x7868, 0xa08c, 0x00ff, 0x0588, 0xa186, 0x0008, 0x1158, 0x6008,
++      0xc0a4, 0x600a, 0x080c, 0x3b90, 0x0540, 0x080c, 0x3bfa, 0x080c,
++      0x52e3, 0x0060, 0xa186, 0x0028, 0x1500, 0x6018, 0xa005, 0x0d78,
++      0x8001, 0x0d68, 0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820, 0xd084,
++      0x0904, 0x29ee, 0xc084, 0x6822, 0x080c, 0x2af4, 0x7060, 0x00c6,
++      0x2060, 0x6800, 0x6002, 0x00ce, 0x6004, 0x6802, 0xa005, 0x2d00,
++      0x1108, 0x6002, 0x6006, 0x0804, 0x29ee, 0x0016, 0x81ff, 0x11d8,
++      0x71f0, 0xd1bc, 0x11c0, 0xd1b4, 0x01b0, 0x080c, 0x40a8, 0x1198,
++      0x00d6, 0x70d8, 0xa06d, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x68b4,
++      0x785a, 0x781b, 0x0057, 0x704c, 0xc08d, 0x780a, 0xc1b4, 0x71f2,
++      0x7003, 0x0030, 0x00de, 0x080c, 0x34e7, 0x001e, 0x81ff, 0x0904,
++      0x345a, 0xa684, 0x5f00, 0x681e, 0x682b, 0x0000, 0x6f14, 0xa186,
++      0x0002, 0x15c8, 0x080c, 0x2ae3, 0x080c, 0x2aff, 0x6820, 0xa084,
++      0x0800, 0x1588, 0x8717, 0xa294, 0x000f, 0x8213, 0x8213, 0x8213,
++      0x8213, 0xb284, 0x0600, 0x0118, 0xa290, 0xb800, 0x0010, 0xa290,
++      0xb900, 0xa290, 0x0000, 0x221c, 0xd3c4, 0x1108, 0x0070, 0x6820,
++      0xd0e4, 0x0128, 0xa084, 0xefff, 0x6822, 0xc3ac, 0x2312, 0x8210,
++      0x2204, 0xa085, 0x0038, 0x2012, 0x8211, 0xd3d4, 0x0138, 0x68a0,
++      0xd0c4, 0x1120, 0x080c, 0x3555, 0x0804, 0x29ee, 0x6008, 0xc08d,
++      0x600a, 0x0008, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0110, 0x7044,
++      0x681a, 0xa68c, 0x5f00, 0x691e, 0x6010, 0xa005, 0x0120, 0x8001,
++      0x1310, 0x080c, 0x297f, 0x6012, 0x6018, 0xa005, 0x0118, 0x8001,
++      0x601a, 0x1118, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, 0x1130,
++      0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0020, 0x7060, 0x2060,
++      0x6800, 0x6002, 0x2061, 0xb340, 0x6807, 0x0103, 0x2d08, 0x206b,
++      0x0000, 0x605c, 0x8000, 0x605e, 0x6060, 0xa005, 0x6162, 0x0110,
++      0x2d02, 0x0008, 0x6166, 0x7000, 0xa086, 0x0030, 0x1904, 0x29ee,
++      0x7003, 0x0002, 0x70d8, 0xa06d, 0x68c0, 0x703e, 0x70d4, 0xa065,
++      0x68c4, 0x705e, 0x2d00, 0x7052, 0xad80, 0x0009, 0x7042, 0x0005,
++      0xa282, 0x0004, 0x0210, 0x080c, 0x297f, 0x2200, 0x0002, 0x34ab,
++      0x34b3, 0x34be, 0x34b3, 0x7000, 0xa086, 0x0005, 0x0120, 0x080c,
++      0x3eaa, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0x7890, 0x8007,
++      0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c,
++      0x00ff, 0xa186, 0x0003, 0x0128, 0xa186, 0x0000, 0x0110, 0x0804,
++      0x3e69, 0x781b, 0x006c, 0x0005, 0x6820, 0xc095, 0x6822, 0x82ff,
++      0x1118, 0x080c, 0x3eaa, 0x0030, 0x8211, 0x0110, 0x080c, 0x297f,
++      0x080c, 0x3eb6, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0xa684,
++      0x0060, 0x1150, 0x2d00, 0xa005, 0x0904, 0x3554, 0x682f, 0x0000,
++      0x6833, 0x0000, 0x0804, 0x3554, 0xd6dc, 0x1190, 0x68b4, 0xd0dc,
++      0x1178, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7044, 0xa005, 0x1128,
++      0x2200, 0xa105, 0x0120, 0x7047, 0x0015, 0x0804, 0x52e3, 0x0005,
++      0xd6ac, 0x0508, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833, 0x0000,
++      0x0804, 0x52e3, 0x68b4, 0xa084, 0x4000, 0xa635, 0xd6f4, 0x1da0,
++      0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0xd6dc, 0x1130, 0x68b4,
++      0xd0dc, 0x0118, 0x69a8, 0x6aa4, 0x0010, 0x79d8, 0x7adc, 0x692e,
++      0x6a32, 0x0804, 0x52e3, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833,
++      0x0000, 0x0804, 0x52e3, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4,
++      0x1da0, 0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0x79d8, 0x7adc,
++      0x78d0, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x692e,
++      0x6a32, 0x2100, 0xa205, 0x1110, 0x0804, 0x52e3, 0x7000, 0xa086,
++      0x0006, 0x0110, 0x0804, 0x52e3, 0x0005, 0x6008, 0xc0cd, 0xd3cc,
++      0x0108, 0xc08d, 0x600a, 0x6818, 0x68ba, 0x681b, 0x0006, 0x688f,
++      0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f,
++      0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b,
++      0x0020, 0x68b3, 0x0000, 0x68af, 0x0000, 0x7000, 0x0002, 0x29ee,
++      0x3587, 0x3581, 0x357f, 0x357f, 0x357f, 0x357f, 0x357f, 0x080c,
++      0x297f, 0x6820, 0xd084, 0x1118, 0x080c, 0x3be8, 0x0030, 0x7060,
++      0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, 0xb28c, 0x0600, 0x0118,
++      0x2021, 0xb399, 0x0010, 0x2021, 0xb3d9, 0x2404, 0xa005, 0x0110,
++      0x2020, 0x0cd8, 0x2d22, 0x206b, 0x0000, 0x0005, 0x080c, 0x3bee,
++      0x080c, 0x3bfa, 0x6008, 0xc0cc, 0x600a, 0x789b, 0x000e, 0x6f14,
++      0x6817, 0x0002, 0xb28c, 0x0600, 0x0118, 0x2009, 0x0000, 0x0010,
++      0x2009, 0x0001, 0x080c, 0x5736, 0xd6dc, 0x01c8, 0x691c, 0xc1ed,
++      0x691e, 0x6828, 0xa082, 0x000e, 0x0290, 0x6848, 0xa084, 0x000f,
++      0xa086, 0x000b, 0x1160, 0x685c, 0xa086, 0x0047, 0x1140, 0x2001,
++      0xb341, 0x2004, 0xd0ac, 0x1118, 0x2700, 0x080c, 0x28a8, 0x68b8,
++      0xd0fc, 0x1110, 0x681a, 0x0060, 0x6818, 0xd0fc, 0x0148, 0x7868,
++      0xa08c, 0x00ff, 0x0118, 0x681b, 0x001e, 0x0010, 0x681b, 0x0000,
++      0xb284, 0x0600, 0x1118, 0x2021, 0xb3d9, 0x0010, 0x2021, 0xb399,
++      0x2404, 0xad06, 0x0108, 0x7460, 0x6800, 0x2022, 0x68d3, 0x0000,
++      0x70f4, 0xc084, 0x70f6, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x68c4,
++      0x2060, 0x6000, 0xd0a4, 0x0580, 0x2041, 0x0021, 0x2049, 0x0005,
++      0x2051, 0x0020, 0x00d6, 0x00f6, 0x0156, 0x0146, 0x2079, 0xb340,
++      0x080c, 0x1cd8, 0x014e, 0x015e, 0x00fe, 0x70e8, 0x2010, 0x2009,
++      0x0101, 0x0026, 0x2204, 0xa06d, 0x0140, 0x6814, 0xa706, 0x0110,
++      0x6800, 0x0cc8, 0x6820, 0xc0d5, 0x6822, 0x002e, 0x8210, 0x8109,
++      0x1d80, 0x00de, 0x706b, 0x0003, 0x7083, 0x0000, 0x777a, 0x7087,
++      0x000f, 0x71f0, 0xc1c4, 0x71f2, 0x6818, 0xa086, 0x0002, 0x1138,
++      0x6817, 0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec, 0x681e, 0x080c,
++      0x2085, 0x0804, 0x29ee, 0x080c, 0x34e7, 0x682b, 0x0000, 0x789b,
++      0x000e, 0x6f14, 0x080c, 0x40d9, 0xa08c, 0x00ff, 0x6916, 0x6818,
++      0xd0fc, 0x0110, 0x7044, 0x681a, 0xa68c, 0x5f00, 0x691e, 0x706b,
++      0x0000, 0x0804, 0x29ee, 0x7000, 0xa005, 0x1110, 0x0804, 0x29ee,
++      0xa006, 0x080c, 0x52e3, 0x6817, 0x0000, 0x6920, 0xd1ac, 0x1110,
++      0x681b, 0x0014, 0xa68c, 0x5f00, 0x691e, 0x682b, 0x0000, 0x6820,
++      0xa084, 0x00ff, 0x6822, 0x7000, 0x0002, 0x29ee, 0x367a, 0x3677,
++      0x367c, 0x367c, 0x367c, 0x3675, 0x3675, 0x080c, 0x297f, 0x6008,
++      0xc0d4, 0x600a, 0x080c, 0x3bfa, 0x6008, 0xc0a4, 0x600a, 0x0804,
++      0x3bb3, 0x2300, 0x0002, 0x3686, 0x3688, 0x36f1, 0x080c, 0x297f,
++      0xd6fc, 0x1904, 0x36da, 0x7000, 0xa00d, 0x0002, 0x29ee, 0x369e,
++      0x3698, 0x36c8, 0x369e, 0x36d1, 0x3696, 0x3696, 0x080c, 0x297f,
++      0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060,
++      0x0538, 0xa086, 0x0060, 0x1510, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a,
++      0x6eb6, 0x681c, 0xc0ac, 0x681e, 0xa186, 0x0002, 0x0148, 0x080c,
++      0x52e3, 0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x5622, 0x0010,
++      0x080c, 0x55dc, 0x781b, 0x006c, 0x71f0, 0xd1b4, 0x1904, 0x29df,
++      0x70c0, 0xa086, 0x0001, 0x1904, 0x2a3f, 0x0005, 0xd6ec, 0x09f0,
++      0x6818, 0xd0fc, 0x0130, 0x681b, 0x0015, 0xd6f4, 0x0110, 0x681b,
++      0x0007, 0x080c, 0x405b, 0x0005, 0x78cb, 0x0000, 0x781b, 0x00d8,
++      0x0804, 0x29df, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x78d0, 0x79d2,
++      0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100,
++      0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x006c,
++      0x0005, 0x080c, 0x297f, 0x2300, 0x0002, 0x36f8, 0x36fa, 0x3752,
++      0x080c, 0x297f, 0xd6fc, 0x1904, 0x3742, 0x7000, 0xa00d, 0x0002,
++      0x29ee, 0x3710, 0x370a, 0x373a, 0x3710, 0x373f, 0x3708, 0x3708,
++      0x080c, 0x297f, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da,
++      0xa684, 0x0060, 0x0538, 0xa086, 0x0060, 0x1510, 0xa6b4, 0xbfbf,
++      0xc6ed, 0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0148, 0x080c, 0x52e3,
++      0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x5622, 0x0010, 0x080c,
++      0x55dc, 0x781b, 0x006c, 0x681c, 0xc0b4, 0x681e, 0x71f0, 0xd1b4,
++      0x1904, 0x29df, 0x70c0, 0xa086, 0x0001, 0x1904, 0x2a3f, 0x0005,
++      0xd6ec, 0x09f0, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x0007, 0x781b,
++      0x00dd, 0x0005, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100,
++      0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b,
++      0x006c, 0x0005, 0xd6dc, 0x0130, 0x782b, 0x3009, 0x781b, 0x006c,
++      0x0804, 0x29df, 0x6820, 0xc095, 0x6822, 0x080c, 0x4042, 0xc6dd,
++      0x080c, 0x3eaa, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0x2300,
++      0x0002, 0x376c, 0x376e, 0x3770, 0x080c, 0x297f, 0x0804, 0x3e98,
++      0x7d98, 0xd6d4, 0x1904, 0x37bc, 0x79e4, 0xd1ac, 0x0130, 0x78ec,
++      0xa084, 0x0003, 0x0110, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab,
++      0x0000, 0xa684, 0xfffb, 0x785a, 0x7d9a, 0x79e4, 0xd1ac, 0x0120,
++      0x78ec, 0xa084, 0x0003, 0x11b8, 0x2001, 0xb342, 0x2004, 0xd0e4,
++      0x1170, 0x6820, 0xd0c4, 0x0158, 0x00c6, 0x705c, 0x2060, 0x6004,
++      0xc09d, 0x6006, 0x6008, 0xa084, 0x00ff, 0x600a, 0x00ce, 0x2001,
++      0x0014, 0x0804, 0x339b, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007,
++      0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000,
++      0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007,
++      0x0010, 0x2001, 0x0001, 0x0492, 0x7a90, 0xa294, 0x0007, 0x789b,
++      0x0060, 0x79a8, 0x81ff, 0x0538, 0x789b, 0x0090, 0x7ba8, 0xa384,
++      0x0001, 0x11a0, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x1118, 0x2009,
++      0xfff7, 0x0028, 0xa386, 0x0003, 0x1148, 0x2009, 0xffef, 0x00c6,
++      0x705c, 0x2060, 0x6004, 0xa104, 0x6006, 0x00ce, 0x789b, 0x0060,
++      0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920,
++      0xa18c, 0xfcff, 0x6922, 0x7d9a, 0x0804, 0x404b, 0x3036, 0x303f,
++      0x37f8, 0x37fe, 0x37f6, 0x37f6, 0x404b, 0x404b, 0x080c, 0x297f,
++      0x6920, 0xa18c, 0xfcff, 0x6922, 0x0804, 0x4053, 0x6920, 0xa18c,
++      0xfcff, 0x6922, 0x0804, 0x404b, 0x79e4, 0xa184, 0x0030, 0x0120,
++      0x78ec, 0xa084, 0x0003, 0x1548, 0x7000, 0xa086, 0x0004, 0x1190,
++      0x7068, 0xa086, 0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000,
++      0x0804, 0x2ec1, 0x7068, 0xa086, 0x0006, 0x0db0, 0x7068, 0xa086,
++      0x0004, 0x0d90, 0x7000, 0xa086, 0x0000, 0x0904, 0x29df, 0x6820,
++      0xd0ac, 0x1904, 0x339b, 0x6818, 0xa08e, 0x0002, 0x0120, 0xc0fd,
++      0x681a, 0x2001, 0x0014, 0x0804, 0x339b, 0x7884, 0xd0fc, 0x1118,
++      0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118,
++      0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118,
++      0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x404b, 0x404b,
++      0x3856, 0x404b, 0x409e, 0x409e, 0x404b, 0x404b, 0xd6bc, 0x05d0,
++      0x7188, 0x81ff, 0x05b8, 0xa182, 0x000d, 0x1318, 0x708b, 0x0000,
++      0x0028, 0xa182, 0x000c, 0x708a, 0x2009, 0x000c, 0x789b, 0x0061,
++      0x79aa, 0x0156, 0x0136, 0x0146, 0x708c, 0x8114, 0xa210, 0x728e,
++      0xa080, 0x000b, 0xad00, 0x2098, 0x0016, 0xb28c, 0x0600, 0x0168,
++      0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x20a1,
++      0x012b, 0x0028, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x001e,
++      0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x014e, 0x013e, 0x015e,
++      0x0804, 0x4053, 0xd6d4, 0x1904, 0x38df, 0x6820, 0xd084, 0x0904,
++      0x4053, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0120, 0xa086, 0x0060,
++      0x1108, 0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab,
++      0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa, 0x8008,
++      0x810c, 0x0904, 0x3c0f, 0xa18c, 0x00f8, 0x1904, 0x3c0f, 0x0156,
++      0x0136, 0x0146, 0x0016, 0xb28c, 0x0600, 0x0168, 0x0006, 0x2001,
++      0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x20a1, 0x012b, 0x0028,
++      0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x001e, 0x789b, 0x0000,
++      0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e,
++      0x015e, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0804, 0x4053, 0x6818,
++      0xd0fc, 0x0110, 0x681b, 0x0008, 0x6820, 0xc0ad, 0x6822, 0x080c,
++      0x3eb0, 0x78cb, 0x0000, 0x781b, 0x00d4, 0x0005, 0x2300, 0x0002,
++      0x38f5, 0x397c, 0x38f3, 0x080c, 0x297f, 0x7000, 0xa084, 0x000f,
++      0x0002, 0x29ee, 0x3939, 0x3903, 0x390a, 0x3901, 0x29ee, 0x3901,
++      0x3901, 0x080c, 0x297f, 0x681c, 0xd0ec, 0x0198, 0x6008, 0xc08d,
++      0x600a, 0x0078, 0x68d0, 0xa005, 0x1560, 0x6920, 0xa18d, 0x0001,
++      0x6922, 0x68d3, 0x0001, 0x70f4, 0xc085, 0x70f6, 0x6800, 0x7066,
++      0x0078, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005, 0x1108,
++      0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084, 0x000e, 0x1140,
++      0x2009, 0xfc10, 0xb284, 0x0600, 0x0140, 0x2009, 0xfb00, 0x0028,
++      0x702c, 0x68be, 0x713c, 0x70e8, 0xa108, 0x2104, 0x6802, 0x2d0a,
++      0x7162, 0x6eb6, 0xa684, 0x0060, 0x1120, 0xa684, 0x7fff, 0x68b6,
++      0x04c8, 0xd6dc, 0x1150, 0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6,
++      0x6898, 0x68aa, 0x080c, 0x52e3, 0x0468, 0xd6ac, 0x0168, 0x68d0,
++      0xa005, 0x0118, 0x080c, 0x5736, 0x0010, 0x080c, 0x52e3, 0x79d8,
++      0x7adc, 0x69aa, 0x6aa6, 0x0030, 0x080c, 0x3fc5, 0x69aa, 0x6aa6,
++      0x080c, 0x52e3, 0xd6fc, 0x01b0, 0xa684, 0x7fff, 0x68b6, 0x7adc,
++      0x79d8, 0xd6ac, 0x1138, 0x78d0, 0x8007, 0xa084, 0x007f, 0xa108,
++      0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200,
++      0xa303, 0x68ae, 0x0804, 0x29ee, 0x0804, 0x3e98, 0x7043, 0x0000,
++      0xa282, 0x0006, 0x0310, 0x080c, 0x297f, 0x7000, 0xa086, 0x0007,
++      0x090c, 0x41a1, 0x2300, 0x0002, 0x398f, 0x39c1, 0x39de, 0x2200,
++      0x0002, 0x39bf, 0x3e98, 0x3997, 0x39bf, 0x39fe, 0x3a65, 0x7003,
++      0x0005, 0xb284, 0x0600, 0x0118, 0x2001, 0xfe60, 0x0010, 0x2001,
++      0xfe97, 0x2068, 0x7052, 0x0156, 0x20a9, 0x0037, 0x2003, 0x0000,
++      0x8000, 0x1f04, 0x39a6, 0x015e, 0xad80, 0x0009, 0x7042, 0xb284,
++      0x0600, 0x0118, 0x6817, 0x0000, 0x0010, 0x6817, 0x8000, 0x68b7,
++      0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0804, 0x3e69, 0x080c,
++      0x297f, 0x2200, 0xa086, 0x0003, 0x05c8, 0x7003, 0x0005, 0xb284,
++      0x0600, 0x0118, 0x2001, 0xfe60, 0x0010, 0x2001, 0xfe97, 0x2068,
++      0x7052, 0xad80, 0x0009, 0x7042, 0x2200, 0x0002, 0x3e98, 0x39dc,
++      0x39dc, 0x39fe, 0x39dc, 0x3e98, 0x080c, 0x297f, 0x7003, 0x0005,
++      0xb284, 0x0600, 0x0118, 0x2001, 0xfe60, 0x0010, 0x2001, 0xfe97,
++      0x2068, 0x7052, 0xad80, 0x0009, 0x7042, 0x2200, 0x0002, 0x39f7,
++      0x39f5, 0x39f5, 0x39f7, 0x39f5, 0x39f7, 0x080c, 0x297f, 0x080c,
++      0x3eb6, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0x7000, 0xa086,
++      0x0002, 0x1158, 0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00,
++      0x70da, 0x0038, 0x080c, 0x52e3, 0x0020, 0x7000, 0xa086, 0x0003,
++      0x0dc8, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018,
++      0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0xfb00, 0xb284, 0x0600,
++      0x1118, 0xc2fd, 0x2069, 0xfc10, 0x2d04, 0x2d08, 0x7162, 0xa06d,
++      0x0128, 0x6814, 0xa206, 0x0500, 0x6800, 0x0cb8, 0x7003, 0x0005,
++      0xd2fc, 0x1118, 0x2001, 0xfe60, 0x0010, 0x2001, 0xfe97, 0x2068,
++      0x7052, 0x0156, 0x20a9, 0x0037, 0x2003, 0x0000, 0x8000, 0x1f04,
++      0x3a3c, 0x015e, 0xad80, 0x0009, 0x7042, 0x6a16, 0x68b7, 0x0700,
++      0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6920, 0xa184,
++      0x0c00, 0x0904, 0x3adc, 0x7068, 0xa086, 0x0006, 0x1128, 0x7078,
++      0xa206, 0x1110, 0x706a, 0x7082, 0x681b, 0x0005, 0xc1ad, 0xc1d4,
++      0x6922, 0x080c, 0x3eb0, 0x0804, 0x3adc, 0x7200, 0xa286, 0x0002,
++      0x1158, 0x70f0, 0xc0b5, 0x70f2, 0x2c00, 0x70d6, 0x2d00, 0x70da,
++      0x0030, 0x080c, 0x52e3, 0x0018, 0xa286, 0x0003, 0x0dd0, 0x7003,
++      0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484,
++      0x001f, 0xa215, 0xb284, 0x0600, 0x1108, 0xc2fd, 0x79a8, 0x79a8,
++      0xa18c, 0x00ff, 0x2118, 0x70e8, 0xa168, 0x2d04, 0x2d08, 0x7162,
++      0xa06d, 0x0128, 0x6814, 0xa206, 0x0538, 0x6800, 0x0cb8, 0x7003,
++      0x0005, 0xb284, 0x0600, 0x0118, 0x2001, 0xfe60, 0x0010, 0x2001,
++      0xfe97, 0x2068, 0x7052, 0x0156, 0x20a9, 0x0037, 0x2003, 0x0000,
++      0x8000, 0x1f04, 0x3aa6, 0x015e, 0xad80, 0x0009, 0x7042, 0xb284,
++      0x0600, 0x0110, 0xc2fc, 0x0008, 0xc2fd, 0x6a16, 0x68b7, 0x0700,
++      0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00,
++      0x01d8, 0xd0dc, 0x0178, 0x7068, 0xa086, 0x0004, 0x1140, 0x7078,
++      0xa206, 0x1128, 0x707c, 0xa306, 0x1110, 0x706a, 0x7082, 0x080c,
++      0x3eb3, 0x0050, 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x080c,
++      0x3eb0, 0x7083, 0x0000, 0x0000, 0x68c4, 0x705e, 0xc6ec, 0xa684,
++      0x0060, 0x05d0, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x11d0,
++      0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa684, 0x0060, 0xa086, 0x0060,
++      0x0580, 0x68d0, 0xa005, 0x0140, 0x7003, 0x0003, 0x682b, 0x0000,
++      0xc6ed, 0x080c, 0x55ca, 0x0428, 0xd6f4, 0x1518, 0xc6ed, 0x080c,
++      0x55dc, 0x00f8, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305,
++      0x01d0, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68d0, 0xa005, 0x0128,
++      0x7003, 0x0003, 0x080c, 0x55ca, 0x0070, 0xd6f4, 0x1120, 0xc6ed,
++      0x68b0, 0x080c, 0x5622, 0xc6f4, 0x2019, 0x0000, 0x2021, 0x0000,
++      0x0010, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x006c, 0xa684, 0x0004,
++      0x01b0, 0x78e4, 0xa084, 0x0030, 0x0150, 0x78ec, 0xa084, 0x0003,
++      0x0130, 0x782b, 0x3008, 0x2019, 0x0000, 0x2320, 0x0040, 0x00f6,
++      0x2079, 0xb340, 0x080c, 0x52e3, 0x00fe, 0x0904, 0x29ee, 0x791a,
++      0x2d00, 0x7052, 0x68c8, 0x2060, 0x71f0, 0x2001, 0xb341, 0x2004,
++      0xd0c4, 0x15c8, 0x70f8, 0xa02d, 0x01b8, 0xd1bc, 0x0548, 0x7a80,
++      0xa294, 0x0f00, 0x70fc, 0xa206, 0x0118, 0x78e0, 0xa504, 0x1558,
++      0x70fa, 0xc1bc, 0x71f2, 0x0438, 0x2031, 0x0001, 0x852c, 0x0218,
++      0x8633, 0x8210, 0x0cd8, 0x0005, 0x7de0, 0xa594, 0xff00, 0x0130,
++      0x2011, 0x0008, 0x852f, 0x0c81, 0x8637, 0x0008, 0x0c69, 0x8217,
++      0x7880, 0xa084, 0x0f00, 0xa206, 0x0170, 0x72fe, 0x76fa, 0x0058,
++      0x7a80, 0xa294, 0x0f00, 0x70fc, 0xa236, 0x0dc0, 0x78e0, 0xa534,
++      0x0da8, 0xc1bd, 0x71f2, 0xd1b4, 0x1904, 0x29df, 0x2300, 0xa405,
++      0x0904, 0x29df, 0x70c0, 0xa086, 0x0001, 0x1904, 0x2a3f, 0x0005,
++      0x6020, 0xa005, 0x0150, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008,
++      0x600a, 0x700b, 0x0100, 0x7028, 0x6026, 0x0005, 0xa006, 0x080c,
++      0x52e3, 0x7000, 0xa086, 0x0002, 0x0120, 0x7068, 0xa086, 0x0005,
++      0x1150, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823,
++      0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x000f, 0x0002, 0x29ee,
++      0x3bc4, 0x3bc1, 0x3be4, 0x3bcd, 0x3bcb, 0x3bbf, 0x3bbf, 0x080c,
++      0x297f, 0x0461, 0x0429, 0x0028, 0x0449, 0x7060, 0x2060, 0x6800,
++      0x6002, 0x080c, 0x2085, 0x0804, 0x29ee, 0x7068, 0x706b, 0x0000,
++      0x7087, 0x0000, 0x0002, 0x3be0, 0x3be0, 0x3bdb, 0x3bdb, 0x3bdb,
++      0x3be0, 0x3bdb, 0x3be0, 0x77f0, 0xc7c5, 0x77f2, 0x0804, 0x2ed6,
++      0x706b, 0x0000, 0x0804, 0x29ee, 0x681b, 0x0000, 0x0804, 0x359e,
++      0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0005, 0x6010, 0xa005,
++      0x0120, 0x8001, 0x1310, 0x080c, 0x297f, 0x6012, 0x6008, 0xc0a4,
++      0x600a, 0x0005, 0x6018, 0xa005, 0x0110, 0x8001, 0x601a, 0x0005,
++      0x080c, 0x40d4, 0x681b, 0x0018, 0x0480, 0x080c, 0x40d4, 0x681b,
++      0x0019, 0x0458, 0x080c, 0x40d4, 0x681b, 0x001a, 0x0430, 0x080c,
++      0x40d4, 0x681b, 0x0003, 0x0408, 0x7778, 0x080c, 0x3fb3, 0x717c,
++      0xa18c, 0x00ff, 0xd7fc, 0x1118, 0xa1e8, 0xfa00, 0x0010, 0xa1e8,
++      0xfb10, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x1118, 0x7082, 0x0804,
++      0x29ee, 0x6814, 0x7278, 0xa206, 0x0110, 0x6800, 0x0c98, 0x6800,
++      0x200a, 0x681b, 0x0005, 0x7083, 0x0000, 0x080c, 0x3bee, 0x6820,
++      0xd084, 0x1110, 0x080c, 0x3be8, 0x080c, 0x3bfa, 0x681f, 0x0000,
++      0x6823, 0x0020, 0x682b, 0x0000, 0x080c, 0x2085, 0x0804, 0x29ee,
++      0xa282, 0x0003, 0x1904, 0x3e70, 0x7da8, 0xa5ac, 0x00ff, 0x7ea8,
++      0xa6b4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x05a0, 0xc1c4,
++      0x6922, 0xa6b4, 0x00ff, 0x0520, 0xa682, 0x001c, 0x0218, 0x0110,
++      0x2031, 0x001c, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b,
++      0x2041, 0x0000, 0x080c, 0x3f0c, 0x0118, 0x080c, 0x3d35, 0x0090,
++      0x080c, 0x3ef8, 0x080c, 0x3d32, 0x6920, 0xc1c5, 0x6922, 0x7e58,
++      0xc695, 0x7e5a, 0xd6d4, 0x1110, 0x0804, 0x4056, 0x0804, 0x3ccc,
++      0x080c, 0x3d32, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x005f, 0x0005,
++      0x781b, 0x006c, 0x0005, 0x00c6, 0x705c, 0x2060, 0x6100, 0xd1e4,
++      0x0598, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x001c, 0x0218,
++      0x0110, 0x2011, 0x001c, 0x2600, 0xa202, 0x1208, 0x2230, 0xa686,
++      0x0010, 0x1108, 0x8630, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4,
++      0x0130, 0xa282, 0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282,
++      0x000c, 0x1210, 0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228,
++      0x080c, 0x3efc, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3f0c,
++      0x0118, 0x080c, 0x3d35, 0x0020, 0x080c, 0x3ef8, 0x080c, 0x3d32,
++      0x7858, 0xc095, 0x785a, 0x00ce, 0x782b, 0x3008, 0x781b, 0x006c,
++      0x0005, 0x00c6, 0x2960, 0x6000, 0xd0e4, 0x1170, 0xa084, 0x0040,
++      0x1130, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x00ce, 0x0005, 0x2011,
++      0x0032, 0x2019, 0x0000, 0x0418, 0x68a0, 0xd0cc, 0x1dc0, 0x6208,
++      0xa294, 0x00ff, 0x2001, 0xb343, 0x2004, 0xd0e4, 0x1148, 0x78ec,
++      0xd0e4, 0x0130, 0xa282, 0x000b, 0x1218, 0x2011, 0x000a, 0x0028,
++      0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c,
++      0x00ff, 0xa382, 0x001c, 0x0218, 0x0110, 0x2019, 0x001c, 0x78ab,
++      0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0,
++      0x0005, 0x6820, 0xc0c5, 0x6822, 0x080c, 0x2ae3, 0x00ce, 0x0005,
++      0x00c6, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032,
++      0x2019, 0x0000, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++      0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822,
++      0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x00c6, 0x715c, 0x2160,
++      0x0029, 0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x2018, 0x2008,
++      0xa084, 0xffe0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612,
++      0x78a4, 0xa084, 0x7770, 0xa18c, 0x000f, 0xa105, 0x0056, 0x2029,
++      0xb343, 0x252c, 0xd5cc, 0x005e, 0x0140, 0xd3a4, 0x0110, 0xa085,
++      0x0800, 0xd3fc, 0x0110, 0xa085, 0x8080, 0x78a6, 0x0006, 0x78ec,
++      0xd08c, 0x0130, 0x6028, 0xd08c, 0x0118, 0x000e, 0xc0bc, 0x0008,
++      0x000e, 0x6016, 0x788a, 0xa6b4, 0x001f, 0x8637, 0x8204, 0x8004,
++      0xa605, 0x600e, 0x6004, 0xa084, 0xffd5, 0x6006, 0x0005, 0xa282,
++      0x0002, 0x1904, 0x3e7a, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc,
++      0x0558, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x1a04,
++      0x3e69, 0x080c, 0x3deb, 0x080c, 0x3d32, 0xa980, 0x0001, 0x200c,
++      0x080c, 0x3faf, 0x080c, 0x3cd1, 0x88ff, 0x0168, 0x789b, 0x0060,
++      0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1110, 0x0804,
++      0x4056, 0x0804, 0x3ccc, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x005f,
++      0x0005, 0x781b, 0x006c, 0x0005, 0xa282, 0x0002, 0x1218, 0xa284,
++      0x0001, 0x0138, 0x715c, 0xa188, 0x0000, 0x210c, 0xd1ec, 0x1108,
++      0xa016, 0x080c, 0x3ee9, 0x0479, 0x080c, 0x3d32, 0x7858, 0xc095,
++      0x785a, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005, 0x00c6, 0x0026,
++      0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x1148, 0xa084, 0x0080,
++      0x1120, 0xc1a4, 0x6106, 0xa006, 0x0088, 0x2011, 0x0000, 0x78ab,
++      0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004,
++      0x080c, 0x2ae3, 0x6820, 0xa085, 0x0200, 0x6822, 0x002e, 0x00ce,
++      0x0005, 0x8807, 0xa715, 0x00c6, 0x705c, 0x2060, 0x0011, 0x00ce,
++      0x0005, 0x2009, 0x0000, 0x82ff, 0x0110, 0x2009, 0x0040, 0x6018,
++      0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xff9f, 0xa105, 0xc0ec,
++      0xd0b4, 0x1108, 0xc0ed, 0x6100, 0xd1f4, 0x0110, 0xa085, 0x0020,
++      0x78a6, 0x0006, 0x6000, 0xd09c, 0x0140, 0x6028, 0xd08c, 0x0128,
++      0x000e, 0xd0bc, 0x0118, 0xc0bc, 0x0008, 0x000e, 0xe016, 0x788a,
++      0x6004, 0xa084, 0xffef, 0x6006, 0x0005, 0x0006, 0x7000, 0xa086,
++      0x0003, 0x0110, 0x000e, 0x0010, 0x000e, 0x0488, 0xd6ac, 0x0578,
++      0x7888, 0xa084, 0x0040, 0x0558, 0x7bb8, 0x8307, 0xa084, 0x007f,
++      0x1508, 0x8207, 0xa084, 0x00ff, 0xa09e, 0x0001, 0x1904, 0x3e92,
++      0xd6f4, 0x11d0, 0x79d8, 0x7adc, 0xa108, 0xa291, 0x0000, 0x79d2,
++      0x79da, 0x7ad6, 0x7ade, 0x080c, 0x56fb, 0x781b, 0x006b, 0xb284,
++      0x0600, 0x0118, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001, 0x080c,
++      0x555b, 0x0005, 0x080c, 0x297f, 0x781b, 0x006b, 0x0005, 0x781b,
++      0x006c, 0x0005, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000,
++      0xa006, 0x2010, 0x080c, 0x3d35, 0x2029, 0x0000, 0x080c, 0x3de9,
++      0x7e58, 0x080c, 0x3eb9, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005,
++      0x0cc1, 0x6820, 0xc0c4, 0x6822, 0x00c6, 0x705c, 0x2060, 0x080c,
++      0x3d72, 0x00b0, 0x0c71, 0x6820, 0xc0cc, 0x6822, 0x00c6, 0x705c,
++      0x2060, 0x080c, 0x3e18, 0x0060, 0x0c21, 0x6820, 0xa084, 0xecff,
++      0x6822, 0x00c6, 0x705c, 0x2060, 0x6004, 0xa084, 0xffc5, 0x6006,
++      0x00ce, 0x0005, 0x00b9, 0x782b, 0x3008, 0x781b, 0x006c, 0x0005,
++      0x6827, 0x0002, 0x00a9, 0x78e4, 0xa084, 0x0030, 0x0904, 0x29ee,
++      0x78ec, 0xa084, 0x0003, 0x0904, 0x29ee, 0x782b, 0x3008, 0x781b,
++      0x006c, 0x0005, 0x2001, 0x0005, 0x0070, 0x2001, 0x000c, 0x0058,
++      0x2001, 0x0006, 0x0040, 0x2001, 0x000d, 0x0028, 0x2001, 0x0009,
++      0x0010, 0x2001, 0x0007, 0x789b, 0x0090, 0x78aa, 0x789b, 0x0060,
++      0x78ab, 0x0001, 0xc695, 0x7e5a, 0x0804, 0x2ae3, 0x0076, 0x873f,
++      0xa7bc, 0x000f, 0x873b, 0x873b, 0x873b, 0x8703, 0xb28c, 0x0600,
++      0x0118, 0xa0e0, 0xb800, 0x0010, 0xa0e0, 0xb900, 0xa7b8, 0x0020,
++      0x7f9a, 0x79a4, 0xa184, 0x7fe0, 0x78ae, 0x6012, 0x79a4, 0xa184,
++      0x773f, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0038, 0x6006, 0x007e,
++      0x0005, 0x789b, 0x0090, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab,
++      0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, 0x0804, 0x2ae3,
++      0x2021, 0x0000, 0x2029, 0x0032, 0x789b, 0x0090, 0x78ab, 0x0001,
++      0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7caa, 0x789b, 0x0060,
++      0x78ab, 0x0005, 0x0804, 0x2ae3, 0x0156, 0x0804, 0x3f4e, 0x2021,
++      0x3fa6, 0x20a9, 0x0009, 0x2011, 0x0029, 0xa582, 0x0028, 0x0550,
++      0x8420, 0x95a9, 0x2011, 0x0033, 0xa582, 0x0033, 0x0618, 0x8420,
++      0x95a9, 0x2019, 0x000a, 0x2011, 0x0065, 0x2200, 0xa502, 0x02d0,
++      0x8420, 0x2300, 0xa210, 0x1f04, 0x3f25, 0x015e, 0x0088, 0x2021,
++      0x3f98, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0033, 0x2200,
++      0xa502, 0x0240, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3f37, 0x015e,
++      0xa006, 0x0005, 0x8211, 0x015e, 0xa582, 0x0064, 0x1220, 0x7808,
++      0xa085, 0x0070, 0x780a, 0x2405, 0xa005, 0x0005, 0xa886, 0x0002,
++      0x01e8, 0x2021, 0x3f84, 0x20a9, 0x000d, 0x2011, 0x0028, 0xa582,
++      0x0028, 0x0d48, 0x8420, 0x2019, 0x0019, 0x2011, 0x0033, 0x2200,
++      0xa502, 0x0e00, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3f5f, 0x015e,
++      0x2011, 0x0184, 0xa582, 0x0185, 0x0ab0, 0x0890, 0x2021, 0x3f93,
++      0x20a9, 0x0003, 0x2011, 0x0024, 0xa586, 0x0024, 0x0960, 0x8420,
++      0x2011, 0x0028, 0xa586, 0x0028, 0x0930, 0x8420, 0x2019, 0x0019,
++      0x2011, 0x0033, 0x0804, 0x3f37, 0x1021, 0x2202, 0x3403, 0x4604,
++      0x5805, 0x6a06, 0x7c07, 0x4610, 0x4612, 0x5812, 0x5a12, 0x6a14,
++      0x6c14, 0x6e14, 0x7e17, 0x9021, 0xb002, 0xe204, 0xe210, 0xe210,
++      0x1209, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605,
++      0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07, 0x10e1, 0x330a,
++      0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07, 0x7e07, 0x0e00, 0x789b,
++      0x0090, 0xa046, 0x0005, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f,
++      0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xd7fc, 0x0118, 0xa0e0,
++      0xda00, 0x0010, 0xa0e0, 0xba00, 0x0005, 0x79d8, 0x7adc, 0x78d0,
++      0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x0005, 0x00e6,
++      0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009, 0xb3c0, 0x2071,
++      0xb3c0, 0x0070, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x0118, 0x2079,
++      0x0100, 0x0010, 0x2079, 0x0200, 0x2009, 0xb380, 0x2071, 0xb380,
++      0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002, 0x3ff8, 0x3ff8,
++      0x3ff8, 0x3ff8, 0x3ff8, 0x3ff8, 0x3ff6, 0x403d, 0x080c, 0x297f,
++      0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x05d8, 0x7858,
++      0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086, 0x1814,
++      0x1588, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x1de0, 0x784b,
++      0x0008, 0x7848, 0xa084, 0x0008, 0x1de0, 0x7830, 0xd0bc, 0x1510,
++      0x3200, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++      0xa084, 0x0600, 0x0010, 0xa084, 0x0800, 0x0118, 0x0104, 0x403a,
++      0x0010, 0x0304, 0x403a, 0x79e4, 0xa184, 0x0030, 0x0158, 0x78ec,
++      0xa084, 0x0003, 0x0138, 0x681c, 0xd0ac, 0x1110, 0x0421, 0x0010,
++      0x781b, 0x00dd, 0x00fe, 0x00ee, 0x0005, 0x70a7, 0x0000, 0x080c,
++      0x4397, 0x0cc0, 0x2001, 0xb341, 0x2004, 0xd0ac, 0x1118, 0x6814,
++      0x080c, 0x28a8, 0x0005, 0x781b, 0x006c, 0x0005, 0x782b, 0x3008,
++      0x781b, 0x006c, 0x0005, 0x781b, 0x005f, 0x0005, 0x782b, 0x3008,
++      0x781b, 0x005d, 0x0005, 0x2009, 0xb356, 0x210c, 0xa186, 0x0000,
++      0x0150, 0xa186, 0x0001, 0x0160, 0x701b, 0x000b, 0x706b, 0x0001,
++      0x781b, 0x0050, 0x0005, 0x78cb, 0x0000, 0x781b, 0x00d8, 0x0005,
++      0x701b, 0x000a, 0x0005, 0x2009, 0xb356, 0x210c, 0xa186, 0x0000,
++      0x0170, 0xa186, 0x0001, 0x0140, 0x701b, 0x000b, 0x706b, 0x0001,
++      0x781b, 0x0050, 0x0804, 0x29df, 0x701b, 0x000a, 0x0005, 0x782b,
++      0x3008, 0x78cb, 0x0000, 0x781b, 0x00d8, 0x0005, 0x781b, 0x00dd,
++      0x0005, 0x782b, 0x3008, 0x781b, 0x00dd, 0x0005, 0x781b, 0x00a4,
++      0x0005, 0x782b, 0x3008, 0x781b, 0x00a4, 0x0005, 0x6818, 0xd0fc,
++      0x0110, 0x681b, 0x001d, 0x706b, 0x0001, 0x781b, 0x0050, 0x0005,
++      0x7830, 0xa084, 0x00c0, 0x1180, 0x7808, 0xa084, 0xfffc, 0x780a,
++      0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084, 0x0021, 0x1108,
++      0x0005, 0x704c, 0xc08d, 0x780a, 0x0005, 0x7830, 0xa084, 0x0080,
++      0x1190, 0x78ec, 0xa084, 0x0002, 0x1170, 0x7808, 0xc08c, 0x780a,
++      0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084, 0x0002, 0x0118,
++      0x7808, 0xc08d, 0x780a, 0x0005, 0x704c, 0xc08d, 0x704e, 0x780a,
++      0x0005, 0x7830, 0xa084, 0x0040, 0x1de0, 0x3200, 0x0006, 0x2001,
++      0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0xa084, 0x0600, 0x0010,
++      0xa084, 0x0800, 0x0118, 0x1104, 0x40f2, 0x0010, 0x1304, 0x40f2,
++      0x78ac, 0x0005, 0x7808, 0xa084, 0xfffd, 0x780a, 0xe000, 0xe000,
++      0xe000, 0xe000, 0x78ec, 0xa084, 0x0021, 0x0198, 0x3200, 0x0006,
++      0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0xa084, 0x0600,
++      0x0010, 0xa084, 0x0800, 0x0118, 0x1104, 0x410c, 0x0010, 0x1304,
++      0x410f, 0x78ac, 0x0006, 0x704c, 0x780a, 0x000e, 0x0005, 0x78ec,
++      0xa084, 0x0002, 0x1904, 0x52a1, 0xa784, 0x007d, 0x1118, 0x2700,
++      0x080c, 0x297f, 0xa784, 0x0001, 0x1904, 0x3653, 0xa784, 0x0070,
++      0x0140, 0x00c6, 0x2d60, 0x2f68, 0x080c, 0x2899, 0x2d78, 0x2c68,
++      0x00ce, 0xa784, 0x0008, 0x0148, 0x784b, 0x0008, 0x78ec, 0xa084,
++      0x0003, 0x0904, 0x3653, 0x0804, 0x404b, 0xa784, 0x0004, 0x0538,
++      0x78b8, 0xa084, 0x8000, 0x0518, 0x784b, 0x0008, 0x78ec, 0xa084,
++      0x0003, 0x0904, 0x3653, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001,
++      0x11b0, 0x78c0, 0xa085, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00dd,
++      0x0005, 0x784b, 0x0008, 0x6818, 0xd0fc, 0x0130, 0x681b, 0x0015,
++      0xd6f4, 0x0110, 0x681b, 0x0007, 0x080c, 0x405b, 0x0005, 0x681b,
++      0x0003, 0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833,
++      0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x3006,
++      0x3200, 0x0006, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118,
++      0xa084, 0x0600, 0x0010, 0xa084, 0x0800, 0x0118, 0x0104, 0x29df,
++      0x0010, 0x0304, 0x29df, 0x0804, 0x3e92, 0x6b14, 0x8307, 0xa084,
++      0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0xd3fc, 0x0118, 0xa080,
++      0xb900, 0x0010, 0xa080, 0xb800, 0x2060, 0x2048, 0x705e, 0x2a60,
++      0x0005, 0x7000, 0x0002, 0x41ab, 0x41ab, 0x41ac, 0x41b4, 0x41ab,
++      0x41ab, 0x41ab, 0x41b7, 0x0005, 0x6008, 0xa084, 0xfbef, 0x600a,
++      0x6018, 0x8001, 0x601a, 0x0005, 0x080c, 0x52e3, 0x0005, 0x7094,
++      0xa005, 0x01a8, 0x2068, 0xb284, 0x0600, 0x0118, 0x2009, 0x0000,
++      0x0010, 0x2009, 0x0001, 0x0016, 0x080c, 0x1eb2, 0x001e, 0x0016,
++      0x080c, 0x5222, 0x001e, 0x080c, 0x5223, 0x7097, 0x0000, 0x0005,
++      0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, 0x4216, 0xd1ac, 0x05e0,
++      0x6108, 0x8117, 0xa18c, 0x00ff, 0x631c, 0x832f, 0x68a0, 0xd0cc,
++      0x11c8, 0xa584, 0x00ff, 0x0138, 0x78ec, 0xd0e4, 0x0110, 0x8213,
++      0x00b8, 0x2029, 0x0000, 0xa182, 0x000c, 0x1290, 0x78ec, 0xd0e4,
++      0x1118, 0x2009, 0x000c, 0x0060, 0xa182, 0x000b, 0x1248, 0x2009,
++      0x000a, 0x0030, 0x2009, 0x0032, 0x2011, 0x0000, 0x2029, 0x0000,
++      0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x79aa, 0x78ab,
++      0x0000, 0x7aaa, 0x7baa, 0x7daa, 0xa8c0, 0x0008, 0x6820, 0xa085,
++      0x1000, 0x6822, 0x080c, 0x2ae3, 0xa085, 0x0001, 0x00ce, 0x0005,
++      0xa282, 0x0006, 0x1904, 0x3e84, 0x7da8, 0x7eac, 0x8637, 0xa5ac,
++      0x00ff, 0xa6b4, 0x00ff, 0x7fac, 0x8747, 0xa7bc, 0x00ff, 0xa8c4,
++      0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, 0x0904, 0x4286, 0xa18c,
++      0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x3e5a, 0xa6b4, 0x00ff,
++      0x0904, 0x4283, 0xa682, 0x0039, 0x1a04, 0x3e5a, 0xa582, 0x0009,
++      0x0a04, 0x3e5a, 0xa882, 0x0003, 0x1a04, 0x3e5a, 0xa886, 0x0002,
++      0x01d0, 0xa886, 0x0000, 0x1904, 0x3e5a, 0x2001, 0x000c, 0x79ec,
++      0xd1e4, 0x0110, 0x2001, 0x000a, 0xa502, 0x1290, 0x080c, 0x3e5a,
++      0x00c6, 0x2960, 0x6004, 0xa085, 0x001a, 0x6006, 0x6000, 0xc0ac,
++      0x6002, 0x00ce, 0x0005, 0xa786, 0x0000, 0x0904, 0x3e5a, 0x8634,
++      0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x080c, 0x3f0c,
++      0x0904, 0x3e5a, 0x2029, 0x0000, 0x080c, 0x3d35, 0x2029, 0x0000,
++      0x080c, 0x3de9, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x005f, 0x0005,
++      0x781b, 0x006c, 0x0005, 0x080c, 0x3d32, 0x0c80, 0xa886, 0x0002,
++      0x1108, 0x8634, 0x715c, 0xa188, 0x0000, 0x210c, 0xd1ac, 0x0904,
++      0x3e5a, 0xd1ec, 0x1120, 0x2039, 0x0000, 0x2041, 0x0000, 0xd1e4,
++      0x1118, 0xa036, 0x2041, 0x0000, 0xa782, 0x0002, 0x12c8, 0x621c,
++      0xa284, 0x00ff, 0xa706, 0x0110, 0x2039, 0x0000, 0xa605, 0x0190,
++      0x6108, 0x811f, 0xa39c, 0x00ff, 0x0168, 0xa302, 0x1208, 0x2330,
++      0x8807, 0xa705, 0xa086, 0x0201, 0x0160, 0xa886, 0x0000, 0x0168,
++      0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010,
++      0x0070, 0xa284, 0xff00, 0x1108, 0x2040, 0xa184, 0x00ff, 0xa502,
++      0x0108, 0x2128, 0x852b, 0x852b, 0x080c, 0x3f0c, 0x0d58, 0x080c,
++      0x3d35, 0x2029, 0x0000, 0x080c, 0x3de9, 0x789b, 0x0090, 0x78ab,
++      0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x78ab, 0x0000, 0x7daa,
++      0x7eaa, 0x7faa, 0x2800, 0x78aa, 0x789b, 0x0060, 0x78ab, 0x0005,
++      0x080c, 0x2ae3, 0x7858, 0xc095, 0x785a, 0x0804, 0x1e66, 0x00e6,
++      0x2091, 0x8000, 0x6014, 0xd0fc, 0x1118, 0x2071, 0xb380, 0x0010,
++      0x2071, 0xb3c0, 0x7000, 0xa086, 0x0007, 0x1150, 0x6110, 0x70b0,
++      0xa106, 0x1130, 0x00ee, 0x080c, 0x1ec4, 0x0041, 0xa006, 0x0005,
++      0x2091, 0x8001, 0x00ee, 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6,
++      0x0804, 0x265a, 0x785b, 0x0000, 0x70a3, 0x000e, 0x2009, 0x0100,
++      0x0016, 0x7094, 0xa06d, 0x0118, 0x7097, 0x0000, 0x0028, 0x70a7,
++      0x0000, 0x080c, 0x1ef1, 0x0128, 0x70a0, 0x6826, 0x080c, 0x4432,
++      0x0cb0, 0x001e, 0x0076, 0x0156, 0x00c6, 0x00d6, 0x20a9, 0x0020,
++      0x3238, 0xa7bc, 0x0600, 0x0120, 0x2061, 0xfc20, 0xc7fc, 0x0018,
++      0x2061, 0xfd40, 0xc7fd, 0x6000, 0xa105, 0x6002, 0x601c, 0xa06d,
++      0x0140, 0x6800, 0x601e, 0x080c, 0x1ca6, 0x6008, 0x8000, 0x600a,
++      0x0ca8, 0x6018, 0xa06d, 0x0128, 0x6800, 0x601a, 0x080c, 0x1ca6,
++      0x0cc0, 0xace0, 0x0009, 0x0f04, 0x4356, 0x0c28, 0x7090, 0xa084,
++      0x8000, 0x0110, 0x080c, 0x44ac, 0x00de, 0x00ce, 0x015e, 0x007e,
++      0x0005, 0x6804, 0xa084, 0x000f, 0x0002, 0x4375, 0x4375, 0x4375,
++      0x4375, 0x4375, 0x4375, 0x4377, 0x4386, 0x4375, 0x4375, 0x4375,
++      0x4375, 0x4375, 0x4392, 0x4375, 0x4377, 0x080c, 0x297f, 0x0006,
++      0x7830, 0xd0b4, 0x0128, 0x784b, 0x0004, 0x7848, 0xd094, 0x1de8,
++      0x000e, 0x080c, 0x4f11, 0x080c, 0x1ca6, 0x0080, 0x6827, 0x000b,
++      0x0006, 0x7830, 0xd0b4, 0x0128, 0x784b, 0x0004, 0x7848, 0xd094,
++      0x1de8, 0x000e, 0x080c, 0x4f11, 0x080c, 0x4432, 0x0005, 0x00f6,
++      0x6814, 0xd0fc, 0x1178, 0x2001, 0xb342, 0x2004, 0xd0ec, 0x0128,
++      0x2079, 0x0100, 0x1104, 0x43c8, 0x0048, 0x2079, 0x0200, 0x1304,
++      0x43c8, 0x0020, 0x2079, 0x0100, 0x1104, 0x43c8, 0x7830, 0xa084,
++      0x00c0, 0x11b0, 0x00d6, 0x080c, 0x522f, 0x2d00, 0x682e, 0x2009,
++      0x0004, 0x2001, 0x0000, 0x6827, 0x0084, 0x080c, 0x51da, 0x080c,
++      0x4432, 0x00de, 0x70a8, 0xa080, 0x00bf, 0x781a, 0x0804, 0x4408,
++      0x7948, 0x6814, 0xd0fc, 0x1158, 0x2001, 0xb342, 0x2004, 0xd0ec,
++      0x0118, 0x1104, 0x43db, 0x0028, 0x1304, 0x43db, 0x0010, 0x1104,
++      0x43db, 0x794a, 0x08b8, 0x7948, 0x7828, 0x0006, 0xa084, 0xf000,
++      0xa086, 0x1000, 0x000e, 0x1da8, 0xd0b4, 0x1d98, 0xd0ac, 0x0118,
++      0xa185, 0x0004, 0x0010, 0xa185, 0x000c, 0x784a, 0x789b, 0x000e,
++      0x78ab, 0x0002, 0x7858, 0xa084, 0x00ff, 0xa085, 0x0400, 0x785a,
++      0x70a8, 0xa080, 0x00a1, 0x781a, 0x6827, 0x0284, 0x682c, 0x6836,
++      0x6830, 0x683a, 0x2009, 0x0004, 0x2001, 0x0000, 0x080c, 0x51da,
++      0x00fe, 0x0005, 0x00d6, 0x6b14, 0x080c, 0x1f5a, 0x0128, 0x2068,
++      0x6827, 0x0002, 0x00f9, 0x0cc0, 0x00de, 0x0005, 0x00d6, 0x6b14,
++      0x6c28, 0xa4a4, 0x00ff, 0x080c, 0x1efb, 0x0120, 0x2068, 0x6827,
++      0x0002, 0x0081, 0x00de, 0x0005, 0x00d6, 0x6814, 0xa09c, 0x00ff,
++      0x080c, 0x1f2c, 0x0128, 0x2068, 0x6827, 0x0002, 0x0019, 0x0cc0,
++      0x00de, 0x0005, 0x00c6, 0x6914, 0x6814, 0x080c, 0x449c, 0x6904,
++      0xa18c, 0x00ff, 0xa186, 0x0006, 0x0170, 0xa186, 0x000d, 0x0550,
++      0xa186, 0x0017, 0x1120, 0x080c, 0x1ca6, 0x00ce, 0x0005, 0x080c,
++      0x2087, 0x00ce, 0x0005, 0x6004, 0x8001, 0x02b0, 0x6006, 0x2009,
++      0x0000, 0xa684, 0x0001, 0x1110, 0xa18d, 0x8000, 0xa684, 0x0004,
++      0x0110, 0xa18d, 0x0002, 0x691e, 0x6823, 0x0000, 0x711c, 0x810f,
++      0x6818, 0xa105, 0x681a, 0x0c18, 0x6100, 0xa184, 0x0001, 0x09d8,
++      0x080c, 0x297f, 0x6018, 0xa005, 0x1148, 0x6008, 0x8001, 0x0230,
++      0x600a, 0x601c, 0x6802, 0x2d00, 0x601e, 0x00a0, 0xac88, 0x0006,
++      0x2104, 0xa005, 0x0110, 0x2008, 0x0cd8, 0x6802, 0x2d0a, 0x6008,
++      0x8001, 0x0230, 0x600a, 0x6018, 0x2068, 0x6800, 0x601a, 0x0c48,
++      0x00ce, 0x0005, 0x0156, 0x0136, 0x0146, 0x00c6, 0x00d6, 0x080c,
++      0x1c85, 0x2da0, 0x013e, 0x20a9, 0x0037, 0x53a3, 0x00ce, 0x014e,
++      0x013e, 0x015e, 0x0804, 0x4447, 0xd0fc, 0x1118, 0x2061, 0xfc20,
++      0x0010, 0x2061, 0xfd40, 0xa184, 0x001f, 0xac60, 0x8003, 0x8003,
++      0x8003, 0xac00, 0x2060, 0x0005, 0xd7fc, 0x1168, 0x2019, 0xb393,
++      0x2001, 0xb342, 0x2004, 0xd0ec, 0x0118, 0x2021, 0x0102, 0x0038,
++      0x2021, 0x0202, 0x0020, 0x2019, 0xb3d3, 0x2021, 0x0102, 0x2304,
++      0xa085, 0x0001, 0x201a, 0x2404, 0xa085, 0x0001, 0x2022, 0x0005,
++      0xd7fc, 0x1168, 0x2019, 0xb393, 0x2001, 0xb342, 0x2004, 0xd0ec,
++      0x0118, 0x2021, 0x0102, 0x0038, 0x2021, 0x0202, 0x0020, 0x2019,
++      0xb3d3, 0x2021, 0x0102, 0x2304, 0xa084, 0xfffe, 0x201a, 0x2404,
++      0xa084, 0xfffe, 0x2022, 0x0005, 0x7990, 0xa18c, 0xfff8, 0x7992,
++      0x70a8, 0xa080, 0x00f1, 0x781a, 0x0804, 0x29df, 0x7097, 0x0000,
++      0x7003, 0x0000, 0x704b, 0x0001, 0x7043, 0x0000, 0x080c, 0x1ef1,
++      0x0528, 0x70ef, 0x0000, 0x68cc, 0x2060, 0x6100, 0xa184, 0x0300,
++      0x0150, 0x6827, 0x000e, 0xa084, 0x0200, 0x0110, 0x6827, 0x0017,
++      0x080c, 0x4432, 0x0c18, 0x7000, 0xa086, 0x0007, 0x1904, 0x4597,
++      0x6910, 0x70b0, 0xa106, 0x0120, 0x2d60, 0x080c, 0x1ec4, 0x0005,
++      0x2d00, 0x7096, 0xad80, 0x000f, 0x7042, 0x0050, 0x7010, 0xa005,
++      0x1128, 0x7048, 0xa086, 0x0001, 0x0904, 0x29f8, 0x0804, 0x29df,
++      0xa036, 0x691c, 0xa184, 0x0002, 0x0110, 0xa6b5, 0x0004, 0xa184,
++      0x00c0, 0x8003, 0x8003, 0x8007, 0xa080, 0x4646, 0x2005, 0xa635,
++      0x080c, 0x2ae3, 0x6820, 0xa084, 0x0400, 0x0150, 0x789b, 0x0018,
++      0x78ab, 0x0003, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x5000,
++      0x6820, 0xa084, 0x8000, 0x0140, 0xa6b5, 0x0400, 0x789b, 0x000e,
++      0x6824, 0x8007, 0x78aa, 0x00d8, 0x681c, 0xd0fc, 0x1140, 0xa6b5,
++      0x0800, 0x6820, 0xd0c4, 0x0198, 0xa6b5, 0x4000, 0x0080, 0x6820,
++      0xd0c4, 0x0118, 0xa6b5, 0x4000, 0x0050, 0x789b, 0x0018, 0x78ab,
++      0x0002, 0x789b, 0x0081, 0x78ab, 0x0001, 0xa6b5, 0x1000, 0xa684,
++      0x0200, 0x0508, 0x00c6, 0x080c, 0x4fc6, 0x6028, 0xd08c, 0x0138,
++      0x6020, 0x00ce, 0x6930, 0x6a2c, 0x080c, 0x52b7, 0x0028, 0x00ce,
++      0x682c, 0x78d2, 0x6830, 0x78d6, 0xa684, 0x0100, 0x0150, 0x682c,
++      0xa084, 0x0001, 0x0130, 0x7888, 0xa084, 0x0040, 0x0110, 0xa6b5,
++      0x8000, 0x080c, 0x5207, 0x7e5a, 0x6eb6, 0x0804, 0x524e, 0x080c,
++      0x40a8, 0x1904, 0x4640, 0x2041, 0x0001, 0x2031, 0x1000, 0x080c,
++      0x2ae3, 0x789b, 0x0018, 0x6814, 0xa084, 0x001f, 0xa085, 0x0080,
++      0x78aa, 0x691c, 0xa184, 0x0002, 0x0140, 0xa6b5, 0x0004, 0x78ab,
++      0x0020, 0x6828, 0x78aa, 0xa8c0, 0x0002, 0x681c, 0xd0f4, 0x0128,
++      0x2c50, 0x080c, 0x418d, 0x080c, 0x5044, 0x6820, 0xa084, 0x8000,
++      0x0140, 0xa6b5, 0x0400, 0x789b, 0x000e, 0x6824, 0x8007, 0x78aa,
++      0x0060, 0x681c, 0xa084, 0x8000, 0x1140, 0xa6b5, 0x0800, 0x6820,
++      0xa084, 0x0100, 0x0110, 0xa6b5, 0x4000, 0x681c, 0xa084, 0x00c0,
++      0x8003, 0x8003, 0x8007, 0xa080, 0x4646, 0x2005, 0xa635, 0xa684,
++      0x0100, 0x0150, 0x682c, 0xa084, 0x0001, 0x0130, 0x7888, 0xa084,
++      0x0040, 0x0110, 0xa6b5, 0x8000, 0x789b, 0x007e, 0x7eae, 0x6eb6,
++      0x6814, 0xc0fc, 0x8007, 0x78aa, 0x7882, 0x2810, 0x7aaa, 0x7830,
++      0xa084, 0x00c0, 0x1904, 0x4640, 0x6914, 0xd1fc, 0x1158, 0x2001,
++      0xb342, 0x2004, 0xd0ec, 0x0118, 0x0104, 0x4640, 0x0028, 0x0304,
++      0x4640, 0x0010, 0x0104, 0x4640, 0x0126, 0x00d6, 0x00c6, 0x70f0,
++      0xa084, 0x2e00, 0x2090, 0x00ce, 0x00de, 0x012e, 0xa684, 0x0200,
++      0x01a8, 0x00c6, 0x080c, 0x4fc6, 0x6028, 0xd08c, 0x0140, 0x6020,
++      0xa005, 0x0128, 0x6930, 0x6a2c, 0x080c, 0x52b7, 0x0020, 0x682c,
++      0x78d2, 0x6830, 0x78d6, 0x00ce, 0x080c, 0x5207, 0x70a8, 0xa080,
++      0x00fc, 0x781a, 0x080c, 0x40d4, 0x2d00, 0x7096, 0x7052, 0x6810,
++      0x70b2, 0x7003, 0x0007, 0xad80, 0x000f, 0x7042, 0x0804, 0x29df,
++      0x080c, 0x1eb2, 0x080c, 0x40d4, 0x0804, 0x29df, 0x0000, 0x0300,
++      0x0200, 0x0000, 0x080c, 0x297f, 0x2300, 0x0002, 0x4651, 0x4651,
++      0x4658, 0x080c, 0x297f, 0x71a8, 0xa188, 0x00a1, 0x791a, 0x0005,
++      0x080c, 0x5223, 0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x0148,
++      0xa184, 0xff00, 0xa085, 0x000a, 0x6826, 0x080c, 0x1eb2, 0x0804,
++      0x44ee, 0x2001, 0x000a, 0x080c, 0x5184, 0x0804, 0x44ee, 0xa282,
++      0x0005, 0x0310, 0x080c, 0x297f, 0x7000, 0xa084, 0x000f, 0x190c,
++      0x41a1, 0x080c, 0x1c85, 0x11b8, 0x2069, 0xffff, 0xa684, 0x0004,
++      0x0118, 0x2001, 0x2800, 0x0010, 0x2001, 0x0800, 0x71a8, 0xa188,
++      0x00a1, 0x789b, 0x000e, 0x8007, 0x78aa, 0x2031, 0x0400, 0x7e5a,
++      0x791a, 0x0804, 0x29df, 0x6807, 0x0106, 0x680b, 0x0000, 0x689f,
++      0x0000, 0x6827, 0x0000, 0xa386, 0x0002, 0x1180, 0xa286, 0x0002,
++      0x1168, 0x78a0, 0xa005, 0x1150, 0xd4fc, 0x1140, 0x78e4, 0xa084,
++      0x0008, 0x0120, 0xa6b5, 0x0008, 0x2019, 0x0000, 0x080c, 0x4b0c,
++      0x2d00, 0x7096, 0x7052, 0x7003, 0x0007, 0x7043, 0x0000, 0x6020,
++      0xa084, 0x000f, 0x680e, 0x6824, 0xa084, 0x0080, 0x0120, 0x080c,
++      0x4bc9, 0x0804, 0x29df, 0x2300, 0x0002, 0x46c8, 0x473d, 0x4754,
++      0x2200, 0x0002, 0x46cf, 0x46de, 0x4700, 0x470a, 0x472b, 0x2029,
++      0x0001, 0xa026, 0x2011, 0x0000, 0x080c, 0x4ce3, 0x0002, 0x46dc,
++      0x29df, 0x44ee, 0x46dc, 0x46dc, 0x080c, 0x297f, 0x7990, 0xa18c,
++      0x0007, 0x1110, 0x2009, 0x0008, 0x2011, 0x0001, 0xa684, 0x0004,
++      0x0110, 0x2011, 0x0003, 0x2220, 0xa12a, 0x2011, 0x0001, 0x080c,
++      0x4ce3, 0x0002, 0x46f7, 0x29df, 0x44ee, 0x46fe, 0x46f9, 0x0804,
++      0x526b, 0x709f, 0x46fd, 0x0804, 0x29df, 0x0cc8, 0x080c, 0x297f,
++      0xa684, 0x0010, 0x0128, 0x080c, 0x4b94, 0x0110, 0x0804, 0x29df,
++      0x0804, 0x4c05, 0x6000, 0xa084, 0x0002, 0x01c0, 0x70a8, 0xa080,
++      0x008f, 0x781a, 0x00d6, 0x080c, 0x522f, 0x2d00, 0x682e, 0x6827,
++      0x0000, 0x080c, 0x4432, 0x00de, 0x080c, 0x1ca6, 0x7003, 0x0000,
++      0x7043, 0x0000, 0x7053, 0x0000, 0x0804, 0x44ee, 0xa684, 0x0004,
++      0x1110, 0x0804, 0x526b, 0x6000, 0xa084, 0x0004, 0x1160, 0x6000,
++      0xa084, 0x0001, 0x0140, 0x709f, 0x473b, 0x2001, 0x0007, 0x080c,
++      0x517c, 0x0804, 0x5271, 0x0804, 0x526b, 0x2200, 0x0002, 0x4744,
++      0x4746, 0x4744, 0x4744, 0x4744, 0x080c, 0x297f, 0x709b, 0x474a,
++      0x0804, 0x5279, 0x78e4, 0xa084, 0x0008, 0x1dc0, 0x080c, 0x516d,
++      0x709f, 0x4752, 0x0804, 0x526b, 0x2200, 0x0002, 0x475b, 0x475d,
++      0x475d, 0x475b, 0x475b, 0x080c, 0x297f, 0x78e4, 0xa084, 0x0008,
++      0x0178, 0x709b, 0x4765, 0x0804, 0x5279, 0x2011, 0x0004, 0x080c,
++      0x4cdd, 0x0002, 0x477a, 0x29df, 0x44ee, 0x477a, 0x4784, 0x4788,
++      0x690c, 0x81ff, 0x0138, 0x8109, 0x1120, 0x6827, 0x000f, 0x0804,
++      0x4818, 0x690e, 0x709f, 0x4782, 0x2001, 0x0003, 0x080c, 0x517c,
++      0x0804, 0x5271, 0x0804, 0x526b, 0x709f, 0x477a, 0x0804, 0x29df,
++      0x709f, 0x478c, 0x0804, 0x29df, 0x0ca8, 0xa282, 0x0003, 0x0310,
++      0x080c, 0x297f, 0xa386, 0x0002, 0x1180, 0xa286, 0x0002, 0x1190,
++      0x78a0, 0xa005, 0x1178, 0xd4fc, 0x1168, 0x78e4, 0xa084, 0x0008,
++      0x0120, 0xa6b5, 0x0008, 0x2019, 0x0000, 0xa684, 0x0008, 0x0110,
++      0x080c, 0x4b72, 0x6810, 0x70b2, 0x7003, 0x0007, 0x2300, 0x0002,
++      0x47b3, 0x47db, 0x47e2, 0x2200, 0x0002, 0x47ba, 0x47b8, 0x47d1,
++      0x080c, 0x297f, 0x7990, 0xa1ac, 0x0007, 0xa026, 0x2011, 0x0001,
++      0x080c, 0x4ce3, 0x0002, 0x47c8, 0x29df, 0x44ee, 0x47cf, 0x47ca,
++      0x0804, 0x526b, 0x709f, 0x47ce, 0x0804, 0x29df, 0x0cc8, 0x080c,
++      0x297f, 0xa684, 0x0010, 0x0128, 0x080c, 0x4b94, 0x0110, 0x0804,
++      0x29df, 0x0804, 0x4c05, 0x2200, 0x0002, 0x47e0, 0x47e0, 0x47e0,
++      0x080c, 0x297f, 0x2200, 0x0002, 0x47e7, 0x47e9, 0x47e9, 0x080c,
++      0x297f, 0x78e4, 0xa084, 0x0008, 0x0178, 0x709b, 0x47f1, 0x0804,
++      0x5279, 0x2011, 0x0004, 0x080c, 0x4cdd, 0x0002, 0x4805, 0x29df,
++      0x44ee, 0x4805, 0x480f, 0x4813, 0x690c, 0x81ff, 0x0130, 0x8109,
++      0x1118, 0x6827, 0x000f, 0x00a0, 0x690e, 0x709f, 0x480d, 0x2001,
++      0x0003, 0x080c, 0x517c, 0x0804, 0x5271, 0x0804, 0x526b, 0x709f,
++      0x4805, 0x0804, 0x29df, 0x709f, 0x4817, 0x0804, 0x29df, 0x0ca8,
++      0x70a8, 0xa080, 0x008f, 0x781a, 0x00d6, 0x6824, 0x0006, 0x080c,
++      0x522f, 0x000e, 0x6826, 0x2d00, 0x682e, 0x080c, 0x4432, 0x00de,
++      0x080c, 0x5184, 0x7003, 0x0000, 0x7043, 0x0000, 0x7053, 0x0000,
++      0x0804, 0x44ee, 0x2300, 0x0002, 0x4839, 0x483b, 0x4837, 0x080c,
++      0x297f, 0x7098, 0x0807, 0x7098, 0x0807, 0xa282, 0x0002, 0x0310,
++      0x080c, 0x297f, 0xa684, 0x0200, 0x0130, 0x080c, 0x5222, 0x080c,
++      0x4cca, 0x080c, 0x5223, 0x2300, 0x0002, 0x4850, 0x487e, 0x48de,
++      0xad86, 0xffff, 0x1108, 0x0005, 0xa286, 0x0001, 0x0110, 0x080c,
++      0x297f, 0xa684, 0x0200, 0x0120, 0x080c, 0x5222, 0x080c, 0x5223,
++      0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x1118, 0xa184, 0xff00,
++      0x6826, 0x2001, 0x0001, 0x080c, 0x5184, 0x78b8, 0x8007, 0xa084,
++      0x007f, 0x0140, 0x7848, 0xa085, 0x0008, 0x784a, 0x7848, 0xa084,
++      0x0008, 0x1de0, 0x7003, 0x0000, 0x0804, 0x44ee, 0x2200, 0x0002,
++      0x4882, 0x48b1, 0x709b, 0x4886, 0x0804, 0x5279, 0x2011, 0x000d,
++      0x080c, 0x4cdd, 0x0002, 0x4892, 0x29df, 0x44ee, 0x489a, 0x48a2,
++      0x48a7, 0x48a9, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++      0x0804, 0x524e, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a,
++      0x0804, 0x524e, 0x709f, 0x48a6, 0x0804, 0x29df, 0x0c58, 0x080c,
++      0x297f, 0x709f, 0x48ad, 0x0804, 0x29df, 0x080c, 0x527f, 0x0804,
++      0x29df, 0x709b, 0x48b5, 0x0804, 0x5279, 0x2011, 0x0012, 0x080c,
++      0x4cdd, 0x0002, 0x48c0, 0x29df, 0x44ee, 0x48cc, 0x48d4, 0x48d9,
++      0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x70a8, 0xa080,
++      0x00bf, 0x781a, 0x0804, 0x29df, 0xa6b4, 0x00ff, 0xa6b5, 0x0400,
++      0x6eb6, 0x7e5a, 0x0804, 0x524e, 0x709f, 0x48d8, 0x0804, 0x29df,
++      0x0c38, 0x709f, 0x48dd, 0x0804, 0x29df, 0x0c70, 0xa286, 0x0001,
++      0x0110, 0x080c, 0x297f, 0x709b, 0x48e7, 0x0804, 0x5279, 0x2011,
++      0x0015, 0x080c, 0x4cdd, 0x0002, 0x48f1, 0x29df, 0x44ee, 0x48ff,
++      0x490b, 0xa6b4, 0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x783b,
++      0x1301, 0x70a8, 0xa080, 0x00cb, 0x781a, 0x0804, 0x29df, 0xa6b4,
++      0x00ff, 0xa6b5, 0x0400, 0x6eb6, 0x7e5a, 0x70a8, 0xa080, 0x00bf,
++      0x781a, 0x0804, 0x29df, 0x709f, 0x490f, 0x0804, 0x29df, 0x0c08,
++      0xa282, 0x0003, 0x0310, 0x080c, 0x297f, 0x2300, 0x0002, 0x491a,
++      0x4956, 0x49b5, 0xa286, 0x0001, 0x0110, 0x080c, 0x297f, 0x6804,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x1130, 0x080c, 0x4432, 0x7003,
++      0x0000, 0x0804, 0x44ee, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684,
++      0x0200, 0x0130, 0x080c, 0x5222, 0x080c, 0x4cca, 0x080c, 0x5223,
++      0x6924, 0xa184, 0x00ff, 0xa086, 0x000a, 0x1118, 0xa184, 0xff00,
++      0x6826, 0x2001, 0x0001, 0x080c, 0x5184, 0x78b8, 0x8007, 0xa084,
++      0x007f, 0x0140, 0x7848, 0xa085, 0x0008, 0x784a, 0x7848, 0xa084,
++      0x0008, 0x1de0, 0x7003, 0x0000, 0x0804, 0x44ee, 0xa684, 0x0200,
++      0x0120, 0x080c, 0x4cca, 0x080c, 0x5223, 0x2200, 0x0002, 0x4961,
++      0x4992, 0x709b, 0x4965, 0x0804, 0x5279, 0x2011, 0x000d, 0x080c,
++      0x4cdd, 0x0002, 0x4971, 0x29df, 0x44ee, 0x4979, 0x4981, 0x4986,
++      0x4988, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804,
++      0x524e, 0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804,
++      0x524e, 0x709f, 0x4985, 0x0804, 0x29df, 0x0c58, 0x080c, 0x297f,
++      0x709f, 0x498e, 0x080c, 0x5223, 0x0804, 0x29df, 0x080c, 0x527f,
++      0x0804, 0x29df, 0x709b, 0x4996, 0x0804, 0x5279, 0x2011, 0x0005,
++      0x080c, 0x4cdd, 0x0002, 0x49a0, 0x29df, 0x44ee, 0x49a8, 0x49b0,
++      0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804, 0x524e,
++      0xa6b4, 0x00ff, 0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804, 0x524e,
++      0x709f, 0x49b4, 0x0804, 0x29df, 0x0c58, 0xa286, 0x0001, 0x0110,
++      0x080c, 0x297f, 0x709b, 0x49be, 0x0804, 0x5279, 0x2011, 0x0006,
++      0x080c, 0x4cdd, 0x0002, 0x49c8, 0x29df, 0x44ee, 0x49ce, 0x49d8,
++      0xa6b5, 0x0800, 0x6eb6, 0x7e5a, 0x0804, 0x524e, 0xa6b4, 0x00ff,
++      0xa6b5, 0x0800, 0x6eb6, 0xa6b5, 0x4000, 0x7e5a, 0x0804, 0x524e,
++      0x709f, 0x49dc, 0x0804, 0x29df, 0x0c58, 0x2300, 0x0002, 0x49e4,
++      0x49e2, 0x49e2, 0x080c, 0x297f, 0x080c, 0x297f, 0x2300, 0x719c,
++      0xa005, 0x0817, 0x6810, 0x70b2, 0xa282, 0x0003, 0x0310, 0x080c,
++      0x297f, 0x2300, 0x0002, 0x49f6, 0x4a03, 0x4a21, 0xa684, 0x0200,
++      0x0120, 0x080c, 0x5222, 0x080c, 0x5223, 0x2001, 0x0001, 0x080c,
++      0x5184, 0x0804, 0x29df, 0xa286, 0x0002, 0x0120, 0x82ff, 0x0110,
++      0x080c, 0x297f, 0x709b, 0x4a0e, 0x0804, 0x5279, 0x2011, 0x0018,
++      0x080c, 0x4cdd, 0x0002, 0x4a18, 0x29df, 0x44ee, 0x4a1a, 0x4a1c,
++      0x0804, 0x524e, 0x0804, 0x524e, 0x709f, 0x4a20, 0x0804, 0x29df,
++      0x0cb8, 0x2200, 0x0002, 0x4a25, 0x4a3c, 0x709b, 0x4a29, 0x0804,
++      0x5279, 0x2011, 0x0017, 0x080c, 0x4cdd, 0x0002, 0x4a33, 0x29df,
++      0x44ee, 0x4a35, 0x4a37, 0x0804, 0x524e, 0x0804, 0x524e, 0x709f,
++      0x4a3b, 0x0804, 0x29df, 0x0cb8, 0xd4fc, 0x1904, 0x4abb, 0xa684,
++      0x0100, 0x0120, 0x080c, 0x5222, 0x080c, 0x4cca, 0x00c6, 0x080c,
++      0x4fc6, 0x6028, 0xd08c, 0x0190, 0x612c, 0x7adc, 0x080c, 0x20dd,
++      0x2110, 0x2008, 0x6024, 0xa210, 0xa189, 0x0000, 0x78d8, 0xa210,
++      0xa189, 0x0000, 0x602c, 0x080c, 0x52b7, 0x0020, 0x78d8, 0x78d2,
++      0x78dc, 0x78d6, 0x00ce, 0xa6b4, 0xefff, 0x7e5a, 0x709b, 0x4a6a,
++      0x0804, 0x5279, 0x2011, 0x000d, 0x080c, 0x4cdd, 0x0002, 0x4a76,
++      0x29df, 0x44ee, 0x4a76, 0x4aaa, 0x4aaf, 0x4ab1, 0x78d8, 0x79dc,
++      0xa105, 0x1168, 0x78b8, 0x8007, 0xa084, 0x007f, 0x1140, 0x70a7,
++      0x0000, 0x7858, 0xa084, 0xfdff, 0x785a, 0x0804, 0x524e, 0xa684,
++      0x0100, 0x01f0, 0x080c, 0x5223, 0x080c, 0x51cf, 0x0026, 0x0036,
++      0x00c6, 0x080c, 0x4fc6, 0x6028, 0xd08c, 0x0138, 0x6020, 0x00ce,
++      0x6930, 0x6a2c, 0x080c, 0x52b7, 0x0028, 0x00ce, 0x682c, 0x78d2,
++      0x6830, 0x78d6, 0x70a7, 0x0000, 0x001e, 0x000e, 0x080c, 0x5622,
++      0x0804, 0x524e, 0x709f, 0x4aae, 0x0804, 0x29df, 0x0838, 0x080c,
++      0x297f, 0x709f, 0x4ab7, 0x080c, 0x5223, 0x0804, 0x29df, 0x080c,
++      0x527f, 0x0804, 0x29df, 0x080c, 0x5223, 0x6918, 0xd1a4, 0x0140,
++      0x6827, 0x000f, 0x080c, 0x5184, 0x080c, 0x5223, 0x0804, 0x29df,
++      0x709f, 0x4ad0, 0x2001, 0x0003, 0x080c, 0x517c, 0x0804, 0x5271,
++      0x080c, 0x5207, 0x682c, 0x78d2, 0x6830, 0x78d6, 0x0804, 0x524e,
++      0xa282, 0x0002, 0x0310, 0x080c, 0x297f, 0x2300, 0x0002, 0x4ae2,
++      0x4af2, 0x4af4, 0xa286, 0x0001, 0x0110, 0x080c, 0x297f, 0x00c6,
++      0x080c, 0x4fc6, 0x6224, 0x2009, 0x0000, 0x602c, 0x080c, 0x52b7,
++      0x0804, 0x524e, 0x080c, 0x297f, 0x080c, 0x297f, 0x0026, 0x002e,
++      0xa684, 0x0200, 0x0130, 0x080c, 0x5222, 0x080c, 0x4cca, 0x080c,
++      0x5223, 0x2300, 0x0002, 0x4b06, 0x4b08, 0x4b0a, 0x0804, 0x4850,
++      0x0804, 0x487e, 0x0804, 0x48de, 0x70ac, 0x6812, 0x70b2, 0x8000,
++      0x70ae, 0x681b, 0x0000, 0xa684, 0x0008, 0x01c0, 0x0156, 0x0136,
++      0x0146, 0x7890, 0x8004, 0x8004, 0x8004, 0x8004, 0xa084, 0x000f,
++      0x681a, 0x80ac, 0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0xad80,
++      0x000b, 0x20a0, 0x53a5, 0x014e, 0x013e, 0x015e, 0xa6c4, 0x0f00,
++      0xa684, 0x0002, 0x1140, 0x692c, 0x810d, 0x810d, 0x810d, 0xa184,
++      0x0007, 0x2008, 0x0090, 0x789b, 0x0090, 0x79ac, 0xa184, 0x0020,
++      0x0160, 0x0016, 0x2009, 0x0005, 0x2001, 0x3d00, 0x080c, 0x51da,
++      0x6824, 0xa085, 0x003b, 0x6826, 0x001e, 0xa184, 0x001f, 0xa805,
++      0x0016, 0x3208, 0xa18c, 0x0600, 0x0110, 0xc0fc, 0x0008, 0xc0fd,
++      0x001e, 0x6816, 0x080c, 0x449c, 0x68ce, 0xa684, 0x0004, 0x0130,
++      0xa18c, 0xff00, 0x78a8, 0xa084, 0x00ff, 0xa105, 0x682a, 0xa6b4,
++      0x00ff, 0x6000, 0xa084, 0x0008, 0x0110, 0xa6b5, 0x4000, 0x6eb6,
++      0x7e5a, 0x0005, 0x0156, 0x0136, 0x0146, 0x6918, 0x7890, 0x8004,
++      0x8004, 0x8004, 0x8004, 0xa084, 0x000f, 0x0006, 0xa100, 0x681a,
++      0x000e, 0x8000, 0x8004, 0x0160, 0x20a8, 0x8104, 0xa080, 0x000b,
++      0xad00, 0x20a0, 0x789b, 0x0000, 0xaf80, 0x002b, 0x2098, 0x53a5,
++      0x014e, 0x013e, 0x015e, 0x0005, 0x682c, 0xd0b4, 0x1140, 0xd0ac,
++      0x1118, 0x2011, 0x0010, 0x0048, 0x2011, 0x000c, 0x0030, 0xa084,
++      0x0020, 0x1110, 0x620c, 0x0008, 0x6210, 0x6b18, 0x2300, 0xa202,
++      0x01c0, 0x2018, 0xa382, 0x000e, 0x0220, 0x0118, 0x2019, 0x000e,
++      0x0020, 0x7858, 0xa084, 0xffef, 0x785a, 0x783b, 0x1b01, 0x7893,
++      0x0000, 0x7ba2, 0x70a8, 0xa080, 0x009e, 0x781a, 0xa085, 0x0001,
++      0x0005, 0x7858, 0xa084, 0xffef, 0x785a, 0x7893, 0x0000, 0xa006,
++      0x0005, 0x6904, 0xa18c, 0x00ff, 0xa196, 0x0007, 0x0128, 0xa196,
++      0x000f, 0x0110, 0x6807, 0x0117, 0x6914, 0x6814, 0x080c, 0x449c,
++      0x6100, 0x8104, 0x1290, 0x601c, 0xa005, 0x0118, 0x2001, 0x0800,
++      0x0070, 0x00d6, 0x6824, 0x0006, 0x080c, 0x522f, 0x000e, 0x6826,
++      0x2d00, 0x682e, 0x080c, 0x4432, 0x00de, 0x2001, 0x0200, 0x6924,
++      0xa18c, 0x00ff, 0xa10d, 0x6926, 0x8007, 0x789b, 0x000e, 0x78aa,
++      0x6820, 0xa085, 0x8000, 0x6822, 0x2031, 0x0400, 0x6eb6, 0x7e5a,
++      0x71a8, 0xa188, 0x00a1, 0x791a, 0x0005, 0x080c, 0x2ae3, 0x6814,
++      0x2040, 0xa684, 0x0002, 0x1168, 0x692c, 0x810d, 0x810d, 0x810d,
++      0xa184, 0x0007, 0x2008, 0xa805, 0x6816, 0x080c, 0x449c, 0x68ce,
++      0x0020, 0x6914, 0x6814, 0x080c, 0x449c, 0x6100, 0x8104, 0x1a04,
++      0x4c70, 0xa184, 0x0300, 0x0118, 0x6807, 0x0117, 0x00d0, 0x6004,
++      0xa005, 0x1500, 0x6807, 0x0117, 0x601c, 0xa005, 0x1150, 0x00d6,
++      0x080c, 0x522f, 0x6827, 0x0034, 0x2d00, 0x682e, 0x080c, 0x4432,
++      0x00de, 0xa684, 0x0004, 0x0128, 0x2031, 0x0400, 0x2001, 0x2800,
++      0x0020, 0x2031, 0x0400, 0x2001, 0x0800, 0x71a8, 0xa188, 0x00a1,
++      0x0804, 0x4ca5, 0x6018, 0xa005, 0x1d60, 0x601c, 0xa005, 0x1d48,
++      0x689f, 0x0000, 0x6827, 0x003d, 0xa684, 0x0001, 0x0904, 0x4cb3,
++      0xd694, 0x1180, 0x6100, 0xd1d4, 0x0168, 0x692c, 0xa18c, 0x00ff,
++      0x0904, 0x4cb3, 0xa186, 0x0003, 0x0904, 0x4cb3, 0xa186, 0x0012,
++      0x0904, 0x4cb3, 0xa6b5, 0x0800, 0x71a8, 0xa188, 0x00c3, 0x04f0,
++      0x6807, 0x0117, 0x2031, 0x0400, 0x692c, 0xa18c, 0x00ff, 0xa186,
++      0x0012, 0x1128, 0x2001, 0x4cc0, 0x2009, 0x0001, 0x0070, 0xa186,
++      0x0003, 0x1128, 0x2001, 0x4cc1, 0x2009, 0x0012, 0x0030, 0x2001,
++      0x0200, 0x71a8, 0xa188, 0x00a1, 0x00c0, 0x6a34, 0xa29d, 0x0000,
++      0x1110, 0xa006, 0x0cb0, 0x0006, 0x2100, 0xa21a, 0x000e, 0x1208,
++      0x2208, 0x080c, 0x51f4, 0x78a3, 0x0000, 0x681c, 0xa085, 0x0040,
++      0x681e, 0x71a8, 0xa188, 0x00f3, 0xa006, 0x6826, 0x8007, 0x789b,
++      0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822, 0x6eb6, 0x7e5a,
++      0x791a, 0x0804, 0x29df, 0x6eb6, 0x080c, 0x4432, 0x6810, 0x70b2,
++      0x7003, 0x0007, 0x7097, 0x0000, 0x7053, 0x0000, 0x0804, 0x29df,
++      0x0023, 0x0070, 0x0005, 0x0000, 0x0a00, 0x0000, 0x0000, 0x0025,
++      0x0000, 0x0000, 0x683b, 0x0000, 0x6837, 0x0000, 0xa684, 0x0200,
++      0x0158, 0x78b8, 0x8007, 0xa08c, 0x007f, 0x78d8, 0xa100, 0x6836,
++      0x78dc, 0xa081, 0x0000, 0x683a, 0x0005, 0x7990, 0x810f, 0xa5ac,
++      0x0007, 0x2021, 0x0000, 0xa480, 0x0090, 0x789a, 0x79a8, 0xa18c,
++      0x00ff, 0xa184, 0x0080, 0x11e0, 0xa182, 0x0020, 0x16b0, 0xa182,
++      0x0012, 0x1a04, 0x516d, 0x2100, 0x000b, 0x0005, 0x516d, 0x4f27,
++      0x516d, 0x516d, 0x4d31, 0x4d34, 0x4d78, 0x4db3, 0x4de6, 0x4de9,
++      0x516d, 0x516d, 0x4d98, 0x4e54, 0x4e8c, 0x516d, 0x516d, 0x4eb2,
++      0xa184, 0x0020, 0x1904, 0x4ee6, 0xa18c, 0x001f, 0x6814, 0xa084,
++      0x001f, 0xa106, 0x0178, 0x70a8, 0xa080, 0x008f, 0x781a, 0x2001,
++      0x0014, 0x080c, 0x5184, 0x080c, 0x5223, 0x7003, 0x0000, 0x2001,
++      0x0002, 0x0005, 0x2001, 0x0000, 0x0005, 0xa182, 0x0024, 0x1a04,
++      0x516d, 0xa184, 0x0003, 0x0853, 0x0005, 0x516d, 0x516d, 0x516d,
++      0x516d, 0x080c, 0x516d, 0x0005, 0x2200, 0x0002, 0x4eb5, 0x4eb5,
++      0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d65,
++      0x4d63, 0x4d65, 0x4d4f, 0x4d57, 0x4d57, 0x4d57, 0x4d65, 0x4d65,
++      0x4d6d, 0x4d70, 0x4eb5, 0x4d70, 0x4d65, 0x4d65, 0x4d65, 0x00c6,
++      0x0076, 0x6f14, 0x080c, 0x3ec6, 0x007e, 0x00ce, 0x0070, 0x6818,
++      0xd0a4, 0x0158, 0x6827, 0x0033, 0x080c, 0x5184, 0x080c, 0x5223,
++      0x2001, 0x0001, 0x0005, 0x080c, 0x4fd7, 0x6827, 0x02b3, 0x2009,
++      0x000b, 0x2001, 0x4800, 0x0804, 0x4ee9, 0x080c, 0x515e, 0x0005,
++      0x6827, 0x0093, 0x2009, 0x000b, 0x2001, 0x4800, 0x0804, 0x4ed1,
++      0x2d58, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1110, 0x6807,
++      0x0117, 0x6827, 0x0002, 0x080c, 0x522f, 0x6827, 0x0036, 0x6932,
++      0x2d00, 0x682e, 0x00d6, 0x080c, 0x440a, 0x080c, 0x4f11, 0x2b68,
++      0x080c, 0x4432, 0x00de, 0x080c, 0x4432, 0x2001, 0x0002, 0x0005,
++      0x080c, 0x4f11, 0x2001, 0x0017, 0x080c, 0x5184, 0x7097, 0x0000,
++      0x6914, 0xd1fc, 0x0118, 0x2009, 0xb3c6, 0x0010, 0x2009, 0xb386,
++      0x200b, 0x0006, 0x70a3, 0x0017, 0x2009, 0x0200, 0x080c, 0x4318,
++      0x2001, 0x0001, 0x0005, 0x2200, 0x0002, 0x4eb5, 0x4ee6, 0x4ee6,
++      0x4ee6, 0x4dd6, 0x4ef8, 0x4dde, 0x4ef8, 0x4ef8, 0x4efb, 0x4efb,
++      0x4f00, 0x4f00, 0x4dce, 0x4dce, 0x4ee6, 0x4ee6, 0x4ef8, 0x4ee6,
++      0x4dde, 0x4eb5, 0x4dde, 0x4dde, 0x4dde, 0x4dde, 0x6827, 0x0084,
++      0x2009, 0x000b, 0x2001, 0x4300, 0x0804, 0x4f0a, 0x6827, 0x000d,
++      0x2009, 0x000b, 0x2001, 0x4300, 0x0804, 0x4ee9, 0x6827, 0x0093,
++      0x2009, 0x000b, 0x2001, 0x4300, 0x0804, 0x4ed1, 0x2001, 0x0000,
++      0x0005, 0x2200, 0x0002, 0x4eb5, 0x4e4c, 0x4e4c, 0x4e4c, 0x4e4c,
++      0x4e04, 0x4e04, 0x4e04, 0x4e04, 0x4e04, 0x4e04, 0x4e04, 0x4e04,
++      0x4e4c, 0x4e4c, 0x4e4c, 0x4e4c, 0x4e2a, 0x4e4c, 0x4e4c, 0x4e2a,
++      0x4e2a, 0x4e2a, 0x4e2a, 0x4eb5, 0x6804, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x1500, 0x690c, 0xa184, 0x000f, 0x0904, 0x4ef8, 0x8001,
++      0x0130, 0xa18c, 0xfff0, 0xa105, 0x680e, 0x0804, 0x4ef8, 0x70a8,
++      0xa080, 0x008f, 0x781a, 0x6827, 0x000f, 0x080c, 0x4bc9, 0x080c,
++      0x5184, 0x7003, 0x0000, 0x7043, 0x0000, 0x7053, 0x0000, 0x2001,
++      0x0002, 0x0005, 0x6918, 0xa184, 0x000f, 0x0904, 0x4ef8, 0x8001,
++      0x0130, 0xa18c, 0xfff0, 0xa105, 0x681a, 0x0804, 0x4ef8, 0x70a8,
++      0xa080, 0x008f, 0x781a, 0x6827, 0x008f, 0x2009, 0x000b, 0x2001,
++      0x4300, 0x080c, 0x51da, 0x080c, 0x5184, 0x080c, 0x5223, 0x7003,
++      0x0000, 0x2001, 0x0002, 0x0005, 0x6827, 0x0093, 0x2009, 0x000b,
++      0x2001, 0x4300, 0x0804, 0x4ed1, 0xa684, 0x0004, 0x1180, 0x6804,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x516d, 0x080c, 0x4f11,
++      0x6807, 0x0117, 0x080c, 0x4432, 0x2001, 0x0002, 0x0005, 0x6000,
++      0xa084, 0x0004, 0x0904, 0x516d, 0x2d58, 0x6804, 0xa084, 0x00ff,
++      0xa086, 0x0006, 0x1110, 0x6807, 0x0117, 0x6827, 0x0002, 0x080c,
++      0x522f, 0x6827, 0x0036, 0x6932, 0x2d00, 0x682e, 0x00d6, 0x080c,
++      0x4416, 0x080c, 0x4f11, 0x2b68, 0x080c, 0x4432, 0x00de, 0x080c,
++      0x4432, 0x2001, 0x0002, 0x0005, 0x6000, 0xa084, 0x0004, 0x0904,
++      0x516d, 0x2d58, 0x6a04, 0xa294, 0x00ff, 0xa286, 0x0006, 0x1110,
++      0x6807, 0x0117, 0x6827, 0x0002, 0x2d58, 0x080c, 0x522f, 0x6827,
++      0x0036, 0x6932, 0x2d00, 0x682e, 0x00d6, 0x080c, 0x4424, 0x080c,
++      0x4f11, 0x2b68, 0x080c, 0x4432, 0x00de, 0x080c, 0x4432, 0x2001,
++      0x0002, 0x0005, 0x080c, 0x516d, 0x0005, 0x70a8, 0xa080, 0x008f,
++      0x781a, 0x2001, 0x0001, 0x080c, 0x5184, 0x080c, 0x5223, 0x7003,
++      0x0000, 0x2001, 0x0002, 0x0005, 0x080c, 0x51da, 0x080c, 0x5222,
++      0x080c, 0x4cca, 0x080c, 0x4bc9, 0x080c, 0x5223, 0x2001, 0x0001,
++      0x0005, 0x080c, 0x51da, 0x080c, 0x5222, 0x080c, 0x4cca, 0x70a8,
++      0xa080, 0x008f, 0x781a, 0x2001, 0x0013, 0x080c, 0x5184, 0x080c,
++      0x5223, 0x7003, 0x0000, 0x2001, 0x0002, 0x0005, 0x080c, 0x516d,
++      0x0005, 0x080c, 0x51da, 0x080c, 0x5222, 0x080c, 0x4cca, 0x080c,
++      0x4bc9, 0x080c, 0x5223, 0x080c, 0x527f, 0x2001, 0x0001, 0x0005,
++      0x2001, 0x0003, 0x0005, 0x080c, 0x4fd7, 0x2001, 0x0000, 0x0005,
++      0x00c6, 0x0076, 0x6f14, 0x080c, 0x3ec6, 0x007e, 0x00ce, 0x2001,
++      0x0000, 0x0005, 0x080c, 0x51da, 0x080c, 0x516d, 0x2001, 0x0006,
++      0x0005, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0118, 0xa186,
++      0x000f, 0x1120, 0x080c, 0x5222, 0x080c, 0x4cca, 0x70a8, 0xa080,
++      0x008f, 0x781a, 0x080c, 0x5223, 0x7003, 0x0000, 0x0005, 0x7aa8,
++      0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0005, 0x1a04,
++      0x516d, 0x000b, 0x0005, 0x516d, 0x4f38, 0x516d, 0x4fdd, 0x50a0,
++      0xa282, 0x0003, 0x1904, 0x516d, 0x7da8, 0xa5ac, 0x00ff, 0x7ea8,
++      0xa6b4, 0x00ff, 0x69b8, 0xa184, 0x0100, 0x05a0, 0xa18c, 0xfeff,
++      0x69ba, 0x78a0, 0xa005, 0x1570, 0xa6b4, 0x00ff, 0x01f0, 0xa682,
++      0x001d, 0x1270, 0xa686, 0x0010, 0x1108, 0x8631, 0x852b, 0x852b,
++      0x2041, 0x0000, 0x080c, 0x3f0c, 0x0118, 0x080c, 0x3d35, 0x0078,
++      0x080c, 0x508e, 0x080c, 0x3d32, 0x69b8, 0xa18d, 0x0100, 0x69ba,
++      0x7e58, 0xa6b5, 0x1000, 0x7e5a, 0x0030, 0x080c, 0x3d32, 0x7e58,
++      0xa6b4, 0xefff, 0x7e5a, 0x70a8, 0xa080, 0x00a1, 0x781a, 0x2001,
++      0x0001, 0x0005, 0x00c6, 0x080c, 0x4fc6, 0x6200, 0xd2e4, 0x05a0,
++      0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x001c, 0x0218, 0x0110,
++      0x2011, 0x001c, 0x2600, 0xa202, 0x1208, 0x2230, 0xa686, 0x0010,
++      0x1108, 0x8631, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130,
++      0xa282, 0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c,
++      0x1210, 0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228, 0x2620,
++      0x080c, 0x5091, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3f0c,
++      0x0118, 0x080c, 0x3d3e, 0x0020, 0x080c, 0x508e, 0x080c, 0x3d3b,
++      0x7e58, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080,
++      0x00de, 0x781a, 0x2001, 0x0004, 0x00ce, 0x0005, 0x6814, 0x8007,
++      0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x8003, 0x6914, 0xd1fc,
++      0x1118, 0xa0e0, 0xb800, 0x0010, 0xa0e0, 0xb900, 0x0005, 0x00c6,
++      0x0c69, 0x080c, 0x3d3b, 0x00ce, 0x0005, 0xa282, 0x0002, 0x1904,
++      0x516d, 0x7aa8, 0xa294, 0x00ff, 0x69b8, 0xa184, 0x0200, 0x0540,
++      0xa18c, 0xfdff, 0x69ba, 0x78a0, 0xa005, 0x1510, 0xa282, 0x0002,
++      0x1a04, 0x3e69, 0x080c, 0x506b, 0x080c, 0x3deb, 0x080c, 0x3d32,
++      0x7e58, 0xa684, 0x0100, 0x0150, 0x682c, 0xa084, 0x0001, 0x0130,
++      0xc6fc, 0x7888, 0xa084, 0x0040, 0x0108, 0xc6fd, 0xa6b5, 0x1000,
++      0x7e5a, 0x70a8, 0xa080, 0x00a1, 0x781a, 0x2001, 0x0001, 0x0005,
++      0x00c6, 0x080c, 0x4fc6, 0x6028, 0xc08c, 0x602a, 0xa284, 0xfffe,
++      0x0118, 0x2011, 0x0001, 0x0018, 0xa284, 0x0001, 0x0128, 0x6100,
++      0xd1ec, 0x1110, 0x2011, 0x0000, 0x04c1, 0x080c, 0x3df1, 0x080c,
++      0x3d3b, 0x7e58, 0xa684, 0x0100, 0x0150, 0x682c, 0xa084, 0x0001,
++      0x0130, 0xc6fc, 0x7888, 0xa084, 0x0040, 0x0108, 0xc6fd, 0xa6b5,
++      0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00de, 0x781a,
++      0x2001, 0x0004, 0x00ce, 0x0005, 0x00c6, 0x2960, 0x6000, 0x2011,
++      0x0001, 0xa084, 0x2000, 0x1110, 0x2011, 0x0000, 0x78ab, 0x0001,
++      0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x68b8,
++      0xa085, 0x0200, 0x68ba, 0x00ce, 0x0005, 0x789b, 0x0018, 0x78ab,
++      0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0081,
++      0x78ab, 0x0004, 0x0005, 0x00c6, 0x705c, 0x2060, 0x6000, 0xa084,
++      0x1000, 0x1128, 0x2029, 0x0032, 0x2021, 0x0000, 0x0080, 0x6408,
++      0xa4ac, 0x00ff, 0xa582, 0x000c, 0x1210, 0x2029, 0x000c, 0x8427,
++      0xa4a4, 0x00ff, 0xa482, 0x001c, 0x0210, 0x2021, 0x001c, 0x0049,
++      0x68b8, 0xa085, 0x0100, 0x68ba, 0x00ce, 0x0005, 0xa026, 0x2029,
++      0x0032, 0x789b, 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab,
++      0x0001, 0x7daa, 0x7caa, 0x789b, 0x0081, 0x78ab, 0x0005, 0x0005,
++      0x080c, 0x4fc6, 0x6000, 0xd09c, 0x1118, 0x080c, 0x516d, 0x0005,
++      0xa282, 0x0006, 0x0118, 0x080c, 0x516d, 0x0005, 0x7aa8, 0xa294,
++      0x00ff, 0x7e5a, 0x7ea8, 0x7ea8, 0xa6b4, 0x00ff, 0x7fa8, 0xa7bc,
++      0x00ff, 0xa782, 0x0002, 0x0218, 0x080c, 0x516d, 0x0005, 0x78a8,
++      0x2040, 0xa8c4, 0x00ff, 0xa882, 0x0003, 0x0218, 0x080c, 0x516d,
++      0x0005, 0xa886, 0x0001, 0x1118, 0x080c, 0x516d, 0x0005, 0x2600,
++      0xa005, 0x1120, 0x080c, 0x4fd7, 0x0804, 0x513e, 0xa682, 0x001c,
++      0x0218, 0x0110, 0x2031, 0x001c, 0x88ff, 0x0168, 0x87ff, 0x1118,
++      0x080c, 0x516d, 0x0005, 0x6000, 0xd0ec, 0x0118, 0x78ec, 0xd0e4,
++      0x1110, 0x2041, 0x0000, 0x87ff, 0x1178, 0xa282, 0x000a, 0x0230,
++      0x0128, 0xa282, 0x0061, 0x1128, 0x0120, 0x00b8, 0x2011, 0x000a,
++      0x00a0, 0x2011, 0x0061, 0x0088, 0x78ec, 0xd0e4, 0x1108, 0x0c68,
++      0xa282, 0x0009, 0x0228, 0x0120, 0xa282, 0x0019, 0x0230, 0x0018,
++      0x2011, 0x0009, 0x0010, 0x2011, 0x0019, 0x0086, 0x0076, 0x0066,
++      0x8213, 0x8213, 0x2228, 0x080c, 0x3f0c, 0x006e, 0x007e, 0x008e,
++      0x1128, 0x080c, 0x4fd7, 0xa016, 0xa036, 0x0400, 0x87ff, 0x0150,
++      0xa8ac, 0x0002, 0x0138, 0x6520, 0x85ff, 0x0120, 0x6528, 0xc58d,
++      0x652a, 0x0018, 0x6528, 0xc58c, 0x652a, 0x2620, 0x88ff, 0x0108,
++      0x8634, 0xa69e, 0x0010, 0x1108, 0x8631, 0x0026, 0x080c, 0x3d3e,
++      0x080c, 0x3df1, 0x2430, 0x002e, 0x8214, 0x8214, 0x789b, 0x0018,
++      0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x7aaa, 0x78ab,
++      0x0000, 0x7eaa, 0x7faa, 0x2800, 0x78aa, 0x789b, 0x0081, 0x78ab,
++      0x0008, 0x7e58, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8,
++      0xa080, 0x00de, 0x781a, 0x2001, 0x0004, 0x0005, 0x2001, 0x0003,
++      0x00d9, 0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080,
++      0x00de, 0x781a, 0x2001, 0x0005, 0x0005, 0x2001, 0x0007, 0x0061,
++      0xa6b5, 0x1000, 0x7e5a, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00de,
++      0x781a, 0x2001, 0x0004, 0x0005, 0x789b, 0x0018, 0x78aa, 0x789b,
++      0x0081, 0x78ab, 0x0001, 0x0005, 0x6904, 0xa18c, 0x00ff, 0xa196,
++      0x0007, 0x0130, 0xa196, 0x000f, 0x0118, 0x080c, 0x1ca6, 0x0005,
++      0x6924, 0xa194, 0x003f, 0x1120, 0xa18c, 0xffc0, 0xa105, 0x6826,
++      0x6a1c, 0xd29c, 0x1530, 0xa086, 0x0001, 0x1518, 0x2001, 0xb341,
++      0x2004, 0xd094, 0x01f0, 0x0e04, 0x51c1, 0x0156, 0x00e6, 0x0036,
++      0x0046, 0x0056, 0x2071, 0x0010, 0x7bf0, 0x7af4, 0x7cf8, 0x7dfc,
++      0x2009, 0x0002, 0xad80, 0x0003, 0x080c, 0x1e7a, 0x005e, 0x004e,
++      0x003e, 0x00ee, 0x015e, 0x1128, 0x2091, 0x4080, 0x080c, 0x1ca6,
++      0x0010, 0x080c, 0x4432, 0x691c, 0xa184, 0x0100, 0x0138, 0x6914,
++      0x2100, 0x080c, 0x449c, 0x6204, 0x8210, 0x6206, 0x0005, 0x692c,
++      0x6834, 0x682e, 0xa112, 0x6930, 0x6838, 0x6832, 0xa11b, 0xa200,
++      0xa301, 0x0005, 0x00c6, 0xade0, 0x0018, 0x6003, 0x0070, 0x6106,
++      0x600b, 0x0000, 0x600f, 0x0a00, 0x6013, 0x0000, 0x6017, 0x0000,
++      0x8007, 0x601a, 0x601f, 0x0000, 0x6023, 0x0000, 0x00ce, 0x6824,
++      0xa085, 0x0080, 0x6826, 0x0005, 0x0156, 0x0136, 0x0146, 0x2098,
++      0xaf80, 0x002d, 0x20a0, 0x81ac, 0x0108, 0x53a6, 0xa184, 0x0001,
++      0x0110, 0x3304, 0x78be, 0x014e, 0x013e, 0x015e, 0x0005, 0x70a4,
++      0x00e6, 0x0006, 0x000e, 0x00ee, 0xa005, 0x6918, 0x0016, 0x6914,
++      0x0016, 0x6928, 0x0016, 0x001e, 0x001e, 0x001e, 0x190c, 0x297f,
++      0x70a7, 0x8000, 0x6814, 0xd0fc, 0x0110, 0xc185, 0x0008, 0xc184,
++      0x0804, 0x55dc, 0x0005, 0x71a4, 0x81ff, 0x0140, 0x7848, 0xa085,
++      0x0008, 0x784a, 0x70a7, 0x0000, 0x080c, 0x52e3, 0x0005, 0x00c6,
++      0x00d6, 0x080c, 0x1c85, 0x00ce, 0x0156, 0x0136, 0x0146, 0x2da0,
++      0x2c98, 0x20a9, 0x0037, 0x53a3, 0x014e, 0x013e, 0x015e, 0x6807,
++      0x010d, 0x680b, 0x0000, 0x701c, 0x8007, 0x681a, 0x6823, 0x0000,
++      0x681f, 0x0000, 0x689f, 0x0000, 0x00ce, 0x0005, 0x00c6, 0x080c,
++      0x4fc6, 0x6028, 0xd08c, 0x00ce, 0x0180, 0x7814, 0xa084, 0x0001,
++      0x0130, 0x70a8, 0xa080, 0x011c, 0x781a, 0x0804, 0x29df, 0x70a8,
++      0xa080, 0x0135, 0x781a, 0x0804, 0x29df, 0x70a8, 0xa080, 0x00a1,
++      0x781a, 0x0804, 0x29df, 0x70a8, 0xa080, 0x0092, 0x781a, 0x0804,
++      0x29df, 0x783b, 0x1700, 0x70a8, 0xa080, 0x00de, 0x781a, 0x0804,
++      0x29df, 0x70a8, 0xa080, 0x00e7, 0x781a, 0x0804, 0x29df, 0x6904,
++      0xa18c, 0x00ff, 0xa196, 0x0007, 0x0128, 0xa196, 0x000f, 0x0110,
++      0x6807, 0x0117, 0x6824, 0xa084, 0x00ff, 0xa085, 0x0200, 0x6826,
++      0x8007, 0x789b, 0x000e, 0x78aa, 0x6820, 0xa085, 0x8000, 0x6822,
++      0x2031, 0x0400, 0x6eb6, 0x7e5a, 0x71a8, 0xa188, 0x00a1, 0x791a,
++      0x0005, 0x080c, 0x5223, 0x7848, 0xa085, 0x000c, 0x784a, 0x70a8,
++      0xa080, 0x008f, 0x781a, 0x2009, 0x000b, 0x2001, 0x4400, 0x080c,
++      0x51da, 0x2001, 0x0013, 0x080c, 0x5184, 0x0804, 0x44ee, 0x81ff,
++      0x1110, 0xa21a, 0x0218, 0x080c, 0x20ea, 0x0070, 0x7ad2, 0x7ada,
++      0x2200, 0x2011, 0x0001, 0x6027, 0x0000, 0x7ad6, 0x78df, 0x0000,
++      0x7b14, 0xc384, 0x7b16, 0x0088, 0x81ff, 0x1130, 0x6027, 0x0000,
++      0x7b14, 0xc384, 0x7b16, 0x0020, 0x6126, 0x7b14, 0xc385, 0x7b16,
++      0x78d2, 0x78da, 0x7ad6, 0x8211, 0x7ade, 0x6232, 0x602e, 0x6028,
++      0xc085, 0x602a, 0x0005, 0x0126, 0x70f0, 0xa084, 0x4c00, 0x8004,
++      0x2090, 0x7204, 0x700c, 0xa215, 0x7008, 0xc09c, 0xa205, 0x1138,
++      0x7007, 0x0004, 0x7003, 0x0000, 0x012e, 0x2000, 0x0005, 0x7000,
++      0xd084, 0x0580, 0x7108, 0xe000, 0x7008, 0xa106, 0x1dd8, 0xa184,
++      0x0003, 0x0904, 0x534b, 0xa184, 0x01e0, 0x1904, 0x534b, 0xd1f4,
++      0x1d88, 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60, 0x2011, 0x0180,
++      0x710c, 0x8211, 0x0130, 0x7008, 0xd0f4, 0x1d20, 0x700c, 0xa106,
++      0x0dc0, 0x7007, 0x0012, 0x7108, 0xe000, 0x7008, 0xa106, 0x1dd8,
++      0xa184, 0x0003, 0x0540, 0xd194, 0x0db0, 0xd1f4, 0x0520, 0x7007,
++      0x0002, 0x0880, 0x7108, 0xd1fc, 0x0130, 0x080c, 0x5484, 0x8aff,
++      0x0904, 0x52e9, 0x0cb8, 0x700c, 0xa08c, 0x07ff, 0x01c8, 0x7004,
++      0xd084, 0x0158, 0x7014, 0xa005, 0x1128, 0x7010, 0xa005, 0x0128,
++      0xa102, 0x1e40, 0x7007, 0x0010, 0x0030, 0x8aff, 0x0148, 0x080c,
++      0x56ad, 0x1de8, 0x09f8, 0x080c, 0x53ee, 0x012e, 0x2000, 0x0005,
++      0x7204, 0x700c, 0xa215, 0x7108, 0xc19c, 0x8103, 0x1228, 0xa205,
++      0x1d90, 0x7007, 0x0002, 0x0ca0, 0xa205, 0x1d68, 0x7003, 0x0000,
++      0x7007, 0x0004, 0x012e, 0x2000, 0x0005, 0x0016, 0x6104, 0xa18c,
++      0x00ff, 0xa186, 0x0007, 0x0118, 0xa18e, 0x000f, 0x1110, 0x6040,
++      0x0008, 0x6428, 0x001e, 0x84ff, 0x01f8, 0x2c70, 0x7004, 0xa0bc,
++      0x000f, 0xa7b8, 0x53a4, 0x273d, 0x87fb, 0x1138, 0x0210, 0x080c,
++      0x297f, 0x609c, 0xa075, 0x0180, 0x0c88, 0x2705, 0xae68, 0x6808,
++      0xa630, 0x680c, 0xa529, 0x8421, 0x0138, 0x8738, 0x2705, 0xa005,
++      0x1da8, 0x709c, 0xa075, 0x1d10, 0x0005, 0x0000, 0x0005, 0x0009,
++      0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, 0x0009,
++      0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x5399, 0x5396, 0x0000,
++      0x0000, 0x8000, 0x0000, 0x5399, 0x0000, 0x53a1, 0x539e, 0x0000,
++      0x0000, 0x0000, 0x0000, 0x53a1, 0x0000, 0x539c, 0x539c, 0x0000,
++      0x0000, 0x8000, 0x0000, 0x539c, 0x0000, 0x53a2, 0x53a2, 0x0000,
++      0x0000, 0x0000, 0x0000, 0x53a2, 0x2079, 0xb340, 0x2071, 0x0010,
++      0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x7808, 0xd0ec,
++      0x0128, 0x2009, 0x0001, 0x2071, 0x0020, 0x0060, 0x2001, 0x01ff,
++      0x2004, 0xd0fc, 0x0118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0002,
++      0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000,
++      0x8109, 0x0118, 0x2071, 0x0020, 0x0ca8, 0x0005, 0x2019, 0x0000,
++      0x7004, 0x8004, 0x1a04, 0x545c, 0x7108, 0x7008, 0xa106, 0x1de0,
++      0xa184, 0x01e0, 0x0120, 0x080c, 0x54be, 0x0804, 0x547c, 0x7007,
++      0x0012, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0110,
++      0x080c, 0x54be, 0x7808, 0xd0ec, 0x0188, 0x2001, 0x04fd, 0x2004,
++      0xa086, 0x0003, 0x1170, 0xa184, 0x4000, 0x0170, 0xa382, 0x0003,
++      0x1258, 0xa184, 0x0004, 0x0d28, 0x8318, 0x0c18, 0x780c, 0xd0ec,
++      0x1118, 0xa184, 0x4000, 0x19e8, 0xa19c, 0x300c, 0xa386, 0x2004,
++      0x0190, 0xa386, 0x0008, 0x01c0, 0x7004, 0xd084, 0x1148, 0x7108,
++      0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0110, 0x0804, 0x54be,
++      0xa386, 0x200c, 0x1930, 0x7200, 0x8204, 0x0230, 0x730c, 0xa384,
++      0x07ff, 0x0110, 0x080c, 0x297f, 0x7108, 0x7008, 0xa106, 0x1de0,
++      0xa184, 0x01e0, 0x0118, 0x080c, 0x54be, 0x0470, 0x7007, 0x0012,
++      0x7000, 0xd084, 0x1148, 0x7310, 0x7014, 0xa305, 0x0128, 0x710c,
++      0xa184, 0x07ff, 0x1904, 0x53ee, 0x7108, 0x7008, 0xa106, 0x1de0,
++      0xa184, 0x01e0, 0x0118, 0x080c, 0x54be, 0x00b0, 0x7007, 0x0012,
++      0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8, 0x7108, 0x7008, 0xa106,
++      0x1de0, 0xa184, 0x01e0, 0x0118, 0x080c, 0x54be, 0x0028, 0x7007,
++      0x0012, 0x7108, 0xd1fc, 0x1d88, 0x7003, 0x0000, 0x0005, 0x0156,
++      0x7108, 0x0011, 0x015e, 0x0005, 0x7204, 0x7500, 0xa184, 0x01e0,
++      0x15a8, 0x7108, 0xa184, 0x01e0, 0x1588, 0xa184, 0x0007, 0x0002,
++      0x549a, 0x54a8, 0x5498, 0x54a8, 0x5498, 0x5508, 0x5498, 0x5506,
++      0x080c, 0x297f, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff,
++      0x1118, 0x2049, 0x0000, 0x0018, 0x080c, 0x56ad, 0x1de8, 0x0005,
++      0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x1140,
++      0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0108, 0x0030,
++      0x8aff, 0x0118, 0x080c, 0x56ad, 0x1de8, 0x0005, 0x7007, 0x0012,
++      0x7108, 0x1d04, 0x54c1, 0x2091, 0x6000, 0x1d04, 0x54c5, 0x2091,
++      0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8,
++      0x7007, 0x0012, 0x7108, 0xd1fc, 0x1dd8, 0x7003, 0x0000, 0x7000,
++      0xa005, 0x1130, 0x7004, 0xa005, 0x1118, 0x700c, 0xa005, 0x0108,
++      0x0c40, 0x2049, 0x0000, 0xb284, 0x0200, 0x0118, 0x2001, 0x0000,
++      0x0010, 0x2001, 0x0001, 0x080c, 0x3fcf, 0xb284, 0x0200, 0x0118,
++      0x2001, 0xb3a4, 0x0010, 0x2001, 0xb3e4, 0x2004, 0xa084, 0x8000,
++      0x0130, 0x6824, 0xa005, 0x1128, 0x6827, 0x0004, 0x0010, 0x681b,
++      0x0002, 0x0005, 0x080c, 0x297f, 0x080c, 0x297f, 0x080c, 0x5548,
++      0x7210, 0x7114, 0x700c, 0xa09c, 0x07ff, 0x2800, 0xa300, 0xa211,
++      0xa189, 0x0000, 0x04a9, 0x2705, 0x2c58, 0xac60, 0x6308, 0x2200,
++      0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0140, 0x1238,
++      0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0c58, 0x2b60,
++      0x8a07, 0x0006, 0x6004, 0xa084, 0x0008, 0x0118, 0xa7ba, 0x539e,
++      0x0010, 0xa7ba, 0x5396, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a,
++      0x6c92, 0x6b8e, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0,
++      0x0110, 0x080c, 0x54be, 0x7007, 0x0012, 0x080c, 0x53ee, 0x0005,
++      0x8a50, 0x8739, 0x2705, 0xa004, 0x1168, 0x6000, 0xa064, 0x1108,
++      0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x53b4, 0x203d, 0x87fb,
++      0x090c, 0x297f, 0x0005, 0x0126, 0x00d6, 0x70f0, 0xa084, 0x4c00,
++      0x8004, 0x2090, 0x00de, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90,
++      0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x0006, 0x6804, 0xa084,
++      0x0008, 0x000e, 0x0118, 0xa0b8, 0x539e, 0x0010, 0xa0b8, 0x5396,
++      0xb284, 0x0200, 0x0110, 0x7e18, 0x0008, 0x7e1c, 0xa6b5, 0x000c,
++      0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0118, 0xa18e, 0x000f,
++      0x1130, 0x681c, 0xa084, 0x0040, 0x0130, 0xc685, 0x0020, 0x681c,
++      0xd0b4, 0x0108, 0xc685, 0x700c, 0xa084, 0x07ff, 0x0128, 0x7007,
++      0x0004, 0x7004, 0xd094, 0x1de8, 0x2400, 0xa305, 0x1108, 0x0420,
++      0x2c58, 0x2705, 0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004,
++      0xa301, 0x701e, 0xa184, 0x0008, 0x0140, 0x6010, 0xa081, 0x0000,
++      0x7022, 0x6014, 0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202,
++      0x7012, 0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001,
++      0x2b60, 0x080c, 0x56d8, 0x0010, 0x080c, 0x56ad, 0x1de8, 0x012e,
++      0x2000, 0x0005, 0x0126, 0x00d6, 0x70f0, 0xa084, 0x4c00, 0x8004,
++      0x2090, 0x00de, 0x7007, 0x0004, 0x7004, 0xd094, 0x1de8, 0x7003,
++      0x0008, 0x012e, 0x2000, 0x0005, 0x0126, 0x00d6, 0x70f0, 0xa084,
++      0x4c00, 0x8004, 0x2090, 0x00de, 0x700c, 0xa084, 0x07ff, 0x0128,
++      0x7007, 0x0004, 0x7004, 0xd094, 0x1de8, 0x6814, 0xd0fc, 0x0110,
++      0x7e1c, 0x0008, 0x7e18, 0xa6b5, 0x000c, 0x6904, 0xa18c, 0x00ff,
++      0xa186, 0x0007, 0x0118, 0xa18e, 0x000f, 0x1140, 0x681c, 0xa084,
++      0x0040, 0x0108, 0xc685, 0x6840, 0x2050, 0x0030, 0x681c, 0xd0ac,
++      0x1108, 0xc685, 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f,
++      0xa7b8, 0x53a4, 0x273d, 0x87fb, 0x1138, 0x0210, 0x080c, 0x297f,
++      0x689c, 0xa065, 0x0120, 0x0c88, 0x080c, 0x56ad, 0x1de8, 0x012e,
++      0x2000, 0x0005, 0x0126, 0x0006, 0x0016, 0x00d6, 0x70f0, 0xa084,
++      0x4c00, 0x8004, 0x2090, 0xb284, 0x0200, 0x0110, 0x7e18, 0x0008,
++      0x7e1c, 0x00de, 0x003e, 0x004e, 0xa6b5, 0x000c, 0x6904, 0xa18c,
++      0x00ff, 0xa186, 0x0007, 0x0118, 0xa18e, 0x000f, 0x1130, 0x681c,
++      0xa084, 0x0040, 0x0130, 0xc685, 0x0020, 0x681c, 0xd0b4, 0x0108,
++      0xc685, 0x2049, 0x5622, 0x0016, 0x6904, 0xa18c, 0x00ff, 0xa186,
++      0x0007, 0x0118, 0xa18e, 0x000f, 0x1110, 0x6840, 0x0008, 0x6828,
++      0x001e, 0xa055, 0x00d6, 0x0904, 0x56a9, 0x2d70, 0x2e60, 0x7004,
++      0xa0bc, 0x000f, 0xa7b8, 0x53a4, 0x273d, 0x87fb, 0x1140, 0x0210,
++      0x080c, 0x297f, 0x709c, 0xa075, 0x2060, 0x05d8, 0x0c80, 0x2705,
++      0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0268, 0x8a51, 0x1110,
++      0x080c, 0x297f, 0x8738, 0x2705, 0xa005, 0x1d90, 0x709c, 0xa075,
++      0x2060, 0x0538, 0x08e0, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000,
++      0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1210, 0x080c,
++      0x297f, 0x0016, 0x3208, 0xa18c, 0x0200, 0x0168, 0x0006, 0x2001,
++      0xb342, 0x2004, 0xd0ec, 0x000e, 0x0118, 0x2071, 0x0020, 0x0028,
++      0x2071, 0x0050, 0x0010, 0x2071, 0x0020, 0x001e, 0x00de, 0x0804,
++      0x5593, 0x00de, 0x012e, 0x2000, 0x0005, 0x7008, 0x0006, 0xa084,
++      0x01e0, 0x000e, 0x0110, 0xa006, 0x0005, 0xa084, 0x0003, 0xa086,
++      0x0003, 0x1108, 0x0005, 0x2705, 0xac08, 0x2104, 0x701a, 0x8108,
++      0x2104, 0x701e, 0x8108, 0x2104, 0x7012, 0x8108, 0x2104, 0x7016,
++      0x6004, 0xa084, 0x0008, 0x0130, 0x8108, 0x2104, 0x7022, 0x8108,
++      0x2104, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085, 0x7006,
++      0x8738, 0x2705, 0xa005, 0x1168, 0x609c, 0xa005, 0x01c8, 0x2060,
++      0x6004, 0xa084, 0x000f, 0xa080, 0x53a4, 0x203d, 0x87fb, 0x090c,
++      0x297f, 0x8a51, 0x0160, 0x7008, 0x0006, 0xa084, 0x01e0, 0x000e,
++      0x0110, 0xa006, 0x0028, 0xa084, 0x0003, 0xa086, 0x0003, 0x0005,
++      0x2051, 0x0000, 0x0005, 0x0126, 0x0006, 0x00d6, 0x70f0, 0xa084,
++      0x4c00, 0x8004, 0x2090, 0x00de, 0x008e, 0x7108, 0xa184, 0x0003,
++      0x1190, 0x0016, 0x6904, 0xa18c, 0x00ff, 0xa186, 0x0007, 0x0118,
++      0xa18e, 0x000f, 0x1110, 0x6840, 0x0008, 0x6828, 0x001e, 0xa005,
++      0x0178, 0x0804, 0x52f7, 0x7108, 0xd1fc, 0x0118, 0x080c, 0x5484,
++      0x0c20, 0x7007, 0x0010, 0x7108, 0xd1fc, 0x0de8, 0x080c, 0x5484,
++      0x7008, 0xa086, 0x0008, 0x19c8, 0x7000, 0xa005, 0x19b0, 0x7003,
++      0x0000, 0x2049, 0x0000, 0x012e, 0x2000, 0x0005, 0x0126, 0x0146,
++      0x0136, 0x0156, 0x00c6, 0x00d6, 0x70f0, 0xa084, 0x4c00, 0x8004,
++      0x2090, 0x00de, 0x2049, 0x5736, 0x69b0, 0xad80, 0x0011, 0xa100,
++      0x20a0, 0xb284, 0x0200, 0x0158, 0x2001, 0xb342, 0x2004, 0xd0ec,
++      0x0118, 0x2099, 0x0031, 0x0028, 0x2099, 0x0032, 0x0010, 0x2099,
++      0x0031, 0x700c, 0xa084, 0x07ff, 0x01b0, 0x6928, 0xa100, 0x682a,
++      0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0118, 0x8000,
++      0x80ac, 0x53a5, 0x700c, 0xa084, 0x07ff, 0x0128, 0x7007, 0x0004,
++      0x7004, 0xd094, 0x1de8, 0x00ce, 0x2049, 0x0000, 0x7003, 0x0000,
++      0x015e, 0x013e, 0x014e, 0x012e, 0x2000, 0x0005, 0x2091, 0x6000,
++      0x2091, 0x8000, 0x78ac, 0xa005, 0x1168, 0x796c, 0x70d0, 0xa106,
++      0x1148, 0x7814, 0xa005, 0x0130, 0x7817, 0x0000, 0x0e04, 0x5792,
++      0x2091, 0x4080, 0x7824, 0x8001, 0x7826, 0x1904, 0x5806, 0x7828,
++      0x7826, 0x7808, 0xd0ec, 0x1904, 0x57ff, 0x2061, 0xda00, 0x2069,
++      0xb3c0, 0xc7fd, 0x68ec, 0xa005, 0x0130, 0x8001, 0x68ee, 0xa005,
++      0x1110, 0x080c, 0x5995, 0x6800, 0xa084, 0x000f, 0x0168, 0xa086,
++      0x0001, 0x0150, 0x6840, 0xa00d, 0x0138, 0x2104, 0xa005, 0x0120,
++      0x8001, 0x200a, 0x0904, 0x5907, 0x6810, 0xa005, 0x01d0, 0x8001,
++      0x6812, 0x11b8, 0x68c3, 0x0001, 0xd7fc, 0x1148, 0x7808, 0xd0ec,
++      0x0118, 0x2009, 0x0102, 0x0028, 0x2009, 0x0202, 0x0010, 0x2009,
++      0x0102, 0x684c, 0xc08d, 0x200a, 0x6868, 0xa005, 0x0110, 0x080c,
++      0x260c, 0x6884, 0xa005, 0x0140, 0x8001, 0x6886, 0x1128, 0x686b,
++      0x0000, 0x68f0, 0xc0c5, 0x68f2, 0x68f0, 0xd0fc, 0x01b0, 0xc0fc,
++      0x68f2, 0x20a9, 0x0200, 0x6034, 0xa005, 0x0158, 0x8001, 0x6036,
++      0x68f0, 0xc0fd, 0x68f2, 0x1128, 0x6010, 0xa005, 0x0110, 0x080c,
++      0x260c, 0xace0, 0x0010, 0x1f04, 0x57eb, 0xd7fc, 0x0138, 0x2061,
++      0xba00, 0x2069, 0xb380, 0xc7fc, 0x0804, 0x57a2, 0x0409, 0x782c,
++      0x8001, 0x782e, 0x11b8, 0x7830, 0x782e, 0x2061, 0xba00, 0x2069,
++      0xb380, 0xc7fc, 0x6808, 0xa005, 0x0110, 0x080c, 0x5880, 0xd7fc,
++      0x1148, 0x7808, 0xd0ec, 0x1130, 0x2061, 0xda00, 0x2069, 0xb3c0,
++      0xc7fd, 0x0c80, 0x780c, 0xd0e4, 0x1100, 0x2091, 0x8001, 0x0005,
++      0x7834, 0x8001, 0x7836, 0x1904, 0x587f, 0x7838, 0x7836, 0x2069,
++      0xb380, 0xc7fc, 0x7808, 0x2079, 0x0200, 0xd0ec, 0x0110, 0x2079,
++      0x0100, 0x68f8, 0xa005, 0x0138, 0x7de0, 0xa504, 0x1120, 0x68fa,
++      0x68f0, 0xc0bc, 0x68f2, 0x2079, 0xb340, 0x680c, 0xa005, 0x1110,
++      0x2001, 0x0101, 0x8001, 0x680e, 0xd7fc, 0x1118, 0xa080, 0xfa00,
++      0x0010, 0xa080, 0xfb10, 0x2040, 0x2004, 0xa065, 0x01e0, 0x6024,
++      0xa005, 0x01b0, 0x8001, 0x6026, 0x1198, 0x6800, 0xa005, 0x0130,
++      0x6850, 0xac06, 0x1118, 0x080c, 0x5907, 0x0068, 0x6868, 0xa005,
++      0x0118, 0x6027, 0x0001, 0x0020, 0x080c, 0x58c0, 0x2804, 0x0c28,
++      0x6000, 0x2c40, 0x0c10, 0xd7fc, 0x1150, 0x7808, 0xd0ec, 0x1138,
++      0x2069, 0xb3c0, 0xc7fd, 0x2079, 0x0100, 0x0804, 0x5839, 0x0005,
++      0xa00e, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0558, 0x6024, 0xa005,
++      0x0118, 0x8001, 0x6026, 0x0418, 0x6008, 0xc09c, 0xd084, 0x1110,
++      0xd0ac, 0x01c0, 0x600a, 0x6004, 0xa005, 0x01d8, 0x00d6, 0x00c6,
++      0x0016, 0x2068, 0x6010, 0x8001, 0x6012, 0x080c, 0x3be8, 0x2d00,
++      0x2c68, 0x2060, 0x080c, 0x1d3b, 0x080c, 0x2076, 0x001e, 0x00ce,
++      0x00de, 0x0038, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0010, 0xa18d,
++      0x0100, 0xace0, 0x0010, 0x1f04, 0x5883, 0xa184, 0x0001, 0x0130,
++      0xa18c, 0xfffe, 0x690a, 0x080c, 0x260c, 0x0008, 0x690a, 0x0005,
++      0x2c00, 0x6882, 0x6714, 0x6f7a, 0x6017, 0x0000, 0x602b, 0x0000,
++      0x601b, 0x0006, 0x60b4, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084,
++      0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6860, 0xac06,
++      0x1110, 0x2800, 0x6862, 0x080c, 0x1cc4, 0x6818, 0xa005, 0x0530,
++      0x8001, 0x681a, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, 0x8001,
++      0x03e8, 0x6812, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x080c,
++      0x2085, 0xd7fc, 0x1118, 0x2069, 0xb380, 0x0010, 0x2069, 0xb3c0,
++      0x690c, 0xa184, 0x0100, 0x2001, 0x0006, 0x1128, 0x6883, 0x0000,
++      0x697e, 0x2001, 0x0004, 0x2708, 0x080c, 0x2601, 0x0005, 0x00d6,
++      0x00e6, 0x2d70, 0xd7fc, 0x1148, 0x7808, 0xd0ec, 0x0118, 0x2069,
++      0x0100, 0x0028, 0x2069, 0x0200, 0x0010, 0x2069, 0x0100, 0x7000,
++      0xa084, 0x000f, 0x0904, 0x595c, 0xa086, 0x0007, 0x1140, 0x00f6,
++      0x2d78, 0x7094, 0x2068, 0x080c, 0x4361, 0x00fe, 0x04a8, 0x7050,
++      0x2060, 0x080c, 0x2899, 0x601b, 0x0006, 0x6858, 0xa084, 0x5f00,
++      0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f,
++      0x0000, 0x6033, 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830,
++      0xd0b4, 0x01b0, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094,
++      0x0110, 0x1f04, 0x5946, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848,
++      0xd084, 0x0110, 0x1f04, 0x594f, 0x20a9, 0x00fa, 0x1f04, 0x5956,
++      0x681b, 0x0050, 0x706b, 0x0007, 0x00ee, 0x00de, 0x0005, 0x2079,
++      0xb340, 0x0441, 0x0089, 0x00d9, 0x2009, 0x0002, 0x2069, 0xb3c0,
++      0x680b, 0x0000, 0x680f, 0x0000, 0x6813, 0x0000, 0x8109, 0x0118,
++      0x2069, 0xb380, 0x0ca8, 0x0005, 0x7808, 0xd0ec, 0x0118, 0x2019,
++      0x00cc, 0x0010, 0x2019, 0x007b, 0x7b2e, 0x7b32, 0x0005, 0x780c,
++      0xd0e4, 0x1118, 0x2019, 0x0040, 0x0010, 0x2019, 0x0026, 0x7b36,
++      0x7b3a, 0x0005, 0x780c, 0xd0e4, 0x1118, 0x2019, 0x3f94, 0x0010,
++      0x2019, 0x2624, 0x7b26, 0x7b2a, 0x0005, 0x6a54, 0xa285, 0x0000,
++      0x01f0, 0x6958, 0x6bdc, 0xa300, 0x00c6, 0x2164, 0x6304, 0x83ff,
++      0x1138, 0x8211, 0x0148, 0x8108, 0xa11a, 0x0eb8, 0x69dc, 0x0ca8,
++      0x68ef, 0x000a, 0x00ce, 0x0005, 0x6954, 0x6adc, 0x2264, 0x6008,
++      0xc0b5, 0x600a, 0x8210, 0x8109, 0x1dc8, 0x6956, 0x00ce, 0x0005,
++      0x1d04, 0x59b8, 0x2091, 0x6000, 0x1d04, 0x59bc, 0x2091, 0x6000,
++      0x70ec, 0xd0dc, 0x1118, 0xd0d4, 0x0508, 0x0410, 0x2008, 0x7808,
++      0xd0ec, 0x0158, 0xd1c4, 0x15b8, 0x780c, 0xc0c5, 0x780e, 0x7808,
++      0xc0f5, 0x780a, 0xd0ec, 0x0558, 0x0438, 0xae8e, 0x0100, 0x0138,
++      0x780c, 0xc0f5, 0xc0c5, 0x780e, 0xd0d4, 0x1508, 0x00e8, 0x780c,
++      0xc0fd, 0xc0c5, 0x780e, 0xd0d4, 0x11d0, 0x00b0, 0xd0e4, 0x01c8,
++      0x1d04, 0x59e8, 0x2091, 0x6000, 0x2009, 0x000c, 0x1d04, 0x59ee,
++      0x2091, 0x6000, 0x8109, 0x1dd0, 0x70e4, 0xa084, 0x01ff, 0xa086,
++      0x01ff, 0x1110, 0x70ec, 0x0850, 0x7804, 0xd08c, 0x0110, 0x681b,
++      0x000c, 0x70a0, 0x70a2, 0x0005, 0x0020, 0x002b, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020,
++      0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0014,
++      0x0014, 0x9851, 0x0014, 0x0014, 0x98f4, 0x98e1, 0x0014, 0x0014,
++      0x0014, 0x0080, 0x01a3, 0x0000, 0x0201, 0x0604, 0x0c08, 0x2120,
++      0x4022, 0xf880, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
++      0x0000, 0x0000, 0x0000, 0x300b, 0xa201, 0x0014, 0xa200, 0x0014,
++      0xa200, 0x0214, 0xa202, 0x3806, 0x8839, 0x20c3, 0x0864, 0xa838,
++      0x28c1, 0x9cc2, 0xa203, 0x300c, 0x2846, 0x8161, 0x846a, 0x8300,
++      0x1856, 0x883a, 0xa804, 0x28f2, 0x9ca6, 0xa8f4, 0x300c, 0x28e1,
++      0x9ca6, 0x28a2, 0x7162, 0xa820, 0x2822, 0xa207, 0x64a7, 0x2882,
++      0x7163, 0xa81a, 0x2001, 0xa80f, 0xa206, 0x64c0, 0x6de0, 0x67a0,
++      0x6fc0, 0x882b, 0x1814, 0x883b, 0x7824, 0x68c1, 0x7864, 0x883e,
++      0xa802, 0x8576, 0x8677, 0x206c, 0x28c1, 0x9cc2, 0x2045, 0x2104,
++      0x20a1, 0x2080, 0x7961, 0xa8db, 0xa209, 0x0904, 0xa20e, 0xa808,
++      0xa205, 0xa300, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xc601, 0xa20a,
++      0x8000, 0x85a1, 0x806f, 0x9422, 0x84a2, 0x856e, 0x0704, 0x9ca6,
++      0x0014, 0xa204, 0xa300, 0x3009, 0x19e2, 0xf864, 0x856e, 0x883f,
++      0x08e6, 0xa8f7, 0xf881, 0xa8eb, 0xc007, 0xf8c1, 0x0016, 0x85b2,
++      0x80f0, 0x9532, 0xfb02, 0x1de2, 0x0014, 0x8532, 0xf241, 0x0014,
++      0x1de2, 0x84a8, 0xd7a0, 0x1fe6, 0x0014, 0xa208, 0x6043, 0x8008,
++      0x1dc1, 0x0016, 0x8160, 0x842a, 0x8190, 0xf041, 0x3008, 0x84a8,
++      0x11d7, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x3008,
++      0x2846, 0x1011, 0xa8fd, 0x2081, 0x2802, 0x1011, 0xa8fc, 0xa88f,
++      0x20a1, 0x283d, 0x1011, 0xa8fc, 0xa20b, 0x0017, 0x300c, 0xa300,
++      0x1de2, 0xd387, 0x0210, 0xa800, 0x26e0, 0x873a, 0xfb02, 0x19f2,
++      0x1fe2, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9cc7, 0x0704, 0x0017,
++      0x60ff, 0x300c, 0x807f, 0x9521, 0x85a1, 0x806f, 0x9422, 0x84a2,
++      0x8720, 0xa211, 0x9d72, 0x8772, 0x8837, 0x2101, 0xa821, 0x10d3,
++      0x78e2, 0x9d76, 0xa8fc, 0xd984, 0xf0e2, 0xf0a1, 0xa820, 0x0014,
++      0x8831, 0xd166, 0x8830, 0x800f, 0x9401, 0xb520, 0xc802, 0x8820,
++      0xa80f, 0x2301, 0xa80d, 0x10d3, 0x78e4, 0x9d76, 0x8821, 0x8820,
++      0xa8e6, 0xf123, 0xf142, 0xf101, 0xa865, 0x10d3, 0x70f6, 0x8832,
++      0x8203, 0x870c, 0xd99e, 0x6001, 0x0014, 0x6848, 0x0214, 0x8827,
++      0x300a, 0x0013, 0xa21b, 0x9d72, 0x2001, 0xa853, 0x8201, 0x1852,
++      0xd183, 0x8834, 0x8001, 0xa801, 0x3027, 0x84a8, 0x1a56, 0x8833,
++      0x0014, 0xa218, 0x6981, 0x9d7d, 0x6926, 0x6908, 0x8080, 0x9521,
++      0xc003, 0x1ab4, 0xa809, 0xa80a, 0x1a34, 0xa806, 0x8080, 0x9521,
++      0xc002, 0x1a94, 0xa801, 0x1a14, 0x7021, 0x0014, 0xa300, 0x69e4,
++      0x8023, 0x16e1, 0x8001, 0x10f1, 0x6946, 0xa213, 0x1462, 0xa213,
++      0x8000, 0x16e1, 0xa808, 0x6161, 0x0014, 0xa214, 0x61c2, 0x8002,
++      0x14e1, 0x8004, 0x16e1, 0x0101, 0x300a, 0x8827, 0x0012, 0x8080,
++      0x940c, 0xc81d, 0x8001, 0x8492, 0x0013, 0x8000, 0x84a4, 0x8190,
++      0x0016, 0x11c3, 0x211e, 0x870e, 0xa21d, 0x0014, 0x9d7d, 0x0014,
++      0xa300, 0x8181, 0x842a, 0x84a8, 0x1ce6, 0x882c, 0x0016, 0xa212,
++      0x9d72, 0x10d3, 0x70e4, 0x0004, 0x800f, 0x9426, 0xcc1a, 0x9d76,
++      0xa8f8, 0x878e, 0x0016, 0xa21c, 0x1035, 0x7965, 0x8001, 0x9405,
++      0xc001, 0xa817, 0xa82f, 0xa8a5, 0xa210, 0x3807, 0x300c, 0x807f,
++      0x9521, 0x85a1, 0x806f, 0x9422, 0x84a2, 0x817e, 0x872b, 0x8772,
++      0x7965, 0x8001, 0x9405, 0xc001, 0xa804, 0xa81c, 0xa892, 0x0014,
++      0xa8a6, 0xa21f, 0x8080, 0xa521, 0x85a1, 0x8090, 0xa422, 0x84a2,
++      0x6981, 0x9d7d, 0x6923, 0x6903, 0x18b4, 0xa802, 0xa809, 0x1894,
++      0x807f, 0x9521, 0x85a1, 0x806f, 0x9422, 0x84a2, 0x7021, 0x0014,
++      0xa300, 0x0014, 0xa220, 0x8080, 0xa521, 0x85a1, 0x8090, 0xa422,
++      0x84a2, 0x6981, 0x9d7d, 0x6923, 0x6903, 0x18b4, 0xa802, 0xa80c,
++      0x1894, 0x807f, 0x9521, 0x85a1, 0x806f, 0x9422, 0x84a2, 0x80fd,
++      0x9405, 0x8485, 0x7021, 0x0014, 0xa300, 0xa8ca, 0x0000, 0x0710
++};
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_2100.h     2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,8147 @@
++/* @(#)asm_2100.h 1.5 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */ 
++
++/*
++ * Some very early boards have problems loading firmware that is larger than
++ * 0x8000 words. In order to be able to provide at least *some* support
++ * for such ancient cards, an alternate firmware set is provided. This firmware
++ * isn't all that great, but, hey, it's better than nothing.
++ *
++ * Define USE_SMALLER_2100_FIRMWARE to select this.
++ */
++#ifndef       USE_SMALLER_2100_FIRMWARE
++/************************************************************************
++ *                                                                    *
++ *     --- ISP2100 Fabric Initiator/Target Firmware ---               *
++ *                   with expanded LUN addressing                       *
++ *                   and FcTape (FCP-2) support                         *
++ *                                                                    *
++ ************************************************************************/
++/*
++ *    Firmware Version 1.19.24 (14:02 Jul 16, 2002)
++ */
++static const u_int16_t isp_2100_risc_code[] = {
++      0x0078, 0x102d, 0x0000, 0x95f1, 0x0000, 0x0001, 0x0013, 0x0018,
++      0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++      0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++      0x5449, 0x4f4e, 0x2049, 0x5350, 0x3231, 0x3030, 0x2046, 0x6972,
++      0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++      0x312e, 0x3139, 0x2020, 0x2020, 0x2400, 0x2091, 0x2000, 0x20c1,
++      0x0021, 0x2039, 0xffff, 0x2019, 0xaaaa, 0x2760, 0x2069, 0x7fff,
++      0x20c1, 0x0020, 0x2c2c, 0x2d34, 0x2762, 0x236a, 0x2c24, 0x2d04,
++      0x266a, 0x2562, 0xa406, 0x00c0, 0x1052, 0x20c1, 0x0021, 0x2c2c,
++      0x2362, 0x2c04, 0x2562, 0xa306, 0x0040, 0x1052, 0x20c1, 0x0020,
++      0x2039, 0x8fff, 0x20a1, 0xad00, 0x2708, 0x810d, 0x810d, 0x810d,
++      0x810d, 0xa18c, 0x000f, 0x2001, 0x000a, 0xa112, 0xa00e, 0x21a8,
++      0x41a4, 0x3400, 0x8211, 0x00c0, 0x105f, 0x2708, 0x3400, 0xa102,
++      0x0040, 0x106f, 0x0048, 0x106f, 0x20a8, 0xa00e, 0x41a4, 0x20a1,
++      0xa5f1, 0x2009, 0x0000, 0x20a9, 0x070f, 0x41a4, 0x3400, 0x20c9,
++      0xaaff, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x25c7,
++      0x2051, 0xa600, 0x2a70, 0x7762, 0xa786, 0x8fff, 0x0040, 0x1092,
++      0x705f, 0xcd00, 0x705b, 0xccf1, 0x7067, 0x0200, 0x706b, 0x0200,
++      0x0078, 0x109a, 0x705b, 0xbd01, 0x7067, 0x0100, 0x706b, 0x0100,
++      0x705f, 0xbd00, 0x1078, 0x12df, 0x1078, 0x13ca, 0x1078, 0x1577,
++      0x1078, 0x1ce9, 0x1078, 0x42ec, 0x1078, 0x76bf, 0x1078, 0x1355,
++      0x1078, 0x2ac0, 0x1078, 0x4e93, 0x1078, 0x49a3, 0x1078, 0x594a,
++      0x1078, 0x2263, 0x1078, 0x5c43, 0x1078, 0x5485, 0x1078, 0x2162,
++      0x1078, 0x2240, 0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x10cf,
++      0x7820, 0xa086, 0x0002, 0x00c0, 0x10cf, 0x7823, 0x4000, 0x0068,
++      0x10c7, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70,
++      0x7003, 0x0000, 0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000,
++      0xa08e, 0x0003, 0x00c0, 0x10ef, 0x1078, 0x365e, 0x1078, 0x2ae8,
++      0x1078, 0x4ee3, 0x1078, 0x4b66, 0x2009, 0x0100, 0x2104, 0xa082,
++      0x0002, 0x0048, 0x10f3, 0x1078, 0x5966, 0x0078, 0x10d6, 0x1079,
++      0x10f7, 0x0078, 0x10dc, 0x1078, 0x7197, 0x0078, 0x10eb, 0x1101,
++      0x1102, 0x11be, 0x10ff, 0x1246, 0x12dc, 0x12dd, 0x12de, 0x1078,
++      0x1332, 0x007c, 0x127e, 0x0f7e, 0x2091, 0x8000, 0x7000, 0xa086,
++      0x0001, 0x00c0, 0x1198, 0x1078, 0x3aec, 0x2079, 0x0100, 0x7844,
++      0xa005, 0x00c0, 0x1198, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x1078,
++      0x1adf, 0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011,
++      0x8010, 0x73c4, 0x1078, 0x361b, 0x2001, 0xffff, 0x1078, 0x5ae6,
++      0x723c, 0xc284, 0x723e, 0x2001, 0xa60c, 0x2014, 0xc2ac, 0x2202,
++      0x1078, 0x6f9f, 0x2011, 0x0004, 0x1078, 0x8d1b, 0x1078, 0x489e,
++      0x1078, 0x42d4, 0x0040, 0x1144, 0x7087, 0x0001, 0x70bf, 0x0000,
++      0x1078, 0x3c9e, 0x0078, 0x1198, 0x1078, 0x4967, 0x0040, 0x114d,
++      0x7a0c, 0xc2b4, 0x7a0e, 0x0078, 0x1159, 0x1078, 0x90a6, 0x70cc,
++      0xd09c, 0x00c0, 0x1159, 0x7098, 0xa005, 0x0040, 0x1159, 0x1078,
++      0x42b8, 0x70d7, 0x0000, 0x70d3, 0x0000, 0x72cc, 0x2079, 0xa652,
++      0x7804, 0xd0ac, 0x0040, 0x1165, 0xc295, 0x72ce, 0xa296, 0x0004,
++      0x0040, 0x1186, 0x2011, 0x0001, 0x1078, 0x8d1b, 0x7093, 0x0000,
++      0x7097, 0xffff, 0x7003, 0x0002, 0x0f7f, 0x1078, 0x2677, 0x2011,
++      0x0005, 0x1078, 0x70e0, 0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100,
++      0x60e3, 0x0008, 0x0c7f, 0x127f, 0x0078, 0x119a, 0x7093, 0x0000,
++      0x7097, 0xffff, 0x7003, 0x0002, 0x2011, 0x0005, 0x1078, 0x70e0,
++      0x1078, 0x62d1, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f,
++      0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082, 0x2009, 0x007e,
++      0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019, 0x0029, 0x1078,
++      0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, 0x027f, 0x017f, 0x1078,
++      0x298e, 0x8108, 0x00f0, 0x11a0, 0x0c7f, 0x706f, 0x0000, 0x7070,
++      0xa084, 0x00ff, 0x7072, 0x709b, 0x0000, 0x007c, 0x127e, 0x2091,
++      0x8000, 0x7000, 0xa086, 0x0002, 0x00c0, 0x1244, 0x7094, 0xa086,
++      0xffff, 0x0040, 0x11d1, 0x1078, 0x2677, 0x1078, 0x62d1, 0x0078,
++      0x1244, 0x70cc, 0xd09c, 0x0040, 0x11fd, 0xd084, 0x0040, 0x11fd,
++      0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c,
++      0x0040, 0x11fd, 0x70d0, 0xa086, 0xffff, 0x0040, 0x11f9, 0x1078,
++      0x27f7, 0x1078, 0x62d1, 0x70cc, 0xd094, 0x00c0, 0x1244, 0x2011,
++      0x0001, 0x2019, 0x0000, 0x1078, 0x282f, 0x1078, 0x62d1, 0x0078,
++      0x1244, 0x70d4, 0xa005, 0x00c0, 0x1244, 0x7090, 0xa005, 0x00c0,
++      0x1244, 0x1078, 0x4967, 0x00c0, 0x1244, 0x2001, 0xa653, 0x2004,
++      0xd0ac, 0x0040, 0x1227, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009,
++      0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0, 0x121a, 0x6000, 0xd0ec,
++      0x00c0, 0x1222, 0x017f, 0x8108, 0x00f0, 0x1211, 0x0c7f, 0x157f,
++      0x0078, 0x1227, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x1244, 0x7003,
++      0x0003, 0x7097, 0xffff, 0x2001, 0x0000, 0x1078, 0x24e8, 0x1078,
++      0x3699, 0x2001, 0xa8b2, 0x2004, 0xa086, 0x0005, 0x00c0, 0x123c,
++      0x2011, 0x0000, 0x1078, 0x70e0, 0x2011, 0x0000, 0x1078, 0x70ea,
++      0x1078, 0x62d1, 0x1078, 0x639b, 0x127f, 0x007c, 0x017e, 0x0f7e,
++      0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x2009, 0x00f7, 0x1078,
++      0x42a1, 0x7940, 0xa18c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0040,
++      0x125b, 0x7827, 0x0040, 0xd19c, 0x0040, 0x1260, 0x7827, 0x0008,
++      0x007e, 0x037e, 0x157e, 0xa006, 0x1078, 0x5ae6, 0x7900, 0xa18a,
++      0x0003, 0x0050, 0x1289, 0x7954, 0xd1ac, 0x00c0, 0x1289, 0x2009,
++      0x00f8, 0x1078, 0x42a1, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9,
++      0x09c4, 0x7820, 0xd09c, 0x00c0, 0x1281, 0x7824, 0xd0ac, 0x00c0,
++      0x12ca, 0x00f0, 0x1279, 0x2001, 0x0001, 0x1078, 0x24e8, 0x0078,
++      0x12d5, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0050, 0x00e0,
++      0x128f, 0x2091, 0x6000, 0x00f0, 0x128f, 0x7853, 0x0400, 0x782f,
++      0x0000, 0x2009, 0x00f8, 0x1078, 0x42a1, 0x20a9, 0x000e, 0x0005,
++      0x00f0, 0x129f, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843, 0x0010,
++      0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040, 0x12b4,
++      0x7824, 0xd0ac, 0x00c0, 0x12ca, 0x8319, 0x00c0, 0x12aa, 0x2009,
++      0xa632, 0x2104, 0x8000, 0x200a, 0xa084, 0xfff0, 0x0040, 0x12c4,
++      0x200b, 0x0000, 0x1078, 0x2588, 0x2001, 0x0001, 0x1078, 0x24e8,
++      0x0078, 0x12d3, 0x2001, 0xa632, 0x2003, 0x0000, 0x7828, 0xc09d,
++      0x782a, 0x7827, 0x0048, 0x7853, 0x0400, 0x157f, 0x037f, 0x007f,
++      0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c, 0x007c, 0x2a70,
++      0x2061, 0xa8ad, 0x2063, 0x0001, 0x6007, 0x0013, 0x600b, 0x0018,
++      0x600f, 0x0017, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
++      0x12f5, 0x7053, 0xffff, 0x0078, 0x12f7, 0x7053, 0x0000, 0x7057,
++      0xffff, 0x706f, 0x0000, 0x7073, 0x0000, 0x1078, 0x90a6, 0x2061,
++      0xa88d, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f,
++      0x0200, 0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f,
++      0x07d0, 0x2061, 0xa895, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b,
++      0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b,
++      0x0001, 0x601f, 0x0000, 0x2061, 0xa8a5, 0x6003, 0x514c, 0x6007,
++      0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0xa626, 0x2003,
++      0x0000, 0x007c, 0x2091, 0x8000, 0x0068, 0x1334, 0x007e, 0x017e,
++      0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x133a, 0x017f, 0x792e,
++      0x007f, 0x782a, 0x007f, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002,
++      0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2079, 0xa600,
++      0x7803, 0x0005, 0x0078, 0x1352, 0x007c, 0x2071, 0xa600, 0x715c,
++      0x712e, 0x2021, 0x0001, 0xa190, 0x002d, 0xa298, 0x002d, 0x0048,
++      0x136b, 0x7060, 0xa302, 0x00c8, 0x136b, 0x220a, 0x2208, 0x2310,
++      0x8420, 0x0078, 0x135d, 0x200b, 0x0000, 0x74aa, 0x74ae, 0x007c,
++      0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa600, 0x70ac, 0xa0ea,
++      0x0010, 0x00c8, 0x137e, 0xa06e, 0x0078, 0x1388, 0x8001, 0x70ae,
++      0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000,
++      0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa600, 0x127e, 0x2091,
++      0x8000, 0x70ac, 0x8001, 0x00c8, 0x1398, 0xa06e, 0x0078, 0x13a1,
++      0x70ae, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807,
++      0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000,
++      0x2071, 0xa600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000,
++      0x70ae, 0x127f, 0x0e7f, 0x007c, 0x8dff, 0x0040, 0x13c0, 0x6804,
++      0x6807, 0x0000, 0x007e, 0x1078, 0x13a4, 0x0d7f, 0x0078, 0x13b4,
++      0x007c, 0x0e7e, 0x2071, 0xa600, 0x70ac, 0xa08a, 0x0010, 0xa00d,
++      0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa8d6, 0x7007, 0x0000, 0x701b,
++      0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, 0x8004,
++      0x7012, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x0e7e, 0x2270,
++      0x700b, 0x0000, 0x2071, 0xa8d6, 0x7018, 0xa088, 0xa8df, 0x220a,
++      0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0, 0x13f6,
++      0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x127f,
++      0x007c, 0x0e7e, 0x2071, 0xa8d6, 0x7004, 0xa005, 0x00c0, 0x1406,
++      0x0f7e, 0x2079, 0x0010, 0x1078, 0x1408, 0x0f7f, 0x0e7f, 0x007c,
++      0x7000, 0x0079, 0x140b, 0x140f, 0x1479, 0x1496, 0x1496, 0x7018,
++      0x711c, 0xa106, 0x00c0, 0x1417, 0x7007, 0x0000, 0x007c, 0x0d7e,
++      0xa180, 0xa8df, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
++      0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c,
++      0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804,
++      0x0d7f, 0xd084, 0x0040, 0x1439, 0x7007, 0x0001, 0x1078, 0x143e,
++      0x007c, 0x7007, 0x0002, 0x1078, 0x1454, 0x007c, 0x017e, 0x027e,
++      0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1449, 0x2110,
++      0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
++      0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e,
++      0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c,
++      0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1468, 0x2110, 0xa006,
++      0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x3300,
++      0x7016, 0x7803, 0x0001, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f,
++      0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0xa6fa, 0x20a1, 0x0018,
++      0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++      0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b,
++      0xa6f5, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
++      0x157e, 0x2001, 0xa729, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
++      0x2001, 0xa72a, 0x20ac, 0x53a6, 0x2099, 0xa72b, 0x20a1, 0x0018,
++      0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++      0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b,
++      0xa726, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
++      0x2071, 0xa8d6, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
++      0xd1fc, 0x0040, 0x14d0, 0xa18c, 0x0700, 0x7004, 0x1079, 0x14d4,
++      0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x1408, 0x14dc, 0x1509, 0x1531,
++      0x1564, 0x14da, 0x0078, 0x14da, 0xa18c, 0x0700, 0x00c0, 0x1502,
++      0x137e, 0x147e, 0x157e, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803,
++      0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x157f, 0x147f,
++      0x137f, 0x700c, 0xa005, 0x0040, 0x151e, 0x1078, 0x143e, 0x007c,
++      0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078,
++      0x1408, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x0078,
++      0x14fd, 0xa18c, 0x0700, 0x00c0, 0x1514, 0x700c, 0xa005, 0x0040,
++      0x151e, 0x1078, 0x1454, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003,
++      0x0200, 0x7007, 0x0000, 0x1078, 0x1408, 0x007c, 0x0d7e, 0x7008,
++      0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c,
++      0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x1408,
++      0x007c, 0xa18c, 0x0700, 0x00c0, 0x155e, 0x137e, 0x147e, 0x157e,
++      0x2001, 0xa6f8, 0x2004, 0xa080, 0x000d, 0x20a0, 0x2099, 0x0014,
++      0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, 0xa6fa, 0x2004,
++      0xd0bc, 0x0040, 0x1554, 0x2001, 0xa703, 0x2004, 0xa080, 0x000d,
++      0x20a0, 0x20a9, 0x0020, 0x53a5, 0x157f, 0x147f, 0x137f, 0x7007,
++      0x0000, 0x1078, 0x4f8c, 0x1078, 0x1408, 0x007c, 0x2011, 0x8003,
++      0x1078, 0x361b, 0x0078, 0x1562, 0xa18c, 0x0700, 0x00c0, 0x1571,
++      0x2001, 0xa728, 0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x1408,
++      0x007c, 0x2011, 0x8004, 0x1078, 0x361b, 0x0078, 0x1575, 0x127e,
++      0x2091, 0x2100, 0x2079, 0x0030, 0x2071, 0xa8e7, 0x7803, 0x0004,
++      0x7003, 0x0000, 0x700f, 0xa8ed, 0x7013, 0xa8ed, 0x780f, 0x0076,
++      0x7803, 0x0004, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079,
++      0x1591, 0x1599, 0x15df, 0x1599, 0x1599, 0x1599, 0x15c4, 0x15a8,
++      0x159d, 0xa085, 0x0001, 0x0078, 0x15f9, 0x684c, 0xd0bc, 0x0040,
++      0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x15e7,
++      0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1599, 0x684c, 0xd0bc,
++      0x0040, 0x1599, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a,
++      0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004,
++      0x6832, 0x6858, 0x0078, 0x15ef, 0xa18c, 0x00ff, 0xa186, 0x0015,
++      0x00c0, 0x1599, 0x684c, 0xd0ac, 0x0040, 0x1599, 0x6804, 0x681a,
++      0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004,
++      0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x15ef, 0x684c,
++      0xd0ac, 0x0040, 0x1599, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c,
++      0x000f, 0xa188, 0x206a, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826,
++      0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980,
++      0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a,
++      0x2004, 0x82ff, 0x0040, 0x161c, 0xa280, 0x0004, 0x0d7e, 0x206c,
++      0x684c, 0xd0dc, 0x00c0, 0x1618, 0x1078, 0x158c, 0x0040, 0x1618,
++      0x0d7f, 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, 0x0078, 0x161c,
++      0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e,
++      0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0,
++      0x1630, 0x7206, 0x2001, 0x1651, 0x007e, 0x2260, 0x0078, 0x17e0,
++      0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
++      0xa908, 0x0048, 0x163d, 0x2009, 0xa8ed, 0x710e, 0x7010, 0xa102,
++      0xa082, 0x0009, 0x0040, 0x1648, 0xa080, 0x001b, 0x00c0, 0x164b,
++      0x2009, 0x0138, 0x200a, 0x7000, 0xa005, 0x00c0, 0x1651, 0x1078,
++      0x17c1, 0x127f, 0x007c, 0x127e, 0x027e, 0x037e, 0x0c7e, 0x007e,
++      0x2091, 0x2100, 0x007f, 0x047f, 0x037f, 0x027f, 0x0d7e, 0x0c7e,
++      0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e, 0xa005, 0x0040, 0x16dd,
++      0x6808, 0xa005, 0x0040, 0x174a, 0x7000, 0xa005, 0x00c0, 0x1672,
++      0x0078, 0x16d2, 0x700c, 0x7110, 0xa106, 0x00c0, 0x1753, 0x7004,
++      0xa406, 0x00c0, 0x16d2, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040,
++      0x168f, 0x047e, 0x1078, 0x1913, 0x047f, 0x2460, 0x6010, 0xa080,
++      0x0002, 0x2004, 0xa005, 0x0040, 0x174a, 0x0078, 0x166c, 0x2001,
++      0x0207, 0x2004, 0xd09c, 0x00c0, 0x167b, 0x7804, 0xa084, 0x6000,
++      0x0040, 0x16a0, 0xa086, 0x6000, 0x0040, 0x16a0, 0x0078, 0x167b,
++      0x7100, 0xa186, 0x0002, 0x00c0, 0x16c0, 0x0e7e, 0x2b68, 0x6818,
++      0x2060, 0x1078, 0x203f, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0,
++      0x16b5, 0x7108, 0x720c, 0x0078, 0x16b7, 0x7110, 0x7214, 0x6810,
++      0xa100, 0x6812, 0x6814, 0xa201, 0x6816, 0x0e7f, 0x0078, 0x16c4,
++      0xa186, 0x0001, 0x00c0, 0x16cc, 0x7820, 0x6910, 0xa100, 0x6812,
++      0x7824, 0x6914, 0xa101, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000,
++      0x7004, 0x2060, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009,
++      0x0048, 0x1078, 0x775c, 0x0078, 0x1753, 0x6808, 0xa005, 0x0040,
++      0x174a, 0x7000, 0xa005, 0x00c0, 0x16e7, 0x0078, 0x174a, 0x700c,
++      0x7110, 0xa106, 0x00c0, 0x16f0, 0x7004, 0xa406, 0x00c0, 0x174a,
++      0x2001, 0x0005, 0x2004, 0xd08c, 0x0040, 0x1704, 0x047e, 0x1078,
++      0x1913, 0x047f, 0x2460, 0x6010, 0xa080, 0x0002, 0x2004, 0xa005,
++      0x0040, 0x174a, 0x0078, 0x16e1, 0x2001, 0x0207, 0x2004, 0xd09c,
++      0x00c0, 0x16f0, 0x2001, 0x0005, 0x2004, 0xd08c, 0x00c0, 0x16f6,
++      0x7804, 0xa084, 0x6000, 0x0040, 0x171b, 0xa086, 0x6000, 0x0040,
++      0x171b, 0x0078, 0x16f0, 0x7007, 0x0000, 0xa016, 0x2218, 0x7000,
++      0xa08e, 0x0001, 0x0040, 0x173c, 0xa08e, 0x0002, 0x00c0, 0x174a,
++      0x0c7e, 0x0e7e, 0x6818, 0x2060, 0x1078, 0x203f, 0x2804, 0xac70,
++      0x6034, 0xd09c, 0x00c0, 0x1738, 0x7308, 0x720c, 0x0078, 0x173a,
++      0x7310, 0x7214, 0x0e7f, 0x0c7f, 0x7820, 0xa318, 0x7824, 0xa211,
++      0x6810, 0xa300, 0x6812, 0x6814, 0xa201, 0x6816, 0x7803, 0x0004,
++      0x7003, 0x0000, 0x6100, 0xa18e, 0x0004, 0x00c0, 0x1753, 0x2009,
++      0x0048, 0x1078, 0x775c, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e,
++      0x0e7e, 0x027e, 0x037e, 0x047e, 0x057e, 0x2071, 0xa8e7, 0x7000,
++      0xa086, 0x0000, 0x0040, 0x17ba, 0x7004, 0xac06, 0x00c0, 0x17ab,
++      0x2079, 0x0030, 0x7000, 0xa086, 0x0003, 0x0040, 0x17ab, 0x7804,
++      0xd0fc, 0x00c0, 0x17a7, 0x20e1, 0x6000, 0x2011, 0x0032, 0x2001,
++      0x0208, 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x00c0, 0x176f,
++      0x8211, 0x00c0, 0x1777, 0x7804, 0xd0fc, 0x00c0, 0x17a7, 0x1078,
++      0x1b22, 0x027e, 0x057e, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
++      0x178d, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007,
++      0x0000, 0x057f, 0x027f, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001,
++      0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0078, 0x17ab, 0x1078,
++      0x1913, 0x0078, 0x175f, 0x157e, 0x20a9, 0x0009, 0x2009, 0xa8ed,
++      0x2104, 0xac06, 0x00c0, 0x17b5, 0x200a, 0xa188, 0x0003, 0x00f0,
++      0x17b0, 0x157f, 0x057f, 0x047f, 0x037f, 0x027f, 0x0e7f, 0x0f7f,
++      0x007c, 0x700c, 0x7110, 0xa106, 0x00c0, 0x17c9, 0x7003, 0x0000,
++      0x007c, 0x2104, 0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124,
++      0x8108, 0xa182, 0xa908, 0x0048, 0x17d7, 0x2009, 0xa8ed, 0x7112,
++      0x700c, 0xa106, 0x00c0, 0x17e0, 0x2001, 0x0138, 0x2003, 0x0008,
++      0x8cff, 0x00c0, 0x17e7, 0x1078, 0x1b4d, 0x0078, 0x1854, 0x6010,
++      0x2068, 0x2d58, 0x6828, 0xa406, 0x00c0, 0x17f2, 0x682c, 0xa306,
++      0x0040, 0x182f, 0x601c, 0xa086, 0x0008, 0x0040, 0x182f, 0x6024,
++      0xd0f4, 0x00c0, 0x181c, 0xd0d4, 0x0040, 0x1818, 0x6038, 0xa402,
++      0x6034, 0xa303, 0x0040, 0x1806, 0x00c8, 0x1818, 0x643a, 0x6336,
++      0x6c2a, 0x6b2e, 0x047e, 0x037e, 0x2400, 0x6c7c, 0xa402, 0x6812,
++      0x2300, 0x6b80, 0xa303, 0x6816, 0x037f, 0x047f, 0x0078, 0x181c,
++      0x1078, 0x9053, 0x0040, 0x17e3, 0x2001, 0xa674, 0x2004, 0xd0b4,
++      0x00c0, 0x182b, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x182b, 0x6817,
++      0x7fff, 0x6813, 0xffff, 0x1078, 0x208a, 0x00c0, 0x17e3, 0x0c7e,
++      0x7004, 0x2060, 0x6024, 0xc0d4, 0x6026, 0x0c7f, 0x684c, 0xd0f4,
++      0x0040, 0x1840, 0x6817, 0xffff, 0x6813, 0xffff, 0x0078, 0x17e3,
++      0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc,
++      0x000f, 0x2009, 0x0011, 0x1078, 0x1855, 0x0040, 0x1853, 0x2009,
++      0x0001, 0x1078, 0x1855, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x18ec,
++      0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1877, 0xd0f4, 0x00c0,
++      0x1887, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1867, 0x18ce,
++      0x188e, 0x188e, 0x18ce, 0x18ce, 0x18c6, 0x18ce, 0x188e, 0x18ce,
++      0x1894, 0x1894, 0x18ce, 0x18ce, 0x18ce, 0x18bd, 0x1894, 0xc0fc,
++      0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x0d7e, 0xd99c, 0x0040,
++      0x18d1, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0xc0f4,
++      0x6852, 0x6b6c, 0x6a70, 0x0d7e, 0x0078, 0x18d8, 0x6b08, 0x6a0c,
++      0x6d00, 0x6c04, 0x0078, 0x18d1, 0x7b0c, 0xd3bc, 0x0040, 0x18b5,
++      0x7004, 0x0e7e, 0x2070, 0x701c, 0x0e7f, 0xa086, 0x0008, 0x00c0,
++      0x18b5, 0x7b08, 0xa39c, 0x0fff, 0x2d20, 0x0d7f, 0x0d7e, 0x6a14,
++      0x82ff, 0x00c0, 0x18b0, 0x6810, 0xa302, 0x0048, 0x18b0, 0x6b10,
++      0x2011, 0x0000, 0x2468, 0x0078, 0x18b7, 0x6b10, 0x6a14, 0x6d00,
++      0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x18d1, 0x0d7f, 0x0d7e, 0x6834,
++      0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x18ce, 0x0d7f, 0x1078,
++      0x2026, 0x00c0, 0x1855, 0xa00e, 0x0078, 0x18ec, 0x0d7f, 0x1078,
++      0x1332, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902,
++      0x7000, 0x8000, 0x7002, 0x0d7f, 0x6828, 0xa300, 0x682a, 0x682c,
++      0xa201, 0x682e, 0x2300, 0x6b10, 0xa302, 0x6812, 0x2200, 0x6a14,
++      0xa203, 0x6816, 0x1078, 0x2026, 0x007c, 0x1078, 0x1332, 0x1078,
++      0x1c97, 0x7004, 0x2060, 0x0d7e, 0x6010, 0x2068, 0x7003, 0x0000,
++      0x1078, 0x1af4, 0x1078, 0x8d06, 0x0040, 0x190c, 0x6808, 0x8001,
++      0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f,
++      0xffff, 0x6850, 0xc0bd, 0x6852, 0x0d7f, 0x1078, 0x8a01, 0x0078,
++      0x1adb, 0x1078, 0x1332, 0x127e, 0x2091, 0x2100, 0x007e, 0x017e,
++      0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700,
++      0x00c0, 0x18ef, 0xa184, 0x0003, 0xa086, 0x0003, 0x0040, 0x1911,
++      0x7000, 0x0079, 0x192b, 0x1933, 0x1935, 0x1a34, 0x1ab2, 0x1ac9,
++      0x1933, 0x1933, 0x1933, 0x1078, 0x1332, 0x8001, 0x7002, 0xa184,
++      0x0880, 0x00c0, 0x194a, 0x8aff, 0x0040, 0x19d4, 0x2009, 0x0001,
++      0x1078, 0x1855, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078, 0x1855,
++      0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x00c0,
++      0x19b2, 0x027e, 0x037e, 0x017e, 0x7808, 0xd0ec, 0x00c0, 0x1962,
++      0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7803, 0x0009, 0x7003, 0x0004,
++      0x0078, 0x1964, 0x1078, 0x1bd7, 0x017f, 0xd194, 0x0040, 0x196b,
++      0x8aff, 0x0040, 0x19a1, 0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a,
++      0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x0c7e, 0x7004, 0x2060,
++      0x6024, 0xd0f4, 0x00c0, 0x197e, 0x633a, 0x6236, 0x0c7f, 0x2400,
++      0x6910, 0xa100, 0x6812, 0x2500, 0x6914, 0xa101, 0x6816, 0x037f,
++      0x027f, 0x2600, 0x681e, 0x2700, 0x6822, 0x1078, 0x203f, 0x2a00,
++      0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852,
++      0x6808, 0x8001, 0x680a, 0x00c0, 0x19a7, 0x684c, 0xd0e4, 0x0040,
++      0x19a7, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x7000,
++      0xa086, 0x0004, 0x0040, 0x1adb, 0x7003, 0x0000, 0x1078, 0x17c1,
++      0x0078, 0x1adb, 0x057e, 0x7d0c, 0xd5bc, 0x00c0, 0x19b9, 0x1078,
++      0xa57e, 0x057f, 0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078,
++      0x4963, 0x0040, 0x19c6, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b,
++      0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912,
++      0x6980, 0x6916, 0x0078, 0x1adb, 0x7004, 0x0c7e, 0x2060, 0x6024,
++      0x0c7f, 0xd0f4, 0x0040, 0x19e1, 0x6808, 0x8001, 0x680a, 0x0078,
++      0x19f5, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x19f9,
++      0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x00c0, 0x19f5, 0x7004,
++      0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078,
++      0x1adb, 0x7814, 0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000,
++      0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff, 0xa192, 0x0841, 0x00c8,
++      0x18ef, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a, 0x8104,
++      0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x1078, 0x1b5e,
++      0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804, 0xd0fc,
++      0x0040, 0x1a1e, 0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x0076,
++      0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x1078, 0x775c,
++      0x1078, 0x1b92, 0x0040, 0x19f5, 0x8001, 0x7002, 0xd194, 0x0040,
++      0x1a46, 0x7804, 0xd0fc, 0x00c0, 0x191b, 0x8aff, 0x0040, 0x1adb,
++      0x2009, 0x0001, 0x1078, 0x1855, 0x0078, 0x1adb, 0xa184, 0x0880,
++      0x00c0, 0x1a53, 0x8aff, 0x0040, 0x1adb, 0x2009, 0x0001, 0x1078,
++      0x1855, 0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc,
++      0x00c0, 0x1a93, 0x027e, 0x037e, 0x7808, 0xd0ec, 0x00c0, 0x1a66,
++      0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1a68, 0x1078, 0x1bd7,
++      0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x0f7e, 0x2d78, 0x2804,
++      0xac68, 0x6034, 0xd09c, 0x00c0, 0x1a83, 0x6808, 0x2008, 0xa31a,
++      0x680c, 0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101,
++      0x7816, 0x0078, 0x1a8f, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213,
++      0x7810, 0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f,
++      0x0d7f, 0x0078, 0x196d, 0x057e, 0x7d0c, 0x1078, 0xa57e, 0x057f,
++      0x1078, 0x1af4, 0x0f7e, 0x7004, 0x2078, 0x1078, 0x4963, 0x0040,
++      0x1aa4, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, 0xffff, 0x682f,
++      0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916,
++      0x0078, 0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d,
++      0x0040, 0x1ac5, 0x6808, 0x8001, 0x680a, 0x00c0, 0x1ac5, 0x7004,
++      0x2060, 0x2009, 0x0048, 0x1078, 0x775c, 0x1078, 0x17c1, 0x0078,
++      0x1adb, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6010,
++      0xa005, 0x0040, 0x1ac5, 0x2068, 0x6808, 0x8000, 0x680a, 0x6c28,
++      0x6b2c, 0x1078, 0x17e0, 0x017f, 0x007f, 0x127f, 0x007c, 0x127e,
++      0x2091, 0x2100, 0x7000, 0xa086, 0x0003, 0x00c0, 0x1af2, 0x700c,
++      0x7110, 0xa106, 0x0040, 0x1af2, 0x20e1, 0x9028, 0x700f, 0xa8ed,
++      0x7013, 0xa8ed, 0x127f, 0x007c, 0x0c7e, 0x1078, 0x1b22, 0x20e1,
++      0x9028, 0x700c, 0x7110, 0xa106, 0x0040, 0x1b19, 0x2104, 0xa005,
++      0x0040, 0x1b08, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a,
++      0xa188, 0x0003, 0xa182, 0xa908, 0x0048, 0x1b10, 0x2009, 0xa8ed,
++      0x7112, 0x700c, 0xa106, 0x00c0, 0x1af9, 0x2011, 0x0008, 0x0078,
++      0x1af9, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0138, 0x2202,
++      0x0c7f, 0x007c, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2021,
++      0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x00c0, 0x1b3f, 0x2001,
++      0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0, 0x1b3f, 0x2001, 0x0111,
++      0x201c, 0x83ff, 0x00c0, 0x1b3f, 0x8421, 0x00c0, 0x1b29, 0x007c,
++      0x2011, 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x00c0, 0x1b4c,
++      0x8109, 0x00c0, 0x1b44, 0x007c, 0x007c, 0x1078, 0x1b40, 0x0040,
++      0x1b55, 0x780c, 0xd0a4, 0x0040, 0x1b5b, 0x1078, 0x1af4, 0xa085,
++      0x0001, 0x0078, 0x1b5d, 0x1078, 0x1b92, 0x007c, 0x0e7e, 0x2071,
++      0x0200, 0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x1b22, 0x2019,
++      0x5000, 0x8319, 0x0040, 0x1b7c, 0x2001, 0xa908, 0x2004, 0xa086,
++      0x0000, 0x0040, 0x1b7c, 0x2001, 0x0021, 0xd0fc, 0x0040, 0x1b69,
++      0x1078, 0x1eaa, 0x0078, 0x1b67, 0x20e1, 0x7000, 0x7324, 0x7420,
++      0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, 0x712e, 0x702f,
++      0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, 0x0138, 0x2202,
++      0x0e7f, 0x007c, 0x027e, 0x2001, 0x015d, 0x2001, 0x0000, 0x7908,
++      0xa18c, 0x0fff, 0xa182, 0x0ffd, 0x0048, 0x1ba0, 0x2009, 0x0000,
++      0xa190, 0x0007, 0xa294, 0x1ff8, 0x8214, 0x8214, 0x8214, 0x2001,
++      0x020a, 0x82ff, 0x0040, 0x1bb5, 0x20e1, 0x6000, 0x200c, 0x200c,
++      0x200c, 0x200c, 0x8211, 0x00c0, 0x1bae, 0x20e1, 0x7000, 0x200c,
++      0x200c, 0x7003, 0x0000, 0x20e1, 0x6000, 0x2001, 0x0208, 0x200c,
++      0x2001, 0x0209, 0x2004, 0xa106, 0x0040, 0x1bd4, 0x1078, 0x1b40,
++      0x0040, 0x1bd2, 0x7908, 0xd1ec, 0x00c0, 0x1bd4, 0x790c, 0xd1a4,
++      0x0040, 0x1b97, 0x1078, 0x1af4, 0xa006, 0x027f, 0x007c, 0x7c20,
++      0x7d24, 0x7e30, 0x7f34, 0x700c, 0x7110, 0xa106, 0x0040, 0x1c69,
++      0x7004, 0x017e, 0x210c, 0xa106, 0x017f, 0x0040, 0x1c69, 0x0d7e,
++      0x0c7e, 0x216c, 0x2d00, 0xa005, 0x0040, 0x1c67, 0x681c, 0xa086,
++      0x0008, 0x0040, 0x1c67, 0x6824, 0xd0d4, 0x00c0, 0x1c67, 0x6810,
++      0x2068, 0x6850, 0xd0fc, 0x0040, 0x1c29, 0x8108, 0x2104, 0x6b2c,
++      0xa306, 0x00c0, 0x1c67, 0x8108, 0x2104, 0x6a28, 0xa206, 0x00c0,
++      0x1c67, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x6870,
++      0x7826, 0x681c, 0x7832, 0x6820, 0x7836, 0x6818, 0x2060, 0x6034,
++      0xd09c, 0x0040, 0x1c24, 0x6830, 0x2004, 0xac68, 0x6808, 0x783a,
++      0x680c, 0x783e, 0x0078, 0x1c65, 0xa006, 0x783a, 0x783e, 0x0078,
++      0x1c65, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6b2c, 0xa306,
++      0x00c0, 0x1c67, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c67, 0x6a28,
++      0xa206, 0x00c0, 0x1c67, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2004,
++      0x6918, 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x00c0, 0x1c57,
++      0x6008, 0x7822, 0x686e, 0x600c, 0x7826, 0x6872, 0x6000, 0x7832,
++      0x6004, 0x7836, 0xa006, 0x783a, 0x783e, 0x0078, 0x1c65, 0x6010,
++      0x7822, 0x686e, 0x6014, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004,
++      0x7836, 0x6008, 0x783a, 0x600c, 0x783e, 0x7803, 0x0011, 0x0c7f,
++      0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0x027e, 0x2071, 0xa8e7,
++      0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, 0x0000, 0x0040,
++      0x1c92, 0x8211, 0x0040, 0x1c90, 0x2001, 0x0005, 0x2004, 0xd08c,
++      0x0040, 0x1c79, 0x7904, 0xa18c, 0x0780, 0x017e, 0x1078, 0x1913,
++      0x017f, 0x81ff, 0x00c0, 0x1c90, 0x2011, 0x0050, 0x0078, 0x1c74,
++      0xa085, 0x0001, 0x027f, 0x017f, 0x0e7f, 0x0f7f, 0x007c, 0x7803,
++      0x0004, 0x2009, 0x0064, 0x7804, 0xd0ac, 0x0040, 0x1ce8, 0x8109,
++      0x00c0, 0x1c9b, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0003, 0x1048,
++      0x1332, 0x1078, 0x1fca, 0x0e7e, 0x0f7e, 0x2071, 0xa8d6, 0x2079,
++      0x0010, 0x7004, 0xa086, 0x0000, 0x0040, 0x1ce0, 0x7800, 0x007e,
++      0x7820, 0x007e, 0x7830, 0x007e, 0x7834, 0x007e, 0x7838, 0x007e,
++      0x783c, 0x007e, 0x7803, 0x0004, 0x7823, 0x0000, 0x0005, 0x0005,
++      0x2079, 0x0030, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x2079, 0x0010,
++      0x007f, 0x783e, 0x007f, 0x783a, 0x007f, 0x7836, 0x007f, 0x7832,
++      0x007f, 0x7822, 0x007f, 0x7802, 0x0f7f, 0x0e7f, 0x0078, 0x1ce6,
++      0x0f7f, 0x0e7f, 0x7804, 0xd0ac, 0x10c0, 0x1332, 0x1078, 0x639b,
++      0x007c, 0x0e7e, 0x2071, 0xa908, 0x7003, 0x0000, 0x0e7f, 0x007c,
++      0x0d7e, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1d6b,
++      0x6934, 0xa184, 0x0007, 0x0079, 0x1cfd, 0x1d05, 0x1d56, 0x1d05,
++      0x1d05, 0x1d05, 0x1d3b, 0x1d18, 0x1d07, 0x1078, 0x1332, 0x684c,
++      0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a,
++      0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1d5e,
++      0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1d05, 0x684c,
++      0xd0b4, 0x0040, 0x1e79, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a,
++      0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080,
++      0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832,
++      0x6958, 0x0078, 0x1d67, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0,
++      0x1d6b, 0x684c, 0xd0b4, 0x0040, 0x1e79, 0x6804, 0x681a, 0xa080,
++      0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832,
++      0x6958, 0xa006, 0x682e, 0x682a, 0x0078, 0x1d67, 0x684c, 0xd0b4,
++      0x0040, 0x18ed, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a,
++      0x6834, 0xa084, 0x000f, 0xa080, 0x206a, 0x2004, 0x6832, 0x6926,
++      0x684c, 0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020,
++      0x7804, 0xd0fc, 0x10c0, 0x1eaa, 0x0e7e, 0x0d7e, 0x2071, 0xa908,
++      0x7000, 0xa005, 0x00c0, 0x1df0, 0x0c7e, 0x7206, 0xa280, 0x0004,
++      0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x0d7e, 0x2068,
++      0x686c, 0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200,
++      0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68,
++      0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc,
++      0x000f, 0x6908, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0007, 0x0040,
++      0x1db2, 0xa184, 0x0007, 0x0040, 0x1db2, 0x017e, 0x2009, 0x0008,
++      0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081,
++      0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c,
++      0x6814, 0xa106, 0x00c0, 0x1dc9, 0x6928, 0x6810, 0xa106, 0x0040,
++      0x1dd6, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078, 0x208a, 0x047f,
++      0x037f, 0x0040, 0x1dd6, 0x0c7f, 0x0078, 0x1df0, 0x8aff, 0x00c0,
++      0x1dde, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x1df0, 0x127e, 0x2091,
++      0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0040,
++      0x1ded, 0x2009, 0x0001, 0x1078, 0x1df4, 0x127f, 0x0c7f, 0xa006,
++      0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e,
++      0x037e, 0x027e, 0x8aff, 0x0040, 0x1e72, 0x700c, 0x7214, 0xa23a,
++      0x7010, 0x7218, 0xa203, 0x0048, 0x1e71, 0xa705, 0x0040, 0x1e71,
++      0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1e24, 0x0d7e, 0x2804,
++      0xac68, 0x2900, 0x0079, 0x1e14, 0x1e53, 0x1e34, 0x1e34, 0x1e53,
++      0x1e53, 0x1e4b, 0x1e53, 0x1e34, 0x1e53, 0x1e3a, 0x1e3a, 0x1e53,
++      0x1e53, 0x1e53, 0x1e42, 0x1e3a, 0xc0fc, 0x6852, 0x6b6c, 0x6a70,
++      0x6d1c, 0x6c20, 0xd99c, 0x0040, 0x1e57, 0x0d7e, 0x2804, 0xac68,
++      0x6f08, 0x6e0c, 0x0078, 0x1e56, 0x6b08, 0x6a0c, 0x6d00, 0x6c04,
++      0x0078, 0x1e56, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
++      0x0078, 0x1e56, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086,
++      0x001e, 0x00c0, 0x1e53, 0x0d7f, 0x1078, 0x2026, 0x00c0, 0x1dfa,
++      0xa00e, 0x0078, 0x1e72, 0x0d7f, 0x1078, 0x1332, 0x0d7f, 0x7b22,
++      0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000,
++      0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c,
++      0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x1078, 0x2026, 0x0078,
++      0x1e72, 0xa006, 0x027f, 0x037f, 0x047f, 0x057f, 0x067f, 0x077f,
++      0x007c, 0x1078, 0x1332, 0x027e, 0x2001, 0x0105, 0x2003, 0x0010,
++      0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060,
++      0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x1e92, 0x6850,
++      0xc0bd, 0x6852, 0x0d7f, 0x0c7e, 0x1078, 0x8a01, 0x0c7f, 0x2001,
++      0xa8c0, 0x2004, 0xac06, 0x00c0, 0x1ea7, 0x20e1, 0x9040, 0x1078,
++      0x738a, 0x2011, 0x0000, 0x1078, 0x70ea, 0x1078, 0x639b, 0x027f,
++      0x0078, 0x1f76, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e,
++      0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0xa908, 0x2b68,
++      0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0,
++      0x1e7b, 0x7000, 0x0079, 0x1ec4, 0x1f76, 0x1ec8, 0x1f43, 0x1f74,
++      0x8001, 0x7002, 0xd19c, 0x00c0, 0x1edc, 0x8aff, 0x0040, 0x1efb,
++      0x2009, 0x0001, 0x1078, 0x1df4, 0x0040, 0x1f76, 0x2009, 0x0001,
++      0x1078, 0x1df4, 0x0078, 0x1f76, 0x7803, 0x0004, 0xd194, 0x0040,
++      0x1eec, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1ef1, 0x684c,
++      0xc0f5, 0x684e, 0x0078, 0x1ef1, 0x1078, 0x203f, 0x6850, 0xc0fd,
++      0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003,
++      0x0000, 0x0078, 0x1f76, 0x711c, 0x81ff, 0x0040, 0x1f11, 0x7918,
++      0x7922, 0x7827, 0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002,
++      0x700c, 0xa100, 0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078,
++      0x1f76, 0x0f7e, 0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079,
++      0x0100, 0x7a14, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x037e,
++      0x2019, 0x1000, 0x8319, 0x1040, 0x1332, 0x7820, 0xd0bc, 0x00c0,
++      0x1f22, 0x037f, 0x79c8, 0x007f, 0xa102, 0x017f, 0x007e, 0x017e,
++      0x79c4, 0x007f, 0xa103, 0x78c6, 0x007f, 0x78ca, 0xa284, 0x0004,
++      0xa085, 0x0012, 0x7816, 0x027f, 0x0f7f, 0x7803, 0x0008, 0x7003,
++      0x0000, 0x0078, 0x1f76, 0x8001, 0x7002, 0xd194, 0x0040, 0x1f58,
++      0x7804, 0xd0fc, 0x00c0, 0x1eba, 0xd19c, 0x00c0, 0x1f72, 0x8aff,
++      0x0040, 0x1f76, 0x2009, 0x0001, 0x1078, 0x1df4, 0x0078, 0x1f76,
++      0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078, 0x203f, 0x0d7e, 0x2804,
++      0xac68, 0x6034, 0xd09c, 0x00c0, 0x1f6b, 0x6808, 0xa31a, 0x680c,
++      0xa213, 0x0078, 0x1f6f, 0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f,
++      0x0078, 0x1eec, 0x0078, 0x1eec, 0x1078, 0x1332, 0x0c7f, 0x0d7f,
++      0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f, 0x007c, 0x0f7e, 0x0e7e,
++      0x2071, 0xa908, 0x7000, 0xa086, 0x0000, 0x0040, 0x1fc7, 0x2079,
++      0x0020, 0x017e, 0x2009, 0x0207, 0x210c, 0xd194, 0x0040, 0x1fa4,
++      0x2009, 0x020c, 0x210c, 0xa184, 0x0003, 0x0040, 0x1fa4, 0x1078,
++      0xa5d2, 0x2001, 0x0133, 0x2004, 0xa005, 0x1040, 0x1332, 0x20e1,
++      0x9040, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009,
++      0x0203, 0x210c, 0xa106, 0x00c0, 0x1faf, 0x20e1, 0x9040, 0x7804,
++      0xd0fc, 0x0040, 0x1f8a, 0x1078, 0x1eaa, 0x7000, 0xa086, 0x0000,
++      0x00c0, 0x1f8a, 0x017f, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
++      0x1fbd, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f,
++      0x0f7f, 0x007c, 0x027e, 0x0c7e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071,
++      0xa908, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0040, 0x2003,
++      0x7004, 0x2060, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x1fed,
++      0x6850, 0xc0b5, 0x6852, 0x680c, 0x7a1c, 0xa206, 0x00c0, 0x1fed,
++      0x6808, 0x7a18, 0xa206, 0x0040, 0x2009, 0x2001, 0x0105, 0x2003,
++      0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004,
++      0x2060, 0x1078, 0x8a01, 0x20e1, 0x9040, 0x1078, 0x738a, 0x2011,
++      0x0000, 0x1078, 0x70ea, 0x0f7f, 0x0e7f, 0x0d7f, 0x0c7f, 0x027f,
++      0x007c, 0x6810, 0x6a14, 0xa205, 0x00c0, 0x1fed, 0x684c, 0xc0dc,
++      0x684e, 0x2c10, 0x1078, 0x1cf0, 0x2001, 0x0105, 0x2003, 0x0010,
++      0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x2069, 0xa8b1,
++      0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x2003, 0x8840, 0x2804,
++      0xa005, 0x00c0, 0x203a, 0x6004, 0xa005, 0x0040, 0x203c, 0x681a,
++      0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x206a, 0x2044, 0x88ff,
++      0x1040, 0x1332, 0x8a51, 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50,
++      0x8841, 0x2804, 0xa005, 0x00c0, 0x2059, 0x2c00, 0xad06, 0x0040,
++      0x204e, 0x6000, 0xa005, 0x00c0, 0x204e, 0x2d00, 0x2060, 0x681a,
++      0x6034, 0xa084, 0x000f, 0xa080, 0x207a, 0x2044, 0x88ff, 0x1040,
++      0x1332, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019, 0x001d, 0x0021,
++      0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b, 0x0021, 0x0027,
++      0x0000, 0x0000, 0x0000, 0x205f, 0x205b, 0x0000, 0x0000, 0x2069,
++      0x0000, 0x205f, 0x0000, 0x2066, 0x2063, 0x0000, 0x0000, 0x0000,
++      0x2069, 0x2066, 0x0000, 0x2061, 0x2061, 0x0000, 0x0000, 0x2069,
++      0x0000, 0x2061, 0x0000, 0x2067, 0x2067, 0x0000, 0x0000, 0x0000,
++      0x2069, 0x2067, 0x0a7e, 0x097e, 0x087e, 0x6b2e, 0x6c2a, 0x6858,
++      0xa055, 0x0040, 0x212d, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0,
++      0x206a, 0xa986, 0x0007, 0x0040, 0x20a5, 0xa986, 0x000e, 0x0040,
++      0x20a5, 0xa986, 0x000f, 0x00c0, 0x20a9, 0x605c, 0xa422, 0x6060,
++      0xa31a, 0x2804, 0xa045, 0x00c0, 0x20b7, 0x0050, 0x20b1, 0x0078,
++      0x212d, 0x6004, 0xa065, 0x0040, 0x212d, 0x0078, 0x2094, 0x2804,
++      0xa005, 0x0040, 0x20d5, 0xac68, 0xd99c, 0x00c0, 0x20c5, 0x6808,
++      0xa422, 0x680c, 0xa31b, 0x0078, 0x20c9, 0x6810, 0xa422, 0x6814,
++      0xa31b, 0x0048, 0x20f4, 0x2300, 0xa405, 0x0040, 0x20db, 0x8a51,
++      0x0040, 0x212d, 0x8840, 0x0078, 0x20b7, 0x6004, 0xa065, 0x0040,
++      0x212d, 0x0078, 0x2094, 0x8a51, 0x0040, 0x212d, 0x8840, 0x2804,
++      0xa005, 0x00c0, 0x20ee, 0x6004, 0xa065, 0x0040, 0x212d, 0x6034,
++      0xa0cc, 0x000f, 0xa9c0, 0x206a, 0x2804, 0x2040, 0x2b68, 0x6850,
++      0xc0fc, 0x6852, 0x0078, 0x2121, 0x8422, 0x8420, 0x831a, 0xa399,
++      0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c, 0x00c0,
++      0x210f, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1048,
++      0x1332, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x211b, 0x6910,
++      0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x1332, 0x6800,
++      0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd,
++      0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x007f,
++      0x007f, 0x007f, 0xa006, 0x0078, 0x2132, 0x087f, 0x097f, 0x0a7f,
++      0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007,
++      0x0079, 0x213a, 0x2142, 0x2143, 0x2146, 0x2149, 0x214e, 0x2151,
++      0x2156, 0x215b, 0x007c, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x1913,
++      0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x007c, 0x1078, 0x14be,
++      0x007c, 0x1078, 0x1eaa, 0x1078, 0x14be, 0x007c, 0x1078, 0x1913,
++      0x1078, 0x14be, 0x007c, 0x1078, 0x1913, 0x1078, 0x1eaa, 0x1078,
++      0x14be, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079, 0x0200, 0x2071,
++      0xab80, 0x2069, 0xa600, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004,
++      0x1078, 0x251f, 0x781b, 0x0002, 0x20e1, 0x8700, 0x127f, 0x007c,
++      0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007, 0x0079, 0x2180,
++      0x21a4, 0x2188, 0x218c, 0x2190, 0x2196, 0x219a, 0x219e, 0x21a2,
++      0x1078, 0x548e, 0x0078, 0x21a4, 0x1078, 0x54da, 0x0078, 0x21a4,
++      0x1078, 0x548e, 0x1078, 0x54da, 0x0078, 0x21a4, 0x1078, 0x21a6,
++      0x0078, 0x21a4, 0x1078, 0x21a6, 0x0078, 0x21a4, 0x1078, 0x21a6,
++      0x0078, 0x21a4, 0x1078, 0x21a6, 0x127f, 0x007c, 0x007e, 0x017e,
++      0x027e, 0x1078, 0xa5d2, 0x7930, 0xa184, 0x0003, 0x0040, 0x21c9,
++      0x2001, 0xa8c0, 0x2004, 0xa005, 0x0040, 0x21c5, 0x2001, 0x0133,
++      0x2004, 0xa005, 0x1040, 0x1332, 0x0c7e, 0x2001, 0xa8c0, 0x2064,
++      0x1078, 0x8a01, 0x0c7f, 0x0078, 0x21f2, 0x20e1, 0x9040, 0x0078,
++      0x21f2, 0xa184, 0x0030, 0x0040, 0x21da, 0x6a00, 0xa286, 0x0003,
++      0x00c0, 0x21d4, 0x0078, 0x21d6, 0x1078, 0x4224, 0x20e1, 0x9010,
++      0x0078, 0x21f2, 0xa184, 0x00c0, 0x0040, 0x21ec, 0x0e7e, 0x037e,
++      0x047e, 0x057e, 0x2071, 0xa8e7, 0x1078, 0x1af4, 0x057f, 0x047f,
++      0x037f, 0x0e7f, 0x0078, 0x21f2, 0xa184, 0x0300, 0x0040, 0x21f2,
++      0x20e1, 0x9020, 0x7932, 0x027f, 0x017f, 0x007f, 0x007c, 0x017e,
++      0x0e7e, 0x0f7e, 0x2071, 0xa600, 0x7128, 0x2001, 0xa890, 0x2102,
++      0x2001, 0xa898, 0x2102, 0xa182, 0x0211, 0x00c8, 0x220b, 0x2009,
++      0x0008, 0x0078, 0x2235, 0xa182, 0x0259, 0x00c8, 0x2213, 0x2009,
++      0x0007, 0x0078, 0x2235, 0xa182, 0x02c1, 0x00c8, 0x221b, 0x2009,
++      0x0006, 0x0078, 0x2235, 0xa182, 0x0349, 0x00c8, 0x2223, 0x2009,
++      0x0005, 0x0078, 0x2235, 0xa182, 0x0421, 0x00c8, 0x222b, 0x2009,
++      0x0004, 0x0078, 0x2235, 0xa182, 0x0581, 0x00c8, 0x2233, 0x2009,
++      0x0003, 0x0078, 0x2235, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912,
++      0x7817, 0x0004, 0x1078, 0x251f, 0x0f7f, 0x0e7f, 0x017f, 0x007c,
++      0x127e, 0x2091, 0x2200, 0x2061, 0x0100, 0x2071, 0xa600, 0x6024,
++      0x6026, 0x6053, 0x0030, 0x6033, 0x00ef, 0x60e7, 0x0000, 0x60eb,
++      0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
++      0x0080, 0x602f, 0x0000, 0x6007, 0x0eaf, 0x600f, 0x00ff, 0x602b,
++      0x002f, 0x127f, 0x007c, 0x2001, 0xa630, 0x2003, 0x0000, 0x2001,
++      0xa62f, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x007e,
++      0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0, 0x227b, 0xa184,
++      0x0007, 0x0079, 0x2281, 0xa195, 0x0004, 0xa284, 0x0007, 0x0079,
++      0x2281, 0x22ad, 0x2289, 0x228d, 0x2291, 0x2297, 0x229b, 0x22a1,
++      0x22a7, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078, 0x5d45, 0x0078,
++      0x22ad, 0x1078, 0x5d45, 0x1078, 0x5c56, 0x0078, 0x22ad, 0x1078,
++      0x22b2, 0x0078, 0x22ad, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x0078,
++      0x22ad, 0x1078, 0x5d45, 0x1078, 0x22b2, 0x0078, 0x22ad, 0x1078,
++      0x5d45, 0x1078, 0x5c56, 0x1078, 0x22b2, 0x027f, 0x017f, 0x007f,
++      0x127f, 0x007c, 0x6124, 0xd1ac, 0x0040, 0x23ac, 0x017e, 0x047e,
++      0x0c7e, 0x644c, 0xa486, 0xf0f0, 0x00c0, 0x22c5, 0x2061, 0x0100,
++      0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74c6, 0xa48c, 0xff00,
++      0x7034, 0xd084, 0x0040, 0x22dd, 0xa186, 0xf800, 0x00c0, 0x22dd,
++      0x703c, 0xd084, 0x00c0, 0x22dd, 0xc085, 0x703e, 0x037e, 0x2418,
++      0x2011, 0x8016, 0x1078, 0x361b, 0x037f, 0xa196, 0xff00, 0x0040,
++      0x231f, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040, 0x231f,
++      0x7130, 0xd184, 0x00c0, 0x231f, 0x2011, 0xa653, 0x2214, 0xd2ec,
++      0x0040, 0x22fa, 0xc18d, 0x7132, 0x2011, 0xa653, 0x2214, 0xd2ac,
++      0x00c0, 0x231f, 0x6240, 0xa294, 0x0010, 0x0040, 0x2306, 0x6248,
++      0xa294, 0xff00, 0xa296, 0xff00, 0x0040, 0x231f, 0x7030, 0xd08c,
++      0x0040, 0x2371, 0x7034, 0xd08c, 0x00c0, 0x2316, 0x2001, 0xa60c,
++      0x200c, 0xd1ac, 0x00c0, 0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4,
++      0x2011, 0x8013, 0x1078, 0x361b, 0x037f, 0x0078, 0x2371, 0x7034,
++      0xd08c, 0x00c0, 0x232b, 0x2001, 0xa60c, 0x200c, 0xd1ac, 0x00c0,
++      0x2371, 0xc1ad, 0x2102, 0x037e, 0x73c4, 0x2011, 0x8013, 0x1078,
++      0x361b, 0x037f, 0x7130, 0xc185, 0x7132, 0x2011, 0xa653, 0x220c,
++      0xd1a4, 0x0040, 0x2355, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100,
++      0x1078, 0x5bf1, 0x2019, 0x000e, 0x1078, 0xa195, 0xa484, 0x00ff,
++      0xa080, 0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006,
++      0x2009, 0x000e, 0x1078, 0xa21d, 0x017f, 0xd1ac, 0x00c0, 0x2362,
++      0x017e, 0x2009, 0x0000, 0x2019, 0x0004, 0x1078, 0x284f, 0x017f,
++      0x0078, 0x2371, 0x157e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x1078,
++      0x45c4, 0x00c0, 0x236d, 0x1078, 0x42f8, 0x8108, 0x00f0, 0x2367,
++      0x157f, 0x0c7f, 0x047f, 0x0f7e, 0x2079, 0xa8c4, 0x783c, 0xa086,
++      0x0000, 0x0040, 0x2383, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079,
++      0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003, 0x1078, 0x70e0,
++      0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019,
++      0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001,
++      0xa600, 0x2014, 0xa296, 0x0004, 0x00c0, 0x23a4, 0xd19c, 0x00c0,
++      0x23ac, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0xa622,
++      0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040, 0x2490, 0x0f7e,
++      0x2079, 0xa8c4, 0x783c, 0xa086, 0x0001, 0x00c0, 0x23d0, 0x017e,
++      0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140, 0x7803, 0x1000,
++      0x7803, 0x0000, 0x2079, 0xa8b1, 0x7807, 0x0000, 0x7833, 0x0000,
++      0x1078, 0x62d1, 0x1078, 0x639b, 0x017f, 0x0f7f, 0x0078, 0x2490,
++      0x0f7f, 0x017e, 0x3900, 0xa082, 0xa9e3, 0x00c8, 0x23db, 0x017e,
++      0x1078, 0x747a, 0x017f, 0x6220, 0xd2b4, 0x0040, 0x2446, 0x1078,
++      0x5acb, 0x1078, 0x6e0f, 0x6027, 0x0004, 0x0f7e, 0x2019, 0xa8ba,
++      0x2304, 0xa07d, 0x0040, 0x241c, 0x7804, 0xa086, 0x0032, 0x00c0,
++      0x241c, 0x0d7e, 0x0c7e, 0x0e7e, 0x2069, 0x0140, 0x618c, 0x6288,
++      0x7818, 0x608e, 0x7808, 0x608a, 0x6043, 0x0002, 0x2001, 0x0003,
++      0x8001, 0x00c0, 0x2400, 0x6043, 0x0000, 0x6803, 0x1000, 0x6803,
++      0x0000, 0x618e, 0x628a, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x7810,
++      0x2070, 0x7037, 0x0103, 0x2f60, 0x1078, 0x772d, 0x0e7f, 0x0c7f,
++      0x0d7f, 0x0f7f, 0x017f, 0x007c, 0x0f7f, 0x0d7e, 0x2069, 0x0140,
++      0x6804, 0xa084, 0x4000, 0x0040, 0x2429, 0x6803, 0x1000, 0x6803,
++      0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa8b1, 0x6028, 0xa09a, 0x00c8,
++      0x00c8, 0x2439, 0x8000, 0x602a, 0x0c7f, 0x1078, 0x6e01, 0x0078,
++      0x248f, 0x2019, 0xa8ba, 0x2304, 0xa065, 0x0040, 0x2443, 0x2009,
++      0x0027, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x248f, 0xd2bc, 0x0040,
++      0x248f, 0x1078, 0x5ad8, 0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e,
++      0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x245b, 0x6803,
++      0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa8b1, 0x6044,
++      0xa09a, 0x00c8, 0x00c8, 0x247e, 0x8000, 0x6046, 0x603c, 0x0c7f,
++      0xa005, 0x0040, 0x248f, 0x2009, 0x07d0, 0x1078, 0x5ad0, 0xa080,
++      0x0007, 0x2004, 0xa086, 0x0006, 0x00c0, 0x247a, 0x6017, 0x0012,
++      0x0078, 0x248f, 0x6017, 0x0016, 0x0078, 0x248f, 0x037e, 0x2019,
++      0x0001, 0x1078, 0x7058, 0x037f, 0x2019, 0xa8c0, 0x2304, 0xa065,
++      0x0040, 0x248e, 0x2009, 0x004f, 0x1078, 0x775c, 0x0c7f, 0x017f,
++      0xd19c, 0x0040, 0x24e4, 0x7034, 0xd0ac, 0x00c0, 0x24c1, 0x017e,
++      0x157e, 0x6027, 0x0008, 0x602f, 0x0020, 0x20a9, 0x000a, 0x00f0,
++      0x249f, 0x602f, 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9,
++      0x0320, 0x00e0, 0x24a9, 0x2091, 0x6000, 0x6020, 0xd09c, 0x00c0,
++      0x24b8, 0x157f, 0x6152, 0x017f, 0x6027, 0x0008, 0x0078, 0x24e4,
++      0x1078, 0x2577, 0x00f0, 0x24a9, 0x157f, 0x6152, 0x017f, 0x6027,
++      0x0008, 0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x1078,
++      0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e,
++      0x2019, 0x0000, 0x1078, 0x7058, 0x037f, 0x60e3, 0x0000, 0x1078,
++      0xa5ad, 0x1078, 0xa5cb, 0x2001, 0xa600, 0x2003, 0x0004, 0x6027,
++      0x0008, 0x1078, 0x1246, 0x017f, 0xa18c, 0xffd0, 0x6126, 0x007c,
++      0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e, 0x127e, 0x2091, 0x8000,
++      0x2071, 0xa600, 0x71bc, 0x70be, 0xa116, 0x0040, 0x2518, 0x81ff,
++      0x0040, 0x2500, 0x2011, 0x8011, 0x1078, 0x361b, 0x0078, 0x2518,
++      0x2011, 0x8012, 0x1078, 0x361b, 0x2001, 0xa672, 0x2004, 0xd0fc,
++      0x00c0, 0x2518, 0x037e, 0x0c7e, 0x1078, 0x6f9f, 0x2061, 0x0100,
++      0x2019, 0x0028, 0x2009, 0x0000, 0x1078, 0x284f, 0x0c7f, 0x037f,
++      0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c, 0x0c7e,
++      0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x253b, 0x2204,
++      0x60f2, 0x2011, 0x2548, 0x6000, 0xa082, 0x0003, 0x00c8, 0x2534,
++      0x2001, 0x00ff, 0x0078, 0x2535, 0x2204, 0x60ee, 0x027f, 0x007f,
++      0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420,
++      0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8,
++      0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff,
++      0x2130, 0xa094, 0xff00, 0x00c0, 0x2558, 0x81ff, 0x0040, 0x255c,
++      0x1078, 0x5761, 0x0078, 0x2563, 0xa080, 0x29c0, 0x200c, 0xa18c,
++      0xff00, 0x810f, 0xa006, 0x007c, 0xa080, 0x29c0, 0x200c, 0xa18c,
++      0x00ff, 0x007c, 0x0c7e, 0x2061, 0xa600, 0x6030, 0x0040, 0x2573,
++      0xc09d, 0x0078, 0x2574, 0xc09c, 0x6032, 0x0c7f, 0x007c, 0x007e,
++      0x157e, 0x0f7e, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c,
++      0x00c0, 0x2584, 0x00f0, 0x257e, 0x0f7f, 0x157f, 0x007f, 0x007c,
++      0x0c7e, 0x007e, 0x2061, 0x0100, 0x6030, 0x007e, 0x6048, 0x007e,
++      0x60e4, 0x007e, 0x60e8, 0x007e, 0x6050, 0x007e, 0x60f0, 0x007e,
++      0x60ec, 0x007e, 0x600c, 0x007e, 0x6004, 0x007e, 0x6028, 0x007e,
++      0x60e0, 0x007e, 0x602f, 0x0100, 0x602f, 0x0000, 0x0005, 0x0005,
++      0x0005, 0x0005, 0x602f, 0x0040, 0x602f, 0x0000, 0x007f, 0x60e2,
++      0x007f, 0x602a, 0x007f, 0x6006, 0x007f, 0x600e, 0x007f, 0x60ee,
++      0x007f, 0x60f2, 0x007f, 0x6052, 0x007f, 0x60ea, 0x007f, 0x60e6,
++      0x007f, 0x604a, 0x007f, 0x6032, 0x007f, 0x0c7f, 0x007c, 0x25e7,
++      0x25eb, 0x25ef, 0x25f5, 0x25fb, 0x2601, 0x2607, 0x260f, 0x2617,
++      0x261d, 0x2623, 0x262b, 0x2633, 0x263b, 0x2643, 0x264d, 0x2657,
++      0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657,
++      0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x2657, 0x107e,
++      0x007e, 0x0078, 0x2670, 0x107e, 0x007e, 0x0078, 0x2670, 0x107e,
++      0x007e, 0x1078, 0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++      0x226c, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078,
++      0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++      0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++      0x007e, 0x1078, 0x226c, 0x1078, 0x2133, 0x0078, 0x2670, 0x107e,
++      0x007e, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++      0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++      0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++      0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078,
++      0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x2133, 0x1078,
++      0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078, 0x226c, 0x1078,
++      0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x107e, 0x007e, 0x1078,
++      0x226c, 0x1078, 0x2133, 0x1078, 0x2178, 0x0078, 0x2670, 0x0005,
++      0x0078, 0x2657, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x2660,
++      0x2670, 0x25ed, 0x25f1, 0x25f7, 0x25fd, 0x2603, 0x2609, 0x2611,
++      0x2619, 0x261f, 0x2625, 0x262d, 0x2635, 0x263d, 0x2645, 0x264f,
++      0x0008, 0x265a, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e,
++      0x027e, 0x047e, 0x2021, 0x0000, 0x1078, 0x4967, 0x00c0, 0x2772,
++      0x70cc, 0xd09c, 0x0040, 0x268e, 0xd084, 0x00c0, 0x268e, 0xd0bc,
++      0x00c0, 0x2772, 0x1078, 0x2776, 0x0078, 0x2772, 0xd0cc, 0x00c0,
++      0x2772, 0xd094, 0x0040, 0x2698, 0x7097, 0xffff, 0x0078, 0x2772,
++      0x2001, 0x010c, 0x203c, 0x7284, 0xd284, 0x0040, 0x2701, 0xd28c,
++      0x00c0, 0x2701, 0x037e, 0x7394, 0xa38e, 0xffff, 0x0040, 0x26ab,
++      0x83ff, 0x00c0, 0x26ad, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xacc0,
++      0x2c04, 0xa38c, 0x0001, 0x0040, 0x26ba, 0xa084, 0xff00, 0x8007,
++      0x0078, 0x26bc, 0xa084, 0x00ff, 0xa70e, 0x0040, 0x26f6, 0xa08e,
++      0x0000, 0x0040, 0x26f6, 0xa08e, 0x00ff, 0x00c0, 0x26d3, 0x7230,
++      0xd284, 0x00c0, 0x26fc, 0x7284, 0xc28d, 0x7286, 0x7097, 0xffff,
++      0x037f, 0x0078, 0x2701, 0x2009, 0x0000, 0x1078, 0x254d, 0x1078,
++      0x455c, 0x00c0, 0x26f9, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++      0x00c0, 0x26f0, 0x7030, 0xd08c, 0x0040, 0x26ea, 0x6000, 0xd0bc,
++      0x0040, 0x26f0, 0x1078, 0x278c, 0x0040, 0x26f9, 0x0078, 0x26f6,
++      0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x26f9, 0x8318, 0x0078,
++      0x26ad, 0x7396, 0x0078, 0x26fe, 0x7097, 0xffff, 0x037f, 0x0078,
++      0x2772, 0xa780, 0x29c0, 0x203c, 0xa7bc, 0xff00, 0x873f, 0x2041,
++      0x007e, 0x7094, 0xa096, 0xffff, 0x00c0, 0x2713, 0x2009, 0x0000,
++      0x28a8, 0x0078, 0x271f, 0xa812, 0x0048, 0x271b, 0x2008, 0xa802,
++      0x20a8, 0x0078, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x2700,
++      0x157e, 0x017e, 0xa106, 0x0040, 0x2766, 0xc484, 0x1078, 0x45c4,
++      0x0040, 0x2730, 0x1078, 0x455c, 0x00c0, 0x276f, 0x0078, 0x2731,
++      0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2740,
++      0x7030, 0xd08c, 0x0040, 0x275e, 0x6000, 0xd0bc, 0x00c0, 0x275e,
++      0x7284, 0xd28c, 0x0040, 0x2756, 0x6004, 0xa084, 0x00ff, 0xa082,
++      0x0006, 0x0048, 0x2766, 0xd484, 0x00c0, 0x2752, 0x1078, 0x457f,
++      0x0078, 0x2754, 0x1078, 0x298e, 0x0078, 0x2766, 0x1078, 0x28c4,
++      0x1078, 0x27b9, 0x0040, 0x276f, 0x0078, 0x2766, 0x1078, 0x2959,
++      0x0040, 0x2766, 0x1078, 0x278c, 0x0040, 0x276f, 0x017f, 0x8108,
++      0x157f, 0x00f0, 0x271f, 0x7097, 0xffff, 0x0078, 0x2772, 0x017f,
++      0x157f, 0x7196, 0x047f, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x017e,
++      0x7097, 0x0001, 0x2009, 0x007e, 0x1078, 0x455c, 0x00c0, 0x2789,
++      0x1078, 0x28c4, 0x1078, 0x27b9, 0x0040, 0x2789, 0x70cc, 0xc0bd,
++      0x70ce, 0x017f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e,
++      0x2c68, 0x2001, 0xa657, 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078,
++      0x76c7, 0x0040, 0x27b4, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001,
++      0x0000, 0x1078, 0x44ee, 0x2001, 0x0000, 0x1078, 0x4502, 0x127e,
++      0x2091, 0x8000, 0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0004,
++      0x1078, 0x775c, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f,
++      0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x2001, 0xa657,
++      0x2004, 0xa084, 0x00ff, 0x6842, 0x1078, 0x9187, 0x0040, 0x27f2,
++      0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e,
++      0x0040, 0x27db, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++      0x27db, 0x1078, 0x2880, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++      0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000,
++      0x7090, 0x8000, 0x7092, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c,
++      0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++      0x027e, 0x2009, 0x0080, 0x1078, 0x455c, 0x00c0, 0x2805, 0x1078,
++      0x2808, 0x0040, 0x2805, 0x70d3, 0xffff, 0x027f, 0x0c7f, 0x007c,
++      0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x76c7, 0x0040,
++      0x282a, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++      0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x127e, 0x2091, 0x8000,
++      0x70d4, 0x8000, 0x70d6, 0x127f, 0x2009, 0x0002, 0x1078, 0x775c,
++      0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++      0x0d7e, 0x127e, 0x2091, 0x8000, 0x2009, 0x007f, 0x1078, 0x455c,
++      0x00c0, 0x284b, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x284b, 0x2d00,
++      0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x2009, 0x0022, 0x1078,
++      0x775c, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x0c7f, 0x007c, 0x0e7e,
++      0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x5f0e, 0x1078, 0x5eae,
++      0x1078, 0x8068, 0x2130, 0x81ff, 0x0040, 0x2864, 0x20a9, 0x007e,
++      0x2009, 0x0000, 0x0078, 0x2868, 0x20a9, 0x007f, 0x2009, 0x0000,
++      0x017e, 0x1078, 0x45c4, 0x00c0, 0x2871, 0x1078, 0x47e9, 0x1078,
++      0x42f8, 0x017f, 0x8108, 0x00f0, 0x2868, 0x86ff, 0x00c0, 0x287a,
++      0x1078, 0x119b, 0x027f, 0x037f, 0x067f, 0x0c7f, 0x0e7f, 0x007c,
++      0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270, 0x72a0,
++      0x027e, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000,
++      0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, 0x017f, 0x2e60,
++      0x1078, 0x47e9, 0x6210, 0x6314, 0x1078, 0x42f8, 0x6212, 0x6316,
++      0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x007e,
++      0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x28ba, 0x2071,
++      0xa600, 0x7090, 0xa005, 0x0040, 0x28b7, 0x8001, 0x7092, 0x007f,
++      0x0e7f, 0x007c, 0x2071, 0xa600, 0x70d4, 0xa005, 0x0040, 0x28b7,
++      0x8001, 0x70d6, 0x0078, 0x28b7, 0x6000, 0xc08c, 0x6002, 0x007c,
++      0x0f7e, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x2178,
++      0x81ff, 0x00c0, 0x28d7, 0x20a9, 0x0001, 0x0078, 0x28f2, 0x2001,
++      0xa653, 0x2004, 0xd0c4, 0x0040, 0x28ee, 0xd0a4, 0x0040, 0x28ee,
++      0x047e, 0x6018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427,
++      0xa006, 0x2009, 0x002d, 0x1078, 0xa21d, 0x047f, 0x20a9, 0x00ff,
++      0x2011, 0x0000, 0x027e, 0xa28e, 0x007e, 0x0040, 0x2936, 0xa28e,
++      0x007f, 0x0040, 0x2936, 0xa28e, 0x0080, 0x0040, 0x2936, 0xa288,
++      0xa735, 0x210c, 0x81ff, 0x0040, 0x2936, 0x8fff, 0x1040, 0x2942,
++      0x0c7e, 0x2160, 0x2001, 0x0001, 0x1078, 0x4972, 0x0c7f, 0x2019,
++      0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a,
++      0x0c7e, 0x027e, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006,
++      0x00c0, 0x2926, 0x6007, 0x0404, 0x0078, 0x292b, 0x2001, 0x0004,
++      0x8007, 0xa215, 0x6206, 0x027f, 0x0c7f, 0x017e, 0x2c08, 0x1078,
++      0x9f8b, 0x017f, 0x077f, 0x2160, 0x1078, 0x47e9, 0x027f, 0x8210,
++      0x00f0, 0x28f2, 0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f,
++      0x0f7f, 0x007c, 0x047e, 0x027e, 0x017e, 0x2001, 0xa653, 0x2004,
++      0xd0c4, 0x0040, 0x2955, 0xd0a4, 0x0040, 0x2955, 0xa006, 0x2220,
++      0x8427, 0x2009, 0x0029, 0x1078, 0xa21d, 0x017f, 0x027f, 0x047f,
++      0x007c, 0x017e, 0x027e, 0x037e, 0x0c7e, 0x7284, 0x82ff, 0x0040,
++      0x2987, 0xa290, 0xa653, 0x2214, 0xd2ac, 0x00c0, 0x2987, 0x2100,
++      0x1078, 0x2564, 0x81ff, 0x0040, 0x2989, 0x2019, 0x0001, 0x8314,
++      0xa2e0, 0xacc0, 0x2c04, 0xd384, 0x0040, 0x297b, 0xa084, 0xff00,
++      0x8007, 0x0078, 0x297d, 0xa084, 0x00ff, 0xa116, 0x0040, 0x2989,
++      0xa096, 0x00ff, 0x0040, 0x2987, 0x8318, 0x0078, 0x296f, 0xa085,
++      0x0001, 0x0c7f, 0x037f, 0x027f, 0x017f, 0x007c, 0x017e, 0x0c7e,
++      0x127e, 0x2091, 0x8000, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e,
++      0x2019, 0x0029, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f,
++      0x027f, 0x017f, 0xa180, 0xa735, 0x2004, 0xa065, 0x0040, 0x29b7,
++      0x017e, 0x0c7e, 0x1078, 0x9187, 0x017f, 0x1040, 0x1332, 0x611a,
++      0x1078, 0x2880, 0x1078, 0x772d, 0x017f, 0x1078, 0x457f, 0x127f,
++      0x0c7f, 0x017f, 0x007c, 0x2001, 0xa633, 0x2004, 0xd0cc, 0x007c,
++      0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da,
++      0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce,
++      0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5,
++      0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3,
++      0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9,
++      0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b,
++      0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081,
++      0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073,
++      0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69,
++      0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056,
++      0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c,
++      0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c,
++      0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831,
++      0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026,
++      0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017,
++      0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000,
++      0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000,
++      0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300,
++      0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100,
++      0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00,
++      0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800,
++      0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000,
++      0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000,
++      0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500,
++      0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000,
++      0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000,
++      0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000,
++      0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000,
++      0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000,
++      0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x2071, 0xa682, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a,
++      0x703e, 0x7033, 0xa692, 0x7037, 0xa692, 0x7007, 0x0001, 0x2061,
++      0xa6d2, 0x6003, 0x0002, 0x007c, 0x0090, 0x2ae7, 0x0068, 0x2ae7,
++      0x2071, 0xa682, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2ae7, 0x2a60,
++      0x7820, 0xa08e, 0x0069, 0x00c0, 0x2bd7, 0x0079, 0x2b6b, 0x007c,
++      0x2071, 0xa682, 0x7004, 0x0079, 0x2aed, 0x2af1, 0x2af2, 0x2afc,
++      0x2b0e, 0x007c, 0x0090, 0x2afb, 0x0068, 0x2afb, 0x2b78, 0x7818,
++      0xd084, 0x0040, 0x2b1a, 0x007c, 0x2b78, 0x2061, 0xa6d2, 0x6008,
++      0xa08e, 0x0100, 0x0040, 0x2b09, 0xa086, 0x0200, 0x0040, 0x2bcf,
++      0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010, 0x2068,
++      0x6834, 0xa086, 0x0103, 0x0040, 0x2b16, 0x007c, 0x2a60, 0x2b78,
++      0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8, 0x2b23,
++      0x61bc, 0x0079, 0x2b2b, 0x2100, 0xa08a, 0x003f, 0x00c8, 0x2bcb,
++      0x61bc, 0x0079, 0x2b6b, 0x2bad, 0x2bdf, 0x2be7, 0x2beb, 0x2bf3,
++      0x2bf9, 0x2bfd, 0x2c09, 0x2c0d, 0x2c17, 0x2c1b, 0x2bcb, 0x2bcb,
++      0x2bcb, 0x2c1f, 0x2bcb, 0x2c2f, 0x2c46, 0x2c5d, 0x2cdd, 0x2ce2,
++      0x2d0f, 0x2d69, 0x2d7a, 0x2d98, 0x2dd9, 0x2de3, 0x2df0, 0x2e03,
++      0x2e22, 0x2e2b, 0x2e68, 0x2e6e, 0x2bcb, 0x2e8a, 0x2bcb, 0x2bcb,
++      0x2bcb, 0x2bcb, 0x2bcb, 0x2e91, 0x2e9b, 0x2bcb, 0x2bcb, 0x2bcb,
++      0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2ea3, 0x2bcb, 0x2bcb,
++      0x2bcb, 0x2bcb, 0x2bcb, 0x2eb5, 0x2ece, 0x2bcb, 0x2bcb, 0x2bcb,
++      0x2bcb, 0x2bcb, 0x2bcb, 0x2ee0, 0x2f37, 0x2f95, 0x2fa9, 0x2bcb,
++      0x2bcb, 0x2bcb, 0x398e, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb,
++      0x2bcb, 0x2bcb, 0x2bcb, 0x2c17, 0x2c1b, 0x2fc0, 0x2bcb, 0x2fcd,
++      0x3a26, 0x3a83, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb,
++      0x2bcb, 0x2bcb, 0x2bcb, 0x301a, 0x314f, 0x316b, 0x3177, 0x31da,
++      0x3233, 0x323e, 0x327d, 0x328c, 0x329b, 0x329e, 0x2fd1, 0x32c2,
++      0x331e, 0x332b, 0x343c, 0x356f, 0x3599, 0x36a6, 0x2bcb, 0x36b6,
++      0x36f0, 0x37bf, 0x2bcb, 0x2bcb, 0x2bcb, 0x2bcb, 0x3827, 0x3843,
++      0x38bd, 0x3977, 0x713c, 0x0078, 0x2bad, 0x2021, 0x4000, 0x1078,
++      0x35f5, 0x127e, 0x2091, 0x8000, 0x0068, 0x2bba, 0x7818, 0xd084,
++      0x0040, 0x2bbd, 0x127f, 0x0078, 0x2bb1, 0x7c22, 0x7926, 0x7a2a,
++      0x7b2e, 0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091,
++      0x5000, 0x127f, 0x007c, 0x2021, 0x4001, 0x0078, 0x2baf, 0x2021,
++      0x4002, 0x0078, 0x2baf, 0x2021, 0x4003, 0x0078, 0x2baf, 0x2021,
++      0x4005, 0x0078, 0x2baf, 0x2021, 0x4006, 0x0078, 0x2baf, 0xa02e,
++      0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x3604, 0x7823,
++      0x0004, 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824,
++      0x7930, 0x0078, 0x3608, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078,
++      0x2bad, 0x7924, 0x2114, 0x0078, 0x2bad, 0x2099, 0x0009, 0x20a1,
++      0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0078,
++      0x2bad, 0x7824, 0x2060, 0x0078, 0x2c21, 0x2009, 0x0001, 0x2011,
++      0x0013, 0x2019, 0x0018, 0x783b, 0x0017, 0x0078, 0x2bad, 0x7d38,
++      0x7c3c, 0x0078, 0x2be1, 0x7d38, 0x7c3c, 0x0078, 0x2bed, 0x2061,
++      0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0,
++      0x2c23, 0x2010, 0xa005, 0x0040, 0x2bad, 0x0078, 0x2bd3, 0x2069,
++      0xa652, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040,
++      0x2bdb, 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006,
++      0x685a, 0x685e, 0x1078, 0x4eae, 0x0078, 0x2bad, 0x2069, 0xa652,
++      0x7824, 0x7934, 0xa11a, 0x00c8, 0x2bdb, 0x8019, 0x0040, 0x2bdb,
++      0x684e, 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a,
++      0x686e, 0x1078, 0x4a3e, 0x0078, 0x2bad, 0xa02e, 0x2520, 0x81ff,
++      0x00c0, 0x2bd7, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1,
++      0xa689, 0x41a1, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020,
++      0x1078, 0x3604, 0x701b, 0x2c75, 0x007c, 0x6834, 0x2008, 0xa084,
++      0x00ff, 0xa096, 0x0011, 0x0040, 0x2c85, 0xa096, 0x0019, 0x0040,
++      0x2c85, 0xa096, 0x0015, 0x00c0, 0x2bd7, 0x810f, 0xa18c, 0x00ff,
++      0x0040, 0x2bd7, 0x710e, 0x700c, 0x8001, 0x0040, 0x2cb6, 0x700e,
++      0x1078, 0x35ba, 0x0040, 0x2bd7, 0x2009, 0x0020, 0x2061, 0xa6d2,
++      0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000,
++      0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x1078, 0x3604, 0x701b, 0x2ca9,
++      0x007c, 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0040, 0x2cb4,
++      0xa096, 0x000a, 0x00c0, 0x2bd7, 0x0078, 0x2c8b, 0x7010, 0x2068,
++      0x6838, 0xc0fd, 0x683a, 0x1078, 0x4431, 0x00c0, 0x2cc4, 0x7007,
++      0x0003, 0x701b, 0x2cc6, 0x007c, 0x1078, 0x4b51, 0x127e, 0x2091,
++      0x8000, 0x20a9, 0x0005, 0x2099, 0xa689, 0x530a, 0x2100, 0xa210,
++      0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d,
++      0x2009, 0x0020, 0x127f, 0x0078, 0x3608, 0x61a4, 0x7824, 0x60a6,
++      0x0078, 0x2bad, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953,
++      0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832,
++      0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c,
++      0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b,
++      0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1,
++      0x00f0, 0xa08a, 0x0003, 0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff,
++      0x00c0, 0x2bd7, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4,
++      0x00c0, 0x2bdb, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048,
++      0x2d23, 0x0078, 0x2bdb, 0x7c28, 0x7d2c, 0x1078, 0x47a4, 0xd28c,
++      0x00c0, 0x2d2e, 0x1078, 0x4736, 0x0078, 0x2d30, 0x1078, 0x4772,
++      0x00c0, 0x2d5a, 0x2061, 0xad00, 0x127e, 0x2091, 0x8000, 0x6000,
++      0xa086, 0x0000, 0x0040, 0x2d48, 0x6010, 0xa06d, 0x0040, 0x2d48,
++      0x683c, 0xa406, 0x00c0, 0x2d48, 0x6840, 0xa506, 0x0040, 0x2d53,
++      0x127f, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02, 0x00c8,
++      0x2bd7, 0x0078, 0x2d34, 0x1078, 0x8a01, 0x127f, 0x0040, 0x2bd7,
++      0x0078, 0x2bad, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51, 0x127e,
++      0x2091, 0x8000, 0x1078, 0x8f85, 0x1078, 0x4a73, 0x127f, 0x0078,
++      0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb,
++      0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078, 0x47b2, 0x0040, 0x2bd7,
++      0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040,
++      0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0005, 0x1078,
++      0x47d3, 0x0040, 0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb,
++      0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x0078, 0x2bad,
++      0x127e, 0x2091, 0x8000, 0x81ff, 0x0040, 0x2da2, 0x2009, 0x0001,
++      0x0078, 0x2dd3, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x0040,
++      0x2dcd, 0x2508, 0x1078, 0x45c4, 0x00c0, 0x2dcd, 0x1078, 0x482f,
++      0x00c0, 0x2db8, 0x2009, 0x0002, 0x62ac, 0x2518, 0x0078, 0x2dd3,
++      0x2019, 0x0004, 0x1078, 0x47d3, 0x00c0, 0x2dc2, 0x2009, 0x0006,
++      0x0078, 0x2dd3, 0x7824, 0xa08a, 0x1000, 0x00c8, 0x2dd6, 0x8003,
++      0x800b, 0x810b, 0xa108, 0x1078, 0x5a52, 0x8529, 0x00c8, 0x2da5,
++      0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bd7, 0x127f, 0x0078,
++      0x2bdb, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x46e7, 0x1078,
++      0x47a4, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2,
++      0x0040, 0x2bdb, 0x1078, 0x46d6, 0x1078, 0x47a4, 0x0078, 0x2bad,
++      0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078,
++      0x4775, 0x0040, 0x2bd7, 0x1078, 0x4484, 0x1078, 0x472f, 0x1078,
++      0x47a4, 0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078,
++      0x4673, 0x0040, 0x2bd7, 0x62a0, 0x2019, 0x0005, 0x0c7e, 0x1078,
++      0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078,
++      0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x1078, 0x47a4,
++      0x0078, 0x2bad, 0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x47a4,
++      0x2208, 0x0078, 0x2bad, 0x157e, 0x0d7e, 0x0e7e, 0x2069, 0xa714,
++      0x6810, 0x6914, 0xa10a, 0x00c8, 0x2e37, 0x2009, 0x0000, 0x6816,
++      0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x00ff, 0x2069, 0xa735,
++      0x2d04, 0xa075, 0x0040, 0x2e4c, 0x704c, 0x1078, 0x2e56, 0xa210,
++      0x7080, 0x1078, 0x2e56, 0xa318, 0x8d68, 0x00f0, 0x2e40, 0x2300,
++      0xa218, 0x0e7f, 0x0d7f, 0x157f, 0x0078, 0x2bad, 0x0f7e, 0x017e,
++      0xa07d, 0x0040, 0x2e65, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff,
++      0x0040, 0x2e65, 0x2178, 0x0078, 0x2e5d, 0x017f, 0x0f7f, 0x007c,
++      0x2069, 0xa714, 0x6910, 0x62a8, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++      0x2bd7, 0x6150, 0xa190, 0x29c0, 0x2214, 0xa294, 0x00ff, 0x6070,
++      0xa084, 0xff00, 0xa215, 0x636c, 0x67cc, 0xd79c, 0x0040, 0x2e84,
++      0x2031, 0x0001, 0x0078, 0x2e86, 0x2031, 0x0000, 0x7e3a, 0x7f3e,
++      0x0078, 0x2bad, 0x6140, 0x6244, 0x2019, 0xa8a2, 0x231c, 0x0078,
++      0x2bad, 0x127e, 0x2091, 0x8000, 0x6134, 0x6338, 0xa006, 0x2010,
++      0x127f, 0x0078, 0x2bad, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6244,
++      0x6338, 0x0078, 0x2bad, 0x6140, 0x6244, 0x7824, 0x6042, 0x7b28,
++      0x6346, 0x2069, 0xa652, 0x831f, 0xa305, 0x6816, 0x782c, 0x2069,
++      0xa8a2, 0x2d1c, 0x206a, 0x0078, 0x2bad, 0x017e, 0x127e, 0x2091,
++      0x8000, 0x7824, 0x6036, 0xd094, 0x0040, 0x2ec8, 0x7828, 0xa085,
++      0x0001, 0x2009, 0xa8ab, 0x200a, 0x2001, 0xffff, 0x1078, 0x5ae6,
++      0x782c, 0x603a, 0x127f, 0x017f, 0x0078, 0x2bad, 0x1078, 0x35e4,
++      0x0040, 0x2bdb, 0x7828, 0xa00d, 0x0040, 0x2bdb, 0x782c, 0xa005,
++      0x0040, 0x2bdb, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078, 0x2bad,
++      0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e,
++      0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff,
++      0x00c0, 0x2ef7, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f06, 0xa182,
++      0x007f, 0x00c8, 0x2f30, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff,
++      0x6030, 0xa116, 0x0040, 0x2f30, 0x810f, 0xa105, 0x127e, 0x2091,
++      0x8000, 0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f2c, 0x601a,
++      0x600b, 0xbc09, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f33,
++      0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd,
++      0x683a, 0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078,
++      0x775c, 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7,
++      0x0c7f, 0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f2c, 0x2001,
++      0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x0c7e, 0x2061,
++      0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x00c0,
++      0x2f4e, 0x6030, 0xa085, 0xff00, 0x0078, 0x2f5d, 0xa182, 0x007f,
++      0x00c8, 0x2f87, 0xa188, 0x29c0, 0x210c, 0xa18c, 0x00ff, 0x6030,
++      0xa116, 0x0040, 0x2f87, 0x810f, 0xa105, 0x127e, 0x2091, 0x8000,
++      0x007e, 0x1078, 0x76c7, 0x007f, 0x0040, 0x2f83, 0x601a, 0x600b,
++      0xbc05, 0x601f, 0x0001, 0x1078, 0x35ba, 0x0040, 0x2f8a, 0x6837,
++      0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++      0x701b, 0x2f8e, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, 0x775c,
++      0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2bd7, 0x0c7f,
++      0x0078, 0x2bdb, 0x1078, 0x772d, 0x0078, 0x2f83, 0x6830, 0xa086,
++      0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad, 0x2061, 0xa933, 0x127e,
++      0x2091, 0x8000, 0x6000, 0xd084, 0x0040, 0x2fa6, 0x6104, 0x6208,
++      0x2019, 0xa612, 0x231c, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078,
++      0x2bdb, 0x81ff, 0x00c0, 0x2bd7, 0x127e, 0x2091, 0x8000, 0x6248,
++      0x6064, 0xa202, 0x0048, 0x2fbd, 0xa085, 0x0001, 0x1078, 0x256a,
++      0x1078, 0x3c9e, 0x127f, 0x0078, 0x2bad, 0x127f, 0x0078, 0x2bdb,
++      0x127e, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xa640, 0x20a0,
++      0xa006, 0x40a4, 0x127f, 0x0078, 0x2bad, 0x7d38, 0x7c3c, 0x0078,
++      0x2c5f, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x2bd7,
++      0x6250, 0xa084, 0xff00, 0x8007, 0xa206, 0x00c0, 0x2fe9, 0x2001,
++      0xa640, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078,
++      0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb,
++      0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2bd7, 0x0c7e,
++      0x1078, 0x35ba, 0x0c7f, 0x0040, 0x2bd7, 0x6837, 0x0000, 0x6838,
++      0xc0fd, 0x683a, 0x1078, 0x8e4a, 0x0040, 0x2bd7, 0x7007, 0x0003,
++      0x701b, 0x300b, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7,
++      0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++      0x0078, 0x3608, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x1078, 0x42dd,
++      0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604,
++      0x701b, 0x302b, 0x007c, 0xade8, 0x000d, 0x6800, 0xa005, 0x0040,
++      0x2bdb, 0x6804, 0xd0ac, 0x0040, 0x3038, 0xd0a4, 0x0040, 0x2bdb,
++      0xd094, 0x0040, 0x3043, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c,
++      0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x304e, 0x0c7e, 0x2061,
++      0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100,
++      0x210c, 0xa18a, 0x0002, 0x0048, 0x3063, 0xd084, 0x0040, 0x3063,
++      0x6a28, 0xa28a, 0x007f, 0x00c8, 0x2bdb, 0xa288, 0x29c0, 0x210c,
++      0xa18c, 0x00ff, 0x6156, 0xd0dc, 0x0040, 0x306c, 0x6828, 0xa08a,
++      0x007f, 0x00c8, 0x2bdb, 0x6052, 0x6808, 0xa08a, 0x0100, 0x0048,
++      0x2bdb, 0xa08a, 0x0841, 0x00c8, 0x2bdb, 0xa084, 0x0007, 0x00c0,
++      0x2bdb, 0x680c, 0xa005, 0x0040, 0x2bdb, 0x6810, 0xa005, 0x0040,
++      0x2bdb, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040,
++      0x2bdb, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x2bdb, 0x8001, 0x0040,
++      0x2bdb, 0x6804, 0xd0fc, 0x0040, 0x30c2, 0x1078, 0x35ba, 0x0040,
++      0x2bd7, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290,
++      0x0038, 0xa399, 0x0000, 0x1078, 0x3604, 0x701b, 0x30a8, 0x007c,
++      0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0xa66e, 0x2da0,
++      0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xa672, 0x200c, 0xd1e4,
++      0x0040, 0x30c2, 0x0c7e, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00,
++      0x6006, 0x0c7f, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xa652, 0x2da0,
++      0x53a3, 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084, 0x00ff,
++      0x6046, 0x1078, 0x4eae, 0x1078, 0x49ce, 0x1078, 0x4a3e, 0x6000,
++      0xa086, 0x0000, 0x00c0, 0x314d, 0x6808, 0x602a, 0x1078, 0x21f7,
++      0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f,
++      0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0040, 0x30fa,
++      0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f,
++      0x0078, 0x30fc, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312,
++      0x1078, 0x5b19, 0x6904, 0xd1fc, 0x0040, 0x312f, 0x0c7e, 0x2009,
++      0x0000, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0040, 0x312c, 0x0078,
++      0x3116, 0x839d, 0x00c8, 0x312c, 0x3508, 0x8109, 0x1078, 0x5480,
++      0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, 0x600a,
++      0xa184, 0x00ff, 0x6006, 0x8108, 0x00c0, 0x312a, 0x6003, 0x0003,
++      0x0078, 0x312c, 0x6003, 0x0001, 0x00f0, 0x3111, 0x0c7f, 0x0c7e,
++      0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x0c7f, 0x1078,
++      0x3819, 0x0040, 0x313d, 0x1078, 0x256a, 0x60c0, 0xa005, 0x0040,
++      0x3149, 0x6003, 0x0001, 0x2091, 0x301d, 0x1078, 0x4224, 0x0078,
++      0x314d, 0x6003, 0x0004, 0x2091, 0x301d, 0x0078, 0x2bad, 0x6000,
++      0xa086, 0x0000, 0x0040, 0x2bd7, 0x2069, 0xa652, 0x7830, 0x6842,
++      0x7834, 0x6846, 0x6804, 0xd0fc, 0x0040, 0x3162, 0x2009, 0x0030,
++      0x0078, 0x3164, 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c,
++      0x7d38, 0x0078, 0x3608, 0xa006, 0x1078, 0x256a, 0x81ff, 0x00c0,
++      0x2bd7, 0x1078, 0x42dd, 0x1078, 0x4224, 0x0078, 0x2bad, 0x81ff,
++      0x00c0, 0x2bd7, 0x6184, 0x81ff, 0x0040, 0x3191, 0x703f, 0x0000,
++      0x2001, 0xacc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++      0x127e, 0x2091, 0x8000, 0x1078, 0x3608, 0x701b, 0x2baa, 0x127f,
++      0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0xacc0, 0x20a9, 0x0040,
++      0x20a1, 0xacc0, 0x2019, 0xffff, 0x43a4, 0x6550, 0xa588, 0x29c0,
++      0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100,
++      0xa506, 0x0040, 0x31c3, 0x1078, 0x45c4, 0x00c0, 0x31c3, 0x6014,
++      0x821c, 0x0048, 0x31bb, 0xa398, 0xacc0, 0xa085, 0xff00, 0x8007,
++      0x201a, 0x0078, 0x31c2, 0xa398, 0xacc0, 0x2324, 0xa4a4, 0xff00,
++      0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8, 0x31ca,
++      0x0078, 0x31a7, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x0d7f,
++      0x20a9, 0x0040, 0x20a1, 0xacc0, 0x2099, 0xacc0, 0x1078, 0x4281,
++      0x0078, 0x3180, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0c7e, 0x1078,
++      0x35ba, 0x0c7f, 0x00c0, 0x31e8, 0x2009, 0x0002, 0x0078, 0x2bd7,
++      0x2001, 0xa653, 0x2004, 0xd0b4, 0x0040, 0x320f, 0x6000, 0xd08c,
++      0x00c0, 0x320f, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
++      0x320f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x8e9e,
++      0x00c0, 0x3206, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003,
++      0x701b, 0x320b, 0x007c, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x20a9,
++      0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004,
++      0xac80, 0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x1078, 0x4281,
++      0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0,
++      0x1078, 0x4281, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c,
++      0x7d38, 0x0078, 0x3608, 0x81ff, 0x00c0, 0x2bd7, 0x1078, 0x35d2,
++      0x0040, 0x2bdb, 0x1078, 0x47bd, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++      0x2bd7, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x1078, 0x35e4,
++      0x0040, 0x2bdb, 0x1078, 0x482f, 0x0040, 0x2bd7, 0x2019, 0x0004,
++      0x1078, 0x47d3, 0x7924, 0x810f, 0x7a28, 0x1078, 0x3259, 0x0078,
++      0x2bad, 0xa186, 0x00ff, 0x0040, 0x3261, 0x1078, 0x3271, 0x0078,
++      0x3270, 0x2029, 0x007e, 0x2061, 0xa600, 0x6450, 0x2400, 0xa506,
++      0x0040, 0x326d, 0x2508, 0x1078, 0x3271, 0x8529, 0x00c8, 0x3266,
++      0x007c, 0x1078, 0x45c4, 0x00c0, 0x327c, 0x2200, 0x8003, 0x800b,
++      0x810b, 0xa108, 0x1078, 0x5a52, 0x007c, 0x81ff, 0x00c0, 0x2bd7,
++      0x1078, 0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7,
++      0x1078, 0x47c8, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7, 0x1078,
++      0x35d2, 0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x1078,
++      0x47b2, 0x0078, 0x2bad, 0x6100, 0x0078, 0x2bad, 0x1078, 0x35e4,
++      0x0040, 0x2bdb, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0,
++      0x2bd7, 0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x32b2,
++      0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a,
++      0x6b04, 0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200,
++      0x0078, 0x2bad, 0xa006, 0x1078, 0x256a, 0x7824, 0xa084, 0x00ff,
++      0xa086, 0x00ff, 0x0040, 0x32cf, 0x81ff, 0x00c0, 0x2bd7, 0x1078,
++      0x42dd, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x2bdb, 0x7924, 0xa18c,
++      0xff00, 0x810f, 0xa186, 0x00ff, 0x0040, 0x32e5, 0xa182, 0x007f,
++      0x00c8, 0x2bdb, 0x2100, 0x1078, 0x2564, 0x027e, 0x0c7e, 0x127e,
++      0x2091, 0x8000, 0x2061, 0xa8c4, 0x601b, 0x0000, 0x601f, 0x0000,
++      0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002, 0x1078, 0x70ea,
++      0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078, 0x7058, 0x037f,
++      0x2061, 0x0100, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a,
++      0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4259,
++      0x1078, 0x5add, 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078,
++      0x3259, 0x127f, 0x0c7f, 0x027f, 0x0078, 0x2bad, 0x7924, 0xa18c,
++      0xff00, 0x810f, 0x0c7e, 0x1078, 0x455c, 0x2c08, 0x0c7f, 0x00c0,
++      0x2bdb, 0x0078, 0x2bad, 0x81ff, 0x0040, 0x3332, 0x2009, 0x0001,
++      0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x333a, 0x2009, 0x0005,
++      0x0078, 0x2bd7, 0x1078, 0x35ba, 0x00c0, 0x3342, 0x2009, 0x0002,
++      0x0078, 0x2bd7, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078,
++      0x3604, 0x701b, 0x334c, 0x007c, 0x2009, 0x0080, 0x1078, 0x45c4,
++      0x00c0, 0x3359, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0040,
++      0x335d, 0x2021, 0x400a, 0x0078, 0x2baf, 0x0d7e, 0xade8, 0x000d,
++      0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be,
++      0x0100, 0x0040, 0x33d0, 0xa0be, 0x0112, 0x0040, 0x33d0, 0xa0be,
++      0x0113, 0x0040, 0x33d0, 0xa0be, 0x0114, 0x0040, 0x33d0, 0xa0be,
++      0x0117, 0x0040, 0x33d0, 0xa0be, 0x011a, 0x0040, 0x33d0, 0xa0be,
++      0x0121, 0x0040, 0x33c6, 0xa0be, 0x0131, 0x0040, 0x33c6, 0xa0be,
++      0x0171, 0x0040, 0x33d0, 0xa0be, 0x0173, 0x0040, 0x33d0, 0xa0be,
++      0x01a1, 0x00c0, 0x3398, 0x6830, 0x8007, 0x6832, 0x0078, 0x33d6,
++      0xa0be, 0x0212, 0x0040, 0x33cc, 0xa0be, 0x0213, 0x0040, 0x33cc,
++      0xa0be, 0x0214, 0x0040, 0x33be, 0xa0be, 0x0217, 0x0040, 0x33b8,
++      0xa0be, 0x021a, 0x00c0, 0x33b1, 0x6838, 0x8007, 0x683a, 0x0078,
++      0x33d0, 0xa0be, 0x0300, 0x0040, 0x33d0, 0x0d7f, 0x0078, 0x2bdb,
++      0xad80, 0x0010, 0x20a9, 0x0007, 0x1078, 0x3418, 0xad80, 0x000e,
++      0x20a9, 0x0001, 0x1078, 0x3418, 0x0078, 0x33d0, 0xad80, 0x000c,
++      0x1078, 0x3426, 0x0078, 0x33d6, 0xad80, 0x000e, 0x1078, 0x3426,
++      0xad80, 0x000c, 0x20a9, 0x0001, 0x1078, 0x3418, 0x0c7e, 0x1078,
++      0x35ba, 0x0040, 0x3409, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119,
++      0x6853, 0x0000, 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e,
++      0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b,
++      0x0000, 0x0c7f, 0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a,
++      0x6823, 0x0000, 0x6804, 0x2068, 0x1078, 0x8e66, 0x00c0, 0x3404,
++      0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x340f,
++      0x007c, 0x0c7f, 0x0d7f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6820,
++      0xa086, 0x8001, 0x00c0, 0x2bad, 0x2009, 0x0004, 0x0078, 0x2bd7,
++      0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108,
++      0x280a, 0x8108, 0x00f0, 0x341a, 0x017f, 0x007c, 0x017e, 0x0a7e,
++      0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000,
++      0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a,
++      0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x0040, 0x3443, 0x2009,
++      0x0001, 0x0078, 0x2bd7, 0x60cc, 0xd09c, 0x00c0, 0x344b, 0x2009,
++      0x0005, 0x0078, 0x2bd7, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f,
++      0xa182, 0x0080, 0x0048, 0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb,
++      0x7a2c, 0x7b28, 0x606c, 0xa306, 0x00c0, 0x3466, 0x6070, 0xa24e,
++      0x0040, 0x2bdb, 0xa9cc, 0xff00, 0x0040, 0x2bdb, 0x0c7e, 0x1078,
++      0x350f, 0x2c68, 0x0c7f, 0x0040, 0x349e, 0xa0c6, 0x4000, 0x00c0,
++      0x3484, 0x0c7e, 0x007e, 0x2d60, 0x2009, 0x0000, 0x1078, 0x489b,
++      0x00c0, 0x347b, 0xc185, 0x6000, 0xd0bc, 0x0040, 0x3480, 0xc18d,
++      0x007f, 0x0c7f, 0x0078, 0x349b, 0xa0c6, 0x4007, 0x00c0, 0x348b,
++      0x2408, 0x0078, 0x349b, 0xa0c6, 0x4008, 0x00c0, 0x3493, 0x2708,
++      0x2610, 0x0078, 0x349b, 0xa0c6, 0x4009, 0x00c0, 0x3499, 0x0078,
++      0x349b, 0x2001, 0x4006, 0x2020, 0x0078, 0x2baf, 0x2d00, 0x7022,
++      0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078, 0x76c7, 0x0040,
++      0x34e4, 0x2d00, 0x601a, 0x2001, 0xa657, 0x2004, 0xa084, 0x00ff,
++      0x6842, 0x2e58, 0x0e7f, 0x0e7e, 0x0c7e, 0x1078, 0x35ba, 0x0c7f,
++      0x2b70, 0x00c0, 0x34c5, 0x1078, 0x772d, 0x0e7f, 0x0c7f, 0x0b7f,
++      0x017f, 0x2009, 0x0002, 0x0078, 0x2bd7, 0x6837, 0x0000, 0x2d00,
++      0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x127e, 0x2091,
++      0x8000, 0x1078, 0x2880, 0x127f, 0x601f, 0x0001, 0x2001, 0x0000,
++      0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x2009, 0x0002,
++      0x1078, 0x775c, 0xa085, 0x0001, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f,
++      0x00c0, 0x34ee, 0x2009, 0x0003, 0x0078, 0x2bd7, 0x7007, 0x0003,
++      0x701b, 0x34f3, 0x007c, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060,
++      0x00c0, 0x3501, 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0078,
++      0x2bd7, 0x2009, 0x0000, 0x1078, 0x489b, 0x00c0, 0x3508, 0xc185,
++      0x6000, 0xd0bc, 0x0040, 0x350d, 0xc18d, 0x0078, 0x2bad, 0x0e7e,
++      0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071,
++      0xa7b5, 0x2e04, 0xa005, 0x00c0, 0x3524, 0x2100, 0xa406, 0x00c0,
++      0x3555, 0x2428, 0x0078, 0x3555, 0x2068, 0x6f10, 0x2700, 0xa306,
++      0x00c0, 0x3546, 0x6e14, 0x2600, 0xa206, 0x00c0, 0x3546, 0x2400,
++      0xa106, 0x00c0, 0x3542, 0x2d60, 0xd884, 0x0040, 0x356a, 0x6004,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x356a, 0x2001, 0x4000,
++      0x0078, 0x356b, 0x2001, 0x4007, 0x0078, 0x356b, 0x2400, 0xa106,
++      0x00c0, 0x3555, 0x6e14, 0x87ff, 0x00c0, 0x3551, 0x86ff, 0x0040,
++      0x3521, 0x2001, 0x4008, 0x0078, 0x356b, 0x8420, 0x8e70, 0x00f0,
++      0x3519, 0x85ff, 0x00c0, 0x3564, 0x2001, 0x4009, 0x0078, 0x356b,
++      0x2001, 0x0001, 0x0078, 0x356b, 0x1078, 0x455c, 0x00c0, 0x3560,
++      0x6312, 0x6216, 0xa006, 0xa005, 0x0d7f, 0x0e7f, 0x007c, 0x81ff,
++      0x00c0, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7, 0x6837, 0x0000,
++      0x6838, 0xc0fd, 0x683a, 0x7824, 0xa005, 0x0040, 0x2bdb, 0xa096,
++      0x00ff, 0x0040, 0x3587, 0xa092, 0x0004, 0x00c8, 0x2bdb, 0x2010,
++      0x2d18, 0x1078, 0x282f, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b,
++      0x3592, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078,
++      0x2bad, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048,
++      0x2bdb, 0xa182, 0x00ff, 0x00c8, 0x2bdb, 0x127e, 0x2091, 0x8000,
++      0x1078, 0x8d4b, 0x00c0, 0x35b7, 0xa190, 0xa735, 0x2204, 0xa065,
++      0x0040, 0x35b7, 0x1078, 0x42f8, 0x127f, 0x0078, 0x2bad, 0x127f,
++      0x0078, 0x2bd7, 0x1078, 0x138b, 0x0040, 0x35d1, 0xa006, 0x6802,
++      0x7010, 0xa005, 0x00c0, 0x35c9, 0x2d00, 0x7012, 0x7016, 0x0078,
++      0x35cf, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80,
++      0x000d, 0x007c, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x45c4,
++      0x00c0, 0x35e1, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048,
++      0x35e2, 0xa066, 0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff,
++      0x1078, 0x45c4, 0x00c0, 0x35f2, 0xa6b4, 0x00ff, 0xa682, 0x4000,
++      0x0048, 0x35f3, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff,
++      0x0040, 0x3600, 0x2168, 0x6904, 0x1078, 0x13a4, 0x0078, 0x35f7,
++      0x7112, 0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x360a,
++      0x2031, 0x0000, 0x2061, 0xa6d2, 0x6606, 0x6112, 0x600e, 0x6226,
++      0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002,
++      0x701b, 0x2bad, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079,
++      0x0000, 0x2001, 0xa690, 0x2004, 0xa005, 0x00c0, 0x3636, 0x0068,
++      0x3636, 0x7818, 0xd084, 0x00c0, 0x3636, 0x7a22, 0x7b26, 0x7c2a,
++      0x781b, 0x0001, 0x2091, 0x4080, 0x0078, 0x365b, 0x017e, 0x0c7e,
++      0x0e7e, 0x2071, 0xa682, 0x7138, 0xa182, 0x0008, 0x0048, 0x3644,
++      0x7030, 0x2060, 0x0078, 0x3655, 0x7030, 0xa0e0, 0x0008, 0xac82,
++      0xa6d2, 0x0048, 0x364d, 0x2061, 0xa692, 0x2c00, 0x7032, 0x81ff,
++      0x00c0, 0x3653, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a,
++      0x0e7f, 0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071,
++      0xa682, 0x7038, 0xa005, 0x0040, 0x3697, 0x127e, 0x2091, 0x8000,
++      0x0068, 0x3696, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0,
++      0x3695, 0x0c7e, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826,
++      0x6008, 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001,
++      0x703a, 0xa005, 0x00c0, 0x368b, 0x7033, 0xa692, 0x7037, 0xa692,
++      0x0c7f, 0x0078, 0x3695, 0xac80, 0x0008, 0xa0fa, 0xa6d2, 0x0048,
++      0x3693, 0x2001, 0xa692, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f,
++      0x007c, 0x027e, 0x2001, 0xa653, 0x2004, 0xd0c4, 0x0040, 0x36a4,
++      0x2011, 0x8014, 0x1078, 0x361b, 0x027f, 0x007c, 0x81ff, 0x00c0,
++      0x2bd7, 0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac,
++      0x6032, 0x1078, 0x4224, 0x127f, 0x0078, 0x2bad, 0x81ff, 0x00c0,
++      0x2bd7, 0x6000, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x2001, 0xa653,
++      0x2004, 0xd0ac, 0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb,
++      0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x36d3, 0x7828,
++      0xa005, 0x0040, 0x2bad, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x0040,
++      0x2bd7, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++      0x1078, 0x8f12, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x36e9,
++      0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2bd7, 0x0078, 0x2bad,
++      0x2001, 0xa600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2bd7, 0x7f24,
++      0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x35ba, 0x0040, 0x2bd7,
++      0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000,
++      0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x45c4, 0x00c0, 0x376d,
++      0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0040, 0x371d, 0xa0c4,
++      0xff00, 0xa8c6, 0x0600, 0x00c0, 0x376d, 0x2001, 0xa653, 0x2004,
++      0xd0ac, 0x00c0, 0x372a, 0x1078, 0x489b, 0x00c0, 0x372a, 0xd79c,
++      0x0040, 0x376d, 0xd794, 0x00c0, 0x3730, 0xd784, 0x0040, 0x373c,
++      0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078,
++      0x3426, 0xd794, 0x0040, 0x3745, 0xac80, 0x000a, 0x2098, 0x3400,
++      0x20a9, 0x0004, 0x53a3, 0x1078, 0x3426, 0x21a2, 0xd794, 0x0040,
++      0x3765, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3,
++      0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400,
++      0x20a9, 0x0002, 0x53a3, 0x1078, 0x3418, 0xac80, 0x0026, 0x2098,
++      0x20a9, 0x0002, 0x53a3, 0x0078, 0x3766, 0x94a0, 0xd794, 0x0040,
++      0x376b, 0xa6b0, 0x000b, 0xa6b0, 0x0005, 0x8108, 0xd78c, 0x0040,
++      0x3777, 0xa186, 0x0100, 0x0040, 0x3788, 0x0078, 0x377b, 0xa186,
++      0x007e, 0x0040, 0x3788, 0xd794, 0x0040, 0x3782, 0xa686, 0x0020,
++      0x0078, 0x3784, 0xa686, 0x0028, 0x0040, 0x3791, 0x0078, 0x370c,
++      0x86ff, 0x00c0, 0x378f, 0x7120, 0x810b, 0x0078, 0x2bad, 0x702f,
++      0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xa6d2,
++      0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e,
++      0x6532, 0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x37a9,
++      0x007c, 0x702c, 0xa005, 0x00c0, 0x37bb, 0x711c, 0x7024, 0x20a0,
++      0x7728, 0x2031, 0x0000, 0x2061, 0xa6d2, 0x6224, 0x6328, 0x642c,
++      0x6530, 0x0078, 0x370c, 0x7120, 0x810b, 0x0078, 0x2bad, 0x2029,
++      0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007,
++      0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa184,
++      0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb,
++      0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502,
++      0x0048, 0x2bdb, 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb,
++      0xa502, 0x0048, 0x2bdb, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020,
++      0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa384, 0x00ff, 0xa0e2,
++      0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb, 0xa484, 0xff00,
++      0x8007, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048, 0x2bdb,
++      0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2bdb, 0xa502, 0x0048,
++      0x2bdb, 0x2061, 0xa8a5, 0x6102, 0x6206, 0x630a, 0x640e, 0x0078,
++      0x2bad, 0x007e, 0x2001, 0xa653, 0x2004, 0xd0cc, 0x007f, 0x007c,
++      0x007e, 0x2001, 0xa672, 0x2004, 0xd0bc, 0x007f, 0x007c, 0x6164,
++      0x7a24, 0x6300, 0x82ff, 0x00c0, 0x3830, 0x7926, 0x0078, 0x2bad,
++      0x83ff, 0x00c0, 0x2bdb, 0x2001, 0xfff0, 0xa200, 0x00c8, 0x2bdb,
++      0x2019, 0xffff, 0x6068, 0xa302, 0xa200, 0x0048, 0x2bdb, 0x7926,
++      0x6266, 0x0078, 0x2bad, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003,
++      0x00c0, 0x2bd7, 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x1078, 0x35ba,
++      0x0040, 0x2bd7, 0x2009, 0x0000, 0x2019, 0x0000, 0x7023, 0x0000,
++      0x702f, 0x0000, 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0, 0xa735,
++      0x2c64, 0x8cff, 0x0040, 0x387d, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x0040, 0x3872, 0x6004, 0xa084, 0xff00, 0xa086, 0x0600,
++      0x00c0, 0x387d, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105,
++      0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff,
++      0x0040, 0x3888, 0xa386, 0x002a, 0x0040, 0x3891, 0x0078, 0x385e,
++      0x83ff, 0x00c0, 0x388f, 0x7120, 0x810c, 0x0078, 0x2bad, 0x702f,
++      0x0001, 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, 0xa6d2, 0x6007,
++      0x0000, 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732,
++      0x2c10, 0x1078, 0x13db, 0x7007, 0x0002, 0x701b, 0x38a8, 0x007c,
++      0x702c, 0xa005, 0x00c0, 0x38b9, 0x711c, 0x7024, 0x20a0, 0x2019,
++      0x0000, 0x2061, 0xa6d2, 0x6424, 0x6528, 0x662c, 0x6730, 0x0078,
++      0x385e, 0x7120, 0x810c, 0x0078, 0x2bad, 0x81ff, 0x00c0, 0x2bd7,
++      0x60cc, 0xd09c, 0x0040, 0x2bd7, 0x1078, 0x35ba, 0x0040, 0x2bd7,
++      0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b,
++      0x38d2, 0x007c, 0x0d7e, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000,
++      0x0040, 0x38e5, 0xa0be, 0x7100, 0x0040, 0x38e5, 0xa0be, 0x7200,
++      0x0040, 0x38e5, 0x0d7f, 0x0078, 0x2bdb, 0x6820, 0x6924, 0x1078,
++      0x254d, 0x00c0, 0x3910, 0x1078, 0x455c, 0x00c0, 0x3910, 0x7122,
++      0x6612, 0x6516, 0x6e18, 0x0c7e, 0x1078, 0x35ba, 0x0040, 0x3910,
++      0x1078, 0x35ba, 0x0040, 0x3910, 0x0c7f, 0x0d7f, 0x6837, 0x0000,
++      0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x1078,
++      0x8e82, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3913, 0x007c,
++      0x0d7f, 0x0078, 0x2bd7, 0x7120, 0x1078, 0x298e, 0x6820, 0xa086,
++      0x8001, 0x0040, 0x2bd7, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002,
++      0x007e, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x1078, 0x4281, 0x007f,
++      0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xa6d2,
++      0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x00c0, 0x393a,
++      0x0078, 0x393e, 0xa7c6, 0x7100, 0x00c0, 0x3946, 0xa6c2, 0x0004,
++      0x0048, 0x2bdb, 0x2009, 0x0004, 0x0078, 0x3608, 0xa7c6, 0x7200,
++      0x00c0, 0x2bdb, 0xa6c2, 0x0054, 0x0048, 0x2bdb, 0x600e, 0x6013,
++      0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13db,
++      0x7007, 0x0002, 0x701b, 0x395d, 0x007c, 0x701c, 0x2068, 0x6804,
++      0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x007e, 0x20a9, 0x002a,
++      0x2098, 0x20a0, 0x1078, 0x4281, 0x007f, 0x2009, 0x002a, 0x2061,
++      0xa6d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x3608, 0x81ff,
++      0x00c0, 0x2bd7, 0x792c, 0x2001, 0xa89d, 0x2102, 0x1078, 0x35d2,
++      0x0040, 0x2bdb, 0x1078, 0x4673, 0x0040, 0x2bd7, 0x127e, 0x2091,
++      0x8000, 0x1078, 0x47de, 0x127f, 0x0078, 0x2bad, 0x7824, 0xd08c,
++      0x00c0, 0x3995, 0xd084, 0x0040, 0x31da, 0x1078, 0x35e4, 0x0040,
++      0x2bdb, 0x0c7e, 0x1078, 0x35ba, 0x0c7f, 0x00c0, 0x39a3, 0x2009,
++      0x0002, 0x0078, 0x2bd7, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++      0x0040, 0x39b0, 0xa08e, 0x0004, 0x0040, 0x39b0, 0xa08e, 0x0005,
++      0x00c0, 0x39dd, 0x7824, 0xd08c, 0x0040, 0x39bb, 0x6000, 0xc08c,
++      0x6002, 0x0078, 0x39c5, 0x2001, 0xa653, 0x2004, 0xd0b4, 0x0040,
++      0x320f, 0x6000, 0xd08c, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6838,
++      0xc0fd, 0x683a, 0x1078, 0x8e9e, 0x00c0, 0x39d2, 0x2009, 0x0003,
++      0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x39d7, 0x007c, 0x1078,
++      0x35e4, 0x0040, 0x2bdb, 0x0078, 0x320f, 0x2009, 0xa62f, 0x210c,
++      0x81ff, 0x0040, 0x39e7, 0x2009, 0x0001, 0x0078, 0x2bd7, 0x2001,
++      0xa600, 0x2004, 0xa086, 0x0003, 0x0040, 0x39f2, 0x2009, 0x0007,
++      0x0078, 0x2bd7, 0x2001, 0xa653, 0x2004, 0xd0ac, 0x0040, 0x39fc,
++      0x2009, 0x0008, 0x0078, 0x2bd7, 0x609c, 0xd0a4, 0x00c0, 0x3a03,
++      0xd0ac, 0x00c0, 0x320f, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838,
++      0xc0fd, 0x683a, 0x1078, 0x8f12, 0x00c0, 0x3a12, 0x2009, 0x0003,
++      0x0078, 0x2bd7, 0x7007, 0x0003, 0x701b, 0x3a17, 0x007c, 0x6830,
++      0xa086, 0x0100, 0x00c0, 0x3a20, 0x2009, 0x0004, 0x0078, 0x2bd7,
++      0x1078, 0x35e4, 0x0040, 0x2bdb, 0x0078, 0x39b2, 0x81ff, 0x2009,
++      0x0001, 0x00c0, 0x2bd7, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007,
++      0x00c0, 0x2bd7, 0x2001, 0xa653, 0x2004, 0xd0ac, 0x2009, 0x0008,
++      0x00c0, 0x2bd7, 0x1078, 0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084,
++      0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e,
++      0x1078, 0x35ba, 0x0c7f, 0x2009, 0x0002, 0x0040, 0x2bd7, 0x6837,
++      0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194,
++      0xff00, 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x00c0, 0x3a65, 0xc0ed,
++      0x6952, 0x792c, 0x6956, 0x0078, 0x3a6e, 0xa28e, 0x0100, 0x00c0,
++      0x2bdb, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x1078,
++      0x90bd, 0x2009, 0x0003, 0x0040, 0x2bd7, 0x7007, 0x0003, 0x701b,
++      0x3a7a, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0040,
++      0x2bd7, 0x0078, 0x2bad, 0x81ff, 0x2009, 0x0001, 0x00c0, 0x2bd7,
++      0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x00c0, 0x2bd7, 0x1078,
++      0x35e4, 0x0040, 0x2bdb, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
++      0x2009, 0x0009, 0x00c0, 0x2bd7, 0x0c7e, 0x1078, 0x35ba, 0x0c7f,
++      0x2009, 0x0002, 0x0040, 0x2bd7, 0xad80, 0x000f, 0x2009, 0x0008,
++      0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3604, 0x701b, 0x3ab1,
++      0x007c, 0x0d7e, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x00c0,
++      0x3ac4, 0x6804, 0xa005, 0x00c0, 0x3ac4, 0x6808, 0xa084, 0xff00,
++      0x00c0, 0x3ac4, 0x0078, 0x3ac7, 0x0d7f, 0x00c0, 0x2bdb, 0x0d7f,
++      0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x0c7e,
++      0x1078, 0x35e4, 0x00c0, 0x3ad7, 0x0c7f, 0x0078, 0x2bdb, 0x1078,
++      0x9119, 0x2009, 0x0003, 0x0c7f, 0x0040, 0x2bd7, 0x7007, 0x0003,
++      0x701b, 0x3ae3, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004,
++      0x0040, 0x2bd7, 0x0078, 0x2bad, 0x127e, 0x0c7e, 0x0e7e, 0x2061,
++      0x0100, 0x2071, 0xa600, 0x6044, 0xd0a4, 0x00c0, 0x3b15, 0xd084,
++      0x0040, 0x3afe, 0x1078, 0x3c75, 0x0078, 0x3b11, 0xd08c, 0x0040,
++      0x3b05, 0x1078, 0x3b8c, 0x0078, 0x3b11, 0xd094, 0x0040, 0x3b0c,
++      0x1078, 0x3b60, 0x0078, 0x3b11, 0xd09c, 0x0040, 0x3b11, 0x1078,
++      0x3b1f, 0x0e7f, 0x0c7f, 0x127f, 0x007c, 0x017e, 0x6128, 0xd19c,
++      0x00c0, 0x3b1c, 0xc19d, 0x612a, 0x017f, 0x0078, 0x3b11, 0x624c,
++      0xa286, 0xf0f0, 0x00c0, 0x3b30, 0x6048, 0xa086, 0xf0f0, 0x0040,
++      0x3b30, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x3b5f,
++      0xa294, 0xff00, 0xa296, 0xf700, 0x0040, 0x3b45, 0x7134, 0xd1a4,
++      0x00c0, 0x3b45, 0x6240, 0xa294, 0x0010, 0x0040, 0x3b45, 0x2009,
++      0x00f7, 0x1078, 0x42a1, 0x0078, 0x3b5f, 0x6043, 0x0040, 0x6043,
++      0x0000, 0x7077, 0x0000, 0x708f, 0x0001, 0x70b3, 0x0000, 0x70cf,
++      0x0000, 0x2009, 0xacc0, 0x200b, 0x0000, 0x7087, 0x0000, 0x707b,
++      0x000f, 0x2009, 0x000f, 0x2011, 0x41d5, 0x1078, 0x5add, 0x007c,
++      0x157e, 0x7078, 0xa005, 0x00c0, 0x3b8a, 0x2011, 0x41d5, 0x1078,
++      0x5a45, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9,
++      0x00c8, 0x6044, 0xd08c, 0x00c0, 0x3b83, 0x00f0, 0x3b71, 0x6242,
++      0x708b, 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042,
++      0x6242, 0x0078, 0x3b8a, 0x6242, 0x708b, 0x0000, 0x707f, 0x0000,
++      0x0078, 0x3b8a, 0x157f, 0x007c, 0x707c, 0xa08a, 0x0003, 0x00c8,
++      0x3b95, 0x1079, 0x3b98, 0x0078, 0x3b97, 0x1078, 0x1332, 0x007c,
++      0x3b9b, 0x3bea, 0x3c74, 0x0f7e, 0x707f, 0x0001, 0x20e1, 0xa000,
++      0x20e1, 0x8700, 0x1078, 0x21f7, 0x20e1, 0x9080, 0x20e1, 0x4000,
++      0x2079, 0xab00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000,
++      0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000,
++      0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000,
++      0x782f, 0x0000, 0x2079, 0xab0c, 0x207b, 0x1101, 0x7807, 0x0000,
++      0x2099, 0xa605, 0x20a1, 0xab0e, 0x20a9, 0x0004, 0x53a3, 0x2079,
++      0xab12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0xab00, 0x20a1,
++      0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000,
++      0x1078, 0x420b, 0x0f7f, 0x7083, 0x0000, 0x6043, 0x0008, 0x6043,
++      0x0000, 0x007c, 0x0d7e, 0x7080, 0x7083, 0x0000, 0xa025, 0x0040,
++      0x3c5e, 0x6020, 0xd0b4, 0x00c0, 0x3c5c, 0x718c, 0x81ff, 0x0040,
++      0x3c4b, 0xa486, 0x000c, 0x00c0, 0x3c56, 0xa480, 0x0018, 0x8004,
++      0x20a8, 0x2011, 0xab80, 0x2019, 0xab00, 0x220c, 0x2304, 0xa106,
++      0x00c0, 0x3c22, 0x8210, 0x8318, 0x00f0, 0x3c05, 0x6043, 0x0004,
++      0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x707f, 0x0002,
++      0x708b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078, 0x5add,
++      0x0078, 0x3c5c, 0x2069, 0xab80, 0x6930, 0xa18e, 0x1101, 0x00c0,
++      0x3c56, 0x6834, 0xa005, 0x00c0, 0x3c56, 0x6900, 0xa18c, 0x00ff,
++      0x00c0, 0x3c36, 0x6804, 0xa005, 0x0040, 0x3c4b, 0x2011, 0xab8e,
++      0x2019, 0xa605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0048,
++      0x3c49, 0x00c0, 0x3c56, 0x8210, 0x8318, 0x00f0, 0x3c3c, 0x0078,
++      0x3c56, 0x708f, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++      0xab80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008,
++      0x6043, 0x0000, 0x0078, 0x3c5e, 0x0d7f, 0x007c, 0x6020, 0xd0b4,
++      0x00c0, 0x3c5c, 0x60c3, 0x000c, 0x2011, 0xa8bb, 0x2013, 0x0000,
++      0x7083, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++      0x1078, 0x6e06, 0x0078, 0x3c5c, 0x007c, 0x7088, 0xa08a, 0x001d,
++      0x00c8, 0x3c7e, 0x1079, 0x3c81, 0x0078, 0x3c80, 0x1078, 0x1332,
++      0x007c, 0x3cab, 0x3cba, 0x3ce9, 0x3d02, 0x3d2e, 0x3d5a, 0x3d86,
++      0x3dbc, 0x3de8, 0x3e10, 0x3e53, 0x3e7d, 0x3e9f, 0x3eb5, 0x3edb,
++      0x3eee, 0x3ef7, 0x3f2b, 0x3f57, 0x3f83, 0x3faf, 0x3fe5, 0x4030,
++      0x405f, 0x4081, 0x40c3, 0x40e9, 0x4102, 0x4103, 0x0c7e, 0x2061,
++      0xa600, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9,
++      0x6006, 0x0c7f, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043,
++      0x0002, 0x708b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x41dc, 0x1078,
++      0x5add, 0x007c, 0x0f7e, 0x7080, 0xa086, 0x0014, 0x00c0, 0x3ce7,
++      0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3ce7, 0x2079, 0xab80,
++      0x7a30, 0xa296, 0x1102, 0x00c0, 0x3ce5, 0x7834, 0xa005, 0x00c0,
++      0x3ce5, 0x7a38, 0xd2fc, 0x0040, 0x3cdb, 0x70b0, 0xa005, 0x00c0,
++      0x3cdb, 0x70b3, 0x0001, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x708b,
++      0x0010, 0x1078, 0x3ef7, 0x0078, 0x3ce7, 0x1078, 0x4224, 0x0f7f,
++      0x007c, 0x708b, 0x0003, 0x6043, 0x0004, 0x2011, 0x41dc, 0x1078,
++      0x5a45, 0x1078, 0x4289, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9,
++      0x000a, 0x20a3, 0x0000, 0x00f0, 0x3cf9, 0x60c3, 0x0014, 0x1078,
++      0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d2c, 0x2011,
++      0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d2a, 0x2079,
++      0xab80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3d2a, 0x7834, 0xa005,
++      0x00c0, 0x3d2a, 0x7a38, 0xd2fc, 0x0040, 0x3d24, 0x70b0, 0xa005,
++      0x00c0, 0x3d24, 0x70b3, 0x0001, 0x708b, 0x0004, 0x1078, 0x3d2e,
++      0x0078, 0x3d2c, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0005,
++      0x1078, 0x4289, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011,
++      0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3d4c, 0x7074, 0xa005, 0x00c0,
++      0x3d4c, 0x7150, 0xa186, 0xffff, 0x0040, 0x3d4c, 0x1078, 0x419d,
++      0x0040, 0x3d4c, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298, 0x26a0,
++      0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++      0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3d84, 0x2011,
++      0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3d82, 0x2079,
++      0xab80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3d82, 0x7834, 0xa005,
++      0x00c0, 0x3d82, 0x7a38, 0xd2fc, 0x0040, 0x3d7c, 0x70b0, 0xa005,
++      0x00c0, 0x3d7c, 0x70b3, 0x0001, 0x708b, 0x0006, 0x1078, 0x3d86,
++      0x0078, 0x3d84, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b, 0x0007,
++      0x1078, 0x4289, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011,
++      0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3dae, 0x7074, 0xa005, 0x00c0,
++      0x3dae, 0x7154, 0xa186, 0xffff, 0x0040, 0x3dae, 0xa180, 0x29c0,
++      0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040, 0x3dae,
++      0x1078, 0x3820, 0x0040, 0x3dae, 0x1078, 0x256a, 0x20a9, 0x0008,
++      0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++      0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040,
++      0x3de6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0,
++      0x3de4, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3de4,
++      0x7834, 0xa005, 0x00c0, 0x3de4, 0x7a38, 0xd2fc, 0x0040, 0x3dde,
++      0x70b0, 0xa005, 0x00c0, 0x3dde, 0x70b3, 0x0001, 0x708b, 0x0008,
++      0x1078, 0x3de8, 0x0078, 0x3de6, 0x1078, 0x4224, 0x0f7f, 0x007c,
++      0x708b, 0x0009, 0x1078, 0x4289, 0x20a3, 0x1105, 0x20a3, 0x0100,
++      0x3430, 0x1078, 0x42d4, 0x00c0, 0x3e01, 0x7074, 0xa005, 0x00c0,
++      0x3e01, 0x1078, 0x4104, 0x00c0, 0x3e0b, 0xa085, 0x0001, 0x1078,
++      0x256a, 0x20a9, 0x0008, 0x2099, 0xab8e, 0x26a0, 0x53a6, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c,
++      0x0f7e, 0x7080, 0xa005, 0x0040, 0x3e51, 0x2011, 0x41dc, 0x1078,
++      0x5a45, 0xa086, 0x0014, 0x00c0, 0x3e4f, 0x2079, 0xab80, 0x7a30,
++      0xa296, 0x1105, 0x00c0, 0x3e4f, 0x7834, 0x2011, 0x0100, 0xa21e,
++      0x00c0, 0x3e3a, 0x7a38, 0xd2fc, 0x0040, 0x3e34, 0x70b0, 0xa005,
++      0x00c0, 0x3e34, 0x70b3, 0x0001, 0x708b, 0x000a, 0x1078, 0x3e53,
++      0x0078, 0x3e51, 0xa005, 0x00c0, 0x3e4f, 0x7a38, 0xd2fc, 0x0040,
++      0x3e47, 0x70b0, 0xa005, 0x00c0, 0x3e47, 0x70b3, 0x0001, 0x7087,
++      0x0000, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3e51, 0x1078,
++      0x4224, 0x0f7f, 0x007c, 0x708b, 0x000b, 0x2011, 0xab0e, 0x22a0,
++      0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009,
++      0x0000, 0x41a4, 0x1078, 0x4289, 0x20a3, 0x1106, 0x20a3, 0x0000,
++      0x1078, 0x42d4, 0x0040, 0x3e70, 0x2013, 0x0000, 0x0078, 0x3e74,
++      0x6030, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6,
++      0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++      0x0040, 0x3e9d, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084,
++      0x00c0, 0x3e9b, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1106, 0x00c0,
++      0x3e9b, 0x7834, 0xa005, 0x00c0, 0x3e9b, 0x708b, 0x000c, 0x1078,
++      0x3e9f, 0x0078, 0x3e9d, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++      0x000d, 0x1078, 0x4289, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099,
++      0xab8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0084, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++      0x0040, 0x3ed9, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084,
++      0x00c0, 0x3ed7, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1107, 0x00c0,
++      0x3ed7, 0x7834, 0xa005, 0x00c0, 0x3ed7, 0x7087, 0x0001, 0x1078,
++      0x427b, 0x708b, 0x000e, 0x1078, 0x3edb, 0x0078, 0x3ed9, 0x1078,
++      0x4224, 0x0f7f, 0x007c, 0x708b, 0x000f, 0x7083, 0x0000, 0x608b,
++      0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009,
++      0x07d0, 0x2011, 0x41dc, 0x1078, 0x5a38, 0x007c, 0x7080, 0xa005,
++      0x0040, 0x3ef6, 0x2011, 0x41dc, 0x1078, 0x5a45, 0x007c, 0x708b,
++      0x0011, 0x1078, 0x42d4, 0x00c0, 0x3f14, 0x716c, 0x81ff, 0x0040,
++      0x3f14, 0x2009, 0x0000, 0x7070, 0xa084, 0x00ff, 0x1078, 0x254d,
++      0xa186, 0x007e, 0x0040, 0x3f14, 0xa186, 0x0080, 0x0040, 0x3f14,
++      0x2011, 0xab8e, 0x1078, 0x419d, 0x20e1, 0x9080, 0x20e1, 0x4000,
++      0x2099, 0xab80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080,
++      0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014,
++      0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3f55,
++      0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3f53,
++      0x2079, 0xab80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3f53, 0x7834,
++      0xa005, 0x00c0, 0x3f53, 0x7a38, 0xd2fc, 0x0040, 0x3f4d, 0x70b0,
++      0xa005, 0x00c0, 0x3f4d, 0x70b3, 0x0001, 0x708b, 0x0012, 0x1078,
++      0x3f57, 0x0078, 0x3f55, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++      0x0013, 0x1078, 0x4295, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430,
++      0x2011, 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3f75, 0x7074, 0xa005,
++      0x00c0, 0x3f75, 0x7150, 0xa186, 0xffff, 0x0040, 0x3f75, 0x1078,
++      0x419d, 0x0040, 0x3f75, 0x1078, 0x42b8, 0x20a9, 0x0008, 0x2298,
++      0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
++      0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x3fad,
++      0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014, 0x00c0, 0x3fab,
++      0x2079, 0xab80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3fab, 0x7834,
++      0xa005, 0x00c0, 0x3fab, 0x7a38, 0xd2fc, 0x0040, 0x3fa5, 0x70b0,
++      0xa005, 0x00c0, 0x3fa5, 0x70b3, 0x0001, 0x708b, 0x0014, 0x1078,
++      0x3faf, 0x0078, 0x3fad, 0x1078, 0x4224, 0x0f7f, 0x007c, 0x708b,
++      0x0015, 0x1078, 0x4295, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430,
++      0x2011, 0xab8e, 0x1078, 0x42d4, 0x00c0, 0x3fd7, 0x7074, 0xa005,
++      0x00c0, 0x3fd7, 0x7154, 0xa186, 0xffff, 0x0040, 0x3fd7, 0xa180,
++      0x29c0, 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x419d, 0x0040,
++      0x3fd7, 0x1078, 0x3820, 0x0040, 0x3fd7, 0x1078, 0x256a, 0x20a9,
++      0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005,
++      0x0040, 0x402e, 0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0014,
++      0x00c0, 0x402c, 0x2079, 0xab80, 0x7a30, 0xa296, 0x1105, 0x00c0,
++      0x402c, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, 0x400b, 0x7a38,
++      0xd2fc, 0x0040, 0x4009, 0x70b0, 0xa005, 0x00c0, 0x4009, 0x70b3,
++      0x0001, 0x0078, 0x401a, 0xa005, 0x00c0, 0x402c, 0x7a38, 0xd2fc,
++      0x0040, 0x4018, 0x70b0, 0xa005, 0x00c0, 0x4018, 0x70b3, 0x0001,
++      0x7087, 0x0000, 0x7a38, 0xd2f4, 0x0040, 0x4026, 0x2001, 0xa674,
++      0x2004, 0xd0a4, 0x00c0, 0x4026, 0x70cf, 0x0008, 0x708b, 0x0016,
++      0x1078, 0x4030, 0x0078, 0x402e, 0x1078, 0x4224, 0x0f7f, 0x007c,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xab80, 0x20a1, 0x020b,
++      0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xab8e, 0x708b, 0x0017,
++      0x1078, 0x42d4, 0x00c0, 0x4050, 0x7074, 0xa005, 0x00c0, 0x4050,
++      0x1078, 0x4104, 0x00c0, 0x405a, 0xa085, 0x0001, 0x1078, 0x256a,
++      0x20a9, 0x0008, 0x2099, 0xab8e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x420b, 0x007c, 0x0f7e,
++      0x7080, 0xa005, 0x0040, 0x407f, 0x2011, 0x41dc, 0x1078, 0x5a45,
++      0xa086, 0x0084, 0x00c0, 0x407d, 0x2079, 0xab80, 0x7a30, 0xa296,
++      0x1106, 0x00c0, 0x407d, 0x7834, 0xa005, 0x00c0, 0x407d, 0x708b,
++      0x0018, 0x1078, 0x4081, 0x0078, 0x407f, 0x1078, 0x4224, 0x0f7f,
++      0x007c, 0x708b, 0x0019, 0x1078, 0x4295, 0x20a3, 0x1106, 0x20a3,
++      0x0000, 0x3430, 0x2099, 0xab8e, 0x2039, 0xab0e, 0x27a0, 0x20a9,
++      0x0040, 0x53a3, 0x1078, 0x42d4, 0x00c0, 0x40b5, 0x2728, 0x2514,
++      0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007,
++      0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0xab0e, 0x2414,
++      0xa38c, 0x0001, 0x0040, 0x40b0, 0xa294, 0xff00, 0x0078, 0x40b3,
++      0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9,
++      0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084,
++      0x1078, 0x420b, 0x007c, 0x0f7e, 0x7080, 0xa005, 0x0040, 0x40e7,
++      0x2011, 0x41dc, 0x1078, 0x5a45, 0xa086, 0x0084, 0x00c0, 0x40e5,
++      0x2079, 0xab80, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x40e5, 0x7834,
++      0xa005, 0x00c0, 0x40e5, 0x7087, 0x0001, 0x1078, 0x427b, 0x708b,
++      0x001a, 0x1078, 0x40e9, 0x0078, 0x40e7, 0x1078, 0x4224, 0x0f7f,
++      0x007c, 0x708b, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++      0xab80, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, 0x0007,
++      0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078,
++      0x420b, 0x007c, 0x007c, 0x007c, 0x087e, 0x097e, 0x2029, 0xa653,
++      0x252c, 0x20a9, 0x0008, 0x2041, 0xab0e, 0x28a0, 0x2099, 0xab8e,
++      0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0040, 0x411a,
++      0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0,
++      0x412c, 0xd5d4, 0x0040, 0x4127, 0x8210, 0x0078, 0x4128, 0x8211,
++      0x00f0, 0x411a, 0x0078, 0x4194, 0x82ff, 0x00c0, 0x413e, 0xd5d4,
++      0x0040, 0x4138, 0xa1a6, 0x3fff, 0x0040, 0x4124, 0x0078, 0x413c,
++      0xa1a6, 0x3fff, 0x0040, 0x4194, 0xa18d, 0xc000, 0x20a9, 0x0010,
++      0x2019, 0x0001, 0xd5d4, 0x0040, 0x4147, 0x2019, 0x0010, 0x2120,
++      0xd5d4, 0x0040, 0x414e, 0x8423, 0x0078, 0x414f, 0x8424, 0x00c8,
++      0x415c, 0xd5d4, 0x0040, 0x4157, 0x8319, 0x0078, 0x4158, 0x8318,
++      0x00f0, 0x4148, 0x0078, 0x4194, 0x23a8, 0x2021, 0x0001, 0x8426,
++      0x8425, 0x00f0, 0x4160, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040,
++      0x4174, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8,
++      0xa5a8, 0x0010, 0x00f0, 0x4170, 0x7552, 0xa5c8, 0x29c0, 0x292c,
++      0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000,
++      0x7572, 0x2018, 0x2304, 0xa405, 0x201a, 0x7077, 0x0001, 0x26a0,
++      0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0xa085, 0x0001, 0x0078, 0x419a, 0xa006, 0x0078, 0x419a, 0xa006,
++      0x1078, 0x1332, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021, 0x0000,
++      0x2001, 0x0007, 0xa39a, 0x0010, 0x0048, 0x41aa, 0x8420, 0x8001,
++      0x0078, 0x41a2, 0x2118, 0x84ff, 0x0040, 0x41b3, 0xa39a, 0x0010,
++      0x8421, 0x00c0, 0x41ae, 0x2021, 0x0001, 0x83ff, 0x0040, 0x41bc,
++      0x8423, 0x8319, 0x00c0, 0x41b8, 0xa238, 0x2704, 0xa42c, 0x00c0,
++      0x41d4, 0xa405, 0x203a, 0x7152, 0xa1a0, 0x29c0, 0x242c, 0xa5ac,
++      0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0000, 0x7572,
++      0x7077, 0x0001, 0xa084, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa600,
++      0x707b, 0x0000, 0x0e7f, 0x007c, 0x0e7e, 0x0f7e, 0x2001, 0x0002,
++      0x1078, 0x5ae6, 0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x6e0f,
++      0x7004, 0xa084, 0x4000, 0x0040, 0x41f1, 0x7003, 0x1000, 0x7003,
++      0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0xa622, 0x2073, 0x0000,
++      0x7840, 0x027e, 0x017e, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x017f,
++      0xa094, 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, 0x027f, 0x127f,
++      0x0f7f, 0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0xa8bb,
++      0x2013, 0x0000, 0x7083, 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3,
++      0x0056, 0x60a7, 0x9575, 0x1078, 0x6e06, 0x2009, 0x07d0, 0x2011,
++      0x41dc, 0x1078, 0x5add, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e,
++      0x2091, 0x8000, 0x2011, 0x0003, 0x1078, 0x70e0, 0x2011, 0x0002,
++      0x1078, 0x70ea, 0x1078, 0x6fc4, 0x037e, 0x2019, 0x0000, 0x1078,
++      0x7058, 0x037f, 0x2009, 0x00f7, 0x1078, 0x42a1, 0x2061, 0xa8c4,
++      0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0xa600, 0x6003, 0x0001,
++      0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d,
++      0x2011, 0x4259, 0x1078, 0x5a38, 0x127f, 0x0c7f, 0x027f, 0x017f,
++      0x007c, 0x0e7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2001, 0x0001,
++      0x1078, 0x5ae6, 0x2071, 0x0100, 0x1078, 0x6e0f, 0x2071, 0x0140,
++      0x7004, 0xa084, 0x4000, 0x0040, 0x4271, 0x7003, 0x1000, 0x7003,
++      0x0000, 0x2001, 0x0001, 0x1078, 0x24e8, 0x1078, 0x4224, 0x127f,
++      0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1, 0xacc0, 0x2099,
++      0xab8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x00f0, 0x4281,
++      0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xab00, 0x20a1,
++      0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x2099, 0xab80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6,
++      0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f, 0x2001, 0xa62f,
++      0x2004, 0xa005, 0x00c0, 0x42b2, 0x6030, 0xa084, 0x00ff, 0xa105,
++      0x0078, 0x42b4, 0xa185, 0x00f7, 0x604a, 0x007f, 0x0c7f, 0x007c,
++      0x017e, 0x047e, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x42cb,
++      0xa006, 0x2020, 0x2009, 0x002a, 0x1078, 0xa21d, 0x2001, 0xa60c,
++      0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x1078,
++      0x284f, 0x047f, 0x017f, 0x007c, 0x007e, 0x2001, 0xa60c, 0x2004,
++      0xd09c, 0x0040, 0x42db, 0x007f, 0x007c, 0x007e, 0x017e, 0x127e,
++      0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102,
++      0x127f, 0x017f, 0x007f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009,
++      0xa735, 0xa006, 0x200a, 0x8108, 0x00f0, 0x42f2, 0x157f, 0x007c,
++      0x0d7e, 0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0xa652, 0xa006,
++      0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x29c0,
++      0x231c, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006,
++      0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4,
++      0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062,
++      0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082,
++      0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae,
++      0x61a2, 0x0d7e, 0x60a4, 0xa06d, 0x0040, 0x4338, 0x1078, 0x13a4,
++      0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0040, 0x4340, 0x1078, 0x13a4,
++      0x60ab, 0x0000, 0x0d7f, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c,
++      0x6046, 0x6814, 0xa084, 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f,
++      0x037f, 0x0d7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48,
++      0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, 0x4424, 0xa18c, 0xff00,
++      0x810f, 0xa182, 0x00ff, 0x00c8, 0x442a, 0x2001, 0xa60c, 0x2004,
++      0xa084, 0x0003, 0x0040, 0x4385, 0x2001, 0xa60c, 0x2004, 0xd084,
++      0x00c0, 0x4405, 0xa188, 0xa735, 0x2104, 0xa065, 0x0040, 0x4405,
++      0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x4405, 0x6000,
++      0xd0c4, 0x0040, 0x4405, 0x0078, 0x4392, 0xa188, 0xa735, 0x2104,
++      0xa065, 0x0040, 0x43e9, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006,
++      0x00c0, 0x43ef, 0x60a4, 0xa00d, 0x0040, 0x439a, 0x1078, 0x4817,
++      0x0040, 0x43e3, 0x60a8, 0xa00d, 0x0040, 0x43b4, 0x1078, 0x486a,
++      0x00c0, 0x43b4, 0x694c, 0xd1fc, 0x00c0, 0x43aa, 0x1078, 0x44df,
++      0x0078, 0x43de, 0x1078, 0x4484, 0x694c, 0xd1ec, 0x00c0, 0x43de,
++      0x1078, 0x46d6, 0x0078, 0x43de, 0x694c, 0xa184, 0xa000, 0x0040,
++      0x43ce, 0xd1ec, 0x0040, 0x43c7, 0xd1fc, 0x0040, 0x43c3, 0x1078,
++      0x46e7, 0x0078, 0x43ca, 0x1078, 0x46e7, 0x0078, 0x43ce, 0xd1fc,
++      0x0040, 0x43ce, 0x1078, 0x4484, 0x0078, 0x43de, 0x6050, 0xa00d,
++      0x0040, 0x43d9, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0078,
++      0x43de, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x1078, 0x5da9,
++      0xa006, 0x127f, 0x007c, 0x2001, 0x0005, 0x2009, 0x0000, 0x0078,
++      0x442e, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078, 0x442e, 0xa082,
++      0x0006, 0x00c8, 0x4405, 0x60a0, 0xd0bc, 0x00c0, 0x4401, 0x6100,
++      0xd1fc, 0x0040, 0x4392, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078,
++      0x442e, 0x2001, 0x0028, 0x0078, 0x4420, 0x2009, 0xa60c, 0x210c,
++      0xd18c, 0x0040, 0x440f, 0x2001, 0x0004, 0x0078, 0x4420, 0xd184,
++      0x0040, 0x4416, 0x2001, 0x0004, 0x0078, 0x4420, 0x2001, 0x0029,
++      0x6100, 0xd1fc, 0x0040, 0x4420, 0x2009, 0x1000, 0x0078, 0x442e,
++      0x2009, 0x0000, 0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000,
++      0x0078, 0x442e, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x127f,
++      0x007c, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8,
++      0x447e, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8, 0x4464,
++      0xa188, 0xa735, 0x2104, 0xa065, 0x0040, 0x4464, 0x6004, 0xa084,
++      0x00ff, 0xa08e, 0x0006, 0x00c0, 0x446a, 0x684c, 0xd0ec, 0x0040,
++      0x4457, 0x1078, 0x46e7, 0x1078, 0x4484, 0x0078, 0x445f, 0x1078,
++      0x4484, 0x684c, 0xd0fc, 0x0040, 0x445f, 0x1078, 0x46d6, 0x1078,
++      0x472f, 0xa006, 0x0078, 0x4482, 0x2001, 0x0028, 0x2009, 0x0000,
++      0x0078, 0x4482, 0xa082, 0x0006, 0x00c8, 0x4478, 0x6100, 0xd1fc,
++      0x0040, 0x444d, 0x2001, 0x0029, 0x2009, 0x1000, 0x0078, 0x4482,
++      0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x4482, 0x2001, 0x0029,
++      0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050,
++      0xa00d, 0x0040, 0x4492, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
++      0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078,
++      0x4490, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x44af,
++      0x0e7e, 0x2071, 0xa8b1, 0x7004, 0xa086, 0x0002, 0x0040, 0x44b6,
++      0x0e7f, 0x604c, 0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00,
++      0x6052, 0x604e, 0x6803, 0x0000, 0x0078, 0x44ad, 0x701c, 0xac06,
++      0x00c0, 0x44a8, 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002,
++      0x0e7f, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x604c, 0xa06d,
++      0x0040, 0x44d1, 0x6800, 0xa005, 0x00c0, 0x44cf, 0x6052, 0x604e,
++      0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x44de, 0x6800,
++      0xa005, 0x00c0, 0x44dc, 0x6052, 0x604e, 0xad05, 0x007c, 0x6803,
++      0x0000, 0x6084, 0xa00d, 0x0040, 0x44e9, 0x2d00, 0x200a, 0x6086,
++      0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x44e8, 0x127e, 0x0c7e,
++      0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0040,
++      0x44fc, 0xc285, 0x0078, 0x44fd, 0xc284, 0x6202, 0x027f, 0x0c7f,
++      0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260,
++      0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, 0x4521, 0x609c, 0xd0ac,
++      0x0040, 0x4521, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x4521,
++      0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x00c0, 0x4521, 0x2011,
++      0x0600, 0x007f, 0xa294, 0xff00, 0xa215, 0x6206, 0x007e, 0xa086,
++      0x0006, 0x00c0, 0x4531, 0x6290, 0x82ff, 0x00c0, 0x4531, 0x1078,
++      0x1332, 0x007f, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091,
++      0x8000, 0x6218, 0x2260, 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0,
++      0x4553, 0x609c, 0xd0a4, 0x0040, 0x4553, 0x2001, 0xa653, 0x2004,
++      0xd0ac, 0x00c0, 0x4553, 0xa284, 0x00ff, 0xa086, 0x0007, 0x00c0,
++      0x4553, 0x2011, 0x0006, 0x007f, 0xa294, 0x00ff, 0x8007, 0xa215,
++      0x6206, 0x0c7f, 0x127f, 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048,
++      0x4565, 0xa085, 0x0001, 0x0078, 0x457d, 0xa190, 0xa735, 0x2204,
++      0xa065, 0x00c0, 0x457c, 0x017e, 0x0d7e, 0x1078, 0x1370, 0x2d60,
++      0x0d7f, 0x017f, 0x0040, 0x4561, 0x2c00, 0x2012, 0x60a7, 0x0000,
++      0x60ab, 0x0000, 0x1078, 0x42f8, 0xa006, 0x027f, 0x007c, 0x127e,
++      0x2091, 0x8000, 0x027e, 0xa182, 0x00ff, 0x0048, 0x458b, 0xa085,
++      0x0001, 0x0078, 0x45c1, 0x0d7e, 0xa190, 0xa735, 0x2204, 0xa06d,
++      0x0040, 0x45bf, 0x2013, 0x0000, 0x0d7e, 0x0c7e, 0x2d60, 0x60a4,
++      0xa06d, 0x0040, 0x459d, 0x1078, 0x13a4, 0x60a8, 0xa06d, 0x0040,
++      0x45a3, 0x1078, 0x13a4, 0x0c7f, 0x0d7f, 0x0d7e, 0x0c7e, 0x68ac,
++      0x2060, 0x8cff, 0x0040, 0x45bb, 0x600c, 0x007e, 0x6010, 0x2068,
++      0x1078, 0x8d06, 0x0040, 0x45b6, 0x1078, 0x13b4, 0x1078, 0x772d,
++      0x0c7f, 0x0078, 0x45a9, 0x0c7f, 0x0d7f, 0x1078, 0x13a4, 0x0d7f,
++      0xa006, 0x027f, 0x127f, 0x007c, 0x017e, 0xa182, 0x00ff, 0x0048,
++      0x45cd, 0xa085, 0x0001, 0x0078, 0x45d4, 0xa188, 0xa735, 0x2104,
++      0xa065, 0x0040, 0x45c9, 0xa006, 0x017f, 0x007c, 0x0d7e, 0x157e,
++      0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c,
++      0x6002, 0x2069, 0xab8e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138,
++      0xa10a, 0x0048, 0x45ec, 0x603a, 0x6814, 0x6066, 0x2099, 0xab96,
++      0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xab9a,
++      0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xabae,
++      0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076,
++      0x60a0, 0xa086, 0x007e, 0x00c0, 0x4611, 0x2069, 0xab8e, 0x690c,
++      0x616e, 0xa182, 0x0211, 0x00c8, 0x4619, 0x2009, 0x0008, 0x0078,
++      0x4643, 0xa182, 0x0259, 0x00c8, 0x4621, 0x2009, 0x0007, 0x0078,
++      0x4643, 0xa182, 0x02c1, 0x00c8, 0x4629, 0x2009, 0x0006, 0x0078,
++      0x4643, 0xa182, 0x0349, 0x00c8, 0x4631, 0x2009, 0x0005, 0x0078,
++      0x4643, 0xa182, 0x0421, 0x00c8, 0x4639, 0x2009, 0x0004, 0x0078,
++      0x4643, 0xa182, 0x0581, 0x00c8, 0x4641, 0x2009, 0x0003, 0x0078,
++      0x4643, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f,
++      0x007c, 0x017e, 0x027e, 0x0e7e, 0x2071, 0xab8d, 0x2e04, 0x6896,
++      0x2071, 0xab8e, 0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, 0x2009,
++      0xa672, 0x210c, 0xd0bc, 0x0040, 0x4663, 0xd1ec, 0x0040, 0x4663,
++      0xc2ad, 0x0078, 0x4664, 0xc2ac, 0xd0c4, 0x0040, 0x466d, 0xd1e4,
++      0x0040, 0x466d, 0xc2bd, 0x0078, 0x466e, 0xc2bc, 0x6a02, 0x0e7f,
++      0x027f, 0x017f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4,
++      0xa06d, 0x0040, 0x4697, 0x6900, 0x81ff, 0x00c0, 0x46ab, 0x6a04,
++      0xa282, 0x0010, 0x00c8, 0x46b0, 0xad88, 0x0004, 0x20a9, 0x0010,
++      0x2104, 0xa086, 0xffff, 0x0040, 0x4692, 0x8108, 0x00f0, 0x4688,
++      0x1078, 0x1332, 0x260a, 0x8210, 0x6a06, 0x0078, 0x46ab, 0x1078,
++      0x138b, 0x0040, 0x46b0, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88,
++      0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x46a3,
++      0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c,
++      0xa006, 0x0078, 0x46ad, 0x127e, 0x2091, 0x8000, 0x0d7e, 0x60a4,
++      0xa00d, 0x0040, 0x46d3, 0x2168, 0x6800, 0xa005, 0x00c0, 0x46cf,
++      0x1078, 0x4817, 0x00c0, 0x46d3, 0x200b, 0xffff, 0x6804, 0xa08a,
++      0x0002, 0x0048, 0x46cf, 0x8001, 0x6806, 0x0078, 0x46d3, 0x1078,
++      0x13a4, 0x60a7, 0x0000, 0x0d7f, 0x127f, 0x007c, 0x127e, 0x2091,
++      0x8000, 0x1078, 0x487f, 0x0078, 0x46df, 0x1078, 0x4484, 0x1078,
++      0x4775, 0x00c0, 0x46dd, 0x1078, 0x472f, 0x127f, 0x007c, 0x0d7e,
++      0x127e, 0x2091, 0x8000, 0x60a8, 0xa06d, 0x0040, 0x470b, 0x6950,
++      0x81ff, 0x00c0, 0x471f, 0x6a54, 0xa282, 0x0010, 0x00c8, 0x472c,
++      0xad88, 0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040,
++      0x4706, 0x8108, 0x00f0, 0x46fc, 0x1078, 0x1332, 0x260a, 0x8210,
++      0x6a56, 0x0078, 0x471f, 0x1078, 0x138b, 0x0040, 0x472c, 0x2d00,
++      0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b,
++      0xffff, 0x8108, 0x00f0, 0x4717, 0x6857, 0x0001, 0x6e62, 0x0078,
++      0x4723, 0x1078, 0x44df, 0x1078, 0x4739, 0x00c0, 0x4721, 0xa085,
++      0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x4729, 0x127e,
++      0x2091, 0x8000, 0x1078, 0x5da9, 0x127f, 0x007c, 0xa01e, 0x0078,
++      0x473b, 0x2019, 0x0001, 0xa00e, 0x127e, 0x2091, 0x8000, 0x604c,
++      0x2068, 0x6000, 0xd0dc, 0x00c0, 0x4759, 0x8dff, 0x0040, 0x4770,
++      0x83ff, 0x0040, 0x4751, 0x6848, 0xa606, 0x0040, 0x475e, 0x0078,
++      0x4759, 0x683c, 0xa406, 0x00c0, 0x4759, 0x6840, 0xa506, 0x0040,
++      0x475e, 0x2d08, 0x6800, 0x2068, 0x0078, 0x4745, 0x1078, 0x7233,
++      0x6a00, 0x604c, 0xad06, 0x00c0, 0x4768, 0x624e, 0x0078, 0x476b,
++      0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x4770, 0x6152, 0x8dff,
++      0x127f, 0x007c, 0xa01e, 0x0078, 0x4777, 0x2019, 0x0001, 0xa00e,
++      0x6080, 0x2068, 0x8dff, 0x0040, 0x47a3, 0x83ff, 0x0040, 0x4786,
++      0x6848, 0xa606, 0x0040, 0x4793, 0x0078, 0x478e, 0x683c, 0xa406,
++      0x00c0, 0x478e, 0x6840, 0xa506, 0x0040, 0x4793, 0x2d08, 0x6800,
++      0x2068, 0x0078, 0x477a, 0x6a00, 0x6080, 0xad06, 0x00c0, 0x479b,
++      0x6282, 0x0078, 0x479e, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0,
++      0x47a3, 0x6186, 0x8dff, 0x007c, 0xa016, 0x1078, 0x4810, 0x00c0,
++      0x47ab, 0x2011, 0x0001, 0x1078, 0x4863, 0x00c0, 0x47b1, 0xa295,
++      0x0002, 0x007c, 0x1078, 0x489b, 0x0040, 0x47ba, 0x1078, 0x8dca,
++      0x0078, 0x47bc, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040,
++      0x47c5, 0x1078, 0x8d62, 0x0078, 0x47c7, 0xa085, 0x0001, 0x007c,
++      0x1078, 0x489b, 0x0040, 0x47d0, 0x1078, 0x8dac, 0x0078, 0x47d2,
++      0xa085, 0x0001, 0x007c, 0x1078, 0x489b, 0x0040, 0x47db, 0x1078,
++      0x8d7e, 0x0078, 0x47dd, 0xa085, 0x0001, 0x007c, 0x1078, 0x489b,
++      0x0040, 0x47e6, 0x1078, 0x8de8, 0x0078, 0x47e8, 0xa085, 0x0001,
++      0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d,
++      0x0040, 0x4808, 0x6800, 0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847,
++      0x0000, 0x1078, 0x8f7d, 0x007e, 0x6000, 0xd0fc, 0x0040, 0x4802,
++      0x1078, 0xa4ed, 0x007f, 0x1078, 0x4a73, 0x007f, 0x0078, 0x47ef,
++      0x6083, 0x0000, 0x6087, 0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c,
++      0x60a4, 0xa00d, 0x00c0, 0x4817, 0xa085, 0x0001, 0x007c, 0x0e7e,
++      0x2170, 0x7000, 0xa005, 0x00c0, 0x482c, 0x20a9, 0x0010, 0xae88,
++      0x0004, 0x2104, 0xa606, 0x0040, 0x482c, 0x8108, 0x00f0, 0x4821,
++      0xa085, 0x0001, 0x0078, 0x482d, 0xa006, 0x0e7f, 0x007c, 0x0d7e,
++      0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0, 0x483d, 0x1078,
++      0x138b, 0x0040, 0x484f, 0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807,
++      0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108,
++      0x00f0, 0x4845, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006,
++      0x0078, 0x484c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d,
++      0x0040, 0x4860, 0x60a7, 0x0000, 0x1078, 0x13a4, 0xa085, 0x0001,
++      0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0, 0x486a, 0xa085,
++      0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005, 0x00c0, 0x487d,
++      0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0040, 0x487d,
++      0x8108, 0x00f0, 0x4874, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x127e,
++      0x2091, 0x8000, 0x1078, 0x4863, 0x00c0, 0x4899, 0x200b, 0xffff,
++      0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, 0x0048, 0x4894,
++      0x8001, 0x6856, 0x0078, 0x4898, 0x1078, 0x13a4, 0x60ab, 0x0000,
++      0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e, 0x71b0,
++      0x81ff, 0x00c0, 0x48b9, 0x71cc, 0xd19c, 0x0040, 0x48b9, 0x2001,
++      0x007e, 0xa080, 0xa735, 0x2004, 0xa07d, 0x0040, 0x48b9, 0x7804,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x48b9, 0x7800, 0xc0ed,
++      0x7802, 0x2079, 0xa652, 0x7804, 0xd0a4, 0x0040, 0x48df, 0x157e,
++      0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4,
++      0x00c0, 0x48d9, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004,
++      0x0040, 0x48d6, 0xa086, 0x0006, 0x00c0, 0x48d9, 0x6000, 0xc0ed,
++      0x6002, 0x017f, 0x8108, 0x00f0, 0x48c5, 0x0c7f, 0x157f, 0x1078,
++      0x4967, 0x0040, 0x48e8, 0x2001, 0xa8a1, 0x200c, 0x0078, 0x48f0,
++      0x2079, 0xa652, 0x7804, 0xd0a4, 0x0040, 0x48f4, 0x2009, 0x07d0,
++      0x2011, 0x48f6, 0x1078, 0x5add, 0x0f7f, 0x007c, 0x2011, 0x48f6,
++      0x1078, 0x5a45, 0x1078, 0x4967, 0x0040, 0x491e, 0x2001, 0xa7b3,
++      0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xa653,
++      0x2004, 0xd0a4, 0x0040, 0x4912, 0x2009, 0x07d0, 0x2011, 0x48f6,
++      0x1078, 0x5add, 0x0e7e, 0x2071, 0xa600, 0x706f, 0x0000, 0x7073,
++      0x0000, 0x1078, 0x2677, 0x0e7f, 0x0078, 0x4956, 0x157e, 0x0c7e,
++      0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x45c4, 0x00c0,
++      0x4950, 0x6000, 0xd0ec, 0x0040, 0x4950, 0x047e, 0x62a0, 0xa294,
++      0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0xa21d, 0x6000,
++      0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700,
++      0x6006, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e, 0x2039, 0x0000,
++      0x1078, 0x5e0a, 0x2009, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x047f,
++      0x017f, 0x8108, 0x00f0, 0x4924, 0x0c7f, 0x157f, 0x007c, 0x0c7e,
++      0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x7818,
++      0x2004, 0xd0ac, 0x007c, 0x7818, 0x2004, 0xd0bc, 0x007c, 0x0f7e,
++      0x2001, 0xa7b3, 0x2004, 0xa07d, 0x0040, 0x4970, 0x7800, 0xd0ec,
++      0x0f7f, 0x007c, 0x127e, 0x027e, 0x2091, 0x8000, 0x007e, 0x62a0,
++      0xa290, 0xa735, 0x2204, 0xac06, 0x10c0, 0x1332, 0x007f, 0x6200,
++      0xa005, 0x0040, 0x4986, 0xc2fd, 0x0078, 0x4987, 0xc2fc, 0x6202,
++      0x027f, 0x127f, 0x007c, 0x2011, 0xa633, 0x2204, 0xd0cc, 0x0040,
++      0x4998, 0x2001, 0xa89f, 0x200c, 0x2011, 0x4999, 0x1078, 0x5add,
++      0x007c, 0x2011, 0x4999, 0x1078, 0x5a45, 0x2011, 0xa633, 0x2204,
++      0xc0cc, 0x2012, 0x007c, 0x2071, 0xa714, 0x7003, 0x0001, 0x7007,
++      0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f,
++      0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b,
++      0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xa87d, 0x7003,
++      0xa714, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xa85d, 0x7013,
++      0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x007c, 0x017e, 0x0e7e,
++      0x2071, 0xa835, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001,
++      0xa653, 0x2004, 0xd0fc, 0x00c0, 0x49e8, 0x2001, 0xa653, 0x2004,
++      0xa00e, 0xd09c, 0x0040, 0x49e5, 0x8108, 0x7102, 0x0078, 0x4a3b,
++      0x2001, 0xa672, 0x200c, 0xa184, 0x000f, 0x2009, 0xa673, 0x210c,
++      0x0079, 0x49f2, 0x49dd, 0x4a13, 0x4a1b, 0x4a26, 0x4a2c, 0x49dd,
++      0x49dd, 0x49dd, 0x4a02, 0x49dd, 0x49dd, 0x49dd, 0x49dd, 0x49dd,
++      0x49dd, 0x49dd, 0x7003, 0x0004, 0x137e, 0x147e, 0x157e, 0x2099,
++      0xa676, 0x20a1, 0xa886, 0x20a9, 0x0004, 0x53a3, 0x157f, 0x147f,
++      0x137f, 0x0078, 0x4a3b, 0x708f, 0x0005, 0x7007, 0x0122, 0x2001,
++      0x0002, 0x0078, 0x4a21, 0x708f, 0x0002, 0x7007, 0x0121, 0x2001,
++      0x0003, 0x7002, 0x7097, 0x0001, 0x0078, 0x4a38, 0x7007, 0x0122,
++      0x2001, 0x0002, 0x0078, 0x4a30, 0x7007, 0x0121, 0x2001, 0x0003,
++      0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, 0x709a,
++      0xa184, 0x00ff, 0x7092, 0x0e7f, 0x017f, 0x007c, 0x0e7e, 0x2071,
++      0xa714, 0x684c, 0xa005, 0x00c0, 0x4a4c, 0x7028, 0xc085, 0x702a,
++      0xa085, 0x0001, 0x0078, 0x4a71, 0x6a60, 0x7236, 0x6b64, 0x733a,
++      0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e,
++      0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007,
++      0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100,
++      0xa319, 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001,
++      0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x027e, 0x6838, 0xd0fc, 0x00c0,
++      0x4ac9, 0x6804, 0xa00d, 0x0040, 0x4a8f, 0x0d7e, 0x2071, 0xa600,
++      0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
++      0x00c0, 0x4a82, 0x702e, 0x70ac, 0xa200, 0x70ae, 0x0d7f, 0x2071,
++      0xa714, 0x701c, 0xa005, 0x00c0, 0x4adb, 0x0068, 0x4ad9, 0x2071,
++      0xa835, 0x7200, 0x82ff, 0x0040, 0x4ad9, 0x6934, 0xa186, 0x0103,
++      0x00c0, 0x4aec, 0x6948, 0x6844, 0xa105, 0x00c0, 0x4acc, 0x2009,
++      0x8020, 0x2200, 0x0079, 0x4aac, 0x4ad9, 0x4ab1, 0x4b09, 0x4b17,
++      0x4ad9, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ad9, 0x7122,
++      0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080,
++      0x2071, 0xa600, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70ac, 0x8000,
++      0x70ae, 0x027f, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100, 0x00c0,
++      0x4ad9, 0x6868, 0xa005, 0x00c0, 0x4ad9, 0x2009, 0x8020, 0x0078,
++      0x4aa9, 0x2071, 0xa714, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000,
++      0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x4ae9, 0x6902, 0x0078,
++      0x4aea, 0x711e, 0x0078, 0x4ac9, 0xa18c, 0x00ff, 0xa186, 0x0017,
++      0x0040, 0x4afa, 0xa186, 0x001e, 0x0040, 0x4afa, 0xa18e, 0x001f,
++      0x00c0, 0x4ad9, 0x684c, 0xd0cc, 0x0040, 0x4ad9, 0x6850, 0xa084,
++      0x00ff, 0xa086, 0x0001, 0x00c0, 0x4ad9, 0x2009, 0x8021, 0x0078,
++      0x4aa9, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4ad9, 0x7186,
++      0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x0078, 0x4b27, 0x7084,
++      0x8008, 0xa092, 0x000f, 0x00c8, 0x4ad9, 0x7186, 0xae90, 0x0003,
++      0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088,
++      0xa10a, 0x0048, 0x4ac0, 0x718c, 0x7084, 0xa10a, 0x0048, 0x4ac0,
++      0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4ac0, 0x2071, 0xa835,
++      0x7000, 0xa086, 0x0002, 0x00c0, 0x4b47, 0x1078, 0x4dc3, 0x2071,
++      0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4ac0, 0x1078,
++      0x4dee, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078,
++      0x4ac0, 0x007e, 0x684c, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c,
++      0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0xa084,
++      0x00ff, 0x684e, 0x007f, 0x684a, 0x6952, 0x007c, 0x2071, 0xa714,
++      0x7004, 0x0079, 0x4b6b, 0x4b75, 0x4b86, 0x4d94, 0x4d95, 0x4dbc,
++      0x4dc2, 0x4b76, 0x4d82, 0x4d23, 0x4da5, 0x007c, 0x127e, 0x2091,
++      0x8000, 0x0068, 0x4b85, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091,
++      0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x127f, 0x2069, 0xa8c4,
++      0x6844, 0xa005, 0x0050, 0x4bae, 0x00c0, 0x4bae, 0x127e, 0x2091,
++      0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xa720, 0x2004, 0xa10a,
++      0x0040, 0x4ba9, 0x0068, 0x4bad, 0x2069, 0x0000, 0x6818, 0xd084,
++      0x00c0, 0x4bad, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091,
++      0x4080, 0x2069, 0xa8c4, 0x6847, 0xffff, 0x127f, 0x2069, 0xa600,
++      0x6848, 0x6964, 0xa102, 0x2069, 0xa835, 0x688a, 0x6984, 0x701c,
++      0xa06d, 0x0040, 0x4bc0, 0x81ff, 0x0040, 0x4c08, 0x0078, 0x4bd6,
++      0x81ff, 0x0040, 0x4cda, 0x2071, 0xa835, 0x7184, 0x7088, 0xa10a,
++      0x00c8, 0x4bd6, 0x7190, 0x2071, 0xa8c4, 0x7040, 0xa005, 0x0040,
++      0x4bd6, 0x00d0, 0x4cda, 0x7142, 0x0078, 0x4cda, 0x2071, 0xa835,
++      0x718c, 0x127e, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0048, 0x4cf7,
++      0x0068, 0x4c8c, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4c8c,
++      0x2001, 0xffff, 0x2071, 0xa8c4, 0x7042, 0x2071, 0xa835, 0x7000,
++      0xa086, 0x0002, 0x00c0, 0x4bfe, 0x1078, 0x4dc3, 0x2071, 0x0000,
++      0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c, 0x1078, 0x4dee,
++      0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4c8c,
++      0x2071, 0xa835, 0x7000, 0xa005, 0x0040, 0x4cb9, 0x6934, 0xa186,
++      0x0103, 0x00c0, 0x4c8f, 0x684c, 0xd0bc, 0x00c0, 0x4cb9, 0x6948,
++      0x6844, 0xa105, 0x00c0, 0x4cac, 0x2009, 0x8020, 0x2071, 0xa835,
++      0x7000, 0x0079, 0x4c23, 0x4cb9, 0x4c71, 0x4c49, 0x4c5b, 0x4c28,
++      0x137e, 0x147e, 0x157e, 0x2099, 0xa676, 0x20a1, 0xa886, 0x20a9,
++      0x0004, 0x53a3, 0x157f, 0x147f, 0x137f, 0x2071, 0xa87d, 0xad80,
++      0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000,
++      0x2e10, 0x1078, 0x13db, 0x2071, 0xa714, 0x7007, 0x0009, 0x0078,
++      0x4cda, 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4cda, 0xae90,
++      0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xa714, 0x1078,
++      0x4e4c, 0x0078, 0x4cda, 0x7084, 0x8008, 0xa092, 0x000f, 0x00c8,
++      0x4cda, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210,
++      0x6840, 0x2012, 0x7186, 0x2071, 0xa714, 0x1078, 0x4e4c, 0x0078,
++      0x4cda, 0x127e, 0x2091, 0x8000, 0x0068, 0x4c8c, 0x2071, 0x0000,
++      0x7018, 0xd084, 0x00c0, 0x4c8c, 0x7122, 0x683c, 0x7026, 0x6840,
++      0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x127f, 0x2071, 0xa714,
++      0x1078, 0x4e4c, 0x0078, 0x4cda, 0x127f, 0x0078, 0x4cda, 0xa18c,
++      0x00ff, 0xa186, 0x0017, 0x0040, 0x4c9d, 0xa186, 0x001e, 0x0040,
++      0x4c9d, 0xa18e, 0x001f, 0x00c0, 0x4cb9, 0x684c, 0xd0cc, 0x0040,
++      0x4cb9, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x4cb9,
++      0x2009, 0x8021, 0x0078, 0x4c1e, 0x6844, 0xa086, 0x0100, 0x00c0,
++      0x4cb9, 0x6868, 0xa005, 0x00c0, 0x4cb9, 0x2009, 0x8020, 0x0078,
++      0x4c1e, 0x2071, 0xa714, 0x1078, 0x4e60, 0x0040, 0x4cda, 0x2071,
++      0xa714, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003,
++      0x00c0, 0x4cd1, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x4cd1,
++      0x710e, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086, 0x0100,
++      0x0040, 0x4d95, 0x127e, 0x2091, 0x8000, 0x2071, 0xa714, 0x7008,
++      0xa086, 0x0001, 0x00c0, 0x4cf5, 0x0068, 0x4cf5, 0x2009, 0x000d,
++      0x7030, 0x200a, 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086,
++      0x0006, 0x00c0, 0x4cf5, 0x7007, 0x0001, 0x127f, 0x007c, 0x2071,
++      0xa714, 0x1078, 0x4e60, 0x0040, 0x4d20, 0x2071, 0xa835, 0x7084,
++      0x700a, 0x20a9, 0x0020, 0x2099, 0xa836, 0x20a1, 0xa85d, 0x53a3,
++      0x7087, 0x0000, 0x2071, 0xa714, 0x2069, 0xa87d, 0x706c, 0x6826,
++      0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832, 0x2d10, 0x1078,
++      0x13db, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071, 0xa8c4, 0x7042,
++      0x127f, 0x0078, 0x4cda, 0x2069, 0xa87d, 0x6808, 0xa08e, 0x0000,
++      0x0040, 0x4d81, 0xa08e, 0x0200, 0x0040, 0x4d7f, 0xa08e, 0x0100,
++      0x00c0, 0x4d81, 0x127e, 0x2091, 0x8000, 0x0068, 0x4d7c, 0x2069,
++      0x0000, 0x6818, 0xd084, 0x00c0, 0x4d7c, 0x702c, 0x7130, 0x8108,
++      0xa102, 0x0048, 0x4d4a, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
++      0x0078, 0x4d54, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x4d54,
++      0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000,
++      0x2001, 0xa85a, 0x2004, 0xa005, 0x00c0, 0x4d73, 0x6934, 0x2069,
++      0xa835, 0x689c, 0x699e, 0x2069, 0xa8c4, 0xa102, 0x00c0, 0x4d6c,
++      0x6844, 0xa005, 0x00d0, 0x4d7a, 0x2001, 0xa85b, 0x200c, 0x810d,
++      0x6946, 0x0078, 0x4d7a, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001,
++      0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x0078, 0x4d81, 0x7007,
++      0x0005, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4d93, 0x1078, 0x4e60,
++      0x0040, 0x4d93, 0x7007, 0x0003, 0x1078, 0x4e80, 0x7050, 0xa086,
++      0x0100, 0x0040, 0x4d95, 0x007c, 0x007c, 0x7050, 0xa09e, 0x0100,
++      0x00c0, 0x4d9e, 0x7007, 0x0004, 0x0078, 0x4dbc, 0xa086, 0x0200,
++      0x00c0, 0x4da4, 0x7007, 0x0005, 0x007c, 0x2001, 0xa87f, 0x2004,
++      0xa08e, 0x0100, 0x00c0, 0x4db1, 0x7007, 0x0001, 0x1078, 0x4e4c,
++      0x007c, 0xa08e, 0x0000, 0x0040, 0x4db0, 0xa08e, 0x0200, 0x00c0,
++      0x4db0, 0x7007, 0x0005, 0x007c, 0x1078, 0x4e16, 0x7006, 0x1078,
++      0x4e4c, 0x007c, 0x007c, 0x0e7e, 0x157e, 0x2071, 0xa835, 0x7184,
++      0x81ff, 0x0040, 0x4deb, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071,
++      0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0070, 0x4de8, 0x2014,
++      0x722a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x722e, 0x8000, 0x0070,
++      0x4de8, 0x2014, 0x723a, 0x8000, 0x0070, 0x4de8, 0x2014, 0x723e,
++      0xa180, 0x8030, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x0e7e, 0x157e,
++      0x2071, 0xa835, 0x7184, 0x81ff, 0x0040, 0x4e13, 0xa006, 0x7086,
++      0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000,
++      0x2014, 0x722a, 0x8000, 0x0070, 0x4e0c, 0x2014, 0x723a, 0x8000,
++      0x2014, 0x723e, 0x0078, 0x4e10, 0x2001, 0x8020, 0x0078, 0x4e12,
++      0x2001, 0x8042, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x702c, 0x7130,
++      0x8108, 0xa102, 0x0048, 0x4e23, 0xa00e, 0x7034, 0x706e, 0x7038,
++      0x7072, 0x0078, 0x4e2d, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8,
++      0x4e2d, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001,
++      0x700e, 0x00c0, 0x4e43, 0x127e, 0x2091, 0x8000, 0x0068, 0x4e46,
++      0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x700b,
++      0x0000, 0x127f, 0x007c, 0x2001, 0x0007, 0x007c, 0x2001, 0x0006,
++      0x700b, 0x0001, 0x127f, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4e5f,
++      0x127e, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e,
++      0xa005, 0x00c0, 0x4e5c, 0x701a, 0x127f, 0x1078, 0x13a4, 0x007c,
++      0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0040, 0x4e6f, 0x2304,
++      0x230c, 0xa10e, 0x0040, 0x4e6f, 0xa006, 0x0078, 0x4e7f, 0x732c,
++      0x8319, 0x7130, 0xa102, 0x00c0, 0x4e79, 0x2300, 0xa005, 0x0078,
++      0x4e7f, 0x0048, 0x4e7e, 0xa302, 0x0078, 0x4e7f, 0x8002, 0x007c,
++      0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x127e,
++      0x2091, 0x8000, 0x2009, 0xa8d6, 0x2104, 0xc08d, 0x200a, 0x127f,
++      0x1078, 0x13f9, 0x007c, 0x2071, 0xa6e2, 0x7003, 0x0000, 0x7007,
++      0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053,
++      0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b,
++      0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x007c, 0x0e7e, 0x2071,
++      0xa6e2, 0x6848, 0xa005, 0x00c0, 0x4ebc, 0x7028, 0xc085, 0x702a,
++      0xa085, 0x0001, 0x0078, 0x4ee1, 0x6a50, 0x7236, 0x6b54, 0x733a,
++      0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e,
++      0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006,
++      0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272,
++      0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000,
++      0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071, 0xa6e2, 0x7004, 0x1079,
++      0x4f41, 0x700c, 0x0079, 0x4eec, 0x4ef1, 0x4ee6, 0x4ee6, 0x4ee6,
++      0x4ee6, 0x007c, 0x700c, 0x0079, 0x4ef5, 0x4efa, 0x4f3f, 0x4f3f,
++      0x4f40, 0x4f40, 0x7830, 0x7930, 0xa106, 0x0040, 0x4f04, 0x7830,
++      0x7930, 0xa106, 0x00c0, 0x4f2a, 0x7030, 0xa10a, 0x0040, 0x4f2a,
++      0x00c8, 0x4f0c, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x00c8, 0x4f2b,
++      0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00, 0x705a, 0x7063, 0x0040,
++      0x2001, 0x0003, 0x7057, 0x0000, 0x127e, 0x007e, 0x2091, 0x8000,
++      0x2009, 0xa8d6, 0x2104, 0xc085, 0x200a, 0x007f, 0x700e, 0x127f,
++      0x1078, 0x13f9, 0x007c, 0x1078, 0x1370, 0x0040, 0x4f2a, 0x2d00,
++      0x705a, 0x1078, 0x1370, 0x00c0, 0x4f37, 0x0078, 0x4f16, 0x2d00,
++      0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x0078, 0x4f1a, 0x007c,
++      0x007c, 0x4f52, 0x4f53, 0x4f8a, 0x4f8b, 0x4f3f, 0x4fc1, 0x4fc6,
++      0x4ffd, 0x4ffe, 0x5019, 0x501a, 0x501b, 0x501c, 0x501d, 0x501e,
++      0x509e, 0x50c8, 0x007c, 0x700c, 0x0079, 0x4f56, 0x4f5b, 0x4f5e,
++      0x4f6e, 0x4f89, 0x4f89, 0x1078, 0x4ef2, 0x007c, 0x127e, 0x8001,
++      0x700e, 0x7058, 0x007e, 0x1078, 0x5464, 0x0040, 0x4f6b, 0x2091,
++      0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078, 0x4f77, 0x127e, 0x8001,
++      0x700e, 0x1078, 0x5464, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803,
++      0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x0020,
++      0x00c8, 0x4f86, 0x1079, 0x4fa1, 0x127f, 0x007c, 0x127f, 0x1078,
++      0x501f, 0x007c, 0x007c, 0x007c, 0x0e7e, 0x2071, 0xa6e2, 0x700c,
++      0x0079, 0x4f92, 0x4f97, 0x4f97, 0x4f97, 0x4f99, 0x4f9d, 0x0e7f,
++      0x007c, 0x700f, 0x0001, 0x0078, 0x4f9f, 0x700f, 0x0002, 0x0e7f,
++      0x007c, 0x501f, 0x501f, 0x503b, 0x501f, 0x5171, 0x501f, 0x501f,
++      0x501f, 0x501f, 0x501f, 0x503b, 0x51bb, 0x5208, 0x5261, 0x5277,
++      0x501f, 0x501f, 0x5057, 0x503b, 0x501f, 0x501f, 0x5078, 0x5338,
++      0x5356, 0x501f, 0x5057, 0x501f, 0x501f, 0x501f, 0x501f, 0x506d,
++      0x5356, 0x7020, 0x2068, 0x1078, 0x13a4, 0x007c, 0x700c, 0x0079,
++      0x4fc9, 0x4fce, 0x4fd1, 0x4fe1, 0x4ffc, 0x4ffc, 0x1078, 0x4ef2,
++      0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x5464,
++      0x0040, 0x4fde, 0x2091, 0x8000, 0x1078, 0x4ef2, 0x0d7f, 0x0078,
++      0x4fea, 0x127e, 0x8001, 0x700e, 0x1078, 0x5464, 0x7058, 0x2068,
++      0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084,
++      0x00ff, 0xa08a, 0x001a, 0x00c8, 0x4ff9, 0x1079, 0x4fff, 0x127f,
++      0x007c, 0x127f, 0x1078, 0x501f, 0x007c, 0x007c, 0x007c, 0x501f,
++      0x503b, 0x515b, 0x501f, 0x503b, 0x501f, 0x503b, 0x503b, 0x501f,
++      0x503b, 0x515b, 0x503b, 0x503b, 0x503b, 0x503b, 0x503b, 0x501f,
++      0x503b, 0x515b, 0x501f, 0x501f, 0x503b, 0x501f, 0x501f, 0x501f,
++      0x503b, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x7007,
++      0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x127e, 0x2091,
++      0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838,
++      0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078,
++      0x4a73, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff,
++      0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f,
++      0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a,
++      0x127e, 0x2091, 0x8000, 0x1078, 0x4a73, 0x127f, 0x007c, 0x6834,
++      0x8007, 0xa084, 0x00ff, 0x0040, 0x502d, 0x8001, 0x00c0, 0x5064,
++      0x7007, 0x0001, 0x0078, 0x513a, 0x7007, 0x0006, 0x7012, 0x2d00,
++      0x7016, 0x701a, 0x704b, 0x513a, 0x007c, 0x684c, 0xa084, 0x00c0,
++      0xa086, 0x00c0, 0x00c0, 0x5078, 0x7007, 0x0001, 0x0078, 0x5373,
++      0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098,
++      0x20a1, 0xa70d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8,
++      0x5049, 0x6884, 0xa08a, 0x0002, 0x00c8, 0x5049, 0x82ff, 0x00c0,
++      0x509a, 0x6888, 0x698c, 0xa105, 0x0040, 0x509a, 0x2001, 0x510a,
++      0x0078, 0x509d, 0xa280, 0x5100, 0x2004, 0x70c6, 0x7010, 0xa015,
++      0x0040, 0x50e8, 0x1078, 0x1370, 0x00c0, 0x50a9, 0x7007, 0x000f,
++      0x007c, 0x2d00, 0x7022, 0x70c4, 0x2060, 0x6000, 0x6836, 0x6004,
++      0xad00, 0x7096, 0x6008, 0xa20a, 0x00c8, 0x50b8, 0xa00e, 0x2200,
++      0x7112, 0x620c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0040, 0x50c1,
++      0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x1078, 0x13db,
++      0x7090, 0xa08e, 0x0100, 0x0040, 0x50dc, 0xa086, 0x0200, 0x0040,
++      0x50d4, 0x7007, 0x0010, 0x007c, 0x7020, 0x2068, 0x1078, 0x13a4,
++      0x7014, 0x2068, 0x0078, 0x5049, 0x7020, 0x2068, 0x7018, 0x6802,
++      0x6807, 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0078, 0x509e,
++      0x7014, 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x00c0, 0x50f7,
++      0x6888, 0x698c, 0xa105, 0x0040, 0x50f7, 0x1078, 0x510e, 0x6834,
++      0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x5373, 0x0078, 0x513a,
++      0x5102, 0x5106, 0x0002, 0x0011, 0x0007, 0x0004, 0x000a, 0x000f,
++      0x0005, 0x0006, 0x000a, 0x0011, 0x0005, 0x0004, 0x0f7e, 0x0e7e,
++      0x0c7e, 0x077e, 0x067e, 0x6f88, 0x6e8c, 0x6804, 0x2060, 0xacf0,
++      0x0021, 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c, 0x7816, 0x7008,
++      0x7812, 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e, 0x7f0a, 0x8109,
++      0x0040, 0x5130, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0078, 0x511d,
++      0x6004, 0xa065, 0x00c0, 0x5117, 0x067f, 0x077f, 0x0c7f, 0x0e7f,
++      0x0f7f, 0x007c, 0x2009, 0xa62f, 0x210c, 0x81ff, 0x00c0, 0x5155,
++      0x6838, 0xa084, 0x00ff, 0x683a, 0x1078, 0x4353, 0x00c0, 0x5149,
++      0x007c, 0x1078, 0x4b51, 0x127e, 0x2091, 0x8000, 0x1078, 0x8f7d,
++      0x1078, 0x4a73, 0x127f, 0x0078, 0x5148, 0x2001, 0x0028, 0x2009,
++      0x0000, 0x0078, 0x5149, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906,
++      0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x516a, 0x7007, 0x0006,
++      0x0078, 0x5170, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a,
++      0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848,
++      0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x519a,
++      0x2009, 0x0000, 0x20a9, 0x00ff, 0xa096, 0x0002, 0x0040, 0x519a,
++      0xa005, 0x00c0, 0x51ad, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078,
++      0x45c4, 0x00c0, 0x51ad, 0x067e, 0x6e50, 0x1078, 0x46b3, 0x067f,
++      0x0078, 0x51ad, 0x047e, 0x2011, 0xa60c, 0x2224, 0xc484, 0xc48c,
++      0x2412, 0x047f, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x51a9, 0x1078,
++      0x4852, 0x8108, 0x00f0, 0x51a3, 0x0c7f, 0x684c, 0xd084, 0x00c0,
++      0x51b4, 0x1078, 0x13a4, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078,
++      0x4a73, 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001,
++      0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x51ff, 0x2061, 0xa933,
++      0x6100, 0xd184, 0x0040, 0x51df, 0x6858, 0xa084, 0x00ff, 0x00c0,
++      0x5202, 0x6000, 0xd084, 0x0040, 0x51ff, 0x6004, 0xa005, 0x00c0,
++      0x5205, 0x6003, 0x0000, 0x600b, 0x0000, 0x0078, 0x51fc, 0x2011,
++      0x0001, 0x6860, 0xa005, 0x00c0, 0x51e7, 0x2001, 0x001e, 0x8000,
++      0x6016, 0x6858, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x6006, 0x6858,
++      0x8007, 0xa084, 0x00ff, 0x0040, 0x51ff, 0x600a, 0x6858, 0x8000,
++      0x00c0, 0x51fb, 0xc28d, 0x6202, 0x127f, 0x0078, 0x5453, 0x127f,
++      0x0078, 0x544b, 0x127f, 0x0078, 0x5443, 0x127f, 0x0078, 0x5447,
++      0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xa653, 0x2004,
++      0xd0a4, 0x0040, 0x525e, 0x2061, 0xa933, 0x6000, 0xd084, 0x0040,
++      0x525e, 0x6204, 0x6308, 0xd08c, 0x00c0, 0x5250, 0x6c48, 0xa484,
++      0x0003, 0x0040, 0x5236, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x00c0,
++      0x522f, 0x2100, 0xa210, 0x0048, 0x525b, 0x0078, 0x5236, 0x8001,
++      0x00c0, 0x525b, 0x2100, 0xa212, 0x0048, 0x525b, 0xa484, 0x000c,
++      0x0040, 0x5250, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004,
++      0x00c0, 0x5248, 0x2100, 0xa318, 0x0048, 0x525b, 0x0078, 0x5250,
++      0xa082, 0x0004, 0x00c0, 0x525b, 0x2100, 0xa31a, 0x0048, 0x525b,
++      0x6860, 0xa005, 0x0040, 0x5256, 0x8000, 0x6016, 0x6206, 0x630a,
++      0x127f, 0x0078, 0x5453, 0x127f, 0x0078, 0x544f, 0x127f, 0x0078,
++      0x544b, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0xa933,
++      0x6300, 0xd38c, 0x00c0, 0x5271, 0x6308, 0x8318, 0x0048, 0x5274,
++      0x630a, 0x127f, 0x0078, 0x5461, 0x127f, 0x0078, 0x544f, 0x127e,
++      0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0040,
++      0x528b, 0x0c7e, 0x2061, 0xa933, 0x6000, 0xa084, 0xfcff, 0x6002,
++      0x0c7f, 0x0078, 0x52ba, 0x6858, 0xa005, 0x0040, 0x52d1, 0x685c,
++      0xa065, 0x0040, 0x52cd, 0x2001, 0xa62f, 0x2004, 0xa005, 0x0040,
++      0x529d, 0x1078, 0x8ec6, 0x0078, 0x52ab, 0x6013, 0x0400, 0x6037,
++      0x0000, 0x694c, 0xd1a4, 0x0040, 0x52a7, 0x6950, 0x6136, 0x2009,
++      0x0041, 0x1078, 0x775c, 0x6958, 0xa18c, 0xff00, 0xa186, 0x2000,
++      0x00c0, 0x52ba, 0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078,
++      0x5bf1, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x52c9, 0x2061, 0xa933,
++      0x6000, 0xd08c, 0x00c0, 0x52c9, 0x6008, 0x8000, 0x0048, 0x52cd,
++      0x600a, 0x0c7f, 0x127f, 0x0078, 0x5453, 0x0c7f, 0x127f, 0x0078,
++      0x544b, 0x6954, 0xa186, 0x0045, 0x0040, 0x5306, 0xa186, 0x002a,
++      0x00c0, 0x52e1, 0x2001, 0xa60c, 0x200c, 0xc194, 0x2102, 0x0078,
++      0x52ba, 0xa186, 0x0020, 0x0040, 0x52fa, 0xa186, 0x0029, 0x0040,
++      0x52ed, 0xa186, 0x002d, 0x00c0, 0x52cd, 0x6944, 0xa18c, 0xff00,
++      0x810f, 0x1078, 0x45c4, 0x00c0, 0x52ba, 0x6000, 0xc0e4, 0x6002,
++      0x0078, 0x52ba, 0x685c, 0xa065, 0x0040, 0x52cd, 0x6007, 0x0024,
++      0x2001, 0xa8a3, 0x2004, 0x6016, 0x0078, 0x52ba, 0x685c, 0xa065,
++      0x0040, 0x52cd, 0x0e7e, 0x6860, 0xa075, 0x2001, 0xa62f, 0x2004,
++      0xa005, 0x0040, 0x531e, 0x1078, 0x8ec6, 0x8eff, 0x0040, 0x531b,
++      0x2e60, 0x1078, 0x8ec6, 0x0e7f, 0x0078, 0x52ba, 0x6024, 0xc0dc,
++      0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0x6870, 0xa005, 0x0040,
++      0x532f, 0x6007, 0x003b, 0x6874, 0x602a, 0x6878, 0x6012, 0x6003,
++      0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x0078, 0x52ba,
++      0x2061, 0xa933, 0x6000, 0xd084, 0x0040, 0x5352, 0xd08c, 0x00c0,
++      0x5461, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048, 0x534c, 0x6206,
++      0x2091, 0x8001, 0x0078, 0x5461, 0x2091, 0x8001, 0x6853, 0x0016,
++      0x0078, 0x545a, 0x6853, 0x0007, 0x0078, 0x545a, 0x6834, 0x8007,
++      0xa084, 0x00ff, 0x00c0, 0x5360, 0x1078, 0x502d, 0x0078, 0x5372,
++      0x2030, 0x8001, 0x00c0, 0x536a, 0x7007, 0x0001, 0x1078, 0x5373,
++      0x0078, 0x5372, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a,
++      0x704b, 0x5373, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000, 0xa03e,
++      0x2009, 0xa62f, 0x210c, 0x81ff, 0x00c0, 0x53ff, 0x2009, 0xa60c,
++      0x210c, 0xd194, 0x00c0, 0x5431, 0x6848, 0x2070, 0xae82, 0xad00,
++      0x0048, 0x53ef, 0x2001, 0xa616, 0x2004, 0xae02, 0x00c8, 0x53ef,
++      0x2061, 0xa933, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, 0x00c0,
++      0x53d2, 0x711c, 0xa186, 0x0006, 0x00c0, 0x53da, 0x7018, 0xa005,
++      0x0040, 0x53ff, 0x2004, 0xd0e4, 0x00c0, 0x542b, 0x7024, 0xd0dc,
++      0x00c0, 0x5435, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x7010,
++      0xa005, 0x00c0, 0x53be, 0x7112, 0x684c, 0xd0f4, 0x00c0, 0x5439,
++      0x2e60, 0x1078, 0x5b27, 0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800,
++      0xa005, 0x00c0, 0x53be, 0x6902, 0x2168, 0x684c, 0xd0f4, 0x00c0,
++      0x5439, 0x127f, 0x0e7f, 0x007c, 0x127f, 0x0e7f, 0x6853, 0x0006,
++      0x0078, 0x545a, 0xd184, 0x0040, 0x53cc, 0xd1c4, 0x00c0, 0x53f3,
++      0x0078, 0x53f7, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078, 0x45c4,
++      0x00c0, 0x542b, 0x6000, 0xd0e4, 0x00c0, 0x542b, 0x711c, 0xa186,
++      0x0007, 0x00c0, 0x53ef, 0x6853, 0x0002, 0x0078, 0x542d, 0x6853,
++      0x0008, 0x0078, 0x542d, 0x6853, 0x000e, 0x0078, 0x542d, 0x6853,
++      0x0017, 0x0078, 0x542d, 0x6853, 0x0035, 0x0078, 0x542d, 0x2001,
++      0xa672, 0x2004, 0xd0fc, 0x0040, 0x5427, 0x6848, 0x2070, 0xae82,
++      0xad00, 0x0048, 0x5427, 0x6058, 0xae02, 0x00c8, 0x5427, 0x711c,
++      0xa186, 0x0006, 0x00c0, 0x5427, 0x7018, 0xa005, 0x0040, 0x5427,
++      0x2004, 0xd0bc, 0x0040, 0x5427, 0x2039, 0x0001, 0x7000, 0xa086,
++      0x0007, 0x00c0, 0x537e, 0x7003, 0x0002, 0x0078, 0x537e, 0x6853,
++      0x0028, 0x0078, 0x542d, 0x6853, 0x0029, 0x127f, 0x0e7f, 0x0078,
++      0x545a, 0x6853, 0x002a, 0x0078, 0x542d, 0x6853, 0x0045, 0x0078,
++      0x542d, 0x2e60, 0x2019, 0x0002, 0x6017, 0x0014, 0x1078, 0x9dc7,
++      0x127f, 0x0e7f, 0x007c, 0x2009, 0x003e, 0x0078, 0x5455, 0x2009,
++      0x0004, 0x0078, 0x5455, 0x2009, 0x0006, 0x0078, 0x5455, 0x2009,
++      0x0016, 0x0078, 0x5455, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00,
++      0xa105, 0x6856, 0x2091, 0x8000, 0x1078, 0x4a73, 0x2091, 0x8001,
++      0x007c, 0x1078, 0x13a4, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102,
++      0x0048, 0x5471, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078,
++      0x547d, 0x7070, 0xa080, 0x0040, 0x7072, 0x00c8, 0x547d, 0x7074,
++      0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c,
++      0x0d7e, 0x1078, 0x5b1e, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004,
++      0x2204, 0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002,
++      0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x549c,
++      0xa086, 0x1000, 0x00c0, 0x54d3, 0x20e1, 0x0000, 0x3d00, 0xa094,
++      0xff00, 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x00c0, 0x54b7,
++      0xa184, 0xff00, 0x8007, 0xa086, 0x0008, 0x00c0, 0x54d3, 0x1078,
++      0x29bb, 0x00c0, 0x54d3, 0x1078, 0x56b2, 0x0078, 0x54ce, 0x20e1,
++      0x0004, 0x3d60, 0xd1bc, 0x00c0, 0x54be, 0x3e60, 0xac84, 0x000f,
++      0x00c0, 0x54d3, 0xac82, 0xad00, 0x0048, 0x54d3, 0x6858, 0xac02,
++      0x00c8, 0x54d3, 0x2009, 0x0047, 0x1078, 0x775c, 0x7a1c, 0xd284,
++      0x00c0, 0x548e, 0x007c, 0xa016, 0x1078, 0x15fa, 0x0078, 0x54ce,
++      0x0078, 0x54d3, 0x781c, 0xd08c, 0x0040, 0x5502, 0x157e, 0x137e,
++      0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076, 0x00c0,
++      0x5518, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x5507, 0x1078,
++      0x554e, 0x0040, 0x5518, 0x20e1, 0x3000, 0x7828, 0x7828, 0x1078,
++      0x556c, 0x147f, 0x137f, 0x157f, 0x2009, 0xa8b9, 0x2104, 0xa005,
++      0x00c0, 0x5503, 0x007c, 0x1078, 0x62d1, 0x0078, 0x5502, 0xa484,
++      0x7000, 0x00c0, 0x5518, 0x1078, 0x554e, 0x0040, 0x552c, 0x7000,
++      0xa084, 0xff00, 0xa086, 0x8100, 0x0040, 0x54f3, 0x0078, 0x552c,
++      0x1078, 0xa54f, 0xd5a4, 0x0040, 0x5528, 0x047e, 0x1078, 0x1b22,
++      0x047f, 0x20e1, 0x9010, 0x2001, 0x0138, 0x2202, 0x0078, 0x5530,
++      0x1078, 0x554e, 0x6883, 0x0000, 0x20e1, 0x3000, 0x7828, 0x7828,
++      0x1078, 0x5537, 0x147f, 0x137f, 0x157f, 0x0078, 0x5502, 0x2001,
++      0xa60e, 0x2004, 0xd08c, 0x0040, 0x554d, 0x2001, 0xa600, 0x2004,
++      0xa086, 0x0003, 0x00c0, 0x554d, 0x027e, 0x037e, 0x2011, 0x8048,
++      0x2518, 0x1078, 0x361b, 0x037f, 0x027f, 0x007c, 0xa484, 0x01ff,
++      0x6882, 0xa005, 0x0040, 0x5560, 0xa080, 0x001f, 0xa084, 0x03f8,
++      0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c,
++      0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5,
++      0xa085, 0x0001, 0x0078, 0x555f, 0x7000, 0xa084, 0xff00, 0xa08c,
++      0xf000, 0x8007, 0xa196, 0x0000, 0x00c0, 0x5579, 0x0078, 0x57ba,
++      0x007c, 0xa196, 0x2000, 0x00c0, 0x558a, 0x6900, 0xa18e, 0x0001,
++      0x00c0, 0x5586, 0x1078, 0x3aec, 0x0078, 0x5578, 0x1078, 0x5592,
++      0x0078, 0x5578, 0xa196, 0x8000, 0x00c0, 0x5578, 0x1078, 0x5871,
++      0x0078, 0x5578, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196,
++      0x0001, 0x0040, 0x559f, 0xa196, 0x0023, 0x00c0, 0x56aa, 0xa08e,
++      0x0023, 0x00c0, 0x55d4, 0x1078, 0x591d, 0x0040, 0x56aa, 0x7124,
++      0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x55b8, 0x7034, 0xa005,
++      0x00c0, 0x56aa, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa,
++      0xa08e, 0x0214, 0x0040, 0x55c0, 0xa08e, 0x0210, 0x00c0, 0x55c6,
++      0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0100,
++      0x00c0, 0x56aa, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0016,
++      0x1078, 0x775c, 0x0078, 0x56aa, 0xa08e, 0x0022, 0x00c0, 0x56aa,
++      0x7030, 0xa08e, 0x0300, 0x00c0, 0x55e5, 0x7034, 0xa005, 0x00c0,
++      0x56aa, 0x2009, 0x0017, 0x0078, 0x5676, 0xa08e, 0x0500, 0x00c0,
++      0x55f1, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x0018, 0x0078,
++      0x5676, 0xa08e, 0x2010, 0x00c0, 0x55f9, 0x2009, 0x0019, 0x0078,
++      0x5676, 0xa08e, 0x2110, 0x00c0, 0x5601, 0x2009, 0x001a, 0x0078,
++      0x5676, 0xa08e, 0x5200, 0x00c0, 0x560d, 0x7034, 0xa005, 0x00c0,
++      0x56aa, 0x2009, 0x001b, 0x0078, 0x5676, 0xa08e, 0x5000, 0x00c0,
++      0x5619, 0x7034, 0xa005, 0x00c0, 0x56aa, 0x2009, 0x001c, 0x0078,
++      0x5676, 0xa08e, 0x1300, 0x00c0, 0x5621, 0x2009, 0x0034, 0x0078,
++      0x5676, 0xa08e, 0x1200, 0x00c0, 0x562d, 0x7034, 0xa005, 0x00c0,
++      0x56aa, 0x2009, 0x0024, 0x0078, 0x5676, 0xa08c, 0xff00, 0xa18e,
++      0x2400, 0x00c0, 0x5637, 0x2009, 0x002d, 0x0078, 0x5676, 0xa08c,
++      0xff00, 0xa18e, 0x5300, 0x00c0, 0x5641, 0x2009, 0x002a, 0x0078,
++      0x5676, 0xa08e, 0x0f00, 0x00c0, 0x5649, 0x2009, 0x0020, 0x0078,
++      0x5676, 0xa08e, 0x5300, 0x00c0, 0x564f, 0x0078, 0x566c, 0xa08e,
++      0x6104, 0x00c0, 0x566c, 0x2011, 0xab8d, 0x8208, 0x2204, 0xa082,
++      0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108,
++      0x047e, 0x2124, 0x1078, 0x361b, 0x047f, 0x8108, 0x00f0, 0x565c,
++      0x2009, 0x0023, 0x0078, 0x5676, 0xa08e, 0x6000, 0x00c0, 0x5674,
++      0x2009, 0x003f, 0x0078, 0x5676, 0x2009, 0x001d, 0x017e, 0x2011,
++      0xab83, 0x2204, 0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x56ac,
++      0x1078, 0x455c, 0x00c0, 0x56ac, 0x6612, 0x6516, 0x86ff, 0x0040,
++      0x569c, 0x017f, 0x017e, 0xa186, 0x0017, 0x00c0, 0x569c, 0x686c,
++      0xa606, 0x00c0, 0x569c, 0x6870, 0xa506, 0xa084, 0xff00, 0x00c0,
++      0x569c, 0x6000, 0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x76c7, 0x0040,
++      0x56af, 0x017f, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f,
++      0x1078, 0x775c, 0x0c7f, 0x007c, 0x017f, 0x0078, 0x56aa, 0x0c7f,
++      0x0078, 0x56ac, 0x0c7e, 0x1078, 0x570f, 0x00c0, 0x570d, 0xa28e,
++      0x0033, 0x00c0, 0x56de, 0x1078, 0x591d, 0x0040, 0x570d, 0x7124,
++      0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x56d0, 0x7034, 0xa005,
++      0x00c0, 0x570d, 0x2009, 0x0015, 0x1078, 0x775c, 0x0078, 0x570d,
++      0xa08e, 0x0100, 0x00c0, 0x570d, 0x7034, 0xa005, 0x00c0, 0x570d,
++      0x2009, 0x0016, 0x1078, 0x775c, 0x0078, 0x570d, 0xa28e, 0x0032,
++      0x00c0, 0x570d, 0x7030, 0xa08e, 0x1400, 0x00c0, 0x570d, 0x2009,
++      0x0038, 0x017e, 0x2011, 0xab83, 0x2204, 0x8211, 0x220c, 0x1078,
++      0x254d, 0x00c0, 0x570c, 0x1078, 0x455c, 0x00c0, 0x570c, 0x6612,
++      0x6516, 0x0c7e, 0x1078, 0x76c7, 0x0040, 0x570b, 0x017f, 0x611a,
++      0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x775c, 0x1078,
++      0x62d1, 0x0078, 0x570d, 0x0c7f, 0x017f, 0x0c7f, 0x007c, 0x0f7e,
++      0x0d7e, 0x027e, 0x017e, 0x137e, 0x147e, 0x157e, 0x3c00, 0x007e,
++      0x2079, 0x0030, 0x2069, 0x0200, 0x1078, 0x1c6a, 0x00c0, 0x5750,
++      0x1078, 0x1b40, 0x0040, 0x575d, 0x7908, 0xa18c, 0x1fff, 0xa182,
++      0x0011, 0x00c8, 0x575a, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0,
++      0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004,
++      0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0xa08a, 0x0140,
++      0x10c8, 0x1332, 0x80ac, 0x20e1, 0x6000, 0x2099, 0x020a, 0x53a5,
++      0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004, 0xa294, 0x0070,
++      0x007f, 0x20e0, 0x157f, 0x147f, 0x137f, 0x017f, 0x027f, 0x0d7f,
++      0x0f7f, 0x007c, 0xa016, 0x1078, 0x15fa, 0xa085, 0x0001, 0x0078,
++      0x5750, 0x047e, 0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff,
++      0x00c0, 0x5782, 0xa596, 0xfffd, 0x00c0, 0x5772, 0x2009, 0x007f,
++      0x0078, 0x57b5, 0xa596, 0xfffe, 0x00c0, 0x577a, 0x2009, 0x007e,
++      0x0078, 0x57b5, 0xa596, 0xfffc, 0x00c0, 0x5782, 0x2009, 0x0080,
++      0x0078, 0x57b5, 0x2011, 0x0000, 0x2021, 0x0081, 0x20a9, 0x007e,
++      0x2071, 0xa7b6, 0x2e1c, 0x83ff, 0x00c0, 0x5794, 0x82ff, 0x00c0,
++      0x57a9, 0x2410, 0x0078, 0x57a9, 0x2368, 0x6f10, 0x007e, 0x2100,
++      0xa706, 0x007f, 0x6b14, 0x00c0, 0x57a3, 0xa346, 0x00c0, 0x57a3,
++      0x2408, 0x0078, 0x57b5, 0x87ff, 0x00c0, 0x57a9, 0x83ff, 0x0040,
++      0x578e, 0x8420, 0x8e70, 0x00f0, 0x578a, 0x82ff, 0x00c0, 0x57b4,
++      0xa085, 0x0001, 0x0078, 0x57b6, 0x2208, 0xa006, 0x0d7f, 0x0e7f,
++      0x047f, 0x007c, 0xa084, 0x0007, 0x0079, 0x57bf, 0x007c, 0x57c7,
++      0x57c7, 0x57c7, 0x5933, 0x57c7, 0x57c8, 0x57e1, 0x5858, 0x007c,
++      0x7110, 0xd1bc, 0x0040, 0x57e0, 0x7120, 0x2160, 0xac8c, 0x000f,
++      0x00c0, 0x57e0, 0xac8a, 0xad00, 0x0048, 0x57e0, 0x6858, 0xac02,
++      0x00c8, 0x57e0, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x775c,
++      0x007c, 0x0c7e, 0xa484, 0x01ff, 0x0040, 0x5833, 0x7110, 0xd1bc,
++      0x00c0, 0x5833, 0x2011, 0xab83, 0x2204, 0x8211, 0x220c, 0x1078,
++      0x254d, 0x00c0, 0x5833, 0x1078, 0x455c, 0x00c0, 0x5833, 0x6612,
++      0x6516, 0x6000, 0xd0ec, 0x00c0, 0x5833, 0x6204, 0xa294, 0xff00,
++      0x8217, 0xa286, 0x0006, 0x00c0, 0x5818, 0x0c7e, 0x1078, 0x76c7,
++      0x017f, 0x0040, 0x5835, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a,
++      0x7130, 0x6122, 0x2009, 0x0044, 0x1078, 0x775c, 0x0078, 0x5833,
++      0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f,
++      0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x582b, 0x6007,
++      0x0005, 0x0078, 0x582d, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078,
++      0x5dd7, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x2001, 0xa60d, 0x2004,
++      0xd0ec, 0x0040, 0x583f, 0x2011, 0x8049, 0x1078, 0x361b, 0x0c7e,
++      0x1078, 0x9187, 0x017f, 0x0040, 0x5833, 0x611a, 0x601f, 0x0006,
++      0x7120, 0x610a, 0x7130, 0x6122, 0x6013, 0x0300, 0x6003, 0x0001,
++      0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x5833,
++      0x7110, 0xd1bc, 0x0040, 0x5870, 0x7020, 0x2060, 0xac84, 0x000f,
++      0x00c0, 0x5870, 0xac82, 0xad00, 0x0048, 0x5870, 0x6858, 0xac02,
++      0x00c8, 0x5870, 0x7124, 0x610a, 0x2009, 0x0045, 0x1078, 0x775c,
++      0x007c, 0x007e, 0x1078, 0x29bb, 0x007f, 0x00c0, 0x5887, 0x7110,
++      0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x5887, 0xa084,
++      0x000f, 0xa08a, 0x0006, 0x00c8, 0x5887, 0x1079, 0x5888, 0x007c,
++      0x588e, 0x588f, 0x588e, 0x588e, 0x58ff, 0x590e, 0x007c, 0x7110,
++      0xd1bc, 0x0040, 0x5897, 0x702c, 0xd084, 0x0040, 0x58fe, 0x700c,
++      0x7108, 0x1078, 0x254d, 0x00c0, 0x58fe, 0x1078, 0x455c, 0x00c0,
++      0x58fe, 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x0040, 0x58c9,
++      0xa28c, 0x00ff, 0xa186, 0x0004, 0x0040, 0x58b2, 0xa186, 0x0006,
++      0x00c0, 0x58ef, 0x0c7e, 0x1078, 0x591d, 0x0c7f, 0x0040, 0x58fe,
++      0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f,
++      0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078,
++      0x58fe, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0040, 0x58de, 0xa186,
++      0x0004, 0x0040, 0x58de, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004,
++      0x0040, 0x58de, 0xa286, 0x0006, 0x00c0, 0x58ef, 0x0c7e, 0x1078,
++      0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0005, 0x7120,
++      0x610a, 0x2009, 0x0088, 0x1078, 0x775c, 0x0078, 0x58fe, 0x0c7e,
++      0x1078, 0x76c7, 0x017f, 0x0040, 0x58fe, 0x611a, 0x601f, 0x0004,
++      0x7120, 0x610a, 0x2009, 0x0001, 0x1078, 0x775c, 0x007c, 0x7110,
++      0xd1bc, 0x0040, 0x590d, 0x1078, 0x591d, 0x0040, 0x590d, 0x7124,
++      0x610a, 0x2009, 0x0089, 0x1078, 0x775c, 0x007c, 0x7110, 0xd1bc,
++      0x0040, 0x591c, 0x1078, 0x591d, 0x0040, 0x591c, 0x7124, 0x610a,
++      0x2009, 0x008a, 0x1078, 0x775c, 0x007c, 0x7020, 0x2060, 0xac84,
++      0x000f, 0x00c0, 0x5930, 0xac82, 0xad00, 0x0048, 0x5930, 0x2001,
++      0xa616, 0x2004, 0xac02, 0x00c8, 0x5930, 0xa085, 0x0001, 0x007c,
++      0xa006, 0x0078, 0x592f, 0x7110, 0xd1bc, 0x00c0, 0x5949, 0x7024,
++      0x2060, 0xac84, 0x000f, 0x00c0, 0x5949, 0xac82, 0xad00, 0x0048,
++      0x5949, 0x6858, 0xac02, 0x00c8, 0x5949, 0x2009, 0x0051, 0x1078,
++      0x775c, 0x007c, 0x2071, 0xa8c4, 0x7003, 0x0003, 0x700f, 0x0361,
++      0xa006, 0x701a, 0x7012, 0x7017, 0xad00, 0x7007, 0x0000, 0x7026,
++      0x702b, 0x6e1c, 0x7032, 0x7037, 0x6e70, 0x703b, 0x0002, 0x703f,
++      0x0000, 0x7043, 0xffff, 0x7047, 0xffff, 0x007c, 0x2071, 0xa8c4,
++      0x00e0, 0x5a32, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x00c0,
++      0x59de, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e, 0x2091, 0x8000,
++      0x7138, 0x8109, 0x713a, 0x00c0, 0x59dc, 0x703b, 0x0002, 0x2009,
++      0x0100, 0x2104, 0xa082, 0x0003, 0x00c8, 0x59dc, 0x703c, 0xa086,
++      0x0001, 0x00c0, 0x59b9, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084,
++      0x4000, 0x0040, 0x5997, 0x6803, 0x1000, 0x0078, 0x599e, 0x6804,
++      0xa084, 0x1000, 0x0040, 0x599e, 0x6803, 0x0100, 0x6803, 0x0000,
++      0x703f, 0x0000, 0x2069, 0xa8b1, 0x6804, 0xa082, 0x0006, 0x00c0,
++      0x59ab, 0x6807, 0x0000, 0x6830, 0xa082, 0x0003, 0x00c0, 0x59b2,
++      0x6833, 0x0000, 0x1078, 0x62d1, 0x1078, 0x639b, 0x0d7f, 0x0078,
++      0x59dc, 0x0d7e, 0x2069, 0xa600, 0x6948, 0x6864, 0xa102, 0x00c8,
++      0x59db, 0x2069, 0xa8b1, 0x6804, 0xa086, 0x0000, 0x00c0, 0x59db,
++      0x6830, 0xa086, 0x0000, 0x00c0, 0x59db, 0x703f, 0x0001, 0x6807,
++      0x0006, 0x6833, 0x0003, 0x2069, 0x0100, 0x6830, 0x689e, 0x2069,
++      0x0140, 0x6803, 0x0600, 0x0d7f, 0x0078, 0x59e1, 0x127e, 0x2091,
++      0x8000, 0x7024, 0xa00d, 0x0040, 0x59f9, 0x7020, 0x8001, 0x7022,
++      0x00c0, 0x59f9, 0x7023, 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8,
++      0x00c0, 0x59f4, 0x7028, 0x107a, 0x81ff, 0x00c0, 0x59f9, 0x7028,
++      0x107a, 0x7030, 0xa00d, 0x0040, 0x5a10, 0x702c, 0x8001, 0x702e,
++      0x00c0, 0x5a10, 0x702f, 0x0009, 0x8109, 0x7132, 0x0040, 0x5a0e,
++      0xa184, 0x007f, 0x1040, 0x6ea2, 0x0078, 0x5a10, 0x7034, 0x107a,
++      0x7040, 0xa005, 0x0040, 0x5a18, 0x0050, 0x5a18, 0x8001, 0x7042,
++      0x7044, 0xa005, 0x0040, 0x5a20, 0x0050, 0x5a20, 0x8001, 0x7046,
++      0x7018, 0xa00d, 0x0040, 0x5a31, 0x7008, 0x8001, 0x700a, 0x00c0,
++      0x5a31, 0x700b, 0x0009, 0x8109, 0x711a, 0x00c0, 0x5a31, 0x701c,
++      0x107a, 0x127f, 0x7004, 0x0079, 0x5a35, 0x5a5c, 0x5a5d, 0x5a79,
++      0x0e7e, 0x2071, 0xa8c4, 0x7018, 0xa005, 0x00c0, 0x5a43, 0x711a,
++      0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x2071,
++      0xa8c4, 0x701c, 0xa206, 0x00c0, 0x5a4f, 0x701a, 0x701e, 0x007f,
++      0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa8c4, 0x6088, 0xa102, 0x0048,
++      0x5a5a, 0x618a, 0x0e7f, 0x007c, 0x007c, 0x7110, 0x1078, 0x45c4,
++      0x00c0, 0x5a6f, 0x6088, 0x8001, 0x0048, 0x5a6f, 0x608a, 0x00c0,
++      0x5a6f, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x8108,
++      0xa182, 0x00ff, 0x0048, 0x5a77, 0xa00e, 0x7007, 0x0002, 0x7112,
++      0x007c, 0x7014, 0x2060, 0x127e, 0x2091, 0x8000, 0x603c, 0xa005,
++      0x0040, 0x5a88, 0x8001, 0x603e, 0x00c0, 0x5a88, 0x1078, 0x8f9c,
++      0x6014, 0xa005, 0x0040, 0x5ab2, 0x8001, 0x6016, 0x00c0, 0x5ab2,
++      0x611c, 0xa186, 0x0003, 0x0040, 0x5a99, 0xa186, 0x0006, 0x00c0,
++      0x5ab0, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0048, 0x5ab0,
++      0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048, 0x5aa9, 0x2001,
++      0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x0078, 0x5ab2,
++      0x1078, 0x8abe, 0x127f, 0xac88, 0x0010, 0x7116, 0x2001, 0xcd00,
++      0xa102, 0x0048, 0x5abf, 0x7017, 0xad00, 0x7007, 0x0000, 0x007c,
++      0x0e7e, 0x2071, 0xa8c4, 0x7027, 0x07d0, 0x7023, 0x0009, 0x703b,
++      0x0002, 0x0e7f, 0x007c, 0x2001, 0xa8cd, 0x2003, 0x0000, 0x007c,
++      0x0e7e, 0x2071, 0xa8c4, 0x7132, 0x702f, 0x0009, 0x0e7f, 0x007c,
++      0x2011, 0xa8d0, 0x2013, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa8c4,
++      0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x027e, 0x0e7e,
++      0x0f7e, 0x2079, 0xa600, 0x7a34, 0xd294, 0x0040, 0x5b15, 0x2071,
++      0xa8ac, 0x2e14, 0xa0fe, 0x0000, 0x0040, 0x5b02, 0xa0fe, 0x0001,
++      0x0040, 0x5b06, 0xa0fe, 0x0002, 0x00c0, 0x5b11, 0xa292, 0x0085,
++      0x0078, 0x5b08, 0xa292, 0x0005, 0x0078, 0x5b08, 0xa292, 0x0002,
++      0x2272, 0x0040, 0x5b0d, 0x00c8, 0x5b15, 0x2011, 0x8037, 0x1078,
++      0x361b, 0x2011, 0xa8ab, 0x2204, 0x2072, 0x0f7f, 0x0e7f, 0x027f,
++      0x007c, 0x0c7e, 0x2061, 0xa933, 0x0c7f, 0x007c, 0xa184, 0x000f,
++      0x8003, 0x8003, 0x8003, 0xa080, 0xa933, 0x2060, 0x007c, 0x6854,
++      0xa08a, 0x199a, 0x0048, 0x5b2e, 0x2001, 0x1999, 0xa005, 0x00c0,
++      0x5b3d, 0x0c7e, 0x2061, 0xa933, 0x6014, 0x0c7f, 0xa005, 0x00c0,
++      0x5b42, 0x2001, 0x001e, 0x0078, 0x5b42, 0xa08e, 0xffff, 0x00c0,
++      0x5b42, 0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c,
++      0xa08c, 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x5b9e, 0xd0b4, 0x00c0,
++      0x5b59, 0xd0bc, 0x00c0, 0x5b8b, 0x2009, 0x0006, 0x1078, 0x5bc3,
++      0x007c, 0xd0fc, 0x0040, 0x5b64, 0xa084, 0x0003, 0x0040, 0x5b64,
++      0xa086, 0x0003, 0x00c0, 0x5bbc, 0x6024, 0xd0d4, 0x0040, 0x5b6e,
++      0xc0d4, 0x6026, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xa674,
++      0x2104, 0xd084, 0x0040, 0x5b83, 0x6118, 0xa188, 0x0027, 0x2104,
++      0xd08c, 0x00c0, 0x5b83, 0x87ff, 0x00c0, 0x5b82, 0x2009, 0x0042,
++      0x1078, 0x775c, 0x007c, 0x87ff, 0x00c0, 0x5b8a, 0x2009, 0x0043,
++      0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040, 0x5b96, 0xa084, 0x0003,
++      0x0040, 0x5b96, 0xa086, 0x0003, 0x00c0, 0x5bbc, 0x87ff, 0x00c0,
++      0x5b9d, 0x2009, 0x0042, 0x1078, 0x775c, 0x007c, 0xd0fc, 0x0040,
++      0x5baf, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0040, 0x5bb3, 0x87ff,
++      0x00c0, 0x5bae, 0x2009, 0x0041, 0x1078, 0x775c, 0x007c, 0x1078,
++      0x5bc1, 0x0078, 0x5bae, 0x87ff, 0x00c0, 0x5bae, 0x2009, 0x0043,
++      0x1078, 0x775c, 0x0078, 0x5bae, 0x2009, 0x0004, 0x1078, 0x5bc3,
++      0x007c, 0x2009, 0x0001, 0x0d7e, 0x6010, 0xa0ec, 0xf000, 0x0040,
++      0x5bef, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0,
++      0x5be5, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x5be5,
++      0x0c7e, 0x2061, 0xa933, 0x6200, 0xd28c, 0x00c0, 0x5be4, 0x6204,
++      0x8210, 0x0048, 0x5be4, 0x6206, 0x0c7f, 0x1078, 0x4a73, 0x6010,
++      0xa06d, 0x077e, 0x2039, 0x0000, 0x10c0, 0x5b27, 0x077f, 0x0d7f,
++      0x007c, 0x157e, 0x0c7e, 0x2061, 0xa933, 0x6000, 0x81ff, 0x0040,
++      0x5bfc, 0xa205, 0x0078, 0x5bfd, 0xa204, 0x6002, 0x0c7f, 0x157f,
++      0x007c, 0x6800, 0xd08c, 0x00c0, 0x5c0d, 0x6808, 0xa005, 0x0040,
++      0x5c0d, 0x8001, 0x680a, 0xa085, 0x0001, 0x007c, 0x20a9, 0x0010,
++      0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x5c17, 0xa200, 0x00f0,
++      0x5c12, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005,
++      0x0040, 0x5c3d, 0xa11a, 0x00c8, 0x5c3d, 0x8213, 0x818d, 0x0048,
++      0x5c30, 0xa11a, 0x00c8, 0x5c31, 0x00f0, 0x5c25, 0x0078, 0x5c35,
++      0xa11a, 0x2308, 0x8210, 0x00f0, 0x5c25, 0x007e, 0x3200, 0xa084,
++      0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085,
++      0x0800, 0x0078, 0x5c39, 0x127e, 0x2091, 0x2200, 0x2079, 0xa8b1,
++      0x127f, 0x0d7e, 0x2069, 0xa8b1, 0x6803, 0x0005, 0x2069, 0x0004,
++      0x2d04, 0xa085, 0x8001, 0x206a, 0x0d7f, 0x007c, 0x0c7e, 0x6027,
++      0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x5c5e, 0x5c68, 0x5c8d,
++      0x5ce8, 0x5c6e, 0x5c8d, 0x5c68, 0x5c66, 0x5c66, 0x1078, 0x1332,
++      0x1078, 0x5acb, 0x1078, 0x62d1, 0x0c7f, 0x007c, 0x62c0, 0x82ff,
++      0x00c0, 0x5c74, 0x0c7f, 0x007c, 0x2011, 0x41dc, 0x1078, 0x5a45,
++      0x7828, 0xa092, 0x00c8, 0x00c8, 0x5c83, 0x8000, 0x782a, 0x1078,
++      0x421b, 0x0078, 0x5c72, 0x1078, 0x41dc, 0x7807, 0x0003, 0x7827,
++      0x0000, 0x782b, 0x0000, 0x0078, 0x5c72, 0x1078, 0x5acb, 0x3c00,
++      0x007e, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x007f, 0x20e0,
++      0x82ff, 0x0040, 0x5cab, 0x62c0, 0x82ff, 0x00c0, 0x5cab, 0x782b,
++      0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013, 0x1078,
++      0x775c, 0x0c7f, 0x007c, 0x3900, 0xa082, 0xa9e3, 0x00c8, 0x5cb2,
++      0x1078, 0x747a, 0x0c7e, 0x7824, 0xa065, 0x1040, 0x1332, 0x7804,
++      0xa086, 0x0004, 0x0040, 0x5d2d, 0x7828, 0xa092, 0x2710, 0x00c8,
++      0x5cc8, 0x8000, 0x782a, 0x0c7f, 0x1078, 0x6e01, 0x0078, 0x5ca9,
++      0x6104, 0xa186, 0x0003, 0x00c0, 0x5cdf, 0x0e7e, 0x2071, 0xa600,
++      0x70d8, 0x0e7f, 0xd08c, 0x0040, 0x5cdf, 0x0c7e, 0x0e7e, 0x2061,
++      0x0100, 0x2071, 0xa600, 0x1078, 0x4224, 0x0e7f, 0x0c7f, 0x1078,
++      0xa5c4, 0x2009, 0x0014, 0x1078, 0x775c, 0x0c7f, 0x0078, 0x5ca9,
++      0x2001, 0xa8cd, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x5cfc,
++      0x782b, 0x0000, 0x7824, 0xa065, 0x1040, 0x1332, 0x2009, 0x0013,
++      0x1078, 0x77b3, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x3900, 0xa082,
++      0xa9e3, 0x00c8, 0x5d05, 0x1078, 0x747a, 0x7824, 0xa005, 0x1040,
++      0x1332, 0x781c, 0xa06d, 0x1040, 0x1332, 0x6800, 0xc0dc, 0x6802,
++      0x7924, 0x2160, 0x1078, 0x772d, 0x693c, 0x81ff, 0x1040, 0x1332,
++      0x8109, 0x693e, 0x6854, 0xa015, 0x0040, 0x5d21, 0x7a1e, 0x0078,
++      0x5d23, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f,
++      0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5cfa, 0x6104, 0xa186, 0x0002,
++      0x0040, 0x5d38, 0xa186, 0x0004, 0x0040, 0x5d38, 0x0078, 0x5cbc,
++      0x7808, 0xac06, 0x0040, 0x5cbc, 0x1078, 0x61cd, 0x1078, 0x5dd7,
++      0x0c7f, 0x1078, 0x62d1, 0x0078, 0x5ca9, 0x0c7e, 0x6027, 0x0002,
++      0x62c8, 0x82ff, 0x00c0, 0x5d61, 0x62c4, 0x82ff, 0x00c0, 0x5d61,
++      0x793c, 0xa1e5, 0x0000, 0x0040, 0x5d5b, 0x2009, 0x0049, 0x1078,
++      0x775c, 0x0c7f, 0x007c, 0x2011, 0xa8d0, 0x2013, 0x0000, 0x0078,
++      0x5d59, 0x3908, 0xa192, 0xa9e3, 0x00c8, 0x5d68, 0x1078, 0x747a,
++      0x6017, 0x0010, 0x793c, 0x81ff, 0x0040, 0x5d5b, 0x7944, 0xa192,
++      0x7530, 0x00c8, 0x5d85, 0x8108, 0x7946, 0x793c, 0xa188, 0x0007,
++      0x210c, 0xa18e, 0x0006, 0x00c0, 0x5d81, 0x6017, 0x0012, 0x0078,
++      0x5d59, 0x6017, 0x0016, 0x0078, 0x5d59, 0x7848, 0xc085, 0x784a,
++      0x0078, 0x5d59, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000,
++      0x600f, 0x0000, 0x2c08, 0x2061, 0xa8b1, 0x6020, 0x8000, 0x6022,
++      0x6010, 0xa005, 0x0040, 0x5da5, 0xa080, 0x0003, 0x2102, 0x6112,
++      0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078,
++      0x5da0, 0x0d7e, 0x2069, 0xa8b1, 0x6000, 0xd0d4, 0x0040, 0x5dbe,
++      0x6820, 0x8000, 0x6822, 0xa086, 0x0001, 0x00c0, 0x5db9, 0x2c00,
++      0x681e, 0x6804, 0xa084, 0x0007, 0x0079, 0x62d9, 0xc0d5, 0x6002,
++      0x6818, 0xa005, 0x0040, 0x5dd0, 0x6056, 0x605b, 0x0000, 0x007e,
++      0x2c00, 0x681a, 0x0d7f, 0x685a, 0x2069, 0xa8b1, 0x0078, 0x5db0,
++      0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x5db0, 0x007e,
++      0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08,
++      0x2061, 0xa8b1, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040,
++      0x5df2, 0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f,
++      0x007f, 0x007c, 0x610e, 0x610a, 0x0078, 0x5ded, 0x0c7e, 0x600f,
++      0x0000, 0x2c08, 0x2061, 0xa8b1, 0x6034, 0xa005, 0x0040, 0x5e06,
++      0xa080, 0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136,
++      0x0078, 0x5e04, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e,
++      0x037e, 0x027e, 0x017e, 0x007e, 0x127e, 0xa02e, 0x2071, 0xa8b1,
++      0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x5e8c,
++      0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x5e87, 0x87ff,
++      0x0040, 0x5e2e, 0x6020, 0xa106, 0x00c0, 0x5e87, 0x703c, 0xac06,
++      0x00c0, 0x5e44, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033,
++      0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b,
++      0x0000, 0x037f, 0x2029, 0x0001, 0x7038, 0xac36, 0x00c0, 0x5e4a,
++      0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5e58, 0x2c00, 0xaf36,
++      0x0040, 0x5e56, 0x2f00, 0x7036, 0x0078, 0x5e58, 0x7037, 0x0000,
++      0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5e61, 0x7e0e, 0x0078,
++      0x5e62, 0x2678, 0x600f, 0x0000, 0x1078, 0x8d06, 0x0040, 0x5e82,
++      0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5e9d, 0x6837,
++      0x0103, 0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x077e, 0x1078,
++      0x8f7d, 0x1078, 0xa4e2, 0x1078, 0x4a73, 0x077f, 0x037f, 0x017f,
++      0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x5e1d, 0x2c78,
++      0x600c, 0x2060, 0x0078, 0x5e1d, 0x85ff, 0x0040, 0x5e91, 0x1078,
++      0x639b, 0x127f, 0x007f, 0x017f, 0x027f, 0x037f, 0x057f, 0x067f,
++      0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006,
++      0x00c0, 0x5e6f, 0x017e, 0x037e, 0x077e, 0x1078, 0xa4e2, 0x1078,
++      0xa1ca, 0x077f, 0x037f, 0x017f, 0x0078, 0x5e82, 0x007e, 0x067e,
++      0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091, 0x8000,
++      0x2079, 0xa8b1, 0x7838, 0xa065, 0x0040, 0x5eef, 0x600c, 0x007e,
++      0x600f, 0x0000, 0x783c, 0xac06, 0x00c0, 0x5ed6, 0x037e, 0x2019,
++      0x0001, 0x1078, 0x7058, 0x7833, 0x0000, 0x783f, 0x0000, 0x7843,
++      0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x037f, 0x1078, 0x8d06,
++      0x0040, 0x5eea, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0,
++      0x5ef8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73,
++      0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x007f, 0x0078, 0x5ebb, 0x7e3a,
++      0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c,
++      0x601c, 0xa086, 0x0006, 0x00c0, 0x5ee1, 0x1078, 0xa1ca, 0x0078,
++      0x5eea, 0x017e, 0x027e, 0x087e, 0x2041, 0x0000, 0x1078, 0x5f1b,
++      0x1078, 0x5fdb, 0x087f, 0x027f, 0x017f, 0x007c, 0x0f7e, 0x127e,
++      0x2079, 0xa8b1, 0x2091, 0x8000, 0x1078, 0x6076, 0x1078, 0x60ec,
++      0x127f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e,
++      0x017e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x7614,
++      0x2660, 0x2678, 0x8cff, 0x0040, 0x5fb5, 0x6018, 0xa080, 0x0028,
++      0x2004, 0xa206, 0x00c0, 0x5fb0, 0x88ff, 0x0040, 0x5f3b, 0x6020,
++      0xa106, 0x00c0, 0x5fb0, 0x7024, 0xac06, 0x00c0, 0x5f6b, 0x2069,
++      0x0100, 0x68c0, 0xa005, 0x0040, 0x5f66, 0x1078, 0x5acb, 0x1078,
++      0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000, 0x037e,
++      0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x5f5b, 0x6803,
++      0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040,
++      0x5f63, 0x6827, 0x0001, 0x037f, 0x0078, 0x5f6b, 0x6003, 0x0009,
++      0x630a, 0x0078, 0x5fb0, 0x7014, 0xac36, 0x00c0, 0x5f71, 0x660c,
++      0x7616, 0x7010, 0xac36, 0x00c0, 0x5f7f, 0x2c00, 0xaf36, 0x0040,
++      0x5f7d, 0x2f00, 0x7012, 0x0078, 0x5f7f, 0x7013, 0x0000, 0x660c,
++      0x067e, 0x2c00, 0xaf06, 0x0040, 0x5f88, 0x7e0e, 0x0078, 0x5f89,
++      0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++      0x5fa9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5fbe, 0x6837, 0x0103,
++      0x6b4a, 0x6847, 0x0000, 0x017e, 0x037e, 0x087e, 0x1078, 0x8f7d,
++      0x1078, 0xa4e2, 0x1078, 0x4a73, 0x087f, 0x037f, 0x017f, 0x1078,
++      0x8eb9, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x5f2a,
++      0x2c78, 0x600c, 0x2060, 0x0078, 0x5f2a, 0x127f, 0x007f, 0x017f,
++      0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086,
++      0x0006, 0x00c0, 0x5fcf, 0x017e, 0x037e, 0x087e, 0x1078, 0xa4e2,
++      0x1078, 0xa1ca, 0x087f, 0x037f, 0x017f, 0x0078, 0x5fa9, 0x601c,
++      0xa086, 0x0002, 0x00c0, 0x5fa9, 0x6004, 0xa086, 0x0085, 0x0040,
++      0x5f96, 0x0078, 0x5fa9, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000,
++      0xa280, 0xa735, 0x2004, 0xa065, 0x0040, 0x6072, 0x0f7e, 0x0e7e,
++      0x0d7e, 0x067e, 0x2071, 0xa8b1, 0x6654, 0x7018, 0xac06, 0x00c0,
++      0x5ff2, 0x761a, 0x701c, 0xac06, 0x00c0, 0x5ffe, 0x86ff, 0x00c0,
++      0x5ffd, 0x7018, 0x701e, 0x0078, 0x5ffe, 0x761e, 0x6058, 0xa07d,
++      0x0040, 0x6003, 0x7e56, 0xa6ed, 0x0000, 0x0040, 0x6009, 0x2f00,
++      0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc,
++      0x6002, 0x1078, 0x44d3, 0x0040, 0x606e, 0x7624, 0x86ff, 0x0040,
++      0x605c, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x605c, 0x0d7e,
++      0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x6053, 0x1078, 0x5acb,
++      0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7027, 0x0000,
++      0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x603c,
++      0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
++      0x0040, 0x6044, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c,
++      0xa005, 0x0040, 0x604d, 0x8001, 0x603e, 0x2660, 0x1078, 0x8ec6,
++      0x0c7f, 0x0078, 0x605c, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009,
++      0x630a, 0x0c7f, 0x0078, 0x6011, 0x8dff, 0x0040, 0x606a, 0x6837,
++      0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f7d, 0x1078, 0xa4e2,
++      0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x6011, 0x067f, 0x0d7f,
++      0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e, 0x067e,
++      0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814, 0xa065, 0x0040, 0x60d0,
++      0x600c, 0x007e, 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0, 0x60b5,
++      0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x60af, 0x1078, 0x5acb,
++      0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378, 0x7827, 0x0000,
++      0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x60a4,
++      0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
++      0x0040, 0x60ac, 0x6827, 0x0001, 0x037f, 0x0078, 0x60b5, 0x6003,
++      0x0009, 0x630a, 0x2c30, 0x0078, 0x60cd, 0x6010, 0x2068, 0x1078,
++      0x8d06, 0x0040, 0x60c9, 0x601c, 0xa086, 0x0003, 0x00c0, 0x60d7,
++      0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078,
++      0x8eb9, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x007f, 0x0078, 0x607d,
++      0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c,
++      0xa086, 0x0006, 0x00c0, 0x60e0, 0x1078, 0xa1ca, 0x0078, 0x60c9,
++      0x601c, 0xa086, 0x0002, 0x00c0, 0x60c9, 0x6004, 0xa086, 0x0085,
++      0x0040, 0x60c0, 0x0078, 0x60c9, 0x007e, 0x067e, 0x0c7e, 0x0d7e,
++      0x7818, 0xa065, 0x0040, 0x615a, 0x6054, 0x007e, 0x6057, 0x0000,
++      0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x44d3,
++      0x0040, 0x6157, 0x7e24, 0x86ff, 0x0040, 0x6149, 0xa680, 0x0004,
++      0x2004, 0xad06, 0x00c0, 0x6149, 0x0d7e, 0x2069, 0x0100, 0x68c0,
++      0xa005, 0x0040, 0x6140, 0x1078, 0x5acb, 0x1078, 0x6e0f, 0x68c3,
++      0x0000, 0x1078, 0x7378, 0x7827, 0x0000, 0x037e, 0x2069, 0x0140,
++      0x6b04, 0xa384, 0x1000, 0x0040, 0x6129, 0x6803, 0x0100, 0x6803,
++      0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x6131, 0x6827,
++      0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x613a,
++      0x8001, 0x603e, 0x2660, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x6149,
++      0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078,
++      0x60fe, 0x8dff, 0x0040, 0x6153, 0x6837, 0x0103, 0x6b4a, 0x6847,
++      0x0000, 0x1078, 0x4a73, 0x1078, 0x7233, 0x0078, 0x60fe, 0x007f,
++      0x0078, 0x60f1, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
++      0x007c, 0x0e7e, 0x0d7e, 0x067e, 0x6000, 0xd0dc, 0x0040, 0x6181,
++      0x604c, 0xa06d, 0x0040, 0x6181, 0x6848, 0xa606, 0x00c0, 0x6181,
++      0x2071, 0xa8b1, 0x7024, 0xa035, 0x0040, 0x6181, 0xa080, 0x0004,
++      0x2004, 0xad06, 0x00c0, 0x6181, 0x6000, 0xc0dc, 0x6002, 0x1078,
++      0x6185, 0x067f, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x2079, 0x0100,
++      0x78c0, 0xa005, 0x00c0, 0x6194, 0x0c7e, 0x2660, 0x6003, 0x0009,
++      0x630a, 0x0c7f, 0x0078, 0x61cb, 0x1078, 0x6e0f, 0x78c3, 0x0000,
++      0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2079, 0x0140, 0x7b04,
++      0xa384, 0x1000, 0x0040, 0x61a8, 0x7803, 0x0100, 0x7803, 0x0000,
++      0x2079, 0x0100, 0x7824, 0xd084, 0x0040, 0x61b0, 0x7827, 0x0001,
++      0x1078, 0x7378, 0x037f, 0x1078, 0x44d3, 0x0c7e, 0x603c, 0xa005,
++      0x0040, 0x61bc, 0x8001, 0x603e, 0x2660, 0x1078, 0x772d, 0x0c7f,
++      0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8f7d, 0x1078,
++      0x4a73, 0x1078, 0x7233, 0x0f7f, 0x007c, 0x0e7e, 0x0c7e, 0x2071,
++      0xa8b1, 0x7004, 0xa084, 0x0007, 0x0079, 0x61d6, 0x61e0, 0x61e3,
++      0x61fc, 0x6218, 0x6262, 0x61e0, 0x61e0, 0x61de, 0x1078, 0x1332,
++      0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x61f1, 0x7020,
++      0x8001, 0x7022, 0x600c, 0xa015, 0x0040, 0x61f8, 0x7216, 0x600f,
++      0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c,
++      0x7216, 0x7212, 0x0078, 0x61f1, 0x6018, 0x2060, 0x1078, 0x44d3,
++      0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0040, 0x620d,
++      0x6054, 0xa015, 0x0040, 0x6214, 0x721e, 0x7007, 0x0000, 0x7027,
++      0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, 0x721e, 0x0078, 0x620d,
++      0x7024, 0xa065, 0x0040, 0x625f, 0x700c, 0xac06, 0x00c0, 0x622f,
++      0x1078, 0x7233, 0x600c, 0xa015, 0x0040, 0x622b, 0x720e, 0x600f,
++      0x0000, 0x0078, 0x625d, 0x720e, 0x720a, 0x0078, 0x625d, 0x7014,
++      0xac06, 0x00c0, 0x6242, 0x1078, 0x7233, 0x600c, 0xa015, 0x0040,
++      0x623e, 0x7216, 0x600f, 0x0000, 0x0078, 0x625d, 0x7216, 0x7212,
++      0x0078, 0x625d, 0x601c, 0xa086, 0x0003, 0x00c0, 0x625d, 0x6018,
++      0x2060, 0x1078, 0x44d3, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x7233,
++      0x701c, 0xa065, 0x0040, 0x625d, 0x6054, 0xa015, 0x0040, 0x625b,
++      0x721e, 0x0078, 0x625d, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f,
++      0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x626f, 0x1078, 0x7233,
++      0x600c, 0xa015, 0x0040, 0x6276, 0x720e, 0x600f, 0x0000, 0x1078,
++      0x7378, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a,
++      0x0078, 0x626f, 0x0d7e, 0x2069, 0xa8b1, 0x6830, 0xa084, 0x0003,
++      0x0079, 0x6282, 0x6288, 0x628a, 0x62b4, 0x6288, 0x1078, 0x1332,
++      0x0d7f, 0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x62aa,
++      0x683c, 0xa065, 0x0040, 0x629b, 0x600c, 0xa015, 0x0040, 0x62a6,
++      0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011,
++      0xa8d0, 0x2013, 0x0000, 0x0c7f, 0x0d7f, 0x007c, 0x683a, 0x6836,
++      0x0078, 0x629b, 0x6843, 0x0000, 0x6838, 0xa065, 0x0040, 0x629b,
++      0x6003, 0x0003, 0x0078, 0x629b, 0x0c7e, 0x6843, 0x0000, 0x6847,
++      0x0000, 0x684b, 0x0000, 0x683c, 0xa065, 0x0040, 0x62ce, 0x600c,
++      0xa015, 0x0040, 0x62ca, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000,
++      0x0078, 0x62ce, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f,
++      0x007c, 0x0d7e, 0x2069, 0xa8b1, 0x6804, 0xa084, 0x0007, 0x0079,
++      0x62d9, 0x62e3, 0x638a, 0x638a, 0x638a, 0x638a, 0x638c, 0x638a,
++      0x62e1, 0x1078, 0x1332, 0x6820, 0xa005, 0x00c0, 0x62e9, 0x0d7f,
++      0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x62f8, 0x6807, 0x0004,
++      0x6826, 0x682b, 0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c,
++      0x6814, 0xa065, 0x0040, 0x6306, 0x6807, 0x0001, 0x6826, 0x682b,
++      0x0000, 0x1078, 0x63d4, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e,
++      0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x6385, 0x704c, 0xa00d, 0x0040,
++      0x6315, 0x7088, 0xa005, 0x0040, 0x632d, 0x7054, 0xa075, 0x0040,
++      0x631e, 0xa20e, 0x0040, 0x6385, 0x0078, 0x6323, 0x6818, 0xa20e,
++      0x0040, 0x6385, 0x2070, 0x704c, 0xa00d, 0x0040, 0x6315, 0x7088,
++      0xa005, 0x00c0, 0x6315, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302,
++      0x00c8, 0x6315, 0x1078, 0x76fc, 0x0040, 0x6385, 0x8318, 0x733e,
++      0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff,
++      0x6032, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, 0x2004,
++      0xa08a, 0x199a, 0x0048, 0x634e, 0x2001, 0x1999, 0x8003, 0x801b,
++      0x831b, 0xa318, 0x6316, 0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc,
++      0x0040, 0x6367, 0x7100, 0xd1f4, 0x0040, 0x6363, 0x7114, 0xa18c,
++      0x00ff, 0x0078, 0x636c, 0x2009, 0x0000, 0x0078, 0x636c, 0xa1e0,
++      0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078,
++      0x6965, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26,
++      0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040,
++      0x0f7f, 0x0e7f, 0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f,
++      0x0078, 0x6383, 0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040,
++      0x6398, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x63d4,
++      0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0d7e, 0x2069, 0xa8b1, 0x6830,
++      0xa086, 0x0000, 0x00c0, 0x63bb, 0x6838, 0xa07d, 0x0040, 0x63bb,
++      0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x127e,
++      0x0f7e, 0x2091, 0x2200, 0x027f, 0x1078, 0x1d6d, 0x00c0, 0x63be,
++      0x127f, 0x1078, 0x6cb3, 0x0d7f, 0x0f7f, 0x007c, 0x127f, 0x6843,
++      0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0040, 0x63d0, 0x6a3a,
++      0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x63bb,
++      0x683a, 0x6836, 0x0078, 0x63ca, 0x601c, 0xa084, 0x000f, 0x1079,
++      0x63da, 0x007c, 0x63e3, 0x63e8, 0x6809, 0x6922, 0x63e8, 0x6809,
++      0x6922, 0x63e3, 0x63e8, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c,
++      0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0044,
++      0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040, 0x6405,
++      0x7900, 0xd1f4, 0x0040, 0x6401, 0x7914, 0xa18c, 0x00ff, 0x0078,
++      0x640a, 0x2009, 0x0000, 0x0078, 0x640a, 0xa1f8, 0x29c0, 0x2f0c,
++      0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040,
++      0x00c8, 0x645c, 0x1079, 0x641a, 0x0f7f, 0x0c7f, 0x147f, 0x137f,
++      0x157f, 0x007c, 0x64c2, 0x650a, 0x6532, 0x65cd, 0x65fd, 0x6605,
++      0x662c, 0x663d, 0x664e, 0x6656, 0x666e, 0x6656, 0x66d9, 0x663d,
++      0x66fa, 0x6702, 0x664e, 0x6702, 0x6713, 0x645a, 0x645a, 0x645a,
++      0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a, 0x645a,
++      0x6eef, 0x6f14, 0x6f29, 0x6f4c, 0x6f6d, 0x662c, 0x645a, 0x662c,
++      0x6656, 0x645a, 0x6532, 0x65cd, 0x645a, 0x749c, 0x6656, 0x645a,
++      0x74bc, 0x6656, 0x645a, 0x645a, 0x64bd, 0x646b, 0x645a, 0x74e1,
++      0x7558, 0x7640, 0x645a, 0x7651, 0x6626, 0x766d, 0x645a, 0x6f82,
++      0x645a, 0x645a, 0x1078, 0x1332, 0x2100, 0x1079, 0x6465, 0x0f7f,
++      0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x6469, 0x6469, 0x6469,
++      0x649f, 0x1078, 0x1332, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x6731,
++      0x7810, 0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800,
++      0x683c, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb, 0x0d7f, 0x007c,
++      0x0d7e, 0x7818, 0x2068, 0x68a0, 0xa082, 0x007e, 0x0048, 0x649c,
++      0xa085, 0x0001, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x649a, 0x0d7e,
++      0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500, 0x20a3, 0x0000,
++      0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810,
++      0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3,
++      0x0010, 0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x6030, 0x609a, 0x1078,
++      0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x5200,
++      0x20a3, 0x0000, 0x0d7e, 0x2069, 0xa652, 0x6804, 0xd084, 0x0040,
++      0x64dc, 0x6828, 0x20a3, 0x0000, 0x017e, 0x1078, 0x2564, 0x21a2,
++      0x017f, 0x0d7f, 0x0078, 0x64e1, 0x0d7f, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x20a9, 0x0004,
++      0x2099, 0xa601, 0x53a6, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082,
++      0x007f, 0x0048, 0x64fb, 0x2001, 0xa61b, 0x20a6, 0x2001, 0xa61c,
++      0x20a6, 0x0078, 0x6501, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff,
++      0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078,
++      0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x0500,
++      0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f,
++      0x0048, 0x6522, 0x2001, 0xa61b, 0x20a6, 0x2001, 0xa61c, 0x20a6,
++      0x0078, 0x6528, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2,
++      0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x60c3, 0x0010, 0x1078,
++      0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6731, 0x0c7e, 0x7818,
++      0x2060, 0x2001, 0x0000, 0x1078, 0x4972, 0x0c7f, 0x7818, 0xa080,
++      0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x654d, 0x20a3, 0x0400,
++      0x620c, 0xc2b4, 0x620e, 0x0078, 0x654f, 0x20a3, 0x0300, 0x20a3,
++      0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0,
++      0x659c, 0x2099, 0xa88d, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304,
++      0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099,
++      0xa605, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa601, 0x53a6, 0x20a9,
++      0x0010, 0x20a3, 0x0000, 0x00f0, 0x6579, 0x2099, 0xa895, 0x3304,
++      0xc0dd, 0x20a2, 0x2001, 0xa672, 0x2004, 0xd0e4, 0x0040, 0x6594,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6,
++      0x20a9, 0x0004, 0x0078, 0x6596, 0x20a9, 0x0007, 0x20a3, 0x0000,
++      0x00f0, 0x6596, 0x0078, 0x65bc, 0x2099, 0xa88d, 0x20a9, 0x0008,
++      0x53a6, 0x20a9, 0x0004, 0x2099, 0xa605, 0x53a6, 0x20a9, 0x0004,
++      0x2099, 0xa601, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0,
++      0x65ad, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x65b3, 0x2099,
++      0xa895, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000,
++      0x00f0, 0x65be, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x65c4,
++      0x60c3, 0x0074, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++      0x6731, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3,
++      0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e,
++      0x2079, 0xa652, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x65e9, 0xa085,
++      0x0020, 0xd1a4, 0x0040, 0x65ee, 0xa085, 0x0010, 0xa085, 0x0002,
++      0x0d7e, 0x0078, 0x66b7, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++      0x6731, 0x20a3, 0x5000, 0x0078, 0x654f, 0x20a1, 0x020b, 0x1078,
++      0x6731, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b,
++      0x1078, 0x67b9, 0x0078, 0x6630, 0x20a1, 0x020b, 0x1078, 0x67c2,
++      0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0004, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++      0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3,
++      0x2a00, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b,
++      0x1078, 0x67c2, 0x20a3, 0x0200, 0x0078, 0x654f, 0x20a1, 0x020b,
++      0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005,
++      0x0040, 0x6665, 0x20a2, 0x0078, 0x6667, 0x20a3, 0x0003, 0x7810,
++      0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x0d7e, 0x20a1,
++      0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3,
++      0x0800, 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x6694,
++      0x6998, 0xa184, 0xc000, 0x00c0, 0x6690, 0xd1ec, 0x0040, 0x668c,
++      0x20a3, 0x2100, 0x0078, 0x6696, 0x20a3, 0x0100, 0x0078, 0x6696,
++      0x20a3, 0x0400, 0x0078, 0x6696, 0x20a3, 0x0700, 0xa006, 0x20a2,
++      0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0xa652, 0x7904,
++      0x0f7f, 0xd1ac, 0x00c0, 0x66a6, 0xa085, 0x0020, 0xd1a4, 0x0040,
++      0x66ab, 0xa085, 0x0010, 0x2009, 0xa674, 0x210c, 0xd184, 0x0040,
++      0x66b5, 0x699c, 0xd18c, 0x0040, 0x66b7, 0xa085, 0x0002, 0x027e,
++      0x2009, 0xa672, 0x210c, 0xd1e4, 0x0040, 0x66c5, 0xc0c5, 0xa094,
++      0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xd1ec, 0x0040, 0x66cf,
++      0xa094, 0x0030, 0xa296, 0x0010, 0x0040, 0x66cf, 0xc0bd, 0x027f,
++      0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x1078, 0x6dfb, 0x0d7f,
++      0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0210, 0x20a3,
++      0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++      0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0200,
++      0x0078, 0x64c8, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100,
++      0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008,
++      0x1078, 0x6dfb, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1,
++      0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++      0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c,
++      0x027e, 0x037e, 0x047e, 0x2019, 0x3200, 0x2021, 0x0800, 0x0078,
++      0x6738, 0x027e, 0x037e, 0x047e, 0x2019, 0x2200, 0x2021, 0x0100,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014,
++      0xa286, 0x007e, 0x00c0, 0x674b, 0xa385, 0x00ff, 0x20a2, 0x20a3,
++      0xfffe, 0x0078, 0x6780, 0xa286, 0x007f, 0x00c0, 0x6757, 0x0d7e,
++      0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x0078, 0x676e, 0xd2bc,
++      0x0040, 0x6776, 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x6766, 0xa385,
++      0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0078, 0x676e, 0xa2e8, 0xa735,
++      0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6784, 0x0d7e, 0xa2e8,
++      0xa735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++      0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x047f,
++      0x037f, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000,
++      0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f,
++      0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff,
++      0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0xa61b, 0x2da6, 0x8d68,
++      0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x678b,
++      0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000,
++      0x007c, 0x027e, 0x037e, 0x047e, 0x2019, 0x3300, 0x2021, 0x0800,
++      0x0078, 0x67c9, 0x027e, 0x037e, 0x047e, 0x2019, 0x2300, 0x2021,
++      0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xa092, 0x007e, 0x0048, 0x67e6, 0x0d7e, 0xa0e8, 0xa735,
++      0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x67f4, 0x0d7e, 0xa0e8,
++      0xa735, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++      0x20a3, 0x0000, 0x6230, 0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3,
++      0x0000, 0x047f, 0x037f, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000,
++      0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f,
++      0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x1332,
++      0xa08a, 0x008c, 0x10c8, 0x1332, 0x6118, 0x2178, 0x79a0, 0xd1bc,
++      0x0040, 0x6827, 0x7900, 0xd1f4, 0x0040, 0x6823, 0x7914, 0xa18c,
++      0x00ff, 0x0078, 0x682c, 0x2009, 0x0000, 0x0078, 0x682c, 0xa1f8,
++      0x29c0, 0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a,
++      0xa082, 0x0085, 0x1079, 0x6837, 0x0f7f, 0x0c7f, 0x007c, 0x6840,
++      0x684b, 0x6866, 0x683e, 0x683e, 0x683e, 0x6840, 0x1078, 0x1332,
++      0x147e, 0x20a1, 0x020b, 0x1078, 0x6879, 0x60c3, 0x0000, 0x1078,
++      0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x68ad,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2,
++      0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f, 0x007c, 0x147e, 0x20a1,
++      0x020b, 0x1078, 0x68ee, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078, 0x6dfb, 0x147f,
++      0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++      0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x6898, 0x0d7e, 0xa0e8,
++      0xa735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2,
++      0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x68a7,
++      0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2,
++      0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
++      0x0009, 0x20a3, 0x0000, 0x0078, 0x678b, 0x027e, 0x20e1, 0x9080,
++      0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e,
++      0x0048, 0x68cc, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085,
++      0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68,
++      0x2da6, 0x0d7f, 0x0078, 0x68db, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++      0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3,
++      0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, 0x1078,
++      0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7a10, 0x22a2,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e, 0x20e1,
++      0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092,
++      0x007e, 0x0048, 0x690d, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810,
++      0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6,
++      0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x691c, 0x0d7e, 0xa0e8, 0xa735,
++      0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x0d7f,
++      0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000,
++      0x0078, 0x68df, 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a, 0x0040,
++      0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332, 0x7918, 0x2160,
++      0x61a0, 0xd1bc, 0x0040, 0x6941, 0x6100, 0xd1f4, 0x0040, 0x693d,
++      0x6114, 0xa18c, 0x00ff, 0x0078, 0x6946, 0x2009, 0x0000, 0x0078,
++      0x6946, 0xa1e0, 0x29c0, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100,
++      0x619a, 0xa082, 0x0040, 0x1079, 0x6950, 0x0f7f, 0x0c7f, 0x007c,
++      0x6965, 0x6a73, 0x6a14, 0x6c27, 0x6963, 0x6963, 0x6963, 0x6963,
++      0x6963, 0x6963, 0x6963, 0x714c, 0x715d, 0x716e, 0x717f, 0x6963,
++      0x767e, 0x6963, 0x713b, 0x1078, 0x1332, 0x0d7e, 0x157e, 0x147e,
++      0x780b, 0xffff, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7910, 0x2168,
++      0x6948, 0x7922, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c,
++      0xa184, 0x000f, 0x00c0, 0x6980, 0x2001, 0x0005, 0x0078, 0x698a,
++      0xd184, 0x0040, 0x6987, 0x2001, 0x0004, 0x0078, 0x698a, 0xa084,
++      0x0006, 0x8004, 0x017e, 0x2008, 0x7830, 0xa084, 0x00ff, 0x8007,
++      0xa105, 0x017f, 0x20a2, 0xd1ac, 0x0040, 0x699a, 0x20a3, 0x0002,
++      0x0078, 0x69a6, 0xd1b4, 0x0040, 0x69a1, 0x20a3, 0x0001, 0x0078,
++      0x69a6, 0x20a3, 0x0000, 0x2230, 0x0078, 0x69a8, 0x6a80, 0x6e7c,
++      0x20a9, 0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000,
++      0x00f0, 0x69ac, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080,
++      0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xa8cd,
++      0x2003, 0x07d0, 0x2001, 0xa8cc, 0x2003, 0x0009, 0x2001, 0xa8d2,
++      0x2003, 0x0002, 0x1078, 0x158c, 0x147f, 0x157f, 0x0d7f, 0x007c,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014,
++      0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xd0bc, 0x0040, 0x69f6, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++      0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6a05, 0x0d7e, 0xa0e8,
++      0xa735, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2,
++      0x0d7f, 0x20a3, 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3,
++      0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++      0x20a1, 0x020b, 0x1078, 0x6a34, 0x7810, 0x2068, 0x6860, 0x20a2,
++      0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2,
++      0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x147f,
++      0x137f, 0x157f, 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6a52,
++      0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2,
++      0x6814, 0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++      0x0078, 0x6a61, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085,
++      0x0500, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230,
++      0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2,
++      0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x7810,
++      0xa0ec, 0xf000, 0x0040, 0x6a8b, 0xa06d, 0x1078, 0x495f, 0x0040,
++      0x6a8b, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6a8b,
++      0x7824, 0xc0cd, 0x7826, 0x20a1, 0x020b, 0x1078, 0x6be0, 0xa016,
++      0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000,
++      0x00c0, 0x6aa2, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x6aaa,
++      0x0078, 0x6aa5, 0xa006, 0x1079, 0x6aaa, 0x147f, 0x137f, 0x157f,
++      0x0d7f, 0x007c, 0x6ab4, 0x6b4c, 0x6b57, 0x6b81, 0x6b95, 0x6bb1,
++      0x6bbc, 0x6ab2, 0x1078, 0x1332, 0x017e, 0x037e, 0x694c, 0xa18c,
++      0x0003, 0x0040, 0x6abf, 0xa186, 0x0003, 0x00c0, 0x6ace, 0x6b78,
++      0x7824, 0xd0cc, 0x0040, 0x6ac5, 0xc3e5, 0x23a2, 0x6868, 0x20a2,
++      0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x6b8c, 0xa186, 0x0001,
++      0x10c0, 0x1332, 0x6b78, 0x7824, 0xd0cc, 0x0040, 0x6ad8, 0xc3e5,
++      0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2,
++      0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0040,
++      0x6b46, 0xd3c4, 0x0040, 0x6aee, 0x687c, 0xa108, 0xd3cc, 0x0040,
++      0x6af3, 0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80, 0x0020,
++      0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0, 0x6af8, 0x157f, 0x22a2,
++      0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040, 0x6b46, 0x20a1, 0x020b,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x007e, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xd0bc, 0x0040, 0x6b26, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++      0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6b35, 0x0d7e, 0xa0e8,
++      0xa735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
++      0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x007f, 0x7b24, 0xd3cc,
++      0x0040, 0x6b3e, 0x20a3, 0x0889, 0x0078, 0x6b40, 0x20a3, 0x0898,
++      0x20a2, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f,
++      0x017f, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc,
++      0x0040, 0x6b53, 0xc2e5, 0x22a2, 0xa016, 0x0078, 0x6b8a, 0x2011,
++      0x0302, 0x7824, 0xd0cc, 0x0040, 0x6b5e, 0xc2e5, 0x22a2, 0xa016,
++      0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008,
++      0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500,
++      0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2,
++      0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078, 0x6dfb,
++      0x007c, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x0040, 0x6b88, 0xc2e5,
++      0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++      0x60c3, 0x0018, 0x1078, 0x6dfb, 0x007c, 0x2011, 0x0100, 0x7824,
++      0xd0cc, 0x0040, 0x6b9c, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2,
++      0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7834, 0xa084,
++      0x00ff, 0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x6dfb,
++      0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0040, 0x6bb8, 0xc2e5,
++      0x22a2, 0xa016, 0x0078, 0x6b8a, 0x037e, 0x7b10, 0xa384, 0xff00,
++      0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x6bcf, 0x7824, 0xd0cc,
++      0x0040, 0x6bcb, 0xc2e5, 0x22a2, 0x037f, 0x0078, 0x6b8a, 0x047e,
++      0x2021, 0x0800, 0x007e, 0x7824, 0xd0cc, 0x007f, 0x0040, 0x6bd9,
++      0xc4e5, 0x24a2, 0x047f, 0x22a2, 0x20a2, 0x037f, 0x0078, 0x6b8c,
++      0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xd0bc, 0x0040, 0x6bfe, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++      0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6c0d, 0x0d7e, 0xa0e8,
++      0xa735, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
++      0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x7824, 0xd0cc, 0x0040,
++      0x6c15, 0x20a3, 0x0889, 0x0078, 0x6c17, 0x20a3, 0x0898, 0x20a3,
++      0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2,
++      0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e,
++      0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, 0xa084, 0x0700,
++      0x8007, 0x1079, 0x6c3a, 0x037f, 0x017f, 0x147f, 0x137f, 0x157f,
++      0x0d7f, 0x007c, 0x6c42, 0x6c42, 0x6c44, 0x6c42, 0x6c42, 0x6c42,
++      0x6c69, 0x6c42, 0x1078, 0x1332, 0x7910, 0xa18c, 0xf8ff, 0xa18d,
++      0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73,
++      0x0d7e, 0x2069, 0xa652, 0x6804, 0xd0bc, 0x0040, 0x6c5e, 0x682c,
++      0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x6c60, 0x20a3, 0x3f00,
++      0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x1078, 0x6dfb,
++      0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x6c73, 0x20a3,
++      0x7f00, 0x0078, 0x6c61, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
++      0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6c91, 0x0d7e,
++      0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814,
++      0x20a2, 0x2069, 0xa61b, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
++      0x6ca0, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c, 0x6810, 0xa085, 0x0100,
++      0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2,
++      0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078, 0x6dea, 0x22a2,
++      0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x057e, 0x047e,
++      0x037e, 0x2061, 0x0100, 0x2071, 0xa600, 0x6130, 0x7818, 0x2068,
++      0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x6cca, 0x6910, 0x6a14, 0x6430,
++      0x0078, 0x6cce, 0x6910, 0x6a14, 0x736c, 0x7470, 0x781c, 0xa086,
++      0x0006, 0x0040, 0x6d2d, 0xd5bc, 0x0040, 0x6cde, 0xa185, 0x0100,
++      0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6ce5, 0xa185, 0x0100,
++      0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, 0x0809, 0x6077,
++      0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a,
++      0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810, 0x2070,
++      0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca,
++      0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000,
++      0xa582, 0x0080, 0x0048, 0x6d17, 0x6a00, 0xd2f4, 0x0040, 0x6d15,
++      0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d17, 0x2011, 0x0000, 0x629e,
++      0x6017, 0x0016, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005,
++      0x0040, 0x6d24, 0x2009, 0x1b58, 0x1078, 0x5ad0, 0x037f, 0x047f,
++      0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c,
++      0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x6d85, 0xd5bc, 0x0040,
++      0x6d41, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078,
++      0x6d48, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e,
++      0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff,
++      0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808,
++      0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c,
++      0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928, 0xa109,
++      0x792a, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
++      0x0000, 0xa582, 0x0080, 0x0048, 0x6d80, 0x6a00, 0xd2f4, 0x0040,
++      0x6d7e, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6d80, 0x2011, 0x0000,
++      0x629e, 0x6017, 0x0012, 0x0078, 0x6d1a, 0xd5bc, 0x0040, 0x6d90,
++      0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6d97,
++      0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x1078,
++      0x495f, 0x0040, 0x6dad, 0x0d7e, 0x7810, 0xa06d, 0x684c, 0x0d7f,
++      0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6dad, 0x7824, 0xc0cd,
++      0x7826, 0x6073, 0x0889, 0x0078, 0x6daf, 0x6073, 0x0898, 0x6077,
++      0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a,
++      0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7014, 0x608a,
++      0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce,
++      0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080,
++      0x0048, 0x6ddd, 0x6a00, 0xd2f4, 0x0040, 0x6ddb, 0x6a14, 0xa294,
++      0x00ff, 0x0078, 0x6ddd, 0x2011, 0x0000, 0x629e, 0x7824, 0xd0cc,
++      0x0040, 0x6de6, 0x6017, 0x0016, 0x0078, 0x6d1a, 0x6017, 0x0012,
++      0x0078, 0x6d1a, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294,
++      0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e, 0x2069, 0xa8b1, 0x6843,
++      0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7,
++      0x9575, 0x1078, 0x6e06, 0x1078, 0x5ac0, 0x007c, 0x007e, 0x6014,
++      0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x007f, 0x007c, 0x007e,
++      0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008,
++      0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e,
++      0x2061, 0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040,
++      0x6e59, 0x1078, 0x6e0f, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e,
++      0x2061, 0xa8b1, 0x6128, 0xa192, 0x00c8, 0x00c8, 0x6e44, 0x8108,
++      0x612a, 0x6124, 0x0c7f, 0x81ff, 0x0040, 0x6e54, 0x1078, 0x5ac0,
++      0x1078, 0x6e06, 0x0078, 0x6e54, 0x6124, 0xa1e5, 0x0000, 0x0040,
++      0x6e51, 0x1078, 0xa5c4, 0x1078, 0x5acb, 0x2009, 0x0014, 0x1078,
++      0x775c, 0x0c7f, 0x0078, 0x6e54, 0x027f, 0x017f, 0x0d7f, 0x0c7f,
++      0x007c, 0x2001, 0xa8cd, 0x2004, 0xa005, 0x00c0, 0x6e54, 0x0c7e,
++      0x2061, 0xa8b1, 0x6128, 0xa192, 0x0003, 0x00c8, 0x6e44, 0x8108,
++      0x612a, 0x0c7f, 0x1078, 0x5ac0, 0x1078, 0x4224, 0x0078, 0x6e54,
++      0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x5ad8, 0x2071,
++      0xa8b1, 0x713c, 0x81ff, 0x0040, 0x6e9a, 0x2061, 0x0100, 0x2069,
++      0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x6ea0, 0x6803, 0x1000,
++      0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x037f,
++      0x713c, 0x2160, 0x1078, 0xa5c4, 0x2009, 0x004a, 0x1078, 0x775c,
++      0x0078, 0x6e9a, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c,
++      0x0078, 0x6e8a, 0x0e7e, 0x2071, 0xa8b1, 0x7048, 0xd084, 0x0040,
++      0x6ebc, 0x713c, 0x81ff, 0x0040, 0x6ebc, 0x2071, 0x0100, 0xa188,
++      0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0, 0x6eba, 0x7017, 0x0012,
++      0x0078, 0x6ebc, 0x7017, 0x0016, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e,
++      0x0c7e, 0x067e, 0x057e, 0x047e, 0x007e, 0x127e, 0x2091, 0x8000,
++      0x6018, 0x2068, 0x6ca0, 0x2071, 0xa8b1, 0x7018, 0x2068, 0x8dff,
++      0x0040, 0x6ee6, 0x68a0, 0xa406, 0x0040, 0x6eda, 0x6854, 0x2068,
++      0x0078, 0x6ecf, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648, 0x2d60,
++      0x1078, 0x4736, 0x0040, 0x6ee6, 0xa085, 0x0001, 0x127f, 0x007f,
++      0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x20a1,
++      0x020b, 0x1078, 0x6731, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x781c, 0xa086, 0x0004, 0x00c0, 0x6f01, 0x6098, 0x0078,
++      0x6f02, 0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9,
++      0x0010, 0xa006, 0x20a2, 0x00f0, 0x6f0a, 0x20a2, 0x20a2, 0x60c3,
++      0x002c, 0x1078, 0x6dfb, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b,
++      0x1078, 0x6731, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f, 0x157f,
++      0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3,
++      0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0xa640, 0x2019,
++      0xa641, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x00f0,
++      0x6f39, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078,
++      0x6dfb, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e,
++      0x20a1, 0x020b, 0x1078, 0x6799, 0x1078, 0x67b0, 0x7810, 0xa080,
++      0x0000, 0x2004, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002,
++      0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x1078, 0x6dfb,
++      0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
++      0x020b, 0x1078, 0x6731, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x147f,
++      0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b,
++      0x1078, 0x6731, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017,
++      0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2,
++      0x1078, 0x6dfb, 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x0e7e,
++      0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x700c,
++      0x2060, 0x8cff, 0x0040, 0x6fbb, 0x1078, 0x8f00, 0x00c0, 0x6fb2,
++      0x1078, 0x7c83, 0x600c, 0x007e, 0x1078, 0x772d, 0x1078, 0x7233,
++      0x0c7f, 0x0078, 0x6fa9, 0x700f, 0x0000, 0x700b, 0x0000, 0x127f,
++      0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e,
++      0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069,
++      0x0100, 0x2079, 0x0140, 0x2071, 0xa8b1, 0x7024, 0x2060, 0x8cff,
++      0x0040, 0x7014, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x5acb,
++      0x2009, 0x0013, 0x1078, 0x775c, 0x20a9, 0x01f4, 0x6824, 0xd094,
++      0x0040, 0x6ff7, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040,
++      0x7009, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x7009, 0xd084,
++      0x0040, 0x6ffe, 0x6827, 0x0001, 0x0078, 0x7000, 0x00f0, 0x6fe6,
++      0x7804, 0xa084, 0x1000, 0x0040, 0x7009, 0x7803, 0x0100, 0x7803,
++      0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f,
++      0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0xa600, 0x2004, 0xa096,
++      0x0001, 0x0040, 0x704e, 0xa096, 0x0004, 0x0040, 0x704e, 0x1078,
++      0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x41dc, 0x1078,
++      0x5a45, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x703c, 0x6827,
++      0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x704e, 0x7803, 0x1000,
++      0x7803, 0x0000, 0x0078, 0x704e, 0xd084, 0x0040, 0x7043, 0x6827,
++      0x0001, 0x0078, 0x7045, 0x00f0, 0x702b, 0x7804, 0xa084, 0x1000,
++      0x0040, 0x704e, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f,
++      0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++      0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e,
++      0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
++      0xa8b1, 0x703c, 0x2060, 0x8cff, 0x0040, 0x70d6, 0x68af, 0x95f5,
++      0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x00c0, 0x7074, 0x68c7,
++      0x0000, 0x68cb, 0x0008, 0x1078, 0x5ad8, 0x1078, 0x1f7e, 0x047e,
++      0x057e, 0x2009, 0x017f, 0x212c, 0x200b, 0x00a5, 0x2021, 0x0169,
++      0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x70a5, 0x68c7,
++      0x0000, 0x68cb, 0x0008, 0x0e7e, 0x0f7e, 0x2079, 0x0020, 0x2071,
++      0xa908, 0x6814, 0xa084, 0x0004, 0xa085, 0x0012, 0x6816, 0x7803,
++      0x0008, 0x7003, 0x0000, 0x0f7f, 0x0e7f, 0x250a, 0x057f, 0x047f,
++      0xa39d, 0x0000, 0x00c0, 0x70b0, 0x2009, 0x0049, 0x1078, 0x775c,
++      0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x70c3, 0x6827, 0x0004,
++      0x7804, 0xa084, 0x4000, 0x0040, 0x70d5, 0x7803, 0x1000, 0x7803,
++      0x0000, 0x0078, 0x70d5, 0xd08c, 0x0040, 0x70ca, 0x6827, 0x0002,
++      0x0078, 0x70cc, 0x00f0, 0x70b2, 0x7804, 0xa084, 0x1000, 0x0040,
++      0x70d5, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
++      0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++      0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa8b1, 0x6a06, 0x127f,
++      0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa8b1,
++      0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
++      0x007e, 0x127e, 0x2071, 0xa8b1, 0x7614, 0x2660, 0x2678, 0x2091,
++      0x8000, 0x8cff, 0x0040, 0x7134, 0x601c, 0xa206, 0x00c0, 0x712f,
++      0x7014, 0xac36, 0x00c0, 0x710e, 0x660c, 0x7616, 0x7010, 0xac36,
++      0x00c0, 0x711c, 0x2c00, 0xaf36, 0x0040, 0x711a, 0x2f00, 0x7012,
++      0x0078, 0x711c, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++      0x0040, 0x7125, 0x7e0e, 0x0078, 0x7126, 0x2678, 0x600f, 0x0000,
++      0x1078, 0x8ec6, 0x1078, 0x7233, 0x0c7f, 0x0078, 0x7101, 0x2c78,
++      0x600c, 0x2060, 0x0078, 0x7101, 0x127f, 0x007f, 0x067f, 0x0c7f,
++      0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
++      0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
++      0x20a3, 0x1000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1, 0x020b,
++      0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++      0x20a2, 0x20a3, 0x4000, 0x0078, 0x718e, 0x157e, 0x147e, 0x20a1,
++      0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
++      0x20a2, 0x20a2, 0x20a3, 0x2000, 0x0078, 0x718e, 0x157e, 0x147e,
++      0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006, 0x20a2,
++      0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x718e, 0x157e,
++      0x147e, 0x20a1, 0x020b, 0x1078, 0x69d0, 0x7810, 0x20a2, 0xa006,
++      0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x723e,
++      0x60c3, 0x0020, 0x1078, 0x6dfb, 0x147f, 0x157f, 0x007c, 0x127e,
++      0x0c7e, 0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0,
++      0x71a6, 0xd1bc, 0x00c0, 0x71f0, 0x0078, 0x7230, 0x2009, 0x017f,
++      0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9,
++      0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x71e7,
++      0x6020, 0xd0b4, 0x0040, 0x71e7, 0x6024, 0xd094, 0x00c0, 0x71e7,
++      0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x71e7, 0x00f0,
++      0x71b3, 0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c,
++      0x00ff, 0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043,
++      0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0,
++      0x71e6, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x71dd, 0x027f, 0x0d7f,
++      0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x7230,
++      0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069,
++      0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000,
++      0x0040, 0x7229, 0x6020, 0xd0bc, 0x0040, 0x7229, 0x2104, 0xa084,
++      0x000f, 0xa086, 0x0004, 0x00c0, 0x7229, 0x00f0, 0x71fd, 0x027e,
++      0x6164, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d,
++      0x6088, 0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043,
++      0x0000, 0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x7223,
++      0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000,
++      0x0c7f, 0x127f, 0x007c, 0x0e7e, 0x2071, 0xa8b1, 0x7020, 0xa005,
++      0x0040, 0x723c, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008,
++      0x20a2, 0x00f0, 0x7240, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e,
++      0x0d7e, 0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000,
++      0x2071, 0xa8b1, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff,
++      0x0040, 0x72e2, 0x8cff, 0x0040, 0x72e2, 0x601c, 0xa086, 0x0006,
++      0x00c0, 0x72dd, 0x88ff, 0x0040, 0x726d, 0x2800, 0xac06, 0x00c0,
++      0x72dd, 0x2039, 0x0000, 0x0078, 0x7278, 0x6018, 0xa206, 0x00c0,
++      0x72dd, 0x85ff, 0x0040, 0x7278, 0x6020, 0xa106, 0x00c0, 0x72dd,
++      0x7024, 0xac06, 0x00c0, 0x72a8, 0x2069, 0x0100, 0x68c0, 0xa005,
++      0x0040, 0x72a3, 0x1078, 0x5acb, 0x6817, 0x0008, 0x68c3, 0x0000,
++      0x1078, 0x7378, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
++      0xa384, 0x1000, 0x0040, 0x7298, 0x6803, 0x0100, 0x6803, 0x0000,
++      0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x72a0, 0x6827, 0x0001,
++      0x037f, 0x0078, 0x72a8, 0x6003, 0x0009, 0x630a, 0x0078, 0x72dd,
++      0x7014, 0xac36, 0x00c0, 0x72ae, 0x660c, 0x7616, 0x7010, 0xac36,
++      0x00c0, 0x72bc, 0x2c00, 0xaf36, 0x0040, 0x72ba, 0x2f00, 0x7012,
++      0x0078, 0x72bc, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++      0x0040, 0x72c5, 0x7e0e, 0x0078, 0x72c6, 0x2678, 0x89ff, 0x00c0,
++      0x72d5, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++      0x72d3, 0x1078, 0xa1ca, 0x1078, 0x8ec6, 0x1078, 0x7233, 0x88ff,
++      0x00c0, 0x72ec, 0x0c7f, 0x0078, 0x7257, 0x2c78, 0x600c, 0x2060,
++      0x0078, 0x7257, 0xa006, 0x127f, 0x007f, 0x067f, 0x077f, 0x0c7f,
++      0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5,
++      0x0001, 0x0078, 0x72e3, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e,
++      0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x7638,
++      0x2660, 0x2678, 0x8cff, 0x0040, 0x7367, 0x601c, 0xa086, 0x0006,
++      0x00c0, 0x7362, 0x87ff, 0x0040, 0x7313, 0x2700, 0xac06, 0x00c0,
++      0x7362, 0x0078, 0x731e, 0x6018, 0xa206, 0x00c0, 0x7362, 0x85ff,
++      0x0040, 0x731e, 0x6020, 0xa106, 0x00c0, 0x7362, 0x703c, 0xac06,
++      0x00c0, 0x7332, 0x037e, 0x2019, 0x0001, 0x1078, 0x7058, 0x7033,
++      0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x704b,
++      0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x7338, 0x660c, 0x763a,
++      0x7034, 0xac36, 0x00c0, 0x7346, 0x2c00, 0xaf36, 0x0040, 0x7344,
++      0x2f00, 0x7036, 0x0078, 0x7346, 0x7037, 0x0000, 0x660c, 0x067e,
++      0x2c00, 0xaf06, 0x0040, 0x734f, 0x7e0e, 0x0078, 0x7350, 0x2678,
++      0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x735a,
++      0x1078, 0xa1ca, 0x1078, 0x8ec6, 0x87ff, 0x00c0, 0x7371, 0x0c7f,
++      0x0078, 0x7302, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7302, 0xa006,
++      0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
++      0x007c, 0x6017, 0x0000, 0x0c7f, 0xa7bd, 0x0001, 0x0078, 0x7368,
++      0x0e7e, 0x2071, 0xa8b1, 0x2001, 0xa600, 0x2004, 0xa086, 0x0002,
++      0x00c0, 0x7386, 0x7007, 0x0005, 0x0078, 0x7388, 0x7007, 0x0000,
++      0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, 0x027e, 0x007e,
++      0x127e, 0x2091, 0x8000, 0x2071, 0xa8b1, 0x2c10, 0x7638, 0x2660,
++      0x2678, 0x8cff, 0x0040, 0x73c8, 0x2200, 0xac06, 0x00c0, 0x73c3,
++      0x7038, 0xac36, 0x00c0, 0x73a6, 0x660c, 0x763a, 0x7034, 0xac36,
++      0x00c0, 0x73b4, 0x2c00, 0xaf36, 0x0040, 0x73b2, 0x2f00, 0x7036,
++      0x0078, 0x73b4, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0040,
++      0x73bc, 0x7e0e, 0x0078, 0x73bd, 0x2678, 0x600f, 0x0000, 0xa085,
++      0x0001, 0x0078, 0x73c8, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7399,
++      0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c,
++      0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091,
++      0x8000, 0x2071, 0xa8b1, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0040,
++      0x7469, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x7464,
++      0x7024, 0xac06, 0x00c0, 0x740f, 0x2069, 0x0100, 0x68c0, 0xa005,
++      0x0040, 0x743d, 0x1078, 0x6e0f, 0x68c3, 0x0000, 0x1078, 0x7378,
++      0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
++      0x0040, 0x7406, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++      0x6824, 0xd084, 0x0040, 0x740e, 0x6827, 0x0001, 0x037f, 0x700c,
++      0xac36, 0x00c0, 0x7415, 0x660c, 0x760e, 0x7008, 0xac36, 0x00c0,
++      0x7423, 0x2c00, 0xaf36, 0x0040, 0x7421, 0x2f00, 0x700a, 0x0078,
++      0x7423, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040,
++      0x742c, 0x7e0e, 0x0078, 0x742d, 0x2678, 0x600f, 0x0000, 0x1078,
++      0x8eec, 0x00c0, 0x7441, 0x1078, 0x28a6, 0x1078, 0x8f00, 0x00c0,
++      0x745d, 0x1078, 0x7c83, 0x0078, 0x745d, 0x1078, 0x7378, 0x0078,
++      0x740f, 0x1078, 0x8f00, 0x00c0, 0x7449, 0x1078, 0x7c83, 0x0078,
++      0x745d, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x745d, 0x601c,
++      0xa086, 0x0003, 0x00c0, 0x7471, 0x6837, 0x0103, 0x6b4a, 0x6847,
++      0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x1078, 0x8ec6, 0x1078,
++      0x7233, 0x0c7f, 0x0078, 0x73de, 0x2c78, 0x600c, 0x2060, 0x0078,
++      0x73de, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
++      0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x745d, 0x1078, 0xa1ca,
++      0x0078, 0x745d, 0x037e, 0x157e, 0x137e, 0x147e, 0x3908, 0xa006,
++      0xa190, 0x0020, 0x221c, 0xa39e, 0x2676, 0x00c0, 0x748b, 0x8210,
++      0x8000, 0x0078, 0x7482, 0xa005, 0x0040, 0x7497, 0x20a9, 0x0020,
++      0x2198, 0x8211, 0xa282, 0x0020, 0x20c8, 0x20a0, 0x53a3, 0x147f,
++      0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078,
++      0x67c2, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x2099, 0xa8a5, 0x20a9, 0x0004, 0x53a6,
++      0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x1078, 0x6dfb, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078, 0x67c2,
++      0x20a3, 0x0214, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084,
++      0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6dfb,
++      0x007c, 0x0d7e, 0x017e, 0x2f68, 0x2009, 0x0035, 0x1078, 0x91bc,
++      0x00c0, 0x7551, 0x20a1, 0x020b, 0x1078, 0x6731, 0x20a3, 0x1300,
++      0x20a3, 0x0000, 0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0040,
++      0x752d, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0,
++      0x7507, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0078, 0x7542, 0xa286,
++      0x007f, 0x00c0, 0x7511, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0078,
++      0x7542, 0xd2bc, 0x0040, 0x7527, 0xa286, 0x0080, 0x00c0, 0x751e,
++      0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0078, 0x7542, 0xa2e8, 0xa735,
++      0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x0078, 0x7542, 0x20a3,
++      0x0000, 0x6098, 0x20a2, 0x0078, 0x7542, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xa082, 0x007e, 0x0048, 0x753e, 0x0d7e, 0x2069, 0xa61b,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x7542, 0x20a3, 0x0000,
++      0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x60c3, 0x000c, 0x1078, 0x6dfb, 0x017f, 0x0d7f,
++      0x007c, 0x7817, 0x0001, 0x7803, 0x0006, 0x017f, 0x0d7f, 0x007c,
++      0x0d7e, 0x027e, 0x7928, 0x2168, 0x691c, 0xa186, 0x0006, 0x0040,
++      0x757a, 0xa186, 0x0003, 0x0040, 0x75d5, 0xa186, 0x0005, 0x0040,
++      0x75b8, 0xa186, 0x0004, 0x0040, 0x75a8, 0xa186, 0x0008, 0x0040,
++      0x75c2, 0x7807, 0x0037, 0x7813, 0x1700, 0x1078, 0x7640, 0x027f,
++      0x0d7f, 0x007c, 0x1078, 0x75fd, 0x2009, 0x4000, 0x6800, 0x0079,
++      0x7581, 0x7594, 0x75a2, 0x7596, 0x75a2, 0x759d, 0x7594, 0x7594,
++      0x75a2, 0x75a2, 0x75a2, 0x75a2, 0x7594, 0x7594, 0x7594, 0x7594,
++      0x7594, 0x75a2, 0x7594, 0x75a2, 0x1078, 0x1332, 0x6824, 0xd0e4,
++      0x0040, 0x759d, 0xd0cc, 0x0040, 0x75a0, 0xa00e, 0x0078, 0x75a2,
++      0x2009, 0x2000, 0x6828, 0x20a2, 0x682c, 0x20a2, 0x0078, 0x75f3,
++      0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000,
++      0x6a00, 0xa286, 0x0002, 0x00c0, 0x75b6, 0xa00e, 0x0078, 0x75f3,
++      0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000,
++      0x0078, 0x75f3, 0x1078, 0x75fd, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x2009, 0x4000, 0xa286, 0x0005, 0x0040, 0x75d2, 0xa286, 0x0002,
++      0x00c0, 0x75d3, 0xa00e, 0x0078, 0x75f3, 0x1078, 0x75fd, 0x6810,
++      0x2068, 0x697c, 0x6810, 0xa112, 0x6980, 0x6814, 0xa103, 0x20a2,
++      0x22a2, 0x7928, 0xa180, 0x0000, 0x2004, 0xa08e, 0x0002, 0x0040,
++      0x75f1, 0xa08e, 0x0004, 0x0040, 0x75f1, 0x2009, 0x4000, 0x0078,
++      0x75f3, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018,
++      0x1078, 0x6dfb, 0x027f, 0x0d7f, 0x007c, 0x037e, 0x047e, 0x057e,
++      0x067e, 0x20a1, 0x020b, 0x1078, 0x67c2, 0xa006, 0x20a3, 0x0200,
++      0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xa092, 0x007e, 0x0048, 0x7623, 0x0d7e, 0x2069, 0xa61b,
++      0x2d2c, 0x8d68, 0x2d34, 0xa0e8, 0xa735, 0x2d6c, 0x6b10, 0x6c14,
++      0x0d7f, 0x0078, 0x7629, 0x2019, 0x0000, 0x6498, 0x2029, 0x0000,
++      0x6630, 0x7828, 0xa080, 0x0007, 0x2004, 0xa086, 0x0003, 0x00c0,
++      0x7637, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0078, 0x763b, 0x23a2,
++      0x24a2, 0x25a2, 0x26a2, 0x067f, 0x057f, 0x047f, 0x037f, 0x007c,
++      0x20a1, 0x020b, 0x1078, 0x67c2, 0x20a3, 0x0100, 0x20a3, 0x0000,
++      0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb,
++      0x007c, 0x20a1, 0x020b, 0x1078, 0x6728, 0x20a3, 0x1400, 0x20a3,
++      0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, 0x782c,
++      0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, 0x0000,
++      0x60c3, 0x0010, 0x1078, 0x6dfb, 0x007c, 0x20a1, 0x020b, 0x1078,
++      0x67b9, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, 0x7810,
++      0x20a2, 0x60c3, 0x0008, 0x1078, 0x6dfb, 0x007c, 0x147e, 0x20a1,
++      0x020b, 0x1078, 0x7689, 0x60c3, 0x0000, 0x1078, 0x6dfb, 0x147f,
++      0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xd0bc, 0x0040, 0x76a6, 0x0d7e, 0xa0e8, 0xa735, 0x2d6c,
++      0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa61b,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x76ae, 0x20a3, 0x0300,
++      0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0819,
++      0x20a3, 0x0000, 0x1078, 0x6dea, 0x22a2, 0x20a3, 0x0000, 0x2fa2,
++      0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x007c, 0x2061,
++      0xad00, 0x2a70, 0x7064, 0x704a, 0x704f, 0xad00, 0x007c, 0x0e7e,
++      0x127e, 0x2071, 0xa600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010,
++      0x0048, 0x76f9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040,
++      0x76e5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x76e1, 0x0078,
++      0x76d4, 0x2061, 0xad00, 0x0078, 0x76d4, 0x6003, 0x0008, 0x8529,
++      0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x76f5, 0x754e,
++      0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xad00, 0x0078,
++      0x76f0, 0xa006, 0x0078, 0x76f2, 0x0e7e, 0x2071, 0xa600, 0x7548,
++      0xa582, 0x0010, 0x0048, 0x772a, 0x704c, 0x2060, 0x6000, 0xa086,
++      0x0000, 0x0040, 0x7717, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8,
++      0x7713, 0x0078, 0x7706, 0x2061, 0xad00, 0x0078, 0x7706, 0x6003,
++      0x0008, 0x8529, 0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8,
++      0x7726, 0x754e, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x704f, 0xad00,
++      0x0078, 0x7722, 0xa006, 0x0078, 0x7724, 0xac82, 0xad00, 0x1048,
++      0x1332, 0x2001, 0xa616, 0x2004, 0xac02, 0x10c8, 0x1332, 0xa006,
++      0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000,
++      0x6003, 0x0000, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036,
++      0x603a, 0x603e, 0x2061, 0xa600, 0x6048, 0x8000, 0x604a, 0xa086,
++      0x0001, 0x0040, 0x7754, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078,
++      0x62d1, 0x127f, 0x0078, 0x7753, 0x601c, 0xa084, 0x000f, 0x0079,
++      0x7761, 0x776a, 0x777b, 0x7797, 0x77b3, 0x920e, 0x922a, 0x9246,
++      0x776a, 0x777b, 0xa186, 0x0013, 0x00c0, 0x7773, 0x1078, 0x61cd,
++      0x1078, 0x62d1, 0x007c, 0xa18e, 0x0047, 0x00c0, 0x777a, 0xa016,
++      0x1078, 0x15fa, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
++      0x1332, 0x1079, 0x7785, 0x067f, 0x007c, 0x7795, 0x7b00, 0x7cb2,
++      0x7795, 0x7d36, 0x77cf, 0x7795, 0x7795, 0x7a92, 0x80f6, 0x7795,
++      0x7795, 0x7795, 0x7795, 0x7795, 0x7795, 0x1078, 0x1332, 0x067e,
++      0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x77a1, 0x067f,
++      0x007c, 0x77b1, 0x87c3, 0x77b1, 0x77b1, 0x77b1, 0x77b1, 0x77b1,
++      0x77b1, 0x8766, 0x8951, 0x77b1, 0x87f3, 0x8879, 0x87f3, 0x8879,
++      0x77b1, 0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
++      0x1332, 0x1079, 0x77bd, 0x067f, 0x007c, 0x77cd, 0x813d, 0x820e,
++      0x8368, 0x84e4, 0x77cd, 0x77cd, 0x77cd, 0x8116, 0x870e, 0x8712,
++      0x77cd, 0x77cd, 0x77cd, 0x77cd, 0x8742, 0x1078, 0x1332, 0xa1b6,
++      0x0015, 0x00c0, 0x77d7, 0x1078, 0x772d, 0x0078, 0x77dd, 0xa1b6,
++      0x0016, 0x10c0, 0x1332, 0x1078, 0x772d, 0x007c, 0x20a9, 0x000e,
++      0x2e98, 0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420,
++      0x9398, 0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002,
++      0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x00f0, 0x77ec,
++      0x0e7e, 0x1078, 0x8d06, 0x0040, 0x7803, 0x6010, 0x2070, 0x7007,
++      0x0000, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0d7e,
++      0x037e, 0x7330, 0xa386, 0x0200, 0x00c0, 0x7814, 0x6018, 0x2068,
++      0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0040, 0x781e,
++      0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x1078, 0x772d,
++      0x037f, 0x0d7f, 0x007c, 0x017e, 0x20a9, 0x002a, 0xae80, 0x000c,
++      0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a,
++      0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3,
++      0x0e7e, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078,
++      0x772d, 0x017f, 0x007c, 0x0e7e, 0x0d7e, 0x603f, 0x0000, 0x2c68,
++      0x017e, 0x2009, 0x0035, 0x1078, 0x91bc, 0x017f, 0x00c0, 0x785f,
++      0x027e, 0x6228, 0x2268, 0x027f, 0x2071, 0xab8c, 0x6b1c, 0xa386,
++      0x0003, 0x0040, 0x7863, 0xa386, 0x0006, 0x0040, 0x7867, 0x1078,
++      0x772d, 0x0078, 0x7869, 0x1078, 0x786c, 0x0078, 0x7869, 0x1078,
++      0x7938, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x6810, 0x2078, 0xa186,
++      0x0015, 0x0040, 0x791d, 0xa18e, 0x0016, 0x00c0, 0x7936, 0x700c,
++      0xa08c, 0xff00, 0xa186, 0x1700, 0x0040, 0x7882, 0xa186, 0x0300,
++      0x00c0, 0x78f8, 0x8fff, 0x00c0, 0x788c, 0x6800, 0xa086, 0x000f,
++      0x0040, 0x78db, 0x0078, 0x7934, 0x6808, 0xa086, 0xffff, 0x00c0,
++      0x7921, 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x00c0, 0x78a2,
++      0x797c, 0x7810, 0xa106, 0x00c0, 0x7921, 0x7980, 0x7814, 0xa106,
++      0x00c0, 0x7921, 0x1078, 0x8eb9, 0x6830, 0x7852, 0x784c, 0xc0dc,
++      0xc0f4, 0xc0d4, 0x784e, 0x027e, 0xa00e, 0x6a14, 0x2001, 0x000a,
++      0x1078, 0x5c1c, 0x7854, 0xa20a, 0x0048, 0x78b7, 0x8011, 0x7a56,
++      0x82ff, 0x027f, 0x00c0, 0x78c3, 0x0c7e, 0x2d60, 0x1078, 0x8ae0,
++      0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x0d7e, 0x2f68, 0x6838, 0xd0fc,
++      0x00c0, 0x78ce, 0x1078, 0x4353, 0x0078, 0x78d0, 0x1078, 0x4431,
++      0x0d7f, 0x0c7f, 0x00c0, 0x7921, 0x0c7e, 0x2d60, 0x1078, 0x772d,
++      0x0c7f, 0x0078, 0x7934, 0x0c7e, 0x1078, 0x9187, 0x0040, 0x78f1,
++      0x6013, 0x0000, 0x6818, 0x601a, 0x601f, 0x0003, 0x6904, 0x0c7e,
++      0x2d60, 0x1078, 0x772d, 0x0c7f, 0x1078, 0x775c, 0x0c7f, 0x0078,
++      0x7934, 0x2001, 0xa8a4, 0x2004, 0x683e, 0x0c7f, 0x0078, 0x7934,
++      0x7008, 0xa086, 0x000b, 0x00c0, 0x7912, 0x6018, 0x200c, 0xc1bc,
++      0x2102, 0x0c7e, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003,
++      0x000b, 0x601f, 0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f,
++      0x0078, 0x7934, 0x700c, 0xa086, 0x2a00, 0x00c0, 0x7921, 0x2001,
++      0xa8a4, 0x2004, 0x683e, 0x0078, 0x7934, 0x1078, 0x7953, 0x0078,
++      0x7936, 0x8fff, 0x1040, 0x1332, 0x0c7e, 0x0d7e, 0x2d60, 0x2f68,
++      0x6837, 0x0103, 0x684b, 0x0003, 0x1078, 0x89cf, 0x1078, 0x8eb9,
++      0x1078, 0x8ec6, 0x0d7f, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c,
++      0xa186, 0x0015, 0x00c0, 0x7942, 0x2001, 0xa8a4, 0x2004, 0x683e,
++      0x0078, 0x7950, 0xa18e, 0x0016, 0x00c0, 0x7952, 0x0c7e, 0x2d00,
++      0x2060, 0x1078, 0xa495, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x0c7f,
++      0x1078, 0x772d, 0x007c, 0x027e, 0x037e, 0x047e, 0x7228, 0x7c80,
++      0x7b7c, 0xd2f4, 0x0040, 0x7962, 0x2001, 0xa8a4, 0x2004, 0x683e,
++      0x0078, 0x79c6, 0x0c7e, 0x2d60, 0x1078, 0x89f3, 0x0c7f, 0x6804,
++      0xa086, 0x0050, 0x00c0, 0x797a, 0x0c7e, 0x2d00, 0x2060, 0x6003,
++      0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f,
++      0x0078, 0x79c6, 0x6800, 0xa086, 0x000f, 0x0040, 0x799c, 0x8fff,
++      0x1040, 0x1332, 0x6824, 0xd0dc, 0x00c0, 0x799c, 0x6800, 0xa086,
++      0x0004, 0x00c0, 0x79a1, 0x784c, 0xd0ac, 0x0040, 0x79a1, 0x784c,
++      0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001,
++      0x0001, 0x682e, 0x0078, 0x79c0, 0x2001, 0x0007, 0x682e, 0x0078,
++      0x79c0, 0x784c, 0xd0b4, 0x00c0, 0x79ae, 0xd0ac, 0x0040, 0x799c,
++      0x784c, 0xd0f4, 0x00c0, 0x799c, 0x0078, 0x798f, 0xd2ec, 0x00c0,
++      0x799c, 0x7024, 0xa306, 0x00c0, 0x79b9, 0x7020, 0xa406, 0x0040,
++      0x799c, 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e,
++      0x1078, 0x8ff0, 0x1078, 0x62d1, 0x0078, 0x79c8, 0x1078, 0x772d,
++      0x047f, 0x037f, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x027e, 0x6034,
++      0x2068, 0x6a1c, 0xa286, 0x0007, 0x0040, 0x7a35, 0xa286, 0x0002,
++      0x0040, 0x7a35, 0xa286, 0x0000, 0x0040, 0x7a35, 0x6808, 0x6338,
++      0xa306, 0x00c0, 0x7a35, 0x2071, 0xab8c, 0xa186, 0x0015, 0x0040,
++      0x7a2f, 0xa18e, 0x0016, 0x00c0, 0x7a02, 0x6030, 0xa084, 0x00ff,
++      0xa086, 0x0001, 0x00c0, 0x7a02, 0x700c, 0xa086, 0x2a00, 0x00c0,
++      0x7a02, 0x6034, 0xa080, 0x0009, 0x200c, 0xc1dd, 0xc1f5, 0x2102,
++      0x0078, 0x7a2f, 0x0c7e, 0x6034, 0x2060, 0x6104, 0xa186, 0x004b,
++      0x0040, 0x7a22, 0xa186, 0x004c, 0x0040, 0x7a22, 0xa186, 0x004d,
++      0x0040, 0x7a22, 0xa186, 0x004e, 0x0040, 0x7a22, 0xa186, 0x0052,
++      0x0040, 0x7a22, 0x6010, 0x2068, 0x1078, 0x8d06, 0x1040, 0x1332,
++      0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002,
++      0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7f, 0x0078, 0x7a35, 0x6034,
++      0x2068, 0x2001, 0xa8a4, 0x2004, 0x683e, 0x1078, 0x772d, 0x027f,
++      0x0d7f, 0x0e7f, 0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010,
++      0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x00c0, 0x7a73, 0x6018, 0x2068,
++      0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290, 0x0004, 0x20a9,
++      0x0004, 0xad98, 0x000a, 0x1078, 0x80de, 0x027f, 0x037f, 0x157f,
++      0x00c0, 0x7a76, 0x157e, 0x037e, 0x027e, 0xae90, 0x000c, 0xa290,
++      0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x1078, 0x80de, 0x027f,
++      0x037f, 0x157f, 0x00c0, 0x7a76, 0x7038, 0x680a, 0x703c, 0x680e,
++      0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x77f8, 0x1078, 0x2880,
++      0x0c7e, 0x1078, 0x76c7, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f,
++      0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x1078,
++      0x4502, 0x1078, 0x4535, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7f,
++      0x0078, 0x7a73, 0x2100, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0xa1b2,
++      0x0040, 0x00c8, 0x7af7, 0x0079, 0x7a9d, 0x7aeb, 0x7adf, 0x7aeb,
++      0x7aeb, 0x7aeb, 0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++      0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++      0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++      0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7aeb, 0x7aeb,
++      0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add,
++      0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7aeb,
++      0x7aeb, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add, 0x7add,
++      0x7add, 0x7add, 0x7aeb, 0x7add, 0x7add, 0x1078, 0x1332, 0x6003,
++      0x0001, 0x6106, 0x1078, 0x5dd7, 0x127e, 0x2091, 0x8000, 0x1078,
++      0x62d1, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5dd7,
++      0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x2600,
++      0x0079, 0x7afa, 0x7afe, 0x7afe, 0x7afe, 0x7aeb, 0x1078, 0x1332,
++      0x6004, 0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0,
++      0x7b10, 0xa0b2, 0x0040, 0x00c8, 0x7c79, 0x2008, 0x0079, 0x7bbf,
++      0xa1b6, 0x0027, 0x00c0, 0x7b7c, 0x1078, 0x61cd, 0x6004, 0x1078,
++      0x8eec, 0x0040, 0x7b2d, 0x1078, 0x8f00, 0x0040, 0x7b74, 0xa08e,
++      0x0021, 0x0040, 0x7b78, 0xa08e, 0x0022, 0x0040, 0x7b74, 0xa08e,
++      0x003d, 0x0040, 0x7b78, 0x0078, 0x7b6f, 0x1078, 0x28a6, 0x2001,
++      0x0007, 0x1078, 0x4502, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078,
++      0x7c83, 0xa186, 0x007e, 0x00c0, 0x7b42, 0x2001, 0xa633, 0x2014,
++      0xc285, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019,
++      0x0028, 0x1078, 0x73d0, 0x027f, 0x1078, 0xa4f1, 0x037f, 0x027f,
++      0x017f, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078,
++      0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x0c7e, 0x6018,
++      0xa065, 0x0040, 0x7b65, 0x1078, 0x47e9, 0x0c7f, 0x2c08, 0x1078,
++      0x9f8b, 0x077f, 0x037f, 0x027f, 0x017f, 0x1078, 0x457f, 0x1078,
++      0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x7b6f,
++      0x1078, 0x7ca6, 0x0078, 0x7b6f, 0xa186, 0x0014, 0x00c0, 0x7b73,
++      0x1078, 0x61cd, 0x1078, 0x2880, 0x1078, 0x8eec, 0x00c0, 0x7b9b,
++      0x1078, 0x28a6, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x7c83,
++      0xa186, 0x007e, 0x00c0, 0x7b99, 0x2001, 0xa633, 0x200c, 0xc185,
++      0x2102, 0x0078, 0x7b6f, 0x1078, 0x8f00, 0x00c0, 0x7ba3, 0x1078,
++      0x7c83, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0032, 0x00c0, 0x7bb4,
++      0x0e7e, 0x0f7e, 0x2071, 0xa682, 0x2079, 0x0000, 0x1078, 0x2bd7,
++      0x0f7f, 0x0e7f, 0x0078, 0x7b6f, 0x6004, 0xa08e, 0x0021, 0x0040,
++      0x7b9f, 0xa08e, 0x0022, 0x1040, 0x7c83, 0x0078, 0x7b6f, 0x7c01,
++      0x7c03, 0x7c07, 0x7c0b, 0x7c0f, 0x7c13, 0x7bff, 0x7bff, 0x7bff,
++      0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++      0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++      0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c17, 0x7c29, 0x7bff,
++      0x7c2b, 0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7c29,
++      0x7c29, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff,
++      0x7bff, 0x7c5c, 0x7c29, 0x7bff, 0x7c23, 0x7bff, 0x7bff, 0x7bff,
++      0x7c25, 0x7bff, 0x7bff, 0x7bff, 0x7c29, 0x7bff, 0x7bff, 0x1078,
++      0x1332, 0x0078, 0x7c29, 0x2001, 0x000b, 0x0078, 0x7c36, 0x2001,
++      0x0003, 0x0078, 0x7c36, 0x2001, 0x0005, 0x0078, 0x7c36, 0x2001,
++      0x0001, 0x0078, 0x7c36, 0x2001, 0x0009, 0x0078, 0x7c36, 0x1078,
++      0x61cd, 0x6003, 0x0005, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x1078,
++      0x62d1, 0x0078, 0x7c35, 0x0078, 0x7c29, 0x0078, 0x7c29, 0x1078,
++      0x4502, 0x0078, 0x7c6e, 0x1078, 0x61cd, 0x6003, 0x0004, 0x2001,
++      0xa8a2, 0x2004, 0x6016, 0x1078, 0x62d1, 0x007c, 0x1078, 0x4502,
++      0x1078, 0x61cd, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002,
++      0x037e, 0x2019, 0xa65d, 0x2304, 0xa084, 0xff00, 0x00c0, 0x7c4d,
++      0x2019, 0xa8a2, 0x231c, 0x0078, 0x7c56, 0x8007, 0xa09a, 0x0004,
++      0x0048, 0x7c48, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x037f,
++      0x1078, 0x62d1, 0x0078, 0x7c35, 0x0e7e, 0x0f7e, 0x2071, 0xa682,
++      0x2079, 0x0000, 0x1078, 0x2bd7, 0x0f7f, 0x0e7f, 0x1078, 0x61cd,
++      0x1078, 0x772d, 0x1078, 0x62d1, 0x0078, 0x7c35, 0x1078, 0x61cd,
++      0x6003, 0x0002, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x1078, 0x62d1,
++      0x007c, 0x2600, 0x2008, 0x0079, 0x7c7d, 0x7c81, 0x7c81, 0x7c81,
++      0x7c6e, 0x1078, 0x1332, 0x0e7e, 0x1078, 0x8d06, 0x0040, 0x7c9f,
++      0x6010, 0x2070, 0x7038, 0xd0fc, 0x0040, 0x7c9f, 0x7007, 0x0000,
++      0x017e, 0x6004, 0xa08e, 0x0021, 0x0040, 0x7ca1, 0xa08e, 0x003d,
++      0x0040, 0x7ca1, 0x017f, 0x7037, 0x0103, 0x7033, 0x0100, 0x0e7f,
++      0x007c, 0x017f, 0x1078, 0x7ca6, 0x0078, 0x7c9f, 0x0e7e, 0xacf0,
++      0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001,
++      0x0e7f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff,
++      0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0x6604, 0xa6b6, 0x0043,
++      0x00c0, 0x7cc6, 0x1078, 0x9134, 0x0078, 0x7d25, 0x6604, 0xa6b6,
++      0x0033, 0x00c0, 0x7ccf, 0x1078, 0x90d8, 0x0078, 0x7d25, 0x6604,
++      0xa6b6, 0x0028, 0x00c0, 0x7cd8, 0x1078, 0x8f2f, 0x0078, 0x7d25,
++      0x6604, 0xa6b6, 0x0029, 0x00c0, 0x7ce1, 0x1078, 0x8f49, 0x0078,
++      0x7d25, 0x6604, 0xa6b6, 0x001f, 0x00c0, 0x7cea, 0x1078, 0x77de,
++      0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0000, 0x00c0, 0x7cf3, 0x1078,
++      0x7a3b, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0022, 0x00c0, 0x7cfc,
++      0x1078, 0x7807, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0035, 0x00c0,
++      0x7d05, 0x1078, 0x7843, 0x0078, 0x7d25, 0x6604, 0xa6b6, 0x0039,
++      0x00c0, 0x7d0e, 0x1078, 0x79cc, 0x0078, 0x7d25, 0x6604, 0xa6b6,
++      0x003d, 0x00c0, 0x7d17, 0x1078, 0x7823, 0x0078, 0x7d25, 0xa1b6,
++      0x0015, 0x00c0, 0x7d1f, 0x1079, 0x7d2a, 0x0078, 0x7d25, 0xa1b6,
++      0x0016, 0x00c0, 0x7d26, 0x1079, 0x7e7f, 0x007c, 0x1078, 0x7773,
++      0x0078, 0x7d25, 0x7d4e, 0x7d51, 0x7d4e, 0x7d9c, 0x7d4e, 0x7e13,
++      0x7e8b, 0x7d4e, 0x7d4e, 0x7e57, 0x7d4e, 0x7e6d, 0xa1b6, 0x0048,
++      0x0040, 0x7d42, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
++      0x15fa, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070,
++      0x7037, 0x0103, 0x0e7f, 0x1078, 0x772d, 0x007c, 0x0005, 0x0005,
++      0x007c, 0x0e7e, 0x2071, 0xa600, 0x7080, 0xa086, 0x0074, 0x00c0,
++      0x7d85, 0x1078, 0x9f5f, 0x00c0, 0x7d77, 0x0d7e, 0x6018, 0x2068,
++      0x7030, 0xd08c, 0x0040, 0x7d6a, 0x6800, 0xd0bc, 0x0040, 0x7d6a,
++      0xc0c5, 0x6802, 0x1078, 0x7d89, 0x0d7f, 0x2001, 0x0006, 0x1078,
++      0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078, 0x7d87, 0x2001,
++      0x000a, 0x1078, 0x4502, 0x1078, 0x28a6, 0x6003, 0x0001, 0x6007,
++      0x0001, 0x1078, 0x5dd7, 0x0078, 0x7d87, 0x1078, 0x7dff, 0x0e7f,
++      0x007c, 0x6800, 0xd084, 0x0040, 0x7d9b, 0x2001, 0x0000, 0x1078,
++      0x44ee, 0x2069, 0xa652, 0x6804, 0xd0a4, 0x0040, 0x7d9b, 0x2001,
++      0x0006, 0x1078, 0x4535, 0x007c, 0x0d7e, 0x2011, 0xa620, 0x2204,
++      0xa086, 0x0074, 0x00c0, 0x7dfb, 0x6018, 0x2068, 0x6aa0, 0xa286,
++      0x007e, 0x00c0, 0x7daf, 0x1078, 0x7f9b, 0x0078, 0x7dfd, 0x1078,
++      0x7f91, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014, 0xa286, 0x0080,
++      0x00c0, 0x7dd3, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005,
++      0x0040, 0x7dc9, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833,
++      0x0200, 0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x28a6, 0x1078,
++      0x772d, 0x0078, 0x7dfd, 0x0e7e, 0x2071, 0xa633, 0x2e04, 0xd09c,
++      0x0040, 0x7dee, 0x2071, 0xab80, 0x7108, 0x720c, 0xa18c, 0x00ff,
++      0x00c0, 0x7de6, 0xa284, 0xff00, 0x0040, 0x7dee, 0x6018, 0x2070,
++      0x70a0, 0xd0bc, 0x00c0, 0x7dee, 0x7112, 0x7216, 0x0e7f, 0x2001,
++      0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078,
++      0x5dd7, 0x0078, 0x7dfd, 0x1078, 0x7dff, 0x0d7f, 0x007c, 0x2001,
++      0x0007, 0x1078, 0x4502, 0x2001, 0xa600, 0x2004, 0xa086, 0x0003,
++      0x00c0, 0x7e0e, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x28a6,
++      0x1078, 0x772d, 0x007c, 0x0e7e, 0x2071, 0xa600, 0x7080, 0xa086,
++      0x0014, 0x00c0, 0x7e51, 0x7000, 0xa086, 0x0003, 0x00c0, 0x7e26,
++      0x6010, 0xa005, 0x00c0, 0x7e26, 0x1078, 0x3699, 0x0d7e, 0x6018,
++      0x2068, 0x1078, 0x4649, 0x1078, 0x7d89, 0x0d7f, 0x1078, 0x8043,
++      0x00c0, 0x7e51, 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005,
++      0x0040, 0x7e51, 0x2001, 0x0006, 0x1078, 0x4502, 0x0e7e, 0x6010,
++      0xa005, 0x0040, 0x7e4a, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
++      0x7033, 0x0200, 0x0e7f, 0x1078, 0x28a6, 0x1078, 0x772d, 0x0078,
++      0x7e55, 0x1078, 0x7c83, 0x1078, 0x7dff, 0x0e7f, 0x007c, 0x2011,
++      0xa620, 0x2204, 0xa086, 0x0014, 0x00c0, 0x7e6a, 0x2001, 0x0002,
++      0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x5dd7,
++      0x0078, 0x7e6c, 0x1078, 0x7dff, 0x007c, 0x2011, 0xa620, 0x2204,
++      0xa086, 0x0004, 0x00c0, 0x7e7c, 0x2001, 0x0007, 0x1078, 0x4502,
++      0x1078, 0x772d, 0x0078, 0x7e7e, 0x1078, 0x7dff, 0x007c, 0x7d4e,
++      0x7e97, 0x7d4e, 0x7ed2, 0x7d4e, 0x7f44, 0x7e8b, 0x7d4e, 0x7d4e,
++      0x7f59, 0x7d4e, 0x7f6c, 0x6604, 0xa686, 0x0003, 0x0040, 0x7e13,
++      0xa6b6, 0x001e, 0x00c0, 0x7e96, 0x1078, 0x772d, 0x007c, 0x0d7e,
++      0x0c7e, 0x1078, 0x7f7f, 0x00c0, 0x7ead, 0x2001, 0x0000, 0x1078,
++      0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007,
++      0x0002, 0x1078, 0x5dd7, 0x0078, 0x7ecf, 0x2009, 0xab8e, 0x2104,
++      0xa086, 0x0009, 0x00c0, 0x7ec2, 0x6018, 0x2068, 0x6840, 0xa084,
++      0x00ff, 0xa005, 0x0040, 0x7ecd, 0x8001, 0x6842, 0x6017, 0x000a,
++      0x0078, 0x7ecf, 0x2009, 0xab8f, 0x2104, 0xa084, 0xff00, 0xa086,
++      0x1900, 0x00c0, 0x7ecd, 0x0078, 0x7ea1, 0x1078, 0x7dff, 0x0c7f,
++      0x0d7f, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7ee6, 0x2001, 0x0000,
++      0x1078, 0x44ee, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003, 0x0001,
++      0x6007, 0x0002, 0x1078, 0x5dd7, 0x0078, 0x7f12, 0x1078, 0x7c83,
++      0x2009, 0xab8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0040,
++      0x7f13, 0xa686, 0x000b, 0x0040, 0x7f10, 0x2009, 0xab8f, 0x2104,
++      0xa084, 0xff00, 0x00c0, 0x7f00, 0xa686, 0x0009, 0x0040, 0x7f13,
++      0xa086, 0x1900, 0x00c0, 0x7f10, 0xa686, 0x0009, 0x0040, 0x7f13,
++      0x2001, 0x0004, 0x1078, 0x4502, 0x1078, 0x772d, 0x0078, 0x7f12,
++      0x1078, 0x7dff, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06,
++      0x0040, 0x7f21, 0x6838, 0xd0fc, 0x0040, 0x7f21, 0x0d7f, 0x0078,
++      0x7f10, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040,
++      0x7f32, 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f,
++      0x0078, 0x7f12, 0x68a0, 0xa086, 0x007e, 0x00c0, 0x7f3f, 0x0e7e,
++      0x2071, 0xa600, 0x1078, 0x42b8, 0x0e7f, 0x0078, 0x7f41, 0x1078,
++      0x2880, 0x0d7f, 0x0078, 0x7f10, 0x1078, 0x7f8e, 0x00c0, 0x7f54,
++      0x2001, 0x0004, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0003,
++      0x1078, 0x5dd7, 0x0078, 0x7f58, 0x1078, 0x7c83, 0x1078, 0x7dff,
++      0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f69, 0x2001, 0x0008, 0x1078,
++      0x4502, 0x6003, 0x0001, 0x6007, 0x0005, 0x1078, 0x5dd7, 0x0078,
++      0x7f6b, 0x1078, 0x7dff, 0x007c, 0x1078, 0x7f8e, 0x00c0, 0x7f7c,
++      0x2001, 0x000a, 0x1078, 0x4502, 0x6003, 0x0001, 0x6007, 0x0001,
++      0x1078, 0x5dd7, 0x0078, 0x7f7e, 0x1078, 0x7dff, 0x007c, 0x2009,
++      0xab8e, 0x2104, 0xa086, 0x0003, 0x00c0, 0x7f8d, 0x2009, 0xab8f,
++      0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x007c, 0xa085, 0x0001,
++      0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006, 0x2164, 0x1078, 0x45d6,
++      0x017f, 0x0c7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x037e, 0x017e,
++      0x6018, 0x2068, 0x2071, 0xa633, 0x2e04, 0xa085, 0x0003, 0x2072,
++      0x1078, 0x8014, 0x0040, 0x7fd9, 0x2009, 0xa633, 0x2104, 0xc0cd,
++      0x200a, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040, 0x7fc2, 0xa006,
++      0x2020, 0x2009, 0x002a, 0x1078, 0xa21d, 0x2001, 0xa60c, 0x200c,
++      0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x1078, 0x284f,
++      0x2071, 0xa600, 0x1078, 0x2677, 0x0c7e, 0x157e, 0x20a9, 0x0081,
++      0x2009, 0x007f, 0x1078, 0x298e, 0x8108, 0x00f0, 0x7fd2, 0x157f,
++      0x0c7f, 0x1078, 0x7f91, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071,
++      0xab80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xa61b,
++      0x206a, 0x78e6, 0x007e, 0x8e70, 0x2e04, 0x2069, 0xa61c, 0x206a,
++      0x78ea, 0xa084, 0xff00, 0x017f, 0xa105, 0x2009, 0xa626, 0x200a,
++      0x2069, 0xab8e, 0x2071, 0xa89e, 0x6810, 0x2072, 0x6814, 0x7006,
++      0x6818, 0x700a, 0x681c, 0x700e, 0x1078, 0x906e, 0x2001, 0x0006,
++      0x1078, 0x4502, 0x1078, 0x28a6, 0x1078, 0x772d, 0x017f, 0x037f,
++      0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x027e, 0x037e, 0x0e7e, 0x157e,
++      0x2019, 0xa626, 0x231c, 0x83ff, 0x0040, 0x803e, 0x2071, 0xab80,
++      0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205, 0xa306,
++      0x00c0, 0x803e, 0x2011, 0xab96, 0xad98, 0x000a, 0x20a9, 0x0004,
++      0x1078, 0x80de, 0x00c0, 0x803e, 0x2011, 0xab9a, 0xad98, 0x0006,
++      0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x803e, 0x157f, 0x0e7f,
++      0x037f, 0x027f, 0x007c, 0x0e7e, 0x2071, 0xab8c, 0x7004, 0xa086,
++      0x0014, 0x00c0, 0x8066, 0x7008, 0xa086, 0x0800, 0x00c0, 0x8066,
++      0x700c, 0xd0ec, 0x0040, 0x8064, 0xa084, 0x0f00, 0xa086, 0x0100,
++      0x00c0, 0x8064, 0x7024, 0xd0a4, 0x00c0, 0x8061, 0xd0ac, 0x0040,
++      0x8064, 0xa006, 0x0078, 0x8066, 0xa085, 0x0001, 0x0e7f, 0x007c,
++      0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e, 0x007e,
++      0x127e, 0x2091, 0x8000, 0x2029, 0xa8ba, 0x252c, 0x2021, 0xa8c0,
++      0x2424, 0x2061, 0xad00, 0x2071, 0xa600, 0x7248, 0x7064, 0xa202,
++      0x00c8, 0x80cc, 0x1078, 0xa242, 0x0040, 0x80c4, 0x671c, 0xa786,
++      0x0001, 0x0040, 0x80c4, 0xa786, 0x0007, 0x0040, 0x80c4, 0x2500,
++      0xac06, 0x0040, 0x80c4, 0x2400, 0xac06, 0x0040, 0x80c4, 0x0c7e,
++      0x6000, 0xa086, 0x0004, 0x00c0, 0x809f, 0x1078, 0x1757, 0xa786,
++      0x0008, 0x00c0, 0x80ae, 0x1078, 0x8f00, 0x00c0, 0x80ae, 0x0c7f,
++      0x1078, 0x7c83, 0x1078, 0x8ec6, 0x0078, 0x80c4, 0x6010, 0x2068,
++      0x1078, 0x8d06, 0x0040, 0x80c1, 0xa786, 0x0003, 0x00c0, 0x80d6,
++      0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078,
++      0x8eb9, 0x1078, 0x8ec6, 0x0c7f, 0xace0, 0x0010, 0x7058, 0xac02,
++      0x00c8, 0x80cc, 0x0078, 0x807d, 0x127f, 0x007f, 0x027f, 0x047f,
++      0x057f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006,
++      0x00c0, 0x80b8, 0x1078, 0xa1ca, 0x0078, 0x80c1, 0x220c, 0x2304,
++      0xa106, 0x00c0, 0x80e9, 0x8210, 0x8318, 0x00f0, 0x80de, 0xa006,
++      0x007c, 0x2304, 0xa102, 0x0048, 0x80f1, 0x2001, 0x0001, 0x0078,
++      0x80f3, 0x2001, 0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a,
++      0x0044, 0x10c8, 0x1332, 0x1078, 0x8eec, 0x0040, 0x8105, 0x1078,
++      0x8f00, 0x0040, 0x8112, 0x0078, 0x810b, 0x1078, 0x28a6, 0x1078,
++      0x8f00, 0x0040, 0x8112, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078,
++      0x62d1, 0x007c, 0x1078, 0x7c83, 0x0078, 0x810b, 0xa182, 0x0040,
++      0x0079, 0x811a, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812d,
++      0x812d, 0x812d, 0x812d, 0x812d, 0x812d, 0x812f, 0x812f, 0x812f,
++      0x812f, 0x812d, 0x812d, 0x812d, 0x812f, 0x1078, 0x1332, 0x600b,
++      0xffff, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091,
++      0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0,
++      0x8146, 0x6004, 0xa082, 0x0040, 0x0079, 0x81d1, 0xa186, 0x0027,
++      0x00c0, 0x8168, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6110,
++      0x2168, 0x1078, 0x8d06, 0x0040, 0x8162, 0x6837, 0x0103, 0x684b,
++      0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x1078, 0x4a73,
++      0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c,
++      0xa186, 0x0014, 0x00c0, 0x8171, 0x6004, 0xa082, 0x0040, 0x0079,
++      0x8199, 0xa186, 0x0046, 0x0040, 0x817d, 0xa186, 0x0045, 0x0040,
++      0x817d, 0xa186, 0x0047, 0x10c0, 0x1332, 0x2001, 0x0109, 0x2004,
++      0xd084, 0x0040, 0x8196, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e,
++      0x027e, 0x1078, 0x5c56, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000,
++      0xa086, 0x0002, 0x00c0, 0x8196, 0x0078, 0x820e, 0x1078, 0x7773,
++      0x007c, 0x81ae, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ac,
++      0x81ac, 0x81ac, 0x81ac, 0x81ac, 0x81ca, 0x81ca, 0x81ca, 0x81ca,
++      0x81ac, 0x81ca, 0x81ac, 0x81ca, 0x1078, 0x1332, 0x1078, 0x61cd,
++      0x0d7e, 0x6110, 0x2168, 0x1078, 0x8d06, 0x0040, 0x81c4, 0x6837,
++      0x0103, 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852,
++      0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d, 0x1078,
++      0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1,
++      0x007c, 0x81e6, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81e4,
++      0x81e4, 0x81e4, 0x81e4, 0x81e4, 0x81f8, 0x81f8, 0x81f8, 0x81f8,
++      0x81e4, 0x8207, 0x81e4, 0x81f8, 0x1078, 0x1332, 0x1078, 0x61cd,
++      0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002, 0x1078, 0x62d1,
++      0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c,
++      0x1078, 0x61cd, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x2001, 0xa8a4,
++      0x2004, 0x603e, 0x6003, 0x000f, 0x1078, 0x62d1, 0x007c, 0x1078,
++      0x61cd, 0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040,
++      0x0079, 0x8212, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8227,
++      0x8327, 0x8359, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x8225,
++      0x8225, 0x8225, 0x8225, 0x8225, 0x8225, 0x1078, 0x1332, 0x0e7e,
++      0x0d7e, 0x603f, 0x0000, 0x2071, 0xab80, 0x7124, 0x610a, 0x2071,
++      0xab8c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040,
++      0x82e9, 0xa68c, 0x0c00, 0x0040, 0x825e, 0x0f7e, 0x2c78, 0x1078,
++      0x4963, 0x0f7f, 0x0040, 0x825a, 0x684c, 0xd0ac, 0x0040, 0x825a,
++      0x6024, 0xd0dc, 0x00c0, 0x825a, 0x6850, 0xd0bc, 0x00c0, 0x825a,
++      0x7318, 0x6814, 0xa306, 0x00c0, 0x8301, 0x731c, 0x6810, 0xa306,
++      0x00c0, 0x8301, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff,
++      0xa186, 0x0002, 0x0040, 0x8291, 0xa186, 0x0028, 0x00c0, 0x826e,
++      0x1078, 0x8eda, 0x684b, 0x001c, 0x0078, 0x8293, 0xd6dc, 0x0040,
++      0x828a, 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0040, 0x8288, 0x6914,
++      0x6a10, 0x2100, 0xa205, 0x0040, 0x8288, 0x7018, 0xa106, 0x00c0,
++      0x8285, 0x701c, 0xa206, 0x0040, 0x8288, 0x6962, 0x6a5e, 0xc6dc,
++      0x0078, 0x8293, 0xd6d4, 0x0040, 0x8291, 0x684b, 0x0007, 0x0078,
++      0x8293, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4,
++      0x0040, 0x82bc, 0xa686, 0x0100, 0x00c0, 0x82a7, 0x2001, 0xab99,
++      0x2004, 0xa005, 0x00c0, 0x82a7, 0xc6c4, 0x0078, 0x8236, 0x7328,
++      0x732c, 0x6b56, 0x83ff, 0x0040, 0x82bc, 0xa38a, 0x0009, 0x0048,
++      0x82b3, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90,
++      0x0019, 0x1078, 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x8317, 0x7124,
++      0x695a, 0x81ff, 0x0040, 0x8317, 0xa192, 0x0021, 0x00c8, 0x82d5,
++      0x2071, 0xab98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078,
++      0x89e2, 0x1078, 0x91f4, 0x0078, 0x8317, 0x6838, 0xd0fc, 0x0040,
++      0x82de, 0x2009, 0x0020, 0x695a, 0x0078, 0x82c8, 0x0f7e, 0x2d78,
++      0x1078, 0x897a, 0x0f7f, 0x1078, 0x91f4, 0x1078, 0x89cf, 0x0078,
++      0x8319, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x8307,
++      0x684c, 0xd0ac, 0x0040, 0x8307, 0x6024, 0xd0dc, 0x00c0, 0x8307,
++      0x6850, 0xd0bc, 0x00c0, 0x8307, 0x6810, 0x6914, 0xa105, 0x0040,
++      0x8307, 0x1078, 0x8fbf, 0x0d7f, 0x0e7f, 0x0078, 0x8326, 0x684b,
++      0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0040, 0x8317,
++      0x6810, 0x6914, 0xa115, 0x0040, 0x8317, 0x1078, 0x84d5, 0x1078,
++      0x4a73, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x1078, 0x8f89,
++      0x0d7f, 0x0e7f, 0x00c0, 0x8326, 0x1078, 0x772d, 0x007c, 0x0f7e,
++      0x6003, 0x0003, 0x2079, 0xab8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
++      0x6010, 0x2078, 0x784c, 0xd0ac, 0x0040, 0x833e, 0x6003, 0x0002,
++      0x0f7f, 0x007c, 0x2130, 0x2228, 0x0078, 0x834a, 0x2400, 0x797c,
++      0xa10a, 0x2300, 0x7a80, 0xa213, 0x2600, 0xa102, 0x2500, 0xa203,
++      0x0048, 0x833a, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x603f,
++      0x0000, 0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b,
++      0x007c, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110,
++      0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa, 0x007c,
++      0xa182, 0x0040, 0x0079, 0x836c, 0x837f, 0x837f, 0x837f, 0x837f,
++      0x837f, 0x8381, 0x8424, 0x837f, 0x837f, 0x843a, 0x84ab, 0x837f,
++      0x837f, 0x837f, 0x837f, 0x84ba, 0x837f, 0x837f, 0x837f, 0x1078,
++      0x1332, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0xab8c, 0x6110,
++      0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e,
++      0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x841f,
++      0xa694, 0xff00, 0xa284, 0x0c00, 0x0040, 0x83a2, 0x7018, 0x7862,
++      0x701c, 0x785e, 0xa284, 0x0300, 0x0040, 0x841f, 0x1078, 0x138b,
++      0x1040, 0x1332, 0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837,
++      0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46,
++      0xa68c, 0x0c00, 0x0040, 0x83c0, 0x7318, 0x6b62, 0x731c, 0x6b5e,
++      0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x83dc, 0xa186, 0x0028,
++      0x00c0, 0x83ce, 0x684b, 0x001c, 0x0078, 0x83de, 0xd6dc, 0x0040,
++      0x83d5, 0x684b, 0x0015, 0x0078, 0x83de, 0xd6d4, 0x0040, 0x83dc,
++      0x684b, 0x0007, 0x0078, 0x83de, 0x684b, 0x0000, 0x6f4e, 0x7850,
++      0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x83fc, 0x7328,
++      0x732c, 0x6b56, 0x83ff, 0x0040, 0x83fc, 0xa38a, 0x0009, 0x0048,
++      0x83f3, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90,
++      0x0019, 0x1078, 0x89e2, 0x037f, 0xd6cc, 0x0040, 0x841f, 0x7124,
++      0x695a, 0x81ff, 0x0040, 0x841f, 0xa192, 0x0021, 0x00c8, 0x8413,
++      0x2071, 0xab98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078,
++      0x89e2, 0x0078, 0x841f, 0x7838, 0xd0fc, 0x0040, 0x841c, 0x2009,
++      0x0020, 0x695a, 0x0078, 0x8408, 0x2d78, 0x1078, 0x897a, 0x0d7f,
++      0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079,
++      0xab8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12,
++      0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x1cf0, 0x1078,
++      0x6df4, 0x007c, 0x0d7e, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f,
++      0x0040, 0x8446, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x6003, 0x0002,
++      0x1078, 0x627a, 0x1078, 0x639b, 0x6110, 0x2168, 0x694c, 0xd1e4,
++      0x0040, 0x84a9, 0xd1cc, 0x0040, 0x8480, 0x6948, 0x6838, 0xd0fc,
++      0x0040, 0x8478, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90,
++      0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304,
++      0x2012, 0x8318, 0x8210, 0x00f0, 0x8467, 0x157f, 0x007f, 0x6852,
++      0x007f, 0x684e, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078, 0x84a3,
++      0x017e, 0x1078, 0x13b4, 0x0d7f, 0x1078, 0x89cf, 0x0078, 0x84a3,
++      0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040,
++      0x849f, 0xa086, 0x0028, 0x00c0, 0x8491, 0x684b, 0x001c, 0x0078,
++      0x84a1, 0xd1dc, 0x0040, 0x8498, 0x684b, 0x0015, 0x0078, 0x84a1,
++      0xd1d4, 0x0040, 0x849f, 0x684b, 0x0007, 0x0078, 0x84a1, 0x684b,
++      0x0000, 0x1078, 0x4a73, 0x1078, 0x8f89, 0x00c0, 0x84a9, 0x1078,
++      0x772d, 0x0d7f, 0x007c, 0x2019, 0x0001, 0x1078, 0x7058, 0x6003,
++      0x0002, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x1078, 0x627a, 0x1078,
++      0x639b, 0x007c, 0x1078, 0x627a, 0x1078, 0x2880, 0x0d7e, 0x6110,
++      0x2168, 0x1078, 0x8d06, 0x0040, 0x84cf, 0x6837, 0x0103, 0x684b,
++      0x0029, 0x6847, 0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f,
++      0x1078, 0x772d, 0x1078, 0x639b, 0x007c, 0x684b, 0x0015, 0xd1fc,
++      0x0040, 0x84e1, 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189,
++      0x0000, 0x6962, 0x685e, 0x007c, 0xa182, 0x0040, 0x0079, 0x84e8,
++      0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fd, 0x84fb, 0x85d0,
++      0x85dc, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb, 0x84fb,
++      0x84fb, 0x84fb, 0x84fb, 0x1078, 0x1332, 0x077e, 0x0f7e, 0x0e7e,
++      0x0d7e, 0x2071, 0xab8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff,
++      0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x851b, 0xa684,
++      0x00ff, 0x00c0, 0x851b, 0x6024, 0xd0f4, 0x0040, 0x851b, 0x1078,
++      0x8fbf, 0x0078, 0x85cb, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218,
++      0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x85c0, 0xa694,
++      0xff00, 0xa284, 0x0c00, 0x0040, 0x8531, 0x7018, 0x7862, 0x701c,
++      0x785e, 0xa284, 0x0300, 0x0040, 0x85bd, 0xa686, 0x0100, 0x00c0,
++      0x8543, 0x2001, 0xab99, 0x2004, 0xa005, 0x00c0, 0x8543, 0xc6c4,
++      0x7e46, 0x0078, 0x8524, 0x1078, 0x138b, 0x1040, 0x1332, 0x2d00,
++      0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838,
++      0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00,
++      0x0040, 0x855e, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff,
++      0xa186, 0x0002, 0x0040, 0x857a, 0xa186, 0x0028, 0x00c0, 0x856c,
++      0x684b, 0x001c, 0x0078, 0x857c, 0xd6dc, 0x0040, 0x8573, 0x684b,
++      0x0015, 0x0078, 0x857c, 0xd6d4, 0x0040, 0x857a, 0x684b, 0x0007,
++      0x0078, 0x857c, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854,
++      0x6856, 0xa01e, 0xd6c4, 0x0040, 0x859a, 0x7328, 0x732c, 0x6b56,
++      0x83ff, 0x0040, 0x859a, 0xa38a, 0x0009, 0x0048, 0x8591, 0x2019,
++      0x0008, 0x037e, 0x2308, 0x2019, 0xab98, 0xad90, 0x0019, 0x1078,
++      0x89e2, 0x037f, 0xd6cc, 0x0040, 0x85bd, 0x7124, 0x695a, 0x81ff,
++      0x0040, 0x85bd, 0xa192, 0x0021, 0x00c8, 0x85b1, 0x2071, 0xab98,
++      0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x89e2, 0x0078,
++      0x85bd, 0x7838, 0xd0fc, 0x0040, 0x85ba, 0x2009, 0x0020, 0x695a,
++      0x0078, 0x85a6, 0x2d78, 0x1078, 0x897a, 0xd6dc, 0x00c0, 0x85c3,
++      0xa006, 0x0078, 0x85c9, 0x2001, 0x0001, 0x2071, 0xab8c, 0x7218,
++      0x731c, 0x1078, 0x1653, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c,
++      0x2001, 0xa8a4, 0x2004, 0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++      0x2c10, 0x1078, 0x15fa, 0x007c, 0x2001, 0xa8a4, 0x2004, 0x603e,
++      0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040,
++      0x870c, 0x603f, 0x0000, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x0f7f,
++      0x0040, 0x8622, 0x6814, 0x6910, 0xa115, 0x0040, 0x8622, 0x6a60,
++      0xa206, 0x00c0, 0x85ff, 0x685c, 0xa106, 0x0040, 0x8622, 0x684c,
++      0xc0e4, 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f, 0x0000,
++      0x6024, 0xd0f4, 0x00c0, 0x8617, 0x697c, 0x6810, 0xa102, 0x603a,
++      0x6980, 0x6814, 0xa103, 0x6036, 0x6024, 0xc0f5, 0x6026, 0x0d7e,
++      0x6018, 0x2068, 0x683c, 0x8000, 0x683e, 0x0d7f, 0x1078, 0x8fbf,
++      0x0078, 0x870c, 0x694c, 0xd1cc, 0x0040, 0x86d1, 0x6948, 0x6838,
++      0xd0fc, 0x0040, 0x8689, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e,
++      0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040,
++      0x865c, 0xa086, 0x0028, 0x00c0, 0x8643, 0x684b, 0x001c, 0x784b,
++      0x001c, 0x0078, 0x8667, 0xd1dc, 0x0040, 0x8653, 0x684b, 0x0015,
++      0x784b, 0x0015, 0x1078, 0x916c, 0x0040, 0x8651, 0x7944, 0xc1dc,
++      0x7946, 0x0078, 0x8667, 0xd1d4, 0x0040, 0x865c, 0x684b, 0x0007,
++      0x784b, 0x0007, 0x0078, 0x8667, 0x684c, 0xd0ac, 0x0040, 0x8667,
++      0x6810, 0x6914, 0xa115, 0x0040, 0x8667, 0x1078, 0x84d5, 0x6848,
++      0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98,
++      0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318,
++      0x8210, 0x00f0, 0x8675, 0x157f, 0x0f7f, 0x007f, 0x6852, 0x007f,
++      0x684e, 0x1078, 0x91f4, 0x017f, 0x2168, 0x1078, 0x13b4, 0x0078,
++      0x8706, 0x017e, 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6,
++      0x0002, 0x0040, 0x86b6, 0xa086, 0x0028, 0x00c0, 0x869d, 0x684b,
++      0x001c, 0x784b, 0x001c, 0x0078, 0x86c1, 0xd1dc, 0x0040, 0x86ad,
++      0x684b, 0x0015, 0x784b, 0x0015, 0x1078, 0x916c, 0x0040, 0x86ab,
++      0x7944, 0xc1dc, 0x7946, 0x0078, 0x86c1, 0xd1d4, 0x0040, 0x86b6,
++      0x684b, 0x0007, 0x784b, 0x0007, 0x0078, 0x86c1, 0x684c, 0xd0ac,
++      0x0040, 0x86c1, 0x6810, 0x6914, 0xa115, 0x0040, 0x86c1, 0x1078,
++      0x84d5, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e, 0x0f7f,
++      0x1078, 0x13b4, 0x0d7f, 0x1078, 0x91f4, 0x1078, 0x89cf, 0x0078,
++      0x8706, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002,
++      0x0040, 0x86f7, 0xa086, 0x0028, 0x00c0, 0x86e2, 0x684b, 0x001c,
++      0x0078, 0x8704, 0xd1dc, 0x0040, 0x86f0, 0x684b, 0x0015, 0x1078,
++      0x916c, 0x0040, 0x86ee, 0x6944, 0xc1dc, 0x6946, 0x0078, 0x8704,
++      0xd1d4, 0x0040, 0x86f7, 0x684b, 0x0007, 0x0078, 0x8704, 0x684b,
++      0x0000, 0x684c, 0xd0ac, 0x0040, 0x8704, 0x6810, 0x6914, 0xa115,
++      0x0040, 0x8704, 0x1078, 0x84d5, 0x1078, 0x4a73, 0x1078, 0x8f89,
++      0x00c0, 0x870c, 0x1078, 0x772d, 0x0d7f, 0x007c, 0x1078, 0x61cd,
++      0x0078, 0x8714, 0x1078, 0x627a, 0x1078, 0x8d06, 0x0040, 0x8733,
++      0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0xa60c, 0x210c,
++      0xd18c, 0x00c0, 0x873e, 0xd184, 0x00c0, 0x873a, 0x6108, 0x694a,
++      0xa18e, 0x0029, 0x00c0, 0x872e, 0x1078, 0xa4e2, 0x6847, 0x0000,
++      0x1078, 0x4a73, 0x0d7f, 0x1078, 0x772d, 0x1078, 0x62d1, 0x1078,
++      0x639b, 0x007c, 0x684b, 0x0004, 0x0078, 0x872e, 0x684b, 0x0004,
++      0x0078, 0x872e, 0xa182, 0x0040, 0x0079, 0x8746, 0x8759, 0x8759,
++      0x8759, 0x8759, 0x8759, 0x875b, 0x8759, 0x875e, 0x8759, 0x8759,
++      0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759, 0x8759,
++      0x8759, 0x1078, 0x1332, 0x1078, 0x772d, 0x007c, 0x007e, 0x027e,
++      0xa016, 0x1078, 0x15fa, 0x027f, 0x007f, 0x007c, 0xa182, 0x0085,
++      0x0079, 0x876a, 0x8773, 0x8771, 0x8771, 0x877f, 0x8771, 0x8771,
++      0x8771, 0x1078, 0x1332, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a,
++      0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x027e,
++      0x057e, 0x0d7e, 0x0e7e, 0x2071, 0xab80, 0x7224, 0x6212, 0x7220,
++      0x1078, 0x8cf2, 0x0040, 0x87a4, 0x2268, 0x6800, 0xa086, 0x0000,
++      0x0040, 0x87a4, 0x6018, 0x6d18, 0xa52e, 0x00c0, 0x87a4, 0x0c7e,
++      0x2d60, 0x1078, 0x89f3, 0x0c7f, 0x0040, 0x87a4, 0x6803, 0x0002,
++      0x6007, 0x0086, 0x0078, 0x87a6, 0x6007, 0x0087, 0x6003, 0x0001,
++      0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0f7e, 0x2278, 0x1078, 0x4963,
++      0x0f7f, 0x0040, 0x87be, 0x6824, 0xd0ec, 0x0040, 0x87be, 0x0c7e,
++      0x2260, 0x603f, 0x0000, 0x1078, 0x8fbf, 0x0c7f, 0x0e7f, 0x0d7f,
++      0x057f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87d4, 0x6004,
++      0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332,
++      0xa082, 0x0085, 0x0079, 0x87e3, 0xa186, 0x0027, 0x0040, 0x87dc,
++      0xa186, 0x0014, 0x10c0, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++      0x1078, 0x62d1, 0x007c, 0x87ea, 0x87ec, 0x87ec, 0x87ea, 0x87ea,
++      0x87ea, 0x87ea, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++      0x1078, 0x62d1, 0x007c, 0xa186, 0x0013, 0x00c0, 0x87fd, 0x6004,
++      0xa082, 0x0085, 0x2008, 0x0078, 0x8838, 0xa186, 0x0027, 0x00c0,
++      0x8820, 0x1078, 0x61cd, 0x1078, 0x2880, 0x0d7e, 0x6010, 0x2068,
++      0x1078, 0x8d06, 0x0040, 0x8816, 0x6837, 0x0103, 0x6847, 0x0000,
++      0x684b, 0x0029, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078,
++      0x772d, 0x1078, 0x62d1, 0x007c, 0x1078, 0x7773, 0x0078, 0x881b,
++      0xa186, 0x0014, 0x00c0, 0x881c, 0x1078, 0x61cd, 0x0d7e, 0x6010,
++      0x2068, 0x1078, 0x8d06, 0x0040, 0x8816, 0x6837, 0x0103, 0x6847,
++      0x0000, 0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x0078, 0x8812,
++      0x0079, 0x883a, 0x8843, 0x8841, 0x8841, 0x8841, 0x8841, 0x8841,
++      0x885e, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6030, 0xa08c, 0xff00,
++      0x810f, 0xa186, 0x0039, 0x0040, 0x8851, 0xa186, 0x0035, 0x00c0,
++      0x8855, 0x2001, 0xa8a2, 0x0078, 0x8857, 0x2001, 0xa8a3, 0x2004,
++      0x6016, 0x6003, 0x000c, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd,
++      0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x886c,
++      0xa186, 0x0035, 0x00c0, 0x8870, 0x2001, 0xa8a2, 0x0078, 0x8872,
++      0x2001, 0xa8a3, 0x2004, 0x6016, 0x6003, 0x000e, 0x1078, 0x62d1,
++      0x007c, 0xa182, 0x008c, 0x00c8, 0x8883, 0xa182, 0x0085, 0x0048,
++      0x8883, 0x0079, 0x8886, 0x1078, 0x7773, 0x007c, 0x888d, 0x888d,
++      0x888d, 0x888d, 0x888f, 0x88ec, 0x888d, 0x1078, 0x1332, 0x0f7e,
++      0x2c78, 0x1078, 0x4963, 0x0f7f, 0x0040, 0x88a2, 0x6030, 0xa08c,
++      0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8903, 0xa186, 0x0035,
++      0x0040, 0x8903, 0x0d7e, 0x1078, 0x8d06, 0x00c0, 0x88ab, 0x1078,
++      0x8eb9, 0x0078, 0x88ce, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x00c0,
++      0x88b3, 0x1078, 0x8eb9, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040,
++      0x88bf, 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0078, 0x88ca, 0xd0bc,
++      0x0040, 0x88c6, 0x684b, 0x0002, 0x0078, 0x88ca, 0x684b, 0x0005,
++      0x1078, 0x8f85, 0x6847, 0x0000, 0x1078, 0x4a73, 0x2c68, 0x1078,
++      0x76c7, 0x0040, 0x88e7, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009,
++      0xab8e, 0x210c, 0x6136, 0x2009, 0xab8f, 0x210c, 0x613a, 0x6918,
++      0x611a, 0x6920, 0x6122, 0x601f, 0x0001, 0x1078, 0x5d8a, 0x2d60,
++      0x1078, 0x772d, 0x0d7f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963,
++      0x0f7f, 0x0040, 0x8929, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186,
++      0x0035, 0x0040, 0x8903, 0xa186, 0x001e, 0x0040, 0x8903, 0xa186,
++      0x0039, 0x00c0, 0x8929, 0x0d7e, 0x2c68, 0x1078, 0x91bc, 0x00c0,
++      0x894d, 0x1078, 0x76c7, 0x0040, 0x8926, 0x6106, 0x6003, 0x0001,
++      0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e,
++      0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a,
++      0x6920, 0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2d60, 0x0078,
++      0x894d, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x894d,
++      0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x893c, 0xc0ec, 0x6852,
++      0x684b, 0x0006, 0x0078, 0x8947, 0xd0bc, 0x0040, 0x8943, 0x684b,
++      0x0002, 0x0078, 0x8947, 0x684b, 0x0005, 0x1078, 0x8f85, 0x6847,
++      0x0000, 0x1078, 0x4a73, 0x1078, 0x8eb9, 0x0d7f, 0x1078, 0x772d,
++      0x007c, 0x017e, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++      0x8961, 0x6837, 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x1078,
++      0x4a73, 0x0d7f, 0x017f, 0xa186, 0x0013, 0x0040, 0x8973, 0xa186,
++      0x0014, 0x0040, 0x8973, 0xa186, 0x0027, 0x0040, 0x8973, 0x1078,
++      0x7773, 0x0078, 0x8979, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078,
++      0x62d1, 0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001,
++      0xa182, 0x0101, 0x00c8, 0x8986, 0x0078, 0x8988, 0x2009, 0x0100,
++      0x2130, 0x2069, 0xab98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020,
++      0xaf90, 0x001d, 0x1078, 0x89e2, 0xa6b2, 0x0020, 0x7804, 0xa06d,
++      0x0040, 0x899c, 0x1078, 0x13b4, 0x1078, 0x138b, 0x0040, 0x89c6,
++      0x8528, 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a,
++      0x003d, 0x00c8, 0x89b2, 0x2608, 0xad90, 0x000f, 0x1078, 0x89e2,
++      0x0078, 0x89c6, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90,
++      0x000f, 0x1078, 0x89e2, 0x0078, 0x899c, 0x0f7f, 0x852f, 0xa5ad,
++      0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0078, 0x89cb, 0x0f7f, 0x852f,
++      0xa5ad, 0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e,
++      0x8dff, 0x0040, 0x89e0, 0x6804, 0xa07d, 0x0040, 0x89de, 0x6807,
++      0x0000, 0x1078, 0x4a73, 0x2f68, 0x0078, 0x89d3, 0x1078, 0x4a73,
++      0x0f7f, 0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x89e8, 0x8108,
++      0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0,
++      0x89ea, 0x157f, 0x007c, 0x067e, 0x127e, 0x2091, 0x8000, 0x2031,
++      0x0001, 0x601c, 0xa084, 0x000f, 0x1079, 0x8a0f, 0x127f, 0x067f,
++      0x007c, 0x127e, 0x2091, 0x8000, 0x067e, 0x2031, 0x0000, 0x601c,
++      0xa084, 0x000f, 0x1079, 0x8a0f, 0x067f, 0x127f, 0x007c, 0x8a29,
++      0x8a17, 0x8a24, 0x8a45, 0x8a17, 0x8a24, 0x8a45, 0x8a24, 0x1078,
++      0x1332, 0x037e, 0x2019, 0x0010, 0x1078, 0x9dc7, 0x601f, 0x0006,
++      0x6003, 0x0007, 0x037f, 0x007c, 0xa006, 0x007c, 0xa085, 0x0001,
++      0x007c, 0x0d7e, 0x86ff, 0x00c0, 0x8a40, 0x6010, 0x2068, 0x1078,
++      0x8d06, 0x0040, 0x8a42, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4b51,
++      0x1078, 0x8f85, 0x1078, 0x4a73, 0x1078, 0x772d, 0xa085, 0x0001,
++      0x0d7f, 0x007c, 0xa006, 0x0078, 0x8a40, 0x6000, 0xa08a, 0x0010,
++      0x10c8, 0x1332, 0x1079, 0x8a4d, 0x007c, 0x8a5d, 0x8a82, 0x8a5f,
++      0x8aa5, 0x8a7e, 0x8a5d, 0x8a24, 0x8a29, 0x8a29, 0x8a24, 0x8a24,
++      0x8a24, 0x8a24, 0x8a24, 0x8a24, 0x8a24, 0x1078, 0x1332, 0x86ff,
++      0x00c0, 0x8a7b, 0x601c, 0xa086, 0x0006, 0x0040, 0x8a7b, 0x0d7e,
++      0x6010, 0x2068, 0x1078, 0x8d06, 0x0040, 0x8a70, 0x1078, 0x8f85,
++      0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078,
++      0x5d8a, 0x1078, 0x62d1, 0xa085, 0x0001, 0x007c, 0x1078, 0x1757,
++      0x0078, 0x8a5f, 0x0e7e, 0x2071, 0xa8b1, 0x7024, 0xac06, 0x00c0,
++      0x8a8b, 0x1078, 0x6fc4, 0x601c, 0xa084, 0x000f, 0xa086, 0x0006,
++      0x00c0, 0x8a9d, 0x087e, 0x097e, 0x2049, 0x0001, 0x2c40, 0x1078,
++      0x7246, 0x097f, 0x087f, 0x0078, 0x8a9f, 0x1078, 0x6ebe, 0x0e7f,
++      0x00c0, 0x8a5f, 0x1078, 0x8a24, 0x007c, 0x037e, 0x0e7e, 0x2071,
++      0xa8b1, 0x703c, 0xac06, 0x00c0, 0x8ab5, 0x2019, 0x0000, 0x1078,
++      0x7058, 0x0e7f, 0x037f, 0x0078, 0x8a5f, 0x1078, 0x738a, 0x0e7f,
++      0x037f, 0x00c0, 0x8a5f, 0x1078, 0x8a24, 0x007c, 0x0c7e, 0x601c,
++      0xa084, 0x000f, 0x1079, 0x8ac6, 0x0c7f, 0x007c, 0x8ad5, 0x8b47,
++      0x8c7f, 0x8ae0, 0x8ec6, 0x8ad5, 0x9db8, 0x772d, 0x8b47, 0x1078,
++      0x8f00, 0x00c0, 0x8ad5, 0x1078, 0x7c83, 0x007c, 0x1078, 0x61cd,
++      0x1078, 0x62d1, 0x1078, 0x772d, 0x007c, 0x6017, 0x0001, 0x007c,
++      0x1078, 0x8d06, 0x0040, 0x8ae8, 0x6010, 0xa080, 0x0019, 0x2c02,
++      0x6000, 0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8af0, 0x007c,
++      0x8b00, 0x8b02, 0x8b24, 0x8b36, 0x8b43, 0x8b00, 0x8ad5, 0x8ad5,
++      0x8ad5, 0x8b36, 0x8b36, 0x8b00, 0x8b00, 0x8b00, 0x8b00, 0x8b40,
++      0x1078, 0x1332, 0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052,
++      0x2071, 0xa8b1, 0x7024, 0xac06, 0x0040, 0x8b20, 0x1078, 0x6ebe,
++      0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xa8a3,
++      0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0e7f, 0x007c,
++      0x6017, 0x0001, 0x0078, 0x8b1e, 0x0d7e, 0x6010, 0x2068, 0x6850,
++      0xc0b5, 0x6852, 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f,
++      0x0002, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x0d7e, 0x6017,
++      0x0001, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x007c,
++      0x1078, 0x772d, 0x007c, 0x1078, 0x1757, 0x0078, 0x8b24, 0x6000,
++      0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8b4f, 0x007c, 0x8b5f,
++      0x8add, 0x8b61, 0x8b5f, 0x8b61, 0x8b61, 0x8ad6, 0x8b5f, 0x8acf,
++      0x8acf, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x8b5f, 0x1078,
++      0x1332, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f,
++      0xa08a, 0x000c, 0x10c8, 0x1332, 0x1079, 0x8b6f, 0x007c, 0x8b7b,
++      0x8c23, 0x8b7d, 0x8bbd, 0x8b7d, 0x8bbd, 0x8b7d, 0x8b8a, 0x8b7b,
++      0x8bbd, 0x8b7b, 0x8ba7, 0x1078, 0x1332, 0x6004, 0xa08e, 0x0016,
++      0x0040, 0x8bb8, 0xa08e, 0x0004, 0x0040, 0x8bb8, 0xa08e, 0x0002,
++      0x0040, 0x8bb8, 0x6004, 0x1078, 0x8f00, 0x0040, 0x8c3e, 0xa08e,
++      0x0021, 0x0040, 0x8c42, 0xa08e, 0x0022, 0x0040, 0x8c3e, 0xa08e,
++      0x003d, 0x0040, 0x8c42, 0xa08e, 0x0039, 0x0040, 0x8c46, 0xa08e,
++      0x0035, 0x0040, 0x8c46, 0xa08e, 0x001e, 0x0040, 0x8bba, 0xa08e,
++      0x0001, 0x00c0, 0x8bb6, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084,
++      0x00ff, 0x0d7f, 0xa086, 0x0006, 0x0040, 0x8bb8, 0x1078, 0x2880,
++      0x1078, 0x7c83, 0x1078, 0x8ec6, 0x007c, 0x0c7e, 0x0d7e, 0x6104,
++      0xa186, 0x0016, 0x0040, 0x8c13, 0xa186, 0x0002, 0x00c0, 0x8be6,
++      0x6018, 0x2068, 0x68a0, 0xd0bc, 0x00c0, 0x8c6a, 0x6840, 0xa084,
++      0x00ff, 0xa005, 0x0040, 0x8be6, 0x8001, 0x6842, 0x6013, 0x0000,
++      0x601f, 0x0007, 0x6017, 0x0398, 0x1078, 0x76c7, 0x0040, 0x8be6,
++      0x2d00, 0x601a, 0x601f, 0x0001, 0x0078, 0x8c13, 0x0d7f, 0x0c7f,
++      0x6004, 0xa08e, 0x0002, 0x00c0, 0x8c04, 0x6018, 0xa080, 0x0028,
++      0x2004, 0xa086, 0x007e, 0x00c0, 0x8c04, 0x2009, 0xa633, 0x2104,
++      0xc085, 0x200a, 0x0e7e, 0x2071, 0xa600, 0x1078, 0x42b8, 0x0e7f,
++      0x1078, 0x7c83, 0x0078, 0x8c08, 0x1078, 0x7c83, 0x1078, 0x2880,
++      0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x127f, 0x0e7f,
++      0x1078, 0x8ec6, 0x007c, 0x2001, 0x0002, 0x1078, 0x4502, 0x6003,
++      0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0d7f,
++      0x0c7f, 0x0078, 0x8c12, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016,
++      0x0040, 0x8c13, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005,
++      0x0040, 0x8be6, 0x8001, 0x6842, 0x6003, 0x0001, 0x1078, 0x5dd7,
++      0x1078, 0x62d1, 0x0d7f, 0x0c7f, 0x0078, 0x8c12, 0x1078, 0x7c83,
++      0x0078, 0x8bba, 0x1078, 0x7ca6, 0x0078, 0x8bba, 0x0d7e, 0x2c68,
++      0x6104, 0x1078, 0x91bc, 0x0d7f, 0x0040, 0x8c52, 0x1078, 0x772d,
++      0x0078, 0x8c69, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105,
++      0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038,
++      0x600a, 0x2001, 0xa8a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078,
++      0x62d1, 0x007c, 0x0d7f, 0x0c7f, 0x1078, 0x7c83, 0x1078, 0x2880,
++      0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x28a6, 0x6013, 0x0000,
++      0x601f, 0x0007, 0x6017, 0x0398, 0x127f, 0x0e7f, 0x007c, 0x6000,
++      0xa08a, 0x0010, 0x10c8, 0x1332, 0x1079, 0x8c87, 0x007c, 0x8c97,
++      0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97, 0x8c97,
++      0x8ad5, 0x8c97, 0x8add, 0x8c99, 0x8add, 0x8ca7, 0x8c97, 0x1078,
++      0x1332, 0x6004, 0xa086, 0x008b, 0x0040, 0x8ca7, 0x6007, 0x008b,
++      0x6003, 0x000d, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x007c, 0x1078,
++      0x8eb9, 0x1078, 0x8d06, 0x0040, 0x8cdf, 0x1078, 0x2880, 0x0d7e,
++      0x1078, 0x8d06, 0x0040, 0x8cc1, 0x6010, 0x2068, 0x6837, 0x0103,
++      0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x1078,
++      0x4a73, 0x2c68, 0x1078, 0x76c7, 0x0040, 0x8ccf, 0x6818, 0x601a,
++      0x0c7e, 0x2d60, 0x1078, 0x8ec6, 0x0c7f, 0x0078, 0x8cd0, 0x2d60,
++      0x0d7f, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003,
++      0x0001, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0078, 0x8cf1, 0x6030,
++      0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x8ceb, 0xa186,
++      0x0035, 0x00c0, 0x8cef, 0x1078, 0x2880, 0x0078, 0x8cc1, 0x1078,
++      0x8ec6, 0x007c, 0xa284, 0x000f, 0x00c0, 0x8d03, 0xa282, 0xad00,
++      0x0048, 0x8d03, 0x2001, 0xa616, 0x2004, 0xa202, 0x00c8, 0x8d03,
++      0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x8d02, 0x027e, 0x0e7e,
++      0x2071, 0xa600, 0x6210, 0x705c, 0xa202, 0x0048, 0x8d18, 0x7060,
++      0xa202, 0x00c8, 0x8d18, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c,
++      0xa006, 0x0078, 0x8d15, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e,
++      0x2091, 0x8000, 0x2061, 0xad00, 0x2071, 0xa600, 0x7348, 0x7064,
++      0xa302, 0x00c8, 0x8d45, 0x601c, 0xa206, 0x00c0, 0x8d3d, 0x1078,
++      0x902b, 0x0040, 0x8d3d, 0x1078, 0x8f00, 0x00c0, 0x8d39, 0x1078,
++      0x7c83, 0x0c7e, 0x1078, 0x772d, 0x0c7f, 0xace0, 0x0010, 0x7058,
++      0xac02, 0x00c8, 0x8d45, 0x0078, 0x8d26, 0x127f, 0x007f, 0x037f,
++      0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x017e, 0xa188, 0xa735,
++      0x210c, 0x81ff, 0x0040, 0x8d59, 0x2061, 0xa9b3, 0x611a, 0x1078,
++      0x2880, 0xa006, 0x0078, 0x8d5e, 0xa085, 0x0001, 0x017f, 0x0c7f,
++      0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e,
++      0x1078, 0x76c7, 0x057f, 0x0040, 0x8d7b, 0x6612, 0x651a, 0x601f,
++      0x0003, 0x2009, 0x004b, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f,
++      0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8d77, 0x0c7e, 0x057e,
++      0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x76c7, 0x057f,
++      0x0040, 0x8da9, 0x6013, 0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e,
++      0x2560, 0x1078, 0x47e9, 0x0c7f, 0x1078, 0x5f01, 0x077e, 0x2039,
++      0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f, 0x2009,
++      0x004c, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f,
++      0x007c, 0xa006, 0x0078, 0x8da5, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e,
++      0x1078, 0x76c7, 0x2c78, 0x0c7f, 0x0040, 0x8dc6, 0x7e12, 0x2c00,
++      0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x1078, 0x8e11, 0x2f60,
++      0x2009, 0x004d, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f,
++      0x0f7f, 0x007c, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7,
++      0x2c78, 0x0c7f, 0x0040, 0x8de4, 0x7e12, 0x2c00, 0x781a, 0x781f,
++      0x0003, 0x2021, 0x0005, 0x1078, 0x8e11, 0x2f60, 0x2009, 0x004e,
++      0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, 0x007c,
++      0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x76c7, 0x2c78, 0x0c7f,
++      0x0040, 0x8e0d, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021,
++      0x0004, 0x1078, 0x8e11, 0x2001, 0xa89d, 0x2004, 0xd0fc, 0x0040,
++      0x8e06, 0x2f60, 0x1078, 0x772d, 0x0078, 0x8e0b, 0x2f60, 0x2009,
++      0x0052, 0x1078, 0x775c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f,
++      0x007c, 0x097e, 0x077e, 0x127e, 0x2091, 0x8000, 0x1078, 0x4775,
++      0x0040, 0x8e1e, 0x2001, 0x8e16, 0x0078, 0x8e24, 0x1078, 0x4739,
++      0x0040, 0x8e2d, 0x2001, 0x8e1e, 0x007e, 0xa00e, 0x2400, 0x1078,
++      0x4b51, 0x1078, 0x4a73, 0x007f, 0x007a, 0x2418, 0x1078, 0x6161,
++      0x62a0, 0x087e, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x1078,
++      0x5f1b, 0x087f, 0x1078, 0x5e0a, 0x2f08, 0x2648, 0x1078, 0x9f8b,
++      0x613c, 0x81ff, 0x1040, 0x5fdb, 0x1078, 0x62d1, 0x127f, 0x077f,
++      0x097f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++      0x76c7, 0x017f, 0x0040, 0x8e63, 0x660a, 0x611a, 0x601f, 0x0001,
++      0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, 0x775c, 0xa085, 0x0001,
++      0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e60, 0x0c7e, 0x127e,
++      0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8e7f,
++      0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021,
++      0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006,
++      0x0078, 0x8e7c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++      0x76c7, 0x017f, 0x0040, 0x8e9b, 0x660a, 0x611a, 0x601f, 0x0001,
++      0x2d00, 0x6012, 0x2009, 0x003d, 0x1078, 0x775c, 0xa085, 0x0001,
++      0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e98, 0x0c7e, 0x127e,
++      0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x8eb6,
++      0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x1078,
++      0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078,
++      0x8eb3, 0x027e, 0x0d7e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040,
++      0x8ec3, 0x8211, 0x6a3e, 0x0d7f, 0x027f, 0x007c, 0x007e, 0x6000,
++      0xa086, 0x0000, 0x0040, 0x8ed8, 0x6013, 0x0000, 0x601f, 0x0007,
++      0x2001, 0xa8a3, 0x2004, 0x6016, 0x1078, 0xa495, 0x603f, 0x0000,
++      0x007f, 0x007c, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0xa653, 0x2634,
++      0xd6e4, 0x0040, 0x8ee8, 0x6618, 0x2660, 0x6e48, 0x1078, 0x46e7,
++      0x0d7f, 0x0c7f, 0x067f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e,
++      0x0002, 0x0040, 0x8efd, 0xa08e, 0x0003, 0x0040, 0x8efd, 0xa08e,
++      0x0004, 0x0040, 0x8efd, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c,
++      0x007e, 0x0d7e, 0x6010, 0xa06d, 0x0040, 0x8f0d, 0x6838, 0xd0fc,
++      0x0040, 0x8f0d, 0xa006, 0x0078, 0x8f0f, 0xa085, 0x0001, 0x0d7f,
++      0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++      0x76c7, 0x017f, 0x0040, 0x8f2c, 0x611a, 0x601f, 0x0001, 0x2d00,
++      0x6012, 0x1078, 0x2880, 0x2009, 0x0028, 0x1078, 0x775c, 0xa085,
++      0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8f29, 0xa186,
++      0x0015, 0x00c0, 0x8f44, 0x2011, 0xa620, 0x2204, 0xa086, 0x0074,
++      0x00c0, 0x8f44, 0x1078, 0x7f91, 0x6003, 0x0001, 0x6007, 0x0029,
++      0x1078, 0x5dd7, 0x0078, 0x8f48, 0x1078, 0x7c83, 0x1078, 0x772d,
++      0x007c, 0xa186, 0x0016, 0x00c0, 0x8f53, 0x2001, 0x0004, 0x1078,
++      0x4502, 0x0078, 0x8f74, 0xa186, 0x0015, 0x00c0, 0x8f78, 0x2011,
++      0xa620, 0x2204, 0xa086, 0x0014, 0x00c0, 0x8f78, 0x0d7e, 0x6018,
++      0x2068, 0x1078, 0x4649, 0x0d7f, 0x1078, 0x8043, 0x00c0, 0x8f78,
++      0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005, 0x0040, 0x8f78,
++      0x2001, 0x0006, 0x1078, 0x4502, 0x1078, 0x77f8, 0x0078, 0x8f7c,
++      0x1078, 0x7c83, 0x1078, 0x772d, 0x007c, 0x6848, 0xa086, 0x0005,
++      0x00c0, 0x8f84, 0x1078, 0x8f85, 0x007c, 0x6850, 0xc0ad, 0x6852,
++      0x007c, 0x0e7e, 0x2071, 0xab8c, 0x7014, 0xd0e4, 0x0040, 0x8f9a,
++      0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x1078, 0x5d8a,
++      0x1078, 0x62d1, 0x0e7f, 0x007c, 0x0c7e, 0x0f7e, 0x2c78, 0x1078,
++      0x4963, 0x0f7f, 0x0040, 0x8fa9, 0x601c, 0xa084, 0x000f, 0x1079,
++      0x8fab, 0x0c7f, 0x007c, 0x8ad5, 0x8fb6, 0x8fb9, 0x8fbc, 0xa25d,
++      0xa279, 0xa27c, 0x8ad5, 0x8ad5, 0x1078, 0x1332, 0x0005, 0x0005,
++      0x007c, 0x0005, 0x0005, 0x007c, 0x1078, 0x8fbf, 0x007c, 0x0f7e,
++      0x2c78, 0x1078, 0x4963, 0x0040, 0x8fee, 0x1078, 0x76c7, 0x00c0,
++      0x8fcf, 0x2001, 0xa8a4, 0x2004, 0x783e, 0x0078, 0x8fee, 0x7818,
++      0x601a, 0x781c, 0xa086, 0x0003, 0x0040, 0x8fdc, 0x7808, 0x6036,
++      0x2f00, 0x603a, 0x0078, 0x8fe0, 0x7808, 0x603a, 0x2f00, 0x6036,
++      0x602a, 0x601f, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7920,
++      0x6122, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x2f60, 0x0f7f, 0x007c,
++      0x017e, 0x0f7e, 0x682c, 0x6032, 0xa08e, 0x0001, 0x0040, 0x9001,
++      0xa086, 0x0005, 0x0040, 0x9005, 0xa006, 0x602a, 0x602e, 0x0078,
++      0x9016, 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6810, 0x2078, 0x787c,
++      0x6938, 0xa102, 0x7880, 0x6934, 0xa103, 0x00c8, 0x8ffc, 0x6834,
++      0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036,
++      0x6808, 0x603a, 0x6918, 0x611a, 0x6920, 0x6122, 0x601f, 0x0001,
++      0x6007, 0x0039, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x6803, 0x0002,
++      0x0f7f, 0x017f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0034,
++      0x0040, 0x9050, 0xa08e, 0x0035, 0x0040, 0x9050, 0xa08e, 0x0036,
++      0x0040, 0x9050, 0xa08e, 0x0037, 0x0040, 0x9050, 0xa08e, 0x0038,
++      0x0040, 0x9050, 0xa08e, 0x0039, 0x0040, 0x9050, 0xa08e, 0x003a,
++      0x0040, 0x9050, 0xa08e, 0x003b, 0x0040, 0x9050, 0xa085, 0x0001,
++      0x017f, 0x007f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4963, 0x00c0,
++      0x905d, 0xa085, 0x0001, 0x0078, 0x906c, 0x6024, 0xd0f4, 0x00c0,
++      0x906b, 0xc0f5, 0x6026, 0x6010, 0x2078, 0x7828, 0x603a, 0x782c,
++      0x6036, 0x1078, 0x1757, 0xa006, 0x0f7f, 0x007c, 0x007e, 0x017e,
++      0x027e, 0x037e, 0x0e7e, 0x2001, 0xa89e, 0x200c, 0x8000, 0x2014,
++      0x2001, 0x0032, 0x1078, 0x5c1c, 0x2001, 0xa8a2, 0x82ff, 0x00c0,
++      0x9083, 0x2011, 0x0014, 0x2202, 0x2001, 0xa8a0, 0x200c, 0x8000,
++      0x2014, 0x2071, 0xa88d, 0x711a, 0x721e, 0x2001, 0x0064, 0x1078,
++      0x5c1c, 0x2001, 0xa8a3, 0x82ff, 0x00c0, 0x9098, 0x2011, 0x0014,
++      0x2202, 0x2009, 0xa8a4, 0xa280, 0x000a, 0x200a, 0x1078, 0x498b,
++      0x0e7f, 0x037f, 0x027f, 0x017f, 0x007f, 0x007c, 0x007e, 0x0e7e,
++      0x2001, 0xa8a2, 0x2003, 0x0028, 0x2001, 0xa8a3, 0x2003, 0x0014,
++      0x2071, 0xa88d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0xa8a4,
++      0x2003, 0x001e, 0x0e7f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091,
++      0x8000, 0x0c7e, 0x1078, 0x76c7, 0x017f, 0x0040, 0x90d5, 0x611a,
++      0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, 0x1078, 0x775c,
++      0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x90d2,
++      0x0d7e, 0x0e7e, 0x0f7e, 0x2071, 0xa600, 0xa186, 0x0015, 0x00c0,
++      0x9107, 0x7080, 0xa086, 0x0018, 0x00c0, 0x9107, 0x6010, 0x2068,
++      0x6a3c, 0xd2e4, 0x00c0, 0x90fb, 0x2c78, 0x1078, 0x6490, 0x0040,
++      0x910f, 0x706c, 0x6a50, 0xa206, 0x00c0, 0x9103, 0x7070, 0x6a54,
++      0xa206, 0x00c0, 0x9103, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009,
++      0x0000, 0x1078, 0x28c8, 0x1078, 0x77f8, 0x0078, 0x910b, 0x1078,
++      0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x7050,
++      0xa080, 0x29c0, 0x2004, 0x6a54, 0xa206, 0x0040, 0x90fb, 0x0078,
++      0x9103, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x76c7,
++      0x017f, 0x0040, 0x9131, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012,
++      0x2009, 0x0043, 0x1078, 0x775c, 0xa085, 0x0001, 0x127f, 0x0c7f,
++      0x007c, 0xa006, 0x0078, 0x912e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071,
++      0xa600, 0xa186, 0x0015, 0x00c0, 0x915a, 0x7080, 0xa086, 0x0004,
++      0x00c0, 0x915a, 0x6010, 0xa0e8, 0x000f, 0x2c78, 0x1078, 0x6490,
++      0x0040, 0x9162, 0x706c, 0x6a08, 0xa206, 0x00c0, 0x9156, 0x7070,
++      0x6a0c, 0xa206, 0x00c0, 0x9156, 0x1078, 0x2880, 0x1078, 0x77f8,
++      0x0078, 0x915e, 0x1078, 0x7c83, 0x1078, 0x772d, 0x0f7f, 0x0e7f,
++      0x0d7f, 0x007c, 0x7050, 0xa080, 0x29c0, 0x2004, 0x6a0c, 0xa206,
++      0x0040, 0x9154, 0x0078, 0x9156, 0x017e, 0x027e, 0x684c, 0xd0ac,
++      0x0040, 0x9184, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0040, 0x9184,
++      0x6860, 0xa106, 0x00c0, 0x9180, 0x685c, 0xa206, 0x0040, 0x9184,
++      0x6962, 0x6a5e, 0xa085, 0x0001, 0x027f, 0x017f, 0x007c, 0x0e7e,
++      0x127e, 0x2071, 0xa600, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001,
++      0x0048, 0x91b9, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040,
++      0x91a5, 0xace0, 0x0010, 0x7058, 0xac02, 0x00c8, 0x91a1, 0x0078,
++      0x9194, 0x2061, 0xad00, 0x0078, 0x9194, 0x6003, 0x0008, 0x8529,
++      0x754a, 0xaca8, 0x0010, 0x7058, 0xa502, 0x00c8, 0x91b5, 0x754e,
++      0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704f, 0xad00, 0x0078,
++      0x91b0, 0xa006, 0x0078, 0x91b2, 0x0c7e, 0x027e, 0x017e, 0xa186,
++      0x0035, 0x0040, 0x91c6, 0x6a34, 0x0078, 0x91c7, 0x6a28, 0x1078,
++      0x8cf2, 0x0040, 0x91f0, 0x2260, 0x611c, 0xa186, 0x0003, 0x0040,
++      0x91d5, 0xa186, 0x0006, 0x00c0, 0x91ec, 0x6834, 0xa206, 0x0040,
++      0x91e4, 0x6838, 0xa206, 0x00c0, 0x91ec, 0x6108, 0x6834, 0xa106,
++      0x00c0, 0x91ec, 0x0078, 0x91e9, 0x6008, 0x6938, 0xa106, 0x00c0,
++      0x91ec, 0x6018, 0x6918, 0xa106, 0x017f, 0x027f, 0x0c7f, 0x007c,
++      0xa085, 0x0001, 0x0078, 0x91ec, 0x6944, 0xd1cc, 0x0040, 0x920d,
++      0xa18c, 0x00ff, 0xa18e, 0x0002, 0x00c0, 0x920d, 0xad88, 0x001e,
++      0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001, 0x00c0, 0x920d,
++      0x6810, 0x6914, 0xa115, 0x10c0, 0x84d5, 0x007c, 0x067e, 0x6000,
++      0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9218, 0x067f, 0x007c,
++      0x9228, 0x96df, 0x97fb, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228,
++      0x9262, 0x988e, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228, 0x9228,
++      0x1078, 0x1332, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1332,
++      0x1079, 0x9234, 0x067f, 0x007c, 0x9244, 0x9d53, 0x9244, 0x9244,
++      0x9244, 0x9244, 0x9244, 0x9244, 0x9d11, 0x9da1, 0x9244, 0xa3b0,
++      0xa3e4, 0xa3b0, 0xa3e4, 0x9244, 0x1078, 0x1332, 0x067e, 0x6000,
++      0xa0b2, 0x0010, 0x10c8, 0x1332, 0x1079, 0x9250, 0x067f, 0x007c,
++      0x9260, 0x99eb, 0x9ac7, 0x9af5, 0x9b70, 0x9260, 0x9c76, 0x9c1e,
++      0x989a, 0x9ce5, 0x9cfb, 0x9260, 0x9260, 0x9260, 0x9260, 0x9260,
++      0x1078, 0x1332, 0xa1b2, 0x0044, 0x10c8, 0x1332, 0x2100, 0x0079,
++      0x9269, 0x92a9, 0x9498, 0x92a9, 0x92a9, 0x92a9, 0x94a0, 0x92a9,
++      0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++      0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++      0x92ab, 0x9311, 0x9320, 0x9377, 0x9396, 0x9415, 0x9485, 0x92a9,
++      0x92a9, 0x94a4, 0x92a9, 0x92a9, 0x94b7, 0x94c2, 0x92a9, 0x92a9,
++      0x92a9, 0x92a9, 0x92a9, 0x94fa, 0x92a9, 0x92a9, 0x9509, 0x92a9,
++      0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x9522, 0x92a9, 0x92a9,
++      0x92a9, 0x95af, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9, 0x92a9,
++      0x9629, 0x1078, 0x1332, 0x1078, 0x4967, 0x00c0, 0x92bb, 0x2001,
++      0xa633, 0x2004, 0xd0cc, 0x00c0, 0x92bb, 0xa084, 0x0009, 0xa086,
++      0x0008, 0x00c0, 0x92c3, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013,
++      0x0000, 0x0078, 0x9493, 0x1078, 0x4957, 0x0e7e, 0x0c7e, 0x037e,
++      0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029,
++      0x1078, 0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08,
++      0x1078, 0x9f8b, 0x077f, 0x017f, 0x2e60, 0x1078, 0x47e9, 0x017f,
++      0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x6618, 0x0c7e, 0x2660, 0x1078,
++      0x45d6, 0x0c7f, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082,
++      0x0006, 0x0048, 0x9303, 0x1078, 0x9ebf, 0x00c0, 0x9371, 0x1078,
++      0x9e50, 0x00c0, 0x92ff, 0x6007, 0x0008, 0x0078, 0x9493, 0x6007,
++      0x0009, 0x0078, 0x9493, 0x1078, 0xa09f, 0x0040, 0x930d, 0x1078,
++      0x9ebf, 0x0040, 0x92f7, 0x0078, 0x9371, 0x6013, 0x1900, 0x0078,
++      0x92ff, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6106, 0x1078, 0x9e05,
++      0x6007, 0x0006, 0x0078, 0x9493, 0x6007, 0x0007, 0x0078, 0x9493,
++      0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, 0x9664,
++      0x0d7e, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, 0xa082, 0x0006,
++      0x00c8, 0x9336, 0x2001, 0x0001, 0x1078, 0x44ee, 0xa6b4, 0xff00,
++      0x8637, 0xa686, 0x0006, 0x0040, 0x9353, 0xa686, 0x0004, 0x0040,
++      0x9353, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9353,
++      0xa686, 0x0004, 0x0040, 0x9353, 0xa686, 0x0005, 0x0040, 0x9353,
++      0x0d7f, 0x0078, 0x9371, 0x1078, 0x9f25, 0x00c0, 0x936c, 0xa686,
++      0x0006, 0x00c0, 0x9365, 0x027e, 0x6218, 0xa290, 0x0028, 0x2214,
++      0x2009, 0x0000, 0x1078, 0x28c8, 0x027f, 0x1078, 0x4649, 0x6007,
++      0x000a, 0x0d7f, 0x0078, 0x9493, 0x6007, 0x000b, 0x0d7f, 0x0078,
++      0x9493, 0x1078, 0x2880, 0x6007, 0x0001, 0x0078, 0x9493, 0x1078,
++      0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6618,
++      0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa686, 0x0707, 0x0040, 0x9371,
++      0x027e, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x1078,
++      0x28c8, 0x027f, 0x6007, 0x000c, 0x0078, 0x9493, 0x1078, 0x4967,
++      0x00c0, 0x93a3, 0x2001, 0xa633, 0x2004, 0xa084, 0x0009, 0xa086,
++      0x0008, 0x00c0, 0x93ab, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013,
++      0x0000, 0x0078, 0x9493, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001,
++      0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x93ef, 0xa6b4,
++      0xff00, 0x8637, 0xa686, 0x0004, 0x0040, 0x93c2, 0xa686, 0x0006,
++      0x00c0, 0x9371, 0x1078, 0x9f34, 0x00c0, 0x93ca, 0x6007, 0x000e,
++      0x0078, 0x9493, 0x047e, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4,
++      0x00ff, 0x8427, 0x047e, 0x1078, 0x2880, 0x047f, 0x017e, 0xa006,
++      0x2009, 0xa653, 0x210c, 0xd1a4, 0x0040, 0x93e9, 0x2009, 0x0029,
++      0x1078, 0xa21d, 0x6018, 0x0d7e, 0x2068, 0x6800, 0xc0e5, 0x6802,
++      0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, 0x0078, 0x9493, 0x2001,
++      0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9,
++      0x0004, 0x2019, 0xa605, 0x2011, 0xab90, 0x1078, 0x80de, 0x037f,
++      0x027f, 0x017f, 0x157f, 0xa005, 0x0040, 0x940f, 0xa6b4, 0xff00,
++      0x8637, 0xa686, 0x0006, 0x0040, 0x93c2, 0x0078, 0x9371, 0x6013,
++      0x1900, 0x6007, 0x0009, 0x0078, 0x9493, 0x1078, 0x4967, 0x00c0,
++      0x9422, 0x2001, 0xa633, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008,
++      0x00c0, 0x942a, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000,
++      0x0078, 0x9493, 0x1078, 0x4957, 0x6618, 0xa6b0, 0x0001, 0x2634,
++      0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x9472, 0xa6b4, 0xff00,
++      0x8637, 0xa686, 0x0004, 0x0040, 0x9441, 0xa686, 0x0006, 0x00c0,
++      0x9371, 0x1078, 0x9f5f, 0x00c0, 0x944d, 0x1078, 0x9e50, 0x00c0,
++      0x944d, 0x6007, 0x0010, 0x0078, 0x9493, 0x047e, 0x6418, 0xa4a0,
++      0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x047e, 0x1078, 0x2880,
++      0x047f, 0x017e, 0xa006, 0x2009, 0xa653, 0x210c, 0xd1a4, 0x0040,
++      0x946c, 0x2009, 0x0029, 0x1078, 0xa21d, 0x6018, 0x0d7e, 0x2068,
++      0x6800, 0xc0e5, 0x6802, 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001,
++      0x0078, 0x9493, 0x1078, 0xa09f, 0x0040, 0x947f, 0xa6b4, 0xff00,
++      0x8637, 0xa686, 0x0006, 0x0040, 0x9441, 0x0078, 0x9371, 0x6013,
++      0x1900, 0x6007, 0x0009, 0x0078, 0x9493, 0x1078, 0x29bb, 0x00c0,
++      0x9664, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0,
++      0x9371, 0x6007, 0x0012, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c,
++      0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x0078, 0x9497,
++      0x6007, 0x0005, 0x0078, 0x949a, 0x1078, 0xa41c, 0x00c0, 0x9664,
++      0x1078, 0x29bb, 0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371,
++      0x6007, 0x0020, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x007c, 0x1078,
++      0x29bb, 0x00c0, 0x9664, 0x6007, 0x0023, 0x6003, 0x0001, 0x1078,
++      0x5dd7, 0x007c, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb,
++      0x00c0, 0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, 0x017e, 0x027e,
++      0x2011, 0xab90, 0x2214, 0x2c08, 0xa006, 0x1078, 0xa1e6, 0x00c0,
++      0x94e9, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0xab89,
++      0x2214, 0xa296, 0xffff, 0x00c0, 0x94f3, 0x6007, 0x0025, 0x0078,
++      0x94f3, 0x6004, 0xa086, 0x0024, 0x00c0, 0x94f0, 0x1078, 0x772d,
++      0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x5dd7, 0x027f,
++      0x017f, 0x007c, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x6106, 0x1078,
++      0x9687, 0x6007, 0x002b, 0x0078, 0x9493, 0x6007, 0x002c, 0x0078,
++      0x9493, 0x1078, 0xa41c, 0x00c0, 0x9664, 0x1078, 0x29bb, 0x00c0,
++      0x9664, 0x1078, 0x9667, 0x00c0, 0x9371, 0x6106, 0x1078, 0x968c,
++      0x00c0, 0x951e, 0x6007, 0x002e, 0x0078, 0x9493, 0x6007, 0x002f,
++      0x0078, 0x9493, 0x1078, 0x29bb, 0x00c0, 0x9664, 0x0e7e, 0x0d7e,
++      0x0c7e, 0x6018, 0xa080, 0x0001, 0x200c, 0xa184, 0x00ff, 0xa086,
++      0x0006, 0x0040, 0x953f, 0xa184, 0xff00, 0x8007, 0xa086, 0x0006,
++      0x0040, 0x953f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0078, 0x9498, 0x2001,
++      0xa672, 0x2004, 0xd0e4, 0x0040, 0x95ab, 0x2071, 0xab8c, 0x7010,
++      0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xa653, 0x2004,
++      0xd0a4, 0x0040, 0x955d, 0x6018, 0x2068, 0x6810, 0xa106, 0x00c0,
++      0x955d, 0x6814, 0xa206, 0x0040, 0x9581, 0x2001, 0xa653, 0x2004,
++      0xd0ac, 0x00c0, 0x959f, 0x2069, 0xa600, 0x6870, 0xa206, 0x00c0,
++      0x959f, 0x686c, 0xa106, 0x00c0, 0x959f, 0x7210, 0x1078, 0x8cf2,
++      0x0040, 0x95a5, 0x1078, 0xa28e, 0x0040, 0x95a5, 0x622a, 0x6007,
++      0x0036, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0c7f, 0x0d7f, 0x0e7f,
++      0x007c, 0x7214, 0xa286, 0xffff, 0x0040, 0x9593, 0x1078, 0x8cf2,
++      0x0040, 0x95a5, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x00c0,
++      0x95a5, 0x0078, 0x956e, 0x7210, 0x2c08, 0xa085, 0x0001, 0x1078,
++      0xa1e6, 0x2c10, 0x2160, 0x0040, 0x95a5, 0x0078, 0x956e, 0x6007,
++      0x0037, 0x6013, 0x1500, 0x0078, 0x9579, 0x6007, 0x0037, 0x6013,
++      0x1700, 0x0078, 0x9579, 0x6007, 0x0012, 0x0078, 0x9579, 0x1078,
++      0x29bb, 0x00c0, 0x9664, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084,
++      0xff00, 0x8007, 0xa086, 0x0006, 0x00c0, 0x9498, 0x0e7e, 0x0d7e,
++      0x0c7e, 0x2001, 0xa672, 0x2004, 0xd0e4, 0x0040, 0x9621, 0x2069,
++      0xa600, 0x2071, 0xab8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286,
++      0xffff, 0x00c0, 0x95de, 0x7208, 0x0c7e, 0x2c08, 0xa085, 0x0001,
++      0x1078, 0xa1e6, 0x2c10, 0x0c7f, 0x0040, 0x9615, 0x1078, 0x8cf2,
++      0x0040, 0x9615, 0x0c7e, 0x027e, 0x2260, 0x1078, 0x89f3, 0x027f,
++      0x0c7f, 0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0040,
++      0x95ff, 0xa186, 0x0005, 0x0040, 0x95f9, 0xa186, 0x0007, 0x00c0,
++      0x9609, 0xa280, 0x0004, 0x2004, 0xa005, 0x0040, 0x9609, 0x057e,
++      0x7510, 0x7614, 0x1078, 0xa2a3, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f,
++      0x007c, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003,
++      0x0001, 0x1078, 0x5d8a, 0x0078, 0x9605, 0x6007, 0x003b, 0x602b,
++      0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x0078,
++      0x9605, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0078,
++      0x9579, 0x0e7e, 0x027e, 0x1078, 0x4967, 0x0040, 0x965e, 0x1078,
++      0x4957, 0x1078, 0xa4a9, 0x00c0, 0x965c, 0x2071, 0xa600, 0x70cc,
++      0xc085, 0x70ce, 0x0f7e, 0x2079, 0x0100, 0x7298, 0xa284, 0x00ff,
++      0x706e, 0x78e6, 0xa284, 0xff00, 0x7270, 0xa205, 0x7072, 0x78ea,
++      0x0f7f, 0x70d7, 0x0000, 0x2001, 0xa653, 0x2004, 0xd0a4, 0x0040,
++      0x9655, 0x2011, 0xa8ca, 0x2013, 0x07d0, 0xd0ac, 0x00c0, 0x965e,
++      0x1078, 0x2677, 0x0078, 0x965e, 0x1078, 0xa4d9, 0x027f, 0x0e7f,
++      0x1078, 0x772d, 0x0078, 0x9497, 0x1078, 0x772d, 0x007c, 0x0d7e,
++      0x067e, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686,
++      0x0006, 0x0040, 0x9684, 0xa686, 0x0004, 0x0040, 0x9684, 0x6e04,
++      0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0040, 0x9684, 0xa686, 0x0004,
++      0x0040, 0x9684, 0xa085, 0x0001, 0x067f, 0x0d7f, 0x007c, 0x0d7e,
++      0x1078, 0x96bb, 0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x96ca, 0x00c0,
++      0x96b4, 0x680c, 0xa08c, 0xff00, 0x6820, 0xa084, 0x00ff, 0xa115,
++      0x6212, 0x6824, 0x602a, 0xd1e4, 0x0040, 0x96a2, 0x2009, 0x0001,
++      0x0078, 0x96b0, 0xd1ec, 0x0040, 0x96b4, 0x6920, 0xa18c, 0x00ff,
++      0x6824, 0x1078, 0x254d, 0x00c0, 0x96b4, 0x2110, 0x2009, 0x0000,
++      0x1078, 0x28c8, 0x0078, 0x96b8, 0xa085, 0x0001, 0x0078, 0x96b9,
++      0xa006, 0x0d7f, 0x007c, 0x2069, 0xab8d, 0x6800, 0xa082, 0x0010,
++      0x00c8, 0x96c8, 0x6013, 0x0000, 0xa085, 0x0001, 0x0078, 0x96c9,
++      0xa006, 0x007c, 0x6013, 0x0000, 0x2069, 0xab8c, 0x6808, 0xa084,
++      0xff00, 0xa086, 0x0800, 0x00c0, 0x96de, 0x6800, 0xa084, 0x00ff,
++      0xa08e, 0x0014, 0x0040, 0x96de, 0xa08e, 0x0010, 0x007c, 0x6004,
++      0xa0b2, 0x0044, 0x10c8, 0x1332, 0xa1b6, 0x0013, 0x00c0, 0x96eb,
++      0x2008, 0x0079, 0x96fe, 0xa1b6, 0x0027, 0x0040, 0x96f3, 0xa1b6,
++      0x0014, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078,
++      0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, 0x973e, 0x9740,
++      0x973e, 0x973e, 0x973e, 0x9740, 0x974c, 0x97d6, 0x9799, 0x97d6,
++      0x97ad, 0x97d6, 0x974c, 0x97d6, 0x97ce, 0x97d6, 0x97ce, 0x97d6,
++      0x97d6, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e, 0x973e,
++      0x973e, 0x973e, 0x973e, 0x973e, 0x9740, 0x973e, 0x97d6, 0x973e,
++      0x973e, 0x97d6, 0x973e, 0x97d6, 0x97d6, 0x973e, 0x973e, 0x973e,
++      0x973e, 0x97d6, 0x97d6, 0x973e, 0x97d6, 0x97d6, 0x973e, 0x973e,
++      0x973e, 0x973e, 0x973e, 0x9740, 0x97d6, 0x97d6, 0x973e, 0x973e,
++      0x97d6, 0x97d6, 0x973e, 0x973e, 0x973e, 0x973e, 0x1078, 0x1332,
++      0x1078, 0x61cd, 0x2001, 0xa8a2, 0x2004, 0x6016, 0x6003, 0x0002,
++      0x1078, 0x62d1, 0x0078, 0x97dc, 0x0f7e, 0x2079, 0xa652, 0x7804,
++      0x0f7f, 0xd0ac, 0x00c0, 0x97d6, 0x2001, 0x0000, 0x1078, 0x44ee,
++      0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x0040, 0x97d6,
++      0x0c7e, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x00c0, 0x9770, 0x6010,
++      0xa005, 0x0040, 0x9770, 0x0c7f, 0x1078, 0x3699, 0x0078, 0x97d6,
++      0x0c7f, 0x2001, 0xa600, 0x2004, 0xa086, 0x0002, 0x00c0, 0x977f,
++      0x0f7e, 0x2079, 0xa600, 0x7890, 0x8000, 0x7892, 0x0f7f, 0x2001,
++      0x0002, 0x1078, 0x4502, 0x1078, 0x61cd, 0x601f, 0x0001, 0x6003,
++      0x0001, 0x6007, 0x0002, 0x1078, 0x5dd7, 0x1078, 0x62d1, 0x0c7e,
++      0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x5a52, 0x0c7f, 0x0078,
++      0x97dc, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00,
++      0x8637, 0xa686, 0x0006, 0x0040, 0x97d6, 0xa686, 0x0004, 0x0040,
++      0x97d6, 0x2001, 0x0004, 0x0078, 0x97d4, 0x2001, 0xa600, 0x2004,
++      0xa086, 0x0003, 0x00c0, 0x97b6, 0x1078, 0x3699, 0x2001, 0x0006,
++      0x1078, 0x97dd, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4,
++      0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x97d6, 0x2001, 0x0006,
++      0x0078, 0x97d4, 0x2001, 0x0004, 0x0078, 0x97d4, 0x2001, 0x0006,
++      0x1078, 0x97dd, 0x0078, 0x97d6, 0x1078, 0x4535, 0x1078, 0x61cd,
++      0x1078, 0x772d, 0x1078, 0x62d1, 0x007c, 0x017e, 0x0d7e, 0x6118,
++      0x2168, 0x6900, 0xd184, 0x0040, 0x97f8, 0x6104, 0xa18e, 0x000a,
++      0x00c0, 0x97f0, 0x699c, 0xd1a4, 0x00c0, 0x97f0, 0x2001, 0x0007,
++      0x1078, 0x4502, 0x2001, 0x0000, 0x1078, 0x44ee, 0x1078, 0x28a6,
++      0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084,
++      0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1332, 0xa1b6,
++      0x0015, 0x00c0, 0x980f, 0x1079, 0x9816, 0x0078, 0x9815, 0xa1b6,
++      0x0016, 0x10c0, 0x1332, 0x1079, 0x9822, 0x007c, 0x7d4e, 0x7d4e,
++      0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x9877, 0x982e, 0x7d4e, 0x7d4e,
++      0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e,
++      0x9877, 0x987f, 0x7d4e, 0x7d4e, 0x7d4e, 0x7d4e, 0x0f7e, 0x2079,
++      0xa652, 0x7804, 0xd0ac, 0x00c0, 0x9855, 0x6018, 0xa07d, 0x0040,
++      0x9855, 0x7800, 0xd0f4, 0x00c0, 0x9841, 0x7810, 0xa005, 0x00c0,
++      0x9855, 0x2001, 0x0000, 0x1078, 0x44ee, 0x2001, 0x0002, 0x1078,
++      0x4502, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078,
++      0x5dd7, 0x1078, 0x62d1, 0x0078, 0x9875, 0x2011, 0xab83, 0x2204,
++      0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9875, 0x0c7e, 0x1078,
++      0x45c4, 0x0040, 0x9868, 0x0c7f, 0x1078, 0x772d, 0x0078, 0x9875,
++      0x6010, 0x007e, 0x6014, 0x007e, 0x1078, 0x42f8, 0x007f, 0x6016,
++      0x007f, 0x6012, 0x0c7f, 0x1078, 0x772d, 0x0f7f, 0x007c, 0x6604,
++      0xa6b6, 0x001e, 0x00c0, 0x987e, 0x1078, 0x772d, 0x007c, 0x1078,
++      0x7f8e, 0x00c0, 0x988b, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078,
++      0x5dd7, 0x0078, 0x988d, 0x1078, 0x772d, 0x007c, 0x6004, 0xa08a,
++      0x0044, 0x10c8, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078,
++      0x62d1, 0x007c, 0xa182, 0x0040, 0x0079, 0x989e, 0x98b1, 0x98b1,
++      0x98b1, 0x98b1, 0x98b3, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1,
++      0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1, 0x98b1,
++      0x98b1, 0x1078, 0x1332, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e,
++      0x027e, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005, 0x0040, 0x98c4,
++      0x2021, 0x0000, 0x1078, 0xa472, 0x6106, 0x2071, 0xab80, 0x7444,
++      0xa4a4, 0xff00, 0x0040, 0x991b, 0xa486, 0x2000, 0x00c0, 0x98d6,
++      0x2009, 0x0001, 0x2011, 0x0200, 0x1078, 0x5bf1, 0x1078, 0x138b,
++      0x1040, 0x1332, 0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803,
++      0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2,
++      0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, 0x017e, 0xa084,
++      0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036, 0x1078, 0x4a73,
++      0x017f, 0xa486, 0x2000, 0x00c0, 0x9903, 0x2019, 0x0017, 0x1078,
++      0xa195, 0x0078, 0x997d, 0xa486, 0x0400, 0x00c0, 0x990d, 0x2019,
++      0x0002, 0x1078, 0xa146, 0x0078, 0x997d, 0xa486, 0x0200, 0x00c0,
++      0x9913, 0x1078, 0xa12b, 0xa486, 0x1000, 0x00c0, 0x9919, 0x1078,
++      0xa17a, 0x0078, 0x997d, 0x2069, 0xa933, 0x6a00, 0xd284, 0x0040,
++      0x99e7, 0xa284, 0x0300, 0x00c0, 0x99df, 0x6804, 0xa005, 0x0040,
++      0x99c5, 0x2d78, 0x6003, 0x0007, 0x1078, 0x1370, 0x0040, 0x9984,
++      0x7800, 0xd08c, 0x00c0, 0x9937, 0x7804, 0x8001, 0x7806, 0x6013,
++      0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x6008,
++      0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130,
++      0x6986, 0x6846, 0x7928, 0x698a, 0x792c, 0x698e, 0x7930, 0x6992,
++      0x7934, 0x6996, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003, 0xa286,
++      0x0002, 0x00c0, 0x995f, 0x684f, 0x0040, 0x0078, 0x9969, 0xa286,
++      0x0001, 0x00c0, 0x9967, 0x684f, 0x0080, 0x0078, 0x9969, 0x684f,
++      0x0000, 0x20a9, 0x000a, 0x2001, 0xab90, 0xad90, 0x0015, 0x200c,
++      0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x996f, 0x200c, 0x6982,
++      0x8000, 0x200c, 0x697e, 0x1078, 0x4a73, 0x027f, 0x047f, 0x157f,
++      0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x2001, 0xa60e, 0x2004, 0xd084,
++      0x0040, 0x998e, 0x1078, 0x138b, 0x00c0, 0x9930, 0x6013, 0x0100,
++      0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++      0x0078, 0x997d, 0x2069, 0xab92, 0x2d04, 0xa084, 0xff00, 0xa086,
++      0x1200, 0x00c0, 0x99b9, 0x2069, 0xab80, 0x686c, 0xa084, 0x00ff,
++      0x017e, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003,
++      0x0001, 0x6007, 0x0043, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078,
++      0x997d, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078,
++      0x5d8a, 0x1078, 0x62d1, 0x0078, 0x997d, 0x2001, 0xa60d, 0x2004,
++      0xd0ec, 0x0040, 0x99cf, 0x2011, 0x8049, 0x1078, 0x361b, 0x6013,
++      0x0300, 0x0078, 0x99d5, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007,
++      0x0041, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x997d, 0x6013,
++      0x0500, 0x0078, 0x99d5, 0x6013, 0x0600, 0x0078, 0x999a, 0x6013,
++      0x0200, 0x0078, 0x999a, 0xa186, 0x0013, 0x00c0, 0x99fd, 0x6004,
++      0xa08a, 0x0040, 0x1048, 0x1332, 0xa08a, 0x0053, 0x10c8, 0x1332,
++      0xa082, 0x0040, 0x2008, 0x0079, 0x9a82, 0xa186, 0x0051, 0x0040,
++      0x9a0a, 0xa186, 0x0047, 0x00c0, 0x9a23, 0x6004, 0xa086, 0x0041,
++      0x0040, 0x9a31, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040, 0x9a31,
++      0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078, 0x5c56,
++      0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002, 0x00c0,
++      0x9a31, 0x0078, 0x9ac7, 0xa186, 0x0027, 0x0040, 0x9a2b, 0xa186,
++      0x0014, 0x10c0, 0x1332, 0x6004, 0xa082, 0x0040, 0x2008, 0x0079,
++      0x9a34, 0x1078, 0x7773, 0x007c, 0x9a47, 0x9a49, 0x9a49, 0x9a71,
++      0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47,
++      0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x9a47, 0x1078,
++      0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x037e, 0x0d7e, 0x6010,
++      0xa06d, 0x0040, 0x9a6e, 0xad84, 0xf000, 0x0040, 0x9a6e, 0x6003,
++      0x0002, 0x6018, 0x2004, 0xd0bc, 0x00c0, 0x9a6e, 0x2019, 0x0004,
++      0x1078, 0xa1ca, 0x6013, 0x0000, 0x6014, 0xa005, 0x00c0, 0x9a6c,
++      0x2001, 0xa8a3, 0x2004, 0x6016, 0x6003, 0x0007, 0x0d7f, 0x037f,
++      0x007c, 0x0d7e, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x1078, 0x8d06,
++      0x0040, 0x9a7e, 0x6010, 0x2068, 0x1078, 0x13a4, 0x1078, 0x8ec6,
++      0x0d7f, 0x007c, 0x9a95, 0x9ab4, 0x9a9e, 0x9ac1, 0x9a95, 0x9a95,
++      0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95,
++      0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x1078, 0x1332, 0x6010,
++      0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x61cd,
++      0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0040, 0x9aaf, 0x6003,
++      0x0007, 0x2009, 0x0043, 0x1078, 0x775c, 0x0078, 0x9ab1, 0x6003,
++      0x0002, 0x1078, 0x62d1, 0x007c, 0x1078, 0x61cd, 0x1078, 0xa423,
++      0x00c0, 0x9abe, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x1078, 0x62d1,
++      0x007c, 0x1078, 0x61cd, 0x2009, 0x0041, 0x0078, 0x9c1e, 0xa182,
++      0x0040, 0x0079, 0x9acb, 0x9ade, 0x9ae0, 0x9ade, 0x9ade, 0x9ade,
++      0x9ade, 0x9ade, 0x9ae1, 0x9ade, 0x9ade, 0x9ade, 0x9ade, 0x9ade,
++      0x9ade, 0x9ade, 0x9ade, 0x9ade, 0x9aec, 0x9ade, 0x1078, 0x1332,
++      0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++      0x2c10, 0x1078, 0x15fa, 0x007c, 0x0d7e, 0x1078, 0x5bc1, 0x0d7f,
++      0x1078, 0xa495, 0x1078, 0x772d, 0x007c, 0xa182, 0x0040, 0x0079,
++      0x9af9, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c,
++      0x9b0e, 0x9b0c, 0x9b11, 0x9b3c, 0x9b0c, 0x9b0c, 0x9b0c, 0x9b0c,
++      0x9b3c, 0x9b0c, 0x9b0c, 0x9b0c, 0x1078, 0x1332, 0x1078, 0x7773,
++      0x007c, 0x1078, 0x627a, 0x1078, 0x639b, 0x6010, 0x0d7e, 0x2068,
++      0x684c, 0xd0fc, 0x0040, 0x9b27, 0xa08c, 0x0003, 0xa18e, 0x0002,
++      0x0040, 0x9b2f, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c1e, 0x6003,
++      0x0007, 0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x1078,
++      0xa423, 0x0040, 0x9b35, 0x0d7f, 0x007c, 0x1078, 0x5bc1, 0x1078,
++      0x772d, 0x0d7f, 0x0078, 0x9b2e, 0x037e, 0x1078, 0x627a, 0x1078,
++      0x639b, 0x6010, 0x0d7e, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0040,
++      0x9b5c, 0x684c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x9b58,
++      0x687c, 0x632c, 0xa31a, 0x632e, 0x6880, 0x6328, 0xa31b, 0x632a,
++      0x6003, 0x0002, 0x0078, 0x9b6d, 0x2019, 0x0004, 0x1078, 0xa1ca,
++      0x6014, 0xa005, 0x00c0, 0x9b69, 0x2001, 0xa8a3, 0x2004, 0x8003,
++      0x6016, 0x6013, 0x0000, 0x6003, 0x0007, 0x0d7f, 0x037f, 0x007c,
++      0xa186, 0x0013, 0x00c0, 0x9b7e, 0x6004, 0xa086, 0x0042, 0x10c0,
++      0x1332, 0x1078, 0x61cd, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0027,
++      0x0040, 0x9b86, 0xa186, 0x0014, 0x00c0, 0x9b96, 0x6004, 0xa086,
++      0x0042, 0x10c0, 0x1332, 0x2001, 0x0007, 0x1078, 0x4535, 0x1078,
++      0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c, 0xa182, 0x0040,
++      0x0079, 0x9b9a, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad,
++      0x9bad, 0x9baf, 0x9bbb, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad,
++      0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x9bad, 0x1078, 0x1332, 0x037e,
++      0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15fa,
++      0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, 0x2068, 0x6810, 0x6a14,
++      0x6118, 0x210c, 0xd1bc, 0x0040, 0x9bda, 0x6124, 0xd1f4, 0x00c0,
++      0x9bda, 0x007e, 0x047e, 0x057e, 0x6c7c, 0xa422, 0x6d80, 0x2200,
++      0xa52b, 0x602c, 0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x057f,
++      0x047f, 0x007f, 0xa20d, 0x00c0, 0x9bee, 0x684c, 0xd0fc, 0x0040,
++      0x9be6, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x9c1e, 0x6003, 0x0007,
++      0x6017, 0x0000, 0x1078, 0x5bc1, 0x0d7f, 0x007c, 0x007e, 0x0f7e,
++      0x2c78, 0x1078, 0x4963, 0x0f7f, 0x007f, 0x0040, 0x9bfb, 0x6003,
++      0x0002, 0x0d7f, 0x007c, 0x2009, 0xa60d, 0x210c, 0xd19c, 0x0040,
++      0x9c05, 0x6003, 0x0007, 0x0078, 0x9c07, 0x6003, 0x0006, 0x1078,
++      0x9c0d, 0x1078, 0x5bc3, 0x0d7f, 0x007c, 0xd2fc, 0x0040, 0x9c19,
++      0x8002, 0x8000, 0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0078,
++      0x9c1b, 0x2009, 0x0015, 0x6a6a, 0x6866, 0x007c, 0xa182, 0x0040,
++      0x0048, 0x9c24, 0x0079, 0x9c31, 0xa186, 0x0013, 0x0040, 0x9c2c,
++      0xa186, 0x0014, 0x10c0, 0x1332, 0x6024, 0xd0dc, 0x1040, 0x1332,
++      0x007c, 0x9c44, 0x9c4b, 0x9c57, 0x9c63, 0x9c44, 0x9c44, 0x9c44,
++      0x9c72, 0x9c44, 0x9c46, 0x9c46, 0x9c44, 0x9c44, 0x9c44, 0x9c44,
++      0x9c44, 0x9c44, 0x9c44, 0x9c44, 0x1078, 0x1332, 0x6024, 0xd0dc,
++      0x1040, 0x1332, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a,
++      0x127e, 0x2091, 0x8000, 0x1078, 0x62d1, 0x127f, 0x007c, 0x6003,
++      0x0001, 0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078,
++      0x62d1, 0x127f, 0x007c, 0x6003, 0x0003, 0x6106, 0x2c10, 0x1078,
++      0x1cf0, 0x127e, 0x2091, 0x8000, 0x1078, 0x5df6, 0x1078, 0x639b,
++      0x127f, 0x007c, 0xa016, 0x1078, 0x15fa, 0x007c, 0x127e, 0x2091,
++      0x8000, 0x037e, 0x0d7e, 0xa182, 0x0040, 0x1079, 0x9c83, 0x0d7f,
++      0x037f, 0x127f, 0x007c, 0x9c93, 0x9c95, 0x9caa, 0x9cc9, 0x9c93,
++      0x9c93, 0x9c93, 0x9ce1, 0x9c93, 0x9c93, 0x9c93, 0x9c93, 0x9c93,
++      0x9c93, 0x9c93, 0x9c93, 0x1078, 0x1332, 0x6010, 0x2068, 0x684c,
++      0xd0fc, 0x0040, 0x9cbf, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040,
++      0x9cbf, 0x6003, 0x0001, 0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++      0x0078, 0x9ce4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9cbf,
++      0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, 0x9cbf, 0x6003, 0x0001,
++      0x6106, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0078, 0x9ce4, 0x6013,
++      0x0000, 0x6017, 0x0000, 0x2019, 0x0004, 0x1078, 0xa1ca, 0x0078,
++      0x9ce4, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9cbf, 0xa09c,
++      0x0003, 0xa39e, 0x0003, 0x0040, 0x9cbf, 0x6003, 0x0003, 0x6106,
++      0x2c10, 0x1078, 0x1cf0, 0x1078, 0x5df6, 0x1078, 0x639b, 0x0078,
++      0x9ce4, 0xa016, 0x1078, 0x15fa, 0x007c, 0x1078, 0x61cd, 0x6110,
++      0x81ff, 0x0040, 0x9cf6, 0x0d7e, 0x2168, 0x1078, 0xa4e2, 0x037e,
++      0x2019, 0x0029, 0x1078, 0xa1ca, 0x037f, 0x0d7f, 0x1078, 0x8ec6,
++      0x1078, 0x62d1, 0x007c, 0x1078, 0x627a, 0x6110, 0x81ff, 0x0040,
++      0x9d0c, 0x0d7e, 0x2168, 0x1078, 0xa4e2, 0x037e, 0x2019, 0x0029,
++      0x1078, 0xa1ca, 0x037f, 0x0d7f, 0x1078, 0x8ec6, 0x1078, 0x639b,
++      0x007c, 0xa182, 0x0085, 0x0079, 0x9d15, 0x9d1e, 0x9d1c, 0x9d1c,
++      0x9d2a, 0x9d1c, 0x9d1c, 0x9d1c, 0x1078, 0x1332, 0x6003, 0x000b,
++      0x6106, 0x1078, 0x5d8a, 0x127e, 0x2091, 0x8000, 0x1078, 0x62d1,
++      0x127f, 0x007c, 0x027e, 0x0e7e, 0x1078, 0xa41c, 0x0040, 0x9d34,
++      0x1078, 0x772d, 0x0078, 0x9d50, 0x2071, 0xab80, 0x7224, 0x6212,
++      0x7220, 0x1078, 0xa069, 0x0040, 0x9d41, 0x6007, 0x0086, 0x0078,
++      0x9d4a, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x00c0, 0x9d4a,
++      0x6007, 0x0086, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1,
++      0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x9d64, 0x6004,
++      0xa08a, 0x0085, 0x1048, 0x1332, 0xa08a, 0x008c, 0x10c8, 0x1332,
++      0xa082, 0x0085, 0x0079, 0x9d7b, 0xa186, 0x0027, 0x0040, 0x9d70,
++      0xa186, 0x0014, 0x0040, 0x9d70, 0x1078, 0x7773, 0x0078, 0x9d7a,
++      0x2001, 0x0007, 0x1078, 0x4535, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++      0x1078, 0x62d1, 0x007c, 0x9d82, 0x9d84, 0x9d84, 0x9d82, 0x9d82,
++      0x9d82, 0x9d82, 0x1078, 0x1332, 0x1078, 0x61cd, 0x1078, 0x8ec6,
++      0x1078, 0x62d1, 0x007c, 0xa182, 0x0085, 0x1048, 0x1332, 0xa182,
++      0x008c, 0x10c8, 0x1332, 0xa182, 0x0085, 0x0079, 0x9d97, 0x9d9e,
++      0x9d9e, 0x9d9e, 0x9da0, 0x9d9e, 0x9d9e, 0x9d9e, 0x1078, 0x1332,
++      0x007c, 0xa186, 0x0013, 0x0040, 0x9db1, 0xa186, 0x0014, 0x0040,
++      0x9db1, 0xa186, 0x0027, 0x0040, 0x9db1, 0x1078, 0x7773, 0x0078,
++      0x9db7, 0x1078, 0x61cd, 0x1078, 0x8ec6, 0x1078, 0x62d1, 0x007c,
++      0x037e, 0x1078, 0xa495, 0x603f, 0x0000, 0x2019, 0x000b, 0x1078,
++      0x9dc7, 0x601f, 0x0006, 0x6003, 0x0007, 0x037f, 0x007c, 0x127e,
++      0x037e, 0x2091, 0x8000, 0x087e, 0x2c40, 0x097e, 0x2049, 0x0000,
++      0x1078, 0x7246, 0x097f, 0x087f, 0x00c0, 0x9e02, 0x077e, 0x2c38,
++      0x1078, 0x72f3, 0x077f, 0x00c0, 0x9e02, 0x6000, 0xa086, 0x0000,
++      0x0040, 0x9e02, 0x601c, 0xa086, 0x0007, 0x0040, 0x9e02, 0x0d7e,
++      0x6000, 0xa086, 0x0004, 0x00c0, 0x9df3, 0x1078, 0xa495, 0x601f,
++      0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++      0x9dfb, 0x1078, 0xa1ca, 0x0d7f, 0x6013, 0x0000, 0x1078, 0xa495,
++      0x601f, 0x0007, 0x037f, 0x127f, 0x007c, 0x0f7e, 0x0c7e, 0x037e,
++      0x157e, 0x2079, 0xab80, 0x7938, 0x783c, 0x1078, 0x254d, 0x00c0,
++      0x9e49, 0x017e, 0x0c7e, 0x1078, 0x45c4, 0x00c0, 0x9e49, 0x017f,
++      0x027f, 0x027e, 0x017e, 0x2019, 0x0029, 0x1078, 0x73d0, 0x1078,
++      0x5f01, 0x077e, 0x2039, 0x0000, 0x1078, 0x5e0a, 0x077f, 0x017f,
++      0x077e, 0x2039, 0x0000, 0x1078, 0x9f8b, 0x077f, 0x1078, 0x47e9,
++      0x027e, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040,
++      0x9e3d, 0xa286, 0x0004, 0x00c0, 0x9e40, 0x62a0, 0x1078, 0x2942,
++      0x027f, 0x017f, 0x1078, 0x42f8, 0x6612, 0x6516, 0xa006, 0x0078,
++      0x9e4b, 0x0c7f, 0x017f, 0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c,
++      0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x2009, 0xa620, 0x2104, 0xa086,
++      0x0074, 0x00c0, 0x9eb3, 0x2069, 0xab8e, 0x690c, 0xa182, 0x0100,
++      0x0048, 0x9ea3, 0x6908, 0xa184, 0x8000, 0x0040, 0x9eaf, 0x6018,
++      0x2070, 0x7010, 0xa084, 0x00ff, 0x0040, 0x9e72, 0x7000, 0xd0f4,
++      0x0040, 0x9e76, 0xa184, 0x0800, 0x0040, 0x9eaf, 0x6910, 0xa18a,
++      0x0001, 0x0048, 0x9ea7, 0x6914, 0x2069, 0xabae, 0x6904, 0x81ff,
++      0x00c0, 0x9e9b, 0x690c, 0xa182, 0x0100, 0x0048, 0x9ea3, 0x6908,
++      0x81ff, 0x00c0, 0x9e9f, 0x6910, 0xa18a, 0x0001, 0x0048, 0x9ea7,
++      0x6918, 0xa18a, 0x0001, 0x0048, 0x9eaf, 0x0078, 0x9eb9, 0x6013,
++      0x0100, 0x0078, 0x9eb5, 0x6013, 0x0300, 0x0078, 0x9eb5, 0x6013,
++      0x0500, 0x0078, 0x9eb5, 0x6013, 0x0700, 0x0078, 0x9eb5, 0x6013,
++      0x0900, 0x0078, 0x9eb5, 0x6013, 0x0b00, 0x0078, 0x9eb5, 0x6013,
++      0x0f00, 0x0078, 0x9eb5, 0x6013, 0x2d00, 0xa085, 0x0001, 0x0078,
++      0x9eba, 0xa006, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e,
++      0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394,
++      0x00ff, 0xa286, 0x0006, 0x0040, 0x9ee3, 0xa286, 0x0004, 0x0040,
++      0x9ee3, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x9ee3,
++      0xa286, 0x0004, 0x0040, 0x9ee3, 0x0c7e, 0x2d60, 0x1078, 0x45d6,
++      0x0c7f, 0x0078, 0x9f1e, 0x2011, 0xab96, 0xad98, 0x000a, 0x20a9,
++      0x0004, 0x1078, 0x80de, 0x00c0, 0x9f1f, 0x2011, 0xab9a, 0xad98,
++      0x0006, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f1f, 0x047e,
++      0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xa653,
++      0x210c, 0xd1a4, 0x0040, 0x9f0b, 0x2009, 0x0029, 0x1078, 0xa21d,
++      0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x5f01, 0x077e,
++      0x2039, 0x0000, 0x1078, 0x5e0a, 0x2c08, 0x1078, 0x9f8b, 0x077f,
++      0x2001, 0x0007, 0x1078, 0x4535, 0x017f, 0x047f, 0xa006, 0x157f,
++      0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0xab8e,
++      0x6800, 0xa086, 0x0800, 0x0040, 0x9f31, 0x6013, 0x0000, 0x0078,
++      0x9f32, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e,
++      0x037e, 0x157e, 0x2079, 0xab8c, 0x7930, 0x7834, 0x1078, 0x254d,
++      0x00c0, 0x9f58, 0x1078, 0x45c4, 0x00c0, 0x9f58, 0x2011, 0xab90,
++      0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de, 0x00c0, 0x9f58,
++      0x2011, 0xab94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x80de,
++      0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e,
++      0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0xab83, 0x2204,
++      0x8211, 0x220c, 0x1078, 0x254d, 0x00c0, 0x9f84, 0x1078, 0x45c4,
++      0x00c0, 0x9f84, 0x2011, 0xab96, 0xac98, 0x000a, 0x20a9, 0x0004,
++      0x1078, 0x80de, 0x00c0, 0x9f84, 0x2011, 0xab9a, 0xac98, 0x0006,
++      0x20a9, 0x0004, 0x1078, 0x80de, 0x157f, 0x037f, 0x027f, 0x017f,
++      0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x087e, 0x077e, 0x067e,
++      0x057e, 0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740, 0x2029,
++      0xa8ba, 0x252c, 0x2021, 0xa8c0, 0x2424, 0x2061, 0xad00, 0x2071,
++      0xa600, 0x7648, 0x7064, 0x81ff, 0x0040, 0x9fb2, 0x007e, 0xa186,
++      0xa9b3, 0x007f, 0x0040, 0x9fb2, 0x8001, 0xa602, 0x00c8, 0xa01c,
++      0x0078, 0x9fb5, 0xa606, 0x0040, 0xa01c, 0x2100, 0xac06, 0x0040,
++      0xa012, 0x1078, 0xa242, 0x0040, 0xa012, 0x671c, 0xa786, 0x0001,
++      0x0040, 0xa037, 0xa786, 0x0004, 0x0040, 0xa037, 0xa786, 0x0007,
++      0x0040, 0xa012, 0x2500, 0xac06, 0x0040, 0xa012, 0x2400, 0xac06,
++      0x0040, 0xa012, 0x1078, 0xa256, 0x00c0, 0xa012, 0x88ff, 0x0040,
++      0x9fdd, 0x6020, 0xa906, 0x00c0, 0xa012, 0x0d7e, 0x6000, 0xa086,
++      0x0004, 0x00c0, 0x9fe7, 0x017e, 0x1078, 0x1757, 0x017f, 0xa786,
++      0x0008, 0x00c0, 0x9ff6, 0x1078, 0x8f00, 0x00c0, 0x9ff6, 0x1078,
++      0x7c83, 0x0d7f, 0x1078, 0x8ec6, 0x0078, 0xa012, 0x6010, 0x2068,
++      0x1078, 0x8d06, 0x0040, 0xa00f, 0xa786, 0x0003, 0x00c0, 0xa026,
++      0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0xa4e2, 0x017e,
++      0x1078, 0x8f7d, 0x1078, 0x4a73, 0x017f, 0x1078, 0x8eb9, 0x0d7f,
++      0x1078, 0x8ec6, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02,
++      0x00c8, 0xa01c, 0x0078, 0x9f9f, 0x127f, 0x027f, 0x047f, 0x057f,
++      0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x007c, 0xa786, 0x0006,
++      0x00c0, 0xa000, 0xa386, 0x0005, 0x0040, 0xa034, 0x1078, 0xa4e2,
++      0x1078, 0xa1ca, 0x0078, 0xa00f, 0x0d7f, 0x0078, 0xa012, 0x1078,
++      0xa256, 0x00c0, 0xa012, 0x81ff, 0x0040, 0xa012, 0xa180, 0x0001,
++      0x2004, 0xa086, 0x0018, 0x0040, 0xa04c, 0xa180, 0x0001, 0x2004,
++      0xa086, 0x002d, 0x00c0, 0xa012, 0x6000, 0xa086, 0x0002, 0x00c0,
++      0xa012, 0x1078, 0x8eec, 0x0040, 0xa05d, 0x1078, 0x8f00, 0x00c0,
++      0xa012, 0x1078, 0x7c83, 0x0078, 0xa065, 0x1078, 0x28a6, 0x1078,
++      0x8f00, 0x00c0, 0xa065, 0x1078, 0x7c83, 0x1078, 0x8ec6, 0x0078,
++      0xa012, 0x0c7e, 0x0e7e, 0x017e, 0x2c08, 0x2170, 0xa006, 0x1078,
++      0xa1e6, 0x017f, 0x0040, 0xa079, 0x601c, 0xa084, 0x000f, 0x1079,
++      0xa07c, 0x0e7f, 0x0c7f, 0x007c, 0xa084, 0xa084, 0xa084, 0xa084,
++      0xa084, 0xa084, 0xa086, 0xa084, 0xa006, 0x007c, 0x047e, 0x017e,
++      0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00,
++      0x2009, 0x0020, 0x1078, 0xa21d, 0x017f, 0x047f, 0x037e, 0x2019,
++      0x0002, 0x1078, 0x9dc7, 0x037f, 0xa085, 0x0001, 0x007c, 0x2001,
++      0x0001, 0x1078, 0x44ee, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9,
++      0x0004, 0x2019, 0xa605, 0x2011, 0xab96, 0x1078, 0x80de, 0x037f,
++      0x027f, 0x017f, 0x157f, 0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e,
++      0x087e, 0x077e, 0x067e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740,
++      0x2061, 0xad00, 0x2079, 0x0001, 0x8fff, 0x0040, 0xa11d, 0x2071,
++      0xa600, 0x7648, 0x7064, 0x8001, 0xa602, 0x00c8, 0xa11d, 0x88ff,
++      0x0040, 0xa0d8, 0x2800, 0xac06, 0x00c0, 0xa113, 0x2079, 0x0000,
++      0x1078, 0xa242, 0x0040, 0xa113, 0x2400, 0xac06, 0x0040, 0xa113,
++      0x671c, 0xa786, 0x0006, 0x00c0, 0xa113, 0xa786, 0x0007, 0x0040,
++      0xa113, 0x88ff, 0x00c0, 0xa0f7, 0x6018, 0xa206, 0x00c0, 0xa113,
++      0x85ff, 0x0040, 0xa0f7, 0x6020, 0xa106, 0x00c0, 0xa113, 0x0d7e,
++      0x6000, 0xa086, 0x0004, 0x00c0, 0xa103, 0x1078, 0xa495, 0x601f,
++      0x0007, 0x1078, 0x1757, 0x6010, 0x2068, 0x1078, 0x8d06, 0x0040,
++      0xa10d, 0x047e, 0x1078, 0xa1ca, 0x047f, 0x0d7f, 0x1078, 0x8ec6,
++      0x88ff, 0x00c0, 0xa127, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004,
++      0xac02, 0x00c8, 0xa11d, 0x0078, 0xa0c4, 0xa006, 0x127f, 0x027f,
++      0x067f, 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5,
++      0x0001, 0x0078, 0xa11e, 0x077e, 0x057e, 0x087e, 0x2041, 0x0000,
++      0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x097e, 0x2049,
++      0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078,
++      0x72f3, 0x1078, 0xa0b5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e,
++      0x057e, 0x077e, 0x0c7e, 0x157e, 0x2c20, 0x2128, 0x20a9, 0x007f,
++      0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa16e,
++      0x2c10, 0x057e, 0x087e, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001,
++      0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f, 0x2039,
++      0x0000, 0x1078, 0x72f3, 0x1078, 0xa0b5, 0x057f, 0x037f, 0x017f,
++      0x8108, 0x00f0, 0xa152, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f,
++      0x027f, 0x007c, 0x077e, 0x057e, 0x6218, 0x087e, 0x2041, 0x0000,
++      0x2029, 0x0001, 0x2019, 0x0048, 0x097e, 0x2049, 0x0000, 0x1078,
++      0x7246, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, 0x72f3, 0x2c20,
++      0x1078, 0xa0b5, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, 0x057e,
++      0x077e, 0x0c7e, 0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000,
++      0x017e, 0x037e, 0x1078, 0x45c4, 0x00c0, 0xa1be, 0x2c10, 0x087e,
++      0x2041, 0x0000, 0x2828, 0x047e, 0x2021, 0x0001, 0x1078, 0xa472,
++      0x047f, 0x097e, 0x2049, 0x0000, 0x1078, 0x7246, 0x097f, 0x087f,
++      0x2039, 0x0000, 0x1078, 0x72f3, 0x1078, 0xa0b5, 0x037f, 0x017f,
++      0x8108, 0x00f0, 0xa1a0, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f,
++      0x027f, 0x007c, 0x017e, 0x0f7e, 0xad82, 0xcd00, 0x0048, 0xa1e3,
++      0xad82, 0xffff, 0x00c8, 0xa1e3, 0x6800, 0xa07d, 0x0040, 0xa1e0,
++      0x6803, 0x0000, 0x6b52, 0x1078, 0x4a73, 0x2f68, 0x0078, 0xa1d4,
++      0x6b52, 0x1078, 0x4a73, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e,
++      0x037e, 0x2061, 0xad00, 0xa005, 0x00c0, 0xa1f6, 0x2071, 0xa600,
++      0x7448, 0x7064, 0x8001, 0xa402, 0x00c8, 0xa218, 0x2100, 0xac06,
++      0x0040, 0xa20a, 0x6000, 0xa086, 0x0000, 0x0040, 0xa20a, 0x6008,
++      0xa206, 0x00c0, 0xa20a, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406,
++      0x0040, 0xa214, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004, 0xac02,
++      0x00c8, 0xa218, 0x0078, 0xa1f6, 0xa085, 0x0001, 0x0078, 0xa219,
++      0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, 0x0d7e, 0x007e, 0x1078,
++      0x138b, 0x007f, 0x1040, 0x1332, 0x6837, 0x010d, 0x685e, 0x027e,
++      0x2010, 0x1078, 0x8cf2, 0x2001, 0x0000, 0x0040, 0xa233, 0x2200,
++      0xa080, 0x0008, 0x2004, 0x027f, 0x684a, 0x6956, 0x6c46, 0x684f,
++      0x0000, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x1078, 0x4a73,
++      0x0d7f, 0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0xa255, 0xa786,
++      0x0001, 0x0040, 0xa255, 0xa786, 0x000a, 0x0040, 0xa255, 0xa786,
++      0x0009, 0x0040, 0xa255, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018,
++      0x2070, 0x70a0, 0xa206, 0x0e7f, 0x007c, 0x017e, 0x6004, 0xa08e,
++      0x001e, 0x00c0, 0xa277, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105,
++      0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0005, 0x2001,
++      0xa8a3, 0x2004, 0x6016, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x017f,
++      0x007c, 0x0005, 0x0005, 0x007c, 0x6024, 0xd0e4, 0x0040, 0xa28d,
++      0xd0cc, 0x0040, 0xa287, 0x1078, 0x8fbf, 0x0078, 0xa28d, 0x1078,
++      0xa495, 0x1078, 0x5bc1, 0x1078, 0x772d, 0x007c, 0xa280, 0x0007,
++      0x2004, 0xa084, 0x000f, 0x0079, 0xa295, 0xa29e, 0xa29e, 0xa29e,
++      0xa2a0, 0xa29e, 0xa2a0, 0xa2a0, 0xa29e, 0xa2a0, 0xa006, 0x007c,
++      0xa085, 0x0001, 0x007c, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f,
++      0x0079, 0xa2aa, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3, 0xa2b3,
++      0xa2be, 0xa2b3, 0xa2b3, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013,
++      0x2a00, 0x6003, 0x0001, 0x1078, 0x5d8a, 0x007c, 0x0c7e, 0x2260,
++      0x1078, 0xa495, 0x603f, 0x0000, 0x6024, 0xc0f4, 0xc0cc, 0x6026,
++      0x0c7f, 0x0d7e, 0x2268, 0xa186, 0x0007, 0x00c0, 0xa31f, 0x6810,
++      0xa005, 0x0040, 0xa2dc, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x00c0,
++      0xa2dc, 0x0d7f, 0x0078, 0xa2b3, 0x6007, 0x003a, 0x6003, 0x0001,
++      0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100, 0xa186,
++      0x0002, 0x00c0, 0xa3ad, 0x6010, 0xa005, 0x00c0, 0xa2f6, 0x6000,
++      0xa086, 0x0007, 0x10c0, 0x1332, 0x0078, 0xa3ad, 0xa08c, 0xf000,
++      0x00c0, 0xa302, 0x0078, 0xa302, 0x2068, 0x6800, 0xa005, 0x00c0,
++      0xa2fc, 0x2d00, 0xa080, 0x0013, 0x2004, 0xa084, 0x0003, 0xa086,
++      0x0002, 0x00c0, 0xa31b, 0x6010, 0x2068, 0x684c, 0xc0dc, 0xc0f4,
++      0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, 0x2009, 0x0043, 0x1078,
++      0x9c1e, 0x0078, 0xa3ad, 0x2009, 0x0041, 0x0078, 0xa3a7, 0xa186,
++      0x0005, 0x00c0, 0xa366, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc,
++      0x00c0, 0xa32d, 0x0d7f, 0x0078, 0xa2b3, 0xd0b4, 0x0040, 0xa335,
++      0xd0fc, 0x1040, 0x1332, 0x0078, 0xa2cf, 0x6007, 0x003a, 0x6003,
++      0x0001, 0x1078, 0x5d8a, 0x1078, 0x62d1, 0x0c7e, 0x2d60, 0x6100,
++      0xa186, 0x0002, 0x0040, 0xa348, 0xa186, 0x0004, 0x00c0, 0xa3ad,
++      0x2071, 0xa8e7, 0x7000, 0xa086, 0x0003, 0x00c0, 0xa355, 0x7004,
++      0xac06, 0x00c0, 0xa355, 0x7003, 0x0000, 0x6810, 0xa080, 0x0013,
++      0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000, 0x200c, 0xc1f4, 0xc1fc,
++      0xc1bc, 0x2102, 0x2009, 0x0042, 0x0078, 0xa3a7, 0x037e, 0x0d7e,
++      0x0d7e, 0x1078, 0x138b, 0x037f, 0x1040, 0x1332, 0x6837, 0x010d,
++      0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000, 0x6b5e, 0x6857,
++      0x0045, 0x2c00, 0x6862, 0x6034, 0x6872, 0x2360, 0x6024, 0xc0dd,
++      0x6026, 0x6018, 0xa080, 0x0028, 0x2004, 0xa084, 0x00ff, 0x8007,
++      0x6320, 0x6b4a, 0x6846, 0x684f, 0x0000, 0x6d6a, 0x6e66, 0x686f,
++      0x0001, 0x1078, 0x4a73, 0x2019, 0x0045, 0x6008, 0x2068, 0x1078,
++      0x9dc7, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017,
++      0x0000, 0x603f, 0x0000, 0x0d7f, 0x037f, 0x0078, 0xa3ae, 0x603f,
++      0x0000, 0x6003, 0x0007, 0x1078, 0x9c1e, 0x0c7f, 0x0d7f, 0x007c,
++      0xa186, 0x0013, 0x00c0, 0xa3ba, 0x6004, 0xa082, 0x0085, 0x2008,
++      0x0079, 0xa3d4, 0xa186, 0x0027, 0x00c0, 0xa3cd, 0x1078, 0x61cd,
++      0x037e, 0x0d7e, 0x6010, 0x2068, 0x2019, 0x0004, 0x1078, 0xa1ca,
++      0x0d7f, 0x037f, 0x1078, 0x62d1, 0x007c, 0xa186, 0x0014, 0x0040,
++      0xa3be, 0x1078, 0x7773, 0x007c, 0xa3dd, 0xa3db, 0xa3db, 0xa3db,
++      0xa3db, 0xa3db, 0xa3dd, 0x1078, 0x1332, 0x1078, 0x61cd, 0x6003,
++      0x000c, 0x1078, 0x62d1, 0x007c, 0xa182, 0x008c, 0x00c8, 0xa3ee,
++      0xa182, 0x0085, 0x0048, 0xa3ee, 0x0079, 0xa3f1, 0x1078, 0x7773,
++      0x007c, 0xa3f8, 0xa3f8, 0xa3f8, 0xa3f8, 0xa3fa, 0xa419, 0xa3f8,
++      0x1078, 0x1332, 0x0d7e, 0x2c68, 0x1078, 0x76c7, 0x0040, 0xa414,
++      0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xab8e, 0x210c, 0x6136,
++      0x2009, 0xab8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a,
++      0x601f, 0x0004, 0x1078, 0x5d8a, 0x2d60, 0x1078, 0x772d, 0x0d7f,
++      0x007c, 0x1078, 0x772d, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000,
++      0xd0ec, 0x0e7f, 0x007c, 0x6010, 0xa08c, 0xf000, 0x0040, 0xa471,
++      0xa080, 0x0013, 0x200c, 0xd1ec, 0x0040, 0xa471, 0x2001, 0xa672,
++      0x2004, 0xd0ec, 0x0040, 0xa471, 0x6003, 0x0002, 0x6024, 0xc0e5,
++      0x6026, 0xd1ac, 0x0040, 0xa44f, 0x0f7e, 0x2c78, 0x1078, 0x495f,
++      0x0f7f, 0x0040, 0xa44f, 0x2001, 0xa8a4, 0x2004, 0x603e, 0x2009,
++      0xa672, 0x210c, 0xd1f4, 0x00c0, 0xa46f, 0x0078, 0xa461, 0x2009,
++      0xa672, 0x210c, 0xd1f4, 0x0040, 0xa45b, 0x6024, 0xc0e4, 0x6026,
++      0xa006, 0x0078, 0xa471, 0x2001, 0xa8a4, 0x200c, 0x8103, 0xa100,
++      0x603e, 0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0040, 0xa46c,
++      0xa088, 0x0003, 0x0078, 0xa464, 0x2c0a, 0x600f, 0x0000, 0xa085,
++      0x0001, 0x007c, 0x017e, 0x0c7e, 0x0e7e, 0x6120, 0xa2f0, 0x002b,
++      0x2e04, 0x2060, 0x8cff, 0x0040, 0xa491, 0x84ff, 0x00c0, 0xa484,
++      0x6020, 0xa106, 0x00c0, 0xa48c, 0x600c, 0x2072, 0x1078, 0x5bc1,
++      0x1078, 0x772d, 0x0078, 0xa48e, 0xacf0, 0x0003, 0x2e64, 0x0078,
++      0xa47a, 0x0e7f, 0x0c7f, 0x017f, 0x007c, 0x0d7e, 0x6018, 0xa0e8,
++      0x002b, 0x2d04, 0xa005, 0x0040, 0xa4a7, 0xac06, 0x0040, 0xa4a5,
++      0x2d04, 0xa0e8, 0x0003, 0x0078, 0xa499, 0x600c, 0x206a, 0x0d7f,
++      0x007c, 0x027e, 0x037e, 0x157e, 0x2011, 0xa626, 0x2204, 0xa084,
++      0x00ff, 0x2019, 0xab8e, 0x2334, 0xa636, 0x00c0, 0xa4d5, 0x8318,
++      0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x00c0, 0xa4d5, 0x2011,
++      0xab90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x1078, 0x80de,
++      0x00c0, 0xa4d5, 0x2011, 0xab94, 0x6018, 0xa098, 0x0006, 0x20a9,
++      0x0004, 0x1078, 0x80de, 0x00c0, 0xa4d5, 0x157f, 0x037f, 0x027f,
++      0x007c, 0x0e7e, 0x2071, 0xa600, 0x1078, 0x42b8, 0x1078, 0x2677,
++      0x0e7f, 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000, 0xd0fc, 0x0040,
++      0xa4eb, 0x1078, 0xa4ed, 0x0e7f, 0x007c, 0x6850, 0xc0e5, 0x6852,
++      0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e,
++      0x017e, 0x127e, 0x2091, 0x8000, 0x2029, 0xa8ba, 0x252c, 0x2021,
++      0xa8c0, 0x2424, 0x2061, 0xad00, 0x2071, 0xa600, 0x7648, 0x7064,
++      0xa606, 0x0040, 0xa545, 0x671c, 0xa786, 0x0001, 0x0040, 0xa514,
++      0xa786, 0x0008, 0x00c0, 0xa53b, 0x2500, 0xac06, 0x0040, 0xa53b,
++      0x2400, 0xac06, 0x0040, 0xa53b, 0x1078, 0xa242, 0x0040, 0xa53b,
++      0x1078, 0xa256, 0x00c0, 0xa53b, 0x6000, 0xa086, 0x0004, 0x00c0,
++      0xa52d, 0x017e, 0x1078, 0x1757, 0x017f, 0x1078, 0x8eec, 0x00c0,
++      0xa533, 0x1078, 0x28a6, 0x1078, 0x8f00, 0x00c0, 0xa539, 0x1078,
++      0x7c83, 0x1078, 0x8ec6, 0xace0, 0x0010, 0x2001, 0xa616, 0x2004,
++      0xac02, 0x00c8, 0xa545, 0x0078, 0xa504, 0x127f, 0x017f, 0x027f,
++      0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0x127e,
++      0x007e, 0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa640, 0xd5a4,
++      0x0040, 0xa55d, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa563,
++      0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0xa579, 0x2500, 0xa084,
++      0x0007, 0xa08e, 0x0003, 0x0040, 0xa579, 0xa08e, 0x0004, 0x0040,
++      0xa579, 0xa08e, 0x0005, 0x0040, 0xa579, 0x2071, 0xa64a, 0x1078,
++      0xa5ba, 0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e,
++      0x0e7e, 0x017e, 0x2091, 0x8000, 0x2071, 0xa640, 0xd5a4, 0x0040,
++      0xa58c, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa592, 0x7030,
++      0x8000, 0x7032, 0xd5ac, 0x0040, 0xa5a8, 0x2500, 0xa084, 0x0007,
++      0xa08e, 0x0003, 0x0040, 0xa5a8, 0xa08e, 0x0004, 0x0040, 0xa5a8,
++      0xa08e, 0x0005, 0x0040, 0xa5a8, 0x2071, 0xa64a, 0x1078, 0xa5ba,
++      0x017f, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e,
++      0x2091, 0x8000, 0x2071, 0xa642, 0x1078, 0xa5ba, 0x0e7f, 0x007f,
++      0x127f, 0x007c, 0x2e04, 0x8000, 0x2072, 0x00c8, 0xa5c3, 0x8e70,
++      0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e, 0x2071, 0xa640, 0x1078,
++      0xa5ba, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa644, 0x1078, 0xa5ba,
++      0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071,
++      0xa640, 0x7044, 0x8000, 0x7046, 0x0e7f, 0x007f, 0x127f, 0x007c,
++      0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
++      0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
++      0xa50c
++};
++#else
++/*
++ *    Firmware Version 1.15.37 (15:36 May 03, 1999)
++ */
++static const u_int16_t isp_2100_risc_code[] = {
++      0x0078, 0x1029, 0x0000, 0x66e6, 0x0000, 0x2043, 0x4f50, 0x5952,
++      0x4947, 0x4854, 0x2031, 0x3939, 0x3620, 0x514c, 0x4f47, 0x4943,
++      0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
++      0x3231, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
++      0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3135, 0x2020, 0x2020,
++      0x2400, 0x20c1, 0x0021, 0x20a1, 0x76e6, 0x2009, 0x0000, 0x20a9,
++      0x071a, 0x41a4, 0x3400, 0x20c9, 0x7bff, 0x2091, 0x2000, 0x2059,
++      0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x209a, 0x2051, 0x7700,
++      0x2a70, 0x705b, 0x9600, 0x705f, 0xffff, 0x7057, 0x95f9, 0x7063,
++      0x0300, 0x1078, 0x127a, 0x20a1, 0x7e00, 0x715c, 0x810d, 0x810d,
++      0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0007, 0xa112, 0xa00e,
++      0x21a8, 0x41a4, 0x3400, 0x8211, 0x00c0, 0x1058, 0x715c, 0x3400,
++      0xa102, 0x0040, 0x1068, 0x0048, 0x1068, 0x20a8, 0xa00e, 0x41a4,
++      0x1078, 0x1241, 0x1078, 0x1366, 0x1078, 0x14eb, 0x1078, 0x19c0,
++      0x1078, 0x362b, 0x1078, 0x5cac, 0x1078, 0x12f1, 0x1078, 0x2429,
++      0x1078, 0x3d6e, 0x1078, 0x3b46, 0x1078, 0x45af, 0x1078, 0x1e55,
++      0x1078, 0x47ef, 0x1078, 0x428f, 0x1078, 0x1d74, 0x1078, 0x1e34,
++      0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x109d, 0x7820, 0xa086,
++      0x0002, 0x00c0, 0x109d, 0x7823, 0x4000, 0x0068, 0x1095, 0x781b,
++      0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000,
++      0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000, 0xa08e, 0x0003,
++      0x00c0, 0x10bd, 0x1078, 0x2d9c, 0x1078, 0x2451, 0x1078, 0x3dbe,
++      0x1078, 0x3c31, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
++      0x10c1, 0x1078, 0x45c7, 0x0078, 0x10a4, 0x1079, 0x10c5, 0x0078,
++      0x10aa, 0x1078, 0x597e, 0x0078, 0x10b9, 0x10cf, 0x10d0, 0x1143,
++      0x10cd, 0x11be, 0x123e, 0x123f, 0x1240, 0x1078, 0x12cd, 0x007c,
++      0x127e, 0x0f7e, 0x2091, 0x8000, 0x1078, 0x2ec1, 0x2079, 0x0100,
++      0x7844, 0xa005, 0x00c0, 0x1134, 0x2011, 0x3558, 0x1078, 0x4689,
++      0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010,
++      0x73b8, 0x1078, 0x2d59, 0x1078, 0x57c9, 0x2011, 0x0004, 0x1078,
++      0x6a6d, 0x1078, 0x3ae0, 0x70c7, 0x0000, 0x70c3, 0x0000, 0x1078,
++      0x1137, 0x72bc, 0x2079, 0x7751, 0x7804, 0xd0ac, 0x0040, 0x1101,
++      0xc295, 0x72be, 0xa296, 0x0004, 0x0040, 0x1122, 0x2011, 0x0001,
++      0x1078, 0x6a6d, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
++      0x0f7f, 0x1078, 0x214a, 0x2011, 0x0005, 0x1078, 0x58d8, 0x1078,
++      0x4d96, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x127f,
++      0x0078, 0x1136, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
++      0x2011, 0x0005, 0x1078, 0x58d8, 0x1078, 0x4d96, 0x0c7e, 0x2061,
++      0x0100, 0x60e3, 0x0008, 0x0c7f, 0x0f7f, 0x127f, 0x007c, 0x0c7e,
++      0x20a9, 0x0082, 0x2009, 0x007e, 0x1078, 0x3834, 0x8108, 0x00f0,
++      0x113c, 0x0c7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x708c, 0xa086,
++      0xffff, 0x0040, 0x1151, 0x1078, 0x214a, 0x1078, 0x4d96, 0x0078,
++      0x11bc, 0x70bc, 0xd09c, 0x0040, 0x1179, 0xd084, 0x0040, 0x1179,
++      0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c,
++      0x0040, 0x1179, 0x70c0, 0xa086, 0xffff, 0x0040, 0x1175, 0x1078,
++      0x223f, 0x1078, 0x4d96, 0x2011, 0x0001, 0x2019, 0x0000, 0x1078,
++      0x2277, 0x1078, 0x4d96, 0x0078, 0x11bc, 0x70c4, 0xa005, 0x00c0,
++      0x11bc, 0x7088, 0xa005, 0x00c0, 0x11bc, 0x2001, 0x7752, 0x2004,
++      0xd0ac, 0x0040, 0x119f, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009,
++      0x0000, 0x017e, 0x1078, 0x384c, 0x00c0, 0x1192, 0x6000, 0xd0ec,
++      0x00c0, 0x119a, 0x017f, 0x8108, 0x00f0, 0x1189, 0x0c7f, 0x157f,
++      0x0078, 0x119f, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x11bc, 0x7003,
++      0x0003, 0x708f, 0xffff, 0x2001, 0x0000, 0x1078, 0x2025, 0x1078,
++      0x2dd7, 0x2001, 0x7937, 0x2004, 0xa086, 0x0005, 0x00c0, 0x11b4,
++      0x2011, 0x0000, 0x1078, 0x58d8, 0x2011, 0x0000, 0x1078, 0x58e2,
++      0x1078, 0x4d96, 0x1078, 0x4e56, 0x127f, 0x007c, 0x017e, 0x0f7e,
++      0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x7940, 0xa18c, 0x0010,
++      0x7942, 0x7924, 0xd1b4, 0x0040, 0x11cf, 0x7827, 0x0040, 0xd19c,
++      0x0040, 0x11d4, 0x7827, 0x0008, 0x007e, 0x037e, 0x157e, 0x7900,
++      0xa18a, 0x0003, 0x0050, 0x11fa, 0x7954, 0xd1ac, 0x00c0, 0x11fa,
++      0x2009, 0x00f8, 0x1078, 0x35fa, 0x7843, 0x0090, 0x7843, 0x0010,
++      0x20a9, 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x11f2, 0x7824, 0xd0ac,
++      0x00c0, 0x122e, 0x00f0, 0x11ea, 0x2001, 0x0001, 0x1078, 0x2025,
++      0x0078, 0x1237, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0008,
++      0x00e0, 0x1200, 0x2091, 0x6000, 0x00f0, 0x1200, 0x7853, 0x0400,
++      0x782f, 0x0000, 0x2009, 0x00f8, 0x1078, 0x35fa, 0x20a9, 0x000e,
++      0x0005, 0x00f0, 0x1210, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843,
++      0x0010, 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040,
++      0x1225, 0x7824, 0xd0ac, 0x00c0, 0x122e, 0x8319, 0x00c0, 0x121b,
++      0x2001, 0x0001, 0x1078, 0x2025, 0x0078, 0x1235, 0x7828, 0xc09d,
++      0x782a, 0x7827, 0x0008, 0x7827, 0x0040, 0x7853, 0x0400, 0x157f,
++      0x037f, 0x007f, 0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c,
++      0x007c, 0x2a70, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
++      0x124d, 0x704f, 0xffff, 0x0078, 0x124f, 0x704f, 0x0000, 0x7053,
++      0xffff, 0x7067, 0x0000, 0x706b, 0x0000, 0x2061, 0x7920, 0x6003,
++      0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013,
++      0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, 0x07d0, 0x2061,
++      0x7928, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, 0x0000, 0x600f,
++      0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, 0x0001, 0x601f,
++      0x0000, 0x007c, 0x1078, 0x12a0, 0x2011, 0x0000, 0x81ff, 0x0040,
++      0x129f, 0xa186, 0x0001, 0x00c0, 0x128f, 0x705f, 0x8fff, 0x7057,
++      0x8601, 0x7063, 0x0100, 0x705b, 0x8600, 0x0078, 0x129d, 0xa186,
++      0x0002, 0x00c0, 0x1297, 0x2011, 0x0000, 0x0078, 0x129d, 0xa186,
++      0x0005, 0x00c0, 0x129d, 0x2011, 0x0001, 0x1078, 0x12c7, 0x007c,
++      0x2009, 0x0000, 0x2011, 0x0000, 0x1078, 0x12c7, 0x2019, 0xaaaa,
++      0x2061, 0xffff, 0x2362, 0x2c24, 0x2061, 0x7fff, 0x2c04, 0xa406,
++      0x0040, 0x12b5, 0xc18d, 0x0078, 0x12c2, 0xc185, 0x2011, 0x0001,
++      0x1078, 0x12c7, 0x2061, 0xffff, 0x2362, 0x2c04, 0xa306, 0x00c0,
++      0x12c2, 0xc195, 0x2011, 0x0001, 0x1078, 0x12c7, 0x007c, 0x3800,
++      0xa084, 0xfffc, 0xa205, 0x20c0, 0x007c, 0x2091, 0x8000, 0x0068,
++      0x12cf, 0x007e, 0x017e, 0x2079, 0x0000, 0x7818, 0xa084, 0x0000,
++      0x00c0, 0x12d5, 0x017f, 0x792e, 0x007f, 0x782a, 0x007f, 0x7826,
++      0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001, 0x2091, 0x5000,
++      0x2091, 0x4080, 0x2079, 0x7700, 0x7803, 0x0005, 0x0078, 0x12ee,
++      0x007c, 0x2071, 0x7700, 0x7158, 0x712e, 0x2021, 0x0001, 0xa190,
++      0x002d, 0xa298, 0x002d, 0x0048, 0x1307, 0x705c, 0xa302, 0x00c8,
++      0x1307, 0x220a, 0x2208, 0x2310, 0x8420, 0x0078, 0x12f9, 0x200b,
++      0x0000, 0x749e, 0x74a2, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000,
++      0x2071, 0x7700, 0x70a0, 0xa0ea, 0x0010, 0x00c8, 0x131a, 0xa06e,
++      0x0078, 0x1324, 0x8001, 0x70a2, 0x702c, 0x2068, 0x2d04, 0x702e,
++      0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e,
++      0x2071, 0x7700, 0x127e, 0x2091, 0x8000, 0x70a0, 0x8001, 0x00c8,
++      0x1334, 0xa06e, 0x0078, 0x133d, 0x70a2, 0x702c, 0x2068, 0x2d04,
++      0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, 0x007c,
++      0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7700, 0x702c, 0x206a,
++      0x2d00, 0x702e, 0x70a0, 0x8000, 0x70a2, 0x127f, 0x0e7f, 0x007c,
++      0x8dff, 0x0040, 0x135c, 0x6804, 0x6807, 0x0000, 0x007e, 0x1078,
++      0x1340, 0x0d7f, 0x0078, 0x1350, 0x007c, 0x0e7e, 0x2071, 0x7700,
++      0x70a0, 0xa08a, 0x0010, 0xa00d, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
++      0x7959, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071,
++      0x0000, 0x7010, 0xa085, 0x8004, 0x7012, 0x0e7f, 0x007c, 0x0e7e,
++      0x2270, 0x700b, 0x0000, 0x2071, 0x7959, 0x7018, 0xa088, 0x7962,
++      0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0,
++      0x138f, 0x0f7e, 0x2079, 0x0010, 0x1078, 0x13a0, 0x0f7f, 0x0e7f,
++      0x007c, 0x0e7e, 0x2071, 0x7959, 0x7004, 0xa005, 0x00c0, 0x139e,
++      0x0f7e, 0x2079, 0x0010, 0x1078, 0x13a0, 0x0f7f, 0x0e7f, 0x007c,
++      0x7000, 0x0079, 0x13a3, 0x13a7, 0x1411, 0x142e, 0x142e, 0x7018,
++      0x711c, 0xa106, 0x00c0, 0x13af, 0x7007, 0x0000, 0x007c, 0x0d7e,
++      0xa180, 0x7962, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
++      0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c,
++      0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804,
++      0x0d7f, 0xd084, 0x0040, 0x13d1, 0x7007, 0x0001, 0x1078, 0x13d6,
++      0x007c, 0x7007, 0x0002, 0x1078, 0x13ec, 0x007c, 0x017e, 0x027e,
++      0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x13e1, 0x2110,
++      0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
++      0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e,
++      0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c,
++      0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1400, 0x2110, 0xa006,
++      0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
++      0x0001, 0x3300, 0x7016, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f,
++      0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0x77e5, 0x20a1, 0x0018,
++      0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++      0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b,
++      0x77e0, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
++      0x157e, 0x2001, 0x7814, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
++      0x2001, 0x7815, 0x20ac, 0x53a6, 0x2099, 0x7816, 0x20a1, 0x0018,
++      0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
++      0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b,
++      0x7811, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
++      0x2071, 0x7959, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
++      0xd1fc, 0x0040, 0x1471, 0xa18c, 0x0700, 0x0040, 0x146e, 0x7008,
++      0xa080, 0x0002, 0x2003, 0x0200, 0x0078, 0x1471, 0x7004, 0x1079,
++      0x1475, 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x13a0, 0x147d, 0x149f,
++      0x14b9, 0x14e2, 0x147b, 0x0078, 0x147b, 0x137e, 0x147e, 0x157e,
++      0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x7010, 0x20a8,
++      0x53a5, 0x3400, 0x7016, 0x157f, 0x147f, 0x137f, 0x700c, 0xa005,
++      0x0040, 0x14a6, 0x1078, 0x13d6, 0x007c, 0x7008, 0xa080, 0x0002,
++      0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x13a0, 0x007c, 0x700c,
++      0xa005, 0x0040, 0x14a6, 0x1078, 0x13ec, 0x007c, 0x0d7e, 0x7008,
++      0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c,
++      0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x13a0,
++      0x007c, 0x137e, 0x147e, 0x157e, 0x2001, 0x77e3, 0x2004, 0xa080,
++      0x000d, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020,
++      0x53a5, 0x2001, 0x77e5, 0x2004, 0xd0bc, 0x0040, 0x14d8, 0x2001,
++      0x77ee, 0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5,
++      0x157f, 0x147f, 0x137f, 0x7007, 0x0000, 0x1078, 0x3e67, 0x1078,
++      0x13a0, 0x007c, 0x2001, 0x7813, 0x2003, 0x0100, 0x7007, 0x0000,
++      0x1078, 0x13a0, 0x007c, 0x127e, 0x2091, 0x2100, 0x2079, 0x0030,
++      0x2071, 0x796a, 0x7003, 0x0000, 0x700f, 0x7970, 0x7013, 0x7970,
++      0x780f, 0x0070, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079,
++      0x1501, 0x1509, 0x154f, 0x1509, 0x1509, 0x1509, 0x1534, 0x1518,
++      0x150d, 0xa085, 0x0001, 0x0078, 0x1569, 0x684c, 0xd0bc, 0x0040,
++      0x1509, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x1557,
++      0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1509, 0x684c, 0xd0bc,
++      0x0040, 0x1509, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a,
++      0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004,
++      0x6832, 0x6858, 0x0078, 0x155f, 0xa18c, 0x00ff, 0xa186, 0x0015,
++      0x00c0, 0x1509, 0x684c, 0xd0ac, 0x0040, 0x1509, 0x6804, 0x681a,
++      0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004,
++      0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x155f, 0x684c,
++      0xd0ac, 0x0040, 0x1509, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c,
++      0x000f, 0xa188, 0x1c7e, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826,
++      0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980,
++      0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a,
++      0x2004, 0x82ff, 0x0040, 0x1584, 0xa280, 0x0004, 0x0d7e, 0x206c,
++      0x684c, 0xd0dc, 0x00c0, 0x1580, 0x1078, 0x14fc, 0x10c0, 0x12cd,
++      0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e,
++      0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0,
++      0x1598, 0x7206, 0x2001, 0x15ac, 0x007e, 0x2260, 0x0078, 0x16c4,
++      0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
++      0x798b, 0x0048, 0x15a5, 0x2009, 0x7970, 0x710e, 0x7000, 0xa005,
++      0x00c0, 0x15ac, 0x1078, 0x16ad, 0x127f, 0x007c, 0x127e, 0x027e,
++      0x037e, 0x0c7e, 0x007e, 0x2091, 0x2100, 0x007f, 0x047f, 0x037f,
++      0x027f, 0x0d7e, 0x0c7e, 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e,
++      0xa005, 0x0040, 0x1600, 0x6808, 0xa005, 0x0040, 0x1666, 0x7000,
++      0xa005, 0x00c0, 0x15cd, 0x0078, 0x15fa, 0x700c, 0x7110, 0xa106,
++      0x00c0, 0x166a, 0x7004, 0xa406, 0x00c0, 0x15fa, 0x2001, 0x0005,
++      0x2004, 0xd08c, 0x0040, 0x15e3, 0x047e, 0x1078, 0x1785, 0x047f,
++      0x2460, 0x0078, 0x15c3, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0,
++      0x15d6, 0x7804, 0xa084, 0x6000, 0x0040, 0x15f4, 0xa086, 0x6000,
++      0x0040, 0x15f4, 0x0078, 0x15d6, 0x7803, 0x0004, 0x7003, 0x0000,
++      0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x5d41, 0x0078, 0x166a,
++      0x6808, 0xa005, 0x0040, 0x1666, 0x7000, 0xa005, 0x00c0, 0x160a,
++      0x0078, 0x1666, 0x700c, 0x7110, 0xa106, 0x00c0, 0x1613, 0x7004,
++      0xa406, 0x00c0, 0x1666, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040,
++      0x1620, 0x047e, 0x1078, 0x1785, 0x047f, 0x2460, 0x0078, 0x1600,
++      0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x1613, 0x2001, 0x0005,
++      0x2004, 0xd08c, 0x00c0, 0x1619, 0x7804, 0xa084, 0x6000, 0x0040,
++      0x1637, 0xa086, 0x6000, 0x0040, 0x1637, 0x0078, 0x1613, 0x7007,
++      0x0000, 0xa016, 0x2218, 0x7000, 0xa08e, 0x0001, 0x0040, 0x1658,
++      0xa08e, 0x0002, 0x00c0, 0x1666, 0x0c7e, 0x0e7e, 0x6818, 0x2060,
++      0x1078, 0x1c53, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0, 0x1654,
++      0x7308, 0x720c, 0x0078, 0x1656, 0x7310, 0x7214, 0x0e7f, 0x0c7f,
++      0x7820, 0xa318, 0x7824, 0xa211, 0x6810, 0xa300, 0x6812, 0x6814,
++      0xa201, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x2009, 0x0048,
++      0x1078, 0x5d41, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e, 0x0e7e,
++      0x2071, 0x796a, 0x7000, 0xa086, 0x0000, 0x0040, 0x16aa, 0x7004,
++      0xac06, 0x00c0, 0x169b, 0x2079, 0x0030, 0x7804, 0xd0fc, 0x00c0,
++      0x1697, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x167d, 0x7803,
++      0x0004, 0x7804, 0xd0ac, 0x00c0, 0x1689, 0x7803, 0x0002, 0x7803,
++      0x0009, 0x7003, 0x0003, 0x7007, 0x0000, 0x0078, 0x169b, 0x1078,
++      0x1785, 0x0078, 0x1672, 0x157e, 0x20a9, 0x0009, 0x2009, 0x7970,
++      0x2104, 0xac06, 0x00c0, 0x16a5, 0x200a, 0xa188, 0x0003, 0x00f0,
++      0x16a0, 0x157f, 0x0e7f, 0x0f7f, 0x007c, 0x700c, 0x7110, 0xa106,
++      0x00c0, 0x16b5, 0x7003, 0x0000, 0x007c, 0x2104, 0x7006, 0x2060,
++      0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0x798b, 0x0048,
++      0x16c3, 0x2009, 0x7970, 0x7112, 0x8cff, 0x00c0, 0x16cb, 0x1078,
++      0x1950, 0x0078, 0x16f2, 0x6010, 0x2068, 0x2d58, 0x6828, 0xa406,
++      0x00c0, 0x16d6, 0x682c, 0xa306, 0x0040, 0x16da, 0x1078, 0x1c9e,
++      0x00c0, 0x16c7, 0x684c, 0xd0f4, 0x00c0, 0x16c7, 0x6824, 0x2050,
++      0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009,
++      0x0011, 0x1078, 0x16f3, 0x0040, 0x16f1, 0x2009, 0x0001, 0x1078,
++      0x16f3, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x1780, 0xa03e, 0x2730,
++      0x6850, 0xd0fc, 0x00c0, 0x1712, 0x0d7e, 0x2804, 0xac68, 0x2900,
++      0x0079, 0x1702, 0x1762, 0x1722, 0x1722, 0x1762, 0x1762, 0x175a,
++      0x1762, 0x1722, 0x1762, 0x1728, 0x1728, 0x1762, 0x1762, 0x1762,
++      0x1751, 0x1728, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20,
++      0x0d7e, 0xd99c, 0x0040, 0x1765, 0x2804, 0xac68, 0x6f08, 0x6e0c,
++      0x0078, 0x1765, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x1765,
++      0x7b0c, 0xd3bc, 0x0040, 0x1749, 0x7004, 0x0e7e, 0x2070, 0x701c,
++      0x0e7f, 0xa086, 0x0008, 0x00c0, 0x1749, 0x7b08, 0xa39c, 0x0fff,
++      0x2d20, 0x0d7f, 0x0d7e, 0x6a14, 0x82ff, 0x00c0, 0x1744, 0x6810,
++      0xa302, 0x0048, 0x1744, 0x6b10, 0x2011, 0x0000, 0x2468, 0x0078,
++      0x174b, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078,
++      0x1765, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
++      0x00c0, 0x1762, 0x0d7f, 0x1078, 0x1c3a, 0x00c0, 0x16f3, 0xa00e,
++      0x0078, 0x1780, 0x0d7f, 0x1078, 0x12cd, 0x7b22, 0x7a26, 0x7d32,
++      0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x0d7f,
++      0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x2300, 0x6b10,
++      0xa302, 0x6812, 0x2200, 0x6a14, 0xa203, 0x6816, 0x1078, 0x1c3a,
++      0x007c, 0x1078, 0x12cd, 0x1078, 0x12cd, 0x127e, 0x2091, 0x2100,
++      0x007e, 0x017e, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002,
++      0xa184, 0x0700, 0x00c0, 0x1783, 0xa184, 0x0003, 0xa086, 0x0003,
++      0x0040, 0x1783, 0x7000, 0x0079, 0x179d, 0x17a5, 0x17a7, 0x187f,
++      0x18e7, 0x18fe, 0x17a5, 0x17a5, 0x17a5, 0x1078, 0x12cd, 0x8001,
++      0x7002, 0xa184, 0x0880, 0x00c0, 0x17bc, 0x8aff, 0x0040, 0x181f,
++      0x2009, 0x0001, 0x1078, 0x16f3, 0x0040, 0x1910, 0x2009, 0x0001,
++      0x1078, 0x16f3, 0x0078, 0x1910, 0x7803, 0x0004, 0x7003, 0x0000,
++      0xd1bc, 0x00c0, 0x1807, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x7820,
++      0x686e, 0xa31a, 0x7824, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x7820,
++      0x6910, 0xa100, 0x6812, 0x7824, 0x6914, 0xa101, 0x6816, 0x037f,
++      0x027f, 0x7830, 0x681e, 0x7834, 0x6822, 0x1078, 0x1c53, 0x2a00,
++      0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x6850,
++      0xc0fd, 0x6852, 0x6808, 0x8001, 0x680a, 0x00c0, 0x17f9, 0x684c,
++      0xd0e4, 0x0040, 0x17f9, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078,
++      0x5d41, 0x7808, 0xd0ec, 0x00c0, 0x1803, 0x7803, 0x0009, 0x7003,
++      0x0004, 0x0078, 0x1910, 0x1078, 0x16ad, 0x0078, 0x1910, 0x057e,
++      0x7d0c, 0xd5bc, 0x00c0, 0x180e, 0x1078, 0x7692, 0x057f, 0x1078,
++      0x1914, 0x682b, 0xffff, 0x682f, 0xffff, 0x697c, 0x6912, 0x6980,
++      0x6916, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1910, 0x684c,
++      0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x1837, 0x7003, 0x0000,
++      0x6808, 0x8001, 0x680a, 0x00c0, 0x1833, 0x7004, 0x2060, 0x2009,
++      0x0048, 0x1078, 0x5d41, 0x1078, 0x16ad, 0x0078, 0x1910, 0x7814,
++      0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000, 0x6816, 0x7814,
++      0x7908, 0xa18c, 0x0fff, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214,
++      0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b,
++      0x1078, 0x197b, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001,
++      0x7804, 0xd0fc, 0x0040, 0x1858, 0x7803, 0x0002, 0x7803, 0x0004,
++      0x780f, 0x0070, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048,
++      0x1078, 0x5d41, 0x1078, 0x199e, 0x0040, 0x1833, 0x7908, 0xd1ec,
++      0x00c0, 0x1876, 0x2009, 0x0009, 0x0078, 0x1878, 0x2009, 0x0019,
++      0x7902, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1910, 0x8001,
++      0x7002, 0xd194, 0x0040, 0x1891, 0x7804, 0xd0fc, 0x00c0, 0x178d,
++      0x8aff, 0x0040, 0x1910, 0x2009, 0x0001, 0x1078, 0x16f3, 0x0078,
++      0x1910, 0xa184, 0x0880, 0x00c0, 0x189e, 0x8aff, 0x0040, 0x1910,
++      0x2009, 0x0001, 0x1078, 0x16f3, 0x0078, 0x1910, 0x7803, 0x0004,
++      0x7003, 0x0000, 0xd1bc, 0x00c0, 0x18d2, 0x027e, 0x037e, 0x6b28,
++      0x6a2c, 0x1078, 0x1c53, 0x0d7e, 0x0f7e, 0x2d78, 0x2804, 0xac68,
++      0x6034, 0xd09c, 0x00c0, 0x18c2, 0x6808, 0x2008, 0xa31a, 0x680c,
++      0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101, 0x7816,
++      0x0078, 0x18ce, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213, 0x7810,
++      0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f, 0x0d7f,
++      0x0078, 0x17c7, 0x057e, 0x7d0c, 0x1078, 0x7692, 0x057f, 0x1078,
++      0x1914, 0x682b, 0xffff, 0x682f, 0xffff, 0x697c, 0x6912, 0x6980,
++      0x6916, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1910, 0x7803,
++      0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0040, 0x18fa, 0x6808,
++      0x8001, 0x680a, 0x00c0, 0x18fa, 0x7004, 0x2060, 0x2009, 0x0048,
++      0x1078, 0x5d41, 0x1078, 0x16ad, 0x0078, 0x1910, 0x7803, 0x0004,
++      0x7003, 0x0000, 0x7004, 0x2060, 0x6010, 0xa005, 0x0040, 0x18fa,
++      0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c, 0x1078, 0x16c4,
++      0x017f, 0x007f, 0x127f, 0x007c, 0x1078, 0x1925, 0x20e1, 0x9028,
++      0x700f, 0x7970, 0x7013, 0x7970, 0x2001, 0x015d, 0x200c, 0x810a,
++      0x2102, 0x2001, 0x0138, 0x2202, 0x007c, 0x2001, 0x0138, 0x2014,
++      0x2003, 0x0000, 0x2021, 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc,
++      0x00c0, 0x1942, 0x2001, 0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0,
++      0x1942, 0x2001, 0x0111, 0x201c, 0x83ff, 0x00c0, 0x1942, 0x8421,
++      0x00c0, 0x192c, 0x007c, 0x2011, 0x0201, 0x2009, 0x003c, 0x2204,
++      0xa005, 0x00c0, 0x194f, 0x8109, 0x00c0, 0x1947, 0x007c, 0x007c,
++      0x1078, 0x1943, 0x0040, 0x1978, 0x7908, 0xd1ec, 0x00c0, 0x1968,
++      0x1078, 0x199e, 0x0040, 0x1968, 0x7803, 0x0009, 0x7904, 0xd1fc,
++      0x0040, 0x195e, 0x7803, 0x0006, 0x1078, 0x1943, 0x0040, 0x1978,
++      0x780c, 0xd0a4, 0x00c0, 0x1978, 0x7007, 0x0000, 0x1078, 0x199e,
++      0x0040, 0x197a, 0x7803, 0x0019, 0x7003, 0x0003, 0x0078, 0x197a,
++      0x1078, 0x1914, 0x007c, 0x3c00, 0x007e, 0x0e7e, 0x2071, 0x0200,
++      0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x1925, 0x20e1, 0x7000,
++      0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f,
++      0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001,
++      0x0138, 0x2202, 0x0e7f, 0x007f, 0x20e0, 0x007c, 0x3c00, 0x007e,
++      0x7908, 0xa18c, 0x0fff, 0xa182, 0x0009, 0x0048, 0x19ab, 0xa085,
++      0x0001, 0x0078, 0x19bd, 0x2001, 0x020a, 0x81ff, 0x0040, 0x19b6,
++      0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x20e1, 0x7000,
++      0x200c, 0x200c, 0x7003, 0x0000, 0xa006, 0x007f, 0x20e0, 0x007c,
++      0x0e7e, 0x2071, 0x798b, 0x7003, 0x0000, 0x0e7f, 0x007c, 0x0d7e,
++      0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1a42, 0x6934,
++      0xa184, 0x0007, 0x0079, 0x19d4, 0x19dc, 0x1a2d, 0x19dc, 0x19dc,
++      0x19dc, 0x1a12, 0x19ef, 0x19de, 0x1078, 0x12cd, 0x684c, 0xd0b4,
++      0x0040, 0x1b46, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
++      0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1a35, 0x6834,
++      0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x19dc, 0x684c, 0xd0b4,
++      0x0040, 0x1b46, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
++      0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d,
++      0x2004, 0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004, 0x6832, 0x6958,
++      0x0078, 0x1a3e, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, 0x1a42,
++      0x684c, 0xd0b4, 0x0040, 0x1b46, 0x6804, 0x681a, 0xa080, 0x000d,
++      0x2004, 0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004, 0x6832, 0x6958,
++      0xa006, 0x682e, 0x682a, 0x0078, 0x1a3e, 0x684c, 0xd0b4, 0x0040,
++      0x1781, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, 0x6834,
++      0xa084, 0x000f, 0xa080, 0x1c7e, 0x2004, 0x6832, 0x6926, 0x684c,
++      0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020, 0x7804,
++      0xd0fc, 0x10c0, 0x1b4a, 0x0e7e, 0x0d7e, 0x2071, 0x798b, 0x7000,
++      0xa005, 0x00c0, 0x1ac0, 0x0c7e, 0x7206, 0xa280, 0x0004, 0x205c,
++      0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x0d7e, 0x2068, 0x686c,
++      0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200, 0x781a,
++      0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68, 0x6824,
++      0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f,
++      0x6908, 0xa184, 0x0007, 0x0040, 0x1a82, 0x017e, 0x2009, 0x0008,
++      0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081,
++      0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c,
++      0x6814, 0xa106, 0x00c0, 0x1a99, 0x6928, 0x6810, 0xa106, 0x0040,
++      0x1aa6, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078, 0x1c9e, 0x047f,
++      0x037f, 0x0040, 0x1aa6, 0x0c7f, 0x0078, 0x1ac0, 0x8aff, 0x00c0,
++      0x1aae, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x1ac0, 0x127e, 0x2091,
++      0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078, 0x1ac4, 0x0040,
++      0x1abd, 0x2009, 0x0001, 0x1078, 0x1ac4, 0x127f, 0x0c7f, 0xa006,
++      0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e,
++      0x037e, 0x027e, 0x8aff, 0x0040, 0x1b3f, 0x700c, 0x7214, 0xa202,
++      0x7010, 0x7218, 0xa203, 0x0048, 0x1b3e, 0xa03e, 0x2730, 0x6850,
++      0xd0fc, 0x00c0, 0x1af1, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079,
++      0x1ae1, 0x1b20, 0x1b01, 0x1b01, 0x1b20, 0x1b20, 0x1b18, 0x1b20,
++      0x1b01, 0x1b20, 0x1b07, 0x1b07, 0x1b20, 0x1b20, 0x1b20, 0x1b0f,
++      0x1b07, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c,
++      0x0040, 0x1b24, 0x0d7e, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078,
++      0x1b23, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x1b23, 0x6b10,
++      0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x1b23, 0x0d7f,
++      0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1b20,
++      0x0d7f, 0x1078, 0x1c3a, 0x00c0, 0x1aca, 0xa00e, 0x0078, 0x1b3f,
++      0x0d7f, 0x1078, 0x12cd, 0x0d7f, 0x7b22, 0x7a26, 0x7d32, 0x7c36,
++      0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x6828, 0xa300,
++      0x682a, 0x682c, 0xa201, 0x682e, 0x700c, 0xa300, 0x700e, 0x7010,
++      0xa201, 0x7012, 0x1078, 0x1c3a, 0x0078, 0x1b3f, 0xa006, 0x027f,
++      0x037f, 0x047f, 0x057f, 0x067f, 0x077f, 0x007c, 0x1078, 0x12cd,
++      0x1078, 0x12cd, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e,
++      0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0x798b, 0x2b68,
++      0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0,
++      0x1b48, 0x7000, 0x0079, 0x1b64, 0x1c0b, 0x1b68, 0x1bd8, 0x1c09,
++      0x8001, 0x7002, 0xd19c, 0x00c0, 0x1b7c, 0x8aff, 0x0040, 0x1b9b,
++      0x2009, 0x0001, 0x1078, 0x1ac4, 0x0040, 0x1c0b, 0x2009, 0x0001,
++      0x1078, 0x1ac4, 0x0078, 0x1c0b, 0x7803, 0x0004, 0xd194, 0x0040,
++      0x1b8c, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1b91, 0x684c,
++      0xc0f5, 0x684e, 0x0078, 0x1b91, 0x1078, 0x1c53, 0x6850, 0xc0fd,
++      0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003,
++      0x0000, 0x0078, 0x1c0b, 0x711c, 0x81ff, 0x0040, 0x1bb1, 0x7918,
++      0x7922, 0x7827, 0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002,
++      0x700c, 0xa100, 0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078,
++      0x1c0b, 0x0f7e, 0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079,
++      0x0100, 0x7a14, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x7820,
++      0xd0bc, 0x00c0, 0x1bbf, 0x79c8, 0x007f, 0xa102, 0x78ca, 0x79c4,
++      0x007f, 0xa102, 0x78c6, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816,
++      0x027f, 0x0f7f, 0x7803, 0x0008, 0x7003, 0x0000, 0x0078, 0x1c0b,
++      0x8001, 0x7002, 0xd194, 0x0040, 0x1bed, 0x7804, 0xd0fc, 0x00c0,
++      0x1b5a, 0xd19c, 0x00c0, 0x1c07, 0x8aff, 0x0040, 0x1c0b, 0x2009,
++      0x0001, 0x1078, 0x1ac4, 0x0078, 0x1c0b, 0x027e, 0x037e, 0x6b28,
++      0x6a2c, 0x1078, 0x1c53, 0x0d7e, 0x2804, 0xac68, 0x6034, 0xd09c,
++      0x00c0, 0x1c00, 0x6808, 0xa31a, 0x680c, 0xa213, 0x0078, 0x1c04,
++      0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f, 0x0078, 0x1b8c, 0x0078,
++      0x1b8c, 0x1078, 0x12cd, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x017f,
++      0x007f, 0x127f, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x798b, 0x7000,
++      0xa086, 0x0000, 0x0040, 0x1c37, 0x2079, 0x0020, 0x20e1, 0x9040,
++      0x7804, 0xd0fc, 0x0040, 0x1c1e, 0x1078, 0x1b4a, 0x7000, 0xa086,
++      0x0000, 0x00c0, 0x1c1e, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
++      0x1c2d, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f,
++      0x0f7f, 0x007c, 0x8840, 0x2804, 0xa005, 0x00c0, 0x1c4e, 0x6004,
++      0xa005, 0x0040, 0x1c50, 0x681a, 0x2060, 0x6034, 0xa084, 0x000f,
++      0xa080, 0x1c7e, 0x2044, 0x88ff, 0x1040, 0x12cd, 0x8a51, 0x007c,
++      0x2051, 0x0000, 0x007c, 0x8a50, 0x8841, 0x2804, 0xa005, 0x00c0,
++      0x1c6d, 0x2c00, 0xad06, 0x0040, 0x1c62, 0x6000, 0xa005, 0x00c0,
++      0x1c62, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080,
++      0x1c8e, 0x2044, 0x88ff, 0x1040, 0x12cd, 0x007c, 0x0000, 0x0011,
++      0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f,
++      0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x1c73,
++      0x1c6f, 0x0000, 0x0000, 0x1c7d, 0x0000, 0x1c73, 0x0000, 0x1c7a,
++      0x1c77, 0x0000, 0x0000, 0x0000, 0x1c7d, 0x1c7a, 0x0000, 0x1c75,
++      0x1c75, 0x0000, 0x0000, 0x1c7d, 0x0000, 0x1c75, 0x0000, 0x1c7b,
++      0x1c7b, 0x0000, 0x0000, 0x0000, 0x1c7d, 0x1c7b, 0x0a7e, 0x097e,
++      0x087e, 0x6858, 0xa055, 0x0040, 0x1d3f, 0x2d60, 0x6034, 0xa0cc,
++      0x000f, 0xa9c0, 0x1c7e, 0xa986, 0x0007, 0x0040, 0x1cb7, 0xa986,
++      0x000e, 0x0040, 0x1cb7, 0xa986, 0x000f, 0x00c0, 0x1cbb, 0x605c,
++      0xa422, 0x6060, 0xa31a, 0x2804, 0xa045, 0x00c0, 0x1cc9, 0x0050,
++      0x1cc3, 0x0078, 0x1d3f, 0x6004, 0xa065, 0x0040, 0x1d3f, 0x0078,
++      0x1ca6, 0x2804, 0xa005, 0x0040, 0x1ce7, 0xac68, 0xd99c, 0x00c0,
++      0x1cd7, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0078, 0x1cdb, 0x6810,
++      0xa422, 0x6814, 0xa31b, 0x0048, 0x1d06, 0x2300, 0xa405, 0x0040,
++      0x1ced, 0x8a51, 0x0040, 0x1d3f, 0x8840, 0x0078, 0x1cc9, 0x6004,
++      0xa065, 0x0040, 0x1d3f, 0x0078, 0x1ca6, 0x8a51, 0x0040, 0x1d3f,
++      0x8840, 0x2804, 0xa005, 0x00c0, 0x1d00, 0x6004, 0xa065, 0x0040,
++      0x1d3f, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x1c7e, 0x2804, 0x2040,
++      0x2b68, 0x6850, 0xc0fc, 0x6852, 0x0078, 0x1d33, 0x8422, 0x8420,
++      0x831a, 0xa399, 0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f,
++      0xd99c, 0x00c0, 0x1d21, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300,
++      0xa11b, 0x1048, 0x12cd, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078,
++      0x1d2d, 0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048,
++      0x12cd, 0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22,
++      0x6850, 0xc0fd, 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00,
++      0x6826, 0x007f, 0x007f, 0x007f, 0xa006, 0x0078, 0x1d44, 0x087f,
++      0x097f, 0x0a7f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004,
++      0xa084, 0x0007, 0x0079, 0x1d4c, 0x1d54, 0x1d55, 0x1d58, 0x1d5b,
++      0x1d60, 0x1d63, 0x1d68, 0x1d6d, 0x007c, 0x1078, 0x1b4a, 0x007c,
++      0x1078, 0x1785, 0x007c, 0x1078, 0x1785, 0x1078, 0x1b4a, 0x007c,
++      0x1078, 0x1456, 0x007c, 0x1078, 0x1b4a, 0x1078, 0x1456, 0x007c,
++      0x1078, 0x1785, 0x1078, 0x1456, 0x007c, 0x1078, 0x1785, 0x1078,
++      0x1b4a, 0x1078, 0x1456, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079,
++      0x0200, 0x2071, 0x7c80, 0x2069, 0x7700, 0x2009, 0x0004, 0x7912,
++      0x7817, 0x0004, 0x1078, 0x2052, 0x781b, 0x0002, 0x20e1, 0x8700,
++      0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007,
++      0x0079, 0x1d92, 0x1db6, 0x1d9a, 0x1d9e, 0x1da2, 0x1da8, 0x1dac,
++      0x1db0, 0x1db4, 0x1078, 0x4298, 0x0078, 0x1db6, 0x1078, 0x42c7,
++      0x0078, 0x1db6, 0x1078, 0x4298, 0x1078, 0x42c7, 0x0078, 0x1db6,
++      0x1078, 0x1db8, 0x0078, 0x1db6, 0x1078, 0x1db8, 0x0078, 0x1db6,
++      0x1078, 0x1db8, 0x0078, 0x1db6, 0x1078, 0x1db8, 0x127f, 0x007c,
++      0x007e, 0x017e, 0x027e, 0x7930, 0xa184, 0x0003, 0x0040, 0x1dc2,
++      0x1078, 0x12cd, 0xa184, 0x0030, 0x0040, 0x1dd3, 0x6a00, 0xa286,
++      0x0003, 0x00c0, 0x1dcd, 0x1078, 0x12cd, 0x1078, 0x3591, 0x20e1,
++      0x9010, 0x0078, 0x1ddf, 0xa184, 0x00c0, 0x0040, 0x1dd9, 0x1078,
++      0x12cd, 0xa184, 0x0300, 0x0040, 0x1ddf, 0x20e1, 0x9020, 0x7932,
++      0x027f, 0x017f, 0x007f, 0x007c, 0x017e, 0x0e7e, 0x0f7e, 0x2071,
++      0x7700, 0x7128, 0x2001, 0x7923, 0x2102, 0x2001, 0x792b, 0x2102,
++      0xa182, 0x0211, 0x00c8, 0x1df8, 0x2009, 0x0008, 0x0078, 0x1e22,
++      0xa182, 0x0259, 0x00c8, 0x1e00, 0x2009, 0x0007, 0x0078, 0x1e22,
++      0xa182, 0x02c1, 0x00c8, 0x1e08, 0x2009, 0x0006, 0x0078, 0x1e22,
++      0xa182, 0x0349, 0x00c8, 0x1e10, 0x2009, 0x0005, 0x0078, 0x1e22,
++      0xa182, 0x0421, 0x00c8, 0x1e18, 0x2009, 0x0004, 0x0078, 0x1e22,
++      0xa182, 0x0581, 0x00c8, 0x1e20, 0x2009, 0x0003, 0x0078, 0x1e22,
++      0x2009, 0x0002, 0x2079, 0x0200, 0x7912, 0xa182, 0x0005, 0x00c8,
++      0x1e2c, 0x7916, 0x0078, 0x1e2e, 0x7817, 0x0004, 0x1078, 0x2052,
++      0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x127e, 0x2091, 0x2200, 0x2061,
++      0x0100, 0x2071, 0x7700, 0x6024, 0x6026, 0x6033, 0x00ef, 0x60e7,
++      0x0000, 0x60eb, 0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043,
++      0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x0caf, 0x600f,
++      0x00ff, 0x602b, 0x002f, 0x127f, 0x007c, 0x2001, 0x772d, 0x2003,
++      0x0000, 0x2001, 0x772c, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091,
++      0x2200, 0x007e, 0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0,
++      0x1e6d, 0xa184, 0x0007, 0x0079, 0x1e73, 0xa195, 0x0004, 0xa284,
++      0x0007, 0x0079, 0x1e73, 0x1e9f, 0x1e7b, 0x1e7f, 0x1e83, 0x1e89,
++      0x1e8d, 0x1e93, 0x1e99, 0x1078, 0x4802, 0x0078, 0x1e9f, 0x1078,
++      0x48f1, 0x0078, 0x1e9f, 0x1078, 0x48f1, 0x1078, 0x4802, 0x0078,
++      0x1e9f, 0x1078, 0x1ea4, 0x0078, 0x1e9f, 0x1078, 0x4802, 0x1078,
++      0x1ea4, 0x0078, 0x1e9f, 0x1078, 0x48f1, 0x1078, 0x1ea4, 0x0078,
++      0x1e9f, 0x1078, 0x48f1, 0x1078, 0x4802, 0x1078, 0x1ea4, 0x027f,
++      0x017f, 0x007f, 0x127f, 0x007c, 0xd1ac, 0x0040, 0x1f58, 0x017e,
++      0x047e, 0x0c7e, 0x644c, 0x74ba, 0xa48c, 0xff00, 0xa196, 0xff00,
++      0x0040, 0x1ed3, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040,
++      0x1ed3, 0x7130, 0xd18c, 0x00c0, 0x1ed3, 0x2011, 0x7752, 0x2214,
++      0xd2ec, 0x0040, 0x1ec7, 0xc18d, 0x7132, 0x0078, 0x1ed3, 0x6240,
++      0xa294, 0x0010, 0x0040, 0x1f15, 0x6248, 0xa294, 0xff00, 0xa296,
++      0xff00, 0x00c0, 0x1f15, 0x037e, 0x73b8, 0x2011, 0x8013, 0x1078,
++      0x2d59, 0x037f, 0x7130, 0xc185, 0x7132, 0x2011, 0x7752, 0x220c,
++      0xd1a4, 0x0040, 0x1efd, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100,
++      0x1078, 0x47d0, 0x2019, 0x000e, 0x1078, 0x75d9, 0xa484, 0x00ff,
++      0xa080, 0x2329, 0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006,
++      0x2009, 0x000e, 0x1078, 0x7641, 0x017f, 0xd1ac, 0x00c0, 0x1f06,
++      0x2019, 0x0004, 0x1078, 0x2293, 0x0078, 0x1f15, 0x157e, 0x20a9,
++      0x007f, 0x2009, 0x0000, 0x1078, 0x384c, 0x00c0, 0x1f11, 0x1078,
++      0x3637, 0x8108, 0x00f0, 0x1f0b, 0x157f, 0x0c7f, 0x047f, 0x6043,
++      0x0000, 0x2009, 0x00f7, 0x1078, 0x35fa, 0x0f7e, 0x2079, 0x7949,
++      0x783c, 0xa086, 0x0000, 0x0040, 0x1f2d, 0x6027, 0x0004, 0x783f,
++      0x0000, 0x2079, 0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003,
++      0x1078, 0x58d8, 0x2011, 0x0002, 0x1078, 0x58e2, 0x1078, 0x57ee,
++      0x1078, 0x4706, 0x037e, 0x2019, 0x0000, 0x1078, 0x5880, 0x037f,
++      0x60e3, 0x0000, 0x017f, 0x2001, 0x7700, 0x2014, 0xa296, 0x0004,
++      0x00c0, 0x1f50, 0xd19c, 0x00c0, 0x1f50, 0x6228, 0xc29d, 0x622a,
++      0x2003, 0x0001, 0x2001, 0x7720, 0x2003, 0x0000, 0x6027, 0x0020,
++      0xd194, 0x0040, 0x1ff9, 0x0f7e, 0x2079, 0x7949, 0x783c, 0xa086,
++      0x0001, 0x00c0, 0x1f7c, 0x017e, 0x6027, 0x0004, 0x783f, 0x0000,
++      0x2079, 0x0140, 0x7803, 0x1000, 0x7803, 0x0000, 0x2079, 0x7936,
++      0x7807, 0x0000, 0x7833, 0x0000, 0x1078, 0x4d96, 0x1078, 0x4e56,
++      0x017f, 0x0f7f, 0x0078, 0x1ff9, 0x0f7f, 0x017e, 0x6220, 0xd2b4,
++      0x0040, 0x1fb1, 0x1078, 0x4706, 0x1078, 0x569c, 0x6027, 0x0004,
++      0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x1f94,
++      0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0x7936,
++      0x6028, 0xa09a, 0x0002, 0x00c8, 0x1fa4, 0x8000, 0x602a, 0x0c7f,
++      0x1078, 0x568e, 0x0078, 0x1ff8, 0x2019, 0x793f, 0x2304, 0xa065,
++      0x0040, 0x1fae, 0x2009, 0x0027, 0x1078, 0x5d41, 0x0c7f, 0x0078,
++      0x1ff8, 0xd2bc, 0x0040, 0x1ff8, 0x1078, 0x4714, 0x6017, 0x0010,
++      0x6027, 0x0004, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000,
++      0x0040, 0x1fc6, 0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e,
++      0x2061, 0x7936, 0x6044, 0xa09a, 0x0002, 0x00c8, 0x1fe7, 0x8000,
++      0x6046, 0x603c, 0x0c7f, 0xa005, 0x0040, 0x1ff8, 0x1078, 0x470b,
++      0xa080, 0x0007, 0x2004, 0xa086, 0x0006, 0x00c0, 0x1fe3, 0x6017,
++      0x0012, 0x0078, 0x1ff8, 0x6017, 0x0016, 0x0078, 0x1ff8, 0x037e,
++      0x2019, 0x0001, 0x1078, 0x5880, 0x037f, 0x2019, 0x7945, 0x2304,
++      0xa065, 0x0040, 0x1ff7, 0x2009, 0x004f, 0x1078, 0x5d41, 0x0c7f,
++      0x017f, 0xd19c, 0x0040, 0x2021, 0x017e, 0x6028, 0xc09c, 0x602a,
++      0x2011, 0x0003, 0x1078, 0x58d8, 0x2011, 0x0002, 0x1078, 0x58e2,
++      0x1078, 0x57ee, 0x1078, 0x4706, 0x037e, 0x2019, 0x0000, 0x1078,
++      0x5880, 0x037f, 0x60e3, 0x0000, 0x1078, 0x76b0, 0x1078, 0x76ce,
++      0x2001, 0x7700, 0x2003, 0x0004, 0x6027, 0x0008, 0x1078, 0x11be,
++      0x017f, 0xa18c, 0xffd0, 0x6126, 0x007c, 0x007e, 0x017e, 0x027e,
++      0x0e7e, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7700, 0x71b0,
++      0x70b2, 0xa116, 0x0040, 0x204b, 0x81ff, 0x0040, 0x203d, 0x2011,
++      0x8011, 0x1078, 0x2d59, 0x0078, 0x204b, 0x2011, 0x8012, 0x1078,
++      0x2d59, 0x037e, 0x0c7e, 0x2061, 0x0100, 0x2019, 0x0028, 0x1078,
++      0x2293, 0x0c7f, 0x037f, 0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f,
++      0x007f, 0x007c, 0x0c7e, 0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100,
++      0xa190, 0x206d, 0x2204, 0x60f2, 0xa192, 0x0005, 0x00c8, 0x2064,
++      0xa190, 0x2076, 0x0078, 0x2066, 0x2011, 0x207a, 0x2204, 0x60ee,
++      0x027f, 0x007f, 0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840,
++      0x0580, 0x0420, 0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8,
++      0x01a8, 0x01a8, 0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028,
++      0x2130, 0xa094, 0xff00, 0x00c0, 0x2088, 0x81ff, 0x0040, 0x208c,
++      0x1078, 0x444b, 0x0078, 0x2093, 0xa080, 0x2329, 0x200c, 0xa18c,
++      0xff00, 0x810f, 0xa006, 0x007c, 0xa080, 0x2329, 0x200c, 0xa18c,
++      0x00ff, 0x007c, 0x20ba, 0x20be, 0x20c2, 0x20c8, 0x20ce, 0x20d4,
++      0x20da, 0x20e2, 0x20ea, 0x20f0, 0x20f6, 0x20fe, 0x2106, 0x210e,
++      0x2116, 0x2120, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a,
++      0x212a, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a, 0x212a,
++      0x212a, 0x212a, 0x107e, 0x007e, 0x0078, 0x2143, 0x107e, 0x007e,
++      0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1e5e, 0x0078, 0x2143,
++      0x107e, 0x007e, 0x1078, 0x1e5e, 0x0078, 0x2143, 0x107e, 0x007e,
++      0x1078, 0x1d45, 0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1d45,
++      0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1e5e, 0x1078, 0x1d45,
++      0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1e5e, 0x1078, 0x1d45,
++      0x0078, 0x2143, 0x107e, 0x007e, 0x1078, 0x1d8a, 0x0078, 0x2143,
++      0x107e, 0x007e, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++      0x1078, 0x1e5e, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++      0x1078, 0x1e5e, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++      0x1078, 0x1d45, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++      0x1078, 0x1d45, 0x1078, 0x1d8a, 0x0078, 0x2143, 0x107e, 0x007e,
++      0x1078, 0x1e5e, 0x1078, 0x1d45, 0x1078, 0x1d8a, 0x0078, 0x2143,
++      0x107e, 0x007e, 0x1078, 0x1e5e, 0x1078, 0x1d45, 0x1078, 0x1d8a,
++      0x0078, 0x2143, 0x0005, 0x0078, 0x212a, 0xb084, 0x003c, 0x8004,
++      0x8004, 0x0079, 0x2133, 0x2143, 0x20c0, 0x20c4, 0x20ca, 0x20d0,
++      0x20d6, 0x20dc, 0x20e4, 0x20ec, 0x20f2, 0x20f8, 0x2100, 0x2108,
++      0x2110, 0x2118, 0x2122, 0x0008, 0x212d, 0x007f, 0x107f, 0x2091,
++      0x8001, 0x007c, 0x0c7e, 0x027e, 0x2041, 0x007e, 0x70bc, 0xd09c,
++      0x0040, 0x2154, 0x2041, 0x007f, 0x2001, 0x010c, 0x203c, 0x727c,
++      0x82ff, 0x0040, 0x219f, 0x037e, 0x738c, 0xa38e, 0xffff, 0x00c0,
++      0x2163, 0x2019, 0x0001, 0x8314, 0xa2e0, 0x7dc0, 0x2c04, 0xa38c,
++      0x0001, 0x0040, 0x2170, 0xa084, 0xff00, 0x8007, 0x0078, 0x2172,
++      0xa084, 0x00ff, 0xa70e, 0x0040, 0x2194, 0xa08e, 0x00ff, 0x0040,
++      0x219a, 0x2009, 0x0000, 0x1078, 0x207f, 0x1078, 0x3811, 0x00c0,
++      0x2197, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x218e,
++      0x1078, 0x21f1, 0x0040, 0x2197, 0x0078, 0x2194, 0x1078, 0x22f5,
++      0x1078, 0x2218, 0x0040, 0x2197, 0x8318, 0x0078, 0x2163, 0x738e,
++      0x0078, 0x219c, 0x708f, 0xffff, 0x037f, 0x0078, 0x21ee, 0xa780,
++      0x2329, 0x203c, 0xa7bc, 0xff00, 0x873f, 0x708c, 0xa096, 0xffff,
++      0x0040, 0x21b1, 0xa812, 0x00c8, 0x21c1, 0x708f, 0xffff, 0x0078,
++      0x21eb, 0x2009, 0x0000, 0x70bc, 0xd09c, 0x0040, 0x21bc, 0xd094,
++      0x0040, 0x21bc, 0x2009, 0x007e, 0x2100, 0xa802, 0x20a8, 0x0078,
++      0x21c5, 0x2008, 0x2810, 0xa202, 0x20a8, 0x2700, 0x157e, 0x017e,
++      0xa106, 0x0040, 0x21e2, 0x1078, 0x3811, 0x00c0, 0x21eb, 0x6004,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x21dc, 0x1078, 0x21f1,
++      0x0040, 0x21eb, 0x0078, 0x21e2, 0x1078, 0x22f5, 0x1078, 0x2218,
++      0x0040, 0x21eb, 0x017f, 0x8108, 0x157f, 0x00f0, 0x21c5, 0x708f,
++      0xffff, 0x0078, 0x21ee, 0x017f, 0x157f, 0x718e, 0x027f, 0x0c7f,
++      0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5cb4,
++      0x0040, 0x2213, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000,
++      0x1078, 0x37e0, 0x2001, 0x0000, 0x1078, 0x37f4, 0x127e, 0x2091,
++      0x8000, 0x7088, 0x8000, 0x708a, 0x127f, 0x2009, 0x0004, 0x1078,
++      0x5d41, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c,
++      0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5cb4, 0x0040,
++      0x223a, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++      0x37e0, 0x2001, 0x0002, 0x1078, 0x37f4, 0x127e, 0x2091, 0x8000,
++      0x7088, 0x8000, 0x708a, 0x127f, 0x2009, 0x0002, 0x1078, 0x5d41,
++      0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++      0x027e, 0x2009, 0x0080, 0x1078, 0x3811, 0x00c0, 0x224d, 0x1078,
++      0x2250, 0x0040, 0x224d, 0x70c3, 0xffff, 0x027f, 0x0c7f, 0x007c,
++      0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5cb4, 0x0040,
++      0x2272, 0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078,
++      0x37e0, 0x2001, 0x0002, 0x1078, 0x37f4, 0x127e, 0x2091, 0x8000,
++      0x70c4, 0x8000, 0x70c6, 0x127f, 0x2009, 0x0002, 0x1078, 0x5d41,
++      0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e,
++      0x0d7e, 0x2009, 0x007f, 0x1078, 0x3811, 0x00c0, 0x2290, 0x2c68,
++      0x1078, 0x5cb4, 0x0040, 0x2290, 0x2d00, 0x601a, 0x6312, 0x601f,
++      0x0001, 0x620a, 0x2009, 0x0022, 0x1078, 0x5d41, 0xa085, 0x0001,
++      0x0d7f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x067e, 0x037e, 0x027e,
++      0x1078, 0x4a85, 0x1078, 0x4a35, 0x1078, 0x6219, 0x20a9, 0x007f,
++      0x2009, 0x0000, 0x017e, 0x1078, 0x384c, 0x00c0, 0x22ab, 0x1078,
++      0x3a36, 0x1078, 0x3637, 0x017f, 0x8108, 0x00f0, 0x22a2, 0x027f,
++      0x037f, 0x067f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x037e,
++      0x027e, 0x017e, 0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029,
++      0x1078, 0x4a7e, 0x1078, 0x49c1, 0x2c08, 0x1078, 0x747b, 0x017f,
++      0x2e60, 0x1078, 0x3a36, 0x6210, 0x6314, 0x1078, 0x3637, 0x6212,
++      0x6316, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e,
++      0x007e, 0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x22eb,
++      0x2071, 0x7700, 0x7088, 0xa005, 0x0040, 0x22e8, 0x8001, 0x708a,
++      0x007f, 0x0e7f, 0x007c, 0x2071, 0x7700, 0x70c4, 0xa005, 0x0040,
++      0x22e8, 0x8001, 0x70c6, 0x0078, 0x22e8, 0x6000, 0xc08c, 0x6002,
++      0x007c, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x81ff,
++      0x00c0, 0x2306, 0x20a9, 0x0001, 0x0078, 0x230a, 0x20a9, 0x007f,
++      0x2011, 0x0000, 0x027e, 0xa2e0, 0x7820, 0x2c64, 0x8cff, 0x0040,
++      0x231c, 0x2019, 0x0029, 0x1078, 0x4a7e, 0x1078, 0x49c1, 0x2c08,
++      0x1078, 0x747b, 0x1078, 0x3a36, 0x027f, 0x8210, 0x00f0, 0x230a,
++      0x027e, 0x027f, 0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f,
++      0x007c, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc,
++      0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1,
++      0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6,
++      0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4,
++      0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa,
++      0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d,
++      0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282,
++      0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074,
++      0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a,
++      0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559,
++      0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d,
++      0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043,
++      0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932,
++      0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227,
++      0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18,
++      0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000,
++      0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000,
++      0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00,
++      0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900,
++      0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200,
++      0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00,
++      0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600,
++      0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00,
++      0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900,
++      0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000,
++      0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000,
++      0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x2071, 0x776d, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016,
++      0x703a, 0x703e, 0x7033, 0x777d, 0x7037, 0x777d, 0x7007, 0x0001,
++      0x2061, 0x77bd, 0x6003, 0x0002, 0x007c, 0x0090, 0x2450, 0x0068,
++      0x2450, 0x2071, 0x776d, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2450,
++      0x2a60, 0x7820, 0xa08e, 0x0069, 0x00c0, 0x2537, 0x0079, 0x24d4,
++      0x007c, 0x2071, 0x776d, 0x7004, 0x0079, 0x2456, 0x245a, 0x245b,
++      0x2465, 0x2477, 0x007c, 0x0090, 0x2464, 0x0068, 0x2464, 0x2b78,
++      0x7818, 0xd084, 0x0040, 0x2483, 0x007c, 0x2b78, 0x2061, 0x77bd,
++      0x6008, 0xa08e, 0x0100, 0x0040, 0x2472, 0xa086, 0x0200, 0x0040,
++      0x252f, 0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010,
++      0x2068, 0x6834, 0xa086, 0x0103, 0x0040, 0x247f, 0x007c, 0x2a60,
++      0x2b78, 0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8,
++      0x248c, 0x61b0, 0x0079, 0x2494, 0x2100, 0xa08a, 0x0036, 0x00c8,
++      0x252b, 0x61b0, 0x0079, 0x24d4, 0x250d, 0x253f, 0x2547, 0x254b,
++      0x2553, 0x2559, 0x255d, 0x2566, 0x256a, 0x2572, 0x2576, 0x252b,
++      0x252b, 0x252b, 0x257a, 0x252b, 0x258a, 0x25a1, 0x25b8, 0x2634,
++      0x2639, 0x2666, 0x26c0, 0x26d1, 0x26ef, 0x2722, 0x272c, 0x2739,
++      0x274c, 0x2766, 0x276f, 0x27ac, 0x27b2, 0x252b, 0x27c2, 0x252b,
++      0x252b, 0x252b, 0x252b, 0x252b, 0x27c6, 0x27cc, 0x252b, 0x252b,
++      0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x27d4, 0x252b,
++      0x252b, 0x252b, 0x252b, 0x252b, 0x27e1, 0x27e7, 0x252b, 0x252b,
++      0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b,
++      0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b,
++      0x252b, 0x252b, 0x252b, 0x252b, 0x2572, 0x2576, 0x252b, 0x252b,
++      0x27f9, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b, 0x252b,
++      0x252b, 0x252b, 0x252b, 0x252b, 0x2846, 0x2913, 0x2927, 0x292e,
++      0x2991, 0x29e2, 0x29ed, 0x2a2c, 0x2a3b, 0x2a4a, 0x2a4d, 0x27fd,
++      0x2a76, 0x2abd, 0x2aca, 0x2bc5, 0x2cb3, 0x2cda, 0x2de4, 0x2df2,
++      0x2dff, 0x2e39, 0x713c, 0x0078, 0x250d, 0x2021, 0x4000, 0x1078,
++      0x2d33, 0x127e, 0x2091, 0x8000, 0x0068, 0x251a, 0x7818, 0xd084,
++      0x0040, 0x251d, 0x127f, 0x0078, 0x2511, 0x781b, 0x0001, 0x7c22,
++      0x7926, 0x7a2a, 0x7b2e, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091,
++      0x5000, 0x127f, 0x007c, 0x2021, 0x4001, 0x0078, 0x250f, 0x2021,
++      0x4002, 0x0078, 0x250f, 0x2021, 0x4003, 0x0078, 0x250f, 0x2021,
++      0x4005, 0x0078, 0x250f, 0x2021, 0x4006, 0x0078, 0x250f, 0xa02e,
++      0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x2d42, 0x7823,
++      0x0004, 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824,
++      0x7930, 0x0078, 0x2d46, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078,
++      0x250d, 0x7924, 0x2114, 0x0078, 0x250d, 0x2099, 0x0009, 0x20a1,
++      0x0009, 0x20a9, 0x0007, 0x53a3, 0x0078, 0x250d, 0x7824, 0x2060,
++      0x0078, 0x257c, 0x2009, 0x0001, 0x2011, 0x000f, 0x2019, 0x0025,
++      0x0078, 0x250d, 0x7d38, 0x7c3c, 0x0078, 0x2541, 0x7d38, 0x7c3c,
++      0x0078, 0x254d, 0x2061, 0x1000, 0x610c, 0xa006, 0x2c14, 0xa200,
++      0x8c60, 0x8109, 0x00c0, 0x257e, 0x2010, 0xa005, 0x0040, 0x250d,
++      0x0078, 0x2533, 0x2061, 0x7751, 0x7824, 0x7930, 0xa11a, 0x00c8,
++      0x253b, 0x8019, 0x0040, 0x253b, 0x604a, 0x6142, 0x782c, 0x6052,
++      0x7828, 0x6056, 0xa006, 0x605a, 0x605e, 0x1078, 0x3d89, 0x0078,
++      0x250d, 0x2061, 0x7751, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x253b,
++      0x8019, 0x0040, 0x253b, 0x604e, 0x6146, 0x782c, 0x6062, 0x7828,
++      0x6066, 0xa006, 0x606a, 0x606e, 0x1078, 0x3b5f, 0x0078, 0x250d,
++      0xa02e, 0x2520, 0x81ff, 0x00c0, 0x2537, 0x7924, 0x7b28, 0x7a2c,
++      0x20a9, 0x0005, 0x20a1, 0x7774, 0x41a1, 0x1078, 0x2cf8, 0x0040,
++      0x2537, 0x2009, 0x0020, 0x1078, 0x2d42, 0x701b, 0x25d0, 0x007c,
++      0x6834, 0x2008, 0xa084, 0x00ff, 0xa096, 0x0011, 0x0040, 0x25dc,
++      0xa096, 0x0019, 0x00c0, 0x2537, 0x810f, 0xa18c, 0x00ff, 0x0040,
++      0x2537, 0x710e, 0x700c, 0x8001, 0x0040, 0x260d, 0x700e, 0x1078,
++      0x2cf8, 0x0040, 0x2537, 0x2009, 0x0020, 0x2061, 0x77bd, 0x6224,
++      0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1,
++      0x0000, 0xa5a9, 0x0000, 0x1078, 0x2d42, 0x701b, 0x2600, 0x007c,
++      0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0040, 0x260b, 0xa096,
++      0x000a, 0x00c0, 0x2537, 0x0078, 0x25e2, 0x7010, 0x2068, 0x6838,
++      0xc0fd, 0x683a, 0x1078, 0x3744, 0x00c0, 0x261b, 0x7007, 0x0003,
++      0x701b, 0x261d, 0x007c, 0x1078, 0x3c22, 0x127e, 0x2091, 0x8000,
++      0x20a9, 0x0005, 0x2099, 0x7774, 0x530a, 0x2100, 0xa210, 0xa399,
++      0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009,
++      0x0020, 0x127f, 0x0078, 0x2d46, 0x6198, 0x7824, 0x609a, 0x0078,
++      0x250d, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953, 0x782b,
++      0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832, 0x3f00,
++      0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007,
++      0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, 0x0001,
++      0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0,
++      0xa08a, 0x0003, 0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff, 0x00c0,
++      0x2537, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x384c, 0x00c0,
++      0x253b, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, 0x267a,
++      0x0078, 0x253b, 0x7c28, 0x7d2c, 0x1078, 0x39fd, 0xd28c, 0x00c0,
++      0x2685, 0x1078, 0x3991, 0x0078, 0x2687, 0x1078, 0x39cb, 0x00c0,
++      0x26b1, 0x2061, 0x7e00, 0x127e, 0x2091, 0x8000, 0x6000, 0xa086,
++      0x0000, 0x0040, 0x269f, 0x6010, 0xa06d, 0x0040, 0x269f, 0x683c,
++      0xa406, 0x00c0, 0x269f, 0x6840, 0xa506, 0x0040, 0x26aa, 0x127f,
++      0xace0, 0x0008, 0x2001, 0x7715, 0x2004, 0xac02, 0x00c8, 0x2537,
++      0x0078, 0x268b, 0x1078, 0x6852, 0x127f, 0x0040, 0x2537, 0x0078,
++      0x250d, 0xa00e, 0x2001, 0x0005, 0x1078, 0x3c22, 0x127e, 0x2091,
++      0x8000, 0x1078, 0x6c5c, 0x1078, 0x3b92, 0x127f, 0x0078, 0x250d,
++      0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d10, 0x0040, 0x253b, 0x1078,
++      0x38d5, 0x0040, 0x2537, 0x1078, 0x3a0a, 0x0040, 0x2537, 0x0078,
++      0x250d, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d22, 0x0040, 0x253b,
++      0x1078, 0x3a71, 0x0040, 0x2537, 0x2019, 0x0005, 0x1078, 0x3a2b,
++      0x0040, 0x2537, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x253b, 0x8003,
++      0x800b, 0x810b, 0xa108, 0x1078, 0x4696, 0x0078, 0x250d, 0x127e,
++      0x2091, 0x8000, 0x81ff, 0x00c0, 0x271c, 0x2029, 0x00ff, 0x644c,
++      0x2400, 0xa506, 0x0040, 0x2716, 0x2508, 0x1078, 0x384c, 0x00c0,
++      0x2716, 0x1078, 0x3a71, 0x0040, 0x271c, 0x2019, 0x0004, 0x1078,
++      0x3a2b, 0x0040, 0x271c, 0x7824, 0xa08a, 0x1000, 0x00c8, 0x271f,
++      0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x4696, 0x8529, 0x00c8,
++      0x26f8, 0x127f, 0x0078, 0x250d, 0x127f, 0x0078, 0x2537, 0x127f,
++      0x0078, 0x253b, 0x1078, 0x2d10, 0x0040, 0x253b, 0x1078, 0x3942,
++      0x1078, 0x39fd, 0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x1078,
++      0x2d10, 0x0040, 0x253b, 0x1078, 0x3931, 0x1078, 0x39fd, 0x0078,
++      0x250d, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d10, 0x0040, 0x253b,
++      0x1078, 0x39ce, 0x0040, 0x2537, 0x1078, 0x378d, 0x1078, 0x398a,
++      0x1078, 0x39fd, 0x0078, 0x250d, 0x1078, 0x2d10, 0x0040, 0x253b,
++      0x1078, 0x38d5, 0x0040, 0x2537, 0x62a0, 0x2019, 0x0005, 0x0c7e,
++      0x1078, 0x3a36, 0x0c7f, 0x1078, 0x4a7e, 0x1078, 0x49c1, 0x2c08,
++      0x1078, 0x747b, 0x1078, 0x39fd, 0x0078, 0x250d, 0x1078, 0x2d10,
++      0x0040, 0x253b, 0x1078, 0x39fd, 0x2208, 0x0078, 0x250d, 0x157e,
++      0x0d7e, 0x0e7e, 0x2069, 0x77ff, 0x6810, 0x6914, 0xa10a, 0x00c8,
++      0x277b, 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000,
++      0x20a9, 0x007e, 0x2069, 0x7820, 0x2d04, 0xa075, 0x0040, 0x2790,
++      0x704c, 0x1078, 0x279a, 0xa210, 0x7080, 0x1078, 0x279a, 0xa318,
++      0x8d68, 0x00f0, 0x2784, 0x2300, 0xa218, 0x0e7f, 0x0d7f, 0x157f,
++      0x0078, 0x250d, 0x0f7e, 0x017e, 0xa07d, 0x0040, 0x27a9, 0x2001,
++      0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0040, 0x27a9, 0x2178, 0x0078,
++      0x27a1, 0x017f, 0x0f7f, 0x007c, 0x2069, 0x77ff, 0x6910, 0x629c,
++      0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x614c, 0xa190, 0x2329,
++      0x2214, 0xa294, 0x00ff, 0x6068, 0xa084, 0xff00, 0xa215, 0x6364,
++      0x0078, 0x250d, 0x613c, 0x6240, 0x0078, 0x250d, 0x1078, 0x2d22,
++      0x0040, 0x253b, 0x0078, 0x250d, 0x1078, 0x2d22, 0x0040, 0x253b,
++      0x6244, 0x6338, 0x0078, 0x250d, 0x613c, 0x6240, 0x7824, 0x603e,
++      0x7b28, 0x6342, 0x2069, 0x7751, 0x831f, 0xa305, 0x6816, 0x0078,
++      0x250d, 0x1078, 0x2d22, 0x0040, 0x253b, 0x0078, 0x250d, 0x1078,
++      0x2d22, 0x0040, 0x253b, 0x7828, 0xa00d, 0x0040, 0x253b, 0x782c,
++      0xa005, 0x0040, 0x253b, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078,
++      0x250d, 0x7d38, 0x7c3c, 0x0078, 0x25ba, 0x7824, 0xa09c, 0x00ff,
++      0xa39a, 0x0003, 0x00c8, 0x2537, 0x624c, 0xa084, 0xff00, 0x8007,
++      0xa206, 0x00c0, 0x2815, 0x2001, 0x7740, 0x2009, 0x000c, 0x7a2c,
++      0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d46, 0x81ff, 0x00c0, 0x2537,
++      0x1078, 0x2d22, 0x0040, 0x253b, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x00c0, 0x2537, 0x0c7e, 0x1078, 0x2cf8, 0x0c7f, 0x0040,
++      0x2537, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x6b56,
++      0x0040, 0x2537, 0x7007, 0x0003, 0x701b, 0x2837, 0x007c, 0x6830,
++      0xa086, 0x0100, 0x0040, 0x2537, 0xad80, 0x000e, 0x2009, 0x000c,
++      0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d46, 0x1078, 0x2cf8,
++      0x0040, 0x2537, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++      0x1078, 0x2d42, 0x701b, 0x2855, 0x007c, 0xade8, 0x000d, 0x6800,
++      0xa005, 0x0040, 0x253b, 0x6804, 0xd0ac, 0x0040, 0x2862, 0xd0a4,
++      0x0040, 0x253b, 0xd094, 0x0040, 0x286d, 0x0c7e, 0x2061, 0x0100,
++      0x6104, 0xa18c, 0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x2878,
++      0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f,
++      0x2009, 0x0100, 0x210c, 0xa18a, 0x0002, 0x0048, 0x288d, 0xd084,
++      0x0040, 0x288d, 0x6a28, 0xa28a, 0x007f, 0x00c8, 0x253b, 0xa288,
++      0x2329, 0x210c, 0xa18c, 0x00ff, 0x6152, 0xd0dc, 0x0040, 0x2896,
++      0x6828, 0xa08a, 0x007f, 0x00c8, 0x253b, 0x604e, 0x6808, 0xa08a,
++      0x0100, 0x0048, 0x253b, 0xa08a, 0x0841, 0x00c8, 0x253b, 0xa084,
++      0x0007, 0x00c0, 0x253b, 0x680c, 0xa005, 0x0040, 0x253b, 0x6810,
++      0xa005, 0x0040, 0x253b, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x253b,
++      0x8001, 0x0040, 0x253b, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x253b,
++      0x8001, 0x0040, 0x253b, 0x20a9, 0x001c, 0x2d98, 0x2069, 0x7751,
++      0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x613e, 0x8007, 0xa084,
++      0x00ff, 0x6042, 0x1078, 0x3d89, 0x1078, 0x3b5f, 0x6000, 0xa086,
++      0x0000, 0x00c0, 0x2911, 0x6808, 0x602a, 0x1078, 0x1de4, 0x6818,
++      0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016,
++      0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0040, 0x28f1, 0x6830,
++      0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0078,
++      0x28f3, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x1078,
++      0x4722, 0x0c7e, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000,
++      0x0c7f, 0x60b4, 0xa005, 0x0040, 0x290d, 0x6003, 0x0001, 0x2091,
++      0x301d, 0x1078, 0x3591, 0x0078, 0x2911, 0x6003, 0x0004, 0x2091,
++      0x301d, 0x0078, 0x250d, 0x6000, 0xa086, 0x0000, 0x0040, 0x2537,
++      0x2069, 0x7751, 0x7830, 0x6842, 0x7834, 0x6846, 0x2d00, 0x2009,
++      0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d46, 0x81ff,
++      0x00c0, 0x2537, 0x1078, 0x3591, 0x0078, 0x250d, 0x81ff, 0x00c0,
++      0x2537, 0x617c, 0x81ff, 0x0040, 0x2948, 0x703f, 0x0000, 0x2001,
++      0x7dc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x127e,
++      0x2091, 0x8000, 0x1078, 0x2d46, 0x701b, 0x250a, 0x127f, 0x007c,
++      0x703f, 0x0001, 0x0d7e, 0x2069, 0x7dc0, 0x20a9, 0x0040, 0x20a1,
++      0x7dc0, 0x2019, 0xffff, 0x43a4, 0x654c, 0xa588, 0x2329, 0x210c,
++      0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506,
++      0x0040, 0x297a, 0x1078, 0x384c, 0x00c0, 0x297a, 0x6014, 0x821c,
++      0x0048, 0x2972, 0xa398, 0x7dc0, 0xa085, 0xff00, 0x8007, 0x201a,
++      0x0078, 0x2979, 0xa398, 0x7dc0, 0x2324, 0xa4a4, 0xff00, 0xa405,
++      0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8, 0x2981, 0x0078,
++      0x295e, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x0d7f, 0x20a9,
++      0x0040, 0x20a1, 0x7dc0, 0x2099, 0x7dc0, 0x1078, 0x35da, 0x0078,
++      0x2937, 0x1078, 0x2d22, 0x0040, 0x253b, 0x0c7e, 0x1078, 0x2cf8,
++      0x0c7f, 0x0040, 0x2537, 0x2001, 0x7752, 0x2004, 0xd0b4, 0x0040,
++      0x29be, 0x6000, 0xd08c, 0x00c0, 0x29be, 0x6004, 0xa084, 0x00ff,
++      0xa086, 0x0006, 0x00c0, 0x29be, 0x6837, 0x0000, 0x6838, 0xc0fd,
++      0x683a, 0x1078, 0x6b8e, 0x0040, 0x2537, 0x7007, 0x0003, 0x701b,
++      0x29ba, 0x007c, 0x1078, 0x2d22, 0x0040, 0x253b, 0x20a9, 0x002b,
++      0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80,
++      0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x1078, 0x35da, 0x20a9,
++      0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x1078,
++      0x35da, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++      0x0078, 0x2d46, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d10, 0x0040,
++      0x253b, 0x1078, 0x3a15, 0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537,
++      0x7828, 0xa08a, 0x1000, 0x00c8, 0x253b, 0x1078, 0x2d22, 0x0040,
++      0x253b, 0x1078, 0x3a71, 0x0040, 0x2537, 0x2019, 0x0004, 0x1078,
++      0x3a2b, 0x7924, 0x810f, 0x7a28, 0x1078, 0x2a08, 0x0078, 0x250d,
++      0xa186, 0x00ff, 0x0040, 0x2a10, 0x1078, 0x2a20, 0x0078, 0x2a1f,
++      0x2029, 0x007e, 0x2061, 0x7700, 0x644c, 0x2400, 0xa506, 0x0040,
++      0x2a1c, 0x2508, 0x1078, 0x2a20, 0x8529, 0x00c8, 0x2a15, 0x007c,
++      0x1078, 0x384c, 0x00c0, 0x2a2b, 0x2200, 0x8003, 0x800b, 0x810b,
++      0xa108, 0x1078, 0x4696, 0x007c, 0x81ff, 0x00c0, 0x2537, 0x1078,
++      0x2d10, 0x0040, 0x253b, 0x1078, 0x38d5, 0x0040, 0x2537, 0x1078,
++      0x3a20, 0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2d10,
++      0x0040, 0x253b, 0x1078, 0x38d5, 0x0040, 0x2537, 0x1078, 0x3a0a,
++      0x0078, 0x250d, 0x6100, 0x0078, 0x250d, 0x1078, 0x2d22, 0x0040,
++      0x253b, 0x6004, 0xa086, 0x0707, 0x0040, 0x253b, 0x2001, 0x7700,
++      0x2004, 0xa086, 0x0003, 0x00c0, 0x2537, 0x0d7e, 0xace8, 0x000a,
++      0x7924, 0xd184, 0x0040, 0x2a66, 0xace8, 0x0006, 0x680c, 0x8007,
++      0x783e, 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, 0x6a00, 0x8217,
++      0x0d7f, 0x6100, 0xa18c, 0x0200, 0x0078, 0x250d, 0x7824, 0xa084,
++      0x00ff, 0xa086, 0x00ff, 0x0040, 0x2a80, 0x81ff, 0x00c0, 0x2537,
++      0x7828, 0xa08a, 0x1000, 0x00c8, 0x253b, 0x7924, 0xa18c, 0xff00,
++      0x810f, 0xa186, 0x00ff, 0x0040, 0x2a94, 0xa182, 0x007f, 0x00c8,
++      0x253b, 0x2100, 0x1078, 0x2094, 0x027e, 0x0c7e, 0x127e, 0x2091,
++      0x8000, 0x2061, 0x7949, 0x601b, 0x0000, 0x601f, 0x0000, 0x2061,
++      0x0100, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043,
++      0x0090, 0x6043, 0x0010, 0x2009, 0x001e, 0x2011, 0x35b6, 0x1078,
++      0x4719, 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078, 0x2a08,
++      0x127f, 0x0c7f, 0x027f, 0x0078, 0x250d, 0x7924, 0xa18c, 0xff00,
++      0x810f, 0x0c7e, 0x1078, 0x3811, 0x2c08, 0x0c7f, 0x00c0, 0x253b,
++      0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x60bc, 0xd09c, 0x0040,
++      0x2537, 0x1078, 0x2cf8, 0x0040, 0x2537, 0x6823, 0x0000, 0x7924,
++      0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2d42, 0x701b, 0x2ae1,
++      0x007c, 0x2009, 0x0080, 0x1078, 0x384c, 0x00c0, 0x2aee, 0x6004,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x0040, 0x2af2, 0x2021, 0x400a,
++      0x0078, 0x250f, 0x0d7e, 0xade8, 0x000d, 0x6900, 0x6a08, 0x6b0c,
++      0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0040, 0x2b65,
++      0xa0be, 0x0112, 0x0040, 0x2b65, 0xa0be, 0x0113, 0x0040, 0x2b65,
++      0xa0be, 0x0114, 0x0040, 0x2b65, 0xa0be, 0x0117, 0x0040, 0x2b65,
++      0xa0be, 0x011a, 0x0040, 0x2b65, 0xa0be, 0x0121, 0x0040, 0x2b5b,
++      0xa0be, 0x0131, 0x0040, 0x2b5b, 0xa0be, 0x0171, 0x0040, 0x2b65,
++      0xa0be, 0x0173, 0x0040, 0x2b65, 0xa0be, 0x01a1, 0x00c0, 0x2b2d,
++      0x6830, 0x8007, 0x6832, 0x0078, 0x2b6b, 0xa0be, 0x0212, 0x0040,
++      0x2b61, 0xa0be, 0x0213, 0x0040, 0x2b61, 0xa0be, 0x0214, 0x0040,
++      0x2b53, 0xa0be, 0x0217, 0x0040, 0x2b4d, 0xa0be, 0x021a, 0x00c0,
++      0x2b46, 0x6838, 0x8007, 0x683a, 0x0078, 0x2b65, 0xa0be, 0x0300,
++      0x0040, 0x2b65, 0x0d7f, 0x0078, 0x253b, 0xad80, 0x0010, 0x20a9,
++      0x0007, 0x1078, 0x2ba1, 0xad80, 0x000e, 0x20a9, 0x0001, 0x1078,
++      0x2ba1, 0x0078, 0x2b65, 0xad80, 0x000c, 0x1078, 0x2baf, 0x0078,
++      0x2b6b, 0xad80, 0x000e, 0x1078, 0x2baf, 0xad80, 0x000c, 0x20a9,
++      0x0001, 0x1078, 0x2ba1, 0x0c7e, 0x1078, 0x2cf8, 0x0040, 0x2b96,
++      0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, 0x684f, 0x0020, 0x685b,
++      0x0001, 0x810b, 0x697e, 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e,
++      0x6d92, 0x6996, 0x689b, 0x0000, 0x0c7f, 0x0d7f, 0x6837, 0x0000,
++      0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x1078, 0x6b72, 0x0040,
++      0x2537, 0x7007, 0x0003, 0x701b, 0x2b9a, 0x007c, 0x0c7f, 0x0d7f,
++      0x0078, 0x2537, 0x6820, 0xa086, 0x8001, 0x0040, 0x2537, 0x0078,
++      0x250d, 0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a,
++      0x8108, 0x280a, 0x8108, 0x00f0, 0x2ba3, 0x017f, 0x007c, 0x017e,
++      0x0a7e, 0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054,
++      0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108,
++      0x280a, 0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x00c0, 0x2537,
++      0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048,
++      0x253b, 0xa182, 0x00ff, 0x00c8, 0x253b, 0x7a2c, 0x7b28, 0x6064,
++      0xa306, 0x00c0, 0x2be3, 0x6068, 0xa24e, 0x0040, 0x253b, 0xa9cc,
++      0xff00, 0x0040, 0x253b, 0x0c7e, 0x1078, 0x2c57, 0x2c68, 0x0c7f,
++      0x0040, 0x2c0a, 0xa0c6, 0x4000, 0x00c0, 0x2bf0, 0x0078, 0x2c07,
++      0xa0c6, 0x4007, 0x00c0, 0x2bf7, 0x2408, 0x0078, 0x2c07, 0xa0c6,
++      0x4008, 0x00c0, 0x2bff, 0x2708, 0x2610, 0x0078, 0x2c07, 0xa0c6,
++      0x4009, 0x00c0, 0x2c05, 0x0078, 0x2c07, 0x2001, 0x4006, 0x2020,
++      0x0078, 0x250f, 0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078,
++      0x5cb4, 0x0040, 0x2c45, 0x2d00, 0x601a, 0x2e58, 0x0e7f, 0x0e7e,
++      0x0c7e, 0x1078, 0x2cf8, 0x0c7f, 0x2b70, 0x0040, 0x2537, 0x6837,
++      0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++      0x127e, 0x2091, 0x8000, 0x1078, 0x22b5, 0x127f, 0x601f, 0x0001,
++      0x2001, 0x0000, 0x1078, 0x37e0, 0x2001, 0x0002, 0x1078, 0x37f4,
++      0x127e, 0x2091, 0x8000, 0x7088, 0x8000, 0x708a, 0x127f, 0x2009,
++      0x0002, 0x1078, 0x5d41, 0xa085, 0x0001, 0x0e7f, 0x0c7f, 0x0b7f,
++      0x017f, 0x0040, 0x2537, 0x7007, 0x0003, 0x701b, 0x2c50, 0x007c,
++      0x6830, 0xa086, 0x0100, 0x00c0, 0x250d, 0x0078, 0x2537, 0x0e7e,
++      0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071,
++      0x78a0, 0x2e04, 0xa005, 0x00c0, 0x2c6b, 0x2100, 0xa406, 0x0040,
++      0x2ca8, 0x0078, 0x2c9c, 0x2068, 0x6f10, 0x2700, 0xa306, 0x00c0,
++      0x2c8d, 0x6e14, 0x2600, 0xa206, 0x00c0, 0x2c8d, 0x2400, 0xa106,
++      0x00c0, 0x2c89, 0x2d60, 0xd884, 0x0040, 0x2cae, 0x6004, 0xa084,
++      0x00ff, 0xa086, 0x0006, 0x00c0, 0x2cae, 0x2001, 0x4000, 0x0078,
++      0x2caf, 0x2001, 0x4007, 0x0078, 0x2caf, 0x2400, 0xa106, 0x00c0,
++      0x2c9c, 0x6e14, 0x87ff, 0x00c0, 0x2c98, 0x86ff, 0x0040, 0x2ca8,
++      0x2001, 0x4008, 0x0078, 0x2caf, 0x8420, 0x8e70, 0x00f0, 0x2c61,
++      0x2001, 0x4009, 0x0078, 0x2caf, 0x2001, 0x0001, 0x0078, 0x2caf,
++      0x1078, 0x3811, 0x00c0, 0x2ca4, 0x6312, 0x6216, 0xa006, 0xa005,
++      0x0d7f, 0x0e7f, 0x007c, 0x81ff, 0x00c0, 0x2537, 0x1078, 0x2cf8,
++      0x0040, 0x2537, 0x6837, 0x0000, 0x7824, 0xa005, 0x0040, 0x253b,
++      0xa096, 0x00ff, 0x0040, 0x2cc8, 0xa092, 0x0004, 0x00c8, 0x253b,
++      0x2010, 0x2d18, 0x1078, 0x2277, 0x0040, 0x2537, 0x7007, 0x0003,
++      0x701b, 0x2cd3, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2537,
++      0x0078, 0x250d, 0x81ff, 0x00c0, 0x2537, 0x7924, 0xa18c, 0xff00,
++      0x810f, 0xa182, 0x0080, 0x0048, 0x253b, 0xa182, 0x00ff, 0x00c8,
++      0x253b, 0x127e, 0x2091, 0x8000, 0x1078, 0x6a99, 0x00c0, 0x2cf5,
++      0x1078, 0x3834, 0x127f, 0x0078, 0x250d, 0x127f, 0x0078, 0x2537,
++      0x1078, 0x1327, 0x0040, 0x2d0f, 0xa006, 0x6802, 0x7010, 0xa005,
++      0x00c0, 0x2d07, 0x2d00, 0x7012, 0x7016, 0x0078, 0x2d0d, 0x7014,
++      0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, 0x000d, 0x007c,
++      0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x384c, 0x00c0, 0x2d1f,
++      0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, 0x2d20, 0xa066,
++      0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x1078, 0x384c,
++      0x00c0, 0x2d30, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0048, 0x2d31,
++      0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff, 0x0040, 0x2d3e,
++      0x2168, 0x6904, 0x1078, 0x1340, 0x0078, 0x2d35, 0x7112, 0x7116,
++      0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x2d48, 0x2031, 0x0000,
++      0x2061, 0x77bd, 0x6606, 0x6112, 0x600e, 0x6226, 0x632a, 0x642e,
++      0x6532, 0x2c10, 0x1078, 0x1377, 0x7007, 0x0002, 0x701b, 0x250d,
++      0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001,
++      0x777b, 0x2004, 0xa005, 0x00c0, 0x2d74, 0x0068, 0x2d74, 0x7818,
++      0xd084, 0x00c0, 0x2d74, 0x781b, 0x0001, 0x7a22, 0x7b26, 0x7c2a,
++      0x2091, 0x4080, 0x0078, 0x2d99, 0x017e, 0x0c7e, 0x0e7e, 0x2071,
++      0x776d, 0x7138, 0xa182, 0x0008, 0x0048, 0x2d82, 0x7030, 0x2060,
++      0x0078, 0x2d93, 0x7030, 0xa0e0, 0x0008, 0xac82, 0x77bd, 0x0048,
++      0x2d8b, 0x2061, 0x777d, 0x2c00, 0x7032, 0x81ff, 0x00c0, 0x2d91,
++      0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a, 0x0e7f, 0x0c7f,
++      0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071, 0x776d, 0x7038,
++      0xa005, 0x0040, 0x2dd5, 0x127e, 0x2091, 0x8000, 0x0068, 0x2dd4,
++      0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x2dd3, 0x0c7e,
++      0x781b, 0x0001, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826,
++      0x6008, 0x782a, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a, 0xa005,
++      0x00c0, 0x2dc9, 0x7033, 0x777d, 0x7037, 0x777d, 0x0c7f, 0x0078,
++      0x2dd3, 0xac80, 0x0008, 0xa0fa, 0x77bd, 0x0048, 0x2dd1, 0x2001,
++      0x777d, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f, 0x007c, 0x027e,
++      0x2001, 0x7752, 0x2004, 0xd0c4, 0x0040, 0x2de2, 0x2011, 0x8014,
++      0x1078, 0x2d59, 0x027f, 0x007c, 0x81ff, 0x00c0, 0x2537, 0x127e,
++      0x2091, 0x8000, 0x6030, 0xc08d, 0x6032, 0x1078, 0x3591, 0x127f,
++      0x0078, 0x250d, 0x7824, 0x2008, 0xa18c, 0xfffd, 0x00c0, 0x2dfd,
++      0x61c8, 0xa10d, 0x61ca, 0x0078, 0x250d, 0x0078, 0x253b, 0x81ff,
++      0x00c0, 0x2537, 0x6000, 0xa086, 0x0003, 0x00c0, 0x2537, 0x2001,
++      0x7752, 0x2004, 0xd0a4, 0x00c0, 0x2537, 0x1078, 0x2d22, 0x0040,
++      0x253b, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2e1c,
++      0x7828, 0xa005, 0x0040, 0x250d, 0x0c7e, 0x1078, 0x2cf8, 0x0c7f,
++      0x0040, 0x2537, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd,
++      0x683a, 0x1078, 0x6bfb, 0x0040, 0x2537, 0x7007, 0x0003, 0x701b,
++      0x2e32, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2537, 0x0078,
++      0x250d, 0x2001, 0x7700, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2537,
++      0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2cf8, 0x0040,
++      0x2537, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f,
++      0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x384c, 0x00c0,
++      0x2e7f, 0x6004, 0xa0c6, 0x0707, 0x0040, 0x2e7f, 0xa084, 0x00ff,
++      0xa0c6, 0x0006, 0x00c0, 0x2e7f, 0x87ff, 0x0040, 0x2e72, 0xac80,
++      0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078, 0x2baf,
++      0x0078, 0x2e7b, 0xac80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004,
++      0x53a3, 0x1078, 0x2baf, 0x21a2, 0x94a0, 0xa6b0, 0x0005, 0x8108,
++      0xa186, 0x007e, 0x0040, 0x2e8a, 0xa686, 0x0028, 0x0040, 0x2e93,
++      0x0078, 0x2e55, 0x86ff, 0x00c0, 0x2e91, 0x7120, 0x810b, 0x0078,
++      0x250d, 0x702f, 0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a,
++      0x2061, 0x77bd, 0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226,
++      0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x1377, 0x7007, 0x0002,
++      0x701b, 0x2eab, 0x007c, 0x702c, 0xa005, 0x00c0, 0x2ebd, 0x711c,
++      0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0x77bd, 0x6224,
++      0x6328, 0x642c, 0x6530, 0x0078, 0x2e55, 0x7120, 0x810b, 0x0078,
++      0x250d, 0x127e, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071, 0x7700,
++      0x6044, 0xd0a4, 0x00c0, 0x2eea, 0xd084, 0x0040, 0x2ed3, 0x1078,
++      0x3015, 0x0078, 0x2ee6, 0xd08c, 0x0040, 0x2eda, 0x1078, 0x2f2c,
++      0x0078, 0x2ee6, 0xd094, 0x0040, 0x2ee1, 0x1078, 0x2f0f, 0x0078,
++      0x2ee6, 0xd09c, 0x0040, 0x2ee6, 0x1078, 0x2ef4, 0x0e7f, 0x0c7f,
++      0x127f, 0x007c, 0x017e, 0x6128, 0xd19c, 0x00c0, 0x2ef1, 0xc19d,
++      0x612a, 0x017f, 0x0078, 0x2ee6, 0x6043, 0x0040, 0x6043, 0x0000,
++      0x706f, 0x0000, 0x7087, 0x0001, 0x70a7, 0x0000, 0x70bf, 0x0000,
++      0x2009, 0x7dc0, 0x200b, 0x0000, 0x707f, 0x0000, 0x7073, 0x000f,
++      0x2009, 0x000f, 0x2011, 0x3551, 0x1078, 0x4719, 0x007c, 0x7070,
++      0xa005, 0x00c0, 0x2f2b, 0x2011, 0x3551, 0x1078, 0x4689, 0x6043,
++      0x0020, 0x6043, 0x0000, 0x6044, 0xd08c, 0x00c0, 0x2f27, 0x7083,
++      0x0000, 0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x2f2b, 0x7077,
++      0x0000, 0x0078, 0x2f2b, 0x007c, 0x7074, 0xa08a, 0x0003, 0x00c8,
++      0x2f35, 0x1079, 0x2f38, 0x0078, 0x2f37, 0x1078, 0x12cd, 0x007c,
++      0x2f3b, 0x2f8a, 0x3014, 0x0f7e, 0x7077, 0x0001, 0x20e1, 0xa000,
++      0x20e1, 0x8700, 0x1078, 0x1de4, 0x20e1, 0x9080, 0x20e1, 0x4000,
++      0x2079, 0x7c00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000,
++      0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000,
++      0x781f, 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000,
++      0x782f, 0x0000, 0x2079, 0x7c0c, 0x207b, 0x1101, 0x7807, 0x0000,
++      0x2099, 0x7705, 0x20a1, 0x7c0e, 0x20a9, 0x0004, 0x53a3, 0x2079,
++      0x7c12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0x7c00, 0x20a1,
++      0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000,
++      0x1078, 0x3578, 0x0f7f, 0x707b, 0x0000, 0x6043, 0x0008, 0x6043,
++      0x0000, 0x007c, 0x0d7e, 0x7078, 0x707b, 0x0000, 0xa025, 0x0040,
++      0x2ffe, 0x6020, 0xd0b4, 0x00c0, 0x2ffc, 0x7184, 0x81ff, 0x0040,
++      0x2fe5, 0xa486, 0x000c, 0x00c0, 0x2ff0, 0xa480, 0x0018, 0x8004,
++      0x20a8, 0x2011, 0x7c80, 0x2019, 0x7c00, 0x220c, 0x2304, 0xa106,
++      0x00c0, 0x2fbc, 0x8210, 0x8318, 0x00f0, 0x2fa5, 0x6043, 0x0004,
++      0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x7077, 0x0002,
++      0x7083, 0x0002, 0x0078, 0x2ffc, 0x2069, 0x7c80, 0x6930, 0xa18e,
++      0x1101, 0x00c0, 0x2ff0, 0x6834, 0xa005, 0x00c0, 0x2ff0, 0x6900,
++      0xa18c, 0x00ff, 0x00c0, 0x2fd0, 0x6804, 0xa005, 0x0040, 0x2fe5,
++      0x2011, 0x7c8e, 0x2019, 0x7705, 0x20a9, 0x0004, 0x220c, 0x2304,
++      0xa102, 0x0048, 0x2fe3, 0x00c0, 0x2ff0, 0x8210, 0x8318, 0x00f0,
++      0x2fd6, 0x0078, 0x2ff0, 0x7087, 0x0000, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x2099, 0x7c80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6,
++      0x6043, 0x0008, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x2ffc,
++      0x60c3, 0x000c, 0x1078, 0x3578, 0x0d7f, 0x007c, 0x6020, 0xd0b4,
++      0x00c0, 0x2ffc, 0x60c3, 0x000c, 0x2011, 0x7940, 0x2013, 0x0000,
++      0x707b, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++      0x1078, 0x5693, 0x0078, 0x2ffc, 0x007c, 0x7080, 0xa08a, 0x001d,
++      0x00c8, 0x301e, 0x1079, 0x3021, 0x0078, 0x3020, 0x1078, 0x12cd,
++      0x007c, 0x3045, 0x3054, 0x3085, 0x309a, 0x30ca, 0x30f2, 0x3122,
++      0x314c, 0x317c, 0x31a2, 0x31eb, 0x320d, 0x3231, 0x3247, 0x326f,
++      0x3282, 0x328b, 0x32a4, 0x32d2, 0x32fa, 0x3328, 0x3352, 0x339a,
++      0x33cb, 0x33ed, 0x342b, 0x3451, 0x346a, 0x3477, 0x7003, 0x0007,
++      0x6004, 0xa084, 0xfff9, 0x6006, 0x007c, 0x608b, 0xbc94, 0x608f,
++      0xf0f0, 0x6043, 0x0002, 0x7083, 0x0001, 0x2009, 0x07d0, 0x2011,
++      0x3558, 0x1078, 0x467c, 0x007c, 0x0f7e, 0x7078, 0xa086, 0x0014,
++      0x00c0, 0x3083, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3083,
++      0x2079, 0x7c80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3081, 0x7834,
++      0xa005, 0x00c0, 0x3081, 0x7a38, 0xd2fc, 0x0040, 0x3077, 0x70a4,
++      0xa005, 0x00c0, 0x3077, 0x1078, 0x3611, 0x70a7, 0x0001, 0x2011,
++      0x3558, 0x1078, 0x4689, 0x7083, 0x0010, 0x1078, 0x328b, 0x0078,
++      0x3083, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0003, 0x6043,
++      0x0004, 0x1078, 0x35e2, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9,
++      0x000a, 0x20a3, 0x0000, 0x00f0, 0x3091, 0x60c3, 0x0014, 0x1078,
++      0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x30c8, 0x2011,
++      0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x30c4, 0x2079,
++      0x7c80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x30c4, 0x7834, 0xa005,
++      0x00c0, 0x30c4, 0x7a38, 0xd2fc, 0x0040, 0x30be, 0x70a4, 0xa005,
++      0x00c0, 0x30be, 0x1078, 0x3611, 0x70a7, 0x0001, 0x7083, 0x0004,
++      0x1078, 0x30ca, 0x0078, 0x30c8, 0x7083, 0x0002, 0x707b, 0x0000,
++      0x0f7f, 0x007c, 0x7083, 0x0005, 0x1078, 0x35e2, 0x20a3, 0x1103,
++      0x20a3, 0x0000, 0x3430, 0x2011, 0x7c8e, 0x706c, 0xa005, 0x00c0,
++      0x30e4, 0x714c, 0xa186, 0xffff, 0x0040, 0x30e4, 0x1078, 0x351c,
++      0x0040, 0x30e4, 0x1078, 0x3611, 0x20a9, 0x0008, 0x2298, 0x26a0,
++      0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++      0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3120, 0x2011,
++      0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x311c, 0x2079,
++      0x7c80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x311c, 0x7834, 0xa005,
++      0x00c0, 0x311c, 0x7a38, 0xd2fc, 0x0040, 0x3116, 0x70a4, 0xa005,
++      0x00c0, 0x3116, 0x1078, 0x3611, 0x70a7, 0x0001, 0x7083, 0x0006,
++      0x1078, 0x3122, 0x0078, 0x3120, 0x7083, 0x0002, 0x707b, 0x0000,
++      0x0f7f, 0x007c, 0x7083, 0x0007, 0x1078, 0x35e2, 0x20a3, 0x1104,
++      0x20a3, 0x0000, 0x3430, 0x2011, 0x7c8e, 0x706c, 0xa005, 0x00c0,
++      0x313e, 0x7150, 0xa186, 0xffff, 0x0040, 0x313e, 0xa180, 0x2329,
++      0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x351c, 0x20a9, 0x0008,
++      0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++      0x0014, 0x1078, 0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040,
++      0x317a, 0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0,
++      0x3176, 0x2079, 0x7c80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3176,
++      0x7834, 0xa005, 0x00c0, 0x3176, 0x7a38, 0xd2fc, 0x0040, 0x3170,
++      0x70a4, 0xa005, 0x00c0, 0x3170, 0x1078, 0x3611, 0x70a7, 0x0001,
++      0x7083, 0x0008, 0x1078, 0x317c, 0x0078, 0x317a, 0x7083, 0x0002,
++      0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0009, 0x1078, 0x35e2,
++      0x20a3, 0x1105, 0x20a3, 0x0100, 0x3430, 0x706c, 0xa005, 0x00c0,
++      0x318f, 0x1078, 0x3486, 0x0040, 0x319f, 0x0078, 0x3199, 0x20a9,
++      0x0008, 0x2099, 0x7c8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x60c3, 0x0014, 0x1078, 0x3578, 0x0078, 0x31a1, 0x1078,
++      0x303e, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x31e9, 0x2011,
++      0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x31e5, 0x2079,
++      0x7c80, 0x7a30, 0xa296, 0x1105, 0x00c0, 0x31e5, 0x7834, 0x2011,
++      0x0100, 0xa21e, 0x00c0, 0x31ce, 0x7a38, 0xd2fc, 0x0040, 0x31c8,
++      0x70a4, 0xa005, 0x00c0, 0x31c8, 0x1078, 0x3611, 0x70a7, 0x0001,
++      0x7083, 0x000a, 0x1078, 0x31eb, 0x0078, 0x31e9, 0xa005, 0x00c0,
++      0x31e5, 0x7a38, 0xd2fc, 0x0040, 0x31dd, 0x70a4, 0xa005, 0x00c0,
++      0x31dd, 0x1078, 0x3611, 0x70a7, 0x0001, 0x707f, 0x0000, 0x7083,
++      0x000e, 0x1078, 0x326f, 0x0078, 0x31e9, 0x7083, 0x0002, 0x707b,
++      0x0000, 0x0f7f, 0x007c, 0x7083, 0x000b, 0x2011, 0x7c0e, 0x22a0,
++      0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009,
++      0x0000, 0x41a4, 0x1078, 0x35e2, 0x20a3, 0x1106, 0x20a3, 0x0000,
++      0x6030, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6,
++      0x60c3, 0x0084, 0x1078, 0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005,
++      0x0040, 0x322f, 0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0084,
++      0x00c0, 0x322b, 0x2079, 0x7c80, 0x7a30, 0xa296, 0x1106, 0x00c0,
++      0x322b, 0x7834, 0xa005, 0x00c0, 0x322b, 0x7083, 0x000c, 0x1078,
++      0x3231, 0x0078, 0x322f, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f,
++      0x007c, 0x7083, 0x000d, 0x1078, 0x35e2, 0x20a3, 0x1107, 0x20a3,
++      0x0000, 0x2099, 0x7c8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x60c3, 0x0084, 0x1078, 0x3578, 0x007c, 0x0f7e,
++      0x7078, 0xa005, 0x0040, 0x326d, 0x2011, 0x3558, 0x1078, 0x4689,
++      0xa086, 0x0084, 0x00c0, 0x3269, 0x2079, 0x7c80, 0x7a30, 0xa296,
++      0x1107, 0x00c0, 0x3269, 0x7834, 0xa005, 0x00c0, 0x3269, 0x707f,
++      0x0001, 0x1078, 0x35d4, 0x7083, 0x000e, 0x1078, 0x326f, 0x0078,
++      0x326d, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083,
++      0x000f, 0x707b, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043,
++      0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x3558, 0x1078,
++      0x467c, 0x007c, 0x7078, 0xa005, 0x0040, 0x328a, 0x2011, 0x3558,
++      0x1078, 0x4689, 0x007c, 0x7083, 0x0011, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x2099, 0x7c80, 0x20a1, 0x020b, 0x7478, 0xa480, 0x0018,
++      0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3,
++      0x0014, 0x1078, 0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040,
++      0x32d0, 0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0,
++      0x32ce, 0x2079, 0x7c80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x32ce,
++      0x7834, 0xa005, 0x00c0, 0x32ce, 0x7a38, 0xd2fc, 0x0040, 0x32c8,
++      0x70a4, 0xa005, 0x00c0, 0x32c8, 0x1078, 0x3611, 0x70a7, 0x0001,
++      0x7083, 0x0012, 0x1078, 0x32d2, 0x0078, 0x32d0, 0x707b, 0x0000,
++      0x0f7f, 0x007c, 0x7083, 0x0013, 0x1078, 0x35ee, 0x20a3, 0x1103,
++      0x20a3, 0x0000, 0x3430, 0x2011, 0x7c8e, 0x706c, 0xa005, 0x00c0,
++      0x32ec, 0x714c, 0xa186, 0xffff, 0x0040, 0x32ec, 0x1078, 0x351c,
++      0x0040, 0x32ec, 0x1078, 0x3611, 0x20a9, 0x0008, 0x2298, 0x26a0,
++      0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++      0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3326, 0x2011,
++      0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x3324, 0x2079,
++      0x7c80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3324, 0x7834, 0xa005,
++      0x00c0, 0x3324, 0x7a38, 0xd2fc, 0x0040, 0x331e, 0x70a4, 0xa005,
++      0x00c0, 0x331e, 0x1078, 0x3611, 0x70a7, 0x0001, 0x7083, 0x0014,
++      0x1078, 0x3328, 0x0078, 0x3326, 0x707b, 0x0000, 0x0f7f, 0x007c,
++      0x7083, 0x0015, 0x1078, 0x35ee, 0x20a3, 0x1104, 0x20a3, 0x0000,
++      0x3430, 0x2011, 0x7c8e, 0x706c, 0xa006, 0x00c0, 0x3344, 0x7150,
++      0xa186, 0xffff, 0x0040, 0x3344, 0xa180, 0x2329, 0x200c, 0xa18c,
++      0xff00, 0x810f, 0x1078, 0x351c, 0x20a9, 0x0008, 0x2298, 0x26a0,
++      0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++      0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3398, 0x2011,
++      0x3558, 0x1078, 0x4689, 0xa086, 0x0014, 0x00c0, 0x3396, 0x2079,
++      0x7c80, 0x7a30, 0xa296, 0x1105, 0x00c0, 0x3396, 0x7834, 0x2011,
++      0x0100, 0xa21e, 0x00c0, 0x337f, 0x7a38, 0xd2f4, 0x0040, 0x3372,
++      0x70bf, 0x0008, 0xd2fc, 0x0040, 0x337d, 0x70a4, 0xa005, 0x00c0,
++      0x337d, 0x1078, 0x3611, 0x70a7, 0x0001, 0x0078, 0x3390, 0xa005,
++      0x00c0, 0x3396, 0x7a38, 0xd2fc, 0x0040, 0x338e, 0x70a4, 0xa005,
++      0x00c0, 0x338e, 0x1078, 0x3611, 0x70a7, 0x0001, 0x707f, 0x0000,
++      0x7083, 0x0016, 0x1078, 0x339a, 0x0078, 0x3398, 0x707b, 0x0000,
++      0x0f7f, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7c80,
++      0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0x7c8e,
++      0x7083, 0x0017, 0x0078, 0x33ae, 0x7083, 0x001b, 0x706c, 0xa005,
++      0x00c0, 0x33b8, 0x1078, 0x3486, 0x0040, 0x33c8, 0x0078, 0x33c2,
++      0x20a9, 0x0008, 0x2099, 0x7c8e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3578, 0x0078, 0x33ca,
++      0x1078, 0x303e, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x33eb,
++      0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0084, 0x00c0, 0x33e9,
++      0x2079, 0x7c80, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x33e9, 0x7834,
++      0xa005, 0x00c0, 0x33e9, 0x7083, 0x0018, 0x1078, 0x33ed, 0x0078,
++      0x33eb, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0019, 0x1078,
++      0x35ee, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, 0x7c8e,
++      0x2039, 0x7c0e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x2728, 0x2514,
++      0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007,
++      0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0x7c0e, 0x2414,
++      0xa38c, 0x0001, 0x0040, 0x3418, 0xa294, 0xff00, 0x0078, 0x341b,
++      0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9,
++      0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084,
++      0x1078, 0x3578, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x344f,
++      0x2011, 0x3558, 0x1078, 0x4689, 0xa086, 0x0084, 0x00c0, 0x344d,
++      0x2079, 0x7c80, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x344d, 0x7834,
++      0xa005, 0x00c0, 0x344d, 0x707f, 0x0001, 0x1078, 0x35d4, 0x7083,
++      0x001a, 0x1078, 0x3451, 0x0078, 0x344f, 0x707b, 0x0000, 0x0f7f,
++      0x007c, 0x7083, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
++      0x7c80, 0x20a1, 0x020b, 0x7478, 0xa480, 0x0018, 0xa080, 0x0007,
++      0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078,
++      0x3578, 0x007c, 0x7078, 0xa005, 0x0040, 0x3476, 0x2011, 0x3558,
++      0x1078, 0x4689, 0x7083, 0x001c, 0x1078, 0x3477, 0x007c, 0x707b,
++      0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0001, 0x2009,
++      0x07d0, 0x2011, 0x3558, 0x1078, 0x467c, 0x007c, 0x087e, 0x097e,
++      0x2029, 0x7752, 0x252c, 0x20a9, 0x0008, 0x2041, 0x7c0e, 0x28a0,
++      0x2099, 0x7c8e, 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4,
++      0x0040, 0x349c, 0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6,
++      0xffff, 0x00c0, 0x34ae, 0xd5d4, 0x0040, 0x34a9, 0x8210, 0x0078,
++      0x34aa, 0x8211, 0x00f0, 0x349c, 0x0078, 0x3513, 0x82ff, 0x00c0,
++      0x34c0, 0xd5d4, 0x0040, 0x34ba, 0xa1a6, 0x3fff, 0x0040, 0x34a6,
++      0x0078, 0x34be, 0xa1a6, 0x3fff, 0x0040, 0x3513, 0xa18d, 0xc000,
++      0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0040, 0x34c9, 0x2019,
++      0x0010, 0x2120, 0xd5d4, 0x0040, 0x34d0, 0x8423, 0x0078, 0x34d1,
++      0x8424, 0x00c8, 0x34de, 0xd5d4, 0x0040, 0x34d9, 0x8319, 0x0078,
++      0x34da, 0x8318, 0x00f0, 0x34ca, 0x0078, 0x3513, 0x23a8, 0x2021,
++      0x0001, 0x8426, 0x8425, 0x00f0, 0x34e2, 0x2328, 0x8529, 0xa2be,
++      0x0007, 0x0040, 0x34f6, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a,
++      0x007f, 0x27a8, 0xa5a8, 0x0010, 0x00f0, 0x34f2, 0x754e, 0xa5c8,
++      0x2329, 0x292c, 0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea,
++      0x2018, 0x2304, 0xa405, 0x201a, 0x706f, 0x0001, 0x26a0, 0x2898,
++      0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085,
++      0x0001, 0x0078, 0x3519, 0xa006, 0x0078, 0x3519, 0xa006, 0x1078,
++      0x12cd, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021, 0x0000, 0x2001,
++      0x0007, 0xa39a, 0x0010, 0x0048, 0x3529, 0x8420, 0x8001, 0x0078,
++      0x3521, 0x2118, 0x84ff, 0x0040, 0x3532, 0xa39a, 0x0010, 0x8421,
++      0x00c0, 0x352d, 0x2021, 0x0001, 0x83ff, 0x0040, 0x353b, 0x8423,
++      0x8319, 0x00c0, 0x3537, 0xa238, 0x2704, 0xa42c, 0x00c0, 0x3550,
++      0xa405, 0x203a, 0x714e, 0xa1a0, 0x2329, 0x242c, 0xa5ac, 0x00ff,
++      0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0001, 0xa084, 0x0000,
++      0x007c, 0x0e7e, 0x2071, 0x7700, 0x7073, 0x0000, 0x0e7f, 0x007c,
++      0x0e7e, 0x0f7e, 0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x569c,
++      0x7004, 0xa084, 0x4000, 0x0040, 0x3569, 0x7003, 0x1000, 0x7003,
++      0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0x7720, 0x2073, 0x0000,
++      0x7843, 0x0090, 0x7843, 0x0010, 0x127f, 0x0f7f, 0x0e7f, 0x007c,
++      0x127e, 0x2091, 0x8000, 0x2011, 0x7940, 0x2013, 0x0000, 0x707b,
++      0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++      0x1078, 0x5693, 0x2009, 0x07d0, 0x2011, 0x3558, 0x1078, 0x4719,
++      0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x2009,
++      0x00f7, 0x1078, 0x35fa, 0x2061, 0x7949, 0x601b, 0x0000, 0x601f,
++      0x0000, 0x2061, 0x7700, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043,
++      0x0090, 0x6043, 0x0010, 0x2009, 0x001e, 0x2011, 0x35b6, 0x1078,
++      0x467c, 0x127f, 0x0c7f, 0x027f, 0x017f, 0x007c, 0x0e7e, 0x007e,
++      0x127e, 0x2091, 0x8000, 0x2071, 0x0100, 0x1078, 0x569c, 0x2071,
++      0x0140, 0x7004, 0xa084, 0x4000, 0x0040, 0x35ca, 0x7003, 0x1000,
++      0x7003, 0x0000, 0x2001, 0x0001, 0x1078, 0x2025, 0x1078, 0x3591,
++      0x127f, 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1, 0x7dc0,
++      0x2099, 0x7c8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x00f0,
++      0x35da, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7c00,
++      0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1, 0x9080,
++      0x20e1, 0x4000, 0x2099, 0x7c80, 0x20a1, 0x020b, 0x20a9, 0x000c,
++      0x53a6, 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f, 0x2001,
++      0x772c, 0x2004, 0xa005, 0x00c0, 0x360b, 0x6030, 0xa084, 0x00ff,
++      0xa105, 0x0078, 0x360d, 0xa185, 0x00f7, 0x604a, 0x007f, 0x0c7f,
++      0x007c, 0x017e, 0x047e, 0x2001, 0x7752, 0x2004, 0xd0a4, 0x0040,
++      0x3624, 0xa006, 0x2020, 0x2009, 0x002a, 0x1078, 0x7641, 0x2001,
++      0x770c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x1078, 0x2293,
++      0x047f, 0x017f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009, 0x7820,
++      0xa006, 0x200a, 0x8108, 0x00f0, 0x3631, 0x157f, 0x007c, 0x0d7e,
++      0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0x7751, 0xa006, 0x6002,
++      0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x2329, 0x231c,
++      0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0,
++      0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e,
++      0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066,
++      0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086,
++      0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x61a2, 0x0d7e,
++      0x60a4, 0xa06d, 0x0040, 0x3676, 0x1078, 0x1340, 0x60a7, 0x0000,
++      0x60a8, 0xa06d, 0x0040, 0x367e, 0x1078, 0x1340, 0x60ab, 0x0000,
++      0x0d7f, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814,
++      0xa084, 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f, 0x037f, 0x0d7f,
++      0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff,
++      0xa082, 0x4000, 0x00c8, 0x3737, 0xa18c, 0xff00, 0x810f, 0xa182,
++      0x00ff, 0x00c8, 0x373d, 0x2001, 0x770c, 0x2004, 0xa084, 0x0003,
++      0x00c0, 0x3720, 0xa188, 0x7820, 0x2104, 0xa065, 0x0040, 0x370e,
++      0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x3714, 0x60a4,
++      0xa00d, 0x0040, 0x36bf, 0x1078, 0x3a5c, 0x0040, 0x3708, 0x60a8,
++      0xa00d, 0x0040, 0x36d9, 0x1078, 0x3aac, 0x00c0, 0x36d9, 0x694c,
++      0xd1fc, 0x00c0, 0x36cf, 0x1078, 0x37d1, 0x0078, 0x3703, 0x1078,
++      0x37a2, 0x694c, 0xd1ec, 0x00c0, 0x3703, 0x1078, 0x3931, 0x0078,
++      0x3703, 0x694c, 0xa184, 0xa000, 0x0040, 0x36f3, 0xd1ec, 0x0040,
++      0x36ec, 0xd1fc, 0x0040, 0x36e8, 0x1078, 0x3942, 0x0078, 0x36ef,
++      0x1078, 0x3942, 0x0078, 0x36f3, 0xd1fc, 0x0040, 0x36f3, 0x1078,
++      0x37a2, 0x0078, 0x3703, 0x6050, 0xa00d, 0x0040, 0x36fe, 0x2d00,
++      0x200a, 0x6803, 0x0000, 0x6052, 0x0078, 0x3703, 0x2d00, 0x6052,
++      0x604e, 0x6803, 0x0000, 0x1078, 0x4960, 0xa006, 0x127f, 0x007c,
++      0x2001, 0x0005, 0x2009, 0x0000, 0x0078, 0x3741, 0x2001, 0x0028,
++      0x2009, 0x0000, 0x0078, 0x3741, 0xa082, 0x0006, 0x00c8, 0x3720,
++      0x60a0, 0xd0bc, 0x0040, 0x36b7, 0x2001, 0x0028, 0x0078, 0x3733,
++      0x2009, 0x770c, 0x210c, 0xd18c, 0x0040, 0x372a, 0x2001, 0x0004,
++      0x0078, 0x3733, 0xd184, 0x0040, 0x3731, 0x2001, 0x0004, 0x0078,
++      0x3733, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x3741, 0x2001,
++      0x0029, 0x2009, 0x0000, 0x0078, 0x3741, 0x2001, 0x0029, 0x2009,
++      0x0000, 0xa005, 0x127f, 0x007c, 0x6944, 0x6e48, 0xa684, 0x3fff,
++      0xa082, 0x4000, 0x00c8, 0x3787, 0xa18c, 0xff00, 0x810f, 0xa182,
++      0x00ff, 0x00c8, 0x3777, 0xa188, 0x7820, 0x2104, 0xa065, 0x0040,
++      0x3777, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x377d,
++      0x684c, 0xd0ec, 0x0040, 0x376a, 0x1078, 0x3942, 0x1078, 0x37a2,
++      0x0078, 0x3772, 0x1078, 0x37a2, 0x684c, 0xd0fc, 0x0040, 0x3772,
++      0x1078, 0x3931, 0x1078, 0x398a, 0xa006, 0x0078, 0x378b, 0x2001,
++      0x0028, 0x2009, 0x0000, 0x0078, 0x378b, 0xa082, 0x0006, 0x0048,
++      0x3760, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x378b, 0x2001,
++      0x0029, 0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000,
++      0x6050, 0xa00d, 0x0040, 0x379b, 0x2d00, 0x200a, 0x6803, 0x0000,
++      0x6052, 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000,
++      0x0078, 0x3799, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040,
++      0x37ae, 0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00, 0x6052,
++      0x604e, 0x6803, 0x0000, 0x0078, 0x37ac, 0x127e, 0x2091, 0x8000,
++      0x604c, 0xa06d, 0x0040, 0x37c3, 0x6800, 0xa005, 0x00c0, 0x37c1,
++      0x6052, 0x604e, 0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040,
++      0x37d0, 0x6800, 0xa005, 0x00c0, 0x37ce, 0x6052, 0x604e, 0xad05,
++      0x007c, 0x6803, 0x0000, 0x6084, 0xa00d, 0x0040, 0x37db, 0x2d00,
++      0x200a, 0x6086, 0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x37da,
++      0x127e, 0x0c7e, 0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200,
++      0xa005, 0x0040, 0x37ee, 0xc285, 0x0078, 0x37ef, 0xc284, 0x6202,
++      0x027f, 0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000,
++      0x6218, 0x2260, 0x6204, 0xa294, 0xff00, 0xa215, 0x6206, 0x0c7f,
++      0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260,
++      0x6204, 0xa294, 0x00ff, 0x8007, 0xa215, 0x6206, 0x0c7f, 0x127f,
++      0x007c, 0x027e, 0xa182, 0x00ff, 0x0048, 0x381a, 0xa085, 0x0001,
++      0x0078, 0x3832, 0xa190, 0x7820, 0x2204, 0xa065, 0x00c0, 0x3831,
++      0x017e, 0x0d7e, 0x1078, 0x130c, 0x2d60, 0x0d7f, 0x017f, 0x0040,
++      0x3816, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, 0x0000, 0x1078,
++      0x3637, 0xa006, 0x027f, 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048,
++      0x383d, 0xa085, 0x0001, 0x0078, 0x384a, 0x0d7e, 0xa190, 0x7820,
++      0x2204, 0xa06d, 0x0040, 0x3848, 0x2013, 0x0000, 0x1078, 0x1340,
++      0x0d7f, 0xa006, 0x027f, 0x007c, 0x017e, 0xa182, 0x00ff, 0x0048,
++      0x3855, 0xa085, 0x0001, 0x0078, 0x385c, 0xa188, 0x7820, 0x2104,
++      0xa065, 0x0040, 0x3851, 0xa006, 0x017f, 0x007c, 0x0d7e, 0x157e,
++      0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c,
++      0x6002, 0x2069, 0x7c8e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138,
++      0xa10a, 0x0048, 0x3874, 0x603a, 0x6814, 0x6066, 0x2099, 0x7c96,
++      0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0x7c9a,
++      0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0x7cae,
++      0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076,
++      0xa182, 0x0211, 0x00c8, 0x3898, 0x2009, 0x0008, 0x0078, 0x38c2,
++      0xa182, 0x0259, 0x00c8, 0x38a0, 0x2009, 0x0007, 0x0078, 0x38c2,
++      0xa182, 0x02c1, 0x00c8, 0x38a8, 0x2009, 0x0006, 0x0078, 0x38c2,
++      0xa182, 0x0349, 0x00c8, 0x38b0, 0x2009, 0x0005, 0x0078, 0x38c2,
++      0xa182, 0x0421, 0x00c8, 0x38b8, 0x2009, 0x0004, 0x0078, 0x38c2,
++      0xa182, 0x0581, 0x00c8, 0x38c0, 0x2009, 0x0003, 0x0078, 0x38c2,
++      0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c,
++      0x0e7e, 0x2071, 0x7c8d, 0x2e04, 0x6896, 0x2071, 0x7c8e, 0x7004,
++      0x689a, 0x701c, 0x689e, 0x0e7f, 0x007c, 0x0d7e, 0x127e, 0x2091,
++      0x8000, 0x60a4, 0xa06d, 0x0040, 0x38f9, 0x6900, 0x81ff, 0x00c0,
++      0x390d, 0x6a04, 0xa282, 0x0010, 0x00c8, 0x3912, 0xad88, 0x0004,
++      0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040, 0x38f4, 0x8108,
++      0x00f0, 0x38ea, 0x1078, 0x12cd, 0x260a, 0x8210, 0x6a06, 0x0078,
++      0x390d, 0x1078, 0x130c, 0x0040, 0x3912, 0x2d00, 0x60a6, 0x6803,
++      0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108,
++      0x00f0, 0x3905, 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, 0x127f,
++      0x0d7f, 0x007c, 0xa006, 0x0078, 0x390f, 0x127e, 0x2091, 0x8000,
++      0x1078, 0x3a55, 0x00c0, 0x392f, 0x200b, 0xffff, 0x0d7e, 0x60a4,
++      0x2068, 0x6804, 0xa08a, 0x0002, 0x0048, 0x392a, 0x8001, 0x6806,
++      0x0078, 0x392e, 0x1078, 0x1340, 0x60a7, 0x0000, 0x0d7f, 0x127f,
++      0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x3ac1, 0x0078, 0x393a,
++      0x1078, 0x378d, 0x1078, 0x39ce, 0x00c0, 0x3938, 0x1078, 0x398a,
++      0x127f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a8, 0xa06d,
++      0x0040, 0x3966, 0x6950, 0x81ff, 0x00c0, 0x397a, 0x6a54, 0xa282,
++      0x0010, 0x00c8, 0x3987, 0xad88, 0x0018, 0x20a9, 0x0010, 0x2104,
++      0xa086, 0xffff, 0x0040, 0x3961, 0x8108, 0x00f0, 0x3957, 0x1078,
++      0x12cd, 0x260a, 0x8210, 0x6a56, 0x0078, 0x397a, 0x1078, 0x130c,
++      0x0040, 0x3987, 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018,
++      0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x3972, 0x6857,
++      0x0001, 0x6e62, 0x0078, 0x397e, 0x1078, 0x37d1, 0x1078, 0x3994,
++      0x00c0, 0x397c, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006,
++      0x0078, 0x3984, 0x127e, 0x2091, 0x8000, 0x1078, 0x4960, 0x127f,
++      0x007c, 0xa01e, 0x0078, 0x3996, 0x2019, 0x0001, 0xa00e, 0x127e,
++      0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x00c0, 0x39b4,
++      0x8dff, 0x0040, 0x39c9, 0x83ff, 0x0040, 0x39ac, 0x6848, 0xa606,
++      0x0040, 0x39b9, 0x0078, 0x39b4, 0x683c, 0xa406, 0x00c0, 0x39b4,
++      0x6840, 0xa506, 0x0040, 0x39b9, 0x2d08, 0x6800, 0x2068, 0x0078,
++      0x39a0, 0x6a00, 0x604c, 0xad06, 0x00c0, 0x39c1, 0x624e, 0x0078,
++      0x39c4, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x39c9, 0x6152,
++      0x8dff, 0x127f, 0x007c, 0xa01e, 0x0078, 0x39d0, 0x2019, 0x0001,
++      0xa00e, 0x6080, 0x2068, 0x8dff, 0x0040, 0x39fc, 0x83ff, 0x0040,
++      0x39df, 0x6848, 0xa606, 0x0040, 0x39ec, 0x0078, 0x39e7, 0x683c,
++      0xa406, 0x00c0, 0x39e7, 0x6840, 0xa506, 0x0040, 0x39ec, 0x2d08,
++      0x6800, 0x2068, 0x0078, 0x39d3, 0x6a00, 0x6080, 0xad06, 0x00c0,
++      0x39f4, 0x6282, 0x0078, 0x39f7, 0xa180, 0x0000, 0x2202, 0x82ff,
++      0x00c0, 0x39fc, 0x6186, 0x8dff, 0x007c, 0x1078, 0x3a55, 0x00c0,
++      0x3a03, 0x2011, 0x0001, 0x1078, 0x3aa5, 0x00c0, 0x3a09, 0xa295,
++      0x0002, 0x007c, 0x1078, 0x3add, 0x0040, 0x3a12, 0x1078, 0x6b2b,
++      0x0078, 0x3a14, 0xa085, 0x0001, 0x007c, 0x1078, 0x3add, 0x0040,
++      0x3a1d, 0x1078, 0x6aba, 0x0078, 0x3a1f, 0xa085, 0x0001, 0x007c,
++      0x1078, 0x3add, 0x0040, 0x3a28, 0x1078, 0x6b00, 0x0078, 0x3a2a,
++      0xa085, 0x0001, 0x007c, 0x1078, 0x3add, 0x0040, 0x3a33, 0x1078,
++      0x6ad6, 0x0078, 0x3a35, 0xa085, 0x0001, 0x007c, 0x127e, 0x007e,
++      0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d, 0x0040, 0x3a4d, 0x6800,
++      0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x6c54,
++      0x1078, 0x3b92, 0x007f, 0x0078, 0x3a3c, 0x6083, 0x0000, 0x6087,
++      0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c, 0x60a4, 0xa00d, 0x00c0,
++      0x3a5c, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x2170, 0x7000, 0xa005,
++      0x00c0, 0x3a6f, 0x20a9, 0x0010, 0xae88, 0x0004, 0x2104, 0xa606,
++      0x0040, 0x3a6f, 0x8108, 0x00f0, 0x3a66, 0xa085, 0x0001, 0x0e7f,
++      0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0,
++      0x3a7f, 0x1078, 0x130c, 0x0040, 0x3a91, 0x2d00, 0x60a6, 0x6803,
++      0x0001, 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b,
++      0xffff, 0x8108, 0x00f0, 0x3a87, 0xa085, 0x0001, 0x127f, 0x0d7f,
++      0x007c, 0xa006, 0x0078, 0x3a8e, 0x0d7e, 0x127e, 0x2091, 0x8000,
++      0x60a4, 0xa06d, 0x0040, 0x3aa2, 0x60a7, 0x0000, 0x1078, 0x1340,
++      0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0,
++      0x3aac, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005,
++      0x00c0, 0x3abf, 0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606,
++      0x0040, 0x3abf, 0x8108, 0x00f0, 0x3ab6, 0xa085, 0x0001, 0x0e7f,
++      0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x3aa5, 0x00c0, 0x3adb,
++      0x200b, 0xffff, 0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002,
++      0x0048, 0x3ad6, 0x8001, 0x6856, 0x0078, 0x3ada, 0x1078, 0x1340,
++      0x60ab, 0x0000, 0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c,
++      0x0f7e, 0x2079, 0x7751, 0x7804, 0xd0a4, 0x0040, 0x3b09, 0x157e,
++      0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x384c,
++      0x00c0, 0x3afd, 0x6004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006,
++      0x00c0, 0x3afd, 0x6000, 0xc0ed, 0x6002, 0x017f, 0x8108, 0x00f0,
++      0x3aed, 0x0c7f, 0x157f, 0x2009, 0x07d0, 0x2011, 0x3b0b, 0x1078,
++      0x4719, 0x0f7f, 0x007c, 0x2011, 0x3b0b, 0x1078, 0x4689, 0x157e,
++      0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x384c,
++      0x00c0, 0x3b37, 0x6000, 0xd0ec, 0x0040, 0x3b37, 0x047e, 0x62a0,
++      0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0x7641,
++      0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x2019, 0x0029, 0x1078, 0x4a7e,
++      0x1078, 0x49c1, 0x2009, 0x0000, 0x1078, 0x747b, 0x047f, 0x017f,
++      0x8108, 0x00f0, 0x3b15, 0x0c7f, 0x157f, 0x007c, 0x0c7e, 0x6018,
++      0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x2071, 0x77ff,
++      0x7003, 0x0001, 0x7007, 0x0000, 0x7013, 0x0000, 0x7017, 0x0000,
++      0x701b, 0x0000, 0x701f, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000,
++      0x705b, 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x007c, 0x0e7e,
++      0x2071, 0x77ff, 0x684c, 0xa005, 0x00c0, 0x3b6d, 0x7028, 0xc085,
++      0x702a, 0xa085, 0x0001, 0x0078, 0x3b90, 0x6a60, 0x7236, 0x6b64,
++      0x733a, 0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c,
++      0x702e, 0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x8007, 0x8006,
++      0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319,
++      0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006,
++      0x0e7f, 0x007c, 0x0e7e, 0x6838, 0xd0fc, 0x00c0, 0x3be3, 0x6804,
++      0xa00d, 0x0040, 0x3bb1, 0x0d7e, 0x0e7e, 0x2071, 0x7700, 0x027e,
++      0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
++      0x00c0, 0x3ba2, 0x702e, 0x70a0, 0xa200, 0x70a2, 0x027f, 0x0e7f,
++      0x0d7f, 0x2071, 0x77ff, 0x701c, 0xa005, 0x00c0, 0x3bf4, 0x0068,
++      0x3bf2, 0x2071, 0x7751, 0x7004, 0xd09c, 0x0040, 0x3bf2, 0x6934,
++      0xa186, 0x0103, 0x00c0, 0x3c05, 0x6948, 0x6844, 0xa105, 0x00c0,
++      0x3be5, 0x2009, 0x8020, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0,
++      0x3bf2, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001,
++      0x2091, 0x4080, 0x2071, 0x7700, 0x702c, 0x206a, 0x2d00, 0x702e,
++      0x70a0, 0x8000, 0x70a2, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100,
++      0x00c0, 0x3bf2, 0x6868, 0xa005, 0x00c0, 0x3bf2, 0x2009, 0x8020,
++      0x0078, 0x3bcb, 0x2071, 0x77ff, 0x2d08, 0x206b, 0x0000, 0x7010,
++      0x8000, 0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x3c02, 0x6902,
++      0x0078, 0x3c03, 0x711e, 0x0078, 0x3be3, 0xa18c, 0x00ff, 0xa186,
++      0x0017, 0x0040, 0x3c13, 0xa186, 0x001e, 0x0040, 0x3c13, 0xa18e,
++      0x001f, 0x00c0, 0x3bf2, 0x684c, 0xd0cc, 0x0040, 0x3bf2, 0x6850,
++      0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x3bf2, 0x2009, 0x8021,
++      0x0078, 0x3bcb, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80,
++      0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0x684a, 0x6952,
++      0x007c, 0x2071, 0x77ff, 0x7004, 0x0079, 0x3c36, 0x3c3e, 0x3c4d,
++      0x3cdd, 0x3cde, 0x3cee, 0x3cf4, 0x3c3f, 0x3ccb, 0x007c, 0x127e,
++      0x2091, 0x8000, 0x0068, 0x3c4c, 0x2009, 0x000d, 0x7030, 0x200a,
++      0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x701c, 0xa06d, 0x0040,
++      0x3cca, 0x0e7e, 0x2071, 0x7751, 0x7004, 0xd09c, 0x0040, 0x3cac,
++      0x6934, 0xa186, 0x0103, 0x00c0, 0x3c82, 0x6948, 0x6844, 0xa105,
++      0x00c0, 0x3c9f, 0x2009, 0x8020, 0x127e, 0x2091, 0x8000, 0x0068,
++      0x3c7e, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x3c7e, 0x7122,
++      0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080,
++      0x127f, 0x0e7f, 0x1078, 0x3d27, 0x0078, 0x3cca, 0x127f, 0x0e7f,
++      0x0078, 0x3cca, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0040, 0x3c90,
++      0xa186, 0x001e, 0x0040, 0x3c90, 0xa18e, 0x001f, 0x00c0, 0x3cac,
++      0x684c, 0xd0cc, 0x0040, 0x3cac, 0x6850, 0xa084, 0x00ff, 0xa086,
++      0x0001, 0x00c0, 0x3cac, 0x2009, 0x8021, 0x0078, 0x3c64, 0x6844,
++      0xa086, 0x0100, 0x00c0, 0x3cac, 0x6868, 0xa005, 0x00c0, 0x3cac,
++      0x2009, 0x8020, 0x0078, 0x3c64, 0x0e7f, 0x1078, 0x3d3b, 0x0040,
++      0x3cca, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003,
++      0x00c0, 0x3cc1, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x3cc1,
++      0x710e, 0x7007, 0x0003, 0x1078, 0x3d5b, 0x7050, 0xa086, 0x0100,
++      0x0040, 0x3cde, 0x007c, 0x701c, 0xa06d, 0x0040, 0x3cdc, 0x1078,
++      0x3d3b, 0x0040, 0x3cdc, 0x7007, 0x0003, 0x1078, 0x3d5b, 0x7050,
++      0xa086, 0x0100, 0x0040, 0x3cde, 0x007c, 0x007c, 0x7050, 0xa09e,
++      0x0100, 0x00c0, 0x3ce7, 0x7007, 0x0004, 0x0078, 0x3cee, 0xa086,
++      0x0200, 0x00c0, 0x3ced, 0x7007, 0x0005, 0x007c, 0x1078, 0x3cf5,
++      0x7006, 0x1078, 0x3d27, 0x007c, 0x007c, 0x702c, 0x7130, 0x8108,
++      0xa102, 0x0048, 0x3d02, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
++      0x0078, 0x3d0c, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x3d0c,
++      0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, 0x700e,
++      0x00c0, 0x3d20, 0x127e, 0x2091, 0x8000, 0x0068, 0x3d23, 0x2001,
++      0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x127f, 0x007c,
++      0x2001, 0x0007, 0x007c, 0x2001, 0x0006, 0x127f, 0x007c, 0x701c,
++      0xa06d, 0x0040, 0x3d3a, 0x127e, 0x2091, 0x8000, 0x7010, 0x8001,
++      0x7012, 0x2d04, 0x701e, 0xa005, 0x00c0, 0x3d37, 0x701a, 0x127f,
++      0x1078, 0x1340, 0x007c, 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e,
++      0x0040, 0x3d4a, 0x2304, 0x230c, 0xa10e, 0x0040, 0x3d4a, 0xa006,
++      0x0078, 0x3d5a, 0x732c, 0x8319, 0x7130, 0xa102, 0x00c0, 0x3d54,
++      0x2300, 0xa005, 0x0078, 0x3d5a, 0x0048, 0x3d59, 0xa302, 0x0078,
++      0x3d5a, 0x8002, 0x007c, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056,
++      0x7053, 0x0000, 0x127e, 0x2091, 0x8000, 0x2009, 0x7959, 0x2104,
++      0xc08d, 0x200a, 0x127f, 0x1078, 0x1391, 0x007c, 0x2071, 0x77cd,
++      0x7003, 0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001,
++      0x704f, 0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040,
++      0x7083, 0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000,
++      0x007c, 0x0e7e, 0x2071, 0x77cd, 0x6848, 0xa005, 0x00c0, 0x3d97,
++      0x7028, 0xc085, 0x702a, 0xa085, 0x0001, 0x0078, 0x3dbc, 0x6a50,
++      0x7236, 0x6b54, 0x733a, 0x6858, 0x703e, 0x707a, 0x685c, 0x7042,
++      0x707e, 0x6848, 0x702e, 0x6840, 0x7032, 0x2009, 0x000c, 0x200a,
++      0x8007, 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210,
++      0x2100, 0xa319, 0x7272, 0x7376, 0x7028, 0xc084, 0x702a, 0x7007,
++      0x0001, 0x700f, 0x0000, 0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071,
++      0x77cd, 0x7004, 0x1079, 0x3e1c, 0x700c, 0x0079, 0x3dc7, 0x3dcc,
++      0x3dc1, 0x3dc1, 0x3dc1, 0x3dc1, 0x007c, 0x700c, 0x0079, 0x3dd0,
++      0x3dd5, 0x3e1a, 0x3e1a, 0x3e1b, 0x3e1b, 0x7830, 0x7930, 0xa106,
++      0x0040, 0x3ddf, 0x7830, 0x7930, 0xa106, 0x00c0, 0x3e05, 0x7030,
++      0xa10a, 0x0040, 0x3e05, 0x00c8, 0x3de7, 0x712c, 0xa10a, 0xa18a,
++      0x0002, 0x00c8, 0x3e06, 0x1078, 0x130c, 0x0040, 0x3e05, 0x2d00,
++      0x705a, 0x7063, 0x0040, 0x2001, 0x0003, 0x7057, 0x0000, 0x127e,
++      0x007e, 0x2091, 0x8000, 0x2009, 0x7959, 0x2104, 0xc085, 0x200a,
++      0x007f, 0x700e, 0x127f, 0x1078, 0x1391, 0x007c, 0x1078, 0x130c,
++      0x0040, 0x3e05, 0x2d00, 0x705a, 0x1078, 0x130c, 0x00c0, 0x3e12,
++      0x0078, 0x3df1, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004,
++      0x0078, 0x3df5, 0x007c, 0x007c, 0x3e2d, 0x3e2e, 0x3e65, 0x3e66,
++      0x3e1a, 0x3e9c, 0x3ea1, 0x3ed8, 0x3ed9, 0x3ef4, 0x3ef5, 0x3ef6,
++      0x3ef7, 0x3ef8, 0x3ef9, 0x3f62, 0x3f8c, 0x007c, 0x700c, 0x0079,
++      0x3e31, 0x3e36, 0x3e39, 0x3e49, 0x3e64, 0x3e64, 0x1078, 0x3dcd,
++      0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x426e,
++      0x0040, 0x3e46, 0x2091, 0x8000, 0x1078, 0x3dcd, 0x0d7f, 0x0078,
++      0x3e52, 0x127e, 0x8001, 0x700e, 0x1078, 0x426e, 0x7058, 0x2068,
++      0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084,
++      0x00ff, 0xa08a, 0x0020, 0x00c8, 0x3e61, 0x1079, 0x3e7c, 0x127f,
++      0x007c, 0x127f, 0x1078, 0x3efa, 0x007c, 0x007c, 0x007c, 0x0e7e,
++      0x2071, 0x77cd, 0x700c, 0x0079, 0x3e6d, 0x3e72, 0x3e72, 0x3e72,
++      0x3e74, 0x3e78, 0x0e7f, 0x007c, 0x700f, 0x0001, 0x0078, 0x3e7a,
++      0x700f, 0x0002, 0x0e7f, 0x007c, 0x3efa, 0x3efa, 0x3f16, 0x3efa,
++      0x4001, 0x3efa, 0x3efa, 0x3efa, 0x3efa, 0x3efa, 0x3f16, 0x4040,
++      0x408a, 0x40e3, 0x40f7, 0x3efa, 0x3efa, 0x3f32, 0x3f16, 0x3efa,
++      0x3efa, 0x3f48, 0x4182, 0x41a0, 0x3efa, 0x3f32, 0x3efa, 0x3efa,
++      0x3efa, 0x3efa, 0x3f48, 0x41a0, 0x7020, 0x2068, 0x1078, 0x1340,
++      0x007c, 0x700c, 0x0079, 0x3ea4, 0x3ea9, 0x3eac, 0x3ebc, 0x3ed7,
++      0x3ed7, 0x1078, 0x3dcd, 0x007c, 0x127e, 0x8001, 0x700e, 0x7058,
++      0x007e, 0x1078, 0x426e, 0x0040, 0x3eb9, 0x2091, 0x8000, 0x1078,
++      0x3dcd, 0x0d7f, 0x0078, 0x3ec5, 0x127e, 0x8001, 0x700e, 0x1078,
++      0x426e, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807,
++      0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x00c8, 0x3ed4,
++      0x1079, 0x3eda, 0x127f, 0x007c, 0x127f, 0x1078, 0x3efa, 0x007c,
++      0x007c, 0x007c, 0x3efa, 0x3f16, 0x3feb, 0x3efa, 0x3f16, 0x3efa,
++      0x3f16, 0x3f16, 0x3efa, 0x3f16, 0x3feb, 0x3f16, 0x3f16, 0x3f16,
++      0x3f16, 0x3f16, 0x3efa, 0x3f16, 0x3feb, 0x3efa, 0x3efa, 0x3f16,
++      0x3efa, 0x3efa, 0x3efa, 0x3f16, 0x007c, 0x007c, 0x007c, 0x007c,
++      0x007c, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5,
++      0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x3b92, 0x127f, 0x007c,
++      0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e,
++      0x2091, 0x8000, 0x1078, 0x3b92, 0x127f, 0x007c, 0x7007, 0x0001,
++      0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000,
++      0x1078, 0x3b92, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084,
++      0x00ff, 0xc0dd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x3b92,
++      0x127f, 0x007c, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0040, 0x3f08,
++      0x8001, 0x00c0, 0x3f3f, 0x7007, 0x0001, 0x0078, 0x3fc8, 0x7007,
++      0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x3fc8, 0x007c,
++      0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098,
++      0x20a1, 0x77f8, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8,
++      0x3f24, 0x6884, 0xa08a, 0x0003, 0x00c8, 0x3f24, 0xa080, 0x3fb9,
++      0x2004, 0x70c6, 0x7010, 0xa015, 0x0040, 0x3fac, 0x1078, 0x130c,
++      0x00c0, 0x3f6d, 0x7007, 0x000f, 0x007c, 0x2d00, 0x7022, 0x70c4,
++      0x2060, 0x6000, 0x6836, 0x6004, 0xad00, 0x7096, 0x6008, 0xa20a,
++      0x00c8, 0x3f7c, 0xa00e, 0x2200, 0x7112, 0x620c, 0x8003, 0x800b,
++      0xa296, 0x0004, 0x0040, 0x3f85, 0xa108, 0x719a, 0x810b, 0x719e,
++      0xae90, 0x0022, 0x1078, 0x1377, 0x7090, 0xa08e, 0x0100, 0x0040,
++      0x3fa0, 0xa086, 0x0200, 0x0040, 0x3f98, 0x7007, 0x0010, 0x007c,
++      0x7020, 0x2068, 0x1078, 0x1340, 0x7014, 0x2068, 0x0078, 0x3f24,
++      0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000, 0x2d08, 0x2068,
++      0x6906, 0x711a, 0x0078, 0x3f62, 0x7014, 0x2068, 0x7007, 0x0001,
++      0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x41bd, 0x0078,
++      0x3fc8, 0x3fbc, 0x3fc0, 0x3fc4, 0x0002, 0x0011, 0x0007, 0x0004,
++      0x000a, 0x000f, 0x0005, 0x0006, 0x0012, 0x000f, 0x0005, 0x0006,
++      0x2009, 0x772c, 0x210c, 0x81ff, 0x00c0, 0x3fe5, 0x6838, 0xa084,
++      0x00ff, 0x683a, 0x6853, 0x0000, 0x1078, 0x3691, 0x00c0, 0x3fd9,
++      0x007c, 0x1078, 0x3c22, 0x127e, 0x2091, 0x8000, 0x1078, 0x6c54,
++      0x1078, 0x3b92, 0x127f, 0x0078, 0x3fd8, 0x2001, 0x0028, 0x2009,
++      0x0000, 0x0078, 0x3fd9, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906,
++      0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x3ffa, 0x7007, 0x0006,
++      0x0078, 0x4000, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a,
++      0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848,
++      0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x402a,
++      0x2009, 0x0000, 0x20a9, 0x007e, 0xa096, 0x0002, 0x0040, 0x402a,
++      0xa005, 0x00c0, 0x403d, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078,
++      0x384c, 0x00c0, 0x403d, 0x067e, 0x6e50, 0x1078, 0x3915, 0x067f,
++      0x0078, 0x403d, 0x047e, 0x2011, 0x770c, 0x2224, 0xc484, 0xc48c,
++      0x2412, 0x047f, 0x0c7e, 0x1078, 0x384c, 0x00c0, 0x4039, 0x1078,
++      0x3a94, 0x8108, 0x00f0, 0x4033, 0x0c7f, 0x1078, 0x1340, 0x007c,
++      0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0x7752, 0x2004,
++      0xd0a4, 0x0040, 0x4081, 0x2009, 0x0000, 0x1078, 0x428a, 0x6100,
++      0xd184, 0x0040, 0x4066, 0x6858, 0xa084, 0x00ff, 0x00c0, 0x4084,
++      0x6000, 0xd084, 0x0040, 0x4081, 0x6004, 0xa005, 0x00c0, 0x4087,
++      0x6003, 0x0000, 0x600b, 0x0000, 0x0078, 0x407e, 0x2011, 0x0001,
++      0x6860, 0xa005, 0x00c0, 0x406e, 0x2001, 0x001e, 0x8000, 0x6016,
++      0x6858, 0xa084, 0x00ff, 0x0040, 0x4081, 0x6006, 0x6858, 0x8007,
++      0xa084, 0x00ff, 0x0040, 0x4081, 0x600a, 0x6202, 0x127f, 0x0078,
++      0x425d, 0x127f, 0x0078, 0x4255, 0x127f, 0x0078, 0x424d, 0x127f,
++      0x0078, 0x4251, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001,
++      0x7752, 0x2004, 0xd0a4, 0x0040, 0x40e0, 0x2009, 0x0000, 0x1078,
++      0x428a, 0x6000, 0xa084, 0x0001, 0x0040, 0x40e0, 0x6204, 0x6308,
++      0x6c48, 0xa484, 0x0003, 0x0040, 0x40b8, 0x6958, 0xa18c, 0x00ff,
++      0x8001, 0x00c0, 0x40b1, 0x2100, 0xa210, 0x0048, 0x40dd, 0x0078,
++      0x40b8, 0x8001, 0x00c0, 0x40dd, 0x2100, 0xa212, 0x0048, 0x40dd,
++      0xa484, 0x000c, 0x0040, 0x40d2, 0x6958, 0x810f, 0xa18c, 0x00ff,
++      0xa082, 0x0004, 0x00c0, 0x40ca, 0x2100, 0xa318, 0x0048, 0x40dd,
++      0x0078, 0x40d2, 0xa082, 0x0004, 0x00c0, 0x40dd, 0x2100, 0xa31a,
++      0x0048, 0x40dd, 0x6860, 0xa005, 0x0040, 0x40d8, 0x8000, 0x6016,
++      0x6206, 0x630a, 0x127f, 0x0078, 0x425d, 0x127f, 0x0078, 0x4259,
++      0x127f, 0x0078, 0x4255, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001,
++      0x2009, 0x0000, 0x1078, 0x428a, 0x6308, 0x8318, 0x0048, 0x40f4,
++      0x630a, 0x127f, 0x0078, 0x426b, 0x127f, 0x0078, 0x4259, 0x127e,
++      0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0040,
++      0x410d, 0x2009, 0x0000, 0x0c7e, 0x1078, 0x4727, 0x6000, 0x2001,
++      0xfcff, 0x6002, 0x0c7f, 0x0078, 0x4144, 0x6858, 0xa005, 0x0040,
++      0x4159, 0x685c, 0xa065, 0x0040, 0x4155, 0x2001, 0x772c, 0x2004,
++      0xa005, 0x0040, 0x411f, 0x1078, 0x6bb6, 0x0078, 0x4125, 0x6013,
++      0x0400, 0x2009, 0x0041, 0x1078, 0x5d41, 0x6958, 0xa18c, 0xe600,
++      0xa186, 0x2000, 0x0040, 0x413c, 0xa186, 0x0400, 0x0040, 0x413c,
++      0x2009, 0x0000, 0x0c7e, 0x1078, 0x4727, 0x6000, 0xa084, 0xfdff,
++      0x6002, 0x0c7f, 0x0078, 0x4144, 0x027e, 0x2009, 0x0000, 0x2011,
++      0xfdff, 0x1078, 0x47d0, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x4151,
++      0x2009, 0x0000, 0x1078, 0x4727, 0x6008, 0x8000, 0x0048, 0x4151,
++      0x600a, 0x0c7f, 0x127f, 0x0078, 0x425d, 0x0c7f, 0x127f, 0x0078,
++      0x4255, 0x6954, 0xa186, 0x002a, 0x00c0, 0x4165, 0x2001, 0x770c,
++      0x200c, 0xc194, 0x2102, 0x0078, 0x4144, 0xa186, 0x0020, 0x0040,
++      0x417a, 0xa186, 0x0029, 0x00c0, 0x4155, 0x6944, 0xa18c, 0xff00,
++      0x810f, 0x1078, 0x384c, 0x00c0, 0x4144, 0x6000, 0xc0e4, 0x6002,
++      0x0078, 0x4144, 0x685c, 0xa065, 0x0040, 0x4155, 0x6017, 0x0014,
++      0x0078, 0x4144, 0x2009, 0x0000, 0x1078, 0x428a, 0x6000, 0xa084,
++      0x0001, 0x0040, 0x419c, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048,
++      0x4196, 0x6206, 0x2091, 0x8001, 0x0078, 0x426b, 0x2091, 0x8001,
++      0x6853, 0x0016, 0x0078, 0x4264, 0x6853, 0x0007, 0x0078, 0x4264,
++      0x6834, 0x8007, 0xa084, 0x00ff, 0x00c0, 0x41aa, 0x1078, 0x3f08,
++      0x0078, 0x41bc, 0x2030, 0x8001, 0x00c0, 0x41b4, 0x7007, 0x0001,
++      0x1078, 0x41bd, 0x0078, 0x41bc, 0x7007, 0x0006, 0x7012, 0x2d00,
++      0x7016, 0x701a, 0x704b, 0x41bd, 0x007c, 0x0e7e, 0x2009, 0x772c,
++      0x210c, 0x81ff, 0x00c0, 0x423f, 0x2009, 0x770c, 0x210c, 0xd194,
++      0x00c0, 0x4249, 0x6848, 0x2070, 0xae82, 0x7e00, 0x0048, 0x422e,
++      0x2001, 0x7715, 0x2004, 0xae02, 0x00c8, 0x422e, 0x2009, 0x0000,
++      0x1078, 0x428a, 0x6100, 0xa184, 0x0001, 0x0040, 0x4214, 0xa184,
++      0x0100, 0x00c0, 0x4232, 0xa184, 0x0200, 0x00c0, 0x4236, 0x601c,
++      0xa005, 0x00c0, 0x423a, 0x711c, 0xa186, 0x0006, 0x00c0, 0x4219,
++      0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x127e, 0x2091, 0x8000,
++      0x7010, 0xa005, 0x00c0, 0x420b, 0x7112, 0x7018, 0xa065, 0x0040,
++      0x423e, 0x6000, 0xd0e4, 0x00c0, 0x4243, 0x2e60, 0x1078, 0x4730,
++      0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800, 0xa005, 0x00c0, 0x420b,
++      0x6902, 0x127f, 0x0e7f, 0x007c, 0x0e7f, 0x6853, 0x0006, 0x0078,
++      0x4264, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078, 0x384c, 0x00c0,
++      0x4244, 0x6000, 0xd0e4, 0x00c0, 0x4244, 0x711c, 0xa186, 0x0007,
++      0x00c0, 0x422e, 0x6853, 0x0002, 0x0078, 0x4246, 0x6853, 0x0008,
++      0x0078, 0x4246, 0x6853, 0x000e, 0x0078, 0x4246, 0x6853, 0x0017,
++      0x0078, 0x4246, 0x6853, 0x0035, 0x0078, 0x4246, 0x127f, 0x6853,
++      0x0028, 0x0078, 0x4246, 0x127f, 0x6853, 0x0029, 0x0e7f, 0x0078,
++      0x4264, 0x6853, 0x002a, 0x0078, 0x4246, 0x2009, 0x003e, 0x0078,
++      0x425f, 0x2009, 0x0004, 0x0078, 0x425f, 0x2009, 0x0006, 0x0078,
++      0x425f, 0x2009, 0x0016, 0x0078, 0x425f, 0x2009, 0x0001, 0x6854,
++      0xa084, 0xff00, 0xa105, 0x6856, 0x2091, 0x8000, 0x1078, 0x3b92,
++      0x2091, 0x8001, 0x007c, 0x1078, 0x1340, 0x007c, 0x702c, 0x7130,
++      0x8108, 0xa102, 0x0048, 0x427b, 0xa00e, 0x7034, 0x7072, 0x7038,
++      0x7076, 0x0078, 0x4287, 0x7070, 0xa080, 0x0040, 0x7072, 0x00c8,
++      0x4287, 0x7074, 0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932,
++      0x7132, 0x007c, 0x0d7e, 0x1078, 0x4727, 0x0d7f, 0x007c, 0x0d7e,
++      0x2011, 0x0004, 0x2204, 0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c,
++      0x20e1, 0x0002, 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000,
++      0x0040, 0x42a6, 0xa086, 0x1000, 0x00c0, 0x42c2, 0x20e1, 0x0004,
++      0x3d60, 0xd1bc, 0x00c0, 0x42ad, 0x3e60, 0xac84, 0x0007, 0x00c0,
++      0x42c2, 0xac82, 0x7e00, 0x0048, 0x42c2, 0x6854, 0xac02, 0x00c8,
++      0x42c2, 0x2009, 0x0047, 0x1078, 0x5d41, 0x7a1c, 0xd284, 0x00c0,
++      0x4298, 0x007c, 0xa016, 0x1078, 0x156a, 0x0078, 0x42bd, 0x157e,
++      0x137e, 0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0070,
++      0x00c0, 0x42f0, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x42f0,
++      0x1078, 0x42fd, 0x0040, 0x42f0, 0x20e1, 0x3000, 0x7828, 0x7828,
++      0x1078, 0x431b, 0x147f, 0x137f, 0x157f, 0x2009, 0x793e, 0x2104,
++      0xa005, 0x00c0, 0x42ec, 0x007c, 0x1078, 0x4d96, 0x0078, 0x42eb,
++      0x1078, 0x7674, 0x1078, 0x42fd, 0x20e1, 0x3000, 0x7828, 0x7828,
++      0x147f, 0x137f, 0x157f, 0x0078, 0x42eb, 0xa484, 0x01ff, 0x687a,
++      0xa005, 0x0040, 0x430f, 0xa080, 0x001f, 0xa084, 0x03f8, 0x80ac,
++      0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c, 0x20a9,
++      0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0xa085,
++      0x0001, 0x0078, 0x430e, 0x7000, 0xa084, 0xff00, 0xa08c, 0xf000,
++      0x8007, 0xa196, 0x0000, 0x00c0, 0x4328, 0x0078, 0x449c, 0x007c,
++      0xa196, 0x2000, 0x00c0, 0x4339, 0x6900, 0xa18e, 0x0001, 0x00c0,
++      0x4335, 0x1078, 0x2ec1, 0x0078, 0x4327, 0x1078, 0x4341, 0x0078,
++      0x4327, 0xa196, 0x8000, 0x00c0, 0x4327, 0x1078, 0x4522, 0x0078,
++      0x4327, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, 0x0001,
++      0x0040, 0x434e, 0xa196, 0x0023, 0x00c0, 0x4443, 0xa08e, 0x0023,
++      0x00c0, 0x437f, 0x1078, 0x4599, 0x0040, 0x4443, 0x7124, 0x610a,
++      0x7030, 0xa08e, 0x0200, 0x00c0, 0x4367, 0x7034, 0xa005, 0x00c0,
++      0x4443, 0x2009, 0x0015, 0x1078, 0x5d41, 0x0078, 0x4443, 0xa08e,
++      0x0210, 0x00c0, 0x4371, 0x2009, 0x0015, 0x1078, 0x5d41, 0x0078,
++      0x4443, 0xa08e, 0x0100, 0x00c0, 0x4443, 0x7034, 0xa005, 0x00c0,
++      0x4443, 0x2009, 0x0016, 0x1078, 0x5d41, 0x0078, 0x4443, 0xa08e,
++      0x0022, 0x00c0, 0x4443, 0x7030, 0xa08e, 0x0300, 0x00c0, 0x4390,
++      0x7034, 0xa005, 0x00c0, 0x4443, 0x2009, 0x0017, 0x0078, 0x440f,
++      0xa08e, 0x0500, 0x00c0, 0x439c, 0x7034, 0xa005, 0x00c0, 0x4443,
++      0x2009, 0x0018, 0x0078, 0x440f, 0xa08e, 0x2010, 0x00c0, 0x43a4,
++      0x2009, 0x0019, 0x0078, 0x440f, 0xa08e, 0x2110, 0x00c0, 0x43ac,
++      0x2009, 0x001a, 0x0078, 0x440f, 0xa08e, 0x5200, 0x00c0, 0x43b8,
++      0x7034, 0xa005, 0x00c0, 0x4443, 0x2009, 0x001b, 0x0078, 0x440f,
++      0xa08e, 0x5000, 0x00c0, 0x43c4, 0x7034, 0xa005, 0x00c0, 0x4443,
++      0x2009, 0x001c, 0x0078, 0x440f, 0xa08e, 0x1200, 0x00c0, 0x43d0,
++      0x7034, 0xa005, 0x00c0, 0x4443, 0x2009, 0x0024, 0x0078, 0x440f,
++      0xa08c, 0xff00, 0xa18e, 0x2400, 0x00c0, 0x43da, 0x2009, 0x002d,
++      0x0078, 0x440f, 0xa08c, 0xff00, 0xa18e, 0x5300, 0x00c0, 0x43e4,
++      0x2009, 0x002a, 0x0078, 0x440f, 0xa08e, 0x0f00, 0x00c0, 0x43ec,
++      0x2009, 0x0020, 0x0078, 0x440f, 0xa08e, 0x5300, 0x00c0, 0x43f2,
++      0x0078, 0x440d, 0xa08e, 0x6104, 0x00c0, 0x440d, 0x2011, 0x7c8d,
++      0x8208, 0x2204, 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011,
++      0x8015, 0x211c, 0x8108, 0x2124, 0x1078, 0x2d59, 0x8108, 0x00f0,
++      0x43ff, 0x2009, 0x0023, 0x0078, 0x440f, 0x2009, 0x001d, 0x017e,
++      0x2011, 0x7c83, 0x2204, 0x8211, 0x220c, 0x1078, 0x207f, 0x00c0,
++      0x4445, 0x1078, 0x3811, 0x00c0, 0x4445, 0x6612, 0x6516, 0x86ff,
++      0x0040, 0x4435, 0x017f, 0x017e, 0xa186, 0x0017, 0x00c0, 0x4435,
++      0x6864, 0xa606, 0x00c0, 0x4435, 0x6868, 0xa506, 0xa084, 0xff00,
++      0x00c0, 0x4435, 0x6000, 0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x5cb4,
++      0x0040, 0x4448, 0x017f, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a,
++      0x017f, 0x1078, 0x5d41, 0x0c7f, 0x007c, 0x017f, 0x0078, 0x4443,
++      0x0c7f, 0x0078, 0x4445, 0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696,
++      0x00ff, 0x00c0, 0x446b, 0xa596, 0xfffd, 0x00c0, 0x445b, 0x2009,
++      0x007f, 0x0078, 0x4498, 0xa596, 0xfffe, 0x00c0, 0x4463, 0x2009,
++      0x007e, 0x0078, 0x4498, 0xa596, 0xfffc, 0x00c0, 0x446b, 0x2009,
++      0x0080, 0x0078, 0x4498, 0x2011, 0x0000, 0x2021, 0x007e, 0x20a9,
++      0x0082, 0x2071, 0x789e, 0x2e1c, 0x83ff, 0x00c0, 0x447d, 0x82ff,
++      0x00c0, 0x448c, 0x2410, 0x0078, 0x448c, 0x2368, 0x6b10, 0x007e,
++      0x2100, 0xa31e, 0x007f, 0x00c0, 0x448c, 0x6b14, 0xa31e, 0x00c0,
++      0x448c, 0x2408, 0x0078, 0x4498, 0x8420, 0x8e70, 0x00f0, 0x4473,
++      0x82ff, 0x00c0, 0x4497, 0xa085, 0x0001, 0x0078, 0x4499, 0x2208,
++      0xa006, 0x0d7f, 0x0e7f, 0x007c, 0xa084, 0x0007, 0x0079, 0x44a1,
++      0x007c, 0x44a9, 0x44a9, 0x44a9, 0x44a9, 0x44a9, 0x44aa, 0x44c3,
++      0x450b, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x44c2, 0x7120, 0x2160,
++      0xac8c, 0x0007, 0x00c0, 0x44c2, 0xac8a, 0x7e00, 0x0048, 0x44c2,
++      0x6854, 0xac02, 0x00c8, 0x44c2, 0x7124, 0x610a, 0x2009, 0x0046,
++      0x1078, 0x5d41, 0x007c, 0x0c7e, 0x7110, 0xd1bc, 0x00c0, 0x4509,
++      0x2011, 0x7c83, 0x2204, 0x8211, 0x220c, 0x1078, 0x207f, 0x00c0,
++      0x4509, 0x1078, 0x384c, 0x00c0, 0x4509, 0x6204, 0xa294, 0xff00,
++      0x8217, 0xa286, 0x0006, 0x00c0, 0x44ee, 0x0c7e, 0x1078, 0x5cb4,
++      0x017f, 0x0040, 0x4509, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a,
++      0x2009, 0x0044, 0x1078, 0x5d41, 0x0078, 0x4509, 0x0c7e, 0x1078,
++      0x5cb4, 0x017f, 0x0040, 0x4509, 0x611a, 0x601f, 0x0004, 0x7120,
++      0x610a, 0xa286, 0x0004, 0x00c0, 0x4501, 0x6007, 0x0005, 0x0078,
++      0x4503, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x498e, 0x1078,
++      0x4d96, 0x0c7f, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x4521, 0x7020,
++      0x2060, 0xac84, 0x0007, 0x00c0, 0x4521, 0xac82, 0x7e00, 0x0048,
++      0x4521, 0x6854, 0xac02, 0x00c8, 0x4521, 0x2009, 0x0045, 0x1078,
++      0x5d41, 0x007c, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000,
++      0x00c0, 0x4532, 0xa084, 0x000f, 0xa08a, 0x0006, 0x10c8, 0x12cd,
++      0x1079, 0x4533, 0x007c, 0x4539, 0x453a, 0x4539, 0x4539, 0x457b,
++      0x458a, 0x007c, 0x7110, 0xd1bc, 0x00c0, 0x457a, 0x700c, 0x7108,
++      0x1078, 0x207f, 0x00c0, 0x457a, 0x1078, 0x3811, 0x00c0, 0x457a,
++      0x6612, 0x6516, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006,
++      0x00c0, 0x4563, 0x0c7e, 0x1078, 0x5cb4, 0x017f, 0x0040, 0x457a,
++      0x611a, 0x601f, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x1078,
++      0x5d41, 0x0078, 0x457a, 0x0c7e, 0x1078, 0x5cb4, 0x017f, 0x0040,
++      0x457a, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004,
++      0x00c0, 0x4576, 0x2009, 0x0005, 0x0078, 0x4578, 0x2009, 0x0001,
++      0x1078, 0x5d41, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x4589, 0x1078,
++      0x4599, 0x0040, 0x4589, 0x7124, 0x610a, 0x2009, 0x0089, 0x1078,
++      0x5d41, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x4598, 0x1078, 0x4599,
++      0x0040, 0x4598, 0x7124, 0x610a, 0x2009, 0x008a, 0x1078, 0x5d41,
++      0x007c, 0x7020, 0x2060, 0xac84, 0x0007, 0x00c0, 0x45ac, 0xac82,
++      0x7e00, 0x0048, 0x45ac, 0x2001, 0x7715, 0x2004, 0xac02, 0x00c8,
++      0x45ac, 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x45ab, 0x2071,
++      0x7949, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7012,
++      0x7017, 0x7e00, 0x7007, 0x0000, 0x7026, 0x702b, 0x56a9, 0x7032,
++      0x7037, 0x56ea, 0x703b, 0x0002, 0x703f, 0x0000, 0x007c, 0x2071,
++      0x7949, 0x00e0, 0x4676, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e,
++      0x00c0, 0x463f, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e, 0x2091,
++      0x8000, 0x7138, 0x8109, 0x713a, 0x00c0, 0x463d, 0x703b, 0x0002,
++      0x2009, 0x0100, 0x2104, 0xa082, 0x0003, 0x00c8, 0x463d, 0x703c,
++      0xa086, 0x0001, 0x00c0, 0x461a, 0x0d7e, 0x2069, 0x0140, 0x6804,
++      0xa084, 0x4000, 0x0040, 0x45f8, 0x6803, 0x1000, 0x0078, 0x45ff,
++      0x6804, 0xa084, 0x1000, 0x0040, 0x45ff, 0x6803, 0x0100, 0x6803,
++      0x0000, 0x703f, 0x0000, 0x2069, 0x7936, 0x6804, 0xa082, 0x0006,
++      0x00c0, 0x460c, 0x6807, 0x0000, 0x6830, 0xa082, 0x0003, 0x00c0,
++      0x4613, 0x6833, 0x0000, 0x1078, 0x4d96, 0x1078, 0x4e56, 0x0d7f,
++      0x0078, 0x463d, 0x0d7e, 0x2069, 0x7700, 0x6944, 0x6860, 0xa102,
++      0x00c8, 0x463c, 0x2069, 0x7936, 0x6804, 0xa086, 0x0000, 0x00c0,
++      0x463c, 0x6830, 0xa086, 0x0000, 0x00c0, 0x463c, 0x703f, 0x0001,
++      0x6807, 0x0006, 0x6833, 0x0003, 0x2069, 0x0100, 0x6830, 0x689e,
++      0x2069, 0x0140, 0x6803, 0x0600, 0x0d7f, 0x0078, 0x4642, 0x127e,
++      0x2091, 0x8000, 0x7024, 0xa00d, 0x0040, 0x4653, 0x7020, 0x8001,
++      0x7022, 0x00c0, 0x4653, 0x7023, 0x0009, 0x8109, 0x7126, 0x00c0,
++      0x4653, 0x7028, 0x107a, 0x7030, 0xa00d, 0x0040, 0x4664, 0x702c,
++      0x8001, 0x702e, 0x00c0, 0x4664, 0x702f, 0x0009, 0x8109, 0x7132,
++      0x00c0, 0x4664, 0x7034, 0x107a, 0x7018, 0xa00d, 0x0040, 0x4675,
++      0x7008, 0x8001, 0x700a, 0x00c0, 0x4675, 0x700b, 0x0009, 0x8109,
++      0x711a, 0x00c0, 0x4675, 0x701c, 0x107a, 0x127f, 0x7004, 0x0079,
++      0x4679, 0x46a0, 0x46a1, 0x46bd, 0x0e7e, 0x2071, 0x7949, 0x7018,
++      0xa005, 0x00c0, 0x4687, 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f,
++      0x007c, 0x0e7e, 0x007e, 0x2071, 0x7949, 0x701c, 0xa206, 0x00c0,
++      0x4693, 0x701a, 0x701e, 0x007f, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
++      0x7949, 0x6088, 0xa102, 0x0048, 0x469e, 0x618a, 0x0e7f, 0x007c,
++      0x007c, 0x7110, 0x1078, 0x384c, 0x00c0, 0x46b3, 0x6088, 0x8001,
++      0x0048, 0x46b3, 0x608a, 0x00c0, 0x46b3, 0x127e, 0x2091, 0x8000,
++      0x1078, 0x4d96, 0x127f, 0x8108, 0xa182, 0x00ff, 0x0048, 0x46bb,
++      0xa00e, 0x7007, 0x0002, 0x7112, 0x007c, 0x7014, 0x2060, 0x127e,
++      0x2091, 0x8000, 0x6014, 0xa005, 0x0040, 0x46ec, 0x8001, 0x6016,
++      0x00c0, 0x46ec, 0x611c, 0xa186, 0x0003, 0x0040, 0x46d3, 0xa186,
++      0x0006, 0x00c0, 0x46ea, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a,
++      0x0048, 0x46ea, 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048,
++      0x46e3, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116,
++      0x0078, 0x46ec, 0x1078, 0x68e3, 0x127f, 0xac88, 0x0008, 0x7116,
++      0x2001, 0x7716, 0x2004, 0xa102, 0x0048, 0x46fa, 0x7017, 0x7e00,
++      0x7007, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x7949, 0x7027, 0x07d0,
++      0x7023, 0x0009, 0x703b, 0x0002, 0x0e7f, 0x007c, 0x2001, 0x7952,
++      0x2003, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x7949, 0x7033, 0x07d0,
++      0x702f, 0x0009, 0x0e7f, 0x007c, 0x2011, 0x7955, 0x2013, 0x0000,
++      0x007c, 0x0e7e, 0x2071, 0x7949, 0x711a, 0x721e, 0x700b, 0x0009,
++      0x0e7f, 0x007c, 0x0c7e, 0x2061, 0x79da, 0x0c7f, 0x007c, 0xa184,
++      0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x79da, 0x2060, 0x007c,
++      0x6854, 0xa08a, 0x199a, 0x0048, 0x4737, 0x2001, 0x1999, 0xa005,
++      0x00c0, 0x4747, 0x6944, 0x0c7e, 0x1078, 0x4727, 0x6014, 0x0c7f,
++      0xa005, 0x00c0, 0x474c, 0x2001, 0x001e, 0x0078, 0x474c, 0xa08e,
++      0xffff, 0x00c0, 0x474c, 0xa006, 0x8003, 0x800b, 0x810b, 0xa108,
++      0x6116, 0x684c, 0xa08c, 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x4787,
++      0xd0b4, 0x00c0, 0x4763, 0xd0bc, 0x00c0, 0x4775, 0x2009, 0x0006,
++      0x1078, 0x47aa, 0x007c, 0xd0fc, 0x0040, 0x4770, 0xa084, 0x0003,
++      0xa08e, 0x0003, 0x0040, 0x47a3, 0xa08e, 0x0000, 0x00c0, 0x47a3,
++      0x2009, 0x0043, 0x1078, 0x5d41, 0x007c, 0xd0fc, 0x0040, 0x4782,
++      0xa084, 0x0003, 0xa08e, 0x0003, 0x0040, 0x47a3, 0xa08e, 0x0000,
++      0x00c0, 0x47a3, 0x2009, 0x0042, 0x1078, 0x5d41, 0x007c, 0xd0fc,
++      0x0040, 0x4799, 0xa084, 0x0003, 0xa08e, 0x0003, 0x0040, 0x47a3,
++      0xa08e, 0x0002, 0x0040, 0x479d, 0x2009, 0x0041, 0x1078, 0x5d41,
++      0x007c, 0x1078, 0x47a8, 0x0078, 0x4798, 0x2009, 0x0043, 0x1078,
++      0x5d41, 0x0078, 0x4798, 0x2009, 0x0004, 0x1078, 0x47aa, 0x007c,
++      0x2009, 0x0001, 0x6010, 0xa0ec, 0xf000, 0x0040, 0x47cf, 0x2068,
++      0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0, 0x47c9, 0x694c,
++      0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x47c9, 0x0c7e, 0x2009,
++      0x0000, 0x1078, 0x4727, 0x6204, 0x8210, 0x0048, 0x47c8, 0x6206,
++      0x0c7f, 0x1078, 0x3b92, 0x6010, 0xa06d, 0x10c0, 0x4730, 0x007c,
++      0x157e, 0x0c7e, 0x20a9, 0x0010, 0x2061, 0x79da, 0x6000, 0x81ff,
++      0x0040, 0x47dd, 0xa205, 0x0078, 0x47de, 0xa204, 0x6002, 0xace0,
++      0x0008, 0x00f0, 0x47d6, 0x0c7f, 0x157f, 0x007c, 0x6808, 0xa005,
++      0x0040, 0x47ee, 0x8001, 0x680a, 0xa085, 0x0001, 0x007c, 0x127e,
++      0x2091, 0x2200, 0x2079, 0x7936, 0x127f, 0x0d7e, 0x2069, 0x7936,
++      0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001, 0x206a,
++      0x0d7f, 0x007c, 0x0c7e, 0x6027, 0x0001, 0x7804, 0xa084, 0x0007,
++      0x0079, 0x480a, 0x4814, 0x4839, 0x4894, 0x481a, 0x4839, 0x4812,
++      0x4812, 0x4812, 0x1078, 0x12cd, 0x1078, 0x4706, 0x1078, 0x4d96,
++      0x0c7f, 0x007c, 0x62c0, 0x82ff, 0x00c0, 0x4820, 0x0c7f, 0x007c,
++      0x2011, 0x3558, 0x1078, 0x4689, 0x7828, 0xa092, 0x0002, 0x00c8,
++      0x482f, 0x8000, 0x782a, 0x1078, 0x3588, 0x0078, 0x481e, 0x1078,
++      0x3558, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0078,
++      0x481e, 0x1078, 0x4706, 0x3c00, 0x007e, 0x2011, 0x0209, 0x20e1,
++      0x4000, 0x2214, 0x007f, 0x20e0, 0x82ff, 0x0040, 0x4857, 0x62c0,
++      0x82ff, 0x00c0, 0x4857, 0x782b, 0x0000, 0x7824, 0xa065, 0x1040,
++      0x12cd, 0x2009, 0x0013, 0x1078, 0x5d41, 0x0c7f, 0x007c, 0x3900,
++      0xa082, 0x7a7a, 0x00c8, 0x485e, 0x1078, 0x5c44, 0x0c7e, 0x7824,
++      0xa065, 0x1040, 0x12cd, 0x7804, 0xa086, 0x0004, 0x0040, 0x48d9,
++      0x7828, 0xa092, 0x2710, 0x00c8, 0x4874, 0x8000, 0x782a, 0x0c7f,
++      0x1078, 0x568e, 0x0078, 0x4855, 0x6104, 0xa186, 0x0003, 0x00c0,
++      0x488b, 0x0e7e, 0x2071, 0x7700, 0x70c8, 0x0e7f, 0xd08c, 0x0040,
++      0x488b, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071, 0x7700, 0x1078,
++      0x3591, 0x0e7f, 0x0c7f, 0x1078, 0x76c7, 0x2009, 0x0014, 0x1078,
++      0x5d41, 0x0c7f, 0x0078, 0x4855, 0x2001, 0x7952, 0x2003, 0x0000,
++      0x62c0, 0x82ff, 0x00c0, 0x48a8, 0x782b, 0x0000, 0x7824, 0xa065,
++      0x1040, 0x12cd, 0x2009, 0x0013, 0x1078, 0x5d8f, 0x0c7f, 0x007c,
++      0x0c7e, 0x0d7e, 0x3900, 0xa082, 0x7a7a, 0x00c8, 0x48b1, 0x1078,
++      0x5c44, 0x7824, 0xa005, 0x1040, 0x12cd, 0x781c, 0xa06d, 0x1040,
++      0x12cd, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x1078, 0x5d1a,
++      0x693c, 0x81ff, 0x1040, 0x12cd, 0x8109, 0x693e, 0x6854, 0xa015,
++      0x0040, 0x48cd, 0x7a1e, 0x0078, 0x48cf, 0x7918, 0x791e, 0x7807,
++      0x0000, 0x7827, 0x0000, 0x0d7f, 0x0c7f, 0x1078, 0x4d96, 0x0078,
++      0x48a6, 0x6104, 0xa186, 0x0002, 0x0040, 0x48e4, 0xa186, 0x0004,
++      0x0040, 0x48e4, 0x0078, 0x4868, 0x7808, 0xac06, 0x0040, 0x4868,
++      0x1078, 0x4c9d, 0x1078, 0x498e, 0x0c7f, 0x1078, 0x4d96, 0x0078,
++      0x4855, 0x0c7e, 0x6027, 0x0002, 0x2011, 0x7955, 0x2013, 0x0000,
++      0x62c8, 0x82ff, 0x00c0, 0x490b, 0x62c4, 0x82ff, 0x00c0, 0x490b,
++      0x793c, 0xa1e5, 0x0000, 0x0040, 0x4909, 0x2009, 0x0049, 0x1078,
++      0x5d41, 0x0c7f, 0x007c, 0x3908, 0xa192, 0x7a7a, 0x00c8, 0x4912,
++      0x1078, 0x5c44, 0x6017, 0x0010, 0x793c, 0x81ff, 0x0040, 0x4909,
++      0x7944, 0xa192, 0x7530, 0x00c8, 0x4931, 0x8108, 0x7946, 0x1078,
++      0x470b, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0,
++      0x492d, 0x6017, 0x0012, 0x0078, 0x4909, 0x6017, 0x0016, 0x0078,
++      0x4909, 0x037e, 0x2019, 0x0001, 0x1078, 0x5880, 0x037f, 0x1078,
++      0x76c7, 0x793c, 0x2160, 0x2009, 0x004a, 0x1078, 0x5d41, 0x0078,
++      0x4909, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f,
++      0x0000, 0x2c08, 0x2061, 0x7936, 0x6020, 0x8000, 0x6022, 0x6010,
++      0xa005, 0x0040, 0x495c, 0xa080, 0x0003, 0x2102, 0x6112, 0x127f,
++      0x0c7f, 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078, 0x4957,
++      0x0d7e, 0x2069, 0x7936, 0x6000, 0xd0d4, 0x0040, 0x4975, 0x6820,
++      0x8000, 0x6822, 0xa086, 0x0001, 0x00c0, 0x4970, 0x2c00, 0x681e,
++      0x6804, 0xa084, 0x0007, 0x0079, 0x4d9e, 0xc0d5, 0x6002, 0x6818,
++      0xa005, 0x0040, 0x4987, 0x6056, 0x605b, 0x0000, 0x007e, 0x2c00,
++      0x681a, 0x0d7f, 0x685a, 0x2069, 0x7936, 0x0078, 0x4967, 0x6056,
++      0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x4967, 0x007e, 0x017e,
++      0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
++      0x7936, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040, 0x49a9,
++      0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f, 0x007f,
++      0x007c, 0x610e, 0x610a, 0x0078, 0x49a4, 0x0c7e, 0x600f, 0x0000,
++      0x2c08, 0x2061, 0x7936, 0x6034, 0xa005, 0x0040, 0x49bd, 0xa080,
++      0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136, 0x0078,
++      0x49bb, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e,
++      0x127e, 0x2071, 0x7936, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000,
++      0x8cff, 0x0040, 0x4a23, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
++      0x00c0, 0x4a1e, 0x703c, 0xac06, 0x00c0, 0x49e3, 0x6003, 0x000a,
++      0x630a, 0x0078, 0x4a1e, 0x7038, 0xac36, 0x00c0, 0x49e9, 0x660c,
++      0x763a, 0x7034, 0xac36, 0x00c0, 0x49f7, 0x2c00, 0xaf36, 0x0040,
++      0x49f5, 0x2f00, 0x7036, 0x0078, 0x49f7, 0x7037, 0x0000, 0x660c,
++      0x067e, 0x2c00, 0xaf06, 0x0040, 0x4a00, 0x7e0e, 0x0078, 0x4a01,
++      0x2678, 0x600f, 0x0000, 0x1078, 0x6a58, 0x0040, 0x4a19, 0x6010,
++      0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x4a2c, 0x6837, 0x0103,
++      0x6b4a, 0x6847, 0x0000, 0x1078, 0x6c54, 0x1078, 0x3b92, 0x1078,
++      0x6ba9, 0x1078, 0x6bb6, 0x0c7f, 0x0078, 0x49d0, 0x2c78, 0x600c,
++      0x2060, 0x0078, 0x49d0, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f,
++      0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0,
++      0x4a0e, 0x1078, 0x75fd, 0x0078, 0x4a19, 0x007e, 0x067e, 0x0c7e,
++      0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091, 0x8000, 0x2079,
++      0x7936, 0x7838, 0xa065, 0x0040, 0x4a6c, 0x600c, 0x007e, 0x600f,
++      0x0000, 0x783c, 0xac06, 0x00c0, 0x4a53, 0x6003, 0x000a, 0x630a,
++      0x2c30, 0x0078, 0x4a69, 0x1078, 0x6a58, 0x0040, 0x4a67, 0x6010,
++      0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x4a75, 0x6837, 0x0103,
++      0x6b4a, 0x6847, 0x0000, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x1078,
++      0x6bb6, 0x007f, 0x0078, 0x4a42, 0x7e3a, 0x7e36, 0x127f, 0x0f7f,
++      0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c, 0xa086, 0x0006,
++      0x00c0, 0x4a5e, 0x1078, 0x75fd, 0x0078, 0x4a67, 0x027e, 0x1078,
++      0x4a92, 0x1078, 0x4b2b, 0x027f, 0x007c, 0x0f7e, 0x127e, 0x2079,
++      0x7936, 0x2091, 0x8000, 0x1078, 0x4bc2, 0x1078, 0x4c2a, 0x127f,
++      0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e,
++      0x127e, 0x2091, 0x8000, 0x2071, 0x7936, 0x7614, 0x2660, 0x2678,
++      0x8cff, 0x0040, 0x4b1a, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
++      0x00c0, 0x4b15, 0x7024, 0xac06, 0x00c0, 0x4ad8, 0x2069, 0x0100,
++      0x68c0, 0xa005, 0x0040, 0x4ad3, 0x1078, 0x569c, 0x68c3, 0x0000,
++      0x1078, 0x5b4a, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
++      0xa384, 0x1000, 0x0040, 0x4ac8, 0x6803, 0x0100, 0x6803, 0x0000,
++      0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x4ad0, 0x6827, 0x0001,
++      0x037f, 0x0078, 0x4ad8, 0x6003, 0x0009, 0x630a, 0x0078, 0x4b15,
++      0x7014, 0xac36, 0x00c0, 0x4ade, 0x660c, 0x7616, 0x7010, 0xac36,
++      0x00c0, 0x4aec, 0x2c00, 0xaf36, 0x0040, 0x4aea, 0x2f00, 0x7012,
++      0x0078, 0x4aec, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++      0x0040, 0x4af5, 0x7e0e, 0x0078, 0x4af6, 0x2678, 0x600f, 0x0000,
++      0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x4b0e, 0x601c, 0xa086,
++      0x0003, 0x00c0, 0x4b22, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++      0x1078, 0x6c54, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x1078, 0x6bb6,
++      0x1078, 0x5a1a, 0x0c7f, 0x0078, 0x4aa0, 0x2c78, 0x600c, 0x2060,
++      0x0078, 0x4aa0, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f,
++      0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x4b03, 0x1078,
++      0x75fd, 0x0078, 0x4b0e, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000,
++      0xa280, 0x7820, 0x2004, 0xa065, 0x0040, 0x4bbe, 0x0f7e, 0x0e7e,
++      0x0d7e, 0x067e, 0x2071, 0x7936, 0x6654, 0x7018, 0xac06, 0x00c0,
++      0x4b42, 0x761a, 0x701c, 0xac06, 0x00c0, 0x4b4e, 0x86ff, 0x00c0,
++      0x4b4d, 0x7018, 0x701e, 0x0078, 0x4b4e, 0x761e, 0x6058, 0xa07d,
++      0x0040, 0x4b53, 0x7e56, 0xa6ed, 0x0000, 0x0040, 0x4b59, 0x2f00,
++      0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc,
++      0x6002, 0x1078, 0x37c5, 0x0040, 0x4bba, 0x7624, 0x86ff, 0x0040,
++      0x4baa, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x4baa, 0x0d7e,
++      0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x4ba1, 0x1078, 0x569c,
++      0x68c3, 0x0000, 0x1078, 0x5b4a, 0x7027, 0x0000, 0x037e, 0x2069,
++      0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x4b8a, 0x6803, 0x0100,
++      0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x4b92,
++      0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040,
++      0x4b9b, 0x8001, 0x603e, 0x2660, 0x1078, 0x6bb6, 0x0c7f, 0x0078,
++      0x4baa, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f,
++      0x0078, 0x4b61, 0x8dff, 0x0040, 0x4bb6, 0x6837, 0x0103, 0x6b4a,
++      0x6847, 0x0000, 0x1078, 0x6c54, 0x1078, 0x3b92, 0x1078, 0x5a1a,
++      0x0078, 0x4b61, 0x067f, 0x0d7f, 0x0e7f, 0x0f7f, 0x127f, 0x007f,
++      0x0c7f, 0x007c, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0x0000,
++      0x7814, 0xa065, 0x0040, 0x4c1a, 0x600c, 0x007e, 0x600f, 0x0000,
++      0x7824, 0xac06, 0x00c0, 0x4bff, 0x2069, 0x0100, 0x68c0, 0xa005,
++      0x0040, 0x4bf9, 0x1078, 0x569c, 0x68c3, 0x0000, 0x1078, 0x5b4a,
++      0x7827, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
++      0x0040, 0x4bee, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++      0x6824, 0xd084, 0x0040, 0x4bf6, 0x6827, 0x0001, 0x037f, 0x0078,
++      0x4bff, 0x6003, 0x0009, 0x630a, 0x2c30, 0x0078, 0x4c17, 0x6010,
++      0x2068, 0x1078, 0x6a58, 0x0040, 0x4c13, 0x601c, 0xa086, 0x0003,
++      0x00c0, 0x4c21, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
++      0x3b92, 0x1078, 0x6ba9, 0x1078, 0x6bb6, 0x1078, 0x5a1a, 0x007f,
++      0x0078, 0x4bc9, 0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
++      0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x4c0a, 0x1078, 0x75fd,
++      0x0078, 0x4c13, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x7818, 0xa065,
++      0x0040, 0x4c96, 0x6054, 0x007e, 0x6057, 0x0000, 0x605b, 0x0000,
++      0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x37c5, 0x0040, 0x4c93,
++      0x7e24, 0x86ff, 0x0040, 0x4c85, 0xa680, 0x0004, 0x2004, 0xad06,
++      0x00c0, 0x4c85, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040,
++      0x4c7c, 0x1078, 0x569c, 0x68c3, 0x0000, 0x1078, 0x5b4a, 0x7827,
++      0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040,
++      0x4c65, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824,
++      0xd084, 0x0040, 0x4c6d, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e,
++      0x603c, 0xa005, 0x0040, 0x4c76, 0x8001, 0x603e, 0x2660, 0x1078,
++      0x6bb6, 0x0c7f, 0x0078, 0x4c85, 0x0d7f, 0x0c7e, 0x2660, 0x6003,
++      0x0009, 0x630a, 0x0c7f, 0x0078, 0x4c3c, 0x8dff, 0x0040, 0x4c8f,
++      0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x3b92, 0x1078,
++      0x5a1a, 0x0078, 0x4c3c, 0x007f, 0x0078, 0x4c2f, 0x781e, 0x781a,
++      0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x0e7e, 0x0c7e, 0x2071,
++      0x7936, 0x7004, 0xa084, 0x0007, 0x0079, 0x4ca6, 0x4cb0, 0x4cb3,
++      0x4ccc, 0x4ce8, 0x4d2d, 0x4cb0, 0x4cb0, 0x4cae, 0x1078, 0x12cd,
++      0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040, 0x4cc1, 0x7020,
++      0x8001, 0x7022, 0x600c, 0xa015, 0x0040, 0x4cc8, 0x7216, 0x600f,
++      0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c,
++      0x7216, 0x7212, 0x0078, 0x4cc1, 0x6018, 0x2060, 0x1078, 0x37c5,
++      0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, 0x0040, 0x4cdd,
++      0x6054, 0xa015, 0x0040, 0x4ce4, 0x721e, 0x7007, 0x0000, 0x7027,
++      0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, 0x721e, 0x0078, 0x4cdd,
++      0x7024, 0xa065, 0x0040, 0x4d2a, 0x700c, 0xac06, 0x00c0, 0x4cff,
++      0x1078, 0x5a1a, 0x600c, 0xa015, 0x0040, 0x4cfb, 0x720e, 0x600f,
++      0x0000, 0x0078, 0x4d28, 0x720e, 0x720a, 0x0078, 0x4d28, 0x7014,
++      0xac06, 0x00c0, 0x4d12, 0x1078, 0x5a1a, 0x600c, 0xa015, 0x0040,
++      0x4d0e, 0x7216, 0x600f, 0x0000, 0x0078, 0x4d28, 0x7216, 0x7212,
++      0x0078, 0x4d28, 0x6018, 0x2060, 0x1078, 0x37c5, 0x6000, 0xc0dc,
++      0x6002, 0x1078, 0x5a1a, 0x701c, 0xa065, 0x0040, 0x4d28, 0x6054,
++      0xa015, 0x0040, 0x4d26, 0x721e, 0x0078, 0x4d28, 0x7218, 0x721e,
++      0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, 0x0040,
++      0x4d3a, 0x1078, 0x5a1a, 0x600c, 0xa015, 0x0040, 0x4d41, 0x720e,
++      0x600f, 0x0000, 0x1078, 0x5b4a, 0x7027, 0x0000, 0x0c7f, 0x0e7f,
++      0x007c, 0x720e, 0x720a, 0x0078, 0x4d3a, 0x0d7e, 0x2069, 0x7936,
++      0x6830, 0xa084, 0x0003, 0x0079, 0x4d4d, 0x4d53, 0x4d55, 0x4d7b,
++      0x4d53, 0x1078, 0x12cd, 0x0d7f, 0x007c, 0x0c7e, 0x6840, 0xa086,
++      0x0001, 0x0040, 0x4d71, 0x683c, 0xa065, 0x0040, 0x4d66, 0x600c,
++      0xa015, 0x0040, 0x4d6d, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000,
++      0x683f, 0x0000, 0x0c7f, 0x0d7f, 0x007c, 0x683a, 0x6836, 0x0078,
++      0x4d66, 0x6843, 0x0000, 0x6838, 0xa065, 0x0040, 0x4d66, 0x6003,
++      0x0003, 0x0078, 0x4d66, 0x0c7e, 0x6843, 0x0000, 0x6847, 0x0000,
++      0x683c, 0xa065, 0x0040, 0x4d93, 0x600c, 0xa015, 0x0040, 0x4d8f,
++      0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, 0x0078, 0x4d93, 0x683f,
++      0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f, 0x007c, 0x0d7e, 0x2069,
++      0x7936, 0x6804, 0xa084, 0x0007, 0x0079, 0x4d9e, 0x4da8, 0x4e45,
++      0x4e45, 0x4e45, 0x4e45, 0x4e47, 0x4e45, 0x4da6, 0x1078, 0x12cd,
++      0x6820, 0xa005, 0x00c0, 0x4dae, 0x0d7f, 0x007c, 0x0c7e, 0x680c,
++      0xa065, 0x0040, 0x4dbd, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000,
++      0x1078, 0x4e8d, 0x0c7f, 0x0d7f, 0x007c, 0x6814, 0xa065, 0x0040,
++      0x4dcb, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x1078, 0x4e8d,
++      0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e, 0x6a1c, 0xa2f5, 0x0000,
++      0x0040, 0x4e40, 0x704c, 0xa00d, 0x0040, 0x4dda, 0x7088, 0xa005,
++      0x0040, 0x4df2, 0x7054, 0xa075, 0x0040, 0x4de3, 0xa20e, 0x0040,
++      0x4e40, 0x0078, 0x4de8, 0x6818, 0xa20e, 0x0040, 0x4e40, 0x2070,
++      0x704c, 0xa00d, 0x0040, 0x4dda, 0x7088, 0xa005, 0x00c0, 0x4dda,
++      0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x00c8, 0x4dda, 0x1078,
++      0x5ce9, 0x0040, 0x4e40, 0x8318, 0x733e, 0x6112, 0x2e10, 0x621a,
++      0xa180, 0x0015, 0x2004, 0xa08a, 0x199a, 0x0048, 0x4e09, 0x2001,
++      0x1999, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x037f, 0x0f7e,
++      0x2c78, 0x71a0, 0xd1bc, 0x0040, 0x4e22, 0x7100, 0xd1f4, 0x0040,
++      0x4e1e, 0x7114, 0xa18c, 0x00ff, 0x0078, 0x4e27, 0x2009, 0x0000,
++      0x0078, 0x4e27, 0xa1e0, 0x2329, 0x2c0c, 0xa18c, 0x00ff, 0x2061,
++      0x0100, 0x619a, 0x1078, 0x52de, 0x7300, 0xc3dd, 0x7302, 0x6807,
++      0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x781f, 0x0003, 0x7803,
++      0x0001, 0x7807, 0x0040, 0x0f7f, 0x0e7f, 0x0c7f, 0x0d7f, 0x007c,
++      0x037f, 0x0e7f, 0x0c7f, 0x0078, 0x4e3e, 0x0d7f, 0x007c, 0x0c7e,
++      0x680c, 0xa065, 0x0040, 0x4e53, 0x6807, 0x0004, 0x6826, 0x682b,
++      0x0000, 0x1078, 0x4e8d, 0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0d7e,
++      0x2069, 0x7936, 0x6830, 0xa086, 0x0000, 0x00c0, 0x4e74, 0x6838,
++      0xa07d, 0x0040, 0x4e74, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000,
++      0x127e, 0x0f7e, 0x2091, 0x2200, 0x027f, 0x1078, 0x1a44, 0x00c0,
++      0x4e77, 0x127f, 0x1078, 0x5571, 0x0d7f, 0x0f7f, 0x007c, 0x127f,
++      0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0040, 0x4e89,
++      0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0078,
++      0x4e74, 0x683a, 0x6836, 0x0078, 0x4e83, 0x601c, 0xa084, 0x000f,
++      0x1079, 0x4e93, 0x007c, 0x4e9c, 0x4ea1, 0x51a8, 0x529e, 0x4ea1,
++      0x51a8, 0x529e, 0x4e9c, 0x4ea1, 0x1078, 0x4c9d, 0x1078, 0x4d96,
++      0x007c, 0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a,
++      0x0030, 0x10c8, 0x12cd, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040,
++      0x4ebe, 0x7900, 0xd1f4, 0x0040, 0x4eba, 0x7914, 0xa18c, 0x00ff,
++      0x0078, 0x4ec3, 0x2009, 0x0000, 0x0078, 0x4ec3, 0xa1f8, 0x2329,
++      0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0x1079,
++      0x4ecf, 0x0f7f, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x4f01,
++      0x4f39, 0x4f51, 0x4fd0, 0x4ffd, 0x5005, 0x5026, 0x5037, 0x5048,
++      0x5050, 0x5061, 0x5050, 0x50a9, 0x5037, 0x50ca, 0x50d2, 0x5048,
++      0x50d2, 0x50e3, 0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x4eff,
++      0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x4eff, 0x5758, 0x576d,
++      0x5790, 0x57b4, 0x5026, 0x4eff, 0x5026, 0x5050, 0x4eff, 0x4f51,
++      0x4fd0, 0x4eff, 0x5c64, 0x5050, 0x4eff, 0x5c87, 0x5050, 0x1078,
++      0x12cd, 0x20a1, 0x020b, 0x1078, 0x50f8, 0x20a3, 0x5200, 0x20a3,
++      0x0000, 0x0d7e, 0x2069, 0x7751, 0x6804, 0xd084, 0x0040, 0x4f1b,
++      0x6828, 0x20a3, 0x0000, 0x017e, 0x1078, 0x2094, 0x21a2, 0x017f,
++      0x0d7f, 0x0078, 0x4f20, 0x0d7f, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a9, 0x0004, 0x2099, 0x7705, 0x53a6, 0x20a9, 0x0004, 0x2099,
++      0x7701, 0x53a6, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, 0x5688,
++      0x007c, 0x20a1, 0x020b, 0x1078, 0x50f8, 0x20a3, 0x0500, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2, 0x20a9,
++      0x0004, 0x2099, 0x7705, 0x53a6, 0x60c3, 0x0010, 0x1078, 0x5688,
++      0x007c, 0x20a1, 0x020b, 0x1078, 0x50f8, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xa086, 0x007e, 0x00c0, 0x4f64, 0x20a3, 0x0400, 0x620c,
++      0xc2b4, 0x620e, 0x0078, 0x4f66, 0x20a3, 0x0300, 0x20a3, 0x0000,
++      0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x4f9f,
++      0x2099, 0x7920, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, 0xa084,
++      0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x7705,
++      0x53a6, 0x20a9, 0x0004, 0x2099, 0x7701, 0x53a6, 0x20a9, 0x0010,
++      0x20a3, 0x0000, 0x00f0, 0x4f90, 0x2099, 0x7928, 0x33a6, 0x20a9,
++      0x0007, 0x20a3, 0x0000, 0x00f0, 0x4f99, 0x0078, 0x4fbf, 0x2099,
++      0x7920, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0004, 0x2099, 0x7705,
++      0x53a6, 0x20a9, 0x0004, 0x2099, 0x7701, 0x53a6, 0x20a9, 0x0008,
++      0x20a3, 0x0000, 0x00f0, 0x4fb0, 0x20a9, 0x0008, 0x20a3, 0x0000,
++      0x00f0, 0x4fb6, 0x2099, 0x7928, 0x20a9, 0x0008, 0x53a6, 0x20a9,
++      0x0008, 0x20a3, 0x0000, 0x00f0, 0x4fc1, 0x20a9, 0x000a, 0x20a3,
++      0x0000, 0x00f0, 0x4fc7, 0x60c3, 0x0074, 0x1078, 0x5688, 0x007c,
++      0x20a1, 0x020b, 0x1078, 0x50f8, 0x20a3, 0x2010, 0x20a3, 0x0014,
++      0x20a3, 0x0800, 0x20a3, 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++      0x20a2, 0x20a2, 0x0f7e, 0x2079, 0x7751, 0x7904, 0x0f7f, 0xd1ac,
++      0x00c0, 0x4fec, 0xa085, 0x0020, 0xd1a4, 0x0040, 0x4ff1, 0xa085,
++      0x0010, 0xa085, 0x0002, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0014, 0x1078, 0x5688, 0x007c, 0x20a1, 0x020b, 0x1078,
++      0x50f8, 0x20a3, 0x5000, 0x0078, 0x4f66, 0x20a1, 0x020b, 0x1078,
++      0x50f8, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x60c3, 0x0014, 0x1078, 0x5688, 0x007c, 0x20a1, 0x020b,
++      0x1078, 0x516f, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078, 0x5688, 0x007c, 0x20a1,
++      0x020b, 0x1078, 0x516f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++      0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x1078, 0x5688, 0x007c,
++      0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0200, 0x0078, 0x4f66,
++      0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0100, 0x20a3, 0x0000,
++      0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x5688,
++      0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0210,
++      0x20a3, 0x0014, 0x20a3, 0x0800, 0x7818, 0x2068, 0x6894, 0xa086,
++      0x0014, 0x00c0, 0x5087, 0x6998, 0xa184, 0xc000, 0x00c0, 0x5083,
++      0xd1ec, 0x0040, 0x507f, 0x20a3, 0x2100, 0x0078, 0x5089, 0x20a3,
++      0x0100, 0x0078, 0x5089, 0x20a3, 0x0400, 0x0078, 0x5089, 0x20a3,
++      0x0700, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e,
++      0x2079, 0x7751, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x5099, 0xa085,
++      0x0020, 0xd1a4, 0x0040, 0x509e, 0xa085, 0x0010, 0xa085, 0x0002,
++      0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x1078, 0x5688, 0x0d7f,
++      0x007c, 0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0210, 0x20a3,
++      0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
++      0x5688, 0x007c, 0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0200,
++      0x0078, 0x4f07, 0x20a1, 0x020b, 0x1078, 0x516f, 0x20a3, 0x0100,
++      0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008,
++      0x1078, 0x5688, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1,
++      0x020b, 0x1078, 0x516f, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3,
++      0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x1078, 0x5688, 0x007c,
++      0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++      0x2014, 0xa286, 0x007e, 0x00c0, 0x510b, 0x20a3, 0x22ff, 0x20a3,
++      0xfffe, 0x0078, 0x5139, 0xa286, 0x007f, 0x00c0, 0x5116, 0x0d7e,
++      0x20a3, 0x22ff, 0x20a3, 0xfffd, 0x0078, 0x512d, 0xd2bc, 0x0040,
++      0x5135, 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x5124, 0x20a3, 0x22ff,
++      0x20a3, 0xfffc, 0x0078, 0x512d, 0xa2e8, 0x7820, 0x2d6c, 0x6810,
++      0xa085, 0x2200, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6,
++      0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x513d, 0x20a3, 0x2200, 0x6298,
++      0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0129, 0x20a3,
++      0x0000, 0x1078, 0x5677, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3,
++      0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc,
++      0x22a2, 0x0d7e, 0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++      0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x5141, 0x20a3, 0x0100,
++      0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, 0x007c, 0x027e,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
++      0xa092, 0x007e, 0x0048, 0x518e, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c,
++      0x6810, 0xa085, 0x2300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5196, 0x20a3, 0x2300,
++      0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0198,
++      0x20a3, 0x0000, 0x1078, 0x5677, 0x22a2, 0x20a3, 0x0000, 0x7a08,
++      0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c,
++      0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x12cd, 0xa08a,
++      0x008c, 0x10c8, 0x12cd, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040,
++      0x51c6, 0x7900, 0xd1f4, 0x0040, 0x51c2, 0x7914, 0xa18c, 0x00ff,
++      0x0078, 0x51cb, 0x2009, 0x0000, 0x0078, 0x51cb, 0xa1f8, 0x2329,
++      0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082,
++      0x0085, 0x1079, 0x51d6, 0x0f7f, 0x0c7f, 0x007c, 0x51df, 0x51ea,
++      0x5204, 0x51dd, 0x51dd, 0x51dd, 0x51df, 0x1078, 0x12cd, 0x147e,
++      0x20a1, 0x020b, 0x1078, 0x5217, 0x60c3, 0x0000, 0x1078, 0x5688,
++      0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x5244, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x2fa2, 0x20a3, 0x0000,
++      0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c,
++      0x1078, 0x5688, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078,
++      0x5271, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x60c3, 0x0004, 0x1078, 0x5688, 0x147f, 0x007c, 0x027e,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
++      0xa092, 0x007e, 0x0048, 0x5236, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c,
++      0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x523e, 0x20a3, 0x8100,
++      0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0009,
++      0x20a3, 0x0000, 0x0078, 0x5141, 0x027e, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048,
++      0x5263, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c, 0x6810, 0xa085, 0x8400,
++      0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6,
++      0x0d7f, 0x0078, 0x526b, 0x20a3, 0x8400, 0x6298, 0x22a2, 0x20a3,
++      0x0000, 0x6230, 0x22a2, 0x20a3, 0x00d1, 0x20a3, 0x0000, 0x0078,
++      0x519a, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++      0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x5290, 0x0d7e, 0xa0e8,
++      0x7820, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2,
++      0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5298,
++      0x20a3, 0x8500, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2,
++      0x20a3, 0x00d1, 0x20a3, 0x0000, 0x0078, 0x519a, 0x0c7e, 0x0f7e,
++      0x2c78, 0x7804, 0xa08a, 0x0040, 0x1048, 0x12cd, 0xa08a, 0x0050,
++      0x10c8, 0x12cd, 0x7918, 0x2160, 0x61a0, 0xd1bc, 0x0040, 0x52bd,
++      0x6100, 0xd1f4, 0x0040, 0x52b9, 0x6114, 0xa18c, 0x00ff, 0x0078,
++      0x52c2, 0x2009, 0x0000, 0x0078, 0x52c2, 0xa1e0, 0x2329, 0x2c0c,
++      0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040, 0x1079,
++      0x52cc, 0x0f7f, 0x0c7f, 0x007c, 0x52de, 0x53c4, 0x536c, 0x54ec,
++      0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x5933,
++      0x5944, 0x5955, 0x5966, 0x52dc, 0x1078, 0x12cd, 0x0d7e, 0x157e,
++      0x147e, 0x20a1, 0x020b, 0x1078, 0x532f, 0x7910, 0x2168, 0x6948,
++      0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184, 0x0006,
++      0x8004, 0x20a2, 0xd1ac, 0x0040, 0x52f9, 0x20a3, 0x0002, 0x0078,
++      0x5305, 0xd1b4, 0x0040, 0x5300, 0x20a3, 0x0001, 0x0078, 0x5305,
++      0x20a3, 0x0000, 0x2230, 0x0078, 0x5307, 0x6a80, 0x6e7c, 0x20a9,
++      0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, 0x00f0,
++      0x530b, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014,
++      0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0x7952, 0x2003,
++      0x07d0, 0x2001, 0x7951, 0x2003, 0x0009, 0x2001, 0x7957, 0x2003,
++      0x0002, 0x1078, 0x14fc, 0x147f, 0x157f, 0x0d7f, 0x007c, 0x20e1,
++      0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210,
++      0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, 0x2004,
++      0xd0bc, 0x0040, 0x5355, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c, 0x6810,
++      0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6,
++      0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x535d, 0x20a3, 0x0600, 0x6198,
++      0x21a2, 0x20a3, 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3,
++      0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++      0x20a1, 0x020b, 0x1078, 0x538c, 0x7810, 0x2068, 0x6860, 0x20a2,
++      0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2,
++      0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x1078, 0x5688, 0x147f,
++      0x137f, 0x157f, 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x53aa,
++      0x0d7e, 0xa0e8, 0x7820, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2,
++      0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++      0x0078, 0x53b2, 0x20a3, 0x0500, 0x6298, 0x22a2, 0x20a3, 0x0000,
++      0x6230, 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x5677,
++      0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++      0x20a1, 0x020b, 0x1078, 0x54b4, 0x7810, 0x2068, 0xa016, 0x22a2,
++      0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x00c0,
++      0x53e1, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x53e9, 0x0078,
++      0x53e4, 0xa006, 0x1079, 0x53e9, 0x147f, 0x137f, 0x157f, 0x0d7f,
++      0x007c, 0x53f3, 0x5455, 0x5459, 0x547c, 0x5489, 0x549b, 0x549f,
++      0x53f1, 0x1078, 0x12cd, 0x017e, 0x037e, 0x694c, 0xa18c, 0x0003,
++      0xa186, 0x0000, 0x00c0, 0x5406, 0x6b78, 0x23a2, 0x6868, 0x20a2,
++      0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x5480, 0xa186, 0x0001,
++      0x00c0, 0x5450, 0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2,
++      0x22a2, 0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018,
++      0xa384, 0x0300, 0x0040, 0x544f, 0xd3c4, 0x0040, 0x5421, 0x687c,
++      0xa108, 0xd3cc, 0x0040, 0x5426, 0x6874, 0xa108, 0x157e, 0x20a9,
++      0x000d, 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0,
++      0x542b, 0x157f, 0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040,
++      0x544f, 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3,
++      0x0700, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
++      0x0898, 0x20a2, 0x1078, 0x5677, 0x22a2, 0x20a3, 0x0000, 0x61c2,
++      0x037f, 0x017f, 0x1078, 0x5688, 0x007c, 0x20a3, 0x0008, 0x0078,
++      0x547e, 0x20a3, 0x0302, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012,
++      0x22a2, 0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3,
++      0x7000, 0x20a3, 0x0500, 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2,
++      0x20a3, 0x2500, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3,
++      0x0032, 0x1078, 0x5688, 0x007c, 0x20a3, 0x0028, 0x22a2, 0x22a2,
++      0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x1078, 0x5688,
++      0x007c, 0x20a3, 0x0100, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++      0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0020,
++      0x1078, 0x5688, 0x007c, 0x20a3, 0x0008, 0x0078, 0x547e, 0x037e,
++      0x7b10, 0xa384, 0xff00, 0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0,
++      0x54ad, 0x22a2, 0x037f, 0x0078, 0x547e, 0x20a3, 0x0800, 0x22a2,
++      0x20a2, 0x037f, 0x0078, 0x5480, 0x027e, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x54d2,
++      0x0d7e, 0xa0e8, 0x7820, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2,
++      0x6814, 0x20a2, 0x2069, 0x7719, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
++      0x0078, 0x54da, 0x20a3, 0x0700, 0x6298, 0x22a2, 0x20a3, 0x0000,
++      0x6230, 0x22a2, 0x20a3, 0x0898, 0x20a3, 0x0000, 0x1078, 0x5677,
++      0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e,
++      0x017e, 0x037e, 0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x54ff,
++      0x037f, 0x017f, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x5507,
++      0x5507, 0x5509, 0x5507, 0x5507, 0x5507, 0x552e, 0x5507, 0x1078,
++      0x12cd, 0x7910, 0xa18c, 0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1,
++      0x020b, 0x2009, 0x0003, 0x1078, 0x5538, 0x0d7e, 0x2069, 0x7751,
++      0x6804, 0xd0bc, 0x0040, 0x5523, 0x682c, 0xa084, 0x00ff, 0x8007,
++      0x20a2, 0x0078, 0x5525, 0x20a3, 0x3f00, 0x0d7f, 0x22a2, 0x22a2,
++      0x22a2, 0x60c3, 0x0001, 0x1078, 0x5688, 0x007c, 0x20a1, 0x020b,
++      0x2009, 0x0003, 0x1078, 0x5538, 0x20a3, 0x7f00, 0x0078, 0x5526,
++      0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xd0bc, 0x0040, 0x5556, 0x0d7e, 0xa0e8, 0x7820, 0x2d6c,
++      0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7719,
++      0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x555e, 0x20a3, 0x0100,
++      0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0888,
++      0xa18d, 0x0008, 0x21a2, 0x1078, 0x5677, 0x22a2, 0x20a3, 0x0000,
++      0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f,
++      0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x057e, 0x047e, 0x037e, 0x2061,
++      0x0100, 0x2071, 0x7700, 0x6130, 0x7818, 0x2068, 0x68a0, 0x2028,
++      0xd0bc, 0x00c0, 0x558a, 0xa080, 0x2329, 0x2014, 0xa294, 0x00ff,
++      0x0078, 0x558e, 0x6910, 0x6a14, 0x7364, 0x7468, 0x781c, 0xa086,
++      0x0006, 0x0040, 0x55e2, 0xd5bc, 0x0040, 0x559e, 0xa185, 0x0100,
++      0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x55a4, 0x6063, 0x0100,
++      0x6266, 0x606b, 0x0000, 0x616e, 0x6073, 0x0809, 0x6077, 0x0008,
++      0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f,
++      0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7810, 0x2070, 0x7014,
++      0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c,
++      0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582,
++      0x0080, 0x0048, 0x55d6, 0x6a00, 0xd2f4, 0x0040, 0x55d4, 0x6a14,
++      0xa294, 0x00ff, 0x0078, 0x55d6, 0x2011, 0x0000, 0x629e, 0x6017,
++      0x0016, 0x1078, 0x470b, 0x037f, 0x047f, 0x057f, 0x0c7f, 0x0d7f,
++      0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c, 0xa084, 0x0003, 0xa086,
++      0x0002, 0x0040, 0x5631, 0xd5bc, 0x0040, 0x55f6, 0xa185, 0x0100,
++      0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x55fc, 0x6063, 0x0100,
++      0x6266, 0x606b, 0x0000, 0x616e, 0x6073, 0x0880, 0x6077, 0x0008,
++      0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f,
++      0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7060, 0x608a, 0x705c,
++      0x608e, 0x7080, 0x60c6, 0x707c, 0x60ca, 0x686c, 0x60ce, 0x60ab,
++      0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048,
++      0x562c, 0x6a00, 0xd2f4, 0x0040, 0x562a, 0x6a14, 0xa294, 0x00ff,
++      0x0078, 0x562c, 0x2011, 0x0000, 0x629e, 0x6017, 0x0012, 0x0078,
++      0x55d9, 0xd5bc, 0x0040, 0x563c, 0xa185, 0x0700, 0x6062, 0x6266,
++      0x636a, 0x646e, 0x0078, 0x5642, 0x6063, 0x0700, 0x6266, 0x606b,
++      0x0000, 0x616e, 0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000,
++      0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
++      0x6086, 0x7808, 0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c,
++      0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af,
++      0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x5672, 0x6a00,
++      0xd2f4, 0x0040, 0x5670, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x5672,
++      0x2011, 0x0000, 0x629e, 0x6017, 0x0016, 0x0078, 0x55d9, 0x7a18,
++      0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217,
++      0x007c, 0x0d7e, 0x2069, 0x7936, 0x6843, 0x0001, 0x0d7f, 0x007c,
++      0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078, 0x5693,
++      0x1078, 0x46fb, 0x007c, 0x007e, 0x6014, 0xa084, 0x0004, 0xa085,
++      0x0009, 0x6016, 0x007f, 0x007c, 0x007e, 0x0c7e, 0x2061, 0x0100,
++      0x6014, 0xa084, 0x0004, 0xa085, 0x0008, 0x6016, 0x0c7f, 0x007f,
++      0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e, 0x1078, 0x4706, 0x2061,
++      0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x56e6,
++      0x1078, 0x569c, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e, 0x2061,
++      0x7936, 0x6128, 0xa192, 0x0002, 0x00c8, 0x56d3, 0x8108, 0x612a,
++      0x6124, 0x0c7f, 0x81ff, 0x0040, 0x56e1, 0x1078, 0x46fb, 0x1078,
++      0x5693, 0x0078, 0x56e1, 0x6124, 0xa1e5, 0x0000, 0x0040, 0x56de,
++      0x1078, 0x76c7, 0x2009, 0x0014, 0x1078, 0x5d41, 0x0c7f, 0x0078,
++      0x56e1, 0x027f, 0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x1078, 0x3591,
++      0x0078, 0x56e1, 0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078,
++      0x4714, 0x2071, 0x7936, 0x713c, 0x81ff, 0x0040, 0x5714, 0x2061,
++      0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x571a,
++      0x6803, 0x1000, 0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078,
++      0x5880, 0x037f, 0x713c, 0x2160, 0x1078, 0x76c7, 0x2009, 0x004a,
++      0x1078, 0x5d41, 0x0078, 0x5714, 0x027f, 0x017f, 0x0e7f, 0x0d7f,
++      0x0c7f, 0x007c, 0x7144, 0xa192, 0x0002, 0x00c8, 0x5704, 0x8108,
++      0x7146, 0x1078, 0x470b, 0x0078, 0x5714, 0x0e7e, 0x0d7e, 0x0c7e,
++      0x067e, 0x057e, 0x047e, 0x007e, 0x127e, 0x2091, 0x8000, 0x6018,
++      0x2068, 0x6ca0, 0x2071, 0x7936, 0x7018, 0x2068, 0x8dff, 0x0040,
++      0x574f, 0x68a0, 0xa406, 0x0040, 0x5741, 0x6854, 0x2068, 0x0078,
++      0x5736, 0x6010, 0x2060, 0x643c, 0x6540, 0x6e48, 0x2d60, 0x1078,
++      0x3991, 0x0040, 0x574f, 0x1078, 0x5a1a, 0xa085, 0x0001, 0x127f,
++      0x007f, 0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c,
++      0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x50f8, 0x20a3, 0x0f00,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008,
++      0x1078, 0x5688, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
++      0x020b, 0x1078, 0x516f, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9,
++      0x0006, 0x2011, 0x7740, 0x2019, 0x7741, 0x23a6, 0x22a6, 0xa398,
++      0x0002, 0xa290, 0x0002, 0x00f0, 0x577d, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x60c3, 0x001c, 0x1078, 0x5688, 0x147f, 0x157f, 0x007c,
++      0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, 0x1078, 0x514f,
++      0x1078, 0x5166, 0x7810, 0x007e, 0xa080, 0x0015, 0x2098, 0x7808,
++      0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2,
++      0x007f, 0xa080, 0x0001, 0x2004, 0x7812, 0x1078, 0x5688, 0x027f,
++      0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b,
++      0x1078, 0x50f8, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x5688, 0x147f, 0x157f,
++      0x007c, 0x0e7e, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
++      0x7936, 0x700c, 0x2060, 0x8cff, 0x0040, 0x57e5, 0x1078, 0x6be3,
++      0x00c0, 0x57dc, 0x1078, 0x5f6d, 0x600c, 0x007e, 0x1078, 0x5d1a,
++      0x1078, 0x5a1a, 0x0c7f, 0x0078, 0x57d3, 0x700f, 0x0000, 0x700b,
++      0x0000, 0x127f, 0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e,
++      0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091,
++      0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x7936, 0x7024,
++      0x2060, 0x8cff, 0x0040, 0x583e, 0x1078, 0x569c, 0x68c3, 0x0000,
++      0x1078, 0x4706, 0x2009, 0x0013, 0x1078, 0x5d41, 0x20a9, 0x01f4,
++      0x6824, 0xd094, 0x0040, 0x5821, 0x6827, 0x0004, 0x7804, 0xa084,
++      0x4000, 0x0040, 0x5833, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078,
++      0x5833, 0xd084, 0x0040, 0x5828, 0x6827, 0x0001, 0x0078, 0x582a,
++      0x00f0, 0x5810, 0x7804, 0xa084, 0x1000, 0x0040, 0x5833, 0x7803,
++      0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f,
++      0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0x7700,
++      0x2004, 0xa096, 0x0001, 0x0040, 0x5876, 0xa096, 0x0004, 0x0040,
++      0x5876, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x3558, 0x1078,
++      0x4689, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x5864, 0x6827,
++      0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x5876, 0x7803, 0x1000,
++      0x7803, 0x0000, 0x0078, 0x5876, 0xd084, 0x0040, 0x586b, 0x6827,
++      0x0001, 0x0078, 0x586d, 0x00f0, 0x5853, 0x7804, 0xa084, 0x1000,
++      0x0040, 0x5876, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f,
++      0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++      0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e,
++      0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
++      0x7936, 0x703c, 0x2060, 0x8cff, 0x0040, 0x58ce, 0x6817, 0x0010,
++      0x68cb, 0x0000, 0x68c7, 0x0000, 0x1078, 0x4714, 0x1078, 0x1c13,
++      0xa39d, 0x0000, 0x00c0, 0x58a8, 0x2009, 0x0049, 0x1078, 0x5d41,
++      0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x58bb, 0x6827, 0x0004,
++      0x7804, 0xa084, 0x4000, 0x0040, 0x58cd, 0x7803, 0x1000, 0x7803,
++      0x0000, 0x0078, 0x58cd, 0xd094, 0x0040, 0x58c2, 0x6827, 0x0002,
++      0x0078, 0x58c4, 0x00f0, 0x58aa, 0x7804, 0xa084, 0x1000, 0x0040,
++      0x58cd, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
++      0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
++      0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x7936, 0x6a06, 0x127f,
++      0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x7936,
++      0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
++      0x007e, 0x127e, 0x2071, 0x7936, 0x7614, 0x2660, 0x2678, 0x2091,
++      0x8000, 0x8cff, 0x0040, 0x592c, 0x601c, 0xa206, 0x00c0, 0x5927,
++      0x7014, 0xac36, 0x00c0, 0x5906, 0x660c, 0x7616, 0x7010, 0xac36,
++      0x00c0, 0x5914, 0x2c00, 0xaf36, 0x0040, 0x5912, 0x2f00, 0x7012,
++      0x0078, 0x5914, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
++      0x0040, 0x591d, 0x7e0e, 0x0078, 0x591e, 0x2678, 0x600f, 0x0000,
++      0x1078, 0x6bb6, 0x1078, 0x5a1a, 0x0c7f, 0x0078, 0x58f9, 0x2c78,
++      0x600c, 0x2060, 0x0078, 0x58f9, 0x127f, 0x007f, 0x067f, 0x0c7f,
++      0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
++      0x532f, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
++      0x20a3, 0x4000, 0x0078, 0x5975, 0x157e, 0x147e, 0x20a1, 0x020b,
++      0x1078, 0x532f, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++      0x20a2, 0x20a3, 0x2000, 0x0078, 0x5975, 0x157e, 0x147e, 0x20a1,
++      0x020b, 0x1078, 0x532f, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
++      0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x5975, 0x157e, 0x147e,
++      0x20a1, 0x020b, 0x1078, 0x532f, 0x7810, 0x20a2, 0xa006, 0x20a2,
++      0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x5a25, 0x60c3,
++      0x0020, 0x1078, 0x5688, 0x147f, 0x157f, 0x007c, 0x127e, 0x0c7e,
++      0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0, 0x598d,
++      0xd1bc, 0x00c0, 0x59d7, 0x0078, 0x5a17, 0x2009, 0x017f, 0x200b,
++      0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9, 0x001e,
++      0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x59ce, 0x6020,
++      0xd0b4, 0x0040, 0x59ce, 0x6024, 0xd094, 0x00c0, 0x59ce, 0x2104,
++      0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x59ce, 0x00f0, 0x599a,
++      0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff,
++      0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043, 0x0001,
++      0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0, 0x59cd,
++      0x6a04, 0xa294, 0x4000, 0x00c0, 0x59c4, 0x027f, 0x0d7f, 0x007f,
++      0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x5a17, 0x2009,
++      0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140,
++      0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040,
++      0x5a10, 0x6020, 0xd0bc, 0x0040, 0x5a10, 0x2104, 0xa084, 0x000f,
++      0xa086, 0x0004, 0x00c0, 0x5a10, 0x00f0, 0x59e4, 0x027e, 0x6164,
++      0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d, 0x6088,
++      0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043, 0x0000,
++      0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x5a0a, 0x027f,
++      0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0c7f,
++      0x127f, 0x007c, 0x0e7e, 0x2071, 0x7936, 0x7020, 0xa005, 0x0040,
++      0x5a23, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008, 0x20a2,
++      0x00f0, 0x5a27, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e,
++      0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
++      0x7936, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0040,
++      0x5abd, 0x8cff, 0x0040, 0x5abd, 0x601c, 0xa086, 0x0006, 0x00c0,
++      0x5ab8, 0x88ff, 0x0040, 0x5a54, 0x2800, 0xac06, 0x00c0, 0x5ab8,
++      0x2039, 0x0000, 0x0078, 0x5a58, 0x6018, 0xa206, 0x00c0, 0x5ab8,
++      0x7024, 0xac06, 0x00c0, 0x5a86, 0x2069, 0x0100, 0x68c0, 0xa005,
++      0x0040, 0x5a81, 0x6817, 0x0008, 0x68c3, 0x0000, 0x1078, 0x5b4a,
++      0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
++      0x0040, 0x5a76, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
++      0x6824, 0xd084, 0x0040, 0x5a7e, 0x6827, 0x0001, 0x037f, 0x0078,
++      0x5a86, 0x6003, 0x0009, 0x630a, 0x0078, 0x5ab8, 0x7014, 0xac36,
++      0x00c0, 0x5a8c, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x5a9a,
++      0x2c00, 0xaf36, 0x0040, 0x5a98, 0x2f00, 0x7012, 0x0078, 0x5a9a,
++      0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5aa3,
++      0x7e0e, 0x0078, 0x5aa4, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
++      0x1078, 0x6a58, 0x0040, 0x5aae, 0x1078, 0x75fd, 0x1078, 0x6bb6,
++      0x1078, 0x5a1a, 0x88ff, 0x00c0, 0x5ac7, 0x0c7f, 0x0078, 0x5a3e,
++      0x2c78, 0x600c, 0x2060, 0x0078, 0x5a3e, 0xa006, 0x127f, 0x007f,
++      0x067f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017,
++      0x0000, 0x0c7f, 0xa8c5, 0x0001, 0x0078, 0x5abe, 0x0f7e, 0x0e7e,
++      0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000,
++      0x2071, 0x7936, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5b39,
++      0x601c, 0xa086, 0x0006, 0x00c0, 0x5b34, 0x88ff, 0x0040, 0x5aee,
++      0x2800, 0xac06, 0x00c0, 0x5b34, 0x0078, 0x5af2, 0x6018, 0xa206,
++      0x00c0, 0x5b34, 0x703c, 0xac06, 0x00c0, 0x5b04, 0x037e, 0x2019,
++      0x0001, 0x1078, 0x5880, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043,
++      0x0000, 0x7047, 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x5b0a,
++      0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5b18, 0x2c00, 0xaf36,
++      0x0040, 0x5b16, 0x2f00, 0x7036, 0x0078, 0x5b18, 0x7037, 0x0000,
++      0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5b21, 0x7e0e, 0x0078,
++      0x5b22, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x6a58,
++      0x0040, 0x5b2c, 0x1078, 0x75fd, 0x1078, 0x6bb6, 0x88ff, 0x00c0,
++      0x5b43, 0x0c7f, 0x0078, 0x5add, 0x2c78, 0x600c, 0x2060, 0x0078,
++      0x5add, 0xa006, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f,
++      0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, 0x0001,
++      0x0078, 0x5b3a, 0x0e7e, 0x2071, 0x7936, 0x2001, 0x7700, 0x2004,
++      0xa086, 0x0002, 0x00c0, 0x5b58, 0x7007, 0x0005, 0x0078, 0x5b5a,
++      0x7007, 0x0000, 0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
++      0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7936, 0x2c10,
++      0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5b9a, 0x2200, 0xac06,
++      0x00c0, 0x5b95, 0x7038, 0xac36, 0x00c0, 0x5b78, 0x660c, 0x763a,
++      0x7034, 0xac36, 0x00c0, 0x5b86, 0x2c00, 0xaf36, 0x0040, 0x5b84,
++      0x2f00, 0x7036, 0x0078, 0x5b86, 0x7037, 0x0000, 0x660c, 0x2c00,
++      0xaf06, 0x0040, 0x5b8e, 0x7e0e, 0x0078, 0x5b8f, 0x2678, 0x600f,
++      0x0000, 0xa085, 0x0001, 0x0078, 0x5b9a, 0x2c78, 0x600c, 0x2060,
++      0x0078, 0x5b6b, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f,
++      0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e,
++      0x127e, 0x2091, 0x8000, 0x2071, 0x7936, 0x760c, 0x2660, 0x2678,
++      0x8cff, 0x0040, 0x5c33, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
++      0x00c0, 0x5c2e, 0x7024, 0xac06, 0x00c0, 0x5be1, 0x2069, 0x0100,
++      0x68c0, 0xa005, 0x0040, 0x5be1, 0x1078, 0x569c, 0x68c3, 0x0000,
++      0x1078, 0x5b4a, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
++      0xa384, 0x1000, 0x0040, 0x5bd8, 0x6803, 0x0100, 0x6803, 0x0000,
++      0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x5be0, 0x6827, 0x0001,
++      0x037f, 0x700c, 0xac36, 0x00c0, 0x5be7, 0x660c, 0x760e, 0x7008,
++      0xac36, 0x00c0, 0x5bf5, 0x2c00, 0xaf36, 0x0040, 0x5bf3, 0x2f00,
++      0x700a, 0x0078, 0x5bf5, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00,
++      0xaf06, 0x0040, 0x5bfe, 0x7e0e, 0x0078, 0x5bff, 0x2678, 0x600f,
++      0x0000, 0x1078, 0x6bcf, 0x00c0, 0x5c09, 0x1078, 0x22d7, 0x0078,
++      0x5c25, 0x1078, 0x6be3, 0x00c0, 0x5c11, 0x1078, 0x5f6d, 0x0078,
++      0x5c25, 0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x5c25, 0x601c,
++      0xa086, 0x0003, 0x00c0, 0x5c3b, 0x6837, 0x0103, 0x6b4a, 0x6847,
++      0x0000, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x6003, 0x0000, 0x1078,
++      0x6bb6, 0x1078, 0x5a1a, 0x0c7f, 0x0078, 0x5bb0, 0x2c78, 0x600c,
++      0x2060, 0x0078, 0x5bb0, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f,
++      0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x5c1c,
++      0x1078, 0x75fd, 0x0078, 0x5c25, 0x037e, 0x157e, 0x137e, 0x147e,
++      0x3908, 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x2149, 0x00c0,
++      0x5c55, 0x8210, 0x8000, 0x0078, 0x5c4c, 0xa005, 0x0040, 0x5c5f,
++      0x20a9, 0x0020, 0x2198, 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x147f,
++      0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078,
++      0x516f, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x514c, 0x20a3, 0x4f47, 0x20a3,
++      0x4943, 0x20a3, 0x2020, 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x1078, 0x5688, 0x0d7f, 0x007c, 0x20a1,
++      0x020b, 0x1078, 0x516f, 0x20a3, 0x0210, 0x20a3, 0x0018, 0x20a3,
++      0x0800, 0x7810, 0xa084, 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7810,
++      0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++      0x0018, 0x1078, 0x5688, 0x007c, 0x2061, 0x7e00, 0x2a70, 0x7060,
++      0x7046, 0x704b, 0x7e00, 0x007c, 0x0e7e, 0x127e, 0x2071, 0x7700,
++      0x2091, 0x8000, 0x7544, 0xa582, 0x0001, 0x0048, 0x5ce6, 0x7048,
++      0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5cd2, 0xace0, 0x0008,
++      0x7054, 0xac02, 0x00c8, 0x5cce, 0x0078, 0x5cc1, 0x2061, 0x7e00,
++      0x0078, 0x5cc1, 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, 0x0008,
++      0x7054, 0xa502, 0x00c8, 0x5ce2, 0x754a, 0xa085, 0x0001, 0x127f,
++      0x0e7f, 0x007c, 0x704b, 0x7e00, 0x0078, 0x5cdd, 0xa006, 0x0078,
++      0x5cdf, 0x0e7e, 0x2071, 0x7700, 0x7544, 0xa582, 0x0001, 0x0048,
++      0x5d17, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5d04,
++      0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x5d00, 0x0078, 0x5cf3,
++      0x2061, 0x7e00, 0x0078, 0x5cf3, 0x6003, 0x0008, 0x8529, 0x7546,
++      0xaca8, 0x0008, 0x7054, 0xa502, 0x00c8, 0x5d13, 0x754a, 0xa085,
++      0x0001, 0x0e7f, 0x007c, 0x704b, 0x7e00, 0x0078, 0x5d0f, 0xa006,
++      0x0078, 0x5d11, 0xac82, 0x7e00, 0x1048, 0x12cd, 0x2001, 0x7715,
++      0x2004, 0xac02, 0x10c8, 0x12cd, 0xa006, 0x6006, 0x600a, 0x600e,
++      0x6012, 0x6016, 0x601a, 0x601f, 0x0000, 0x6003, 0x0000, 0x2061,
++      0x7700, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0040, 0x5d39,
++      0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4d96, 0x127f, 0x0078,
++      0x5d38, 0x601c, 0xa084, 0x000f, 0x0079, 0x5d46, 0x5d4f, 0x5d57,
++      0x5d73, 0x5d8f, 0x6c60, 0x6c7c, 0x6c98, 0x5d4f, 0x5d57, 0xa18e,
++      0x0047, 0x00c0, 0x5d56, 0xa016, 0x1078, 0x156a, 0x007c, 0x067e,
++      0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x5d61, 0x067f,
++      0x007c, 0x5d71, 0x5e58, 0x5f88, 0x5d71, 0x5fdf, 0x5d71, 0x5d71,
++      0x5d71, 0x5e07, 0x6298, 0x5d71, 0x5d71, 0x5d71, 0x5d71, 0x5d71,
++      0x5d71, 0x1078, 0x12cd, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
++      0x12cd, 0x1079, 0x5d7d, 0x067f, 0x007c, 0x5d8d, 0x5d8d, 0x5d8d,
++      0x5d8d, 0x5d8d, 0x5d8d, 0x5d8d, 0x5d8d, 0x670c, 0x67d2, 0x5d8d,
++      0x6725, 0x677e, 0x6725, 0x677e, 0x5d8d, 0x1078, 0x12cd, 0x067e,
++      0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x5d99, 0x067f,
++      0x007c, 0x5da9, 0x62d6, 0x637c, 0x643e, 0x6596, 0x5da9, 0x5da9,
++      0x5da9, 0x62b4, 0x66c1, 0x66c5, 0x5da9, 0x5da9, 0x5da9, 0x5da9,
++      0x66eb, 0x1078, 0x12cd, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0,
++      0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398, 0x94a0, 0x3318,
++      0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002, 0xa398,
++      0x0002, 0xa4a0, 0x0002, 0x00f0, 0x5db9, 0x0e7e, 0x1078, 0x6a58,
++      0x0040, 0x5dd0, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
++      0x0e7f, 0x1078, 0x5d1a, 0x007c, 0x0d7e, 0x037e, 0x7330, 0xa386,
++      0x0200, 0x00c0, 0x5de1, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817,
++      0xfffd, 0x6010, 0xa005, 0x0040, 0x5deb, 0x2068, 0x6807, 0x0000,
++      0x6837, 0x0103, 0x6b32, 0x1078, 0x5d1a, 0x037f, 0x0d7f, 0x007c,
++      0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6,
++      0x0015, 0x00c0, 0x5e04, 0x6018, 0x2068, 0x7038, 0x680a, 0x703c,
++      0x680e, 0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x5dc5, 0x2100,
++      0xa1b2, 0x0030, 0x10c8, 0x12cd, 0x0079, 0x5e0e, 0x5e40, 0x5e4c,
++      0x5e40, 0x5e40, 0x5e40, 0x5e40, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e,
++      0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e,
++      0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e,
++      0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e40, 0x5e3e, 0x5e40,
++      0x5e40, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e40, 0x5e3e,
++      0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x5e3e, 0x1078, 0x12cd,
++      0x6003, 0x0001, 0x6106, 0x1078, 0x498e, 0x127e, 0x2091, 0x8000,
++      0x1078, 0x4d96, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
++      0x498e, 0x127e, 0x2091, 0x8000, 0x1078, 0x4d96, 0x127f, 0x007c,
++      0x6004, 0xa0b2, 0x0030, 0x10c8, 0x12cd, 0xa1b6, 0x0013, 0x00c0,
++      0x5e64, 0x2008, 0x0079, 0x5eeb, 0xa1b6, 0x0027, 0x00c0, 0x5eb9,
++      0x1078, 0x4c9d, 0x6004, 0x1078, 0x6bcf, 0x0040, 0x5e7d, 0x1078,
++      0x6be3, 0x0040, 0x5eb1, 0xa08e, 0x0021, 0x0040, 0x5eb5, 0xa08e,
++      0x0022, 0x0040, 0x5eb1, 0x0078, 0x5eac, 0x1078, 0x22d7, 0x2001,
++      0x0007, 0x1078, 0x37f4, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078,
++      0x5f6d, 0xa186, 0x007e, 0x00c0, 0x5e92, 0x2001, 0x772f, 0x2014,
++      0xc285, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028,
++      0x1078, 0x4a7e, 0x1078, 0x49c1, 0x0c7e, 0x6018, 0xa065, 0x0040,
++      0x5ea3, 0x1078, 0x3a36, 0x0c7f, 0x2c08, 0x1078, 0x747b, 0x037f,
++      0x027f, 0x017f, 0x1078, 0x3834, 0x1078, 0x5d1a, 0x1078, 0x4d96,
++      0x007c, 0x1078, 0x5f6d, 0x0078, 0x5eac, 0x1078, 0x5f7c, 0x0078,
++      0x5eac, 0xa186, 0x0014, 0x00c0, 0x5eb0, 0x1078, 0x4c9d, 0x1078,
++      0x22b5, 0x1078, 0x6bcf, 0x00c0, 0x5ed8, 0x1078, 0x22d7, 0x6018,
++      0xa080, 0x0028, 0x200c, 0x1078, 0x5f6d, 0xa186, 0x007e, 0x00c0,
++      0x5ed6, 0x2001, 0x772f, 0x200c, 0xc185, 0x2102, 0x0078, 0x5eac,
++      0x1078, 0x6be3, 0x00c0, 0x5ee0, 0x1078, 0x5f6d, 0x0078, 0x5eac,
++      0x6004, 0xa08e, 0x0021, 0x0040, 0x5edc, 0xa08e, 0x0022, 0x1040,
++      0x5f7c, 0x0078, 0x5eac, 0x5f1d, 0x5f1f, 0x5f23, 0x5f27, 0x5f2b,
++      0x5f2f, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b,
++      0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b,
++      0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b, 0x5f1b,
++      0x5f1b, 0x5f33, 0x5f39, 0x5f1b, 0x5f43, 0x5f39, 0x5f1b, 0x5f1b,
++      0x5f1b, 0x5f1b, 0x5f1b, 0x5f39, 0x5f39, 0x5f1b, 0x5f1b, 0x5f1b,
++      0x5f1b, 0x5f1b, 0x5f1b, 0x1078, 0x12cd, 0x0078, 0x5f39, 0x2001,
++      0x000b, 0x0078, 0x5f4c, 0x2001, 0x0003, 0x0078, 0x5f4c, 0x2001,
++      0x0005, 0x0078, 0x5f4c, 0x2001, 0x0001, 0x0078, 0x5f4c, 0x2001,
++      0x0009, 0x0078, 0x5f4c, 0x1078, 0x12cd, 0x0078, 0x5f4b, 0x1078,
++      0x37f4, 0x1078, 0x4c9d, 0x6003, 0x0002, 0x6017, 0x0028, 0x1078,
++      0x4d96, 0x0078, 0x5f4b, 0x1078, 0x4c9d, 0x6003, 0x0004, 0x6017,
++      0x0028, 0x1078, 0x4d96, 0x007c, 0x1078, 0x37f4, 0x1078, 0x4c9d,
++      0x6003, 0x0002, 0x037e, 0x2019, 0x775c, 0x2304, 0xa084, 0xff00,
++      0x00c0, 0x5f5e, 0x2019, 0x0028, 0x0078, 0x5f67, 0x8007, 0xa09a,
++      0x0004, 0x0048, 0x5f5a, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316,
++      0x037f, 0x1078, 0x4d96, 0x0078, 0x5f4b, 0x0e7e, 0x1078, 0x6a58,
++      0x0040, 0x5f7a, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
++      0x7033, 0x0100, 0x0e7f, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74,
++      0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001, 0x0e7f, 0x007c,
++      0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa0b2,
++      0x000c, 0x10c8, 0x12cd, 0x6604, 0xa6b6, 0x0028, 0x00c0, 0x5f9c,
++      0x1078, 0x6c18, 0x0078, 0x5fce, 0x6604, 0xa6b6, 0x0029, 0x00c0,
++      0x5fa5, 0x1078, 0x6c32, 0x0078, 0x5fce, 0x6604, 0xa6b6, 0x001f,
++      0x00c0, 0x5fae, 0x1078, 0x5dab, 0x0078, 0x5fce, 0x6604, 0xa6b6,
++      0x0000, 0x00c0, 0x5fb7, 0x1078, 0x5df0, 0x0078, 0x5fce, 0x6604,
++      0xa6b6, 0x0022, 0x00c0, 0x5fc0, 0x1078, 0x5dd4, 0x0078, 0x5fce,
++      0xa1b6, 0x0015, 0x00c0, 0x5fc8, 0x1079, 0x5fd3, 0x0078, 0x5fce,
++      0xa1b6, 0x0016, 0x00c0, 0x5fcf, 0x1079, 0x6110, 0x007c, 0x1078,
++      0x5d4f, 0x0078, 0x5fce, 0x5ff7, 0x5ffa, 0x5ff7, 0x603b, 0x5ff7,
++      0x60ac, 0x5ff7, 0x5ff7, 0x5ff7, 0x60e8, 0x5ff7, 0x60fe, 0xa1b6,
++      0x0048, 0x0040, 0x5feb, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
++      0x1078, 0x156a, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000,
++      0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x5d1a, 0x007c, 0x0005,
++      0x0005, 0x007c, 0x0e7e, 0x2071, 0x7700, 0x7078, 0xa086, 0x0074,
++      0x00c0, 0x6024, 0x1078, 0x744f, 0x00c0, 0x6016, 0x0d7e, 0x6018,
++      0x2068, 0x1078, 0x6028, 0x0d7f, 0x2001, 0x0006, 0x1078, 0x37f4,
++      0x1078, 0x22d7, 0x1078, 0x5d1a, 0x0078, 0x6026, 0x2001, 0x000a,
++      0x1078, 0x37f4, 0x1078, 0x22d7, 0x6003, 0x0001, 0x6007, 0x0001,
++      0x1078, 0x498e, 0x0078, 0x6026, 0x1078, 0x609c, 0x0e7f, 0x007c,
++      0x6800, 0xd084, 0x0040, 0x603a, 0x2001, 0x0000, 0x1078, 0x37e0,
++      0x2069, 0x7751, 0x6804, 0xd0a4, 0x0040, 0x603a, 0x2001, 0x0006,
++      0x1078, 0x3802, 0x007c, 0x0d7e, 0x2011, 0x771e, 0x2204, 0xa086,
++      0x0074, 0x00c0, 0x6098, 0x1078, 0x61ea, 0x6018, 0x2068, 0xa080,
++      0x0028, 0x2014, 0xa286, 0x007e, 0x0040, 0x6063, 0xa286, 0x0080,
++      0x00c0, 0x608c, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005,
++      0x0040, 0x6082, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833,
++      0x0200, 0x0078, 0x6082, 0x0e7e, 0x0f7e, 0x6813, 0x00ff, 0x6817,
++      0xfffe, 0x2071, 0x772f, 0x2e04, 0xa085, 0x0003, 0x2072, 0x2071,
++      0x7c80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0x7719,
++      0x206a, 0x78e6, 0x8e70, 0x2e04, 0x2069, 0x771a, 0x206a, 0x78ea,
++      0x0f7f, 0x0e7f, 0x2001, 0x0006, 0x1078, 0x37f4, 0x1078, 0x22d7,
++      0x1078, 0x5d1a, 0x0078, 0x609a, 0x2001, 0x0004, 0x1078, 0x37f4,
++      0x6003, 0x0001, 0x6007, 0x0003, 0x1078, 0x498e, 0x0078, 0x609a,
++      0x1078, 0x609c, 0x0d7f, 0x007c, 0x2001, 0x7700, 0x2004, 0xa086,
++      0x0003, 0x0040, 0x60a7, 0x2001, 0x0007, 0x1078, 0x37f4, 0x1078,
++      0x22d7, 0x1078, 0x5d1a, 0x007c, 0x0e7e, 0x2071, 0x7700, 0x7078,
++      0xa086, 0x0014, 0x00c0, 0x60e2, 0x7000, 0xa086, 0x0003, 0x00c0,
++      0x60bf, 0x6010, 0xa005, 0x00c0, 0x60bf, 0x1078, 0x2dd7, 0x0d7e,
++      0x6018, 0x2068, 0x1078, 0x38c8, 0x1078, 0x6028, 0x0d7f, 0x1078,
++      0x61f4, 0x00c0, 0x60e2, 0x2001, 0x0006, 0x1078, 0x37f4, 0x0e7e,
++      0x6010, 0xa005, 0x0040, 0x60db, 0x2070, 0x7007, 0x0000, 0x7037,
++      0x0103, 0x7033, 0x0200, 0x0e7f, 0x1078, 0x22d7, 0x1078, 0x5d1a,
++      0x0078, 0x60e6, 0x1078, 0x5f6d, 0x1078, 0x609c, 0x0e7f, 0x007c,
++      0x2011, 0x771e, 0x2204, 0xa086, 0x0014, 0x00c0, 0x60fb, 0x2001,
++      0x0002, 0x1078, 0x37f4, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078,
++      0x498e, 0x0078, 0x60fd, 0x1078, 0x609c, 0x007c, 0x2011, 0x771e,
++      0x2204, 0xa086, 0x0004, 0x00c0, 0x610d, 0x2001, 0x0007, 0x1078,
++      0x37f4, 0x1078, 0x5d1a, 0x0078, 0x610f, 0x1078, 0x609c, 0x007c,
++      0x5ff7, 0x611c, 0x5ff7, 0x6142, 0x5ff7, 0x619d, 0x5ff7, 0x5ff7,
++      0x5ff7, 0x61b2, 0x5ff7, 0x61c5, 0x0c7e, 0x1078, 0x61d8, 0x00c0,
++      0x6131, 0x2001, 0x0000, 0x1078, 0x37e0, 0x2001, 0x0002, 0x1078,
++      0x37f4, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x498e, 0x0078,
++      0x6140, 0x2009, 0x7c8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x1900,
++      0x00c0, 0x613e, 0x1078, 0x5d1a, 0x0078, 0x6140, 0x1078, 0x609c,
++      0x0c7f, 0x007c, 0x1078, 0x61e7, 0x00c0, 0x6156, 0x2001, 0x0000,
++      0x1078, 0x37e0, 0x2001, 0x0002, 0x1078, 0x37f4, 0x6003, 0x0001,
++      0x6007, 0x0002, 0x1078, 0x498e, 0x0078, 0x6178, 0x1078, 0x5f6d,
++      0x2009, 0x7c8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0040,
++      0x6179, 0x2009, 0x7c8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x1900,
++      0x00c0, 0x6176, 0xa686, 0x0009, 0x0040, 0x6179, 0x2001, 0x0004,
++      0x1078, 0x37f4, 0x1078, 0x5d1a, 0x0078, 0x6178, 0x1078, 0x609c,
++      0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x6187,
++      0x6838, 0xd0fc, 0x0040, 0x6187, 0x0d7f, 0x0078, 0x6176, 0x6018,
++      0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, 0x6198, 0x8001,
++      0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f, 0x0078, 0x6178,
++      0x1078, 0x22b5, 0x0d7f, 0x0078, 0x6176, 0x1078, 0x61e7, 0x00c0,
++      0x61ad, 0x2001, 0x0004, 0x1078, 0x37f4, 0x6003, 0x0001, 0x6007,
++      0x0003, 0x1078, 0x498e, 0x0078, 0x61b1, 0x1078, 0x5f6d, 0x1078,
++      0x609c, 0x007c, 0x1078, 0x61e7, 0x00c0, 0x61c2, 0x2001, 0x0008,
++      0x1078, 0x37f4, 0x6003, 0x0001, 0x6007, 0x0005, 0x1078, 0x498e,
++      0x0078, 0x61c4, 0x1078, 0x609c, 0x007c, 0x1078, 0x61e7, 0x00c0,
++      0x61d5, 0x2001, 0x000a, 0x1078, 0x37f4, 0x6003, 0x0001, 0x6007,
++      0x0001, 0x1078, 0x498e, 0x0078, 0x61d7, 0x1078, 0x609c, 0x007c,
++      0x2009, 0x7c8e, 0x2104, 0xa086, 0x0003, 0x00c0, 0x61e6, 0x2009,
++      0x7c8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x007c, 0xa085,
++      0x0001, 0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006, 0x2164, 0x1078,
++      0x385e, 0x017f, 0x0c7f, 0x007c, 0x0e7e, 0x2071, 0x7c8c, 0x7004,
++      0xa086, 0x0014, 0x00c0, 0x6217, 0x7008, 0xa086, 0x0800, 0x00c0,
++      0x6217, 0x700c, 0xd0ec, 0x0040, 0x6215, 0xa084, 0x0f00, 0xa086,
++      0x0100, 0x00c0, 0x6215, 0x7024, 0xd0a4, 0x0040, 0x6215, 0xd08c,
++      0x0040, 0x6215, 0xa006, 0x0078, 0x6217, 0xa085, 0x0001, 0x0e7f,
++      0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e,
++      0x007e, 0x127e, 0x2091, 0x8000, 0x2029, 0x793f, 0x252c, 0x2021,
++      0x7945, 0x2424, 0x2061, 0x7e00, 0x2071, 0x7700, 0x7244, 0x7060,
++      0xa202, 0x00c8, 0x626e, 0x1078, 0x7659, 0x0040, 0x6266, 0x671c,
++      0xa786, 0x0001, 0x0040, 0x6266, 0xa786, 0x0007, 0x0040, 0x6266,
++      0x2500, 0xac06, 0x0040, 0x6266, 0x2400, 0xac06, 0x0040, 0x6266,
++      0x0c7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x6250, 0x1078, 0x166e,
++      0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x6263, 0xa786, 0x0003,
++      0x00c0, 0x6278, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
++      0x3b92, 0x1078, 0x6ba9, 0x1078, 0x6bb6, 0x0c7f, 0xace0, 0x0008,
++      0x7054, 0xac02, 0x00c8, 0x626e, 0x0078, 0x622e, 0x127f, 0x007f,
++      0x027f, 0x047f, 0x057f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c,
++      0xa786, 0x0006, 0x00c0, 0x625a, 0x1078, 0x75fd, 0x0078, 0x6263,
++      0x220c, 0x2304, 0xa106, 0x00c0, 0x628b, 0x8210, 0x8318, 0x00f0,
++      0x6280, 0xa006, 0x007c, 0x2304, 0xa102, 0x0048, 0x6293, 0x2001,
++      0x0001, 0x0078, 0x6295, 0x2001, 0x0000, 0xa18d, 0x0001, 0x007c,
++      0x6004, 0xa08a, 0x0030, 0x10c8, 0x12cd, 0x1078, 0x6bcf, 0x0040,
++      0x62a7, 0x1078, 0x6be3, 0x0040, 0x62b0, 0x0078, 0x62a9, 0x1078,
++      0x22d7, 0x1078, 0x4c9d, 0x1078, 0x5d1a, 0x1078, 0x4d96, 0x007c,
++      0x1078, 0x5f6d, 0x0078, 0x62a9, 0xa182, 0x0040, 0x0079, 0x62b8,
++      0x62c8, 0x62c8, 0x62c8, 0x62c8, 0x62c8, 0x62c8, 0x62c8, 0x62c8,
++      0x62c8, 0x62c8, 0x62c8, 0x62ca, 0x62ca, 0x62ca, 0x62ca, 0x62c8,
++      0x1078, 0x12cd, 0x6003, 0x0001, 0x6106, 0x1078, 0x4941, 0x127e,
++      0x2091, 0x8000, 0x1078, 0x4d96, 0x127f, 0x007c, 0xa186, 0x0013,
++      0x00c0, 0x62df, 0x6004, 0xa082, 0x0040, 0x0079, 0x6355, 0xa186,
++      0x0027, 0x00c0, 0x62fc, 0x1078, 0x4c9d, 0x1078, 0x22b5, 0x0d7e,
++      0x6110, 0x2168, 0x1078, 0x6a58, 0x0040, 0x62f6, 0x6837, 0x0103,
++      0x684b, 0x0029, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x0d7f, 0x1078,
++      0x5d1a, 0x1078, 0x4d96, 0x007c, 0xa186, 0x0014, 0x00c0, 0x6305,
++      0x6004, 0xa082, 0x0040, 0x0079, 0x6325, 0xa186, 0x0047, 0x10c0,
++      0x12cd, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040, 0x6322, 0x127e,
++      0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078, 0x4802, 0x027f,
++      0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002, 0x00c0, 0x6322,
++      0x0078, 0x637c, 0x1078, 0x5d4f, 0x007c, 0x6337, 0x6335, 0x6335,
++      0x6335, 0x6335, 0x6335, 0x6335, 0x6335, 0x6335, 0x6335, 0x6335,
++      0x634e, 0x634e, 0x634e, 0x634e, 0x6335, 0x1078, 0x12cd, 0x1078,
++      0x4c9d, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x6a58, 0x0040, 0x6348,
++      0x6837, 0x0103, 0x684b, 0x0006, 0x1078, 0x3b92, 0x1078, 0x6ba9,
++      0x0d7f, 0x1078, 0x5d1a, 0x1078, 0x4d96, 0x007c, 0x1078, 0x4c9d,
++      0x1078, 0x5d1a, 0x1078, 0x4d96, 0x007c, 0x6367, 0x6365, 0x6365,
++      0x6365, 0x6365, 0x6365, 0x6365, 0x6365, 0x6365, 0x6365, 0x6365,
++      0x6375, 0x6375, 0x6375, 0x6375, 0x6365, 0x1078, 0x12cd, 0x1078,
++      0x4c9d, 0x6003, 0x0002, 0x1078, 0x4d96, 0x6010, 0xa088, 0x0013,
++      0x2104, 0xa085, 0x0400, 0x200a, 0x007c, 0x1078, 0x4c9d, 0x6003,
++      0x000f, 0x1078, 0x4d96, 0x007c, 0xa182, 0x0040, 0x0079, 0x6380,
++      0x6390, 0x6390, 0x6390, 0x6390, 0x6390, 0x6392, 0x641b, 0x6433,
++      0x6390, 0x6390, 0x6390, 0x6390, 0x6390, 0x6390, 0x6390, 0x6390,
++      0x1078, 0x12cd, 0x0e7e, 0x0d7e, 0x2071, 0x7c8c, 0x6110, 0x2168,
++      0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040, 0x63ff, 0xa68c, 0x00ff,
++      0xa186, 0x0002, 0x0040, 0x63c4, 0xa186, 0x0028, 0x00c0, 0x63ae,
++      0x1078, 0x6bbd, 0x684b, 0x001c, 0x0078, 0x63c6, 0xd6dc, 0x0040,
++      0x63b9, 0x684b, 0x0015, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078,
++      0x63c6, 0xd6d4, 0x0040, 0x63c4, 0x684b, 0x0007, 0x7318, 0x6b62,
++      0x731c, 0x6b5e, 0x0078, 0x63c6, 0x684b, 0x0000, 0x6837, 0x0103,
++      0x6e46, 0xa01e, 0xd6c4, 0x0040, 0x63d9, 0x7328, 0x732c, 0x6b56,
++      0x037e, 0x2308, 0x2019, 0x7c98, 0xad90, 0x0019, 0x1078, 0x6841,
++      0x037f, 0xd6cc, 0x0040, 0x640f, 0x7124, 0x695a, 0xa192, 0x0021,
++      0x00c8, 0x63ed, 0x2071, 0x7c98, 0x831c, 0x2300, 0xae18, 0xad90,
++      0x001d, 0x1078, 0x6841, 0x0078, 0x640f, 0x6838, 0xd0fc, 0x0040,
++      0x63f6, 0x2009, 0x0020, 0x695a, 0x0078, 0x63e2, 0x0f7e, 0x2d78,
++      0x1078, 0x67d9, 0x0f7f, 0x1078, 0x682e, 0x0078, 0x6411, 0x684b,
++      0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0040, 0x640f,
++      0x6810, 0x6914, 0xa115, 0x0040, 0x640f, 0x1078, 0x6587, 0x1078,
++      0x3b92, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x0d7f, 0x0e7f,
++      0x1078, 0x5d1a, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, 0x7c8c,
++      0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16,
++      0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x19c7, 0x1078, 0x49ad,
++      0x1078, 0x4e56, 0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005,
++      0x3d18, 0x3e20, 0x2c10, 0x1078, 0x156a, 0x007c, 0xa182, 0x0040,
++      0x0079, 0x6442, 0x6452, 0x6452, 0x6452, 0x6452, 0x6452, 0x6454,
++      0x64eb, 0x6452, 0x6452, 0x6501, 0x6563, 0x6452, 0x6452, 0x6452,
++      0x6452, 0x656e, 0x1078, 0x12cd, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e,
++      0x2071, 0x7c8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46,
++      0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e,
++      0x86ff, 0x0040, 0x64e6, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040,
++      0x6475, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0040,
++      0x64e6, 0x1078, 0x1327, 0x1040, 0x12cd, 0x2d00, 0x784a, 0x7f4c,
++      0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, 0x683e,
++      0x7840, 0x6842, 0x6e46, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040,
++      0x64af, 0xa186, 0x0028, 0x00c0, 0x6499, 0x684b, 0x001c, 0x0078,
++      0x64b1, 0xd6dc, 0x0040, 0x64a4, 0x684b, 0x0015, 0x7318, 0x6b62,
++      0x731c, 0x6b5e, 0x0078, 0x64b1, 0xd6d4, 0x0040, 0x64af, 0x684b,
++      0x0007, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x64b1, 0x684b,
++      0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4,
++      0x0040, 0x64c6, 0x7328, 0x732c, 0x6b56, 0x037e, 0x2308, 0x2019,
++      0x7c98, 0xad90, 0x0019, 0x1078, 0x6841, 0x037f, 0xd6cc, 0x0040,
++      0x64e6, 0x7124, 0x695a, 0xa192, 0x0021, 0x00c8, 0x64da, 0x2071,
++      0x7c98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x6841,
++      0x0078, 0x64e6, 0x7838, 0xd0fc, 0x0040, 0x64e3, 0x2009, 0x0020,
++      0x695a, 0x0078, 0x64cf, 0x2d78, 0x1078, 0x67d9, 0x0d7f, 0x0e7f,
++      0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, 0x7c8c,
++      0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16,
++      0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x19c7, 0x1078, 0x5681,
++      0x007c, 0x0d7e, 0x6003, 0x0002, 0x1078, 0x4d45, 0x1078, 0x4e56,
++      0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, 0x6561, 0xd1cc, 0x0040,
++      0x653c, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x6534, 0x017e, 0x684c,
++      0x007e, 0x6850, 0x007e, 0xad90, 0x000d, 0xa198, 0x000d, 0x2009,
++      0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x00f0,
++      0x6523, 0x157f, 0x007f, 0x6852, 0x007f, 0x684e, 0x017f, 0x2168,
++      0x1078, 0x1350, 0x0078, 0x655f, 0x017e, 0x1078, 0x1350, 0x0d7f,
++      0x1078, 0x682e, 0x0078, 0x655f, 0x6837, 0x0103, 0x6944, 0xa184,
++      0x00ff, 0xa186, 0x0002, 0x0040, 0x655b, 0xa086, 0x0028, 0x00c0,
++      0x654d, 0x684b, 0x001c, 0x0078, 0x655d, 0xd1dc, 0x0040, 0x6554,
++      0x684b, 0x0015, 0x0078, 0x655d, 0xd1d4, 0x0040, 0x655b, 0x684b,
++      0x0007, 0x0078, 0x655d, 0x684b, 0x0000, 0x1078, 0x3b92, 0x1078,
++      0x5d1a, 0x0d7f, 0x007c, 0x2019, 0x0001, 0x1078, 0x5880, 0x6003,
++      0x0002, 0x1078, 0x4d45, 0x1078, 0x4e56, 0x007c, 0x1078, 0x4d45,
++      0x1078, 0x22b5, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x6a58, 0x0040,
++      0x6581, 0x6837, 0x0103, 0x684b, 0x0029, 0x1078, 0x3b92, 0x1078,
++      0x6ba9, 0x0d7f, 0x1078, 0x5d1a, 0x1078, 0x4e56, 0x007c, 0x684b,
++      0x0015, 0xd1fc, 0x0040, 0x6593, 0x684b, 0x0007, 0x8002, 0x8000,
++      0x810a, 0xa189, 0x0000, 0x6962, 0x685e, 0x007c, 0xa182, 0x0040,
++      0x0079, 0x659a, 0x65aa, 0x65aa, 0x65aa, 0x65aa, 0x65aa, 0x65ac,
++      0x65aa, 0x6650, 0x6658, 0x65aa, 0x65aa, 0x65aa, 0x65aa, 0x65aa,
++      0x65aa, 0x65aa, 0x1078, 0x12cd, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e,
++      0x2071, 0x7c8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46,
++      0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e,
++      0x86ff, 0x0040, 0x6642, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040,
++      0x65cd, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0040,
++      0x663f, 0x1078, 0x1327, 0x1040, 0x12cd, 0x2d00, 0x784a, 0x7f4c,
++      0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c,
++      0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x00ff, 0xa186, 0x0002,
++      0x0040, 0x6608, 0xa186, 0x0028, 0x00c0, 0x65f2, 0x684b, 0x001c,
++      0x0078, 0x660a, 0xd6dc, 0x0040, 0x65fd, 0x684b, 0x0015, 0x7318,
++      0x6b62, 0x731c, 0x6b5e, 0x0078, 0x660a, 0xd6d4, 0x0040, 0x6608,
++      0x684b, 0x0007, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x660a,
++      0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e,
++      0xd6c4, 0x0040, 0x661f, 0x7328, 0x732c, 0x6b56, 0x037e, 0x2308,
++      0x2019, 0x7c98, 0xad90, 0x0019, 0x1078, 0x6841, 0x037f, 0xd6cc,
++      0x0040, 0x663f, 0x7124, 0x695a, 0xa192, 0x0021, 0x00c8, 0x6633,
++      0x2071, 0x7c98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078,
++      0x6841, 0x0078, 0x663f, 0x7838, 0xd0fc, 0x0040, 0x663c, 0x2009,
++      0x0020, 0x695a, 0x0078, 0x6628, 0x2d78, 0x1078, 0x67d9, 0xd6dc,
++      0x00c0, 0x6645, 0xa006, 0x0078, 0x6649, 0x2001, 0x0001, 0x7218,
++      0x731c, 0x1078, 0x15ae, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c,
++      0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x156a, 0x007c,
++      0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040,
++      0x66bf, 0xd1cc, 0x0040, 0x668f, 0x6948, 0x6838, 0xd0fc, 0x0040,
++      0x6687, 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90, 0x000d,
++      0xa198, 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012,
++      0x8318, 0x8210, 0x00f0, 0x6676, 0x157f, 0x007f, 0x6852, 0x007f,
++      0x684e, 0x017f, 0x2168, 0x1078, 0x1350, 0x0078, 0x66bd, 0x017e,
++      0x1078, 0x1350, 0x0d7f, 0x1078, 0x682e, 0x0078, 0x66bd, 0x6837,
++      0x0103, 0x6944, 0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x66ae,
++      0xa086, 0x0028, 0x00c0, 0x66a0, 0x684b, 0x001c, 0x0078, 0x66bb,
++      0xd1dc, 0x0040, 0x66a7, 0x684b, 0x0015, 0x0078, 0x66bb, 0xd1d4,
++      0x0040, 0x66ae, 0x684b, 0x0007, 0x0078, 0x66bb, 0x684b, 0x0000,
++      0x684c, 0xd0ac, 0x0040, 0x66bb, 0x6810, 0x6914, 0xa115, 0x0040,
++      0x66bb, 0x1078, 0x6587, 0x1078, 0x3b92, 0x1078, 0x5d1a, 0x0d7f,
++      0x007c, 0x1078, 0x4c9d, 0x0078, 0x66c7, 0x1078, 0x4d45, 0x1078,
++      0x6a58, 0x0040, 0x66de, 0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103,
++      0x2009, 0x770c, 0x210c, 0xd18c, 0x00c0, 0x66e7, 0xd184, 0x00c0,
++      0x66e3, 0x6108, 0x694a, 0x1078, 0x3b92, 0x0d7f, 0x1078, 0x5d1a,
++      0x1078, 0x4d96, 0x007c, 0x684b, 0x0004, 0x0078, 0x66db, 0x684b,
++      0x0004, 0x0078, 0x66db, 0xa182, 0x0040, 0x0079, 0x66ef, 0x66ff,
++      0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x6701, 0x66ff, 0x6704, 0x66ff,
++      0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x66ff, 0x1078,
++      0x12cd, 0x1078, 0x5d1a, 0x007c, 0x007e, 0x027e, 0xa016, 0x1078,
++      0x156a, 0x027f, 0x007f, 0x007c, 0xa182, 0x0085, 0x0079, 0x6710,
++      0x6719, 0x6717, 0x6717, 0x6717, 0x6717, 0x6717, 0x6717, 0x1078,
++      0x12cd, 0x6003, 0x0001, 0x6106, 0x1078, 0x4941, 0x127e, 0x2091,
++      0x8000, 0x1078, 0x4d96, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0,
++      0x672f, 0x6004, 0xa082, 0x0085, 0x2008, 0x0079, 0x6763, 0xa186,
++      0x0027, 0x00c0, 0x6750, 0x1078, 0x4c9d, 0x1078, 0x22b5, 0x0d7e,
++      0x6010, 0x2068, 0x1078, 0x6a58, 0x0040, 0x6746, 0x6837, 0x0103,
++      0x684b, 0x0029, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x0d7f, 0x1078,
++      0x5d1a, 0x1078, 0x4d96, 0x007c, 0x1078, 0x5d4f, 0x0078, 0x674b,
++      0xa186, 0x0014, 0x00c0, 0x674c, 0x1078, 0x4c9d, 0x0d7e, 0x6010,
++      0x2068, 0x1078, 0x6a58, 0x0040, 0x6746, 0x6837, 0x0103, 0x684b,
++      0x0006, 0x0078, 0x6742, 0x676c, 0x676a, 0x676a, 0x676a, 0x676a,
++      0x676a, 0x6775, 0x1078, 0x12cd, 0x1078, 0x4c9d, 0x6017, 0x0014,
++      0x6003, 0x000c, 0x1078, 0x4d96, 0x007c, 0x1078, 0x4c9d, 0x6017,
++      0x0014, 0x6003, 0x000e, 0x1078, 0x4d96, 0x007c, 0xa182, 0x008c,
++      0x00c8, 0x6788, 0xa182, 0x0085, 0x0048, 0x6788, 0x0079, 0x678b,
++      0x1078, 0x5d4f, 0x007c, 0x6792, 0x6792, 0x6792, 0x6792, 0x6794,
++      0x67b3, 0x6792, 0x1078, 0x12cd, 0x0d7e, 0x1078, 0x6ba9, 0x1078,
++      0x6a58, 0x0040, 0x67af, 0x6010, 0x2068, 0x6837, 0x0103, 0x6850,
++      0xd0b4, 0x0040, 0x67a7, 0x684b, 0x0006, 0x0078, 0x67ab, 0x684b,
++      0x0005, 0x1078, 0x6c5c, 0x6847, 0x0000, 0x1078, 0x3b92, 0x1078,
++      0x5d1a, 0x0d7f, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6a58,
++      0x0040, 0x67ce, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x67c4,
++      0x684b, 0x0006, 0x0078, 0x67c8, 0x684b, 0x0005, 0x1078, 0x6c5c,
++      0x6847, 0x0000, 0x1078, 0x3b92, 0x1078, 0x6ba9, 0x0d7f, 0x1078,
++      0x5d1a, 0x007c, 0x1078, 0x4c9d, 0x1078, 0x5d1a, 0x1078, 0x4d96,
++      0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001, 0xa182,
++      0x0101, 0x00c8, 0x67e5, 0x0078, 0x67e7, 0x2009, 0x0100, 0x2130,
++      0x2069, 0x7c98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90,
++      0x001d, 0x1078, 0x6841, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0040,
++      0x67fb, 0x1078, 0x1350, 0x1078, 0x1327, 0x0040, 0x6825, 0x8528,
++      0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d,
++      0x00c8, 0x6811, 0x2608, 0xad90, 0x000f, 0x1078, 0x6841, 0x0078,
++      0x6825, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, 0x000f,
++      0x1078, 0x6841, 0x0078, 0x67fb, 0x0f7f, 0x852f, 0xa5ad, 0x0003,
++      0x7d36, 0xa5ac, 0x0000, 0x0078, 0x682a, 0x0f7f, 0x852f, 0xa5ad,
++      0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e, 0x8dff,
++      0x0040, 0x683f, 0x6804, 0xa07d, 0x0040, 0x683d, 0x6807, 0x0000,
++      0x1078, 0x3b92, 0x2f68, 0x0078, 0x6832, 0x1078, 0x3b92, 0x0f7f,
++      0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x6847, 0x8108, 0x810c,
++      0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0, 0x6849,
++      0x157f, 0x007c, 0x127e, 0x2091, 0x8000, 0x601c, 0xa084, 0x000f,
++      0x1079, 0x685c, 0x127f, 0x007c, 0x686b, 0x6864, 0x6866, 0x6884,
++      0x6864, 0x6866, 0x6866, 0x6866, 0x1078, 0x12cd, 0xa006, 0x007c,
++      0xa085, 0x0001, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6a58,
++      0x0040, 0x6881, 0xa00e, 0x2001, 0x0005, 0x1078, 0x3c22, 0x1078,
++      0x6c5c, 0x1078, 0x3b92, 0x1078, 0x5d1a, 0xa085, 0x0001, 0x0d7f,
++      0x007c, 0xa006, 0x0078, 0x687f, 0x6000, 0xa08a, 0x0010, 0x10c8,
++      0x12cd, 0x1079, 0x688c, 0x007c, 0x689c, 0x68b9, 0x689e, 0x68ca,
++      0x68b5, 0x689c, 0x6866, 0x686b, 0x686b, 0x6866, 0x6866, 0x6866,
++      0x6866, 0x6866, 0x6866, 0x6866, 0x1078, 0x12cd, 0x0d7e, 0x6010,
++      0x2068, 0x1078, 0x6a58, 0x0040, 0x68a7, 0x1078, 0x6c5c, 0x0d7f,
++      0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078, 0x4941,
++      0x1078, 0x4d96, 0xa085, 0x0001, 0x007c, 0x1078, 0x166e, 0x0078,
++      0x689e, 0x0e7e, 0x2071, 0x7936, 0x7024, 0xac06, 0x00c0, 0x68c2,
++      0x1078, 0x57ee, 0x1078, 0x5725, 0x0e7f, 0x00c0, 0x689e, 0x1078,
++      0x6866, 0x007c, 0x037e, 0x0e7e, 0x2071, 0x7936, 0x703c, 0xac06,
++      0x00c0, 0x68da, 0x2019, 0x0000, 0x1078, 0x5880, 0x0e7f, 0x037f,
++      0x0078, 0x689e, 0x1078, 0x5b5c, 0x0e7f, 0x037f, 0x00c0, 0x689e,
++      0x1078, 0x6866, 0x007c, 0x0c7e, 0x601c, 0xa084, 0x000f, 0x1079,
++      0x68eb, 0x0c7f, 0x007c, 0x68fa, 0x6957, 0x69fc, 0x68fe, 0x68fa,
++      0x68fa, 0x72dd, 0x5d1a, 0x6957, 0x1078, 0x6be3, 0x00c0, 0x68fa,
++      0x1078, 0x5f6d, 0x007c, 0x6017, 0x0001, 0x007c, 0x6000, 0xa08a,
++      0x0010, 0x10c8, 0x12cd, 0x1079, 0x6906, 0x007c, 0x6916, 0x6918,
++      0x6938, 0x694a, 0x694a, 0x6916, 0x68fa, 0x68fa, 0x68fa, 0x694a,
++      0x694a, 0x6916, 0x6916, 0x6916, 0x6916, 0x6954, 0x1078, 0x12cd,
++      0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, 0x7936,
++      0x7024, 0xac06, 0x0040, 0x6934, 0x1078, 0x5725, 0x6007, 0x0085,
++      0x6003, 0x000b, 0x601f, 0x0002, 0x6017, 0x0014, 0x1078, 0x4941,
++      0x1078, 0x4d96, 0x0e7f, 0x007c, 0x6017, 0x0001, 0x0078, 0x6932,
++      0x0d7e, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x6007,
++      0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078, 0x4941, 0x1078,
++      0x4d96, 0x007c, 0x0d7e, 0x6017, 0x0001, 0x6010, 0x2068, 0x6850,
++      0xc0b5, 0x6852, 0x0d7f, 0x007c, 0x1078, 0x5d1a, 0x007c, 0x6000,
++      0xa08a, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x695f, 0x007c, 0x696f,
++      0x68fb, 0x6971, 0x696f, 0x6971, 0x696f, 0x696f, 0x696f, 0x68f4,
++      0x68f4, 0x696f, 0x696f, 0x696f, 0x696f, 0x696f, 0x696f, 0x1078,
++      0x12cd, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f,
++      0xa08a, 0x000c, 0x10c8, 0x12cd, 0x1079, 0x697f, 0x007c, 0x698b,
++      0x69aa, 0x698b, 0x69aa, 0x698b, 0x69aa, 0x698d, 0x6996, 0x698b,
++      0x69aa, 0x698b, 0x69a3, 0x1078, 0x12cd, 0x6004, 0xa08e, 0x0004,
++      0x0040, 0x69a5, 0xa08e, 0x0002, 0x0040, 0x69a5, 0x6004, 0x1078,
++      0x6be3, 0x0040, 0x69f4, 0xa08e, 0x0021, 0x0040, 0x69f8, 0xa08e,
++      0x0022, 0x0040, 0x69f4, 0x1078, 0x22b5, 0x1078, 0x5f6d, 0x1078,
++      0x5d1a, 0x007c, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016, 0x0040,
++      0x69e4, 0xa186, 0x0002, 0x00c0, 0x69d3, 0x6018, 0x2068, 0x68a0,
++      0xd0bc, 0x00c0, 0x69d3, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040,
++      0x69d3, 0x8001, 0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017,
++      0x0398, 0x1078, 0x5cb4, 0x0040, 0x69d3, 0x2d00, 0x601a, 0x601f,
++      0x0001, 0x0078, 0x69e4, 0x0d7f, 0x0c7f, 0x1078, 0x5f6d, 0x1078,
++      0x22b5, 0x0e7e, 0x127e, 0x2091, 0x8000, 0x1078, 0x22d7, 0x127f,
++      0x0e7f, 0x1078, 0x5d1a, 0x007c, 0x2001, 0x0002, 0x1078, 0x37f4,
++      0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x498e, 0x1078, 0x4d96,
++      0x0d7f, 0x0c7f, 0x0078, 0x69e3, 0x1078, 0x5f6d, 0x0078, 0x69a7,
++      0x1078, 0x5f7c, 0x0078, 0x69a7, 0x6000, 0xa08a, 0x0010, 0x10c8,
++      0x12cd, 0x1079, 0x6a04, 0x007c, 0x6a14, 0x6a14, 0x6a14, 0x6a14,
++      0x6a14, 0x6a14, 0x6a14, 0x6a14, 0x6a14, 0x68fa, 0x6a14, 0x68fb,
++      0x6a16, 0x68fb, 0x6a1f, 0x6a14, 0x1078, 0x12cd, 0x6007, 0x008b,
++      0x6003, 0x000d, 0x1078, 0x4941, 0x1078, 0x4d96, 0x007c, 0x1078,
++      0x6ba9, 0x1078, 0x6a58, 0x0040, 0x6a41, 0x1078, 0x22b5, 0x0d7e,
++      0x1078, 0x6a58, 0x0040, 0x6a34, 0x6010, 0x2068, 0x6837, 0x0103,
++      0x684b, 0x0006, 0x1078, 0x3b92, 0x0d7f, 0x601f, 0x0001, 0x6007,
++      0x0001, 0x6003, 0x0001, 0x1078, 0x498e, 0x1078, 0x4d96, 0x0078,
++      0x6a43, 0x1078, 0x5d1a, 0x007c, 0xa284, 0x0007, 0x00c0, 0x6a55,
++      0xa282, 0x7e00, 0x0048, 0x6a55, 0x2001, 0x7715, 0x2004, 0xa202,
++      0x00c8, 0x6a55, 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x6a54,
++      0x027e, 0x0e7e, 0x2071, 0x7700, 0x6210, 0x7058, 0xa202, 0x0048,
++      0x6a6a, 0x705c, 0xa202, 0x00c8, 0x6a6a, 0xa085, 0x0001, 0x0e7f,
++      0x027f, 0x007c, 0xa006, 0x0078, 0x6a67, 0x0e7e, 0x0c7e, 0x037e,
++      0x007e, 0x127e, 0x2091, 0x8000, 0x2061, 0x7e00, 0x2071, 0x7700,
++      0x7344, 0x7060, 0xa302, 0x00c8, 0x6a93, 0x601c, 0xa206, 0x00c0,
++      0x6a8b, 0x1078, 0x6be3, 0x00c0, 0x6a87, 0x1078, 0x5f6d, 0x0c7e,
++      0x1078, 0x5d1a, 0x0c7f, 0xace0, 0x0008, 0x7054, 0xac02, 0x00c8,
++      0x6a93, 0x0078, 0x6a78, 0x127f, 0x007f, 0x037f, 0x0c7f, 0x0e7f,
++      0x007c, 0x0e7e, 0x0c7e, 0x017e, 0xa188, 0x7820, 0x210c, 0x81ff,
++      0x0040, 0x6ab1, 0x2061, 0x7e00, 0x2071, 0x7700, 0x017e, 0x1078,
++      0x5cb4, 0x017f, 0x0040, 0x6ab4, 0x611a, 0x1078, 0x22b5, 0x1078,
++      0x5d1a, 0xa006, 0x0078, 0x6ab6, 0xa085, 0x0001, 0x017f, 0x0c7f,
++      0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e,
++      0x1078, 0x5cb4, 0x057f, 0x0040, 0x6ad3, 0x6612, 0x651a, 0x601f,
++      0x0003, 0x2009, 0x004b, 0x1078, 0x5d41, 0xa085, 0x0001, 0x127f,
++      0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6acf, 0x0c7e, 0x057e,
++      0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x5cb4, 0x057f,
++      0x0040, 0x6afd, 0x6013, 0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e,
++      0x2560, 0x1078, 0x3a36, 0x0c7f, 0x1078, 0x4a7e, 0x1078, 0x49c1,
++      0x2c08, 0x1078, 0x747b, 0x2009, 0x004c, 0x1078, 0x5d41, 0xa085,
++      0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6af9,
++      0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078,
++      0x5cb4, 0x057f, 0x0040, 0x6b28, 0x6612, 0x651a, 0x601f, 0x0003,
++      0x2019, 0x0005, 0x0c7e, 0x2560, 0x1078, 0x3a36, 0x0c7f, 0x1078,
++      0x4a7e, 0x1078, 0x49c1, 0x2c08, 0x1078, 0x747b, 0x2009, 0x004d,
++      0x1078, 0x5d41, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
++      0xa006, 0x0078, 0x6b24, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000,
++      0x62a0, 0x0c7e, 0x1078, 0x5cb4, 0x057f, 0x0040, 0x6b53, 0x6612,
++      0x651a, 0x601f, 0x0003, 0x2019, 0x0005, 0x0c7e, 0x2560, 0x1078,
++      0x3a36, 0x0c7f, 0x1078, 0x4a7e, 0x1078, 0x49c1, 0x2c08, 0x1078,
++      0x747b, 0x2009, 0x004e, 0x1078, 0x5d41, 0xa085, 0x0001, 0x127f,
++      0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6b4f, 0x0c7e, 0x127e,
++      0x2091, 0x8000, 0x0c7e, 0x1078, 0x5cb4, 0x017f, 0x0040, 0x6b6f,
++      0x660a, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x001f,
++      0x1078, 0x5d41, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006,
++      0x0078, 0x6b6c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078,
++      0x5cb4, 0x017f, 0x0040, 0x6b8b, 0x660a, 0x611a, 0x601f, 0x0008,
++      0x2d00, 0x6012, 0x2009, 0x0021, 0x1078, 0x5d41, 0xa085, 0x0001,
++      0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6b88, 0x0c7e, 0x127e,
++      0x2091, 0x8000, 0x0c7e, 0x1078, 0x5cb4, 0x017f, 0x0040, 0x6ba6,
++      0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x1078,
++      0x5d41, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078,
++      0x6ba3, 0x027e, 0x0d7e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040,
++      0x6bb3, 0x8211, 0x6a3e, 0x0d7f, 0x027f, 0x007c, 0x6013, 0x0000,
++      0x601f, 0x0007, 0x6017, 0x0014, 0x007c, 0x067e, 0x0c7e, 0x0d7e,
++      0x2031, 0x7752, 0x2634, 0xd6e4, 0x0040, 0x6bcb, 0x6618, 0x2660,
++      0x6e48, 0x1078, 0x3942, 0x0d7f, 0x0c7f, 0x067f, 0x007c, 0x007e,
++      0x017e, 0x6004, 0xa08e, 0x0002, 0x0040, 0x6be0, 0xa08e, 0x0003,
++      0x0040, 0x6be0, 0xa08e, 0x0004, 0x0040, 0x6be0, 0xa085, 0x0001,
++      0x017f, 0x007f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0000,
++      0x0040, 0x6bf8, 0xa08e, 0x001f, 0x0040, 0x6bf8, 0xa08e, 0x0028,
++      0x0040, 0x6bf8, 0xa08e, 0x0029, 0x0040, 0x6bf8, 0xa085, 0x0001,
++      0x017f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e,
++      0x1078, 0x5cb4, 0x017f, 0x0040, 0x6c15, 0x611a, 0x601f, 0x0001,
++      0x2d00, 0x6012, 0x1078, 0x22b5, 0x2009, 0x0028, 0x1078, 0x5d41,
++      0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6c12,
++      0xa186, 0x0015, 0x00c0, 0x6c2d, 0x2011, 0x771e, 0x2204, 0xa086,
++      0x0074, 0x00c0, 0x6c2d, 0x1078, 0x61ea, 0x6003, 0x0001, 0x6007,
++      0x0029, 0x1078, 0x498e, 0x0078, 0x6c31, 0x1078, 0x5f6d, 0x1078,
++      0x5d1a, 0x007c, 0xa186, 0x0015, 0x00c0, 0x6c4f, 0x2011, 0x771e,
++      0x2204, 0xa086, 0x0014, 0x00c0, 0x6c4f, 0x0d7e, 0x6018, 0x2068,
++      0x1078, 0x38c8, 0x0d7f, 0x1078, 0x61f4, 0x00c0, 0x6c4f, 0x2001,
++      0x0006, 0x1078, 0x37f4, 0x1078, 0x5dc5, 0x0078, 0x6c53, 0x1078,
++      0x5f6d, 0x1078, 0x5d1a, 0x007c, 0x6848, 0xa086, 0x0005, 0x00c0,
++      0x6c5b, 0x1078, 0x6c5c, 0x007c, 0x6850, 0xc0ad, 0x6852, 0x007c,
++      0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x6c6a,
++      0x067f, 0x007c, 0x6c7a, 0x6e51, 0x6f32, 0x6c7a, 0x6c7a, 0x6c7a,
++      0x6c7a, 0x6c7a, 0x6cb4, 0x6fa0, 0x6c7a, 0x6c7a, 0x6c7a, 0x6c7a,
++      0x6c7a, 0x6c7a, 0x1078, 0x12cd, 0x067e, 0x6000, 0xa0b2, 0x0010,
++      0x10c8, 0x12cd, 0x1079, 0x6c86, 0x067f, 0x007c, 0x6c96, 0x728c,
++      0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x7267, 0x72d6,
++      0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x6c96, 0x1078, 0x12cd,
++      0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12cd, 0x1079, 0x6ca2,
++      0x067f, 0x007c, 0x6cb2, 0x70d8, 0x714a, 0x716c, 0x71b8, 0x6cb2,
++      0x6cb2, 0x7212, 0x6fac, 0x724f, 0x7253, 0x6cb2, 0x6cb2, 0x6cb2,
++      0x6cb2, 0x6cb2, 0x1078, 0x12cd, 0xa1b2, 0x0030, 0x10c8, 0x12cd,
++      0x2100, 0x0079, 0x6cbb, 0x6ceb, 0x6dc8, 0x6ceb, 0x6ceb, 0x6ceb,
++      0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb,
++      0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb,
++      0x6ceb, 0x6ceb, 0x6ced, 0x6d1c, 0x6d27, 0x6d4f, 0x6d55, 0x6d89,
++      0x6dc1, 0x6ceb, 0x6ceb, 0x6dd0, 0x6ceb, 0x6ceb, 0x6dd7, 0x6dde,
++      0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6ceb, 0x6dfb, 0x6ceb, 0x6ceb,
++      0x6e06, 0x6ceb, 0x6ceb, 0x1078, 0x12cd, 0x1078, 0x3b3e, 0x6618,
++      0x0c7e, 0x2660, 0x1078, 0x385e, 0x0c7f, 0xa6b0, 0x0001, 0x2634,
++      0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x6d0e, 0x1078, 0x73b7,
++      0x00c0, 0x6d49, 0x1078, 0x7355, 0x00c0, 0x6d0a, 0x6007, 0x0008,
++      0x0078, 0x6dc3, 0x6007, 0x0009, 0x0078, 0x6dc3, 0x1078, 0x754c,
++      0x0040, 0x6d18, 0x1078, 0x73b7, 0x0040, 0x6d02, 0x0078, 0x6d49,
++      0x6013, 0x1900, 0x0078, 0x6d0a, 0x6106, 0x1078, 0x7317, 0x6007,
++      0x0006, 0x0078, 0x6dc3, 0x6007, 0x0007, 0x0078, 0x6dc3, 0x0d7e,
++      0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006,
++      0x0040, 0x6d39, 0xa686, 0x0004, 0x0040, 0x6d39, 0x0d7f, 0x0078,
++      0x6d49, 0x1078, 0x7415, 0x00c0, 0x6d44, 0x1078, 0x38c8, 0x6007,
++      0x000a, 0x0d7f, 0x0078, 0x6dc3, 0x6007, 0x000b, 0x0d7f, 0x0078,
++      0x6dc3, 0x1078, 0x22b5, 0x6007, 0x0001, 0x0078, 0x6dc3, 0x1078,
++      0x22b5, 0x6007, 0x000c, 0x0078, 0x6dc3, 0x1078, 0x3b3e, 0x6618,
++      0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048,
++      0x6d76, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x00c0, 0x6d49,
++      0x1078, 0x7424, 0x00c0, 0x6d70, 0x6007, 0x000e, 0x0078, 0x6dc3,
++      0x1078, 0x22b5, 0x6007, 0x000f, 0x0078, 0x6dc3, 0x1078, 0x754c,
++      0x0040, 0x6d83, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040,
++      0x6d68, 0x0078, 0x6d49, 0x6013, 0x1900, 0x6007, 0x0009, 0x0078,
++      0x6dc3, 0x1078, 0x3b3e, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684,
++      0x00ff, 0xa082, 0x0006, 0x0048, 0x6dae, 0xa6b4, 0xff00, 0x8637,
++      0xa686, 0x0006, 0x00c0, 0x6d49, 0x1078, 0x744f, 0x00c0, 0x6da8,
++      0x1078, 0x7355, 0x00c0, 0x6da8, 0x6007, 0x0010, 0x0078, 0x6dc3,
++      0x1078, 0x22b5, 0x6007, 0x0011, 0x0078, 0x6dc3, 0x1078, 0x754c,
++      0x0040, 0x6dbb, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040,
++      0x6d9c, 0x0078, 0x6d49, 0x6013, 0x1900, 0x6007, 0x0009, 0x0078,
++      0x6dc3, 0x6007, 0x0012, 0x6003, 0x0001, 0x1078, 0x498e, 0x007c,
++      0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x498e, 0x0078, 0x6dc7,
++      0x6007, 0x0020, 0x6003, 0x0001, 0x1078, 0x498e, 0x007c, 0x6007,
++      0x0023, 0x6003, 0x0001, 0x1078, 0x498e, 0x007c, 0x017e, 0x027e,
++      0x2011, 0x7c88, 0x2214, 0x2c08, 0x1078, 0x7614, 0x00c0, 0x6def,
++      0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x0078, 0x6df4, 0x1078,
++      0x5d1a, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x498e,
++      0x027f, 0x017f, 0x007c, 0x6106, 0x1078, 0x6e0d, 0x6007, 0x002b,
++      0x0078, 0x6dc3, 0x6007, 0x002c, 0x0078, 0x6dc3, 0x6106, 0x1078,
++      0x6e12, 0x6007, 0x002e, 0x0078, 0x6dc3, 0x0d7e, 0x1078, 0x6e38,
++      0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x6e47, 0x00c0, 0x6e31, 0x680c,
++      0xa08c, 0xff00, 0x6824, 0xa084, 0x00ff, 0xa115, 0x6212, 0xd1e4,
++      0x0040, 0x6e26, 0x2009, 0x0001, 0x0078, 0x6e2d, 0xd1ec, 0x0040,
++      0x6e31, 0x2009, 0x0000, 0xa294, 0x00ff, 0x1078, 0x22f9, 0x0078,
++      0x6e35, 0xa085, 0x0001, 0x0078, 0x6e36, 0xa006, 0x0d7f, 0x007c,
++      0x2069, 0x7c8d, 0x6800, 0xa082, 0x0010, 0x00c8, 0x6e45, 0x6013,
++      0x0000, 0xa085, 0x0001, 0x0078, 0x6e46, 0xa006, 0x007c, 0x6013,
++      0x0000, 0x2069, 0x7c8c, 0x6808, 0xa084, 0xff00, 0xa086, 0x0800,
++      0x007c, 0x6004, 0xa0b2, 0x0030, 0x10c8, 0x12cd, 0xa1b6, 0x0013,
++      0x00c0, 0x6e5d, 0x2008, 0x0079, 0x6e70, 0xa1b6, 0x0027, 0x0040,
++      0x6e65, 0xa1b6, 0x0014, 0x10c0, 0x12cd, 0x2001, 0x0007, 0x1078,
++      0x3802, 0x1078, 0x4c9d, 0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c,
++      0x6ea0, 0x6ea2, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea2, 0x6eaa, 0x6f0d,
++      0x6ed0, 0x6f0d, 0x6ee4, 0x6f0d, 0x6eaa, 0x6f0d, 0x6f05, 0x6f0d,
++      0x6f05, 0x6f0d, 0x6f0d, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0,
++      0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0, 0x6ea0,
++      0x6f0d, 0x6ea0, 0x6ea0, 0x6f0d, 0x6ea0, 0x6f0d, 0x6f0d, 0x6ea0,
++      0x6ea0, 0x6ea0, 0x6ea0, 0x6f0d, 0x6f0d, 0x6ea0, 0x6f0d, 0x6f0d,
++      0x1078, 0x12cd, 0x1078, 0x4c9d, 0x6003, 0x0002, 0x1078, 0x4d96,
++      0x0078, 0x6f13, 0x0f7e, 0x2079, 0x7751, 0x7804, 0x0f7f, 0xd0ac,
++      0x00c0, 0x6f0d, 0x2001, 0x0000, 0x1078, 0x37e0, 0x2001, 0x0002,
++      0x1078, 0x37f4, 0x1078, 0x4c9d, 0x601f, 0x0001, 0x6003, 0x0001,
++      0x6007, 0x0002, 0x1078, 0x498e, 0x1078, 0x4d96, 0x0c7e, 0x6118,
++      0x2160, 0x2009, 0x0001, 0x1078, 0x4696, 0x0c7f, 0x0078, 0x6f13,
++      0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00, 0x8637,
++      0xa686, 0x0006, 0x0040, 0x6f0d, 0xa686, 0x0004, 0x0040, 0x6f0d,
++      0x2001, 0x0004, 0x0078, 0x6f0b, 0x2001, 0x7700, 0x2004, 0xa086,
++      0x0003, 0x00c0, 0x6eed, 0x1078, 0x2dd7, 0x2001, 0x0006, 0x1078,
++      0x6f14, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00,
++      0x8637, 0xa686, 0x0006, 0x0040, 0x6f0d, 0x2001, 0x0006, 0x0078,
++      0x6f0b, 0x2001, 0x0004, 0x0078, 0x6f0b, 0x2001, 0x0006, 0x1078,
++      0x6f14, 0x0078, 0x6f0d, 0x1078, 0x3802, 0x1078, 0x4c9d, 0x1078,
++      0x5d1a, 0x1078, 0x4d96, 0x007c, 0x017e, 0x0d7e, 0x6118, 0x2168,
++      0x6900, 0xd184, 0x0040, 0x6f2f, 0x6104, 0xa18e, 0x000a, 0x00c0,
++      0x6f27, 0x699c, 0xd1a4, 0x00c0, 0x6f27, 0x2001, 0x0007, 0x1078,
++      0x37f4, 0x2001, 0x0000, 0x1078, 0x37e0, 0x1078, 0x22d7, 0x0d7f,
++      0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0xff00,
++      0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x12cd, 0xa1b6, 0x0015,
++      0x00c0, 0x6f46, 0x1079, 0x6f4d, 0x0078, 0x6f4c, 0xa1b6, 0x0016,
++      0x10c0, 0x12cd, 0x1079, 0x6f85, 0x007c, 0x5ff7, 0x5ff7, 0x5ff7,
++      0x5ff7, 0x5ff7, 0x5ff7, 0x5ff7, 0x6f59, 0x5ff7, 0x5ff7, 0x5ff7,
++      0x5ff7, 0x0f7e, 0x2079, 0x7751, 0x7804, 0x0f7f, 0xd0ac, 0x00c0,
++      0x6f75, 0x2001, 0x0000, 0x1078, 0x37e0, 0x2001, 0x0002, 0x1078,
++      0x37f4, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078,
++      0x498e, 0x1078, 0x4d96, 0x0078, 0x6f84, 0x2011, 0x7c83, 0x220c,
++      0x017e, 0x0c7e, 0x1078, 0x384c, 0x00c0, 0x6f84, 0x1078, 0x3637,
++      0x0c7f, 0x017f, 0x1078, 0x5d1a, 0x007c, 0x5ff7, 0x5ff7, 0x5ff7,
++      0x5ff7, 0x5ff7, 0x5ff7, 0x5ff7, 0x6f91, 0x5ff7, 0x5ff7, 0x5ff7,
++      0x5ff7, 0x1078, 0x61e7, 0x00c0, 0x6f9d, 0x6003, 0x0001, 0x6007,
++      0x0001, 0x1078, 0x498e, 0x0078, 0x6f9f, 0x1078, 0x5d1a, 0x007c,
++      0x6004, 0xa08a, 0x0030, 0x10c8, 0x12cd, 0x1078, 0x4c9d, 0x1078,
++      0x6bb6, 0x1078, 0x4d96, 0x007c, 0xa182, 0x0040, 0x0079, 0x6fb0,
++      0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc2, 0x6fc0, 0x6fc0, 0x6fc0,
++      0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0, 0x6fc0,
++      0x1078, 0x12cd, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e, 0x027e,
++      0x6106, 0x2071, 0x7c80, 0x7444, 0xa4a4, 0xe600, 0x0040, 0x7026,
++      0x2009, 0x0000, 0x0c7e, 0x1078, 0x4727, 0x2c68, 0x0c7f, 0x6a00,
++      0xa284, 0x0001, 0x0040, 0x7091, 0x1078, 0x47e6, 0x0040, 0x70bc,
++      0xa295, 0x0200, 0x6a02, 0x0078, 0x6feb, 0x2009, 0x0001, 0x2011,
++      0x0200, 0x1078, 0x47d0, 0x1078, 0x1327, 0x1040, 0x12cd, 0x6003,
++      0x0007, 0x2d00, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000,
++      0x6c5a, 0x2c00, 0x685e, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130,
++      0x694a, 0xa084, 0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036,
++      0x1078, 0x3b92, 0xa486, 0x2000, 0x00c0, 0x7014, 0x2019, 0x0017,
++      0x1078, 0x75d9, 0x0078, 0x707e, 0xa486, 0x0400, 0x00c0, 0x701e,
++      0x2019, 0x0002, 0x1078, 0x75d9, 0x0078, 0x707e, 0xa486, 0x0200,
++      0x00c0, 0x7024, 0x1078, 0x75ca, 0x0078, 0x707e, 0x2009, 0x0000,
++      0x0c7e, 0x1078, 0x4727, 0x2c68, 0x0c7f, 0x6a00, 0xa284, 0x0001,
++      0x0040, 0x70d4, 0xa284, 0x0300, 0x00c0, 0x70cc, 0x6804, 0xa005,
++      0x0040, 0x70bc, 0x8001, 0x6806, 0x6003, 0x0007, 0x1078, 0x130c,
++      0x0040, 0x7085, 0x6013, 0x0000, 0x6803, 0x0000, 0x6837, 0x0116,
++      0x683b, 0x0000, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007,
++      0x7130, 0x6986, 0x6846, 0x6853, 0x003d, 0x7044, 0xa084, 0x0003,
++      0xa086, 0x0002, 0x00c0, 0x7060, 0x684f, 0x0040, 0x0078, 0x706a,
++      0xa086, 0x0001, 0x00c0, 0x7068, 0x684f, 0x0080, 0x0078, 0x706a,
++      0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, 0x7c90, 0xad90, 0x0015,
++      0x200c, 0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x7070, 0x200c,
++      0x6982, 0x8000, 0x200c, 0x697e, 0x1078, 0x3b92, 0x027f, 0x047f,
++      0x157f, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x6013, 0x0100, 0x6003,
++      0x0001, 0x6007, 0x0041, 0x1078, 0x4941, 0x1078, 0x4d96, 0x0078,
++      0x707e, 0x2069, 0x7c92, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200,
++      0x00c0, 0x70b0, 0x2069, 0x7c80, 0x686c, 0xa084, 0x00ff, 0x017e,
++      0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003, 0x0001,
++      0x6007, 0x0043, 0x1078, 0x4941, 0x1078, 0x4d96, 0x0078, 0x707e,
++      0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4941,
++      0x1078, 0x4d96, 0x0078, 0x707e, 0x6013, 0x0300, 0x0078, 0x70c2,
++      0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4941,
++      0x1078, 0x4d96, 0x0078, 0x707e, 0x6013, 0x0500, 0x0078, 0x70c2,
++      0x6013, 0x0600, 0x0078, 0x7091, 0x6013, 0x0200, 0x0078, 0x7091,
++      0xa186, 0x0013, 0x00c0, 0x70ea, 0x6004, 0xa08a, 0x0040, 0x1048,
++      0x12cd, 0xa08a, 0x0050, 0x10c8, 0x12cd, 0xa082, 0x0040, 0x2008,
++      0x0079, 0x711b, 0xa186, 0x0047, 0x00c0, 0x70f0, 0x0078, 0x714a,
++      0xa186, 0x0027, 0x0040, 0x70f8, 0xa186, 0x0014, 0x10c0, 0x12cd,
++      0x6004, 0xa082, 0x0040, 0x2008, 0x0079, 0x70fe, 0x710e, 0x7110,
++      0x7110, 0x710e, 0x710e, 0x710e, 0x710e, 0x710e, 0x710e, 0x710e,
++      0x710e, 0x710e, 0x710e, 0x710e, 0x710e, 0x710e, 0x1078, 0x12cd,
++      0x2001, 0x0007, 0x1078, 0x3802, 0x1078, 0x4c9d, 0x1078, 0x6bb6,
++      0x1078, 0x4d96, 0x007c, 0x712b, 0x713b, 0x7134, 0x7144, 0x712b,
++      0x712b, 0x712b, 0x712b, 0x712b, 0x712b, 0x712b, 0x712b, 0x712b,
++      0x712b, 0x712b, 0x712b, 0x1078, 0x12cd, 0x6010, 0xa088, 0x0013,
++      0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x4c9d, 0x6003, 0x0002,
++      0x1078, 0x4d96, 0x007c, 0x1078, 0x4c9d, 0x1078, 0x47a8, 0x1078,
++      0x5d1a, 0x1078, 0x4d96, 0x007c, 0x1078, 0x4c9d, 0x2009, 0x0041,
++      0x0078, 0x7212, 0xa182, 0x0040, 0x0079, 0x714e, 0x715e, 0x7160,
++      0x715e, 0x715e, 0x715e, 0x715e, 0x715e, 0x7161, 0x715e, 0x715e,
++      0x715e, 0x715e, 0x715e, 0x715e, 0x715e, 0x715e, 0x1078, 0x12cd,
++      0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20,
++      0x2c10, 0x1078, 0x156a, 0x007c, 0xa182, 0x0040, 0x0079, 0x7170,
++      0x7180, 0x7180, 0x7180, 0x7180, 0x7180, 0x7180, 0x7180, 0x7180,
++      0x7180, 0x7182, 0x71a5, 0x7180, 0x7180, 0x7180, 0x7180, 0x71a5,
++      0x1078, 0x12cd, 0x1078, 0x4d45, 0x1078, 0x4e56, 0x6010, 0x0d7e,
++      0x2068, 0x684c, 0xd0fc, 0x0040, 0x7198, 0xa08c, 0x0003, 0xa18e,
++      0x0002, 0x0040, 0x719e, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x7212,
++      0x6003, 0x0007, 0x1078, 0x47a8, 0x0d7f, 0x007c, 0x1078, 0x47a8,
++      0x1078, 0x5d1a, 0x0d7f, 0x0078, 0x719d, 0x037e, 0x1078, 0x4d45,
++      0x1078, 0x4e56, 0x6010, 0x0d7e, 0x2068, 0x2019, 0x0004, 0x1078,
++      0x75fd, 0x1078, 0x6bb6, 0x6017, 0x0028, 0x0d7f, 0x037f, 0x007c,
++      0xa186, 0x0013, 0x00c0, 0x71c6, 0x6004, 0xa086, 0x0042, 0x10c0,
++      0x12cd, 0x1078, 0x4c9d, 0x1078, 0x4d96, 0x007c, 0xa186, 0x0027,
++      0x0040, 0x71ce, 0xa186, 0x0014, 0x00c0, 0x71de, 0x6004, 0xa086,
++      0x0042, 0x10c0, 0x12cd, 0x2001, 0x0007, 0x1078, 0x3802, 0x1078,
++      0x4c9d, 0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c, 0xa182, 0x0040,
++      0x0079, 0x71e2, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2,
++      0x71f2, 0x71f4, 0x7200, 0x71f2, 0x71f2, 0x71f2, 0x71f2, 0x71f2,
++      0x71f2, 0x71f2, 0x1078, 0x12cd, 0x037e, 0x047e, 0x20e1, 0x0005,
++      0x3d18, 0x3e20, 0x2c10, 0x1078, 0x156a, 0x047f, 0x037f, 0x007c,
++      0x6010, 0x0d7e, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x720c, 0x2009,
++      0x0041, 0x0d7f, 0x0078, 0x7212, 0x6003, 0x0007, 0x1078, 0x47a8,
++      0x0d7f, 0x007c, 0xa182, 0x0040, 0x0079, 0x7216, 0x7226, 0x7228,
++      0x7234, 0x7240, 0x7226, 0x7226, 0x7226, 0x7226, 0x7226, 0x7226,
++      0x7226, 0x7226, 0x7226, 0x7226, 0x7226, 0x7226, 0x1078, 0x12cd,
++      0x6003, 0x0001, 0x6106, 0x1078, 0x4941, 0x127e, 0x2091, 0x8000,
++      0x1078, 0x4d96, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
++      0x4941, 0x127e, 0x2091, 0x8000, 0x1078, 0x4d96, 0x127f, 0x007c,
++      0x6003, 0x0003, 0x6106, 0x2c10, 0x1078, 0x19c7, 0x127e, 0x2091,
++      0x8000, 0x1078, 0x49ad, 0x1078, 0x4e56, 0x127f, 0x007c, 0x1078,
++      0x4c9d, 0x0078, 0x7255, 0x1078, 0x4d45, 0x6110, 0x81ff, 0x0040,
++      0x7262, 0x0d7e, 0x2168, 0x037e, 0x2019, 0x0029, 0x1078, 0x75fd,
++      0x037f, 0x0d7f, 0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c, 0xa182,
++      0x0085, 0x0079, 0x726b, 0x7272, 0x7272, 0x7272, 0x7274, 0x7272,
++      0x7272, 0x7272, 0x1078, 0x12cd, 0x027e, 0x0e7e, 0x2071, 0x7c80,
++      0x7220, 0x1078, 0x7517, 0x0040, 0x7281, 0x6007, 0x0086, 0x0078,
++      0x7283, 0x6007, 0x0087, 0x6003, 0x0001, 0x1078, 0x4941, 0x1078,
++      0x4d96, 0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x729d,
++      0x6004, 0xa08a, 0x0085, 0x1048, 0x12cd, 0xa08a, 0x008c, 0x10c8,
++      0x12cd, 0xa082, 0x0085, 0x0079, 0x72b0, 0xa186, 0x0027, 0x0040,
++      0x72a5, 0xa186, 0x0014, 0x10c0, 0x12cd, 0x2001, 0x0007, 0x1078,
++      0x3802, 0x1078, 0x4c9d, 0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c,
++      0x72b7, 0x72b9, 0x72b9, 0x72b7, 0x72b7, 0x72b7, 0x72b7, 0x1078,
++      0x12cd, 0x1078, 0x4c9d, 0x1078, 0x5d1a, 0x1078, 0x4d96, 0x007c,
++      0xa182, 0x0085, 0x1048, 0x12cd, 0xa182, 0x008c, 0x10c8, 0x12cd,
++      0xa182, 0x0085, 0x0079, 0x72cc, 0x72d3, 0x72d3, 0x72d3, 0x72d5,
++      0x72d3, 0x72d3, 0x72d3, 0x1078, 0x12cd, 0x007c, 0x1078, 0x4c9d,
++      0x1078, 0x6bb6, 0x1078, 0x4d96, 0x007c, 0x037e, 0x2019, 0x000b,
++      0x1078, 0x72e6, 0x601f, 0x0006, 0x037f, 0x007c, 0x127e, 0x037e,
++      0x087e, 0x2091, 0x8000, 0x2c40, 0x1078, 0x5a2d, 0x00c0, 0x7313,
++      0x1078, 0x5ace, 0x00c0, 0x7313, 0x6000, 0xa086, 0x0000, 0x0040,
++      0x7313, 0x601c, 0xa086, 0x0007, 0x0040, 0x7313, 0x0d7e, 0x6000,
++      0xa086, 0x0004, 0x00c0, 0x7306, 0x1078, 0x166e, 0x6010, 0x2068,
++      0x1078, 0x6a58, 0x0040, 0x730e, 0x1078, 0x75fd, 0x0d7f, 0x6013,
++      0x0000, 0x601f, 0x0007, 0x087f, 0x037f, 0x127f, 0x007c, 0x0f7e,
++      0x0c7e, 0x037e, 0x157e, 0x2079, 0x7c80, 0x7838, 0xa08c, 0x00ff,
++      0x783c, 0x1078, 0x207f, 0x00c0, 0x734e, 0x017e, 0x0c7e, 0x1078,
++      0x384c, 0x00c0, 0x734e, 0x2011, 0x7c90, 0xac98, 0x000a, 0x20a9,
++      0x0004, 0x1078, 0x6280, 0x00c0, 0x734e, 0x017f, 0x027f, 0x027e,
++      0x017e, 0x2019, 0x0029, 0x1078, 0x5ba2, 0x1078, 0x4a7e, 0x1078,
++      0x49c1, 0x017f, 0x1078, 0x747b, 0x1078, 0x3a36, 0x017f, 0x1078,
++      0x3637, 0x6612, 0x6516, 0xa006, 0x0078, 0x7350, 0x0c7f, 0x017f,
++      0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, 0x0c7e, 0x0d7e, 0x017e,
++      0x2009, 0x771e, 0x2104, 0xa086, 0x0074, 0x00c0, 0x73ac, 0x2069,
++      0x7c8e, 0x690c, 0xa182, 0x0100, 0x0048, 0x739c, 0x6908, 0xa184,
++      0x8000, 0x0040, 0x73a8, 0xa184, 0x0800, 0x0040, 0x73a8, 0x6910,
++      0xa18a, 0x0001, 0x0048, 0x73a0, 0x6914, 0x2069, 0x7cae, 0x6904,
++      0x81ff, 0x00c0, 0x7394, 0x690c, 0xa182, 0x0100, 0x0048, 0x739c,
++      0x6908, 0x81ff, 0x00c0, 0x7398, 0x6910, 0xa18a, 0x0001, 0x0048,
++      0x73a0, 0x6918, 0xa18a, 0x0001, 0x0048, 0x73a8, 0x0078, 0x73b2,
++      0x6013, 0x0100, 0x0078, 0x73ae, 0x6013, 0x0300, 0x0078, 0x73ae,
++      0x6013, 0x0500, 0x0078, 0x73ae, 0x6013, 0x0700, 0x0078, 0x73ae,
++      0x6013, 0x0900, 0x0078, 0x73ae, 0x6013, 0x0b00, 0x0078, 0x73ae,
++      0x6013, 0x0f00, 0x0078, 0x73ae, 0x6013, 0x2d00, 0xa085, 0x0001,
++      0x0078, 0x73b3, 0xa006, 0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e,
++      0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394,
++      0x00ff, 0xa286, 0x0006, 0x0040, 0x73db, 0xa286, 0x0004, 0x0040,
++      0x73db, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x73db,
++      0xa286, 0x0004, 0x0040, 0x73db, 0x0c7e, 0x2d60, 0x1078, 0x385e,
++      0x0c7f, 0x0078, 0x740e, 0x2011, 0x7c96, 0xad98, 0x000a, 0x20a9,
++      0x0004, 0x1078, 0x6280, 0x00c0, 0x740f, 0x2011, 0x7c9a, 0xad98,
++      0x0006, 0x20a9, 0x0004, 0x1078, 0x6280, 0x00c0, 0x740f, 0x047e,
++      0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x7752,
++      0x210c, 0xd1a4, 0x0040, 0x7403, 0x2009, 0x0029, 0x1078, 0x7641,
++      0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x4a7e, 0x1078,
++      0x49c1, 0x2c08, 0x1078, 0x747b, 0x017f, 0x047f, 0xa006, 0x157f,
++      0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0x7c8e,
++      0x6800, 0xa086, 0x0800, 0x0040, 0x7421, 0x6013, 0x0000, 0x0078,
++      0x7422, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e,
++      0x037e, 0x157e, 0x2079, 0x7c8c, 0x7930, 0x7834, 0x1078, 0x207f,
++      0x00c0, 0x7448, 0x1078, 0x384c, 0x00c0, 0x7448, 0x2011, 0x7c90,
++      0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x6280, 0x00c0, 0x7448,
++      0x2011, 0x7c94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x6280,
++      0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e,
++      0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0x7c83, 0x2204,
++      0x8211, 0x220c, 0x1078, 0x207f, 0x00c0, 0x7474, 0x1078, 0x384c,
++      0x00c0, 0x7474, 0x2011, 0x7c96, 0xac98, 0x000a, 0x20a9, 0x0004,
++      0x1078, 0x6280, 0x00c0, 0x7474, 0x2011, 0x7c9a, 0xac98, 0x0006,
++      0x20a9, 0x0004, 0x1078, 0x6280, 0x157f, 0x037f, 0x027f, 0x017f,
++      0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e,
++      0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2029, 0x793f, 0x252c,
++      0x2021, 0x7945, 0x2424, 0x2061, 0x7e00, 0x2071, 0x7700, 0x7644,
++      0x7060, 0x8001, 0xa602, 0x00c8, 0x74e0, 0x2100, 0xac06, 0x0040,
++      0x74d6, 0x1078, 0x7659, 0x0040, 0x74d6, 0x671c, 0xa786, 0x0001,
++      0x0040, 0x74f5, 0xa786, 0x0007, 0x0040, 0x74d6, 0x2500, 0xac06,
++      0x0040, 0x74d6, 0x2400, 0xac06, 0x0040, 0x74d6, 0x1078, 0x766d,
++      0x00c0, 0x74d6, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x74bc,
++      0x017e, 0x1078, 0x166e, 0x017f, 0x6010, 0x2068, 0x1078, 0x6a58,
++      0x0040, 0x74d3, 0xa786, 0x0003, 0x00c0, 0x74e9, 0x6837, 0x0103,
++      0x6b4a, 0x6847, 0x0000, 0x017e, 0x1078, 0x6c54, 0x1078, 0x3b92,
++      0x017f, 0x1078, 0x6ba9, 0x0d7f, 0x1078, 0x6bb6, 0xace0, 0x0008,
++      0x2001, 0x7715, 0x2004, 0xac02, 0x00c8, 0x74e0, 0x0078, 0x748d,
++      0x127f, 0x027f, 0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f,
++      0x007c, 0xa786, 0x0006, 0x00c0, 0x74c6, 0xa386, 0x0005, 0x0040,
++      0x74d6, 0x1078, 0x75fd, 0x0078, 0x74d3, 0x1078, 0x766d, 0x00c0,
++      0x74d6, 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x00c0, 0x74d6,
++      0x6000, 0xa086, 0x0002, 0x00c0, 0x74d6, 0x1078, 0x6bcf, 0x0040,
++      0x7511, 0x1078, 0x6be3, 0x00c0, 0x74d6, 0x1078, 0x5f6d, 0x0078,
++      0x7513, 0x1078, 0x22d7, 0x1078, 0x6bb6, 0x0078, 0x74d6, 0x0c7e,
++      0x0e7e, 0x017e, 0x2c08, 0x2170, 0x1078, 0x7614, 0x017f, 0x0040,
++      0x7526, 0x601c, 0xa084, 0x000f, 0x1079, 0x7529, 0x0e7f, 0x0c7f,
++      0x007c, 0x7531, 0x7531, 0x7531, 0x7531, 0x7531, 0x7531, 0x7533,
++      0x7531, 0xa006, 0x007c, 0x047e, 0x017e, 0x7018, 0xa080, 0x0028,
++      0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x1078,
++      0x7641, 0x017f, 0x047f, 0x037e, 0x2019, 0x0002, 0x1078, 0x72e6,
++      0x037f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0001, 0x1078, 0x37e0,
++      0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, 0x7705,
++      0x2011, 0x7c96, 0x1078, 0x6280, 0x037f, 0x027f, 0x017f, 0x157f,
++      0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x027e,
++      0x127e, 0x2091, 0x8000, 0x2061, 0x7e00, 0x2079, 0x0001, 0x8fff,
++      0x0040, 0x75bd, 0x2071, 0x7700, 0x7644, 0x7060, 0x8001, 0xa602,
++      0x00c8, 0x75bd, 0x88ff, 0x0040, 0x7583, 0x2800, 0xac06, 0x00c0,
++      0x75b3, 0x2079, 0x0000, 0x1078, 0x7659, 0x0040, 0x75b3, 0x2400,
++      0xac06, 0x0040, 0x75b3, 0x671c, 0xa786, 0x0006, 0x00c0, 0x75b3,
++      0xa786, 0x0007, 0x0040, 0x75b3, 0x88ff, 0x00c0, 0x759b, 0x6018,
++      0xa206, 0x00c0, 0x75b3, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0,
++      0x75a3, 0x1078, 0x166e, 0x6010, 0x2068, 0x1078, 0x6a58, 0x0040,
++      0x75ad, 0x047e, 0x1078, 0x75fd, 0x047f, 0x0d7f, 0x1078, 0x6bb6,
++      0x88ff, 0x00c0, 0x75c6, 0xace0, 0x0008, 0x2001, 0x7715, 0x2004,
++      0xac02, 0x00c8, 0x75bd, 0x0078, 0x756f, 0xa006, 0x127f, 0x027f,
++      0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, 0x0001,
++      0x0078, 0x75be, 0x087e, 0x2041, 0x0000, 0x2c20, 0x2019, 0x0002,
++      0x6218, 0x1078, 0x5a2d, 0x1078, 0x5ace, 0x1078, 0x7562, 0x087f,
++      0x007c, 0x027e, 0x047e, 0x087e, 0x0c7e, 0x157e, 0x2c20, 0x20a9,
++      0x007f, 0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x384c, 0x00c0,
++      0x75f2, 0x2c10, 0x2041, 0x0000, 0x1078, 0x5a2d, 0x1078, 0x5ace,
++      0x1078, 0x7562, 0x037f, 0x017f, 0x8108, 0x00f0, 0x75e3, 0x157f,
++      0x0c7f, 0x087f, 0x047f, 0x027f, 0x007c, 0x017e, 0x0f7e, 0x8dff,
++      0x0040, 0x7611, 0x6800, 0xa07d, 0x0040, 0x760e, 0x6803, 0x0000,
++      0x6b52, 0x1078, 0x3b92, 0x2f68, 0x0078, 0x7602, 0x6b52, 0x1078,
++      0x3b92, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e, 0x037e, 0x2061,
++      0x7e00, 0x2071, 0x7700, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8,
++      0x763c, 0x2100, 0xac06, 0x0040, 0x762e, 0x6000, 0xa086, 0x0000,
++      0x0040, 0x762e, 0x6008, 0xa206, 0x0040, 0x7638, 0xace0, 0x0008,
++      0x2001, 0x7715, 0x2004, 0xac02, 0x00c8, 0x763c, 0x0078, 0x7619,
++      0xa085, 0x0001, 0x0078, 0x763d, 0xa006, 0x037f, 0x047f, 0x0e7f,
++      0x007c, 0x0d7e, 0x007e, 0x1078, 0x1327, 0x007f, 0x1040, 0x12cd,
++      0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000,
++      0x685e, 0x6956, 0x6c46, 0x684f, 0x0000, 0x1078, 0x3b92, 0x0d7f,
++      0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0x766c, 0xa786, 0x0001,
++      0x0040, 0x766c, 0xa786, 0x000a, 0x0040, 0x766c, 0xa786, 0x0009,
++      0x0040, 0x766c, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018, 0x2070,
++      0x70a0, 0xa206, 0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091,
++      0x8000, 0x2071, 0x7740, 0xd5a4, 0x0040, 0x7681, 0x7034, 0x8000,
++      0x7036, 0xd5b4, 0x0040, 0x7687, 0x7030, 0x8000, 0x7032, 0xd5ac,
++      0x0040, 0x768e, 0x2071, 0x774a, 0x1078, 0x76bd, 0x0e7f, 0x007f,
++      0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071,
++      0x7740, 0xd5a4, 0x0040, 0x769f, 0x7034, 0x8000, 0x7036, 0xd5b4,
++      0x0040, 0x76a5, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0x76ac,
++      0x2071, 0x774a, 0x1078, 0x76bd, 0x0e7f, 0x007f, 0x127f, 0x007c,
++      0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x7742, 0x1078,
++      0x76bd, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x2e04, 0x8000, 0x2072,
++      0x00c8, 0x76c6, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e,
++      0x2071, 0x7740, 0x1078, 0x76bd, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
++      0x7744, 0x1078, 0x76bd, 0x0e7f, 0x007c, 0x0001, 0x0002, 0x0004,
++      0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400,
++      0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x687d
++};
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_2200.h     2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,5286 @@
++/* @(#)asm_2200.h 1.5 */
++/*
++ * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 by Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */ 
++
++/************************************************************************
++ *                                                                    *
++ *               --- ISP2200 Initiator/Target Firmware ---              *
++ *             with Fabric (Public Loop), Point-point, and              *
++ *             expanded LUN addressing for FCTAPE                       *
++ *                                                                    *
++ ************************************************************************/
++/*
++ *    Firmware Version 2.02.03 (08:58 May 02, 2002)
++ */
++static const u_int16_t isp_2200_risc_code[] = {
++      0x0470, 0x0000, 0x0000, 0xa3f2, 0x0000, 0x0002, 0x0002, 0x0003,
++      0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++      0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++      0x5449, 0x4f4e, 0x2049, 0x5350, 0x3232, 0x3030, 0x2046, 0x6972,
++      0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++      0x322e, 0x3032, 0x2e30, 0x3320, 0x2020, 0x2020, 0x2400, 0x20c1,
++      0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0xb9ff, 0x2091,
++      0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x2930,
++      0x2051, 0xb400, 0x2a70, 0x2029, 0xec00, 0x2031, 0xffff, 0x2039,
++      0xebe9, 0x2021, 0x0200, 0x0804, 0x1464, 0x20a1, 0xb3f2, 0xa00e,
++      0x20a9, 0x080e, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a,
++      0x746e, 0x20a1, 0xbc00, 0x7164, 0x810d, 0x810d, 0x810d, 0x810d,
++      0xa18c, 0x000f, 0x2001, 0x000b, 0xa112, 0xa00e, 0x21a8, 0x41a4,
++      0x3400, 0x8211, 0x1dd8, 0x7164, 0x3400, 0xa102, 0x0120, 0x0218,
++      0x20a8, 0xa00e, 0x41a4, 0x3800, 0xd08c, 0x01d8, 0x2009, 0xb400,
++      0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0001,
++      0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0,
++      0x2009, 0xb400, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e,
++      0x41a4, 0x080c, 0x140d, 0x080c, 0x162e, 0x080c, 0x17c7, 0x080c,
++      0x1f73, 0x080c, 0x4bb9, 0x080c, 0x8562, 0x080c, 0x15b7, 0x080c,
++      0x2e88, 0x080c, 0x5d4b, 0x080c, 0x5302, 0x080c, 0x6893, 0x080c,
++      0x24d9, 0x080c, 0x6b26, 0x080c, 0x637c, 0x080c, 0x239b, 0x080c,
++      0x24a7, 0x2091, 0x3009, 0x7823, 0x0000, 0x1004, 0x10c5, 0x7820,
++      0xa086, 0x0002, 0x1150, 0x7823, 0x4000, 0x0e04, 0x10bd, 0x781b,
++      0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000,
++      0x2a70, 0x7000, 0xa08e, 0x0003, 0x1158, 0x080c, 0x3ec6, 0x080c,
++      0x2eaf, 0x080c, 0x5d99, 0x080c, 0x54b1, 0x080c, 0x68be, 0x0c80,
++      0x000b, 0x0c98, 0x10e4, 0x10e5, 0x1210, 0x10e2, 0x12d9, 0x140a,
++      0x140b, 0x140c, 0x080c, 0x1511, 0x0005, 0x0126, 0x00f6, 0x2091,
++      0x8000, 0x7000, 0xa086, 0x0001, 0x1904, 0x11ed, 0x080c, 0x1584,
++      0x080c, 0x5a90, 0x0150, 0x080c, 0x5ab6, 0x15c0, 0x2079, 0x0100,
++      0x7828, 0xa085, 0x1800, 0x782a, 0x0488, 0x080c, 0x59c8, 0x7000,
++      0xa086, 0x0001, 0x1904, 0x11ed, 0x708c, 0xa086, 0x0028, 0x1904,
++      0x11ed, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827,
++      0xffff, 0x7a28, 0xa295, 0x1e2f, 0x7a2a, 0x2011, 0x5963, 0x080c,
++      0x6961, 0x2011, 0x5956, 0x080c, 0x6a21, 0x2011, 0x59a5, 0x080c,
++      0x6961, 0x2011, 0x4a96, 0x080c, 0x6961, 0x2011, 0x8030, 0x2019,
++      0x0000, 0x708b, 0x0000, 0x080c, 0x1db8, 0x00e8, 0x080c, 0x4449,
++      0x2079, 0x0100, 0x7844, 0xa005, 0x1904, 0x11ed, 0x2011, 0x4a96,
++      0x080c, 0x6961, 0x2011, 0x59a5, 0x080c, 0x6961, 0x080c, 0x1db8,
++      0x2001, 0xb68d, 0x2004, 0x780e, 0x7840, 0xa084, 0xfffb, 0x7842,
++      0x2011, 0x8010, 0x73cc, 0x080c, 0x3e8a, 0x723c, 0xc284, 0x723e,
++      0x2001, 0xb40c, 0x200c, 0xc1ac, 0x2102, 0x080c, 0x7edf, 0x2011,
++      0x0004, 0x080c, 0x9bf1, 0x080c, 0x520e, 0x080c, 0x5a90, 0x0158,
++      0x080c, 0x4ba2, 0x0140, 0x708b, 0x0001, 0x70c7, 0x0000, 0x080c,
++      0x45e6, 0x0804, 0x11ed, 0x080c, 0x52ca, 0x0120, 0x7a0c, 0xc2b4,
++      0x7a0e, 0x0060, 0x7073, 0x0000, 0x080c, 0x9f99, 0x70d4, 0xd09c,
++      0x1128, 0x70a0, 0xa005, 0x0110, 0x080c, 0x4b80, 0x70df, 0x0000,
++      0x70db, 0x0000, 0x72d4, 0x080c, 0x5a90, 0x1178, 0x2011, 0x0000,
++      0x0016, 0x080c, 0x28b1, 0x2019, 0xb68f, 0x211a, 0x001e, 0x7053,
++      0xffff, 0x7057, 0x00ef, 0x7077, 0x0000, 0x2079, 0xb452, 0x7804,
++      0xd0ac, 0x0108, 0xc295, 0x72d6, 0x080c, 0x5a90, 0x0118, 0xa296,
++      0x0004, 0x0548, 0x2011, 0x0001, 0x080c, 0x9bf1, 0x709b, 0x0000,
++      0x709f, 0xffff, 0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003,
++      0x7828, 0xa085, 0x0003, 0x782a, 0x00fe, 0x080c, 0x2a7e, 0x2011,
++      0x0005, 0x080c, 0x801f, 0x080c, 0x7134, 0x080c, 0x5a90, 0x0148,
++      0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x28b1, 0x61e2, 0x001e,
++      0x00ce, 0x012e, 0x0420, 0x709b, 0x0000, 0x709f, 0xffff, 0x7003,
++      0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0xa085,
++      0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, 0x080c, 0x801f, 0x080c,
++      0x7134, 0x080c, 0x5a90, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016,
++      0x080c, 0x28b1, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005,
++      0x00c6, 0x080c, 0x5a90, 0x1118, 0x20a9, 0x0100, 0x0010, 0x20a9,
++      0x0082, 0x080c, 0x5a90, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009,
++      0x007e, 0x080c, 0x2d5b, 0x8108, 0x1f04, 0x1201, 0x00ce, 0x7073,
++      0x0000, 0x7074, 0xa084, 0x00ff, 0x7076, 0x70a3, 0x0000, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x7000, 0xa086, 0x0002, 0x1904, 0x12d7,
++      0x709c, 0xa086, 0xffff, 0x0130, 0x080c, 0x2a7e, 0x080c, 0x7134,
++      0x0804, 0x12d7, 0x70d4, 0xd0ac, 0x1110, 0xd09c, 0x0540, 0xd084,
++      0x0530, 0x0006, 0x0016, 0x2001, 0x0103, 0x2009, 0xb68d, 0x210c,
++      0x2102, 0x001e, 0x000e, 0xd08c, 0x01d0, 0x70d8, 0xa086, 0xffff,
++      0x0190, 0x080c, 0x2bdd, 0x080c, 0x7134, 0x70d4, 0xd094, 0x1904,
++      0x12d7, 0x2011, 0x0001, 0x2019, 0x0000, 0x080c, 0x2c13, 0x080c,
++      0x7134, 0x0804, 0x12d7, 0x70dc, 0xa005, 0x1904, 0x12d7, 0x7098,
++      0xa005, 0x1904, 0x12d7, 0x70d4, 0xd0a4, 0x0118, 0xd0b4, 0x0904,
++      0x12d7, 0x080c, 0x52ca, 0x1904, 0x12d7, 0x2001, 0xb453, 0x2004,
++      0xd0ac, 0x01c8, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000,
++      0x0016, 0x080c, 0x4f6a, 0x1118, 0x6000, 0xd0ec, 0x1138, 0x001e,
++      0x8108, 0x1f04, 0x1268, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce,
++      0x015e, 0x0804, 0x12d7, 0x0006, 0x0016, 0x2001, 0x0103, 0x2009,
++      0xb68d, 0x210c, 0x2102, 0x001e, 0x000e, 0xa006, 0x2009, 0x0700,
++      0x20a9, 0x0002, 0x20a1, 0xb6ce, 0x40a1, 0x7070, 0x8007, 0x7174,
++      0x810f, 0x20a9, 0x0002, 0x40a1, 0x2009, 0x0000, 0x080c, 0x14f7,
++      0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x40a1, 0xa006, 0x2009,
++      0x0200, 0x20a9, 0x0002, 0x20a1, 0xb6de, 0x40a1, 0x7030, 0xc08c,
++      0x7032, 0x7003, 0x0003, 0x709f, 0xffff, 0x080c, 0x157d, 0xa006,
++      0x080c, 0x2789, 0x080c, 0x3efc, 0x00f6, 0x2079, 0x0100, 0x080c,
++      0x5ab6, 0x0150, 0x080c, 0x5a90, 0x7828, 0x0118, 0xa084, 0xe1ff,
++      0x0010, 0xa084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0xb6e1, 0x2004,
++      0xa086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x801f, 0x2011,
++      0x0000, 0x080c, 0x8029, 0x080c, 0x7134, 0x080c, 0x71f1, 0x012e,
++      0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079,
++      0x0100, 0x2009, 0xb434, 0x2104, 0xa005, 0x1110, 0x080c, 0x28dd,
++      0x2009, 0x00f7, 0x080c, 0x4b69, 0x7940, 0xa18c, 0x0010, 0x7942,
++      0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, 0x0110, 0x7827,
++      0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, 0x1904, 0x1347,
++      0x080c, 0x5aa2, 0x0158, 0x080c, 0x5ab6, 0x1128, 0x2001, 0xb69e,
++      0x2003, 0x0000, 0x0070, 0x080c, 0x5a98, 0x0dc0, 0x2001, 0xb69e,
++      0x2003, 0xaaaa, 0x2001, 0xb69f, 0x2003, 0x0001, 0x080c, 0x59c8,
++      0x0058, 0x080c, 0x5a90, 0x0140, 0x2009, 0x00f8, 0x080c, 0x4b69,
++      0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c,
++      0x1138, 0x080c, 0x5a90, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x13f1,
++      0x1f04, 0x1326, 0x0070, 0x7824, 0x080c, 0x5aac, 0x0118, 0xd0ac,
++      0x1904, 0x13f1, 0xa084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804,
++      0x13f1, 0x2001, 0x0001, 0x080c, 0x2789, 0x0804, 0x1400, 0x7850,
++      0xa084, 0x0180, 0x7852, 0x782f, 0x0020, 0x20a9, 0x0046, 0x1d04,
++      0x134f, 0x080c, 0x6a09, 0x1f04, 0x134f, 0x7850, 0xa084, 0x0180,
++      0xa085, 0x0400, 0x7852, 0x782f, 0x0000, 0x080c, 0x5aa2, 0x0158,
++      0x080c, 0x5ab6, 0x1128, 0x2001, 0xb69e, 0x2003, 0x0000, 0x0070,
++      0x080c, 0x5a98, 0x0dc0, 0x2001, 0xb69e, 0x2003, 0xaaaa, 0x2001,
++      0xb69f, 0x2003, 0x0001, 0x080c, 0x59c8, 0x0020, 0x2009, 0x00f8,
++      0x080c, 0x4b69, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x137c, 0x7850,
++      0xa084, 0x0180, 0xa085, 0x1400, 0x7852, 0x080c, 0x5a90, 0x0120,
++      0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, 0x2019, 0xea60,
++      0x7820, 0xd09c, 0x1558, 0x080c, 0x5a90, 0x05d8, 0x7824, 0xd0ac,
++      0x1904, 0x13f1, 0x080c, 0x5ab6, 0x1508, 0x0046, 0x2021, 0x0190,
++      0x8421, 0x1df0, 0x004e, 0x8421, 0x11c8, 0x7827, 0x0048, 0x20a9,
++      0x01f4, 0x1d04, 0x13a9, 0x080c, 0x6a09, 0x1f04, 0x13a9, 0x7824,
++      0xa084, 0x0068, 0x15c8, 0x2001, 0xb69e, 0x2003, 0xaaaa, 0x2001,
++      0xb69f, 0x2003, 0x0001, 0x7003, 0x0001, 0x0498, 0x1d04, 0x13c2,
++      0x080c, 0x6a09, 0x8319, 0x1960, 0x2009, 0xb434, 0x2104, 0x8000,
++      0x200a, 0xa084, 0xfff0, 0x0120, 0x200b, 0x0000, 0x080c, 0x28dd,
++      0x00d8, 0x080c, 0x5aa2, 0x1140, 0xa4a2, 0x0064, 0x1128, 0x080c,
++      0x5a67, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0xe000, 0xe000,
++      0x7824, 0x080c, 0x5aac, 0x0110, 0xd0ac, 0x1158, 0xa084, 0x1800,
++      0x09a8, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x2789,
++      0x0048, 0x2001, 0xb434, 0x2003, 0x0000, 0x7827, 0x0048, 0x7828,
++      0xc09d, 0x782a, 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, 0x7852,
++      0x015e, 0x003e, 0x000e, 0x080c, 0x1554, 0x012e, 0x00fe, 0x004e,
++      0x001e, 0x0005, 0x0005, 0x0005, 0x0005, 0x2a70, 0x2061, 0xb6c1,
++      0x2063, 0x0002, 0x6007, 0x0002, 0x600b, 0x0003, 0x600f, 0x0017,
++      0x2001, 0xb69e, 0x2003, 0x0000, 0x708b, 0x0000, 0x2009, 0x0100,
++      0x2104, 0xa082, 0x0002, 0x0218, 0x7053, 0xffff, 0x0010, 0x7053,
++      0x0000, 0x705b, 0xffff, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c,
++      0x9f99, 0x2061, 0xb68e, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b,
++      0x8800, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x601b,
++      0x0000, 0x601f, 0x07d0, 0x2061, 0xb696, 0x6003, 0x8000, 0x6007,
++      0x0000, 0x600b, 0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017,
++      0x0000, 0x601b, 0x0001, 0x601f, 0x0000, 0x2061, 0xb6b9, 0x6003,
++      0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, 0x2001,
++      0xb428, 0x2003, 0x0000, 0x0005, 0x04a0, 0x2011, 0x0000, 0x81ff,
++      0x0570, 0xa186, 0x0001, 0x1148, 0x2031, 0x8fff, 0x2039, 0xd401,
++      0x2021, 0x0100, 0x2029, 0xd400, 0x00e8, 0xa186, 0x0002, 0x1118,
++      0x2011, 0x0000, 0x00b8, 0xa186, 0x0005, 0x1118, 0x2011, 0x0001,
++      0x0088, 0xa186, 0x0009, 0x1118, 0x2011, 0x0002, 0x0058, 0xa186,
++      0x000a, 0x1118, 0x2011, 0x0002, 0x0028, 0xa186, 0x0055, 0x1110,
++      0x2011, 0x0003, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0804,
++      0x104d, 0xa00e, 0x2011, 0x0003, 0x2019, 0x14a0, 0x0804, 0x14f1,
++      0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, 0x2362, 0xe000, 0xe000,
++      0x2c04, 0xa306, 0x2262, 0x1110, 0xc1b5, 0xc1a5, 0x2011, 0x0000,
++      0x2019, 0x14b3, 0x04f0, 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14,
++      0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061, 0x7fff, 0xe000, 0xe000,
++      0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x0110, 0xc18d, 0x0008,
++      0xc185, 0x2011, 0x0002, 0x2019, 0x14ce, 0x0418, 0x2061, 0xffff,
++      0x2019, 0xaaaa, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c04, 0x2262,
++      0xa306, 0x1180, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061,
++      0x7fff, 0x2c04, 0x2061, 0xffff, 0x2262, 0xa306, 0x1110, 0xc195,
++      0x0008, 0xc19d, 0x2011, 0x0001, 0x2019, 0x14ef, 0x0010, 0x0804,
++      0x1465, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0837, 0x2011,
++      0x0000, 0x080c, 0x4f6a, 0x1178, 0x6004, 0xa0c4, 0x00ff, 0xa8c6,
++      0x0006, 0x0128, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x1120, 0xa186,
++      0x0080, 0x0108, 0x8210, 0x8108, 0xa186, 0x0100, 0x1d50, 0x2208,
++      0x0005, 0x2091, 0x8000, 0x0e04, 0x1513, 0x0006, 0x0016, 0x2079,
++      0x0000, 0x7818, 0xd084, 0x1de8, 0x001e, 0x792e, 0x000e, 0x782a,
++      0x000e, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001,
++      0x2091, 0x5000, 0x0126, 0x0156, 0x0146, 0x20a9, 0x0010, 0x20a1,
++      0xb80c, 0x2091, 0x2000, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2200,
++      0x40a1, 0x20a9, 0x0010, 0x2091, 0x2400, 0x40a1, 0x20a9, 0x0010,
++      0x2091, 0x2600, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2800, 0x40a1,
++      0x014e, 0x015e, 0x012e, 0x2079, 0xb400, 0x7803, 0x0005, 0x2091,
++      0x4080, 0x04c9, 0x0cf8, 0x0005, 0x0006, 0x080c, 0x159f, 0x1518,
++      0x00f6, 0x2079, 0xb424, 0x2f04, 0x8000, 0x207a, 0xa082, 0x000f,
++      0x0258, 0xa006, 0x207a, 0x2079, 0xb426, 0x2f04, 0xa084, 0x0001,
++      0xa086, 0x0001, 0x207a, 0x0070, 0x2079, 0xb426, 0x2f7c, 0x8fff,
++      0x1128, 0x2001, 0x0c03, 0x2003, 0x0040, 0x0020, 0x2001, 0x0c03,
++      0x2003, 0x00c0, 0x00fe, 0x000e, 0x0005, 0x0409, 0x1120, 0x2001,
++      0x0c03, 0x2003, 0x0080, 0x0005, 0x00d1, 0x1120, 0x2001, 0x0c03,
++      0x2003, 0x0040, 0x0005, 0x0006, 0x0091, 0x1178, 0x2001, 0x0c03,
++      0x2003, 0x0040, 0x2009, 0x0fff, 0x00a1, 0x2001, 0x0c03, 0x2003,
++      0x0080, 0x2009, 0x0fff, 0x0069, 0x0c88, 0x000e, 0x0005, 0x00c6,
++      0x2061, 0x0c00, 0x2c04, 0xa084, 0x00ff, 0xa086, 0x00aa, 0x00ce,
++      0x0005, 0x0156, 0x0126, 0xa18c, 0x0fff, 0x21a8, 0x1d04, 0x15ae,
++      0x2091, 0x6000, 0x1f04, 0x15ae, 0x012e, 0x015e, 0x0005, 0x2071,
++      0xb400, 0x7160, 0x712e, 0x2021, 0x0001, 0xa190, 0x0030, 0xa298,
++      0x0030, 0x0240, 0x7064, 0xa302, 0x1228, 0x220a, 0x2208, 0x2310,
++      0x8420, 0x0ca8, 0x3800, 0xd08c, 0x0148, 0x7064, 0xa086, 0xb400,
++      0x0128, 0x7067, 0xb400, 0x2011, 0x1000, 0x0c48, 0x200b, 0x0000,
++      0x74b2, 0x74b6, 0x0005, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071,
++      0xb400, 0x70b4, 0xa0ea, 0x0010, 0x0268, 0x8001, 0x70b6, 0x702c,
++      0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x012e,
++      0x00ee, 0x0005, 0xa06e, 0x0cd8, 0x00e6, 0x2071, 0xb400, 0x0126,
++      0x2091, 0x8000, 0x70b4, 0x8001, 0x0260, 0x70b6, 0x702c, 0x2068,
++      0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee,
++      0x0005, 0xa06e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071,
++      0xb400, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70b4, 0x8000, 0x70b6,
++      0x012e, 0x00ee, 0x0005, 0x8dff, 0x0138, 0x6804, 0x6807, 0x0000,
++      0x0006, 0x0c49, 0x00de, 0x0cb8, 0x0005, 0x00e6, 0x2071, 0xb400,
++      0x70b4, 0xa08a, 0x0010, 0xa00d, 0x00ee, 0x0005, 0x00e6, 0x2071,
++      0xb712, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071,
++      0x0000, 0x7010, 0xa085, 0x8004, 0x7012, 0x00ee, 0x0005, 0x00e6,
++      0x2270, 0x700b, 0x0000, 0x2071, 0xb712, 0x7018, 0xa088, 0xb71b,
++      0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x1128,
++      0x00f6, 0x2079, 0x0010, 0x0081, 0x00fe, 0x00ee, 0x0005, 0x00e6,
++      0x2071, 0xb712, 0x7004, 0xa005, 0x1128, 0x00f6, 0x2079, 0x0010,
++      0x0019, 0x00fe, 0x00ee, 0x0005, 0x7000, 0x0002, 0x166a, 0x16ce,
++      0x16eb, 0x16eb, 0x7018, 0x711c, 0xa106, 0x1118, 0x7007, 0x0000,
++      0x0005, 0x00d6, 0xa180, 0xb71b, 0x2004, 0x700a, 0x2068, 0x8108,
++      0xa18c, 0x0007, 0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828,
++      0x7836, 0x682c, 0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c,
++      0x7016, 0x6804, 0x00de, 0xd084, 0x0120, 0x7007, 0x0001, 0x0029,
++      0x0005, 0x7007, 0x0002, 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c,
++      0x2011, 0x0040, 0xa182, 0x0040, 0x1210, 0x2110, 0xa006, 0x700e,
++      0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803, 0x0041, 0x002e,
++      0x001e, 0x0005, 0x0016, 0x0026, 0x0136, 0x0146, 0x0156, 0x7014,
++      0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c, 0x2011, 0x0040,
++      0xa182, 0x0040, 0x1210, 0x2110, 0xa006, 0x700e, 0x22a8, 0x53a6,
++      0x8203, 0x7822, 0x7803, 0x0020, 0x3300, 0x7016, 0x7803, 0x0001,
++      0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x0136, 0x0146,
++      0x0156, 0x2099, 0xb4fa, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3,
++      0x7803, 0x0020, 0x0126, 0x2091, 0x8000, 0x7803, 0x0041, 0x7007,
++      0x0003, 0x7000, 0xc084, 0x7002, 0x700b, 0xb4f5, 0x012e, 0x015e,
++      0x014e, 0x013e, 0x0005, 0x0136, 0x0146, 0x0156, 0x2001, 0xb529,
++      0x209c, 0x20a1, 0x0014, 0x7803, 0x0026, 0x2001, 0xb52a, 0x20ac,
++      0x53a6, 0x2099, 0xb52b, 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3,
++      0x7803, 0x0020, 0x0126, 0x2091, 0x8000, 0x7803, 0x0001, 0x7007,
++      0x0004, 0x7000, 0xc08c, 0x7002, 0x700b, 0xb526, 0x012e, 0x015e,
++      0x014e, 0x013e, 0x0005, 0x0016, 0x00e6, 0x2071, 0xb712, 0x00f6,
++      0x2079, 0x0010, 0x7904, 0x7803, 0x0002, 0xd1fc, 0x0120, 0xa18c,
++      0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1664,
++      0x172e, 0x175c, 0x1786, 0x17b6, 0x172d, 0x0cf8, 0xa18c, 0x0700,
++      0x1528, 0x0136, 0x0146, 0x0156, 0x7014, 0x20a0, 0x2099, 0x0014,
++      0x7803, 0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, 0x015e,
++      0x014e, 0x013e, 0x700c, 0xa005, 0x0570, 0x7830, 0x7832, 0x7834,
++      0x7836, 0x080c, 0x1695, 0x0005, 0x7008, 0xa080, 0x0002, 0x2003,
++      0x0100, 0x7007, 0x0000, 0x080c, 0x1664, 0x0005, 0x7008, 0xa080,
++      0x0002, 0x2003, 0x0200, 0x0ca8, 0xa18c, 0x0700, 0x1150, 0x700c,
++      0xa005, 0x0188, 0x7830, 0x7832, 0x7834, 0x7836, 0x080c, 0x16aa,
++      0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, 0x7007, 0x0000,
++      0x080c, 0x1664, 0x0005, 0x00d6, 0x7008, 0x2068, 0x7830, 0x6826,
++      0x7834, 0x682a, 0x7838, 0x682e, 0x783c, 0x6832, 0x680b, 0x0100,
++      0x00de, 0x7007, 0x0000, 0x080c, 0x1664, 0x0005, 0xa18c, 0x0700,
++      0x1540, 0x0136, 0x0146, 0x0156, 0x2001, 0xb4f8, 0x2004, 0xa080,
++      0x000d, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020,
++      0x53a5, 0x2001, 0xb4fa, 0x2004, 0xd0bc, 0x0148, 0x2001, 0xb503,
++      0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x015e,
++      0x014e, 0x013e, 0x7007, 0x0000, 0x080c, 0x5e30, 0x080c, 0x1664,
++      0x0005, 0x2011, 0x8003, 0x080c, 0x3e8a, 0x0cf8, 0xa18c, 0x0700,
++      0x1148, 0x2001, 0xb528, 0x2003, 0x0100, 0x7007, 0x0000, 0x080c,
++      0x1664, 0x0005, 0x2011, 0x8004, 0x080c, 0x3e8a, 0x0cf8, 0x0126,
++      0x2091, 0x2200, 0x2079, 0x0030, 0x2071, 0xb723, 0x7003, 0x0000,
++      0x700f, 0xb72f, 0x7013, 0xb72f, 0x780f, 0x00f6, 0x7803, 0x0004,
++      0x012e, 0x0005, 0x6934, 0xa184, 0x0007, 0x0002, 0x17e6, 0x1824,
++      0x17e6, 0x17e6, 0x17e6, 0x180c, 0x17f3, 0x17ea, 0xa085, 0x0001,
++      0x0804, 0x183e, 0x684c, 0xd0bc, 0x0dc8, 0x6860, 0x682e, 0x685c,
++      0x682a, 0x6858, 0x04c8, 0xa18c, 0x00ff, 0xa186, 0x001e, 0x1d70,
++      0x684c, 0xd0bc, 0x0d58, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804,
++      0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x22b6,
++      0x2005, 0x6832, 0x6858, 0x0440, 0xa18c, 0x00ff, 0xa186, 0x0015,
++      0x19a8, 0x684c, 0xd0ac, 0x0990, 0x6804, 0x681a, 0xa080, 0x000d,
++      0x2004, 0xa084, 0x000f, 0xa080, 0x22b6, 0x2005, 0x6832, 0xa006,
++      0x682e, 0x682a, 0x6858, 0x0080, 0x684c, 0xd0ac, 0x0904, 0x17e6,
++      0xa006, 0x682e, 0x682a, 0x6858, 0xa18c, 0x000f, 0xa188, 0x22b6,
++      0x210d, 0x6932, 0x2d08, 0x691a, 0x6826, 0x684c, 0xc0dd, 0x684e,
++      0xa006, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x0005, 0x684c,
++      0xd0ac, 0x090c, 0x1511, 0x6833, 0x22b3, 0x2d08, 0x691a, 0x6858,
++      0x8001, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x682e,
++      0x682a, 0x697c, 0x6912, 0x6980, 0x6916, 0x0005, 0x20e1, 0x0007,
++      0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x82ff, 0x01e8, 0xa280,
++      0x0004, 0x00d6, 0x206c, 0x684c, 0xd0dc, 0x1190, 0xa280, 0x0007,
++      0x2004, 0xa086, 0x000a, 0x1110, 0x0891, 0x0010, 0x080c, 0x17da,
++      0x0138, 0x00de, 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, 0x0020,
++      0x6808, 0x8000, 0x680a, 0x00de, 0x0126, 0x0046, 0x0036, 0x0026,
++      0x2091, 0x2200, 0x002e, 0x003e, 0x004e, 0x7000, 0xa005, 0x01d0,
++      0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
++      0xb74a, 0x0210, 0x2009, 0xb72f, 0x710e, 0x7010, 0xa102, 0xa082,
++      0x0009, 0x0118, 0xa080, 0x001b, 0x1118, 0x2009, 0x0138, 0x200a,
++      0x012e, 0x0005, 0x7206, 0x2001, 0x18a0, 0x0006, 0x2260, 0x0804,
++      0x19cc, 0x0126, 0x0026, 0x0036, 0x00c6, 0x0006, 0x2091, 0x2200,
++      0x000e, 0x004e, 0x003e, 0x002e, 0x00d6, 0x00c6, 0x2460, 0x6110,
++      0x2168, 0x6a62, 0x6b5e, 0xa005, 0x0904, 0x1901, 0x6808, 0xa005,
++      0x0904, 0x1938, 0x7000, 0xa005, 0x1108, 0x0488, 0x700c, 0x7110,
++      0xa106, 0x1904, 0x1940, 0x7004, 0xa406, 0x1548, 0x2001, 0x0005,
++      0x2004, 0xd08c, 0x0168, 0x0046, 0x080c, 0x1ad5, 0x004e, 0x2460,
++      0x6010, 0xa080, 0x0002, 0x2004, 0xa005, 0x0904, 0x1938, 0x0c10,
++      0x2001, 0x0207, 0x2004, 0xd09c, 0x1d48, 0x7804, 0xa084, 0x6000,
++      0x0120, 0xa086, 0x6000, 0x0108, 0x0c08, 0x7818, 0x6812, 0x781c,
++      0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6100,
++      0xa18e, 0x0004, 0x1904, 0x1940, 0x2009, 0x0048, 0x080c, 0x85ef,
++      0x04f8, 0x6808, 0xa005, 0x05a0, 0x7000, 0xa005, 0x0588, 0x700c,
++      0x7110, 0xa106, 0x1118, 0x7004, 0xa406, 0x1550, 0x2001, 0x0005,
++      0x2004, 0xd08c, 0x0160, 0x0046, 0x080c, 0x1ad5, 0x004e, 0x2460,
++      0x6010, 0xa080, 0x0002, 0x2004, 0xa005, 0x01d0, 0x0c28, 0x2001,
++      0x0207, 0x2004, 0xd09c, 0x1d50, 0x2001, 0x0005, 0x2004, 0xd08c,
++      0x1d50, 0x7804, 0xa084, 0x6000, 0x0118, 0xa086, 0x6000, 0x19f0,
++      0x7818, 0x6812, 0x781c, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000,
++      0x6100, 0xa18e, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x85ef,
++      0x00ce, 0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, 0x0036,
++      0x0046, 0x0056, 0x2071, 0xb723, 0x7000, 0xa086, 0x0000, 0x0904,
++      0x19aa, 0x7004, 0xac06, 0x1904, 0x199c, 0x2079, 0x0030, 0x7000,
++      0xa086, 0x0003, 0x0904, 0x199c, 0x7804, 0xd0fc, 0x15c8, 0x20e1,
++      0x6000, 0x2011, 0x0032, 0x2001, 0x0208, 0x200c, 0x2001, 0x0209,
++      0x2004, 0xa106, 0x1d88, 0x8211, 0x1db0, 0x7804, 0xd0fc, 0x1540,
++      0x080c, 0x1e3f, 0x0026, 0x0056, 0x7803, 0x0004, 0x7804, 0xd0ac,
++      0x1de8, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007,
++      0x0000, 0x005e, 0x002e, 0x2001, 0x015d, 0x2003, 0x0000, 0x080c,
++      0x5a90, 0x1138, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b12, 0x006e,
++      0x0058, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0020,
++      0x080c, 0x1ad5, 0x0804, 0x194c, 0x0156, 0x20a9, 0x0009, 0x2009,
++      0xb72f, 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04,
++      0x19a1, 0x015e, 0x005e, 0x004e, 0x003e, 0x002e, 0x00ee, 0x00fe,
++      0x0005, 0x700c, 0x7110, 0xa106, 0x0904, 0x1a40, 0x2104, 0x7006,
++      0x2060, 0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0xb74a,
++      0x0210, 0x2009, 0xb72f, 0x7112, 0x700c, 0xa106, 0x1128, 0x080c,
++      0x28b1, 0x2001, 0x0138, 0x2102, 0x8cff, 0x0598, 0x6010, 0x2068,
++      0x2d58, 0x6828, 0xa406, 0x1590, 0x682c, 0xa306, 0x1578, 0x7004,
++      0x2060, 0x6020, 0xc0d4, 0x6022, 0x684c, 0xd0f4, 0x0128, 0x6817,
++      0xffff, 0x6813, 0xffff, 0x00e8, 0x6850, 0xd0f4, 0x1130, 0x7803,
++      0x0004, 0x6810, 0x781a, 0x6814, 0x781e, 0x6824, 0x2050, 0x6818,
++      0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009, 0x0011,
++      0x080c, 0x1a43, 0x0120, 0x2009, 0x0001, 0x080c, 0x1a43, 0x2d58,
++      0x0005, 0x080c, 0x1dac, 0x0904, 0x19b1, 0x0cd0, 0x6020, 0xd0f4,
++      0x11e0, 0xd0d4, 0x01b8, 0x6038, 0xa402, 0x6034, 0xa303, 0x0108,
++      0x1288, 0x643a, 0x6336, 0x6c2a, 0x6b2e, 0x0046, 0x0036, 0x2400,
++      0x6c7c, 0xa402, 0x6812, 0x2300, 0x6b80, 0xa303, 0x6816, 0x003e,
++      0x004e, 0x0018, 0x080c, 0x9f2b, 0x09e0, 0x601c, 0xa08e, 0x0008,
++      0x0904, 0x19d7, 0xa08e, 0x000a, 0x0904, 0x19d7, 0x2001, 0xb474,
++      0x2004, 0xd0b4, 0x1140, 0x6018, 0x2004, 0xd0bc, 0x1120, 0x6817,
++      0x7fff, 0x6813, 0xffff, 0x080c, 0x22d6, 0x1918, 0x0804, 0x19d7,
++      0x7003, 0x0000, 0x0005, 0x8aff, 0x0904, 0x1aaf, 0xa03e, 0x2730,
++      0x6850, 0xd0fc, 0x11b8, 0xd0f4, 0x1528, 0x00d6, 0x2805, 0xac68,
++      0x2900, 0x0002, 0x1a93, 0x1a78, 0x1a78, 0x1a93, 0x1a93, 0x1a8c,
++      0x1a93, 0x1a78, 0x1a93, 0x1a7d, 0x1a7d, 0x1a93, 0x1a93, 0x1a93,
++      0x1a84, 0x1a7d, 0x7803, 0x0004, 0xc0fc, 0x6852, 0x6b6c, 0x6a70,
++      0x6d1c, 0x6c20, 0x00d6, 0xd99c, 0x0548, 0x2805, 0xac68, 0x6f08,
++      0x6e0c, 0x0420, 0xc0f4, 0x6852, 0x6b6c, 0x6a70, 0x00d6, 0x0458,
++      0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x00c8, 0x6b10, 0x6a14, 0x6d00,
++      0x6c04, 0x6f08, 0x6e0c, 0x0090, 0x00de, 0x00d6, 0x6834, 0xa084,
++      0x00ff, 0xa086, 0x001e, 0x1138, 0x00de, 0x080c, 0x2278, 0x1904,
++      0x1a43, 0xa00e, 0x00e0, 0x00de, 0x080c, 0x1511, 0x7b22, 0x7a26,
++      0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7316, 0x721a, 0x751e, 0x7422,
++      0x7726, 0x762a, 0x7902, 0x7000, 0x8000, 0x7002, 0x00de, 0x6828,
++      0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x080c, 0x2278, 0x0005,
++      0x080c, 0x1511, 0x080c, 0x1f26, 0x7004, 0x2060, 0x00d6, 0x6010,
++      0x2068, 0x7003, 0x0000, 0x080c, 0x1dcd, 0x080c, 0x9beb, 0x0170,
++      0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b,
++      0xffff, 0x682f, 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c,
++      0x98c3, 0x0804, 0x1cfa, 0x080c, 0x1511, 0x0126, 0x2091, 0x2200,
++      0x0006, 0x0016, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002,
++      0xa184, 0x0700, 0x1978, 0xa184, 0x0003, 0xa086, 0x0003, 0x0d58,
++      0x7000, 0x0002, 0x1af2, 0x1af8, 0x1c09, 0x1cd5, 0x1ce9, 0x1af2,
++      0x1af2, 0x1af2, 0x7804, 0xd09c, 0x1904, 0x1cfa, 0x080c, 0x1511,
++      0x8001, 0x7002, 0xd1bc, 0x11a0, 0xd19c, 0x1904, 0x1b8d, 0xd1dc,
++      0x1178, 0x8aff, 0x0904, 0x1b8d, 0x2009, 0x0001, 0x080c, 0x1a43,
++      0x0904, 0x1cfa, 0x2009, 0x0001, 0x080c, 0x1a43, 0x0804, 0x1cfa,
++      0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x1904, 0x1b6d, 0x0026,
++      0x0036, 0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7818, 0x6812, 0x781c,
++      0x6816, 0x2001, 0x0201, 0x2004, 0xa005, 0x0140, 0x7808, 0xd0ec,
++      0x1128, 0x7803, 0x0009, 0x7003, 0x0004, 0x0010, 0x080c, 0x1cfe,
++      0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a, 0x2500, 0x6872, 0xa213,
++      0x6b2a, 0x6a2e, 0x00c6, 0x7004, 0x2060, 0x6020, 0xd0f4, 0x1110,
++      0x633a, 0x6236, 0x00ce, 0x003e, 0x002e, 0x6e1e, 0x6f22, 0x2500,
++      0xa405, 0x0128, 0x080c, 0x228e, 0x6850, 0xc0fd, 0x6852, 0x2a00,
++      0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6808, 0x8001, 0x680a,
++      0x1148, 0x684c, 0xd0e4, 0x0130, 0x7004, 0x2060, 0x2009, 0x0048,
++      0x080c, 0x85ef, 0x7000, 0xa086, 0x0004, 0x0904, 0x1cfa, 0x7003,
++      0x0000, 0x080c, 0x19b1, 0x0804, 0x1cfa, 0x0056, 0x7d0c, 0xd5bc,
++      0x1110, 0x080c, 0xb38a, 0x005e, 0x080c, 0x1dcd, 0x00f6, 0x7004,
++      0x2078, 0x080c, 0x52c6, 0x0118, 0x7820, 0xc0f5, 0x7822, 0x00fe,
++      0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c,
++      0x791a, 0x6980, 0x791e, 0x0804, 0x1cfa, 0x7004, 0x00c6, 0x2060,
++      0x6020, 0x00ce, 0xd0f4, 0x0120, 0x6808, 0x8001, 0x680a, 0x04c0,
++      0x7818, 0x6812, 0x7a1c, 0x6a16, 0xd19c, 0x0160, 0xa205, 0x0150,
++      0x7004, 0xa080, 0x0007, 0x2004, 0xa084, 0xfffd, 0xa086, 0x0008,
++      0x1904, 0x1b10, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005, 0x1520,
++      0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x01a0, 0x7004, 0x2060,
++      0x601c, 0xa086, 0x000a, 0x11a0, 0x0156, 0x20a9, 0x0009, 0x2009,
++      0xb72f, 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, 0x1f04,
++      0x1bc1, 0x015e, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x85ef,
++      0x080c, 0x19b1, 0x0804, 0x1cfa, 0x7818, 0x6812, 0x781c, 0x6816,
++      0x7814, 0x7908, 0xa18c, 0x0fff, 0xa192, 0x0841, 0x1a04, 0x1ab2,
++      0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a, 0x8104, 0x8004,
++      0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x080c, 0x1e6a, 0x7803,
++      0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804, 0xd0fc, 0x0de8,
++      0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x00f6, 0x7004, 0x7007,
++      0x0000, 0x2060, 0x2009, 0x0048, 0x080c, 0x85ef, 0x080c, 0x1ec0,
++      0x0838, 0x8001, 0x7002, 0xd194, 0x01b0, 0x7804, 0xd0fc, 0x1904,
++      0x1ca5, 0xd09c, 0x0138, 0x7804, 0xd0fc, 0x1904, 0x1ca5, 0xd09c,
++      0x1904, 0x1ca9, 0x8aff, 0x0904, 0x1cfa, 0x2009, 0x0001, 0x080c,
++      0x1a43, 0x0804, 0x1cfa, 0xa184, 0x0888, 0x1148, 0x8aff, 0x0904,
++      0x1cfa, 0x2009, 0x0001, 0x080c, 0x1a43, 0x0804, 0x1cfa, 0x7818,
++      0x6812, 0x7a1c, 0x6a16, 0xa205, 0x0904, 0x1baa, 0x7803, 0x0004,
++      0x7003, 0x0000, 0xd1bc, 0x1904, 0x1c87, 0x6834, 0xa084, 0x00ff,
++      0xa086, 0x0029, 0x1118, 0xd19c, 0x1904, 0x1baa, 0x0026, 0x0036,
++      0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7818, 0x6812, 0x781c, 0x6816,
++      0x2001, 0x0201, 0x2004, 0xa005, 0x0140, 0x7808, 0xd0ec, 0x1128,
++      0x7803, 0x0009, 0x7003, 0x0004, 0x0020, 0x0016, 0x080c, 0x1cfe,
++      0x001e, 0x6b28, 0x6a2c, 0x080c, 0x228e, 0x00d6, 0x2805, 0xac68,
++      0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, 0x680c, 0xa213, 0x0020,
++      0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0xd194, 0x0904, 0x1b32,
++      0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6808, 0x8001,
++      0x680a, 0x6b2a, 0x6a2e, 0x003e, 0x002e, 0x0804, 0x1bd0, 0x0056,
++      0x7d0c, 0x080c, 0xb38a, 0x005e, 0x080c, 0x1dcd, 0x00f6, 0x7004,
++      0x2078, 0x080c, 0x52c6, 0x0118, 0x7820, 0xc0f5, 0x7822, 0x00fe,
++      0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c,
++      0x791a, 0x6980, 0x791e, 0x0804, 0x1cfa, 0x7804, 0xd09c, 0x0904,
++      0x1add, 0x7c20, 0x7824, 0xa405, 0x1904, 0x1add, 0x7818, 0x6812,
++      0x7c1c, 0x6c16, 0xa405, 0x1120, 0x7803, 0x0002, 0x0804, 0x1baa,
++      0x751c, 0x7420, 0x7724, 0x7628, 0x7014, 0xa528, 0x7018, 0xa421,
++      0xa7b9, 0x0000, 0xa6b1, 0x0000, 0x7830, 0xa506, 0x1150, 0x7834,
++      0xa406, 0x1138, 0x7838, 0xa706, 0x1120, 0x783c, 0xa606, 0x0904,
++      0x1add, 0x7803, 0x0002, 0x0804, 0x1c36, 0x7803, 0x0004, 0x7003,
++      0x0000, 0x7004, 0xa00d, 0x0150, 0x6808, 0x8001, 0x680a, 0x1130,
++      0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x85ef, 0x080c, 0x19b1,
++      0x0088, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6010,
++      0xa005, 0x0da0, 0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c,
++      0x080c, 0x19cc, 0x001e, 0x000e, 0x012e, 0x0005, 0x700c, 0x7110,
++      0xa106, 0x0904, 0x1da0, 0x7004, 0x0016, 0x210c, 0xa106, 0x001e,
++      0x0904, 0x1da0, 0x00d6, 0x00c6, 0x216c, 0x2d00, 0xa005, 0x0904,
++      0x1d9e, 0x681c, 0xa086, 0x0008, 0x0904, 0x1d9e, 0x6820, 0xd0d4,
++      0x1904, 0x1d9e, 0x6810, 0x2068, 0x6850, 0xd0fc, 0x05a8, 0x8108,
++      0x2104, 0x6b2c, 0xa306, 0x1904, 0x1d9e, 0x8108, 0x2104, 0x6a28,
++      0xa206, 0x1904, 0x1d9e, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c,
++      0x7822, 0x7016, 0x6870, 0x7826, 0x701a, 0x681c, 0x7832, 0x701e,
++      0x6820, 0x7836, 0x7022, 0x6818, 0x2060, 0x6034, 0xd09c, 0x0168,
++      0x6830, 0x2005, 0x00d6, 0xac68, 0x6808, 0x783a, 0x7026, 0x680c,
++      0x783e, 0x702a, 0x00de, 0x0804, 0x1d98, 0xa006, 0x783a, 0x783e,
++      0x7026, 0x702a, 0x0804, 0x1d98, 0x8108, 0x2104, 0xa005, 0x1904,
++      0x1d9e, 0x6b2c, 0xa306, 0x1904, 0x1d9e, 0x8108, 0x2104, 0xa005,
++      0x15e8, 0x6a28, 0xa206, 0x15d0, 0x6850, 0xc0f5, 0x6852, 0x6830,
++      0x2005, 0x6918, 0xa160, 0xa180, 0x000d, 0x2004, 0xd09c, 0x11a0,
++      0x6008, 0x7822, 0x7016, 0x686e, 0x600c, 0x7826, 0x701a, 0x6872,
++      0x6000, 0x7832, 0x701e, 0x6004, 0x7836, 0x7022, 0xa006, 0x783a,
++      0x783e, 0x7026, 0x702a, 0x00a0, 0x6010, 0x7822, 0x7016, 0x686e,
++      0x6014, 0x7826, 0x701a, 0x6872, 0x6000, 0x7832, 0x701e, 0x6004,
++      0x7836, 0x7022, 0x6008, 0x783a, 0x7026, 0x600c, 0x783e, 0x702a,
++      0x6810, 0x781a, 0x6814, 0x781e, 0x7803, 0x0011, 0x00ce, 0x00de,
++      0x0005, 0x2011, 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, 0x1118,
++      0x8109, 0x1dd8, 0x0005, 0x0005, 0x0ca1, 0x0118, 0x780c, 0xd0a4,
++      0x0120, 0x00d9, 0xa085, 0x0001, 0x0010, 0x080c, 0x1ec0, 0x0005,
++      0x0126, 0x2091, 0x2200, 0x7000, 0xa086, 0x0003, 0x1160, 0x700c,
++      0x7110, 0xa106, 0x0140, 0x080c, 0x2922, 0x20e1, 0x9028, 0x700f,
++      0xb72f, 0x7013, 0xb72f, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5a90,
++      0x11b8, 0x2001, 0x0160, 0x2003, 0x0000, 0x2001, 0x0138, 0x2003,
++      0x0000, 0x2011, 0x00c8, 0xe000, 0xe000, 0x8211, 0x1de0, 0x04c1,
++      0x0066, 0x2031, 0x0000, 0x080c, 0x5b12, 0x006e, 0x00ce, 0x0005,
++      0x080c, 0x1e3f, 0x080c, 0x2922, 0x20e1, 0x9028, 0x700c, 0x7110,
++      0xa106, 0x01d0, 0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060,
++      0x6008, 0x8001, 0x600a, 0xa188, 0x0003, 0xa182, 0xb74a, 0x0210,
++      0x2009, 0xb72f, 0x7112, 0x700c, 0xa106, 0x1d40, 0x080c, 0x28b1,
++      0x2001, 0x0138, 0x2102, 0x0c10, 0x2001, 0x015d, 0x2003, 0x0000,
++      0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x00ce, 0x0005,
++      0x080c, 0x2922, 0x20e1, 0x9028, 0x2001, 0x015d, 0x2003, 0x0000,
++      0x00e6, 0x00c6, 0x0016, 0x2071, 0xb723, 0x700c, 0x7110, 0xa106,
++      0x0190, 0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008,
++      0x8001, 0x600a, 0xa188, 0x0003, 0xa182, 0xb74a, 0x0210, 0x2009,
++      0xb72f, 0x7112, 0x0c50, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x2001,
++      0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003,
++      0x0000, 0x080c, 0x5a90, 0x1148, 0x2021, 0x0002, 0x1d04, 0x1e4e,
++      0x2091, 0x6000, 0x8421, 0x1dd0, 0x0005, 0x2021, 0xb015, 0x2001,
++      0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0xa39c,
++      0x0048, 0x1138, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421,
++      0x1d70, 0x0005, 0x00e6, 0x2071, 0x0200, 0x7808, 0xa084, 0xf000,
++      0xa10d, 0x0869, 0x2001, 0x0105, 0x2004, 0xa084, 0x0003, 0x1130,
++      0x2001, 0xb74a, 0x2004, 0xa086, 0x0000, 0x0548, 0xa026, 0x2019,
++      0xf000, 0x8319, 0x1148, 0x2001, 0x012b, 0x2003, 0x95f5, 0x2001,
++      0x0129, 0x2003, 0x95f5, 0x00d8, 0x2001, 0x0105, 0x2004, 0xa084,
++      0x0003, 0x1130, 0x2001, 0xb74a, 0x2004, 0xa086, 0x0000, 0x0178,
++      0x2001, 0x0132, 0x2004, 0xa436, 0x0110, 0x2020, 0x0c00, 0x2001,
++      0x0021, 0x2004, 0xd0fc, 0x09e8, 0x080c, 0x211b, 0x08c0, 0x20e1,
++      0x7000, 0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001,
++      0x810f, 0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422,
++      0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x00ee, 0x0005,
++      0x0026, 0x2001, 0x015d, 0x2003, 0x0000, 0x7908, 0xa18c, 0x0fff,
++      0xa182, 0x0ffd, 0x0210, 0x2009, 0x0000, 0xa190, 0x0007, 0xa294,
++      0x1ff8, 0x8214, 0x8214, 0x8214, 0x2001, 0x020a, 0x82ff, 0x0140,
++      0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x8211, 0x1dd0,
++      0x20e1, 0x7000, 0x200c, 0x200c, 0x7003, 0x0000, 0x20e1, 0x6000,
++      0x2001, 0x0208, 0x200c, 0x2001, 0x0209, 0x2004, 0xa106, 0x0158,
++      0x080c, 0x1da1, 0x0130, 0x7908, 0xd1ec, 0x1128, 0x790c, 0xd1a4,
++      0x0960, 0x080c, 0x1dcd, 0xa006, 0x002e, 0x0005, 0x00f6, 0x00e6,
++      0x0016, 0x0026, 0x2071, 0xb723, 0x2079, 0x0030, 0x2011, 0x0050,
++      0x7000, 0xa086, 0x0000, 0x01a8, 0x8211, 0x0188, 0x2001, 0x0005,
++      0x2004, 0xd08c, 0x0dc8, 0x7904, 0xa18c, 0x0780, 0x0016, 0x080c,
++      0x1ad5, 0x001e, 0x81ff, 0x1118, 0x2011, 0x0050, 0x0c48, 0xa085,
++      0x0001, 0x002e, 0x001e, 0x00ee, 0x00fe, 0x0005, 0x7803, 0x0004,
++      0x2009, 0x0064, 0x7804, 0xd0ac, 0x0904, 0x1f72, 0x8109, 0x1dd0,
++      0x2009, 0x0100, 0x210c, 0xa18a, 0x0003, 0x0a0c, 0x1511, 0x080c,
++      0x2222, 0x00e6, 0x00f6, 0x2071, 0xb712, 0x2079, 0x0010, 0x7004,
++      0xa086, 0x0000, 0x0538, 0x7800, 0x0006, 0x7820, 0x0006, 0x7830,
++      0x0006, 0x7834, 0x0006, 0x7838, 0x0006, 0x783c, 0x0006, 0x7803,
++      0x0004, 0xe000, 0xe000, 0x2079, 0x0030, 0x7804, 0xd0ac, 0x190c,
++      0x1511, 0x2079, 0x0010, 0x000e, 0x783e, 0x000e, 0x783a, 0x000e,
++      0x7836, 0x000e, 0x7832, 0x000e, 0x7822, 0x000e, 0x7802, 0x00fe,
++      0x00ee, 0x0030, 0x00fe, 0x00ee, 0x7804, 0xd0ac, 0x190c, 0x1511,
++      0x080c, 0x71f1, 0x0005, 0x00e6, 0x2071, 0xb74a, 0x7003, 0x0000,
++      0x00ee, 0x0005, 0x00d6, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc,
++      0x1904, 0x1ff0, 0x6934, 0xa184, 0x0007, 0x0002, 0x1f8e, 0x1fdb,
++      0x1f8e, 0x1f8e, 0x1f8e, 0x1fc2, 0x1fa1, 0x1f90, 0x080c, 0x1511,
++      0x684c, 0xd0b4, 0x0904, 0x20d8, 0x6860, 0x682e, 0x6816, 0x685c,
++      0x682a, 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0804,
++      0x1fe3, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x1d38, 0x684c,
++      0xd0b4, 0x0904, 0x20d8, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a,
++      0x6812, 0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080,
++      0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x22b6, 0x2005, 0x6832,
++      0x6958, 0x0450, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x1548, 0x684c,
++      0xd0b4, 0x0904, 0x20d8, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004,
++      0xa084, 0x000f, 0xa080, 0x22b6, 0x2005, 0x6832, 0x6958, 0xa006,
++      0x682e, 0x682a, 0x0088, 0x684c, 0xd0b4, 0x0904, 0x1ab0, 0x6958,
++      0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, 0x6834, 0xa084, 0x000f,
++      0xa080, 0x22b6, 0x2005, 0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e,
++      0x00de, 0x0005, 0x00f6, 0x2079, 0x0020, 0x7804, 0xd0fc, 0x190c,
++      0x211b, 0x00e6, 0x00d6, 0x2071, 0xb74a, 0x7000, 0xa005, 0x1904,
++      0x2058, 0x00c6, 0x7206, 0xa280, 0x0004, 0x205c, 0x7004, 0x2068,
++      0x7803, 0x0004, 0x6818, 0x00d6, 0x2068, 0x686c, 0x7812, 0x6890,
++      0x00f6, 0x20e1, 0x9040, 0x2079, 0x0200, 0x781a, 0x2079, 0x0100,
++      0x8004, 0x78d6, 0x00fe, 0x00de, 0x2b68, 0x6824, 0x2050, 0x6818,
++      0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x6908, 0x791a,
++      0x7116, 0x680c, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012, 0x7004,
++      0x692c, 0x6814, 0xa106, 0x1120, 0x6928, 0x6810, 0xa106, 0x0158,
++      0x0036, 0x0046, 0x6b14, 0x6c10, 0x080c, 0x22d6, 0x004e, 0x003e,
++      0x0110, 0x00ce, 0x00a8, 0x8aff, 0x1120, 0x00ce, 0xa085, 0x0001,
++      0x0078, 0x0126, 0x2091, 0x8000, 0x2079, 0x0020, 0x2009, 0x0001,
++      0x0059, 0x0118, 0x2009, 0x0001, 0x0039, 0x012e, 0x00ce, 0xa006,
++      0x00de, 0x00ee, 0x00fe, 0x0005, 0x0076, 0x0066, 0x0056, 0x0046,
++      0x0036, 0x0026, 0x8aff, 0x0904, 0x20d1, 0x700c, 0x7214, 0xa23a,
++      0x7010, 0x7218, 0xa203, 0x0a04, 0x20d0, 0xa705, 0x0904, 0x20d0,
++      0xa03e, 0x2730, 0x6850, 0xd0fc, 0x11a8, 0x00d6, 0x2805, 0xac68,
++      0x2900, 0x0002, 0x20b3, 0x2098, 0x2098, 0x20b3, 0x20b3, 0x20ac,
++      0x20b3, 0x2098, 0x20b3, 0x209d, 0x209d, 0x20b3, 0x20b3, 0x20b3,
++      0x20a4, 0x209d, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20,
++      0xd99c, 0x0528, 0x00d6, 0x2805, 0xac68, 0x6f08, 0x6e0c, 0x00f0,
++      0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x00c8, 0x6b10, 0x6a14, 0x6d00,
++      0x6c04, 0x6f08, 0x6e0c, 0x0090, 0x00de, 0x00d6, 0x6834, 0xa084,
++      0x00ff, 0xa086, 0x001e, 0x1138, 0x00de, 0x080c, 0x2278, 0x1904,
++      0x2062, 0xa00e, 0x00f0, 0x00de, 0x080c, 0x1511, 0x00de, 0x7b22,
++      0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000,
++      0x7002, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c,
++      0xa300, 0x700e, 0x7010, 0xa201, 0x7012, 0x080c, 0x2278, 0x0008,
++      0xa006, 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005,
++      0x080c, 0x1511, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1,
++      0x9040, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x00d6,
++      0x6010, 0x2068, 0x080c, 0x9beb, 0x0118, 0x6850, 0xc0bd, 0x6852,
++      0x601c, 0xa086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, 0x2001,
++      0x00fa, 0x8001, 0x1df0, 0x60c8, 0xa206, 0x1dc0, 0x60c4, 0x686a,
++      0x60c8, 0x6866, 0x7004, 0x2060, 0x00de, 0x00c6, 0x080c, 0x98c3,
++      0x00ce, 0x2001, 0xb6ef, 0x2004, 0xac06, 0x1150, 0x20e1, 0x9040,
++      0x080c, 0x8200, 0x2011, 0x0000, 0x080c, 0x8029, 0x080c, 0x71f1,
++      0x002e, 0x0804, 0x21d5, 0x0126, 0x2091, 0x2400, 0x0006, 0x0016,
++      0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x2079, 0x0020, 0x2071, 0xb74a,
++      0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700,
++      0x1904, 0x20da, 0x7000, 0x0002, 0x21d5, 0x2138, 0x21a8, 0x21d3,
++      0x8001, 0x7002, 0xd19c, 0x1170, 0x8aff, 0x05d0, 0x2009, 0x0001,
++      0x080c, 0x205c, 0x0904, 0x21d5, 0x2009, 0x0001, 0x080c, 0x205c,
++      0x0804, 0x21d5, 0x7803, 0x0004, 0xd194, 0x0148, 0x6850, 0xc0fc,
++      0x6852, 0x8aff, 0x11d8, 0x684c, 0xc0f5, 0x684e, 0x00b8, 0x0026,
++      0x0036, 0x6b28, 0x6a2c, 0x7820, 0x686e, 0xa31a, 0x7824, 0x6872,
++      0xa213, 0x7830, 0x681e, 0x7834, 0x6822, 0x6b2a, 0x6a2e, 0x003e,
++      0x002e, 0x080c, 0x228e, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826,
++      0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0804, 0x21d5,
++      0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100,
++      0x7a14, 0xa284, 0x0184, 0xa085, 0x0012, 0x7816, 0x0036, 0x2019,
++      0x1000, 0x8319, 0x090c, 0x1511, 0x7820, 0xd0bc, 0x1dd0, 0x003e,
++      0x79c8, 0x000e, 0xa102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e,
++      0xa103, 0x78c6, 0x000e, 0x78ca, 0xa284, 0x0184, 0xa085, 0x0012,
++      0x7816, 0x002e, 0x00fe, 0x7803, 0x0008, 0x7003, 0x0000, 0x0468,
++      0x8001, 0x7002, 0xd194, 0x0168, 0x7804, 0xd0fc, 0x1904, 0x212b,
++      0xd19c, 0x11f8, 0x8aff, 0x0508, 0x2009, 0x0001, 0x080c, 0x205c,
++      0x00e0, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x080c, 0x228e, 0x00d6,
++      0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, 0x680c,
++      0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0x0804,
++      0x215b, 0x0804, 0x2157, 0x080c, 0x1511, 0x00ce, 0x00de, 0x00ee,
++      0x00fe, 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071,
++      0xb74a, 0x7000, 0xa086, 0x0000, 0x05d0, 0x2079, 0x0020, 0x0016,
++      0x2009, 0x0207, 0x210c, 0xd194, 0x0198, 0x2009, 0x020c, 0x210c,
++      0xa184, 0x0003, 0x0168, 0x080c, 0xb3d3, 0x2001, 0x0133, 0x2004,
++      0xa005, 0x090c, 0x1511, 0x20e1, 0x9040, 0x2001, 0x020c, 0x2102,
++      0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0xa106, 0x1110,
++      0x20e1, 0x9040, 0x7804, 0xd0fc, 0x09d8, 0x080c, 0x211b, 0x7000,
++      0xa086, 0x0000, 0x19a8, 0x001e, 0x7803, 0x0004, 0x7804, 0xd0ac,
++      0x1de8, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x00ee,
++      0x00fe, 0x0005, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2071,
++      0xb74a, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0540, 0x7004,
++      0x2060, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0158, 0x6850, 0xc0b5,
++      0x6852, 0x680c, 0x7a1c, 0xa206, 0x1120, 0x6808, 0x7a18, 0xa206,
++      0x01e0, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803,
++      0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x080c, 0x98c3, 0x20e1,
++      0x9040, 0x080c, 0x8200, 0x2011, 0x0000, 0x080c, 0x8029, 0x00fe,
++      0x00ee, 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, 0x6a14, 0xa205,
++      0x1d00, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, 0x1f7a, 0x2001,
++      0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003,
++      0x0000, 0x2069, 0xb6e0, 0x6833, 0x0000, 0x683f, 0x0000, 0x08f8,
++      0x8840, 0x2805, 0xa005, 0x1170, 0x6004, 0xa005, 0x0168, 0x681a,
++      0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x22b6, 0x2045, 0x88ff,
++      0x090c, 0x1511, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8841,
++      0x2805, 0xa005, 0x1190, 0x2c00, 0xad06, 0x0120, 0x6000, 0xa005,
++      0x1108, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080,
++      0x22c6, 0x2045, 0x88ff, 0x090c, 0x1511, 0x0005, 0x0000, 0x0011,
++      0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f,
++      0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x22ab,
++      0x22a7, 0x0000, 0x0000, 0x22b5, 0x0000, 0x22ab, 0x0000, 0x22b2,
++      0x22af, 0x0000, 0x0000, 0x0000, 0x22b5, 0x22b2, 0x0000, 0x22ad,
++      0x22ad, 0x0000, 0x0000, 0x22b5, 0x0000, 0x22ad, 0x0000, 0x22b3,
++      0x22b3, 0x0000, 0x0000, 0x0000, 0x22b5, 0x22b3, 0x00a6, 0x0096,
++      0x0086, 0x6b2e, 0x6c2a, 0x6858, 0xa055, 0x0904, 0x2367, 0x2d60,
++      0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x22b6, 0xa986, 0x0007, 0x0130,
++      0xa986, 0x000e, 0x0118, 0xa986, 0x000f, 0x1120, 0x605c, 0xa422,
++      0x6060, 0xa31a, 0x2805, 0xa045, 0x1140, 0x0310, 0x0804, 0x2367,
++      0x6004, 0xa065, 0x0904, 0x2367, 0x0c18, 0x2805, 0xa005, 0x01a8,
++      0xac68, 0xd99c, 0x1128, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0020,
++      0x6810, 0xa422, 0x6814, 0xa31b, 0x0620, 0x2300, 0xa405, 0x0150,
++      0x8a51, 0x0904, 0x2367, 0x8840, 0x0c40, 0x6004, 0xa065, 0x0904,
++      0x2367, 0x0830, 0x8a51, 0x0904, 0x2367, 0x8840, 0x2805, 0xa005,
++      0x1158, 0x6004, 0xa065, 0x0904, 0x2367, 0x6034, 0xa0cc, 0x000f,
++      0xa9c0, 0x22b6, 0x2805, 0x2040, 0x2b68, 0x6850, 0xc0fc, 0x6852,
++      0x0458, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x00d6, 0x2b68,
++      0x6c6e, 0x6b72, 0x00de, 0xd99c, 0x1168, 0x6908, 0x2400, 0xa122,
++      0x690c, 0x2300, 0xa11b, 0x0a0c, 0x1511, 0x6800, 0xa420, 0x6804,
++      0xa319, 0x0060, 0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b,
++      0x0a0c, 0x1511, 0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e,
++      0x6b22, 0x6850, 0xc0fd, 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832,
++      0x2a00, 0x6826, 0x000e, 0x000e, 0x000e, 0xa006, 0x0028, 0x008e,
++      0x009e, 0x00ae, 0xa085, 0x0001, 0x0005, 0x2001, 0x0005, 0x2004,
++      0xa084, 0x0007, 0x0002, 0x237b, 0x237c, 0x237f, 0x2382, 0x2387,
++      0x238a, 0x238f, 0x2394, 0x0005, 0x080c, 0x211b, 0x0005, 0x080c,
++      0x1ad5, 0x0005, 0x080c, 0x1ad5, 0x080c, 0x211b, 0x0005, 0x080c,
++      0x1713, 0x0005, 0x080c, 0x211b, 0x080c, 0x1713, 0x0005, 0x080c,
++      0x1ad5, 0x080c, 0x1713, 0x0005, 0x080c, 0x1ad5, 0x080c, 0x211b,
++      0x080c, 0x1713, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200,
++      0x2071, 0xba80, 0x2069, 0xb400, 0x080c, 0x2489, 0x080c, 0x2479,
++      0x2009, 0x0004, 0x7912, 0x7817, 0x0004, 0x080c, 0x27be, 0x781b,
++      0x0002, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a9, 0x0080, 0x782f,
++      0x0000, 0x1f04, 0x23b7, 0x20e1, 0x9080, 0x783b, 0x001f, 0x20e1,
++      0x8700, 0x012e, 0x0005, 0x0126, 0x2091, 0x2600, 0x781c, 0xd0a4,
++      0x190c, 0x2476, 0xa084, 0x0007, 0x0002, 0x23e7, 0x23d5, 0x23d8,
++      0x23db, 0x23e0, 0x23e2, 0x23e4, 0x23e6, 0x080c, 0x6385, 0x0078,
++      0x080c, 0x63c4, 0x0060, 0x080c, 0x6385, 0x080c, 0x63c4, 0x0038,
++      0x0041, 0x0028, 0x0031, 0x0018, 0x0021, 0x0008, 0x0011, 0x012e,
++      0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xb3d3, 0x7930, 0xa184,
++      0x0003, 0x0170, 0x2001, 0xb6ef, 0x2004, 0xa005, 0x0130, 0x2001,
++      0x0133, 0x2004, 0xa005, 0x090c, 0x1511, 0x20e1, 0x9040, 0x04a0,
++      0xa184, 0x0030, 0x01e0, 0x6a00, 0xa286, 0x0003, 0x1108, 0x00a0,
++      0x080c, 0x5a90, 0x1178, 0x2001, 0xb69f, 0x2003, 0x0001, 0x2001,
++      0xb400, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5ad4, 0x080c,
++      0x59c8, 0x0010, 0x080c, 0x4ad9, 0x080c, 0x2479, 0x00a8, 0xa184,
++      0x00c0, 0x0168, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0xb723,
++      0x080c, 0x1dcd, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0028, 0xa184,
++      0x0300, 0x0110, 0x20e1, 0x9020, 0x7932, 0x002e, 0x001e, 0x000e,
++      0x0005, 0x0016, 0x00e6, 0x00f6, 0x2071, 0xb400, 0x7128, 0x2001,
++      0xb691, 0x2102, 0x2001, 0xb699, 0x2102, 0xa182, 0x0211, 0x1218,
++      0x2009, 0x0008, 0x0400, 0xa182, 0x0259, 0x1218, 0x2009, 0x0007,
++      0x00d0, 0xa182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0xa182,
++      0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0xa182, 0x0421, 0x1218,
++      0x2009, 0x0004, 0x0040, 0xa182, 0x0581, 0x1218, 0x2009, 0x0003,
++      0x0010, 0x2009, 0x0002, 0x2079, 0x0200, 0x7912, 0x7817, 0x0004,
++      0x080c, 0x27be, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x7938, 0x080c,
++      0x1511, 0x00e6, 0x0026, 0x2071, 0x0200, 0x20e1, 0x1000, 0x7220,
++      0x7028, 0x7020, 0xa206, 0x0de0, 0x20e1, 0x9010, 0x002e, 0x00ee,
++      0x0005, 0x20e1, 0xa000, 0x7837, 0x0001, 0x782f, 0x0000, 0x782f,
++      0x0000, 0x782f, 0x0000, 0x782f, 0x0000, 0x7837, 0x0005, 0x20a9,
++      0x0210, 0x7830, 0xd0bc, 0x1110, 0x1f04, 0x2499, 0x7837, 0x0001,
++      0x7837, 0x0000, 0xe000, 0xe000, 0x20e1, 0xa000, 0x0005, 0x0126,
++      0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0xb400, 0x6024, 0x6026,
++      0x6053, 0x0030, 0x080c, 0x27fd, 0x6050, 0xa084, 0xfe7f, 0x6052,
++      0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x280d, 0x60e7, 0x0000,
++      0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
++      0x0080, 0x602f, 0x0000, 0x6007, 0x0e9f, 0x601b, 0x001e, 0x600f,
++      0x00ff, 0x2001, 0xb68d, 0x2003, 0x00ff, 0x602b, 0x002f, 0x012e,
++      0x0005, 0x2001, 0xb432, 0x2003, 0x0000, 0x2001, 0xb431, 0x2003,
++      0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026,
++      0x6124, 0xa184, 0x1e2c, 0x1118, 0xa184, 0x0007, 0x002a, 0xa195,
++      0x0004, 0xa284, 0x0007, 0x0002, 0x2516, 0x24fc, 0x24ff, 0x2502,
++      0x2507, 0x2509, 0x250d, 0x2511, 0x080c, 0x6b39, 0x00b8, 0x080c,
++      0x6c14, 0x00a0, 0x080c, 0x6c14, 0x080c, 0x6b39, 0x0078, 0x0099,
++      0x0068, 0x080c, 0x6b39, 0x0079, 0x0048, 0x080c, 0x6c14, 0x0059,
++      0x0028, 0x080c, 0x6c14, 0x080c, 0x6b39, 0x0029, 0x002e, 0x001e,
++      0x000e, 0x012e, 0x0005, 0x6124, 0xd19c, 0x1904, 0x272c, 0x080c,
++      0x5a90, 0x0578, 0x7000, 0xa086, 0x0003, 0x0198, 0x6024, 0xa084,
++      0x1800, 0x0178, 0x080c, 0x5ab6, 0x0118, 0x080c, 0x5aa2, 0x1148,
++      0x6027, 0x0020, 0x6043, 0x0000, 0x2001, 0xb69e, 0x2003, 0xaaaa,
++      0x0458, 0x080c, 0x5ab6, 0x15d0, 0x6024, 0xa084, 0x1800, 0x1108,
++      0x04a8, 0x2001, 0xb69e, 0x2003, 0xaaaa, 0x2001, 0xb69f, 0x2003,
++      0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0x080c, 0x59c8, 0x0804,
++      0x272c, 0xd1ac, 0x1518, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1188,
++      0xd0d4, 0x11a0, 0xd0cc, 0x0130, 0x708c, 0xa086, 0x0028, 0x1110,
++      0x080c, 0x5c1f, 0x0804, 0x272c, 0x2001, 0xb69f, 0x2003, 0x0000,
++      0x0048, 0x2001, 0xb69f, 0x2003, 0x0002, 0x0020, 0x080c, 0x5b92,
++      0x0804, 0x272c, 0x080c, 0x5cc4, 0x0804, 0x272c, 0xd1ac, 0x0904,
++      0x2674, 0x080c, 0x5a90, 0x11d8, 0x6027, 0x0020, 0x0006, 0x0026,
++      0x0036, 0x080c, 0x5aac, 0x1170, 0x2001, 0xb69f, 0x2003, 0x0001,
++      0x2001, 0xb400, 0x2003, 0x0001, 0x080c, 0x59c8, 0x003e, 0x002e,
++      0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x5a67, 0x0016,
++      0x0046, 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138, 0x2061, 0x0100,
++      0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74ce, 0xa48c, 0xff00,
++      0x7034, 0xd084, 0x0178, 0xa186, 0xf800, 0x1160, 0x703c, 0xd084,
++      0x1148, 0xc085, 0x703e, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c,
++      0x3e8a, 0x003e, 0xa196, 0xff00, 0x05b8, 0x7054, 0xa084, 0x00ff,
++      0x810f, 0xa116, 0x0588, 0x7130, 0xd184, 0x1570, 0x2011, 0xb453,
++      0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011, 0xb453, 0x2214,
++      0xd2ac, 0x1510, 0x6240, 0xa294, 0x0010, 0x0130, 0x6248, 0xa294,
++      0xff00, 0xa296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2641,
++      0x7034, 0xd08c, 0x1140, 0x2001, 0xb40c, 0x200c, 0xd1ac, 0x1904,
++      0x2641, 0xc1ad, 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c,
++      0x3e8a, 0x003e, 0x0804, 0x2641, 0x7034, 0xd08c, 0x1140, 0x2001,
++      0xb40c, 0x200c, 0xd1ac, 0x1904, 0x2641, 0xc1ad, 0x2102, 0x0036,
++      0x73cc, 0x2011, 0x8013, 0x080c, 0x3e8a, 0x003e, 0x7130, 0xc185,
++      0x7132, 0x2011, 0xb453, 0x220c, 0xd1a4, 0x01d0, 0x0016, 0x2009,
++      0x0001, 0x2011, 0x0100, 0x080c, 0x6adf, 0x2019, 0x000e, 0x080c,
++      0xafe8, 0xa484, 0x00ff, 0xa080, 0x2d88, 0x200d, 0xa18c, 0xff00,
++      0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x080c, 0xb06b, 0x001e,
++      0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c,
++      0x2c33, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000,
++      0x080c, 0x4f6a, 0x1110, 0x080c, 0x4bc5, 0x8108, 0x1f04, 0x2638,
++      0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, 0x801f, 0x2011,
++      0x0002, 0x080c, 0x8029, 0x080c, 0x7f03, 0x0036, 0x2019, 0x0000,
++      0x080c, 0x7f8e, 0x003e, 0x60e3, 0x0000, 0x001e, 0x2001, 0xb400,
++      0x2014, 0xa296, 0x0004, 0x1128, 0xd19c, 0x11b0, 0x6228, 0xc29d,
++      0x622a, 0x2003, 0x0001, 0x2001, 0xb423, 0x2003, 0x0000, 0x6027,
++      0x0020, 0x080c, 0x5ab6, 0x1140, 0x0016, 0x2009, 0x07d0, 0x2011,
++      0x59a5, 0x080c, 0x69e7, 0x001e, 0xd194, 0x0904, 0x272c, 0x0016,
++      0x6220, 0xd2b4, 0x0904, 0x26dd, 0x080c, 0x69d5, 0x080c, 0x7d24,
++      0x6027, 0x0004, 0x00f6, 0x2019, 0xb6e9, 0x2304, 0xa07d, 0x0570,
++      0x7804, 0xa086, 0x0032, 0x1550, 0x00d6, 0x00c6, 0x00e6, 0x2069,
++      0x0140, 0x618c, 0x6288, 0x7818, 0x608e, 0x7808, 0x608a, 0x6043,
++      0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x6803,
++      0x1000, 0x6803, 0x0000, 0x618e, 0x628a, 0x080c, 0x7055, 0x080c,
++      0x7134, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, 0x080c, 0x85c0,
++      0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe, 0x00d6,
++      0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, 0x6803, 0x1000,
++      0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, 0xb6e0, 0x6028, 0xa09a,
++      0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x7d17, 0x0804,
++      0x272b, 0x2019, 0xb6e9, 0x2304, 0xa065, 0x0120, 0x2009, 0x0027,
++      0x080c, 0x85ef, 0x00ce, 0x0804, 0x272b, 0xd2bc, 0x0904, 0x272b,
++      0x080c, 0x69e2, 0x6014, 0xa084, 0x0184, 0xa085, 0x0010, 0x6016,
++      0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000,
++      0x0120, 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061,
++      0xb6e0, 0x6044, 0xa09a, 0x00c8, 0x12f0, 0x8000, 0x6046, 0x603c,
++      0x00ce, 0xa005, 0x0540, 0x2009, 0x07d0, 0x080c, 0x69da, 0xa080,
++      0x0007, 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, 0xa18c, 0x0184,
++      0xa18d, 0x0012, 0x6116, 0x00b8, 0x6114, 0xa18c, 0x0184, 0xa18d,
++      0x0016, 0x6116, 0x0080, 0x0036, 0x2019, 0x0001, 0x080c, 0x7f8e,
++      0x003e, 0x2019, 0xb6ef, 0x2304, 0xa065, 0x0120, 0x2009, 0x004f,
++      0x080c, 0x85ef, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x2785, 0x7034,
++      0xd0ac, 0x1560, 0x0016, 0x0156, 0x6027, 0x0008, 0x602f, 0x0020,
++      0x20a9, 0x0006, 0x1d04, 0x273a, 0x2091, 0x6000, 0x1f04, 0x273a,
++      0x602f, 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9, 0x0366,
++      0x1d04, 0x2748, 0x2091, 0x6000, 0x6020, 0xd09c, 0x1130, 0x015e,
++      0x6152, 0x001e, 0x6027, 0x0008, 0x0480, 0x080c, 0x28cd, 0x1f04,
++      0x2748, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028,
++      0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x801f, 0x2011, 0x0002,
++      0x080c, 0x8029, 0x080c, 0x7f03, 0x0036, 0x2019, 0x0000, 0x080c,
++      0x7f8e, 0x003e, 0x60e3, 0x0000, 0x080c, 0xb3b2, 0x080c, 0xb3cd,
++      0xa085, 0x0001, 0x080c, 0x5ad4, 0x2001, 0xb400, 0x2003, 0x0004,
++      0x6027, 0x0008, 0x080c, 0x12d9, 0x001e, 0xa18c, 0xffd0, 0x6126,
++      0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0126, 0x2091,
++      0x8000, 0x2071, 0xb400, 0x71c4, 0x70c6, 0xa116, 0x0500, 0x81ff,
++      0x0128, 0x2011, 0x8011, 0x080c, 0x3e8a, 0x00c8, 0x2011, 0x8012,
++      0x080c, 0x3e8a, 0x2001, 0xb472, 0x2004, 0xd0fc, 0x1180, 0x0036,
++      0x00c6, 0x080c, 0x2858, 0x080c, 0x7edf, 0x2061, 0x0100, 0x2019,
++      0x0028, 0x2009, 0x0000, 0x080c, 0x2c33, 0x00ce, 0x003e, 0x012e,
++      0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x00c6, 0x00f6,
++      0x0006, 0x0026, 0x2061, 0x0100, 0xa190, 0x27d1, 0x2205, 0x60f2,
++      0x2011, 0x27de, 0x2205, 0x60ee, 0x002e, 0x000e, 0x00fe, 0x00ce,
++      0x0005, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420, 0x0348, 0x02c0,
++      0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x0140, 0x00f8,
++      0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff, 0x2130, 0xa094,
++      0xff00, 0x1110, 0x81ff, 0x0118, 0x080c, 0x6672, 0x0038, 0xa080,
++      0x2d88, 0x200d, 0xa18c, 0xff00, 0x810f, 0xa006, 0x0005, 0xa080,
++      0x2d88, 0x200d, 0xa18c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140,
++      0x2001, 0xb415, 0x2003, 0x00ef, 0x20a9, 0x0010, 0xa006, 0x6852,
++      0x6856, 0x1f04, 0x2808, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026,
++      0x2069, 0x0140, 0x2001, 0xb415, 0x2102, 0x8114, 0x8214, 0x8214,
++      0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0xa006, 0x82ff, 0x1128,
++      0xa184, 0x000f, 0xa080, 0xb3e1, 0x2005, 0x6856, 0x8211, 0x1f04,
++      0x281d, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0xb400,
++      0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005,
++      0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980,
++      0xa116, 0x0180, 0xa112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001,
++      0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x284d,
++      0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005,
++      0x2001, 0xb453, 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006,
++      0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xb06b, 0x004e, 0x0005,
++      0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0548,
++      0xa084, 0x0700, 0xa08e, 0x0300, 0x1520, 0x2011, 0x0000, 0x2009,
++      0x0002, 0x2300, 0xa080, 0x0020, 0x2018, 0x2300, 0x080c, 0x6b05,
++      0x2011, 0x0030, 0x2200, 0x8007, 0xa085, 0x004c, 0x78c2, 0x2009,
++      0x0204, 0x210c, 0x2200, 0xa100, 0x2009, 0x0138, 0x200a, 0x080c,
++      0x5a90, 0x1118, 0x2009, 0xb68f, 0x200a, 0x002e, 0x001e, 0x00fe,
++      0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006,
++      0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0xa184,
++      0x0003, 0x0110, 0x0804, 0x1ad3, 0x002e, 0x001e, 0x000e, 0x012e,
++      0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e,
++      0x0268, 0x2001, 0x0170, 0x200c, 0xa18c, 0x00ff, 0xa18e, 0x004c,
++      0x1128, 0x200c, 0xa18c, 0xff00, 0x810f, 0x0010, 0x2009, 0x0000,
++      0x2001, 0x0204, 0x2004, 0xa108, 0x0005, 0x0006, 0x0156, 0x00f6,
++      0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c, 0x1110, 0x1f04,
++      0x28d4, 0x00fe, 0x015e, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006,
++      0x2061, 0x0100, 0x6030, 0x0006, 0x6048, 0x0006, 0x60e4, 0x0006,
++      0x60e8, 0x0006, 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec, 0x0006,
++      0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x60e0, 0x0006,
++      0x602f, 0x0100, 0x602f, 0x0000, 0xe000, 0xe000, 0xe000, 0xe000,
++      0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x60e2, 0x000e, 0x602a,
++      0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, 0x60f2,
++      0x000e, 0x6052, 0x000e, 0x60ea, 0x000e, 0x60e6, 0x000e, 0x604a,
++      0x000e, 0x6032, 0x6036, 0x2008, 0x080c, 0x280d, 0x000e, 0x00ce,
++      0x001e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, 0x2009,
++      0x0170, 0x2104, 0x200b, 0x0080, 0xe000, 0xe000, 0x200a, 0x0005,
++      0x29c0, 0x29c4, 0x29c8, 0x29ce, 0x29d4, 0x29da, 0x29e0, 0x29e8,
++      0x29f0, 0x29f6, 0x29fc, 0x2a04, 0x2a0c, 0x2a14, 0x2a1c, 0x2a26,
++      0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++      0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++      0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++      0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++      0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++      0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++      0x2a32, 0x2a32, 0x2a38, 0x2a38, 0x2a3f, 0x2a3f, 0x2a46, 0x2a46,
++      0x2a4f, 0x2a4f, 0x2a56, 0x2a56, 0x2a5f, 0x2a5f, 0x2a68, 0x2a68,
++      0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++      0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++      0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++      0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++      0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++      0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73, 0x2a73,
++      0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++      0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30, 0x2a30,
++      0x0106, 0x0006, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x0804, 0x2a7b,
++      0x0106, 0x0006, 0x080c, 0x24e2, 0x0804, 0x2a7b, 0x0106, 0x0006,
++      0x080c, 0x24e2, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x236d,
++      0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x236d, 0x0804, 0x2a7b,
++      0x0106, 0x0006, 0x080c, 0x24e2, 0x080c, 0x236d, 0x0804, 0x2a7b,
++      0x0106, 0x0006, 0x080c, 0x24e2, 0x080c, 0x236d, 0x0804, 0x2a7b,
++      0x0106, 0x0006, 0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006,
++      0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x24e2,
++      0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x24e2,
++      0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x236d,
++      0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x236d,
++      0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006, 0x080c, 0x24e2,
++      0x080c, 0x236d, 0x080c, 0x23c3, 0x0804, 0x2a7b, 0x0106, 0x0006,
++      0x080c, 0x24e2, 0x080c, 0x236d, 0x080c, 0x23c3, 0x0804, 0x2a7b,
++      0xe000, 0x0cf0, 0x0106, 0x0006, 0x080c, 0x289c, 0x0804, 0x2a7b,
++      0x0106, 0x0006, 0x080c, 0x289c, 0x080c, 0x24e2, 0x04e0, 0x0106,
++      0x0006, 0x080c, 0x289c, 0x080c, 0x236d, 0x04a8, 0x0106, 0x0006,
++      0x080c, 0x289c, 0x080c, 0x24e2, 0x080c, 0x236d, 0x0460, 0x0106,
++      0x0006, 0x080c, 0x289c, 0x080c, 0x23c3, 0x0428, 0x0106, 0x0006,
++      0x080c, 0x289c, 0x080c, 0x24e2, 0x080c, 0x23c3, 0x00e0, 0x0106,
++      0x0006, 0x080c, 0x289c, 0x080c, 0x236d, 0x080c, 0x23c3, 0x0098,
++      0x0106, 0x0006, 0x080c, 0x289c, 0x080c, 0x24e2, 0x080c, 0x236d,
++      0x080c, 0x23c3, 0x0040, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1,
++      0x0000, 0x080c, 0x1511, 0x000e, 0x010e, 0x000d, 0x00c6, 0x0026,
++      0x0046, 0x2021, 0x0000, 0x080c, 0x52ca, 0x1904, 0x2b5b, 0x72d4,
++      0x2001, 0xb69e, 0x2004, 0xa005, 0x1110, 0xd29c, 0x0148, 0xd284,
++      0x1138, 0xd2bc, 0x1904, 0x2b5b, 0x080c, 0x2b5f, 0x0804, 0x2b5b,
++      0xd2cc, 0x1904, 0x2b5b, 0x080c, 0x5a90, 0x1120, 0x709f, 0xffff,
++      0x0804, 0x2b5b, 0xd294, 0x0120, 0x709f, 0xffff, 0x0804, 0x2b5b,
++      0x2001, 0xb415, 0x203c, 0x7288, 0xd284, 0x0904, 0x2afd, 0xd28c,
++      0x1904, 0x2afd, 0x0036, 0x739c, 0xa38e, 0xffff, 0x1110, 0x2019,
++      0x0001, 0x8314, 0xa2e0, 0xbbc0, 0x2c04, 0xa38c, 0x0001, 0x0120,
++      0xa084, 0xff00, 0x8007, 0x0010, 0xa084, 0x00ff, 0xa70e, 0x0560,
++      0xa08e, 0x0000, 0x0548, 0xa08e, 0x00ff, 0x1150, 0x7230, 0xd284,
++      0x1538, 0x7288, 0xc28d, 0x728a, 0x709f, 0xffff, 0x003e, 0x0428,
++      0x2009, 0x0000, 0x080c, 0x27e3, 0x080c, 0x4f0e, 0x11b8, 0x6004,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x1150, 0x7030, 0xd08c, 0x0118,
++      0x6000, 0xd0bc, 0x0120, 0x080c, 0x2b72, 0x0140, 0x0028, 0x080c,
++      0x2ca1, 0x080c, 0x2ba0, 0x0110, 0x8318, 0x0818, 0x739e, 0x0010,
++      0x709f, 0xffff, 0x003e, 0x0804, 0x2b5b, 0xa780, 0x2d88, 0x203d,
++      0xa7bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x709c, 0xa096, 0xffff,
++      0x1120, 0x2009, 0x0000, 0x28a8, 0x0050, 0xa812, 0x0220, 0x2008,
++      0xa802, 0x20a8, 0x0020, 0x709f, 0xffff, 0x0804, 0x2b5b, 0x2700,
++      0x0156, 0x0016, 0xa106, 0x05a0, 0xc484, 0x080c, 0x4f6a, 0x0120,
++      0x080c, 0x4f0e, 0x15a8, 0x0008, 0xc485, 0x6004, 0xa084, 0x00ff,
++      0xa086, 0x0006, 0x1130, 0x7030, 0xd08c, 0x01e8, 0x6000, 0xd0bc,
++      0x11d0, 0x7288, 0xd28c, 0x0188, 0x6004, 0xa084, 0x00ff, 0xa082,
++      0x0006, 0x02b0, 0xd484, 0x1118, 0x080c, 0x4f2d, 0x0028, 0x080c,
++      0x2d2e, 0x0170, 0x080c, 0x2d5b, 0x0058, 0x080c, 0x2ca1, 0x080c,
++      0x2ba0, 0x0170, 0x0028, 0x080c, 0x2d2e, 0x0110, 0x0419, 0x0140,
++      0x001e, 0x8108, 0x015e, 0x1f04, 0x2b17, 0x709f, 0xffff, 0x0018,
++      0x001e, 0x015e, 0x719e, 0x004e, 0x002e, 0x00ce, 0x0005, 0x00c6,
++      0x0016, 0x709f, 0x0001, 0x2009, 0x007e, 0x080c, 0x4f0e, 0x1138,
++      0x080c, 0x2ca1, 0x04a9, 0x0118, 0x70d4, 0xc0bd, 0x70d6, 0x001e,
++      0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001,
++      0xb457, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, 0x9e67, 0x01d8,
++      0x2d00, 0x601a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2001, 0x0000,
++      0x080c, 0x4eac, 0x2001, 0x0000, 0x080c, 0x4ebe, 0x0126, 0x2091,
++      0x8000, 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0004, 0x080c,
++      0x85ef, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
++      0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001, 0xb457, 0x2004,
++      0xa084, 0x00ff, 0x6842, 0x080c, 0x9e67, 0x0550, 0x2d00, 0x601a,
++      0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e, 0x0140, 0x6804,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x1110, 0x080c, 0x2c60, 0x080c,
++      0x9fb8, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4eac, 0x2001,
++      0x0002, 0x080c, 0x4ebe, 0x0126, 0x2091, 0x8000, 0x7098, 0x8000,
++      0x709a, 0x012e, 0x2009, 0x0002, 0x080c, 0x85ef, 0xa085, 0x0001,
++      0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x0026, 0x2009,
++      0x0080, 0x080c, 0x4f0e, 0x1120, 0x0031, 0x0110, 0x70db, 0xffff,
++      0x002e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68,
++      0x080c, 0x856a, 0x01d8, 0x2d00, 0x601a, 0x080c, 0x9fb8, 0x601f,
++      0x0001, 0x2001, 0x0000, 0x080c, 0x4eac, 0x2001, 0x0002, 0x080c,
++      0x4ebe, 0x0126, 0x2091, 0x8000, 0x70dc, 0x8000, 0x70de, 0x012e,
++      0x2009, 0x0002, 0x080c, 0x85ef, 0xa085, 0x0001, 0x00ce, 0x00de,
++      0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000,
++      0x2009, 0x007f, 0x080c, 0x4f0e, 0x1190, 0x2c68, 0x080c, 0x856a,
++      0x0170, 0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x080c,
++      0x9fb8, 0x2009, 0x0022, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e,
++      0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026,
++      0x080c, 0x6dc6, 0x080c, 0x6d69, 0x080c, 0x900f, 0x2130, 0x81ff,
++      0x0128, 0x20a9, 0x007e, 0x2009, 0x0000, 0x0020, 0x20a9, 0x007f,
++      0x2009, 0x0000, 0x0016, 0x080c, 0x4f6a, 0x1120, 0x080c, 0x516b,
++      0x080c, 0x4bc5, 0x001e, 0x8108, 0x1f04, 0x2c4a, 0x86ff, 0x1110,
++      0x080c, 0x11f0, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005,
++      0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0,
++      0x0026, 0x2019, 0x0029, 0x080c, 0x6dba, 0x0076, 0x2039, 0x0000,
++      0x080c, 0x6cc7, 0x2c08, 0x080c, 0xae05, 0x007e, 0x001e, 0x2e60,
++      0x080c, 0x516b, 0x6210, 0x6314, 0x080c, 0x4bc5, 0x6212, 0x6316,
++      0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006,
++      0x6018, 0xa080, 0x0028, 0x2004, 0xa086, 0x0080, 0x0150, 0x2071,
++      0xb400, 0x7098, 0xa005, 0x0110, 0x8001, 0x709a, 0x000e, 0x00ee,
++      0x0005, 0x2071, 0xb400, 0x70dc, 0xa005, 0x0dc0, 0x8001, 0x70de,
++      0x0ca8, 0x6000, 0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, 0x00c6,
++      0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9,
++      0x0001, 0x0098, 0x2001, 0xb453, 0x2004, 0xd0c4, 0x0150, 0xd0a4,
++      0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xb06b,
++      0x004e, 0x20a9, 0x00ff, 0x2011, 0x0000, 0x0026, 0xa28e, 0x007e,
++      0x0904, 0x2d0d, 0xa28e, 0x007f, 0x0904, 0x2d0d, 0xa28e, 0x0080,
++      0x05e0, 0xa288, 0xb535, 0x210c, 0x81ff, 0x05b8, 0x8fff, 0x1148,
++      0x2001, 0xb6be, 0x0006, 0x2003, 0x0001, 0x04d9, 0x000e, 0x2003,
++      0x0000, 0x00c6, 0x2160, 0x2001, 0x0001, 0x080c, 0x52d4, 0x00ce,
++      0x2019, 0x0029, 0x080c, 0x6dba, 0x0076, 0x2039, 0x0000, 0x080c,
++      0x6cc7, 0x00c6, 0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286,
++      0x0006, 0x1118, 0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007,
++      0xa215, 0x6206, 0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xae05,
++      0x001e, 0x007e, 0x2160, 0x080c, 0x516b, 0x002e, 0x8210, 0x1f04,
++      0x2cc5, 0x015e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x00fe,
++      0x0005, 0x0046, 0x0026, 0x0016, 0x2001, 0xb453, 0x2004, 0xd0c4,
++      0x0148, 0xd0a4, 0x0138, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029,
++      0x080c, 0xb06b, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026,
++      0x0036, 0x00c6, 0x7288, 0x82ff, 0x01f8, 0x2011, 0xb453, 0x2214,
++      0xd2ac, 0x11d0, 0x2100, 0x080c, 0x27f7, 0x81ff, 0x01b8, 0x2019,
++      0x0001, 0x8314, 0xa2e0, 0xbbc0, 0x2c04, 0xd384, 0x0120, 0xa084,
++      0xff00, 0x8007, 0x0010, 0xa084, 0x00ff, 0xa116, 0x0138, 0xa096,
++      0x00ff, 0x0110, 0x8318, 0x0c68, 0xa085, 0x0001, 0x00ce, 0x003e,
++      0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000,
++      0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019, 0x0029, 0x080c,
++      0x823c, 0x002e, 0x080c, 0xb310, 0x003e, 0x002e, 0x001e, 0xa180,
++      0xb535, 0x2004, 0xa065, 0x0158, 0x0016, 0x00c6, 0x2061, 0xb7f4,
++      0x001e, 0x611a, 0x080c, 0x2c60, 0x001e, 0x080c, 0x4f2d, 0x012e,
++      0x00ce, 0x001e, 0x0005, 0x2001, 0xb435, 0x2004, 0xd0cc, 0x0005,
++      0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da,
++      0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce,
++      0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5,
++      0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3,
++      0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9,
++      0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b,
++      0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081,
++      0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073,
++      0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69,
++      0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056,
++      0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c,
++      0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c,
++      0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831,
++      0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026,
++      0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017,
++      0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000,
++      0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000,
++      0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300,
++      0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100,
++      0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00,
++      0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800,
++      0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000,
++      0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000,
++      0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500,
++      0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000,
++      0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000,
++      0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000,
++      0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000,
++      0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000,
++      0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x2071, 0xb482, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a,
++      0x703e, 0x7033, 0xb492, 0x7037, 0xb492, 0x7007, 0x0001, 0x2061,
++      0xb4d2, 0x6003, 0x0002, 0x0005, 0x1004, 0x2eae, 0x0e04, 0x2eae,
++      0x2071, 0xb482, 0x2b78, 0x7818, 0xd084, 0x1140, 0x2a60, 0x7820,
++      0xa08e, 0x0069, 0x1904, 0x2f93, 0x0804, 0x2f2c, 0x0005, 0x2071,
++      0xb482, 0x7004, 0x0002, 0x2eb7, 0x2eb8, 0x2ec1, 0x2ed2, 0x0005,
++      0x1004, 0x2ec0, 0x0e04, 0x2ec0, 0x2b78, 0x7818, 0xd084, 0x01e8,
++      0x0005, 0x2b78, 0x2061, 0xb4d2, 0x6008, 0xa08e, 0x0100, 0x0128,
++      0xa086, 0x0200, 0x0904, 0x2f8d, 0x0005, 0x7014, 0x2068, 0x2a60,
++      0x7018, 0x0807, 0x7010, 0x2068, 0x6834, 0xa086, 0x0103, 0x0108,
++      0x0005, 0x2a60, 0x2b78, 0x7018, 0x0807, 0x2a60, 0x7820, 0xa08a,
++      0x0040, 0x1210, 0x61c4, 0x0042, 0x2100, 0xa08a, 0x003f, 0x1a04,
++      0x2f8a, 0x61c4, 0x0804, 0x2f2c, 0x2f6e, 0x2f99, 0x2fa1, 0x2fa5,
++      0x2fad, 0x2fb3, 0x2fb7, 0x2fc3, 0x2fc6, 0x2fd0, 0x2fd3, 0x2f8a,
++      0x2f8a, 0x2f8a, 0x2fd6, 0x2f8a, 0x2fe5, 0x2ffc, 0x3013, 0x308d,
++      0x3092, 0x30bb, 0x310c, 0x311d, 0x313c, 0x3174, 0x317e, 0x318b,
++      0x319e, 0x31bf, 0x31c8, 0x31fe, 0x3204, 0x2f8a, 0x322d, 0x2f8a,
++      0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x3234, 0x323e, 0x2f8a, 0x2f8a,
++      0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x3246, 0x2f8a,
++      0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x3258, 0x3262, 0x2f8a, 0x2f8a,
++      0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x0002, 0x328c, 0x32e0, 0x333b,
++      0x334e, 0x2f8a, 0x337f, 0x37b2, 0x41f1, 0x2f8a, 0x2f8a, 0x2f8a,
++      0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a, 0x2fd0, 0x2fd3, 0x37b4,
++      0x2f8a, 0x37c1, 0x428a, 0x42e5, 0x4349, 0x2f8a, 0x43ac, 0x43d2,
++      0x43f1, 0x4423, 0x2f8a, 0x2f8a, 0x2f8a, 0x37c5, 0x396a, 0x3984,
++      0x39a2, 0x3a03, 0x3a63, 0x3a6e, 0x3aa6, 0x3ab5, 0x3ac4, 0x3ac7,
++      0x3aea, 0x3b34, 0x3baa, 0x3bb7, 0x3cb8, 0x3de1, 0x3e0a, 0x3f08,
++      0x3f2a, 0x3f36, 0x3f6f, 0x4033, 0x2f8a, 0x2f8a, 0x2f8a, 0x2f8a,
++      0x409b, 0x40b6, 0x4128, 0x41da, 0x713c, 0x0000, 0x2021, 0x4000,
++      0x080c, 0x3e67, 0x0126, 0x2091, 0x8000, 0x0e04, 0x2f7a, 0x7818,
++      0xd084, 0x0110, 0x012e, 0x0cb0, 0x7c22, 0x7926, 0x7a2a, 0x7b2e,
++      0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000,
++      0x012e, 0x0005, 0x2021, 0x4001, 0x0c18, 0x2021, 0x4002, 0x0c00,
++      0x2021, 0x4003, 0x08e8, 0x2021, 0x4005, 0x08d0, 0x2021, 0x4006,
++      0x08b8, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804,
++      0x3e74, 0x7823, 0x0004, 0x7824, 0x0807, 0xa02e, 0x2520, 0x7b28,
++      0x7a2c, 0x7824, 0x7930, 0x0804, 0x3e77, 0x7924, 0x7828, 0x2114,
++      0x200a, 0x0804, 0x2f6e, 0x7924, 0x2114, 0x0804, 0x2f6e, 0x2099,
++      0x0009, 0x20a1, 0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28,
++      0x7b2c, 0x0804, 0x2f6e, 0x7824, 0x2060, 0x0090, 0x2009, 0x0002,
++      0x2011, 0x0002, 0x2019, 0x0003, 0x783b, 0x0017, 0x0804, 0x2f6e,
++      0x7d38, 0x7c3c, 0x0840, 0x7d38, 0x7c3c, 0x0888, 0x2061, 0x1000,
++      0xe10c, 0xa006, 0x2c15, 0xa200, 0x8c60, 0x8109, 0x1dd8, 0x2010,
++      0xa005, 0x0904, 0x2f6e, 0x0804, 0x2f90, 0x2069, 0xb452, 0x7824,
++      0x7930, 0xa11a, 0x1a04, 0x2f96, 0x8019, 0x0904, 0x2f96, 0x684a,
++      0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, 0x685e,
++      0x080c, 0x5d66, 0x0804, 0x2f6e, 0x2069, 0xb452, 0x7824, 0x7934,
++      0xa11a, 0x1a04, 0x2f96, 0x8019, 0x0904, 0x2f96, 0x684e, 0x6946,
++      0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x080c,
++      0x5396, 0x0804, 0x2f6e, 0xa02e, 0x2520, 0x81ff, 0x1904, 0x2f93,
++      0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xb489, 0x41a1,
++      0x080c, 0x3e33, 0x0904, 0x2f93, 0x2009, 0x0020, 0x080c, 0x3e74,
++      0x701b, 0x302b, 0x0005, 0x6834, 0x2008, 0xa084, 0x00ff, 0xa096,
++      0x0011, 0x0138, 0xa096, 0x0019, 0x0120, 0xa096, 0x0015, 0x1904,
++      0x2f93, 0x810f, 0xa18c, 0x00ff, 0x0904, 0x2f93, 0x710e, 0x700c,
++      0x8001, 0x0528, 0x700e, 0x080c, 0x3e33, 0x0904, 0x2f93, 0x2009,
++      0x0020, 0x2061, 0xb4d2, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290,
++      0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x080c,
++      0x3e74, 0x701b, 0x305c, 0x0005, 0x6834, 0xa084, 0x00ff, 0xa096,
++      0x0002, 0x0120, 0xa096, 0x000a, 0x1904, 0x2f93, 0x08c0, 0x7010,
++      0x2068, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x4e0a, 0x1128, 0x7007,
++      0x0003, 0x701b, 0x3076, 0x0005, 0x080c, 0x549c, 0x0126, 0x2091,
++      0x8000, 0x20a9, 0x0005, 0x2099, 0xb489, 0x530a, 0x2100, 0xa210,
++      0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d,
++      0x2009, 0x0020, 0x012e, 0x0804, 0x3e77, 0x61ac, 0x7824, 0x60ae,
++      0x0804, 0x2f6e, 0x2091, 0x8000, 0x7823, 0x4000, 0x7827, 0x4953,
++      0x782b, 0x5020, 0x782f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7832,
++      0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c,
++      0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, 0x2104, 0x783e, 0x781b,
++      0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2071, 0x0010, 0x20c1,
++      0x00f0, 0x0804, 0x0427, 0x81ff, 0x1904, 0x2f93, 0x7924, 0x810f,
++      0xa18c, 0x00ff, 0x080c, 0x4f6a, 0x1904, 0x2f96, 0x7e38, 0xa684,
++      0x3fff, 0xa082, 0x4000, 0x0210, 0x0804, 0x2f96, 0x7c28, 0x7d2c,
++      0x080c, 0x5132, 0xd28c, 0x1118, 0x080c, 0x50db, 0x0010, 0x080c,
++      0x510b, 0x1518, 0x2061, 0xbc00, 0x0126, 0x2091, 0x8000, 0x6000,
++      0xa086, 0x0000, 0x0148, 0x6010, 0xa06d, 0x0130, 0x683c, 0xa406,
++      0x1118, 0x6840, 0xa506, 0x0150, 0x012e, 0xace0, 0x0018, 0x2001,
++      0xb417, 0x2004, 0xac02, 0x1a04, 0x2f93, 0x0c30, 0x080c, 0x98c3,
++      0x012e, 0x0904, 0x2f93, 0x0804, 0x2f6e, 0xa00e, 0x2001, 0x0005,
++      0x080c, 0x549c, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e63, 0x080c,
++      0x53c9, 0x012e, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93, 0x080c,
++      0x3e48, 0x0904, 0x2f96, 0x080c, 0x5030, 0x0904, 0x2f93, 0x080c,
++      0x513e, 0x0904, 0x2f93, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93,
++      0x080c, 0x3e58, 0x0904, 0x2f96, 0x080c, 0x51aa, 0x0904, 0x2f93,
++      0x2019, 0x0005, 0x7924, 0x080c, 0x5159, 0x0904, 0x2f93, 0x7828,
++      0xa08a, 0x1000, 0x1a04, 0x2f96, 0x8003, 0x800b, 0x810b, 0xa108,
++      0x080c, 0x696d, 0x0804, 0x2f6e, 0x0126, 0x2091, 0x8000, 0x81ff,
++      0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x00ff, 0x6450, 0x2400,
++      0xa506, 0x01f8, 0x2508, 0x080c, 0x4f6a, 0x11d8, 0x080c, 0x51aa,
++      0x1128, 0x2009, 0x0002, 0x62b4, 0x2518, 0x00c0, 0x2019, 0x0004,
++      0xa00e, 0x080c, 0x5159, 0x1118, 0x2009, 0x0006, 0x0078, 0x7824,
++      0xa08a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c,
++      0x696d, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x2f6e, 0x012e, 0x0804,
++      0x2f93, 0x012e, 0x0804, 0x2f96, 0x080c, 0x3e48, 0x0904, 0x2f96,
++      0x080c, 0x5096, 0x080c, 0x5132, 0x0804, 0x2f6e, 0x81ff, 0x1904,
++      0x2f93, 0x080c, 0x3e48, 0x0904, 0x2f96, 0x080c, 0x5087, 0x080c,
++      0x5132, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x3e48,
++      0x0904, 0x2f96, 0x080c, 0x510d, 0x0904, 0x2f93, 0x080c, 0x4e4e,
++      0x080c, 0x50d4, 0x080c, 0x5132, 0x0804, 0x2f6e, 0x080c, 0x3e48,
++      0x0904, 0x2f96, 0x080c, 0x5030, 0x0904, 0x2f93, 0x62a0, 0x2019,
++      0x0005, 0x00c6, 0x080c, 0x516b, 0x2061, 0x0000, 0x080c, 0x6dba,
++      0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x2009, 0x0000, 0x080c,
++      0xae05, 0x007e, 0x00ce, 0x080c, 0x5132, 0x0804, 0x2f6e, 0x080c,
++      0x3e48, 0x0904, 0x2f96, 0x080c, 0x5132, 0x2208, 0x0804, 0x2f6e,
++      0x0156, 0x00d6, 0x00e6, 0x2069, 0xb514, 0x6810, 0x6914, 0xa10a,
++      0x1210, 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000,
++      0x20a9, 0x007e, 0x2069, 0xb535, 0x2d04, 0xa075, 0x0130, 0x704c,
++      0x0071, 0xa210, 0x7080, 0x0059, 0xa318, 0x8d68, 0x1f04, 0x31dc,
++      0x2300, 0xa218, 0x00ee, 0x00de, 0x015e, 0x0804, 0x2f6e, 0x00f6,
++      0x0016, 0xa07d, 0x0140, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff,
++      0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0xb514,
++      0x6910, 0x62b0, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93, 0x6150,
++      0xa190, 0x2d88, 0x2215, 0xa294, 0x00ff, 0x6370, 0x83ff, 0x0108,
++      0x6274, 0x67d4, 0xd79c, 0x0118, 0x2031, 0x0001, 0x0090, 0xd7ac,
++      0x0118, 0x2031, 0x0003, 0x0068, 0xd7a4, 0x0118, 0x2031, 0x0002,
++      0x0040, 0x080c, 0x5a90, 0x1118, 0x2031, 0x0004, 0x0010, 0x2031,
++      0x0000, 0x7e3a, 0x7f3e, 0x0804, 0x2f6e, 0x6140, 0x6244, 0x2019,
++      0xb6b6, 0x231c, 0x0804, 0x2f6e, 0x0126, 0x2091, 0x8000, 0x6134,
++      0xa006, 0x2010, 0x6338, 0x012e, 0x0804, 0x2f6e, 0x080c, 0x3e58,
++      0x0904, 0x2f96, 0x6244, 0x6338, 0x0804, 0x2f6e, 0x6140, 0x6244,
++      0x7824, 0x6042, 0x7b28, 0x6346, 0x2069, 0xb452, 0x831f, 0xa305,
++      0x6816, 0x782c, 0x2069, 0xb6b6, 0x2d1c, 0x206a, 0x0804, 0x2f6e,
++      0x0126, 0x2091, 0x8000, 0x7824, 0x6036, 0x782c, 0x603a, 0x012e,
++      0x0804, 0x2f6e, 0x7838, 0xa005, 0x01a8, 0x7828, 0xa025, 0x0904,
++      0x2f96, 0x782c, 0xa02d, 0x0904, 0x2f96, 0xa00e, 0x080c, 0x4f6a,
++      0x1120, 0x6244, 0x6338, 0x6446, 0x653a, 0xa186, 0x00ff, 0x0190,
++      0x8108, 0x0ca0, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x7828, 0xa00d,
++      0x0904, 0x2f96, 0x782c, 0xa005, 0x0904, 0x2f96, 0x6244, 0x6146,
++      0x6338, 0x603a, 0x0804, 0x2f6e, 0x2001, 0xb400, 0x2004, 0xa086,
++      0x0003, 0x1904, 0x2f93, 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f,
++      0xa18c, 0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001, 0xb415, 0x2004,
++      0xa085, 0xff00, 0x0078, 0xa182, 0x007f, 0x16a0, 0xa188, 0x2d88,
++      0x210d, 0xa18c, 0x00ff, 0x2001, 0xb415, 0x2004, 0xa116, 0x0550,
++      0x810f, 0xa105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x856a,
++      0x000e, 0x01e0, 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x080c,
++      0x3e33, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000,
++      0x6838, 0xc0fd, 0x683a, 0x701b, 0x3334, 0x2d00, 0x6012, 0x2009,
++      0x0032, 0x080c, 0x85ef, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce,
++      0x0804, 0x2f93, 0x00ce, 0x0804, 0x2f96, 0x080c, 0x85c0, 0x0cb0,
++      0x2001, 0xb400, 0x2004, 0xa086, 0x0003, 0x1904, 0x2f93, 0x00c6,
++      0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff,
++      0x1130, 0x2001, 0xb415, 0x2004, 0xa085, 0xff00, 0x0078, 0xa182,
++      0x007f, 0x16a0, 0xa188, 0x2d88, 0x210d, 0xa18c, 0x00ff, 0x2001,
++      0xb415, 0x2004, 0xa116, 0x0550, 0x810f, 0xa105, 0x0126, 0x2091,
++      0x8000, 0x0006, 0x080c, 0x856a, 0x000e, 0x01e0, 0x601a, 0x600b,
++      0xbc05, 0x601f, 0x0001, 0x080c, 0x3e33, 0x01d8, 0x6837, 0x0000,
++      0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b,
++      0x3334, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, 0x85ef, 0x012e,
++      0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x2f93, 0x00ce, 0x0804,
++      0x2f96, 0x080c, 0x85c0, 0x0cb0, 0x6830, 0xa086, 0x0100, 0x0904,
++      0x2f93, 0x0804, 0x2f6e, 0x2061, 0xb774, 0x0126, 0x2091, 0x8000,
++      0x6000, 0xd084, 0x0140, 0x6104, 0x6208, 0x2019, 0xb412, 0x231c,
++      0x012e, 0x0804, 0x2f6e, 0x012e, 0x0804, 0x2f96, 0x81ff, 0x1904,
++      0x2f93, 0x080c, 0x5a90, 0x0904, 0x2f93, 0x0126, 0x2091, 0x8000,
++      0x6248, 0x6068, 0xa202, 0x0248, 0xa085, 0x0001, 0x080c, 0x282d,
++      0x080c, 0x45e6, 0x012e, 0x0804, 0x2f6e, 0x012e, 0x0804, 0x2f96,
++      0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0xb6bf, 0x2070, 0x2061,
++      0xb452, 0x6008, 0x2072, 0x2009, 0x0000, 0x2011, 0x1000, 0x080c,
++      0x6b05, 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126,
++      0x2091, 0x8000, 0x7824, 0xa084, 0x0007, 0x0002, 0x3391, 0x339a,
++      0x33a1, 0x338e, 0x338e, 0x338e, 0x338e, 0x338e, 0x012e, 0x0804,
++      0x2f96, 0x2009, 0x0114, 0x2104, 0xa085, 0x0800, 0x200a, 0x080c,
++      0x350c, 0x0070, 0x2009, 0x010b, 0x200b, 0x0010, 0x080c, 0x350c,
++      0x0038, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x2f70,
++      0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
++      0x080c, 0x3368, 0x2009, 0x0101, 0x210c, 0x0016, 0x2001, 0x0138,
++      0x200c, 0x2003, 0x0001, 0x0016, 0x2001, 0x007a, 0x2034, 0x2001,
++      0x007b, 0x202c, 0xa006, 0x2048, 0x2050, 0x2058, 0x080c, 0x3757,
++      0x080c, 0x36bb, 0xa03e, 0x2720, 0x00f6, 0x00e6, 0x00c6, 0x2d60,
++      0x2071, 0xb74a, 0x2079, 0x0020, 0x00d6, 0x2069, 0x0000, 0x6824,
++      0xd0b4, 0x0140, 0x2001, 0x007d, 0x2004, 0x783e, 0x2001, 0x007c,
++      0x2004, 0x783a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3667, 0x080c,
++      0x3667, 0x00ce, 0x00ee, 0x00fe, 0x080c, 0x35b2, 0x080c, 0x368f,
++      0x080c, 0x360c, 0x080c, 0x3571, 0x080c, 0x35a2, 0x00f6, 0x2079,
++      0x0100, 0x7824, 0xd094, 0x0530, 0x7814, 0xa084, 0x0184, 0xa085,
++      0x0010, 0x7816, 0x2079, 0x0140, 0x080c, 0x34ea, 0x1110, 0x00fe,
++      0x0430, 0x7804, 0xd0dc, 0x0dc0, 0x2079, 0x0100, 0x7827, 0x0086,
++      0x7814, 0xa084, 0x0184, 0xa085, 0x0032, 0x7816, 0x080c, 0x34ea,
++      0x1110, 0x00fe, 0x00a0, 0x7824, 0xd0bc, 0x0dc0, 0x7827, 0x0080,
++      0xa026, 0x7c16, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x34f4,
++      0x00fe, 0x0804, 0x34b4, 0x00fe, 0x080c, 0x34ea, 0x1150, 0x8948,
++      0x2001, 0x007a, 0x2602, 0x2001, 0x007b, 0x2502, 0x080c, 0x34f4,
++      0x0088, 0x87ff, 0x0140, 0x2001, 0x0201, 0x2004, 0xa005, 0x1904,
++      0x33ee, 0x8739, 0x0038, 0x2001, 0xb723, 0x2004, 0xa086, 0x0000,
++      0x1904, 0x33ee, 0x2001, 0x0033, 0x2003, 0x00f6, 0x8631, 0x1208,
++      0x8529, 0x2500, 0xa605, 0x0904, 0x34b4, 0x7824, 0xd0bc, 0x0128,
++      0x2900, 0xaa05, 0xab05, 0x1904, 0x34b4, 0x6033, 0x000d, 0x2001,
++      0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac, 0x1148, 0x2001, 0xb723,
++      0x2003, 0x0003, 0x2001, 0x0030, 0x2003, 0x0009, 0x0040, 0x6027,
++      0x0001, 0x2001, 0x0075, 0x2004, 0xa005, 0x0108, 0x6026, 0x2c00,
++      0x601a, 0x20e1, 0x9040, 0x2d00, 0x681a, 0x6833, 0x000d, 0x7824,
++      0xd0a4, 0x1180, 0x6827, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061,
++      0x0020, 0x6003, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3489,
++      0x00ce, 0x0040, 0x6827, 0x0001, 0x2001, 0x0074, 0x2004, 0xa005,
++      0x0108, 0x6826, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0020,
++      0x7827, 0x0002, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x601a,
++      0x0006, 0x2001, 0x0073, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca,
++      0x00ce, 0x00fe, 0x0804, 0x33cc, 0x2061, 0x0100, 0x6027, 0x0002,
++      0x001e, 0x61e2, 0x001e, 0x6106, 0x7824, 0xa084, 0x0003, 0xa086,
++      0x0002, 0x0188, 0x20e1, 0x9028, 0x6050, 0xa084, 0xf7ef, 0x6052,
++      0x602f, 0x0000, 0x602c, 0xc0ac, 0x602e, 0x604b, 0xf7f7, 0x6043,
++      0x0090, 0x6043, 0x0010, 0x2908, 0x2a10, 0x2b18, 0x2b00, 0xaa05,
++      0xa905, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
++      0x008e, 0x1118, 0x012e, 0x0804, 0x2f6e, 0x012e, 0x2021, 0x400c,
++      0x0804, 0x2f70, 0xa085, 0x0001, 0x1d04, 0x34f3, 0x2091, 0x6000,
++      0x8420, 0xa486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010,
++      0x2001, 0x0030, 0x2003, 0x0004, 0x2001, 0x0020, 0x2003, 0x0004,
++      0x2001, 0xb723, 0x2003, 0x0000, 0x2001, 0xb74a, 0x2003, 0x0000,
++      0x20e1, 0xf000, 0xa026, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001,
++      0xb415, 0x200c, 0x7932, 0x7936, 0x080c, 0x280d, 0x7850, 0xa084,
++      0x0980, 0xa085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0,
++      0xa084, 0x0980, 0x7852, 0x782c, 0xc0ad, 0x782e, 0x20a9, 0x0046,
++      0x1d04, 0x3528, 0x2091, 0x6000, 0x1f04, 0x3528, 0x7850, 0xa085,
++      0x0400, 0x7852, 0x2001, 0x0009, 0x2004, 0xa084, 0x0003, 0xa086,
++      0x0001, 0x1118, 0x782c, 0xc0ac, 0x782e, 0x784b, 0xf7f7, 0x7843,
++      0x0090, 0x7843, 0x0010, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x3545,
++      0x7850, 0xa085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xe000,
++      0xe000, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850,
++      0xa085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xe000,
++      0xe000, 0x8319, 0x1de0, 0x2001, 0x0140, 0x2003, 0x0100, 0x7827,
++      0x0020, 0x7843, 0x0000, 0x2003, 0x0000, 0x7827, 0x0048, 0x00fe,
++      0x0005, 0x7824, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0xb723,
++      0x2079, 0x0030, 0x2001, 0x0201, 0x2004, 0xa005, 0x0160, 0x7000,
++      0xa086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003,
++      0x0003, 0x7803, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x780c, 0xa08c,
++      0x0070, 0x0178, 0x2009, 0x007a, 0x260a, 0x2009, 0x007b, 0x250a,
++      0xd0b4, 0x0108, 0x8a50, 0xd0ac, 0x0108, 0x8948, 0xd0a4, 0x0108,
++      0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0140,
++      0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x0ca8,
++      0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0xb6c0, 0x2004,
++      0x70e2, 0x2009, 0xb415, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166,
++      0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078,
++      0xa080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa,
++      0xa006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af,
++      0x95d5, 0x7027, 0x0080, 0x7014, 0xa084, 0x0184, 0xa085, 0x0032,
++      0x7016, 0x080c, 0x368f, 0x080c, 0x34ea, 0x1110, 0x8421, 0x0028,
++      0x7024, 0xd0bc, 0x0db0, 0x7027, 0x0080, 0x00f6, 0x00e6, 0x2071,
++      0xb723, 0x2079, 0x0030, 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4,
++      0x0120, 0x683c, 0x783e, 0x6838, 0x783a, 0x00de, 0x2011, 0x0011,
++      0x080c, 0x3667, 0x2011, 0x0001, 0x080c, 0x3667, 0x00ee, 0x00fe,
++      0x7017, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0xb723,
++      0x2079, 0x0030, 0x7904, 0xd1fc, 0x0904, 0x3664, 0x7803, 0x0002,
++      0xa026, 0xd19c, 0x1904, 0x3660, 0x7000, 0x0002, 0x3664, 0x3622,
++      0x3646, 0x3660, 0xd1bc, 0x1150, 0xd1dc, 0x1150, 0x8001, 0x7002,
++      0x2011, 0x0001, 0x04e1, 0x05c0, 0x04d1, 0x04b0, 0x780f, 0x0000,
++      0x7820, 0x7924, 0x7803, 0x0004, 0x7822, 0x7926, 0x2001, 0x0201,
++      0x200c, 0x81ff, 0x0de8, 0x080c, 0x358e, 0x2009, 0x0001, 0x7808,
++      0xd0ec, 0x0110, 0x2009, 0x0011, 0x7902, 0x00f0, 0x8001, 0x7002,
++      0xa184, 0x0880, 0x1138, 0x7804, 0xd0fc, 0x1940, 0x2011, 0x0001,
++      0x00b1, 0x0090, 0x6030, 0xa092, 0x0004, 0xa086, 0x0009, 0x1120,
++      0x6000, 0x601a, 0x2011, 0x0025, 0x6232, 0xd1dc, 0x1988, 0x0870,
++      0x7803, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x6024,
++      0xa005, 0x0520, 0x8001, 0x6026, 0x6018, 0x6130, 0xa140, 0x2804,
++      0x7832, 0x8840, 0x2804, 0x7836, 0x8840, 0x2804, 0x7822, 0x8840,
++      0x2804, 0x7826, 0x8840, 0x7a02, 0x7000, 0x8000, 0x7002, 0x6018,
++      0xa802, 0xa08a, 0x0029, 0x1138, 0x6018, 0xa080, 0x0001, 0x2004,
++      0x601a, 0x2001, 0x000d, 0x6032, 0xa085, 0x0001, 0x0005, 0x00f6,
++      0x00e6, 0x00c6, 0x2071, 0xb74a, 0x2079, 0x0020, 0x7904, 0xd1fc,
++      0x01f0, 0x7803, 0x0002, 0x2d60, 0xa026, 0x7000, 0x0002, 0x36b7,
++      0x36a2, 0x36ae, 0x8001, 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001,
++      0x080c, 0x3667, 0x0160, 0x080c, 0x3667, 0x0048, 0x8001, 0x7002,
++      0x7804, 0xd0fc, 0x1d30, 0x2011, 0x0001, 0x080c, 0x3667, 0x00ce,
++      0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200,
++      0x2001, 0xb6c0, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0xb6bf,
++      0x2004, 0x60ce, 0x6004, 0xc0ac, 0xa085, 0x0200, 0x6006, 0x2001,
++      0x0074, 0x2004, 0xa005, 0x01f8, 0x2038, 0x2001, 0x0076, 0x2024,
++      0x2001, 0x0077, 0x201c, 0x080c, 0x3e33, 0x6833, 0x000d, 0x6f26,
++      0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007,
++      0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, 0x000d, 0x04b1, 0x1d90,
++      0x2d00, 0x681a, 0x0088, 0x080c, 0x3e33, 0x6833, 0x000d, 0x2070,
++      0x6827, 0x0001, 0x2d00, 0x681a, 0x2001, 0x0076, 0x2004, 0x2072,
++      0x2001, 0x0077, 0x2004, 0x7006, 0x2061, 0x0020, 0x2079, 0x0100,
++      0x2001, 0xb6bf, 0x2004, 0x6012, 0x20e1, 0x9040, 0x2001, 0x0072,
++      0x2004, 0xa084, 0xfff8, 0x700a, 0x601a, 0x0006, 0x2001, 0x0073,
++      0x2004, 0x700e, 0x601e, 0x78c6, 0x000e, 0x78ca, 0xa006, 0x603a,
++      0x603e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0010,
++      0x20a0, 0x2099, 0x0014, 0x7003, 0x0026, 0x7432, 0x7336, 0xa006,
++      0x703a, 0x703e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7122, 0x7003,
++      0x0041, 0x7004, 0xd0fc, 0x0de8, 0x7003, 0x0002, 0x7003, 0x0040,
++      0x53a5, 0x7430, 0x7334, 0x87ff, 0x0180, 0x00c6, 0x00d6, 0x2d60,
++      0x00c6, 0x080c, 0x3e33, 0x00ce, 0x6018, 0x2070, 0x2d00, 0x7006,
++      0x601a, 0x00de, 0x00ce, 0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6,
++      0x2001, 0x0075, 0x2004, 0xa005, 0x0508, 0x2038, 0x2001, 0x0078,
++      0x2024, 0x2001, 0x0079, 0x201c, 0x080c, 0x3e33, 0x2d60, 0x6833,
++      0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, 0x2138,
++      0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, 0x000d,
++      0x080c, 0x3725, 0x1d88, 0x2d00, 0x681a, 0x00e0, 0x080c, 0x3e33,
++      0x2d60, 0x6033, 0x000d, 0x2070, 0x6027, 0x0001, 0x2c00, 0x601a,
++      0x2001, 0x0078, 0x2004, 0x2072, 0x2001, 0x0079, 0x2004, 0x7006,
++      0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x700a, 0x2001, 0x0073,
++      0x2004, 0x700e, 0x2001, 0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac,
++      0x1178, 0x2001, 0x0101, 0x200c, 0xc1ed, 0x2102, 0x6027, 0x0000,
++      0x2001, 0xb723, 0x2003, 0x0003, 0x2001, 0x0030, 0x2003, 0x0009,
++      0x00ee, 0x0005, 0x0804, 0x2f6e, 0x0126, 0x2091, 0x8000, 0x20a9,
++      0x0012, 0x2001, 0xb440, 0x20a0, 0xa006, 0x40a4, 0x012e, 0x0804,
++      0x2f6e, 0x7d38, 0x7c3c, 0x0804, 0x3015, 0x080c, 0x3e33, 0x0904,
++      0x2f93, 0x080c, 0x5a90, 0x0110, 0x080c, 0x4baa, 0x2009, 0x001c,
++      0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e74, 0x701b, 0x37d9,
++      0x0005, 0xade8, 0x000d, 0x6800, 0xa005, 0x0904, 0x2f96, 0x6804,
++      0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x2f96, 0xd094, 0x00c6, 0x2061,
++      0x0100, 0x6104, 0x0138, 0x6200, 0xa292, 0x0005, 0x0218, 0xa18c,
++      0xffdf, 0x0010, 0xa18d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6,
++      0x2061, 0x0100, 0x6104, 0x0118, 0xa18d, 0x0010, 0x0010, 0xa18c,
++      0xffef, 0x6106, 0x00ce, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0002,
++      0x0268, 0xd084, 0x0158, 0x6a28, 0xa28a, 0x007f, 0x1a04, 0x2f96,
++      0xa288, 0x2d88, 0x210d, 0xa18c, 0x00ff, 0x615a, 0xd0dc, 0x0130,
++      0x6828, 0xa08a, 0x007f, 0x1a04, 0x2f96, 0x6052, 0x6808, 0xa08a,
++      0x0100, 0x0a04, 0x2f96, 0xa08a, 0x0841, 0x1a04, 0x2f96, 0xa084,
++      0x0007, 0x1904, 0x2f96, 0x680c, 0xa005, 0x0904, 0x2f96, 0x6810,
++      0xa005, 0x0904, 0x2f96, 0x6848, 0x6940, 0xa10a, 0x1a04, 0x2f96,
++      0x8001, 0x0904, 0x2f96, 0x684c, 0x6944, 0xa10a, 0x1a04, 0x2f96,
++      0x8001, 0x0904, 0x2f96, 0x6804, 0xd0fc, 0x0560, 0x080c, 0x3e33,
++      0x0904, 0x2f93, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
++      0xa290, 0x0038, 0xa399, 0x0000, 0x080c, 0x3e74, 0x701b, 0x3859,
++      0x0005, 0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, 0xb46e,
++      0x2da0, 0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xb472, 0x200c,
++      0xd1e4, 0x0140, 0x00c6, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00,
++      0x6006, 0x00ce, 0x2009, 0xb6b1, 0x200b, 0x0000, 0x2001, 0xb474,
++      0x2004, 0xd0ac, 0x0158, 0x7824, 0x200a, 0x2009, 0x017f, 0x200a,
++      0x3200, 0xa084, 0x003f, 0xa085, 0x3020, 0x2090, 0x20a9, 0x001c,
++      0x2d98, 0x2069, 0xb452, 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff,
++      0x6142, 0x8007, 0xa084, 0x00ff, 0x6046, 0x080c, 0x5d66, 0x080c,
++      0x532d, 0x080c, 0x5396, 0x6000, 0xa086, 0x0000, 0x1904, 0x3954,
++      0x6808, 0x602a, 0x080c, 0x2439, 0x0006, 0x2001, 0x0100, 0x2004,
++      0xa082, 0x0005, 0x000e, 0x0268, 0x2009, 0x0170, 0x200b, 0x0080,
++      0xe000, 0xe000, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x2868,
++      0x003e, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217,
++      0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148,
++      0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f,
++      0x0010, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007,
++      0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0xb6c6, 0x40a1,
++      0x080c, 0x6a2d, 0x6904, 0xd1fc, 0x0520, 0x00c6, 0x2009, 0x0000,
++      0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0,
++      0x3508, 0x8109, 0x080c, 0x631d, 0x6878, 0x6016, 0x6874, 0x2008,
++      0xa084, 0xff00, 0x8007, 0x600a, 0xa184, 0x00ff, 0x6006, 0x8108,
++      0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x38ee,
++      0x00ce, 0x2069, 0xb452, 0x2001, 0xb69e, 0x6a80, 0xa294, 0x0030,
++      0xa28e, 0x0000, 0x0170, 0xa28e, 0x0010, 0x0118, 0xa28e, 0x0020,
++      0x0140, 0x2003, 0xaaaa, 0x080c, 0x28b1, 0x2001, 0xb68f, 0x2102,
++      0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f,
++      0x0000, 0x00ce, 0x080c, 0x5a90, 0x0128, 0x080c, 0x408d, 0x0110,
++      0x080c, 0x282d, 0x60c8, 0xa005, 0x01d0, 0x6003, 0x0001, 0x2009,
++      0x393a, 0x00e0, 0x080c, 0x5a90, 0x1178, 0x2011, 0x5963, 0x080c,
++      0x6961, 0x2011, 0x5956, 0x080c, 0x6a21, 0x2001, 0xb69f, 0x2003,
++      0x0000, 0x080c, 0x59c8, 0x0040, 0x080c, 0x4ad9, 0x0028, 0x6003,
++      0x0004, 0x2009, 0x3954, 0x0010, 0x0804, 0x2f6e, 0x2001, 0x0100,
++      0x2004, 0xa082, 0x0005, 0x0258, 0x2001, 0x0170, 0x2004, 0xa084,
++      0x00ff, 0xa086, 0x004c, 0x1118, 0x2091, 0x309d, 0x0817, 0x2091,
++      0x301d, 0x0817, 0x6000, 0xa086, 0x0000, 0x0904, 0x2f93, 0x2069,
++      0xb452, 0x7830, 0x6842, 0x7834, 0x6846, 0x6804, 0xd0fc, 0x0118,
++      0x2009, 0x0030, 0x0010, 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28,
++      0x7c3c, 0x7d38, 0x0804, 0x3e77, 0xa006, 0x080c, 0x282d, 0x81ff,
++      0x1904, 0x2f93, 0x080c, 0x5a90, 0x1178, 0x2001, 0xb69f, 0x2003,
++      0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c,
++      0x5ad4, 0x080c, 0x59c8, 0x0020, 0x080c, 0x4baa, 0x080c, 0x4ad9,
++      0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x5a90, 0x1110,
++      0x0804, 0x2f93, 0x6188, 0x81ff, 0x0198, 0x703f, 0x0000, 0x2001,
++      0xbbc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x3e77, 0x701b, 0x2f6c, 0x012e, 0x0005,
++      0x703f, 0x0001, 0x00d6, 0x2069, 0xbbc0, 0x20a9, 0x0040, 0x20a1,
++      0xbbc0, 0x2019, 0xffff, 0x43a4, 0x6550, 0xa588, 0x2d88, 0x210d,
++      0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506,
++      0x01a8, 0x080c, 0x4f6a, 0x1190, 0x6014, 0x821c, 0x0238, 0xa398,
++      0xbbc0, 0xa085, 0xff00, 0x8007, 0x201a, 0x0038, 0xa398, 0xbbc0,
++      0x2324, 0xa4a4, 0xff00, 0xa405, 0x201a, 0x8210, 0x8108, 0xa182,
++      0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a,
++      0x00de, 0x20a9, 0x0040, 0x20a1, 0xbbc0, 0x2099, 0xbbc0, 0x080c,
++      0x4b49, 0x0804, 0x39af, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x00c6,
++      0x080c, 0x3e33, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x2f93,
++      0x2001, 0xb453, 0x2004, 0xd0b4, 0x0550, 0x7824, 0xa084, 0xff00,
++      0xa08e, 0x7e00, 0x0520, 0xa08e, 0x7f00, 0x0508, 0xa08e, 0x8000,
++      0x01f0, 0x6000, 0xd08c, 0x11d8, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x11a8, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c,
++      0x9d6b, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93, 0x7007, 0x0003,
++      0x701b, 0x3a3b, 0x0005, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x20a9,
++      0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004,
++      0xac80, 0x0006, 0x2098, 0xad80, 0x0006, 0x20a0, 0x080c, 0x4b49,
++      0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0,
++      0x080c, 0x4b49, 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c,
++      0x7d38, 0x0804, 0x3e77, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x3e48,
++      0x0904, 0x2f96, 0x080c, 0x5147, 0x0804, 0x2f6e, 0x81ff, 0x1904,
++      0x2f93, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x2f96, 0x080c, 0x3e58,
++      0x0904, 0x2f96, 0x080c, 0x51aa, 0x0904, 0x2f93, 0x2019, 0x0004,
++      0xa00e, 0x080c, 0x5159, 0x7924, 0x810f, 0x7a28, 0x0011, 0x0804,
++      0x2f6e, 0xa186, 0x00ff, 0x0110, 0x0071, 0x0060, 0x2029, 0x007e,
++      0x2061, 0xb400, 0x6450, 0x2400, 0xa506, 0x0110, 0x2508, 0x0019,
++      0x8529, 0x1ec8, 0x0005, 0x080c, 0x4f6a, 0x1138, 0x2200, 0x8003,
++      0x800b, 0x810b, 0xa108, 0x080c, 0x696d, 0x0005, 0x81ff, 0x1904,
++      0x2f93, 0x080c, 0x3e48, 0x0904, 0x2f96, 0x080c, 0x5030, 0x0904,
++      0x2f93, 0x080c, 0x5150, 0x0804, 0x2f6e, 0x81ff, 0x1904, 0x2f93,
++      0x080c, 0x3e48, 0x0904, 0x2f96, 0x080c, 0x5030, 0x0904, 0x2f93,
++      0x080c, 0x513e, 0x0804, 0x2f6e, 0x6100, 0x0804, 0x2f6e, 0x080c,
++      0x3e58, 0x0904, 0x2f96, 0x2001, 0xb400, 0x2004, 0xa086, 0x0003,
++      0x1904, 0x2f93, 0x00d6, 0xace8, 0x000a, 0x7924, 0xd184, 0x0110,
++      0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a,
++      0x6b04, 0x831f, 0x6a00, 0x8217, 0x00de, 0x6100, 0xa18c, 0x0200,
++      0x0804, 0x2f6e, 0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x1a04,
++      0x2f93, 0x6250, 0xa294, 0x00ff, 0xa084, 0xff00, 0x8007, 0xa206,
++      0x1150, 0x2001, 0xb440, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c,
++      0x7d38, 0x0804, 0x3e77, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x3e58,
++      0x0904, 0x2f96, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1904,
++      0x2f93, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x0904, 0x2f93, 0x6837,
++      0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x9d17, 0x0904, 0x2f93,
++      0x7007, 0x0003, 0x701b, 0x3b25, 0x0005, 0x6830, 0xa086, 0x0100,
++      0x0904, 0x2f93, 0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28,
++      0x7c3c, 0x7d38, 0x0804, 0x3e77, 0xa006, 0x080c, 0x282d, 0x7824,
++      0xa084, 0x00ff, 0xa086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x2f93,
++      0x080c, 0x5a90, 0x0110, 0x080c, 0x4baa, 0x7828, 0xa08a, 0x1000,
++      0x1a04, 0x2f96, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff,
++      0x0138, 0xa182, 0x007f, 0x1a04, 0x2f96, 0x2100, 0x080c, 0x27f7,
++      0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0xb6f3, 0x601b,
++      0x0000, 0x601f, 0x0000, 0x080c, 0x5a90, 0x1178, 0x2001, 0xb69f,
++      0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001,
++      0x080c, 0x5ad4, 0x080c, 0x59c8, 0x0420, 0x2011, 0x0003, 0x080c,
++      0x801f, 0x2011, 0x0002, 0x080c, 0x8029, 0x080c, 0x7f03, 0x0036,
++      0x2019, 0x0000, 0x080c, 0x7f8e, 0x003e, 0x2061, 0x0100, 0x2001,
++      0xb415, 0x2004, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043,
++      0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4b0e, 0x080c,
++      0x69e7, 0x7924, 0xa18c, 0xff00, 0x810f, 0x080c, 0x5a90, 0x1110,
++      0x2009, 0x00ff, 0x7a28, 0x080c, 0x3a89, 0x012e, 0x00ce, 0x002e,
++      0x0804, 0x2f6e, 0x7924, 0xa18c, 0xff00, 0x810f, 0x00c6, 0x080c,
++      0x4f0e, 0x2c08, 0x00ce, 0x1904, 0x2f96, 0x0804, 0x2f6e, 0x81ff,
++      0x0120, 0x2009, 0x0001, 0x0804, 0x2f93, 0x60d4, 0xd0ac, 0x1130,
++      0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x2f93, 0x080c, 0x3e33,
++      0x1120, 0x2009, 0x0002, 0x0804, 0x2f93, 0x7924, 0x7a2c, 0x7b28,
++      0x7c3c, 0x7d38, 0x080c, 0x3e74, 0x701b, 0x3bd7, 0x0005, 0x2009,
++      0x0080, 0x080c, 0x4f6a, 0x1130, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x0120, 0x2021, 0x400a, 0x0804, 0x2f70, 0x00d6, 0xade8,
++      0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820,
++      0xa0be, 0x0100, 0x0904, 0x3c4e, 0xa0be, 0x0112, 0x0904, 0x3c4e,
++      0xa0be, 0x0113, 0x0904, 0x3c4e, 0xa0be, 0x0114, 0x0904, 0x3c4e,
++      0xa0be, 0x0117, 0x0904, 0x3c4e, 0xa0be, 0x011a, 0x0904, 0x3c4e,
++      0xa0be, 0x011c, 0x0904, 0x3c4e, 0xa0be, 0x0121, 0x05b0, 0xa0be,
++      0x0131, 0x0598, 0xa0be, 0x0171, 0x05c8, 0xa0be, 0x0173, 0x05b0,
++      0xa0be, 0x01a1, 0x1120, 0x6830, 0x8007, 0x6832, 0x04a8, 0xa0be,
++      0x0212, 0x0540, 0xa0be, 0x0213, 0x0528, 0xa0be, 0x0214, 0x01b0,
++      0xa0be, 0x0217, 0x0168, 0xa0be, 0x021a, 0x1120, 0x6838, 0x8007,
++      0x683a, 0x00e0, 0xa0be, 0x0300, 0x01c8, 0x00de, 0x0804, 0x2f96,
++      0xad80, 0x0010, 0x20a9, 0x0007, 0x080c, 0x3c94, 0xad80, 0x000e,
++      0x20a9, 0x0001, 0x080c, 0x3c94, 0x0048, 0xad80, 0x000c, 0x080c,
++      0x3ca2, 0x0050, 0xad80, 0x000e, 0x080c, 0x3ca2, 0xad80, 0x000c,
++      0x20a9, 0x0001, 0x080c, 0x3c94, 0x00c6, 0x080c, 0x3e33, 0x0568,
++      0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, 0x6853, 0x0000, 0x684f,
++      0x0020, 0x685b, 0x0001, 0x810b, 0x697e, 0x6883, 0x0000, 0x6a86,
++      0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, 0x0000, 0x00ce, 0x00de,
++      0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804,
++      0x2068, 0x080c, 0x9d33, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93,
++      0x7007, 0x0003, 0x701b, 0x3c8b, 0x0005, 0x00ce, 0x00de, 0x2009,
++      0x0002, 0x0804, 0x2f93, 0x6820, 0xa086, 0x8001, 0x1904, 0x2f6e,
++      0x2009, 0x0004, 0x0804, 0x2f93, 0x0016, 0x2008, 0x2044, 0x8000,
++      0x204c, 0x8000, 0x290a, 0x8108, 0x280a, 0x8108, 0x1f04, 0x3c96,
++      0x001e, 0x0005, 0x0016, 0x00a6, 0x00b6, 0x2008, 0x2044, 0x8000,
++      0x204c, 0x8000, 0x2054, 0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a,
++      0x8108, 0x290a, 0x8108, 0x280a, 0x00be, 0x00ae, 0x001e, 0x0005,
++      0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2f93, 0x60d4, 0xd0ac,
++      0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x2f93, 0x7924,
++      0x2140, 0xa18c, 0xff00, 0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182,
++      0x0080, 0x0a04, 0x2f96, 0xa182, 0x00ff, 0x1a04, 0x2f96, 0x7a2c,
++      0x7b28, 0x6070, 0xa306, 0x1140, 0x6074, 0xa24e, 0x0904, 0x2f96,
++      0xa9cc, 0xff00, 0x0904, 0x2f96, 0x00c6, 0x080c, 0x3d81, 0x2c68,
++      0x00ce, 0x0538, 0xa0c6, 0x4000, 0x1180, 0x00c6, 0x0006, 0x2d60,
++      0x2009, 0x0000, 0x080c, 0x520b, 0x1108, 0xc185, 0x6000, 0xd0bc,
++      0x0108, 0xc18d, 0x000e, 0x00ce, 0x0088, 0xa0c6, 0x4007, 0x1110,
++      0x2408, 0x0060, 0xa0c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0030,
++      0xa0c6, 0x4009, 0x1108, 0x0010, 0x2001, 0x4006, 0x2020, 0x0804,
++      0x2f70, 0x2d00, 0x7022, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70,
++      0x080c, 0x856a, 0x05d8, 0x2d00, 0x601a, 0x080c, 0x9fb8, 0x2e58,
++      0x00ee, 0x00e6, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x2b70, 0x1150,
++      0x080c, 0x85c0, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x2009, 0x0002,
++      0x0804, 0x2f93, 0x6837, 0x0000, 0x683b, 0x0000, 0x2d00, 0x6012,
++      0x6833, 0x0000, 0x6838, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0x683a,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x2c60, 0x012e, 0x601f, 0x0001,
++      0x2001, 0x0000, 0x080c, 0x4eac, 0x2001, 0x0002, 0x080c, 0x4ebe,
++      0x2009, 0x0002, 0x080c, 0x85ef, 0xa085, 0x0001, 0x00ee, 0x00ce,
++      0x00be, 0x001e, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93, 0x7007,
++      0x0003, 0x701b, 0x3d64, 0x0005, 0x6830, 0xa086, 0x0100, 0x7020,
++      0x2060, 0x1138, 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0804,
++      0x2f93, 0x2009, 0x0000, 0x6838, 0xd0f4, 0x1904, 0x2f6e, 0x080c,
++      0x520b, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x0804,
++      0x2f6e, 0x00e6, 0x00d6, 0x2029, 0x0000, 0x2001, 0xb435, 0x2004,
++      0xd0ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071, 0xb535,
++      0x0030, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, 0xb5b5, 0x2e04,
++      0xa005, 0x1130, 0x2100, 0xa406, 0x1570, 0x2428, 0xc5fd, 0x0458,
++      0x2068, 0x6f10, 0x2700, 0xa306, 0x11b0, 0x6e14, 0x2600, 0xa206,
++      0x1190, 0x2400, 0xa106, 0x1160, 0x2d60, 0xd884, 0x0568, 0x6004,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x1538, 0x2001, 0x4000, 0x0428,
++      0x2001, 0x4007, 0x0410, 0x2400, 0xa106, 0x1168, 0x6e14, 0x87ff,
++      0x1138, 0x86ff, 0x09d0, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x19a8,
++      0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x3d97, 0x85ff,
++      0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c,
++      0x4f0e, 0x1dd0, 0x6312, 0x6216, 0xa006, 0xa005, 0x00de, 0x00ee,
++      0x0005, 0x81ff, 0x1904, 0x2f93, 0x080c, 0x3e33, 0x0904, 0x2f93,
++      0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7824, 0xa005, 0x0904,
++      0x2f96, 0xa096, 0x00ff, 0x0120, 0xa092, 0x0004, 0x1a04, 0x2f96,
++      0x2010, 0x2d18, 0x080c, 0x2c13, 0x0904, 0x2f93, 0x7007, 0x0003,
++      0x701b, 0x3e03, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x2f93,
++      0x0804, 0x2f6e, 0x7924, 0xa18c, 0xff00, 0x810f, 0x60d4, 0xd0ac,
++      0x1120, 0xa182, 0x0080, 0x0a04, 0x2f96, 0xa182, 0x00ff, 0x1a04,
++      0x2f96, 0x0126, 0x2091, 0x8000, 0x080c, 0x9c1b, 0x1188, 0xa190,
++      0xb535, 0x2204, 0xa065, 0x0160, 0x080c, 0x4bc5, 0x2001, 0xb435,
++      0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, 0x012e, 0x0804, 0x2f6e,
++      0x012e, 0x0804, 0x2f93, 0x080c, 0x15f4, 0x0188, 0xa006, 0x6802,
++      0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, 0x7016, 0x0030, 0x7014,
++      0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, 0x000d, 0x0005,
++      0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x4f6a, 0x1130, 0x7e28,
++      0xa684, 0x3fff, 0xa082, 0x4000, 0x0208, 0xa066, 0x8cff, 0x0005,
++      0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c, 0x4f6a, 0x1128, 0xa6b4,
++      0x00ff, 0xa682, 0x4000, 0x0208, 0xa066, 0x8cff, 0x0005, 0x0016,
++      0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, 0x080c, 0x160b, 0x0cc8,
++      0x7112, 0x7116, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031,
++      0x0000, 0x2061, 0xb4d2, 0x6606, 0x6112, 0x600e, 0x6226, 0x632a,
++      0x642e, 0x6532, 0x2c10, 0x080c, 0x163f, 0x7007, 0x0002, 0x701b,
++      0x2f6e, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000,
++      0x2001, 0xb490, 0x2004, 0xa005, 0x1168, 0x0e04, 0x3ea2, 0x7818,
++      0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a, 0x781b, 0x0001, 0x2091,
++      0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6, 0x2071, 0xb482, 0x7138,
++      0xa182, 0x0010, 0x0218, 0x7030, 0x2060, 0x0078, 0x7030, 0xa0e0,
++      0x0004, 0xac82, 0xb4d2, 0x0210, 0x2061, 0xb492, 0x2c00, 0x7032,
++      0x81ff, 0x1108, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a,
++      0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, 0x0005, 0x00e6, 0x2071,
++      0xb482, 0x7038, 0xa005, 0x0570, 0x0126, 0x2091, 0x8000, 0x0e04,
++      0x3ef9, 0x00f6, 0x2079, 0x0000, 0x7818, 0xd084, 0x1508, 0x00c6,
++      0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826, 0x6008, 0x782a,
++      0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a, 0xa005,
++      0x1130, 0x7033, 0xb492, 0x7037, 0xb492, 0x00ce, 0x0048, 0xac80,
++      0x0004, 0xa0fa, 0xb4d2, 0x0210, 0x2001, 0xb492, 0x7036, 0x00ce,
++      0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, 0x2001, 0xb453, 0x2004,
++      0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x3e8a, 0x002e, 0x0005,
++      0x81ff, 0x1904, 0x2f93, 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d,
++      0xc085, 0xc0ac, 0x6032, 0x080c, 0x5a90, 0x1178, 0x2001, 0xb69f,
++      0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001,
++      0x080c, 0x5ad4, 0x080c, 0x59c8, 0x0010, 0x080c, 0x4ad9, 0x012e,
++      0x0804, 0x2f6e, 0x7824, 0x2008, 0xa18c, 0xfffd, 0x1128, 0x61e0,
++      0xa10d, 0x61e2, 0x0804, 0x2f6e, 0x0804, 0x2f96, 0x81ff, 0x1904,
++      0x2f93, 0x6000, 0xa086, 0x0003, 0x1904, 0x2f93, 0x2001, 0xb453,
++      0x2004, 0xd0ac, 0x1904, 0x2f93, 0x080c, 0x3e58, 0x0904, 0x2f96,
++      0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1120, 0x7828, 0xa005,
++      0x0904, 0x2f6e, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x0904, 0x2f93,
++      0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c,
++      0x9dfc, 0x0904, 0x2f93, 0x7007, 0x0003, 0x701b, 0x3f68, 0x0005,
++      0x6830, 0xa086, 0x0100, 0x0904, 0x2f93, 0x0804, 0x2f6e, 0x2001,
++      0xb400, 0x2004, 0xa086, 0x0003, 0x1904, 0x2f93, 0x7f24, 0x7a2c,
++      0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e33, 0x0904, 0x2f93, 0x2009,
++      0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80,
++      0x0005, 0x7026, 0x20a0, 0x080c, 0x4f6a, 0x1904, 0x3fe2, 0x6004,
++      0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0130, 0xa0c4, 0xff00, 0xa8c6,
++      0x0600, 0x1904, 0x3fe2, 0x2001, 0xb453, 0x2004, 0xd0ac, 0x1128,
++      0x080c, 0x520b, 0x1110, 0xd79c, 0x05e8, 0xd794, 0x1110, 0xd784,
++      0x0158, 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3,
++      0x080c, 0x3ca2, 0xd794, 0x0148, 0xac80, 0x000a, 0x2098, 0x3400,
++      0x20a9, 0x0004, 0x53a3, 0x080c, 0x3ca2, 0x21a2, 0xd794, 0x01d8,
++      0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, 0x53a3, 0xac80,
++      0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, 0x3400, 0x20a9,
++      0x0002, 0x53a3, 0x080c, 0x3c94, 0xac80, 0x0026, 0x2098, 0x20a9,
++      0x0002, 0x53a3, 0x0008, 0x94a0, 0xd794, 0x0110, 0xa6b0, 0x000b,
++      0xa6b0, 0x0005, 0x8108, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x0118,
++      0xa186, 0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, 0x0100, 0x0170,
++      0x0018, 0xa186, 0x007e, 0x0150, 0xd794, 0x0118, 0xa686, 0x0020,
++      0x0010, 0xa686, 0x0028, 0x0150, 0x0804, 0x3f8b, 0x86ff, 0x1120,
++      0x7120, 0x810b, 0x0804, 0x2f6e, 0x702f, 0x0001, 0x711e, 0x7020,
++      0xa600, 0x7022, 0x772a, 0x2061, 0xb4d2, 0x6007, 0x0000, 0x6612,
++      0x7024, 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c,
++      0x163f, 0x7007, 0x0002, 0x701b, 0x401e, 0x0005, 0x702c, 0xa005,
++      0x1170, 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061,
++      0xb4d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x3f8b, 0x7120,
++      0x810b, 0x0804, 0x2f6e, 0x2029, 0x007e, 0x7924, 0x7a28, 0x7b2c,
++      0x7c38, 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2f96,
++      0xa502, 0x0a04, 0x2f96, 0xa184, 0x00ff, 0xa0e2, 0x0020, 0x0a04,
++      0x2f96, 0xa502, 0x0a04, 0x2f96, 0xa284, 0xff00, 0x8007, 0xa0e2,
++      0x0020, 0x0a04, 0x2f96, 0xa502, 0x0a04, 0x2f96, 0xa284, 0x00ff,
++      0xa0e2, 0x0020, 0x0a04, 0x2f96, 0xa502, 0x0a04, 0x2f96, 0xa384,
++      0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2f96, 0xa502, 0x0a04,
++      0x2f96, 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x2f96, 0xa502,
++      0x0a04, 0x2f96, 0xa484, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04,
++      0x2f96, 0xa502, 0x0a04, 0x2f96, 0xa484, 0x00ff, 0xa0e2, 0x0020,
++      0x0a04, 0x2f96, 0xa502, 0x0a04, 0x2f96, 0x2061, 0xb6b9, 0x6102,
++      0x6206, 0x630a, 0x640e, 0x0804, 0x2f6e, 0x0006, 0x2001, 0xb453,
++      0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x2001, 0xb472, 0x2004,
++      0xd0bc, 0x000e, 0x0005, 0x6168, 0x7a24, 0x6300, 0x82ff, 0x1118,
++      0x7926, 0x0804, 0x2f6e, 0x83ff, 0x1904, 0x2f96, 0x2001, 0xfff0,
++      0xa200, 0x1a04, 0x2f96, 0x2019, 0xffff, 0x606c, 0xa302, 0xa200,
++      0x0a04, 0x2f96, 0x7926, 0x626a, 0x0804, 0x2f6e, 0x2001, 0xb400,
++      0x2004, 0xa086, 0x0003, 0x1904, 0x2f93, 0x7c28, 0x7d24, 0x7e38,
++      0x7f2c, 0x080c, 0x3e33, 0x0904, 0x2f93, 0x2009, 0x0000, 0x2019,
++      0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80, 0x0003, 0x7026,
++      0x20a0, 0xa1e0, 0xb535, 0x2c64, 0x8cff, 0x01b8, 0x6004, 0xa084,
++      0x00ff, 0xa086, 0x0006, 0x0130, 0x6004, 0xa084, 0xff00, 0xa086,
++      0x0600, 0x1158, 0x6014, 0x20a2, 0x94a0, 0x6010, 0x8007, 0xa105,
++      0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, 0xa182, 0x00ff,
++      0x0120, 0xa386, 0x002a, 0x0148, 0x08e0, 0x83ff, 0x1120, 0x7120,
++      0x810c, 0x0804, 0x2f6e, 0x702f, 0x0001, 0x711e, 0x7020, 0xa300,
++      0x7022, 0x2061, 0xb4d2, 0x6007, 0x0000, 0x6312, 0x7024, 0x600e,
++      0x6426, 0x652a, 0x662e, 0x6732, 0x2c10, 0x080c, 0x163f, 0x7007,
++      0x0002, 0x701b, 0x4114, 0x0005, 0x702c, 0xa005, 0x1168, 0x711c,
++      0x7024, 0x20a0, 0x2019, 0x0000, 0x2061, 0xb4d2, 0x6424, 0x6528,
++      0x662c, 0x6730, 0x0804, 0x40d1, 0x7120, 0x810c, 0x0804, 0x2f6e,
++      0x81ff, 0x1904, 0x2f93, 0x60d4, 0xd0ac, 0x1118, 0xd09c, 0x0904,
++      0x2f93, 0x080c, 0x3e33, 0x0904, 0x2f93, 0x7924, 0x7a2c, 0x7b28,
++      0x7c3c, 0x7d38, 0x080c, 0x3e74, 0x701b, 0x413f, 0x0005, 0x00d6,
++      0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, 0x0148, 0xa0be, 0x7100,
++      0x0130, 0xa0be, 0x7200, 0x0118, 0x00de, 0x0804, 0x2f96, 0x6820,
++      0x6924, 0x080c, 0x27e3, 0x1510, 0x080c, 0x4f0e, 0x11f8, 0x7122,
++      0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c, 0x3e33, 0x01b8, 0x080c,
++      0x3e33, 0x01a0, 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd,
++      0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, 0x9d4f, 0x0904,
++      0x2f93, 0x7007, 0x0003, 0x701b, 0x4179, 0x0005, 0x00de, 0x0804,
++      0x2f93, 0x7120, 0x080c, 0x2d5b, 0x6820, 0xa086, 0x8001, 0x0904,
++      0x2f93, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, 0x0006, 0x20a9,
++      0x002a, 0x2098, 0x20a0, 0x080c, 0x4b49, 0x000e, 0xade8, 0x000d,
++      0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xb4d2, 0x6007, 0x0000,
++      0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x1108, 0x0018, 0xa7c6, 0x7100,
++      0x1140, 0xa6c2, 0x0004, 0x0a04, 0x2f96, 0x2009, 0x0004, 0x0804,
++      0x3e77, 0xa7c6, 0x7200, 0x1904, 0x2f96, 0xa6c2, 0x0054, 0x0a04,
++      0x2f96, 0x600e, 0x6013, 0x002a, 0x6226, 0x632a, 0x642e, 0x6532,
++      0x2c10, 0x080c, 0x163f, 0x7007, 0x0002, 0x701b, 0x41c0, 0x0005,
++      0x701c, 0x2068, 0x6804, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002,
++      0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x4b49, 0x000e,
++      0x2009, 0x002a, 0x2061, 0xb4d2, 0x6224, 0x6328, 0x642c, 0x6530,
++      0x0804, 0x3e77, 0x81ff, 0x1904, 0x2f93, 0x792c, 0x2001, 0xb6a0,
++      0x2102, 0x080c, 0x3e48, 0x0904, 0x2f96, 0x080c, 0x5030, 0x0904,
++      0x2f93, 0x0126, 0x2091, 0x8000, 0x080c, 0x5162, 0x012e, 0x0804,
++      0x2f6e, 0x7824, 0xd08c, 0x1118, 0xd084, 0x0904, 0x3a03, 0x080c,
++      0x3e58, 0x0904, 0x2f96, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x1120,
++      0x2009, 0x0002, 0x0804, 0x2f93, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x0128, 0xa08e, 0x0004, 0x0110, 0xa08e, 0x0005, 0x15b8,
++      0x7824, 0xd08c, 0x0120, 0x6000, 0xc08c, 0x6002, 0x0030, 0x2001,
++      0xb453, 0x2004, 0xd0b4, 0x0904, 0x3a3f, 0x7824, 0xa084, 0xff00,
++      0xa08e, 0x7e00, 0x0904, 0x3a3f, 0xa08e, 0x7f00, 0x0904, 0x3a3f,
++      0xa08e, 0x8000, 0x0904, 0x3a3f, 0x6000, 0xd08c, 0x1904, 0x3a3f,
++      0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x9d6b, 0x1120,
++      0x2009, 0x0003, 0x0804, 0x2f93, 0x7007, 0x0003, 0x701b, 0x4241,
++      0x0005, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x0804, 0x3a3f, 0x2009,
++      0xb431, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2f93,
++      0x2001, 0xb400, 0x2004, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007,
++      0x0804, 0x2f93, 0x2001, 0xb453, 0x2004, 0xd0ac, 0x0120, 0x2009,
++      0x0008, 0x0804, 0x2f93, 0x609c, 0xd0a4, 0x1118, 0xd0ac, 0x1904,
++      0x3a3f, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a,
++      0x080c, 0x9dfc, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93, 0x7007,
++      0x0003, 0x701b, 0x427c, 0x0005, 0x6830, 0xa086, 0x0100, 0x1120,
++      0x2009, 0x0004, 0x0804, 0x2f93, 0x080c, 0x3e58, 0x0904, 0x2f96,
++      0x0804, 0x4210, 0x81ff, 0x2009, 0x0001, 0x1904, 0x2f93, 0x6000,
++      0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x2f93, 0x2001, 0xb453,
++      0x2004, 0xd0ac, 0x2009, 0x0008, 0x1904, 0x2f93, 0x080c, 0x3e58,
++      0x0904, 0x2f96, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009,
++      0x0009, 0x1904, 0x2f93, 0x00c6, 0x080c, 0x3e33, 0x00ce, 0x2009,
++      0x0002, 0x0904, 0x2f93, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838,
++      0xc0fd, 0x683a, 0x7928, 0xa194, 0xff00, 0xa18c, 0x00ff, 0xa006,
++      0x82ff, 0x1128, 0xc0ed, 0x6952, 0x792c, 0x6956, 0x0048, 0xa28e,
++      0x0100, 0x1904, 0x2f96, 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000,
++      0x683e, 0x080c, 0x9fb9, 0x2009, 0x0003, 0x0904, 0x2f93, 0x7007,
++      0x0003, 0x701b, 0x42dc, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009,
++      0x0004, 0x0904, 0x2f93, 0x0804, 0x2f6e, 0x81ff, 0x2009, 0x0001,
++      0x1904, 0x2f93, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904,
++      0x2f93, 0x080c, 0x3e58, 0x0904, 0x2f96, 0x6004, 0xa084, 0x00ff,
++      0xa086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2f93, 0x00c6, 0x080c,
++      0x3e33, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2f93, 0xad80, 0x000f,
++      0x2009, 0x0008, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e74,
++      0x701b, 0x4313, 0x0005, 0x00d6, 0xade8, 0x000f, 0x6800, 0xa086,
++      0x0500, 0x1140, 0x6804, 0xa005, 0x1128, 0x6808, 0xa084, 0xff00,
++      0x1108, 0x0018, 0x00de, 0x1904, 0x2f96, 0x00de, 0x6837, 0x0000,
++      0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x00c6, 0x080c, 0x3e58,
++      0x1118, 0x00ce, 0x0804, 0x2f96, 0x080c, 0xa008, 0x2009, 0x0003,
++      0x00ce, 0x0904, 0x2f93, 0x7007, 0x0003, 0x701b, 0x4340, 0x0005,
++      0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, 0x2f93, 0x0804,
++      0x2f6e, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2f93, 0x6000,
++      0xa086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804, 0x2f93, 0x7e24,
++      0x860f, 0xa18c, 0x00ff, 0xa6b4, 0x00ff, 0x080c, 0x4f6a, 0x1904,
++      0x2f96, 0xa186, 0x007f, 0x0150, 0x6004, 0xa084, 0x00ff, 0xa086,
++      0x0006, 0x0120, 0x2009, 0x0009, 0x0804, 0x2f93, 0x00c6, 0x080c,
++      0x3e33, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x2f93, 0x6837,
++      0x0000, 0x6838, 0xc0fd, 0x683a, 0x2001, 0x0100, 0x8007, 0x680a,
++      0x080c, 0x9d86, 0x1120, 0x2009, 0x0003, 0x0804, 0x2f93, 0x7007,
++      0x0003, 0x701b, 0x438c, 0x0005, 0x6808, 0x8007, 0xa086, 0x0100,
++      0x1120, 0x2009, 0x0004, 0x0804, 0x2f93, 0x68b0, 0x6836, 0x6810,
++      0x8007, 0xa084, 0x00ff, 0x800c, 0x6814, 0x8007, 0xa084, 0x00ff,
++      0x8004, 0xa080, 0x0002, 0xa108, 0xad80, 0x0004, 0x7a2c, 0x7b28,
++      0x7c3c, 0x7d38, 0x0804, 0x3e77, 0x080c, 0x3e33, 0x1120, 0x2009,
++      0x0002, 0x0804, 0x2f93, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff,
++      0x8217, 0x82ff, 0x0110, 0x0804, 0x2f96, 0x2009, 0x001a, 0x7a2c,
++      0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e74, 0x701b, 0x43c8, 0x0005,
++      0xad80, 0x000d, 0x2098, 0x20a9, 0x001a, 0x20a1, 0xb6c6, 0x53a3,
++      0x0804, 0x2f6e, 0x080c, 0x3e33, 0x1120, 0x2009, 0x0002, 0x0804,
++      0x2f93, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff,
++      0x0110, 0x0804, 0x2f96, 0x2099, 0xb6c6, 0x20a0, 0x20a9, 0x001a,
++      0x53a3, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804,
++      0x3e77, 0x7824, 0xa08a, 0x1000, 0x1a04, 0x2f96, 0x0126, 0x2091,
++      0x8000, 0x8003, 0x800b, 0x810b, 0xa108, 0x00c6, 0x2061, 0xb6f3,
++      0x6142, 0x00ce, 0x012e, 0x0804, 0x2f6e, 0x00c6, 0x080c, 0x5a90,
++      0x1188, 0x2001, 0xb69f, 0x2003, 0x0001, 0x2001, 0xb400, 0x2003,
++      0x0001, 0xa085, 0x0001, 0x080c, 0x5ad4, 0x080c, 0x59c8, 0x080c,
++      0x1511, 0x0038, 0x2061, 0xb400, 0x6030, 0xc09d, 0x6032, 0x080c,
++      0x4ad9, 0x00ce, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061,
++      0xb6f3, 0x7924, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009,
++      0x7838, 0x606a, 0x783c, 0x6066, 0x7828, 0x6062, 0x782c, 0x605e,
++      0x2061, 0xb6a1, 0x2001, 0xb708, 0x600e, 0x6013, 0x0001, 0x6017,
++      0x0002, 0x6007, 0x0000, 0x6037, 0x0000, 0x00ce, 0x012e, 0x0804,
++      0x2f6e, 0x0126, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb400,
++      0x6044, 0xd0a4, 0x11b0, 0xd084, 0x0118, 0x080c, 0x45c0, 0x0068,
++      0xd08c, 0x0118, 0x080c, 0x44e1, 0x0040, 0xd094, 0x0118, 0x080c,
++      0x44b2, 0x0018, 0xd09c, 0x0108, 0x0061, 0x00ee, 0x00ce, 0x012e,
++      0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e,
++      0x0ca0, 0x624c, 0xa286, 0xf0f0, 0x1150, 0x6048, 0xa086, 0xf0f0,
++      0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0xa294,
++      0xff00, 0xa296, 0xf700, 0x0178, 0x7134, 0xd1a4, 0x1160, 0x6240,
++      0xa295, 0x0100, 0x6242, 0xa294, 0x0010, 0x0128, 0x2009, 0x00f7,
++      0x080c, 0x4b69, 0x00f0, 0x6040, 0xa084, 0x0010, 0xa085, 0x0140,
++      0x6042, 0x6043, 0x0000, 0x707b, 0x0000, 0x7097, 0x0001, 0x70bb,
++      0x0000, 0x70d7, 0x0000, 0x2009, 0xbbc0, 0x200b, 0x0000, 0x708b,
++      0x0000, 0x707f, 0x000a, 0x2009, 0x000a, 0x2011, 0x4a8f, 0x080c,
++      0x69e7, 0x0005, 0x0156, 0x2001, 0xb474, 0x2004, 0xd08c, 0x0110,
++      0x7053, 0xffff, 0x707c, 0xa005, 0x1510, 0x2011, 0x4a8f, 0x080c,
++      0x6961, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9,
++      0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x44c9, 0x6242, 0x708f,
++      0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042, 0x6242,
++      0x0030, 0x6242, 0x708f, 0x0000, 0x7083, 0x0000, 0x0000, 0x015e,
++      0x0005, 0x7080, 0xa08a, 0x0003, 0x1210, 0x0023, 0x0010, 0x080c,
++      0x1511, 0x0005, 0x44ed, 0x453d, 0x45bf, 0x00f6, 0x7083, 0x0001,
++      0x20e1, 0xa000, 0xe000, 0x20e1, 0x8700, 0x080c, 0x2439, 0x20e1,
++      0x9080, 0x20e1, 0x4000, 0x2079, 0xba00, 0x207b, 0x2200, 0x7807,
++      0x00ef, 0x780b, 0x0000, 0x780f, 0x00ef, 0x7813, 0x0138, 0x7817,
++      0x0000, 0x781b, 0x0000, 0x781f, 0x0000, 0x7823, 0xffff, 0x7827,
++      0xffff, 0x782b, 0x0000, 0x782f, 0x0000, 0x2079, 0xba0c, 0x207b,
++      0x1101, 0x7807, 0x0000, 0x2099, 0xb405, 0x20a1, 0xba0e, 0x20a9,
++      0x0004, 0x53a3, 0x2079, 0xba12, 0x207b, 0x0000, 0x7807, 0x0000,
++      0x2099, 0xba00, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3,
++      0x000c, 0x600f, 0x0000, 0x080c, 0x4ac0, 0x00fe, 0x7087, 0x0000,
++      0x6043, 0x0008, 0x6043, 0x0000, 0x0005, 0x00d6, 0x7084, 0x7087,
++      0x0000, 0xa025, 0x0904, 0x45a7, 0x6020, 0xd0b4, 0x1904, 0x45a5,
++      0x7194, 0x81ff, 0x0904, 0x4595, 0xa486, 0x000c, 0x1904, 0x45a0,
++      0xa480, 0x0018, 0x8004, 0x20a8, 0x2011, 0xba80, 0x2019, 0xba00,
++      0x220c, 0x2304, 0xa106, 0x11b8, 0x8210, 0x8318, 0x1f04, 0x4558,
++      0x6043, 0x0004, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006,
++      0x7083, 0x0002, 0x708f, 0x0002, 0x2009, 0x07d0, 0x2011, 0x4a96,
++      0x080c, 0x69e7, 0x0490, 0x2069, 0xba80, 0x6930, 0xa18e, 0x1101,
++      0x1538, 0x6834, 0xa005, 0x1520, 0x6900, 0xa18c, 0x00ff, 0x1118,
++      0x6804, 0xa005, 0x0190, 0x2011, 0xba8e, 0x2019, 0xb405, 0x20a9,
++      0x0004, 0x220c, 0x2304, 0xa102, 0x0230, 0x1190, 0x8210, 0x8318,
++      0x1f04, 0x4589, 0x0068, 0x7097, 0x0000, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x2099, 0xba80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6,
++      0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00de, 0x0005, 0x6040,
++      0xa085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x60c3, 0x000c,
++      0x2011, 0xb6ea, 0x2013, 0x0000, 0x7087, 0x0000, 0x20e1, 0x9080,
++      0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x7d1b, 0x0c30, 0x0005,
++      0x708c, 0xa08a, 0x001d, 0x1210, 0x0023, 0x0010, 0x080c, 0x1511,
++      0x0005, 0x45f3, 0x4602, 0x462a, 0x4643, 0x4667, 0x468f, 0x46b3,
++      0x46e4, 0x4708, 0x4730, 0x4767, 0x478f, 0x47ab, 0x47c1, 0x47e1,
++      0x47f4, 0x47fc, 0x482c, 0x4850, 0x4878, 0x489c, 0x48cd, 0x490a,
++      0x4939, 0x4955, 0x4994, 0x49b4, 0x49cd, 0x49ce, 0x00c6, 0x2061,
++      0xb400, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9,
++      0x6006, 0x00ce, 0x0005, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043,
++      0x0002, 0x708f, 0x0001, 0x2009, 0x07d0, 0x2011, 0x4a96, 0x080c,
++      0x69e7, 0x0005, 0x00f6, 0x7084, 0xa086, 0x0014, 0x1508, 0x6043,
++      0x0000, 0x6020, 0xd0b4, 0x11e0, 0x2079, 0xba80, 0x7a30, 0xa296,
++      0x1102, 0x11a0, 0x7834, 0xa005, 0x1188, 0x7a38, 0xd2fc, 0x0128,
++      0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x2011, 0x4a96, 0x080c,
++      0x6961, 0x708f, 0x0010, 0x080c, 0x47fc, 0x0010, 0x080c, 0x4ad9,
++      0x00fe, 0x0005, 0x708f, 0x0003, 0x6043, 0x0004, 0x2011, 0x4a96,
++      0x080c, 0x6961, 0x080c, 0x4b51, 0x20a3, 0x1102, 0x20a3, 0x0000,
++      0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x463a, 0x60c3, 0x0014,
++      0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011,
++      0x4a96, 0x080c, 0x6961, 0xa086, 0x0014, 0x11a8, 0x2079, 0xba80,
++      0x7a30, 0xa296, 0x1102, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38,
++      0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f,
++      0x0004, 0x0029, 0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f,
++      0x0005, 0x080c, 0x4b51, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430,
++      0x2011, 0xba8e, 0x080c, 0x4ba2, 0x1160, 0x7078, 0xa005, 0x1148,
++      0x7150, 0xa186, 0xffff, 0x0128, 0x080c, 0x4a5a, 0x0110, 0x080c,
++      0x4b80, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0005, 0x00f6,
++      0x7084, 0xa005, 0x01f0, 0x2011, 0x4a96, 0x080c, 0x6961, 0xa086,
++      0x0014, 0x11a8, 0x2079, 0xba80, 0x7a30, 0xa296, 0x1103, 0x1178,
++      0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005,
++      0x1110, 0x70bb, 0x0001, 0x708f, 0x0006, 0x0029, 0x0010, 0x080c,
++      0x4ad9, 0x00fe, 0x0005, 0x708f, 0x0007, 0x080c, 0x4b51, 0x20a3,
++      0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xba8e, 0x080c, 0x4ba2,
++      0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, 0xa186, 0xffff, 0x0170,
++      0xa180, 0x2d88, 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4a5a,
++      0x0128, 0x080c, 0x4094, 0x0110, 0x080c, 0x282d, 0x20a9, 0x0008,
++      0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++      0x0014, 0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0,
++      0x2011, 0x4a96, 0x080c, 0x6961, 0xa086, 0x0014, 0x11a8, 0x2079,
++      0xba80, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, 0x1160,
++      0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001,
++      0x708f, 0x0008, 0x0029, 0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005,
++      0x708f, 0x0009, 0x080c, 0x4b51, 0x20a3, 0x1105, 0x20a3, 0x0100,
++      0x3430, 0x080c, 0x4ba2, 0x1150, 0x7078, 0xa005, 0x1138, 0x080c,
++      0x49cf, 0x1170, 0xa085, 0x0001, 0x080c, 0x282d, 0x20a9, 0x0008,
++      0x2099, 0xba8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0010, 0x080c, 0x45e6, 0x0005,
++      0x00f6, 0x7084, 0xa005, 0x0588, 0x2011, 0x4a96, 0x080c, 0x6961,
++      0xa086, 0x0014, 0x1540, 0x2079, 0xba80, 0x7a30, 0xa296, 0x1105,
++      0x1510, 0x7834, 0x2011, 0x0100, 0xa21e, 0x1160, 0x7a38, 0xd2fc,
++      0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x000a,
++      0x00b1, 0x0098, 0xa005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70b8,
++      0xa005, 0x1110, 0x70bb, 0x0001, 0x708b, 0x0000, 0x708f, 0x000e,
++      0x080c, 0x47e1, 0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f,
++      0x000b, 0x2011, 0xba0e, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff,
++      0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000, 0x41a4, 0x080c, 0x4b51,
++      0x20a3, 0x1106, 0x20a3, 0x0000, 0x080c, 0x4ba2, 0x0118, 0x2013,
++      0x0000, 0x0020, 0x7054, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9,
++      0x0042, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4ac0, 0x0005, 0x00f6,
++      0x7084, 0xa005, 0x01b0, 0x2011, 0x4a96, 0x080c, 0x6961, 0xa086,
++      0x0084, 0x1168, 0x2079, 0xba80, 0x7a30, 0xa296, 0x1106, 0x1138,
++      0x7834, 0xa005, 0x1120, 0x708f, 0x000c, 0x0029, 0x0010, 0x080c,
++      0x4ad9, 0x00fe, 0x0005, 0x708f, 0x000d, 0x080c, 0x4b51, 0x20a3,
++      0x1107, 0x20a3, 0x0000, 0x2099, 0xba8e, 0x20a9, 0x0040, 0x53a6,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x080c, 0x4ac0,
++      0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011, 0x4a96, 0x080c,
++      0x6961, 0xa086, 0x0084, 0x1188, 0x2079, 0xba80, 0x7a30, 0xa296,
++      0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x708b, 0x0001, 0x080c,
++      0x4b43, 0x708f, 0x000e, 0x0029, 0x0010, 0x080c, 0x4ad9, 0x00fe,
++      0x0005, 0x708f, 0x000f, 0x7087, 0x0000, 0x608b, 0xbc85, 0x608f,
++      0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011,
++      0x4a96, 0x080c, 0x6955, 0x0005, 0x7084, 0xa005, 0x0120, 0x2011,
++      0x4a96, 0x080c, 0x6961, 0x0005, 0x708f, 0x0011, 0x080c, 0x4ba2,
++      0x11a0, 0x7170, 0x81ff, 0x0188, 0x2009, 0x0000, 0x7074, 0xa084,
++      0x00ff, 0x080c, 0x27e3, 0xa186, 0x007e, 0x0138, 0xa186, 0x0080,
++      0x0120, 0x2011, 0xba8e, 0x080c, 0x4a5a, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x2099, 0xba80, 0x20a1, 0x020b, 0x7484, 0xa480, 0x0018,
++      0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3,
++      0x0014, 0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0,
++      0x2011, 0x4a96, 0x080c, 0x6961, 0xa086, 0x0014, 0x11a8, 0x2079,
++      0xba80, 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834, 0xa005, 0x1160,
++      0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001,
++      0x708f, 0x0012, 0x0029, 0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005,
++      0x708f, 0x0013, 0x080c, 0x4b5d, 0x20a3, 0x1103, 0x20a3, 0x0000,
++      0x3430, 0x2011, 0xba8e, 0x080c, 0x4ba2, 0x1160, 0x7078, 0xa005,
++      0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, 0x4a5a, 0x0110,
++      0x080c, 0x4b80, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0005,
++      0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4a96, 0x080c, 0x6961,
++      0xa086, 0x0014, 0x11a8, 0x2079, 0xba80, 0x7a30, 0xa296, 0x1104,
++      0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8,
++      0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0014, 0x0029, 0x0010,
++      0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f, 0x0015, 0x080c, 0x4b5d,
++      0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xba8e, 0x080c,
++      0x4ba2, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, 0xa186, 0xffff,
++      0x0170, 0xa180, 0x2d88, 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c,
++      0x4a5a, 0x0128, 0x080c, 0x4094, 0x0110, 0x080c, 0x282d, 0x20a9,
++      0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005,
++      0x05b8, 0x2011, 0x4a96, 0x080c, 0x6961, 0xa086, 0x0014, 0x1570,
++      0x2079, 0xba80, 0x7a30, 0xa296, 0x1105, 0x1540, 0x7834, 0x2011,
++      0x0100, 0xa21e, 0x1148, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005,
++      0x1110, 0x70bb, 0x0001, 0x0060, 0xa005, 0x11c0, 0x7a38, 0xd2fc,
++      0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708b, 0x0000,
++      0x7a38, 0xd2f4, 0x0138, 0x2001, 0xb474, 0x2004, 0xd0a4, 0x1110,
++      0x70d7, 0x0008, 0x708f, 0x0016, 0x0029, 0x0010, 0x080c, 0x4ad9,
++      0x00fe, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xba80,
++      0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xba8e,
++      0x708f, 0x0017, 0x080c, 0x4ba2, 0x1150, 0x7078, 0xa005, 0x1138,
++      0x080c, 0x49cf, 0x1170, 0xa085, 0x0001, 0x080c, 0x282d, 0x20a9,
++      0x0008, 0x2099, 0xba8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x60c3, 0x0014, 0x080c, 0x4ac0, 0x0010, 0x080c, 0x45e6,
++      0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, 0x4a96, 0x080c,
++      0x6961, 0xa086, 0x0084, 0x1168, 0x2079, 0xba80, 0x7a30, 0xa296,
++      0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, 0x0018, 0x0029,
++      0x0010, 0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f, 0x0019, 0x080c,
++      0x4b5d, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, 0xba8e,
++      0x2039, 0xba0e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x080c, 0x4ba2,
++      0x11e8, 0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018,
++      0xa294, 0x00ff, 0x8007, 0xa205, 0x202a, 0x7054, 0x2310, 0x8214,
++      0xa2a0, 0xba0e, 0x2414, 0xa38c, 0x0001, 0x0118, 0xa294, 0xff00,
++      0x0018, 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0,
++      0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++      0x0084, 0x080c, 0x4ac0, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0,
++      0x2011, 0x4a96, 0x080c, 0x6961, 0xa086, 0x0084, 0x1188, 0x2079,
++      0xba80, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005, 0x1140,
++      0x708b, 0x0001, 0x080c, 0x4b43, 0x708f, 0x001a, 0x0029, 0x0010,
++      0x080c, 0x4ad9, 0x00fe, 0x0005, 0x708f, 0x001b, 0x20e1, 0x9080,
++      0x20e1, 0x4000, 0x2099, 0xba80, 0x20a1, 0x020b, 0x7484, 0xa480,
++      0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6,
++      0x60c3, 0x0084, 0x080c, 0x4ac0, 0x0005, 0x0005, 0x0005, 0x0086,
++      0x0096, 0x2029, 0xb453, 0x252c, 0x20a9, 0x0008, 0x2041, 0xba0e,
++      0x28a0, 0x2099, 0xba8e, 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007,
++      0xd5d4, 0x0110, 0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6,
++      0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04,
++      0x49e4, 0x0804, 0x4a52, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0xa1a6,
++      0x3fff, 0x0d90, 0x0020, 0xa1a6, 0x3fff, 0x0904, 0x4a52, 0xa18d,
++      0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019,
++      0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240,
++      0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x4a0a, 0x04d0,
++      0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x4a1c, 0x2328,
++      0x8529, 0xa2be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200,
++      0xa73a, 0x000e, 0x27a8, 0xa5a8, 0x0010, 0x1f04, 0x4a2b, 0x7552,
++      0xa5c8, 0x2d88, 0x292d, 0xa5ac, 0x00ff, 0x7576, 0x6532, 0x6536,
++      0x0016, 0x2508, 0x080c, 0x280d, 0x001e, 0x60e7, 0x0000, 0x65ea,
++      0x2018, 0x2304, 0xa405, 0x201a, 0x707b, 0x0001, 0x26a0, 0x2898,
++      0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085,
++      0x0001, 0x0028, 0xa006, 0x0018, 0xa006, 0x080c, 0x1511, 0x009e,
++      0x008e, 0x0005, 0x2118, 0x2021, 0x0000, 0x2001, 0x0007, 0xa39a,
++      0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120,
++      0xa39a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118,
++      0x8423, 0x8319, 0x1de8, 0xa238, 0x2704, 0xa42c, 0x11b8, 0xa405,
++      0x203a, 0x7152, 0xa1a0, 0x2d88, 0x242d, 0xa5ac, 0x00ff, 0x7576,
++      0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x280d, 0x001e, 0x60e7,
++      0x0000, 0x65ea, 0x707b, 0x0001, 0xa084, 0x0000, 0x0005, 0x00e6,
++      0x2071, 0xb400, 0x707f, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6,
++      0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x7d24, 0x7004, 0xa084,
++      0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, 0x0126, 0x2091,
++      0x8000, 0x2071, 0xb423, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016,
++      0x2009, 0x00f7, 0x080c, 0x4b69, 0x001e, 0xa094, 0x0010, 0xa285,
++      0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x2011, 0xb6ea, 0x2013, 0x0000, 0x7087,
++      0x0000, 0x012e, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575,
++      0x080c, 0x7d1b, 0x2009, 0x07d0, 0x2011, 0x4a96, 0x080c, 0x69e7,
++      0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2011,
++      0x0003, 0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029, 0x080c,
++      0x7f03, 0x0036, 0x2019, 0x0000, 0x080c, 0x7f8e, 0x003e, 0x2009,
++      0x00f7, 0x080c, 0x4b69, 0x2061, 0xb6f3, 0x601b, 0x0000, 0x601f,
++      0x0000, 0x2061, 0xb400, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043,
++      0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4b0e, 0x080c,
++      0x6955, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006,
++      0x0126, 0x2091, 0x8000, 0x2071, 0x0100, 0x080c, 0x7d24, 0x2071,
++      0x0140, 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003,
++      0x0000, 0x080c, 0x5a98, 0x01a8, 0x080c, 0x5ab6, 0x1190, 0x2001,
++      0xb69e, 0x2003, 0xaaaa, 0x0016, 0x080c, 0x28b1, 0x2001, 0xb68f,
++      0x2102, 0x001e, 0x2001, 0xb69f, 0x2003, 0x0000, 0x080c, 0x59c8,
++      0x0030, 0x2001, 0x0001, 0x080c, 0x2789, 0x080c, 0x4ad9, 0x012e,
++      0x000e, 0x00ee, 0x0005, 0x20a9, 0x0040, 0x20a1, 0xbbc0, 0x2099,
++      0xba8e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x1f04, 0x4b49,
++      0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xba00, 0x20a1,
++      0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x2099, 0xba80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6,
++      0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0xb431,
++      0x2004, 0xa005, 0x1138, 0x2001, 0xb415, 0x2004, 0xa084, 0x00ff,
++      0xa105, 0x0010, 0xa185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005,
++      0x0016, 0x0046, 0x2001, 0xb453, 0x2004, 0xd0a4, 0x0158, 0xa006,
++      0x2020, 0x2009, 0x002a, 0x080c, 0xb06b, 0x2001, 0xb40c, 0x200c,
++      0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x080c, 0x2c33,
++      0x004e, 0x001e, 0x0005, 0x080c, 0x4ad9, 0x708f, 0x0000, 0x7087,
++      0x0000, 0x0005, 0x0006, 0x2001, 0xb40c, 0x2004, 0xd09c, 0x0100,
++      0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001,
++      0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e,
++      0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009, 0xb535, 0xa006, 0x200a,
++      0x8108, 0x1f04, 0x4bbf, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156,
++      0x0136, 0x0146, 0x2069, 0xb452, 0xa006, 0x6002, 0x6007, 0x0707,
++      0x600a, 0x600e, 0x6012, 0xa198, 0x2d88, 0x231d, 0xa39c, 0x00ff,
++      0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0, 0x40a4, 0x20a9,
++      0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e, 0x6042, 0x604e,
++      0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066, 0x606a, 0x606e,
++      0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086, 0x608a, 0x608e,
++      0x6092, 0x6096, 0x609a, 0x609e, 0x60ae, 0x61a2, 0x00d6, 0x60a4,
++      0xa06d, 0x0110, 0x080c, 0x160b, 0x60a7, 0x0000, 0x60a8, 0xa06d,
++      0x0110, 0x080c, 0x160b, 0x60ab, 0x0000, 0x00de, 0xa006, 0x604a,
++      0x6810, 0x603a, 0x680c, 0x6046, 0x6814, 0xa084, 0x00ff, 0x6042,
++      0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091,
++      0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000, 0x1a04,
++      0x4cd4, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x4cd9,
++      0x2001, 0xb40c, 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, 0xb40c,
++      0x2004, 0xd084, 0x1904, 0x4cbc, 0xa188, 0xb535, 0x2104, 0xa065,
++      0x0904, 0x4cbc, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904,
++      0x4cbc, 0x6000, 0xd0c4, 0x0904, 0x4cbc, 0x0068, 0xa188, 0xb535,
++      0x2104, 0xa065, 0x0904, 0x4ca0, 0x6004, 0xa084, 0x00ff, 0xa08e,
++      0x0006, 0x1904, 0x4ca5, 0x60a4, 0xa00d, 0x0118, 0x080c, 0x5195,
++      0x05d0, 0x60a8, 0xa00d, 0x0188, 0x080c, 0x51e0, 0x1170, 0x694c,
++      0xd1fc, 0x1118, 0x080c, 0x4e9f, 0x0448, 0x080c, 0x4e4e, 0x694c,
++      0xd1ec, 0x1520, 0x080c, 0x5087, 0x0408, 0x694c, 0xa184, 0xa000,
++      0x0178, 0xd1ec, 0x0140, 0xd1fc, 0x0118, 0x080c, 0x5096, 0x0028,
++      0x080c, 0x5096, 0x0028, 0xd1fc, 0x0118, 0x080c, 0x4e4e, 0x0070,
++      0x6050, 0xa00d, 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
++      0x0028, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, 0x6c6f,
++      0xa006, 0x012e, 0x0005, 0x2001, 0x0005, 0x2009, 0x0000, 0x04e8,
++      0x2001, 0x0028, 0x2009, 0x0000, 0x04c0, 0xa082, 0x0006, 0x12a0,
++      0x2001, 0xb435, 0x2004, 0xd0ac, 0x1160, 0x60a0, 0xd0bc, 0x1148,
++      0x6100, 0xd1fc, 0x0904, 0x4c5b, 0x2001, 0x0029, 0x2009, 0x1000,
++      0x0420, 0x2001, 0x0028, 0x00a8, 0x2009, 0xb40c, 0x210c, 0xd18c,
++      0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004,
++      0x0040, 0x2001, 0x0029, 0x6100, 0xd1fc, 0x0118, 0x2009, 0x1000,
++      0x0060, 0x2009, 0x0000, 0x0048, 0x2001, 0x0029, 0x2009, 0x0000,
++      0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x012e, 0x0005,
++      0x00e6, 0x0126, 0x2091, 0x8000, 0x6844, 0x8007, 0xa084, 0x00ff,
++      0x2008, 0xa182, 0x00ff, 0x1a04, 0x4d33, 0xa188, 0xb535, 0x2104,
++      0xa065, 0x01c0, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x11a8,
++      0x2c70, 0x080c, 0x856a, 0x05e8, 0x2e00, 0x601a, 0x2d00, 0x6012,
++      0x600b, 0xffff, 0x601f, 0x000a, 0x2009, 0x0003, 0x080c, 0x85ef,
++      0xa006, 0x0460, 0x2001, 0x0028, 0x0440, 0xa082, 0x0006, 0x1298,
++      0x2001, 0xb435, 0x2004, 0xd0ac, 0x1158, 0x60a0, 0xd0bc, 0x1140,
++      0x6100, 0xd1fc, 0x09e8, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8,
++      0x2001, 0x0028, 0x0090, 0x2009, 0xb40c, 0x210c, 0xd18c, 0x0118,
++      0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028,
++      0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0xa005, 0x012e, 0x00ee,
++      0x0005, 0x2001, 0x002c, 0x0cc8, 0x00f6, 0x00e6, 0x0126, 0x2091,
++      0x8000, 0x2011, 0x0000, 0x2079, 0xb400, 0x6944, 0xa18c, 0xff00,
++      0x810f, 0xa182, 0x00ff, 0x1a04, 0x4e05, 0x2001, 0xb40c, 0x2004,
++      0xa084, 0x0003, 0x1904, 0x4df3, 0x080c, 0x4f6a, 0x11a0, 0x6004,
++      0xa084, 0x00ff, 0xa082, 0x0006, 0x1270, 0x6864, 0xa0c6, 0x006f,
++      0x0150, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x1904, 0x4dee, 0x60a0,
++      0xd0bc, 0x1904, 0x4dee, 0x6864, 0xa0c6, 0x006f, 0x0118, 0x2008,
++      0x0804, 0x4db7, 0x6968, 0x2140, 0xa18c, 0xff00, 0x810f, 0x78d4,
++      0xd0ac, 0x1118, 0xa182, 0x0080, 0x06d0, 0xa182, 0x00ff, 0x16b8,
++      0x6a70, 0x6b6c, 0x7870, 0xa306, 0x1160, 0x7874, 0xa24e, 0x1118,
++      0x2208, 0x2310, 0x0460, 0xa9cc, 0xff00, 0x1118, 0x2208, 0x2310,
++      0x0430, 0x080c, 0x3d81, 0x2c70, 0x0550, 0x2009, 0x0000, 0x2011,
++      0x0000, 0xa0c6, 0x4000, 0x1160, 0x0006, 0x2e60, 0x080c, 0x520b,
++      0x1108, 0xc185, 0x7000, 0xd0bc, 0x0108, 0xc18d, 0x000e, 0x0088,
++      0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6, 0x4008, 0x1118,
++      0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108, 0x0010, 0x2001,
++      0x4006, 0x6866, 0x696a, 0x6a6e, 0x2001, 0x0030, 0x0450, 0x080c,
++      0x856a, 0x1138, 0x2001, 0x4005, 0x2009, 0x0003, 0x2011, 0x0000,
++      0x0c80, 0x2e00, 0x601a, 0x080c, 0x9fb8, 0x2d00, 0x6012, 0x601f,
++      0x0001, 0x6838, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091,
++      0x8000, 0x080c, 0x2c60, 0x012e, 0x2001, 0x0000, 0x080c, 0x4eac,
++      0x2001, 0x0002, 0x080c, 0x4ebe, 0x2009, 0x0002, 0x080c, 0x85ef,
++      0xa006, 0xa005, 0x012e, 0x00ee, 0x00fe, 0x0005, 0x2001, 0x0028,
++      0x2009, 0x0000, 0x0cb0, 0x2009, 0xb40c, 0x210c, 0xd18c, 0x0118,
++      0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010,
++      0x2001, 0x0029, 0x2009, 0x0000, 0x0c20, 0x2001, 0x0029, 0x2009,
++      0x0000, 0x08f8, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, 0x4000,
++      0x16b8, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x12e0, 0xa188,
++      0xb535, 0x2104, 0xa065, 0x01b8, 0x6004, 0xa084, 0x00ff, 0xa08e,
++      0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120, 0x080c, 0x5096, 0x0431,
++      0x0030, 0x0421, 0x684c, 0xd0fc, 0x0110, 0x080c, 0x5087, 0x080c,
++      0x50d4, 0xa006, 0x00c8, 0x2001, 0x0028, 0x2009, 0x0000, 0x00a0,
++      0xa082, 0x0006, 0x1240, 0x6100, 0xd1fc, 0x0d20, 0x2001, 0x0029,
++      0x2009, 0x1000, 0x0048, 0x2001, 0x0029, 0x2009, 0x0000, 0x0020,
++      0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x0005, 0x0126, 0x2091,
++      0x8000, 0x6050, 0xa00d, 0x0138, 0x2d00, 0x200a, 0x6803, 0x0000,
++      0x6052, 0x012e, 0x0005, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000,
++      0x0cc0, 0x0126, 0x2091, 0x8000, 0x604c, 0xa005, 0x0170, 0x00e6,
++      0x2071, 0xb6e0, 0x7004, 0xa086, 0x0002, 0x0168, 0x00ee, 0x604c,
++      0x6802, 0x2d00, 0x604e, 0x012e, 0x0005, 0x2d00, 0x6052, 0x604e,
++      0x6803, 0x0000, 0x0cc0, 0x701c, 0xac06, 0x1d80, 0x604c, 0x2070,
++      0x7000, 0x6802, 0x2d00, 0x7002, 0x00ee, 0x012e, 0x0005, 0x0126,
++      0x2091, 0x8000, 0x604c, 0xa06d, 0x0130, 0x6800, 0xa005, 0x1108,
++      0x6052, 0x604e, 0xad05, 0x012e, 0x0005, 0x604c, 0xa06d, 0x0130,
++      0x6800, 0xa005, 0x1108, 0x6052, 0x604e, 0xad05, 0x0005, 0x6803,
++      0x0000, 0x6084, 0xa00d, 0x0120, 0x2d00, 0x200a, 0x6086, 0x0005,
++      0x2d00, 0x6086, 0x6082, 0x0cd8, 0x0126, 0x00c6, 0x0026, 0x2091,
++      0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0110, 0xc285, 0x0008,
++      0xc284, 0x6202, 0x002e, 0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6,
++      0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0x0006, 0xa086, 0x0006,
++      0x1180, 0x609c, 0xd0ac, 0x0168, 0x2001, 0xb453, 0x2004, 0xd0a4,
++      0x0140, 0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x1110, 0x2011,
++      0x0600, 0x000e, 0xa294, 0xff00, 0xa215, 0x6206, 0x0006, 0xa086,
++      0x0006, 0x1128, 0x6290, 0x82ff, 0x1110, 0x080c, 0x1511, 0x000e,
++      0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6218,
++      0x2260, 0x6204, 0x0006, 0xa086, 0x0006, 0x1178, 0x609c, 0xd0a4,
++      0x0160, 0x2001, 0xb453, 0x2004, 0xd0ac, 0x1138, 0xa284, 0x00ff,
++      0xa086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0xa294, 0x00ff,
++      0x8007, 0xa215, 0x6206, 0x00ce, 0x012e, 0x0005, 0x0026, 0xa182,
++      0x00ff, 0x0218, 0xa085, 0x0001, 0x00b0, 0xa190, 0xb535, 0x2204,
++      0xa065, 0x1180, 0x0016, 0x00d6, 0x080c, 0x15db, 0x2d60, 0x00de,
++      0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, 0x0000,
++      0x080c, 0x4bc5, 0xa006, 0x002e, 0x0005, 0x0126, 0x2091, 0x8000,
++      0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x0480, 0x00d6,
++      0xa190, 0xb535, 0x2204, 0xa06d, 0x0540, 0x2013, 0x0000, 0x00d6,
++      0x00c6, 0x2d60, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x160b, 0x60a8,
++      0xa06d, 0x0110, 0x080c, 0x160b, 0x00ce, 0x00de, 0x00d6, 0x00c6,
++      0x68ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6010, 0x2068,
++      0x080c, 0x9beb, 0x0110, 0x080c, 0x161b, 0x080c, 0x85c0, 0x00ce,
++      0x0c88, 0x00ce, 0x00de, 0x080c, 0x160b, 0x00de, 0xa006, 0x002e,
++      0x012e, 0x0005, 0x0016, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001,
++      0x0030, 0xa188, 0xb535, 0x2104, 0xa065, 0x0dc0, 0xa006, 0x001e,
++      0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x600b, 0x0000, 0x600f,
++      0x0000, 0x6000, 0xc08c, 0x6002, 0x080c, 0x5a90, 0x1558, 0x60a0,
++      0xa086, 0x007e, 0x2069, 0xba90, 0x0130, 0x2001, 0xb435, 0x2004,
++      0xd0ac, 0x1500, 0x0098, 0x2d04, 0xd0e4, 0x01e0, 0x00d6, 0x2069,
++      0xba8e, 0x00c6, 0x2061, 0xb6b2, 0x6810, 0x2062, 0x6814, 0x6006,
++      0x6818, 0x600a, 0x681c, 0x600e, 0x00ce, 0x00de, 0x8d69, 0x2d04,
++      0x2069, 0x0140, 0xa005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069,
++      0xb400, 0x68a6, 0x2069, 0xba8e, 0x6808, 0x605e, 0x6810, 0x6062,
++      0x6138, 0xa10a, 0x0208, 0x603a, 0x6814, 0x6066, 0x2099, 0xba96,
++      0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xba9a,
++      0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xbaae,
++      0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076,
++      0x60a0, 0xa086, 0x007e, 0x1120, 0x2069, 0xba8e, 0x690c, 0x616e,
++      0xa182, 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0xa182, 0x0259,
++      0x1218, 0x2009, 0x0007, 0x00d0, 0xa182, 0x02c1, 0x1218, 0x2009,
++      0x0006, 0x00a0, 0xa182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070,
++      0xa182, 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0xa182, 0x0581,
++      0x1218, 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0x6192, 0x014e,
++      0x013e, 0x015e, 0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071,
++      0xba8d, 0x2e04, 0x6896, 0x2071, 0xba8e, 0x7004, 0x689a, 0x701c,
++      0x689e, 0x6a00, 0x2009, 0xb472, 0x210c, 0xd0bc, 0x0120, 0xd1ec,
++      0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0120, 0xd1e4, 0x0110,
++      0xc2bd, 0x0008, 0xc2bc, 0x6a02, 0x00ee, 0x002e, 0x001e, 0x0005,
++      0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x01c0, 0x6900,
++      0x81ff, 0x1540, 0x6a04, 0xa282, 0x0010, 0x1648, 0xad88, 0x0004,
++      0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0128, 0x8108, 0x1f04,
++      0x5042, 0x080c, 0x1511, 0x260a, 0x8210, 0x6a06, 0x0098, 0x080c,
++      0x15f4, 0x01a8, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88, 0x0004,
++      0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x505a, 0x6807,
++      0x0001, 0x6e12, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006,
++      0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6, 0x60a4, 0xa00d, 0x01a0,
++      0x2168, 0x6800, 0xa005, 0x1160, 0x080c, 0x5195, 0x1168, 0x200b,
++      0xffff, 0x6804, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6806, 0x0020,
++      0x080c, 0x160b, 0x60a7, 0x0000, 0x00de, 0x012e, 0x0005, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x51f3, 0x0010, 0x080c, 0x4e4e, 0x080c,
++      0x510d, 0x1dd8, 0x080c, 0x50d4, 0x012e, 0x0005, 0x00d6, 0x0126,
++      0x2091, 0x8000, 0x60a8, 0xa06d, 0x01c0, 0x6950, 0x81ff, 0x1540,
++      0x6a54, 0xa282, 0x0010, 0x1670, 0xad88, 0x0018, 0x20a9, 0x0010,
++      0x2104, 0xa086, 0xffff, 0x0128, 0x8108, 0x1f04, 0x50a8, 0x080c,
++      0x1511, 0x260a, 0x8210, 0x6a56, 0x0098, 0x080c, 0x15f4, 0x01d0,
++      0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010,
++      0x200b, 0xffff, 0x8108, 0x1f04, 0x50c0, 0x6857, 0x0001, 0x6e62,
++      0x0010, 0x080c, 0x4e9f, 0x0089, 0x1de0, 0xa085, 0x0001, 0x012e,
++      0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x080c,
++      0x6c6f, 0x012e, 0x0005, 0xa01e, 0x0010, 0x2019, 0x0001, 0xa00e,
++      0x0126, 0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x1170,
++      0x8dff, 0x01f8, 0x83ff, 0x0120, 0x6848, 0xa606, 0x0158, 0x0030,
++      0x683c, 0xa406, 0x1118, 0x6840, 0xa506, 0x0120, 0x2d08, 0x6800,
++      0x2068, 0x0c70, 0x080c, 0x80c8, 0x6a00, 0x604c, 0xad06, 0x1110,
++      0x624e, 0x0018, 0xa180, 0x0000, 0x2202, 0x82ff, 0x1110, 0x6152,
++      0x8dff, 0x012e, 0x0005, 0xa01e, 0x0010, 0x2019, 0x0001, 0xa00e,
++      0x6080, 0x2068, 0x8dff, 0x01e8, 0x83ff, 0x0120, 0x6848, 0xa606,
++      0x0158, 0x0030, 0x683c, 0xa406, 0x1118, 0x6840, 0xa506, 0x0120,
++      0x2d08, 0x6800, 0x2068, 0x0c70, 0x6a00, 0x6080, 0xad06, 0x1110,
++      0x6282, 0x0018, 0xa180, 0x0000, 0x2202, 0x82ff, 0x1110, 0x6186,
++      0x8dff, 0x0005, 0xa016, 0x080c, 0x518f, 0x1110, 0x2011, 0x0001,
++      0x080c, 0x51da, 0x1110, 0xa295, 0x0002, 0x0005, 0x080c, 0x520b,
++      0x0118, 0x080c, 0x9ca0, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c,
++      0x520b, 0x0118, 0x080c, 0x9c30, 0x0010, 0xa085, 0x0001, 0x0005,
++      0x080c, 0x520b, 0x0118, 0x080c, 0x9c83, 0x0010, 0xa085, 0x0001,
++      0x0005, 0x080c, 0x520b, 0x0118, 0x080c, 0x9c4c, 0x0010, 0xa085,
++      0x0001, 0x0005, 0x080c, 0x520b, 0x0118, 0x080c, 0x9cbc, 0x0010,
++      0xa085, 0x0001, 0x0005, 0x0126, 0x0006, 0x00d6, 0x2091, 0x8000,
++      0x6080, 0xa06d, 0x01a0, 0x6800, 0x0006, 0x6837, 0x0103, 0x6b4a,
++      0x6847, 0x0000, 0x080c, 0x9e5d, 0x0006, 0x6000, 0xd0fc, 0x0110,
++      0x080c, 0xb30c, 0x000e, 0x080c, 0x53c9, 0x000e, 0x0c50, 0x6083,
++      0x0000, 0x6087, 0x0000, 0x00de, 0x000e, 0x012e, 0x0005, 0x60a4,
++      0xa00d, 0x1118, 0xa085, 0x0001, 0x0005, 0x00e6, 0x2170, 0x7000,
++      0xa005, 0x1168, 0x20a9, 0x0010, 0xae88, 0x0004, 0x2104, 0xa606,
++      0x0130, 0x8108, 0x1f04, 0x519e, 0xa085, 0x0001, 0x0008, 0xa006,
++      0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d,
++      0x1128, 0x080c, 0x15f4, 0x01a0, 0x2d00, 0x60a6, 0x6803, 0x0001,
++      0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff,
++      0x8108, 0x1f04, 0x51be, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005,
++      0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d,
++      0x0130, 0x60a7, 0x0000, 0x080c, 0x160b, 0xa085, 0x0001, 0x012e,
++      0x00de, 0x0005, 0x60a8, 0xa00d, 0x1118, 0xa085, 0x0001, 0x0005,
++      0x00e6, 0x2170, 0x7050, 0xa005, 0x1160, 0x20a9, 0x0010, 0xae88,
++      0x0018, 0x2104, 0xa606, 0x0128, 0x8108, 0x1f04, 0x51e9, 0xa085,
++      0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x0c19, 0x1188,
++      0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002,
++      0x0218, 0x8001, 0x6856, 0x0020, 0x080c, 0x160b, 0x60ab, 0x0000,
++      0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4, 0x0005, 0x00f6, 0x080c,
++      0x5a90, 0x01b0, 0x71b8, 0x81ff, 0x1198, 0x71d4, 0xd19c, 0x0180,
++      0x2001, 0x007e, 0xa080, 0xb535, 0x2004, 0xa07d, 0x0148, 0x7804,
++      0xa084, 0x00ff, 0xa086, 0x0006, 0x1118, 0x7800, 0xc0ed, 0x7802,
++      0x2079, 0xb452, 0x7804, 0xd0a4, 0x01e8, 0x0156, 0x00c6, 0x20a9,
++      0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x4f6a, 0x1168, 0x6004,
++      0xa084, 0xff00, 0x8007, 0xa096, 0x0004, 0x0118, 0xa086, 0x0006,
++      0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, 0x8108, 0x1f04, 0x5233,
++      0x00ce, 0x015e, 0x080c, 0x52ca, 0x0120, 0x2001, 0xb6b5, 0x200c,
++      0x0038, 0x2079, 0xb452, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0,
++      0x2011, 0x525e, 0x080c, 0x69e7, 0x00fe, 0x0005, 0x2011, 0x525e,
++      0x080c, 0x6961, 0x080c, 0x52ca, 0x01f0, 0x2001, 0xb5b3, 0x2004,
++      0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xb453, 0x2004,
++      0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, 0x525e, 0x080c, 0x69e7,
++      0x00e6, 0x2071, 0xb400, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c,
++      0x2a7e, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009,
++      0x0000, 0x0016, 0x080c, 0x4f6a, 0x1530, 0x6000, 0xd0ec, 0x0518,
++      0x0046, 0x62a0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029,
++      0x080c, 0xb06b, 0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084,
++      0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, 0x0029, 0x080c, 0x6dba,
++      0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x2009, 0x0000, 0x080c,
++      0xae05, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x5289, 0x00ce,
++      0x015e, 0x0005, 0x00c6, 0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002,
++      0x00ce, 0x0005, 0x7818, 0x2004, 0xd0ac, 0x0005, 0x7818, 0x2004,
++      0xd0bc, 0x0005, 0x00f6, 0x2001, 0xb5b3, 0x2004, 0xa07d, 0x0110,
++      0x7800, 0xd0ec, 0x00fe, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000,
++      0x0006, 0x62a0, 0xa290, 0xb535, 0x2204, 0xac06, 0x190c, 0x1511,
++      0x000e, 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0x6202,
++      0x002e, 0x012e, 0x0005, 0x2011, 0xb435, 0x2204, 0xd0cc, 0x0138,
++      0x2001, 0xb6b3, 0x200c, 0x2011, 0x52f8, 0x080c, 0x69e7, 0x0005,
++      0x2011, 0x52f8, 0x080c, 0x6961, 0x2011, 0xb435, 0x2204, 0xc0cc,
++      0x2012, 0x0005, 0x2071, 0xb514, 0x7003, 0x0001, 0x7007, 0x0000,
++      0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000,
++      0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b, 0x0020,
++      0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xb67d, 0x7003, 0xb514,
++      0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xb65d, 0x7013, 0x0020,
++      0x7017, 0x0040, 0x7037, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071,
++      0xb635, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, 0xb453,
++      0x2004, 0xd0fc, 0x1150, 0x2001, 0xb453, 0x2004, 0xa00e, 0xd09c,
++      0x0108, 0x8108, 0x7102, 0x0804, 0x5393, 0x2001, 0xb472, 0x200c,
++      0xa184, 0x000f, 0x2009, 0xb473, 0x210c, 0x0002, 0x533b, 0x536e,
++      0x5375, 0x537f, 0x5384, 0x533b, 0x533b, 0x533b, 0x535e, 0x533b,
++      0x533b, 0x533b, 0x533b, 0x533b, 0x533b, 0x533b, 0x7003, 0x0004,
++      0x0136, 0x0146, 0x0156, 0x2099, 0xb476, 0x20a1, 0xb686, 0x20a9,
++      0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x0428, 0x708f, 0x0005,
++      0x7007, 0x0122, 0x2001, 0x0002, 0x0030, 0x708f, 0x0002, 0x7007,
++      0x0121, 0x2001, 0x0003, 0x7002, 0x7097, 0x0001, 0x0088, 0x7007,
++      0x0122, 0x2001, 0x0002, 0x0020, 0x7007, 0x0121, 0x2001, 0x0003,
++      0x7002, 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, 0x709a,
++      0xa184, 0x00ff, 0x7092, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071,
++      0xb514, 0x684c, 0xa005, 0x1130, 0x7028, 0xc085, 0x702a, 0xa085,
++      0x0001, 0x0428, 0x6a60, 0x7236, 0x6b64, 0x733a, 0x6868, 0x703e,
++      0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e, 0x6844, 0x7032,
++      0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007, 0x8006, 0x8006,
++      0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x726e,
++      0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006, 0x00ee,
++      0x0005, 0x0156, 0x00e6, 0x0026, 0x6838, 0xd0fc, 0x1904, 0x5422,
++      0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, 0xb400, 0xa016, 0x702c,
++      0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e,
++      0x70b4, 0xa200, 0x70b6, 0x00de, 0x2071, 0xb514, 0x701c, 0xa005,
++      0x1904, 0x5432, 0x20a9, 0x0032, 0x0f04, 0x5430, 0x0e04, 0x53ec,
++      0x2071, 0xb635, 0x7200, 0x82ff, 0x05d8, 0x6934, 0xa186, 0x0103,
++      0x1904, 0x5440, 0x6948, 0x6844, 0xa105, 0x1540, 0x2009, 0x8020,
++      0x2200, 0x0002, 0x5430, 0x5407, 0x5458, 0x5464, 0x5430, 0x2071,
++      0x0000, 0x20a9, 0x0032, 0x0f04, 0x5430, 0x7018, 0xd084, 0x1dd8,
++      0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091,
++      0x4080, 0x2071, 0xb400, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70b4,
++      0x8000, 0x70b6, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844, 0xa086,
++      0x0100, 0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020, 0x0880,
++      0x2071, 0xb514, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, 0x7012,
++      0x7018, 0xa06d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x0c10,
++      0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118,
++      0xa18e, 0x001f, 0x1d28, 0x684c, 0xd0cc, 0x0d10, 0x6850, 0xa084,
++      0x00ff, 0xa086, 0x0001, 0x19e0, 0x2009, 0x8021, 0x0804, 0x5400,
++      0x7084, 0x8008, 0xa092, 0x001e, 0x1a98, 0x7186, 0xae90, 0x0003,
++      0xa210, 0x683c, 0x2012, 0x0078, 0x7084, 0x8008, 0xa092, 0x000f,
++      0x1a38, 0x7186, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012,
++      0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, 0x0a04, 0x5419, 0x718c,
++      0x7084, 0xa10a, 0x0a04, 0x5419, 0x2071, 0x0000, 0x7018, 0xd084,
++      0x1904, 0x5419, 0x2071, 0xb635, 0x7000, 0xa086, 0x0002, 0x1150,
++      0x080c, 0x56e3, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080,
++      0x0804, 0x5419, 0x080c, 0x570d, 0x2071, 0x0000, 0x701b, 0x0001,
++      0x2091, 0x4080, 0x0804, 0x5419, 0x0006, 0x684c, 0x0006, 0x6837,
++      0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000,
++      0x40a4, 0x000e, 0xa084, 0x00ff, 0x684e, 0x000e, 0x684a, 0x6952,
++      0x0005, 0x2071, 0xb514, 0x7004, 0x0002, 0x54bf, 0x54d0, 0x56ce,
++      0x56cf, 0x56dc, 0x56e2, 0x54c0, 0x56bf, 0x5655, 0x56ab, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x0e04, 0x54cf, 0x2009, 0x000d, 0x7030,
++      0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x012e,
++      0x2069, 0xb6f3, 0x683c, 0xa005, 0x03f8, 0x11f0, 0x0126, 0x2091,
++      0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xb520, 0x2004, 0xa10a,
++      0x0170, 0x0e04, 0x54f3, 0x2069, 0x0000, 0x6818, 0xd084, 0x1158,
++      0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x2069,
++      0xb6f3, 0x683f, 0xffff, 0x012e, 0x2069, 0xb400, 0x6848, 0x6968,
++      0xa102, 0x2069, 0xb635, 0x688a, 0x6984, 0x701c, 0xa06d, 0x0120,
++      0x81ff, 0x0904, 0x5549, 0x00a0, 0x81ff, 0x0904, 0x560f, 0x2071,
++      0xb635, 0x7184, 0x7088, 0xa10a, 0x1258, 0x7190, 0x2071, 0xb6f3,
++      0x7038, 0xa005, 0x0128, 0x1b04, 0x560f, 0x713a, 0x0804, 0x560f,
++      0x2071, 0xb635, 0x718c, 0x0126, 0x2091, 0x8000, 0x7084, 0xa10a,
++      0x0a04, 0x562a, 0x0e04, 0x55cb, 0x2071, 0x0000, 0x7018, 0xd084,
++      0x1904, 0x55cb, 0x2001, 0xffff, 0x2071, 0xb6f3, 0x703a, 0x2071,
++      0xb635, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, 0x56e3, 0x2071,
++      0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x55cb, 0x080c,
++      0x570d, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804,
++      0x55cb, 0x2071, 0xb635, 0x7000, 0xa005, 0x0904, 0x55f1, 0x6934,
++      0xa186, 0x0103, 0x1904, 0x55ce, 0x684c, 0xd0bc, 0x1904, 0x55f1,
++      0x6948, 0x6844, 0xa105, 0x1904, 0x55e6, 0x2009, 0x8020, 0x2071,
++      0xb635, 0x7000, 0x0002, 0x55f1, 0x55b1, 0x5589, 0x559b, 0x5568,
++      0x0136, 0x0146, 0x0156, 0x2099, 0xb476, 0x20a1, 0xb686, 0x20a9,
++      0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x2071, 0xb67d, 0xad80,
++      0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000,
++      0x2e10, 0x080c, 0x163f, 0x2071, 0xb514, 0x7007, 0x0009, 0x0804,
++      0x560f, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x560f, 0xae90,
++      0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xb514, 0x080c,
++      0x5764, 0x0804, 0x560f, 0x7084, 0x8008, 0xa092, 0x000f, 0x1a04,
++      0x560f, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210,
++      0x6840, 0x2012, 0x7186, 0x2071, 0xb514, 0x080c, 0x5764, 0x0804,
++      0x560f, 0x0126, 0x2091, 0x8000, 0x0e04, 0x55cb, 0x2071, 0x0000,
++      0x7018, 0xd084, 0x1180, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a,
++      0x701b, 0x0001, 0x2091, 0x4080, 0x012e, 0x2071, 0xb514, 0x080c,
++      0x5764, 0x0804, 0x560f, 0x012e, 0x0804, 0x560f, 0xa18c, 0x00ff,
++      0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118, 0xa18e, 0x001f,
++      0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, 0xa084, 0x00ff, 0xa086,
++      0x0001, 0x1178, 0x2009, 0x8021, 0x0804, 0x555f, 0x6844, 0xa086,
++      0x0100, 0x1138, 0x6868, 0xa005, 0x1120, 0x2009, 0x8020, 0x0804,
++      0x555f, 0x2071, 0xb514, 0x080c, 0x5776, 0x01c8, 0x2071, 0xb514,
++      0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, 0x1130,
++      0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x7007, 0x0003,
++      0x080c, 0x578f, 0x7050, 0xa086, 0x0100, 0x0904, 0x56cf, 0x0126,
++      0x2091, 0x8000, 0x2071, 0xb514, 0x7008, 0xa086, 0x0001, 0x1180,
++      0x0e04, 0x5628, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, 0x4080,
++      0x700b, 0x0000, 0x7004, 0xa086, 0x0006, 0x1110, 0x7007, 0x0001,
++      0x012e, 0x0005, 0x2071, 0xb514, 0x080c, 0x5776, 0x0518, 0x2071,
++      0xb635, 0x7084, 0x700a, 0x20a9, 0x0020, 0x2099, 0xb636, 0x20a1,
++      0xb65d, 0x53a3, 0x7087, 0x0000, 0x2071, 0xb514, 0x2069, 0xb67d,
++      0x706c, 0x6826, 0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832,
++      0x2d10, 0x080c, 0x163f, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071,
++      0xb6f3, 0x703a, 0x012e, 0x0804, 0x560f, 0x2069, 0xb67d, 0x6808,
++      0xa08e, 0x0000, 0x0904, 0x56aa, 0xa08e, 0x0200, 0x0904, 0x56a8,
++      0xa08e, 0x0100, 0x1904, 0x56aa, 0x0126, 0x2091, 0x8000, 0x0e04,
++      0x56a6, 0x2069, 0x0000, 0x6818, 0xd084, 0x15c0, 0x702c, 0x7130,
++      0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
++      0x0048, 0x706c, 0xa080, 0x0040, 0x706e, 0x1220, 0x7070, 0xa081,
++      0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000, 0x2001, 0xb65a,
++      0x2004, 0xa005, 0x1190, 0x6934, 0x2069, 0xb635, 0x689c, 0x699e,
++      0x2069, 0xb6f3, 0xa102, 0x1118, 0x683c, 0xa005, 0x1368, 0x2001,
++      0xb65b, 0x200c, 0x810d, 0x693e, 0x0038, 0x2009, 0x8040, 0x6922,
++      0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x012e, 0x0010,
++      0x7007, 0x0005, 0x0005, 0x2001, 0xb67f, 0x2004, 0xa08e, 0x0100,
++      0x1128, 0x7007, 0x0001, 0x080c, 0x5764, 0x0005, 0xa08e, 0x0000,
++      0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, 0x0005, 0x0005, 0x701c,
++      0xa06d, 0x0158, 0x080c, 0x5776, 0x0140, 0x7007, 0x0003, 0x080c,
++      0x578f, 0x7050, 0xa086, 0x0100, 0x0110, 0x0005, 0x0005, 0x7050,
++      0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, 0x0030, 0xa086, 0x0200,
++      0x1110, 0x7007, 0x0005, 0x0005, 0x080c, 0x5732, 0x7006, 0x080c,
++      0x5764, 0x0005, 0x0005, 0x00e6, 0x0156, 0x2071, 0xb635, 0x7184,
++      0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, 0x0000,
++      0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, 0x5707, 0x2014, 0x722a,
++      0x8000, 0x0f04, 0x5707, 0x2014, 0x722e, 0x8000, 0x0f04, 0x5707,
++      0x2014, 0x723a, 0x8000, 0x0f04, 0x5707, 0x2014, 0x723e, 0xa180,
++      0x8030, 0x7022, 0x015e, 0x00ee, 0x0005, 0x00e6, 0x0156, 0x2071,
++      0xb635, 0x7184, 0x81ff, 0x01d8, 0xa006, 0x7086, 0xae80, 0x0003,
++      0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x2014, 0x722a,
++      0x8000, 0x0f04, 0x5729, 0x2014, 0x723a, 0x8000, 0x2014, 0x723e,
++      0x0018, 0x2001, 0x8020, 0x0010, 0x2001, 0x8042, 0x7022, 0x015e,
++      0x00ee, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102, 0x0230, 0xa00e,
++      0x7034, 0x706e, 0x7038, 0x7072, 0x0048, 0x706c, 0xa080, 0x0040,
++      0x706e, 0x1220, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c,
++      0x8001, 0x700e, 0x1180, 0x0126, 0x2091, 0x8000, 0x0e04, 0x575e,
++      0x2001, 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x700b,
++      0x0000, 0x012e, 0x0005, 0x2001, 0x0007, 0x0005, 0x2001, 0x0006,
++      0x700b, 0x0001, 0x012e, 0x0005, 0x701c, 0xa06d, 0x0170, 0x0126,
++      0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0xa005,
++      0x1108, 0x701a, 0x012e, 0x080c, 0x160b, 0x0005, 0x2019, 0x000d,
++      0x2304, 0x230c, 0xa10e, 0x0130, 0x2304, 0x230c, 0xa10e, 0x0110,
++      0xa006, 0x0060, 0x732c, 0x8319, 0x7130, 0xa102, 0x1118, 0x2300,
++      0xa005, 0x0020, 0x0210, 0xa302, 0x0008, 0x8002, 0x0005, 0x2d00,
++      0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x0126, 0x2091,
++      0x8000, 0x2009, 0xb712, 0x2104, 0xc08d, 0x200a, 0x012e, 0x080c,
++      0x1657, 0x0005, 0x708c, 0xa08a, 0x0029, 0x1220, 0xa082, 0x001d,
++      0x0033, 0x0010, 0x080c, 0x1511, 0x6027, 0x1e00, 0x0005, 0x589d,
++      0x5818, 0x5830, 0x586d, 0x588e, 0x58c8, 0x58da, 0x5830, 0x58b4,
++      0x57bc, 0x57ea, 0x57bb, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804,
++      0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069,
++      0xb6c5, 0x2d04, 0x7002, 0x080c, 0x5b92, 0x6028, 0xa085, 0x0600,
++      0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xb6c5, 0x2d04, 0x7002,
++      0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056,
++      0x2071, 0xb723, 0x080c, 0x1dcd, 0x005e, 0x004e, 0x003e, 0x00ee,
++      0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0xa005, 0x1180,
++      0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, 0xb6c5, 0x2d04,
++      0x7002, 0x080c, 0x5c1f, 0x6028, 0xa085, 0x0600, 0x602a, 0x00b0,
++      0x708f, 0x0028, 0x2069, 0xb6c5, 0x2d04, 0x7002, 0x6028, 0xa085,
++      0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0xb723,
++      0x080c, 0x1dcd, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005,
++      0x6803, 0x0090, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x5945, 0xd1d4,
++      0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x708f, 0x0020, 0x080c,
++      0x5945, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x001f, 0x0005,
++      0x6803, 0x0088, 0x6124, 0xd1cc, 0x1590, 0xd1dc, 0x1568, 0xd1e4,
++      0x1540, 0xa184, 0x1e00, 0x1580, 0x60e3, 0x0001, 0x600c, 0xc0b4,
++      0x600e, 0x080c, 0x5ac0, 0x080c, 0x2479, 0x0156, 0x6803, 0x0100,
++      0x20a9, 0x0014, 0x6804, 0xd0dc, 0x1118, 0x1f04, 0x584a, 0x0048,
++      0x20a9, 0x0014, 0x6803, 0x0080, 0x6804, 0xd0d4, 0x1130, 0x1f04,
++      0x5854, 0x080c, 0x5ae1, 0x015e, 0x0078, 0x015e, 0x708f, 0x0028,
++      0x0058, 0x708f, 0x001e, 0x0040, 0x708f, 0x001d, 0x0028, 0x708f,
++      0x0020, 0x0010, 0x708f, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c,
++      0xc0b4, 0x600e, 0x080c, 0x5ac0, 0x080c, 0x2479, 0x6803, 0x0080,
++      0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0xa184,
++      0x1e00, 0x1158, 0x708f, 0x0028, 0x0040, 0x708f, 0x001e, 0x0028,
++      0x708f, 0x001d, 0x0010, 0x708f, 0x001f, 0x0005, 0x6803, 0x00a0,
++      0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1e18, 0x708f,
++      0x001e, 0x0010, 0x708f, 0x001d, 0x0005, 0x080c, 0x59b7, 0x6124,
++      0xd1dc, 0x1188, 0x080c, 0x5945, 0x0016, 0x080c, 0x1e18, 0x001e,
++      0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x708f, 0x001e, 0x0020, 0x708f,
++      0x001f, 0x080c, 0x5945, 0x0005, 0x6803, 0x00a0, 0x6124, 0xd1d4,
++      0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x708f,
++      0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x0021, 0x0005,
++      0x080c, 0x59b7, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4,
++      0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f,
++      0x001f, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1d4, 0x1178, 0xd1cc,
++      0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x708f, 0x001e, 0x0040,
++      0x708f, 0x001d, 0x0028, 0x708f, 0x0020, 0x0010, 0x708f, 0x001f,
++      0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100,
++      0x2069, 0x0140, 0x2071, 0xb400, 0x2091, 0x8000, 0x080c, 0x5a90,
++      0x11e8, 0x2001, 0xb40c, 0x200c, 0xd1b4, 0x01c0, 0xc1b4, 0x2102,
++      0x6027, 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc, 0x0158, 0x6803,
++      0x00a0, 0x2001, 0xb69f, 0x2003, 0x0001, 0x2001, 0xb400, 0x2003,
++      0x0001, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x5aac,
++      0x0150, 0x080c, 0x5aa2, 0x1138, 0x2001, 0x0001, 0x080c, 0x2789,
++      0x080c, 0x5a67, 0x00a0, 0x080c, 0x59b4, 0x0178, 0x2001, 0x0001,
++      0x080c, 0x2789, 0x708c, 0xa086, 0x001e, 0x0120, 0x708c, 0xa086,
++      0x0022, 0x1118, 0x708f, 0x0025, 0x0010, 0x708f, 0x0021, 0x012e,
++      0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x5956,
++      0x080c, 0x6a21, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011,
++      0x5956, 0x080c, 0x6a18, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6,
++      0x0016, 0x080c, 0x7d24, 0x2071, 0xb400, 0x080c, 0x58f1, 0x001e,
++      0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
++      0x00e6, 0x00f6, 0x0126, 0x080c, 0x7d24, 0x2061, 0x0100, 0x2069,
++      0x0140, 0x2071, 0xb400, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a,
++      0x2011, 0x0003, 0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029,
++      0x080c, 0x7f03, 0x080c, 0x69d5, 0x0036, 0x2019, 0x0000, 0x080c,
++      0x7f8e, 0x003e, 0x60e3, 0x0000, 0x080c, 0xb3b2, 0x080c, 0xb3cd,
++      0x2001, 0xb400, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, 0x12d9,
++      0x2001, 0x0001, 0x080c, 0x2789, 0x012e, 0x00fe, 0x00ee, 0x00de,
++      0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x2001, 0xb400, 0x2004,
++      0xa086, 0x0004, 0x0140, 0x2001, 0xb69e, 0x2003, 0xaaaa, 0x2001,
++      0xb69f, 0x2003, 0x0000, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800,
++      0xa086, 0x00c0, 0x0160, 0x6803, 0x00c0, 0x0156, 0x20a9, 0x002d,
++      0x1d04, 0x59c0, 0x2091, 0x6000, 0x1f04, 0x59c0, 0x015e, 0x0005,
++      0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
++      0xb400, 0x2001, 0xb69f, 0x200c, 0xa186, 0x0000, 0x0158, 0xa186,
++      0x0001, 0x0158, 0xa186, 0x0002, 0x0158, 0xa186, 0x0003, 0x0158,
++      0x0804, 0x5a55, 0x708f, 0x0022, 0x0040, 0x708f, 0x0021, 0x0028,
++      0x708f, 0x0023, 0x0020, 0x708f, 0x0024, 0x6043, 0x0000, 0x60e3,
++      0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2838, 0x0026,
++      0x2011, 0x0003, 0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029,
++      0x080c, 0x7f03, 0x0036, 0x2019, 0x0000, 0x080c, 0x7f8e, 0x003e,
++      0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010,
++      0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005,
++      0x6024, 0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, 0x5a63, 0x6800,
++      0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4, 0x1130, 0x6803,
++      0x0100, 0x1f04, 0x5a18, 0x080c, 0x5ae1, 0x012e, 0x015e, 0x080c,
++      0x5aa2, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, 0x0006, 0xa085,
++      0x0020, 0x6052, 0x080c, 0x5ae1, 0xa006, 0x8001, 0x1df0, 0x000e,
++      0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x5ae1, 0x0016,
++      0x0026, 0x2009, 0x00c8, 0x2011, 0x5963, 0x080c, 0x69e7, 0x002e,
++      0x001e, 0x2001, 0xb69f, 0x2003, 0x0004, 0x080c, 0x57a2, 0x080c,
++      0x5aa2, 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, 0x2001,
++      0xb69f, 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6,
++      0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb400,
++      0x2001, 0xb69e, 0x2003, 0x0000, 0x2001, 0xb68f, 0x2003, 0x0000,
++      0x708f, 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000,
++      0x080c, 0x2838, 0x6803, 0x0000, 0x6043, 0x0090, 0x6043, 0x0010,
++      0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005,
++      0x0006, 0x2001, 0xb69e, 0x2004, 0xa086, 0xaaaa, 0x000e, 0x0005,
++      0x0006, 0x2001, 0xb472, 0x2004, 0xa084, 0x0030, 0xa086, 0x0000,
++      0x000e, 0x0005, 0x0006, 0x2001, 0xb472, 0x2004, 0xa084, 0x0030,
++      0xa086, 0x0030, 0x000e, 0x0005, 0x0006, 0x2001, 0xb472, 0x2004,
++      0xa084, 0x0030, 0xa086, 0x0010, 0x000e, 0x0005, 0x0006, 0x2001,
++      0xb472, 0x2004, 0xa084, 0x0030, 0xa086, 0x0020, 0x000e, 0x0005,
++      0x2001, 0xb40c, 0x2004, 0xd0a4, 0x0170, 0x080c, 0x2858, 0x0036,
++      0x0016, 0x2009, 0x0000, 0x2019, 0x0028, 0x080c, 0x2c33, 0x001e,
++      0x003e, 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071, 0xb40c, 0x2e04,
++      0x0118, 0xa085, 0x0010, 0x0010, 0xa084, 0xffef, 0x2072, 0x00ee,
++      0x0005, 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec, 0x0006, 0x600c,
++      0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100, 0x602f,
++      0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x602a, 0x000e,
++      0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, 0x60f2, 0x60e3,
++      0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2838, 0x6800,
++      0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0, 0x000e, 0x6052,
++      0x6050, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
++      0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb400, 0x6020,
++      0xa084, 0x0080, 0x0138, 0x2001, 0xb40c, 0x200c, 0xc1bd, 0x2102,
++      0x0804, 0x5b8a, 0x2001, 0xb40c, 0x200c, 0xc1bc, 0x2102, 0x6028,
++      0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803, 0x0090, 0x20a9,
++      0x0384, 0x6024, 0xd0cc, 0x1508, 0x1d04, 0x5b39, 0x2091, 0x6000,
++      0x1f04, 0x5b39, 0x2011, 0x0003, 0x080c, 0x801f, 0x2011, 0x0002,
++      0x080c, 0x8029, 0x080c, 0x7f03, 0x2019, 0x0000, 0x080c, 0x7f8e,
++      0x6803, 0x00a0, 0x2001, 0xb69f, 0x2003, 0x0001, 0x2001, 0xb400,
++      0x2003, 0x0001, 0xa085, 0x0001, 0x0468, 0x86ff, 0x1110, 0x080c,
++      0x1e18, 0x60e3, 0x0000, 0x2001, 0xb68f, 0x2004, 0x080c, 0x2838,
++      0x60e2, 0x080c, 0x2479, 0x6803, 0x0080, 0x20a9, 0x0384, 0x6027,
++      0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0138, 0x1d04,
++      0x5b6f, 0x2091, 0x6000, 0x1f04, 0x5b6f, 0x0820, 0x6028, 0xa085,
++      0x1e00, 0x602a, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008,
++      0x6886, 0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
++      0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
++      0x00e6, 0x2061, 0x0100, 0x2071, 0xb400, 0x2069, 0x0140, 0x6020,
++      0xa084, 0x00c0, 0x0120, 0x6884, 0xa005, 0x1904, 0x5be6, 0x6803,
++      0x0088, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, 0x080c,
++      0x2838, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, 0x6808, 0xa005,
++      0x01c0, 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069,
++      0xb6c5, 0x7000, 0x206a, 0x708f, 0x0026, 0x7003, 0x0001, 0x20a9,
++      0x0002, 0x1d04, 0x5bc9, 0x2091, 0x6000, 0x1f04, 0x5bc9, 0x0804,
++      0x5c17, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009,
++      0x1e00, 0xe000, 0x6024, 0xa10c, 0x0520, 0xa084, 0x1a00, 0x1508,
++      0x1d04, 0x5bd5, 0x2091, 0x6000, 0x1f04, 0x5bd5, 0x2011, 0x0003,
++      0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029, 0x080c, 0x7f03,
++      0x2019, 0x0000, 0x080c, 0x7f8e, 0x6803, 0x00a0, 0x2001, 0xb69f,
++      0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001,
++      0x00b0, 0x080c, 0x2479, 0x6803, 0x0080, 0x2069, 0x0140, 0x60e3,
++      0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886,
++      0x2001, 0xb68f, 0x2004, 0x080c, 0x2838, 0x60e2, 0xa006, 0x00ee,
++      0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156,
++      0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100,
++      0x2071, 0xb400, 0x6020, 0xa084, 0x00c0, 0x01e0, 0x2011, 0x0003,
++      0x080c, 0x801f, 0x2011, 0x0002, 0x080c, 0x8029, 0x080c, 0x7f03,
++      0x2019, 0x0000, 0x080c, 0x7f8e, 0x2069, 0x0140, 0x6803, 0x00a0,
++      0x2001, 0xb69f, 0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001,
++      0x0804, 0x5cbc, 0x2001, 0xb40c, 0x200c, 0xd1b4, 0x1160, 0xc1b5,
++      0x2102, 0x080c, 0x594b, 0x2069, 0x0140, 0x080c, 0x2479, 0x6803,
++      0x0080, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118,
++      0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfdff, 0x602a, 0x6027,
++      0x0200, 0x2069, 0xb6c5, 0x7000, 0x206a, 0x708f, 0x0027, 0x7003,
++      0x0001, 0x20a9, 0x0002, 0x1d04, 0x5c73, 0x2091, 0x6000, 0x1f04,
++      0x5c73, 0x0804, 0x5cbc, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000,
++      0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0, 0x1d04, 0x5c7b,
++      0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x68be, 0x00ee,
++      0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0xb6f3, 0x7018,
++      0x00ee, 0xa005, 0x1d00, 0x0500, 0x0026, 0x2011, 0x5963, 0x080c,
++      0x6961, 0x2011, 0x5956, 0x080c, 0x6a21, 0x002e, 0x2069, 0x0140,
++      0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008,
++      0x6886, 0x2001, 0xb68f, 0x2004, 0x080c, 0x2838, 0x60e2, 0x2001,
++      0xb40c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e,
++      0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
++      0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb400, 0x7130,
++      0xd184, 0x1180, 0x2011, 0xb453, 0x2214, 0xd2ec, 0x0138, 0xc18d,
++      0x7132, 0x2011, 0xb453, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c,
++      0x0904, 0x5d29, 0x7130, 0xc185, 0x7132, 0x2011, 0xb453, 0x220c,
++      0xd1a4, 0x0530, 0x0016, 0x2019, 0x000e, 0x080c, 0xafe8, 0x0156,
++      0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, 0x007e, 0x01a0, 0xa186,
++      0x0080, 0x0188, 0x080c, 0x4f6a, 0x1170, 0x8127, 0xa006, 0x0016,
++      0x2009, 0x000e, 0x080c, 0xb06b, 0x2009, 0x0001, 0x2011, 0x0100,
++      0x080c, 0x6adf, 0x001e, 0x8108, 0x1f04, 0x5cf4, 0x015e, 0x001e,
++      0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c,
++      0x2c33, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000,
++      0x080c, 0x4f6a, 0x1110, 0x080c, 0x4bc5, 0x8108, 0x1f04, 0x5d20,
++      0x015e, 0x080c, 0x1e18, 0x2011, 0x0003, 0x080c, 0x801f, 0x2011,
++      0x0002, 0x080c, 0x8029, 0x080c, 0x7f03, 0x0036, 0x2019, 0x0000,
++      0x080c, 0x7f8e, 0x003e, 0x60e3, 0x0000, 0x2001, 0xb400, 0x2003,
++      0x0001, 0x080c, 0x59c8, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e,
++      0x001e, 0x015e, 0x0005, 0x2071, 0xb4e2, 0x7003, 0x0000, 0x7007,
++      0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053,
++      0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b,
++      0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x0005, 0x00e6, 0x2071,
++      0xb4e2, 0x6848, 0xa005, 0x1130, 0x7028, 0xc085, 0x702a, 0xa085,
++      0x0001, 0x0428, 0x6a50, 0x7236, 0x6b54, 0x733a, 0x6858, 0x703e,
++      0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e, 0x6840, 0x7032,
++      0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006, 0xa08c, 0x003f,
++      0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272, 0x7376, 0x7028,
++      0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000, 0xa006, 0x00ee,
++      0x0005, 0x2b78, 0x2071, 0xb4e2, 0x7004, 0x0043, 0x700c, 0x0002,
++      0x5da5, 0x5d9c, 0x5d9c, 0x5d9c, 0x5d9c, 0x0005, 0x5dfb, 0x5dfc,
++      0x5e2e, 0x5e2f, 0x5df9, 0x5e7d, 0x5e82, 0x5eb3, 0x5eb4, 0x5ecf,
++      0x5ed0, 0x5ed1, 0x5ed2, 0x5ed3, 0x5ed4, 0x5f8a, 0x5fb1, 0x700c,
++      0x0002, 0x5dbe, 0x5df9, 0x5df9, 0x5dfa, 0x5dfa, 0x7830, 0x7930,
++      0xa106, 0x0120, 0x7830, 0x7930, 0xa106, 0x1510, 0x7030, 0xa10a,
++      0x01f8, 0x1210, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x12d0, 0x080c,
++      0x15db, 0x01b0, 0x2d00, 0x705a, 0x7063, 0x0040, 0x2001, 0x0003,
++      0x7057, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, 0xb712,
++      0x2104, 0xc085, 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, 0x1657,
++      0x0005, 0x080c, 0x15db, 0x0de0, 0x2d00, 0x705a, 0x080c, 0x15db,
++      0x1108, 0x0c10, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004,
++      0x08f8, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, 0x5e03, 0x5e06,
++      0x5e14, 0x5e2d, 0x5e2d, 0x080c, 0x5db7, 0x0005, 0x0126, 0x8001,
++      0x700e, 0x7058, 0x0006, 0x080c, 0x6304, 0x0120, 0x2091, 0x8000,
++      0x080c, 0x5db7, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c,
++      0x6304, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807,
++      0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x003a, 0x1218, 0x00db,
++      0x012e, 0x0005, 0x012e, 0x080c, 0x5ed5, 0x0005, 0x0005, 0x0005,
++      0x00e6, 0x2071, 0xb4e2, 0x700c, 0x0002, 0x5e3a, 0x5e3a, 0x5e3a,
++      0x5e3c, 0x5e3f, 0x00ee, 0x0005, 0x700f, 0x0001, 0x0010, 0x700f,
++      0x0002, 0x00ee, 0x0005, 0x5ed5, 0x5ed5, 0x5ef1, 0x5ed5, 0x606e,
++      0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ef1, 0x60b0, 0x60f3,
++      0x613c, 0x6150, 0x5ed5, 0x5ed5, 0x5f0d, 0x5ef1, 0x5ed5, 0x5ed5,
++      0x5f67, 0x61fc, 0x6217, 0x5ed5, 0x5f0d, 0x5ed5, 0x5ed5, 0x5ed5,
++      0x5ed5, 0x5f5d, 0x6217, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5,
++      0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5f21, 0x5ed5, 0x5ed5, 0x5ed5,
++      0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x6322, 0x5ed5,
++      0x5ed5, 0x5ed5, 0x5ed5, 0x5ed5, 0x5f36, 0x7020, 0x2068, 0x080c,
++      0x160b, 0x0005, 0x700c, 0x0002, 0x5e89, 0x5e8c, 0x5e9a, 0x5eb2,
++      0x5eb2, 0x080c, 0x5db7, 0x0005, 0x0126, 0x8001, 0x700e, 0x7058,
++      0x0006, 0x080c, 0x6304, 0x0120, 0x2091, 0x8000, 0x080c, 0x5db7,
++      0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, 0x6304, 0x7058,
++      0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834,
++      0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b, 0x012e, 0x0005,
++      0x012e, 0x0419, 0x0005, 0x0005, 0x0005, 0x5ed5, 0x5ef1, 0x605a,
++      0x5ed5, 0x5ef1, 0x5ed5, 0x5ef1, 0x5ef1, 0x5ed5, 0x5ef1, 0x605a,
++      0x5ef1, 0x5ef1, 0x5ef1, 0x5ef1, 0x5ef1, 0x5ed5, 0x5ef1, 0x605a,
++      0x5ed5, 0x5ed5, 0x5ef1, 0x5ed5, 0x5ed5, 0x5ed5, 0x5ef1, 0x0005,
++      0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x7007, 0x0001, 0x6838,
++      0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c,
++      0x53c9, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff,
++      0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e,
++      0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e, 0x0005, 0x7007,
++      0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x0126, 0x2091,
++      0x8000, 0x080c, 0x53c9, 0x012e, 0x0005, 0x6834, 0x8007, 0xa084,
++      0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x601a,
++      0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x601a,
++      0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x5ee3, 0x8001,
++      0x1120, 0x7007, 0x0001, 0x0804, 0x6037, 0x7007, 0x0006, 0x7012,
++      0x2d00, 0x7016, 0x701a, 0x704b, 0x6037, 0x0005, 0x6834, 0x8007,
++      0xa084, 0x00ff, 0xa086, 0x0001, 0x1904, 0x5ee3, 0x7007, 0x0001,
++      0x2009, 0xb431, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff,
++      0x683a, 0x6853, 0x0000, 0x080c, 0x4d3c, 0x1108, 0x0005, 0x0126,
++      0x2091, 0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x53c9,
++      0x012e, 0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0,
++      0xa086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x622f, 0x2d00,
++      0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1,
++      0xb50d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x5eff,
++      0x6a84, 0xa28a, 0x0002, 0x1a04, 0x5eff, 0x82ff, 0x1138, 0x6888,
++      0x698c, 0xa105, 0x0118, 0x2001, 0x5fed, 0x0018, 0xa280, 0x5fe3,
++      0x2005, 0x70c6, 0x7010, 0xa015, 0x0904, 0x5fcf, 0x080c, 0x15db,
++      0x1118, 0x7007, 0x000f, 0x0005, 0x2d00, 0x7022, 0x70c4, 0x2060,
++      0x2c05, 0x6836, 0xe004, 0xad00, 0x7096, 0xe008, 0xa20a, 0x1210,
++      0xa00e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0xa296, 0x0004,
++      0x0108, 0xa108, 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x080c,
++      0x163f, 0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118,
++      0x7007, 0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x160b, 0x7014,
++      0x2068, 0x0804, 0x5eff, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807,
++      0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x5f8a, 0x7014,
++      0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c,
++      0xa105, 0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
++      0x0904, 0x622f, 0x04b8, 0x5fe5, 0x5fe9, 0x0002, 0x0011, 0x0007,
++      0x0004, 0x000a, 0x000f, 0x0005, 0x0006, 0x000a, 0x0011, 0x0005,
++      0x0004, 0x00f6, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x6f88, 0x6e8c,
++      0x6804, 0x2060, 0xacf0, 0x0021, 0xacf8, 0x0027, 0x2009, 0x0005,
++      0x700c, 0x7816, 0x7008, 0x7812, 0x7004, 0x7806, 0x7000, 0x7802,
++      0x7e0e, 0x7f0a, 0x8109, 0x0128, 0xaef2, 0x0004, 0xaffa, 0x0006,
++      0x0c78, 0x6004, 0xa065, 0x1d30, 0x006e, 0x007e, 0x00ce, 0x00ee,
++      0x00fe, 0x0005, 0x2009, 0xb431, 0x210c, 0x81ff, 0x1198, 0x6838,
++      0xa084, 0x00ff, 0x683a, 0x080c, 0x4c1e, 0x1108, 0x0005, 0x080c,
++      0x549c, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e5d, 0x080c, 0x53c9,
++      0x012e, 0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, 0x2009,
++      0xb431, 0x210c, 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01c0, 0x6838,
++      0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x4ce0, 0x1108,
++      0x0005, 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, 0x53c9,
++      0x012e, 0x0cb0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c90, 0x2001,
++      0x0000, 0x0c78, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a,
++      0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0006, 0x0030, 0x7014,
++      0x2068, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x7007, 0x0001,
++      0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, 0x00ff, 0x20a9,
++      0x0001, 0xa096, 0x0001, 0x01b0, 0x2009, 0x0000, 0x20a9, 0x00ff,
++      0xa096, 0x0002, 0x0178, 0xa005, 0x11f0, 0x6944, 0x810f, 0xa18c,
++      0x00ff, 0x080c, 0x4f6a, 0x11b8, 0x0066, 0x6e50, 0x080c, 0x5069,
++      0x006e, 0x0088, 0x0046, 0x2011, 0xb40c, 0x2224, 0xc484, 0x2412,
++      0x004e, 0x00c6, 0x080c, 0x4f6a, 0x1110, 0x080c, 0x51ca, 0x8108,
++      0x1f04, 0x609a, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, 0x160b,
++      0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xb453, 0x2004,
++      0xd0a4, 0x0580, 0x2061, 0xb774, 0x6100, 0xd184, 0x0178, 0x6858,
++      0xa084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0xa005,
++      0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001,
++      0x6860, 0xa005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0x6858,
++      0xa084, 0x00ff, 0x0178, 0x6006, 0x6858, 0x8007, 0xa084, 0x00ff,
++      0x0148, 0x600a, 0x6858, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e,
++      0x0804, 0x62f3, 0x012e, 0x0804, 0x62ed, 0x012e, 0x0804, 0x62e7,
++      0x012e, 0x0804, 0x62ea, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001,
++      0x2001, 0xb453, 0x2004, 0xd0a4, 0x05e0, 0x2061, 0xb774, 0x6000,
++      0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0x6c48, 0xa484,
++      0x0003, 0x0170, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x1120, 0x2100,
++      0xa210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0xa212, 0x02f0,
++      0xa484, 0x000c, 0x0188, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082,
++      0x0004, 0x1120, 0x2100, 0xa318, 0x0288, 0x0030, 0xa082, 0x0004,
++      0x1168, 0x2100, 0xa31a, 0x0250, 0x6860, 0xa005, 0x0110, 0x8000,
++      0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x62f3, 0x012e, 0x0804,
++      0x62f0, 0x012e, 0x0804, 0x62ed, 0x0126, 0x2091, 0x8000, 0x7007,
++      0x0001, 0x2061, 0xb774, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318,
++      0x0220, 0x630a, 0x012e, 0x0804, 0x6301, 0x012e, 0x0804, 0x62f0,
++      0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac,
++      0x0148, 0x00c6, 0x2061, 0xb774, 0x6000, 0xa084, 0xfcff, 0x6002,
++      0x00ce, 0x0448, 0x6858, 0xa005, 0x05d0, 0x685c, 0xa065, 0x0598,
++      0x2001, 0xb431, 0x2004, 0xa005, 0x0118, 0x080c, 0x9dae, 0x0068,
++      0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950,
++      0x6156, 0x2009, 0x0041, 0x080c, 0x85ef, 0x6958, 0xa18c, 0xff00,
++      0xa186, 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, 0xfdff,
++      0x080c, 0x6adf, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, 0xb774,
++      0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce,
++      0x012e, 0x0804, 0x62f3, 0x00ce, 0x012e, 0x0804, 0x62ed, 0x6954,
++      0xa186, 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, 0x0045,
++      0x0528, 0xa186, 0x002a, 0x1130, 0x2001, 0xb40c, 0x200c, 0xc194,
++      0x2102, 0x08c8, 0xa186, 0x0020, 0x0170, 0xa186, 0x0029, 0x1d18,
++      0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4f6a, 0x1960, 0x6000,
++      0xc0e4, 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, 0x0024,
++      0x2001, 0xb6b6, 0x2004, 0x6016, 0x0804, 0x618b, 0x685c, 0xa065,
++      0x0950, 0x00e6, 0x6860, 0xa075, 0x2001, 0xb431, 0x2004, 0xa005,
++      0x0150, 0x080c, 0x9dae, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9dae,
++      0x00ee, 0x0804, 0x618b, 0x6020, 0xc0dc, 0xc0d5, 0x6022, 0x2e60,
++      0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, 0x6874,
++      0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x6c52, 0x080c,
++      0x7134, 0x00ee, 0x0804, 0x618b, 0x2061, 0xb774, 0x6000, 0xd084,
++      0x0190, 0xd08c, 0x1904, 0x6301, 0x0126, 0x2091, 0x8000, 0x6204,
++      0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x6301, 0x012e, 0x6853,
++      0x0016, 0x0804, 0x62fa, 0x6853, 0x0007, 0x0804, 0x62fa, 0x6834,
++      0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x5ee3, 0x0078, 0x2030,
++      0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, 0x0006,
++      0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x622f, 0x0005, 0x00e6,
++      0x0126, 0x2091, 0x8000, 0xa03e, 0x2009, 0xb431, 0x210c, 0x81ff,
++      0x1904, 0x62ad, 0x2009, 0xb40c, 0x210c, 0xd194, 0x1904, 0x62d7,
++      0x6848, 0x2070, 0xae82, 0xbc00, 0x0a04, 0x62a1, 0x2001, 0xb417,
++      0x2004, 0xae02, 0x1a04, 0x62a1, 0x711c, 0xa186, 0x0006, 0x1904,
++      0x6290, 0x7018, 0xa005, 0x0904, 0x62ad, 0x2004, 0xd0e4, 0x1904,
++      0x62d2, 0x2061, 0xb774, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001,
++      0x1550, 0x7020, 0xd0dc, 0x1904, 0x62da, 0x6853, 0x0000, 0x6803,
++      0x0000, 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, 0xd0f4,
++      0x1904, 0x62dd, 0x2e60, 0x080c, 0x6a3b, 0x012e, 0x00ee, 0x0005,
++      0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, 0xd0f4,
++      0x1904, 0x62dd, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853,
++      0x0006, 0x0804, 0x62fa, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8,
++      0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4f6a, 0x15d8, 0x6000,
++      0xd0e4, 0x15c0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002,
++      0x0498, 0x6853, 0x0008, 0x0480, 0x6853, 0x000e, 0x0468, 0x6853,
++      0x0017, 0x0450, 0x6853, 0x0035, 0x0438, 0x2001, 0xb472, 0x2004,
++      0xd0fc, 0x01e8, 0x6848, 0x2070, 0xae82, 0xbc00, 0x02c0, 0x605c,
++      0xae02, 0x12a8, 0x711c, 0xa186, 0x0006, 0x1188, 0x7018, 0xa005,
++      0x0170, 0x2004, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0xa086,
++      0x0007, 0x1904, 0x623a, 0x7003, 0x0002, 0x0804, 0x623a, 0x6853,
++      0x0028, 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, 0x6853,
++      0x002a, 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002,
++      0x6017, 0x0014, 0x080c, 0xac63, 0x012e, 0x00ee, 0x0005, 0x2009,
++      0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028,
++      0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00,
++      0xa105, 0x6856, 0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e,
++      0x0005, 0x080c, 0x160b, 0x0005, 0x702c, 0x7130, 0x8108, 0xa102,
++      0x0230, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0058, 0x7070,
++      0xa080, 0x0040, 0x7072, 0x1230, 0x7074, 0xa081, 0x0000, 0x7076,
++      0xa085, 0x0001, 0x7932, 0x7132, 0x0005, 0x00d6, 0x080c, 0x6a32,
++      0x00de, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x7007,
++      0x0001, 0x6a44, 0xa282, 0x0004, 0x1a04, 0x636d, 0xd284, 0x0170,
++      0x6a4c, 0xa290, 0xb535, 0x2204, 0xa065, 0x6004, 0x05e0, 0x8007,
++      0xa084, 0x00ff, 0xa084, 0x0006, 0x1108, 0x04a8, 0x2c10, 0x080c,
++      0x856a, 0x1118, 0x080c, 0x9e67, 0x05a0, 0x621a, 0x6844, 0x0002,
++      0x634c, 0x6351, 0x6354, 0x635a, 0x2019, 0x0002, 0x080c, 0xafe8,
++      0x0060, 0x080c, 0xaf7f, 0x0048, 0x2019, 0x0002, 0x6950, 0x080c,
++      0xaf9a, 0x0018, 0x6950, 0x080c, 0xaf7f, 0x080c, 0x85c0, 0x6857,
++      0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x53c9, 0x012e, 0x001e,
++      0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0x6857, 0x0006, 0x0c88,
++      0x6857, 0x0002, 0x0c70, 0x6857, 0x0005, 0x0c58, 0x6857, 0x0004,
++      0x0c40, 0x6857, 0x0007, 0x0c28, 0x00d6, 0x2011, 0x0004, 0x2204,
++      0xa085, 0x8002, 0x2012, 0x00de, 0x0005, 0x20e1, 0x0002, 0x3d08,
++      0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0118, 0xa086, 0x1000,
++      0x1570, 0x20e1, 0x0000, 0x3d00, 0xa094, 0xff00, 0x8217, 0xa084,
++      0xf000, 0xa086, 0x3000, 0x1160, 0xa184, 0xff00, 0x8007, 0xa086,
++      0x0008, 0x11e8, 0x080c, 0x2d83, 0x11d0, 0x080c, 0x65c4, 0x0098,
++      0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x1108, 0x3e60, 0xac84, 0x0007,
++      0x1170, 0xac82, 0xbc00, 0x0258, 0x685c, 0xac02, 0x1240, 0x2009,
++      0x0047, 0x080c, 0x85ef, 0x7a1c, 0xd284, 0x1938, 0x0005, 0xa016,
++      0x080c, 0x1856, 0x0cc0, 0x0cd8, 0x781c, 0xd08c, 0x0500, 0x0156,
++      0x0136, 0x0146, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076,
++      0x1538, 0xa484, 0x7000, 0xa086, 0x1000, 0x11a8, 0x080c, 0x643f,
++      0x01f8, 0x20e1, 0x3000, 0x7828, 0x7828, 0x080c, 0x645b, 0x014e,
++      0x013e, 0x015e, 0x2009, 0xb6e8, 0x2104, 0xa005, 0x1108, 0x0005,
++      0x080c, 0x7134, 0x0ce0, 0xa484, 0x7000, 0x1548, 0x080c, 0x643f,
++      0x01d8, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x0d10, 0x00a0,
++      0xd5a4, 0x0178, 0x0056, 0x0046, 0x080c, 0x1e3f, 0x080c, 0x2479,
++      0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x004e, 0x005e,
++      0x0048, 0x04a9, 0x6887, 0x0000, 0x080c, 0xb362, 0x20e1, 0x3000,
++      0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e, 0x0880, 0x0439,
++      0x1130, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x1d68, 0x080c,
++      0xb362, 0x20e1, 0x3000, 0x7828, 0x7828, 0x0056, 0x080c, 0x6839,
++      0x005e, 0x0c40, 0x2001, 0xb40e, 0x2004, 0xd08c, 0x0178, 0x2001,
++      0xb400, 0x2004, 0xa086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011,
++      0x8048, 0x2518, 0x080c, 0x3e8a, 0x003e, 0x002e, 0x0005, 0xa484,
++      0x01ff, 0x6886, 0xa005, 0x0160, 0xa080, 0x001f, 0xa084, 0x03f8,
++      0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x0005,
++      0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5,
++      0xa085, 0x0001, 0x0ca0, 0x7000, 0xa084, 0xff00, 0xa08c, 0xf000,
++      0x8007, 0xa196, 0x0000, 0x1118, 0x0804, 0x66c9, 0x0005, 0xa196,
++      0x2000, 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118, 0x080c, 0x4449,
++      0x0ca8, 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80, 0x080c, 0x6779,
++      0x0c68, 0x00c6, 0x6a84, 0x82ff, 0x0904, 0x65be, 0x7110, 0xa18c,
++      0xff00, 0x810f, 0xa196, 0x0001, 0x0120, 0xa196, 0x0023, 0x1904,
++      0x65be, 0xa08e, 0x0023, 0x1570, 0x080c, 0x6814, 0x0904, 0x65be,
++      0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150, 0x7034, 0xa005,
++      0x1904, 0x65be, 0x2009, 0x0015, 0x080c, 0x85ef, 0x0804, 0x65be,
++      0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, 0x2009, 0x0015,
++      0x080c, 0x85ef, 0x0804, 0x65be, 0xa08e, 0x0100, 0x1904, 0x65be,
++      0x7034, 0xa005, 0x1904, 0x65be, 0x2009, 0x0016, 0x080c, 0x85ef,
++      0x0804, 0x65be, 0xa08e, 0x0022, 0x1904, 0x65be, 0x7030, 0xa08e,
++      0x0300, 0x1580, 0x68d4, 0xd0a4, 0x0528, 0xc0b5, 0x68d6, 0x7100,
++      0xa18c, 0x00ff, 0x6972, 0x7004, 0x6876, 0x00f6, 0x2079, 0x0100,
++      0x79e6, 0x78ea, 0x0006, 0xa084, 0x00ff, 0x0016, 0x2008, 0x080c,
++      0x280d, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x27e3,
++      0x6952, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0xb400,
++      0x70a6, 0x00ee, 0x7034, 0xa005, 0x1904, 0x65be, 0x2009, 0x0017,
++      0x0804, 0x6584, 0xa08e, 0x0400, 0x1158, 0x7034, 0xa005, 0x1904,
++      0x65be, 0x68d4, 0xc0a5, 0x68d6, 0x2009, 0x0030, 0x0804, 0x6584,
++      0xa08e, 0x0500, 0x1140, 0x7034, 0xa005, 0x1904, 0x65be, 0x2009,
++      0x0018, 0x0804, 0x6584, 0xa08e, 0x2010, 0x1120, 0x2009, 0x0019,
++      0x0804, 0x6584, 0xa08e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804,
++      0x6584, 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005, 0x1904, 0x65be,
++      0x2009, 0x001b, 0x0804, 0x6584, 0xa08e, 0x5000, 0x1140, 0x7034,
++      0xa005, 0x1904, 0x65be, 0x2009, 0x001c, 0x0804, 0x6584, 0xa08e,
++      0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x6584, 0xa08e, 0x1200,
++      0x1140, 0x7034, 0xa005, 0x1904, 0x65be, 0x2009, 0x0024, 0x0804,
++      0x6584, 0xa08c, 0xff00, 0xa18e, 0x2400, 0x1118, 0x2009, 0x002d,
++      0x04d8, 0xa08c, 0xff00, 0xa18e, 0x5300, 0x1118, 0x2009, 0x002a,
++      0x0498, 0xa08e, 0x0f00, 0x1118, 0x2009, 0x0020, 0x0468, 0xa08e,
++      0x5300, 0x1108, 0x00d8, 0xa08e, 0x6104, 0x11c0, 0x2011, 0xba8d,
++      0x8208, 0x2204, 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011,
++      0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x3e8a, 0x004e,
++      0x8108, 0x1f04, 0x6567, 0x2009, 0x0023, 0x0070, 0xa08e, 0x6000,
++      0x1118, 0x2009, 0x003f, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009,
++      0x0045, 0x0010, 0x2009, 0x001d, 0x0016, 0x2011, 0xba83, 0x2204,
++      0x8211, 0x220c, 0x080c, 0x27e3, 0x1598, 0x080c, 0x4f0e, 0x1580,
++      0x6612, 0x6516, 0x86ff, 0x01e8, 0x001e, 0x0016, 0xa186, 0x0017,
++      0x1158, 0x6870, 0xa606, 0x11a8, 0x6874, 0xa506, 0xa084, 0xff00,
++      0x1180, 0x6000, 0xc0f5, 0x6002, 0xa186, 0x0046, 0x1150, 0x6870,
++      0xa606, 0x1138, 0x6874, 0xa506, 0xa084, 0xff00, 0x1110, 0x001e,
++      0x0068, 0x00c6, 0x080c, 0x856a, 0x0168, 0x001e, 0x611a, 0x601f,
++      0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x85ef, 0x00ce, 0x0005,
++      0x001e, 0x0ce0, 0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, 0x6618,
++      0x1904, 0x6615, 0xa28e, 0x0033, 0x11e8, 0x080c, 0x6814, 0x0904,
++      0x6615, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, 0x7034,
++      0xa005, 0x15d8, 0x2009, 0x0015, 0x080c, 0x85ef, 0x04b0, 0xa08e,
++      0x0100, 0x1598, 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c,
++      0x85ef, 0x0458, 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, 0x1400,
++      0x1520, 0x2009, 0x0038, 0x0016, 0x2011, 0xba83, 0x2204, 0x8211,
++      0x220c, 0x080c, 0x27e3, 0x11c0, 0x080c, 0x4f0e, 0x11a8, 0x6612,
++      0x6516, 0x00c6, 0x080c, 0x856a, 0x0170, 0x001e, 0x611a, 0x080c,
++      0x9fb8, 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x85ef,
++      0x080c, 0x7134, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x0005,
++      0x00f6, 0x00d6, 0x0026, 0x0016, 0x0136, 0x0146, 0x0156, 0x3c00,
++      0x0006, 0x2079, 0x0030, 0x2069, 0x0200, 0x080c, 0x1efe, 0x1590,
++      0x080c, 0x1da1, 0x05e0, 0x04f1, 0x1130, 0x7908, 0xa18c, 0x1fff,
++      0xa182, 0x0011, 0x1688, 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0,
++      0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004,
++      0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0x0419, 0x1120,
++      0xa08a, 0x0140, 0x1a0c, 0x1511, 0x80ac, 0x20e1, 0x6000, 0x2099,
++      0x020a, 0x53a5, 0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, 0x0004,
++      0xa294, 0x0070, 0x000e, 0x20e0, 0x015e, 0x014e, 0x013e, 0x001e,
++      0x002e, 0x00de, 0x00fe, 0x0005, 0xa016, 0x080c, 0x1856, 0xa085,
++      0x0001, 0x0c80, 0x0006, 0x2001, 0x0111, 0x2004, 0xa084, 0x0003,
++      0x000e, 0x0005, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0xa696,
++      0x00ff, 0x1198, 0xa596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804,
++      0x66c4, 0xa596, 0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, 0xa596,
++      0xfffc, 0x1118, 0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, 0x2019,
++      0xb435, 0x231c, 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff,
++      0x2071, 0xb535, 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071,
++      0xb5b6, 0x2e1c, 0x83ff, 0x1128, 0x82ff, 0x1198, 0x2410, 0xc2fd,
++      0x0080, 0x2368, 0x6f10, 0x0006, 0x2100, 0xa706, 0x000e, 0x6b14,
++      0x1120, 0xa346, 0x1110, 0x2408, 0x0078, 0x87ff, 0x1110, 0x83ff,
++      0x0d58, 0x8420, 0x8e70, 0x1f04, 0x66a1, 0x82ff, 0x1118, 0xa085,
++      0x0001, 0x0018, 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e,
++      0x0005, 0xa084, 0x0007, 0x000a, 0x0005, 0x66d5, 0x66d5, 0x66d5,
++      0x6826, 0x66d5, 0x66d6, 0x66eb, 0x6764, 0x0005, 0x7110, 0xd1bc,
++      0x0188, 0x7120, 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xbc00,
++      0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046,
++      0x080c, 0x85ef, 0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, 0x6742,
++      0x7110, 0xd1bc, 0x1904, 0x6742, 0x2011, 0xba83, 0x2204, 0x8211,
++      0x220c, 0x080c, 0x27e3, 0x1904, 0x6742, 0x080c, 0x4f0e, 0x1904,
++      0x6742, 0x6612, 0x6516, 0x6000, 0xd0ec, 0x15e0, 0x6204, 0xa294,
++      0xff00, 0x8217, 0xa286, 0x0006, 0x0160, 0x080c, 0x5a90, 0x11d0,
++      0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x11a0, 0xa295, 0x0600,
++      0x6206, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0530, 0x611a, 0x601f,
++      0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x2009, 0x0044, 0x080c,
++      0x85ef, 0x00c0, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0198, 0x611a,
++      0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x1118, 0x6007,
++      0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x6c98,
++      0x080c, 0x7134, 0x00ce, 0x0005, 0x2001, 0xb40d, 0x2004, 0xd0ec,
++      0x0120, 0x2011, 0x8049, 0x080c, 0x3e8a, 0x00c6, 0x080c, 0x9e67,
++      0x001e, 0x0d80, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130,
++      0x6152, 0x6013, 0x0300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
++      0x6c52, 0x080c, 0x7134, 0x08f0, 0x7110, 0xd1bc, 0x0188, 0x7020,
++      0x2060, 0xac84, 0x0007, 0x1160, 0xac82, 0xbc00, 0x0248, 0x685c,
++      0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0x85ef,
++      0x0005, 0x0006, 0x080c, 0x2d83, 0x000e, 0x1168, 0x7110, 0xa18c,
++      0xff00, 0x810f, 0xa18e, 0x0000, 0x1130, 0xa084, 0x000f, 0xa08a,
++      0x0006, 0x1208, 0x000b, 0x0005, 0x6792, 0x6793, 0x6792, 0x6792,
++      0x67fc, 0x6808, 0x0005, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084,
++      0x0904, 0x67fb, 0x700c, 0x7108, 0x080c, 0x27e3, 0x1904, 0x67fb,
++      0x080c, 0x4f0e, 0x1904, 0x67fb, 0x6612, 0x6516, 0x6204, 0x7110,
++      0xd1bc, 0x01f8, 0xa28c, 0x00ff, 0xa186, 0x0004, 0x0118, 0xa186,
++      0x0006, 0x15c8, 0x00c6, 0x080c, 0x6814, 0x00ce, 0x0904, 0x67fb,
++      0x00c6, 0x080c, 0x856a, 0x001e, 0x05f0, 0x611a, 0x080c, 0x9fb8,
++      0x601f, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x85ef,
++      0x0490, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0160, 0xa186, 0x0004,
++      0x0148, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004, 0x0118, 0xa286,
++      0x0006, 0x1188, 0x00c6, 0x080c, 0x856a, 0x001e, 0x01e0, 0x611a,
++      0x080c, 0x9fb8, 0x601f, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088,
++      0x080c, 0x85ef, 0x0080, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0158,
++      0x611a, 0x080c, 0x9fb8, 0x601f, 0x0004, 0x7120, 0x610a, 0x2009,
++      0x0001, 0x080c, 0x85ef, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x00a1,
++      0x0130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0x85ef, 0x0005,
++      0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, 0x7124, 0x610a, 0x2009,
++      0x008a, 0x080c, 0x85ef, 0x0005, 0x7020, 0x2060, 0xac84, 0x0007,
++      0x1158, 0xac82, 0xbc00, 0x0240, 0x2001, 0xb417, 0x2004, 0xac02,
++      0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8, 0x7110, 0xd1bc,
++      0x1178, 0x7024, 0x2060, 0xac84, 0x0007, 0x1150, 0xac82, 0xbc00,
++      0x0238, 0x685c, 0xac02, 0x1220, 0x2009, 0x0051, 0x080c, 0x85ef,
++      0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049,
++      0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009,
++      0x0005, 0x00c6, 0x00d6, 0x00f6, 0x7000, 0xa084, 0xf000, 0xa086,
++      0xc000, 0x05b0, 0x080c, 0x856a, 0x0598, 0x0066, 0x00c6, 0x0046,
++      0x2011, 0xba83, 0x2204, 0x8211, 0x220c, 0x080c, 0x27e3, 0x1580,
++      0x080c, 0x4f0e, 0x1568, 0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce,
++      0x601a, 0x080c, 0x9fb8, 0x080c, 0x15f4, 0x01f0, 0x2d00, 0x6056,
++      0x6803, 0x0000, 0x6837, 0x0000, 0x6c3a, 0xadf8, 0x000f, 0x20a9,
++      0x000e, 0x2fa0, 0x2e98, 0x53a3, 0x006e, 0x6612, 0x6007, 0x003e,
++      0x601f, 0x0001, 0x6003, 0x0001, 0x080c, 0x6c98, 0x080c, 0x7134,
++      0x00fe, 0x00de, 0x00ce, 0x0005, 0x080c, 0x85c0, 0x006e, 0x0cc0,
++      0x004e, 0x00ce, 0x0cc8, 0x2071, 0xb6f3, 0x7003, 0x0003, 0x700f,
++      0x0361, 0xa006, 0x701a, 0x7076, 0x7012, 0x7017, 0xbc00, 0x7007,
++      0x0000, 0x7026, 0x702b, 0x7d3b, 0x7032, 0x7037, 0x7d9b, 0x703b,
++      0xffff, 0x703f, 0xffff, 0x7042, 0x7047, 0x4405, 0x704a, 0x705b,
++      0x69f0, 0x2001, 0xb6a1, 0x2003, 0x0003, 0x2001, 0xb6a3, 0x2003,
++      0x0100, 0x3a00, 0xa084, 0x0005, 0x706e, 0x0005, 0x2071, 0xb6f3,
++      0x1d04, 0x6950, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1518,
++      0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x7040,
++      0xa00d, 0x0128, 0x8109, 0x7142, 0x1110, 0x7044, 0x080f, 0x00c6,
++      0x2061, 0xb400, 0x6034, 0x00ce, 0xd0cc, 0x0180, 0x3a00, 0xa084,
++      0x0005, 0x726c, 0xa216, 0x0150, 0x706e, 0x2011, 0x8043, 0x2018,
++      0x080c, 0x3e8a, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0xa00d,
++      0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109,
++      0x7126, 0xa186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110,
++      0x7028, 0x080f, 0x7030, 0xa00d, 0x0180, 0x702c, 0x8001, 0x702e,
++      0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0xa184, 0x007f,
++      0x090c, 0x7de0, 0x0010, 0x7034, 0x080f, 0x7038, 0xa005, 0x0118,
++      0x0310, 0x8001, 0x703a, 0x703c, 0xa005, 0x0118, 0x0310, 0x8001,
++      0x703e, 0x704c, 0xa00d, 0x0168, 0x7048, 0x8001, 0x704a, 0x1148,
++      0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e, 0x7058,
++      0x080f, 0x7018, 0xa00d, 0x01d8, 0x0016, 0x7074, 0xa00d, 0x0158,
++      0x7070, 0x8001, 0x7072, 0x1138, 0x7073, 0x0009, 0x8109, 0x7176,
++      0x1110, 0x7078, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a, 0x1138,
++      0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f, 0x012e,
++      0x7004, 0x0002, 0x6976, 0x6977, 0x698f, 0x00e6, 0x2071, 0xb6f3,
++      0x7018, 0xa005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee,
++      0x0005, 0x00e6, 0x0006, 0x2071, 0xb6f3, 0x701c, 0xa206, 0x1110,
++      0x701a, 0x701e, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xb6f3,
++      0x6088, 0xa102, 0x0208, 0x618a, 0x00ee, 0x0005, 0x0005, 0x7110,
++      0x080c, 0x4f6a, 0x1158, 0x6088, 0x8001, 0x0240, 0x608a, 0x1130,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x8108, 0xa182,
++      0x00ff, 0x0218, 0xa00e, 0x7007, 0x0002, 0x7112, 0x0005, 0x7014,
++      0x2060, 0x0126, 0x2091, 0x8000, 0x603c, 0xa005, 0x0128, 0x8001,
++      0x603e, 0x1110, 0x080c, 0x9ea6, 0x6014, 0xa005, 0x0500, 0x8001,
++      0x6016, 0x11e8, 0x611c, 0xa186, 0x0003, 0x0118, 0xa186, 0x0006,
++      0x11a0, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0270, 0xa082,
++      0x1999, 0x6856, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003,
++      0x800b, 0x810b, 0xa108, 0x6116, 0x0010, 0x080c, 0x997e, 0x012e,
++      0xac88, 0x0018, 0x7116, 0x2001, 0xec00, 0xa102, 0x0220, 0x7017,
++      0xbc00, 0x7007, 0x0000, 0x0005, 0x00e6, 0x2071, 0xb6f3, 0x7027,
++      0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, 0xb6fc, 0x2003,
++      0x0000, 0x0005, 0x00e6, 0x2071, 0xb6f3, 0x7132, 0x702f, 0x0009,
++      0x00ee, 0x0005, 0x2011, 0xb6ff, 0x2013, 0x0000, 0x0005, 0x00e6,
++      0x2071, 0xb6f3, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005,
++      0x00c6, 0x0026, 0x7054, 0x8000, 0x7056, 0x2061, 0xb6a1, 0x6008,
++      0xa086, 0x0000, 0x0158, 0x7068, 0x6032, 0x7064, 0x602e, 0x7060,
++      0x602a, 0x705c, 0x6026, 0x2c10, 0x080c, 0x163f, 0x002e, 0x00ce,
++      0x0005, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c,
++      0x68be, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x0005,
++      0x00e6, 0x2071, 0xb6f3, 0x7176, 0x727a, 0x7073, 0x0009, 0x00ee,
++      0x0005, 0x00e6, 0x0006, 0x2071, 0xb6f3, 0x7078, 0xa206, 0x1110,
++      0x7076, 0x707a, 0x000e, 0x00ee, 0x0005, 0x00c6, 0x2061, 0xb774,
++      0x00ce, 0x0005, 0xa184, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080,
++      0xb774, 0x2060, 0x0005, 0x6854, 0xa08a, 0x199a, 0x0210, 0x2001,
++      0x1999, 0xa005, 0x1150, 0x00c6, 0x2061, 0xb774, 0x6014, 0x00ce,
++      0xa005, 0x1138, 0x2001, 0x001e, 0x0020, 0xa08e, 0xffff, 0x1108,
++      0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c,
++      0x00c0, 0xa18e, 0x00c0, 0x05e8, 0xd0b4, 0x1138, 0xd0bc, 0x1550,
++      0x2009, 0x0006, 0x080c, 0x6ab6, 0x0005, 0xd0fc, 0x0138, 0xa084,
++      0x0003, 0x0120, 0xa086, 0x0003, 0x1904, 0x6ab0, 0x6020, 0xd0d4,
++      0x0130, 0xc0d4, 0x6022, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009,
++      0xb474, 0x2104, 0xd084, 0x0138, 0x87ff, 0x1120, 0x2009, 0x0042,
++      0x080c, 0x85ef, 0x0005, 0x87ff, 0x1120, 0x2009, 0x0043, 0x080c,
++      0x85ef, 0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, 0x0118, 0xa086,
++      0x0003, 0x11f0, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x85ef,
++      0x0005, 0xd0fc, 0x0160, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0148,
++      0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x85ef, 0x0005, 0x0061,
++      0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x85ef, 0x0cb0,
++      0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x00d6, 0x6010,
++      0xa0ec, 0xf000, 0x0510, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186,
++      0x0001, 0x1188, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x1158,
++      0x00c6, 0x2061, 0xb774, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210,
++      0x0208, 0x6206, 0x00ce, 0x080c, 0x53c9, 0x6010, 0xa06d, 0x0076,
++      0x2039, 0x0000, 0x190c, 0x6a3b, 0x007e, 0x00de, 0x0005, 0x0156,
++      0x00c6, 0x2061, 0xb774, 0x6000, 0x81ff, 0x0110, 0xa205, 0x0008,
++      0xa204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138,
++      0x6808, 0xa005, 0x0120, 0x8001, 0x680a, 0xa085, 0x0001, 0x0005,
++      0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x1208, 0xa200,
++      0x1f04, 0x6afc, 0x8086, 0x818e, 0x0005, 0x0156, 0x20a9, 0x0010,
++      0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a,
++      0x1220, 0x1f04, 0x6b0c, 0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04,
++      0x6b0c, 0x0006, 0x3200, 0xa084, 0xefff, 0x2080, 0x000e, 0x015e,
++      0x0005, 0x0006, 0x3200, 0xa085, 0x1000, 0x0cb8, 0x0126, 0x2091,
++      0x2800, 0x2079, 0xb6e0, 0x012e, 0x00d6, 0x2069, 0xb6e0, 0x6803,
++      0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001, 0x206a, 0x00de,
++      0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, 0xa084, 0x0007, 0x0002,
++      0x6b4a, 0x6b6b, 0x6bbe, 0x6b50, 0x6b6b, 0x6b4a, 0x6b48, 0x6b48,
++      0x080c, 0x1511, 0x080c, 0x69d5, 0x080c, 0x7134, 0x00ce, 0x0005,
++      0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, 0x4a96, 0x080c,
++      0x6961, 0x7828, 0xa092, 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c,
++      0x4ad0, 0x0c88, 0x080c, 0x4a96, 0x7807, 0x0003, 0x7827, 0x0000,
++      0x782b, 0x0000, 0x0c40, 0x080c, 0x69d5, 0x3c00, 0x0006, 0x2011,
++      0x0209, 0x20e1, 0x4000, 0x2214, 0x000e, 0x20e0, 0x82ff, 0x0178,
++      0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0xa065, 0x090c,
++      0x1511, 0x2009, 0x0013, 0x080c, 0x85ef, 0x00ce, 0x0005, 0x3900,
++      0xa082, 0xb82c, 0x1210, 0x080c, 0x82d5, 0x00c6, 0x7824, 0xa065,
++      0x090c, 0x1511, 0x7804, 0xa086, 0x0004, 0x0904, 0x6bfe, 0x7828,
++      0xa092, 0x2710, 0x1230, 0x8000, 0x782a, 0x00ce, 0x080c, 0x7d17,
++      0x0c20, 0x6104, 0xa186, 0x0003, 0x1188, 0x00e6, 0x2071, 0xb400,
++      0x70e0, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100,
++      0x2071, 0xb400, 0x080c, 0x4ad9, 0x00ee, 0x00ce, 0x080c, 0xb3c7,
++      0x2009, 0x0014, 0x080c, 0x85ef, 0x00ce, 0x0838, 0x2001, 0xb6fc,
++      0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824,
++      0xa065, 0x090c, 0x1511, 0x2009, 0x0013, 0x080c, 0x8643, 0x00ce,
++      0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, 0xb82c, 0x1210, 0x080c,
++      0x82d5, 0x7824, 0xa005, 0x090c, 0x1511, 0x781c, 0xa06d, 0x090c,
++      0x1511, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x080c, 0x85c0,
++      0x693c, 0x81ff, 0x090c, 0x1511, 0x8109, 0x693e, 0x6854, 0xa015,
++      0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827,
++      0x0000, 0x00de, 0x00ce, 0x080c, 0x7134, 0x0888, 0x6104, 0xa186,
++      0x0002, 0x0128, 0xa186, 0x0004, 0x0110, 0x0804, 0x6b97, 0x7808,
++      0xac06, 0x0904, 0x6b97, 0x080c, 0x7055, 0x080c, 0x6c98, 0x00ce,
++      0x080c, 0x7134, 0x0804, 0x6b85, 0x00c6, 0x6027, 0x0002, 0x62c8,
++      0x60c4, 0xa205, 0x1178, 0x793c, 0xa1e5, 0x0000, 0x0130, 0x2009,
++      0x0049, 0x080c, 0x85ef, 0x00ce, 0x0005, 0x2011, 0xb6ff, 0x2013,
++      0x0000, 0x0cc8, 0x3908, 0xa192, 0xb82c, 0x1210, 0x080c, 0x82d5,
++      0x793c, 0x81ff, 0x0d90, 0x7944, 0xa192, 0x7530, 0x12b8, 0x8108,
++      0x7946, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x1138,
++      0x6014, 0xa084, 0x0184, 0xa085, 0x0012, 0x6016, 0x08e0, 0x6014,
++      0xa084, 0x0184, 0xa085, 0x0016, 0x6016, 0x08a8, 0x7848, 0xc085,
++      0x784a, 0x0888, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000,
++      0x600f, 0x0000, 0x2c08, 0x2061, 0xb6e0, 0x6020, 0x8000, 0x6022,
++      0x6010, 0xa005, 0x0148, 0xa080, 0x0003, 0x2102, 0x6112, 0x012e,
++      0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6,
++      0x2069, 0xb6e0, 0x6000, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822,
++      0xa086, 0x0001, 0x1110, 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007,
++      0x0804, 0x713a, 0xc0d5, 0x6002, 0x6818, 0xa005, 0x0158, 0x6056,
++      0x605b, 0x0000, 0x0006, 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069,
++      0xb6e0, 0x0c18, 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x08e8,
++      0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000,
++      0x2c08, 0x2061, 0xb6e0, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005,
++      0x0148, 0xa080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e,
++      0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000,
++      0x2c08, 0x2061, 0xb6e0, 0x6034, 0xa005, 0x0130, 0xa080, 0x0003,
++      0x2102, 0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x0cd8, 0x00f6,
++      0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026,
++      0x0016, 0x0006, 0x0126, 0xa02e, 0x2071, 0xb6e0, 0x7638, 0x2660,
++      0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x6d40, 0x6018, 0xa080,
++      0x0028, 0x2004, 0xa206, 0x1904, 0x6d3b, 0x87ff, 0x0120, 0x6050,
++      0xa106, 0x1904, 0x6d3b, 0x703c, 0xac06, 0x1190, 0x0036, 0x2019,
++      0x0001, 0x080c, 0x7f8e, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043,
++      0x0000, 0x7047, 0x0000, 0x704b, 0x0000, 0x003e, 0x2029, 0x0001,
++      0x7038, 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140,
++      0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000,
++      0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++      0x600f, 0x0000, 0x080c, 0x9beb, 0x01c8, 0x6010, 0x2068, 0x601c,
++      0xa086, 0x0003, 0x1580, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++      0x0016, 0x0036, 0x0076, 0x080c, 0x9e5d, 0x080c, 0xb303, 0x080c,
++      0x53c9, 0x007e, 0x003e, 0x001e, 0x080c, 0x9da2, 0x080c, 0x9dae,
++      0x00ce, 0x0804, 0x6cdb, 0x2c78, 0x600c, 0x2060, 0x0804, 0x6cdb,
++      0x85ff, 0x0120, 0x0036, 0x080c, 0x71f1, 0x003e, 0x012e, 0x000e,
++      0x001e, 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de,
++      0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, 0x0016,
++      0x0036, 0x0076, 0x080c, 0xb303, 0x080c, 0xb01c, 0x007e, 0x003e,
++      0x001e, 0x08a0, 0x601c, 0xa086, 0x000a, 0x0904, 0x6d25, 0x0804,
++      0x6d23, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x00f6, 0x2031, 0x0000,
++      0x0126, 0x2091, 0x8000, 0x2079, 0xb6e0, 0x7838, 0xa065, 0x0568,
++      0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0xac06, 0x1180, 0x0036,
++      0x2019, 0x0001, 0x080c, 0x7f8e, 0x7833, 0x0000, 0x783f, 0x0000,
++      0x7843, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, 0x003e, 0x080c,
++      0x9beb, 0x0178, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x11b0,
++      0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x53c9, 0x080c,
++      0x9da2, 0x080c, 0x9dae, 0x000e, 0x0888, 0x7e3a, 0x7e36, 0x012e,
++      0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x601c, 0xa086,
++      0x0006, 0x1118, 0x080c, 0xb01c, 0x0c60, 0x601c, 0xa086, 0x000a,
++      0x0d08, 0x08f0, 0x0016, 0x0026, 0x0086, 0x2041, 0x0000, 0x0099,
++      0x080c, 0x6e88, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126,
++      0x2079, 0xb6e0, 0x2091, 0x8000, 0x080c, 0x6f15, 0x080c, 0x6f87,
++      0x012e, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
++      0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x7614,
++      0x2660, 0x2678, 0x8cff, 0x0904, 0x6e5e, 0x6018, 0xa080, 0x0028,
++      0x2004, 0xa206, 0x1904, 0x6e59, 0x88ff, 0x0120, 0x6050, 0xa106,
++      0x1904, 0x6e59, 0x7024, 0xac06, 0x1538, 0x2069, 0x0100, 0x68c0,
++      0xa005, 0x01f0, 0x080c, 0x69d5, 0x080c, 0x7d24, 0x68c3, 0x0000,
++      0x080c, 0x81f0, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
++      0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069,
++      0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0020,
++      0x6003, 0x0009, 0x630a, 0x04e8, 0x7014, 0xac36, 0x1110, 0x660c,
++      0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00,
++      0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06,
++      0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
++      0x080c, 0x9beb, 0x01b8, 0x601c, 0xa086, 0x0003, 0x1540, 0x6837,
++      0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c,
++      0x9e5d, 0x080c, 0xb303, 0x080c, 0x53c9, 0x008e, 0x003e, 0x001e,
++      0x080c, 0x9da2, 0x080c, 0x9dae, 0x080c, 0x80c8, 0x00ce, 0x0804,
++      0x6de2, 0x2c78, 0x600c, 0x2060, 0x0804, 0x6de2, 0x012e, 0x000e,
++      0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c,
++      0xa086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xb303,
++      0x080c, 0xb01c, 0x008e, 0x003e, 0x001e, 0x08e0, 0x601c, 0xa086,
++      0x0002, 0x1128, 0x6004, 0xa086, 0x0085, 0x0908, 0x0898, 0x601c,
++      0xa086, 0x0005, 0x1978, 0x6004, 0xa086, 0x0085, 0x0d20, 0x0850,
++      0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0xa280, 0xb535, 0x2004,
++      0xa065, 0x0904, 0x6f11, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071,
++      0xb6e0, 0x6654, 0x7018, 0xac06, 0x1108, 0x761a, 0x701c, 0xac06,
++      0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0x6058,
++      0xa07d, 0x0108, 0x7e56, 0xa6ed, 0x0000, 0x0110, 0x2f00, 0x685a,
++      0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002,
++      0x080c, 0x4e95, 0x0904, 0x6f0d, 0x7624, 0x86ff, 0x05e8, 0xa680,
++      0x0004, 0x2004, 0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0,
++      0xa005, 0x0548, 0x080c, 0x69d5, 0x080c, 0x7d24, 0x68c3, 0x0000,
++      0x080c, 0x81f0, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
++      0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069,
++      0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de,
++      0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, 0x2660, 0x080c,
++      0x9dae, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009,
++      0x630a, 0x00ce, 0x0804, 0x6eb8, 0x8dff, 0x0158, 0x6837, 0x0103,
++      0x6b4a, 0x6847, 0x0000, 0x080c, 0x9e5d, 0x080c, 0xb303, 0x080c,
++      0x53c9, 0x080c, 0x80c8, 0x0804, 0x6eb8, 0x006e, 0x00de, 0x00ee,
++      0x00fe, 0x012e, 0x000e, 0x00ce, 0x0005, 0x0006, 0x0066, 0x00c6,
++      0x00d6, 0x2031, 0x0000, 0x7814, 0xa065, 0x0904, 0x6f67, 0x600c,
++      0x0006, 0x600f, 0x0000, 0x7824, 0xac06, 0x1540, 0x2069, 0x0100,
++      0x68c0, 0xa005, 0x01f0, 0x080c, 0x69d5, 0x080c, 0x7d24, 0x68c3,
++      0x0000, 0x080c, 0x81f0, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140,
++      0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000,
++      0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++      0x0028, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00b0, 0x6010, 0x2068,
++      0x080c, 0x9beb, 0x0168, 0x601c, 0xa086, 0x0003, 0x11b8, 0x6837,
++      0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x53c9, 0x080c, 0x9da2,
++      0x080c, 0x9dae, 0x080c, 0x80c8, 0x000e, 0x0804, 0x6f1c, 0x7e16,
++      0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x601c, 0xa086,
++      0x0006, 0x1118, 0x080c, 0xb01c, 0x0c58, 0x601c, 0xa086, 0x0002,
++      0x1128, 0x6004, 0xa086, 0x0085, 0x09d0, 0x0c10, 0x601c, 0xa086,
++      0x0005, 0x19f0, 0x6004, 0xa086, 0x0085, 0x0d60, 0x08c8, 0x0006,
++      0x0066, 0x00c6, 0x00d6, 0x7818, 0xa065, 0x0904, 0x6fed, 0x6054,
++      0x0006, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc,
++      0x6002, 0x080c, 0x4e95, 0x0904, 0x6fea, 0x7e24, 0x86ff, 0x05e8,
++      0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100,
++      0x68c0, 0xa005, 0x0548, 0x080c, 0x69d5, 0x080c, 0x7d24, 0x68c3,
++      0x0000, 0x080c, 0x81f0, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140,
++      0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000,
++      0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++      0x00de, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, 0x2660,
++      0x080c, 0x9dae, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003,
++      0x0009, 0x630a, 0x00ce, 0x0804, 0x6f99, 0x8dff, 0x0138, 0x6837,
++      0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x53c9, 0x080c, 0x80c8,
++      0x0804, 0x6f99, 0x000e, 0x0804, 0x6f8c, 0x781e, 0x781a, 0x00de,
++      0x00ce, 0x006e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0066, 0x6000,
++      0xd0dc, 0x01a0, 0x604c, 0xa06d, 0x0188, 0x6848, 0xa606, 0x1170,
++      0x2071, 0xb6e0, 0x7024, 0xa035, 0x0148, 0xa080, 0x0004, 0x2004,
++      0xad06, 0x1120, 0x6000, 0xc0dc, 0x6002, 0x0021, 0x006e, 0x00de,
++      0x00ee, 0x0005, 0x00f6, 0x2079, 0x0100, 0x78c0, 0xa005, 0x1138,
++      0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x04a0, 0x080c,
++      0x7d24, 0x78c3, 0x0000, 0x080c, 0x81f0, 0x7027, 0x0000, 0x0036,
++      0x2079, 0x0140, 0x7b04, 0xa384, 0x1000, 0x0120, 0x7803, 0x0100,
++      0x7803, 0x0000, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827,
++      0x0001, 0x080c, 0x81f0, 0x003e, 0x080c, 0x4e95, 0x00c6, 0x603c,
++      0xa005, 0x0110, 0x8001, 0x603e, 0x2660, 0x080c, 0x85c0, 0x00ce,
++      0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x9e5d, 0x080c,
++      0x53c9, 0x080c, 0x80c8, 0x00fe, 0x0005, 0x00e6, 0x00c6, 0x2071,
++      0xb6e0, 0x7004, 0xa084, 0x0007, 0x0002, 0x7067, 0x706a, 0x7080,
++      0x7099, 0x70d2, 0x7067, 0x7065, 0x7065, 0x080c, 0x1511, 0x00ce,
++      0x00ee, 0x0005, 0x7024, 0xa065, 0x0148, 0x7020, 0x8001, 0x7022,
++      0x600c, 0xa015, 0x0150, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000,
++      0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, 0x7216, 0x7212, 0x0cb0,
++      0x6018, 0x2060, 0x080c, 0x4e95, 0x6000, 0xc0dc, 0x6002, 0x7020,
++      0x8001, 0x7022, 0x0120, 0x6054, 0xa015, 0x0140, 0x721e, 0x7007,
++      0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, 0x7218, 0x721e,
++      0x0cb0, 0x7024, 0xa065, 0x0598, 0x700c, 0xac06, 0x1160, 0x080c,
++      0x80c8, 0x600c, 0xa015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0428,
++      0x720e, 0x720a, 0x0410, 0x7014, 0xac06, 0x1160, 0x080c, 0x80c8,
++      0x600c, 0xa015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00b0, 0x7216,
++      0x7212, 0x0098, 0x6018, 0x2060, 0x080c, 0x4e95, 0x6000, 0xc0dc,
++      0x6002, 0x080c, 0x80c8, 0x701c, 0xa065, 0x0138, 0x6054, 0xa015,
++      0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce,
++      0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x80c8, 0x600c,
++      0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x81f0, 0x7027,
++      0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6,
++      0x2069, 0xb6e0, 0x6830, 0xa084, 0x0003, 0x0002, 0x70f4, 0x70f6,
++      0x711a, 0x70f2, 0x080c, 0x1511, 0x00de, 0x0005, 0x00c6, 0x6840,
++      0xa086, 0x0001, 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, 0xa015,
++      0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000,
++      0x2011, 0xb6ff, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a,
++      0x6836, 0x0c90, 0x6843, 0x0000, 0x6838, 0xa065, 0x0d68, 0x6003,
++      0x0003, 0x0c50, 0x00c6, 0x6843, 0x0000, 0x6847, 0x0000, 0x684b,
++      0x0000, 0x683c, 0xa065, 0x0168, 0x600c, 0xa015, 0x0130, 0x6a3a,
++      0x600f, 0x0000, 0x683f, 0x0000, 0x0020, 0x683f, 0x0000, 0x683a,
++      0x6836, 0x00ce, 0x00de, 0x0005, 0x00d6, 0x2069, 0xb6e0, 0x6804,
++      0xa084, 0x0007, 0x0002, 0x7145, 0x71e1, 0x71e1, 0x71e1, 0x71e1,
++      0x71e3, 0x7143, 0x7143, 0x080c, 0x1511, 0x6820, 0xa005, 0x1110,
++      0x00de, 0x0005, 0x00c6, 0x680c, 0xa065, 0x0150, 0x6807, 0x0004,
++      0x6826, 0x682b, 0x0000, 0x080c, 0x7233, 0x00ce, 0x00de, 0x0005,
++      0x6814, 0xa065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000,
++      0x080c, 0x7233, 0x00ce, 0x00de, 0x0005, 0x00e6, 0x0036, 0x6a1c,
++      0xa2f5, 0x0000, 0x0904, 0x71dd, 0x704c, 0xa00d, 0x0118, 0x7088,
++      0xa005, 0x01a0, 0x7054, 0xa075, 0x0120, 0xa20e, 0x0904, 0x71dd,
++      0x0028, 0x6818, 0xa20e, 0x0904, 0x71dd, 0x2070, 0x704c, 0xa00d,
++      0x0d88, 0x7088, 0xa005, 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038,
++      0xa302, 0x1e40, 0x080c, 0x8597, 0x0904, 0x71dd, 0x8318, 0x733e,
++      0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff,
++      0x605a, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, 0x2004,
++      0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b,
++      0xa318, 0x6316, 0x003e, 0x00f6, 0x2c78, 0x71a0, 0x2001, 0xb435,
++      0x2004, 0xd0ac, 0x1110, 0xd1bc, 0x0150, 0x7100, 0xd1f4, 0x0120,
++      0x7114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0,
++      0x2d88, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x080c,
++      0x785c, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26,
++      0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040,
++      0x00fe, 0x00ee, 0x00ce, 0x00de, 0x0005, 0x003e, 0x00ee, 0x00ce,
++      0x0cd0, 0x00de, 0x0005, 0x00c6, 0x680c, 0xa065, 0x0138, 0x6807,
++      0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x7233, 0x00ce, 0x00de,
++      0x0005, 0x00f6, 0x00d6, 0x2069, 0xb6e0, 0x6830, 0xa086, 0x0000,
++      0x11d0, 0x2001, 0xb40c, 0x200c, 0xd1bc, 0x1560, 0x6838, 0xa07d,
++      0x0190, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000,
++      0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1ff2, 0x1130,
++      0x012e, 0x080c, 0x7b95, 0x00de, 0x00fe, 0x0005, 0x012e, 0xe000,
++      0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0xa015, 0x0140, 0x6a3a,
++      0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c60, 0x683a,
++      0x6836, 0x0cc0, 0xc1bc, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c,
++      0x5b12, 0x006e, 0x0858, 0x601c, 0xa084, 0x000f, 0x000b, 0x0005,
++      0x7241, 0x7246, 0x76fd, 0x7819, 0x7246, 0x76fd, 0x7819, 0x7241,
++      0x7246, 0x080c, 0x7055, 0x080c, 0x7134, 0x0005, 0x0156, 0x0136,
++      0x0146, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1511,
++      0x6118, 0x2178, 0x79a0, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110,
++      0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff,
++      0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x2d88, 0x2f0d, 0xa18c,
++      0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, 0x1a04,
++      0x72ba, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005,
++      0x7369, 0x73b4, 0x73e1, 0x74ae, 0x74dc, 0x74e4, 0x750a, 0x751b,
++      0x752c, 0x7534, 0x754a, 0x7534, 0x75a4, 0x751b, 0x75c5, 0x75cd,
++      0x752c, 0x75cd, 0x75de, 0x72b8, 0x72b8, 0x72b8, 0x72b8, 0x72b8,
++      0x72b8, 0x72b8, 0x72b8, 0x72b8, 0x72b8, 0x72b8, 0x7e2f, 0x7e54,
++      0x7e69, 0x7e8c, 0x7ead, 0x750a, 0x72b8, 0x750a, 0x7534, 0x72b8,
++      0x73e1, 0x74ae, 0x72b8, 0x82f2, 0x7534, 0x72b8, 0x8312, 0x7534,
++      0x72b8, 0x752c, 0x7362, 0x72cd, 0x72b8, 0x8337, 0x83ac, 0x8483,
++      0x72b8, 0x8494, 0x7505, 0x84b0, 0x72b8, 0x7ec2, 0x850b, 0x72b8,
++      0x080c, 0x1511, 0x2100, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e,
++      0x015e, 0x0005, 0x72cb, 0x72cb, 0x72cb, 0x7301, 0x731f, 0x7335,
++      0x72cb, 0x72cb, 0x72cb, 0x080c, 0x1511, 0x00d6, 0x20a1, 0x020b,
++      0x080c, 0x75fb, 0x7810, 0x2068, 0x20a3, 0x2414, 0x20a3, 0x0018,
++      0x20a3, 0x0800, 0x683c, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x6850, 0x20a2, 0x6854, 0x20a2,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x080c, 0x7d11,
++      0x00de, 0x0005, 0x00d6, 0x7818, 0x2068, 0x68a0, 0x2069, 0xb400,
++      0x6ad4, 0xd2ac, 0x1110, 0xd0bc, 0x0110, 0xa085, 0x0001, 0x00de,
++      0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x75fb, 0x20a3, 0x0500,
++      0x20a3, 0x0000, 0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c,
++      0x20a2, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c,
++      0x20a2, 0x60c3, 0x0010, 0x080c, 0x7d11, 0x00de, 0x0005, 0x0156,
++      0x0146, 0x20a1, 0x020b, 0x080c, 0x75fb, 0x20a3, 0x7800, 0x20a3,
++      0x0000, 0x7808, 0x8007, 0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0008,
++      0x080c, 0x7d11, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1,
++      0x020b, 0x080c, 0x7697, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3,
++      0xdf10, 0x20a3, 0x0034, 0x2099, 0xb405, 0x20a9, 0x0004, 0x53a6,
++      0x2099, 0xb401, 0x20a9, 0x0004, 0x53a6, 0x2099, 0xb6c6, 0x20a9,
++      0x001a, 0x3304, 0x8007, 0x20a2, 0x9398, 0x1f04, 0x7351, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x7d11, 0x014e,
++      0x015e, 0x0005, 0x2001, 0xb415, 0x2004, 0x609a, 0x080c, 0x7d11,
++      0x0005, 0x20a1, 0x020b, 0x080c, 0x75fb, 0x20a3, 0x5200, 0x20a3,
++      0x0000, 0x00d6, 0x2069, 0xb452, 0x6804, 0xd084, 0x0150, 0x6828,
++      0x20a3, 0x0000, 0x0016, 0x080c, 0x27f7, 0x21a2, 0x001e, 0x00de,
++      0x0028, 0x00de, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004,
++      0x2099, 0xb405, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb401, 0x53a6,
++      0x2001, 0xb435, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xa082, 0x007f, 0x0238, 0x2001, 0xb41c, 0x20a6, 0x2001,
++      0xb41d, 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xb415, 0x2004,
++      0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++      0x001c, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x75fb,
++      0x20a3, 0x0500, 0x20a3, 0x0000, 0x2001, 0xb435, 0x2004, 0xd0ac,
++      0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, 0x0238,
++      0x2001, 0xb41c, 0x20a6, 0x2001, 0xb41d, 0x20a6, 0x0040, 0x20a3,
++      0x0000, 0x2001, 0xb415, 0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a9,
++      0x0004, 0x2099, 0xb405, 0x53a6, 0x60c3, 0x0010, 0x080c, 0x7d11,
++      0x0005, 0x20a1, 0x020b, 0x080c, 0x75fb, 0x00c6, 0x7818, 0x2060,
++      0x2001, 0x0000, 0x080c, 0x52d4, 0x00ce, 0x7818, 0xa080, 0x0028,
++      0x2004, 0xa086, 0x007e, 0x1130, 0x20a3, 0x0400, 0x620c, 0xc2b4,
++      0x620e, 0x0010, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x7818, 0xa080,
++      0x0028, 0x2004, 0xa086, 0x007e, 0x1904, 0x7470, 0x2001, 0xb435,
++      0x2004, 0xd0a4, 0x01c8, 0x2099, 0xb68e, 0x33a6, 0x9398, 0x20a3,
++      0x0000, 0x9398, 0x3304, 0xa084, 0x2000, 0x20a2, 0x9398, 0x33a6,
++      0x9398, 0x20a3, 0x0000, 0x9398, 0x2001, 0x2710, 0x20a2, 0x9398,
++      0x33a6, 0x9398, 0x33a6, 0x00d0, 0x2099, 0xb68e, 0x33a6, 0x9398,
++      0x33a6, 0x9398, 0x3304, 0x080c, 0x5a90, 0x1118, 0xa084, 0x37ff,
++      0x0010, 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004,
++      0x2099, 0xb405, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb401, 0x53a6,
++      0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x744a, 0x20a9, 0x0008,
++      0x20a3, 0x0000, 0x1f04, 0x7450, 0x2099, 0xb696, 0x3304, 0xc0dd,
++      0x20a2, 0x2001, 0xb472, 0x2004, 0xd0e4, 0x0158, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6, 0x20a9, 0x0004,
++      0x0010, 0x20a9, 0x0007, 0x20a3, 0x0000, 0x1f04, 0x746b, 0x0468,
++      0x2001, 0xb435, 0x2004, 0xd0a4, 0x0140, 0x2001, 0xb68f, 0x2004,
++      0x60e3, 0x0000, 0x080c, 0x2838, 0x60e2, 0x2099, 0xb68e, 0x20a9,
++      0x0008, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb405, 0x53a6, 0x20a9,
++      0x0004, 0x2099, 0xb401, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000,
++      0x1f04, 0x748e, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x7494,
++      0x2099, 0xb696, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3,
++      0x0000, 0x1f04, 0x749f, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04,
++      0x74a5, 0x60c3, 0x0074, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b,
++      0x080c, 0x75fb, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800,
++      0x20a3, 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
++      0x00f6, 0x2079, 0xb452, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085,
++      0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0xa085, 0x0002, 0x00d6,
++      0x0804, 0x7586, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
++      0x0014, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x75fb,
++      0x20a3, 0x5000, 0x0804, 0x73fc, 0x20a1, 0x020b, 0x080c, 0x75fb,
++      0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0014, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c,
++      0x768f, 0x0020, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3, 0x0200,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004,
++      0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++      0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3,
++      0x0008, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697,
++      0x20a3, 0x0200, 0x0804, 0x73fc, 0x20a1, 0x020b, 0x080c, 0x7697,
++      0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005, 0x0110, 0x20a2,
++      0x0010, 0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c,
++      0x7d11, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++      0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x7818, 0x2068, 0x6894,
++      0xa086, 0x0014, 0x1178, 0x6998, 0xa184, 0xc000, 0x1140, 0xd1ec,
++      0x0118, 0x20a3, 0x2100, 0x0040, 0x20a3, 0x0100, 0x0028, 0x20a3,
++      0x0400, 0x0010, 0x20a3, 0x0700, 0xa006, 0x20a2, 0x20a2, 0x20a2,
++      0x20a2, 0x20a2, 0x00f6, 0x2079, 0xb452, 0x7904, 0x00fe, 0xd1ac,
++      0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0x2009,
++      0xb474, 0x210c, 0xd184, 0x1110, 0xa085, 0x0002, 0x0026, 0x2009,
++      0xb472, 0x210c, 0xd1e4, 0x0130, 0xc0c5, 0xa094, 0x0030, 0xa296,
++      0x0010, 0x0140, 0xd1ec, 0x0130, 0xa094, 0x0030, 0xa296, 0x0010,
++      0x0108, 0xc0bd, 0x002e, 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014,
++      0x080c, 0x7d11, 0x00de, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697,
++      0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0100,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x60c3, 0x0014, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c,
++      0x7697, 0x20a3, 0x0200, 0x0804, 0x736f, 0x20a1, 0x020b, 0x080c,
++      0x7697, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3,
++      0x2a00, 0x60c3, 0x0008, 0x080c, 0x7d11, 0x0005, 0x20e1, 0x9080,
++      0x20e1, 0x4000, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3, 0x0100,
++      0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008,
++      0x080c, 0x7d11, 0x0005, 0x0026, 0x0036, 0x0046, 0x2019, 0x3200,
++      0x2021, 0x0800, 0x0038, 0x0026, 0x0036, 0x0046, 0x2019, 0x2200,
++      0x2021, 0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080,
++      0x0028, 0x2014, 0xa286, 0x007e, 0x11a0, 0xa385, 0x00ff, 0x20a2,
++      0x20a3, 0xfffe, 0x20a3, 0x0000, 0x2011, 0xb415, 0x2214, 0x2001,
++      0xb69e, 0x2004, 0xa005, 0x0118, 0x2011, 0xb41d, 0x2214, 0x22a2,
++      0x04d0, 0xa286, 0x007f, 0x1138, 0x00d6, 0xa385, 0x00ff, 0x20a2,
++      0x20a3, 0xfffd, 0x00c8, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x1110,
++      0xd2bc, 0x01c8, 0xa286, 0x0080, 0x00d6, 0x1130, 0xa385, 0x00ff,
++      0x20a2, 0x20a3, 0xfffc, 0x0040, 0xa2e8, 0xb535, 0x2d6c, 0x6810,
++      0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68,
++      0x2da6, 0x00de, 0x0080, 0x00d6, 0xa2e8, 0xb535, 0x2d6c, 0x6810,
++      0xa305, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011,
++      0xb415, 0x2214, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x004e, 0x003e,
++      0x20a3, 0x0000, 0x080c, 0x7d00, 0x22a2, 0x20a3, 0x0000, 0x2fa2,
++      0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005,
++      0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011,
++      0xfffc, 0x22a2, 0x00d6, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6,
++      0x00de, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x08e0, 0x20a3, 0x0100,
++      0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, 0x0005, 0x0026,
++      0x0036, 0x0046, 0x2019, 0x3300, 0x2021, 0x0800, 0x0038, 0x0026,
++      0x0036, 0x0046, 0x2019, 0x2300, 0x2021, 0x0100, 0x20e1, 0x9080,
++      0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb435,
++      0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x02d8, 0x00d6, 0xa0e8,
++      0xb535, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x6810,
++      0xa005, 0x1140, 0x6814, 0xa005, 0x1128, 0x20a3, 0x00ff, 0x20a3,
++      0xfffe, 0x0028, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++      0x0080, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa305, 0x20a2,
++      0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415, 0x2214,
++      0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3, 0x0000, 0x004e, 0x003e,
++      0x080c, 0x7d00, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x080c, 0x7d00,
++      0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7810, 0x20a2, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00c6, 0x00f6, 0x6004,
++      0xa08a, 0x0085, 0x0a0c, 0x1511, 0xa08a, 0x008c, 0x1a0c, 0x1511,
++      0x6118, 0x2178, 0x79a0, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110,
++      0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff,
++      0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x2d88, 0x2f0d, 0xa18c,
++      0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082, 0x0085, 0x001b,
++      0x00fe, 0x00ce, 0x0005, 0x7734, 0x773e, 0x7759, 0x7732, 0x7732,
++      0x7732, 0x7734, 0x080c, 0x1511, 0x0146, 0x20a1, 0x020b, 0x04a1,
++      0x60c3, 0x0000, 0x080c, 0x7d11, 0x014e, 0x0005, 0x0146, 0x20a1,
++      0x020b, 0x080c, 0x77a5, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808,
++      0x20a2, 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x7d11, 0x014e,
++      0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x77df, 0x20a3, 0x0003,
++      0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004,
++      0x080c, 0x7d11, 0x014e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb435, 0x2214,
++      0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xb535,
++      0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069,
++      0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8,
++      0xb535, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2,
++      0x00de, 0x20a3, 0x0000, 0x2011, 0xb415, 0x2214, 0x22a2, 0x20a3,
++      0x0009, 0x20a3, 0x0000, 0x0804, 0x7662, 0x0026, 0x20e1, 0x9080,
++      0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb435,
++      0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8,
++      0xb535, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2,
++      0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6,
++      0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814,
++      0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415, 0x2214, 0x22a2,
++      0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804, 0x76ee, 0x0026,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004,
++      0x2011, 0xb435, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288,
++      0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2,
++      0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++      0x0088, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x8500,
++      0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415,
++      0x2214, 0x22a2, 0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804,
++      0x76ee, 0x00c6, 0x00f6, 0x2c78, 0x7804, 0xa08a, 0x0040, 0x0a0c,
++      0x1511, 0xa08a, 0x0053, 0x1a0c, 0x1511, 0x7918, 0x2160, 0x61a0,
++      0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x6100,
++      0xd1f4, 0x0120, 0x6114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000,
++      0x0028, 0xa1e0, 0x2d88, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100,
++      0x619a, 0xa082, 0x0040, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x785c,
++      0x7968, 0x7905, 0x7b0a, 0x785a, 0x785a, 0x785a, 0x785a, 0x785a,
++      0x785a, 0x785a, 0x8081, 0x8091, 0x80a1, 0x80b1, 0x785a, 0x84c1,
++      0x785a, 0x8070, 0x080c, 0x1511, 0x00d6, 0x0156, 0x0146, 0x780b,
++      0xffff, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7910, 0x2168, 0x6948,
++      0x7952, 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184,
++      0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, 0x2001,
++      0x0004, 0x0018, 0xa084, 0x0006, 0x8004, 0x0016, 0x2008, 0x7858,
++      0xa084, 0x00ff, 0x8007, 0xa105, 0x001e, 0x20a2, 0xd1ac, 0x0118,
++      0x20a3, 0x0002, 0x0048, 0xd1b4, 0x0118, 0x20a3, 0x0001, 0x0020,
++      0x20a3, 0x0000, 0x2230, 0x0010, 0x6a80, 0x6e7c, 0x20a9, 0x0008,
++      0x0136, 0xad88, 0x0017, 0x2198, 0x20a1, 0x021b, 0x53a6, 0x013e,
++      0x20a1, 0x020b, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080,
++      0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xb6fc,
++      0x2003, 0x07d0, 0x2001, 0xb6fb, 0x2003, 0x0009, 0x080c, 0x17da,
++      0x014e, 0x015e, 0x00de, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000,
++      0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202,
++      0x8217, 0x7818, 0xa080, 0x0028, 0x2004, 0x2019, 0xb435, 0x231c,
++      0xd3ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb535, 0x2d6c,
++      0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb41c,
++      0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb535,
++      0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x00de,
++      0x20a3, 0x0000, 0x2009, 0xb415, 0x210c, 0x21a2, 0x20a3, 0x0829,
++      0x20a3, 0x0000, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x0005, 0x00d6, 0x0156, 0x0136,
++      0x0146, 0x20a1, 0x020b, 0x00c1, 0x7810, 0x2068, 0x6860, 0x20a2,
++      0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2,
++      0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, 0x080c, 0x7d11, 0x014e,
++      0x013e, 0x015e, 0x00de, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1,
++      0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb435, 0x2214,
++      0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb535, 0x2d6c,
++      0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb41c,
++      0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb535,
++      0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x00de,
++      0x20a3, 0x0000, 0x2011, 0xb415, 0x2214, 0x22a2, 0x20a3, 0x0889,
++      0x20a3, 0x0000, 0x080c, 0x7d00, 0x22a2, 0x20a3, 0x0000, 0x7a08,
++      0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005,
++      0x00d6, 0x0156, 0x0136, 0x0146, 0x7810, 0xa0ec, 0xf000, 0x0168,
++      0xa06d, 0x080c, 0x52c2, 0x0148, 0x684c, 0xa084, 0x2020, 0xa086,
++      0x2020, 0x1118, 0x7820, 0xc0cd, 0x7822, 0x20a1, 0x020b, 0x080c,
++      0x7ac0, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810,
++      0xa084, 0xf000, 0x1130, 0x7810, 0xa084, 0x0700, 0x8007, 0x0043,
++      0x0010, 0xa006, 0x002b, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
++      0x79a2, 0x7a37, 0x7a40, 0x7a69, 0x7a7c, 0x7a97, 0x7aa0, 0x79a0,
++      0x080c, 0x1511, 0x0016, 0x0036, 0x694c, 0xa18c, 0x0003, 0x0118,
++      0xa186, 0x0003, 0x1170, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5,
++      0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x003e, 0x001e, 0x0804,
++      0x7a73, 0xa186, 0x0001, 0x190c, 0x1511, 0x6b78, 0x7820, 0xd0cc,
++      0x0108, 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2,
++      0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384,
++      0x0300, 0x0904, 0x7a31, 0xd3c4, 0x0110, 0x687c, 0xa108, 0xd3cc,
++      0x0110, 0x6874, 0xa108, 0x0156, 0x20a9, 0x000d, 0xad80, 0x0020,
++      0x201c, 0x831f, 0x23a2, 0x8000, 0x1f04, 0x79e0, 0x015e, 0x22a2,
++      0x22a2, 0x22a2, 0xa184, 0x0003, 0x0904, 0x7a31, 0x20a1, 0x020b,
++      0x20e1, 0x9080, 0x20e1, 0x4000, 0x0006, 0x7818, 0xa080, 0x0028,
++      0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188,
++      0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2,
++      0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++      0x0088, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0700,
++      0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415,
++      0x2214, 0x22a2, 0x000e, 0x7b20, 0xd3cc, 0x0118, 0x20a3, 0x0889,
++      0x0010, 0x20a3, 0x0898, 0x20a2, 0x080c, 0x7d00, 0x22a2, 0x20a3,
++      0x0000, 0x61c2, 0x003e, 0x001e, 0x080c, 0x7d11, 0x0005, 0x2011,
++      0x0008, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x0488,
++      0x2011, 0x0302, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016,
++      0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008,
++      0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500,
++      0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2,
++      0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x080c, 0x7d11,
++      0x0005, 0x2011, 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2,
++      0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3,
++      0x0018, 0x080c, 0x7d11, 0x0005, 0x2011, 0x0100, 0x7820, 0xd0cc,
++      0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
++      0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7854, 0xa084, 0x00ff, 0x20a2,
++      0x22a2, 0x22a2, 0x60c3, 0x0020, 0x080c, 0x7d11, 0x0005, 0x2011,
++      0x0008, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x0888,
++      0x0036, 0x7b10, 0xa384, 0xff00, 0x7812, 0xa384, 0x00ff, 0x8001,
++      0x1138, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0x003e, 0x0808,
++      0x0046, 0x2021, 0x0800, 0x0006, 0x7820, 0xd0cc, 0x000e, 0x0108,
++      0xc4e5, 0x24a2, 0x004e, 0x22a2, 0x20a2, 0x003e, 0x0804, 0x7a73,
++      0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++      0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188,
++      0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2,
++      0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++      0x0088, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0700,
++      0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415,
++      0x2214, 0x22a2, 0x7820, 0xd0cc, 0x0118, 0x20a3, 0x0889, 0x0010,
++      0x20a3, 0x0898, 0x20a3, 0x0000, 0x080c, 0x7d00, 0x22a2, 0x20a3,
++      0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x0016, 0x0036,
++      0x7810, 0xa084, 0x0700, 0x8007, 0x003b, 0x003e, 0x001e, 0x014e,
++      0x013e, 0x015e, 0x00de, 0x0005, 0x7b24, 0x7b24, 0x7b26, 0x7b24,
++      0x7b24, 0x7b24, 0x7b48, 0x7b24, 0x080c, 0x1511, 0x7910, 0xa18c,
++      0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003,
++      0x00f9, 0x00d6, 0x2069, 0xb452, 0x6804, 0xd0bc, 0x0130, 0x682c,
++      0xa084, 0x00ff, 0x8007, 0x20a2, 0x0010, 0x20a3, 0x3f00, 0x00de,
++      0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x080c, 0x7d11, 0x0005,
++      0x20a1, 0x020b, 0x2009, 0x0003, 0x0019, 0x20a3, 0x7f00, 0x0c80,
++      0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
++      0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188,
++      0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2,
++      0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6, 0x00de,
++      0x0088, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085, 0x0100,
++      0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb415,
++      0x2214, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x080c,
++      0x7d00, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3,
++      0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6,
++      0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0xb400, 0x7154,
++      0x7818, 0x2068, 0x68a0, 0x2028, 0x76d4, 0xd6ac, 0x1130, 0xd0bc,
++      0x1120, 0x6910, 0x6a14, 0x7454, 0x0020, 0x6910, 0x6a14, 0x7370,
++      0x7474, 0x781c, 0xa0be, 0x0006, 0x0904, 0x7c4b, 0xa0be, 0x000a,
++      0x15e8, 0xa185, 0x0200, 0x6062, 0x6266, 0x636a, 0x646e, 0x6073,
++      0x2029, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e,
++      0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086,
++      0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6,
++      0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
++      0x609f, 0x0000, 0x080c, 0x855c, 0x2009, 0x07d0, 0x60c4, 0xa084,
++      0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x69da, 0x003e,
++      0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x70d4, 0xd0ac,
++      0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a,
++      0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000,
++      0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084,
++      0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082,
++      0x7808, 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e,
++      0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5,
++      0x60d7, 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120,
++      0x6a14, 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c,
++      0x855c, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, 0x0110,
++      0x2009, 0x1b58, 0x080c, 0x69da, 0x003e, 0x004e, 0x005e, 0x00ce,
++      0x00de, 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, 0xa084, 0x0003,
++      0xa086, 0x0002, 0x0904, 0x7ca1, 0x2001, 0xb435, 0x2004, 0xd0ac,
++      0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a,
++      0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000,
++      0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084,
++      0x00ff, 0x688e, 0x8007, 0x607a, 0x7834, 0x607e, 0x2f00, 0x6086,
++      0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6,
++      0x707c, 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928,
++      0xa109, 0x792a, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
++      0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294,
++      0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c, 0x8559, 0x0804,
++      0x7c39, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x1110, 0xd5bc, 0x0138,
++      0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, 0xa185,
++      0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x080c, 0x52c2,
++      0x0180, 0x00d6, 0x7810, 0xa06d, 0x684c, 0x00de, 0xa084, 0x2020,
++      0xa086, 0x2020, 0x1130, 0x7820, 0xc0cd, 0x7822, 0x6073, 0x0889,
++      0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084,
++      0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086,
++      0x7808, 0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6,
++      0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
++      0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294,
++      0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x7820, 0xd0cc, 0x0120,
++      0x080c, 0x855c, 0x0804, 0x7c39, 0x080c, 0x8559, 0x0804, 0x7c39,
++      0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202,
++      0x8217, 0x0005, 0x00d6, 0x2069, 0xb6e0, 0x6843, 0x0001, 0x00de,
++      0x0005, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x0019,
++      0x080c, 0x69cc, 0x0005, 0x0006, 0x6014, 0xa084, 0x0004, 0xa085,
++      0x0009, 0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061,
++      0x0100, 0x61a4, 0x60a7, 0x95f5, 0x6014, 0xa084, 0x0004, 0xa085,
++      0x0008, 0x6016, 0x000e, 0xe000, 0xe000, 0xe000, 0xe000, 0x61a6,
++      0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061,
++      0x0100, 0x2069, 0x0140, 0x080c, 0x5a90, 0x1198, 0x2001, 0xb6fc,
++      0x2004, 0xa005, 0x15b8, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b12,
++      0x006e, 0x1118, 0x080c, 0x69cc, 0x0468, 0x00c6, 0x2061, 0xb6e0,
++      0x00d8, 0x6904, 0xa194, 0x4000, 0x0550, 0x0831, 0x6803, 0x1000,
++      0x6803, 0x0000, 0x00c6, 0x2061, 0xb6e0, 0x6128, 0xa192, 0x00c8,
++      0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c,
++      0x69cc, 0x080c, 0x7d1b, 0x0070, 0x6124, 0xa1e5, 0x0000, 0x0140,
++      0x080c, 0xb3c7, 0x080c, 0x69d5, 0x2009, 0x0014, 0x080c, 0x85ef,
++      0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001,
++      0xb6fc, 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, 0xb6e0, 0x6128,
++      0xa192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x69cc,
++      0x080c, 0x4ad9, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026,
++      0x080c, 0x69e2, 0x2071, 0xb6e0, 0x713c, 0x81ff, 0x0590, 0x2061,
++      0x0100, 0x2069, 0x0140, 0x080c, 0x5a90, 0x11a8, 0x0036, 0x2019,
++      0x0002, 0x080c, 0x7f8e, 0x003e, 0x713c, 0x2160, 0x080c, 0xb3c7,
++      0x2009, 0x004a, 0x080c, 0x85ef, 0x0066, 0x2031, 0x0001, 0x080c,
++      0x5b12, 0x006e, 0x00b0, 0x6904, 0xa194, 0x4000, 0x01c0, 0x6803,
++      0x1000, 0x6803, 0x0000, 0x0036, 0x2019, 0x0001, 0x080c, 0x7f8e,
++      0x003e, 0x713c, 0x2160, 0x080c, 0xb3c7, 0x2009, 0x004a, 0x080c,
++      0x85ef, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c58,
++      0x0026, 0x00e6, 0x2071, 0xb6e0, 0x7048, 0xd084, 0x01c0, 0x713c,
++      0x81ff, 0x01a8, 0x2071, 0x0100, 0xa188, 0x0007, 0x2114, 0xa28e,
++      0x0006, 0x1138, 0x7014, 0xa084, 0x0184, 0xa085, 0x0012, 0x7016,
++      0x0030, 0x7014, 0xa084, 0x0184, 0xa085, 0x0016, 0x7016, 0x00ee,
++      0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046,
++      0x0006, 0x0126, 0x2091, 0x8000, 0x6018, 0x2068, 0x6ca0, 0x2071,
++      0xb6e0, 0x7018, 0x2068, 0x8dff, 0x0188, 0x68a0, 0xa406, 0x0118,
++      0x6854, 0x2068, 0x0cc0, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648,
++      0x2d60, 0x080c, 0x50db, 0x0110, 0xa085, 0x0001, 0x012e, 0x000e,
++      0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x20a1,
++      0x020b, 0x080c, 0x75fb, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x781c, 0xa086, 0x0004, 0x1110, 0x6098, 0x0018, 0x2001,
++      0xb415, 0x2004, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9,
++      0x0010, 0xa006, 0x20a2, 0x1f04, 0x7e4a, 0x20a2, 0x20a2, 0x60c3,
++      0x002c, 0x080c, 0x7d11, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b,
++      0x080c, 0x75fb, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d11, 0x014e, 0x015e,
++      0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++      0x0200, 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0xb440, 0x2019,
++      0xb441, 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x1f04,
++      0x7e79, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c,
++      0x7d11, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x0016, 0x0026,
++      0x20a1, 0x020b, 0x080c, 0x7670, 0x080c, 0x7686, 0x7810, 0xa080,
++      0x0000, 0x2004, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002,
++      0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x7d11,
++      0x002e, 0x001e, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1,
++      0x020b, 0x080c, 0x75fb, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d11, 0x014e,
++      0x015e, 0x0005, 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b,
++      0x080c, 0x75fb, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017,
++      0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2,
++      0x080c, 0x7d11, 0x002e, 0x001e, 0x014e, 0x015e, 0x0005, 0x00e6,
++      0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x700c,
++      0x2060, 0x8cff, 0x0178, 0x080c, 0x9de9, 0x1110, 0x080c, 0x8bbc,
++      0x600c, 0x0006, 0x080c, 0x9fb0, 0x080c, 0x85c0, 0x080c, 0x80c8,
++      0x00ce, 0x0c78, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x000e,
++      0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6,
++      0x00c6, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2069, 0x0100,
++      0x2079, 0x0140, 0x2071, 0xb6e0, 0x7024, 0x2060, 0x8cff, 0x05a0,
++      0x080c, 0x7d24, 0x68c3, 0x0000, 0x080c, 0x69d5, 0x2009, 0x0013,
++      0x080c, 0x85ef, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827,
++      0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803,
++      0x0000, 0x0078, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04,
++      0x7f24, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803,
++      0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee,
++      0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0xb400, 0x2004, 0xa096,
++      0x0001, 0x0590, 0xa096, 0x0004, 0x0578, 0x080c, 0x69d5, 0x6814,
++      0xa084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3,
++      0x0000, 0x2011, 0x4a96, 0x080c, 0x6961, 0x20a9, 0x01f4, 0x6824,
++      0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0,
++      0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827,
++      0x0001, 0x0010, 0x1f04, 0x7f67, 0x7804, 0xa084, 0x1000, 0x0120,
++      0x7803, 0x0100, 0x7803, 0x0000, 0x000e, 0x001e, 0x002e, 0x00ce,
++      0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126, 0x0156,
++      0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091,
++      0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0xb6e0, 0x703c,
++      0x2060, 0x8cff, 0x0904, 0x8015, 0xa386, 0x0002, 0x1128, 0x6814,
++      0xa084, 0x0002, 0x0904, 0x8015, 0x68af, 0x95f5, 0x6817, 0x0010,
++      0x2009, 0x00fa, 0x8109, 0x1df0, 0x68c7, 0x0000, 0x68cb, 0x0008,
++      0x080c, 0x69e2, 0x080c, 0x21dd, 0x0046, 0x2009, 0x017f, 0x200b,
++      0x00a5, 0x2021, 0x0169, 0x2404, 0xa084, 0x000f, 0xa086, 0x0004,
++      0x1500, 0x68af, 0x95f5, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x00e6,
++      0x00f6, 0x2079, 0x0020, 0x2071, 0xb74a, 0x6814, 0xa084, 0x0184,
++      0xa085, 0x0012, 0x6816, 0x7803, 0x0008, 0x7003, 0x0000, 0x00fe,
++      0x00ee, 0xa386, 0x0002, 0x1128, 0x7884, 0xa005, 0x1110, 0x7887,
++      0x0001, 0x2001, 0xb6b1, 0x2004, 0x200a, 0x004e, 0xa39d, 0x0000,
++      0x1120, 0x2009, 0x0049, 0x080c, 0x85ef, 0x20a9, 0x03e8, 0x6824,
++      0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0,
++      0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827,
++      0x0002, 0x0010, 0x1f04, 0x7ff7, 0x7804, 0xa084, 0x1000, 0x0120,
++      0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e,
++      0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6,
++      0x0126, 0x2091, 0x8000, 0x2069, 0xb6e0, 0x6a06, 0x012e, 0x00de,
++      0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0xb6e0, 0x6a32,
++      0x012e, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006,
++      0x0126, 0x2071, 0xb6e0, 0x7614, 0x2660, 0x2678, 0x2091, 0x8000,
++      0x8cff, 0x0538, 0x601c, 0xa206, 0x1500, 0x7014, 0xac36, 0x1110,
++      0x660c, 0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118,
++      0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00,
++      0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c,
++      0x9dae, 0x080c, 0x80c8, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060,
++      0x08b8, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005,
++      0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810, 0x20a2,
++      0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804,
++      0x80c0, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810,
++      0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000,
++      0x0478, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810,
++      0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000,
++      0x00f8, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810,
++      0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400,
++      0x0078, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x78bc, 0x7810,
++      0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200,
++      0x0089, 0x60c3, 0x0020, 0x080c, 0x7d11, 0x014e, 0x015e, 0x0005,
++      0x00e6, 0x2071, 0xb6e0, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022,
++      0x00ee, 0x0005, 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x80d4, 0x20a2,
++      0x20a2, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066,
++      0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x7614, 0x2660,
++      0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0x8169, 0x8cff, 0x0904,
++      0x8169, 0x601c, 0xa086, 0x0006, 0x1904, 0x8164, 0x88ff, 0x0138,
++      0x2800, 0xac06, 0x1904, 0x8164, 0x2039, 0x0000, 0x0050, 0x6018,
++      0xa206, 0x1904, 0x8164, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904,
++      0x8164, 0x7024, 0xac06, 0x1560, 0x2069, 0x0100, 0x68c0, 0xa005,
++      0x0518, 0x080c, 0x69d5, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5,
++      0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x81f0, 0x7027, 0x0000,
++      0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803,
++      0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
++      0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, 0x0460,
++      0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, 0x1140,
++      0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000,
++      0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++      0x89ff, 0x1158, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0x9beb,
++      0x0110, 0x080c, 0xb01c, 0x080c, 0x9dae, 0x080c, 0x80c8, 0x88ff,
++      0x1190, 0x00ce, 0x0804, 0x80eb, 0x2c78, 0x600c, 0x2060, 0x0804,
++      0x80eb, 0xa006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de,
++      0x00ee, 0x00fe, 0x0005, 0x6017, 0x0000, 0x00ce, 0xa8c5, 0x0001,
++      0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006,
++      0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x7638, 0x2660, 0x2678,
++      0x8cff, 0x0904, 0x81e0, 0x601c, 0xa086, 0x0006, 0x1904, 0x81db,
++      0x87ff, 0x0128, 0x2700, 0xac06, 0x1904, 0x81db, 0x0048, 0x6018,
++      0xa206, 0x1904, 0x81db, 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8,
++      0x703c, 0xac06, 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x7f8e,
++      0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000,
++      0x704b, 0x0000, 0x003e, 0x7038, 0xac36, 0x1110, 0x660c, 0x763a,
++      0x7034, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036,
++      0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110,
++      0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c,
++      0x9beb, 0x0110, 0x080c, 0xb01c, 0x080c, 0x9dae, 0x87ff, 0x1190,
++      0x00ce, 0x0804, 0x8188, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8188,
++      0xa006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee,
++      0x00fe, 0x0005, 0x6017, 0x0000, 0x00ce, 0xa7bd, 0x0001, 0x0c88,
++      0x00e6, 0x2071, 0xb6e0, 0x2001, 0xb400, 0x2004, 0xa086, 0x0002,
++      0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005,
++      0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091,
++      0x8000, 0x2071, 0xb6e0, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff,
++      0x0518, 0x2200, 0xac06, 0x11e0, 0x7038, 0xac36, 0x1110, 0x660c,
++      0x763a, 0x7034, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00,
++      0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0110,
++      0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0xa085, 0x0001, 0x0020,
++      0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e,
++      0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
++      0x0066, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb6e0, 0x760c,
++      0x2660, 0x2678, 0x8cff, 0x0904, 0x82c6, 0x6018, 0xa080, 0x0028,
++      0x2004, 0xa206, 0x1904, 0x82c1, 0x7024, 0xac06, 0x1508, 0x2069,
++      0x0100, 0x68c0, 0xa005, 0x0904, 0x829d, 0x080c, 0x7d24, 0x68c3,
++      0x0000, 0x080c, 0x81f0, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140,
++      0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000,
++      0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++      0x700c, 0xac36, 0x1110, 0x660c, 0x760e, 0x7008, 0xac36, 0x1140,
++      0x2c00, 0xaf36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000,
++      0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++      0x600f, 0x0000, 0x080c, 0x9dd8, 0x1158, 0x080c, 0x2c86, 0x080c,
++      0x9de9, 0x11f0, 0x080c, 0x8bbc, 0x00d8, 0x080c, 0x81f0, 0x08c0,
++      0x080c, 0x9de9, 0x1118, 0x080c, 0x8bbc, 0x0090, 0x6010, 0x2068,
++      0x080c, 0x9beb, 0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837,
++      0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x53c9, 0x080c, 0x9da2,
++      0x080c, 0x9fb0, 0x080c, 0x9dae, 0x080c, 0x80c8, 0x00ce, 0x0804,
++      0x824a, 0x2c78, 0x600c, 0x2060, 0x0804, 0x824a, 0x012e, 0x000e,
++      0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086,
++      0x0006, 0x1d30, 0x080c, 0xb01c, 0x0c18, 0x0036, 0x0156, 0x0136,
++      0x0146, 0x3908, 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x2a7d,
++      0x1118, 0x8210, 0x8000, 0x0cc8, 0xa005, 0x0138, 0x20a9, 0x0020,
++      0x2198, 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x014e, 0x013e, 0x015e,
++      0x003e, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++      0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x2099, 0xb6b9, 0x20a9, 0x0004, 0x53a6, 0x20a3, 0x0004,
++      0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x080c, 0x7d11,
++      0x00de, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3, 0x0214,
++      0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084, 0xff00, 0x20a2,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
++      0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x60c3, 0x0018, 0x080c, 0x7d11, 0x0005, 0x00d6,
++      0x0016, 0x2f68, 0x2009, 0x0035, 0x080c, 0xa09b, 0x1904, 0x83a5,
++      0x20a1, 0x020b, 0x080c, 0x75fb, 0x20a3, 0x1300, 0x20a3, 0x0000,
++      0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0580, 0x7818, 0xa080,
++      0x0028, 0x2014, 0x2001, 0xb435, 0x2004, 0xd0ac, 0x11d0, 0xa286,
++      0x007e, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x04b8, 0xa286,
++      0x007f, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0478, 0xd2bc,
++      0x0180, 0xa286, 0x0080, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffc,
++      0x0428, 0xa2e8, 0xb535, 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2,
++      0x00e8, 0x20a3, 0x0000, 0x6098, 0x20a2, 0x00c0, 0x2001, 0xb435,
++      0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082,
++      0x007e, 0x0240, 0x00d6, 0x2069, 0xb41c, 0x2da6, 0x8d68, 0x2da6,
++      0x00de, 0x0020, 0x20a3, 0x0000, 0x6034, 0x20a2, 0x7834, 0x20a2,
++      0x7838, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c,
++      0x080c, 0x7d11, 0x001e, 0x00de, 0x0005, 0x7817, 0x0001, 0x7803,
++      0x0006, 0x001e, 0x00de, 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168,
++      0x691c, 0xa186, 0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x841b,
++      0xa186, 0x0005, 0x0904, 0x8404, 0xa186, 0x0004, 0x05b8, 0xa186,
++      0x0008, 0x0904, 0x840c, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c,
++      0x8483, 0x002e, 0x00de, 0x0005, 0x080c, 0x843f, 0x2009, 0x4000,
++      0x6800, 0x0002, 0x83e5, 0x83f0, 0x83e7, 0x83f0, 0x83ec, 0x83e5,
++      0x83e5, 0x83f0, 0x83f0, 0x83f0, 0x83f0, 0x83e5, 0x83e5, 0x83e5,
++      0x83e5, 0x83e5, 0x83f0, 0x83e5, 0x83f0, 0x080c, 0x1511, 0x6820,
++      0xd0e4, 0x0110, 0xd0cc, 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000,
++      0x6828, 0x20a2, 0x682c, 0x20a2, 0x0804, 0x8435, 0x080c, 0x843f,
++      0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, 0x6a00, 0xa286,
++      0x0002, 0x1108, 0xa00e, 0x0488, 0x04d1, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x2009, 0x4000, 0x0448, 0x0491, 0x20a3, 0x0000, 0x20a3,
++      0x0000, 0x2009, 0x4000, 0xa286, 0x0005, 0x0118, 0xa286, 0x0002,
++      0x1108, 0xa00e, 0x00d0, 0x0419, 0x6810, 0x2068, 0x697c, 0x6810,
++      0xa112, 0x6980, 0x6814, 0xa103, 0x20a2, 0x22a2, 0x7928, 0xa180,
++      0x0000, 0x2004, 0xa08e, 0x0002, 0x0130, 0xa08e, 0x0004, 0x0118,
++      0x2009, 0x4000, 0x0010, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000,
++      0x60c3, 0x0018, 0x080c, 0x7d11, 0x002e, 0x00de, 0x0005, 0x0036,
++      0x0046, 0x0056, 0x0066, 0x20a1, 0x020b, 0x080c, 0x7697, 0xa006,
++      0x20a3, 0x0200, 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818,
++      0xa080, 0x0028, 0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1118,
++      0xa092, 0x007e, 0x0268, 0x00d6, 0x2069, 0xb41c, 0x2d2c, 0x8d68,
++      0x2d34, 0xa0e8, 0xb535, 0x2d6c, 0x6b10, 0x6c14, 0x00de, 0x0030,
++      0x2019, 0x0000, 0x6498, 0x2029, 0x0000, 0x6634, 0x7828, 0xa080,
++      0x0007, 0x2004, 0xa086, 0x0003, 0x1128, 0x25a2, 0x26a2, 0x23a2,
++      0x24a2, 0x0020, 0x23a2, 0x24a2, 0x25a2, 0x26a2, 0x006e, 0x005e,
++      0x004e, 0x003e, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7697, 0x20a3,
++      0x0100, 0x20a3, 0x0000, 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3,
++      0x0008, 0x080c, 0x7d11, 0x0005, 0x20a1, 0x020b, 0x080c, 0x75f3,
++      0x20a3, 0x1400, 0x20a3, 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2,
++      0x7828, 0x20a2, 0x782c, 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007,
++      0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0010, 0x080c, 0x7d11, 0x0005,
++      0x20a1, 0x020b, 0x080c, 0x768f, 0x20a3, 0x0100, 0x20a3, 0x0000,
++      0x7828, 0x20a2, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d11,
++      0x0005, 0x0146, 0x20a1, 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c,
++      0x7d11, 0x014e, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818,
++      0xa080, 0x0028, 0x2004, 0x2011, 0xb435, 0x2214, 0xd2ac, 0x1110,
++      0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810, 0xa085,
++      0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb41c, 0x2da6, 0x8d68,
++      0x2da6, 0x00de, 0x0078, 0x00d6, 0xa0e8, 0xb535, 0x2d6c, 0x6810,
++      0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000,
++      0x6234, 0x22a2, 0x20a3, 0x0819, 0x20a3, 0x0000, 0x080c, 0x7d00,
++      0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x7a08, 0x22a2, 0x20a3, 0x0000,
++      0x20a3, 0x0000, 0x0005, 0x20a1, 0x020b, 0x0079, 0x7910, 0x21a2,
++      0x20a3, 0x0000, 0x60c3, 0x0000, 0x20e1, 0x9080, 0x60a7, 0x9575,
++      0x080c, 0x7d1b, 0x080c, 0x69cc, 0x0005, 0x0156, 0x0136, 0x0036,
++      0x00d6, 0x00e6, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7854, 0x2068,
++      0xadf0, 0x000f, 0x7210, 0xa296, 0x00c0, 0xa294, 0xfffd, 0x7212,
++      0x7214, 0xa294, 0x0300, 0x7216, 0x7100, 0xa194, 0x00ff, 0x7308,
++      0xa384, 0x00ff, 0xa08d, 0xc200, 0x7102, 0xa384, 0xff00, 0xa215,
++      0x720a, 0x7004, 0x720c, 0x700e, 0x7206, 0x20a9, 0x000a, 0x2e98,
++      0x53a6, 0x60a3, 0x0035, 0x6a38, 0xa294, 0x7000, 0xa286, 0x3000,
++      0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x003e, 0x013e, 0x015e,
++      0x0005, 0x2009, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036,
++      0x6116, 0x0005, 0x2061, 0xbc00, 0x2a70, 0x7068, 0x704a, 0x704f,
++      0xbc00, 0x0005, 0x00e6, 0x0126, 0x2071, 0xb400, 0x2091, 0x8000,
++      0x7548, 0xa582, 0x0010, 0x0608, 0x704c, 0x2060, 0x6000, 0xa086,
++      0x0000, 0x0148, 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0,
++      0x2061, 0xbc00, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8,
++      0x0018, 0x705c, 0xa502, 0x1230, 0x754e, 0xa085, 0x0001, 0x012e,
++      0x00ee, 0x0005, 0x704f, 0xbc00, 0x0cc0, 0xa006, 0x0cc0, 0x00e6,
++      0x2071, 0xb400, 0x7548, 0xa582, 0x0010, 0x0600, 0x704c, 0x2060,
++      0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c, 0xac02,
++      0x1208, 0x0cb0, 0x2061, 0xbc00, 0x0c98, 0x6003, 0x0008, 0x8529,
++      0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1228, 0x754e, 0xa085,
++      0x0001, 0x00ee, 0x0005, 0x704f, 0xbc00, 0x0cc8, 0xa006, 0x0cc8,
++      0xac82, 0xbc00, 0x0a0c, 0x1511, 0x2001, 0xb417, 0x2004, 0xac02,
++      0x1a0c, 0x1511, 0xa006, 0x6006, 0x600a, 0x600e, 0x6012, 0x6016,
++      0x601a, 0x601f, 0x0000, 0x6003, 0x0000, 0x6052, 0x6056, 0x6022,
++      0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x2061,
++      0xb400, 0x6048, 0x8000, 0x604a, 0xa086, 0x0001, 0x0108, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0cc0, 0x601c,
++      0xa084, 0x000f, 0x0002, 0x85fe, 0x860d, 0x8628, 0x8643, 0xa0df,
++      0xa0fa, 0xa115, 0x85fe, 0x860d, 0x85fe, 0x865e, 0xa186, 0x0013,
++      0x1128, 0x080c, 0x7055, 0x080c, 0x7134, 0x0005, 0xa18e, 0x0047,
++      0x1118, 0xa016, 0x080c, 0x1856, 0x0005, 0x0066, 0x6000, 0xa0b2,
++      0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e, 0x0005, 0x8626, 0x8a3e,
++      0x8bf6, 0x8626, 0x8c6b, 0x871c, 0x8626, 0x8626, 0x89d0, 0x908f,
++      0x8626, 0x8626, 0x8626, 0x8626, 0x8626, 0x8626, 0x080c, 0x1511,
++      0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e,
++      0x0005, 0x8641, 0x96bb, 0x8641, 0x8641, 0x8641, 0x8641, 0x8641,
++      0x8641, 0x9666, 0x9827, 0x8641, 0x96e8, 0x975f, 0x96e8, 0x975f,
++      0x8641, 0x080c, 0x1511, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c,
++      0x1511, 0x0013, 0x006e, 0x0005, 0x865c, 0x90d0, 0x919a, 0x92ce,
++      0x942a, 0x865c, 0x865c, 0x865c, 0x90aa, 0x9616, 0x9619, 0x865c,
++      0x865c, 0x865c, 0x865c, 0x9643, 0x080c, 0x1511, 0x0066, 0x6000,
++      0xa0b2, 0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e, 0x0005, 0x8677,
++      0x8677, 0x8677, 0x86a5, 0x86f2, 0x8677, 0x8677, 0x8677, 0x8679,
++      0x8677, 0x8677, 0x8677, 0x8677, 0x8677, 0x8677, 0x8677, 0x080c,
++      0x1511, 0xa186, 0x0003, 0x190c, 0x1511, 0x00d6, 0x6003, 0x0003,
++      0x6106, 0x6010, 0x2068, 0x684f, 0x0040, 0x687c, 0x680a, 0x6880,
++      0x680e, 0x6813, 0x0000, 0x6817, 0x0000, 0x6854, 0xa092, 0x199a,
++      0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0xa210, 0x6216,
++      0x00de, 0x2c10, 0x080c, 0x1f7a, 0x080c, 0x6cb5, 0x0126, 0x2091,
++      0x8000, 0x080c, 0x71f1, 0x012e, 0x0005, 0xa182, 0x0047, 0x0002,
++      0x86b1, 0x86b1, 0x86b3, 0x86cc, 0x86b1, 0x86b1, 0x86b1, 0x86b1,
++      0x86de, 0x080c, 0x1511, 0x00d6, 0x0016, 0x080c, 0x70e7, 0x080c,
++      0x71f1, 0x6003, 0x0004, 0x6110, 0x2168, 0x684f, 0x0020, 0x685c,
++      0x685a, 0x6874, 0x687e, 0x6878, 0x6882, 0x6897, 0x0000, 0x689b,
++      0x0000, 0x001e, 0x00de, 0x0005, 0x080c, 0x70e7, 0x00d6, 0x6110,
++      0x2168, 0x080c, 0x9beb, 0x0120, 0x684b, 0x0006, 0x080c, 0x53c9,
++      0x00de, 0x080c, 0x85c0, 0x080c, 0x71f1, 0x0005, 0x080c, 0x70e7,
++      0x080c, 0x2c60, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9beb, 0x0120,
++      0x684b, 0x0029, 0x080c, 0x53c9, 0x00de, 0x080c, 0x85c0, 0x080c,
++      0x71f1, 0x0005, 0xa182, 0x0047, 0x0002, 0x8700, 0x870f, 0x86fe,
++      0x86fe, 0x86fe, 0x86fe, 0x86fe, 0x86fe, 0x86fe, 0x080c, 0x1511,
++      0x00d6, 0x6010, 0x2068, 0x684c, 0xc0f4, 0x684e, 0x00de, 0x20e1,
++      0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x0005, 0x00d6,
++      0x6110, 0x2168, 0x684b, 0x0000, 0x6853, 0x0000, 0x080c, 0x53c9,
++      0x00de, 0x080c, 0x85c0, 0x0005, 0xa1b6, 0x0015, 0x1118, 0x080c,
++      0x85c0, 0x0030, 0xa1b6, 0x0016, 0x190c, 0x1511, 0x080c, 0x85c0,
++      0x0005, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0x20a9,
++      0x0006, 0x3310, 0x3420, 0x9398, 0x94a0, 0x3318, 0x3428, 0x222e,
++      0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0,
++      0x0002, 0x1f04, 0x8737, 0x00e6, 0x080c, 0x9beb, 0x0130, 0x6010,
++      0x2070, 0x7007, 0x0000, 0x7037, 0x0103, 0x00ee, 0x080c, 0x85c0,
++      0x0005, 0x00d6, 0x0036, 0x7330, 0xa386, 0x0200, 0x1130, 0x6018,
++      0x2068, 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0130,
++      0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x080c, 0x85c0,
++      0x003e, 0x00de, 0x0005, 0x0016, 0x20a9, 0x002a, 0xae80, 0x000c,
++      0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a,
++      0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3,
++      0x00e6, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c,
++      0x85c0, 0x001e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, 0xa086,
++      0x0100, 0x0140, 0x7038, 0xa084, 0x00ff, 0x800c, 0x703c, 0xa084,
++      0x00ff, 0x8004, 0xa080, 0x0004, 0xa108, 0x21a8, 0xae80, 0x000c,
++      0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x080c, 0x4b49, 0x00e6,
++      0x080c, 0x9beb, 0x0140, 0x6010, 0x2070, 0x7007, 0x0000, 0x7034,
++      0x70b2, 0x7037, 0x0103, 0x00ee, 0x080c, 0x85c0, 0x001e, 0x0005,
++      0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035,
++      0x080c, 0xa09b, 0x001e, 0x1168, 0x0026, 0x6228, 0x2268, 0x002e,
++      0x2071, 0xba8c, 0x6b1c, 0xa386, 0x0003, 0x0130, 0xa386, 0x0006,
++      0x0128, 0x080c, 0x85c0, 0x0020, 0x0031, 0x0010, 0x080c, 0x8899,
++      0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, 0x2078, 0xa186, 0x0015,
++      0x0904, 0x8880, 0xa18e, 0x0016, 0x1904, 0x8897, 0x700c, 0xa08c,
++      0xff00, 0xa186, 0x1700, 0x0120, 0xa186, 0x0300, 0x1904, 0x885f,
++      0x8fff, 0x1138, 0x6800, 0xa086, 0x000f, 0x0904, 0x8843, 0x0804,
++      0x8895, 0x6808, 0xa086, 0xffff, 0x1904, 0x8882, 0x784c, 0xa084,
++      0x0060, 0xa086, 0x0020, 0x1150, 0x797c, 0x7810, 0xa106, 0x1904,
++      0x8882, 0x7980, 0x7814, 0xa106, 0x1904, 0x8882, 0x080c, 0x9da2,
++      0x6858, 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4, 0x784e, 0x0026,
++      0xa00e, 0x6a14, 0x2001, 0x000a, 0x080c, 0x6b05, 0x7854, 0xa20a,
++      0x0208, 0x8011, 0x7a56, 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60,
++      0x080c, 0x99a2, 0x00ce, 0x0804, 0x8895, 0x00c6, 0x00d6, 0x2f68,
++      0x6838, 0xd0fc, 0x1118, 0x080c, 0x4c1e, 0x0010, 0x080c, 0x4e0a,
++      0x00de, 0x00ce, 0x1904, 0x8882, 0x00c6, 0x2d60, 0x080c, 0x85c0,
++      0x00ce, 0x0804, 0x8895, 0x00c6, 0x080c, 0x9e67, 0x0190, 0x6013,
++      0x0000, 0x6818, 0x601a, 0x080c, 0x9fb8, 0x601f, 0x0003, 0x6904,
++      0x00c6, 0x2d60, 0x080c, 0x85c0, 0x00ce, 0x080c, 0x85ef, 0x00ce,
++      0x04e0, 0x2001, 0xb6b8, 0x2004, 0x683e, 0x00ce, 0x04b0, 0x7008,
++      0xa086, 0x000b, 0x11a0, 0x6018, 0x200c, 0xc1bc, 0x2102, 0x00c6,
++      0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f,
++      0x0002, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00ce, 0x00f0, 0x700c,
++      0xa086, 0x2a00, 0x1138, 0x2001, 0xb6b8, 0x2004, 0x683e, 0x00a8,
++      0x0481, 0x00a8, 0x8fff, 0x090c, 0x1511, 0x00c6, 0x00d6, 0x2d60,
++      0x2f68, 0x6837, 0x0103, 0x684b, 0x0003, 0x080c, 0x9896, 0x080c,
++      0x9da2, 0x080c, 0x9dae, 0x00de, 0x00ce, 0x080c, 0x85c0, 0x00fe,
++      0x0005, 0xa186, 0x0015, 0x1128, 0x2001, 0xb6b8, 0x2004, 0x683e,
++      0x0068, 0xa18e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c,
++      0xb2bd, 0x080c, 0x6ab4, 0x080c, 0x85c0, 0x00ce, 0x080c, 0x85c0,
++      0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0x7c80, 0x7b7c, 0xd2f4,
++      0x0130, 0x2001, 0xb6b8, 0x2004, 0x683e, 0x0804, 0x8913, 0x00c6,
++      0x2d60, 0x080c, 0x98b6, 0x00ce, 0x6804, 0xa086, 0x0050, 0x1168,
++      0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c,
++      0x6c52, 0x080c, 0x7134, 0x00ce, 0x04f0, 0x6800, 0xa086, 0x000f,
++      0x01c8, 0x8fff, 0x090c, 0x1511, 0x6820, 0xd0dc, 0x1198, 0x6800,
++      0xa086, 0x0004, 0x1198, 0x784c, 0xd0ac, 0x0180, 0x784c, 0xc0dc,
++      0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001, 0x0001,
++      0x682e, 0x00e0, 0x2001, 0x0007, 0x682e, 0x00c0, 0x784c, 0xd0b4,
++      0x1130, 0xd0ac, 0x0db8, 0x784c, 0xd0f4, 0x1da0, 0x0c38, 0xd2ec,
++      0x1d88, 0x7024, 0xa306, 0x1118, 0x7020, 0xa406, 0x0d58, 0x7020,
++      0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e, 0x080c, 0x9ef4,
++      0x080c, 0x7134, 0x0010, 0x080c, 0x85c0, 0x004e, 0x003e, 0x002e,
++      0x0005, 0x00e6, 0x00d6, 0x0026, 0x6034, 0x2068, 0x6a1c, 0xa286,
++      0x0007, 0x0904, 0x8977, 0xa286, 0x0002, 0x0904, 0x8977, 0xa286,
++      0x0000, 0x0904, 0x8977, 0x6808, 0x6338, 0xa306, 0x1904, 0x8977,
++      0x2071, 0xba8c, 0xa186, 0x0015, 0x05e0, 0xa18e, 0x0016, 0x1190,
++      0x6030, 0xa084, 0x00ff, 0xa086, 0x0001, 0x1160, 0x700c, 0xa086,
++      0x2a00, 0x1140, 0x6034, 0xa080, 0x0008, 0x200c, 0xc1dd, 0xc1f5,
++      0x2102, 0x0438, 0x00c6, 0x6034, 0x2060, 0x6104, 0xa186, 0x004b,
++      0x01a0, 0xa186, 0x004c, 0x0188, 0xa186, 0x004d, 0x0170, 0xa186,
++      0x004e, 0x0158, 0xa186, 0x0052, 0x0140, 0x6010, 0x2068, 0x080c,
++      0x9beb, 0x090c, 0x1511, 0x6853, 0x0003, 0x6007, 0x0085, 0x6003,
++      0x000b, 0x601f, 0x0002, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00ce,
++      0x0030, 0x6034, 0x2070, 0x2001, 0xb6b8, 0x2004, 0x703e, 0x080c,
++      0x85c0, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00d6, 0x20a9, 0x000e,
++      0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x1558, 0x6018,
++      0x2068, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c, 0xa290, 0x0004,
++      0x20a9, 0x0004, 0xad98, 0x000a, 0x080c, 0x907a, 0x002e, 0x003e,
++      0x015e, 0x11d8, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c, 0xa290,
++      0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, 0x080c, 0x907a, 0x002e,
++      0x003e, 0x015e, 0x1150, 0x7038, 0x680a, 0x703c, 0x680e, 0x6800,
++      0xc08d, 0x6802, 0x00de, 0x0804, 0x8743, 0x080c, 0x2c60, 0x00c6,
++      0x080c, 0x856a, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f, 0x0001,
++      0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x4ebe,
++      0x080c, 0x4eeb, 0x080c, 0x6c98, 0x080c, 0x7134, 0x00ce, 0x0c10,
++      0x2100, 0xa1b2, 0x0080, 0x1a0c, 0x1511, 0xa1b2, 0x0040, 0x1a04,
++      0x8a34, 0x0002, 0x8a28, 0x8a1c, 0x8a28, 0x8a28, 0x8a28, 0x8a28,
++      0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a,
++      0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a,
++      0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a,
++      0x8a1a, 0x8a28, 0x8a1a, 0x8a28, 0x8a28, 0x8a1a, 0x8a1a, 0x8a1a,
++      0x8a1a, 0x8a1a, 0x8a28, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a,
++      0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a28, 0x8a28, 0x8a1a, 0x8a1a,
++      0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a1a, 0x8a28,
++      0x8a1a, 0x8a1a, 0x080c, 0x1511, 0x6003, 0x0001, 0x6106, 0x080c,
++      0x6c98, 0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0005,
++      0x6003, 0x0001, 0x6106, 0x080c, 0x6c98, 0x0126, 0x2091, 0x8000,
++      0x080c, 0x7134, 0x012e, 0x0005, 0x2600, 0x0002, 0x8a28, 0x8a28,
++      0x8a3c, 0x8a28, 0x8a28, 0x8a3c, 0x080c, 0x1511, 0x6004, 0xa0b2,
++      0x0080, 0x1a0c, 0x1511, 0xa1b6, 0x0013, 0x0904, 0x8aee, 0xa1b6,
++      0x0027, 0x1904, 0x8ab4, 0x080c, 0x7055, 0x6004, 0x080c, 0x9dd8,
++      0x0190, 0x080c, 0x9de9, 0x0904, 0x8aae, 0xa08e, 0x0021, 0x0904,
++      0x8ab1, 0xa08e, 0x0022, 0x0904, 0x8aae, 0xa08e, 0x003d, 0x0904,
++      0x8ab1, 0x0804, 0x8aa7, 0x080c, 0x2c86, 0x2001, 0x0007, 0x080c,
++      0x4ebe, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x8bbc, 0xa186,
++      0x007e, 0x1148, 0x2001, 0xb435, 0x2014, 0xc285, 0x080c, 0x5a90,
++      0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, 0x2110, 0x0026,
++      0x2019, 0x0028, 0x080c, 0x823c, 0x002e, 0x080c, 0xb310, 0x003e,
++      0x002e, 0x001e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028,
++      0x080c, 0x6dba, 0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x00c6,
++      0x6018, 0xa065, 0x0110, 0x080c, 0x516b, 0x00ce, 0x2c08, 0x080c,
++      0xae05, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0x4f2d, 0x080c,
++      0x9fb0, 0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x080c, 0x8bbc,
++      0x0cb0, 0x080c, 0x8bea, 0x0c98, 0xa186, 0x0014, 0x1db0, 0x080c,
++      0x7055, 0x080c, 0x2c60, 0x080c, 0x9dd8, 0x1188, 0x080c, 0x2c86,
++      0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x8bbc, 0xa186, 0x007e,
++      0x1128, 0x2001, 0xb435, 0x200c, 0xc185, 0x2102, 0x08c0, 0x080c,
++      0x9de9, 0x1118, 0x080c, 0x8bbc, 0x0890, 0x6004, 0xa08e, 0x0032,
++      0x1158, 0x00e6, 0x00f6, 0x2071, 0xb482, 0x2079, 0x0000, 0x080c,
++      0x2f93, 0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e, 0x0021, 0x0d50,
++      0xa08e, 0x0022, 0x090c, 0x8bbc, 0x0804, 0x8aa7, 0xa0b2, 0x0040,
++      0x1a04, 0x8bb1, 0x2008, 0x0002, 0x8b36, 0x8b37, 0x8b3a, 0x8b3d,
++      0x8b40, 0x8b43, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34,
++      0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34,
++      0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34,
++      0x8b34, 0x8b34, 0x8b46, 0x8b55, 0x8b34, 0x8b57, 0x8b55, 0x8b34,
++      0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b55, 0x8b55, 0x8b34, 0x8b34,
++      0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b34, 0x8b91, 0x8b55,
++      0x8b34, 0x8b51, 0x8b34, 0x8b34, 0x8b34, 0x8b52, 0x8b34, 0x8b34,
++      0x8b34, 0x8b55, 0x8b88, 0x8b34, 0x080c, 0x1511, 0x00f0, 0x2001,
++      0x000b, 0x0460, 0x2001, 0x0003, 0x0448, 0x2001, 0x0005, 0x0430,
++      0x2001, 0x0001, 0x0418, 0x2001, 0x0009, 0x0400, 0x080c, 0x7055,
++      0x6003, 0x0005, 0x2001, 0xb6b8, 0x2004, 0x603e, 0x080c, 0x7134,
++      0x00a0, 0x0018, 0x0010, 0x080c, 0x4ebe, 0x0804, 0x8ba2, 0x080c,
++      0x7055, 0x2001, 0xb6b6, 0x2004, 0x6016, 0x2001, 0xb6b8, 0x2004,
++      0x603e, 0x6003, 0x0004, 0x080c, 0x7134, 0x0005, 0x080c, 0x4ebe,
++      0x080c, 0x7055, 0x6003, 0x0002, 0x2001, 0xb6b8, 0x2004, 0x603e,
++      0x0036, 0x2019, 0xb45d, 0x2304, 0xa084, 0xff00, 0x1120, 0x2001,
++      0xb6b6, 0x201c, 0x0040, 0x8007, 0xa09a, 0x0004, 0x0ec0, 0x8003,
++      0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x080c, 0x7134, 0x08e8,
++      0x080c, 0x7055, 0x080c, 0x9fb0, 0x080c, 0x85c0, 0x080c, 0x7134,
++      0x08a0, 0x00e6, 0x00f6, 0x2071, 0xb482, 0x2079, 0x0000, 0x080c,
++      0x2f93, 0x00fe, 0x00ee, 0x080c, 0x7055, 0x080c, 0x85c0, 0x080c,
++      0x7134, 0x0818, 0x080c, 0x7055, 0x2001, 0xb6b8, 0x2004, 0x603e,
++      0x6003, 0x0002, 0x2001, 0xb6b6, 0x2004, 0x6016, 0x080c, 0x7134,
++      0x0005, 0x2600, 0x2008, 0x0002, 0x8bba, 0x8bba, 0x8bba, 0x8ba2,
++      0x8ba2, 0x8bba, 0x080c, 0x1511, 0x00e6, 0x0026, 0x0016, 0x080c,
++      0x9beb, 0x0508, 0x6010, 0x2070, 0x7034, 0xa086, 0x0139, 0x1148,
++      0x2001, 0x0030, 0x2009, 0x0000, 0x2011, 0x4005, 0x080c, 0xa067,
++      0x0090, 0x7038, 0xd0fc, 0x0178, 0x7007, 0x0000, 0x0016, 0x6004,
++      0xa08e, 0x0021, 0x0160, 0xa08e, 0x003d, 0x0148, 0x001e, 0x7037,
++      0x0103, 0x7033, 0x0100, 0x001e, 0x002e, 0x00ee, 0x0005, 0x001e,
++      0x0009, 0x0cc8, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070,
++      0x7037, 0x0103, 0x7023, 0x8001, 0x00ee, 0x0005, 0x00d6, 0x6618,
++      0x2668, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa0b2, 0x000c, 0x1a0c,
++      0x1511, 0x6604, 0xa6b6, 0x0043, 0x1120, 0x080c, 0xa023, 0x0804,
++      0x8c5b, 0x6604, 0xa6b6, 0x0033, 0x1120, 0x080c, 0x9fd3, 0x0804,
++      0x8c5b, 0x6604, 0xa6b6, 0x0028, 0x1120, 0x080c, 0x9e19, 0x0804,
++      0x8c5b, 0x6604, 0xa6b6, 0x0029, 0x1118, 0x080c, 0x9e30, 0x04d8,
++      0x6604, 0xa6b6, 0x001f, 0x1118, 0x080c, 0x8729, 0x04a0, 0x6604,
++      0xa6b6, 0x0000, 0x1118, 0x080c, 0x897d, 0x0468, 0x6604, 0xa6b6,
++      0x0022, 0x1118, 0x080c, 0x8751, 0x0430, 0x6604, 0xa6b6, 0x0035,
++      0x1118, 0x080c, 0x87b8, 0x00f8, 0x6604, 0xa6b6, 0x0039, 0x1118,
++      0x080c, 0x8919, 0x00c0, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c,
++      0x876b, 0x0088, 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x878b,
++      0x0050, 0xa1b6, 0x0015, 0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016,
++      0x1118, 0x0804, 0x8e1f, 0x0005, 0x080c, 0x8606, 0x0ce0, 0x8c82,
++      0x8c85, 0x8c82, 0x8cc7, 0x8c82, 0x8dac, 0x8e2d, 0x8c82, 0x8c82,
++      0x8dfb, 0x8c82, 0x8e0f, 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005,
++      0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x0005, 0x00e6, 0xacf0,
++      0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c,
++      0x85c0, 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, 0xb400,
++      0x7084, 0xa086, 0x0074, 0x1530, 0x080c, 0xaddc, 0x11b0, 0x00d6,
++      0x6018, 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110,
++      0xc0c5, 0x6802, 0x00d9, 0x00de, 0x2001, 0x0006, 0x080c, 0x4ebe,
++      0x080c, 0x2c86, 0x080c, 0x85c0, 0x0078, 0x2001, 0x000a, 0x080c,
++      0x4ebe, 0x080c, 0x2c86, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
++      0x6c98, 0x0010, 0x080c, 0x8d99, 0x00ee, 0x0005, 0x6800, 0xd084,
++      0x0168, 0x2001, 0x0000, 0x080c, 0x4eac, 0x2069, 0xb452, 0x6804,
++      0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x4eeb, 0x0005, 0x00d6,
++      0x2011, 0xb421, 0x2204, 0xa086, 0x0074, 0x1904, 0x8d96, 0x6018,
++      0x2068, 0x6aa0, 0xa286, 0x007e, 0x1120, 0x080c, 0x8f42, 0x0804,
++      0x8d35, 0x080c, 0x8f38, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014,
++      0xa286, 0x0080, 0x11c0, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010,
++      0xa005, 0x0138, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833,
++      0x0200, 0x2001, 0x0006, 0x080c, 0x4ebe, 0x080c, 0x2c86, 0x080c,
++      0x85c0, 0x0804, 0x8d97, 0x00e6, 0x2071, 0xb435, 0x2e04, 0xd09c,
++      0x0188, 0x2071, 0xba80, 0x7108, 0x720c, 0xa18c, 0x00ff, 0x1118,
++      0xa284, 0xff00, 0x0138, 0x6018, 0x2070, 0x70a0, 0xd0bc, 0x1110,
++      0x7112, 0x7216, 0x00ee, 0x6010, 0xa005, 0x0198, 0x2068, 0x6838,
++      0xd0f4, 0x0178, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0039, 0x1958,
++      0x2001, 0x0000, 0x2009, 0x0000, 0x2011, 0x4000, 0x080c, 0xa067,
++      0x0840, 0x2001, 0x0004, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++      0x0003, 0x080c, 0x6c98, 0x0804, 0x8d97, 0x685c, 0xd0e4, 0x01d8,
++      0x080c, 0x9f63, 0x080c, 0x5a90, 0x0118, 0xd0dc, 0x1904, 0x8cf1,
++      0x2011, 0xb435, 0x2204, 0xc0ad, 0x2012, 0x2001, 0xb68f, 0x2004,
++      0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2838, 0x78e2,
++      0x00fe, 0x0804, 0x8cf1, 0x080c, 0x9f99, 0x2011, 0xb435, 0x2204,
++      0xc0a5, 0x2012, 0x0006, 0x080c, 0xaefe, 0x000e, 0x1904, 0x8cf1,
++      0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x4ebe, 0x2001, 0x0000,
++      0x080c, 0x4eac, 0x00c6, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100,
++      0x79ea, 0x7932, 0x7936, 0x00fe, 0x080c, 0x280d, 0x00f6, 0x2079,
++      0xb400, 0x7976, 0x2100, 0x2009, 0x0000, 0x080c, 0x27e3, 0x7952,
++      0x00fe, 0x8108, 0x080c, 0x4f0e, 0x2c00, 0x00ce, 0x1904, 0x8cf1,
++      0x601a, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x601f, 0x0001, 0x6003,
++      0x0001, 0x6007, 0x0002, 0x080c, 0x6c98, 0x0008, 0x0011, 0x00de,
++      0x0005, 0x2001, 0x0007, 0x080c, 0x4ebe, 0x2001, 0xb400, 0x2004,
++      0xa086, 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x4eeb, 0x080c,
++      0x2c86, 0x080c, 0x85c0, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071,
++      0xb400, 0x7084, 0xa086, 0x0014, 0x15f0, 0x7000, 0xa086, 0x0003,
++      0x1128, 0x6010, 0xa005, 0x1110, 0x080c, 0x3efc, 0x00d6, 0x6018,
++      0x2068, 0x080c, 0x500c, 0x080c, 0x8cb6, 0x00de, 0x080c, 0x8ff1,
++      0x1550, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0518,
++      0x2001, 0x0006, 0x080c, 0x4ebe, 0x00e6, 0x6010, 0xa075, 0x01a8,
++      0x7034, 0xa084, 0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, 0x0000,
++      0x2009, 0x0000, 0x2011, 0x4000, 0x080c, 0xa067, 0x0030, 0x7007,
++      0x0000, 0x7037, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2c86,
++      0x080c, 0x85c0, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x8d99, 0x001e,
++      0x002e, 0x00ee, 0x0005, 0x2011, 0xb421, 0x2204, 0xa086, 0x0014,
++      0x1158, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++      0x0001, 0x080c, 0x6c98, 0x0010, 0x080c, 0x8d99, 0x0005, 0x2011,
++      0xb421, 0x2204, 0xa086, 0x0004, 0x1138, 0x2001, 0x0007, 0x080c,
++      0x4ebe, 0x080c, 0x85c0, 0x0010, 0x080c, 0x8d99, 0x0005, 0x000b,
++      0x0005, 0x8c82, 0x8e38, 0x8c82, 0x8e6c, 0x8c82, 0x8ef4, 0x8e2d,
++      0x8c82, 0x8c82, 0x8f07, 0x8c82, 0x8f17, 0x6604, 0xa686, 0x0003,
++      0x0904, 0x8dac, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x85c0, 0x0005,
++      0x00d6, 0x00c6, 0x080c, 0x8f27, 0x1178, 0x2001, 0x0000, 0x080c,
++      0x4eac, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++      0x0002, 0x080c, 0x6c98, 0x00e8, 0x2009, 0xba8e, 0x2104, 0xa086,
++      0x0009, 0x1160, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005,
++      0x0170, 0x8001, 0x6842, 0x6017, 0x000a, 0x0058, 0x2009, 0xba8f,
++      0x2104, 0xa084, 0xff00, 0xa086, 0x1900, 0x1108, 0x08d0, 0x080c,
++      0x8d99, 0x00ce, 0x00de, 0x0005, 0x0026, 0x2011, 0x0000, 0x080c,
++      0x8f35, 0x00d6, 0x2069, 0xb69e, 0x2d04, 0xa005, 0x0168, 0x6018,
++      0x2068, 0x68a0, 0xa086, 0x007e, 0x1138, 0x2069, 0xb41d, 0x2d04,
++      0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0078, 0x2001, 0x0000,
++      0x080c, 0x4eac, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x6003, 0x0001,
++      0x6007, 0x0002, 0x080c, 0x6c98, 0x0468, 0x00d6, 0x6010, 0x2068,
++      0x080c, 0x9beb, 0x00de, 0x0108, 0x6a34, 0x080c, 0x8bbc, 0x2009,
++      0xba8e, 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x01e8, 0xa686,
++      0x000b, 0x01b0, 0x2009, 0xba8f, 0x2104, 0xa084, 0xff00, 0x1118,
++      0xa686, 0x0009, 0x0188, 0xa086, 0x1900, 0x1150, 0xa686, 0x0009,
++      0x0158, 0x2001, 0x0004, 0x080c, 0x4ebe, 0x080c, 0x85c0, 0x0010,
++      0x080c, 0x8d99, 0x002e, 0x0005, 0x00d6, 0xa286, 0x0139, 0x0160,
++      0x6010, 0x2068, 0x080c, 0x9beb, 0x0148, 0x6834, 0xa086, 0x0139,
++      0x0118, 0x6838, 0xd0fc, 0x0110, 0x00de, 0x0c50, 0x6018, 0x2068,
++      0x6840, 0xa084, 0x00ff, 0xa005, 0x0140, 0x8001, 0x6842, 0x6017,
++      0x000a, 0x6007, 0x0016, 0x00de, 0x08e8, 0x68a0, 0xa086, 0x007e,
++      0x1138, 0x00e6, 0x2071, 0xb400, 0x080c, 0x4b80, 0x00ee, 0x0010,
++      0x080c, 0x2c60, 0x00de, 0x0860, 0x080c, 0x8f35, 0x1158, 0x2001,
++      0x0004, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c,
++      0x6c98, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x8d99, 0x0005, 0x0469,
++      0x1158, 0x2001, 0x0008, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++      0x0005, 0x080c, 0x6c98, 0x0010, 0x080c, 0x8d99, 0x0005, 0x00e9,
++      0x1158, 0x2001, 0x000a, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++      0x0001, 0x080c, 0x6c98, 0x0010, 0x080c, 0x8d99, 0x0005, 0x2009,
++      0xba8e, 0x2104, 0xa086, 0x0003, 0x1138, 0x2009, 0xba8f, 0x2104,
++      0xa084, 0xff00, 0xa086, 0x2a00, 0x0005, 0xa085, 0x0001, 0x0005,
++      0x00c6, 0x0016, 0xac88, 0x0006, 0x2164, 0x080c, 0x4f79, 0x001e,
++      0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6018,
++      0x2068, 0x2071, 0xb435, 0x2e04, 0xa085, 0x0003, 0x2072, 0x080c,
++      0x8fc6, 0x0560, 0x2009, 0xb435, 0x2104, 0xc0cd, 0x200a, 0x2001,
++      0xb453, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, 0x002a,
++      0x080c, 0xb06b, 0x2001, 0xb40c, 0x200c, 0xc195, 0x2102, 0x2019,
++      0x002a, 0x2009, 0x0001, 0x080c, 0x2c33, 0x2071, 0xb400, 0x080c,
++      0x2a7e, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009, 0x007f, 0x080c,
++      0x2d5b, 0x8108, 0x1f04, 0x8f77, 0x015e, 0x00ce, 0x080c, 0x8f38,
++      0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xba80, 0x2079, 0x0100,
++      0x2e04, 0xa084, 0x00ff, 0x2069, 0xb41c, 0x206a, 0x78e6, 0x0006,
++      0x8e70, 0x2e04, 0x2069, 0xb41d, 0x206a, 0x78ea, 0x7832, 0x7836,
++      0x2010, 0xa084, 0xff00, 0x001e, 0xa105, 0x2009, 0xb428, 0x200a,
++      0x2200, 0xa084, 0x00ff, 0x2008, 0x080c, 0x280d, 0x080c, 0x5a90,
++      0x0170, 0x2069, 0xba8e, 0x2071, 0xb6b2, 0x6810, 0x2072, 0x6814,
++      0x7006, 0x6818, 0x700a, 0x681c, 0x700e, 0x080c, 0x9f63, 0x0040,
++      0x2001, 0x0006, 0x080c, 0x4ebe, 0x080c, 0x2c86, 0x080c, 0x85c0,
++      0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026, 0x0036,
++      0x00e6, 0x0156, 0x2019, 0xb428, 0x231c, 0x83ff, 0x01e8, 0x2071,
++      0xba80, 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205,
++      0xa306, 0x1190, 0x2011, 0xba96, 0xad98, 0x000a, 0x20a9, 0x0004,
++      0x080c, 0x907a, 0x1148, 0x2011, 0xba9a, 0xad98, 0x0006, 0x20a9,
++      0x0004, 0x080c, 0x907a, 0x1100, 0x015e, 0x00ee, 0x003e, 0x002e,
++      0x0005, 0x00e6, 0x2071, 0xba8c, 0x7004, 0xa086, 0x0014, 0x11a8,
++      0x7008, 0xa086, 0x0800, 0x1188, 0x700c, 0xd0ec, 0x0160, 0xa084,
++      0x0f00, 0xa086, 0x0100, 0x1138, 0x7024, 0xd0a4, 0x1110, 0xd0ac,
++      0x0110, 0xa006, 0x0010, 0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6,
++      0x00d6, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126,
++      0x2091, 0x8000, 0x2029, 0xb6e9, 0x252c, 0x2021, 0xb6ef, 0x2424,
++      0x2061, 0xbc00, 0x2071, 0xb400, 0x7248, 0x7068, 0xa202, 0x16f0,
++      0x080c, 0xb093, 0x05a0, 0x671c, 0xa786, 0x0001, 0x0580, 0xa786,
++      0x0007, 0x0568, 0x2500, 0xac06, 0x0550, 0x2400, 0xac06, 0x0538,
++      0x00c6, 0x6000, 0xa086, 0x0004, 0x1110, 0x080c, 0x1944, 0xa786,
++      0x0008, 0x1148, 0x080c, 0x9de9, 0x1130, 0x00ce, 0x080c, 0x8bbc,
++      0x080c, 0x9dae, 0x00a0, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0160,
++      0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++      0x080c, 0x53c9, 0x080c, 0x9da2, 0x080c, 0x9dae, 0x00ce, 0xace0,
++      0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0x9024, 0x012e, 0x000e,
++      0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005,
++      0xa786, 0x0006, 0x1118, 0x080c, 0xb01c, 0x0c30, 0xa786, 0x000a,
++      0x09e0, 0x08c8, 0x220c, 0x2304, 0xa106, 0x1130, 0x8210, 0x8318,
++      0x1f04, 0x907a, 0xa006, 0x0005, 0x2304, 0xa102, 0x0218, 0x2001,
++      0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, 0x0005, 0x6004,
++      0xa08a, 0x0080, 0x1a0c, 0x1511, 0x080c, 0x9dd8, 0x0120, 0x080c,
++      0x9de9, 0x0168, 0x0028, 0x080c, 0x2c86, 0x080c, 0x9de9, 0x0138,
++      0x080c, 0x7055, 0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x080c,
++      0x8bbc, 0x0cb0, 0xa182, 0x0040, 0x0002, 0x90c0, 0x90c0, 0x90c0,
++      0x90c0, 0x90c0, 0x90c0, 0x90c0, 0x90c0, 0x90c0, 0x90c0, 0x90c0,
++      0x90c2, 0x90c2, 0x90c2, 0x90c2, 0x90c0, 0x90c0, 0x90c0, 0x90c2,
++      0x080c, 0x1511, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c,
++      0x6c52, 0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0005,
++      0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0x915c,
++      0xa186, 0x0027, 0x11e8, 0x080c, 0x7055, 0x080c, 0x2c60, 0x00d6,
++      0x6110, 0x2168, 0x080c, 0x9beb, 0x0168, 0x6837, 0x0103, 0x684b,
++      0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x080c, 0x53c9,
++      0x080c, 0x9da2, 0x00de, 0x080c, 0x85c0, 0x080c, 0x7134, 0x0005,
++      0xa186, 0x0014, 0x1120, 0x6004, 0xa082, 0x0040, 0x0428, 0xa186,
++      0x0046, 0x0138, 0xa186, 0x0045, 0x0120, 0xa186, 0x0047, 0x190c,
++      0x1511, 0x2001, 0x0109, 0x2004, 0xd084, 0x0198, 0x0126, 0x2091,
++      0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x6b39, 0x002e, 0x001e,
++      0x000e, 0x012e, 0xe000, 0x6000, 0xa086, 0x0002, 0x1110, 0x0804,
++      0x919a, 0x080c, 0x8606, 0x0005, 0x0002, 0x913a, 0x9138, 0x9138,
++      0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138, 0x9138,
++      0x9155, 0x9155, 0x9155, 0x9155, 0x9138, 0x9155, 0x9138, 0x9155,
++      0x080c, 0x1511, 0x080c, 0x7055, 0x00d6, 0x6110, 0x2168, 0x080c,
++      0x9beb, 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000,
++      0x6850, 0xc0ec, 0x6852, 0x080c, 0x53c9, 0x080c, 0x9da2, 0x00de,
++      0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x080c, 0x7055, 0x080c,
++      0x85c0, 0x080c, 0x7134, 0x0005, 0x0002, 0x9172, 0x9170, 0x9170,
++      0x9170, 0x9170, 0x9170, 0x9170, 0x9170, 0x9170, 0x9170, 0x9170,
++      0x9184, 0x9184, 0x9184, 0x9184, 0x9170, 0x9193, 0x9170, 0x9184,
++      0x080c, 0x1511, 0x080c, 0x7055, 0x2001, 0xb6b8, 0x2004, 0x603e,
++      0x6003, 0x0002, 0x080c, 0x7134, 0x6010, 0xa088, 0x0013, 0x2104,
++      0xa085, 0x0400, 0x200a, 0x0005, 0x080c, 0x7055, 0x2001, 0xb6b6,
++      0x2004, 0x6016, 0x2001, 0xb6b8, 0x2004, 0x603e, 0x6003, 0x000f,
++      0x080c, 0x7134, 0x0005, 0x080c, 0x7055, 0x080c, 0x85c0, 0x080c,
++      0x7134, 0x0005, 0xa182, 0x0040, 0x0002, 0x91b0, 0x91b0, 0x91b0,
++      0x91b0, 0x91b0, 0x91b2, 0x9290, 0x92bf, 0x91b0, 0x91b0, 0x91b0,
++      0x91b0, 0x91b0, 0x91b0, 0x91b0, 0x91b0, 0x91b0, 0x91b0, 0x91b0,
++      0x080c, 0x1511, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2071, 0xba80,
++      0x7124, 0x610a, 0x2071, 0xba8c, 0x6110, 0x2168, 0x7614, 0xa6b4,
++      0x0fff, 0x86ff, 0x0904, 0x925a, 0xa68c, 0x0c00, 0x01e8, 0x00f6,
++      0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0198, 0x684c, 0xd0ac, 0x0180,
++      0x6020, 0xd0dc, 0x1168, 0x6850, 0xd0bc, 0x1150, 0x7318, 0x6814,
++      0xa306, 0x1904, 0x926c, 0x731c, 0x6810, 0xa306, 0x1904, 0x926c,
++      0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002,
++      0x0518, 0xa186, 0x0028, 0x1128, 0x080c, 0x9dc7, 0x684b, 0x001c,
++      0x00e8, 0xd6dc, 0x01a0, 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0170,
++      0x6914, 0x6a10, 0x2100, 0xa205, 0x0148, 0x7018, 0xa106, 0x1118,
++      0x701c, 0xa206, 0x0118, 0x6962, 0x6a5e, 0xc6dc, 0x0038, 0xd6d4,
++      0x0118, 0x684b, 0x0007, 0x0010, 0x684b, 0x0000, 0x6837, 0x0103,
++      0x6e46, 0xa01e, 0xd6c4, 0x01f0, 0xa686, 0x0100, 0x1140, 0x2001,
++      0xba99, 0x2004, 0xa005, 0x1118, 0xc6c4, 0x0804, 0x91c1, 0x7328,
++      0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019,
++      0x0008, 0x0036, 0x2308, 0x2019, 0xba98, 0xad90, 0x0019, 0x080c,
++      0x98a6, 0x003e, 0xd6cc, 0x0904, 0x927f, 0x7124, 0x695a, 0x81ff,
++      0x0904, 0x927f, 0xa192, 0x0021, 0x1260, 0x2071, 0xba98, 0x831c,
++      0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x98a6, 0x080c, 0xa0c8,
++      0x04b0, 0x6838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c68,
++      0x00f6, 0x2d78, 0x080c, 0x984b, 0x00fe, 0x080c, 0xa0c8, 0x080c,
++      0x9896, 0x0438, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0188,
++      0x684c, 0xd0ac, 0x0170, 0x6020, 0xd0dc, 0x1158, 0x6850, 0xd0bc,
++      0x1140, 0x684c, 0xd0f4, 0x1128, 0x080c, 0x9ec6, 0x00de, 0x00ee,
++      0x00f0, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac,
++      0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x941c, 0x080c,
++      0x53c9, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e,
++      0x080c, 0x9e94, 0x00de, 0x00ee, 0x1110, 0x080c, 0x85c0, 0x0005,
++      0x00f6, 0x6003, 0x0003, 0x2079, 0xba8c, 0x7c04, 0x7b00, 0x7e0c,
++      0x7d08, 0x6010, 0x2078, 0x784c, 0xd0ac, 0x0138, 0x6003, 0x0002,
++      0x00fe, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0x797c, 0xa10a,
++      0x2300, 0x7a80, 0xa213, 0x2600, 0xa102, 0x2500, 0xa203, 0x0e90,
++      0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x603f, 0x0000, 0x2c10,
++      0x080c, 0x1f7a, 0x080c, 0x6cb5, 0x080c, 0x71f1, 0x0005, 0x2001,
++      0xb6b8, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005,
++      0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x0005, 0xa182, 0x0040,
++      0x0002, 0x92e4, 0x92e4, 0x92e4, 0x92e4, 0x92e4, 0x92e6, 0x9379,
++      0x92e4, 0x92e4, 0x938f, 0x93f3, 0x92e4, 0x92e4, 0x92e4, 0x92e4,
++      0x9402, 0x92e4, 0x92e4, 0x92e4, 0x080c, 0x1511, 0x0076, 0x00f6,
++      0x00e6, 0x00d6, 0x2071, 0xba8c, 0x6110, 0x2178, 0x7614, 0xa6b4,
++      0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c,
++      0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x9374, 0xa694,
++      0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e,
++      0xa284, 0x0300, 0x0904, 0x9374, 0x080c, 0x15f4, 0x090c, 0x1511,
++      0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838,
++      0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00,
++      0x0120, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186,
++      0x0002, 0x0180, 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060,
++      0xd6dc, 0x0118, 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b,
++      0x0007, 0x0010, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854,
++      0x6856, 0xa01e, 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff,
++      0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308,
++      0x2019, 0xba98, 0xad90, 0x0019, 0x080c, 0x98a6, 0x003e, 0xd6cc,
++      0x01d8, 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250,
++      0x2071, 0xba98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c,
++      0x98a6, 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a,
++      0x0c78, 0x2d78, 0x080c, 0x984b, 0x00de, 0x00ee, 0x00fe, 0x007e,
++      0x0005, 0x00f6, 0x6003, 0x0003, 0x2079, 0xba8c, 0x7c04, 0x7b00,
++      0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e,
++      0x00fe, 0x2c10, 0x080c, 0x1f7a, 0x080c, 0x7d0a, 0x0005, 0x00d6,
++      0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0120, 0x2001, 0xb6b8,
++      0x2004, 0x603e, 0x6003, 0x0002, 0x080c, 0x70e7, 0x080c, 0x71f1,
++      0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, 0x93f1, 0xd1cc, 0x0540,
++      0x6948, 0x6838, 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850,
++      0x0006, 0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156,
++      0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0x93b9, 0x015e,
++      0x000e, 0x6852, 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x161b,
++      0x0418, 0x0016, 0x080c, 0x161b, 0x00de, 0x080c, 0x9896, 0x00e0,
++      0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0180,
++      0xa086, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd1dc, 0x0118,
++      0x684b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0010,
++      0x684b, 0x0000, 0x080c, 0x53c9, 0x080c, 0x9e94, 0x1110, 0x080c,
++      0x85c0, 0x00de, 0x0005, 0x2019, 0x0001, 0x080c, 0x7f8e, 0x6003,
++      0x0002, 0x2001, 0xb6b8, 0x2004, 0x603e, 0x080c, 0x70e7, 0x080c,
++      0x71f1, 0x0005, 0x080c, 0x70e7, 0x080c, 0x2c60, 0x00d6, 0x6110,
++      0x2168, 0x080c, 0x9beb, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029,
++      0x6847, 0x0000, 0x080c, 0x53c9, 0x080c, 0x9da2, 0x00de, 0x080c,
++      0x85c0, 0x080c, 0x71f1, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138,
++      0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962,
++      0x685e, 0x0005, 0xa182, 0x0040, 0x0002, 0x9440, 0x9440, 0x9440,
++      0x9440, 0x9440, 0x9442, 0x9440, 0x94fd, 0x9509, 0x9440, 0x9440,
++      0x9440, 0x9440, 0x9440, 0x9440, 0x9440, 0x9440, 0x9440, 0x9440,
++      0x080c, 0x1511, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xba8c,
++      0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c,
++      0x52c6, 0x00fe, 0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, 0xd0f4,
++      0x0120, 0x080c, 0x9ec6, 0x0804, 0x94f8, 0x7e46, 0x7f4c, 0xc7e5,
++      0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e,
++      0x86ff, 0x0904, 0x94ee, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120,
++      0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0x94ec,
++      0xa686, 0x0100, 0x1140, 0x2001, 0xba99, 0x2004, 0xa005, 0x1118,
++      0xc6c4, 0x7e46, 0x0c28, 0x080c, 0x15f4, 0x090c, 0x1511, 0x2d00,
++      0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838,
++      0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00,
++      0x0120, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186,
++      0x0002, 0x0180, 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060,
++      0xd6dc, 0x0118, 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b,
++      0x0007, 0x0010, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854,
++      0x6856, 0xa01e, 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff,
++      0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308,
++      0x2019, 0xba98, 0xad90, 0x0019, 0x080c, 0x98a6, 0x003e, 0xd6cc,
++      0x01d8, 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250,
++      0x2071, 0xba98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c,
++      0x98a6, 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a,
++      0x0c78, 0x2d78, 0x080c, 0x984b, 0xd6dc, 0x1110, 0xa006, 0x0030,
++      0x2001, 0x0001, 0x2071, 0xba8c, 0x7218, 0x731c, 0x080c, 0x18a9,
++      0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x2001, 0xb6b8, 0x2004,
++      0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856,
++      0x0005, 0x2001, 0xb6b8, 0x2004, 0x603e, 0x00d6, 0x6003, 0x0002,
++      0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, 0x9614, 0x603f, 0x0000,
++      0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0560, 0x6814, 0x6910,
++      0xa115, 0x0540, 0x6a60, 0xa206, 0x1118, 0x685c, 0xa106, 0x0510,
++      0x684c, 0xc0e4, 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f,
++      0x0000, 0x6020, 0xd0f4, 0x1158, 0x697c, 0x6810, 0xa102, 0x603a,
++      0x6980, 0x6814, 0xa103, 0x6036, 0x6020, 0xc0f5, 0x6022, 0x00d6,
++      0x6018, 0x2068, 0x683c, 0x8000, 0x683e, 0x00de, 0x080c, 0x9ec6,
++      0x0804, 0x9614, 0x694c, 0xd1cc, 0x0904, 0x95e4, 0x6948, 0x6838,
++      0xd0fc, 0x0904, 0x95a7, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006,
++      0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0,
++      0xa086, 0x0028, 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8,
++      0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xa050,
++      0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b,
++      0x0007, 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810,
++      0x6914, 0xa115, 0x0110, 0x080c, 0x941c, 0x6848, 0x784a, 0x6860,
++      0x7862, 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98, 0x000d, 0x2009,
++      0x0020, 0x0156, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04,
++      0x9593, 0x015e, 0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, 0x080c,
++      0xa0c8, 0x001e, 0x2168, 0x080c, 0x161b, 0x0804, 0x960f, 0x0016,
++      0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0,
++      0xa086, 0x0028, 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8,
++      0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xa050,
++      0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b,
++      0x0007, 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810,
++      0x6914, 0xa115, 0x0110, 0x080c, 0x941c, 0x6860, 0x7862, 0x685c,
++      0x785e, 0x684c, 0x784e, 0x00fe, 0x080c, 0x161b, 0x00de, 0x080c,
++      0xa0c8, 0x080c, 0x9896, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184,
++      0x00ff, 0xa0b6, 0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, 0x684b,
++      0x001c, 0x00d8, 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0xa050,
++      0x0118, 0x6944, 0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, 0x684b,
++      0x0007, 0x0058, 0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, 0x6810,
++      0x6914, 0xa115, 0x0110, 0x080c, 0x941c, 0x080c, 0x53c9, 0x080c,
++      0x9e94, 0x1110, 0x080c, 0x85c0, 0x00de, 0x0005, 0x080c, 0x7055,
++      0x0010, 0x080c, 0x70e7, 0x080c, 0x9beb, 0x01c0, 0x00d6, 0x6110,
++      0x2168, 0x6837, 0x0103, 0x2009, 0xb40c, 0x210c, 0xd18c, 0x11c0,
++      0xd184, 0x1198, 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c,
++      0xb303, 0x6847, 0x0000, 0x080c, 0x53c9, 0x00de, 0x080c, 0x85c0,
++      0x080c, 0x7134, 0x080c, 0x71f1, 0x0005, 0x684b, 0x0004, 0x0c88,
++      0x684b, 0x0004, 0x0c70, 0xa182, 0x0040, 0x0002, 0x9659, 0x9659,
++      0x9659, 0x9659, 0x9659, 0x965b, 0x9659, 0x965e, 0x9659, 0x9659,
++      0x9659, 0x9659, 0x9659, 0x9659, 0x9659, 0x9659, 0x9659, 0x9659,
++      0x9659, 0x080c, 0x1511, 0x080c, 0x85c0, 0x0005, 0x0006, 0x0026,
++      0xa016, 0x080c, 0x1856, 0x002e, 0x000e, 0x0005, 0xa182, 0x0085,
++      0x0002, 0x9672, 0x9670, 0x9670, 0x967e, 0x9670, 0x9670, 0x9670,
++      0x080c, 0x1511, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c52, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0005, 0x0026, 0x0056,
++      0x00d6, 0x00e6, 0x2071, 0xba80, 0x7224, 0x6212, 0x7220, 0x080c,
++      0x9bdb, 0x01a0, 0x2268, 0x6800, 0xa086, 0x0000, 0x0178, 0x6018,
++      0x6d18, 0xa52e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0x98b6, 0x00ce,
++      0x0128, 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087,
++      0x6003, 0x0001, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00f6, 0x2278,
++      0x080c, 0x52c6, 0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, 0x00c6,
++      0x2260, 0x603f, 0x0000, 0x080c, 0x9ec6, 0x00ce, 0x00ee, 0x00de,
++      0x005e, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a,
++      0x0085, 0x0a0c, 0x1511, 0xa08a, 0x008c, 0x1a0c, 0x1511, 0xa082,
++      0x0085, 0x0072, 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c,
++      0x1511, 0x080c, 0x7055, 0x080c, 0x9dae, 0x080c, 0x7134, 0x0005,
++      0x96df, 0x96e1, 0x96e1, 0x96df, 0x96df, 0x96df, 0x96df, 0x080c,
++      0x1511, 0x080c, 0x7055, 0x080c, 0x9dae, 0x080c, 0x7134, 0x0005,
++      0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04a8,
++      0xa186, 0x0027, 0x11e8, 0x080c, 0x7055, 0x080c, 0x2c60, 0x00d6,
++      0x6010, 0x2068, 0x080c, 0x9beb, 0x0150, 0x6837, 0x0103, 0x6847,
++      0x0000, 0x684b, 0x0029, 0x080c, 0x53c9, 0x080c, 0x9da2, 0x00de,
++      0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x080c, 0x8606, 0x0ce0,
++      0xa186, 0x0014, 0x1dd0, 0x080c, 0x7055, 0x00d6, 0x6010, 0x2068,
++      0x080c, 0x9beb, 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b,
++      0x0006, 0x6850, 0xc0ec, 0x6852, 0x08f0, 0x0002, 0x972f, 0x972d,
++      0x972d, 0x972d, 0x972d, 0x972d, 0x9747, 0x080c, 0x1511, 0x080c,
++      0x7055, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118,
++      0xa186, 0x0035, 0x1118, 0x2001, 0xb6b6, 0x0010, 0x2001, 0xb6b7,
++      0x2004, 0x6016, 0x6003, 0x000c, 0x080c, 0x7134, 0x0005, 0x080c,
++      0x7055, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118,
++      0xa186, 0x0035, 0x1118, 0x2001, 0xb6b6, 0x0010, 0x2001, 0xb6b7,
++      0x2004, 0x6016, 0x6003, 0x000e, 0x080c, 0x7134, 0x0005, 0xa182,
++      0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x8606,
++      0x0005, 0x9770, 0x9770, 0x9770, 0x9770, 0x9772, 0x97cb, 0x9770,
++      0x080c, 0x1511, 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe,
++      0x0168, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118,
++      0xa186, 0x0035, 0x1118, 0x00de, 0x0804, 0x97de, 0x080c, 0x9beb,
++      0x1118, 0x080c, 0x9da2, 0x00f0, 0x6010, 0x2068, 0x684c, 0xd0e4,
++      0x1110, 0x080c, 0x9da2, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128,
++      0x684b, 0x0006, 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, 0x684b,
++      0x0002, 0x0020, 0x684b, 0x0005, 0x080c, 0x9e63, 0x6847, 0x0000,
++      0x080c, 0x53c9, 0x2c68, 0x080c, 0x856a, 0x01c0, 0x6003, 0x0001,
++      0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0xba8e, 0x210c, 0x6136,
++      0x2009, 0xba8f, 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, 0x9fb8,
++      0x6950, 0x6152, 0x601f, 0x0001, 0x080c, 0x6c52, 0x2d60, 0x080c,
++      0x85c0, 0x00de, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe,
++      0x0598, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, 0x0130,
++      0xa186, 0x001e, 0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, 0x2c68,
++      0x080c, 0xa09b, 0x1904, 0x9823, 0x080c, 0x856a, 0x01d8, 0x6106,
++      0x6003, 0x0001, 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a,
++      0x692c, 0x612e, 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136,
++      0x6938, 0x613a, 0x6950, 0x6152, 0x080c, 0x9fb8, 0x080c, 0x6c52,
++      0x080c, 0x7134, 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, 0x080c,
++      0x9beb, 0x01c8, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0xc0ec,
++      0x6852, 0x684b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002,
++      0x0020, 0x684b, 0x0005, 0x080c, 0x9e63, 0x6847, 0x0000, 0x080c,
++      0x53c9, 0x080c, 0x9da2, 0x00de, 0x080c, 0x85c0, 0x0005, 0x0016,
++      0x00d6, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0140, 0x6837, 0x0103,
++      0x684b, 0x0028, 0x6847, 0x0000, 0x080c, 0x53c9, 0x00de, 0x001e,
++      0xa186, 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027,
++      0x0118, 0x080c, 0x8606, 0x0030, 0x080c, 0x7055, 0x080c, 0x9dae,
++      0x080c, 0x7134, 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029,
++      0x0001, 0xa182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130,
++      0x2069, 0xba98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90,
++      0x001d, 0x080c, 0x98a6, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0110,
++      0x080c, 0x161b, 0x080c, 0x15f4, 0x0500, 0x8528, 0x6837, 0x0110,
++      0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d, 0x1228, 0x2608,
++      0xad90, 0x000f, 0x0459, 0x0088, 0xa6b2, 0x003c, 0x2009, 0x003c,
++      0x2d78, 0xad90, 0x000f, 0x0411, 0x0c28, 0x00fe, 0x852f, 0xa5ad,
++      0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0028, 0x00fe, 0x852f, 0xa5ad,
++      0x0003, 0x7d36, 0x00de, 0x006e, 0x005e, 0x0005, 0x00f6, 0x8dff,
++      0x0158, 0x6804, 0xa07d, 0x0130, 0x6807, 0x0000, 0x080c, 0x53c9,
++      0x2f68, 0x0cb8, 0x080c, 0x53c9, 0x00fe, 0x0005, 0x0156, 0xa184,
++      0x0001, 0x0108, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012,
++      0x8318, 0x8210, 0x1f04, 0x98ad, 0x015e, 0x0005, 0x0066, 0x0126,
++      0x2091, 0x8000, 0x2031, 0x0001, 0x601c, 0xa084, 0x000f, 0x0083,
++      0x012e, 0x006e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031,
++      0x0000, 0x601c, 0xa084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005,
++      0x98ed, 0x98ed, 0x98e8, 0x990f, 0x98db, 0x98e8, 0x990f, 0x98e8,
++      0x98e8, 0x98db, 0x98e8, 0x080c, 0x1511, 0x0036, 0x2019, 0x0010,
++      0x080c, 0xac63, 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005,
++      0xa006, 0x0005, 0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, 0x11d8,
++      0x6010, 0x2068, 0x080c, 0x9beb, 0x01c0, 0x6834, 0xa086, 0x0139,
++      0x1128, 0x684b, 0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, 0x2001,
++      0x0005, 0x080c, 0x549c, 0x080c, 0x9e63, 0x080c, 0x53c9, 0x080c,
++      0x85c0, 0xa085, 0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000,
++      0xa08a, 0x0010, 0x1a0c, 0x1511, 0x000b, 0x0005, 0x9926, 0x9947,
++      0x9928, 0x9966, 0x9944, 0x9926, 0x98e8, 0x98ed, 0x98ed, 0x98e8,
++      0x98e8, 0x98e8, 0x98e8, 0x98e8, 0x98e8, 0x98e8, 0x080c, 0x1511,
++      0x86ff, 0x11b8, 0x601c, 0xa086, 0x0006, 0x0198, 0x00d6, 0x6010,
++      0x2068, 0x080c, 0x9beb, 0x0110, 0x080c, 0x9e63, 0x00de, 0x6007,
++      0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x6c52, 0x080c,
++      0x7134, 0xa085, 0x0001, 0x0005, 0x080c, 0x1944, 0x0c08, 0x00e6,
++      0x2071, 0xb6e0, 0x7024, 0xac06, 0x1110, 0x080c, 0x7f03, 0x601c,
++      0xa084, 0x000f, 0xa086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049,
++      0x0001, 0x2c40, 0x080c, 0x80da, 0x009e, 0x008e, 0x0010, 0x080c,
++      0x7e02, 0x00ee, 0x1928, 0x080c, 0x98e8, 0x0005, 0x0036, 0x00e6,
++      0x2071, 0xb6e0, 0x703c, 0xac06, 0x1140, 0x2019, 0x0000, 0x080c,
++      0x7f8e, 0x00ee, 0x003e, 0x0804, 0x9928, 0x080c, 0x8200, 0x00ee,
++      0x003e, 0x1904, 0x9928, 0x080c, 0x98e8, 0x0005, 0x00c6, 0x601c,
++      0xa084, 0x000f, 0x0013, 0x00ce, 0x0005, 0x9997, 0x9a04, 0x9b4a,
++      0x99a2, 0x9dae, 0x9997, 0xac55, 0x85c0, 0x9a04, 0x9990, 0x9bb5,
++      0x080c, 0x1511, 0x080c, 0x9de9, 0x1110, 0x080c, 0x8bbc, 0x0005,
++      0x080c, 0x7055, 0x080c, 0x7134, 0x080c, 0x85c0, 0x0005, 0x6017,
++      0x0001, 0x0005, 0x080c, 0x9beb, 0x0120, 0x6010, 0xa080, 0x0019,
++      0x2c02, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1511, 0x000b, 0x0005,
++      0x99c0, 0x99c2, 0x99e2, 0x99f4, 0x9a01, 0x99c0, 0x9997, 0x9997,
++      0x9997, 0x99f4, 0x99f4, 0x99c0, 0x99c0, 0x99c0, 0x99c0, 0x99fe,
++      0x080c, 0x1511, 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052,
++      0x2071, 0xb6e0, 0x7024, 0xac06, 0x0190, 0x080c, 0x7e02, 0x6007,
++      0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xb6b7, 0x2004,
++      0x6016, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00ee, 0x0005, 0x6017,
++      0x0001, 0x0cd8, 0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852,
++      0x00de, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c,
++      0x6c52, 0x080c, 0x7134, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010,
++      0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x85c0,
++      0x0005, 0x080c, 0x1944, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c,
++      0x1511, 0x000b, 0x0005, 0x9a1b, 0x999f, 0x9a1d, 0x9a1b, 0x9a1d,
++      0x9a1d, 0x9998, 0x9a1b, 0x9992, 0x9992, 0x9a1b, 0x9a1b, 0x9a1b,
++      0x9a1b, 0x9a1b, 0x9a1b, 0x080c, 0x1511, 0x00d6, 0x6018, 0x2068,
++      0x6804, 0xa084, 0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x1511,
++      0x000b, 0x0005, 0x9a36, 0x9af0, 0x9a38, 0x9a72, 0x9a38, 0x9a72,
++      0x9a38, 0x9a42, 0x9a36, 0x9a72, 0x9a36, 0x9a5e, 0x080c, 0x1511,
++      0x6004, 0xa08e, 0x0016, 0x0588, 0xa08e, 0x0004, 0x0570, 0xa08e,
++      0x0002, 0x0558, 0x6004, 0x080c, 0x9de9, 0x0904, 0x9b09, 0xa08e,
++      0x0021, 0x0904, 0x9b0d, 0xa08e, 0x0022, 0x0904, 0x9b09, 0xa08e,
++      0x003d, 0x0904, 0x9b0d, 0xa08e, 0x0039, 0x0904, 0x9b11, 0xa08e,
++      0x0035, 0x0904, 0x9b11, 0xa08e, 0x001e, 0x0188, 0xa08e, 0x0001,
++      0x1150, 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x00de,
++      0xa086, 0x0006, 0x0110, 0x080c, 0x2c60, 0x080c, 0x8bbc, 0x080c,
++      0x9dae, 0x0005, 0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, 0x0904,
++      0x9ae1, 0xa186, 0x0002, 0x15d8, 0x2001, 0xb435, 0x2004, 0xd08c,
++      0x1198, 0x080c, 0x5a90, 0x1180, 0x2001, 0xb69f, 0x2003, 0x0001,
++      0x2001, 0xb400, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5ad4,
++      0x080c, 0x59c8, 0x0804, 0x9b33, 0x6018, 0x2068, 0x2001, 0xb435,
++      0x2004, 0xd0ac, 0x1904, 0x9b33, 0x68a0, 0xd0bc, 0x1904, 0x9b33,
++      0x6840, 0xa084, 0x00ff, 0xa005, 0x0190, 0x8001, 0x6842, 0x6013,
++      0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x080c,
++      0x856a, 0x0128, 0x2d00, 0x601a, 0x601f, 0x0001, 0x0450, 0x00de,
++      0x00ce, 0x6004, 0xa08e, 0x0002, 0x11a8, 0x6018, 0xa080, 0x0028,
++      0x2004, 0xa086, 0x007e, 0x1170, 0x2009, 0xb435, 0x2104, 0xc085,
++      0x200a, 0x00e6, 0x2071, 0xb400, 0x080c, 0x4b80, 0x00ee, 0x080c,
++      0x8bbc, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x2c60, 0x00e6, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x2c86, 0x012e, 0x00ee, 0x080c, 0x9dae,
++      0x0005, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x6003, 0x0001, 0x6007,
++      0x0002, 0x080c, 0x6c98, 0x080c, 0x7134, 0x00de, 0x00ce, 0x0c80,
++      0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, 0x0d58, 0x6018, 0x2068,
++      0x6840, 0xa084, 0x00ff, 0xa005, 0x0904, 0x9ab7, 0x8001, 0x6842,
++      0x6003, 0x0001, 0x080c, 0x6c98, 0x080c, 0x7134, 0x00de, 0x00ce,
++      0x08b8, 0x080c, 0x8bbc, 0x0804, 0x9a6f, 0x080c, 0x8bea, 0x0804,
++      0x9a6f, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xa09b, 0x00de, 0x0118,
++      0x080c, 0x85c0, 0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff,
++      0xa105, 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002,
++      0x6038, 0x600a, 0x2001, 0xb6b7, 0x2004, 0x6016, 0x080c, 0x6c52,
++      0x080c, 0x7134, 0x0005, 0x00de, 0x00ce, 0x080c, 0x8bbc, 0x080c,
++      0x2c60, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2c86, 0x6013,
++      0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x012e,
++      0x00ee, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1511, 0x000b,
++      0x0005, 0x9b61, 0x9b61, 0x9b61, 0x9b61, 0x9b61, 0x9b61, 0x9b61,
++      0x9b61, 0x9b61, 0x9997, 0x9b61, 0x999f, 0x9b63, 0x999f, 0x9b70,
++      0x9b61, 0x080c, 0x1511, 0x6004, 0xa086, 0x008b, 0x0148, 0x6007,
++      0x008b, 0x6003, 0x000d, 0x080c, 0x6c52, 0x080c, 0x7134, 0x0005,
++      0x080c, 0x9da2, 0x080c, 0x9beb, 0x0580, 0x080c, 0x2c60, 0x00d6,
++      0x080c, 0x9beb, 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b,
++      0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x53c9,
++      0x2c68, 0x080c, 0x856a, 0x0150, 0x6818, 0x601a, 0x080c, 0x9fb8,
++      0x00c6, 0x2d60, 0x080c, 0x9dae, 0x00ce, 0x0008, 0x2d60, 0x00de,
++      0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001,
++      0x080c, 0x6c98, 0x080c, 0x7134, 0x0078, 0x6030, 0xa08c, 0xff00,
++      0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x080c,
++      0x2c60, 0x08b0, 0x080c, 0x9dae, 0x0005, 0x6000, 0xa08a, 0x0010,
++      0x1a0c, 0x1511, 0x000b, 0x0005, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bce,
++      0x9bce, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc,
++      0x9bcc, 0x9bcc, 0x9bcc, 0x9bcc, 0x080c, 0x1511, 0x080c, 0x8200,
++      0x190c, 0x1511, 0x6110, 0x2168, 0x684b, 0x0006, 0x080c, 0x53c9,
++      0x080c, 0x85c0, 0x0005, 0xa284, 0x0007, 0x1158, 0xa282, 0xbc00,
++      0x0240, 0x2001, 0xb417, 0x2004, 0xa202, 0x1218, 0xa085, 0x0001,
++      0x0005, 0xa006, 0x0ce8, 0x0026, 0x6210, 0xa294, 0xf000, 0x002e,
++      0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000,
++      0x2061, 0xbc00, 0x2071, 0xb400, 0x7348, 0x7068, 0xa302, 0x12a8,
++      0x601c, 0xa206, 0x1160, 0x080c, 0x9f43, 0x0148, 0x080c, 0x9de9,
++      0x1110, 0x080c, 0x8bbc, 0x00c6, 0x080c, 0x85c0, 0x00ce, 0xace0,
++      0x0018, 0x705c, 0xac02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e,
++      0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0xa188, 0xb535,
++      0x210c, 0x81ff, 0x0128, 0x2061, 0xb7f4, 0x611a, 0x080c, 0x2c60,
++      0xa006, 0x0010, 0xa085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005,
++      0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a,
++      0x005e, 0x0180, 0x6612, 0x651a, 0x080c, 0x9fb8, 0x601f, 0x0003,
++      0x2009, 0x004b, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x005e,
++      0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091,
++      0x8000, 0x62a0, 0x00c6, 0x080c, 0x9e67, 0x005e, 0x0550, 0x6013,
++      0x0000, 0x651a, 0x080c, 0x9fb8, 0x601f, 0x0003, 0x0016, 0x00c6,
++      0x2560, 0x080c, 0x516b, 0x00ce, 0x080c, 0x6dba, 0x0076, 0x2039,
++      0x0000, 0x080c, 0x6cc7, 0x2c08, 0x080c, 0xae05, 0x007e, 0x001e,
++      0xd184, 0x0128, 0x080c, 0x85c0, 0xa085, 0x0001, 0x0030, 0x2009,
++      0x004c, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce,
++      0x0005, 0xa006, 0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c,
++      0x856a, 0x2c78, 0x00ce, 0x0180, 0x7e12, 0x2c00, 0x781a, 0x781f,
++      0x0003, 0x2021, 0x0005, 0x080c, 0x9ce1, 0x2f60, 0x2009, 0x004d,
++      0x080c, 0x85ef, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005,
++      0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x856a, 0x2c78, 0x00ce,
++      0x0178, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005,
++      0x0481, 0x2f60, 0x2009, 0x004e, 0x080c, 0x85ef, 0xa085, 0x0001,
++      0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6,
++      0x080c, 0x856a, 0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, 0x781a,
++      0x781f, 0x0003, 0x2021, 0x0004, 0x00a1, 0x2001, 0xb6a0, 0x2004,
++      0xd0fc, 0x0120, 0x2f60, 0x080c, 0x85c0, 0x0028, 0x2f60, 0x2009,
++      0x0052, 0x080c, 0x85ef, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe,
++      0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x510d,
++      0x0118, 0x2001, 0x9ce6, 0x0028, 0x080c, 0x50dd, 0x0158, 0x2001,
++      0x9cec, 0x0006, 0xa00e, 0x2400, 0x080c, 0x549c, 0x080c, 0x53c9,
++      0x000e, 0x0807, 0x2418, 0x080c, 0x6ff4, 0x62a0, 0x0086, 0x2041,
++      0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x6dd3, 0x008e, 0x080c,
++      0x6cc7, 0x2f08, 0x2648, 0x080c, 0xae05, 0x613c, 0x81ff, 0x090c,
++      0x6e88, 0x080c, 0x7134, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6,
++      0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0188,
++      0x660a, 0x611a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2d00, 0x6012,
++      0x2009, 0x001f, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce,
++      0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6,
++      0x080c, 0x856a, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0x9fb8,
++      0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x85ef,
++      0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6,
++      0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0188,
++      0x660a, 0x611a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2d00, 0x6012,
++      0x2009, 0x003d, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce,
++      0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6,
++      0x080c, 0x9e67, 0x001e, 0x0180, 0x611a, 0x080c, 0x9fb8, 0x601f,
++      0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x080c, 0x85ef, 0xa085,
++      0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126,
++      0x2091, 0x8000, 0x00c6, 0x080c, 0x856a, 0x001e, 0x0188, 0x660a,
++      0x611a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009,
++      0x0044, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005,
++      0xa006, 0x0cd8, 0x0026, 0x00d6, 0x6218, 0x2268, 0x6a3c, 0x82ff,
++      0x0110, 0x8211, 0x6a3e, 0x00de, 0x002e, 0x0005, 0x0006, 0x6000,
++      0xa086, 0x0000, 0x0190, 0x6013, 0x0000, 0x601f, 0x0007, 0x2001,
++      0xb6b6, 0x2004, 0x0006, 0xa082, 0x0051, 0x000e, 0x0208, 0x8004,
++      0x6016, 0x080c, 0xb2bd, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066,
++      0x00c6, 0x00d6, 0x2031, 0xb453, 0x2634, 0xd6e4, 0x0128, 0x6618,
++      0x2660, 0x6e48, 0x080c, 0x5096, 0x00de, 0x00ce, 0x006e, 0x0005,
++      0x0006, 0x0016, 0x6004, 0xa08e, 0x0002, 0x0140, 0xa08e, 0x0003,
++      0x0128, 0xa08e, 0x0004, 0x0110, 0xa085, 0x0001, 0x001e, 0x000e,
++      0x0005, 0x0006, 0x00d6, 0x6010, 0xa06d, 0x0148, 0x6834, 0xa086,
++      0x0139, 0x0138, 0x6838, 0xd0fc, 0x0110, 0xa006, 0x0010, 0xa085,
++      0x0001, 0x00de, 0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000,
++      0x00c6, 0x080c, 0x856a, 0x001e, 0x0190, 0x611a, 0x080c, 0x9fb8,
++      0x601f, 0x0001, 0x2d00, 0x6012, 0x080c, 0x2c60, 0x2009, 0x0028,
++      0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006,
++      0x0cd8, 0xa186, 0x0015, 0x1178, 0x2011, 0xb421, 0x2204, 0xa086,
++      0x0074, 0x1148, 0x080c, 0x8f38, 0x6003, 0x0001, 0x6007, 0x0029,
++      0x080c, 0x6c98, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x85c0, 0x0005,
++      0xa186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x4ebe, 0x00e8,
++      0xa186, 0x0015, 0x11e8, 0x2011, 0xb421, 0x2204, 0xa086, 0x0014,
++      0x11b8, 0x00d6, 0x6018, 0x2068, 0x080c, 0x500c, 0x00de, 0x080c,
++      0x8ff1, 0x1170, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005,
++      0x0138, 0x2001, 0x0006, 0x080c, 0x4ebe, 0x080c, 0x8743, 0x0020,
++      0x080c, 0x8bbc, 0x080c, 0x85c0, 0x0005, 0x6848, 0xa086, 0x0005,
++      0x1108, 0x0009, 0x0005, 0x6850, 0xc0ad, 0x6852, 0x0005, 0x00e6,
++      0x0126, 0x2071, 0xb400, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001,
++      0x0608, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0,
++      0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xbc00, 0x0c98,
++      0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502,
++      0x1230, 0x754e, 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f,
++      0xbc00, 0x0cc0, 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xba8c, 0x7014,
++      0xd0e4, 0x0150, 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050,
++      0x080c, 0x6c52, 0x080c, 0x7134, 0x00ee, 0x0005, 0x00c6, 0x00f6,
++      0x2c78, 0x080c, 0x52c6, 0x00fe, 0x0120, 0x601c, 0xa084, 0x000f,
++      0x0013, 0x00ce, 0x0005, 0x9997, 0x9ebe, 0x9ec1, 0x9ec4, 0xb0aa,
++      0xb0c5, 0xb0c8, 0x9997, 0x9997, 0x080c, 0x1511, 0xe000, 0xe000,
++      0x0005, 0xe000, 0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, 0x2c78,
++      0x080c, 0x52c6, 0x0538, 0x080c, 0x856a, 0x1128, 0x2001, 0xb6b8,
++      0x2004, 0x783e, 0x00f8, 0x7818, 0x601a, 0x080c, 0x9fb8, 0x781c,
++      0xa086, 0x0003, 0x0128, 0x7808, 0x6036, 0x2f00, 0x603a, 0x0020,
++      0x7808, 0x603a, 0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, 0x6007,
++      0x0035, 0x6003, 0x0001, 0x7950, 0x6152, 0x080c, 0x6c52, 0x080c,
++      0x7134, 0x2f60, 0x00fe, 0x0005, 0x0016, 0x00f6, 0x682c, 0x6032,
++      0xa08e, 0x0001, 0x0138, 0xa086, 0x0005, 0x0140, 0xa006, 0x602a,
++      0x602e, 0x00a0, 0x6820, 0xc0f4, 0xc0d5, 0x6822, 0x6810, 0x2078,
++      0x787c, 0x6938, 0xa102, 0x7880, 0x6934, 0xa103, 0x1e78, 0x6834,
++      0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036,
++      0x6808, 0x603a, 0x6918, 0x611a, 0x6950, 0x6152, 0x601f, 0x0001,
++      0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x6c52, 0x6803, 0x0002,
++      0x00fe, 0x001e, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x1118,
++      0xa085, 0x0001, 0x0070, 0x6020, 0xd0f4, 0x1150, 0xc0f5, 0x6022,
++      0x6010, 0x2078, 0x7828, 0x603a, 0x782c, 0x6036, 0x080c, 0x1944,
++      0xa006, 0x00fe, 0x0005, 0x0006, 0x0016, 0x6004, 0xa08e, 0x0034,
++      0x01b8, 0xa08e, 0x0035, 0x01a0, 0xa08e, 0x0036, 0x0188, 0xa08e,
++      0x0037, 0x0170, 0xa08e, 0x0038, 0x0158, 0xa08e, 0x0039, 0x0140,
++      0xa08e, 0x003a, 0x0128, 0xa08e, 0x003b, 0x0110, 0xa085, 0x0001,
++      0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6,
++      0x2001, 0xb6b2, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c,
++      0x6b05, 0x2001, 0xb6b6, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202,
++      0x2001, 0xb6b4, 0x200c, 0x8000, 0x2014, 0x2071, 0xb68e, 0x711a,
++      0x721e, 0x2001, 0x0064, 0x080c, 0x6b05, 0x2001, 0xb6b7, 0x82ff,
++      0x1110, 0x2011, 0x0014, 0x2202, 0x2009, 0xb6b8, 0xa280, 0x000a,
++      0x200a, 0x080c, 0x52eb, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e,
++      0x0005, 0x0006, 0x00e6, 0x2001, 0xb6b6, 0x2003, 0x0028, 0x2001,
++      0xb6b7, 0x2003, 0x0014, 0x2071, 0xb68e, 0x701b, 0x0000, 0x701f,
++      0x07d0, 0x2001, 0xb6b8, 0x2003, 0x001e, 0x00ee, 0x000e, 0x0005,
++      0x00d6, 0x6054, 0xa06d, 0x0110, 0x080c, 0x160b, 0x00de, 0x0005,
++      0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a,
++      0x001e, 0x0178, 0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, 0x6012,
++      0x2009, 0x0033, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce,
++      0x0005, 0xa006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xb400,
++      0xa186, 0x0015, 0x1500, 0x7084, 0xa086, 0x0018, 0x11e0, 0x6010,
++      0x2068, 0x6a3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x72f2, 0x01d8,
++      0x7070, 0x6a50, 0xa206, 0x1160, 0x7074, 0x6a54, 0xa206, 0x1140,
++      0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2ca5,
++      0x080c, 0x8743, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x85c0, 0x00fe,
++      0x00ee, 0x00de, 0x0005, 0x7054, 0x6a54, 0xa206, 0x0d48, 0x0c80,
++      0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x856a, 0x001e,
++      0x0180, 0x611a, 0x080c, 0x9fb8, 0x601f, 0x0001, 0x2d00, 0x6012,
++      0x2009, 0x0043, 0x080c, 0x85ef, 0xa085, 0x0001, 0x012e, 0x00ce,
++      0x0005, 0xa006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xb400,
++      0xa186, 0x0015, 0x11c0, 0x7084, 0xa086, 0x0004, 0x11a0, 0x6010,
++      0xa0e8, 0x000f, 0x2c78, 0x080c, 0x72f2, 0x01a8, 0x7070, 0x6a08,
++      0xa206, 0x1130, 0x7074, 0x6a0c, 0xa206, 0x1110, 0x080c, 0x2c60,
++      0x080c, 0x8743, 0x0020, 0x080c, 0x8bbc, 0x080c, 0x85c0, 0x00fe,
++      0x00ee, 0x00de, 0x0005, 0x7054, 0x6a0c, 0xa206, 0x0d78, 0x0c80,
++      0x0016, 0x0026, 0x684c, 0xd0ac, 0x0178, 0x6914, 0x6a10, 0x2100,
++      0xa205, 0x0150, 0x6860, 0xa106, 0x1118, 0x685c, 0xa206, 0x0120,
++      0x6962, 0x6a5e, 0xa085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00d6,
++      0x0036, 0x6310, 0x2368, 0x684a, 0x6952, 0xa29e, 0x4000, 0x11a0,
++      0x00c6, 0x6318, 0x2360, 0x2009, 0x0000, 0x6838, 0xd0f4, 0x1140,
++      0x080c, 0x520b, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d,
++      0x6a66, 0x696a, 0x00ce, 0x0080, 0x6a66, 0x3918, 0xa398, 0x0006,
++      0x231c, 0x686b, 0x0004, 0x6b72, 0x00c6, 0x6318, 0x2360, 0x6004,
++      0xa084, 0x00ff, 0x686e, 0x00ce, 0x080c, 0x53c9, 0x6013, 0x0000,
++      0x003e, 0x00de, 0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, 0x0035,
++      0x0110, 0x6a34, 0x0008, 0x6a28, 0x080c, 0x9bdb, 0x01f0, 0x2260,
++      0x611c, 0xa186, 0x0003, 0x0118, 0xa186, 0x0006, 0x1190, 0x6834,
++      0xa206, 0x0140, 0x6838, 0xa206, 0x1160, 0x6108, 0x6834, 0xa106,
++      0x1140, 0x0020, 0x6008, 0x6938, 0xa106, 0x1118, 0x6018, 0x6918,
++      0xa106, 0x001e, 0x002e, 0x00ce, 0x0005, 0xa085, 0x0001, 0x0cc8,
++      0x6944, 0xd1cc, 0x0198, 0xa18c, 0x00ff, 0xa18e, 0x0002, 0x1170,
++      0xad88, 0x001e, 0x210c, 0xa18c, 0x0f00, 0x810f, 0xa18e, 0x0001,
++      0x1128, 0x6810, 0x6914, 0xa115, 0x190c, 0x941c, 0x0005, 0x0066,
++      0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e, 0x0005,
++      0xa0f8, 0xa5cf, 0xa6f5, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8,
++      0xa130, 0xa779, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8, 0xa0f8,
++      0x080c, 0x1511, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1511,
++      0x0013, 0x006e, 0x0005, 0xa113, 0xabfa, 0xa113, 0xa113, 0xa113,
++      0xa113, 0xa113, 0xa113, 0xabbe, 0xac42, 0xa113, 0xb1ef, 0xb21f,
++      0xb1ef, 0xb21f, 0xa113, 0x080c, 0x1511, 0x0066, 0x6000, 0xa0b2,
++      0x0010, 0x1a0c, 0x1511, 0x0013, 0x006e, 0x0005, 0xa12e, 0xa8c5,
++      0xa992, 0xa9bf, 0xaa43, 0xa12e, 0xab30, 0xaadb, 0xa785, 0xab94,
++      0xaba9, 0xa12e, 0xa12e, 0xa12e, 0xa12e, 0xa12e, 0x080c, 0x1511,
++      0xa1b2, 0x0080, 0x1a0c, 0x1511, 0x2100, 0xa1b2, 0x0040, 0x1a04,
++      0xa543, 0x0002, 0xa17a, 0xa345, 0xa17a, 0xa17a, 0xa17a, 0xa34c,
++      0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a,
++      0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a,
++      0xa17a, 0xa17c, 0xa1da, 0xa1e9, 0xa237, 0xa255, 0xa2d3, 0xa332,
++      0xa17a, 0xa17a, 0xa34f, 0xa17a, 0xa17a, 0xa362, 0xa36d, 0xa17a,
++      0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa3f8, 0xa17a, 0xa17a, 0xa407,
++      0xa17a, 0xa17a, 0xa3c3, 0xa17a, 0xa17a, 0xa17a, 0xa41f, 0xa17a,
++      0xa17a, 0xa17a, 0xa499, 0xa17a, 0xa17a, 0xa17a, 0xa17a, 0xa17a,
++      0xa17a, 0xa50a, 0x080c, 0x1511, 0x080c, 0x52ca, 0x1150, 0x2001,
++      0xb435, 0x2004, 0xd0cc, 0x1128, 0xa084, 0x0009, 0xa086, 0x0008,
++      0x1140, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, 0x0804,
++      0xa340, 0x080c, 0x52ba, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016,
++      0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x6dba,
++      0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x2c08, 0x080c, 0xae05,
++      0x007e, 0x001e, 0x2e60, 0x080c, 0x516b, 0x001e, 0x002e, 0x003e,
++      0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, 0x080c, 0x4f79, 0x00ce,
++      0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0278,
++      0x080c, 0xad49, 0x1904, 0xa231, 0x080c, 0xace9, 0x1120, 0x6007,
++      0x0008, 0x0804, 0xa340, 0x6007, 0x0009, 0x0804, 0xa340, 0x080c,
++      0xaefe, 0x0128, 0x080c, 0xad49, 0x0d78, 0x0804, 0xa231, 0x6013,
++      0x1900, 0x0c88, 0x080c, 0x2d83, 0x1904, 0xa540, 0x6106, 0x080c,
++      0xaca3, 0x6007, 0x0006, 0x0804, 0xa340, 0x6007, 0x0007, 0x0804,
++      0xa340, 0x080c, 0xb253, 0x1904, 0xa540, 0x080c, 0x2d83, 0x1904,
++      0xa540, 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, 0xa082,
++      0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x4eac, 0xa6b4, 0xff00,
++      0x8637, 0xa686, 0x0006, 0x0188, 0xa686, 0x0004, 0x0170, 0x6e04,
++      0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0140, 0xa686, 0x0004, 0x0128,
++      0xa686, 0x0005, 0x0110, 0x00de, 0x00e0, 0x080c, 0xada7, 0x11a0,
++      0xa686, 0x0006, 0x1150, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214,
++      0x2009, 0x0000, 0x080c, 0x2ca5, 0x002e, 0x080c, 0x500c, 0x6007,
++      0x000a, 0x00de, 0x0804, 0xa340, 0x6007, 0x000b, 0x00de, 0x0804,
++      0xa340, 0x080c, 0x2c60, 0x6007, 0x0001, 0x0804, 0xa340, 0x080c,
++      0xb253, 0x1904, 0xa540, 0x080c, 0x2d83, 0x1904, 0xa540, 0x6618,
++      0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707, 0x0d50, 0x0026,
++      0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2ca5,
++      0x002e, 0x6007, 0x000c, 0x0804, 0xa340, 0x080c, 0x52ca, 0x1140,
++      0x2001, 0xb435, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110,
++      0x0804, 0xa189, 0x080c, 0x52ba, 0x6618, 0xa6b0, 0x0001, 0x2634,
++      0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, 0x1138, 0x0026, 0x2001,
++      0x0006, 0x080c, 0x4eeb, 0x002e, 0x0050, 0xa6b4, 0xff00, 0x8637,
++      0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xa231, 0x080c,
++      0xadb4, 0x1120, 0x6007, 0x000e, 0x0804, 0xa340, 0x0046, 0x6418,
++      0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046, 0x080c,
++      0x2c60, 0x004e, 0x0016, 0xa006, 0x2009, 0xb453, 0x210c, 0xd1a4,
++      0x0158, 0x2009, 0x0029, 0x080c, 0xb06b, 0x6018, 0x00d6, 0x2068,
++      0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007, 0x0001,
++      0x0804, 0xa340, 0x2001, 0x0001, 0x080c, 0x4eac, 0x0156, 0x0016,
++      0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xb405, 0x2011, 0xba90,
++      0x080c, 0x907a, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, 0x0168,
++      0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04, 0xa231, 0xa682,
++      0x0007, 0x0a04, 0xa27f, 0x0804, 0xa231, 0x6013, 0x1900, 0x6007,
++      0x0009, 0x0804, 0xa340, 0x080c, 0x52ca, 0x1140, 0x2001, 0xb435,
++      0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, 0x0804, 0xa189,
++      0x080c, 0x52ba, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff,
++      0xa082, 0x0006, 0x06b8, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004,
++      0x0120, 0xa686, 0x0006, 0x1904, 0xa231, 0x080c, 0xaddc, 0x1138,
++      0x080c, 0xace9, 0x1120, 0x6007, 0x0010, 0x0804, 0xa340, 0x0046,
++      0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046,
++      0x080c, 0x2c60, 0x004e, 0x0016, 0xa006, 0x2009, 0xb453, 0x210c,
++      0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xb06b, 0x6018, 0x00d6,
++      0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007,
++      0x0001, 0x00f0, 0x080c, 0xaefe, 0x0140, 0xa6b4, 0xff00, 0x8637,
++      0xa686, 0x0006, 0x0950, 0x0804, 0xa231, 0x6013, 0x1900, 0x6007,
++      0x0009, 0x0070, 0x080c, 0x2d83, 0x1904, 0xa540, 0x080c, 0xb253,
++      0x1904, 0xa540, 0x080c, 0xa568, 0x1904, 0xa231, 0x6007, 0x0012,
++      0x6003, 0x0001, 0x080c, 0x6c98, 0x0005, 0x6007, 0x0001, 0x6003,
++      0x0001, 0x080c, 0x6c98, 0x0cc0, 0x6007, 0x0005, 0x0cc0, 0x080c,
++      0xb253, 0x1904, 0xa540, 0x080c, 0x2d83, 0x1904, 0xa540, 0x080c,
++      0xa568, 0x1904, 0xa231, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c,
++      0x6c98, 0x0005, 0x080c, 0x2d83, 0x1904, 0xa540, 0x6007, 0x0023,
++      0x6003, 0x0001, 0x080c, 0x6c98, 0x0005, 0x080c, 0xb253, 0x1904,
++      0xa540, 0x080c, 0x2d83, 0x1904, 0xa540, 0x080c, 0xa568, 0x1904,
++      0xa231, 0x0016, 0x0026, 0x2011, 0xba91, 0x2214, 0xa286, 0xffff,
++      0x0190, 0x2c08, 0x080c, 0x9bdb, 0x01e0, 0x2260, 0x2011, 0xba90,
++      0x2214, 0x6008, 0xa206, 0x11a8, 0x6018, 0xa190, 0x0006, 0x2214,
++      0xa206, 0x01e8, 0x0070, 0x2011, 0xba90, 0x2214, 0x2c08, 0xa006,
++      0x080c, 0xb03d, 0x11a0, 0x2011, 0xba91, 0x2214, 0xa286, 0xffff,
++      0x01c0, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, 0xba89,
++      0x2214, 0xa296, 0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x601c,
++      0xa086, 0x0007, 0x1d70, 0x6004, 0xa086, 0x0024, 0x1110, 0x080c,
++      0x85c0, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x6c98,
++      0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x4eac, 0x0156,
++      0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xb405, 0x2011,
++      0xba96, 0x080c, 0x907a, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120,
++      0x6007, 0x0031, 0x0804, 0xa340, 0x080c, 0x8d99, 0x080c, 0x5a90,
++      0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, 0x5aac, 0x1158, 0x2001,
++      0xb69f, 0x2003, 0x0001, 0x2001, 0xb400, 0x2003, 0x0001, 0x080c,
++      0x59c8, 0x0010, 0x080c, 0x5a67, 0x003e, 0x002e, 0x000e, 0x0005,
++      0x080c, 0x2d83, 0x1904, 0xa540, 0x6106, 0x080c, 0xa584, 0x6007,
++      0x002b, 0x0804, 0xa340, 0x6007, 0x002c, 0x0804, 0xa340, 0x080c,
++      0xb253, 0x1904, 0xa540, 0x080c, 0x2d83, 0x1904, 0xa540, 0x080c,
++      0xa568, 0x1904, 0xa231, 0x6106, 0x080c, 0xa588, 0x1120, 0x6007,
++      0x002e, 0x0804, 0xa340, 0x6007, 0x002f, 0x0804, 0xa340, 0x080c,
++      0x2d83, 0x1904, 0xa540, 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080,
++      0x0001, 0x200c, 0xa184, 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184,
++      0xff00, 0x8007, 0xa086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee,
++      0x0804, 0xa345, 0x2001, 0xb472, 0x2004, 0xd0e4, 0x0904, 0xa496,
++      0x2071, 0xba8c, 0x7010, 0x6036, 0x7014, 0x603a, 0x7108, 0x720c,
++      0x2001, 0xb453, 0x2004, 0xd0a4, 0x0140, 0x6018, 0x2068, 0x6810,
++      0xa106, 0x1118, 0x6814, 0xa206, 0x01f8, 0x2001, 0xb453, 0x2004,
++      0xd0ac, 0x1590, 0x2069, 0xb400, 0x6874, 0xa206, 0x1568, 0x6870,
++      0xa106, 0x1550, 0x7210, 0x080c, 0x9bdb, 0x0558, 0x080c, 0xb0d7,
++      0x0540, 0x622a, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x6c52,
++      0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0xa286, 0xffff, 0x0150,
++      0x080c, 0x9bdb, 0x01b0, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106,
++      0x1180, 0x0c08, 0x7210, 0x2c08, 0xa085, 0x0001, 0x080c, 0xb03d,
++      0x2c10, 0x2160, 0x0130, 0x08b8, 0x6007, 0x0037, 0x6013, 0x1500,
++      0x08d8, 0x6007, 0x0037, 0x6013, 0x1700, 0x08b0, 0x6007, 0x0012,
++      0x0898, 0x080c, 0x2d83, 0x1904, 0xa540, 0x6018, 0xa080, 0x0001,
++      0x2004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006, 0x1904, 0xa345,
++      0x00e6, 0x00d6, 0x00c6, 0x2001, 0xb472, 0x2004, 0xd0e4, 0x0904,
++      0xa502, 0x2069, 0xb400, 0x2071, 0xba8c, 0x7008, 0x6036, 0x720c,
++      0x623a, 0xa286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0xa085,
++      0x0001, 0x080c, 0xb03d, 0x2c10, 0x00ce, 0x0588, 0x080c, 0x9bdb,
++      0x0570, 0x00c6, 0x0026, 0x2260, 0x080c, 0x98b6, 0x002e, 0x00ce,
++      0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0158, 0xa186,
++      0x0005, 0x0118, 0xa186, 0x0007, 0x1178, 0xa280, 0x0004, 0x2004,
++      0xa005, 0x0150, 0x0056, 0x7510, 0x7614, 0x080c, 0xb0ee, 0x005e,
++      0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602b, 0x0009,
++      0x6013, 0x2a00, 0x6003, 0x0001, 0x080c, 0x6c52, 0x0c88, 0x6007,
++      0x003b, 0x602b, 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x080c,
++      0x6c52, 0x0c30, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000,
++      0x0804, 0xa46c, 0x00e6, 0x0026, 0x080c, 0x52ca, 0x0558, 0x080c,
++      0x52ba, 0x080c, 0xb2ce, 0x1520, 0x2071, 0xb400, 0x70d4, 0xc085,
++      0x70d6, 0x00f6, 0x2079, 0x0100, 0x72a0, 0xa284, 0x00ff, 0x7072,
++      0x78e6, 0xa284, 0xff00, 0x7274, 0xa205, 0x7076, 0x78ea, 0x00fe,
++      0x70df, 0x0000, 0x2001, 0xb453, 0x2004, 0xd0a4, 0x0120, 0x2011,
++      0xb6f9, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2a7e, 0x0010,
++      0x080c, 0xb2fa, 0x002e, 0x00ee, 0x080c, 0x85c0, 0x0804, 0xa344,
++      0x080c, 0x85c0, 0x0005, 0x2600, 0x0002, 0xa54e, 0xa54e, 0xa54e,
++      0xa54e, 0xa54e, 0xa550, 0xa54e, 0xa54e, 0xa54e, 0x080c, 0x1511,
++      0x080c, 0xb253, 0x1d68, 0x080c, 0x2d83, 0x1d50, 0x0089, 0x1138,
++      0x6007, 0x0045, 0x6003, 0x0001, 0x080c, 0x6c98, 0x0005, 0x080c,
++      0x2c60, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x6c98, 0x0005,
++      0x00d6, 0x0066, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637,
++      0xa686, 0x0006, 0x0170, 0xa686, 0x0004, 0x0158, 0x6e04, 0xa6b4,
++      0x00ff, 0xa686, 0x0006, 0x0128, 0xa686, 0x0004, 0x0110, 0xa085,
++      0x0001, 0x006e, 0x00de, 0x0005, 0x00d6, 0x0449, 0x00de, 0x0005,
++      0x00d6, 0x0491, 0x11f0, 0x680c, 0xa08c, 0xff00, 0x6820, 0xa084,
++      0x00ff, 0xa115, 0x6212, 0x6824, 0x602a, 0xd1e4, 0x0118, 0x2009,
++      0x0001, 0x0060, 0xd1ec, 0x0168, 0x6920, 0xa18c, 0x00ff, 0x6824,
++      0x080c, 0x27e3, 0x1130, 0x2110, 0x2009, 0x0000, 0x080c, 0x2ca5,
++      0x0018, 0xa085, 0x0001, 0x0008, 0xa006, 0x00de, 0x0005, 0x2069,
++      0xba8d, 0x6800, 0xa082, 0x0010, 0x1228, 0x6013, 0x0000, 0xa085,
++      0x0001, 0x0008, 0xa006, 0x0005, 0x6013, 0x0000, 0x2069, 0xba8c,
++      0x6808, 0xa084, 0xff00, 0xa086, 0x0800, 0x1140, 0x6800, 0xa084,
++      0x00ff, 0xa08e, 0x0014, 0x0110, 0xa08e, 0x0010, 0x0005, 0x6004,
++      0xa0b2, 0x0080, 0x1a0c, 0x1511, 0xa1b6, 0x0013, 0x1130, 0x2008,
++      0xa1b2, 0x0040, 0x1a04, 0xa6cf, 0x0092, 0xa1b6, 0x0027, 0x0120,
++      0xa1b6, 0x0014, 0x190c, 0x1511, 0x2001, 0x0007, 0x080c, 0x4eeb,
++      0x080c, 0x7055, 0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xa62f,
++      0xa631, 0xa62f, 0xa62f, 0xa62f, 0xa631, 0xa643, 0xa6c8, 0xa693,
++      0xa6c8, 0xa6a4, 0xa6c8, 0xa643, 0xa6c8, 0xa6c0, 0xa6c8, 0xa6c0,
++      0xa6c8, 0xa6c8, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa62f,
++      0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa631, 0xa62f, 0xa6c8,
++      0xa62f, 0xa62f, 0xa6c8, 0xa62f, 0xa6c5, 0xa6c8, 0xa62f, 0xa62f,
++      0xa62f, 0xa62f, 0xa6c8, 0xa6c8, 0xa62f, 0xa6c8, 0xa6c8, 0xa62f,
++      0xa63d, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0xa6c4, 0xa6c8, 0xa62f,
++      0xa62f, 0xa6c8, 0xa6c8, 0xa62f, 0xa62f, 0xa62f, 0xa62f, 0x080c,
++      0x1511, 0x080c, 0x7055, 0x2001, 0xb6b6, 0x2004, 0x6016, 0x6003,
++      0x0002, 0x080c, 0x7134, 0x0804, 0xa6ce, 0x2001, 0x0000, 0x080c,
++      0x4eac, 0x0804, 0xa6c8, 0x00f6, 0x2079, 0xb452, 0x7804, 0x00fe,
++      0xd0ac, 0x1904, 0xa6c8, 0x2001, 0x0000, 0x080c, 0x4eac, 0x6018,
++      0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x1140, 0x00f6, 0x2079,
++      0xb400, 0x7898, 0x8000, 0x789a, 0x00fe, 0x00e0, 0x00c6, 0x6018,
++      0x2060, 0x6000, 0xd0f4, 0x1140, 0x6010, 0xa005, 0x0128, 0x00ce,
++      0x080c, 0x3efc, 0x0804, 0xa6c8, 0x00ce, 0x2001, 0xb400, 0x2004,
++      0xa086, 0x0002, 0x1138, 0x00f6, 0x2079, 0xb400, 0x7898, 0x8000,
++      0x789a, 0x00fe, 0x2001, 0x0002, 0x080c, 0x4ebe, 0x080c, 0x7055,
++      0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6c98,
++      0x080c, 0x7134, 0x00c6, 0x6118, 0x2160, 0x2009, 0x0001, 0x080c,
++      0x696d, 0x00ce, 0x04d8, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de,
++      0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0550, 0xa686, 0x0004,
++      0x0538, 0x2001, 0x0004, 0x0410, 0x2001, 0xb400, 0x2004, 0xa086,
++      0x0003, 0x1110, 0x080c, 0x3efc, 0x2001, 0x0006, 0x04a1, 0x6618,
++      0x00d6, 0x2668, 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686,
++      0x0006, 0x0170, 0x2001, 0x0006, 0x0048, 0x2001, 0x0004, 0x0030,
++      0x2001, 0x0006, 0x0401, 0x0020, 0x0018, 0x0010, 0x080c, 0x4eeb,
++      0x080c, 0x7055, 0x080c, 0x85c0, 0x080c, 0x7134, 0x0005, 0x2600,
++      0x0002, 0xa6da, 0xa6da, 0xa6da, 0xa6da, 0xa6da, 0xa6dc, 0xa6da,
++      0xa6da, 0xa6da, 0x080c, 0x1511, 0x080c, 0x7055, 0x080c, 0x85c0,
++      0x080c, 0x7134, 0x0005, 0x0016, 0x00d6, 0x6118, 0x2168, 0x6900,
++      0xd184, 0x0140, 0x080c, 0x4ebe, 0x2001, 0x0000, 0x080c, 0x4eac,
++      0x080c, 0x2c86, 0x00de, 0x001e, 0x0005, 0x00d6, 0x6618, 0x2668,
++      0x6804, 0xa084, 0xff00, 0x8007, 0x00de, 0xa0b2, 0x000c, 0x1a0c,
++      0x1511, 0xa1b6, 0x0015, 0x1110, 0x003b, 0x0028, 0xa1b6, 0x0016,
++      0x190c, 0x1511, 0x006b, 0x0005, 0x8c82, 0x8c82, 0x8c82, 0x8c82,
++      0x8c82, 0x8c82, 0xa765, 0xa724, 0x8c82, 0x8c82, 0x8c82, 0x8c82,
++      0x8c82, 0x8c82, 0x8c82, 0x8c82, 0x8c82, 0x8c82, 0xa765, 0xa76c,
++      0x8c82, 0x8c82, 0x8c82, 0x8c82, 0x00f6, 0x2079, 0xb452, 0x7804,
++      0xd0ac, 0x11e0, 0x6018, 0xa07d, 0x01c8, 0x7800, 0xd0f4, 0x1118,
++      0x7810, 0xa005, 0x1198, 0x2001, 0x0000, 0x080c, 0x4eac, 0x2001,
++      0x0002, 0x080c, 0x4ebe, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007,
++      0x0002, 0x080c, 0x6c98, 0x080c, 0x7134, 0x00e8, 0x2011, 0xba83,
++      0x2204, 0x8211, 0x220c, 0x080c, 0x27e3, 0x11a8, 0x00c6, 0x080c,
++      0x4f6a, 0x0120, 0x00ce, 0x080c, 0x85c0, 0x0068, 0x6010, 0x0006,
++      0x6014, 0x0006, 0x080c, 0x4bc5, 0x000e, 0x6016, 0x000e, 0x6012,
++      0x00ce, 0x080c, 0x85c0, 0x00fe, 0x0005, 0x6604, 0xa6b6, 0x001e,
++      0x1110, 0x080c, 0x85c0, 0x0005, 0x080c, 0x8f35, 0x1138, 0x6003,
++      0x0001, 0x6007, 0x0001, 0x080c, 0x6c98, 0x0010, 0x080c, 0x85c0,
++      0x0005, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1511, 0x080c, 0x7055,
++      0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xa182, 0x0040, 0x0002,
++      0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79d, 0xa79b, 0xa79b, 0xa79b,
++      0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79b, 0xa79b,
++      0xa79b, 0xa79b, 0xa79b, 0x080c, 0x1511, 0x00d6, 0x00e6, 0x00f6,
++      0x0156, 0x0046, 0x0026, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005,
++      0x0120, 0x2021, 0x0000, 0x080c, 0xb29f, 0x6106, 0x2071, 0xba80,
++      0x7444, 0xa4a4, 0xff00, 0x0904, 0xa801, 0xa486, 0x2000, 0x1130,
++      0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x6adf, 0x080c, 0x15f4,
++      0x090c, 0x1511, 0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803,
++      0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2,
++      0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, 0x0016, 0xa084,
++      0xff00, 0x6846, 0x684f, 0x0000, 0x6853, 0x0000, 0x6857, 0x0036,
++      0x080c, 0x53c9, 0x001e, 0xa486, 0x2000, 0x1130, 0x2019, 0x0017,
++      0x080c, 0xafe8, 0x0804, 0xa85e, 0xa486, 0x0400, 0x1130, 0x2019,
++      0x0002, 0x080c, 0xaf9a, 0x0804, 0xa85e, 0xa486, 0x0200, 0x1110,
++      0x080c, 0xaf7f, 0xa486, 0x1000, 0x1110, 0x080c, 0xafcd, 0x0804,
++      0xa85e, 0x2069, 0xb774, 0x6a00, 0xd284, 0x0904, 0xa8c1, 0xa284,
++      0x0300, 0x1904, 0xa8ba, 0x6804, 0xa005, 0x0904, 0xa8a2, 0x2d78,
++      0x6003, 0x0007, 0x080c, 0x15db, 0x0904, 0xa865, 0x7800, 0xd08c,
++      0x1118, 0x7804, 0x8001, 0x7806, 0x6013, 0x0000, 0x6803, 0x0000,
++      0x6837, 0x0116, 0x683b, 0x0000, 0x6008, 0x68b2, 0x2c00, 0x684a,
++      0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x6986, 0x6846, 0x7928,
++      0x698a, 0x792c, 0x698e, 0x7930, 0x6992, 0x7934, 0x6996, 0x6853,
++      0x003d, 0x7244, 0xa294, 0x0003, 0xa286, 0x0002, 0x1118, 0x684f,
++      0x0040, 0x0040, 0xa286, 0x0001, 0x1118, 0x684f, 0x0080, 0x0010,
++      0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, 0xba90, 0xad90, 0x0015,
++      0x200c, 0x810f, 0x2112, 0x8000, 0x8210, 0x1f04, 0xa850, 0x200c,
++      0x6982, 0x8000, 0x200c, 0x697e, 0x080c, 0x53c9, 0x002e, 0x004e,
++      0x015e, 0x00fe, 0x00ee, 0x00de, 0x0005, 0x2001, 0xb40e, 0x2004,
++      0xd084, 0x0120, 0x080c, 0x15f4, 0x1904, 0xa816, 0x6013, 0x0100,
++      0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6c52, 0x080c, 0x7134,
++      0x0c28, 0x2069, 0xba92, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200,
++      0x11a8, 0x2069, 0xba80, 0x686c, 0xa084, 0x00ff, 0x0016, 0x6110,
++      0xa18c, 0x0700, 0xa10d, 0x6112, 0x001e, 0x6003, 0x0001, 0x6007,
++      0x0043, 0x080c, 0x6c52, 0x080c, 0x7134, 0x0840, 0x6013, 0x0200,
++      0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6c52, 0x080c, 0x7134,
++      0x0804, 0xa85e, 0x2001, 0xb40d, 0x2004, 0xd0ec, 0x0120, 0x2011,
++      0x8049, 0x080c, 0x3e8a, 0x6013, 0x0300, 0x0010, 0x6013, 0x0100,
++      0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6c52, 0x080c, 0x7134,
++      0x0804, 0xa85e, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600, 0x0804,
++      0xa879, 0x6013, 0x0200, 0x0804, 0xa879, 0xa186, 0x0013, 0x1170,
++      0x6004, 0xa08a, 0x0040, 0x0a0c, 0x1511, 0xa08a, 0x0053, 0x1a0c,
++      0x1511, 0xa082, 0x0040, 0x2008, 0x0804, 0xa94f, 0xa186, 0x0051,
++      0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, 0xa086, 0x0041, 0x0518,
++      0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, 0x2800,
++      0x0006, 0x0016, 0x0026, 0x080c, 0x6b39, 0x002e, 0x001e, 0x000e,
++      0x012e, 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0xa992, 0xa186,
++      0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1511, 0x6004, 0xa082,
++      0x0040, 0x2008, 0x001a, 0x080c, 0x8606, 0x0005, 0xa919, 0xa91b,
++      0xa91b, 0xa93f, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919,
++      0xa919, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919, 0xa919,
++      0xa919, 0x080c, 0x1511, 0x080c, 0x7055, 0x080c, 0x7134, 0x0036,
++      0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, 0xf000, 0x01a8, 0x6003,
++      0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c,
++      0xb01c, 0x6013, 0x0000, 0x6014, 0xa005, 0x1120, 0x2001, 0xb6b7,
++      0x2004, 0x6016, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0x00d6,
++      0x080c, 0x7055, 0x080c, 0x7134, 0x080c, 0x9beb, 0x0120, 0x6010,
++      0x2068, 0x080c, 0x160b, 0x080c, 0x9dae, 0x00de, 0x0005, 0x0002,
++      0xa963, 0xa980, 0xa96c, 0xa98c, 0xa963, 0xa963, 0xa963, 0xa963,
++      0xa963, 0xa963, 0xa963, 0xa963, 0xa963, 0xa963, 0xa963, 0xa963,
++      0xa963, 0xa963, 0xa963, 0x080c, 0x1511, 0x6010, 0xa088, 0x0013,
++      0x2104, 0xa085, 0x0400, 0x200a, 0x080c, 0x7055, 0x6010, 0xa080,
++      0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043,
++      0x080c, 0x85ef, 0x0010, 0x6003, 0x0002, 0x080c, 0x7134, 0x0005,
++      0x080c, 0x7055, 0x080c, 0xb25a, 0x1120, 0x080c, 0x6ab4, 0x080c,
++      0x85c0, 0x080c, 0x7134, 0x0005, 0x080c, 0x7055, 0x2009, 0x0041,
++      0x0804, 0xaadb, 0xa182, 0x0040, 0x0002, 0xa9a8, 0xa9aa, 0xa9a8,
++      0xa9a8, 0xa9a8, 0xa9a8, 0xa9a8, 0xa9ab, 0xa9a8, 0xa9a8, 0xa9a8,
++      0xa9a8, 0xa9a8, 0xa9a8, 0xa9a8, 0xa9a8, 0xa9a8, 0xa9b6, 0xa9a8,
++      0x080c, 0x1511, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005,
++      0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x0005, 0x00d6, 0x080c,
++      0x6ab4, 0x00de, 0x080c, 0xb2bd, 0x080c, 0x85c0, 0x0005, 0xa182,
++      0x0040, 0x0002, 0xa9d5, 0xa9d5, 0xa9d5, 0xa9d5, 0xa9d5, 0xa9d5,
++      0xa9d5, 0xa9d7, 0xa9d5, 0xa9da, 0xaa13, 0xa9d5, 0xa9d5, 0xa9d5,
++      0xa9d5, 0xaa13, 0xa9d5, 0xa9d5, 0xa9d5, 0x080c, 0x1511, 0x080c,
++      0x8606, 0x0005, 0x2001, 0xb472, 0x2004, 0xd0e4, 0x0158, 0x2001,
++      0x0100, 0x2004, 0xa082, 0x0005, 0x0228, 0x2001, 0x011f, 0x2004,
++      0x6036, 0x0010, 0x6037, 0x0000, 0x080c, 0x70e7, 0x080c, 0x71f1,
++      0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, 0x0003,
++      0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, 0x00de, 0x0804, 0xaadb,
++      0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x6ab4, 0x00de, 0x0005,
++      0x080c, 0xb25a, 0x0110, 0x00de, 0x0005, 0x080c, 0x6ab4, 0x080c,
++      0x85c0, 0x00de, 0x0ca0, 0x0036, 0x080c, 0x70e7, 0x080c, 0x71f1,
++      0x6010, 0x00d6, 0x2068, 0x6018, 0x2004, 0xd0bc, 0x0188, 0x684c,
++      0xa084, 0x0003, 0xa086, 0x0002, 0x0140, 0x687c, 0x632c, 0xa31a,
++      0x632e, 0x6880, 0x6328, 0xa31b, 0x632a, 0x6003, 0x0002, 0x0080,
++      0x2019, 0x0004, 0x080c, 0xb01c, 0x6014, 0xa005, 0x1128, 0x2001,
++      0xb6b7, 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, 0x0007,
++      0x00de, 0x003e, 0x0005, 0xa186, 0x0013, 0x1150, 0x6004, 0xa086,
++      0x0042, 0x190c, 0x1511, 0x080c, 0x7055, 0x080c, 0x7134, 0x0005,
++      0xa186, 0x0027, 0x0118, 0xa186, 0x0014, 0x1180, 0x6004, 0xa086,
++      0x0042, 0x190c, 0x1511, 0x2001, 0x0007, 0x080c, 0x4eeb, 0x080c,
++      0x7055, 0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xa182, 0x0040,
++      0x0002, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c,
++      0xaa7e, 0xaa8a, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c,
++      0xaa7c, 0xaa7c, 0xaa7c, 0xaa7c, 0x080c, 0x1511, 0x0036, 0x0046,
++      0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1856, 0x004e,
++      0x003e, 0x0005, 0x6010, 0x00d6, 0x2068, 0x6810, 0x6a14, 0x0006,
++      0x0046, 0x0056, 0x6c7c, 0xa422, 0x6d80, 0x2200, 0xa52b, 0x602c,
++      0xa420, 0x642e, 0x6028, 0xa529, 0x652a, 0x005e, 0x004e, 0x000e,
++      0xa20d, 0x1178, 0x684c, 0xd0fc, 0x0120, 0x2009, 0x0041, 0x00de,
++      0x0490, 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x6ab4, 0x00de,
++      0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, 0x52c6, 0x00fe, 0x000e,
++      0x0120, 0x6003, 0x0002, 0x00de, 0x0005, 0x2009, 0xb40d, 0x210c,
++      0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x0021,
++      0x080c, 0x6ab6, 0x00de, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000,
++      0x8212, 0xa291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015,
++      0x6a6a, 0x6866, 0x0005, 0xa182, 0x0040, 0x0208, 0x0062, 0xa186,
++      0x0013, 0x0120, 0xa186, 0x0014, 0x190c, 0x1511, 0x6020, 0xd0dc,
++      0x090c, 0x1511, 0x0005, 0xaafe, 0xab05, 0xab11, 0xab1d, 0xaafe,
++      0xaafe, 0xaafe, 0xab2c, 0xaafe, 0xab00, 0xab00, 0xaafe, 0xaafe,
++      0xaafe, 0xaafe, 0xab00, 0xaafe, 0xab00, 0xaafe, 0x080c, 0x1511,
++      0x6020, 0xd0dc, 0x090c, 0x1511, 0x0005, 0x6003, 0x0001, 0x6106,
++      0x080c, 0x6c52, 0x0126, 0x2091, 0x8000, 0x080c, 0x7134, 0x012e,
++      0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c52, 0x0126, 0x2091,
++      0x8000, 0x080c, 0x7134, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106,
++      0x2c10, 0x080c, 0x1f7a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6cb5,
++      0x080c, 0x71f1, 0x012e, 0x0005, 0xa016, 0x080c, 0x1856, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0xa182, 0x0040, 0x0023,
++      0x00de, 0x003e, 0x012e, 0x0005, 0xab4c, 0xab4e, 0xab60, 0xab7b,
++      0xab4c, 0xab4c, 0xab4c, 0xab90, 0xab4c, 0xab4c, 0xab4c, 0xab4c,
++      0xab4c, 0xab4c, 0xab4c, 0xab4c, 0x080c, 0x1511, 0x6010, 0x2068,
++      0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x01d0,
++      0x6003, 0x0001, 0x6106, 0x080c, 0x6c52, 0x080c, 0x7134, 0x0498,
++      0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, 0xa09c, 0x0003, 0xa39e,
++      0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c52, 0x080c,
++      0x7134, 0x0408, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, 0x0004,
++      0x080c, 0xb01c, 0x00c0, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0d90,
++      0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, 0x6003, 0x0003, 0x6106,
++      0x2c10, 0x080c, 0x1f7a, 0x080c, 0x6cb5, 0x080c, 0x71f1, 0x0018,
++      0xa016, 0x080c, 0x1856, 0x0005, 0x080c, 0x7055, 0x6110, 0x81ff,
++      0x0158, 0x00d6, 0x2168, 0x080c, 0xb303, 0x0036, 0x2019, 0x0029,
++      0x080c, 0xb01c, 0x003e, 0x00de, 0x080c, 0x9dae, 0x080c, 0x7134,
++      0x0005, 0x080c, 0x70e7, 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168,
++      0x080c, 0xb303, 0x0036, 0x2019, 0x0029, 0x080c, 0xb01c, 0x003e,
++      0x00de, 0x080c, 0x9dae, 0x080c, 0x71f1, 0x0005, 0xa182, 0x0085,
++      0x0002, 0xabca, 0xabc8, 0xabc8, 0xabd6, 0xabc8, 0xabc8, 0xabc8,
++      0x080c, 0x1511, 0x6003, 0x000b, 0x6106, 0x080c, 0x6c52, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x7134, 0x012e, 0x0005, 0x0026, 0x00e6,
++      0x080c, 0xb253, 0x0118, 0x080c, 0x85c0, 0x00c8, 0x2071, 0xba80,
++      0x7224, 0x6212, 0x7220, 0x080c, 0xaeca, 0x0118, 0x6007, 0x0086,
++      0x0040, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x1110, 0x6007,
++      0x0086, 0x6003, 0x0001, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00ee,
++      0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085,
++      0x0a0c, 0x1511, 0xa08a, 0x008c, 0x1a0c, 0x1511, 0xa082, 0x0085,
++      0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, 0x0014, 0x0118, 0x080c,
++      0x8606, 0x0050, 0x2001, 0x0007, 0x080c, 0x4eeb, 0x080c, 0x7055,
++      0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xac24, 0xac26, 0xac26,
++      0xac24, 0xac24, 0xac24, 0xac24, 0x080c, 0x1511, 0x080c, 0x7055,
++      0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0xa182, 0x0085, 0x0a0c,
++      0x1511, 0xa182, 0x008c, 0x1a0c, 0x1511, 0xa182, 0x0085, 0x0002,
++      0xac3f, 0xac3f, 0xac3f, 0xac41, 0xac3f, 0xac3f, 0xac3f, 0x080c,
++      0x1511, 0x0005, 0xa186, 0x0013, 0x0148, 0xa186, 0x0014, 0x0130,
++      0xa186, 0x0027, 0x0118, 0x080c, 0x8606, 0x0030, 0x080c, 0x7055,
++      0x080c, 0x9dae, 0x080c, 0x7134, 0x0005, 0x0036, 0x080c, 0xb2bd,
++      0x603f, 0x0000, 0x2019, 0x000b, 0x0031, 0x601f, 0x0006, 0x6003,
++      0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, 0x0086,
++      0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, 0x80da, 0x009e, 0x008e,
++      0x1578, 0x0076, 0x2c38, 0x080c, 0x8179, 0x007e, 0x1548, 0x6000,
++      0xa086, 0x0000, 0x0528, 0x601c, 0xa086, 0x0007, 0x0508, 0x00d6,
++      0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xb2bd, 0x601f, 0x0007,
++      0x2001, 0xb6b6, 0x2004, 0x6016, 0x080c, 0x1944, 0x6010, 0x2068,
++      0x080c, 0x9beb, 0x0110, 0x080c, 0xb01c, 0x00de, 0x6013, 0x0000,
++      0x080c, 0xb2bd, 0x601f, 0x0007, 0x2001, 0xb6b6, 0x2004, 0x6016,
++      0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x0036, 0x0156, 0x2079,
++      0xba80, 0x7938, 0x783c, 0x080c, 0x27e3, 0x15b0, 0x0016, 0x00c6,
++      0x080c, 0x4f6a, 0x1578, 0x001e, 0x002e, 0x0026, 0x0016, 0x2019,
++      0x0029, 0x080c, 0x823c, 0x080c, 0x6dba, 0x0076, 0x2039, 0x0000,
++      0x080c, 0x6cc7, 0x007e, 0x001e, 0x0076, 0x2039, 0x0000, 0x080c,
++      0xae05, 0x007e, 0x080c, 0x516b, 0x0026, 0x6204, 0xa294, 0xff00,
++      0x8217, 0xa286, 0x0006, 0x0118, 0xa286, 0x0004, 0x1118, 0x62a0,
++      0x080c, 0x2d19, 0x002e, 0x001e, 0x080c, 0x4bc5, 0x6612, 0x6516,
++      0xa006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00ce, 0x00fe,
++      0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009, 0xb421, 0x2104,
++      0xa086, 0x0074, 0x1904, 0xad3e, 0x2069, 0xba8e, 0x690c, 0xa182,
++      0x0100, 0x06c0, 0x6908, 0xa184, 0x8000, 0x05e8, 0x2001, 0xb69e,
++      0x2004, 0xa005, 0x1160, 0x6018, 0x2070, 0x7010, 0xa084, 0x00ff,
++      0x0118, 0x7000, 0xd0f4, 0x0118, 0xa184, 0x0800, 0x0560, 0x6910,
++      0xa18a, 0x0001, 0x0610, 0x6914, 0x2069, 0xbaae, 0x6904, 0x81ff,
++      0x1198, 0x690c, 0xa182, 0x0100, 0x02a8, 0x6908, 0x81ff, 0x1178,
++      0x6910, 0xa18a, 0x0001, 0x0288, 0x6918, 0xa18a, 0x0001, 0x0298,
++      0x00d0, 0x6013, 0x0100, 0x00a0, 0x6013, 0x0300, 0x0088, 0x6013,
++      0x0500, 0x0070, 0x6013, 0x0700, 0x0058, 0x6013, 0x0900, 0x0040,
++      0x6013, 0x0b00, 0x0028, 0x6013, 0x0f00, 0x0010, 0x6013, 0x2d00,
++      0xa085, 0x0001, 0x0008, 0xa006, 0x001e, 0x00ee, 0x00de, 0x00ce,
++      0x0005, 0x00c6, 0x00d6, 0x0026, 0x0036, 0x0156, 0x6218, 0x2268,
++      0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, 0x0190, 0xa286, 0x0004,
++      0x0178, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0148, 0xa286,
++      0x0004, 0x0130, 0x00c6, 0x2d60, 0x080c, 0x4f79, 0x00ce, 0x04c0,
++      0x2011, 0xba96, 0xad98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x907a,
++      0x1580, 0x2011, 0xba9a, 0xad98, 0x0006, 0x20a9, 0x0004, 0x080c,
++      0x907a, 0x1538, 0x0046, 0x0016, 0x6aa0, 0xa294, 0x00ff, 0x8227,
++      0xa006, 0x2009, 0xb453, 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029,
++      0x080c, 0xb06b, 0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x080c,
++      0x6dba, 0x0076, 0x2039, 0x0000, 0x080c, 0x6cc7, 0x2c08, 0x080c,
++      0xae05, 0x007e, 0x2001, 0x0007, 0x080c, 0x4eeb, 0x001e, 0x004e,
++      0xa006, 0x015e, 0x003e, 0x002e, 0x00de, 0x00ce, 0x0005, 0x00d6,
++      0x2069, 0xba8e, 0x6800, 0xa086, 0x0800, 0x0118, 0x6013, 0x0000,
++      0x0008, 0xa006, 0x00de, 0x0005, 0x00c6, 0x00f6, 0x0016, 0x0026,
++      0x0036, 0x0156, 0x2079, 0xba8c, 0x7930, 0x7834, 0x080c, 0x27e3,
++      0x11a0, 0x080c, 0x4f6a, 0x1188, 0x2011, 0xba90, 0xac98, 0x000a,
++      0x20a9, 0x0004, 0x080c, 0x907a, 0x1140, 0x2011, 0xba94, 0xac98,
++      0x0006, 0x20a9, 0x0004, 0x080c, 0x907a, 0x015e, 0x003e, 0x002e,
++      0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, 0x0006, 0x0016, 0x0026,
++      0x0036, 0x0156, 0x2011, 0xba83, 0x2204, 0x8211, 0x220c, 0x080c,
++      0x27e3, 0x11a0, 0x080c, 0x4f6a, 0x1188, 0x2011, 0xba96, 0xac98,
++      0x000a, 0x20a9, 0x0004, 0x080c, 0x907a, 0x1140, 0x2011, 0xba9a,
++      0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x907a, 0x015e, 0x003e,
++      0x002e, 0x001e, 0x000e, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0086,
++      0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000,
++      0x2740, 0x2029, 0xb6e9, 0x252c, 0x2021, 0xb6ef, 0x2424, 0x2061,
++      0xbc00, 0x2071, 0xb400, 0x7648, 0x7068, 0x81ff, 0x0150, 0x0006,
++      0xa186, 0xb7f4, 0x000e, 0x0128, 0x8001, 0xa602, 0x1a04, 0xae86,
++      0x0018, 0xa606, 0x0904, 0xae86, 0x2100, 0xac06, 0x0904, 0xae7d,
++      0x080c, 0xb093, 0x0904, 0xae7d, 0x671c, 0xa786, 0x0001, 0x0904,
++      0xaea1, 0xa786, 0x0004, 0x0904, 0xaea1, 0xa786, 0x0007, 0x05e8,
++      0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, 0x05b8, 0x080c, 0xb0a3,
++      0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, 0x1578, 0x00d6, 0x6000,
++      0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1944, 0x001e, 0xa786,
++      0x0008, 0x1148, 0x080c, 0x9de9, 0x1130, 0x080c, 0x8bbc, 0x00de,
++      0x080c, 0x9dae, 0x00d0, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0190,
++      0xa786, 0x0003, 0x1528, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
++      0x080c, 0xb303, 0x0016, 0x080c, 0x9e5d, 0x080c, 0x53c9, 0x001e,
++      0x080c, 0x9da2, 0x00de, 0x080c, 0x9dae, 0xace0, 0x0018, 0x2001,
++      0xb417, 0x2004, 0xac02, 0x1210, 0x0804, 0xae19, 0x012e, 0x002e,
++      0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005,
++      0xa786, 0x0006, 0x1150, 0xa386, 0x0005, 0x0128, 0x080c, 0xb303,
++      0x080c, 0xb01c, 0x08f8, 0x00de, 0x0c00, 0xa786, 0x000a, 0x0968,
++      0x0850, 0x080c, 0xb0a3, 0x19c8, 0x81ff, 0x09b8, 0xa180, 0x0001,
++      0x2004, 0xa086, 0x0018, 0x0130, 0xa180, 0x0001, 0x2004, 0xa086,
++      0x002d, 0x1958, 0x6000, 0xa086, 0x0002, 0x1938, 0x080c, 0x9dd8,
++      0x0130, 0x080c, 0x9de9, 0x1908, 0x080c, 0x8bbc, 0x0038, 0x080c,
++      0x2c86, 0x080c, 0x9de9, 0x1110, 0x080c, 0x8bbc, 0x080c, 0x9dae,
++      0x0804, 0xae7d, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0xa006,
++      0x080c, 0xb03d, 0x001e, 0x0120, 0x601c, 0xa084, 0x000f, 0x001b,
++      0x00ee, 0x00ce, 0x0005, 0xaee3, 0xaee3, 0xaee3, 0xaee3, 0xaee3,
++      0xaee3, 0xaee5, 0xaee3, 0xa006, 0x0005, 0x0046, 0x0016, 0x7018,
++      0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009,
++      0x0020, 0x080c, 0xb06b, 0x001e, 0x004e, 0x0036, 0x2019, 0x0002,
++      0x080c, 0xac63, 0x003e, 0xa085, 0x0001, 0x0005, 0x2001, 0x0001,
++      0x080c, 0x4eac, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004,
++      0x2019, 0xb405, 0x2011, 0xba96, 0x080c, 0x907a, 0x003e, 0x002e,
++      0x001e, 0x015e, 0xa005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086,
++      0x0076, 0x0066, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061,
++      0xbc00, 0x2079, 0x0001, 0x8fff, 0x0904, 0xaf72, 0x2071, 0xb400,
++      0x7648, 0x7068, 0x8001, 0xa602, 0x1a04, 0xaf72, 0x88ff, 0x0128,
++      0x2800, 0xac06, 0x15b0, 0x2079, 0x0000, 0x080c, 0xb093, 0x0588,
++      0x2400, 0xac06, 0x0570, 0x671c, 0xa786, 0x0006, 0x1550, 0xa786,
++      0x0007, 0x0538, 0x88ff, 0x1140, 0x6018, 0xa206, 0x1510, 0x85ff,
++      0x0118, 0x6050, 0xa106, 0x11e8, 0x00d6, 0x6000, 0xa086, 0x0004,
++      0x1150, 0x080c, 0xb2bd, 0x601f, 0x0007, 0x2001, 0xb6b6, 0x2004,
++      0x6016, 0x080c, 0x1944, 0x6010, 0x2068, 0x080c, 0x9beb, 0x0120,
++      0x0046, 0x080c, 0xb01c, 0x004e, 0x00de, 0x080c, 0x9dae, 0x88ff,
++      0x1198, 0xace0, 0x0018, 0x2001, 0xb417, 0x2004, 0xac02, 0x1210,
++      0x0804, 0xaf23, 0xa006, 0x012e, 0x002e, 0x006e, 0x007e, 0x008e,
++      0x00ce, 0x00ee, 0x00fe, 0x0005, 0xa8c5, 0x0001, 0x0ca0, 0x0076,
++      0x0056, 0x0086, 0x2041, 0x0000, 0x2029, 0x0001, 0x2c20, 0x2019,
++      0x0002, 0x6218, 0x0096, 0x2049, 0x0000, 0x080c, 0x80da, 0x009e,
++      0x008e, 0x2039, 0x0000, 0x080c, 0x8179, 0x080c, 0xaf14, 0x005e,
++      0x007e, 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156,
++      0x2c20, 0x2128, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x0036,
++      0x080c, 0x4f6a, 0x11b0, 0x2c10, 0x0056, 0x0086, 0x2041, 0x0000,
++      0x2508, 0x2029, 0x0001, 0x0096, 0x2049, 0x0000, 0x080c, 0x80da,
++      0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x8179, 0x080c, 0xaf14,
++      0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xafa6, 0x015e, 0x00ce,
++      0x007e, 0x005e, 0x004e, 0x002e, 0x0005, 0x0076, 0x0056, 0x6218,
++      0x0086, 0x2041, 0x0000, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096,
++      0x2049, 0x0000, 0x080c, 0x80da, 0x009e, 0x008e, 0x2039, 0x0000,
++      0x080c, 0x8179, 0x2c20, 0x080c, 0xaf14, 0x005e, 0x007e, 0x0005,
++      0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9,
++      0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x4f6a, 0x11c0,
++      0x2c10, 0x0086, 0x2041, 0x0000, 0x2828, 0x0046, 0x2021, 0x0001,
++      0x080c, 0xb29f, 0x004e, 0x0096, 0x2049, 0x0000, 0x080c, 0x80da,
++      0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x8179, 0x080c, 0xaf14,
++      0x003e, 0x001e, 0x8108, 0x1f04, 0xaff3, 0x015e, 0x00ce, 0x007e,
++      0x005e, 0x004e, 0x002e, 0x0005, 0x0016, 0x00f6, 0x3800, 0xd08c,
++      0x0130, 0xad82, 0x1000, 0x02b0, 0xad82, 0xb400, 0x0230, 0xad82,
++      0xec00, 0x0280, 0xad82, 0xffff, 0x1268, 0x6800, 0xa07d, 0x0138,
++      0x6803, 0x0000, 0x6b52, 0x080c, 0x53c9, 0x2f68, 0x0cb0, 0x6b52,
++      0x080c, 0x53c9, 0x00fe, 0x001e, 0x0005, 0x00e6, 0x0046, 0x0036,
++      0x2061, 0xbc00, 0xa005, 0x1138, 0x2071, 0xb400, 0x7448, 0x7068,
++      0x8001, 0xa402, 0x12d8, 0x2100, 0xac06, 0x0168, 0x6000, 0xa086,
++      0x0000, 0x0148, 0x6008, 0xa206, 0x1130, 0x6018, 0xa1a0, 0x0006,
++      0x2424, 0xa406, 0x0140, 0xace0, 0x0018, 0x2001, 0xb417, 0x2004,
++      0xac02, 0x1220, 0x0c40, 0xa085, 0x0001, 0x0008, 0xa006, 0x003e,
++      0x004e, 0x00ee, 0x0005, 0x00d6, 0x0006, 0x080c, 0x15f4, 0x000e,
++      0x090c, 0x1511, 0x6837, 0x010d, 0x685e, 0x0026, 0x2010, 0x080c,
++      0x9bdb, 0x2001, 0x0000, 0x0120, 0x2200, 0xa080, 0x0014, 0x2004,
++      0x002e, 0x684a, 0x6956, 0x6c46, 0x684f, 0x0000, 0x2001, 0xb6be,
++      0x2004, 0x6852, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x080c,
++      0x53c9, 0x00de, 0x0005, 0x6700, 0xa786, 0x0000, 0x0158, 0xa786,
++      0x0001, 0x0140, 0xa786, 0x000a, 0x0128, 0xa786, 0x0009, 0x0110,
++      0xa085, 0x0001, 0x0005, 0x00e6, 0x6018, 0x2070, 0x70a0, 0xa206,
++      0x00ee, 0x0005, 0x0016, 0x6004, 0xa08e, 0x001e, 0x11a0, 0x8007,
++      0x6130, 0xa18c, 0x00ff, 0xa105, 0x6032, 0x6007, 0x0085, 0x6003,
++      0x000b, 0x601f, 0x0005, 0x2001, 0xb6b7, 0x2004, 0x6016, 0x080c,
++      0x6c52, 0x080c, 0x7134, 0x001e, 0x0005, 0xe000, 0xe000, 0x0005,
++      0x6020, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0x9ec6, 0x0030,
++      0x080c, 0xb2bd, 0x080c, 0x6ab4, 0x080c, 0x85c0, 0x0005, 0xa280,
++      0x0007, 0x2004, 0xa084, 0x000f, 0x0002, 0xb0e6, 0xb0e6, 0xb0e6,
++      0xb0eb, 0xb0e6, 0xb0e8, 0xb0e8, 0xb0e6, 0xb0e8, 0xa006, 0x0005,
++      0x00c6, 0x2260, 0x00ce, 0xa085, 0x0001, 0x0005, 0xa280, 0x0007,
++      0x2004, 0xa084, 0x000f, 0x0002, 0xb0fd, 0xb0fd, 0xb0fd, 0xb0fd,
++      0xb0fd, 0xb0fd, 0xb108, 0xb0fd, 0xb0fd, 0x6007, 0x003b, 0x602b,
++      0x0009, 0x6013, 0x2a00, 0x6003, 0x0001, 0x080c, 0x6c52, 0x0005,
++      0x00c6, 0x2260, 0x080c, 0xb2bd, 0x603f, 0x0000, 0x6020, 0xc0f4,
++      0xc0cc, 0x6022, 0x6037, 0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186,
++      0x0007, 0x1904, 0xb163, 0x6810, 0xa005, 0x0138, 0xa080, 0x0013,
++      0x2004, 0xd0fc, 0x1110, 0x00de, 0x08c0, 0x6007, 0x003a, 0x6003,
++      0x0001, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00c6, 0x2d60, 0x6100,
++      0xa186, 0x0002, 0x1904, 0xb1ec, 0x6010, 0xa005, 0x1138, 0x6000,
++      0xa086, 0x0007, 0x190c, 0x1511, 0x0804, 0xb1ec, 0xa08c, 0xf000,
++      0x1130, 0x0028, 0x2068, 0x6800, 0xa005, 0x1de0, 0x2d00, 0xa080,
++      0x0013, 0x2004, 0xa084, 0x0003, 0xa086, 0x0002, 0x1180, 0x6010,
++      0x2068, 0x684c, 0xc0dc, 0xc0f4, 0x684e, 0x6850, 0xc0f4, 0xc0fc,
++      0x6852, 0x2009, 0x0043, 0x080c, 0xaadb, 0x0804, 0xb1ec, 0x2009,
++      0x0041, 0x0804, 0xb1e6, 0xa186, 0x0005, 0x15f0, 0x6810, 0xa080,
++      0x0013, 0x2004, 0xd0bc, 0x1118, 0x00de, 0x0804, 0xb0fd, 0xd0b4,
++      0x0128, 0xd0fc, 0x090c, 0x1511, 0x0804, 0xb11b, 0x6007, 0x003a,
++      0x6003, 0x0001, 0x080c, 0x6c52, 0x080c, 0x7134, 0x00c6, 0x2d60,
++      0x6100, 0xa186, 0x0002, 0x0120, 0xa186, 0x0004, 0x1904, 0xb1ec,
++      0x2071, 0xb723, 0x7000, 0xa086, 0x0003, 0x1128, 0x7004, 0xac06,
++      0x1110, 0x7003, 0x0000, 0x6810, 0xa080, 0x0013, 0x200c, 0xc1f4,
++      0xc1dc, 0x2102, 0x8000, 0x200c, 0xc1f4, 0xc1fc, 0xc1bc, 0x2102,
++      0x2009, 0x0042, 0x0804, 0xb1e6, 0x0036, 0x00d6, 0x00d6, 0x080c,
++      0x15f4, 0x003e, 0x090c, 0x1511, 0x6837, 0x010d, 0x6803, 0x0000,
++      0x683b, 0x0000, 0x685b, 0x0000, 0x6b5e, 0x6857, 0x0045, 0x2c00,
++      0x6862, 0x6034, 0x6872, 0x2360, 0x6020, 0xc0dd, 0x6022, 0x6018,
++      0xa080, 0x0028, 0x2004, 0xa084, 0x00ff, 0x8007, 0x6350, 0x6b4a,
++      0x6846, 0x684f, 0x0000, 0x6853, 0x0000, 0x6d6a, 0x6e66, 0x686f,
++      0x0001, 0x080c, 0x53c9, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c,
++      0xac63, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017,
++      0x0000, 0x603f, 0x0000, 0x00de, 0x003e, 0x0038, 0x603f, 0x0000,
++      0x6003, 0x0007, 0x080c, 0xaadb, 0x00ce, 0x00de, 0x0005, 0xa186,
++      0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x00c2, 0xa186,
++      0x0027, 0x1178, 0x080c, 0x7055, 0x0036, 0x00d6, 0x6010, 0x2068,
++      0x2019, 0x0004, 0x080c, 0xb01c, 0x00de, 0x003e, 0x080c, 0x7134,
++      0x0005, 0xa186, 0x0014, 0x0d70, 0x080c, 0x8606, 0x0005, 0xb218,
++      0xb216, 0xb216, 0xb216, 0xb216, 0xb216, 0xb218, 0x080c, 0x1511,
++      0x080c, 0x7055, 0x6003, 0x000c, 0x080c, 0x7134, 0x0005, 0xa182,
++      0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x8606,
++      0x0005, 0xb230, 0xb230, 0xb230, 0xb230, 0xb232, 0xb250, 0xb230,
++      0x080c, 0x1511, 0x00d6, 0x2c68, 0x080c, 0x856a, 0x01a0, 0x6003,
++      0x0001, 0x6007, 0x001e, 0x2009, 0xba8e, 0x210c, 0x6136, 0x2009,
++      0xba8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a, 0x601f,
++      0x0004, 0x080c, 0x6c52, 0x2d60, 0x080c, 0x85c0, 0x00de, 0x0005,
++      0x080c, 0x85c0, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec,
++      0x00ee, 0x0005, 0x6010, 0xa08c, 0xf000, 0x0904, 0xb29e, 0xa080,
++      0x0013, 0x200c, 0xd1ec, 0x05d0, 0x2001, 0xb472, 0x2004, 0xd0ec,
++      0x05a8, 0x6003, 0x0002, 0x6020, 0xc0e5, 0x6022, 0xd1ac, 0x0180,
++      0x00f6, 0x2c78, 0x080c, 0x52c2, 0x00fe, 0x0150, 0x2001, 0xb6b8,
++      0x2004, 0x603e, 0x2009, 0xb472, 0x210c, 0xd1f4, 0x11e8, 0x0080,
++      0x2009, 0xb472, 0x210c, 0xd1f4, 0x0128, 0x6020, 0xc0e4, 0x6022,
++      0xa006, 0x00a0, 0x2001, 0xb6b8, 0x200c, 0x8103, 0xa100, 0x603e,
++      0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0118, 0xa088, 0x0003,
++      0x0cd0, 0x2c0a, 0x600f, 0x0000, 0xa085, 0x0001, 0x0005, 0x0016,
++      0x00c6, 0x00e6, 0x6150, 0xa2f0, 0x002b, 0x2e04, 0x2060, 0x8cff,
++      0x0180, 0x84ff, 0x1118, 0x6050, 0xa106, 0x1138, 0x600c, 0x2072,
++      0x080c, 0x6ab4, 0x080c, 0x85c0, 0x0010, 0xacf0, 0x0003, 0x2e64,
++      0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, 0x6018, 0xa0e8,
++      0x002b, 0x2d04, 0xa005, 0x0140, 0xac06, 0x0120, 0x2d04, 0xa0e8,
++      0x0003, 0x0cb8, 0x600c, 0x206a, 0x00de, 0x0005, 0x0026, 0x0036,
++      0x0156, 0x2011, 0xb428, 0x2204, 0xa084, 0x00ff, 0x2019, 0xba8e,
++      0x2334, 0xa636, 0x11d8, 0x8318, 0x2334, 0x2204, 0xa084, 0xff00,
++      0xa636, 0x11a0, 0x2011, 0xba90, 0x6018, 0xa098, 0x000a, 0x20a9,
++      0x0004, 0x080c, 0x907a, 0x1150, 0x2011, 0xba94, 0x6018, 0xa098,
++      0x0006, 0x20a9, 0x0004, 0x080c, 0x907a, 0x1100, 0x015e, 0x003e,
++      0x002e, 0x0005, 0x00e6, 0x2071, 0xb400, 0x080c, 0x4b80, 0x080c,
++      0x2a7e, 0x00ee, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0fc,
++      0x0108, 0x0011, 0x00ee, 0x0005, 0x6850, 0xc0e5, 0x6852, 0x0005,
++      0x00e6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016,
++      0x0126, 0x2091, 0x8000, 0x2029, 0xb6e9, 0x252c, 0x2021, 0xb6ef,
++      0x2424, 0x2061, 0xbc00, 0x2071, 0xb400, 0x7648, 0x7068, 0xa606,
++      0x0578, 0x671c, 0xa786, 0x0001, 0x0118, 0xa786, 0x0008, 0x1500,
++      0x2500, 0xac06, 0x01e8, 0x2400, 0xac06, 0x01d0, 0x080c, 0xb093,
++      0x01b8, 0x080c, 0xb0a3, 0x11a0, 0x6000, 0xa086, 0x0004, 0x1120,
++      0x0016, 0x080c, 0x1944, 0x001e, 0x080c, 0x9dd8, 0x1110, 0x080c,
++      0x2c86, 0x080c, 0x9de9, 0x1110, 0x080c, 0x8bbc, 0x080c, 0x9dae,
++      0xace0, 0x0018, 0x2001, 0xb417, 0x2004, 0xac02, 0x1208, 0x0858,
++      0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce,
++      0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000,
++      0x2071, 0xb440, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4,
++      0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, 0xa084,
++      0x0007, 0xa08e, 0x0003, 0x0148, 0xa08e, 0x0004, 0x0130, 0xa08e,
++      0x0005, 0x0118, 0x2071, 0xb44a, 0x04c9, 0x001e, 0x00ee, 0x000e,
++      0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000,
++      0x2071, 0xb440, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4,
++      0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, 0xa084,
++      0x0007, 0xa08e, 0x0003, 0x0148, 0xa08e, 0x0004, 0x0130, 0xa08e,
++      0x0005, 0x0118, 0x2071, 0xb44a, 0x0089, 0x001e, 0x00ee, 0x000e,
++      0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071,
++      0xb442, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, 0x8000,
++      0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6,
++      0x2071, 0xb440, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xb444,
++      0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000,
++      0x2071, 0xb440, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, 0x012e,
++      0x0005, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040,
++      0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000,
++      0x8000, 0x622c
++};
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/asm_2300.h     2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,6195 @@
++/* @(#)asm_2300.h 1.6 */
++/*
++ * Copyright (C) 2001 Qlogic, Inc.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms are permitted provided
++ * that the following conditions are met:
++ * 1. Redistribution of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistribution in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */ 
++
++/************************************************************************
++ *                                                                    *
++ *               --- ISP2300 Initiator/Target Firmware ---              *
++ *             with Fabric (Public Loop), Point-point, and              *
++ *             expanded LUN addressing for FCTAPE                       *
++ *                                                                    *
++ ************************************************************************/
++/*
++ *    Firmware Version 3.01.20 (15:30 Dec 19, 2002)
++ */
++static const u_int16_t isp_2300_risc_code[] = {
++      0x0470, 0x0000, 0x0000, 0xc060, 0x0000, 0x0003, 0x0001, 0x0014,
++      0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
++      0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
++      0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972,
++      0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
++      0x332e, 0x3031, 0x2e32, 0x3020, 0x2020, 0x2020, 0x2400, 0x20a9,
++      0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f,
++      0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001,
++      0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000,
++      0x400f, 0x2091, 0x2800, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f,
++      0x2091, 0x2a00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091,
++      0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00,
++      0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001,
++      0x0000, 0x20c1, 0x0004, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9,
++      0x14ff, 0x2059, 0x0000, 0x2b78, 0x7883, 0x0004, 0x2089, 0x240d,
++      0x2051, 0x1100, 0x2a70, 0x20e1, 0x0001, 0x20e9, 0x0001, 0x2029,
++      0x45c0, 0x2031, 0xffff, 0x2039, 0x45a9, 0x2021, 0x0200, 0x20e9,
++      0x0001, 0x20a1, 0x1000, 0x900e, 0x20a9, 0x05c0, 0x4104, 0x7566,
++      0x766a, 0x7762, 0x746e, 0x7472, 0x00e6, 0x2071, 0x13a1, 0x2472,
++      0x00ee, 0x20a1, 0x15c0, 0x7168, 0x810d, 0x810d, 0x810d, 0x810d,
++      0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104,
++      0x8211, 0x1de0, 0x7168, 0x3400, 0x8001, 0x9102, 0x0120, 0x0218,
++      0x20a8, 0x900e, 0x4104, 0x2009, 0x1100, 0x810d, 0x810d, 0x810d,
++      0x810d, 0x810d, 0x918c, 0x001f, 0x2001, 0x0001, 0x9112, 0x20e9,
++      0x0001, 0x20a1, 0x0800, 0x900e, 0x20a9, 0x0800, 0x4104, 0x8211,
++      0x1dd8, 0x2009, 0x1100, 0x3400, 0x9102, 0x0120, 0x0218, 0x20a8,
++      0x900e, 0x4104, 0x080c, 0x0f11, 0x080c, 0x10cf, 0x080c, 0x15fe,
++      0x080c, 0x0d19, 0x080c, 0x50f4, 0x080c, 0x8e7a, 0x080c, 0x0e85,
++      0x080c, 0x2a8c, 0x080c, 0x65b0, 0x080c, 0x58d0, 0x080c, 0x7133,
++      0x080c, 0x1c09, 0x080c, 0x7420, 0x080c, 0x6bb9, 0x080c, 0x19df,
++      0x080c, 0x1b7a, 0x080c, 0x1bfe, 0x2091, 0x3009, 0x7883, 0x0000,
++      0x1004, 0x0910, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, 0x4000,
++      0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, 0x0904, 0x2091, 0x5000,
++      0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd,
++      0x2a70, 0x7003, 0x0000, 0x2a70, 0x7000, 0x908e, 0x0003, 0x1168,
++      0x080c, 0x3fa0, 0x080c, 0x2aa2, 0x080c, 0x6610, 0x080c, 0x5dab,
++      0x080c, 0x715a, 0x080c, 0x23a5, 0x0c70, 0x000b, 0x0c88, 0x0931,
++      0x0932, 0x0a98, 0x092f, 0x0b68, 0x0d18, 0x0d18, 0x0d18, 0x080c,
++      0x0d7e, 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086,
++      0x0001, 0x1904, 0x0a76, 0x7034, 0xd0b4, 0x1130, 0x0026, 0x2011,
++      0x0080, 0x080c, 0x0e3a, 0x002e, 0x080c, 0x62e4, 0x0150, 0x080c,
++      0x630a, 0x1580, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a,
++      0x0448, 0x080c, 0x621a, 0x7000, 0x9086, 0x0001, 0x1904, 0x0a76,
++      0x7090, 0x9086, 0x0028, 0x1904, 0x0a76, 0x2001, 0x0161, 0x2003,
++      0x0001, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x1e2f,
++      0x7a2a, 0x2011, 0x61aa, 0x080c, 0x71fa, 0x2011, 0x619d, 0x080c,
++      0x72bf, 0x2011, 0x4f57, 0x080c, 0x71fa, 0x2011, 0x8030, 0x901e,
++      0x738e, 0x00d8, 0x080c, 0x483b, 0x2079, 0x0100, 0x7844, 0x9005,
++      0x1904, 0x0a76, 0x2011, 0x4f57, 0x080c, 0x71fa, 0x2001, 0x0265,
++      0x2001, 0x0205, 0x2003, 0x0000, 0x780f, 0x006b, 0x7840, 0x9084,
++      0xfffb, 0x7842, 0x2011, 0x8010, 0x73d4, 0x080c, 0x2261, 0x080c,
++      0x3f23, 0x7240, 0xc284, 0x7242, 0x2001, 0x110c, 0x200c, 0xc1ac,
++      0xc1cc, 0x2102, 0x080c, 0x877f, 0x2011, 0x0004, 0x080c, 0xa948,
++      0x080c, 0x57d9, 0x080c, 0x62e4, 0x1120, 0x080c, 0x22a5, 0x02f0,
++      0x0410, 0x080c, 0x50b1, 0x0140, 0x708f, 0x0001, 0x70cf, 0x0000,
++      0x080c, 0x49f2, 0x0804, 0x0a76, 0x2001, 0x1153, 0x2004, 0xd094,
++      0x0190, 0x2011, 0x110c, 0x2204, 0xc0cd, 0x2012, 0x2001, 0x1172,
++      0x2004, 0xd0d4, 0x1118, 0x080c, 0x22a5, 0x1278, 0x2011, 0x110c,
++      0x2204, 0xc0bc, 0x00b0, 0x2001, 0x1172, 0x2004, 0xd0d4, 0x1db0,
++      0x2011, 0x110c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x110c, 0x2204,
++      0xc0bd, 0x2012, 0x080c, 0x58c6, 0x1128, 0xd0a4, 0x0118, 0x2204,
++      0xc0fd, 0x2012, 0x080c, 0x588e, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e,
++      0x00a8, 0x7077, 0x0000, 0x080c, 0x62e4, 0x1130, 0x70a8, 0x9005,
++      0x1168, 0x080c, 0xad47, 0x0050, 0x080c, 0xad47, 0x70d8, 0xd09c,
++      0x1128, 0x70a8, 0x9005, 0x0110, 0x080c, 0x5092, 0x70e3, 0x0000,
++      0x70df, 0x0000, 0x709f, 0x0000, 0x72d8, 0x080c, 0x62e4, 0x1170,
++      0x9016, 0x0016, 0x080c, 0x205d, 0x2019, 0x1298, 0x211a, 0x001e,
++      0x7057, 0xffff, 0x705b, 0x00ef, 0x707b, 0x0000, 0x2079, 0x1152,
++      0x7804, 0xd0ac, 0x0108, 0xc295, 0x72da, 0x080c, 0x62e4, 0x0118,
++      0x9296, 0x0004, 0x0548, 0x2011, 0x0001, 0x080c, 0xa948, 0x70a3,
++      0x0000, 0x70a7, 0xffff, 0x7003, 0x0002, 0x2079, 0x0100, 0x7827,
++      0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, 0x080c, 0x2679,
++      0x2011, 0x0005, 0x080c, 0x88e2, 0x080c, 0x7aa4, 0x080c, 0x62e4,
++      0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x205d, 0x61e2,
++      0x001e, 0x00ce, 0x012e, 0x0420, 0x70a3, 0x0000, 0x70a7, 0xffff,
++      0x7003, 0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828,
++      0x9085, 0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, 0x080c, 0x88e2,
++      0x080c, 0x7aa4, 0x080c, 0x62e4, 0x0148, 0x00c6, 0x2061, 0x0100,
++      0x0016, 0x080c, 0x205d, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e,
++      0x0005, 0x00c6, 0x080c, 0x62e4, 0x1118, 0x20a9, 0x0100, 0x0010,
++      0x20a9, 0x0082, 0x080c, 0x62e4, 0x1110, 0x900e, 0x0010, 0x2009,
++      0x007e, 0x080c, 0x2955, 0x8108, 0x1f04, 0x0a89, 0x00ce, 0x7077,
++      0x0000, 0x7078, 0x9084, 0x00ff, 0x707a, 0x70ab, 0x0000, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, 0x0b66,
++      0x70a4, 0x9086, 0xffff, 0x0130, 0x080c, 0x2679, 0x080c, 0x7aa4,
++      0x0804, 0x0b66, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0518, 0xd084,
++      0x0508, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c,
++      0x01c8, 0x70dc, 0x9086, 0xffff, 0x0188, 0x080c, 0x27da, 0x080c,
++      0x7aa4, 0x70d8, 0xd094, 0x1904, 0x0b66, 0x2011, 0x0001, 0x901e,
++      0x080c, 0x2811, 0x080c, 0x7aa4, 0x0804, 0x0b66, 0x70e0, 0x9005,
++      0x1904, 0x0b66, 0x70a0, 0x9005, 0x1904, 0x0b66, 0x70d8, 0xd0a4,
++      0x0118, 0xd0b4, 0x0904, 0x0b66, 0x080c, 0x588e, 0x1904, 0x0b66,
++      0x080c, 0x58c6, 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e,
++      0x0016, 0x080c, 0x5608, 0x1118, 0x6000, 0xd0ec, 0x1138, 0x001e,
++      0x8108, 0x1f04, 0x0ae8, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce,
++      0x015e, 0x0804, 0x0b66, 0x0006, 0x2001, 0x0103, 0x2003, 0x006b,
++      0x000e, 0x20e9, 0x0001, 0x71b0, 0x81ff, 0x11b0, 0x9006, 0x2009,
++      0x0200, 0x20a9, 0x0002, 0x20a1, 0x1302, 0x4001, 0x2009, 0x0700,
++      0x20a9, 0x0002, 0x20a1, 0x12f2, 0x4001, 0x7074, 0x8007, 0x7178,
++      0x810f, 0x20a9, 0x0002, 0x4001, 0x20a1, 0x12f6, 0x900e, 0x080c,
++      0x0d65, 0x9006, 0x810f, 0x20a9, 0x0002, 0x4001, 0x7030, 0xc08c,
++      0x7032, 0x7003, 0x0003, 0x70a7, 0xffff, 0x7034, 0xd0b4, 0x1130,
++      0x0026, 0x2011, 0x0040, 0x080c, 0x0e3a, 0x002e, 0x9006, 0x080c,
++      0x1f11, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c,
++      0x4026, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x630a,
++      0x0150, 0x080c, 0x62e4, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010,
++      0x9084, 0xffdf, 0x782a, 0x00fe, 0x2001, 0x1305, 0x2004, 0x9086,
++      0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x88e2, 0x2011, 0x0000,
++      0x080c, 0x88ec, 0x080c, 0x7aa4, 0x080c, 0x7b72, 0x012e, 0x0005,
++      0x0016, 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100,
++      0x7904, 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x507b,
++      0x7940, 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827,
++      0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156,
++      0x7954, 0xd1ac, 0x1904, 0x0bf6, 0x080c, 0x2328, 0x1148, 0x2001,
++      0x0001, 0x080c, 0x2290, 0x2001, 0x0001, 0x080c, 0x2273, 0x00b8,
++      0x080c, 0x2330, 0x1138, 0x9006, 0x080c, 0x2290, 0x9006, 0x080c,
++      0x2273, 0x0068, 0x080c, 0x2338, 0x1d50, 0x2001, 0x12d2, 0x2004,
++      0xd0fc, 0x0108, 0x0020, 0x080c, 0x2089, 0x0804, 0x0cda, 0x080c,
++      0x62f6, 0x0158, 0x080c, 0x630a, 0x1128, 0x2001, 0x12a7, 0x2003,
++      0x0000, 0x0070, 0x080c, 0x62ec, 0x0dc0, 0x2001, 0x12a7, 0x2003,
++      0xaaaa, 0x2001, 0x12a8, 0x2003, 0x0001, 0x080c, 0x621a, 0x0058,
++      0x080c, 0x62e4, 0x0140, 0x2009, 0x00f8, 0x080c, 0x507b, 0x7843,
++      0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138,
++      0x080c, 0x62e4, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0cdf, 0x1f04,
++      0x0bd5, 0x0070, 0x7824, 0x080c, 0x6300, 0x0118, 0xd0ac, 0x1904,
++      0x0cdf, 0x9084, 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0cdf,
++      0x2001, 0x0001, 0x080c, 0x1f11, 0x0804, 0x0cf2, 0x080c, 0x2328,
++      0x1148, 0x2001, 0x0001, 0x080c, 0x2290, 0x2001, 0x0001, 0x080c,
++      0x2273, 0x00b8, 0x080c, 0x2330, 0x1138, 0x9006, 0x080c, 0x2290,
++      0x9006, 0x080c, 0x2273, 0x0068, 0x080c, 0x2338, 0x1d50, 0x2001,
++      0x12d2, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2089, 0x0804,
++      0x0cda, 0x080c, 0x2346, 0x7850, 0x9085, 0x0040, 0x7852, 0x7938,
++      0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2340, 0x9085, 0x2000,
++      0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c2c, 0x080c, 0x72a5,
++      0x1f04, 0x0c2c, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852,
++      0x793a, 0x080c, 0x62f6, 0x0158, 0x080c, 0x630a, 0x1128, 0x2001,
++      0x12a7, 0x2003, 0x0000, 0x0070, 0x080c, 0x62ec, 0x0dc0, 0x2001,
++      0x12a7, 0x2003, 0xaaaa, 0x2001, 0x12a8, 0x2003, 0x0001, 0x080c,
++      0x621a, 0x0020, 0x2009, 0x00f8, 0x080c, 0x507b, 0x20a9, 0x0028,
++      0xa001, 0x1f04, 0x0c58, 0x7850, 0x9085, 0x1400, 0x7852, 0x080c,
++      0x62e4, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678,
++      0x2019, 0xea60, 0x7820, 0xd09c, 0x15a0, 0x080c, 0x62e4, 0x0904,
++      0x0cbf, 0x7824, 0xd0ac, 0x1904, 0x0cdf, 0x080c, 0x630a, 0x1548,
++      0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800,
++      0x080c, 0x2340, 0x7824, 0x9084, 0x1800, 0x1160, 0x9484, 0x0fff,
++      0x1138, 0x2001, 0x110f, 0x2004, 0xd0fc, 0x0110, 0x080c, 0x0d01,
++      0x8421, 0x1178, 0x1d04, 0x0c96, 0x080c, 0x72a5, 0x2001, 0x12a7,
++      0x2003, 0xaaaa, 0x2001, 0x12a8, 0x2003, 0x0001, 0x7003, 0x0001,
++      0x04f0, 0x8319, 0x1938, 0x1d04, 0x0ca7, 0x080c, 0x72a5, 0x2009,
++      0x12d5, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, 0x1178, 0x200b,
++      0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, 0x2321, 0x7924,
++      0x080c, 0x2340, 0xd19c, 0x0110, 0x080c, 0x2261, 0x00d8, 0x080c,
++      0x62f6, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x62be, 0x7003,
++      0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2340, 0x7824, 0x080c,
++      0x6300, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, 0x0950, 0x7003,
++      0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x1f11, 0x0078, 0x2009,
++      0x110c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, 0x0002, 0x7906,
++      0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, 0x7850, 0x9085,
++      0x0400, 0x7852, 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x7034,
++      0xd0b4, 0x1110, 0x080c, 0x0df3, 0x012e, 0x00fe, 0x004e, 0x001e,
++      0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x00b6, 0x00c6, 0x00d6,
++      0x00e6, 0x00f6, 0x0156, 0x080c, 0x2aa2, 0x015e, 0x00fe, 0x00ee,
++      0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x001e, 0x000e, 0x0005,
++      0x0005, 0x2a70, 0x2061, 0x12e3, 0x2063, 0x0003, 0x6007, 0x0001,
++      0x600b, 0x0014, 0x600f, 0x0017, 0x2001, 0x12a7, 0x900e, 0x2102,
++      0x718e, 0x2001, 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x7057,
++      0xffff, 0x0008, 0x7156, 0x705f, 0xffff, 0x7176, 0x717a, 0x080c,
++      0xad47, 0x2061, 0x1297, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800,
++      0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f,
++      0x07d0, 0x2061, 0x129f, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f,
++      0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061,
++      0x12c3, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
++      0x2020, 0x2001, 0x112a, 0x2102, 0x0005, 0x9016, 0x080c, 0x5608,
++      0x1178, 0x6004, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4,
++      0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210,
++      0x8108, 0x9186, 0x0100, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000,
++      0x0e04, 0x0d80, 0x0006, 0x0016, 0x2079, 0x0000, 0x001e, 0x798e,
++      0x000e, 0x788a, 0x000e, 0x7886, 0x3900, 0x789a, 0x7883, 0x8002,
++      0x7837, 0x8002, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6,
++      0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x137c, 0x7a18, 0x226a,
++      0x8d68, 0x7a1c, 0x226a, 0x782c, 0x2019, 0x1389, 0x201a, 0x2019,
++      0x138c, 0x9016, 0x7808, 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210,
++      0x8318, 0x9386, 0x13a1, 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110,
++      0x2011, 0xdead, 0x2019, 0x138a, 0x782c, 0x201a, 0x8318, 0x221a,
++      0x7803, 0x0000, 0x2069, 0x135c, 0x901e, 0x20a9, 0x0020, 0x7b26,
++      0x7a28, 0x226a, 0x8d68, 0x8318, 0x1f04, 0x0dc7, 0x002e, 0x003e,
++      0x00de, 0x015e, 0x2079, 0x1100, 0x7803, 0x0005, 0x2091, 0x4080,
++      0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x1336, 0x2004,
++      0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001,
++      0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x7834, 0xd0b4, 0x1108,
++      0x04b9, 0x0cd8, 0x0005, 0x00f6, 0x0006, 0x2079, 0x1125, 0x2f04,
++      0x8000, 0x207a, 0x080c, 0x2338, 0x1150, 0x0006, 0x2001, 0x12d2,
++      0x2004, 0xd0fc, 0x000e, 0x1118, 0x9082, 0x7530, 0x0010, 0x9082,
++      0x000f, 0x0258, 0x9006, 0x207a, 0x2079, 0x1128, 0x2f04, 0x9084,
++      0x0001, 0x9086, 0x0001, 0x207a, 0x0080, 0x2079, 0x1128, 0x2f7c,
++      0x8fff, 0x1130, 0x0026, 0x2011, 0x0080, 0x00e1, 0x002e, 0x0028,
++      0x0026, 0x2011, 0x0000, 0x00b1, 0x002e, 0x000e, 0x00fe, 0x0005,
++      0x0026, 0x2011, 0x0080, 0x0071, 0x002e, 0x2009, 0x0fff, 0x00b9,
++      0x0026, 0x2011, 0x0040, 0x0031, 0x002e, 0x2009, 0x0fff, 0x0079,
++      0x0c78, 0x0005, 0x0016, 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0,
++      0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x001e, 0x0005, 0x0156,
++      0x0126, 0x918c, 0x0fff, 0x21a8, 0x1d04, 0x0e4c, 0x2091, 0x6000,
++      0x1f04, 0x0e4c, 0x012e, 0x015e, 0x0005, 0x890b, 0x810b, 0x810b,
++      0x810b, 0x810b, 0x810b, 0x9994, 0xfc00, 0x8217, 0x8214, 0x8214,
++      0x0005, 0x0006, 0x814c, 0x894c, 0x894c, 0x894c, 0x894c, 0x894c,
++      0x9284, 0x003f, 0x8007, 0x8003, 0x8003, 0x994d, 0x000e, 0x0005,
++      0x0016, 0x0026, 0x0096, 0x3348, 0x0c01, 0x2100, 0x9300, 0x2098,
++      0x22e0, 0x009e, 0x002e, 0x001e, 0x3518, 0x20a9, 0x0001, 0x4002,
++      0x8007, 0x4004, 0x8319, 0x1dd8, 0x0005, 0x2071, 0x1100, 0x7164,
++      0x712e, 0x2021, 0x0001, 0x9190, 0x0040, 0x9298, 0x0040, 0x0240,
++      0x7068, 0x9302, 0x1228, 0x220a, 0x2208, 0x2310, 0x8420, 0x0ca8,
++      0x200b, 0x0000, 0x74ba, 0x74be, 0x0005, 0x00e6, 0x0126, 0x2091,
++      0x8000, 0x2071, 0x1100, 0x70bc, 0x90ea, 0x0010, 0x0268, 0x8001,
++      0x70be, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807,
++      0x0000, 0x012e, 0x00ee, 0x0005, 0x906e, 0x0cd8, 0x00e6, 0x2071,
++      0x1100, 0x0126, 0x2091, 0x8000, 0x70bc, 0x8001, 0x0270, 0x70be,
++      0x702c, 0x2068, 0x9085, 0x0001, 0x2d04, 0x702e, 0x206b, 0x0000,
++      0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x906e, 0x0cd8, 0x00e6,
++      0x0126, 0x2091, 0x8000, 0x2071, 0x1100, 0x702c, 0x206a, 0x2d00,
++      0x702e, 0x70bc, 0x8000, 0x70be, 0x012e, 0x00ee, 0x0005, 0x8dff,
++      0x0138, 0x6804, 0x6807, 0x0000, 0x0006, 0x0c49, 0x00de, 0x0cb8,
++      0x0005, 0x00d6, 0x0859, 0x0148, 0x0016, 0x0026, 0x2d08, 0x2011,
++      0x0001, 0x080c, 0x0e61, 0x002e, 0x001e, 0x00de, 0x0005, 0x00d6,
++      0x080c, 0x0e9d, 0x0148, 0x0016, 0x0026, 0x2d08, 0x2011, 0x0001,
++      0x080c, 0x0e61, 0x002e, 0x001e, 0x00de, 0x0005, 0x00d6, 0x0016,
++      0x0026, 0x080c, 0x0e55, 0x2168, 0x002e, 0x001e, 0x0801, 0x00de,
++      0x0005, 0x00e6, 0x2071, 0x1335, 0x7007, 0x0000, 0x9006, 0x701e,
++      0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8004, 0x7012,
++      0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2270, 0x700b,
++      0x0000, 0x2071, 0x1335, 0x701c, 0x9088, 0x133f, 0x220a, 0x8000,
++      0x9084, 0x0007, 0x701e, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079,
++      0x0080, 0x0089, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x00e6, 0x2071,
++      0x1335, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0019,
++      0x00fe, 0x00ee, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007,
++      0x0006, 0x7000, 0x0002, 0x0f5d, 0x0f5b, 0x0f5b, 0x0f5b, 0x10be,
++      0x10be, 0x10be, 0x10be, 0x080c, 0x0d7e, 0x701c, 0x7120, 0x9106,
++      0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007,
++      0x0000, 0x0005, 0x00d6, 0x9180, 0x133f, 0x2004, 0x700a, 0x2068,
++      0x8108, 0x918c, 0x0007, 0x7122, 0x782b, 0x0026, 0x6828, 0x7802,
++      0x682c, 0x7806, 0x6830, 0x780a, 0x6834, 0x780e, 0x6814, 0x700e,
++      0x680c, 0x7016, 0x6810, 0x701a, 0x6804, 0x00de, 0xd084, 0x0120,
++      0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005,
++      0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210,
++      0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b, 0x0020,
++      0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0136,
++      0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000,
++      0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182,
++      0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203,
++      0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001, 0x015e,
++      0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x1335, 0x2104,
++      0xc095, 0x200a, 0x080c, 0x0f3e, 0x0005, 0x0016, 0x00e6, 0x2071,
++      0x1335, 0x00f6, 0x2079, 0x0080, 0x792c, 0x782b, 0x0002, 0xd1fc,
++      0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e,
++      0x0005, 0x0f4b, 0x0ff2, 0x1024, 0x0ff0, 0x0ff0, 0x10ca, 0x0ff0,
++      0x080c, 0x0d7e, 0x918c, 0x0700, 0x1548, 0x0136, 0x0146, 0x0156,
++      0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088,
++      0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e,
++      0x014e, 0x013e, 0x700c, 0x9005, 0x0560, 0x7800, 0x7802, 0x7804,
++      0x7806, 0x080c, 0x0f90, 0x0005, 0x7008, 0x9080, 0x0002, 0x2003,
++      0x0100, 0x7007, 0x0000, 0x080c, 0x0f4b, 0x0005, 0x7008, 0x9080,
++      0x0002, 0x2003, 0x0200, 0x0ca8, 0x918c, 0x0700, 0x1150, 0x700c,
++      0x9005, 0x0178, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x0fa5,
++      0x0005, 0x7008, 0x9080, 0x0002, 0x2003, 0x0200, 0x7007, 0x0000,
++      0x0080, 0x00d6, 0x7008, 0x2068, 0x7800, 0x682a, 0x7804, 0x682e,
++      0x7808, 0x6832, 0x780c, 0x6836, 0x680b, 0x0100, 0x00de, 0x7007,
++      0x0000, 0x00c6, 0x00d6, 0x7008, 0x2060, 0x9086, 0x11fb, 0x1128,
++      0x6038, 0x080f, 0x00de, 0x00ce, 0x0078, 0x00de, 0x00ce, 0x00c6,
++      0x00d6, 0x7008, 0x2060, 0x0059, 0x0128, 0x6038, 0x080f, 0x00de,
++      0x00ce, 0x0005, 0x00de, 0x00ce, 0x080c, 0x0f4b, 0x0005, 0x00e6,
++      0x2071, 0x1100, 0x8cff, 0x0140, 0x7064, 0x9c02, 0x0238, 0x9c82,
++      0xffff, 0x1220, 0x9085, 0x0001, 0x00ee, 0x0005, 0x9006, 0x0ce0,
++      0x603c, 0x906d, 0x090c, 0x0d7e, 0x6008, 0x908e, 0x0100, 0x0130,
++      0x687b, 0x0030, 0x6883, 0x0000, 0x6897, 0x4002, 0x080c, 0x5b76,
++      0x603b, 0x0000, 0x603f, 0x0000, 0x2c00, 0x2068, 0x080c, 0x0ecf,
++      0x0005, 0x00f6, 0x603c, 0x906d, 0x090c, 0x0d7e, 0x6008, 0x908e,
++      0x0100, 0x0128, 0x687b, 0x0001, 0x6883, 0x0000, 0x0080, 0x680c,
++      0x2078, 0x7804, 0x9005, 0x0158, 0x680e, 0x2078, 0x9080, 0x0002,
++      0x6012, 0x7800, 0x6016, 0x2c10, 0x080c, 0x0f22, 0x0068, 0x00d6,
++      0x080c, 0x5b76, 0x00de, 0x687c, 0xd0f4, 0x0130, 0x6894, 0x00c6,
++      0x2060, 0x080c, 0x8ed9, 0x00ce, 0x00fe, 0x0005, 0x0126, 0x2091,
++      0x8000, 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002,
++      0x012e, 0x0005, 0x7007, 0x0000, 0x080c, 0x0f4b, 0x0005, 0x0126,
++      0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1347, 0x7003, 0x0000,
++      0x78bf, 0x00f6, 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9,
++      0x01ea, 0x2061, 0xc47d, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002,
++      0x7916, 0x1f04, 0x10e3, 0x7807, 0x0001, 0x7803, 0x0000, 0x7803,
++      0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c,
++      0x0110, 0x7820, 0x0cd8, 0x2001, 0x1348, 0x2003, 0x0000, 0x78ab,
++      0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0001,
++      0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x135c,
++      0x781f, 0xff00, 0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc,
++      0x0110, 0x781f, 0x0303, 0x2061, 0x135c, 0x602f, 0x15c0, 0x6033,
++      0x3000, 0x603b, 0x18fe, 0x00ce, 0x0005, 0x0126, 0x2091, 0x2200,
++      0x7808, 0xd09c, 0x0158, 0x7820, 0x908c, 0xf000, 0x1578, 0x908c,
++      0x0fe0, 0x190c, 0x0d7e, 0x0043, 0x012e, 0x0005, 0x9084, 0x0070,
++      0x190c, 0x0d7e, 0x012e, 0x0005, 0x115c, 0x115c, 0x1165, 0x116a,
++      0x116e, 0x1173, 0x119a, 0x119e, 0x11ab, 0x11af, 0x115c, 0x1233,
++      0x1237, 0x1296, 0x115c, 0x115c, 0x115c, 0x115c, 0x115c, 0x115c,
++      0x115c, 0x115c, 0x115c, 0x115c, 0x115c, 0x115c, 0x115c, 0x1175,
++      0x115c, 0x115c, 0x115c, 0x115c, 0x080c, 0x0d7e, 0x2009, 0x0048,
++      0x2060, 0x080c, 0x8f53, 0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5,
++      0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x129d,
++      0x080c, 0x133c, 0x0005, 0x080c, 0x0d7e, 0x080c, 0x129d, 0x2060,
++      0x6014, 0x9080, 0x000e, 0x2003, 0xffff, 0x2009, 0x0048, 0x080c,
++      0x8f53, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109,
++      0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218,
++      0x2004, 0xd0ec, 0x1110, 0x080c, 0x12a2, 0x2001, 0x0307, 0x2003,
++      0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x129d,
++      0x2060, 0x6014, 0x9080, 0x000e, 0x2003, 0xffff, 0x2009, 0x0048,
++      0x080c, 0x8f53, 0x0005, 0x080c, 0x129d, 0x080c, 0x0d7e, 0x080c,
++      0x129d, 0x080c, 0x121e, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540,
++      0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001,
++      0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005,
++      0x1180, 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc,
++      0x090c, 0x0d7e, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
++      0x0460, 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x1237, 0x0005,
++      0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d7e, 0x6014, 0x2068,
++      0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x1577, 0x080c,
++      0xa942, 0x0158, 0x69ac, 0x6936, 0x69b0, 0x693a, 0x683f, 0xffff,
++      0x6843, 0xffff, 0x6880, 0xc0bd, 0x6882, 0x080c, 0xa5f3, 0x0005,
++      0x6010, 0x2004, 0xd0bc, 0x190c, 0xace0, 0x2029, 0x00c8, 0x8529,
++      0x0128, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c,
++      0xc426, 0xd5a4, 0x1118, 0x080c, 0x12a2, 0x0005, 0x080c, 0x1577,
++      0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066,
++      0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186,
++      0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x130c, 0x00fe, 0x007e,
++      0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104,
++      0x9184, 0x0004, 0x190c, 0x0d7e, 0xd184, 0x1189, 0xd19c, 0x0158,
++      0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
++      0x080c, 0x12a2, 0x0005, 0x81ff, 0x190c, 0x0d7e, 0x0005, 0xc184,
++      0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15c0, 0x2071, 0x0200,
++      0x080c, 0x1330, 0x6014, 0x9005, 0x0588, 0x9080, 0x0019, 0x2004,
++      0x9084, 0x00ff, 0x908e, 0x0029, 0x0148, 0x908e, 0x0048, 0x1530,
++      0x00f6, 0x2c78, 0x080c, 0x137e, 0x00fe, 0x00a8, 0x00f6, 0x2c78,
++      0x080c, 0x1436, 0x00fe, 0x2009, 0x01f4, 0x8109, 0x0160, 0x2001,
++      0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec,
++      0x1110, 0x0401, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c,
++      0x10f3, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d,
++      0x2003, 0x0050, 0x2003, 0x0020, 0x0069, 0x0ca8, 0x0031, 0x2060,
++      0x2009, 0x0053, 0x080c, 0x8f53, 0x0005, 0x7808, 0xd09c, 0x0de8,
++      0x7820, 0x0005, 0x080c, 0x121e, 0x00d6, 0x2069, 0x0200, 0x2009,
++      0x01f4, 0x8109, 0x0508, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d,
++      0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1520, 0x79b8, 0x918c, 0x0fff,
++      0x0178, 0x9182, 0x0841, 0x1260, 0x9188, 0x0007, 0x918c, 0x0ff8,
++      0x810c, 0x810c, 0x810c, 0x04d1, 0x6827, 0x0001, 0x8109, 0x1dd8,
++      0x04a9, 0x6827, 0x0002, 0x0491, 0x6804, 0x9005, 0x1130, 0x682c,
++      0xd0e4, 0x11d0, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1120,
++      0x08c8, 0x080c, 0x1577, 0x0070, 0x7827, 0x0015, 0x782b, 0x0000,
++      0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307, 0x2003, 0x0300,
++      0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084, 0x5400, 0x9086,
++      0x5400, 0x0d50, 0x7827, 0x0015, 0x782b, 0x0000, 0x7803, 0x0001,
++      0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0005, 0x6824, 0x9084,
++      0x0003, 0x1de0, 0x0005, 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021,
++      0x7830, 0x9086, 0x0041, 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006,
++      0x7808, 0xd09c, 0x0140, 0x0016, 0x0026, 0x00c6, 0x080c, 0x1125,
++      0x00ce, 0x002e, 0x001e, 0x000e, 0x7832, 0x7936, 0x7a3a, 0x781b,
++      0x8080, 0x2009, 0xff00, 0x8109, 0x0128, 0x7818, 0xd0bc, 0x1dd8,
++      0x00fe, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d7e,
++      0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc,
++      0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200,
++      0x0c79, 0x7358, 0x745c, 0x6014, 0x905d, 0x0568, 0x2b68, 0x6010,
++      0x2004, 0xd0bc, 0x190c, 0xacbb, 0x6b42, 0x6c3e, 0x2001, 0x1174,
++      0x2004, 0xd0b4, 0x1158, 0x601c, 0xd0e4, 0x1140, 0x6010, 0x2004,
++      0xd0bc, 0x1120, 0x683b, 0x7fff, 0x6837, 0xffff, 0x080c, 0x191e,
++      0x1190, 0x080c, 0x1484, 0x2a00, 0x6816, 0x0130, 0x2c00, 0x680e,
++      0x2805, 0x680a, 0x2800, 0x6812, 0x7037, 0x0020, 0x781f, 0x0300,
++      0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e,
++      0x00ee, 0x080c, 0x12a2, 0x0005, 0x080c, 0x0d7e, 0x2ff0, 0x0126,
++      0x2091, 0x2200, 0x3e60, 0x6014, 0x2068, 0x2d60, 0x903e, 0x2730,
++      0x6964, 0x691a, 0x9184, 0x000f, 0x9088, 0x18fe, 0x2145, 0x0002,
++      0x13a0, 0x1407, 0x13a0, 0x13a0, 0x13a0, 0x13e0, 0x13a0, 0x13a4,
++      0x13a0, 0x13f5, 0x13a0, 0x13a0, 0x13a0, 0x13a0, 0x13ca, 0x13b6,
++      0x9085, 0x0001, 0x0804, 0x142e, 0x687c, 0xd0bc, 0x0dc8, 0x6890,
++      0x6842, 0x688c, 0x683e, 0x6888, 0x00d6, 0x2805, 0x9c68, 0x6b08,
++      0x6a0c, 0x6d00, 0x6c04, 0x00de, 0x0804, 0x1416, 0x687c, 0xd0bc,
++      0x0d38, 0x6890, 0x6842, 0x688c, 0x683e, 0x6888, 0x00d6, 0x2805,
++      0x9c68, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x00de,
++      0x0804, 0x1416, 0x687c, 0xd0bc, 0x0998, 0x6890, 0x6842, 0x688c,
++      0x683e, 0x6804, 0x2060, 0x9080, 0x0019, 0x200c, 0x691a, 0x91cc,
++      0x000f, 0x9980, 0x18fe, 0x2045, 0x6888, 0xd19c, 0x11e8, 0x0470,
++      0x687c, 0xd0ac, 0x0904, 0x13a0, 0x6804, 0x2060, 0x9080, 0x0019,
++      0x200c, 0x691a, 0x91cc, 0x000f, 0x9980, 0x18fe, 0x2045, 0x9006,
++      0x6842, 0x683e, 0xd19c, 0x1140, 0x00c8, 0x687c, 0xd0ac, 0x0904,
++      0x13a0, 0x9006, 0x6842, 0x683e, 0x00d6, 0x2805, 0x9c68, 0x6b10,
++      0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x00de, 0x0078, 0x687c,
++      0xd0ac, 0x0904, 0x13a0, 0x9006, 0x6842, 0x683e, 0x00d6, 0x2805,
++      0x9c68, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x00de, 0x6b2e, 0x6a32,
++      0x6d1e, 0x6c22, 0x6f26, 0x6e2a, 0x6988, 0x8840, 0x281d, 0x68ac,
++      0x6ab0, 0x6836, 0x6a3a, 0x8109, 0x6916, 0x1150, 0x3e60, 0x601c,
++      0xc085, 0x601e, 0x687c, 0xc0dd, 0x687e, 0x9006, 0x012e, 0x0005,
++      0x2c00, 0x680e, 0x6b0a, 0x2800, 0x6812, 0x0c80, 0x2ff0, 0x0126,
++      0x2091, 0x2200, 0x3e60, 0x6014, 0x2068, 0x2d60, 0x680e, 0x2041,
++      0x18fb, 0x680b, 0x18fb, 0x2805, 0x6812, 0x6964, 0x691a, 0x687c,
++      0xd0ac, 0x090c, 0x0d7e, 0x9006, 0x6842, 0x683e, 0x00d6, 0x2805,
++      0x9c68, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x00de,
++      0x6b2e, 0x6a32, 0x6d1e, 0x6c22, 0x6f26, 0x6e2a, 0x68ac, 0x6ab0,
++      0x6836, 0x6a3a, 0x6988, 0x918a, 0x0002, 0x6916, 0x1150, 0x3e60,
++      0x601c, 0xc085, 0x601e, 0x687c, 0xc0dd, 0x687e, 0x9006, 0x012e,
++      0x0005, 0x6804, 0x9065, 0x090c, 0x0d7e, 0x680e, 0x6064, 0x681a,
++      0x9084, 0x000f, 0x9080, 0x18fe, 0x2015, 0x82ff, 0x090c, 0x0d7e,
++      0x6a0a, 0x2205, 0x6812, 0x0c18, 0x903e, 0x2730, 0x6880, 0xd0fc,
++      0x11a8, 0x00d6, 0x2805, 0x9c68, 0x2900, 0x0002, 0x14c6, 0x14ac,
++      0x14ac, 0x14c6, 0x14c6, 0x14c0, 0x14c6, 0x14ac, 0x14c6, 0x14b1,
++      0x14b1, 0x14c6, 0x14c6, 0x14c6, 0x14b8, 0x14b1, 0xc0fc, 0x6882,
++      0x6b2c, 0x6a30, 0x6d1c, 0x6c20, 0x00d6, 0xd99c, 0x0510, 0x2805,
++      0x9c68, 0x6f08, 0x6e0c, 0x00e8, 0x6b08, 0x6a0c, 0x6d00, 0x6c04,
++      0x00c0, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0088,
++      0x00de, 0x00d6, 0x6864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1130,
++      0x00de, 0x080c, 0x18be, 0x1900, 0x900e, 0x0060, 0x00de, 0x080c,
++      0x0d7e, 0x00de, 0x6b2e, 0x6a32, 0x6d1e, 0x6c22, 0x6f26, 0x6e2a,
++      0x080c, 0x18be, 0x0005, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0110,
++      0xd0d4, 0x1180, 0x6014, 0x9080, 0x0021, 0x6118, 0x810c, 0x810c,
++      0x810c, 0x81ff, 0x1118, 0x2003, 0x0001, 0x0008, 0x2102, 0x601b,
++      0x0002, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x2001,
++      0x0037, 0x2c08, 0x080c, 0x130c, 0x7808, 0xd09c, 0x0140, 0x0016,
++      0x0026, 0x00c6, 0x080c, 0x1125, 0x00ce, 0x002e, 0x001e, 0x6000,
++      0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x8f53, 0x012e,
++      0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x7908, 0x918c,
++      0x0007, 0x9186, 0x0000, 0x0904, 0x156c, 0x9186, 0x0003, 0x0904,
++      0x156c, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0190, 0x00c6,
++      0x7808, 0xd09c, 0x190c, 0x1125, 0x00ce, 0x2001, 0x0038, 0x2c08,
++      0x621c, 0x080c, 0x130c, 0x7930, 0x9186, 0x0040, 0x05c8, 0x9186,
++      0x0042, 0x190c, 0x0d7e, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631,
++      0x1d30, 0x080c, 0x15c6, 0x0026, 0x0056, 0x2001, 0x00d2, 0x8001,
++      0x1df0, 0x2031, 0x2000, 0x8631, 0x1138, 0x0489, 0x601c, 0xc084,
++      0x601e, 0x005e, 0x002e, 0x00e0, 0x2001, 0x020b, 0x2004, 0xd0e4,
++      0x0d90, 0x2001, 0x015d, 0x2003, 0x0000, 0x78ab, 0x0004, 0x080c,
++      0x10f3, 0x601c, 0xc084, 0x601e, 0x7803, 0x0000, 0x7803, 0x0001,
++      0x005e, 0x002e, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
++      0x000e, 0x6022, 0x012e, 0x0005, 0x601c, 0xc084, 0x601e, 0x7827,
++      0x0015, 0x7828, 0x9c06, 0x1db0, 0x782b, 0x0000, 0x0c98, 0x00f6,
++      0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c,
++      0x62e4, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160,
++      0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0,
++      0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x6380, 0x006e, 0x0005,
++      0x0469, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
++      0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x235b, 0x2009, 0x003c,
++      0x080c, 0x1b67, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084,
++      0x003c, 0x1de0, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e,
++      0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c,
++      0x10f3, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138,
++      0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000,
++      0x080c, 0x62e4, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001, 0x0141,
++      0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c, 0x0048,
++      0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70,
++      0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021, 0x0019,
++      0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048, 0x0120,
++      0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x00e6, 0x2071,
++      0x134a, 0x7003, 0x0000, 0x00ee, 0x0005, 0x00d6, 0x9280, 0x0005,
++      0x206c, 0x697c, 0xd1dc, 0x1904, 0x167b, 0x6964, 0x9184, 0x0007,
++      0x0002, 0x1619, 0x1666, 0x1619, 0x1619, 0x1619, 0x164d, 0x162c,
++      0x161b, 0x080c, 0x0d7e, 0x687c, 0xd0b4, 0x0904, 0x176d, 0x6890,
++      0x6842, 0x683a, 0x688c, 0x683e, 0x6836, 0x68ac, 0x6846, 0x68b0,
++      0x684a, 0x6988, 0x0804, 0x166e, 0x6864, 0x9084, 0x00ff, 0x9086,
++      0x001e, 0x1d38, 0x687c, 0xd0b4, 0x0904, 0x176d, 0x6890, 0x6842,
++      0x683a, 0x688c, 0x683e, 0x6836, 0x68ac, 0x6846, 0x68b0, 0x684a,
++      0x6804, 0x685a, 0x9080, 0x0019, 0x2004, 0x9084, 0x000f, 0x9080,
++      0x18fe, 0x2005, 0x6812, 0x6988, 0x0450, 0x918c, 0x00ff, 0x9186,
++      0x0015, 0x1548, 0x687c, 0xd0b4, 0x0904, 0x176d, 0x6804, 0x685a,
++      0x9080, 0x0019, 0x2004, 0x9084, 0x000f, 0x9080, 0x18fe, 0x2005,
++      0x6812, 0x6988, 0x9006, 0x6842, 0x683e, 0x0088, 0x687c, 0xd0b4,
++      0x0904, 0x176d, 0x6988, 0x9006, 0x6842, 0x683e, 0x2d00, 0x685a,
++      0x6864, 0x9084, 0x000f, 0x9080, 0x18fe, 0x2005, 0x6812, 0x6916,
++      0x687c, 0xc0dd, 0x687e, 0x00de, 0x0005, 0x00f6, 0x2079, 0x0090,
++      0x782c, 0xd0fc, 0x190c, 0x17b0, 0x00e6, 0x00d6, 0x2071, 0x134a,
++      0x7000, 0x9005, 0x1904, 0x16de, 0x00c6, 0x7206, 0x9280, 0x0005,
++      0x205c, 0x7004, 0x2068, 0x782b, 0x0004, 0x2001, 0x0200, 0x2003,
++      0x0040, 0x6810, 0x00d6, 0x2068, 0x686c, 0x7836, 0x6890, 0x00f6,
++      0x2079, 0x0200, 0x7803, 0x0040, 0xa001, 0xa001, 0xa001, 0xa001,
++      0xa001, 0xa001, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe,
++      0x00de, 0x2b68, 0x6814, 0x2050, 0x6858, 0x2060, 0x6810, 0x2040,
++      0x6064, 0x90cc, 0x000f, 0x6944, 0x791a, 0x7116, 0x6848, 0x781e,
++      0x701a, 0x9006, 0x700e, 0x7012, 0x7004, 0x6940, 0x6838, 0x9106,
++      0x11c8, 0x693c, 0x6834, 0x9106, 0x11a8, 0x8aff, 0x01f0, 0x0126,
++      0x2091, 0x8000, 0x2079, 0x0090, 0x2009, 0x0001, 0x00d1, 0x0118,
++      0x2009, 0x0001, 0x00b1, 0x012e, 0x00ce, 0x9006, 0x00de, 0x00ee,
++      0x00fe, 0x0005, 0x0036, 0x0046, 0x6b38, 0x6c34, 0x080c, 0x191e,
++      0x004e, 0x003e, 0x0d10, 0x00ce, 0x0c88, 0x00ce, 0x9085, 0x0001,
++      0x0c68, 0x0076, 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff,
++      0x0904, 0x1766, 0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203,
++      0x0a04, 0x1765, 0x9705, 0x0904, 0x1765, 0x903e, 0x2730, 0x6880,
++      0xd0fc, 0x11a8, 0x00d6, 0x2805, 0x9c68, 0x2900, 0x0002, 0x1748,
++      0x172d, 0x172d, 0x1748, 0x1748, 0x1741, 0x1748, 0x172d, 0x1748,
++      0x1732, 0x1732, 0x1748, 0x1748, 0x1748, 0x1739, 0x1732, 0xc0fc,
++      0x6882, 0x6b2c, 0x6a30, 0x6d1c, 0x6c20, 0xd99c, 0x0528, 0x00d6,
++      0x2805, 0x9c68, 0x6f08, 0x6e0c, 0x00f0, 0x6b08, 0x6a0c, 0x6d00,
++      0x6c04, 0x00c8, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
++      0x0090, 0x00de, 0x00d6, 0x6864, 0x9084, 0x00ff, 0x9086, 0x001e,
++      0x1138, 0x00de, 0x080c, 0x18be, 0x1904, 0x16f7, 0x900e, 0x00f0,
++      0x00de, 0x080c, 0x0d7e, 0x00de, 0x7b12, 0x7a16, 0x7d02, 0x7c06,
++      0x7f0a, 0x7e0e, 0x792a, 0x7000, 0x8000, 0x7002, 0x683c, 0x9300,
++      0x683e, 0x6840, 0x9201, 0x6842, 0x700c, 0x9300, 0x700e, 0x7010,
++      0x9201, 0x7012, 0x080c, 0x18be, 0x0008, 0x9006, 0x002e, 0x003e,
++      0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0d7e, 0x0026,
++      0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000,
++      0x7004, 0x2060, 0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x0118,
++      0x6880, 0xc0bd, 0x6882, 0x6020, 0x9086, 0x0006, 0x1180, 0x2061,
++      0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206,
++      0x1dc0, 0x60c4, 0x689a, 0x60c8, 0x6896, 0x7004, 0x2060, 0x00de,
++      0x00c6, 0x080c, 0xa5f3, 0x00ce, 0x2001, 0x1313, 0x2004, 0x9c06,
++      0x1160, 0x2009, 0x0040, 0x080c, 0x1b67, 0x080c, 0x8a8d, 0x2011,
++      0x0000, 0x080c, 0x88ec, 0x080c, 0x7b72, 0x002e, 0x0804, 0x186a,
++      0x0126, 0x2091, 0x2400, 0x0006, 0x0016, 0x00f6, 0x00e6, 0x00d6,
++      0x00c6, 0x2079, 0x0090, 0x2071, 0x134a, 0x2b68, 0x6858, 0x2060,
++      0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x176f, 0x7000,
++      0x0002, 0x186a, 0x17cd, 0x183d, 0x1868, 0x8001, 0x7002, 0xd19c,
++      0x1170, 0x8aff, 0x05d0, 0x2009, 0x0001, 0x080c, 0x16f1, 0x0904,
++      0x186a, 0x2009, 0x0001, 0x080c, 0x16f1, 0x0804, 0x186a, 0x782b,
++      0x0004, 0xd194, 0x0148, 0x6880, 0xc0fc, 0x6882, 0x8aff, 0x11d8,
++      0x687c, 0xc0f5, 0x687e, 0x00b8, 0x0026, 0x0036, 0x6b3c, 0x6a40,
++      0x7810, 0x682e, 0x931a, 0x7814, 0x6832, 0x9213, 0x7800, 0x681e,
++      0x7804, 0x6822, 0x6b3e, 0x6a42, 0x003e, 0x002e, 0x080c, 0x18d6,
++      0x6880, 0xc0fd, 0x6882, 0x2a00, 0x6816, 0x2c00, 0x685a, 0x2800,
++      0x6812, 0x7003, 0x0000, 0x0804, 0x186a, 0x00f6, 0x0026, 0x781c,
++      0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984,
++      0x9085, 0x0012, 0x7816, 0x0036, 0x2019, 0x1000, 0x8319, 0x090c,
++      0x0d7e, 0x7820, 0xd0bc, 0x1dd0, 0x003e, 0x79c8, 0x000e, 0x9102,
++      0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e,
++      0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x002e, 0x00fe,
++      0x782b, 0x0008, 0x7003, 0x0000, 0x0468, 0x8001, 0x7002, 0xd194,
++      0x0168, 0x782c, 0xd0fc, 0x1904, 0x17c0, 0xd19c, 0x11f8, 0x8aff,
++      0x0508, 0x2009, 0x0001, 0x080c, 0x16f1, 0x00e0, 0x0026, 0x0036,
++      0x6b3c, 0x6a40, 0x080c, 0x18d6, 0x00d6, 0x2805, 0x9c68, 0x6064,
++      0xd09c, 0x1128, 0x6808, 0x931a, 0x680c, 0x9213, 0x0020, 0x6810,
++      0x931a, 0x6814, 0x9213, 0x00de, 0x0804, 0x17f0, 0x0804, 0x17ec,
++      0x080c, 0x0d7e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x001e, 0x000e,
++      0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x134a, 0x7000, 0x9086,
++      0x0000, 0x0904, 0x18bb, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c,
++      0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188,
++      0x080c, 0xc46f, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d7e,
++      0x0016, 0x2009, 0x0040, 0x080c, 0x1b67, 0x001e, 0x2001, 0x020c,
++      0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106,
++      0x1120, 0x2009, 0x0040, 0x080c, 0x1b67, 0x782c, 0xd0fc, 0x09a8,
++      0x080c, 0x17b0, 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004,
++      0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x1b67, 0x782b,
++      0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x8840, 0x2805,
++      0x9005, 0x0110, 0x8a51, 0x0005, 0x6004, 0x9005, 0x0168, 0x685a,
++      0x2060, 0x6064, 0x9084, 0x000f, 0x9080, 0x18fe, 0x2045, 0x88ff,
++      0x090c, 0x0d7e, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8841,
++      0x2805, 0x9005, 0x1190, 0x2c00, 0x9d06, 0x0120, 0x6000, 0x9005,
++      0x1108, 0x2d00, 0x2060, 0x685a, 0x6064, 0x9084, 0x000f, 0x9080,
++      0x190e, 0x2045, 0x88ff, 0x090c, 0x0d7e, 0x0005, 0x0000, 0x001d,
++      0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b,
++      0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0000, 0x18f3,
++      0x18ef, 0x0000, 0x0000, 0x18fd, 0x0000, 0x18f3, 0x0000, 0x18fa,
++      0x18f7, 0x0000, 0x0000, 0x0000, 0x18fd, 0x18fa, 0x0000, 0x18f5,
++      0x18f5, 0x0000, 0x0000, 0x18fd, 0x0000, 0x18f5, 0x0000, 0x18fb,
++      0x18fb, 0x0000, 0x0000, 0x0000, 0x18fd, 0x18fb, 0x00a6, 0x0096,
++      0x0086, 0x6b42, 0x6c3e, 0x6888, 0x9055, 0x0904, 0x19af, 0x2d60,
++      0x6064, 0x90cc, 0x000f, 0x99c0, 0x18fe, 0x9986, 0x0007, 0x0130,
++      0x9986, 0x000e, 0x0118, 0x9986, 0x000f, 0x1120, 0x608c, 0x9422,
++      0x6090, 0x931b, 0x2805, 0x9045, 0x1140, 0x0310, 0x0804, 0x19af,
++      0x6004, 0x9065, 0x0904, 0x19af, 0x0c18, 0x2805, 0x9005, 0x01a8,
++      0x9c68, 0xd99c, 0x1128, 0x6808, 0x9422, 0x680c, 0x931b, 0x0020,
++      0x6810, 0x9422, 0x6814, 0x931b, 0x0620, 0x2300, 0x9405, 0x0150,
++      0x8a51, 0x0904, 0x19af, 0x8840, 0x0c40, 0x6004, 0x9065, 0x0904,
++      0x19af, 0x0830, 0x8a51, 0x0904, 0x19af, 0x8840, 0x2805, 0x9005,
++      0x1158, 0x6004, 0x9065, 0x0904, 0x19af, 0x6064, 0x90cc, 0x000f,
++      0x99c0, 0x18fe, 0x2805, 0x2040, 0x2b68, 0x6880, 0xc0fc, 0x6882,
++      0x0458, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, 0x00d6, 0x2b68,
++      0x6c2e, 0x6b32, 0x00de, 0xd99c, 0x1168, 0x6908, 0x2400, 0x9122,
++      0x690c, 0x2300, 0x911b, 0x0a0c, 0x0d7e, 0x6800, 0x9420, 0x6804,
++      0x9319, 0x0060, 0x6910, 0x2400, 0x9122, 0x6914, 0x2300, 0x911b,
++      0x0a0c, 0x0d7e, 0x6800, 0x9420, 0x6804, 0x9319, 0x2b68, 0x6c1e,
++      0x6b22, 0x6880, 0xc0fd, 0x6882, 0x2c00, 0x685a, 0x2800, 0x6812,
++      0x2a00, 0x6816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, 0x008e,
++      0x009e, 0x00ae, 0x9085, 0x0001, 0x0005, 0x2008, 0x9026, 0x2410,
++      0x780f, 0x0000, 0x7810, 0x9420, 0x9291, 0x0000, 0x7814, 0x9210,
++      0x8109, 0x1dc0, 0x9284, 0x000f, 0x9405, 0x0005, 0x2001, 0x0005,
++      0x2004, 0x9084, 0x0007, 0x0002, 0x19de, 0x17b0, 0x19de, 0x19d4,
++      0x19d7, 0x19da, 0x19d7, 0x19da, 0x080c, 0x17b0, 0x0005, 0x080c,
++      0x0fd5, 0x0005, 0x080c, 0x17b0, 0x080c, 0x0fd5, 0x0005, 0x0126,
++      0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1100,
++      0x7817, 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410,
++      0x2009, 0x013b, 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f,
++      0x7837, 0x0020, 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600,
++      0x781c, 0xd0a4, 0x190c, 0x1b64, 0x7900, 0xd1dc, 0x1118, 0x9084,
++      0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x1a27, 0x1a1d, 0x6bd6,
++      0x1a1f, 0x1a21, 0x1a21, 0x1a21, 0x1a21, 0x6bba, 0x1a1d, 0x1a23,
++      0x1a1d, 0x1a21, 0x1a1d, 0x1a21, 0x1a1d, 0x080c, 0x0d7e, 0x080c,
++      0x0d7e, 0x0031, 0x0020, 0x080c, 0x6bba, 0x080c, 0x6bd6, 0x0005,
++      0x0006, 0x0016, 0x0026, 0x080c, 0xc46f, 0x7930, 0x9184, 0x0003,
++      0x01c0, 0x2001, 0x1313, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133,
++      0x2004, 0x9005, 0x090c, 0x0d7e, 0x00c6, 0x2001, 0x1313, 0x2064,
++      0x080c, 0xa5f3, 0x00ce, 0x0460, 0x2009, 0x0040, 0x080c, 0x1b67,
++      0x0438, 0x9184, 0x0014, 0x01b0, 0x6a00, 0x9286, 0x0003, 0x0180,
++      0x080c, 0x62e4, 0x1158, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001,
++      0x1100, 0x2003, 0x0001, 0x080c, 0x621a, 0x0010, 0x080c, 0x4faa,
++      0x0099, 0x0070, 0x9184, 0x1400, 0x0110, 0x0071, 0x0048, 0x9184,
++      0x0140, 0x0110, 0x0049, 0x0020, 0x9184, 0x8000, 0x0108, 0x0021,
++      0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056,
++      0x2071, 0x1347, 0x080c, 0x1577, 0x005e, 0x004e, 0x003e, 0x00ee,
++      0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1100, 0x7128, 0x2001,
++      0x129a, 0x2102, 0x2001, 0x12a2, 0x2102, 0x2001, 0x013b, 0x2102,
++      0x2079, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x2320,
++      0x9182, 0x0224, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0088,
++      0x9182, 0x02d4, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0048,
++      0x9182, 0x0444, 0x1220, 0x2011, 0x0002, 0x8423, 0x0010, 0x2011,
++      0x0001, 0x9482, 0x0110, 0x8002, 0x8020, 0x8301, 0x9402, 0x0110,
++      0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x2001, 0x0201, 0x789e,
++      0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0003, 0x2320,
++      0x9182, 0x0204, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0088,
++      0x9182, 0x02b4, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0048,
++      0x9182, 0x041c, 0x1220, 0x2011, 0x0002, 0x8423, 0x0010, 0x2011,
++      0x0001, 0x9482, 0x010c, 0x8002, 0x8020, 0x8301, 0x9402, 0x0110,
++      0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x78a3, 0x0200, 0x9198,
++      0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0005, 0x2320, 0x9182,
++      0x0204, 0x1230, 0x2011, 0x0008, 0x8423, 0x8423, 0x8423, 0x0488,
++      0x9182, 0x024c, 0x1240, 0x2011, 0x0007, 0x8403, 0x8003, 0x9400,
++      0x9400, 0x9420, 0x0430, 0x9182, 0x02bc, 0x1238, 0x2011, 0x0006,
++      0x8403, 0x8003, 0x9400, 0x9420, 0x00e0, 0x9182, 0x034c, 0x1230,
++      0x2011, 0x0005, 0x8403, 0x8003, 0x9420, 0x0098, 0x9182, 0x042c,
++      0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0058, 0x9182, 0x059c,
++      0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0018, 0x2011, 0x0002,
++      0x8423, 0x9482, 0x0228, 0x8002, 0x8020, 0x8301, 0x9402, 0x0110,
++      0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x789a, 0x012e, 0x0005,
++      0x0006, 0x00d6, 0x2069, 0x0200, 0x6814, 0x9084, 0xffc0, 0x910d,
++      0x6916, 0x00de, 0x000e, 0x0005, 0x00d6, 0x2069, 0x0200, 0x9005,
++      0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005,
++      0x0006, 0x00d6, 0x2069, 0x0200, 0x6810, 0x9084, 0xfff8, 0x910d,
++      0x6912, 0x00de, 0x000e, 0x0005, 0x7938, 0x080c, 0x0d7e, 0x00f6,
++      0x2079, 0x0200, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001,
++      0xa001, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001,
++      0x00fe, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, 0x2071,
++      0x1100, 0x2009, 0x0000, 0x080c, 0x2355, 0x080c, 0x2261, 0x6054,
++      0x8004, 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, 0x6150, 0x918c,
++      0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000,
++      0x6052, 0x2009, 0x12d7, 0x2011, 0x12d8, 0x6358, 0x939c, 0x38f0,
++      0x2320, 0x080c, 0x22a5, 0x1238, 0x939d, 0x4003, 0x94a5, 0x8603,
++      0x230a, 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, 0x8603, 0x230a,
++      0x2412, 0x9006, 0x080c, 0x2290, 0x9006, 0x080c, 0x2273, 0x20a9,
++      0x0012, 0x1d04, 0x1bb9, 0x2091, 0x6000, 0x1f04, 0x1bb9, 0x602f,
++      0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff,
++      0x6052, 0x6024, 0x6026, 0x080c, 0x1f7d, 0x2009, 0x00ef, 0x6132,
++      0x6136, 0x080c, 0x1f8d, 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008,
++      0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, 0x0000,
++      0x6007, 0x049f, 0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000,
++      0x1f04, 0x1be6, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012,
++      0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e,
++      0x600f, 0x006b, 0x602b, 0x402f, 0x012e, 0x0005, 0x00f6, 0x2079,
++      0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe,
++      0x0005, 0x2001, 0x1134, 0x2003, 0x0000, 0x2001, 0x1133, 0x2003,
++      0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026,
++      0x6124, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x002a, 0x9195,
++      0x0004, 0x9284, 0x0007, 0x0002, 0x1c46, 0x1c2c, 0x1c2f, 0x1c32,
++      0x1c37, 0x1c39, 0x1c3d, 0x1c41, 0x080c, 0x745c, 0x00b8, 0x080c,
++      0x752d, 0x00a0, 0x080c, 0x752d, 0x080c, 0x745c, 0x0078, 0x0099,
++      0x0068, 0x080c, 0x745c, 0x0079, 0x0048, 0x080c, 0x752d, 0x0059,
++      0x0028, 0x080c, 0x752d, 0x080c, 0x745c, 0x0029, 0x002e, 0x001e,
++      0x000e, 0x012e, 0x0005, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c,
++      0x1904, 0x1e92, 0xd1f4, 0x0110, 0x080c, 0x0d7e, 0x080c, 0x62e4,
++      0x05d0, 0x7000, 0x9086, 0x0003, 0x01f0, 0x6024, 0x9084, 0x1800,
++      0x01d0, 0x080c, 0x630a, 0x0118, 0x080c, 0x62f6, 0x11a0, 0x6027,
++      0x0020, 0x6043, 0x0000, 0x709c, 0x9005, 0x1140, 0x709f, 0x0001,
++      0x00d6, 0x2069, 0x0140, 0x080c, 0x633e, 0x00de, 0x2001, 0x12a7,
++      0x2003, 0xaaaa, 0x0458, 0x080c, 0x630a, 0x15d0, 0x6024, 0x9084,
++      0x1800, 0x1108, 0x04a8, 0x2001, 0x12a7, 0x2003, 0xaaaa, 0x2001,
++      0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001, 0x080c,
++      0x621a, 0x0804, 0x1e92, 0xd1ac, 0x1518, 0x6024, 0xd0dc, 0x1170,
++      0xd0e4, 0x1188, 0xd0d4, 0x11a0, 0xd0cc, 0x0130, 0x7090, 0x9086,
++      0x0028, 0x1110, 0x080c, 0x6492, 0x0804, 0x1e92, 0x2001, 0x12a8,
++      0x2003, 0x0000, 0x0048, 0x2001, 0x12a8, 0x2003, 0x0002, 0x0020,
++      0x080c, 0x6404, 0x0804, 0x1e92, 0x080c, 0x6531, 0x0804, 0x1e92,
++      0xd1ac, 0x0904, 0x1db5, 0x080c, 0x62e4, 0x11d8, 0x6027, 0x0020,
++      0x0006, 0x0026, 0x0036, 0x080c, 0x6300, 0x1170, 0x2001, 0x12a8,
++      0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001, 0x080c, 0x621a,
++      0x003e, 0x002e, 0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c,
++      0x62be, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138,
++      0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74d6,
++      0x948c, 0xff00, 0x7034, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160,
++      0x7040, 0xd084, 0x1148, 0xc085, 0x7042, 0x0036, 0x2418, 0x2011,
++      0x8016, 0x080c, 0x3f23, 0x003e, 0x9196, 0xff00, 0x05a8, 0x7058,
++      0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130,
++      0xd184, 0x1550, 0x080c, 0x2987, 0x0128, 0xc18d, 0x7132, 0x080c,
++      0x58c6, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294,
++      0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x1d83,
++      0x7034, 0xd08c, 0x1140, 0x2001, 0x110c, 0x200c, 0xd1ac, 0x1904,
++      0x1d83, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c,
++      0x3f23, 0x003e, 0x0804, 0x1d83, 0x7034, 0xd08c, 0x1140, 0x2001,
++      0x110c, 0x200c, 0xd1ac, 0x1904, 0x1d83, 0xc1ad, 0x2102, 0x0036,
++      0x73d4, 0x2011, 0x8013, 0x080c, 0x3f23, 0x003e, 0x7130, 0xc185,
++      0x7132, 0x2011, 0x1153, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009,
++      0x0001, 0x2011, 0x0100, 0x080c, 0x73af, 0x2019, 0x000e, 0x00c6,
++      0x2061, 0x0000, 0x080c, 0xc0b9, 0x00ce, 0x9484, 0x00ff, 0x9080,
++      0x298c, 0x200d, 0x918c, 0xff00, 0x810f, 0x8127, 0x9006, 0x2009,
++      0x000e, 0x080c, 0xc12f, 0x001e, 0xd1ac, 0x1140, 0x0016, 0x900e,
++      0x2019, 0x0004, 0x080c, 0x2831, 0x001e, 0x0068, 0x0156, 0x20a9,
++      0x007f, 0x900e, 0x080c, 0x5608, 0x1110, 0x080c, 0x5100, 0x8108,
++      0x1f04, 0x1d7a, 0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c,
++      0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec, 0x080c, 0x87a2, 0x0036,
++      0x901e, 0x080c, 0x8847, 0x003e, 0x60e3, 0x0000, 0x001e, 0x2001,
++      0x1100, 0x2014, 0x9296, 0x0004, 0x1170, 0xd19c, 0x11b0, 0x2011,
++      0x110c, 0x2214, 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206,
++      0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x1124, 0x2003,
++      0x0000, 0x080c, 0x483b, 0x6027, 0x0020, 0xd194, 0x0904, 0x1e92,
++      0x0016, 0x6220, 0xd2b4, 0x0904, 0x1e3e, 0x080c, 0x7271, 0x080c,
++      0x85a2, 0x6027, 0x0004, 0x00f6, 0x2019, 0x130d, 0x2304, 0x907d,
++      0x0904, 0x1e0f, 0x7804, 0x9086, 0x0032, 0x1904, 0x1e0f, 0x00d6,
++      0x00c6, 0x00e6, 0x2069, 0x0140, 0x7810, 0x685e, 0x7808, 0x685a,
++      0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000,
++      0x2001, 0x003c, 0x8001, 0x1df0, 0x2001, 0x1000, 0x080c, 0x2401,
++      0x9006, 0x080c, 0x2401, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9,
++      0x0009, 0x080c, 0x2321, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001,
++      0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x080c, 0x79ab,
++      0x080c, 0x7aa4, 0x7814, 0x2070, 0x7067, 0x0103, 0x2f60, 0x080c,
++      0x8ed9, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, 0x00fe,
++      0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0138, 0x2001,
++      0x1000, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x00de, 0x00c6,
++      0x2061, 0x1304, 0x6028, 0x909a, 0x00c8, 0x1238, 0x8000, 0x602a,
++      0x00ce, 0x080c, 0x857e, 0x0804, 0x1e91, 0x2061, 0x0100, 0x62c0,
++      0x080c, 0x8dc7, 0x2019, 0x130d, 0x2304, 0x9065, 0x0120, 0x2009,
++      0x0027, 0x080c, 0x8f53, 0x00ce, 0x0804, 0x1e91, 0xd2bc, 0x05f0,
++      0x080c, 0x727e, 0x6014, 0x9084, 0x1984, 0x9085, 0x0010, 0x6016,
++      0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000,
++      0x0138, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401,
++      0x00de, 0x00c6, 0x2061, 0x1304, 0x6044, 0x909a, 0x00c8, 0x1608,
++      0x8000, 0x6046, 0x603c, 0x00ce, 0x9005, 0x0558, 0x2009, 0x07d0,
++      0x080c, 0x7276, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138,
++      0x6114, 0x918c, 0x1984, 0x918d, 0x0012, 0x6116, 0x00d0, 0x6114,
++      0x918c, 0x1984, 0x918d, 0x0016, 0x6116, 0x0098, 0x6027, 0x0004,
++      0x0080, 0x0036, 0x2019, 0x0001, 0x080c, 0x8847, 0x003e, 0x2019,
++      0x1313, 0x2304, 0x9065, 0x0120, 0x2009, 0x004f, 0x080c, 0x8f53,
++      0x00ce, 0x001e, 0xd19c, 0x0904, 0x1f0d, 0x7034, 0xd0ac, 0x1904,
++      0x1edb, 0x0016, 0x0156, 0x6027, 0x0008, 0x080c, 0x2346, 0x6050,
++      0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, 0x080c,
++      0x2340, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, 0x1eae,
++      0x2091, 0x6000, 0x1f04, 0x1eae, 0x6050, 0x9085, 0x0400, 0x9084,
++      0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x1ebc, 0x6150,
++      0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x1ec5, 0x2091,
++      0x6000, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027,
++      0x0008, 0x04d8, 0x080c, 0x2304, 0x1f04, 0x1ec5, 0x015e, 0x6152,
++      0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x2011,
++      0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec, 0x080c,
++      0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x60e3, 0x0000,
++      0x080c, 0xc44e, 0x080c, 0xc469, 0x2001, 0x1172, 0x2004, 0xd0fc,
++      0x1120, 0x9085, 0x0001, 0x080c, 0x6331, 0x9006, 0x080c, 0x2401,
++      0x2009, 0x0002, 0x080c, 0x2355, 0x2001, 0x1100, 0x2003, 0x0004,
++      0x6027, 0x0008, 0x080c, 0x0b68, 0x001e, 0x918c, 0xffd0, 0x6126,
++      0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126,
++      0x2091, 0x8000, 0x2071, 0x1100, 0x71cc, 0x70ce, 0x9116, 0x05d8,
++      0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x2355, 0x2011, 0x8011,
++      0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001,
++      0x0010, 0x2019, 0x0000, 0x080c, 0x3f23, 0x0428, 0x2001, 0x12e0,
++      0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118,
++      0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x3f23,
++      0x2001, 0x1172, 0x2004, 0xd0fc, 0x1170, 0x00c6, 0x080c, 0x1fd8,
++      0x080c, 0x877f, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002,
++      0x080c, 0x2831, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e,
++      0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094,
++      0xff00, 0x1110, 0x81ff, 0x0118, 0x080c, 0x6e62, 0x0038, 0x9080,
++      0x298c, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080,
++      0x298c, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140,
++      0x2001, 0x1116, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852,
++      0x6856, 0x1f04, 0x1f88, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026,
++      0x2069, 0x0140, 0x2001, 0x1116, 0x2102, 0x8114, 0x8214, 0x8214,
++      0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128,
++      0x9184, 0x000f, 0x9080, 0xc84f, 0x2005, 0x6856, 0x8211, 0x1f04,
++      0x1f9d, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x1100,
++      0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005,
++      0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980,
++      0x9116, 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001,
++      0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x1fcd,
++      0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005,
++      0x2001, 0x1153, 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006,
++      0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xc12f, 0x004e, 0x0005,
++      0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904,
++      0x2045, 0x080c, 0x22a5, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600,
++      0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120,
++      0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016,
++      0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009,
++      0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004,
++      0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040,
++      0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058,
++      0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x73f0, 0x928c, 0xff00,
++      0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2,
++      0x2009, 0x0138, 0x220a, 0x080c, 0x62e4, 0x1118, 0x2009, 0x1298,
++      0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8,
++      0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170,
++      0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d7e,
++      0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, 0x0171, 0x2004,
++      0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e,
++      0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e,
++      0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108,
++      0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108,
++      0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000,
++      0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x12ca,
++      0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d7e, 0x0033, 0x00ee, 0x002e,
++      0x001e, 0x000e, 0x015e, 0x0005, 0x20a3, 0x20c1, 0x20e5, 0x20e7,
++      0x2110, 0x2112, 0x2114, 0x2001, 0x0001, 0x080c, 0x1f11, 0x080c,
++      0x22fd, 0x2001, 0x12cc, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7,
++      0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x22b9, 0x2001, 0x12ca,
++      0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2115, 0x080c, 0x7283,
++      0x0005, 0x2009, 0x12cf, 0x200b, 0x0000, 0x2001, 0x12d4, 0x2003,
++      0x0036, 0x2001, 0x12d3, 0x2003, 0x002a, 0x2001, 0x12cc, 0x2003,
++      0x0001, 0x9006, 0x080c, 0x2273, 0x2001, 0xffff, 0x20a9, 0x0009,
++      0x080c, 0x22b9, 0x2001, 0x12ca, 0x2003, 0x0006, 0x2009, 0x001e,
++      0x2011, 0x2115, 0x080c, 0x7283, 0x0005, 0x080c, 0x0d7e, 0x2001,
++      0x12d4, 0x2003, 0x0036, 0x2001, 0x12cc, 0x2003, 0x0003, 0x7a38,
++      0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001,
++      0x0001, 0x080c, 0x2273, 0x2001, 0x12d0, 0x2003, 0x0000, 0x2001,
++      0xffff, 0x20a9, 0x0009, 0x080c, 0x22b9, 0x2001, 0x12ca, 0x2003,
++      0x0006, 0x2009, 0x001e, 0x2011, 0x2115, 0x080c, 0x7283, 0x0005,
++      0x080c, 0x0d7e, 0x080c, 0x0d7e, 0x0005, 0x0006, 0x0016, 0x0026,
++      0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100,
++      0x2001, 0x12cc, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d7e, 0x0043,
++      0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005,
++      0x2137, 0x2157, 0x2197, 0x21c7, 0x21eb, 0x21fb, 0x21fd, 0x080c,
++      0x22ad, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x12d2,
++      0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d,
++      0x0008, 0xc085, 0x200a, 0x2001, 0x12ca, 0x2003, 0x0001, 0x0030,
++      0x080c, 0x2221, 0x2001, 0xffff, 0x080c, 0x20b2, 0x0005, 0x080c,
++      0x21ff, 0x05e0, 0x2009, 0x12d3, 0x2104, 0x8001, 0x200a, 0x080c,
++      0x22ad, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294,
++      0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x12d2, 0x2104, 0xc085,
++      0x200a, 0x2009, 0x12cf, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005,
++      0x0118, 0x080c, 0x2207, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294,
++      0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
++      0x080c, 0x2290, 0x2001, 0x12cc, 0x2003, 0x0002, 0x0028, 0x2001,
++      0x12ca, 0x2003, 0x0003, 0x0010, 0x080c, 0x20d4, 0x0005, 0x080c,
++      0x21ff, 0x0560, 0x2009, 0x12d3, 0x2104, 0x8001, 0x200a, 0x080c,
++      0x22ad, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x12ca,
++      0x2003, 0x0003, 0x2001, 0x12cb, 0x2003, 0x0000, 0x00b8, 0x2009,
++      0x12d3, 0x2104, 0x9005, 0x1118, 0x080c, 0x2245, 0x0010, 0x080c,
++      0x2214, 0x080c, 0x2207, 0x2009, 0x12cf, 0x200b, 0x0000, 0x2001,
++      0x12cc, 0x2003, 0x0001, 0x080c, 0x20d4, 0x0000, 0x0005, 0x04b9,
++      0x0508, 0x080c, 0x22ad, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852,
++      0x2009, 0x12d0, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108,
++      0x0078, 0x2001, 0x12d5, 0x2003, 0x000a, 0x2009, 0x12d2, 0x2104,
++      0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x12cc, 0x2003, 0x0004,
++      0x080c, 0x20ff, 0x0005, 0x0099, 0x0168, 0x080c, 0x22ad, 0x1138,
++      0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x20eb, 0x0018, 0x0079,
++      0x080c, 0x20ff, 0x0005, 0x080c, 0x0d7e, 0x080c, 0x0d7e, 0x2009,
++      0x12d4, 0x2104, 0x8001, 0x200a, 0x090c, 0x2261, 0x0005, 0x7a38,
++      0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001,
++      0x0001, 0x080c, 0x2290, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296,
++      0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2273,
++      0x0005, 0x2009, 0x12cf, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005,
++      0x0108, 0x0070, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296,
++      0x0006, 0x0118, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001, 0x04d9,
++      0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010,
++      0x2001, 0x0001, 0x080c, 0x2290, 0x0005, 0x0086, 0x2001, 0x12d2,
++      0x2004, 0x9084, 0x7fff, 0x090c, 0x0d7e, 0x2009, 0x12d1, 0x2144,
++      0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120,
++      0x080c, 0x0d7e, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e,
++      0x0005, 0x0006, 0x0156, 0x2001, 0x12ca, 0x20a9, 0x0009, 0x2003,
++      0x0000, 0x8000, 0x1f04, 0x2267, 0x2001, 0x12d1, 0x2003, 0x8000,
++      0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000,
++      0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009,
++      0x12d7, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085,
++      0x0006, 0x783a, 0x2009, 0x12d8, 0x210c, 0x795a, 0x00fe, 0x0005,
++      0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0138, 0x7838, 0x9084,
++      0xfffa, 0x9085, 0x0004, 0x783a, 0x0030, 0x7838, 0x9084, 0xfffb,
++      0x9085, 0x0005, 0x783a, 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100,
++      0x2004, 0x9082, 0x0007, 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064,
++      0x7820, 0x080c, 0x2340, 0xd09c, 0x1110, 0x1f04, 0x22b0, 0x015e,
++      0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x080c, 0x2346,
++      0x7850, 0x9085, 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852,
++      0x080c, 0x2340, 0x9085, 0x2000, 0x7852, 0x000e, 0x2008, 0x9186,
++      0x0000, 0x1118, 0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118,
++      0x783b, 0x0006, 0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005,
++      0x0030, 0x9186, 0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006,
++      0x1d04, 0x22e8, 0x080c, 0x72a5, 0x1f04, 0x22e8, 0x7850, 0x9085,
++      0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c, 0x2340, 0x9085, 0x1000,
++      0x7852, 0x000e, 0x001e, 0x012e, 0x0005, 0x080c, 0x2346, 0x7850,
++      0x9084, 0xffcf, 0x7852, 0x0005, 0x0006, 0x0156, 0x00f6, 0x2079,
++      0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1130, 0x7820, 0xd0e4,
++      0x1140, 0x1f04, 0x230e, 0x0028, 0x7854, 0xd08c, 0x1110, 0x1f04,
++      0x2314, 0x00fe, 0x015e, 0x000e, 0x0005, 0x7820, 0x0409, 0xd09c,
++      0x0005, 0x1d04, 0x2321, 0x080c, 0x72a5, 0x1f04, 0x2321, 0x0005,
++      0x0006, 0x2001, 0x12d6, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005,
++      0x0006, 0x2001, 0x12d6, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005,
++      0x0006, 0x2001, 0x12d6, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005,
++      0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x0016,
++      0x2009, 0x0140, 0x2104, 0x080c, 0x6300, 0x1110, 0xc0bd, 0x0008,
++      0xc0bc, 0x200a, 0x001e, 0x000e, 0x0005, 0x0006, 0x2001, 0x12e0,
++      0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140,
++      0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a,
++      0x0005, 0x0036, 0x0046, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00,
++      0x9186, 0x2000, 0x0118, 0x9186, 0x0100, 0x1560, 0x2009, 0x017f,
++      0x200b, 0x00a2, 0x2009, 0x0169, 0x2019, 0x0160, 0x2324, 0x2011,
++      0x0003, 0x2104, 0x9084, 0x0007, 0x9086, 0x0003, 0x11b8, 0x2304,
++      0x9402, 0x02a0, 0x1d98, 0x8211, 0x1da0, 0x84ff, 0x0170, 0x2001,
++      0x0141, 0x200c, 0x918c, 0xff00, 0x9186, 0x0100, 0x0130, 0x2009,
++      0x110c, 0x2104, 0xc0dd, 0x200a, 0x0008, 0x0419, 0x2001, 0x017f,
++      0x2003, 0x0000, 0x004e, 0x003e, 0x0005, 0x2001, 0x110c, 0x2004,
++      0xd0dc, 0x01b0, 0x2001, 0x0160, 0x2004, 0x9005, 0x0140, 0x2001,
++      0x0141, 0x2004, 0x9084, 0xff00, 0x9086, 0x0100, 0x1148, 0x0126,
++      0x2091, 0x8000, 0x0016, 0x0026, 0x0021, 0x002e, 0x001e, 0x012e,
++      0x0005, 0x00c6, 0x2061, 0x0100, 0x6014, 0x0006, 0x2001, 0x0161,
++      0x2003, 0x0000, 0x6017, 0x0018, 0xa001, 0xa001, 0x602f, 0x0008,
++      0x6104, 0x918e, 0x0010, 0x6106, 0x918e, 0x0010, 0x6106, 0x6017,
++      0x0040, 0x2001, 0x1000, 0x0429, 0x9006, 0x0419, 0x001e, 0x9184,
++      0x0003, 0x01c0, 0x0036, 0x2019, 0x0141, 0x2304, 0x9084, 0xff00,
++      0x9086, 0x0800, 0x1dd0, 0x919c, 0xffe4, 0x9184, 0x0001, 0x0118,
++      0x9385, 0x0009, 0x6016, 0x9184, 0x0002, 0x0118, 0x9385, 0x0012,
++      0x6016, 0x003e, 0x2001, 0x110c, 0x200c, 0xc1dc, 0x2102, 0x00ce,
++      0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001,
++      0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x2678, 0x2678, 0x249d,
++      0x249d, 0x24a9, 0x24a9, 0x24b5, 0x24b5, 0x24c3, 0x24c3, 0x24cf,
++      0x24cf, 0x24dd, 0x24dd, 0x24eb, 0x24eb, 0x24fd, 0x24fd, 0x2509,
++      0x2509, 0x2517, 0x2517, 0x2535, 0x2535, 0x2555, 0x2555, 0x2525,
++      0x2525, 0x2545, 0x2545, 0x2563, 0x2563, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x2575, 0x2575, 0x2581,
++      0x2581, 0x258f, 0x258f, 0x259d, 0x259d, 0x25ad, 0x25ad, 0x25bb,
++      0x25bb, 0x25cb, 0x25cb, 0x25db, 0x25db, 0x25ed, 0x25ed, 0x25fb,
++      0x25fb, 0x260b, 0x260b, 0x262d, 0x262d, 0x264f, 0x264f, 0x261b,
++      0x261b, 0x263e, 0x263e, 0x265e, 0x265e, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb,
++      0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1c12, 0x0804,
++      0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++      0x0156, 0x080c, 0x19c6, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c,
++      0x1c12, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106,
++      0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++      0x1c12, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c,
++      0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c, 0x1c12, 0x080c,
++      0x19fe, 0x0804, 0x2670, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1125, 0x0804,
++      0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++      0x0156, 0x080c, 0x1c12, 0x080c, 0x1125, 0x0804, 0x2670, 0x0106,
++      0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++      0x19c6, 0x080c, 0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1c12, 0x080c,
++      0x1125, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c,
++      0x1c12, 0x080c, 0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c,
++      0x1125, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1125, 0x080c,
++      0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x19c6, 0x080c, 0x1c12, 0x080c,
++      0x1125, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x0804,
++      0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
++      0x0156, 0x080c, 0x2048, 0x080c, 0x1c12, 0x0804, 0x2670, 0x0106,
++      0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++      0x2048, 0x080c, 0x19c6, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c,
++      0x19c6, 0x080c, 0x1c12, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c,
++      0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x1c12, 0x080c,
++      0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x19c6, 0x080c,
++      0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x19c6, 0x080c,
++      0x1c12, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c,
++      0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x1c12, 0x080c,
++      0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x19c6, 0x080c,
++      0x1125, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
++      0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c, 0x1c12, 0x080c,
++      0x1125, 0x080c, 0x19fe, 0x0804, 0x2670, 0x0106, 0x0006, 0x0126,
++      0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048, 0x080c,
++      0x19c6, 0x080c, 0x1c12, 0x080c, 0x1125, 0x0490, 0x0106, 0x0006,
++      0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048,
++      0x080c, 0x19c6, 0x080c, 0x1125, 0x080c, 0x19fe, 0x0408, 0x0106,
++      0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
++      0x2048, 0x080c, 0x1125, 0x080c, 0x19fe, 0x0090, 0x0106, 0x0006,
++      0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2048,
++      0x080c, 0x19c6, 0x080c, 0x1c12, 0x080c, 0x1125, 0x080c, 0x19fe,
++      0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e,
++      0x000d, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x588e, 0x1904,
++      0x275a, 0x72d8, 0x2001, 0x12a7, 0x2004, 0x9005, 0x1110, 0xd29c,
++      0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x275a, 0x080c, 0x275e,
++      0x0804, 0x275a, 0xd2cc, 0x1904, 0x275a, 0x080c, 0x62e4, 0x1120,
++      0x70a7, 0xffff, 0x0804, 0x275a, 0xd294, 0x0120, 0x70a7, 0xffff,
++      0x0804, 0x275a, 0x080c, 0x2982, 0x0120, 0x70a7, 0xffff, 0x0804,
++      0x275a, 0x2001, 0x1116, 0x203c, 0x728c, 0xd284, 0x0904, 0x26fd,
++      0xd28c, 0x1904, 0x26fd, 0x0036, 0x73a4, 0x938e, 0xffff, 0x1110,
++      0x2019, 0x0001, 0x8314, 0x92e0, 0x1580, 0x2c04, 0x938c, 0x0001,
++      0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e,
++      0x0558, 0x908e, 0x0000, 0x0540, 0x908e, 0x00ff, 0x1150, 0x7230,
++      0xd284, 0x1530, 0x728c, 0xc28d, 0x728e, 0x70a7, 0xffff, 0x003e,
++      0x0420, 0x900e, 0x080c, 0x1f63, 0x080c, 0x55b3, 0x11b8, 0x6004,
++      0x9084, 0x00ff, 0x9086, 0x0006, 0x1150, 0x7030, 0xd08c, 0x0118,
++      0x6000, 0xd0bc, 0x0120, 0x080c, 0x2771, 0x0140, 0x0028, 0x080c,
++      0x28a1, 0x080c, 0x279e, 0x0110, 0x8318, 0x0820, 0x73a6, 0x0010,
++      0x70a7, 0xffff, 0x003e, 0x0804, 0x275a, 0x9780, 0x298c, 0x203d,
++      0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70a4, 0x9096, 0xffff,
++      0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802,
++      0x20a8, 0x0020, 0x70a7, 0xffff, 0x0804, 0x275a, 0x2700, 0x0156,
++      0x0016, 0x9106, 0x05a0, 0xc484, 0x080c, 0x5608, 0x0120, 0x080c,
++      0x55b3, 0x15a8, 0x0008, 0xc485, 0x6004, 0x9084, 0x00ff, 0x9086,
++      0x0006, 0x1130, 0x7030, 0xd08c, 0x01e8, 0x6000, 0xd0bc, 0x11d0,
++      0x728c, 0xd28c, 0x0188, 0x6004, 0x9084, 0x00ff, 0x9082, 0x0006,
++      0x02b0, 0xd484, 0x1118, 0x080c, 0x55d0, 0x0028, 0x080c, 0x292a,
++      0x0170, 0x080c, 0x2955, 0x0058, 0x080c, 0x28a1, 0x080c, 0x279e,
++      0x0170, 0x0028, 0x080c, 0x292a, 0x0110, 0x0419, 0x0140, 0x001e,
++      0x8108, 0x015e, 0x1f04, 0x2716, 0x70a7, 0xffff, 0x0018, 0x001e,
++      0x015e, 0x71a6, 0x004e, 0x002e, 0x00ce, 0x0005, 0x00c6, 0x0016,
++      0x70a7, 0x0001, 0x2009, 0x007e, 0x080c, 0x55b3, 0x1138, 0x080c,
++      0x28a1, 0x04a1, 0x0118, 0x70d8, 0xc0bd, 0x70da, 0x001e, 0x00ce,
++      0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001, 0x1157,
++      0x2004, 0x9084, 0x00ff, 0x6842, 0x080c, 0x8f26, 0x01d0, 0x2d00,
++      0x6012, 0x080c, 0xad70, 0x6023, 0x0001, 0x9006, 0x080c, 0x5556,
++      0x2001, 0x0000, 0x080c, 0x5568, 0x0126, 0x2091, 0x8000, 0x70a0,
++      0x8000, 0x70a2, 0x012e, 0x2009, 0x0004, 0x080c, 0x8f53, 0x9085,
++      0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076,
++      0x00d6, 0x00c6, 0x2c68, 0x2001, 0x1157, 0x2004, 0x9084, 0x00ff,
++      0x6842, 0x080c, 0x8f26, 0x0548, 0x2d00, 0x6012, 0x6800, 0xc0c4,
++      0x6802, 0x68a0, 0x9086, 0x007e, 0x0140, 0x6804, 0x9084, 0x00ff,
++      0x9086, 0x0006, 0x1110, 0x080c, 0x2862, 0x080c, 0xad70, 0x6023,
++      0x0001, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002, 0x080c, 0x5568,
++      0x0126, 0x2091, 0x8000, 0x70a0, 0x8000, 0x70a2, 0x012e, 0x2009,
++      0x0002, 0x080c, 0x8f53, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e,
++      0x001e, 0x0005, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x55b3,
++      0x1120, 0x0031, 0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, 0x0005,
++      0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, 0x8e83, 0x01e0,
++      0x2d00, 0x6012, 0x080c, 0xad70, 0x6023, 0x0001, 0x9006, 0x080c,
++      0x5556, 0x2001, 0x0002, 0x080c, 0x5568, 0x0126, 0x2091, 0x8000,
++      0x080c, 0x2862, 0x70e0, 0x8000, 0x70e2, 0x012e, 0x2009, 0x0002,
++      0x080c, 0x8f53, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e,
++      0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f,
++      0x080c, 0x55b3, 0x1190, 0x2c68, 0x080c, 0x8e83, 0x0170, 0x2d00,
++      0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xad70, 0x2009,
++      0x0022, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce,
++      0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x21f0, 0x080c,
++      0x76fb, 0x080c, 0x768d, 0x080c, 0x9ce7, 0x3e08, 0x2130, 0x81ff,
++      0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e,
++      0x0016, 0x080c, 0x5608, 0x1140, 0x9686, 0x0002, 0x1118, 0x6000,
++      0xd0bc, 0x1110, 0x080c, 0x5100, 0x001e, 0x8108, 0x1f04, 0x2848,
++      0x86ff, 0x1110, 0x080c, 0x0a79, 0x002e, 0x003e, 0x006e, 0x00ce,
++      0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210,
++      0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x76f0, 0x0076,
++      0x2039, 0x0000, 0x080c, 0x75ee, 0x2c08, 0x080c, 0xbec2, 0x007e,
++      0x001e, 0x2e60, 0x6210, 0x6314, 0x080c, 0x5100, 0x6212, 0x6316,
++      0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006,
++      0x6010, 0x9080, 0x0028, 0x2004, 0x9086, 0x0080, 0x0150, 0x2071,
++      0x1100, 0x70a0, 0x9005, 0x0110, 0x8001, 0x70a2, 0x000e, 0x00ee,
++      0x0005, 0x2071, 0x1100, 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2,
++      0x0ca8, 0x6000, 0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, 0x00c6,
++      0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9,
++      0x0001, 0x0090, 0x2001, 0x1153, 0x2004, 0xd0c4, 0x0150, 0xd0a4,
++      0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xc12f,
++      0x004e, 0x20a9, 0x00ff, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904,
++      0x2909, 0x928e, 0x007f, 0x05e8, 0x928e, 0x0080, 0x05d0, 0x9288,
++      0x1000, 0x210c, 0x81ff, 0x05a8, 0x8fff, 0x1148, 0x2001, 0x12c8,
++      0x0006, 0x2003, 0x0001, 0x04c9, 0x000e, 0x2003, 0x0000, 0x00c6,
++      0x2160, 0x2001, 0x0001, 0x080c, 0x5898, 0x00ce, 0x2019, 0x0029,
++      0x080c, 0x76f0, 0x0076, 0x2039, 0x0000, 0x080c, 0x75ee, 0x00c6,
++      0x0026, 0x2160, 0x6204, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118,
++      0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0x6206,
++      0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xbec2, 0x001e, 0x007e,
++      0x2160, 0x002e, 0x8210, 0x1f04, 0x28c4, 0x015e, 0x001e, 0x002e,
++      0x003e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016,
++      0x2001, 0x1153, 0x2004, 0xd0c4, 0x0148, 0xd0a4, 0x0138, 0x9006,
++      0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xc12f, 0x001e, 0x002e,
++      0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x728c, 0x82ff,
++      0x01e8, 0x080c, 0x58c6, 0x11d0, 0x2100, 0x080c, 0x1f77, 0x81ff,
++      0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1580, 0x2c04, 0xd384,
++      0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x9116,
++      0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, 0x0001,
++      0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126,
++      0x2091, 0x8000, 0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019,
++      0x0029, 0x080c, 0x8ac9, 0x002e, 0x080c, 0xc3d4, 0x003e, 0x002e,
++      0x001e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6,
++      0x2061, 0x1389, 0x001e, 0x6112, 0x080c, 0x2862, 0x001e, 0x080c,
++      0x55d0, 0x012e, 0x00ce, 0x001e, 0x0005, 0x2001, 0x1136, 0x2004,
++      0xd0cc, 0x0005, 0x2001, 0x1174, 0x2004, 0xd0bc, 0x0005, 0x2011,
++      0x1153, 0x2214, 0xd2ec, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2,
++      0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4,
++      0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca,
++      0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9,
++      0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad,
++      0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3,
++      0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f,
++      0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079,
++      0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d,
++      0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863,
++      0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252,
++      0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047,
++      0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35,
++      0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b,
++      0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e,
++      0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004,
++      0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000,
++      0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00,
++      0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00,
++      0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500,
++      0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00,
++      0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000,
++      0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800,
++      0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200,
++      0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00,
++      0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000,
++      0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000,
++      0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
++      0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x1193, 0x7003, 0x0002,
++      0x9006, 0x7012, 0x7016, 0x7042, 0x7046, 0x703a, 0x703e, 0x7033,
++      0x11aa, 0x7037, 0x11aa, 0x7007, 0x0001, 0x2061, 0x11ea, 0x6003,
++      0x0002, 0x0005, 0x2071, 0x1193, 0x7004, 0x0002, 0x2aaa, 0x2aab,
++      0x2ab2, 0x2ac3, 0x0005, 0x1004, 0x2ab1, 0x0e04, 0x2ab1, 0x2b78,
++      0x0430, 0x0005, 0x2b78, 0x2061, 0x11ea, 0x6008, 0x908e, 0x0100,
++      0x0128, 0x9086, 0x0200, 0x0904, 0x2b92, 0x0005, 0x7014, 0x2068,
++      0x2a60, 0x7018, 0x0807, 0x7010, 0x2068, 0x6864, 0x9094, 0x00ff,
++      0x9296, 0x0029, 0x1120, 0x6a78, 0xd2fc, 0x0128, 0x0005, 0x9086,
++      0x0103, 0x0108, 0x0005, 0x2a60, 0x2b78, 0x7018, 0x0807, 0x2a60,
++      0x7880, 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, 0x908a,
++      0x003f, 0x1a04, 0x2b8f, 0x61cc, 0x0804, 0x2b26, 0x2b68, 0x2b9e,
++      0x2ba8, 0x2bac, 0x2bb6, 0x2bbc, 0x2bc0, 0x2bd0, 0x2bd3, 0x2bdd,
++      0x2be2, 0x2be7, 0x2bf2, 0x2bfd, 0x2c0c, 0x2c1b, 0x2c29, 0x2c40,
++      0x2c5b, 0x2cf4, 0x2cf9, 0x2d37, 0x2de5, 0x2df6, 0x2e15, 0x2b8f,
++      0x2b8f, 0x2b8f, 0x2e4d, 0x2e6b, 0x2e74, 0x2ea3, 0x2ea9, 0x2b8f,
++      0x2ed2, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2edd, 0x2ee6,
++      0x2eee, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f,
++      0x2ef0, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2f0d, 0x2f64,
++      0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x0002, 0x2f8e,
++      0x2fe1, 0x303b, 0x3053, 0x3083, 0x3301, 0x2b8f, 0x44b5, 0x2b8f,
++      0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2b8f, 0x2bdd,
++      0x2be2, 0x376a, 0x2b8f, 0x3781, 0x454f, 0x45a5, 0x464b, 0x2b8f,
++      0x46b0, 0x46e0, 0x4705, 0x4813, 0x4736, 0x478d, 0x2b8f, 0x3785,
++      0x394a, 0x3960, 0x3980, 0x39e5, 0x3a4e, 0x3a59, 0x3ac1, 0x3ad0,
++      0x3adf, 0x3ae2, 0x3b05, 0x3b77, 0x3bf0, 0x3bfd, 0x3cfe, 0x3e22,
++      0x3e4b, 0x4032, 0x4054, 0x4060, 0x40d5, 0x419b, 0x2b8f, 0x2b8f,
++      0x2b8f, 0x2b8f, 0x4203, 0x421e, 0x43b9, 0x4473, 0x7144, 0x0000,
++      0x2021, 0x4000, 0x080c, 0x3eff, 0x0126, 0x2091, 0x8000, 0x0e04,
++      0x2b72, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118,
++      0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a,
++      0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++      0x0fcd, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, 0x0005, 0x2021,
++      0x4001, 0x08c0, 0x2021, 0x4002, 0x08a8, 0x2021, 0x4003, 0x0890,
++      0x2021, 0x4005, 0x0878, 0x2021, 0x4006, 0x0860, 0x2039, 0x0001,
++      0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x3f0c,
++      0x7883, 0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, 0x2520,
++      0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x3f0f, 0x7984, 0x7888,
++      0x2114, 0x200a, 0x0804, 0x2b68, 0x7984, 0x2114, 0x0804, 0x2b68,
++      0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021,
++      0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x2b68,
++      0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0001, 0x2019,
++      0x0014, 0x789b, 0x0017, 0x0804, 0x2b68, 0x2039, 0x0001, 0x7d98,
++      0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0,
++      0x9182, 0x0040, 0x0210, 0x0804, 0x2b9b, 0x2138, 0x7d98, 0x7c9c,
++      0x0804, 0x2ba2, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x2b9b,
++      0x2138, 0x7d98, 0x7c9c, 0x0804, 0x2bb0, 0x79a0, 0x9182, 0x0040,
++      0x0210, 0x0804, 0x2b9b, 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001,
++      0x21a0, 0x4004, 0x0804, 0x2b68, 0x2061, 0x0800, 0xe10c, 0x9006,
++      0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904,
++      0x2b68, 0x0804, 0x2b95, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804,
++      0x2b9b, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, 0x0804,
++      0x2b68, 0x2069, 0x1152, 0x7884, 0x7990, 0x911a, 0x1a04, 0x2b9b,
++      0x8019, 0x0904, 0x2b9b, 0x684a, 0x6942, 0x788c, 0x6852, 0x7888,
++      0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x65bd, 0x0804, 0x2b68,
++      0x2069, 0x1152, 0x7884, 0x7994, 0x911a, 0x1a04, 0x2b9b, 0x8019,
++      0x0904, 0x2b9b, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, 0x6866,
++      0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, 0x5946,
++      0x012e, 0x0804, 0x2b68, 0x902e, 0x2520, 0x81ff, 0x1904, 0x2b98,
++      0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1,
++      0x119a, 0x4101, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x2009, 0x0020,
++      0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b, 0x2c77, 0x0005, 0x6864,
++      0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0150, 0x9096, 0x0019,
++      0x0138, 0x9096, 0x0015, 0x0120, 0x9096, 0x0029, 0x1904, 0x2b98,
++      0x810f, 0x918c, 0x00ff, 0x0904, 0x2b98, 0x710e, 0x700c, 0x8001,
++      0x0538, 0x700e, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x2009, 0x0020,
++      0x2061, 0x11ea, 0x6228, 0x632c, 0x6430, 0x6534, 0x9290, 0x0040,
++      0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0x2039, 0x0001,
++      0x080c, 0x3f0c, 0x701b, 0x2cad, 0x0005, 0x6864, 0x9084, 0x00ff,
++      0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, 0x2b98, 0x08b0,
++      0x7010, 0x2068, 0x6868, 0xc0fd, 0x686a, 0x6864, 0x9084, 0x00ff,
++      0x9096, 0x0029, 0x1160, 0xc2fd, 0x6a7a, 0x080c, 0x51e5, 0x0150,
++      0x0126, 0x2091, 0x8000, 0x687a, 0x6982, 0x012e, 0x0050, 0x080c,
++      0x54d0, 0x1128, 0x7007, 0x0003, 0x701b, 0x2cd9, 0x0005, 0x080c,
++      0x5d95, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001,
++      0x2099, 0x119a, 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1,
++      0x0000, 0x95a9, 0x0000, 0x9d80, 0x0019, 0x2009, 0x0020, 0x012e,
++      0x2039, 0x0001, 0x0804, 0x3f0f, 0x61b4, 0x7884, 0x60b6, 0x0804,
++      0x2b68, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883,
++      0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009,
++      0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200,
++      0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd,
++      0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089,
++      0x2004, 0xd084, 0x0180, 0x2001, 0x1336, 0x2004, 0x9005, 0x0128,
++      0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003,
++      0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff,
++      0x1904, 0x2b98, 0x7984, 0x810f, 0x918c, 0x00ff, 0x080c, 0x5608,
++      0x1904, 0x2b9b, 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0210,
++      0x0804, 0x2b9b, 0x7c88, 0x7d8c, 0x080c, 0x5758, 0x080c, 0x5728,
++      0x0000, 0x1518, 0x2061, 0x15c0, 0x0126, 0x2091, 0x8000, 0x6000,
++      0x9086, 0x0000, 0x0148, 0x6014, 0x906d, 0x0130, 0x686c, 0x9406,
++      0x1118, 0x6870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001,
++      0x1118, 0x2004, 0x9c02, 0x1a04, 0x2b98, 0x0c30, 0x080c, 0xa5f3,
++      0x012e, 0x0904, 0x2b98, 0x0804, 0x2b68, 0x900e, 0x2001, 0x0005,
++      0x080c, 0x5d95, 0x0126, 0x2091, 0x8000, 0x080c, 0xac07, 0x080c,
++      0x5b76, 0x012e, 0x0804, 0x2b68, 0x00f6, 0x2d78, 0x7998, 0x810f,
++      0x918c, 0x00ff, 0x080c, 0x5608, 0x1904, 0x2dd2, 0x7ea4, 0x9684,
++      0x3fff, 0x9082, 0x4000, 0x0208, 0x04e8, 0x7c9c, 0x7da0, 0x080c,
++      0x5758, 0x080c, 0x5728, 0x1520, 0x2061, 0x15c0, 0x0126, 0x2091,
++      0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x906d, 0x0130,
++      0x686c, 0x9406, 0x1118, 0x6870, 0x9506, 0x0158, 0x012e, 0x9ce0,
++      0x0018, 0x2001, 0x1118, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0,
++      0x0c28, 0x080c, 0xa5f3, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0,
++      0x900e, 0x2001, 0x0005, 0x080c, 0x5d95, 0x0126, 0x2091, 0x8000,
++      0x080c, 0xac07, 0x080c, 0x5b76, 0x012e, 0x0070, 0x7897, 0x4005,
++      0x799a, 0x0010, 0x7897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
++      0x0030, 0x2f68, 0x00fe, 0x0005, 0x7897, 0x4000, 0x9006, 0x918d,
++      0x0001, 0x2008, 0x2f68, 0x00fe, 0x0005, 0x81ff, 0x1904, 0x2b98,
++      0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c, 0x56ca, 0x0904, 0x2b98,
++      0x080c, 0x575e, 0x0904, 0x2b98, 0x0804, 0x2b68, 0x81ff, 0x1904,
++      0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x080c, 0x57a6, 0x0904,
++      0x2b98, 0x2019, 0x0005, 0x7984, 0x080c, 0x5779, 0x0904, 0x2b98,
++      0x7888, 0x908a, 0x1000, 0x1a04, 0x2b9b, 0x8003, 0x800b, 0x810b,
++      0x9108, 0x080c, 0x7206, 0x0804, 0x2b68, 0x0126, 0x2091, 0x8000,
++      0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x00ff, 0x6454,
++      0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x5608, 0x11d8, 0x080c,
++      0x57a6, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0, 0x2019,
++      0x0004, 0x900e, 0x080c, 0x5779, 0x1118, 0x2009, 0x0006, 0x0078,
++      0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0x9108,
++      0x080c, 0x7206, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x2b68, 0x012e,
++      0x0804, 0x2b98, 0x012e, 0x0804, 0x2b9b, 0x080c, 0x3ece, 0x0904,
++      0x2b9b, 0x080c, 0x56ca, 0x0904, 0x2b98, 0x62a0, 0x2019, 0x0005,
++      0x00c6, 0x2061, 0x0000, 0x080c, 0x76f0, 0x0076, 0x2039, 0x0000,
++      0x080c, 0x75ee, 0x900e, 0x080c, 0xbec2, 0x007e, 0x00ce, 0x080c,
++      0x5758, 0x0804, 0x2b68, 0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c,
++      0x5758, 0x2208, 0x0804, 0x2b68, 0x0156, 0x00d6, 0x00e6, 0x2069,
++      0x1240, 0x6810, 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016,
++      0x901e, 0x20a9, 0x007e, 0x2069, 0x1000, 0x2d04, 0x9075, 0x0118,
++      0x704c, 0x0059, 0x9210, 0x8d68, 0x1f04, 0x2e85, 0x2300, 0x9218,
++      0x00ee, 0x00de, 0x015e, 0x0804, 0x2b68, 0x00f6, 0x0016, 0x907d,
++      0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0,
++      0x001e, 0x00fe, 0x0005, 0x2069, 0x1240, 0x6910, 0x62b8, 0x0804,
++      0x2b68, 0x81ff, 0x1904, 0x2b98, 0x6154, 0x9190, 0x298c, 0x2215,
++      0x9294, 0x00ff, 0x6374, 0x83ff, 0x0108, 0x6278, 0x67d8, 0xd79c,
++      0x0118, 0x2031, 0x0001, 0x0090, 0xd7ac, 0x0118, 0x2031, 0x0003,
++      0x0068, 0xd7a4, 0x0118, 0x2031, 0x0002, 0x0040, 0x080c, 0x62e4,
++      0x1118, 0x2031, 0x0004, 0x0010, 0x2031, 0x0000, 0x7e9a, 0x7f9e,
++      0x0804, 0x2b68, 0x6144, 0x6248, 0x2019, 0x12c0, 0x231c, 0x2001,
++      0x12c1, 0x2004, 0x789a, 0x0804, 0x2b68, 0x0126, 0x2091, 0x8000,
++      0x6134, 0x6238, 0x633c, 0x012e, 0x0804, 0x2b68, 0x080c, 0x3ef0,
++      0x0904, 0x2b9b, 0x6244, 0x6338, 0x0804, 0x2b68, 0x080c, 0x0d7e,
++      0x6144, 0x6248, 0x7884, 0x6046, 0x7b88, 0x634a, 0x2069, 0x1152,
++      0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x12c0, 0x2d1c, 0x206a,
++      0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x12c1,
++      0x2d04, 0x266a, 0x789a, 0x0804, 0x2b68, 0x0126, 0x2091, 0x8000,
++      0x7884, 0x6036, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x12d7,
++      0x200a, 0x78ac, 0x2011, 0x12d8, 0x2012, 0x2069, 0x0100, 0x6838,
++      0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a,
++      0x00de, 0x7884, 0xd0b4, 0x0120, 0x3b00, 0x9084, 0xff3f, 0x20d8,
++      0x7888, 0x603a, 0x2011, 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118,
++      0x918d, 0x0080, 0x0010, 0x918c, 0xff7f, 0x2112, 0x788c, 0x603e,
++      0x012e, 0x0804, 0x2b68, 0x00f6, 0x2079, 0x1100, 0x7a34, 0x6898,
++      0x9084, 0xfeff, 0x9215, 0x689c, 0x9084, 0xfeff, 0x8002, 0x9214,
++      0xd2b4, 0x0120, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x7834, 0xd0c4,
++      0x0108, 0xc2c5, 0x7a36, 0x6897, 0x4000, 0x900e, 0x9085, 0x0001,
++      0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8, 0x7888,
++      0x9025, 0x0904, 0x2b9b, 0x788c, 0x902d, 0x0904, 0x2b9b, 0x900e,
++      0x080c, 0x5608, 0x1120, 0x6244, 0x6338, 0x6446, 0x653a, 0x9186,
++      0x00ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x3ef0, 0x0904, 0x2b9b,
++      0x7888, 0x900d, 0x0904, 0x2b9b, 0x788c, 0x9005, 0x0904, 0x2b9b,
++      0x6244, 0x6146, 0x6338, 0x603a, 0x0804, 0x2b68, 0x2001, 0x1100,
++      0x2004, 0x9086, 0x0003, 0x1904, 0x2b98, 0x00c6, 0x2061, 0x0100,
++      0x7984, 0x810f, 0x918c, 0x00ff, 0x9196, 0x00ff, 0x1130, 0x2001,
++      0x1116, 0x2004, 0x9085, 0xff00, 0x0078, 0x9182, 0x007f, 0x1698,
++      0x9188, 0x298c, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1116, 0x2004,
++      0x9116, 0x0548, 0x810f, 0x9105, 0x0126, 0x2091, 0x8000, 0x0006,
++      0x080c, 0x8e83, 0x000e, 0x01d8, 0x6012, 0x600b, 0xbc09, 0x6023,
++      0x0001, 0x080c, 0x3eb9, 0x01d0, 0x9006, 0x6866, 0x7007, 0x0003,
++      0x6832, 0x6868, 0xc0fd, 0x686a, 0x701b, 0x3034, 0x2d00, 0x6016,
++      0x2009, 0x0032, 0x080c, 0x8f53, 0x012e, 0x00ce, 0x0005, 0x012e,
++      0x00ce, 0x0804, 0x2b98, 0x00ce, 0x0804, 0x2b9b, 0x080c, 0x8ed9,
++      0x0cb0, 0x2001, 0x1100, 0x2004, 0x9086, 0x0003, 0x1904, 0x2b98,
++      0x00c6, 0x2061, 0x0100, 0x7984, 0x810f, 0x918c, 0x00ff, 0x9196,
++      0x00ff, 0x1130, 0x2001, 0x1116, 0x2004, 0x9085, 0xff00, 0x0078,
++      0x9182, 0x007f, 0x1698, 0x9188, 0x298c, 0x210d, 0x918c, 0x00ff,
++      0x2001, 0x1116, 0x2004, 0x9116, 0x0548, 0x810f, 0x9105, 0x0126,
++      0x2091, 0x8000, 0x0006, 0x080c, 0x8e83, 0x000e, 0x01d8, 0x6012,
++      0x600b, 0xbc05, 0x6023, 0x0001, 0x080c, 0x3eb9, 0x01d0, 0x9006,
++      0x6866, 0x7007, 0x0003, 0x6832, 0x6868, 0xc0fd, 0x686a, 0x701b,
++      0x3034, 0x2d00, 0x6016, 0x2009, 0x0032, 0x080c, 0x8f53, 0x012e,
++      0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x2b98, 0x00ce, 0x0804,
++      0x2b9b, 0x080c, 0x8ed9, 0x0cb0, 0x6830, 0x9086, 0x0100, 0x0904,
++      0x2b98, 0x0804, 0x2b68, 0x2061, 0x1354, 0x0126, 0x2091, 0x8000,
++      0x6000, 0xd084, 0x0168, 0x6104, 0x6208, 0x2a60, 0x634c, 0x606c,
++      0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x2b68,
++      0x900e, 0x2110, 0x0c90, 0x81ff, 0x1904, 0x2b98, 0x080c, 0x62e4,
++      0x0904, 0x2b98, 0x0126, 0x2091, 0x8000, 0x624c, 0x606c, 0x9202,
++      0x0248, 0x9085, 0x0001, 0x080c, 0x1fad, 0x080c, 0x49f2, 0x012e,
++      0x0804, 0x2b68, 0x012e, 0x0804, 0x2b9b, 0x0006, 0x0016, 0x00c6,
++      0x00e6, 0x2001, 0x12e1, 0x2070, 0x2061, 0x1152, 0x6008, 0x2072,
++      0x900e, 0x2011, 0x1400, 0x080c, 0x73f0, 0x7206, 0x00ee, 0x00ce,
++      0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128,
++      0x012e, 0x2021, 0x400b, 0x0804, 0x2b6a, 0x7884, 0xd0fc, 0x0148,
++      0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x02a8, 0x012e, 0x0804,
++      0x2b9b, 0x2001, 0x002a, 0x2004, 0x2069, 0x1152, 0x6908, 0x9102,
++      0x1218, 0x012e, 0x0804, 0x2b9b, 0x614c, 0x606c, 0x9106, 0x0118,
++      0x012e, 0x0804, 0x2b98, 0x60d8, 0xd0ac, 0x0dd0, 0x7884, 0xd0fc,
++      0x0904, 0x30fd, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x0d88, 0x6867,
++      0x0000, 0x7884, 0x680a, 0x7898, 0x680e, 0x789c, 0x6812, 0x2001,
++      0x002e, 0x2004, 0x681a, 0x2001, 0x002f, 0x2004, 0x681e, 0x2001,
++      0x0030, 0x2004, 0x6822, 0x2001, 0x0031, 0x2004, 0x6826, 0x2001,
++      0x0034, 0x2004, 0x682a, 0x2001, 0x0035, 0x2004, 0x682e, 0x2001,
++      0x002a, 0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0x6816,
++      0x080c, 0x3262, 0x0928, 0x7010, 0x2068, 0x6d2c, 0x6c28, 0x6b1c,
++      0x6a18, 0x6930, 0x6808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021,
++      0x0000, 0x9d80, 0x001b, 0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b,
++      0x31c0, 0x701f, 0x0001, 0x012e, 0x0005, 0x0046, 0x0086, 0x0096,
++      0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x306d,
++      0x2001, 0x12d9, 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100,
++      0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012,
++      0x080c, 0x32d2, 0x080c, 0x3290, 0x00f6, 0x00e6, 0x00c6, 0x2d60,
++      0x2071, 0x134a, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884,
++      0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034,
++      0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x360c, 0x00ce,
++      0x00ee, 0x00fe, 0x080c, 0x3542, 0x080c, 0x3472, 0x05b8, 0x2001,
++      0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, 0x3634, 0x00f6,
++      0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071,
++      0x0200, 0x7037, 0x0000, 0x7050, 0x9084, 0xff00, 0x9086, 0x3200,
++      0x1510, 0x7037, 0x0001, 0x7050, 0x9084, 0xff00, 0x9086, 0xe100,
++      0x11d0, 0x7037, 0x0000, 0x7054, 0x7037, 0x0000, 0x715c, 0x9106,
++      0x1190, 0x2001, 0x111e, 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061,
++      0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x347c,
++      0x080c, 0x328b, 0x0058, 0x080c, 0x328b, 0x080c, 0x35a4, 0x080c,
++      0x3538, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a,
++      0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x6106,
++      0x2011, 0x020d, 0x2013, 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108,
++      0x60bf, 0x0012, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102,
++      0x080c, 0x10cf, 0x2009, 0x0028, 0x080c, 0x1b67, 0x2001, 0x0227,
++      0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae,
++      0x009e, 0x008e, 0x004e, 0x2001, 0x12d9, 0x2004, 0x9005, 0x1118,
++      0x012e, 0x0804, 0x2b68, 0x012e, 0x2021, 0x400c, 0x0804, 0x2b6a,
++      0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x00d6, 0x0156,
++      0x7010, 0x2068, 0x701c, 0x20a8, 0x8000, 0x701e, 0x6804, 0x9005,
++      0x05d0, 0x2068, 0x1f04, 0x31ce, 0x2061, 0x11ea, 0x6228, 0x632c,
++      0x6430, 0x6534, 0x6930, 0x6808, 0xd0b4, 0x1120, 0x2029, 0x0000,
++      0x2021, 0x0000, 0x00d6, 0x7010, 0x2068, 0x6864, 0x00de, 0x9086,
++      0x0103, 0x0148, 0x9d80, 0x001b, 0x2039, 0x0001, 0x080c, 0x3f0c,
++      0x701b, 0x31c0, 0x0078, 0x9d80, 0x001b, 0x21a8, 0x20a0, 0x2098,
++      0x0006, 0x080c, 0x504f, 0x000e, 0x2039, 0x0001, 0x080c, 0x3f0f,
++      0x701b, 0x31c0, 0x015e, 0x00de, 0x007e, 0x005e, 0x004e, 0x003e,
++      0x002e, 0x001e, 0x0005, 0x7010, 0x2068, 0x6864, 0x9086, 0x0103,
++      0x1118, 0x701b, 0x3260, 0x0410, 0x7010, 0x2068, 0x6868, 0xc0fd,
++      0x686a, 0x2009, 0x007f, 0x080c, 0x55b3, 0x0110, 0x9006, 0x0010,
++      0x080c, 0xadbf, 0x015e, 0x00de, 0x007e, 0x005e, 0x004e, 0x003e,
++      0x002e, 0x001e, 0x0904, 0x2b98, 0x0016, 0x0026, 0x0036, 0x0046,
++      0x0056, 0x0076, 0x00d6, 0x0156, 0x701b, 0x3239, 0x7007, 0x0003,
++      0x0848, 0x0076, 0x6830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904,
++      0x2b6a, 0x6d10, 0x6c0c, 0x6b24, 0x6a20, 0x6930, 0x6808, 0xd0b4,
++      0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x9d80, 0x001b, 0x21a8,
++      0x20a0, 0x2098, 0x0006, 0x080c, 0x504f, 0x000e, 0x2039, 0x0001,
++      0x080c, 0x3f0f, 0x007e, 0x701b, 0x31c0, 0x701f, 0x0001, 0x0005,
++      0x0804, 0x2b68, 0x0156, 0x00c6, 0x6814, 0x908a, 0x001e, 0x0218,
++      0x6833, 0x001e, 0x0010, 0x6832, 0x0078, 0x81ff, 0x0168, 0x0016,
++      0x080c, 0x3eb9, 0x001e, 0x0130, 0x6800, 0x2060, 0x6008, 0x680a,
++      0x2100, 0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e,
++      0x0005, 0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044,
++      0x00fe, 0x000e, 0x0005, 0x2001, 0x12d9, 0x2003, 0x0001, 0x0005,
++      0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x12e2, 0x2004,
++      0x601a, 0x2061, 0x0100, 0x2001, 0x12e1, 0x2004, 0x60ce, 0x6104,
++      0xc1ac, 0x6106, 0x080c, 0x3eb9, 0x6813, 0x0019, 0x2070, 0x6817,
++      0x0001, 0x2d00, 0x685a, 0x2001, 0x002e, 0x2004, 0x2072, 0x2001,
++      0x002f, 0x2004, 0x7006, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001,
++      0x12e1, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x1b67, 0x2001,
++      0x002a, 0x2004, 0x9084, 0xfff8, 0x700a, 0x601a, 0x700f, 0x0000,
++      0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee,
++      0x00fe, 0x0005, 0x00e6, 0x080c, 0x3eb9, 0x2d60, 0x6013, 0x0019,
++      0x2070, 0x6017, 0x0001, 0x2c00, 0x605a, 0x2001, 0x0030, 0x2004,
++      0x2072, 0x2001, 0x0031, 0x2004, 0x7006, 0x2001, 0x002a, 0x2004,
++      0x9084, 0xfff8, 0x700a, 0x700f, 0x0000, 0x2001, 0x032a, 0x2003,
++      0x0004, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003,
++      0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee,
++      0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x2338,
++      0x1130, 0x9006, 0x080c, 0x2290, 0x9006, 0x080c, 0x2273, 0x7884,
++      0x9084, 0x0007, 0x0002, 0x331e, 0x3327, 0x3330, 0x331b, 0x331b,
++      0x331b, 0x331b, 0x331b, 0x012e, 0x0804, 0x2b9b, 0x2009, 0x0114,
++      0x2104, 0x9085, 0x0800, 0x200a, 0x080c, 0x349a, 0x0080, 0x2009,
++      0x0114, 0x2104, 0x9085, 0x4000, 0x200a, 0x080c, 0x349a, 0x0038,
++      0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x2b6a, 0x0086,
++      0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c,
++      0x306d, 0x2009, 0x0101, 0x210c, 0x0016, 0x2001, 0x0032, 0x2034,
++      0x2001, 0x0033, 0x202c, 0x9006, 0x2048, 0x2050, 0x2058, 0x080c,
++      0x3700, 0x080c, 0x3660, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x00c6,
++      0x2d60, 0x2071, 0x134a, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000,
++      0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001,
++      0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x360c,
++      0x080c, 0x360c, 0x00ce, 0x00ee, 0x00fe, 0x080c, 0x3542, 0x00f6,
++      0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201,
++      0x200c, 0x81ff, 0x0150, 0x080c, 0x3520, 0x2900, 0x9a05, 0x9b05,
++      0x0120, 0x080c, 0x347c, 0x0804, 0x342b, 0x080c, 0x3634, 0x080c,
++      0x35a4, 0x080c, 0x3503, 0x080c, 0x3538, 0x00f6, 0x2079, 0x0100,
++      0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x347c, 0x00fe, 0x0804,
++      0x342b, 0x00fe, 0x080c, 0x3472, 0x1150, 0x8948, 0x2001, 0x0032,
++      0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x347c, 0x0080, 0x87ff,
++      0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038,
++      0x2001, 0x1347, 0x2004, 0x9086, 0x0000, 0x1904, 0x3377, 0x2001,
++      0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605,
++      0x0904, 0x342b, 0x7884, 0xd0bc, 0x0128, 0x2900, 0x9a05, 0x9b05,
++      0x1904, 0x342b, 0x6013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004,
++      0x7884, 0xd0ac, 0x1148, 0x2001, 0x1347, 0x2003, 0x0003, 0x2001,
++      0x032a, 0x2003, 0x0009, 0x0040, 0x6017, 0x0001, 0x2001, 0x002d,
++      0x2004, 0x9005, 0x0108, 0x6016, 0x2c00, 0x605a, 0x2009, 0x0040,
++      0x080c, 0x1b67, 0x2d00, 0x685a, 0x6813, 0x0019, 0x7884, 0xd0a4,
++      0x1180, 0x6817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090,
++      0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3400, 0x00ce,
++      0x0040, 0x6817, 0x0001, 0x2001, 0x002c, 0x2004, 0x9005, 0x0108,
++      0x6816, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0090, 0x7827,
++      0x0002, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006,
++      0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce,
++      0x00fe, 0x0804, 0x3355, 0x001e, 0x2001, 0x032a, 0x2003, 0x0004,
++      0x2061, 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013,
++      0x0020, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c,
++      0x10cf, 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009,
++      0x0028, 0x080c, 0x1b67, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050,
++      0x9084, 0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043,
++      0x0090, 0x6043, 0x0010, 0x2908, 0x2a10, 0x2b18, 0x2b00, 0x9a05,
++      0x9905, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
++      0x008e, 0x1118, 0x012e, 0x0804, 0x2b68, 0x012e, 0x2021, 0x400c,
++      0x0804, 0x2b6a, 0x9085, 0x0001, 0x1d04, 0x347b, 0x2091, 0x6000,
++      0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010,
++      0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x009a, 0x2003, 0x0004,
++      0x2001, 0x1347, 0x2003, 0x0000, 0x2001, 0x134a, 0x2003, 0x0000,
++      0x2009, 0x0048, 0x080c, 0x1b67, 0x2001, 0x0227, 0x2024, 0x2402,
++      0x9026, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1116, 0x200c,
++      0x7932, 0x7936, 0x080c, 0x1f8d, 0x7850, 0x9084, 0xfbff, 0x9085,
++      0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, 0xffcf,
++      0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x34b5, 0x2091,
++      0x6000, 0x1f04, 0x34b5, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfff,
++      0x7852, 0x2001, 0x0021, 0x2004, 0x9084, 0x0003, 0x9086, 0x0001,
++      0x1120, 0x7850, 0x9084, 0xdfff, 0x7852, 0x784b, 0xf7f7, 0x7843,
++      0x0090, 0x7843, 0x0010, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x34d5,
++      0x7850, 0x9085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xa001,
++      0xa001, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850,
++      0x9085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001,
++      0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2401, 0x7827,
++      0x0020, 0x7843, 0x0000, 0x2001, 0x0000, 0x080c, 0x2401, 0x7827,
++      0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6,
++      0x2071, 0x1347, 0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005,
++      0x0160, 0x7000, 0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108,
++      0x8738, 0x7003, 0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005,
++      0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178,
++      0x2009, 0x0032, 0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108,
++      0x8a50, 0xd0ac, 0x0108, 0x8948, 0xd0a4, 0x0108, 0x8b58, 0x0005,
++      0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050,
++      0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0x12e2, 0x2004,
++      0x70e2, 0x080c, 0x3281, 0x1188, 0x2001, 0x111e, 0x2004, 0x2009,
++      0x111d, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d,
++      0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002,
++      0x702e, 0x2009, 0x1116, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166,
++      0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078,
++      0x9080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa,
++      0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af,
++      0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x080c,
++      0x3634, 0x00f6, 0x2071, 0x1347, 0x2079, 0x0320, 0x00d6, 0x2069,
++      0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a,
++      0x00de, 0x2011, 0x0011, 0x080c, 0x360c, 0x2011, 0x0001, 0x080c,
++      0x360c, 0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1347,
++      0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904, 0x3609, 0x782b, 0x0002,
++      0x9026, 0xd19c, 0x1904, 0x3605, 0x7000, 0x0002, 0x3609, 0x35ba,
++      0x35ea, 0x3605, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002,
++      0x2011, 0x0001, 0x080c, 0x360c, 0x0904, 0x3609, 0x080c, 0x360c,
++      0x0804, 0x3609, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe,
++      0x7810, 0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201,
++      0x200c, 0x81ff, 0x0de8, 0x080c, 0x3520, 0x2009, 0x0001, 0x00f6,
++      0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011,
++      0x792a, 0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c,
++      0xd0fc, 0x1904, 0x35ae, 0x2011, 0x0001, 0x00b1, 0x0090, 0x6010,
++      0x9092, 0x0004, 0x9086, 0x0015, 0x1120, 0x6000, 0x605a, 0x2011,
++      0x0031, 0x6212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003,
++      0x0000, 0x00ee, 0x00fe, 0x0005, 0x6014, 0x9005, 0x0520, 0x8001,
++      0x6016, 0x6058, 0x6110, 0x9140, 0x2804, 0x7802, 0x8840, 0x2804,
++      0x7806, 0x8840, 0x2804, 0x7812, 0x8840, 0x2804, 0x7816, 0x8840,
++      0x7a2a, 0x7000, 0x8000, 0x7002, 0x6058, 0x9802, 0x908a, 0x0029,
++      0x1138, 0x6058, 0x9080, 0x0001, 0x2004, 0x605a, 0x2001, 0x0019,
++      0x6012, 0x9085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2071,
++      0x134a, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01f0, 0x782b, 0x0002,
++      0x2d60, 0x9026, 0x7000, 0x0002, 0x365c, 0x3647, 0x3653, 0x8001,
++      0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, 0x080c, 0x360c, 0x0160,
++      0x080c, 0x360c, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d30,
++      0x2011, 0x0001, 0x080c, 0x360c, 0x00ce, 0x00ee, 0x00fe, 0x0005,
++      0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x12e2, 0x2004,
++      0x601a, 0x2061, 0x0100, 0x2001, 0x12e1, 0x2004, 0x60ce, 0x6104,
++      0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x01f8, 0x2038,
++      0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x3eb9,
++      0x6813, 0x0019, 0x6f16, 0x2d00, 0x685a, 0x978a, 0x0007, 0x0220,
++      0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x6858, 0x9080,
++      0x0019, 0x04c1, 0x1d90, 0x2d00, 0x685a, 0x0088, 0x080c, 0x3eb9,
++      0x6813, 0x0019, 0x2070, 0x6817, 0x0001, 0x2d00, 0x685a, 0x2001,
++      0x002e, 0x2004, 0x2072, 0x2001, 0x002f, 0x2004, 0x7006, 0x2061,
++      0x0090, 0x2079, 0x0100, 0x2001, 0x12e1, 0x2004, 0x6036, 0x2009,
++      0x0040, 0x080c, 0x1b67, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8,
++      0x700a, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x700e, 0x601e,
++      0x78c6, 0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee,
++      0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0x20e9, 0x0001, 0x20a0,
++      0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306,
++      0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112,
++      0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b,
++      0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0180, 0x00c6, 0x00d6,
++      0x2d60, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x6058, 0x2070, 0x2d00,
++      0x7006, 0x605a, 0x00de, 0x00ce, 0x9085, 0x0001, 0x00ee, 0x0005,
++      0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0508, 0x2038, 0x2001,
++      0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x3eb9, 0x2d60,
++      0x6813, 0x0019, 0x6f16, 0x2d00, 0x685a, 0x978a, 0x0007, 0x0220,
++      0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x6858, 0x9080,
++      0x0019, 0x080c, 0x36ca, 0x1d88, 0x2d00, 0x685a, 0x00e0, 0x080c,
++      0x3eb9, 0x2d60, 0x6013, 0x0019, 0x2070, 0x6017, 0x0001, 0x2c00,
++      0x605a, 0x2001, 0x0030, 0x2004, 0x2072, 0x2001, 0x0031, 0x2004,
++      0x7006, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x700a, 0x2001,
++      0x002b, 0x2004, 0x700e, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884,
++      0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c, 0x918d, 0x0200, 0x2102,
++      0x6017, 0x0000, 0x2001, 0x1347, 0x2003, 0x0003, 0x2001, 0x032a,
++      0x2003, 0x0009, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d,
++      0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102,
++      0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001,
++      0x1140, 0x20e9, 0x0001, 0x20a0, 0x9006, 0x4004, 0x2009, 0x013c,
++      0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, 0x0804,
++      0x2b68, 0x7d98, 0x7c9c, 0x0804, 0x2c5d, 0x080c, 0x62e4, 0x0110,
++      0x080c, 0x50b9, 0x2069, 0x1152, 0x2d00, 0x2009, 0x0030, 0x7a8c,
++      0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b,
++      0x379a, 0x0005, 0x2001, 0x110d, 0x2004, 0xd0b4, 0x1130, 0x3b00,
++      0x3a08, 0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1152, 0x6800,
++      0x9005, 0x0904, 0x2b9b, 0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904,
++      0x2b9b, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, 0x6200,
++      0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, 0x918d, 0x0020,
++      0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0118,
++      0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106, 0x00ce, 0xd084,
++      0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x2b9b, 0x9288, 0x298c,
++      0x210d, 0x918c, 0x00ff, 0x615e, 0xd0dc, 0x0130, 0x6828, 0x908a,
++      0x007f, 0x1a04, 0x2b9b, 0x6056, 0x6888, 0x9084, 0x0030, 0x8004,
++      0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x12e8, 0x9080, 0x2081,
++      0x2005, 0x200a, 0x000e, 0x2009, 0x12e9, 0x9080, 0x2085, 0x2005,
++      0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x2b9b, 0x908a, 0x0841,
++      0x1a04, 0x2b9b, 0x9084, 0x0007, 0x1904, 0x2b9b, 0x680c, 0x9005,
++      0x0904, 0x2b9b, 0x6810, 0x9005, 0x0904, 0x2b9b, 0x6848, 0x6940,
++      0x910a, 0x1a04, 0x2b9b, 0x8001, 0x0904, 0x2b9b, 0x684c, 0x6944,
++      0x910a, 0x1a04, 0x2b9b, 0x8001, 0x0904, 0x2b9b, 0x6980, 0xd1e4,
++      0x0140, 0x00c6, 0x2061, 0x0100, 0x6004, 0x9085, 0x0100, 0x6006,
++      0x00ce, 0x2009, 0x12bb, 0x200b, 0x0000, 0x2001, 0x1174, 0x2004,
++      0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009, 0x017f, 0x200a, 0x3b00,
++      0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff, 0x6146, 0x8007, 0x9084,
++      0x00ff, 0x604a, 0x080c, 0x65bd, 0x080c, 0x58f4, 0x080c, 0x5946,
++      0x6808, 0x602a, 0x080c, 0x1a81, 0x2009, 0x0170, 0x200b, 0x0080,
++      0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x1fe8,
++      0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x393a, 0x6818, 0x691c,
++      0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a,
++      0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38,
++      0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff,
++      0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f,
++      0x20a9, 0x0004, 0x20a1, 0x12ea, 0x20e9, 0x0001, 0x4001, 0x080c,
++      0x72cb, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0510,
++      0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008, 0x1110, 0x839d,
++      0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, 0x8109, 0x080c, 0x6b21,
++      0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a,
++      0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010,
++      0x6003, 0x0001, 0x1f04, 0x3891, 0x00ce, 0x00c6, 0x2061, 0x12d6,
++      0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158, 0x2063,
++      0x0000, 0x2001, 0x0001, 0x080c, 0x2290, 0x2001, 0x0001, 0x080c,
++      0x2273, 0x0090, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001, 0x9006,
++      0x080c, 0x2290, 0x9006, 0x080c, 0x2273, 0x0030, 0x9286, 0x8000,
++      0x1d30, 0x2063, 0x0002, 0x0c98, 0x00ce, 0x6888, 0xd0ec, 0x0130,
++      0x2011, 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284,
++      0x0030, 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020,
++      0x6a82, 0x2001, 0x12a7, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000,
++      0x0170, 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003,
++      0xaaaa, 0x080c, 0x205d, 0x2001, 0x1298, 0x2102, 0x0008, 0x2102,
++      0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce,
++      0x080c, 0x62e4, 0x0128, 0x080c, 0x41f5, 0x0110, 0x080c, 0x1fad,
++      0x60d0, 0x9005, 0x01d0, 0x6003, 0x0001, 0x2009, 0x3920, 0x00e0,
++      0x080c, 0x62e4, 0x1178, 0x2011, 0x61aa, 0x080c, 0x71fa, 0x2011,
++      0x619d, 0x080c, 0x72bf, 0x2001, 0x12a8, 0x2003, 0x0000, 0x080c,
++      0x621a, 0x0040, 0x080c, 0x4faa, 0x0028, 0x6003, 0x0004, 0x2009,
++      0x393a, 0x0010, 0x0804, 0x2b68, 0x2001, 0x0170, 0x2004, 0x9084,
++      0x00ff, 0x9086, 0x004c, 0x1118, 0x2091, 0x30bd, 0x0817, 0x2091,
++      0x303d, 0x0817, 0x6000, 0x9086, 0x0000, 0x0904, 0x2b98, 0x2069,
++      0x1152, 0x7890, 0x6842, 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030,
++      0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0804, 0x3f0f,
++      0x9006, 0x080c, 0x1fad, 0x81ff, 0x1904, 0x2b98, 0x080c, 0x62e4,
++      0x1188, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003,
++      0x0001, 0x080c, 0x2987, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c,
++      0x621a, 0x0020, 0x080c, 0x50b9, 0x080c, 0x4faa, 0x0804, 0x2b68,
++      0x81ff, 0x1904, 0x2b98, 0x080c, 0x62e4, 0x1110, 0x0804, 0x2b98,
++      0x618c, 0x81ff, 0x01a8, 0x7047, 0x0000, 0x2001, 0x1580, 0x2009,
++      0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000,
++      0x2039, 0x0001, 0x080c, 0x3f0f, 0x701b, 0x2b66, 0x012e, 0x0005,
++      0x7047, 0x0001, 0x00d6, 0x2069, 0x1580, 0x20a9, 0x0040, 0x20e9,
++      0x0001, 0x20a1, 0x1580, 0x2019, 0xffff, 0x4304, 0x6554, 0x9588,
++      0x298c, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002,
++      0x2100, 0x9506, 0x01a8, 0x080c, 0x5608, 0x1190, 0x6014, 0x821c,
++      0x0238, 0x9398, 0x1580, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038,
++      0x9398, 0x1580, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210,
++      0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c,
++      0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1580, 0x2099,
++      0x1580, 0x080c, 0x504f, 0x0804, 0x398d, 0x080c, 0x3ef0, 0x0904,
++      0x2b9b, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x1120, 0x2009, 0x0002,
++      0x0804, 0x2b98, 0x2001, 0x1153, 0x2004, 0xd0b4, 0x0568, 0x7884,
++      0x9084, 0xff00, 0x908e, 0x7e00, 0x0538, 0x908e, 0x7f00, 0x0520,
++      0x908e, 0x8000, 0x0508, 0x080c, 0x2982, 0x1148, 0x6000, 0xd08c,
++      0x11d8, 0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x11a8, 0x6867,
++      0x0000, 0x6868, 0xc0fd, 0x686a, 0x080c, 0xaabe, 0x1120, 0x2009,
++      0x0003, 0x0804, 0x2b98, 0x7007, 0x0003, 0x701b, 0x3a20, 0x0005,
++      0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x20a9, 0x002b, 0x20e1, 0x0001,
++      0x2c98, 0x9de8, 0x0002, 0x20e9, 0x0001, 0x2da0, 0x4003, 0x20a9,
++      0x0004, 0x9d80, 0x0006, 0x20a0, 0x9c80, 0x0006, 0x2098, 0x080c,
++      0x504f, 0x20a9, 0x0004, 0x9d80, 0x000a, 0x20a0, 0x9c80, 0x000a,
++      0x2098, 0x080c, 0x504f, 0x2d00, 0x2039, 0x0001, 0x2009, 0x002b,
++      0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x3f0f, 0x81ff, 0x1904,
++      0x2b98, 0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c, 0x5767, 0x0804,
++      0x2b68, 0x81ff, 0x1904, 0x2b98, 0x7888, 0x908a, 0x1000, 0x1a04,
++      0x2b9b, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x080c, 0x57a6, 0x0904,
++      0x2b98, 0x2019, 0x0004, 0x900e, 0x080c, 0x5779, 0x7984, 0x810f,
++      0x7a88, 0x0491, 0x0804, 0x2b68, 0x00f6, 0x2d78, 0x789c, 0x908a,
++      0x1000, 0x12c0, 0x080c, 0x3eee, 0x01a8, 0x080c, 0x57a6, 0x2009,
++      0x0002, 0x0160, 0x2019, 0x0004, 0x080c, 0x5779, 0x2009, 0x0003,
++      0x0128, 0x7998, 0x7a9c, 0x810f, 0x00b9, 0x0070, 0x7897, 0x4005,
++      0x799a, 0x0010, 0x7897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
++      0x0030, 0x2f68, 0x00fe, 0x0005, 0x7897, 0x4000, 0x900e, 0x9085,
++      0x0001, 0x2f68, 0x00fe, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071,
++      0x0060, 0x2029, 0x007e, 0x2061, 0x1100, 0x6454, 0x2400, 0x9506,
++      0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x5608,
++      0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7206,
++      0x0005, 0x81ff, 0x1904, 0x2b98, 0x080c, 0x3ece, 0x0904, 0x2b9b,
++      0x080c, 0x56ca, 0x0904, 0x2b98, 0x080c, 0x5770, 0x0804, 0x2b68,
++      0x81ff, 0x1904, 0x2b98, 0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c,
++      0x56ca, 0x0904, 0x2b98, 0x080c, 0x575e, 0x0804, 0x2b68, 0x6100,
++      0x0804, 0x2b68, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x2001, 0x1100,
++      0x2004, 0x9086, 0x0003, 0x1904, 0x2b98, 0x00d6, 0x9ce8, 0x000a,
++      0x7984, 0xd184, 0x0110, 0x9ce8, 0x0006, 0x680c, 0x8007, 0x789e,
++      0x6808, 0x8007, 0x789a, 0x6b04, 0x831f, 0x6a00, 0x8217, 0x00de,
++      0x6100, 0x918c, 0x0200, 0x0804, 0x2b68, 0x7884, 0x909c, 0x007f,
++      0x939a, 0x0003, 0x1a04, 0x2b98, 0x6254, 0x9294, 0x00ff, 0x9084,
++      0xff00, 0x8007, 0x9206, 0x1560, 0x2031, 0x1148, 0x2009, 0x013c,
++      0x2136, 0x2001, 0x1140, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c,
++      0x7d98, 0x2039, 0x0001, 0x0006, 0x7884, 0x9084, 0x0080, 0x1118,
++      0x000e, 0x0804, 0x3f0f, 0x000e, 0x2031, 0x0000, 0x2061, 0x11ea,
++      0x6606, 0x6116, 0x670e, 0x6012, 0x622a, 0x632e, 0x6432, 0x6536,
++      0x2c10, 0x080c, 0x0f22, 0x7007, 0x0002, 0x701b, 0x3b62, 0x0005,
++      0x81ff, 0x1904, 0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x6004,
++      0x9084, 0x00ff, 0x9086, 0x0006, 0x1904, 0x2b98, 0x00c6, 0x080c,
++      0x3eb9, 0x00ce, 0x0904, 0x2b98, 0x6867, 0x0000, 0x6868, 0xc0fd,
++      0x686a, 0x080c, 0xaa65, 0x0904, 0x2b98, 0x7007, 0x0003, 0x701b,
++      0x3b66, 0x0005, 0x080c, 0x376a, 0x0804, 0x2b68, 0x6830, 0x9086,
++      0x0100, 0x0904, 0x2b98, 0x9d80, 0x001b, 0x2009, 0x000c, 0x7a8c,
++      0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0804, 0x3f0f, 0x9006,
++      0x080c, 0x1fad, 0x7884, 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118,
++      0x81ff, 0x1904, 0x2b98, 0x080c, 0x62e4, 0x0110, 0x080c, 0x50b9,
++      0x7888, 0x908a, 0x1000, 0x1a04, 0x2b9b, 0x7984, 0x918c, 0xff00,
++      0x810f, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x2b9b,
++      0x2100, 0x080c, 0x1f77, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000,
++      0x2061, 0x1317, 0x601b, 0x0000, 0x601f, 0x0000, 0x080c, 0x62e4,
++      0x1178, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003,
++      0x0001, 0x9085, 0x0001, 0x080c, 0x6331, 0x080c, 0x621a, 0x0438,
++      0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec,
++      0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x2061,
++      0x0100, 0x2001, 0x1116, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105,
++      0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x12d3, 0x200b,
++      0x0000, 0x2009, 0x002d, 0x2011, 0x4fe1, 0x080c, 0x7283, 0x7984,
++      0x918c, 0xff00, 0x810f, 0x080c, 0x62e4, 0x1110, 0x2009, 0x00ff,
++      0x7a88, 0x080c, 0x3aa4, 0x012e, 0x00ce, 0x002e, 0x0804, 0x2b68,
++      0x7984, 0x918c, 0xff00, 0x810f, 0x00c6, 0x080c, 0x55b3, 0x2c08,
++      0x00ce, 0x1904, 0x2b9b, 0x0804, 0x2b68, 0x81ff, 0x0120, 0x2009,
++      0x0001, 0x0804, 0x2b98, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120,
++      0x2009, 0x0005, 0x0804, 0x2b98, 0x080c, 0x3eb9, 0x1120, 0x2009,
++      0x0002, 0x0804, 0x2b98, 0x7984, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
++      0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b, 0x3c1f, 0x0005, 0x2009,
++      0x0080, 0x080c, 0x5608, 0x1130, 0x6004, 0x9084, 0x00ff, 0x9086,
++      0x0006, 0x0120, 0x2021, 0x400a, 0x0804, 0x2b6a, 0x00d6, 0x9de8,
++      0x0019, 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820,
++      0x90be, 0x0100, 0x0904, 0x3c99, 0x90be, 0x0112, 0x0904, 0x3c99,
++      0x90be, 0x0113, 0x0904, 0x3c99, 0x90be, 0x0114, 0x0904, 0x3c99,
++      0x90be, 0x0117, 0x0904, 0x3c99, 0x90be, 0x011a, 0x0904, 0x3c99,
++      0x90be, 0x011c, 0x0904, 0x3c99, 0x90be, 0x0121, 0x05c8, 0x90be,
++      0x0131, 0x05b0, 0x90be, 0x0171, 0x05e0, 0x90be, 0x0173, 0x05c8,
++      0x90be, 0x01a1, 0x1120, 0x6830, 0x8007, 0x6832, 0x04b8, 0x90be,
++      0x0212, 0x0558, 0x90be, 0x0213, 0x0540, 0x90be, 0x0214, 0x01c8,
++      0x90be, 0x0217, 0x0180, 0x90be, 0x021a, 0x1120, 0x6838, 0x8007,
++      0x683a, 0x00f8, 0x90be, 0x021f, 0x01e0, 0x90be, 0x0300, 0x01c8,
++      0x00de, 0x0804, 0x2b9b, 0x9d80, 0x0010, 0x20a9, 0x0007, 0x080c,
++      0x3cda, 0x9d80, 0x000e, 0x20a9, 0x0001, 0x080c, 0x3cda, 0x0048,
++      0x9d80, 0x000c, 0x080c, 0x3ce8, 0x0048, 0x9d80, 0x000e, 0x080c,
++      0x3ce8, 0x9d80, 0x000c, 0x20a9, 0x0001, 0x04e1, 0x00c6, 0x080c,
++      0x3eb9, 0x0548, 0x6868, 0xc0fd, 0x686a, 0x6867, 0x0119, 0x9006,
++      0x6882, 0x687f, 0x0020, 0x688b, 0x0001, 0x810b, 0x69ae, 0x68b2,
++      0x6ab6, 0x6bba, 0x6cbe, 0x6dc2, 0x69c6, 0x68ca, 0x00ce, 0x00de,
++      0x6866, 0x6822, 0x6868, 0xc0fd, 0x686a, 0x6804, 0x2068, 0x080c,
++      0xaa81, 0x1120, 0x2009, 0x0003, 0x0804, 0x2b98, 0x7007, 0x0003,
++      0x701b, 0x3cd1, 0x0005, 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804,
++      0x2b98, 0x6820, 0x9086, 0x8001, 0x1904, 0x2b68, 0x2009, 0x0004,
++      0x0804, 0x2b98, 0x0016, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000,
++      0x290a, 0x8108, 0x280a, 0x8108, 0x1f04, 0x3cdc, 0x001e, 0x0005,
++      0x0016, 0x00a6, 0x00b6, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000,
++      0x2054, 0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a,
++      0x8108, 0x280a, 0x00be, 0x00ae, 0x001e, 0x0005, 0x81ff, 0x0120,
++      0x2009, 0x0001, 0x0804, 0x2b98, 0x60d8, 0xd0ac, 0x1130, 0xd09c,
++      0x1120, 0x2009, 0x0005, 0x0804, 0x2b98, 0x7984, 0x2140, 0x918c,
++      0xff00, 0x810f, 0x60d8, 0xd0ac, 0x1120, 0x9182, 0x0080, 0x0a04,
++      0x2b9b, 0x9182, 0x00ff, 0x1a04, 0x2b9b, 0x7a8c, 0x7b88, 0x6074,
++      0x9306, 0x1140, 0x6078, 0x924e, 0x0904, 0x2b9b, 0x99cc, 0xff00,
++      0x0904, 0x2b9b, 0x00c6, 0x080c, 0x3dc2, 0x2c68, 0x00ce, 0x0530,
++      0x90c6, 0x4000, 0x1178, 0x00c6, 0x0006, 0x2d60, 0x900e, 0x080c,
++      0x57d6, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x000e,
++      0x00ce, 0x0088, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0060, 0x90c6,
++      0x4008, 0x1118, 0x2708, 0x2610, 0x0030, 0x90c6, 0x4009, 0x1108,
++      0x0010, 0x2001, 0x4006, 0x2020, 0x0804, 0x2b6a, 0x2d00, 0x7022,
++      0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x8f26, 0x05c0,
++      0x2d00, 0x6012, 0x080c, 0xad70, 0x2e58, 0x00ee, 0x00e6, 0x00c6,
++      0x080c, 0x3eb9, 0x00ce, 0x2b70, 0x1150, 0x080c, 0x8ed9, 0x00ee,
++      0x00ce, 0x00be, 0x001e, 0x2009, 0x0002, 0x0804, 0x2b98, 0x900e,
++      0x6966, 0x696a, 0x2d00, 0x6016, 0x6932, 0x6868, 0xc0fd, 0xd88c,
++      0x0108, 0xc0f5, 0x686a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2862,
++      0x012e, 0x6023, 0x0001, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002,
++      0x080c, 0x5568, 0x2009, 0x0002, 0x080c, 0x8f53, 0x9085, 0x0001,
++      0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, 0x2009, 0x0003, 0x0804,
++      0x2b98, 0x7007, 0x0003, 0x701b, 0x3da6, 0x0005, 0x6830, 0x9086,
++      0x0100, 0x7020, 0x2060, 0x1138, 0x2009, 0x0004, 0x6204, 0x9294,
++      0x00ff, 0x0804, 0x47e3, 0x900e, 0x6868, 0xd0f4, 0x1904, 0x2b68,
++      0x080c, 0x57d6, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d,
++      0x0804, 0x2b68, 0x00e6, 0x00d6, 0x2029, 0x0000, 0x2001, 0x1136,
++      0x2004, 0xd0ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071,
++      0x1000, 0x0030, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, 0x1080,
++      0x2e04, 0x9005, 0x1130, 0x2100, 0x9406, 0x1570, 0x2428, 0xc5fd,
++      0x0458, 0x2068, 0x6f10, 0x2700, 0x9306, 0x11b0, 0x6e14, 0x2600,
++      0x9206, 0x1190, 0x2400, 0x9106, 0x1160, 0x2d60, 0xd884, 0x0568,
++      0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1538, 0x2001, 0x4000,
++      0x0428, 0x2001, 0x4007, 0x0410, 0x2400, 0x9106, 0x1168, 0x6e14,
++      0x87ff, 0x1138, 0x86ff, 0x09d0, 0x2001, 0x1136, 0x2004, 0xd0ac,
++      0x19a8, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x3dd8,
++      0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030,
++      0x080c, 0x55b3, 0x1dd0, 0x6312, 0x6216, 0x9006, 0x9005, 0x00de,
++      0x00ee, 0x0005, 0x81ff, 0x1904, 0x2b98, 0x080c, 0x3eb9, 0x0904,
++      0x2b98, 0x6867, 0x0000, 0x6868, 0xc0fd, 0x686a, 0x7884, 0x9005,
++      0x0904, 0x2b9b, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04,
++      0x2b9b, 0x2010, 0x2d18, 0x080c, 0x2811, 0x0904, 0x2b98, 0x7007,
++      0x0003, 0x701b, 0x3e44, 0x0005, 0x6830, 0x9086, 0x0100, 0x0904,
++      0x2b98, 0x0804, 0x2b68, 0x7984, 0x918c, 0xff00, 0x810f, 0x60d8,
++      0xd0ac, 0x1120, 0x9182, 0x0080, 0x0a04, 0x2b9b, 0x9182, 0x00ff,
++      0x1a04, 0x2b9b, 0x0126, 0x2091, 0x8000, 0x080c, 0xa972, 0x1188,
++      0x9190, 0x1000, 0x2204, 0x9065, 0x0160, 0x080c, 0x5100, 0x2001,
++      0x1136, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, 0x012e, 0x0804,
++      0x2b68, 0x012e, 0x0804, 0x2b98, 0x00f6, 0x2d78, 0x7998, 0x918c,
++      0xff00, 0x810f, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x1118, 0x9182,
++      0x0080, 0x02e8, 0x9182, 0x00ff, 0x12d0, 0x0126, 0x2091, 0x8000,
++      0x080c, 0xa972, 0x1530, 0x9190, 0x1000, 0x2204, 0x9065, 0x0528,
++      0x080c, 0x5100, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x0110, 0x6017,
++      0x0000, 0x012e, 0x0070, 0x7897, 0x4005, 0x799a, 0x0010, 0x7897,
++      0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2f68, 0x00fe,
++      0x0005, 0x7897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2f68, 0x00fe,
++      0x0005, 0x012e, 0x2009, 0x0003, 0x0c30, 0x012e, 0x2009, 0x000a,
++      0x0c10, 0x080c, 0x0eb6, 0x0188, 0x9006, 0x6802, 0x7010, 0x9005,
++      0x1120, 0x2d00, 0x7012, 0x7016, 0x0030, 0x7014, 0x6802, 0x2060,
++      0x2d00, 0x6006, 0x7016, 0x9d80, 0x0019, 0x0005, 0x7984, 0x810f,
++      0x918c, 0x00ff, 0x080c, 0x5608, 0x1130, 0x7e88, 0x9684, 0x3fff,
++      0x9082, 0x4000, 0x0208, 0x9066, 0x8cff, 0x0005, 0x7998, 0x810f,
++      0x918c, 0x00ff, 0x080c, 0x5608, 0x1130, 0x7e9c, 0x9684, 0x3fff,
++      0x9082, 0x4000, 0x0208, 0x9066, 0x8cff, 0x0005, 0x7e98, 0x0008,
++      0x7e84, 0x860f, 0x918c, 0x00ff, 0x080c, 0x5608, 0x1128, 0x96b4,
++      0x00ff, 0x9682, 0x4000, 0x0208, 0x9066, 0x8cff, 0x0005, 0x0016,
++      0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, 0x080c, 0x0ecf, 0x0cc8,
++      0x7112, 0x7116, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031,
++      0x0000, 0x2061, 0x11ea, 0x6606, 0x6116, 0x670e, 0x6012, 0x622a,
++      0x632e, 0x6432, 0x6536, 0x2c10, 0x080c, 0x0f22, 0x7007, 0x0002,
++      0x701b, 0x2b68, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079,
++      0x0000, 0x2001, 0x11a3, 0x2004, 0x9005, 0x1190, 0x0e04, 0x3f40,
++      0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080,
++      0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd, 0x0804, 0x3f9d,
++      0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0x1193, 0x703c, 0x9005,
++      0x1540, 0x7140, 0x9182, 0x0010, 0x0288, 0x7030, 0x2060, 0x080c,
++      0x0eb6, 0x0904, 0x3f96, 0x684b, 0x0000, 0x2d00, 0x703e, 0x2001,
++      0x0002, 0x9080, 0x18fe, 0x2005, 0x6846, 0x0098, 0x7030, 0x90e0,
++      0x0004, 0x2001, 0x11aa, 0x9c82, 0x11ea, 0x0210, 0x2061, 0x11aa,
++      0x2c00, 0x7032, 0x7140, 0x81ff, 0x1108, 0x7036, 0x8108, 0x7142,
++      0x0428, 0x7140, 0x8108, 0x7142, 0x703c, 0x2078, 0x7944, 0x2105,
++      0x9f60, 0x8108, 0x2105, 0x9005, 0x7946, 0x11c0, 0x080c, 0x0eb6,
++      0x1130, 0x8109, 0x7946, 0x7140, 0x8109, 0x7142, 0x0078, 0x9006,
++      0x6806, 0x684a, 0x7846, 0x2f00, 0x6802, 0x2d00, 0x7806, 0x703e,
++      0x2001, 0x0002, 0x9080, 0x18fe, 0x2005, 0x6846, 0x2262, 0x6306,
++      0x640a, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x012e, 0x00fe, 0x0005,
++      0x00e6, 0x2071, 0x1193, 0x7040, 0x9005, 0x0904, 0x4024, 0x0126,
++      0x2091, 0x8000, 0x0e04, 0x4023, 0x00f6, 0x2079, 0x0000, 0x00c6,
++      0x00d6, 0x0086, 0x9006, 0x2040, 0x7038, 0x2068, 0x9005, 0x01c0,
++      0x6948, 0x2105, 0x9d60, 0x8108, 0x2105, 0x9005, 0x694a, 0x1190,
++      0x6804, 0x9005, 0x090c, 0x0d7e, 0x703a, 0x2d40, 0x2068, 0x6803,
++      0x0000, 0x2001, 0x0002, 0x9080, 0x18fe, 0x2005, 0x684a, 0x0010,
++      0x7034, 0x2060, 0x2c04, 0x7836, 0x7833, 0x0012, 0x7882, 0x6004,
++      0x7886, 0x6008, 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
++      0xd084, 0x190c, 0x0fcd, 0x88ff, 0x0118, 0x2868, 0x080c, 0x0ecf,
++      0x7040, 0x8001, 0x7042, 0x9005, 0x1170, 0x7038, 0x2068, 0x9005,
++      0x0128, 0x080c, 0x0ecf, 0x9006, 0x703a, 0x703e, 0x7033, 0x11aa,
++      0x7037, 0x11aa, 0x0420, 0x7038, 0x9005, 0x1508, 0x7230, 0x2c00,
++      0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, 0x11ea, 0x0210, 0x2001,
++      0x11aa, 0x7036, 0x00a0, 0x9006, 0x7036, 0x7032, 0x703c, 0x9005,
++      0x090c, 0x0d7e, 0x2068, 0x6800, 0x9005, 0x1de0, 0x2d00, 0x703a,
++      0x2001, 0x0002, 0x9080, 0x18fe, 0x2005, 0x684a, 0x0000, 0x008e,
++      0x00de, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, 0x2001,
++      0x1153, 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x3f23,
++      0x002e, 0x0005, 0x81ff, 0x1904, 0x2b98, 0x0126, 0x2091, 0x8000,
++      0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x62e4, 0x1178,
++      0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001,
++      0x9085, 0x0001, 0x080c, 0x6331, 0x080c, 0x621a, 0x0010, 0x080c,
++      0x4faa, 0x012e, 0x0804, 0x2b68, 0x7884, 0x2008, 0x918c, 0xfffd,
++      0x1128, 0x61e4, 0x910d, 0x61e6, 0x0804, 0x2b68, 0x0804, 0x2b9b,
++      0x81ff, 0x1904, 0x2b98, 0x6000, 0x9086, 0x0003, 0x1904, 0x2b98,
++      0x080c, 0x58c6, 0x1904, 0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b,
++      0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1120, 0x7888, 0x9005,
++      0x0904, 0x2b68, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x0904, 0x2b98,
++      0x9006, 0x6866, 0x6832, 0x6868, 0xc0fd, 0x686a, 0x080c, 0xab41,
++      0x0904, 0x2b98, 0x7007, 0x0003, 0x701b, 0x40ce, 0x0005, 0x00f6,
++      0x2d78, 0x2061, 0x1100, 0x6000, 0x9086, 0x0003, 0x2009, 0x0007,
++      0x11d0, 0x080c, 0x58c6, 0x2009, 0x0008, 0x11a8, 0x080c, 0x3eee,
++      0x01b0, 0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, 0x789c,
++      0x9005, 0x01b8, 0x2f68, 0x6868, 0xc0fc, 0x686a, 0x080c, 0xab41,
++      0x11c8, 0x2009, 0x0003, 0x7897, 0x4005, 0x799a, 0x0010, 0x7897,
++      0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2f68, 0x00fe,
++      0x0005, 0x7897, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, 0x2f68,
++      0x00fe, 0x0005, 0x9006, 0x2f68, 0x00fe, 0x0005, 0x6830, 0x9086,
++      0x0100, 0x1904, 0x2b68, 0x0804, 0x47e3, 0x2001, 0x1100, 0x2004,
++      0x9086, 0x0003, 0x1904, 0x2b98, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c,
++      0x7d98, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x900e, 0x2130, 0x7122,
++      0x712e, 0x9d80, 0x0005, 0x7026, 0x20a0, 0x20e1, 0x0001, 0x20e9,
++      0x0001, 0x080c, 0x5608, 0x1904, 0x4149, 0x6004, 0x90c4, 0x00ff,
++      0x98c6, 0x0006, 0x0130, 0x90c4, 0xff00, 0x98c6, 0x0600, 0x1904,
++      0x4149, 0x080c, 0x58c6, 0x1130, 0x080c, 0x57d6, 0x1118, 0xd79c,
++      0x0904, 0x4149, 0xd794, 0x1110, 0xd784, 0x0158, 0x9c80, 0x0006,
++      0x2098, 0x3400, 0x20a9, 0x0004, 0x4003, 0x080c, 0x3ce8, 0xd794,
++      0x0148, 0x9c80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x4003,
++      0x080c, 0x3ce8, 0x21a2, 0x3400, 0x8000, 0x20a0, 0xd794, 0x01d8,
++      0x9c80, 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003,
++      0x2098, 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400,
++      0x20a9, 0x0002, 0x4003, 0x080c, 0x3cda, 0x9c80, 0x0026, 0x2098,
++      0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0,
++      0x0005, 0x8108, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x0118, 0x9186,
++      0x0100, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0100, 0x0170, 0x0018,
++      0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010,
++      0x9686, 0x0028, 0x0150, 0x0804, 0x40ed, 0x86ff, 0x1120, 0x7120,
++      0x810b, 0x0804, 0x2b68, 0x702f, 0x0001, 0x711e, 0x7020, 0x9600,
++      0x7022, 0x772a, 0x2061, 0x11ea, 0x6007, 0x0000, 0x6616, 0x7024,
++      0x600f, 0x0001, 0x6012, 0x622a, 0x632e, 0x6432, 0x6536, 0x2c10,
++      0x080c, 0x0f22, 0x7007, 0x0002, 0x701b, 0x4187, 0x0005, 0x702c,
++      0x9005, 0x1168, 0x711c, 0x7024, 0x20a0, 0x7728, 0x9036, 0x2061,
++      0x11ea, 0x6228, 0x632c, 0x6430, 0x6534, 0x0804, 0x40ed, 0x7120,
++      0x810b, 0x0804, 0x2b68, 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c,
++      0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x2b9b,
++      0x9502, 0x0a04, 0x2b9b, 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04,
++      0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x9284, 0xff00, 0x8007, 0x90e2,
++      0x0020, 0x0a04, 0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x9284, 0x00ff,
++      0x90e2, 0x0020, 0x0a04, 0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x9384,
++      0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x2b9b, 0x9502, 0x0a04,
++      0x2b9b, 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x2b9b, 0x9502,
++      0x0a04, 0x2b9b, 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
++      0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x9484, 0x00ff, 0x90e2, 0x0020,
++      0x0a04, 0x2b9b, 0x9502, 0x0a04, 0x2b9b, 0x2061, 0x12c3, 0x6102,
++      0x6206, 0x630a, 0x640e, 0x0804, 0x2b68, 0x0006, 0x2001, 0x1153,
++      0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x2001, 0x1172, 0x2004,
++      0xd0bc, 0x000e, 0x0005, 0x616c, 0x7a84, 0x6300, 0x82ff, 0x1118,
++      0x7986, 0x0804, 0x2b68, 0x83ff, 0x1904, 0x2b9b, 0x2001, 0xfff0,
++      0x9200, 0x1a04, 0x2b9b, 0x2019, 0xffff, 0x6070, 0x9302, 0x9200,
++      0x0a04, 0x2b9b, 0x7986, 0x626e, 0x0804, 0x2b68, 0x2001, 0x1100,
++      0x2004, 0x9086, 0x0003, 0x1904, 0x2b98, 0x7c88, 0x7d84, 0x7e98,
++      0x7f8c, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x900e, 0x901e, 0x7322,
++      0x732e, 0x9d80, 0x0003, 0x7026, 0x20a0, 0x91e0, 0x1000, 0x2c64,
++      0x8cff, 0x01d8, 0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0130,
++      0x6004, 0x9084, 0xff00, 0x9086, 0x0600, 0x1178, 0x00d6, 0x3468,
++      0x6014, 0x206a, 0x8d68, 0x6010, 0x8007, 0x9105, 0x8007, 0x206a,
++      0x8d68, 0x2da0, 0x00de, 0x9398, 0x0002, 0x8108, 0x9182, 0x00ff,
++      0x0120, 0x9386, 0x002a, 0x0148, 0x08c0, 0x83ff, 0x1120, 0x7120,
++      0x810c, 0x0804, 0x2b68, 0x702f, 0x0001, 0x711e, 0x7020, 0x9300,
++      0x7022, 0x2061, 0x11ea, 0x6007, 0x0000, 0x6316, 0x7024, 0x6012,
++      0x600f, 0x0001, 0x642a, 0x652e, 0x6632, 0x6736, 0x2c10, 0x080c,
++      0x0f22, 0x7007, 0x0002, 0x701b, 0x427e, 0x0005, 0x702c, 0x9005,
++      0x1160, 0x711c, 0x7024, 0x20a0, 0x901e, 0x2061, 0x11ea, 0x6428,
++      0x652c, 0x6630, 0x6734, 0x0804, 0x4235, 0x7120, 0x810c, 0x0804,
++      0x2b68, 0x00f6, 0x2d78, 0x00e6, 0x2001, 0x1100, 0x2004, 0x9086,
++      0x0003, 0x2009, 0x0007, 0x1904, 0x4311, 0x2071, 0x1193, 0x7454,
++      0x84ff, 0x2009, 0x000e, 0x1904, 0x4311, 0x7c9c, 0x7d98, 0x7ea4,
++      0x7fa0, 0x080c, 0x0e9d, 0x2009, 0x0002, 0x0904, 0x4311, 0x2d00,
++      0x7056, 0x900e, 0x901e, 0x734e, 0x735a, 0x9d80, 0x0003, 0x7052,
++      0x20a0, 0x91e0, 0x1000, 0x2c64, 0x8cff, 0x01d8, 0x6004, 0x9084,
++      0x00ff, 0x9086, 0x0006, 0x0130, 0x6004, 0x9084, 0xff00, 0x9086,
++      0x0600, 0x1178, 0x00d6, 0x3468, 0x6014, 0x206a, 0x8d68, 0x6010,
++      0x8007, 0x9105, 0x8007, 0x206a, 0x8d68, 0x2da0, 0x00de, 0x9398,
++      0x0002, 0x8108, 0x9182, 0x00ff, 0x0120, 0x9386, 0x002a, 0x01b8,
++      0x08c0, 0x83ff, 0x1190, 0x714c, 0x810c, 0x7897, 0x4000, 0x799a,
++      0x7154, 0x81ff, 0x090c, 0x0d7e, 0x2168, 0x080c, 0x0ecf, 0x9006,
++      0x7056, 0x918d, 0x0001, 0x2008, 0x0420, 0x705b, 0x0001, 0x714a,
++      0x704c, 0x9300, 0x704e, 0x2061, 0x11fb, 0x6007, 0x0000, 0x6316,
++      0x7050, 0x6012, 0x600f, 0x0001, 0x642a, 0x652e, 0x6632, 0x6736,
++      0x603b, 0x431d, 0x2f00, 0x603e, 0x2c10, 0x080c, 0x0f22, 0x9006,
++      0x0040, 0x7897, 0x4005, 0x799a, 0x900e, 0x9085, 0x0001, 0x2001,
++      0x0030, 0x00ee, 0x2f68, 0x00fe, 0x0005, 0x00f6, 0x603c, 0x907d,
++      0x090c, 0x0d7e, 0x00e6, 0x2071, 0x1193, 0x6008, 0x908e, 0x0100,
++      0x0138, 0x787b, 0x0030, 0x7883, 0x0000, 0x7897, 0x4002, 0x00a8,
++      0x7058, 0x9005, 0x1148, 0x7148, 0x7050, 0x20a0, 0x901e, 0x6428,
++      0x652c, 0x6630, 0x6734, 0x0400, 0x787b, 0x0000, 0x7883, 0x0000,
++      0x7897, 0x4000, 0x714c, 0x810c, 0x799a, 0x7154, 0x81ff, 0x090c,
++      0x0d7e, 0x2168, 0x080c, 0x0ecf, 0x7057, 0x0000, 0x2f68, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x603b, 0x0000, 0x603f,
++      0x0000, 0x00ee, 0x00fe, 0x0005, 0x91e0, 0x1000, 0x2c64, 0x8cff,
++      0x01d8, 0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0130, 0x6004,
++      0x9084, 0xff00, 0x9086, 0x0600, 0x1178, 0x00d6, 0x3468, 0x6014,
++      0x206a, 0x8d68, 0x6010, 0x8007, 0x9105, 0x8007, 0x206a, 0x8d68,
++      0x2da0, 0x00de, 0x9398, 0x0002, 0x8108, 0x9182, 0x00ff, 0x0120,
++      0x9386, 0x002a, 0x0520, 0x08c0, 0x83ff, 0x11f8, 0x714c, 0x810c,
++      0x799a, 0x7897, 0x4000, 0x7154, 0x81ff, 0x090c, 0x0d7e, 0x2168,
++      0x080c, 0x0ecf, 0x9006, 0x7056, 0x918d, 0x0001, 0x2008, 0x2f68,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x2061, 0x11fb,
++      0x603b, 0x0000, 0x603f, 0x0000, 0x0088, 0x705b, 0x0001, 0x714a,
++      0x704c, 0x9300, 0x704e, 0x2061, 0x11fb, 0x6316, 0x642a, 0x652e,
++      0x6632, 0x6736, 0x2c10, 0x080c, 0x0f22, 0x9006, 0x00ee, 0x00fe,
++      0x0005, 0x81ff, 0x1904, 0x2b98, 0x60d8, 0xd0ac, 0x1118, 0xd09c,
++      0x0904, 0x2b98, 0x080c, 0x3eb9, 0x0904, 0x2b98, 0x7984, 0x7a8c,
++      0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x3f0c, 0x701b,
++      0x43d2, 0x0005, 0x00d6, 0x9de8, 0x0019, 0x6828, 0x90be, 0x7000,
++      0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x00de,
++      0x0804, 0x2b9b, 0x6820, 0x6924, 0x080c, 0x1f63, 0x1510, 0x080c,
++      0x55b3, 0x11f8, 0x7122, 0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c,
++      0x3eb9, 0x01b8, 0x080c, 0x3eb9, 0x01a0, 0x00ce, 0x00de, 0x6867,
++      0x0000, 0x6868, 0xc0fd, 0x686a, 0x6823, 0x0000, 0x6804, 0x2068,
++      0x080c, 0xaaa2, 0x0904, 0x2b98, 0x7007, 0x0003, 0x701b, 0x440c,
++      0x0005, 0x00de, 0x0804, 0x2b98, 0x7120, 0x080c, 0x2955, 0x6820,
++      0x9086, 0x8001, 0x0904, 0x2b98, 0x2d00, 0x701e, 0x6804, 0x9080,
++      0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x504f,
++      0x000e, 0x9de8, 0x0019, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061,
++      0x11ea, 0x6007, 0x0000, 0x6e00, 0x6f28, 0x97c6, 0x7000, 0x1108,
++      0x0018, 0x97c6, 0x7100, 0x1150, 0x96c2, 0x0004, 0x0a04, 0x2b9b,
++      0x2009, 0x0004, 0x2039, 0x0001, 0x0804, 0x3f0f, 0x97c6, 0x7200,
++      0x1904, 0x2b9b, 0x96c2, 0x0054, 0x0a04, 0x2b9b, 0x600f, 0x0001,
++      0x6012, 0x6017, 0x002a, 0x622a, 0x632e, 0x6432, 0x6536, 0x2c10,
++      0x080c, 0x0f22, 0x7007, 0x0002, 0x701b, 0x4457, 0x0005, 0x701c,
++      0x2068, 0x6804, 0x9080, 0x0001, 0x2004, 0x9080, 0x0002, 0x0006,
++      0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x504f, 0x000e, 0x2061,
++      0x11ea, 0x6228, 0x632c, 0x6430, 0x6534, 0x2039, 0x0001, 0x2009,
++      0x002a, 0x0804, 0x3f0f, 0x81ff, 0x1904, 0x2b98, 0x798c, 0x2001,
++      0x12a9, 0x2102, 0x080c, 0x3ece, 0x0904, 0x2b9b, 0x080c, 0x56ca,
++      0x0904, 0x2b98, 0x0126, 0x2091, 0x8000, 0x080c, 0x5782, 0x012e,
++      0x0804, 0x2b68, 0x00f6, 0x69a0, 0x2001, 0x12a9, 0x2102, 0x2d78,
++      0x080c, 0x3ede, 0x0170, 0x080c, 0x56ca, 0x2009, 0x0002, 0x0128,
++      0x080c, 0x5782, 0x1180, 0x2009, 0x0003, 0x7897, 0x4005, 0x799a,
++      0x0010, 0x7897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
++      0x2f68, 0x00fe, 0x0005, 0x7897, 0x4000, 0x900e, 0x9085, 0x0001,
++      0x2001, 0x0000, 0x2f68, 0x00fe, 0x0005, 0x7884, 0xd08c, 0x1118,
++      0xd084, 0x0904, 0x39e5, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x00c6,
++      0x080c, 0x3eb9, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x2b98,
++      0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0128, 0x908e, 0x0004,
++      0x0110, 0x908e, 0x0005, 0x15b8, 0x7884, 0xd08c, 0x0120, 0x6000,
++      0xc08c, 0x6002, 0x0030, 0x2001, 0x1153, 0x2004, 0xd0b4, 0x0904,
++      0x3a24, 0x7884, 0x9084, 0xff00, 0x908e, 0x7e00, 0x0904, 0x3a24,
++      0x908e, 0x7f00, 0x0904, 0x3a24, 0x908e, 0x8000, 0x0904, 0x3a24,
++      0x6000, 0xd08c, 0x1904, 0x3a24, 0x6867, 0x0000, 0x6868, 0xc0fd,
++      0x686a, 0x080c, 0xaabe, 0x1120, 0x2009, 0x0003, 0x0804, 0x2b98,
++      0x7007, 0x0003, 0x701b, 0x4505, 0x0005, 0x080c, 0x3ef0, 0x0904,
++      0x2b9b, 0x0804, 0x3a24, 0x080c, 0x2982, 0x0108, 0x0005, 0x2009,
++      0x1133, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2b98,
++      0x2001, 0x1100, 0x2004, 0x9086, 0x0003, 0x0120, 0x2009, 0x0007,
++      0x0804, 0x2b98, 0x080c, 0x58c6, 0x0120, 0x2009, 0x0008, 0x0804,
++      0x2b98, 0x609c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x3a24, 0x9006,
++      0x6866, 0x6832, 0x6868, 0xc0fd, 0x686a, 0x080c, 0xab41, 0x1120,
++      0x2009, 0x0003, 0x0804, 0x2b98, 0x7007, 0x0003, 0x701b, 0x4541,
++      0x0005, 0x6830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804,
++      0x47e3, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x0804, 0x44d4, 0x81ff,
++      0x2009, 0x0001, 0x1904, 0x2b98, 0x6000, 0x9086, 0x0003, 0x2009,
++      0x0007, 0x1904, 0x2b98, 0x080c, 0x58c6, 0x2009, 0x0008, 0x1904,
++      0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x6004, 0x9084, 0x00ff,
++      0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2b98, 0x00c6, 0x080c,
++      0x3eb9, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2b98, 0x9006, 0x6866,
++      0x6832, 0x6868, 0xc0fd, 0x686a, 0x7988, 0x9194, 0xff00, 0x918c,
++      0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0x6952, 0x798c, 0x6956,
++      0x0038, 0x928e, 0x0100, 0x1904, 0x2b9b, 0xc0e5, 0x6952, 0x6956,
++      0x683e, 0x080c, 0xad71, 0x2009, 0x0003, 0x0904, 0x2b98, 0x7007,
++      0x0003, 0x701b, 0x459c, 0x0005, 0x6830, 0x9086, 0x0100, 0x2009,
++      0x0004, 0x0904, 0x2b98, 0x0804, 0x2b68, 0x81ff, 0x2009, 0x0001,
++      0x1904, 0x2b98, 0x6000, 0x9086, 0x0003, 0x2009, 0x0007, 0x1904,
++      0x2b98, 0x080c, 0x3ef0, 0x0904, 0x2b9b, 0x6004, 0x9084, 0x00ff,
++      0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2b98, 0x00c6, 0x080c,
++      0x3eb9, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2b98, 0x9d80, 0x001b,
++      0x2039, 0x0001, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
++      0x080c, 0x3f0c, 0x701b, 0x45d5, 0x0005, 0x00d6, 0x9de8, 0x001b,
++      0x6800, 0x9086, 0x0500, 0x1138, 0x6804, 0x9005, 0x1120, 0x6808,
++      0x9084, 0xff00, 0x0118, 0x00de, 0x1904, 0x2b9b, 0x00de, 0x6866,
++      0x6832, 0x6868, 0xc0fd, 0x686a, 0x00c6, 0x080c, 0x3ef0, 0x1118,
++      0x00ce, 0x0804, 0x2b9b, 0x2009, 0x0043, 0x080c, 0xadda, 0x2009,
++      0x0003, 0x00ce, 0x0904, 0x2b98, 0x7007, 0x0003, 0x701b, 0x4601,
++      0x0005, 0x6830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x2b98,
++      0x0804, 0x2b68, 0x00f6, 0x00c6, 0x2d78, 0x2061, 0x1100, 0x6000,
++      0x9086, 0x0003, 0x2009, 0x0007, 0x1528, 0x080c, 0x3eee, 0x0530,
++      0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x11d0,
++      0x9fe8, 0x0031, 0x6800, 0x9086, 0x0500, 0x11c0, 0x6804, 0x9005,
++      0x11a8, 0x6808, 0x9084, 0xff00, 0x1188, 0x080c, 0x3eee, 0x1108,
++      0x0068, 0x2f68, 0x2009, 0x004b, 0x080c, 0xadda, 0x2009, 0x0003,
++      0x0108, 0x0078, 0x7897, 0x4005, 0x799a, 0x0010, 0x7897, 0x4006,
++      0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, 0x2f68, 0x00fe,
++      0x0005, 0x9006, 0x0cd0, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
++      0x2b98, 0x6000, 0x9086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804,
++      0x2b98, 0x7e84, 0x860f, 0x918c, 0x00ff, 0x96b4, 0x00ff, 0x080c,
++      0x5608, 0x1904, 0x2b9b, 0x9186, 0x007f, 0x0150, 0x6004, 0x9084,
++      0x00ff, 0x9086, 0x0006, 0x0120, 0x2009, 0x0009, 0x0804, 0x2b98,
++      0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804,
++      0x2b98, 0x6867, 0x0000, 0x6868, 0xc0fd, 0x686a, 0x2001, 0x0100,
++      0x8007, 0x680a, 0x080c, 0xaad9, 0x1120, 0x2009, 0x0003, 0x0804,
++      0x2b98, 0x7007, 0x0003, 0x701b, 0x468e, 0x0005, 0x6808, 0x8007,
++      0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x2b98, 0x68e0,
++      0x6866, 0x6810, 0x8007, 0x9084, 0x00ff, 0x800c, 0x6814, 0x8007,
++      0x9084, 0x00ff, 0x8004, 0x9080, 0x0002, 0x9108, 0x9d80, 0x0004,
++      0x2039, 0x0001, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x3f0f,
++      0x080c, 0x3eb9, 0x1120, 0x2009, 0x0002, 0x0804, 0x2b98, 0x7984,
++      0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804,
++      0x2b9b, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039,
++      0x0001, 0x080c, 0x3f0c, 0x701b, 0x46ce, 0x0005, 0x2001, 0x112c,
++      0x2003, 0x0001, 0x9d80, 0x0019, 0x2098, 0x20e1, 0x0001, 0x20a9,
++      0x001a, 0x20a1, 0x12ea, 0x20e9, 0x0001, 0x4003, 0x0804, 0x2b68,
++      0x080c, 0x3eb9, 0x1120, 0x2009, 0x0002, 0x0804, 0x2b98, 0x7984,
++      0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804,
++      0x2b9b, 0x2099, 0x12ea, 0x20a0, 0x20e9, 0x0001, 0x20a9, 0x001a,
++      0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c,
++      0x7d98, 0x2039, 0x0001, 0x0804, 0x3f0f, 0x7884, 0x908a, 0x1000,
++      0x1a04, 0x2b9b, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b,
++      0x9108, 0x00c6, 0x2061, 0x1317, 0x6142, 0x00ce, 0x012e, 0x0804,
++      0x2b68, 0x00c6, 0x080c, 0x62e4, 0x1180, 0x2001, 0x12a8, 0x2003,
++      0x0001, 0x2001, 0x1100, 0x2003, 0x0001, 0x9085, 0x0001, 0x080c,
++      0x6331, 0x080c, 0x621a, 0x080c, 0x0d7e, 0x2061, 0x1100, 0x6030,
++      0xc09d, 0x6032, 0x080c, 0x4faa, 0x00ce, 0x0005, 0x00c6, 0x2001,
++      0x1100, 0x2004, 0x908e, 0x0000, 0x0904, 0x2b98, 0x7884, 0x9005,
++      0x0188, 0x7888, 0x2061, 0x12d6, 0x2c0c, 0x2062, 0x080c, 0x2328,
++      0x01a0, 0x080c, 0x2330, 0x0188, 0x080c, 0x2338, 0x0170, 0x2162,
++      0x0804, 0x2b9b, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118,
++      0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002,
++      0x1548, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011,
++      0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec, 0x002e,
++      0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x60e3,
++      0x0000, 0x080c, 0xc44e, 0x080c, 0xc469, 0x9085, 0x0001, 0x080c,
++      0x6331, 0x9006, 0x080c, 0x2401, 0x2001, 0x1100, 0x2003, 0x0004,
++      0x6027, 0x0008, 0x00ce, 0x0804, 0x2b68, 0x81ff, 0x0120, 0x2009,
++      0x0001, 0x0804, 0x2b98, 0x6000, 0x9086, 0x0003, 0x0120, 0x2009,
++      0x0007, 0x0804, 0x2b98, 0x7e84, 0x860f, 0x918c, 0x00ff, 0x96b4,
++      0x00ff, 0x080c, 0x5608, 0x1904, 0x2b9b, 0x9186, 0x007f, 0x0150,
++      0x6004, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0120, 0x2009, 0x0009,
++      0x0804, 0x2b98, 0x00c6, 0x080c, 0x3eb9, 0x00ce, 0x1120, 0x2009,
++      0x0002, 0x0804, 0x2b98, 0x6867, 0x0000, 0x6868, 0xc0fd, 0x686a,
++      0x080c, 0xaaf5, 0x1120, 0x2009, 0x0003, 0x0804, 0x2b98, 0x7007,
++      0x0003, 0x701b, 0x47cc, 0x0005, 0x6830, 0x9086, 0x0100, 0x1120,
++      0x2009, 0x0004, 0x0804, 0x2b98, 0x68e0, 0x6866, 0x6834, 0x8007,
++      0x800c, 0x9d80, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039,
++      0x0001, 0x0804, 0x3f0f, 0x6898, 0x9086, 0x000d, 0x1904, 0x2b98,
++      0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x47f0, 0x0010,
++      0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011,
++      0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0x6998, 0x7986, 0x69a4,
++      0x799a, 0x69a8, 0x799e, 0x080c, 0x3eff, 0x2091, 0x4080, 0x2001,
++      0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd, 0x7007, 0x0001, 0x2091,
++      0x5000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061,
++      0x1317, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009,
++      0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e,
++      0x2061, 0x12aa, 0x2001, 0x132c, 0x6012, 0x600f, 0x0001, 0x6017,
++      0x0001, 0x601b, 0x0002, 0x6007, 0x0000, 0x603b, 0x0000, 0x00ce,
++      0x012e, 0x0804, 0x2b68, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6,
++      0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069,
++      0x0200, 0x2071, 0x1100, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118,
++      0x080c, 0x49ce, 0x0068, 0xd08c, 0x0118, 0x080c, 0x48e1, 0x0040,
++      0xd094, 0x0118, 0x080c, 0x48b4, 0x0018, 0xd09c, 0x0108, 0x0099,
++      0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e,
++      0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d,
++      0x612a, 0x001e, 0x0c68, 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048,
++      0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010,
++      0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, 0x7134, 0xd1a4,
++      0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, 0x0010, 0x0128,
++      0x2009, 0x00f7, 0x080c, 0x507b, 0x00f0, 0x6040, 0x9084, 0x0010,
++      0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x707f, 0x0000, 0x709b,
++      0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009, 0x1580, 0x200b,
++      0x0000, 0x708f, 0x0000, 0x7083, 0x000f, 0x2009, 0x000f, 0x2011,
++      0x4f50, 0x080c, 0x7283, 0x0005, 0x2001, 0x1174, 0x2004, 0xd08c,
++      0x0110, 0x7057, 0xffff, 0x7080, 0x9005, 0x1510, 0x2011, 0x4f50,
++      0x080c, 0x71fa, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042,
++      0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x48ca, 0x6242,
++      0x7093, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042,
++      0x6242, 0x0030, 0x6242, 0x7093, 0x0000, 0x7087, 0x0000, 0x0000,
++      0x0005, 0x7084, 0x908a, 0x0003, 0x1a0c, 0x0d7e, 0x000b, 0x0005,
++      0x48eb, 0x4932, 0x49cd, 0x00f6, 0x7087, 0x0001, 0x6803, 0x00fc,
++      0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x48f2,
++      0x080c, 0x0d7e, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a,
++      0xa001, 0x6803, 0x1600, 0x6837, 0x0020, 0x080c, 0x50d5, 0x2079,
++      0x1500, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099,
++      0x1105, 0x20e9, 0x0001, 0x20a1, 0x150e, 0x20a9, 0x0004, 0x4003,
++      0x080c, 0x8dc3, 0x20e1, 0x0001, 0x2099, 0x1500, 0x20e9, 0x0000,
++      0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f,
++      0x0000, 0x080c, 0x4f86, 0x00fe, 0x9006, 0x708a, 0x6043, 0x0008,
++      0x6042, 0x0005, 0x00f6, 0x7088, 0x708b, 0x0000, 0x9025, 0x0904,
++      0x49aa, 0x6020, 0xd0b4, 0x1904, 0x49a8, 0x7198, 0x81ff, 0x0904,
++      0x4996, 0x9486, 0x000c, 0x1904, 0x49a3, 0x9480, 0x0018, 0x8004,
++      0x20a8, 0x080c, 0x50ce, 0x2011, 0x0260, 0x2019, 0x1500, 0x220c,
++      0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x494f, 0x6043,
++      0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061,
++      0x0100, 0x6043, 0x0006, 0x7087, 0x0002, 0x7093, 0x0002, 0x2009,
++      0x07d0, 0x2011, 0x4f57, 0x080c, 0x7283, 0x080c, 0x50d5, 0x04c0,
++      0x080c, 0x50ce, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558,
++      0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804,
++      0x9005, 0x0190, 0x080c, 0x50ce, 0x2011, 0x026e, 0x2019, 0x1105,
++      0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210,
++      0x8318, 0x1f04, 0x498a, 0x0078, 0x709b, 0x0000, 0x080c, 0x50ce,
++      0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1500,
++      0x20a9, 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010,
++      0x00fe, 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4,
++      0x1db8, 0x080c, 0x8dc3, 0x20e1, 0x0001, 0x2099, 0x1500, 0x20e9,
++      0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c,
++      0x2011, 0x130e, 0x2013, 0x0000, 0x708b, 0x0000, 0x60a3, 0x0056,
++      0x60a7, 0x9575, 0x080c, 0x8599, 0x08d8, 0x0005, 0x7090, 0x908a,
++      0x001d, 0x1a0c, 0x0d7e, 0x000b, 0x0005, 0x49ff, 0x4a12, 0x4a3b,
++      0x4a5b, 0x4a81, 0x4ab0, 0x4ad6, 0x4b0e, 0x4b34, 0x4b62, 0x4b9b,
++      0x4bd3, 0x4bf1, 0x4c1c, 0x4c3e, 0x4c55, 0x4c5d, 0x4c91, 0x4cb7,
++      0x4ce6, 0x4d0c, 0x4d44, 0x4d7e, 0x4db3, 0x4dd1, 0x4e2a, 0x4e4c,
++      0x4e76, 0x4e76, 0x00c6, 0x2061, 0x1100, 0x6003, 0x0007, 0x2061,
++      0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061,
++      0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043,
++      0x0002, 0x7093, 0x0001, 0x2009, 0x07d0, 0x2011, 0x4f57, 0x080c,
++      0x7283, 0x0005, 0x00f6, 0x7088, 0x9086, 0x0014, 0x1510, 0x6042,
++      0x6020, 0xd0b4, 0x11f0, 0x080c, 0x50ce, 0x2079, 0x0260, 0x7a30,
++      0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc,
++      0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x2011, 0x4f57,
++      0x080c, 0x71fa, 0x7093, 0x0010, 0x080c, 0x4c5d, 0x0010, 0x708b,
++      0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0003, 0x6043, 0x0004,
++      0x2011, 0x4f57, 0x080c, 0x71fa, 0x080c, 0x505d, 0x2079, 0x0240,
++      0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e,
++      0x200b, 0x0000, 0x8108, 0x1f04, 0x4a50, 0x60c3, 0x0014, 0x080c,
++      0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011,
++      0x4f57, 0x080c, 0x71fa, 0x9086, 0x0014, 0x11b8, 0x080c, 0x50ce,
++      0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005,
++      0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
++      0x0001, 0x7093, 0x0004, 0x0029, 0x0010, 0x080c, 0x50aa, 0x00fe,
++      0x0005, 0x00f6, 0x7093, 0x0005, 0x080c, 0x505d, 0x2079, 0x0240,
++      0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x50ce, 0x080c, 0x50b1,
++      0x1170, 0x707c, 0x9005, 0x1158, 0x7154, 0x9186, 0xffff, 0x0138,
++      0x2011, 0x0008, 0x080c, 0x4f04, 0x0168, 0x080c, 0x5092, 0x20a9,
++      0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1,
++      0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x4f86, 0x00fe, 0x0005,
++      0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x4f57, 0x080c, 0x71fa,
++      0x9086, 0x0014, 0x11b8, 0x080c, 0x50ce, 0x2079, 0x0260, 0x7a30,
++      0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc,
++      0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0006,
++      0x0029, 0x0010, 0x080c, 0x50aa, 0x00fe, 0x0005, 0x00f6, 0x7093,
++      0x0007, 0x080c, 0x505d, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837,
++      0x0000, 0x080c, 0x50ce, 0x080c, 0x50b1, 0x11b8, 0x707c, 0x9005,
++      0x11a0, 0x715c, 0x9186, 0xffff, 0x0180, 0x9180, 0x298c, 0x200d,
++      0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x4f04, 0x0180,
++      0x080c, 0x41fc, 0x0110, 0x080c, 0x1fad, 0x20a9, 0x0008, 0x20e1,
++      0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
++      0x60c3, 0x0014, 0x080c, 0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088,
++      0x9005, 0x0500, 0x2011, 0x4f57, 0x080c, 0x71fa, 0x9086, 0x0014,
++      0x11b8, 0x080c, 0x50ce, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104,
++      0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
++      0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0008, 0x0029, 0x0010,
++      0x080c, 0x50aa, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0009, 0x080c,
++      0x505d, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c,
++      0x50b1, 0x1150, 0x707c, 0x9005, 0x1138, 0x080c, 0x4e77, 0x1188,
++      0x9085, 0x0001, 0x080c, 0x1fad, 0x20a9, 0x0008, 0x080c, 0x50ce,
++      0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e,
++      0x4003, 0x60c3, 0x0014, 0x080c, 0x4f86, 0x0010, 0x080c, 0x49f2,
++      0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x0598, 0x2011, 0x4f57,
++      0x080c, 0x71fa, 0x9086, 0x0014, 0x1550, 0x080c, 0x50ce, 0x2079,
++      0x0260, 0x7a30, 0x9296, 0x1105, 0x1510, 0x7834, 0x2011, 0x0100,
++      0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110,
++      0x70c3, 0x0001, 0x7093, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178,
++      0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001,
++      0x708f, 0x0000, 0x7093, 0x000e, 0x080c, 0x4c3e, 0x0010, 0x080c,
++      0x50aa, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x000b, 0x2011, 0x150e,
++      0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304,
++      0x080c, 0x505d, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000,
++      0x080c, 0x50b1, 0x0118, 0x2013, 0x0000, 0x0020, 0x7058, 0x9085,
++      0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x150e,
++      0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000,
++      0x6812, 0x2009, 0x0240, 0x1f04, 0x4bc0, 0x60c3, 0x0084, 0x080c,
++      0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01c0, 0x2011,
++      0x4f57, 0x080c, 0x71fa, 0x9086, 0x0084, 0x1178, 0x080c, 0x50ce,
++      0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005,
++      0x1120, 0x7093, 0x000c, 0x0029, 0x0010, 0x080c, 0x50aa, 0x00fe,
++      0x0005, 0x00f6, 0x7093, 0x000d, 0x080c, 0x505d, 0x2079, 0x0240,
++      0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x50ce, 0x20a9, 0x0040,
++      0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186,
++      0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814,
++      0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x4c04, 0x60c3, 0x0084,
++      0x080c, 0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0,
++      0x2011, 0x4f57, 0x080c, 0x71fa, 0x9086, 0x0084, 0x1198, 0x080c,
++      0x50ce, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834,
++      0x9005, 0x1140, 0x708f, 0x0001, 0x080c, 0x502f, 0x7093, 0x000e,
++      0x0029, 0x0010, 0x080c, 0x50aa, 0x00fe, 0x0005, 0x7093, 0x000f,
++      0x708b, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5,
++      0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0,
++      0x2011, 0x4f57, 0x080c, 0x71ee, 0x0005, 0x7088, 0x9005, 0x0120,
++      0x2011, 0x4f57, 0x080c, 0x71fa, 0x0005, 0x7093, 0x0011, 0x080c,
++      0x8dc3, 0x080c, 0x50ce, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9,
++      0x0000, 0x20a1, 0x0240, 0x7488, 0x9480, 0x0018, 0x9080, 0x0007,
++      0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x50b1, 0x11a0,
++      0x7174, 0x81ff, 0x0188, 0x900e, 0x7078, 0x9084, 0x00ff, 0x0160,
++      0x080c, 0x1f63, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120,
++      0x2011, 0x0008, 0x080c, 0x4f04, 0x60c3, 0x0014, 0x080c, 0x4f86,
++      0x0005, 0x00f6, 0x7088, 0x9005, 0x0500, 0x2011, 0x4f57, 0x080c,
++      0x71fa, 0x9086, 0x0014, 0x11b8, 0x080c, 0x50ce, 0x2079, 0x0260,
++      0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38,
++      0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093,
++      0x0012, 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x00f6,
++      0x7093, 0x0013, 0x080c, 0x506b, 0x2079, 0x0240, 0x7833, 0x1103,
++      0x7837, 0x0000, 0x080c, 0x50ce, 0x080c, 0x50b1, 0x1170, 0x707c,
++      0x9005, 0x1158, 0x7154, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008,
++      0x080c, 0x4f04, 0x0168, 0x080c, 0x5092, 0x20a9, 0x0008, 0x20e1,
++      0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
++      0x60c3, 0x0014, 0x080c, 0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088,
++      0x9005, 0x0500, 0x2011, 0x4f57, 0x080c, 0x71fa, 0x9086, 0x0014,
++      0x11b8, 0x080c, 0x50ce, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104,
++      0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
++      0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0014, 0x0029, 0x0010,
++      0x708b, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7093, 0x0015, 0x080c,
++      0x506b, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c,
++      0x50ce, 0x080c, 0x50b1, 0x11b8, 0x707c, 0x9005, 0x11a0, 0x715c,
++      0x9186, 0xffff, 0x0180, 0x9180, 0x298c, 0x200d, 0x918c, 0xff00,
++      0x810f, 0x2011, 0x0008, 0x080c, 0x4f04, 0x0180, 0x080c, 0x41fc,
++      0x0110, 0x080c, 0x1fad, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099,
++      0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014,
++      0x080c, 0x4f86, 0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x05a0,
++      0x2011, 0x4f57, 0x080c, 0x71fa, 0x9086, 0x0014, 0x1558, 0x080c,
++      0x50ce, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1518, 0x7834,
++      0x2011, 0x0100, 0x921e, 0x1148, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
++      0x9005, 0x1110, 0x70c3, 0x0001, 0x0060, 0x9005, 0x1198, 0x7a38,
++      0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x708f,
++      0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7093, 0x0016,
++      0x0029, 0x0010, 0x708b, 0x0000, 0x00fe, 0x0005, 0x080c, 0x8dc3,
++      0x080c, 0x50ce, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000,
++      0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026e, 0x7093,
++      0x0017, 0x080c, 0x50b1, 0x1150, 0x707c, 0x9005, 0x1138, 0x080c,
++      0x4e77, 0x1188, 0x9085, 0x0001, 0x080c, 0x1fad, 0x20a9, 0x0008,
++      0x080c, 0x50ce, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
++      0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x4f86, 0x0010,
++      0x080c, 0x49f2, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01c0, 0x2011,
++      0x4f57, 0x080c, 0x71fa, 0x9086, 0x0084, 0x1178, 0x080c, 0x50ce,
++      0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005,
++      0x1120, 0x7093, 0x0018, 0x0029, 0x0010, 0x708b, 0x0000, 0x00fe,
++      0x0005, 0x00f6, 0x7093, 0x0019, 0x080c, 0x506b, 0x2079, 0x0240,
++      0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x50ce, 0x2009, 0x026e,
++      0x2039, 0x150e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186,
++      0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04,
++      0x4de4, 0x2039, 0x150e, 0x080c, 0x50b1, 0x11e8, 0x2728, 0x2514,
++      0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007,
++      0x9205, 0x202a, 0x7058, 0x2310, 0x8214, 0x92a0, 0x150e, 0x2414,
++      0x938c, 0x0001, 0x0118, 0x9294, 0xff00, 0x0018, 0x9294, 0x00ff,
++      0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, 0x024e, 0x270e,
++      0x8738, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812,
++      0x2009, 0x0240, 0x1f04, 0x4e17, 0x60c3, 0x0084, 0x080c, 0x4f86,
++      0x00fe, 0x0005, 0x00f6, 0x7088, 0x9005, 0x01e0, 0x2011, 0x4f57,
++      0x080c, 0x71fa, 0x9086, 0x0084, 0x1198, 0x080c, 0x50ce, 0x2079,
++      0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140,
++      0x708f, 0x0001, 0x080c, 0x502f, 0x7093, 0x001a, 0x0029, 0x0010,
++      0x708b, 0x0000, 0x00fe, 0x0005, 0x7093, 0x001b, 0x080c, 0x8dc3,
++      0x080c, 0x50ce, 0x2011, 0x0260, 0x2009, 0x0240, 0x7488, 0x9480,
++      0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e,
++      0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812,
++      0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04,
++      0x4e5f, 0x60c3, 0x0084, 0x080c, 0x4f86, 0x0005, 0x0005, 0x0086,
++      0x0096, 0x2029, 0x1153, 0x252c, 0x20a9, 0x0008, 0x2041, 0x150e,
++      0x20e9, 0x0001, 0x28a0, 0x080c, 0x50ce, 0x20e1, 0x0000, 0x2099,
++      0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108,
++      0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4,
++      0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x4e91, 0x0804, 0x4f00,
++      0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020,
++      0x91a6, 0x3fff, 0x0904, 0x4f00, 0x918d, 0xc000, 0x20a9, 0x0010,
++      0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4,
++      0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319,
++      0x0008, 0x8318, 0x1f04, 0x4eb7, 0x04d8, 0x23a8, 0x2021, 0x0001,
++      0x8426, 0x8425, 0x1f04, 0x4ec9, 0x2328, 0x8529, 0x92be, 0x0007,
++      0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8,
++      0x95a8, 0x0010, 0x1f04, 0x4ed8, 0x7556, 0x95c8, 0x298c, 0x292d,
++      0x95ac, 0x00ff, 0x757a, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c,
++      0x1f8d, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405,
++      0x201a, 0x707f, 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1,
++      0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008,
++      0x9006, 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136,
++      0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
++      0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce,
++      0x015e, 0x2118, 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218,
++      0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010,
++      0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319,
++      0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8,
++      0x9405, 0x203a, 0x7156, 0x91a0, 0x298c, 0x242d, 0x95ac, 0x00ff,
++      0x757a, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x1f8d, 0x001e,
++      0x60e7, 0x0000, 0x65ea, 0x707f, 0x0001, 0x9084, 0x0000, 0x0005,
++      0x00e6, 0x2071, 0x1100, 0x7083, 0x0000, 0x00ee, 0x0005, 0x00e6,
++      0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x501e, 0x080c,
++      0x85a2, 0x7004, 0x9084, 0x4000, 0x0138, 0x2001, 0x1000, 0x080c,
++      0x2401, 0x9006, 0x080c, 0x2401, 0x0126, 0x2091, 0x8000, 0x2071,
++      0x1124, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7,
++      0x080c, 0x507b, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842,
++      0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091,
++      0x8000, 0x2011, 0x130e, 0x2013, 0x0000, 0x708b, 0x0000, 0x012e,
++      0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x8599, 0x6144, 0xd184,
++      0x0120, 0x7190, 0x918d, 0x2000, 0x0018, 0x7184, 0x918d, 0x1000,
++      0x2011, 0x12d3, 0x2112, 0x2009, 0x07d0, 0x2011, 0x4f57, 0x080c,
++      0x7283, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000,
++      0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec,
++      0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x2009,
++      0x00f7, 0x080c, 0x507b, 0x2061, 0x1317, 0x900e, 0x611a, 0x611e,
++      0x2061, 0x1100, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090,
++      0x6043, 0x0010, 0x2009, 0x12d3, 0x200b, 0x0000, 0x2009, 0x002d,
++      0x2011, 0x4fe1, 0x080c, 0x71ee, 0x012e, 0x00ce, 0x002e, 0x001e,
++      0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x04b9, 0x2071,
++      0x0100, 0x080c, 0x85a2, 0x2071, 0x0140, 0x7004, 0x9084, 0x4000,
++      0x0138, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401,
++      0x080c, 0x62ec, 0x01a8, 0x080c, 0x630a, 0x1190, 0x2001, 0x12a7,
++      0x2003, 0xaaaa, 0x0016, 0x080c, 0x205d, 0x2001, 0x1298, 0x2102,
++      0x001e, 0x2001, 0x12a8, 0x2003, 0x0000, 0x080c, 0x621a, 0x0050,
++      0x2009, 0x0001, 0x080c, 0x2355, 0x2001, 0x0001, 0x080c, 0x1f11,
++      0x080c, 0x4faa, 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, 0x110d,
++      0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, 0x8017, 0x2001,
++      0x12d3, 0x201c, 0x080c, 0x3f23, 0x003e, 0x002e, 0x0005, 0x20a9,
++      0x0012, 0x20e9, 0x0001, 0x20a1, 0x1580, 0x080c, 0x50ce, 0x20e9,
++      0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, 0x50c8,
++      0x2099, 0x0260, 0x20a1, 0x1592, 0x0051, 0x20a9, 0x000e, 0x080c,
++      0x50cb, 0x2099, 0x0260, 0x20a1, 0x15b2, 0x0009, 0x0005, 0x0016,
++      0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210,
++      0x1f04, 0x5053, 0x002e, 0x001e, 0x0005, 0x080c, 0x8dc3, 0x20e1,
++      0x0001, 0x2099, 0x1500, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
++      0x000c, 0x4003, 0x0005, 0x080c, 0x8dc3, 0x080c, 0x50ce, 0x20e1,
++      0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
++      0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f,
++      0x2001, 0x1133, 0x2004, 0x9005, 0x1138, 0x2001, 0x1116, 0x2004,
++      0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e,
++      0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x58cb, 0x0158, 0x9006,
++      0x2020, 0x2009, 0x002a, 0x080c, 0xc12f, 0x2001, 0x110c, 0x200c,
++      0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, 0x2831, 0x004e,
++      0x001e, 0x0005, 0x080c, 0x4faa, 0x7093, 0x0000, 0x708b, 0x0000,
++      0x0005, 0x0006, 0x2001, 0x110c, 0x2004, 0xd09c, 0x0100, 0x000e,
++      0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101,
++      0x200c, 0x918d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005,
++      0x2009, 0x0001, 0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814,
++      0x9084, 0xffc0, 0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146,
++      0x01d6, 0x9006, 0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1500,
++      0x4004, 0x2079, 0x1500, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f,
++      0x00ef, 0x7813, 0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de,
++      0x014e, 0x015e, 0x00fe, 0x0005, 0x0156, 0x20a9, 0x00ff, 0x2009,
++      0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, 0x50fa, 0x015e, 0x0005,
++      0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0x1152, 0x9006,
++      0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0x9198, 0x298c,
++      0x231d, 0x939c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0x9c98, 0x0006,
++      0x20e9, 0x0001, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9c98, 0x000a,
++      0x23a0, 0x4004, 0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a,
++      0x605e, 0x6062, 0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a,
++      0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae, 0x61a2,
++      0x00d6, 0x60a4, 0x906d, 0x0110, 0x080c, 0x0ecf, 0x60a7, 0x0000,
++      0x00de, 0x9006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814,
++      0x9084, 0x00ff, 0x6042, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de,
++      0x0005, 0x0126, 0x2091, 0x8000, 0x6974, 0x6e78, 0x9684, 0x3fff,
++      0x9082, 0x4000, 0x1a04, 0x51c0, 0x918c, 0xff00, 0x810f, 0x9182,
++      0x00ff, 0x1a04, 0x51c4, 0x2001, 0x110c, 0x2004, 0x9084, 0x0003,
++      0x1904, 0x51ca, 0x9188, 0x1000, 0x2104, 0x9065, 0x0500, 0x6004,
++      0x9084, 0x00ff, 0x908e, 0x0006, 0x11f0, 0x60a4, 0x900d, 0x1904,
++      0x51df, 0x6050, 0x900d, 0x1148, 0x6802, 0x2d00, 0x6052, 0x604e,
++      0x080c, 0x758b, 0x9006, 0x012e, 0x0005, 0x2d00, 0x200a, 0x6803,
++      0x0000, 0x6052, 0x0ca8, 0x2001, 0x0005, 0x900e, 0x04c0, 0x2001,
++      0x0028, 0x900e, 0x04a0, 0x9082, 0x0006, 0x1298, 0x2001, 0x1136,
++      0x2004, 0xd0ac, 0x1158, 0x60a0, 0xd0bc, 0x1140, 0x6100, 0xd1fc,
++      0x09a0, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, 0x2001, 0x0028,
++      0x00a8, 0x2009, 0x110c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004,
++      0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, 0x2001, 0x0029,
++      0x6100, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, 0x900e, 0x0038,
++      0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005,
++      0x012e, 0x0005, 0x2001, 0x110c, 0x2004, 0xd084, 0x19d0, 0x9188,
++      0x1000, 0x2104, 0x9065, 0x09a8, 0x6004, 0x9084, 0x00ff, 0x908e,
++      0x0006, 0x1978, 0x6000, 0xd0c4, 0x0960, 0x0804, 0x5175, 0x080c,
++      0x5791, 0x0904, 0x518b, 0x0804, 0x5179, 0x00e6, 0x0126, 0x2091,
++      0x8000, 0x6874, 0x8007, 0x9084, 0x00ff, 0x2008, 0x9182, 0x00ff,
++      0x1a04, 0x5247, 0x9188, 0x1000, 0x2104, 0x9065, 0x0538, 0x6004,
++      0x908c, 0x00ff, 0x918e, 0x0006, 0x0128, 0x908c, 0xff00, 0x918e,
++      0x0600, 0x11f8, 0x2c70, 0x687c, 0xd0fc, 0x0138, 0x6894, 0x9005,
++      0x0120, 0x2060, 0x2d00, 0x6016, 0x0058, 0x080c, 0x8e83, 0x05e8,
++      0x2e00, 0x6012, 0x2d00, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a,
++      0x2009, 0x0003, 0x080c, 0x8f53, 0x9006, 0x0460, 0x2001, 0x0028,
++      0x0440, 0x9082, 0x0006, 0x1298, 0x2001, 0x1136, 0x2004, 0xd0ac,
++      0x1158, 0x60a0, 0xd0bc, 0x1140, 0x6100, 0xd1fc, 0x0998, 0x2001,
++      0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009,
++      0x110c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184,
++      0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001,
++      0x0029, 0x9005, 0x012e, 0x00ee, 0x0005, 0x2001, 0x002c, 0x0cc8,
++      0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x68e0, 0x9005, 0x1568,
++      0x68dc, 0x9082, 0x0101, 0x1648, 0x68c8, 0x9005, 0x1530, 0x68c4,
++      0x9082, 0x0101, 0x1610, 0x6974, 0x2079, 0x1100, 0x918c, 0xff00,
++      0x810f, 0x9182, 0x00ff, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130,
++      0x6a98, 0x6b94, 0x6878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c,
++      0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004,
++      0x0010, 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e,
++      0x0018, 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e,
++      0x00ee, 0x00fe, 0x0005, 0x52e3, 0x529b, 0x52b4, 0x52e3, 0x52e3,
++      0x52e3, 0x52e3, 0x52e3, 0x2100, 0x9082, 0x007e, 0x1280, 0x080c,
++      0x55b3, 0x2c70, 0x0148, 0x7010, 0x9306, 0x1904, 0x52eb, 0x7014,
++      0x9206, 0x1904, 0x52eb, 0x0028, 0x7312, 0x7216, 0x0010, 0x080c,
++      0x3dc2, 0x2c70, 0x0158, 0x04b8, 0x080c, 0x5608, 0x15a0, 0x2c70,
++      0x7010, 0x9306, 0x1580, 0x7014, 0x9206, 0x1568, 0x080c, 0x8e83,
++      0x0530, 0x2e00, 0x6012, 0x080c, 0xad70, 0x2d00, 0x6016, 0x600b,
++      0xffff, 0x6023, 0x000a, 0x6878, 0x9086, 0x0001, 0x1170, 0x080c,
++      0x2862, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002, 0x080c, 0x5568,
++      0x2001, 0x0200, 0x706e, 0x7093, 0x0002, 0x2009, 0x0003, 0x080c,
++      0x8f53, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038, 0x2001,
++      0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005, 0x0000,
++      0x012e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x0126, 0x2091,
++      0x8000, 0x6894, 0x90c6, 0x0015, 0x0904, 0x54b0, 0x90c6, 0x0056,
++      0x0904, 0x54b4, 0x90c6, 0x0066, 0x0904, 0x54b8, 0x90c6, 0x0071,
++      0x0904, 0x54bc, 0x90c6, 0x0074, 0x0904, 0x54c0, 0x90c6, 0x007c,
++      0x0904, 0x54c4, 0x90c6, 0x007e, 0x0904, 0x54c8, 0x90c6, 0x0037,
++      0x0904, 0x54cc, 0x9016, 0x2079, 0x1100, 0x6974, 0x918c, 0xff00,
++      0x810f, 0x9182, 0x00ff, 0x1a04, 0x54ab, 0x080c, 0x5608, 0x11a0,
++      0x6004, 0x9084, 0x00ff, 0x9082, 0x0006, 0x1270, 0x6894, 0x90c6,
++      0x006f, 0x0150, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x1904, 0x5496,
++      0x60a0, 0xd0bc, 0x1904, 0x5496, 0x6894, 0x90c6, 0x006f, 0x0158,
++      0x90c6, 0x005e, 0x0904, 0x53df, 0x90c6, 0x0064, 0x0904, 0x5413,
++      0x2008, 0x0804, 0x53aa, 0x6998, 0x2140, 0x918c, 0xff00, 0x810f,
++      0x78d8, 0xd0ac, 0x1120, 0x9182, 0x0080, 0x0a04, 0x53aa, 0x9182,
++      0x00ff, 0x1a04, 0x53aa, 0x6aa0, 0x6b9c, 0x7874, 0x9306, 0x1168,
++      0x7878, 0x924e, 0x1120, 0x2208, 0x2310, 0x0804, 0x53aa, 0x99cc,
++      0xff00, 0x1118, 0x2208, 0x2310, 0x04e8, 0x080c, 0x3dc2, 0x2c70,
++      0x0904, 0x53b2, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1520, 0x0006,
++      0x2e60, 0x080c, 0x57d6, 0x1108, 0xc185, 0x7000, 0xd0bc, 0x0108,
++      0xc18d, 0x20a9, 0x0004, 0x9d80, 0x0031, 0x20a0, 0x20e9, 0x0001,
++      0x9e80, 0x0006, 0x2098, 0x080c, 0x504f, 0x20a9, 0x0004, 0x9d80,
++      0x0035, 0x20a0, 0x20e9, 0x0001, 0x9e80, 0x000a, 0x2098, 0x080c,
++      0x504f, 0x000e, 0x0088, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0060,
++      0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0030, 0x90c6, 0x4009,
++      0x1108, 0x0010, 0x2001, 0x4006, 0x6896, 0x699a, 0x6a9e, 0x2001,
++      0x0030, 0x0440, 0x080c, 0x8e83, 0x1130, 0x2001, 0x4005, 0x2009,
++      0x0003, 0x9016, 0x0c88, 0x2e00, 0x6012, 0x080c, 0xad70, 0x2d00,
++      0x6016, 0x6023, 0x0001, 0x6868, 0xd88c, 0x0108, 0xc0f5, 0x686a,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x2862, 0x012e, 0x9006, 0x080c,
++      0x5556, 0x2001, 0x0002, 0x080c, 0x5568, 0x2009, 0x0002, 0x080c,
++      0x8f53, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x0005, 0x7800,
++      0x9086, 0x0003, 0x0118, 0x2009, 0x0007, 0x0448, 0x6e98, 0x860f,
++      0x918c, 0x00ff, 0x96b4, 0x00ff, 0x080c, 0x5608, 0x0120, 0x2009,
++      0x000a, 0x0804, 0x53aa, 0x9186, 0x007f, 0x0148, 0x6004, 0x9084,
++      0x00ff, 0x9086, 0x0006, 0x0118, 0x2009, 0x0009, 0x0080, 0x00d6,
++      0x080c, 0x0e9d, 0x1120, 0x00de, 0x2009, 0x0002, 0x0040, 0x2d00,
++      0x00de, 0x6806, 0x080c, 0xaaf5, 0x1960, 0x2009, 0x0003, 0x2001,
++      0x4005, 0x0804, 0x53ac, 0x6e98, 0x860f, 0x918c, 0x00ff, 0x96b4,
++      0x00ff, 0x080c, 0x5608, 0x0120, 0x2009, 0x000a, 0x0804, 0x53aa,
++      0x00d6, 0x080c, 0x0e9d, 0x1128, 0x00de, 0x2009, 0x0002, 0x0804,
++      0x547a, 0x2d00, 0x00de, 0x6806, 0x00d6, 0x2068, 0x20a9, 0x002b,
++      0x20e1, 0x0001, 0x2c98, 0x9de8, 0x0002, 0x20e9, 0x0001, 0x2da0,
++      0x4003, 0x20a9, 0x0004, 0x9d80, 0x0006, 0x20a0, 0x9c80, 0x0006,
++      0x2098, 0x080c, 0x504f, 0x20a9, 0x0004, 0x9d80, 0x000a, 0x20a0,
++      0x9c80, 0x000a, 0x2098, 0x080c, 0x504f, 0x00de, 0x687b, 0x0000,
++      0x6883, 0x0000, 0x6897, 0x4000, 0xd684, 0x1170, 0x2001, 0x1153,
++      0x2004, 0xd0b4, 0x1118, 0x689b, 0x000b, 0x0400, 0x6000, 0xd08c,
++      0x0118, 0x689b, 0x000c, 0x00d0, 0x6004, 0x9084, 0x00ff, 0x9086,
++      0x0006, 0x0118, 0x689b, 0x0009, 0x0088, 0x7800, 0x9086, 0x0003,
++      0x0118, 0x689b, 0x0007, 0x0050, 0x080c, 0xaabe, 0x1904, 0x53d9,
++      0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x53ac, 0x687b, 0x0030,
++      0x6897, 0x4005, 0x6804, 0x2009, 0x002b, 0x6aa0, 0x6b9c, 0x6ca8,
++      0x6da4, 0x2031, 0x0000, 0x2039, 0x0001, 0x2041, 0x1078, 0x080c,
++      0x9367, 0x1904, 0x53d9, 0x2009, 0x0002, 0x0c20, 0x2001, 0x0028,
++      0x900e, 0x0804, 0x53da, 0x2009, 0x110c, 0x210c, 0xd18c, 0x0118,
++      0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010,
++      0x2001, 0x0029, 0x900e, 0x2001, 0x0029, 0x900e, 0x0804, 0x53da,
++      0x080c, 0x2d84, 0x0804, 0x53db, 0x080c, 0x460a, 0x0804, 0x53db,
++      0x080c, 0x3a74, 0x0804, 0x53db, 0x080c, 0x3e74, 0x0804, 0x53db,
++      0x080c, 0x408f, 0x0804, 0x53db, 0x080c, 0x4291, 0x0804, 0x53db,
++      0x080c, 0x448a, 0x0804, 0x53db, 0x080c, 0x2f43, 0x0804, 0x53db,
++      0x6974, 0x6e78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1648, 0x918c,
++      0xff00, 0x810f, 0x9182, 0x00ff, 0x1280, 0x9188, 0x1000, 0x2104,
++      0x9065, 0x0158, 0x6004, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1148,
++      0x00e1, 0x080c, 0x5721, 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e,
++      0x0090, 0x9082, 0x0006, 0x1240, 0x6100, 0xd1fc, 0x0d88, 0x2001,
++      0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018,
++      0x2001, 0x0029, 0x900e, 0x9005, 0x0005, 0x0126, 0x2091, 0x8000,
++      0x6050, 0x900d, 0x0138, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
++      0x012e, 0x0005, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0cc0,
++      0x0126, 0x2091, 0x8000, 0x604c, 0x9005, 0x0170, 0x00e6, 0x2071,
++      0x1304, 0x7004, 0x9086, 0x0002, 0x0168, 0x00ee, 0x604c, 0x6802,
++      0x2d00, 0x604e, 0x012e, 0x0005, 0x2d00, 0x6052, 0x604e, 0x6803,
++      0x0000, 0x0cc0, 0x701c, 0x9c06, 0x1d80, 0x604c, 0x2070, 0x7000,
++      0x6802, 0x2d00, 0x7002, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091,
++      0x8000, 0x604c, 0x906d, 0x0130, 0x6800, 0x9005, 0x1108, 0x6052,
++      0x604e, 0x9d05, 0x012e, 0x0005, 0x604c, 0x906d, 0x0130, 0x6800,
++      0x9005, 0x1108, 0x6052, 0x604e, 0x9d05, 0x0005, 0x0126, 0x00c6,
++      0x0026, 0x2091, 0x8000, 0x6210, 0x2260, 0x6200, 0x9005, 0x0110,
++      0xc285, 0x0008, 0xc284, 0x6202, 0x002e, 0x00ce, 0x012e, 0x0005,
++      0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2260, 0x6204, 0x0006,
++      0x9086, 0x0006, 0x1170, 0x609c, 0xd0ac, 0x0158, 0x080c, 0x58cb,
++      0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011,
++      0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0x6206, 0x0006, 0x9086,
++      0x0006, 0x1120, 0x6290, 0x82ff, 0x090c, 0x0d7e, 0x000e, 0x00ce,
++      0x012e, 0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2260,
++      0x6204, 0x0006, 0x9086, 0x0006, 0x1168, 0x609c, 0xd0a4, 0x0150,
++      0x080c, 0x58c6, 0x1138, 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110,
++      0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, 0x9215, 0x6206,
++      0x00ce, 0x012e, 0x0005, 0x0026, 0x9182, 0x00ff, 0x0218, 0x9085,
++      0x0001, 0x00a0, 0x9190, 0x1000, 0x2204, 0x9065, 0x1170, 0x0016,
++      0x00d6, 0x080c, 0x0e9d, 0x2d60, 0x00de, 0x001e, 0x0d80, 0x2c00,
++      0x2012, 0x9006, 0x60a6, 0x080c, 0x5100, 0x9006, 0x002e, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x0026, 0x9182, 0x00ff, 0x0218, 0x9085,
++      0x0001, 0x0458, 0x00d6, 0x9190, 0x1000, 0x2204, 0x906d, 0x0518,
++      0x2013, 0x0000, 0x00d6, 0x00c6, 0x2d60, 0x60a4, 0x906d, 0x0110,
++      0x080c, 0x0ecf, 0x00ce, 0x00de, 0x00d6, 0x00c6, 0x68ac, 0x2060,
++      0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2068, 0x080c, 0xa942,
++      0x0110, 0x080c, 0x0edf, 0x080c, 0x8ed9, 0x00ce, 0x0c88, 0x00ce,
++      0x00de, 0x080c, 0x0ecf, 0x00de, 0x9006, 0x002e, 0x012e, 0x0005,
++      0x0016, 0x9182, 0x00ff, 0x0218, 0x9085, 0x0001, 0x0030, 0x9188,
++      0x1000, 0x2104, 0x9065, 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6,
++      0x0156, 0x0136, 0x0146, 0x9006, 0x600a, 0x600e, 0x6000, 0xc08c,
++      0x6002, 0x080c, 0x62e4, 0x1520, 0x60a0, 0x9086, 0x007e, 0x0130,
++      0x2001, 0x1136, 0x2004, 0xd0ac, 0x11d8, 0x0078, 0x7040, 0xd0e4,
++      0x01b8, 0x00c6, 0x2061, 0x12bc, 0x7048, 0x2062, 0x704c, 0x6006,
++      0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140,
++      0x9005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069, 0x1100, 0x68ae,
++      0x7040, 0x605e, 0x7048, 0x6062, 0x6138, 0x910a, 0x0208, 0x603a,
++      0x704c, 0x6066, 0x20e1, 0x0000, 0x2099, 0x0276, 0x9c88, 0x000a,
++      0x20e9, 0x0001, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a,
++      0x9c88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200,
++      0x6817, 0x0001, 0x7040, 0x606a, 0x7144, 0x616e, 0x7048, 0x6072,
++      0x7050, 0x6076, 0x2069, 0x0200, 0x6817, 0x0000, 0x60a0, 0x9086,
++      0x007e, 0x1110, 0x7144, 0x616e, 0x9182, 0x0211, 0x1218, 0x2009,
++      0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0,
++      0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349,
++      0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009,
++      0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010,
++      0x2009, 0x0002, 0x6192, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
++      0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0x6896, 0x703c,
++      0x689a, 0x7054, 0x689e, 0x6a00, 0x2009, 0x1172, 0x210c, 0xd0bc,
++      0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0120,
++      0xd1e4, 0x0110, 0xc2bd, 0x0008, 0xc2bc, 0x6a02, 0x00ee, 0x002e,
++      0x001e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0x906d,
++      0x01c0, 0x6900, 0x81ff, 0x1540, 0x6a04, 0x9282, 0x0010, 0x1648,
++      0x9d88, 0x0004, 0x20a9, 0x0010, 0x2104, 0x9086, 0xffff, 0x0128,
++      0x8108, 0x1f04, 0x56dc, 0x080c, 0x0d7e, 0x260a, 0x8210, 0x6a06,
++      0x0098, 0x080c, 0x0eb6, 0x01a8, 0x2d00, 0x60a6, 0x6803, 0x0000,
++      0x9d88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04,
++      0x56f4, 0x6807, 0x0001, 0x6e12, 0x9085, 0x0001, 0x012e, 0x00de,
++      0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6, 0x60a4,
++      0x900d, 0x01a0, 0x2168, 0x6800, 0x9005, 0x1160, 0x080c, 0x5791,
++      0x1168, 0x200b, 0xffff, 0x6804, 0x908a, 0x0002, 0x0218, 0x8001,
++      0x6806, 0x0020, 0x080c, 0x0ecf, 0x60a7, 0x0000, 0x00de, 0x012e,
++      0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x758b, 0x012e, 0x0005,
++      0x901e, 0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000,
++      0x604c, 0x2068, 0x6000, 0xd0dc, 0x1170, 0x8dff, 0x01f8, 0x83ff,
++      0x0120, 0x6878, 0x9606, 0x0158, 0x0030, 0x686c, 0x9406, 0x1118,
++      0x6870, 0x9506, 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, 0x080c,
++      0x895e, 0x6a00, 0x604c, 0x9d06, 0x1110, 0x624e, 0x0018, 0x9180,
++      0x0000, 0x2202, 0x82ff, 0x1110, 0x6152, 0x8dff, 0x012e, 0x0005,
++      0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x57d6,
++      0x0118, 0x080c, 0xa9f4, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c,
++      0x57d6, 0x0118, 0x080c, 0xa987, 0x0010, 0x9085, 0x0001, 0x0005,
++      0x080c, 0x57d6, 0x0118, 0x080c, 0xa9d7, 0x0010, 0x9085, 0x0001,
++      0x0005, 0x080c, 0x57d6, 0x0118, 0x080c, 0xa9a3, 0x0010, 0x9085,
++      0x0001, 0x0005, 0x080c, 0x57d6, 0x0118, 0x080c, 0xaa10, 0x0010,
++      0x9085, 0x0001, 0x0005, 0x60a4, 0x900d, 0x1118, 0x9085, 0x0001,
++      0x0005, 0x00e6, 0x2170, 0x7000, 0x9005, 0x1168, 0x20a9, 0x0010,
++      0x9e88, 0x0004, 0x2104, 0x9606, 0x0130, 0x8108, 0x1f04, 0x579a,
++      0x9085, 0x0001, 0x0008, 0x9006, 0x00ee, 0x0005, 0x00d6, 0x0126,
++      0x2091, 0x8000, 0x60a4, 0x906d, 0x1128, 0x080c, 0x0eb6, 0x01a0,
++      0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807, 0x0000, 0x9d88, 0x0004,
++      0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x57ba, 0x9085,
++      0x0001, 0x012e, 0x00de, 0x0005, 0x9006, 0x0cd8, 0x00d6, 0x0126,
++      0x2091, 0x8000, 0x60a4, 0x906d, 0x0130, 0x60a7, 0x0000, 0x080c,
++      0x0ecf, 0x9085, 0x0001, 0x012e, 0x00de, 0x0005, 0x609c, 0xd0a4,
++      0x0005, 0x00f6, 0x080c, 0x62e4, 0x01b0, 0x71c0, 0x81ff, 0x1198,
++      0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004,
++      0x907d, 0x0148, 0x7804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118,
++      0x7800, 0xc0ed, 0x7802, 0x2079, 0x1152, 0x7804, 0xd0a4, 0x01e0,
++      0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5608,
++      0x1168, 0x6004, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118,
++      0x9086, 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, 0x8108,
++      0x1f04, 0x57fd, 0x00ce, 0x015e, 0x080c, 0x588e, 0x0120, 0x2001,
++      0x12bf, 0x200c, 0x0038, 0x2079, 0x1152, 0x7804, 0xd0a4, 0x0130,
++      0x2009, 0x07d0, 0x2011, 0x5828, 0x080c, 0x7283, 0x00fe, 0x0005,
++      0x2011, 0x5828, 0x080c, 0x71fa, 0x080c, 0x588e, 0x01d8, 0x2001,
++      0x107e, 0x2004, 0x9080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x080c,
++      0x58cb, 0x0130, 0x2009, 0x07d0, 0x2011, 0x5828, 0x080c, 0x7283,
++      0x00e6, 0x2071, 0x1100, 0x9006, 0x7076, 0x707a, 0x080c, 0x2679,
++      0x00ee, 0x0498, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016,
++      0x080c, 0x5608, 0x1520, 0x6000, 0xd0ec, 0x0508, 0x0046, 0x62a0,
++      0x9294, 0x00ff, 0x8227, 0x9006, 0x2009, 0x0029, 0x080c, 0xc12f,
++      0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0x9084, 0x00ff, 0x9085,
++      0x0700, 0x6006, 0x2019, 0x0029, 0x080c, 0x76f0, 0x0076, 0x903e,
++      0x080c, 0x75ee, 0x900e, 0x080c, 0xbec2, 0x007e, 0x004e, 0x001e,
++      0x8108, 0x1f04, 0x584f, 0x00ce, 0x015e, 0x0005, 0x00c6, 0x6010,
++      0x2060, 0x6000, 0xc0ec, 0x6002, 0x00ce, 0x0005, 0x7810, 0x2004,
++      0xd0ac, 0x0005, 0x7810, 0x2004, 0xd0bc, 0x0005, 0x00f6, 0x2001,
++      0x107e, 0x2004, 0x907d, 0x0110, 0x7800, 0xd0ec, 0x00fe, 0x0005,
++      0x0126, 0x0026, 0x2091, 0x8000, 0x0006, 0x62a0, 0x9290, 0x1000,
++      0x2204, 0x9c06, 0x190c, 0x0d7e, 0x000e, 0x6200, 0x9005, 0x0110,
++      0xc2fd, 0x0008, 0xc2fc, 0x6202, 0x002e, 0x012e, 0x0005, 0x2011,
++      0x1136, 0x2204, 0xd0cc, 0x0138, 0x2001, 0x12bd, 0x200c, 0x2011,
++      0x58bc, 0x080c, 0x7283, 0x0005, 0x2011, 0x58bc, 0x080c, 0x71fa,
++      0x2011, 0x1136, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x2001, 0x1153,
++      0x2004, 0xd0ac, 0x0005, 0x2001, 0x1153, 0x2004, 0xd0a4, 0x0005,
++      0x2071, 0x1240, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012,
++      0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2071, 0x1286, 0x7003,
++      0x1240, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0x0001, 0x7013,
++      0x1266, 0x7017, 0x0020, 0x701b, 0x0040, 0x703b, 0x0000, 0x2001,
++      0x1262, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1263,
++      0x900e, 0x710a, 0x2001, 0x1153, 0x2004, 0xd0fc, 0x1148, 0x2001,
++      0x1153, 0x2004, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x04d8,
++      0x2001, 0x1172, 0x200c, 0x9184, 0x000f, 0x0002, 0x58ff, 0x58ff,
++      0x58ff, 0x58ff, 0x58ff, 0x591e, 0x592c, 0x58ff, 0x592f, 0x58ff,
++      0x58ff, 0x58ff, 0x58ff, 0x58ff, 0x58ff, 0x58ff, 0x7003, 0x0003,
++      0x2009, 0x1173, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110,
++      0x2001, 0x0002, 0x7006, 0x00b8, 0x7003, 0x0005, 0x0c88, 0x7003,
++      0x0004, 0x0136, 0x0146, 0x0156, 0x20e1, 0x0001, 0x2099, 0x1176,
++      0x20e9, 0x0001, 0x20a1, 0x1290, 0x20a9, 0x0004, 0x4003, 0x015e,
++      0x014e, 0x013e, 0x0000, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071,
++      0x0050, 0x684c, 0x9005, 0x1158, 0x00e6, 0x2071, 0x1240, 0x7028,
++      0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, 0x0804, 0x5998, 0x6844,
++      0x9005, 0x01d8, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011,
++      0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
++      0x3e08, 0x1f04, 0x595e, 0x015e, 0x6a60, 0x9200, 0x7002, 0x6864,
++      0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6860, 0x7002, 0x6864,
++      0x7006, 0x6868, 0x700a, 0x686c, 0x700e, 0x6844, 0x9005, 0x1110,
++      0x7012, 0x7016, 0x684c, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e,
++      0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071, 0x1240, 0x7028,
++      0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006,
++      0x00ee, 0x0005, 0x6868, 0xd0fc, 0x11d0, 0x00e6, 0x0026, 0x2001,
++      0x1263, 0x2004, 0x9005, 0x0904, 0x5b7b, 0x687c, 0xd0bc, 0x1904,
++      0x5b7b, 0x6978, 0x6874, 0x9105, 0x1904, 0x5b7b, 0x2001, 0x1263,
++      0x2004, 0x0002, 0x5b7b, 0x59dc, 0x5a16, 0x5a16, 0x5efd, 0x0005,
++      0x6868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0x2009, 0x1263, 0x210c,
++      0x81ff, 0x0904, 0x5b7b, 0x687c, 0xd0cc, 0x0904, 0x5b7b, 0x6880,
++      0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x5b7b, 0x9186, 0x0003,
++      0x0904, 0x5a16, 0x9186, 0x0004, 0x0904, 0x5efd, 0x684f, 0x8021,
++      0x6853, 0x0017, 0x0028, 0x0005, 0x684f, 0x8020, 0x6853, 0x0016,
++      0x2071, 0x1240, 0x701c, 0x9005, 0x1904, 0x5d24, 0x0e04, 0x5d6d,
++      0x2071, 0x0000, 0x684c, 0x7082, 0x6850, 0x7032, 0x686c, 0x7086,
++      0x7036, 0x6870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
++      0xd084, 0x190c, 0x0fcd, 0x2071, 0x1100, 0x2011, 0x0001, 0x6804,
++      0x900d, 0x702c, 0x1148, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x9200,
++      0x70be, 0x002e, 0x00ee, 0x0005, 0x00d6, 0x2168, 0x6904, 0x206a,
++      0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x00de, 0x0c68, 0x684f, 0x0000,
++      0x00f6, 0x2079, 0x0050, 0x2071, 0x1240, 0x206b, 0x0000, 0x7010,
++      0x9005, 0x1904, 0x5b0a, 0x782c, 0x908c, 0x0780, 0x190c, 0x5f3b,
++      0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x5a34, 0x5b0a,
++      0x5a5a, 0x5aa3, 0x080c, 0x0d7e, 0x2071, 0x1100, 0x8d07, 0x8005,
++      0x8005, 0xc0d5, 0x7822, 0x6804, 0x900d, 0x1170, 0x2071, 0x1317,
++      0x703c, 0x9005, 0x1328, 0x2001, 0x1264, 0x2004, 0x8005, 0x703e,
++      0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2168, 0x6904,
++      0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200,
++      0x70be, 0x0c20, 0x2071, 0x1100, 0x8d07, 0x8005, 0x8005, 0xc0d5,
++      0x7822, 0x6804, 0x900d, 0x1588, 0x7824, 0x00e6, 0x2071, 0x0040,
++      0x712c, 0xd19c, 0x1148, 0x2009, 0x112f, 0x210c, 0x918a, 0x0010,
++      0x0218, 0x7022, 0x00ee, 0x0060, 0x00ee, 0xc0d4, 0x8006, 0x8006,
++      0x806f, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x8000, 0x70be,
++      0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x19e8, 0x2071,
++      0x1317, 0x703c, 0x9005, 0x1328, 0x2001, 0x1264, 0x2004, 0x8005,
++      0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2168,
++      0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
++      0x9200, 0x70be, 0x0808, 0x00d6, 0x00e6, 0x7824, 0xc0d4, 0x8006,
++      0x8006, 0x806f, 0x2071, 0x1100, 0x702c, 0x206a, 0x2d00, 0x702e,
++      0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b,
++      0xd0a4, 0x1d58, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b,
++      0xd09c, 0x11b8, 0x00de, 0x8d07, 0x8005, 0x8005, 0xc0d5, 0x7822,
++      0x6804, 0x900d, 0x1560, 0x2071, 0x1317, 0x703c, 0x9005, 0x1328,
++      0x2001, 0x1264, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee,
++      0x0005, 0x00de, 0x2d08, 0x7010, 0x8000, 0x7012, 0x7018, 0x906d,
++      0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x2168, 0x6804, 0x900d,
++      0x1170, 0x2071, 0x1317, 0x703c, 0x9005, 0x1328, 0x2001, 0x1264,
++      0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071,
++      0x1100, 0x9016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00,
++      0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x00fe, 0x002e,
++      0x00ee, 0x0005, 0x2d08, 0x7010, 0x8000, 0x7012, 0x7018, 0x906d,
++      0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x2168, 0x6804, 0x900d,
++      0x1904, 0x5b63, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c,
++      0x11b0, 0x701c, 0x906d, 0x0198, 0x7010, 0x8001, 0x7012, 0x1108,
++      0x701a, 0x2d04, 0x701e, 0x8d07, 0x8005, 0x8005, 0xc0d5, 0x7822,
++      0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c, 0x0d50, 0x782c,
++      0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x01b8, 0x00e6, 0x7824,
++      0xc0d4, 0x8006, 0x8006, 0x806f, 0x2071, 0x1100, 0x702c, 0x206a,
++      0x2d00, 0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780,
++      0x190c, 0x5f3b, 0xd0a4, 0x1d58, 0x00ee, 0x2071, 0x1317, 0x703c,
++      0x9005, 0x1328, 0x2001, 0x1264, 0x2004, 0x8005, 0x703e, 0x00fe,
++      0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1100, 0x9016, 0x702c,
++      0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e,
++      0x70bc, 0x9200, 0x70be, 0x00ee, 0x0804, 0x5b1a, 0x6868, 0xd0fc,
++      0x1500, 0x00e6, 0x0026, 0x684f, 0x0000, 0x00f6, 0x2079, 0x0050,
++      0x2071, 0x1240, 0x206b, 0x0000, 0x7010, 0x9005, 0x1904, 0x5c9c,
++      0x782c, 0x908c, 0x0780, 0x190c, 0x5f3b, 0x8004, 0x8004, 0x8004,
++      0x9084, 0x0003, 0x0002, 0x5b9a, 0x5c9c, 0x5bb6, 0x5c29, 0x080c,
++      0x0d7e, 0x0005, 0x2071, 0x1100, 0x8d07, 0x8005, 0x8005, 0xc0d5,
++      0x7822, 0x6804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005,
++      0x9016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
++      0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0c70, 0x2071, 0x1100,
++      0x8d07, 0x8005, 0x8005, 0xc0d5, 0x7822, 0x6804, 0x900d, 0x1904,
++      0x5c1a, 0x7830, 0x8007, 0x9084, 0x001f, 0x9082, 0x0005, 0x1220,
++      0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040,
++      0x712c, 0xd19c, 0x1148, 0x2009, 0x112f, 0x210c, 0x918a, 0x0010,
++      0x0218, 0x7022, 0x00ee, 0x0060, 0x00ee, 0xc0d4, 0x8006, 0x8006,
++      0x806f, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x8000, 0x70be,
++      0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x19e8, 0x0e04,
++      0x5c11, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000,
++      0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x1251, 0x200c, 0xc184,
++      0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++      0x0fcd, 0x2009, 0x1262, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee,
++      0x0005, 0x2001, 0x1251, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e,
++      0x00ee, 0x0005, 0x9016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210,
++      0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x0804,
++      0x5bcc, 0x00d6, 0x00e6, 0x7824, 0xc0d4, 0x8006, 0x8006, 0x806f,
++      0x2071, 0x1100, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x8000,
++      0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x1d58,
++      0x00ee, 0x0e04, 0x5c71, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
++      0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084,
++      0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++      0x0fcd, 0x2009, 0x1262, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780,
++      0x190c, 0x5f3b, 0xd09c, 0x1188, 0x00de, 0x8d07, 0x8005, 0x8005,
++      0xc0d5, 0x7822, 0x6804, 0x900d, 0x11e0, 0x00fe, 0x002e, 0x00ee,
++      0x0005, 0x7044, 0xc085, 0x7046, 0x0c40, 0x00de, 0x2d08, 0x7010,
++      0x8000, 0x7012, 0x7018, 0x906d, 0x711a, 0x0110, 0x6902, 0x0008,
++      0x711e, 0x2168, 0x6804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee,
++      0x0005, 0x2071, 0x1100, 0x9016, 0x702c, 0x2168, 0x6904, 0x206a,
++      0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be,
++      0x00fe, 0x002e, 0x00ee, 0x0005, 0x2d08, 0x7010, 0x8000, 0x7012,
++      0x7018, 0x906d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x2168,
++      0x6804, 0x900d, 0x1904, 0x5d11, 0x782c, 0x9094, 0x0780, 0x190c,
++      0x5f3b, 0xd09c, 0x11c8, 0x701c, 0x906d, 0x01b0, 0x684c, 0x9005,
++      0x1198, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0x2d04, 0x701e,
++      0x8d07, 0x8005, 0x8005, 0xc0d5, 0x7822, 0x782c, 0x9094, 0x0780,
++      0x190c, 0x5f3b, 0xd09c, 0x0d38, 0x782c, 0x9094, 0x0780, 0x190c,
++      0x5f3b, 0xd0a4, 0x05d0, 0x00e6, 0x7824, 0xc0d4, 0x8006, 0x8006,
++      0x806f, 0x2071, 0x1100, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc,
++      0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4,
++      0x1d58, 0x00ee, 0x0e04, 0x5d0a, 0x7838, 0x7938, 0x910e, 0x1de0,
++      0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044,
++      0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
++      0x190c, 0x0fcd, 0x2009, 0x1262, 0x200b, 0x0000, 0x00fe, 0x002e,
++      0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e, 0x00ee,
++      0x0005, 0x00e6, 0x2071, 0x1100, 0x9016, 0x702c, 0x2168, 0x6904,
++      0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200,
++      0x70be, 0x00ee, 0x0804, 0x5cac, 0x2071, 0x1240, 0x206b, 0x0000,
++      0x2d08, 0x7010, 0x8000, 0x7012, 0x7018, 0x906d, 0x711a, 0x0110,
++      0x6902, 0x0008, 0x711e, 0x2168, 0x6804, 0x900d, 0x1128, 0x1e04,
++      0x5d4d, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1100, 0x9016, 0x702c,
++      0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e,
++      0x70bc, 0x9200, 0x70be, 0x0e04, 0x5d39, 0x2071, 0x1240, 0x701c,
++      0x2068, 0x684c, 0x900d, 0x0d28, 0x2071, 0x0000, 0x7182, 0x6850,
++      0x7032, 0x686c, 0x7086, 0x7036, 0x6870, 0x708a, 0x2091, 0x4080,
++      0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd, 0x2071, 0x1240,
++      0x080c, 0x5f27, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1240, 0x206b,
++      0x0000, 0x2d08, 0x7010, 0x8000, 0x7012, 0x7018, 0x906d, 0x711a,
++      0x0110, 0x6902, 0x0008, 0x711e, 0x2168, 0x6804, 0x900d, 0x1118,
++      0x002e, 0x00ee, 0x0005, 0x2071, 0x1100, 0x9016, 0x702c, 0x2168,
++      0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
++      0x9200, 0x70be, 0x002e, 0x00ee, 0x0005, 0x0006, 0x687c, 0x0006,
++      0x6867, 0x0103, 0x20a9, 0x001c, 0x9d80, 0x001d, 0x20a0, 0x9006,
++      0x20e9, 0x0001, 0x4004, 0x000e, 0x9084, 0x00ff, 0x687e, 0x000e,
++      0x687a, 0x6982, 0x0005, 0x2071, 0x1240, 0x7004, 0x0002, 0x5db7,
++      0x5db8, 0x5efc, 0x5eea, 0x5db5, 0x5efc, 0x080c, 0x0d7e, 0x0005,
++      0x2001, 0x1263, 0x2004, 0x0002, 0x5dc2, 0x5dc2, 0x5e1a, 0x5e1b,
++      0x5e85, 0x5e1b, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x5f40, 0x701c,
++      0x906d, 0x01e0, 0x684c, 0x9005, 0x01d8, 0x0e04, 0x5de6, 0x694c,
++      0x2071, 0x0000, 0x7182, 0x6850, 0x7032, 0x686c, 0x7086, 0x7036,
++      0x6870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
++      0x190c, 0x0fcd, 0x2071, 0x1240, 0x080c, 0x5f27, 0x012e, 0x0488,
++      0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c,
++      0x2071, 0x1240, 0x1528, 0x2071, 0x1240, 0x700f, 0x0001, 0x6964,
++      0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff,
++      0x8101, 0x0108, 0x710e, 0x8d07, 0x8005, 0x8005, 0xc0d5, 0x00d6,
++      0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1240, 0x701c, 0x2068,
++      0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0x9005, 0x1108, 0x701a,
++      0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x1317, 0x683c,
++      0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001, 0x1113,
++      0x2004, 0x2009, 0x13a1, 0x210c, 0x9102, 0x1500, 0x0126, 0x2091,
++      0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04,
++      0x5e4d, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012, 0x6883,
++      0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
++      0x0fcd, 0x2069, 0x1317, 0x683f, 0xffff, 0x012e, 0x00de, 0x0126,
++      0x2091, 0x8000, 0x1e0c, 0x5fb5, 0x701c, 0x906d, 0x0560, 0x2001,
++      0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c, 0x1518,
++      0x2071, 0x1240, 0x700f, 0x0001, 0x6964, 0x9184, 0x00ff, 0x9086,
++      0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e,
++      0x8d07, 0x8005, 0x8005, 0xc0d5, 0x00d6, 0x2069, 0x0050, 0x6822,
++      0x00de, 0x701c, 0x2068, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e,
++      0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000,
++      0x1e0c, 0x5f40, 0x701c, 0x906d, 0x0548, 0x684c, 0x9086, 0x0004,
++      0x1538, 0x0136, 0x0146, 0x0156, 0x2099, 0x1176, 0x20e1, 0x0001,
++      0x20a1, 0x1290, 0x20e9, 0x0001, 0x20a9, 0x0004, 0x4003, 0x015e,
++      0x014e, 0x013e, 0x2071, 0x1286, 0x9d80, 0x001b, 0x700f, 0x0001,
++      0x7012, 0x7017, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000, 0x2e10,
++      0x080c, 0x0f22, 0x2071, 0x1240, 0x7007, 0x0003, 0x012e, 0x0005,
++      0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd09c,
++      0x2071, 0x1240, 0x1d98, 0x2071, 0x1240, 0x700f, 0x0001, 0x6964,
++      0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff,
++      0x8101, 0x0108, 0x710e, 0x8d07, 0x8005, 0x8005, 0xc0d5, 0x00d6,
++      0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1240, 0x701c, 0x2068,
++      0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0x9005, 0x1978, 0x701a,
++      0x012e, 0x0005, 0x2001, 0x1288, 0x2004, 0x908e, 0x0100, 0x1120,
++      0x7007, 0x0001, 0x04a1, 0x0005, 0x908e, 0x0000, 0x0de0, 0x908e,
++      0x0200, 0x1dc8, 0x080c, 0x5f3b, 0x0005, 0x684f, 0x0004, 0x206b,
++      0x0000, 0x2d08, 0x2071, 0x1240, 0x7010, 0x8000, 0x7012, 0x7018,
++      0x906d, 0x711a, 0x0110, 0x6902, 0x0008, 0x711e, 0x2168, 0x6804,
++      0x900d, 0x1118, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1100, 0x9016,
++      0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8,
++      0x702e, 0x70bc, 0x9200, 0x70be, 0x002e, 0x00ee, 0x0005, 0x0126,
++      0x2091, 0x8000, 0x701c, 0x906d, 0x0160, 0x7010, 0x8001, 0x7012,
++      0x2d04, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x0ecf,
++      0x0005, 0x012e, 0x0005, 0x2011, 0x8004, 0x080c, 0x3f23, 0x0cf8,
++      0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01d8, 0xc084, 0x7046,
++      0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
++      0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
++      0xd084, 0x190c, 0x0fcd, 0x2009, 0x1262, 0x200b, 0x0000, 0x00fe,
++      0x0005, 0x782c, 0x9094, 0x0780, 0x19b1, 0xd0a4, 0x0dc0, 0x2001,
++      0x1263, 0x2004, 0x9086, 0x0004, 0x0140, 0x2009, 0x1262, 0x2104,
++      0x8000, 0x200a, 0x9082, 0x000f, 0x0e50, 0x00e6, 0x2071, 0x1100,
++      0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009,
++      0x112f, 0x210c, 0x918a, 0x0010, 0x0218, 0x7022, 0x00ee, 0x0060,
++      0x00ee, 0xc0d4, 0x8006, 0x8006, 0x806f, 0x702c, 0x206a, 0x2d00,
++      0x702e, 0x70bc, 0x8000, 0x70be, 0x782c, 0x9094, 0x0780, 0x190c,
++      0x5f3b, 0xd0a4, 0x19e8, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
++      0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080,
++      0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd, 0x2009, 0x1262,
++      0x200b, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0050,
++      0x7044, 0xd084, 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e,
++      0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
++      0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x0fcd,
++      0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4,
++      0x0db8, 0x00e6, 0x2071, 0x1100, 0x7824, 0xc0d4, 0x8006, 0x8006,
++      0x806f, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70bc, 0x8000, 0x70be,
++      0x782c, 0x9094, 0x0780, 0x190c, 0x5f3b, 0xd0a4, 0x1d68, 0x00d6,
++      0x2069, 0x0050, 0x693c, 0x2069, 0x1263, 0x6808, 0x690a, 0x2069,
++      0x1317, 0x9102, 0x1118, 0x683c, 0x9005, 0x1328, 0x2001, 0x1264,
++      0x200c, 0x810d, 0x693e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7090,
++      0x908a, 0x0029, 0x1a0c, 0x0d7e, 0x9082, 0x001d, 0x001b, 0x6027,
++      0x1e00, 0x0005, 0x60da, 0x6064, 0x6080, 0x60a8, 0x60c9, 0x6109,
++      0x611b, 0x6080, 0x60f1, 0x601f, 0x604d, 0x601e, 0x0005, 0x00d6,
++      0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518,
++      0x7093, 0x0028, 0x2069, 0x12c9, 0x2d04, 0x7002, 0x080c, 0x6404,
++      0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x7093, 0x0028, 0x2069,
++      0x12c9, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6,
++      0x0036, 0x0046, 0x0056, 0x2071, 0x1347, 0x080c, 0x1577, 0x005e,
++      0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200,
++      0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x7093, 0x0028,
++      0x2069, 0x12c9, 0x2d04, 0x7002, 0x080c, 0x6492, 0x6028, 0x9085,
++      0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c,
++      0x2401, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x618c, 0xd1d4,
++      0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7093, 0x0020, 0x080c,
++      0x618c, 0x0028, 0x7093, 0x001d, 0x0010, 0x7093, 0x001f, 0x0005,
++      0x2001, 0x0088, 0x080c, 0x2401, 0x6124, 0xd1cc, 0x11d8, 0xd1dc,
++      0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001,
++      0x600c, 0xc0b4, 0x600e, 0x080c, 0x6314, 0x2001, 0x0080, 0x080c,
++      0x2401, 0x7093, 0x0028, 0x0058, 0x7093, 0x001e, 0x0040, 0x7093,
++      0x001d, 0x0028, 0x7093, 0x0020, 0x0010, 0x7093, 0x001f, 0x0005,
++      0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6314, 0x2001,
++      0x0080, 0x080c, 0x2401, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158,
++      0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x7093, 0x0028, 0x0040,
++      0x7093, 0x001e, 0x0028, 0x7093, 0x001d, 0x0010, 0x7093, 0x001f,
++      0x0005, 0x2001, 0x00a0, 0x080c, 0x2401, 0x6124, 0xd1dc, 0x1138,
++      0xd1e4, 0x0138, 0x080c, 0x15a1, 0x7093, 0x001e, 0x0010, 0x7093,
++      0x001d, 0x0005, 0x080c, 0x6205, 0x6124, 0xd1dc, 0x1188, 0x080c,
++      0x618c, 0x0016, 0x080c, 0x15a1, 0x001e, 0xd1d4, 0x1128, 0xd1e4,
++      0x0138, 0x7093, 0x001e, 0x0020, 0x7093, 0x001f, 0x080c, 0x618c,
++      0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x2401, 0x000e, 0x6124,
++      0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140,
++      0x7093, 0x001e, 0x0028, 0x7093, 0x001d, 0x0010, 0x7093, 0x0021,
++      0x0005, 0x080c, 0x6205, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128,
++      0xd1e4, 0x0140, 0x7093, 0x001e, 0x0028, 0x7093, 0x001d, 0x0010,
++      0x7093, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2401,
++      0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128,
++      0xd1e4, 0x0158, 0x7093, 0x001e, 0x0040, 0x7093, 0x001d, 0x0028,
++      0x7093, 0x0020, 0x0010, 0x7093, 0x001f, 0x0005, 0x0016, 0x00c6,
++      0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
++      0x1100, 0x2091, 0x8000, 0x080c, 0x62e4, 0x11f8, 0x2001, 0x110c,
++      0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c,
++      0x2340, 0x6024, 0xd0cc, 0x0168, 0x2001, 0x00a0, 0x080c, 0x2401,
++      0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001,
++      0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6300, 0x0150,
++      0x080c, 0x62f6, 0x1138, 0x2001, 0x0001, 0x080c, 0x1f11, 0x080c,
++      0x62be, 0x00a0, 0x080c, 0x6202, 0x0178, 0x2001, 0x0001, 0x080c,
++      0x1f11, 0x7090, 0x9086, 0x001e, 0x0120, 0x7090, 0x9086, 0x0022,
++      0x1118, 0x7093, 0x0025, 0x0010, 0x7093, 0x0021, 0x012e, 0x00ee,
++      0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x619d, 0x080c,
++      0x72bf, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x619d,
++      0x080c, 0x72b6, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016,
++      0x080c, 0x85a2, 0x2071, 0x1100, 0x080c, 0x6136, 0x001e, 0x00fe,
++      0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6,
++      0x00f6, 0x0126, 0x080c, 0x85a2, 0x2061, 0x0100, 0x2069, 0x0140,
++      0x2071, 0x1100, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011,
++      0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec, 0x080c,
++      0x87a2, 0x080c, 0x7271, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e,
++      0x60e3, 0x0000, 0x080c, 0xc44e, 0x080c, 0xc469, 0x2009, 0x0004,
++      0x080c, 0x2355, 0x080c, 0x2261, 0x2001, 0x1100, 0x2003, 0x0004,
++      0x6027, 0x0008, 0x080c, 0x0b68, 0x2001, 0x0001, 0x080c, 0x1f11,
++      0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
++      0x0005, 0x0026, 0x00e6, 0x2011, 0x61aa, 0x2071, 0x1317, 0x701c,
++      0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee,
++      0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe,
++      0x9086, 0x00c0, 0x0170, 0x2001, 0x00c0, 0x080c, 0x2401, 0x0156,
++      0x20a9, 0x002d, 0x1d04, 0x6212, 0x2091, 0x6000, 0x1f04, 0x6212,
++      0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069,
++      0x0140, 0x2071, 0x1100, 0x2001, 0x12a8, 0x200c, 0x9186, 0x0000,
++      0x0158, 0x9186, 0x0001, 0x0158, 0x9186, 0x0002, 0x0158, 0x9186,
++      0x0003, 0x0158, 0x0804, 0x62ac, 0x7093, 0x0022, 0x0040, 0x7093,
++      0x0021, 0x0028, 0x7093, 0x0023, 0x0010, 0x7093, 0x0024, 0x60e3,
++      0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x1fb8, 0x0026,
++      0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec,
++      0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e, 0x002e,
++      0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b,
++      0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024,
++      0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, 0x62ba, 0x6800, 0x9084,
++      0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2340, 0x6904, 0xd1d4, 0x1140,
++      0x2001, 0x0100, 0x080c, 0x2401, 0x1f04, 0x6267, 0x080c, 0x633e,
++      0x012e, 0x015e, 0x080c, 0x62f6, 0x01a8, 0x6044, 0x9005, 0x0168,
++      0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x633e, 0x9006,
++      0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110,
++      0x080c, 0x633e, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130,
++      0x2009, 0x00c8, 0x2011, 0x61aa, 0x080c, 0x7283, 0x002e, 0x001e,
++      0x2001, 0x12a8, 0x2003, 0x0004, 0x080c, 0x6007, 0x080c, 0x62f6,
++      0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, 0x2001, 0x12a8,
++      0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6,
++      0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1100, 0x2001,
++      0x12a7, 0x2003, 0x0000, 0x2001, 0x1298, 0x2003, 0x0000, 0x9006,
++      0x7092, 0x60e2, 0x6886, 0x080c, 0x1fb8, 0x9006, 0x080c, 0x2401,
++      0x6043, 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f,
++      0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x12a7, 0x2004,
++      0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x2001, 0x1172, 0x2004,
++      0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001,
++      0x1172, 0x2004, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005,
++      0x0006, 0x2001, 0x1172, 0x2004, 0x9084, 0x0030, 0x9086, 0x0010,
++      0x000e, 0x0005, 0x0006, 0x2001, 0x1172, 0x2004, 0x9084, 0x0030,
++      0x9086, 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x110c,
++      0x2004, 0x908c, 0x0013, 0x0190, 0x9084, 0x0011, 0x0120, 0x080c,
++      0x1fd8, 0x900e, 0x0028, 0x080c, 0x58c6, 0x1dc8, 0x2009, 0x0002,
++      0x2019, 0x0028, 0x080c, 0x2831, 0x9006, 0x0019, 0x001e, 0x003e,
++      0x0005, 0x00e6, 0x2071, 0x110c, 0x2e04, 0x0118, 0x9085, 0x0010,
++      0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006,
++      0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006,
++      0x0016, 0x6138, 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052,
++      0x613a, 0x20a9, 0x0012, 0x1d04, 0x6353, 0x2091, 0x6000, 0x1f04,
++      0x6353, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400,
++      0x9084, 0xdfff, 0x6052, 0x613a, 0x001e, 0x602f, 0x0040, 0x602f,
++      0x0000, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e,
++      0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c,
++      0x1fb8, 0x2001, 0x00a0, 0x080c, 0x2401, 0x000e, 0x6052, 0x0005,
++      0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061,
++      0x0100, 0x2069, 0x0140, 0x2071, 0x1100, 0x6020, 0x9084, 0x0080,
++      0x0138, 0x2001, 0x110c, 0x200c, 0xc1c5, 0x2102, 0x0804, 0x63fc,
++      0x2001, 0x110c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff,
++      0x602a, 0x6027, 0x0200, 0x2001, 0x0090, 0x080c, 0x2401, 0x20a9,
++      0x0366, 0x6024, 0xd0cc, 0x1510, 0x1d04, 0x63a9, 0x2091, 0x6000,
++      0x1f04, 0x63a9, 0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002,
++      0x080c, 0x88ec, 0x080c, 0x87a2, 0x901e, 0x080c, 0x8847, 0x2001,
++      0x00a0, 0x080c, 0x2401, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001,
++      0x1100, 0x2003, 0x0001, 0x9085, 0x0001, 0x0470, 0x86ff, 0x1110,
++      0x080c, 0x15a1, 0x60e3, 0x0000, 0x2001, 0x1298, 0x2004, 0x080c,
++      0x1fb8, 0x60e2, 0x2001, 0x0080, 0x080c, 0x2401, 0x20a9, 0x0366,
++      0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2340, 0x6024, 0x910c,
++      0x0138, 0x1d04, 0x63e0, 0x2091, 0x6000, 0x1f04, 0x63e0, 0x0810,
++      0x6028, 0x9085, 0x1e00, 0x602a, 0x70ac, 0x9005, 0x1118, 0x6887,
++      0x0001, 0x0008, 0x6886, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e,
++      0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
++      0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1100, 0x2069,
++      0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904,
++      0x6458, 0x2001, 0x0088, 0x080c, 0x2401, 0x9006, 0x60e2, 0x6886,
++      0x080c, 0x1fb8, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808,
++      0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, 0x0400,
++      0x2069, 0x12c9, 0x7000, 0x206a, 0x7093, 0x0026, 0x7003, 0x0001,
++      0x20a9, 0x0002, 0x1d04, 0x643a, 0x2091, 0x6000, 0x1f04, 0x643a,
++      0x0804, 0x648a, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00,
++      0x2009, 0x1e00, 0x080c, 0x2340, 0x6024, 0x910c, 0x0528, 0x9084,
++      0x1a00, 0x1510, 0x1d04, 0x6446, 0x2091, 0x6000, 0x1f04, 0x6446,
++      0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c, 0x88ec,
++      0x080c, 0x87a2, 0x901e, 0x080c, 0x8847, 0x2001, 0x00a0, 0x080c,
++      0x2401, 0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003,
++      0x0001, 0x9085, 0x0001, 0x00b0, 0x2001, 0x0080, 0x080c, 0x2401,
++      0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac, 0x9005, 0x1118, 0x6887,
++      0x0001, 0x0008, 0x6886, 0x2001, 0x1298, 0x2004, 0x080c, 0x1fb8,
++      0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
++      0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
++      0x00e6, 0x2061, 0x0100, 0x2071, 0x1100, 0x6020, 0x9084, 0x00c0,
++      0x01e8, 0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c,
++      0x88ec, 0x080c, 0x87a2, 0x901e, 0x080c, 0x8847, 0x2069, 0x0140,
++      0x2001, 0x00a0, 0x080c, 0x2401, 0x2001, 0x12a8, 0x2003, 0x0001,
++      0x2001, 0x1100, 0x2003, 0x0001, 0x0804, 0x6529, 0x2001, 0x110c,
++      0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6192, 0x2069,
++      0x0140, 0x2001, 0x0080, 0x080c, 0x2401, 0x60e3, 0x0000, 0x2069,
++      0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, 0x6028,
++      0x9084, 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x12c9, 0x7000,
++      0x206a, 0x7093, 0x0027, 0x7003, 0x0001, 0x0804, 0x6529, 0x6027,
++      0x1e00, 0x2009, 0x1e00, 0x080c, 0x2340, 0x6024, 0x910c, 0x01c8,
++      0x9084, 0x1c00, 0x11b0, 0x1d04, 0x64e7, 0x0006, 0x0016, 0x00c6,
++      0x00d6, 0x00e6, 0x080c, 0x715a, 0x00ee, 0x00de, 0x00ce, 0x001e,
++      0x000e, 0x00e6, 0x2071, 0x1317, 0x7018, 0x00ee, 0x9005, 0x19f8,
++      0x0500, 0x0026, 0x2011, 0x61aa, 0x080c, 0x71fa, 0x2011, 0x619d,
++      0x080c, 0x72bf, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70ac,
++      0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x1298,
++      0x2004, 0x080c, 0x1fb8, 0x60e2, 0x2001, 0x110c, 0x200c, 0xc1b4,
++      0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e,
++      0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6,
++      0x2061, 0x0100, 0x2071, 0x1100, 0x7130, 0xd184, 0x1170, 0x080c,
++      0x2987, 0x0138, 0xc18d, 0x7132, 0x2011, 0x1153, 0x2214, 0xd2ac,
++      0x1120, 0x7030, 0xd08c, 0x0904, 0x658f, 0x2011, 0x1153, 0x220c,
++      0xd1a4, 0x0528, 0x0016, 0x2019, 0x000e, 0x080c, 0xc0b9, 0x0156,
++      0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080,
++      0x0188, 0x080c, 0x5608, 0x1170, 0x8127, 0x9006, 0x0016, 0x2009,
++      0x000e, 0x080c, 0xc12f, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c,
++      0x73af, 0x001e, 0x8108, 0x1f04, 0x655b, 0x015e, 0x001e, 0xd1ac,
++      0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x2831,
++      0x001e, 0x0068, 0x0156, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5608,
++      0x1110, 0x080c, 0x5100, 0x8108, 0x1f04, 0x6586, 0x015e, 0x080c,
++      0x15a1, 0x2011, 0x0003, 0x080c, 0x88e2, 0x2011, 0x0002, 0x080c,
++      0x88ec, 0x080c, 0x87a2, 0x0036, 0x901e, 0x080c, 0x8847, 0x003e,
++      0x60e3, 0x0000, 0x2001, 0x1100, 0x2003, 0x0001, 0x080c, 0x621a,
++      0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
++      0x2071, 0x120c, 0x7003, 0x0000, 0x7007, 0x0000, 0x708f, 0x0000,
++      0x7093, 0x0001, 0x70c7, 0x0000, 0x0005, 0x00e6, 0x2071, 0x0040,
++      0x6848, 0x9005, 0x1120, 0x9085, 0x0001, 0x0804, 0x660e, 0x6840,
++      0x9005, 0x01d8, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011,
++      0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
++      0x3e08, 0x1f04, 0x65ce, 0x015e, 0x6a50, 0x9200, 0x7002, 0x6854,
++      0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850, 0x7002, 0x6854,
++      0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840, 0x9005, 0x1110,
++      0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e,
++      0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001, 0x0004, 0x200c,
++      0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6, 0x2069, 0x120c,
++      0x6807, 0x0001, 0x00de, 0x080c, 0x6b26, 0x9006, 0x00ee, 0x0005,
++      0x2079, 0x0040, 0x2071, 0x120c, 0x7004, 0x0002, 0x6620, 0x6621,
++      0x6bb3, 0x66b3, 0x67a9, 0x661e, 0x661e, 0x67d2, 0x080c, 0x0d7e,
++      0x0005, 0x2079, 0x0040, 0x782c, 0x908c, 0x0780, 0x190c, 0x6bb4,
++      0xd0a4, 0x0508, 0x7824, 0xc0d4, 0x8006, 0x8006, 0x806f, 0x9006,
++      0x6802, 0x6806, 0x6864, 0x9084, 0x00ff, 0x908a, 0x0040, 0x12c0,
++      0x04d3, 0x2001, 0x1100, 0x200c, 0x9186, 0x0003, 0x1160, 0x7104,
++      0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, 0x9186, 0x0003,
++      0x19d0, 0x080c, 0x66b3, 0x782c, 0xd09c, 0x090c, 0x6b26, 0x0005,
++      0x9082, 0x005a, 0x1218, 0x2100, 0x0023, 0x0c18, 0x080c, 0x66ec,
++      0x0c90, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec,
++      0x66ec, 0x670e, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec,
++      0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec,
++      0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66f8, 0x66ec, 0x688e,
++      0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66f8, 0x68cf, 0x6910,
++      0x6957, 0x696b, 0x66ec, 0x66ec, 0x670e, 0x66f8, 0x66ec, 0x66ec,
++      0x6782, 0x6a16, 0x6a31, 0x66ec, 0x670e, 0x66ec, 0x66ec, 0x66ec,
++      0x66ec, 0x6778, 0x6a31, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec,
++      0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x6722, 0x66ec, 0x66ec, 0x66ec,
++      0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x6b59, 0x66ec,
++      0x66ec, 0x66ec, 0x66ec, 0x66ec, 0x6736, 0x66ec, 0x66ec, 0x66ec,
++      0x66ec, 0x66ec, 0x66ec, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003,
++      0x11b0, 0x782c, 0x080c, 0x6b52, 0xd0a4, 0x0188, 0x7824, 0xc0d4,
++      0x8006, 0x8006, 0x806f, 0x9006, 0x6802, 0x6806, 0x6864, 0x9084,
++      0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c38, 0x00e9, 0x080c,
++      0x6b26, 0x0005, 0x66ec, 0x66f8, 0x687a, 0x66ec, 0x66f8, 0x66ec,
++      0x66f8, 0x66f8, 0x66ec, 0x66f8, 0x687a, 0x66f8, 0x66f8, 0x66f8,
++      0x66f8, 0x66f8, 0x66ec, 0x66f8, 0x687a, 0x66ec, 0x66ec, 0x66f8,
++      0x66ec, 0x66ec, 0x66ec, 0x66f8, 0x00e6, 0x2071, 0x120c, 0x2009,
++      0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, 0x0005,
++      0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009, 0x0005,
++      0x7007, 0x0001, 0x6868, 0x9084, 0x00ff, 0x9105, 0x686a, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x0005, 0x6864, 0x8007,
++      0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804,
++      0x683b, 0x7007, 0x0003, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b,
++      0x683b, 0x0005, 0x6864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001,
++      0x1120, 0x7007, 0x0001, 0x0804, 0x6853, 0x7007, 0x0003, 0x7012,
++      0x2d00, 0x7016, 0x701a, 0x704b, 0x6853, 0x0005, 0x6864, 0x8007,
++      0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x66f4, 0x7007, 0x0001,
++      0x2009, 0x1133, 0x210c, 0x81ff, 0x11a8, 0x6868, 0x9084, 0x00ff,
++      0x686a, 0x6883, 0x0000, 0x080c, 0x52f4, 0x1108, 0x0005, 0x0126,
++      0x2091, 0x8000, 0x6867, 0x0139, 0x687a, 0x6982, 0x080c, 0x5b76,
++      0x012e, 0x0ca0, 0x6994, 0x9186, 0x0071, 0x0d38, 0x9186, 0x0064,
++      0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, 0x09f0, 0x9186,
++      0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, 0x005f, 0x09a8,
++      0x6897, 0x4005, 0x689b, 0x0001, 0x2001, 0x0030, 0x900e, 0x08b8,
++      0x687c, 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001,
++      0x0804, 0x6a48, 0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0x20e1,
++      0x0001, 0x20e9, 0x0001, 0x9080, 0x0030, 0x2098, 0x20a1, 0x1239,
++      0x4003, 0x6888, 0x7012, 0x9082, 0x0401, 0x1a04, 0x66fc, 0x6ab4,
++      0x928a, 0x0002, 0x1a04, 0x66fc, 0x82ff, 0x1138, 0x68b8, 0x69bc,
++      0x9105, 0x0118, 0x2001, 0x680e, 0x0018, 0x9280, 0x6804, 0x2005,
++      0x70ce, 0x7010, 0x9015, 0x0904, 0x67f0, 0x080c, 0x0e9d, 0x1118,
++      0x7007, 0x0004, 0x0005, 0x2d00, 0x7022, 0x70cc, 0x2060, 0xe000,
++      0x6866, 0xe004, 0x9d00, 0x709e, 0x709b, 0x0001, 0xe008, 0x920a,
++      0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296,
++      0x0004, 0x0108, 0x9108, 0x71a2, 0x810b, 0x71a6, 0x9e90, 0x0023,
++      0x080c, 0x0f22, 0x7094, 0x908e, 0x0100, 0x0170, 0x9086, 0x0200,
++      0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2068, 0x080c, 0x0ecf,
++      0x7014, 0x2068, 0x0804, 0x66fc, 0x7020, 0x2068, 0x7018, 0x6802,
++      0x6807, 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x67a9,
++      0x7014, 0x2068, 0x7007, 0x0001, 0x68b4, 0x9005, 0x1128, 0x68b8,
++      0x69bc, 0x9105, 0x0108, 0x00b1, 0x6864, 0x9084, 0x00ff, 0x9086,
++      0x001e, 0x0904, 0x6a48, 0x04b8, 0x6806, 0x680a, 0x0002, 0x001d,
++      0x0007, 0x0004, 0x000a, 0x001b, 0x0005, 0x0006, 0x000a, 0x001d,
++      0x0005, 0x0004, 0x00f6, 0x00e6, 0x00c6, 0x0076, 0x0066, 0x6fb8,
++      0x6ebc, 0x6804, 0x2060, 0x9cf0, 0x002d, 0x9cf8, 0x0033, 0x2009,
++      0x0005, 0x700c, 0x7816, 0x7008, 0x7812, 0x7004, 0x7806, 0x7000,
++      0x7802, 0x7e0e, 0x7f0a, 0x8109, 0x0128, 0x9ef2, 0x0004, 0x9ffa,
++      0x0006, 0x0c78, 0x6004, 0x9065, 0x1d30, 0x006e, 0x007e, 0x00ce,
++      0x00ee, 0x00fe, 0x0005, 0x2009, 0x1133, 0x210c, 0x81ff, 0x1178,
++      0x080c, 0x5151, 0x1108, 0x0005, 0x080c, 0x5d95, 0x0126, 0x2091,
++      0x8000, 0x080c, 0xac01, 0x080c, 0x5b76, 0x012e, 0x0ca0, 0x2001,
++      0x0028, 0x900e, 0x0c88, 0x2009, 0x1133, 0x210c, 0x81ff, 0x11d8,
++      0x6888, 0x9005, 0x01e0, 0x6883, 0x0000, 0x687c, 0xd0f4, 0x0120,
++      0x080c, 0x5250, 0x1138, 0x0005, 0x9006, 0x687a, 0x080c, 0x51e5,
++      0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0x687a, 0x6982, 0x080c,
++      0x5b76, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001,
++      0x0000, 0x0c80, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a,
++      0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, 0x0030, 0x7014,
++      0x2068, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x7007, 0x0001,
++      0x6974, 0x810f, 0x918c, 0x00ff, 0x6878, 0x9084, 0x00ff, 0x20a9,
++      0x0001, 0x9096, 0x0001, 0x01a8, 0x900e, 0x20a9, 0x00ff, 0x9096,
++      0x0002, 0x0178, 0x9005, 0x11f0, 0x6974, 0x810f, 0x918c, 0x00ff,
++      0x080c, 0x5608, 0x11b8, 0x0066, 0x6e80, 0x080c, 0x5703, 0x006e,
++      0x0088, 0x0046, 0x2011, 0x110c, 0x2224, 0xc484, 0x2412, 0x004e,
++      0x00c6, 0x080c, 0x5608, 0x1110, 0x080c, 0x57c6, 0x8108, 0x1f04,
++      0x68b9, 0x00ce, 0x687c, 0xd084, 0x1118, 0x080c, 0x0ecf, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x0005, 0x0126,
++      0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x58cb, 0x0580, 0x2061,
++      0x1354, 0x6100, 0xd184, 0x0178, 0x6888, 0x9084, 0x00ff, 0x1550,
++      0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, 0x6003, 0x0000,
++      0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0x6890, 0x9005, 0x1110,
++      0x2001, 0x001e, 0x8000, 0x6016, 0x6888, 0x9084, 0x00ff, 0x0178,
++      0x6006, 0x6888, 0x8007, 0x9084, 0x00ff, 0x0148, 0x600a, 0x6888,
++      0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, 0x6b10, 0x012e,
++      0x0804, 0x6b0a, 0x012e, 0x0804, 0x6b04, 0x012e, 0x0804, 0x6b07,
++      0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x58cb, 0x05e0,
++      0x2061, 0x1354, 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c,
++      0x1530, 0x6c78, 0x9484, 0x0003, 0x0170, 0x6988, 0x918c, 0x00ff,
++      0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, 0x8001, 0x1508,
++      0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, 0x6988, 0x810f,
++      0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, 0x9318, 0x0288,
++      0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, 0x0250, 0x6890,
++      0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, 0x012e, 0x0804,
++      0x6b10, 0x012e, 0x0804, 0x6b0d, 0x012e, 0x0804, 0x6b0a, 0x0126,
++      0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1354, 0x6300, 0xd38c,
++      0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x6b1e,
++      0x012e, 0x0804, 0x6b0d, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007,
++      0x0001, 0x687c, 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1354, 0x6000,
++      0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0x6888, 0x9005, 0x05c8,
++      0x688c, 0x9065, 0x0590, 0x2001, 0x1133, 0x2004, 0x9005, 0x0118,
++      0x080c, 0x8f09, 0x0068, 0x6017, 0x0400, 0x605b, 0x0000, 0x697c,
++      0xd1a4, 0x0110, 0x6980, 0x615a, 0x2009, 0x0041, 0x080c, 0x8f53,
++      0x6988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e,
++      0x2011, 0xfdff, 0x080c, 0x73af, 0x002e, 0x687c, 0xd0c4, 0x0148,
++      0x2061, 0x1354, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208,
++      0x600a, 0x00ce, 0x012e, 0x0804, 0x6b10, 0x00ce, 0x012e, 0x0804,
++      0x6b0a, 0x6984, 0x9186, 0x002e, 0x0d40, 0x9186, 0x002d, 0x0d28,
++      0x9186, 0x0045, 0x0528, 0x9186, 0x002a, 0x1130, 0x2001, 0x110c,
++      0x200c, 0xc194, 0x2102, 0x08c8, 0x9186, 0x0020, 0x0170, 0x9186,
++      0x0029, 0x1d18, 0x6974, 0x918c, 0xff00, 0x810f, 0x080c, 0x5608,
++      0x1960, 0x6000, 0xc0e4, 0x6002, 0x0840, 0x688c, 0x9065, 0x09a8,
++      0x6007, 0x0024, 0x2001, 0x12c0, 0x2004, 0x601a, 0x0804, 0x69a5,
++      0x688c, 0x9065, 0x0950, 0x00e6, 0x6890, 0x9075, 0x2001, 0x1133,
++      0x2004, 0x9005, 0x0150, 0x080c, 0x8f09, 0x8eff, 0x0118, 0x2e60,
++      0x080c, 0x8f09, 0x00ee, 0x0804, 0x69a5, 0x6024, 0xc0dc, 0xc0d5,
++      0x6026, 0x2e60, 0x6007, 0x003a, 0x68a0, 0x9005, 0x0130, 0x6007,
++      0x003b, 0x68a4, 0x602e, 0x68a8, 0x6016, 0x6003, 0x0001, 0x080c,
++      0x756e, 0x080c, 0x7aa4, 0x00ee, 0x0804, 0x69a5, 0x2061, 0x1354,
++      0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x6b1e, 0x0126, 0x2091,
++      0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x6b1e,
++      0x012e, 0x6883, 0x0016, 0x0804, 0x6b17, 0x6883, 0x0007, 0x0804,
++      0x6b17, 0x6864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138,
++      0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x66f4, 0x0040, 0x7007,
++      0x0003, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x6a48, 0x0005,
++      0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, 0x1100, 0x61cc,
++      0x81ff, 0x1904, 0x6aca, 0x6130, 0xd194, 0x1904, 0x6af4, 0x6878,
++      0x2070, 0x9e82, 0x15c0, 0x0a04, 0x6abe, 0x6060, 0x9e02, 0x1a04,
++      0x6abe, 0x7120, 0x9186, 0x0006, 0x1904, 0x6aad, 0x7010, 0x9005,
++      0x0904, 0x6aca, 0x2004, 0xd0e4, 0x1904, 0x6aef, 0x2061, 0x1354,
++      0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x1590, 0x7024, 0xd0dc,
++      0x1904, 0x6af7, 0x6883, 0x0000, 0x6803, 0x0000, 0x2d08, 0x7014,
++      0x9005, 0x1198, 0x7116, 0x687c, 0xd0f4, 0x1904, 0x6afa, 0x2001,
++      0x1153, 0x2004, 0xd09c, 0x1118, 0x687c, 0xc0cc, 0x687e, 0x2e60,
++      0x080c, 0x72d9, 0x012e, 0x00ee, 0x0005, 0x2068, 0x6800, 0x9005,
++      0x1de0, 0x6902, 0x2168, 0x687c, 0xd0f4, 0x1904, 0x6afa, 0x012e,
++      0x00ee, 0x0005, 0x012e, 0x00ee, 0x6883, 0x0006, 0x0804, 0x6b17,
++      0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8, 0x6974, 0x918c, 0xff00,
++      0x810f, 0x080c, 0x5608, 0x15d8, 0x6000, 0xd0e4, 0x15c0, 0x7120,
++      0x9186, 0x0007, 0x1118, 0x6883, 0x0002, 0x0498, 0x6883, 0x0008,
++      0x0480, 0x6883, 0x000e, 0x0468, 0x6883, 0x0017, 0x0450, 0x6883,
++      0x0035, 0x0438, 0x2001, 0x1172, 0x2004, 0xd0fc, 0x01e8, 0x6878,
++      0x2070, 0x9e82, 0x15c0, 0x02c0, 0x6060, 0x9e02, 0x12a8, 0x7120,
++      0x9186, 0x0006, 0x1188, 0x7010, 0x9005, 0x0170, 0x2004, 0xd0bc,
++      0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, 0x6a53,
++      0x7003, 0x0002, 0x0804, 0x6a53, 0x6883, 0x0028, 0x0010, 0x6883,
++      0x0029, 0x012e, 0x00ee, 0x0418, 0x6883, 0x002a, 0x0cd0, 0x6883,
++      0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, 0x080c,
++      0xbd23, 0x012e, 0x00ee, 0x0005, 0x2009, 0x003e, 0x0058, 0x2009,
++      0x0004, 0x0040, 0x2009, 0x0006, 0x0028, 0x2009, 0x0016, 0x0010,
++      0x2009, 0x0001, 0x6884, 0x9084, 0xff00, 0x9105, 0x6886, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x0005, 0x080c, 0x0ecf,
++      0x0005, 0x00d6, 0x080c, 0x72d0, 0x00de, 0x0005, 0x00d6, 0x00e6,
++      0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01f0,
++      0x908c, 0x0780, 0x190c, 0x6bb4, 0xd09c, 0x11c0, 0x2071, 0x1100,
++      0x70bc, 0x90ea, 0x0010, 0x0290, 0x8001, 0x70be, 0x702c, 0x2068,
++      0x2d04, 0x702e, 0x9006, 0x206a, 0x6806, 0x2071, 0x0040, 0x8d07,
++      0x8005, 0x8005, 0xc0d5, 0x7022, 0x702c, 0x0c10, 0x012e, 0x00ee,
++      0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x6bb4, 0x000e,
++      0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x7007, 0x0001,
++      0x6a74, 0x9282, 0x0004, 0x1a04, 0x6ba4, 0x697c, 0x9188, 0x1000,
++      0x2104, 0x9065, 0x6004, 0xd284, 0x0140, 0x05e0, 0x8007, 0x9084,
++      0x00ff, 0x9084, 0x0006, 0x1108, 0x04a8, 0x2c10, 0x080c, 0x8e83,
++      0x1118, 0x080c, 0x8f26, 0x05a0, 0x6212, 0x6874, 0x0002, 0x6b83,
++      0x6b88, 0x6b8b, 0x6b91, 0x2019, 0x0002, 0x080c, 0xc0b9, 0x0060,
++      0x080c, 0xc05a, 0x0048, 0x2019, 0x0002, 0x6980, 0x080c, 0xc072,
++      0x0018, 0x6980, 0x080c, 0xc05a, 0x080c, 0x8ed9, 0x6887, 0x0000,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x001e, 0x002e,
++      0x003e, 0x00ce, 0x00de, 0x0005, 0x6887, 0x0006, 0x0c88, 0x6887,
++      0x0002, 0x0c70, 0x6887, 0x0005, 0x0c58, 0x6887, 0x0004, 0x0c40,
++      0x6887, 0x0007, 0x0c28, 0x0005, 0x2011, 0x8003, 0x080c, 0x3f23,
++      0x0cf8, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c,
++      0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120,
++      0x080c, 0x12a2, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020,
++      0x2001, 0x0307, 0x2003, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c,
++      0x05d8, 0x7d44, 0x7c40, 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000,
++      0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, 0x8007, 0x0498,
++      0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484,
++      0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11b0,
++      0x080c, 0xc426, 0x080c, 0x709e, 0x7817, 0x0140, 0x0098, 0x9584,
++      0x0076, 0x1118, 0x080c, 0x70fb, 0x19c8, 0xd5a4, 0x0138, 0x0046,
++      0x0056, 0x080c, 0x1a74, 0x005e, 0x004e, 0x0020, 0x080c, 0xc426,
++      0x7817, 0x0140, 0x080c, 0x6c56, 0x2001, 0x130d, 0x2004, 0x9005,
++      0x090c, 0x7aa4, 0x0005, 0x0002, 0x6c2d, 0x6eb5, 0x6c24, 0x6c24,
++      0x6c24, 0x6c24, 0x6c24, 0x6c24, 0x7817, 0x0140, 0x2001, 0x130d,
++      0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x7000, 0x908c, 0xff00,
++      0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x688a, 0x9286, 0x2000,
++      0x1148, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x483b, 0x0068,
++      0x0451, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x6e02, 0x0028,
++      0x9286, 0x8000, 0x1110, 0x080c, 0x6fc8, 0x7817, 0x0140, 0x2001,
++      0x130d, 0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x2001, 0x110f,
++      0x2004, 0xd08c, 0x0178, 0x2001, 0x1100, 0x2004, 0x9086, 0x0003,
++      0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x3f23,
++      0x003e, 0x002e, 0x0005, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007,
++      0x9096, 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x6dd3, 0x9186,
++      0x0023, 0x1550, 0x080c, 0x7061, 0x0904, 0x6dd3, 0x7124, 0x610a,
++      0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, 0x080c, 0x8f53,
++      0x0804, 0x6dd3, 0x908e, 0x0214, 0x0118, 0x908e, 0x0210, 0x1130,
++      0x2009, 0x0015, 0x080c, 0x8f53, 0x0804, 0x6dd3, 0x908e, 0x0100,
++      0x1904, 0x6dd3, 0x7034, 0x9005, 0x1904, 0x6dd3, 0x2009, 0x0016,
++      0x080c, 0x8f53, 0x0804, 0x6dd3, 0x9186, 0x0022, 0x1904, 0x6dd3,
++      0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4, 0x0528, 0xc0b5,
++      0x68da, 0x7100, 0x918c, 0x00ff, 0x6976, 0x7004, 0x687a, 0x00f6,
++      0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016,
++      0x2008, 0x080c, 0x1f8d, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe,
++      0x080c, 0x1f63, 0x6956, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086,
++      0x2071, 0x1100, 0x70ae, 0x00ee, 0x7034, 0x9005, 0x1904, 0x6dd3,
++      0x2009, 0x0017, 0x0804, 0x6d92, 0x908e, 0x0400, 0x1158, 0x7034,
++      0x9005, 0x1904, 0x6dd3, 0x68d8, 0xc0a5, 0x68da, 0x2009, 0x0030,
++      0x0804, 0x6d92, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, 0x1904,
++      0x6dd3, 0x2009, 0x0018, 0x0804, 0x6d92, 0x908e, 0x2010, 0x1120,
++      0x2009, 0x0019, 0x0804, 0x6d92, 0x908e, 0x2110, 0x1120, 0x2009,
++      0x001a, 0x0804, 0x6d92, 0x908e, 0x5200, 0x1140, 0x7034, 0x9005,
++      0x1904, 0x6dd3, 0x2009, 0x001b, 0x0804, 0x6d92, 0x908e, 0x5000,
++      0x1140, 0x7034, 0x9005, 0x1904, 0x6dd3, 0x2009, 0x001c, 0x0804,
++      0x6d92, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x6d92,
++      0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x6dd3, 0x2009,
++      0x0024, 0x0804, 0x6d92, 0x908c, 0xff00, 0x918e, 0x2400, 0x1120,
++      0x2009, 0x002d, 0x0804, 0x6d92, 0x908c, 0xff00, 0x918e, 0x5300,
++      0x1120, 0x2009, 0x002a, 0x0804, 0x6d92, 0x908e, 0x0f00, 0x1120,
++      0x2009, 0x0020, 0x0804, 0x6d92, 0x908e, 0x5300, 0x1108, 0x00d8,
++      0x908e, 0x6104, 0x11c0, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082,
++      0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108,
++      0x0046, 0x2124, 0x080c, 0x3f23, 0x004e, 0x8108, 0x1f04, 0x6d54,
++      0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118, 0x2009, 0x003f,
++      0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e,
++      0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118,
++      0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118,
++      0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118,
++      0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6834, 0xd0d4, 0x0110,
++      0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c,
++      0x080c, 0x1f63, 0x15d0, 0x080c, 0x55b3, 0x15b8, 0x6612, 0x6516,
++      0x86ff, 0x01e8, 0x001e, 0x0016, 0x9186, 0x0017, 0x1158, 0x6874,
++      0x9606, 0x11a8, 0x6878, 0x9506, 0x9084, 0xff00, 0x1180, 0x6000,
++      0xc0f5, 0x6002, 0x9186, 0x0046, 0x1150, 0x6874, 0x9606, 0x1138,
++      0x6878, 0x9506, 0x9084, 0xff00, 0x1110, 0x001e, 0x00a0, 0x00c6,
++      0x080c, 0x8e83, 0x001e, 0x0198, 0x6112, 0x6023, 0x0004, 0x7120,
++      0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, 0x0016,
++      0x001e, 0x080c, 0x8f53, 0x00ce, 0x0005, 0x001e, 0x0ce0, 0x2001,
++      0x110d, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x3f23,
++      0x00c6, 0x080c, 0x8f26, 0x001e, 0x0d80, 0x6112, 0x6023, 0x0004,
++      0x7120, 0x610a, 0x001e, 0x0016, 0x9186, 0x0017, 0x0118, 0x9186,
++      0x0030, 0x1128, 0x6007, 0x0009, 0x6017, 0x2900, 0x0020, 0x6007,
++      0x0051, 0x6017, 0x0000, 0x602f, 0x0009, 0x6003, 0x0001, 0x080c,
++      0x75be, 0x0898, 0x080c, 0x297d, 0x1140, 0x7010, 0x9084, 0xff00,
++      0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, 0x00c6, 0x0046,
++      0x7000, 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c,
++      0x7061, 0x0904, 0x6e5f, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200,
++      0x1140, 0x7034, 0x9005, 0x15d8, 0x2009, 0x0015, 0x080c, 0x8f53,
++      0x04b0, 0x908e, 0x0100, 0x1598, 0x7034, 0x9005, 0x1580, 0x2009,
++      0x0016, 0x080c, 0x8f53, 0x0458, 0x9186, 0x0032, 0x1540, 0x7030,
++      0x908e, 0x1400, 0x1520, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263,
++      0x2204, 0x8211, 0x220c, 0x080c, 0x1f63, 0x11c0, 0x080c, 0x55b3,
++      0x11a8, 0x6612, 0x6516, 0x00c6, 0x080c, 0x8e83, 0x0170, 0x001e,
++      0x6112, 0x080c, 0xad70, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e,
++      0x080c, 0x8f53, 0x080c, 0x7aa4, 0x0010, 0x00ce, 0x001e, 0x004e,
++      0x00ce, 0x0005, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696,
++      0x00ff, 0x11a8, 0x9592, 0xfffc, 0x0290, 0x9596, 0xfffd, 0x1118,
++      0x2009, 0x007f, 0x04e8, 0x9596, 0xfffe, 0x1118, 0x2009, 0x007e,
++      0x04b8, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x0488, 0x9016,
++      0x2019, 0x1136, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x00ff,
++      0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071,
++      0x1081, 0x2e1c, 0x93ed, 0x0000, 0x1128, 0x82ff, 0x1170, 0x2410,
++      0xc2fd, 0x0058, 0x6f10, 0x2600, 0x9706, 0x6814, 0x1120, 0x9546,
++      0x1110, 0x2408, 0x0068, 0x9745, 0x0d80, 0x8420, 0x8e70, 0x1f04,
++      0x6e91, 0x82ff, 0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208,
++      0x9006, 0x00de, 0x00ee, 0x004e, 0x0005, 0x7000, 0x908c, 0xff00,
++      0x810f, 0x9184, 0x000f, 0x004a, 0x7817, 0x0140, 0x2001, 0x130d,
++      0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x6ed5, 0x6ed5, 0x6ed5,
++      0x7073, 0x6ed5, 0x6ede, 0x6f0b, 0x6f9b, 0x6ed5, 0x6ed5, 0x6ed5,
++      0x6ed5, 0x6ed5, 0x6ed5, 0x6ed5, 0x6ed5, 0x7817, 0x0140, 0x2001,
++      0x130d, 0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x7110, 0xd1bc,
++      0x0508, 0x7120, 0x2160, 0x9c8c, 0x0007, 0x11e0, 0x9c8a, 0x15c0,
++      0x02c8, 0x6860, 0x9c02, 0x12b0, 0x7008, 0x9084, 0x00ff, 0x6110,
++      0x9188, 0x0004, 0x210c, 0x9106, 0x1168, 0x700c, 0x6110, 0x9188,
++      0x0005, 0x210c, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, 0x0046,
++      0x080c, 0x8f53, 0x7817, 0x0140, 0x2001, 0x130d, 0x2004, 0x9005,
++      0x090c, 0x7aa4, 0x0005, 0x00c6, 0x9484, 0x0fff, 0x0904, 0x6f71,
++      0x7110, 0xd1bc, 0x1904, 0x6f71, 0x7108, 0x700c, 0x2028, 0x918c,
++      0x00ff, 0x2130, 0x9094, 0xff00, 0x15c0, 0x81ff, 0x15b0, 0x9080,
++      0x298c, 0x200d, 0x918c, 0xff00, 0x810f, 0x2001, 0x0080, 0x9106,
++      0x0904, 0x6f71, 0x080c, 0x55b3, 0x1904, 0x6f71, 0x6612, 0x6516,
++      0x6000, 0xd0ec, 0x15f0, 0x6204, 0x9294, 0xff00, 0x8217, 0x9286,
++      0x0006, 0x1188, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x05e0, 0x6112,
++      0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044,
++      0x080c, 0xb7dd, 0x0430, 0x6204, 0x9294, 0x00ff, 0x9286, 0x0006,
++      0x1140, 0x9295, 0x0600, 0x6206, 0x0c28, 0x190c, 0x6e62, 0x11c8,
++      0x0888, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x0198, 0x6112, 0x6023,
++      0x0004, 0x7120, 0x610a, 0x9286, 0x0004, 0x1118, 0x6007, 0x0005,
++      0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c,
++      0x7aa4, 0x7817, 0x0140, 0x2001, 0x130d, 0x2004, 0x9005, 0x090c,
++      0x7aa4, 0x00ce, 0x0005, 0x2001, 0x110d, 0x2004, 0xd0ec, 0x0120,
++      0x2011, 0x8049, 0x080c, 0x3f23, 0x00c6, 0x080c, 0x8f26, 0x001e,
++      0x0d40, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156,
++      0x6017, 0x0300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x756e,
++      0x080c, 0x7aa4, 0x08b0, 0x7110, 0xd1bc, 0x0508, 0x7020, 0x2060,
++      0x9c84, 0x0007, 0x11e0, 0x9c82, 0x15c0, 0x02c8, 0x6860, 0x9c02,
++      0x12b0, 0x7008, 0x9084, 0x00ff, 0x6110, 0x9188, 0x0004, 0x210c,
++      0x9106, 0x1168, 0x700c, 0x6110, 0x9188, 0x0005, 0x210c, 0x9106,
++      0x1130, 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0x8f53, 0x7817,
++      0x0140, 0x2001, 0x130d, 0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005,
++      0x080c, 0x297d, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086,
++      0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b,
++      0x0005, 0x6fdf, 0x6fe0, 0x6fdf, 0x6fdf, 0x7049, 0x7055, 0x0005,
++      0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x7048, 0x700c,
++      0x7108, 0x080c, 0x1f63, 0x1904, 0x7048, 0x080c, 0x55b3, 0x1904,
++      0x7048, 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x01f8, 0x928c,
++      0x00ff, 0x9186, 0x0004, 0x0118, 0x9186, 0x0006, 0x15c8, 0x00c6,
++      0x080c, 0x7061, 0x00ce, 0x0904, 0x7048, 0x00c6, 0x080c, 0x8e83,
++      0x001e, 0x05f0, 0x6112, 0x080c, 0xad70, 0x6023, 0x0002, 0x7120,
++      0x610a, 0x2009, 0x0088, 0x080c, 0x8f53, 0x0490, 0x928c, 0x00ff,
++      0x9186, 0x0006, 0x0160, 0x9186, 0x0004, 0x0148, 0x9294, 0xff00,
++      0x8217, 0x9286, 0x0004, 0x0118, 0x9286, 0x0006, 0x1188, 0x00c6,
++      0x080c, 0x8e83, 0x001e, 0x01e0, 0x6112, 0x080c, 0xad70, 0x6023,
++      0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x8f53, 0x0080,
++      0x00c6, 0x080c, 0x8e83, 0x001e, 0x0158, 0x6112, 0x080c, 0xad70,
++      0x6023, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x8f53,
++      0x0005, 0x7110, 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a,
++      0x2009, 0x0089, 0x080c, 0x8f53, 0x0005, 0x7110, 0xd1bc, 0x0140,
++      0x0041, 0x0130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x8f53,
++      0x0005, 0x7020, 0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x15c0,
++      0x0240, 0x2001, 0x1118, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001,
++      0x0005, 0x9006, 0x0ce8, 0x7110, 0xd1bc, 0x11f8, 0x7024, 0x2060,
++      0x9c84, 0x0007, 0x11d0, 0x9c82, 0x15c0, 0x02b8, 0x6860, 0x9c02,
++      0x12a0, 0x7008, 0x9084, 0x00ff, 0x6110, 0x9188, 0x0004, 0x210c,
++      0x9106, 0x1158, 0x700c, 0x6110, 0x9188, 0x0005, 0x210c, 0x9106,
++      0x1120, 0x2009, 0x0051, 0x080c, 0x8f53, 0x7817, 0x0140, 0x2001,
++      0x130d, 0x2004, 0x9005, 0x090c, 0x7aa4, 0x0005, 0x2031, 0x0105,
++      0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, 0x0207,
++      0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, 0x00d6,
++      0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, 0x05c8, 0x080c,
++      0x8e83, 0x05b0, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204,
++      0x8211, 0x220c, 0x080c, 0x1f63, 0x1598, 0x080c, 0x55b3, 0x1580,
++      0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce, 0x6012, 0x080c, 0xad70,
++      0x080c, 0x0eb6, 0x0508, 0x2d00, 0x605a, 0x9006, 0x6802, 0x6866,
++      0x6c6a, 0x9df8, 0x001b, 0x20a9, 0x000e, 0x20e9, 0x0001, 0x20e1,
++      0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616, 0x6007, 0x003e,
++      0x6023, 0x0001, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4,
++      0x00fe, 0x00de, 0x00ce, 0x0005, 0x080c, 0x8ed9, 0x006e, 0x0cc0,
++      0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184,
++      0xf000, 0x810f, 0x9086, 0x2000, 0x1540, 0x9186, 0x0022, 0x11d0,
++      0x2001, 0x0111, 0x2004, 0x9005, 0x1510, 0x7030, 0x908e, 0x0400,
++      0x01f0, 0x908e, 0x6000, 0x01d8, 0x908e, 0x5400, 0x01c0, 0x908e,
++      0x0300, 0x1138, 0x2009, 0x1136, 0x210c, 0xd18c, 0x1180, 0xd1a4,
++      0x1170, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x7061, 0x0128,
++      0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085,
++      0x0001, 0x00ce, 0x0005, 0x2071, 0x1317, 0x7003, 0x0003, 0x700f,
++      0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x15c0, 0x7007,
++      0x0000, 0x7026, 0x702b, 0x85b8, 0x7032, 0x7037, 0x861b, 0x703b,
++      0xffff, 0x703f, 0xffff, 0x7042, 0x7047, 0x4719, 0x704a, 0x705b,
++      0x728c, 0x2001, 0x12aa, 0x2003, 0x0003, 0x2001, 0x12ac, 0x2003,
++      0x0100, 0x0005, 0x2071, 0x1317, 0x1d04, 0x71e9, 0x2091, 0x6000,
++      0x700c, 0x8001, 0x700e, 0x1500, 0x2001, 0x1174, 0x2004, 0xd0c4,
++      0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001,
++      0x20d1, 0x0000, 0x080c, 0x0d7e, 0x700f, 0x0361, 0x7007, 0x0001,
++      0x0126, 0x2091, 0x8000, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142,
++      0x1130, 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024,
++      0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009,
++      0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff,
++      0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001,
++      0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184,
++      0x007f, 0x090c, 0x8696, 0x0010, 0x7034, 0x080f, 0x7038, 0x9005,
++      0x0118, 0x0310, 0x8001, 0x703a, 0x703c, 0x9005, 0x0118, 0x0310,
++      0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001, 0x704a,
++      0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e,
++      0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, 0x900d,
++      0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009, 0x8109,
++      0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a,
++      0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f,
++      0x012e, 0x7004, 0x0002, 0x720f, 0x7210, 0x7228, 0x00e6, 0x2071,
++      0x1317, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009,
++      0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1317, 0x701c, 0x9206,
++      0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071,
++      0x1317, 0x6088, 0x9102, 0x0208, 0x618a, 0x00ee, 0x0005, 0x0005,
++      0x7110, 0x080c, 0x5608, 0x1158, 0x6088, 0x8001, 0x0240, 0x608a,
++      0x1130, 0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e, 0x8108,
++      0x9182, 0x00ff, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, 0x0005,
++      0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, 0x9005, 0x0128,
++      0x8001, 0x6042, 0x1110, 0x080c, 0xac18, 0x6018, 0x9005, 0x0518,
++      0x8001, 0x601a, 0x1500, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
++      0x0006, 0x11b8, 0x6014, 0x2068, 0x6884, 0x908a, 0x199a, 0x0288,
++      0x9082, 0x1999, 0x6886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999,
++      0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x687c, 0x9084, 0x1000,
++      0x0110, 0x080c, 0xa6b1, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001,
++      0x45c0, 0x9102, 0x0220, 0x7017, 0x15c0, 0x7007, 0x0000, 0x0005,
++      0x00e6, 0x2071, 0x1317, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee,
++      0x0005, 0x2001, 0x1320, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071,
++      0x1317, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1323,
++      0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1317, 0x711a, 0x721e,
++      0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6, 0x0026, 0x7054, 0x8000,
++      0x7056, 0x2061, 0x12aa, 0x6008, 0x9086, 0x0000, 0x0158, 0x7068,
++      0x6036, 0x7064, 0x6032, 0x7060, 0x602e, 0x705c, 0x602a, 0x2c10,
++      0x080c, 0x0f22, 0x002e, 0x00ce, 0x0005, 0x0006, 0x0016, 0x00c6,
++      0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x715a, 0x015e, 0x00fe,
++      0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071,
++      0x1317, 0x7172, 0x7276, 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6,
++      0x0006, 0x2071, 0x1317, 0x7074, 0x9206, 0x1110, 0x7072, 0x7076,
++      0x000e, 0x00ee, 0x0005, 0x00c6, 0x2061, 0x1354, 0x00ce, 0x0005,
++      0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1354, 0x2060,
++      0x0005, 0x6884, 0x908a, 0x199a, 0x1630, 0x9005, 0x1150, 0x00c6,
++      0x2061, 0x1354, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e,
++      0x0018, 0x908e, 0xffff, 0x01a8, 0x8003, 0x800b, 0x810b, 0x9108,
++      0x611a, 0x687c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x735c,
++      0xd0b4, 0x1160, 0xd0bc, 0x15e0, 0x2009, 0x0006, 0x080c, 0x7386,
++      0x0005, 0x900e, 0x0c68, 0x2001, 0x1999, 0x08b8, 0xd0fc, 0x0160,
++      0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x7380, 0x908c,
++      0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11d0, 0x2009,
++      0x1174, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043,
++      0x0804, 0x8f53, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804,
++      0x8f53, 0x6110, 0x210c, 0xd1ac, 0x0d38, 0x6024, 0xc0cd, 0x6026,
++      0x0c18, 0xc0d4, 0x6026, 0x6890, 0x602e, 0x688c, 0x6032, 0x08f8,
++      0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904,
++      0x7380, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6,
++      0x2c78, 0x080c, 0x137e, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009,
++      0x0042, 0x080c, 0x8f53, 0x0005, 0x6110, 0x210c, 0xd1ac, 0x0d70,
++      0x6124, 0xc1cd, 0x6126, 0x0c50, 0xd0fc, 0x0188, 0x908c, 0x2020,
++      0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148,
++      0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x8f53, 0x0005, 0x00a1,
++      0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x8f53, 0x0cb0,
++      0x6110, 0x210c, 0xd1ac, 0x0d38, 0x6124, 0xc1cd, 0x6126, 0x0c18,
++      0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x00d6, 0x6014,
++      0x90ec, 0xf000, 0x0510, 0x2068, 0x6982, 0x6800, 0x6016, 0x9186,
++      0x0001, 0x1188, 0x697c, 0x918c, 0x8100, 0x918e, 0x8100, 0x1158,
++      0x00c6, 0x2061, 0x1354, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210,
++      0x0208, 0x6206, 0x00ce, 0x080c, 0x59b8, 0x6014, 0x906d, 0x0076,
++      0x2039, 0x0000, 0x190c, 0x72d9, 0x007e, 0x00de, 0x0005, 0x0156,
++      0x00c6, 0x2061, 0x1354, 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008,
++      0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138,
++      0x6808, 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, 0x9006,
++      0x8004, 0x2019, 0x0100, 0x231c, 0x93a6, 0x0008, 0x1118, 0x8086,
++      0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x1208, 0x9200,
++      0x1f04, 0x73d1, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020,
++      0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x004e, 0x003e, 0x012e, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005,
++      0x0510, 0x911a, 0x1600, 0x8213, 0x2039, 0x0100, 0x273c, 0x97be,
++      0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x0228, 0x911a,
++      0x1220, 0x1f04, 0x73fb, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04,
++      0x73fb, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e,
++      0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8,
++      0x0126, 0x2091, 0x2800, 0x2079, 0x1304, 0x012e, 0x00d6, 0x2069,
++      0x1304, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000,
++      0x2069, 0x0200, 0x080c, 0x8dc3, 0x0401, 0x080c, 0x8dae, 0x00e9,
++      0x080c, 0x8db1, 0x00d1, 0x080c, 0x8db4, 0x00b9, 0x080c, 0x8db7,
++      0x00a1, 0x080c, 0x8dba, 0x0089, 0x080c, 0x8dbd, 0x0071, 0x080c,
++      0x8dc0, 0x0059, 0x01de, 0x014e, 0x015e, 0x2069, 0x0004, 0x2d04,
++      0x9085, 0x8001, 0x206a, 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1,
++      0x0240, 0x9006, 0x4004, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804,
++      0x9084, 0x0007, 0x0002, 0x746d, 0x7491, 0x74db, 0x7473, 0x7491,
++      0x746d, 0x746b, 0x746b, 0x080c, 0x0d7e, 0x080c, 0x7271, 0x080c,
++      0x7aa4, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005,
++      0x2011, 0x4f57, 0x080c, 0x71fa, 0x7828, 0x9092, 0x00c8, 0x1228,
++      0x8000, 0x782a, 0x080c, 0x4f94, 0x0c88, 0x62c0, 0x080c, 0x8dc7,
++      0x080c, 0x4f57, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000,
++      0x0c28, 0x080c, 0x7271, 0x6220, 0xd2a4, 0x0178, 0x62c0, 0x82ff,
++      0x1160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0d7e, 0x2009,
++      0x0013, 0x080c, 0x8f53, 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065,
++      0x090c, 0x0d7e, 0x7804, 0x9086, 0x0004, 0x0904, 0x7517, 0x7828,
++      0x9092, 0xc350, 0x1230, 0x8000, 0x782a, 0x00ce, 0x080c, 0x857e,
++      0x0c50, 0x2011, 0x0130, 0x2214, 0x080c, 0x8dc7, 0x6104, 0x9186,
++      0x0003, 0x1188, 0x00e6, 0x2071, 0x1100, 0x70e4, 0x00ee, 0xd08c,
++      0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1100, 0x080c,
++      0x4faa, 0x00ee, 0x00ce, 0x080c, 0xc463, 0x2009, 0x0014, 0x080c,
++      0x8f53, 0x00ce, 0x0840, 0x2001, 0x1320, 0x2003, 0x0000, 0x62c0,
++      0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0d7e,
++      0x2009, 0x0013, 0x080c, 0x8fab, 0x00ce, 0x0005, 0x00c6, 0x00d6,
++      0x7824, 0x9005, 0x090c, 0x0d7e, 0x781c, 0x906d, 0x090c, 0x0d7e,
++      0x080c, 0x8dc7, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x080c,
++      0x8ed9, 0x693c, 0x81ff, 0x090c, 0x0d7e, 0x8109, 0x693e, 0x6854,
++      0x9015, 0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, 0x7807, 0x0000,
++      0x7827, 0x0000, 0x00de, 0x00ce, 0x080c, 0x7aa4, 0x08a8, 0x6104,
++      0x9186, 0x0002, 0x0128, 0x9186, 0x0004, 0x0110, 0x0804, 0x74af,
++      0x7808, 0x9c06, 0x0904, 0x74af, 0x080c, 0x79ab, 0x080c, 0x75be,
++      0x00ce, 0x080c, 0x7aa4, 0x0804, 0x74a3, 0x00c6, 0x6024, 0x6027,
++      0x0002, 0xd0f4, 0x1580, 0x62c8, 0x60c4, 0x9205, 0x1170, 0x783c,
++      0x9065, 0x0130, 0x2009, 0x0049, 0x080c, 0x8f53, 0x00ce, 0x0005,
++      0x2011, 0x1323, 0x2013, 0x0000, 0x0cc8, 0x793c, 0x81ff, 0x0dc0,
++      0x7944, 0x9192, 0x7530, 0x12f0, 0x8108, 0x7946, 0x793c, 0x9188,
++      0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, 0x9084, 0x1984,
++      0x9085, 0x0012, 0x6016, 0x0c10, 0x6014, 0x9084, 0x1984, 0x9085,
++      0x0016, 0x6016, 0x08d8, 0x793c, 0x2160, 0x2009, 0x004a, 0x080c,
++      0x8f53, 0x08a0, 0x7848, 0xc085, 0x784a, 0x0880, 0x0006, 0x0016,
++      0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
++      0x1304, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, 0x0148, 0x9080,
++      0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005,
++      0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x1304, 0x6000, 0xd0d4,
++      0x01b8, 0x6820, 0x8000, 0x6822, 0x9086, 0x0001, 0x1110, 0x2c00,
++      0x681e, 0x2001, 0x110c, 0x2004, 0xd0fc, 0x0118, 0x00de, 0x0804,
++      0x7aa4, 0x6804, 0x9084, 0x0007, 0x0804, 0x7abb, 0x00de, 0x0005,
++      0xc0d5, 0x6002, 0x6818, 0x9005, 0x0158, 0x6056, 0x605b, 0x0000,
++      0x0006, 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069, 0x1304, 0x08c8,
++      0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x0898, 0x0006, 0x0016,
++      0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
++      0x1304, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148, 0x9080,
++      0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005,
++      0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061,
++      0x1304, 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6136,
++      0x00ce, 0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, 0x00e6,
++      0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016,
++      0x0006, 0x0126, 0x902e, 0x2071, 0x1304, 0x7638, 0x2660, 0x2678,
++      0x2091, 0x8000, 0x8cff, 0x0904, 0x7664, 0x6010, 0x9080, 0x0028,
++      0x2004, 0x9206, 0x1904, 0x765f, 0x87ff, 0x0120, 0x6054, 0x9106,
++      0x1904, 0x765f, 0x703c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001,
++      0x080c, 0x8847, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046,
++      0x704a, 0x003e, 0x2029, 0x0001, 0x7038, 0x9c36, 0x1110, 0x660c,
++      0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
++      0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
++      0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xa942,
++      0x01c8, 0x6014, 0x2068, 0x6020, 0x9086, 0x0003, 0x1580, 0x6867,
++      0x0103, 0x6b7a, 0x6877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c,
++      0xac01, 0x080c, 0xc3c7, 0x080c, 0x5b76, 0x007e, 0x003e, 0x001e,
++      0x080c, 0xab11, 0x080c, 0x8f09, 0x00ce, 0x0804, 0x7602, 0x2c78,
++      0x600c, 0x2060, 0x0804, 0x7602, 0x85ff, 0x0120, 0x0036, 0x080c,
++      0x7b72, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e,
++      0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020,
++      0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xc3c7,
++      0x080c, 0xc0e9, 0x007e, 0x003e, 0x001e, 0x08a0, 0x6020, 0x9086,
++      0x000a, 0x0904, 0x7649, 0x0804, 0x7647, 0x0006, 0x0066, 0x00c6,
++      0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x1304,
++      0x7838, 0x9065, 0x0904, 0x76db, 0x600c, 0x0006, 0x600f, 0x0000,
++      0x783c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0x8847,
++      0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e,
++      0x080c, 0xa942, 0x0518, 0x6014, 0x2068, 0x6020, 0x9086, 0x0003,
++      0x1558, 0x3e08, 0x918e, 0x0002, 0x1180, 0x6010, 0x9005, 0x0168,
++      0x9080, 0x0000, 0x2004, 0xd0bc, 0x0140, 0x6040, 0x9005, 0x1180,
++      0x2001, 0x12c2, 0x2004, 0x6042, 0x0058, 0x6867, 0x0103, 0x6b7a,
++      0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11, 0x080c, 0x8f09,
++      0x000e, 0x0804, 0x7699, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de,
++      0x00ce, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118,
++      0x080c, 0xc0e9, 0x0c58, 0x6020, 0x9086, 0x000a, 0x0d00, 0x08e8,
++      0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c, 0x77c0, 0x008e,
++      0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x1304, 0x2091,
++      0x8000, 0x080c, 0x7851, 0x080c, 0x78c5, 0x012e, 0x00fe, 0x0005,
++      0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126,
++      0x2091, 0x8000, 0x2071, 0x1304, 0x7614, 0x2660, 0x2678, 0x8cff,
++      0x0904, 0x7796, 0x6010, 0x9080, 0x0028, 0x2004, 0x9206, 0x1904,
++      0x7791, 0x88ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x7791, 0x7024,
++      0x9c06, 0x1550, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, 0x080c,
++      0x7271, 0x080c, 0x85a2, 0x68c3, 0x0000, 0x080c, 0x8a7d, 0x7027,
++      0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
++      0x2001, 0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x2069,
++      0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0020,
++      0x6003, 0x0009, 0x630a, 0x04e8, 0x7014, 0x9c36, 0x1110, 0x660c,
++      0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
++      0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
++      0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2068,
++      0x080c, 0xa942, 0x01b8, 0x6020, 0x9086, 0x0003, 0x1540, 0x6867,
++      0x0103, 0x6b7a, 0x6877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c,
++      0xac01, 0x080c, 0xc3c7, 0x080c, 0x5b76, 0x008e, 0x003e, 0x001e,
++      0x080c, 0xab11, 0x080c, 0x8f09, 0x080c, 0x895e, 0x00ce, 0x0804,
++      0x7717, 0x2c78, 0x600c, 0x2060, 0x0804, 0x7717, 0x012e, 0x000e,
++      0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020,
++      0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xc3c7,
++      0x080c, 0xc0e9, 0x008e, 0x003e, 0x001e, 0x08e0, 0x6020, 0x9086,
++      0x0002, 0x1128, 0x6004, 0x9086, 0x0085, 0x0908, 0x0898, 0x6020,
++      0x9086, 0x0005, 0x1978, 0x6004, 0x9086, 0x0085, 0x0d20, 0x0850,
++      0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004,
++      0x9065, 0x0904, 0x784d, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071,
++      0x1304, 0x6654, 0x7018, 0x9c06, 0x1108, 0x761a, 0x701c, 0x9c06,
++      0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0x6058,
++      0x907d, 0x0108, 0x7e56, 0x96ed, 0x0000, 0x0110, 0x2f00, 0x685a,
++      0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002,
++      0x080c, 0x554c, 0x0904, 0x7849, 0x7624, 0x86ff, 0x0904, 0x7838,
++      0x9680, 0x0005, 0x2004, 0x9d06, 0x15d8, 0x00d6, 0x2069, 0x0100,
++      0x68c0, 0x9005, 0x0560, 0x080c, 0x7271, 0x080c, 0x85a2, 0x68c3,
++      0x0000, 0x080c, 0x8a7d, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140,
++      0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2401,
++      0x9006, 0x080c, 0x2401, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
++      0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0x603c, 0x9005, 0x0110,
++      0x8001, 0x603e, 0x2660, 0x080c, 0x8f09, 0x00ce, 0x0048, 0x00de,
++      0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x77f0,
++      0x8dff, 0x0158, 0x6867, 0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c,
++      0xac01, 0x080c, 0xc3c7, 0x080c, 0x5b76, 0x080c, 0x895e, 0x0804,
++      0x77f0, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce,
++      0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7814, 0x9065,
++      0x0904, 0x78a5, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, 0x9c06,
++      0x1558, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0508, 0x080c, 0x7271,
++      0x080c, 0x85a2, 0x68c3, 0x0000, 0x080c, 0x8a7d, 0x7827, 0x0000,
++      0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001,
++      0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x2069, 0x0100,
++      0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003,
++      0x0009, 0x630a, 0x2c30, 0x00b0, 0x6014, 0x2068, 0x080c, 0xa942,
++      0x0168, 0x6020, 0x9086, 0x0003, 0x11b8, 0x6867, 0x0103, 0x6b7a,
++      0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11, 0x080c, 0x8f09,
++      0x080c, 0x895e, 0x000e, 0x0804, 0x7857, 0x7e16, 0x7e12, 0x00de,
++      0x00ce, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118,
++      0x080c, 0xc0e9, 0x0c58, 0x6020, 0x9086, 0x0002, 0x1128, 0x6004,
++      0x9086, 0x0085, 0x09d0, 0x0c10, 0x6020, 0x9086, 0x0005, 0x19f0,
++      0x6004, 0x9086, 0x0085, 0x0d60, 0x08c8, 0x0006, 0x0066, 0x00c6,
++      0x00d6, 0x7818, 0x9065, 0x0904, 0x7940, 0x6054, 0x0006, 0x9006,
++      0x6056, 0x605a, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x554c,
++      0x0904, 0x793d, 0x7e24, 0x86ff, 0x0904, 0x7930, 0x9680, 0x0005,
++      0x2004, 0x9d06, 0x1904, 0x7930, 0x00d6, 0x2069, 0x0100, 0x68c0,
++      0x9005, 0x05e8, 0x080c, 0x7271, 0x080c, 0x85a2, 0x68c3, 0x0000,
++      0x080c, 0x8a7d, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
++      0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2401, 0x9006,
++      0x080c, 0x2401, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
++      0x0001, 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168,
++      0x6000, 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1508,
++      0x2009, 0x12c2, 0x210c, 0x2102, 0x00e0, 0x603c, 0x9005, 0x0110,
++      0x8001, 0x603e, 0x2660, 0x080c, 0x8f09, 0x00ce, 0x0048, 0x00de,
++      0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x78d6,
++      0x8dff, 0x0138, 0x6867, 0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c,
++      0x5b76, 0x080c, 0x895e, 0x0804, 0x78d6, 0x000e, 0x0804, 0x78ca,
++      0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x00e6,
++      0x00d6, 0x0066, 0x6000, 0xd0dc, 0x01a0, 0x604c, 0x906d, 0x0188,
++      0x6878, 0x9606, 0x1170, 0x2071, 0x1304, 0x7024, 0x9035, 0x0148,
++      0x9080, 0x0005, 0x2004, 0x9d06, 0x1120, 0x6000, 0xc0dc, 0x6002,
++      0x0021, 0x006e, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x2079, 0x0100,
++      0x78c0, 0x9005, 0x1138, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a,
++      0x00ce, 0x04b8, 0x080c, 0x85a2, 0x78c3, 0x0000, 0x080c, 0x8a7d,
++      0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0x9384, 0x1000,
++      0x0138, 0x2001, 0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401,
++      0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c,
++      0x8a7d, 0x003e, 0x080c, 0x554c, 0x00c6, 0x603c, 0x9005, 0x0110,
++      0x8001, 0x603e, 0x2660, 0x080c, 0x8ed9, 0x00ce, 0x6867, 0x0103,
++      0x6b7a, 0x6877, 0x0000, 0x080c, 0xac01, 0x080c, 0x5b76, 0x080c,
++      0x895e, 0x00fe, 0x0005, 0x00e6, 0x00c6, 0x2001, 0x110c, 0x2014,
++      0xc2e4, 0x2202, 0x2071, 0x1304, 0x7004, 0x9084, 0x0007, 0x0002,
++      0x79c2, 0x79c5, 0x79db, 0x7a03, 0x7a40, 0x79c2, 0x79c0, 0x79c0,
++      0x080c, 0x0d7e, 0x00ce, 0x00ee, 0x0005, 0x7024, 0x9065, 0x0148,
++      0x7020, 0x8001, 0x7022, 0x600c, 0x9015, 0x0150, 0x7216, 0x600f,
++      0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005,
++      0x7216, 0x7212, 0x0cb0, 0x6010, 0x2060, 0x080c, 0x554c, 0x6000,
++      0xc0dc, 0x6002, 0x7007, 0x0000, 0x7027, 0x0000, 0x7020, 0x8001,
++      0x7022, 0x1140, 0x2001, 0x110c, 0x2014, 0xd2ec, 0x1178, 0x00ce,
++      0x00ee, 0x0005, 0x6054, 0x9015, 0x0120, 0x721e, 0x080c, 0x7aa4,
++      0x0cb0, 0x7218, 0x721e, 0x080c, 0x7aa4, 0x0c88, 0xc2ec, 0x2202,
++      0x080c, 0x7b72, 0x0c60, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06,
++      0x1160, 0x080c, 0x895e, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f,
++      0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160,
++      0x080c, 0x895e, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000,
++      0x00d0, 0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198,
++      0x6010, 0x2060, 0x080c, 0x554c, 0x6000, 0xc0dc, 0x6002, 0x080c,
++      0x895e, 0x701c, 0x9065, 0x0138, 0x6054, 0x9015, 0x0110, 0x721e,
++      0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005,
++      0x7024, 0x9065, 0x0140, 0x080c, 0x895e, 0x600c, 0x9015, 0x0150,
++      0x720e, 0x600f, 0x0000, 0x080c, 0x8a7d, 0x7027, 0x0000, 0x00ce,
++      0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6, 0x2069, 0x1304,
++      0x6830, 0x9084, 0x0003, 0x0002, 0x7a62, 0x7a64, 0x7a88, 0x7a60,
++      0x080c, 0x0d7e, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001,
++      0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a,
++      0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x1323,
++      0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, 0x0c90,
++      0x6843, 0x0000, 0x6838, 0x9065, 0x0d68, 0x6003, 0x0003, 0x0c50,
++      0x00c6, 0x9006, 0x6842, 0x6846, 0x684a, 0x683c, 0x9065, 0x0160,
++      0x600c, 0x9015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000,
++      0x0018, 0x683e, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, 0xc1e5,
++      0x2001, 0x110c, 0x2102, 0x0005, 0x2001, 0x110c, 0x200c, 0xd1ec,
++      0x0138, 0xc1ec, 0x2102, 0x080c, 0x7b72, 0x2001, 0x110c, 0x200c,
++      0x9184, 0x0600, 0x9086, 0x0600, 0x0d50, 0x00d6, 0x2069, 0x1304,
++      0x6804, 0x9084, 0x0007, 0x0002, 0x7ac6, 0x7b51, 0x7b51, 0x7b51,
++      0x7b51, 0x7b53, 0x7ac4, 0x7ac4, 0x080c, 0x0d7e, 0x6820, 0x9005,
++      0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0150, 0x6807,
++      0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x7bb7, 0x00ce, 0x00de,
++      0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b,
++      0x0000, 0x080c, 0x7bb7, 0x00ce, 0x00de, 0x0005, 0x00e6, 0x6a1c,
++      0x92f5, 0x0000, 0x0904, 0x7b4e, 0x704c, 0x900d, 0x0118, 0x7088,
++      0x9005, 0x01a0, 0x7054, 0x9075, 0x0120, 0x920e, 0x0904, 0x7b4e,
++      0x0028, 0x6818, 0x920e, 0x0904, 0x7b4e, 0x2070, 0x704c, 0x900d,
++      0x0d88, 0x7088, 0x9005, 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038,
++      0x9302, 0x1e40, 0x080c, 0x8eb0, 0x0904, 0x7b4e, 0x8318, 0x733e,
++      0x6116, 0x2e10, 0x6212, 0x9180, 0x0020, 0x2004, 0x9084, 0x00ff,
++      0x605e, 0x9180, 0x0020, 0x2003, 0x0000, 0x9180, 0x0021, 0x2004,
++      0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b,
++      0x9318, 0x631a, 0x00f6, 0x2c78, 0x2061, 0x0100, 0x609b, 0x0000,
++      0x00d6, 0x00e6, 0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x81a1,
++      0x00ee, 0x00de, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18,
++      0x6b26, 0x682b, 0x0000, 0x7823, 0x0003, 0x7803, 0x0001, 0x7807,
++      0x0040, 0x00fe, 0x00ee, 0x00ce, 0x00de, 0x0005, 0x00ee, 0x00ce,
++      0x0cd8, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0138, 0x6807,
++      0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x7bb7, 0x00ce, 0x00de,
++      0x0005, 0x2001, 0x110c, 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe,
++      0x0005, 0x2001, 0x110c, 0x2014, 0xd2e4, 0x0120, 0xc2e4, 0x2202,
++      0x080c, 0x7ab5, 0x00f6, 0x00d6, 0x2069, 0x1304, 0x6830, 0x9086,
++      0x0000, 0x11f0, 0x2001, 0x110c, 0x200c, 0xd1c4, 0x11e0, 0x6838,
++      0x907d, 0x01b0, 0x6a04, 0x9296, 0x0000, 0x19d8, 0x6833, 0x0001,
++      0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091,
++      0x2400, 0x002e, 0x080c, 0x167d, 0x1178, 0x012e, 0x080c, 0x83f0,
++      0x00de, 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001,
++      0x080c, 0x6380, 0x006e, 0x08d8, 0x012e, 0x6843, 0x0000, 0x7803,
++      0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833,
++      0x0000, 0x683f, 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, 0x6020,
++      0x9084, 0x000f, 0x000b, 0x0005, 0x7bcb, 0x7bd0, 0x8097, 0x8157,
++      0x7bd0, 0x8097, 0x8157, 0x7bcb, 0x7bd0, 0x7bcb, 0x7bcb, 0x7bcb,
++      0x7bcb, 0x7bcb, 0x7bcb, 0x080c, 0x79ab, 0x080c, 0x7aa4, 0x0005,
++      0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6,
++      0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053,
++      0x1a0c, 0x0d7e, 0x6110, 0x2178, 0x79a0, 0x2011, 0x1136, 0x2214,
++      0xd2ac, 0x1110, 0xd1bc, 0x0148, 0x7900, 0xd1f4, 0x0120, 0x7914,
++      0x918c, 0x00ff, 0x0038, 0x900e, 0x0028, 0x91f8, 0x298c, 0x2f0d,
++      0x918c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040,
++      0x1a04, 0x7c4f, 0x0053, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de,
++      0x01ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x7dc3, 0x7e04, 0x7e33,
++      0x7ee5, 0x7f08, 0x7f0e, 0x7f1c, 0x7f25, 0x7f32, 0x7f38, 0x7f4a,
++      0x7f38, 0x7fa1, 0x7f25, 0x7fae, 0x7fb4, 0x7f32, 0x7fb4, 0x7fc1,
++      0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d,
++      0x7c4d, 0x7c4d, 0x7c4d, 0x86e5, 0x86fc, 0x8707, 0x8728, 0x8757,
++      0x7f1c, 0x7c4d, 0x7f1c, 0x7f38, 0x7c4d, 0x7e33, 0x7ee5, 0x7c4d,
++      0x8b65, 0x7f38, 0x7c4d, 0x8b81, 0x7f38, 0x7c4d, 0x7f32, 0x7dbc,
++      0x7c6f, 0x7c4d, 0x8b98, 0x8c05, 0x8cda, 0x7c4d, 0x8ce7, 0x7f19,
++      0x8cfd, 0x7c4d, 0x8762, 0x8d37, 0x7c4d, 0x080c, 0x0d7e, 0x2100,
++      0x0053, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e,
++      0x013e, 0x015e, 0x0005, 0x7c6d, 0x7c6d, 0x7c6d, 0x7c95, 0x7d39,
++      0x7d49, 0x7c6d, 0x7c6d, 0x7c6d, 0x7d8e, 0x7d9d, 0x7caf, 0x7c6d,
++      0x7cc9, 0x7cfa, 0x8de7, 0x8e2c, 0x7f38, 0x080c, 0x0d7e, 0x00d6,
++      0x080c, 0x7fd5, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800,
++      0x7814, 0x2068, 0x683c, 0x700e, 0x6850, 0x7022, 0x6854, 0x7026,
++      0x60c3, 0x0018, 0x080c, 0x8576, 0x00de, 0x0005, 0x00d6, 0x7810,
++      0x2068, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac, 0x1110, 0xd0bc,
++      0x0110, 0x9085, 0x0001, 0x00de, 0x0005, 0x00d6, 0x080c, 0x7fd5,
++      0x7003, 0x0500, 0x7814, 0x90e8, 0x001b, 0x6808, 0x700a, 0x680c,
++      0x700e, 0x6810, 0x7012, 0x6814, 0x7016, 0x6818, 0x701a, 0x681c,
++      0x701e, 0x60c3, 0x0010, 0x080c, 0x8576, 0x00de, 0x0005, 0x00d6,
++      0x080c, 0x7fd5, 0x7003, 0x0500, 0x7814, 0x90e8, 0x0031, 0x6808,
++      0x700a, 0x680c, 0x700e, 0x6810, 0x7012, 0x6814, 0x7016, 0x6818,
++      0x701a, 0x681c, 0x701e, 0x60c3, 0x0010, 0x080c, 0x8576, 0x00de,
++      0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x080c, 0x7fd5, 0x20e9,
++      0x0000, 0x20e1, 0x0001, 0x2001, 0x12dd, 0x2003, 0x0000, 0x7814,
++      0x2068, 0x6814, 0x8003, 0x60c2, 0x6830, 0x20a8, 0x9d80, 0x001b,
++      0x2098, 0x2001, 0x12dd, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c,
++      0x1b4c, 0x080c, 0xb539, 0x9006, 0x080c, 0x1b4c, 0x001e, 0x6804,
++      0x9005, 0x0110, 0x2068, 0x0c40, 0x04b9, 0x080c, 0x8576, 0x012e,
++      0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x080c, 0x804b,
++      0x20e9, 0x0000, 0x20e1, 0x0001, 0x2001, 0x12dd, 0x2003, 0x0000,
++      0x7814, 0x2068, 0x686f, 0x0200, 0x6873, 0x0000, 0x6814, 0x8003,
++      0x60c2, 0x6830, 0x20a8, 0x9d80, 0x001b, 0x2098, 0x2001, 0x12dd,
++      0x0016, 0x200c, 0x080c, 0xb539, 0x001e, 0x6804, 0x9005, 0x0110,
++      0x2068, 0x0c78, 0x0049, 0x7814, 0x2068, 0x080c, 0x0edf, 0x080c,
++      0x8576, 0x012e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003,
++      0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0,
++      0x0005, 0x080c, 0x7fd5, 0x7003, 0x7800, 0x7007, 0x0000, 0x7808,
++      0x8007, 0x700a, 0x700f, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8576,
++      0x0005, 0x00d6, 0x00e6, 0x080c, 0x804b, 0x2073, 0x0200, 0x8e70,
++      0x2073, 0x0000, 0x8e70, 0x2073, 0xdf10, 0x8e70, 0x2073, 0x0034,
++      0x8e70, 0x2069, 0x1105, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70,
++      0x1f04, 0x7d5d, 0x2069, 0x1101, 0x20a9, 0x0004, 0x2d76, 0x8d68,
++      0x8e70, 0x1f04, 0x7d66, 0x2069, 0x12ea, 0x20a9, 0x001a, 0x9e86,
++      0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012,
++      0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70,
++      0x1f04, 0x7d6f, 0x2073, 0x0000, 0x8e70, 0x2073, 0x0000, 0x60c3,
++      0x004c, 0x080c, 0x8576, 0x00ee, 0x00de, 0x0005, 0x080c, 0x7fd5,
++      0x7003, 0x6300, 0x7007, 0x0028, 0x700b, 0x0000, 0x7808, 0x700e,
++      0x60c3, 0x0008, 0x080c, 0x8576, 0x0005, 0x00d6, 0x0026, 0x0016,
++      0x080c, 0x804b, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0,
++      0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70,
++      0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x8576,
++      0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1116, 0x2004, 0x609a,
++      0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x7003, 0x5200, 0x2069,
++      0x1152, 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x1f77,
++      0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1105,
++      0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099,
++      0x1101, 0x20a1, 0x0254, 0x4003, 0x2001, 0x1136, 0x2004, 0xd0ac,
++      0x1138, 0x7810, 0x9080, 0x0028, 0x2004, 0x9082, 0x007f, 0x0248,
++      0x2001, 0x111d, 0x2004, 0x7032, 0x2001, 0x111e, 0x2004, 0x7036,
++      0x0030, 0x2001, 0x1116, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3,
++      0x001c, 0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x7003, 0x0500,
++      0x2001, 0x1136, 0x2004, 0xd0ac, 0x1138, 0x7810, 0x9080, 0x0028,
++      0x2004, 0x9082, 0x007f, 0x0248, 0x2001, 0x111d, 0x2004, 0x700a,
++      0x2001, 0x111e, 0x2004, 0x700e, 0x0030, 0x2001, 0x1116, 0x2004,
++      0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099,
++      0x1105, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x60c3, 0x0010,
++      0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x00c6, 0x7810, 0x2060,
++      0x9006, 0x080c, 0x5898, 0x00ce, 0x7810, 0x9080, 0x0028, 0x2004,
++      0x9086, 0x007e, 0x1130, 0x7003, 0x0400, 0x620c, 0xc2b4, 0x620e,
++      0x0068, 0x7814, 0x00d6, 0x906d, 0x0130, 0x689b, 0x0000, 0x68a7,
++      0x0000, 0x68ab, 0x0000, 0x00de, 0x7003, 0x0300, 0x7810, 0x9080,
++      0x0028, 0x2004, 0x9086, 0x007e, 0x1904, 0x7eab, 0x00d6, 0x2069,
++      0x1297, 0x2001, 0x1136, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a,
++      0x6808, 0x9084, 0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710,
++      0x6818, 0x7022, 0x681c, 0x7026, 0x0080, 0x6800, 0x700a, 0x6804,
++      0x700e, 0x6808, 0x080c, 0x62e4, 0x1118, 0x9084, 0x37ff, 0x0010,
++      0x9084, 0x3fff, 0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004,
++      0x20e1, 0x0001, 0x2099, 0x1105, 0x20e9, 0x0000, 0x20a1, 0x0256,
++      0x4003, 0x20a9, 0x0004, 0x2099, 0x1101, 0x20a1, 0x025a, 0x4003,
++      0x00d6, 0x080c, 0x8dae, 0x2069, 0x129f, 0x2071, 0x024e, 0x6800,
++      0xc0dd, 0x7002, 0x2001, 0x1172, 0x2004, 0xd0e4, 0x0110, 0x680c,
++      0x700e, 0x00de, 0x04a8, 0x2001, 0x1136, 0x2004, 0xd0a4, 0x0170,
++      0x0016, 0x2001, 0x1298, 0x200c, 0x60e0, 0x9106, 0x0130, 0x2100,
++      0x60e3, 0x0000, 0x080c, 0x1fb8, 0x61e2, 0x001e, 0x20e1, 0x0001,
++      0x2099, 0x1297, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008,
++      0x4003, 0x20a9, 0x0004, 0x2099, 0x1105, 0x20a1, 0x0256, 0x4003,
++      0x20a9, 0x0004, 0x2099, 0x1101, 0x20a1, 0x025a, 0x4003, 0x080c,
++      0x8dae, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099, 0x129f, 0x4003,
++      0x60c3, 0x0074, 0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x7003,
++      0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, 0x2000, 0x9006,
++      0x00f6, 0x2079, 0x1152, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085,
++      0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x9085, 0x0002, 0x00d6,
++      0x0804, 0x7f85, 0x7026, 0x60c3, 0x0014, 0x080c, 0x8576, 0x0005,
++      0x080c, 0x7fd5, 0x7003, 0x5000, 0x0804, 0x7e56, 0x080c, 0x7fd5,
++      0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x080c, 0x8576,
++      0x0005, 0x080c, 0x8042, 0x0010, 0x080c, 0x804b, 0x7003, 0x0200,
++      0x60c3, 0x0004, 0x080c, 0x8576, 0x0005, 0x080c, 0x804b, 0x7003,
++      0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x080c,
++      0x8576, 0x0005, 0x080c, 0x804b, 0x7003, 0x0200, 0x0804, 0x7e56,
++      0x080c, 0x804b, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a,
++      0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x080c,
++      0x8576, 0x0005, 0x00d6, 0x080c, 0x804b, 0x7003, 0x0210, 0x7007,
++      0x0014, 0x700b, 0x0800, 0x7810, 0x2068, 0x6894, 0x9086, 0x0014,
++      0x1198, 0x699c, 0x9184, 0x0030, 0x0190, 0x6998, 0x9184, 0xc000,
++      0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058, 0x700f, 0x0100,
++      0x0040, 0x700f, 0x0400, 0x0028, 0x700f, 0x0700, 0x0010, 0x700f,
++      0x0800, 0x00f6, 0x2079, 0x1152, 0x7904, 0x00fe, 0xd1ac, 0x1110,
++      0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x2009, 0x1174,
++      0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009, 0x1172,
++      0x210c, 0xd1e4, 0x0130, 0xc0c5, 0x9094, 0x0030, 0x9296, 0x0010,
++      0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108,
++      0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x080c, 0x8576,
++      0x0005, 0x080c, 0x804b, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f,
++      0x0100, 0x60c3, 0x0014, 0x080c, 0x8576, 0x0005, 0x080c, 0x804b,
++      0x7003, 0x0200, 0x0804, 0x7dc7, 0x080c, 0x804b, 0x7003, 0x0100,
++      0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x8576,
++      0x0005, 0x080c, 0x804b, 0x7003, 0x0100, 0x700b, 0x000b, 0x60c3,
++      0x0008, 0x080c, 0x8576, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046,
++      0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036,
++      0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0x8dc3, 0x7810,
++      0x2068, 0x6810, 0x9305, 0x7002, 0x6814, 0x7006, 0x6aa0, 0x2069,
++      0x1100, 0x6858, 0x700e, 0x9286, 0x007e, 0x1168, 0x9385, 0x00ff,
++      0x7002, 0x7007, 0xfffe, 0x2001, 0x12a7, 0x2004, 0x9005, 0x01e8,
++      0x6a78, 0x720e, 0x00d0, 0x9286, 0x007f, 0x1130, 0x9385, 0x00ff,
++      0x7002, 0x7007, 0xfffd, 0x0068, 0x68d8, 0xd0ac, 0x1110, 0xd2bc,
++      0x0160, 0x9286, 0x0080, 0x1128, 0x9385, 0x00ff, 0x7002, 0x7007,
++      0xfffc, 0x6874, 0x700a, 0x6878, 0x700e, 0x9485, 0x0029, 0x7012,
++      0x004e, 0x003e, 0x00de, 0x080c, 0x8565, 0x721a, 0x9f95, 0x0000,
++      0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026,
++      0x080c, 0x8dc3, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069,
++      0x1100, 0x6874, 0x700a, 0x6878, 0x700e, 0x00de, 0x7013, 0x2029,
++      0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f,
++      0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300,
++      0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019,
++      0x2300, 0x2021, 0x0100, 0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810,
++      0x9305, 0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6a58,
++      0x720e, 0x6ad8, 0xd2ac, 0x1118, 0x9092, 0x007e, 0x02a0, 0x7810,
++      0x00c6, 0x2060, 0x6010, 0x9005, 0x1140, 0x6014, 0x9005, 0x1128,
++      0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6874, 0x700a, 0x6878,
++      0x700e, 0x00ce, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e,
++      0x00de, 0x080c, 0x8565, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226,
++      0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x8565, 0x721a, 0x7a08,
++      0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00c6,
++      0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004,
++      0x908a, 0x0085, 0x0a0c, 0x0d7e, 0x908a, 0x0092, 0x1a0c, 0x0d7e,
++      0x6110, 0x2178, 0x79a0, 0x2011, 0x1136, 0x2214, 0xd2ac, 0x1110,
++      0xd1bc, 0x0148, 0x7900, 0xd1f4, 0x0120, 0x7914, 0x918c, 0x00ff,
++      0x0038, 0x900e, 0x0028, 0x91f8, 0x298c, 0x2f0d, 0x918c, 0x00ff,
++      0x2c78, 0x2061, 0x0100, 0x619a, 0x9082, 0x0085, 0x002b, 0x00fe,
++      0x00ee, 0x00de, 0x00ce, 0x0005, 0x80db, 0x80e1, 0x80ed, 0x80d9,
++      0x80d9, 0x80d9, 0x80db, 0x80d9, 0x80d9, 0x80d9, 0x80d9, 0x80d9,
++      0x80d9, 0x080c, 0x0d7e, 0x00e1, 0x60c3, 0x0000, 0x080c, 0x8576,
++      0x0005, 0x04a9, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff,
++      0x60c3, 0x000c, 0x080c, 0x8576, 0x0005, 0x080c, 0x8137, 0x7003,
++      0x0003, 0x7007, 0x0300, 0x60c3, 0x0004, 0x080c, 0x8576, 0x0005,
++      0x0026, 0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810, 0x9085, 0x8100,
++      0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac,
++      0x1118, 0x9092, 0x007e, 0x0240, 0x6874, 0x700a, 0x6878, 0x700e,
++      0x7013, 0x0009, 0x0804, 0x801b, 0x6a58, 0x720e, 0x0cc8, 0x0026,
++      0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810, 0x9085, 0x8400, 0x7002,
++      0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac, 0x1118,
++      0x9092, 0x007e, 0x0248, 0x6874, 0x700a, 0x6878, 0x700e, 0x2001,
++      0x0099, 0x7012, 0x0804, 0x808c, 0x6a58, 0x720e, 0x0cc0, 0x0026,
++      0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810, 0x9085, 0x8500, 0x7002,
++      0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac, 0x1118,
++      0x9092, 0x007e, 0x0248, 0x6874, 0x700a, 0x6878, 0x700e, 0x2001,
++      0x0099, 0x7012, 0x0804, 0x808c, 0x6a58, 0x720e, 0x0cc0, 0x00c6,
++      0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240,
++      0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d7e, 0x908a, 0x0054, 0x1a0c,
++      0x0d7e, 0x7910, 0x2160, 0x61a0, 0x2011, 0x1136, 0x2214, 0xd2ac,
++      0x1110, 0xd1bc, 0x0148, 0x6100, 0xd1f4, 0x0120, 0x6114, 0x918c,
++      0x00ff, 0x0038, 0x900e, 0x0028, 0x91e0, 0x298c, 0x2c0d, 0x918c,
++      0x00ff, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040, 0x002b, 0x00fe,
++      0x00ee, 0x00de, 0x00ce, 0x0005, 0x81a1, 0x825f, 0x8226, 0x8391,
++      0x819f, 0x819f, 0x819f, 0x819f, 0x819f, 0x819f, 0x819f, 0x893a,
++      0x8942, 0x894a, 0x8952, 0x819f, 0x8d0a, 0x819f, 0x8932, 0x080c,
++      0x0d7e, 0x780b, 0xffff, 0x080c, 0x81f4, 0x7914, 0x2168, 0x6978,
++      0x7956, 0x7132, 0x697c, 0x9184, 0x000f, 0x1118, 0x2001, 0x0005,
++      0x0040, 0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0x9084, 0x0006,
++      0x8004, 0x2010, 0x785c, 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042,
++      0xd1ac, 0x0128, 0x7047, 0x0002, 0x080c, 0x137e, 0x0050, 0xd1b4,
++      0x0118, 0x7047, 0x0001, 0x0028, 0x7047, 0x0000, 0x9016, 0x2230,
++      0x0010, 0x6ab0, 0x6eac, 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9,
++      0x0000, 0x9d88, 0x0023, 0x20e1, 0x0001, 0x2198, 0x20a1, 0x0252,
++      0x2069, 0x0200, 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3,
++      0x0020, 0x6017, 0x0009, 0x2001, 0x1320, 0x2003, 0x07d0, 0x2001,
++      0x131f, 0x2003, 0x0009, 0x0005, 0x00d6, 0x6813, 0x0008, 0x7a10,
++      0x2268, 0x6a8c, 0x8210, 0x9294, 0x00ff, 0x6a8e, 0x8217, 0x721a,
++      0x6a10, 0x9295, 0x0600, 0x7202, 0x6a14, 0x7206, 0x68a0, 0x6900,
++      0x2069, 0x1100, 0x6bd8, 0xd3ac, 0x1138, 0xd0bc, 0x0188, 0xd1f4,
++      0x0118, 0x9294, 0x00ff, 0x629a, 0x6a74, 0x720a, 0x6a78, 0x720e,
++      0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x00de, 0x0005,
++      0x9294, 0x00ff, 0x629a, 0x6a58, 0x720e, 0x0c90, 0x00d6, 0x0081,
++      0x7814, 0x2068, 0x6890, 0x7002, 0x688c, 0x7006, 0x68b0, 0x700a,
++      0x68ac, 0x700e, 0x60c3, 0x000c, 0x00de, 0x080c, 0x8576, 0x0005,
++      0x00d6, 0x6813, 0x0008, 0x7810, 0x2068, 0x6810, 0x9085, 0x0500,
++      0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac,
++      0x1110, 0xd0bc, 0x0188, 0x6874, 0x700a, 0x6878, 0x700e, 0x7013,
++      0x0889, 0x080c, 0x8565, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226,
++      0x2071, 0x024c, 0x00de, 0x0005, 0x6a58, 0x720e, 0x0c80, 0x00d6,
++      0x080c, 0x8364, 0x7814, 0x2068, 0x9084, 0xf000, 0x1130, 0x7814,
++      0x9084, 0x0700, 0x8007, 0x002b, 0x0010, 0x9006, 0x0013, 0x00de,
++      0x0005, 0x827b, 0x82e8, 0x82f8, 0x831f, 0x832c, 0x833e, 0x8346,
++      0x8279, 0x080c, 0x0d7e, 0x0016, 0x0036, 0x697c, 0x918c, 0x0003,
++      0x0118, 0x9186, 0x0003, 0x11a0, 0x6ba8, 0x7824, 0xd0cc, 0x1170,
++      0x7316, 0x6898, 0x701a, 0x6894, 0x701e, 0x003e, 0x001e, 0x2001,
++      0x12e8, 0x2004, 0x60c2, 0x080c, 0x8576, 0x0005, 0xc3e5, 0x0c80,
++      0x9186, 0x0001, 0x190c, 0x0d7e, 0x6ba8, 0x7824, 0xd0cc, 0x1904,
++      0x82e5, 0x7316, 0x6898, 0x701a, 0x6894, 0x701e, 0x68a4, 0x7026,
++      0x68ac, 0x702e, 0x2009, 0x0018, 0x9384, 0x0300, 0x0580, 0xd3c4,
++      0x0110, 0x68ac, 0x9108, 0xd3cc, 0x0110, 0x68a4, 0x9108, 0x2011,
++      0x0258, 0x0156, 0x20a9, 0x0008, 0x9d80, 0x002c, 0x201c, 0x831f,
++      0x2312, 0x8000, 0x8210, 0x1f04, 0x82be, 0x0016, 0x00d6, 0x2069,
++      0x0200, 0x080c, 0x8dae, 0x00de, 0x001e, 0x2011, 0x0240, 0x20a9,
++      0x0005, 0x201c, 0x831f, 0x2312, 0x8000, 0x8210, 0x1f04, 0x82d1,
++      0x015e, 0x9184, 0x0003, 0x0118, 0x2019, 0x0245, 0x201a, 0x61c2,
++      0x003e, 0x001e, 0x080c, 0x8576, 0x0005, 0xc3e5, 0x0804, 0x82a1,
++      0x2011, 0x0008, 0x2001, 0x110e, 0x2004, 0xd0a4, 0x0110, 0x2011,
++      0x0028, 0x7824, 0xd0cc, 0x1110, 0x7216, 0x0478, 0x0ce8, 0xc2e5,
++      0x2011, 0x0302, 0x0016, 0x782c, 0x701a, 0x7930, 0x711e, 0x9105,
++      0x0108, 0xc2dd, 0x001e, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216,
++      0x7027, 0x0012, 0x702f, 0x0008, 0x7043, 0x7000, 0x7047, 0x0500,
++      0x704f, 0x000a, 0x2069, 0x0200, 0x6813, 0x0009, 0x2071, 0x0240,
++      0x700b, 0x2500, 0x60c3, 0x0032, 0x080c, 0x8576, 0x0005, 0x2011,
++      0x0028, 0x7824, 0xd0cc, 0x1130, 0x7216, 0x60c3, 0x0018, 0x080c,
++      0x8576, 0x0005, 0x0cc8, 0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc,
++      0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858, 0x9084, 0x00ff,
++      0x7036, 0x60c3, 0x0020, 0x080c, 0x8576, 0x0005, 0x2011, 0x0008,
++      0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x08f8, 0x0036, 0x7b14,
++      0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001, 0x1138, 0x7824,
++      0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0878, 0x0046, 0x2021,
++      0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108, 0xc4e5, 0x7416,
++      0x004e, 0x701e, 0x003e, 0x0808, 0x00d6, 0x6813, 0x0008, 0x7a10,
++      0x2268, 0x6810, 0x9085, 0x0700, 0x7002, 0x6814, 0x7006, 0x68a0,
++      0x2069, 0x1100, 0x6ad8, 0xd2ac, 0x1110, 0xd0bc, 0x01a0, 0x6874,
++      0x700a, 0x6878, 0x700e, 0x7824, 0xd0cc, 0x1180, 0x7013, 0x0898,
++      0x080c, 0x8565, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071,
++      0x024c, 0x00de, 0x0005, 0x6a58, 0x720e, 0x0c68, 0x7013, 0x0889,
++      0x0c78, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e,
++      0x0005, 0x83a1, 0x83a1, 0x83a3, 0x83a1, 0x83a1, 0x83a1, 0x83c0,
++      0x83a1, 0x080c, 0x0d7e, 0x7914, 0x918c, 0xf8ff, 0x918d, 0x0600,
++      0x7916, 0x2009, 0x0003, 0x00d1, 0x00d6, 0x2069, 0x1152, 0x6804,
++      0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010,
++      0x7033, 0x3f00, 0x00de, 0x60c3, 0x0001, 0x080c, 0x8576, 0x0005,
++      0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0ca8, 0x00d6, 0x0016,
++      0x080c, 0x8dc3, 0x001e, 0x7810, 0x2068, 0x6810, 0x9085, 0x0100,
++      0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac,
++      0x1110, 0xd0bc, 0x0190, 0x6a74, 0x720a, 0x6a78, 0x720e, 0x7013,
++      0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x8565, 0x721a, 0x7a08,
++      0x7222, 0x2f10, 0x7226, 0x00de, 0x0005, 0x6a58, 0x720e, 0x0c78,
++      0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100,
++      0x2071, 0x1100, 0x7158, 0x7810, 0x2068, 0x68a0, 0x2028, 0x6910,
++      0x6a14, 0x76d8, 0xd6ac, 0x1128, 0xd0bc, 0x1118, 0x901e, 0x7458,
++      0x0010, 0x7374, 0x7478, 0x7820, 0x90be, 0x0006, 0x0904, 0x84dd,
++      0x90be, 0x000a, 0x1904, 0x8496, 0x609f, 0x0000, 0x7814, 0x2070,
++      0x707c, 0xd0fc, 0x0904, 0x845d, 0x7790, 0x9784, 0xff00, 0x9105,
++      0x6062, 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x9080, 0x001e,
++      0x2004, 0x9005, 0x000e, 0x1160, 0x7794, 0x87ff, 0x0548, 0x2039,
++      0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0470,
++      0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f,
++      0x0000, 0x2001, 0x1136, 0x2004, 0x9084, 0x0020, 0x11d8, 0x2001,
++      0x1136, 0x2004, 0x9084, 0x0008, 0x0140, 0x7814, 0x9080, 0x001d,
++      0x2004, 0x8007, 0x9082, 0x0080, 0x1268, 0x6814, 0x609e, 0x0050,
++      0x2039, 0x0029, 0x9705, 0x6072, 0x0028, 0x9185, 0x0200, 0x6062,
++      0x6073, 0x2029, 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a,
++      0x646e, 0x6077, 0x0000, 0x688c, 0x8000, 0x9084, 0x00ff, 0x688e,
++      0x8007, 0x607a, 0x607f, 0x0000, 0x7038, 0x608a, 0x7034, 0x608e,
++      0x7048, 0x60c6, 0x7044, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5,
++      0x60d7, 0x0000, 0x080c, 0x8da8, 0x2009, 0x07d0, 0x60c4, 0x9084,
++      0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7276, 0x003e,
++      0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x9185, 0x0100,
++      0x6062, 0x6266, 0x636a, 0x646e, 0x6073, 0x0809, 0x6077, 0x0008,
++      0x60af, 0x95d5, 0x60d7, 0x0000, 0x688c, 0x8000, 0x9084, 0x00ff,
++      0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808,
++      0x6086, 0x7814, 0x2070, 0x7038, 0x608a, 0x7034, 0x608e, 0x7048,
++      0x60c6, 0x7044, 0x60ca, 0x686c, 0x60ce, 0x9582, 0x0080, 0x0240,
++      0x6a00, 0xd2f4, 0x0120, 0x6a14, 0x9294, 0x00ff, 0x0008, 0x9016,
++      0x629e, 0x080c, 0x8da8, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0,
++      0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7276, 0x003e, 0x004e,
++      0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7814, 0x2070, 0x707c,
++      0x9084, 0x0003, 0x9086, 0x0002, 0x05e8, 0x9185, 0x0100, 0x6062,
++      0x6266, 0x636a, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c,
++      0x8000, 0x9084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x7838, 0x607e,
++      0x2f00, 0x6086, 0x7808, 0x6082, 0x7090, 0x608a, 0x708c, 0x608e,
++      0x70b0, 0x60c6, 0x70ac, 0x60ca, 0x70ac, 0x7930, 0x9108, 0x7932,
++      0x70b0, 0x792c, 0x9109, 0x792e, 0x686c, 0x60ce, 0x60af, 0x95d5,
++      0x60d7, 0x0000, 0x9582, 0x0080, 0x0240, 0x6a00, 0xd2f4, 0x0120,
++      0x6a14, 0x9294, 0x00ff, 0x0008, 0x9016, 0x629e, 0x080c, 0x8d83,
++      0x0804, 0x84cb, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e,
++      0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073,
++      0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0x9084, 0x00ff, 0x688e,
++      0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082,
++      0x7038, 0x608a, 0x7034, 0x608e, 0x7048, 0x60c6, 0x7044, 0x60ca,
++      0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x9582, 0x0080,
++      0x0240, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0x9294, 0x00ff, 0x0008,
++      0x9016, 0x629e, 0x7824, 0xd0cc, 0x0120, 0x080c, 0x8da8, 0x0804,
++      0x84cb, 0x080c, 0x8d83, 0x0804, 0x84cb, 0x7a10, 0x9280, 0x0023,
++      0x2014, 0x8210, 0x9294, 0x00ff, 0x2202, 0x8217, 0x0005, 0x00d6,
++      0x2069, 0x1304, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056,
++      0x60a7, 0x9575, 0x00f1, 0x080c, 0x7268, 0x0005, 0x0016, 0x2001,
++      0x110c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089,
++      0x080c, 0x7268, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x110c, 0x2102,
++      0x2001, 0x1305, 0x2003, 0x0000, 0x2001, 0x130d, 0x2003, 0x0000,
++      0x0c88, 0x0006, 0x6014, 0x9084, 0x1804, 0x9085, 0x0009, 0x6016,
++      0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x61a4,
++      0x60a7, 0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, 0x0008, 0x6016,
++      0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005,
++      0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140,
++      0x080c, 0x62e4, 0x1198, 0x2001, 0x1320, 0x2004, 0x9005, 0x15d0,
++      0x0066, 0x2031, 0x0001, 0x080c, 0x6380, 0x006e, 0x1118, 0x080c,
++      0x7268, 0x0480, 0x00c6, 0x2061, 0x1304, 0x00f0, 0x6904, 0x9194,
++      0x4000, 0x0568, 0x0839, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006,
++      0x080c, 0x2401, 0x00c6, 0x2061, 0x1304, 0x6128, 0x9192, 0x00c8,
++      0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c,
++      0x7268, 0x080c, 0x8599, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140,
++      0x080c, 0xc463, 0x080c, 0x7271, 0x2009, 0x0014, 0x080c, 0x8f53,
++      0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001,
++      0x1320, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x1304, 0x6128,
++      0x9192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x7268,
++      0x080c, 0x4faa, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026,
++      0x080c, 0x727e, 0x2071, 0x1304, 0x713c, 0x81ff, 0x0904, 0x868e,
++      0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x62e4, 0x11b0, 0x0036,
++      0x2019, 0x0002, 0x080c, 0x8847, 0x003e, 0x713c, 0x2160, 0x080c,
++      0xc463, 0x2009, 0x004a, 0x080c, 0x8f53, 0x0066, 0x2031, 0x0001,
++      0x080c, 0x6380, 0x006e, 0x0804, 0x868e, 0x6904, 0x9194, 0x4000,
++      0x0904, 0x8694, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006, 0x080c,
++      0x2401, 0x00c6, 0x703c, 0x9065, 0x090c, 0x0d7e, 0x6020, 0x00ce,
++      0x9086, 0x0006, 0x1528, 0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009,
++      0x110c, 0x2104, 0xd0d4, 0x01e0, 0x6214, 0x9294, 0x1800, 0x1128,
++      0x6224, 0x9294, 0x0002, 0x1510, 0x0030, 0xc0d4, 0x200a, 0xd0cc,
++      0x0110, 0x080c, 0x2369, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010,
++      0x6016, 0x703c, 0x2060, 0x2009, 0x0049, 0x080c, 0x8f53, 0x0070,
++      0x0036, 0x2019, 0x0001, 0x080c, 0x8847, 0x003e, 0x713c, 0x2160,
++      0x080c, 0xc463, 0x2009, 0x004a, 0x080c, 0x8f53, 0x002e, 0x001e,
++      0x00ee, 0x00de, 0x00ce, 0x0005, 0x0804, 0x8651, 0x0026, 0x00e6,
++      0x2071, 0x1304, 0x7048, 0xd084, 0x01c0, 0x713c, 0x81ff, 0x01a8,
++      0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138,
++      0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x0030, 0x7014,
++      0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005,
++      0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, 0x0126,
++      0x2091, 0x8000, 0x6010, 0x2068, 0x6ca0, 0x2071, 0x1304, 0x7018,
++      0x2068, 0x8dff, 0x0188, 0x68a0, 0x9406, 0x0118, 0x6854, 0x2068,
++      0x0cc0, 0x6014, 0x2060, 0x646c, 0x6570, 0x6678, 0x2d60, 0x080c,
++      0x5728, 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e,
++      0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x080c, 0x7fd5, 0x7003,
++      0x1200, 0x7820, 0x9086, 0x0004, 0x1110, 0x6098, 0x0018, 0x2001,
++      0x1116, 0x2004, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3,
++      0x002c, 0x080c, 0x8576, 0x0005, 0x080c, 0x7fd5, 0x7003, 0x0f00,
++      0x7808, 0x700e, 0x60c3, 0x0008, 0x080c, 0x8576, 0x0005, 0x0156,
++      0x080c, 0x804b, 0x7003, 0x0200, 0x2011, 0x1148, 0x63f0, 0x2312,
++      0x20a9, 0x0006, 0x2011, 0x1140, 0x2019, 0x1141, 0x9ef0, 0x0002,
++      0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002,
++      0x1f04, 0x8718, 0x60c3, 0x001c, 0x080c, 0x8576, 0x015e, 0x0005,
++      0x0016, 0x0026, 0x080c, 0x8027, 0x080c, 0x8039, 0x9e80, 0x0004,
++      0x20e9, 0x0000, 0x20a0, 0x7814, 0x9080, 0x0000, 0x2004, 0x9080,
++      0x0021, 0x20e1, 0x0001, 0x2098, 0x7808, 0x9088, 0x0002, 0x21a8,
++      0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2,
++      0x080c, 0x8576, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003,
++      0x080c, 0x8dae, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c,
++      0x7fd5, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x080c,
++      0x8576, 0x0005, 0x0016, 0x0026, 0x080c, 0x7fd5, 0x20e9, 0x0000,
++      0x20a1, 0x024c, 0x7814, 0x9080, 0x0000, 0x2004, 0x9080, 0x0023,
++      0x20e1, 0x0001, 0x2098, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003,
++      0x8003, 0x60c2, 0x080c, 0x8576, 0x002e, 0x001e, 0x0005, 0x00e6,
++      0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1304, 0x700c,
++      0x2060, 0x8cff, 0x0178, 0x080c, 0xab2e, 0x1110, 0x080c, 0x97dc,
++      0x600c, 0x0006, 0x080c, 0xad68, 0x080c, 0x8ed9, 0x080c, 0x895e,
++      0x00ce, 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce,
++      0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
++      0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x110c, 0x200c,
++      0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
++      0x1304, 0x7024, 0x2060, 0x8cff, 0x0904, 0x87ff, 0x080c, 0x85a2,
++      0x6ac0, 0x68c3, 0x0000, 0x080c, 0x7271, 0x00c6, 0x2061, 0x0100,
++      0x080c, 0x8dc7, 0x00ce, 0x2009, 0x0013, 0x080c, 0x8f53, 0x20a9,
++      0x01f4, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804, 0x9084,
++      0x4000, 0x01d0, 0x2001, 0x1000, 0x080c, 0x2401, 0x9006, 0x080c,
++      0x2401, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04,
++      0x87d1, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
++      0x2401, 0x9006, 0x080c, 0x2401, 0x6824, 0x000e, 0x001e, 0x002e,
++      0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001,
++      0x1100, 0x2004, 0x9096, 0x0001, 0x05c0, 0x9096, 0x0004, 0x05a8,
++      0x080c, 0x7271, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5,
++      0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x4f57, 0x080c, 0x71fa,
++      0x20a9, 0x01f4, 0x6824, 0xd094, 0x0170, 0x6827, 0x0004, 0x7804,
++      0x9084, 0x4000, 0x01d0, 0x7803, 0x1000, 0x080c, 0x2401, 0x9006,
++      0x080c, 0x2401, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010,
++      0x1f04, 0x881a, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100,
++      0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x000e, 0x001e, 0x002e,
++      0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126,
++      0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006,
++      0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2001, 0x110c,
++      0x200c, 0x918c, 0xdbff, 0x2102, 0x2071, 0x1304, 0x703c, 0x2060,
++      0x8cff, 0x0904, 0x88d8, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084,
++      0x0002, 0x0904, 0x88d8, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009,
++      0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x727e,
++      0x080c, 0x1872, 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021,
++      0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af,
++      0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090,
++      0x2071, 0x134a, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816,
++      0x782b, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002,
++      0x1128, 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x12bb,
++      0x2004, 0x200a, 0x004e, 0x939d, 0x0000, 0x1120, 0x2009, 0x0049,
++      0x080c, 0x8f53, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0170, 0x6827,
++      0x0004, 0x7804, 0x9084, 0x4000, 0x01d0, 0x2001, 0x1000, 0x080c,
++      0x2401, 0x9006, 0x080c, 0x2401, 0x0090, 0xd08c, 0x0118, 0x6827,
++      0x0002, 0x0010, 0x1f04, 0x88b4, 0x7804, 0x9084, 0x1000, 0x0138,
++      0x2001, 0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401, 0x6824,
++      0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e,
++      0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x1304,
++      0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000,
++      0x2069, 0x1304, 0x6a32, 0x012e, 0x00de, 0x0005, 0x00f6, 0x00e6,
++      0x00c6, 0x0066, 0x0006, 0x0126, 0x2071, 0x1304, 0x7614, 0x2660,
++      0x2678, 0x2091, 0x8000, 0x8cff, 0x0530, 0x6020, 0x9206, 0x11f8,
++      0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140,
++      0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000,
++      0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++      0x600f, 0x0000, 0x080c, 0x8f09, 0x04c9, 0x00ce, 0x08e0, 0x2c78,
++      0x600c, 0x2060, 0x08c0, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee,
++      0x00fe, 0x0005, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++      0x1000, 0x00f8, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++      0x4000, 0x00b8, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++      0x2000, 0x0078, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++      0x0400, 0x0038, 0x080c, 0x81f4, 0x7814, 0x7032, 0x7042, 0x7047,
++      0x0200, 0x60c3, 0x0020, 0x080c, 0x8576, 0x0005, 0x00e6, 0x2071,
++      0x1304, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005,
++      0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126,
++      0x2091, 0x8000, 0x2071, 0x1304, 0x7614, 0x2660, 0x2678, 0x2039,
++      0x0001, 0x87ff, 0x0904, 0x89fa, 0x8cff, 0x0904, 0x89fa, 0x6020,
++      0x9086, 0x0006, 0x1904, 0x89f5, 0x88ff, 0x0138, 0x2800, 0x9c06,
++      0x1904, 0x89f5, 0x2039, 0x0000, 0x0050, 0x6010, 0x9206, 0x1904,
++      0x89f5, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x89f5, 0x7024,
++      0x9c06, 0x1578, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0530, 0x080c,
++      0x7271, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008,
++      0x68c3, 0x0000, 0x080c, 0x8a7d, 0x7027, 0x0000, 0x0036, 0x2069,
++      0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
++      0x2401, 0x9006, 0x080c, 0x2401, 0x2069, 0x0100, 0x6824, 0xd084,
++      0x0110, 0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a,
++      0x0460, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36,
++      0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013,
++      0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008,
++      0x2678, 0x89ff, 0x1158, 0x600f, 0x0000, 0x6014, 0x2068, 0x080c,
++      0xa942, 0x0110, 0x080c, 0xc0e9, 0x080c, 0x8f09, 0x080c, 0x895e,
++      0x88ff, 0x1190, 0x00ce, 0x0804, 0x8979, 0x2c78, 0x600c, 0x2060,
++      0x0804, 0x8979, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce,
++      0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5,
++      0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026,
++      0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1304, 0x7638, 0x2660,
++      0x2678, 0x8cff, 0x0904, 0x8a6d, 0x6020, 0x9086, 0x0006, 0x1904,
++      0x8a68, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0x8a68, 0x0040,
++      0x6010, 0x9206, 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x15c0,
++      0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0x8847,
++      0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, 0x704a, 0x003e,
++      0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140,
++      0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000,
++      0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++      0x600f, 0x0000, 0x6014, 0x2068, 0x080c, 0xa942, 0x0110, 0x080c,
++      0xc0e9, 0x080c, 0x8f09, 0x87ff, 0x1190, 0x00ce, 0x0804, 0x8a19,
++      0x2c78, 0x600c, 0x2060, 0x0804, 0x8a19, 0x9006, 0x012e, 0x000e,
++      0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b,
++      0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c88, 0x00e6, 0x2071, 0x1304,
++      0x2001, 0x1100, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007, 0x0005,
++      0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6,
++      0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1304,
++      0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, 0x9c06,
++      0x11e0, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36,
++      0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037,
++      0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++      0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78, 0x600c, 0x2060,
++      0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, 0x00fe,
++      0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0006, 0x0126,
++      0x2091, 0x8000, 0x2071, 0x1304, 0x760c, 0x2660, 0x2678, 0x8cff,
++      0x0904, 0x8b56, 0x6010, 0x9080, 0x0028, 0x2004, 0x9206, 0x1904,
++      0x8b51, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005,
++      0x0904, 0x8b2d, 0x080c, 0x85a2, 0x68c3, 0x0000, 0x080c, 0x8a7d,
++      0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
++      0x0138, 0x2001, 0x0100, 0x080c, 0x2401, 0x9006, 0x080c, 0x2401,
++      0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
++      0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140,
++      0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000,
++      0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
++      0x600f, 0x0000, 0x080c, 0xab1d, 0x1158, 0x080c, 0x2886, 0x080c,
++      0xab2e, 0x11f0, 0x080c, 0x97dc, 0x00d8, 0x080c, 0x8a7d, 0x08c0,
++      0x080c, 0xab2e, 0x1118, 0x080c, 0x97dc, 0x0090, 0x6014, 0x2068,
++      0x080c, 0xa942, 0x0168, 0x6020, 0x9086, 0x0003, 0x11f8, 0x6867,
++      0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11,
++      0x080c, 0xad68, 0x080c, 0x8f09, 0x080c, 0x895e, 0x00ce, 0x0804,
++      0x8ad7, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8ad7, 0x012e, 0x000e,
++      0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086,
++      0x0006, 0x1d30, 0x080c, 0xc0e9, 0x0c18, 0x00d6, 0x080c, 0x804b,
++      0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001,
++      0x2099, 0x12c3, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004,
++      0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x8576, 0x00de,
++      0x0005, 0x080c, 0x804b, 0x7003, 0x0214, 0x7007, 0x0018, 0x700b,
++      0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff,
++      0x7022, 0x782c, 0x7026, 0x60c3, 0x0018, 0x080c, 0x8576, 0x0005,
++      0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xaf4e,
++      0x00de, 0x1904, 0x8bfe, 0x080c, 0x7fd5, 0x7003, 0x1300, 0x782c,
++      0x2068, 0x6820, 0x9086, 0x0003, 0x0570, 0x7810, 0x9080, 0x0028,
++      0x2014, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x11d0, 0x9286, 0x007e,
++      0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x04a8, 0x9286, 0x007f,
++      0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, 0x0468, 0xd2bc, 0x0180,
++      0x9286, 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0418,
++      0x92e8, 0x1000, 0x2d6c, 0x6810, 0x700a, 0x6814, 0x700e, 0x00d8,
++      0x6098, 0x700e, 0x00c0, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x1138,
++      0x7810, 0x9080, 0x0028, 0x2004, 0x9082, 0x007e, 0x0250, 0x00d6,
++      0x2069, 0x111d, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de,
++      0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3,
++      0x000c, 0x001e, 0x00de, 0x080c, 0x8576, 0x0005, 0x781b, 0x0001,
++      0x7803, 0x0006, 0x001e, 0x00de, 0x0005, 0x792c, 0x9180, 0x0008,
++      0x200c, 0x9186, 0x0006, 0x01b0, 0x9186, 0x0003, 0x0904, 0x8c75,
++      0x9186, 0x0005, 0x0904, 0x8c5e, 0x9186, 0x0004, 0x05c8, 0x9186,
++      0x0008, 0x0904, 0x8c66, 0x7807, 0x0037, 0x7817, 0x1700, 0x080c,
++      0x8cda, 0x0005, 0x080c, 0x8c9a, 0x00d6, 0x0026, 0x792c, 0x2168,
++      0x2009, 0x4000, 0x6800, 0x0002, 0x8c3f, 0x8c4a, 0x8c41, 0x8c4a,
++      0x8c46, 0x8c3f, 0x8c3f, 0x8c4a, 0x8c4a, 0x8c4a, 0x8c4a, 0x8c3f,
++      0x8c3f, 0x8c3f, 0x8c3f, 0x8c3f, 0x8c4a, 0x8c3f, 0x8c4a, 0x080c,
++      0x0d7e, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010,
++      0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x8c92,
++      0x080c, 0x8c9a, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000,
++      0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04a0, 0x04d9, 0x00d6,
++      0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0460, 0x0499, 0x00d6,
++      0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118,
++      0x9286, 0x0002, 0x1108, 0x900e, 0x00e8, 0x0421, 0x00d6, 0x0026,
++      0x792c, 0x2168, 0x6814, 0x2068, 0x69ac, 0x6834, 0x9112, 0x69b0,
++      0x6838, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000, 0x2004,
++      0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, 0x4000,
++      0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, 0x080c,
++      0x8576, 0x0005, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x804b,
++      0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810,
++      0x9080, 0x0028, 0x2004, 0x2011, 0x1136, 0x2214, 0xd2ac, 0x1118,
++      0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, 0x111d, 0x2d2c, 0x8d68,
++      0x2d34, 0x90e8, 0x1000, 0x2d6c, 0x6b10, 0x6c14, 0x00de, 0x0028,
++      0x901e, 0x6498, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008,
++      0x2004, 0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e,
++      0x0020, 0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e,
++      0x003e, 0x0005, 0x080c, 0x804b, 0x7003, 0x0100, 0x700b, 0x0009,
++      0x7814, 0x700e, 0x60c3, 0x0008, 0x080c, 0x8576, 0x0005, 0x080c,
++      0x7fcc, 0x7003, 0x1400, 0x7838, 0x700a, 0x783c, 0x700e, 0x782c,
++      0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a,
++      0x60c3, 0x0010, 0x080c, 0x8576, 0x0005, 0x080c, 0x8042, 0x7003,
++      0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x080c,
++      0x8576, 0x0005, 0x0029, 0x60c3, 0x0000, 0x080c, 0x8576, 0x0005,
++      0x00d6, 0x080c, 0x8dc3, 0x7810, 0x2068, 0x6810, 0x9085, 0x0300,
++      0x7002, 0x6814, 0x7006, 0x68a0, 0x2069, 0x1100, 0x6ad8, 0xd2ac,
++      0x1110, 0xd0bc, 0x0188, 0x6874, 0x700a, 0x6878, 0x700e, 0x7013,
++      0x0819, 0x080c, 0x8565, 0x721a, 0x2f10, 0x7222, 0x7a08, 0x7226,
++      0x2071, 0x024c, 0x00de, 0x0005, 0x6234, 0x720e, 0x0c80, 0x0059,
++      0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x080c, 0x8599,
++      0x080c, 0x7268, 0x0005, 0x0036, 0x00d6, 0x00e6, 0x7858, 0x2068,
++      0x9df0, 0x001b, 0x7210, 0x9296, 0x00c0, 0x9294, 0xfffd, 0x7212,
++      0x7214, 0x9294, 0x0300, 0x7216, 0x7100, 0x9194, 0x00ff, 0x7308,
++      0x9384, 0x00ff, 0x908d, 0xc200, 0x7102, 0x9384, 0xff00, 0x9215,
++      0x720a, 0x7004, 0x720c, 0x700e, 0x7206, 0x00d6, 0x2069, 0x0200,
++      0x080c, 0x8dc3, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
++      0x000a, 0x20e1, 0x0001, 0x2e98, 0x4003, 0x60a3, 0x0035, 0x6a68,
++      0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037, 0x00ee,
++      0x00de, 0x003e, 0x0005, 0x900e, 0x7814, 0x9080, 0x001f, 0x2004,
++      0xd0fc, 0x01d8, 0x9084, 0x0003, 0x11c0, 0x2001, 0x110c, 0x2004,
++      0xd0bc, 0x0198, 0x7824, 0xd0cc, 0x1180, 0xd0c4, 0x1170, 0x7814,
++      0x9080, 0x002a, 0x2004, 0x9005, 0x1140, 0x2001, 0x110c, 0x200c,
++      0xc1d5, 0x2102, 0x2009, 0x12e9, 0x210c, 0x918d, 0x0092, 0x0010,
++      0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, 0x2009, 0x0009,
++      0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009,
++      0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028,
++      0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x00d6,
++      0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813,
++      0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292,
++      0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff,
++      0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00d6,
++      0x0156, 0x080c, 0x804b, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100,
++      0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007,
++      0x0000, 0x2069, 0x1100, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110,
++      0xc38d, 0x0060, 0x080c, 0x62e4, 0x1110, 0xc3ad, 0x0008, 0xc3a5,
++      0x6ad8, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011,
++      0x1148, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1140, 0x2019,
++      0x1141, 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398,
++      0x0002, 0x9290, 0x0002, 0x1f04, 0x8e1b, 0x60c3, 0x0040, 0x080c,
++      0x8576, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x804b, 0x7a14,
++      0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238,
++      0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x04b8, 0x7003,
++      0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x12f4, 0x2204,
++      0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x2001, 0x1136,
++      0x2004, 0xd0ac, 0x1138, 0x7810, 0x9080, 0x0028, 0x2004, 0x9082,
++      0x007f, 0x0248, 0x2001, 0x111d, 0x2004, 0x7022, 0x2001, 0x111e,
++      0x2004, 0x7026, 0x0030, 0x2001, 0x1116, 0x2004, 0x9084, 0x00ff,
++      0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1105, 0x20e9,
++      0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x080c, 0x8576,
++      0x015e, 0x0005, 0x2061, 0x15c0, 0x2071, 0x1100, 0x706c, 0x704e,
++      0x7053, 0x15c0, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1100, 0x2091,
++      0x8000, 0x754c, 0x9582, 0x0010, 0x0608, 0x7050, 0x2060, 0x6000,
++      0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7060, 0x9c02, 0x1208,
++      0x0cb0, 0x2061, 0x15c0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754e,
++      0x9ca8, 0x0018, 0x7060, 0x9502, 0x1230, 0x7552, 0x9085, 0x0001,
++      0x012e, 0x00ee, 0x0005, 0x7053, 0x15c0, 0x0cc0, 0x9006, 0x0cc0,
++      0x00e6, 0x2071, 0x1100, 0x754c, 0x9582, 0x0010, 0x0600, 0x7050,
++      0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7060,
++      0x9c02, 0x1208, 0x0cb0, 0x2061, 0x15c0, 0x0c98, 0x6003, 0x0008,
++      0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, 0x9502, 0x1228, 0x7552,
++      0x9085, 0x0001, 0x00ee, 0x0005, 0x7053, 0x15c0, 0x0cc8, 0x9006,
++      0x0cc8, 0x9c82, 0x15c0, 0x0a0c, 0x0d7e, 0x2001, 0x1118, 0x2004,
++      0x9c02, 0x1a0c, 0x0d7e, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016,
++      0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x6056,
++      0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e,
++      0x6042, 0x2061, 0x1100, 0x604c, 0x8000, 0x604e, 0x9086, 0x0001,
++      0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e,
++      0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, 0x601c, 0xd084,
++      0x190c, 0x1509, 0x6017, 0x0000, 0x6023, 0x0007, 0x2001, 0x12c0,
++      0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a,
++      0x080c, 0xc381, 0x6043, 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126,
++      0x2071, 0x1100, 0x2091, 0x8000, 0x754c, 0x9582, 0x0001, 0x0608,
++      0x7050, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018,
++      0x7060, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x15c0, 0x0c98, 0x6003,
++      0x0008, 0x8529, 0x754e, 0x9ca8, 0x0018, 0x7060, 0x9502, 0x1230,
++      0x7552, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7053, 0x15c0,
++      0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0x8f66,
++      0x8f75, 0x8f90, 0x8fab, 0xaf90, 0xafab, 0xafc6, 0x8f66, 0x8f75,
++      0x8f66, 0x8fc7, 0x8f66, 0x8f66, 0x8f66, 0x8f66, 0x9186, 0x0013,
++      0x1128, 0x080c, 0x79ab, 0x080c, 0x7aa4, 0x0005, 0x9186, 0x0047,
++      0x1118, 0x9016, 0x080c, 0x137c, 0x0005, 0x0066, 0x6000, 0x90b2,
++      0x0016, 0x1a0c, 0x0d7e, 0x0013, 0x006e, 0x0005, 0x8f8e, 0x9655,
++      0x9815, 0x8f8e, 0x98a2, 0x9248, 0x8f8e, 0x8f8e, 0x95e1, 0x9d9e,
++      0x8f8e, 0x8f8e, 0x8f8e, 0x8f8e, 0x8f8e, 0x8f8e, 0x080c, 0x0d7e,
++      0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7e, 0x0013, 0x006e,
++      0x0005, 0x8fa9, 0xa3c8, 0x8fa9, 0x8fa9, 0x8fa9, 0x8fa9, 0x8fa9,
++      0x8fa9, 0xa36e, 0xa544, 0x8fa9, 0xa3fb, 0xa478, 0xa3fb, 0xa478,
++      0x8fa9, 0x080c, 0x0d7e, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d7e,
++      0x6000, 0x0002, 0x8fc5, 0x9ddf, 0x9eaf, 0x9fd9, 0xa13a, 0x8fc5,
++      0x8fc5, 0x8fc5, 0x9db9, 0xa31e, 0xa321, 0x8fc5, 0x8fc5, 0x8fc5,
++      0x8fc5, 0xa34b, 0x8fc5, 0x8fc5, 0x8fc5, 0x080c, 0x0d7e, 0x0066,
++      0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7e, 0x0013, 0x006e, 0x0005,
++      0x8fe0, 0x8fe0, 0x901f, 0x90ad, 0x910e, 0x8fe0, 0x8fe0, 0x8fe0,
++      0x8fe2, 0x8fe0, 0x8fe0, 0x8fe0, 0x8fe0, 0x8fe0, 0x8fe0, 0x8fe0,
++      0x080c, 0x0d7e, 0x9186, 0x004c, 0x0588, 0x9186, 0x0003, 0x190c,
++      0x0d7e, 0x00d6, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106,
++      0x6014, 0x2068, 0x687c, 0x9084, 0x8000, 0xc0b5, 0x687e, 0x68ac,
++      0x6846, 0x68b0, 0x684a, 0x9006, 0x6836, 0x683a, 0x6884, 0x9092,
++      0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210,
++      0x621a, 0x00de, 0x2c10, 0x080c, 0x1605, 0x080c, 0x75db, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x7b72, 0x012e, 0x0005, 0x6010, 0x9080,
++      0x0028, 0x2024, 0x8427, 0x2c00, 0x080c, 0x912f, 0x0005, 0x00d6,
++      0x00f6, 0x2079, 0x1100, 0x7a88, 0x9290, 0x0018, 0x6014, 0x2068,
++      0x6c78, 0x0046, 0x68e0, 0x9005, 0x1140, 0x68dc, 0x921a, 0x0140,
++      0x0220, 0x687b, 0x0007, 0x2010, 0x0028, 0x687b, 0x0015, 0x0010,
++      0x687b, 0x0000, 0x8214, 0x6883, 0x0000, 0x6a02, 0x0006, 0x0016,
++      0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108,
++      0x009a, 0x2100, 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038,
++      0x2100, 0x9086, 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4,
++      0x0007, 0x8423, 0x9405, 0x0002, 0x907e, 0x907e, 0x9079, 0x907c,
++      0x907e, 0x9076, 0x906c, 0x906c, 0x906c, 0x906c, 0x906c, 0x906c,
++      0x906c, 0x906c, 0x906c, 0x906c, 0x00fe, 0x00ee, 0x00de, 0x00ce,
++      0x002e, 0x001e, 0x000e, 0x000e, 0x080c, 0x0d7e, 0x080c, 0x9a2c,
++      0x0028, 0x080c, 0x9b03, 0x0010, 0x080c, 0x9bfa, 0x00fe, 0x00ee,
++      0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0x6896, 0x000e, 0x080c,
++      0x91df, 0x01e8, 0x6804, 0x680e, 0x200c, 0x9080, 0x0002, 0x6acc,
++      0x6bd0, 0x6cd4, 0x6dd8, 0x2039, 0x0001, 0x2031, 0x0000, 0x2041,
++      0x1091, 0x080c, 0x9367, 0x0158, 0x000e, 0x9005, 0x0118, 0x00fe,
++      0x00de, 0x0005, 0x00fe, 0x00de, 0x080c, 0x8ed9, 0x0005, 0x2001,
++      0x002c, 0x900e, 0x080c, 0x923d, 0x0c78, 0x9182, 0x0047, 0x0002,
++      0x90b9, 0x90b9, 0x90bb, 0x90e8, 0x90b9, 0x90b9, 0x90b9, 0x90b9,
++      0x90fa, 0x080c, 0x0d7e, 0x00d6, 0x0016, 0x080c, 0x7a55, 0x080c,
++      0x7b72, 0x6003, 0x0004, 0x6114, 0x2168, 0x687c, 0xd0fc, 0x0188,
++      0x6878, 0x9005, 0x1158, 0x6894, 0x9005, 0x0140, 0x2001, 0x0000,
++      0x900e, 0x080c, 0x923d, 0x080c, 0x8ed9, 0x0078, 0x6003, 0x0002,
++      0x0060, 0x687f, 0x0020, 0x688c, 0x688a, 0x68a4, 0x68ae, 0x68a8,
++      0x68b2, 0x68c7, 0x0000, 0x68cb, 0x0000, 0x001e, 0x00de, 0x0005,
++      0x080c, 0x7a55, 0x00d6, 0x6114, 0x2168, 0x080c, 0xa942, 0x0120,
++      0x687b, 0x0006, 0x080c, 0x5b76, 0x00de, 0x080c, 0x8ed9, 0x080c,
++      0x7b72, 0x0005, 0x080c, 0x7a55, 0x080c, 0x2862, 0x00d6, 0x6114,
++      0x2168, 0x080c, 0xa942, 0x0120, 0x687b, 0x0029, 0x080c, 0x5b76,
++      0x00de, 0x080c, 0x8ed9, 0x080c, 0x7b72, 0x0005, 0x9182, 0x0047,
++      0x0002, 0x911e, 0x9120, 0x911e, 0x911e, 0x911e, 0x911e, 0x911e,
++      0x911e, 0x911e, 0x911e, 0x911e, 0x911e, 0x9120, 0x080c, 0x0d7e,
++      0x00d6, 0x080c, 0x1303, 0x6114, 0x2168, 0x687b, 0x0000, 0x6883,
++      0x0000, 0x080c, 0x5b76, 0x00de, 0x080c, 0x8ed9, 0x0005, 0x0026,
++      0x0036, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x0006, 0x080c, 0x0eb6,
++      0x000e, 0x090c, 0x0d7e, 0x20e9, 0x0001, 0x9d88, 0x0019, 0x21a0,
++      0x900e, 0x20a9, 0x0020, 0x4104, 0x687a, 0x2079, 0x1100, 0x7988,
++      0x9188, 0x0018, 0x918c, 0x0fff, 0x6972, 0x6c76, 0x2d78, 0x00f6,
++      0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182,
++      0x0034, 0x1228, 0x9f90, 0x001f, 0x080c, 0xa5c9, 0x04c0, 0x2130,
++      0x2009, 0x0034, 0x9f90, 0x001f, 0x080c, 0xa5c9, 0x96b2, 0x0034,
++      0x7804, 0x906d, 0x0110, 0x080c, 0x0edf, 0x080c, 0x0eb6, 0x01d0,
++      0x8528, 0x6867, 0x0110, 0x686b, 0x0000, 0x2d20, 0x7c06, 0x968a,
++      0x003d, 0x1230, 0x2608, 0x9d90, 0x001b, 0x080c, 0xa5c9, 0x00b8,
++      0x96b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0x9d90, 0x001b, 0x080c,
++      0xa5c9, 0x0c18, 0x2079, 0x0200, 0x7817, 0x0000, 0x00fe, 0x852f,
++      0x95ad, 0x0050, 0x7d66, 0x7870, 0xc0fd, 0x7872, 0x0048, 0x2079,
++      0x0200, 0x7817, 0x0000, 0x00fe, 0x852f, 0x95ad, 0x0050, 0x7d66,
++      0x2f68, 0x6804, 0x6807, 0x0000, 0x0006, 0x080c, 0x5b76, 0x000e,
++      0x2068, 0x9005, 0x1db0, 0x00fe, 0x00de, 0x006e, 0x005e, 0x003e,
++      0x002e, 0x0005, 0x00d6, 0x00f6, 0x0006, 0x080c, 0x0eb6, 0x000e,
++      0x090c, 0x0d7e, 0x20e9, 0x0001, 0x9d88, 0x0019, 0x21a0, 0x900e,
++      0x20a9, 0x0020, 0x4104, 0x6a66, 0x687a, 0x2079, 0x1100, 0x7988,
++      0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009, 0x001a,
++      0x21a8, 0x810b, 0x6972, 0x6c76, 0x2e98, 0x9d80, 0x001f, 0x20a0,
++      0x080c, 0x504f, 0x080c, 0x5b76, 0x00fe, 0x00de, 0x0005, 0x0016,
++      0x00d6, 0x00f6, 0x2079, 0x0200, 0x2e98, 0x2021, 0x003e, 0x901e,
++      0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e,
++      0x1168, 0x00d6, 0x080c, 0x0e9d, 0x2d00, 0x00de, 0x05f0, 0x6806,
++      0x2068, 0x20e9, 0x0001, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e,
++      0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010,
++      0x2100, 0x9318, 0x2200, 0x9402, 0x1220, 0x2410, 0x9006, 0x9398,
++      0x0002, 0x2020, 0x22a8, 0x6800, 0x9200, 0x6802, 0x0016, 0x0026,
++      0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04,
++      0x921a, 0x22a0, 0x2198, 0x002e, 0x001e, 0x83ff, 0x0170, 0x3300,
++      0x9086, 0x0280, 0x1120, 0x7814, 0x8000, 0x7816, 0x2e98, 0x2310,
++      0x84ff, 0x0904, 0x91e5, 0x0804, 0x91e7, 0x9085, 0x0001, 0x7817,
++      0x0000, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x6314,
++      0x2368, 0x687a, 0x6982, 0x080c, 0x5b76, 0x003e, 0x00de, 0x0005,
++      0x91b6, 0x0015, 0x1118, 0x080c, 0x8ed9, 0x0030, 0x91b6, 0x0016,
++      0x190c, 0x0d7e, 0x080c, 0x8ed9, 0x0005, 0x20a9, 0x000e, 0x20e1,
++      0x0000, 0x2e98, 0x6014, 0x20e9, 0x0001, 0x20a0, 0x4003, 0x9080,
++      0x001b, 0x2020, 0x20a9, 0x0006, 0x3310, 0x9298, 0x0001, 0x94a8,
++      0x0001, 0x222e, 0x2326, 0x9290, 0x0002, 0x95a8, 0x0002, 0x9398,
++      0x0002, 0x94a0, 0x0002, 0x1f04, 0x9269, 0x00e6, 0x080c, 0xa942,
++      0x0130, 0x6014, 0x2070, 0x7007, 0x0000, 0x7067, 0x0103, 0x00ee,
++      0x080c, 0x8ed9, 0x0005, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200,
++      0x1130, 0x6010, 0x2068, 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6014,
++      0x9005, 0x0130, 0x2068, 0x6807, 0x0000, 0x6867, 0x0103, 0x6b32,
++      0x080c, 0x8ed9, 0x003e, 0x00de, 0x0005, 0x0016, 0x20a9, 0x0014,
++      0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x9080, 0x0002,
++      0x20e9, 0x0001, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001,
++      0x2099, 0x0260, 0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0x6014,
++      0x9080, 0x0001, 0x2004, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001,
++      0x0205, 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003,
++      0x2003, 0x0000, 0x00e6, 0x6014, 0x2004, 0x2070, 0x7067, 0x0103,
++      0x00ee, 0x080c, 0x8ed9, 0x001e, 0x0005, 0x0016, 0x900e, 0x7030,
++      0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c,
++      0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x9192, 0x0014,
++      0x1218, 0x2011, 0x0000, 0x0010, 0x2009, 0x0014, 0x21a8, 0x9e80,
++      0x000c, 0x2098, 0x6014, 0x9080, 0x0002, 0x20a0, 0x080c, 0x504f,
++      0x82ff, 0x0170, 0x2009, 0x0205, 0x2104, 0x8000, 0x200a, 0x2e00,
++      0x2098, 0x3400, 0x9080, 0x0014, 0x20a0, 0x22a8, 0x080c, 0x504f,
++      0x00e6, 0x080c, 0xa942, 0x0140, 0x6014, 0x2070, 0x7007, 0x0000,
++      0x7064, 0x70e2, 0x7067, 0x0103, 0x00ee, 0x080c, 0x8ed9, 0x001e,
++      0x0005, 0x0016, 0x00d6, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009,
++      0x0004, 0x0010, 0x7034, 0x800c, 0x21a8, 0x9e80, 0x000c, 0x2098,
++      0x6014, 0x2068, 0x6804, 0x9005, 0x1108, 0x2d00, 0x9080, 0x000c,
++      0x20a0, 0x080c, 0x504f, 0x080c, 0xa942, 0x0148, 0x6804, 0x9005,
++      0x1158, 0x6807, 0x0000, 0x6864, 0x68e2, 0x6867, 0x0103, 0x080c,
++      0x8ed9, 0x00de, 0x001e, 0x0005, 0x00e6, 0x2070, 0x7030, 0x8007,
++      0x9086, 0x0100, 0x1118, 0x080c, 0x97dc, 0x00b8, 0x7034, 0x8007,
++      0x800c, 0x9e80, 0x000c, 0x687b, 0x0000, 0x6883, 0x0000, 0x6897,
++      0x4000, 0x6aa0, 0x6b9c, 0x6ca8, 0x6da4, 0x2031, 0x0000, 0x2039,
++      0x0001, 0x2041, 0x1078, 0x0019, 0x0d30, 0x00ee, 0x08c0, 0x00d6,
++      0x0006, 0x080c, 0x0e9d, 0x000e, 0x0190, 0x6812, 0x000e, 0x683e,
++      0x0006, 0x6e06, 0x2800, 0x683a, 0x6916, 0x6f0e, 0x6a2a, 0x6b2e,
++      0x6c32, 0x6d36, 0x2d10, 0x080c, 0x0f22, 0x9085, 0x0001, 0x00de,
++      0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210,
++      0x9290, 0x0004, 0x2214, 0x9206, 0x1518, 0x700c, 0x6210, 0x9290,
++      0x0005, 0x2214, 0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68, 0x0016,
++      0x2009, 0x0035, 0x080c, 0xaf4e, 0x001e, 0x1158, 0x622c, 0x2268,
++      0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006,
++      0x0128, 0x080c, 0x8ed9, 0x0020, 0x0039, 0x0010, 0x080c, 0x946d,
++      0x002e, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6814, 0x2078, 0x9186,
++      0x0015, 0x0904, 0x9454, 0x918e, 0x0016, 0x1904, 0x946b, 0x700c,
++      0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904,
++      0x9433, 0x8fff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0x9417,
++      0x0804, 0x9469, 0x6808, 0x9086, 0xffff, 0x1904, 0x9456, 0x787c,
++      0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0x783c, 0x7940, 0x9105,
++      0x1904, 0x9456, 0x080c, 0xab11, 0x685c, 0x7882, 0x787c, 0xc0dc,
++      0xc0f4, 0xc0d4, 0x787e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a,
++      0x080c, 0x73f0, 0x7884, 0x920a, 0x0208, 0x8011, 0x7a86, 0x82ff,
++      0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xa6d9, 0x00ce, 0x0804,
++      0x9469, 0x00c6, 0x00d6, 0x2f68, 0x6868, 0xd0fc, 0x1118, 0x080c,
++      0x5151, 0x0010, 0x080c, 0x54d0, 0x00de, 0x00ce, 0x1904, 0x9456,
++      0x00c6, 0x2d60, 0x080c, 0x8ed9, 0x00ce, 0x0804, 0x9469, 0x00c6,
++      0x080c, 0x8f26, 0x0190, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c,
++      0xad70, 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x8ed9,
++      0x00ce, 0x080c, 0x8f53, 0x00ce, 0x04e0, 0x2001, 0x12c2, 0x2004,
++      0x6842, 0x00ce, 0x04b0, 0x7008, 0x9086, 0x000b, 0x11a0, 0x6010,
++      0x200c, 0xc1bc, 0x2102, 0x00c6, 0x2d60, 0x7883, 0x0003, 0x6007,
++      0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x756e, 0x080c,
++      0x7aa4, 0x00ce, 0x00f0, 0x700c, 0x9086, 0x2a00, 0x1138, 0x2001,
++      0x12c2, 0x2004, 0x6842, 0x00a8, 0x0481, 0x00a8, 0x8fff, 0x090c,
++      0x0d7e, 0x00c6, 0x00d6, 0x2d60, 0x2f68, 0x6867, 0x0103, 0x687b,
++      0x0003, 0x080c, 0xa5b9, 0x080c, 0xab11, 0x080c, 0x8f09, 0x00de,
++      0x00ce, 0x080c, 0x8ed9, 0x00fe, 0x0005, 0x9186, 0x0015, 0x1128,
++      0x2001, 0x12c2, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, 0x1160,
++      0x00c6, 0x2d00, 0x2060, 0x080c, 0xc381, 0x080c, 0x7384, 0x080c,
++      0x8ed9, 0x00ce, 0x080c, 0x8ed9, 0x0005, 0x0026, 0x0036, 0x0046,
++      0x7228, 0x7cb0, 0x7bac, 0xd2f4, 0x0130, 0x2001, 0x12c2, 0x2004,
++      0x6842, 0x0804, 0x94e9, 0x00c6, 0x2d60, 0x080c, 0xa5e6, 0x00ce,
++      0x6804, 0x9086, 0x0050, 0x1170, 0x00c6, 0x2d00, 0x2060, 0x6003,
++      0x0001, 0x6007, 0x0050, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00ce,
++      0x0804, 0x94e9, 0x6800, 0x9086, 0x000f, 0x01c8, 0x8fff, 0x090c,
++      0x0d7e, 0x6824, 0xd0dc, 0x1198, 0x6800, 0x9086, 0x0004, 0x1198,
++      0x787c, 0xd0ac, 0x0180, 0x7843, 0x0fff, 0x783f, 0x0fff, 0x7880,
++      0xc0f4, 0xc0fc, 0x7882, 0x2001, 0x0001, 0x6832, 0x00e8, 0x2001,
++      0x0007, 0x6832, 0x00c8, 0x787c, 0xd0b4, 0x1138, 0xd0ac, 0x0db8,
++      0x7838, 0x7934, 0x9105, 0x0d98, 0x0c30, 0xd2ec, 0x1d80, 0x7024,
++      0x9306, 0x1118, 0x7020, 0x9406, 0x0d50, 0x7020, 0x683e, 0x7024,
++      0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xac68, 0x080c, 0x7aa4,
++      0x0010, 0x080c, 0x8ed9, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6,
++      0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x9290, 0x0004,
++      0x2214, 0x9206, 0x1904, 0x9561, 0x700c, 0x6210, 0x9290, 0x0005,
++      0x2214, 0x9206, 0x1904, 0x9561, 0x6038, 0x2068, 0x6a20, 0x9286,
++      0x0007, 0x0904, 0x955f, 0x9286, 0x0002, 0x0904, 0x955f, 0x9286,
++      0x0000, 0x0904, 0x955f, 0x6808, 0x633c, 0x9306, 0x1904, 0x955f,
++      0x2071, 0x026c, 0x9186, 0x0015, 0x05e0, 0x918e, 0x0016, 0x1190,
++      0x6034, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1160, 0x700c, 0x9086,
++      0x2a00, 0x1140, 0x6038, 0x9080, 0x0009, 0x200c, 0xc1dd, 0xc1f5,
++      0x2102, 0x0438, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b,
++      0x01a0, 0x9186, 0x004c, 0x0188, 0x9186, 0x004d, 0x0170, 0x9186,
++      0x004e, 0x0158, 0x9186, 0x0052, 0x0140, 0x6014, 0x2068, 0x080c,
++      0xa942, 0x090c, 0x0d7e, 0x6883, 0x0003, 0x6007, 0x0085, 0x6003,
++      0x000b, 0x6023, 0x0002, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00ce,
++      0x0030, 0x6038, 0x2070, 0x2001, 0x12c2, 0x2004, 0x7042, 0x080c,
++      0x8ed9, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00d6, 0x00f6, 0x6014,
++      0x2068, 0x6010, 0x2078, 0x91b6, 0x0015, 0x0130, 0x7a08, 0x7b0c,
++      0x7c00, 0xc48c, 0x7c02, 0x0448, 0x0156, 0x0036, 0x0026, 0x9e90,
++      0x000c, 0x9290, 0x0004, 0x20a9, 0x0004, 0x9f98, 0x000a, 0x080c,
++      0x9d60, 0x002e, 0x003e, 0x015e, 0x15f0, 0x0156, 0x0036, 0x0026,
++      0x9e90, 0x000c, 0x9290, 0x0008, 0x20a9, 0x0004, 0x9f98, 0x0006,
++      0x080c, 0x9d60, 0x002e, 0x003e, 0x015e, 0x1568, 0x7238, 0x7a0a,
++      0x733c, 0x7b0e, 0x7c00, 0xc48d, 0x7c02, 0x6804, 0x9005, 0x1120,
++      0x00fe, 0x00de, 0x0804, 0x9275, 0x9080, 0x0002, 0x00d6, 0x2068,
++      0x6a0a, 0x6b0e, 0x6c02, 0x00de, 0x2009, 0x002b, 0x6aa0, 0x6b9c,
++      0x6ca8, 0x6da4, 0x2031, 0x0000, 0x2039, 0x0001, 0x2041, 0x1078,
++      0x080c, 0x9367, 0x0128, 0x00fe, 0x00de, 0x080c, 0x8ed9, 0x0005,
++      0x080c, 0x97dc, 0x0cc0, 0x00f6, 0x080c, 0x2862, 0x00fe, 0x00c6,
++      0x080c, 0x8e83, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001,
++      0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x5568,
++      0x080c, 0x5592, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x00ce, 0x0804,
++      0x959d, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0d7e, 0x91b2, 0x0040,
++      0x1a04, 0x963f, 0x0002, 0x962d, 0x962d, 0x962d, 0x962d, 0x962d,
++      0x962d, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b,
++      0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b,
++      0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b,
++      0x962b, 0x962b, 0x962d, 0x962b, 0x962d, 0x962d, 0x962b, 0x962b,
++      0x962b, 0x962b, 0x962b, 0x962d, 0x962b, 0x962b, 0x962b, 0x962b,
++      0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962d, 0x962d, 0x962b,
++      0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b, 0x962b,
++      0x962d, 0x962b, 0x962b, 0x080c, 0x0d7e, 0x6003, 0x0001, 0x6106,
++      0x9186, 0x0032, 0x0118, 0x080c, 0x75be, 0x0010, 0x080c, 0x756e,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e, 0x0005, 0x2600,
++      0x0002, 0x9653, 0x9653, 0x9653, 0x962d, 0x962d, 0x9653, 0x9653,
++      0x9653, 0x9653, 0x962d, 0x9653, 0x962d, 0x9653, 0x962d, 0x9653,
++      0x9653, 0x9653, 0x9653, 0x080c, 0x0d7e, 0x6004, 0x90b2, 0x0053,
++      0x1a0c, 0x0d7e, 0x91b6, 0x0013, 0x0904, 0x9702, 0x91b6, 0x0027,
++      0x1904, 0x96c8, 0x080c, 0x79ab, 0x6004, 0x080c, 0xab1d, 0x0190,
++      0x080c, 0xab2e, 0x0904, 0x96c2, 0x908e, 0x0021, 0x0904, 0x96c5,
++      0x908e, 0x0022, 0x0904, 0x96c2, 0x908e, 0x003d, 0x0904, 0x96c5,
++      0x0804, 0x96bb, 0x080c, 0x2886, 0x2001, 0x0007, 0x080c, 0x5568,
++      0x6010, 0x9080, 0x0028, 0x200c, 0x080c, 0x97dc, 0x9186, 0x007e,
++      0x1148, 0x2001, 0x1136, 0x2014, 0xc285, 0x080c, 0x62e4, 0x1108,
++      0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019,
++      0x0028, 0x080c, 0x8ac9, 0x002e, 0x080c, 0xc3d4, 0x003e, 0x002e,
++      0x001e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c,
++      0x76f0, 0x0076, 0x903e, 0x080c, 0x75ee, 0x6010, 0x00c6, 0x9065,
++      0x0100, 0x00ce, 0x2c08, 0x080c, 0xbec2, 0x007e, 0x003e, 0x002e,
++      0x001e, 0x080c, 0x55d0, 0x080c, 0xad68, 0x080c, 0x8ed9, 0x080c,
++      0x7aa4, 0x0005, 0x080c, 0x97dc, 0x0cb0, 0x080c, 0x9809, 0x0c98,
++      0x9186, 0x0014, 0x1db0, 0x080c, 0x79ab, 0x080c, 0x2862, 0x080c,
++      0xab1d, 0x1188, 0x080c, 0x2886, 0x6010, 0x9080, 0x0028, 0x200c,
++      0x080c, 0x97dc, 0x9186, 0x007e, 0x1128, 0x2001, 0x1136, 0x200c,
++      0xc185, 0x2102, 0x08c0, 0x080c, 0xab2e, 0x1118, 0x080c, 0x97dc,
++      0x0890, 0x6004, 0x908e, 0x0032, 0x1158, 0x00e6, 0x00f6, 0x2071,
++      0x1193, 0x2079, 0x0000, 0x080c, 0x2b98, 0x00fe, 0x00ee, 0x0818,
++      0x6004, 0x908e, 0x0021, 0x0d50, 0x908e, 0x0022, 0x090c, 0x97dc,
++      0x0804, 0x96bb, 0x90b2, 0x0040, 0x1a04, 0x97c5, 0x2008, 0x0002,
++      0x974a, 0x974b, 0x974e, 0x9751, 0x9754, 0x9757, 0x9748, 0x9748,
++      0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748,
++      0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748,
++      0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x975a, 0x9769,
++      0x9748, 0x976b, 0x9769, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748,
++      0x9769, 0x9769, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748, 0x9748,
++      0x9748, 0x9748, 0x97a5, 0x9769, 0x9748, 0x9765, 0x9748, 0x9748,
++      0x9748, 0x9766, 0x9748, 0x9748, 0x9748, 0x9769, 0x979c, 0x9748,
++      0x080c, 0x0d7e, 0x00f0, 0x2001, 0x000b, 0x0460, 0x2001, 0x0003,
++      0x0448, 0x2001, 0x0005, 0x0430, 0x2001, 0x0001, 0x0418, 0x2001,
++      0x0009, 0x0400, 0x080c, 0x79ab, 0x6003, 0x0005, 0x2001, 0x12c2,
++      0x2004, 0x6042, 0x080c, 0x7aa4, 0x00a0, 0x0018, 0x0010, 0x080c,
++      0x5568, 0x0804, 0x97b6, 0x080c, 0x79ab, 0x2001, 0x12c0, 0x2004,
++      0x601a, 0x2001, 0x12c2, 0x2004, 0x6042, 0x6003, 0x0004, 0x080c,
++      0x7aa4, 0x0005, 0x080c, 0x5568, 0x080c, 0x79ab, 0x6003, 0x0002,
++      0x2001, 0x12c2, 0x2004, 0x6042, 0x0036, 0x2019, 0x115d, 0x2304,
++      0x9084, 0xff00, 0x1120, 0x2001, 0x12c0, 0x201c, 0x0040, 0x8007,
++      0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a,
++      0x003e, 0x080c, 0x7aa4, 0x08e8, 0x080c, 0x79ab, 0x080c, 0xad68,
++      0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x08a0, 0x00e6, 0x00f6, 0x2071,
++      0x1193, 0x2079, 0x0000, 0x080c, 0x2b98, 0x00fe, 0x00ee, 0x080c,
++      0x79ab, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0818, 0x080c, 0x79ab,
++      0x2001, 0x12c2, 0x2004, 0x6042, 0x6003, 0x0002, 0x2001, 0x12c0,
++      0x2004, 0x601a, 0x080c, 0x7aa4, 0x0005, 0x2600, 0x2008, 0x0002,
++      0x97da, 0x97da, 0x97da, 0x97b6, 0x97b6, 0x97da, 0x97da, 0x97da,
++      0x97da, 0x97b6, 0x97da, 0x97b6, 0x97da, 0x97b6, 0x97da, 0x97da,
++      0x97da, 0x97da, 0x080c, 0x0d7e, 0x00e6, 0x0026, 0x0016, 0x080c,
++      0xa942, 0x0500, 0x6014, 0x2070, 0x7064, 0x9086, 0x0139, 0x1140,
++      0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xaec0, 0x0090,
++      0x7068, 0xd0fc, 0x0178, 0x7007, 0x0000, 0x0016, 0x6004, 0x908e,
++      0x0021, 0x0160, 0x908e, 0x003d, 0x0148, 0x001e, 0x7067, 0x0103,
++      0x7033, 0x0100, 0x001e, 0x002e, 0x00ee, 0x0005, 0x001e, 0x0009,
++      0x0cc8, 0x00e6, 0x9cf0, 0x0005, 0x2e74, 0x7000, 0x2070, 0x7067,
++      0x0103, 0x7023, 0x8001, 0x00ee, 0x0005, 0x00d6, 0x6610, 0x2668,
++      0x6804, 0x9084, 0x00ff, 0x00de, 0x90b2, 0x000c, 0x1a0c, 0x0d7e,
++      0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xadf6, 0x0804, 0x9892,
++      0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xae39, 0x0804, 0x9892,
++      0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xae66, 0x0804, 0x9892,
++      0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xad8b, 0x0804, 0x9892,
++      0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xab5e, 0x0804, 0x9892,
++      0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xab9a, 0x0804, 0x9892,
++      0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0x9255, 0x04d8, 0x6604,
++      0x96b6, 0x0000, 0x1118, 0x080c, 0x9565, 0x04a0, 0x6604, 0x96b6,
++      0x0022, 0x1118, 0x080c, 0x9283, 0x0468, 0x6604, 0x96b6, 0x0035,
++      0x1118, 0x080c, 0x9381, 0x0430, 0x6604, 0x96b6, 0x0039, 0x1118,
++      0x080c, 0x94ef, 0x00f8, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c,
++      0x929d, 0x00c0, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0x92d5,
++      0x0088, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0x9319, 0x0050,
++      0x91b6, 0x0015, 0x1110, 0x0053, 0x0028, 0x91b6, 0x0016, 0x1118,
++      0x0804, 0x9ab5, 0x0005, 0x080c, 0x8f6e, 0x0ce0, 0x98b0, 0x98b3,
++      0x98b0, 0x98f6, 0x98b0, 0x9a2c, 0x9ac3, 0x98b0, 0x98b0, 0x9a8f,
++      0x98b0, 0x9aa5, 0x00e6, 0x080c, 0x1303, 0x9cf0, 0x0005, 0x2e74,
++      0x7000, 0x2070, 0x7067, 0x0103, 0x00ee, 0x080c, 0x8ed9, 0x0005,
++      0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1100, 0x7088, 0x9086,
++      0x0074, 0x1540, 0x080c, 0xbe99, 0x11b0, 0x6010, 0x00d6, 0x2068,
++      0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110, 0xc0c5, 0x6802,
++      0x00e9, 0x00de, 0x2001, 0x0006, 0x080c, 0x5568, 0x080c, 0x2886,
++      0x080c, 0x8ed9, 0x0088, 0x2001, 0x000a, 0x080c, 0x5568, 0x080c,
++      0x2886, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x75be, 0x080c,
++      0x7aa4, 0x0010, 0x080c, 0x9a13, 0x00ee, 0x0005, 0x6800, 0xd084,
++      0x0160, 0x9006, 0x080c, 0x5556, 0x2069, 0x1152, 0x6804, 0xd0a4,
++      0x0120, 0x2001, 0x0006, 0x080c, 0x5592, 0x0005, 0x00d6, 0x2011,
++      0x1122, 0x2204, 0x9086, 0x0074, 0x1904, 0x9a10, 0x6010, 0x2068,
++      0x6aa0, 0x9286, 0x007e, 0x1120, 0x080c, 0x9c04, 0x0804, 0x9971,
++      0x080c, 0x9bfa, 0x6010, 0x2068, 0x6aa0, 0x9286, 0x0080, 0x1530,
++      0x6813, 0x00ff, 0x6817, 0xfffc, 0x6014, 0x9005, 0x01a8, 0x2068,
++      0x6864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000,
++      0x900e, 0x2011, 0x4000, 0x080c, 0xaec0, 0x0030, 0x6807, 0x0000,
++      0x6867, 0x0103, 0x6833, 0x0200, 0x2001, 0x0006, 0x080c, 0x5568,
++      0x080c, 0x2886, 0x080c, 0x8ed9, 0x0804, 0x9a11, 0x00e6, 0x2071,
++      0x1136, 0x2e04, 0xd09c, 0x0188, 0x2071, 0x0260, 0x7108, 0x720c,
++      0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0138, 0x6010, 0x2070,
++      0x70a0, 0xd0bc, 0x1110, 0x7112, 0x7216, 0x00ee, 0x6014, 0x9005,
++      0x0190, 0x2068, 0x6868, 0xd0f4, 0x0170, 0x6864, 0x9084, 0x00ff,
++      0x9086, 0x0039, 0x1958, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000,
++      0x080c, 0xaec0, 0x0848, 0x2001, 0x0004, 0x080c, 0x5568, 0x6003,
++      0x0001, 0x6007, 0x0003, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0804,
++      0x9a11, 0x685c, 0xd0e4, 0x01d8, 0x080c, 0xad0a, 0x080c, 0x62e4,
++      0x0118, 0xd0dc, 0x1904, 0x992c, 0x2011, 0x1136, 0x2204, 0xc0ad,
++      0x2012, 0x2001, 0x1298, 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3,
++      0x0000, 0x080c, 0x1fb8, 0x78e2, 0x00fe, 0x0804, 0x992c, 0x080c,
++      0xad47, 0x2011, 0x1136, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c,
++      0xbfdb, 0x000e, 0x1904, 0x992c, 0xc0b5, 0x2012, 0x2001, 0x0006,
++      0x080c, 0x5568, 0x9006, 0x080c, 0x5556, 0x00c6, 0x2001, 0x110e,
++      0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071,
++      0x1100, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x7076, 0x7010, 0x78ea,
++      0x707a, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe,
++      0x080c, 0x1f8d, 0x00f6, 0x2100, 0x900e, 0x080c, 0x1f63, 0x7956,
++      0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8, 0x2009,
++      0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x780c,
++      0xc0b5, 0x780e, 0x00fe, 0x080c, 0x1f8d, 0x00f6, 0x2079, 0x1100,
++      0x797a, 0x2100, 0x900e, 0x080c, 0x1f63, 0x7956, 0x00fe, 0x8108,
++      0x080c, 0x55b3, 0x2c00, 0x00ce, 0x1904, 0x992c, 0x6012, 0x2009,
++      0x110e, 0x210c, 0xd19c, 0x0168, 0x2009, 0x027c, 0x9080, 0x0004,
++      0x210c, 0x918c, 0x00ff, 0x2102, 0x2009, 0x027d, 0x210c, 0x8000,
++      0x2102, 0x2001, 0x0002, 0x080c, 0x5568, 0x6023, 0x0001, 0x6003,
++      0x0001, 0x6007, 0x0002, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0008,
++      0x0011, 0x00de, 0x0005, 0x2030, 0x2001, 0x0007, 0x080c, 0x5568,
++      0x2001, 0x1100, 0x2004, 0x9086, 0x0003, 0x1120, 0x2001, 0x0007,
++      0x080c, 0x5592, 0x080c, 0x2886, 0x6020, 0x9086, 0x000a, 0x1108,
++      0x0005, 0x080c, 0x8ed9, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071,
++      0x1100, 0x7088, 0x9086, 0x0014, 0x1904, 0x9a87, 0x7000, 0x9086,
++      0x0003, 0x1178, 0x6014, 0x9005, 0x1160, 0x0036, 0x0046, 0x6010,
++      0x9080, 0x0028, 0x201c, 0x2021, 0x0006, 0x080c, 0x4026, 0x004e,
++      0x003e, 0x00d6, 0x6010, 0x2068, 0x080c, 0x56a8, 0x080c, 0x98e6,
++      0x00de, 0x080c, 0x9cc9, 0x1598, 0x6010, 0x00d6, 0x2068, 0x6890,
++      0x00de, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x5568, 0x00e6,
++      0x6014, 0x9075, 0x01d0, 0x7064, 0x9084, 0x00ff, 0x9086, 0x0039,
++      0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xaec0,
++      0x0060, 0x7064, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0x7007,
++      0x0000, 0x7067, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2886,
++      0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x8ed9, 0x0020, 0x080c,
++      0x97dc, 0x080c, 0x9a13, 0x001e, 0x002e, 0x00ee, 0x0005, 0x2011,
++      0x1122, 0x2204, 0x9086, 0x0014, 0x1168, 0x2001, 0x0002, 0x080c,
++      0x5568, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x75be, 0x080c,
++      0x7aa4, 0x0010, 0x080c, 0x9a13, 0x0005, 0x2011, 0x1122, 0x2204,
++      0x9086, 0x0004, 0x1138, 0x2001, 0x0007, 0x080c, 0x5568, 0x080c,
++      0x8ed9, 0x0010, 0x080c, 0x9a13, 0x0005, 0x000b, 0x0005, 0x98b0,
++      0x9ace, 0x98b0, 0x9b03, 0x98b0, 0x9bb0, 0x9ac3, 0x98b0, 0x98b0,
++      0x9bc5, 0x98b0, 0x9bd7, 0x6604, 0x9686, 0x0003, 0x0904, 0x9a2c,
++      0x96b6, 0x001e, 0x1110, 0x080c, 0x8ed9, 0x0005, 0x00d6, 0x00c6,
++      0x080c, 0x9be9, 0x1180, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002,
++      0x080c, 0x5568, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x75be,
++      0x080c, 0x7aa4, 0x00e8, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009,
++      0x1160, 0x6010, 0x2068, 0x6840, 0x9084, 0x00ff, 0x9005, 0x0170,
++      0x8001, 0x6842, 0x601b, 0x000a, 0x0058, 0x2009, 0x026f, 0x2104,
++      0x9084, 0xff00, 0x9086, 0x1900, 0x1108, 0x08c0, 0x080c, 0x9a13,
++      0x00ce, 0x00de, 0x0005, 0x0026, 0x9016, 0x080c, 0x9bf7, 0x00d6,
++      0x2069, 0x12a7, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2068, 0x68a0,
++      0x9086, 0x007e, 0x1138, 0x2069, 0x111e, 0x2d04, 0x8000, 0x206a,
++      0x00de, 0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x5556, 0x2001,
++      0x0002, 0x080c, 0x5568, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
++      0x75be, 0x080c, 0x7aa4, 0x0804, 0x9b7e, 0x080c, 0xa942, 0x01b0,
++      0x6014, 0x9080, 0x0019, 0x2004, 0x2010, 0x9086, 0x0139, 0x1128,
++      0x2001, 0x0002, 0x080c, 0xaf0f, 0x00c8, 0x6014, 0x9080, 0x001a,
++      0x2004, 0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca0, 0x2001, 0x110d,
++      0x2004, 0xd0dc, 0x0158, 0x6010, 0x00d6, 0x2068, 0x6840, 0x00de,
++      0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c20, 0x080c, 0x97dc,
++      0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, 0x0005, 0x0500,
++      0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00,
++      0x1118, 0x9686, 0x0009, 0x01a0, 0x9086, 0x1900, 0x1168, 0x9686,
++      0x0009, 0x0170, 0x2001, 0x0004, 0x080c, 0x5568, 0x2001, 0x0028,
++      0x601a, 0x6007, 0x0052, 0x0010, 0x080c, 0x9a13, 0x002e, 0x0005,
++      0x00d6, 0x9286, 0x0139, 0x0160, 0x6014, 0x2068, 0x080c, 0xa942,
++      0x0148, 0x6864, 0x9086, 0x0139, 0x0118, 0x6868, 0xd0fc, 0x0110,
++      0x00de, 0x0c50, 0x6010, 0x2068, 0x6840, 0x9084, 0x00ff, 0x9005,
++      0x0140, 0x8001, 0x6842, 0x601b, 0x000a, 0x6007, 0x0016, 0x00de,
++      0x08e8, 0x68a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, 0x1100,
++      0x080c, 0x5092, 0x00ee, 0x0010, 0x080c, 0x2862, 0x00de, 0x0860,
++      0x080c, 0x9bf7, 0x1168, 0x2001, 0x0004, 0x080c, 0x5568, 0x6003,
++      0x0001, 0x6007, 0x0003, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0020,
++      0x080c, 0x97dc, 0x080c, 0x9a13, 0x0005, 0x0489, 0x1168, 0x2001,
++      0x0008, 0x080c, 0x5568, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c,
++      0x75be, 0x080c, 0x7aa4, 0x0010, 0x080c, 0x9a13, 0x0005, 0x00f9,
++      0x1168, 0x2001, 0x000a, 0x080c, 0x5568, 0x6003, 0x0001, 0x6007,
++      0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0010, 0x080c, 0x9a13,
++      0x0005, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, 0x1138, 0x2009,
++      0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085,
++      0x0001, 0x0005, 0x00c6, 0x0016, 0x9c88, 0x0004, 0x2164, 0x080c,
++      0x5617, 0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036,
++      0x0016, 0x6010, 0x2068, 0x2009, 0x1136, 0x2104, 0x9085, 0x0003,
++      0x200a, 0x080c, 0x9c9e, 0x0560, 0x2009, 0x1136, 0x2104, 0xc0cd,
++      0x200a, 0x080c, 0x58cb, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a,
++      0x080c, 0xc12f, 0x2001, 0x110c, 0x200c, 0xc195, 0x2102, 0x2019,
++      0x002a, 0x2009, 0x0001, 0x080c, 0x2831, 0x00e6, 0x2071, 0x1100,
++      0x080c, 0x2679, 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009,
++      0x007f, 0x080c, 0x2955, 0x8108, 0x1f04, 0x9c39, 0x015e, 0x00ce,
++      0x080c, 0x9bfa, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0x0260,
++      0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1136, 0x200c, 0xc1c5,
++      0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108,
++      0xc1c4, 0x7817, 0x0000, 0x2001, 0x1136, 0x2102, 0x2079, 0x0100,
++      0x2e04, 0x9084, 0x00ff, 0x2069, 0x111d, 0x206a, 0x78e6, 0x0006,
++      0x8e70, 0x2e04, 0x2069, 0x111e, 0x206a, 0x78ea, 0x7832, 0x7836,
++      0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x112a, 0x200a,
++      0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x1f8d, 0x080c, 0x62e4,
++      0x0170, 0x2071, 0x0260, 0x2069, 0x12bc, 0x7048, 0x206a, 0x704c,
++      0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xad0a, 0x0040,
++      0x2001, 0x0006, 0x080c, 0x5568, 0x080c, 0x2886, 0x080c, 0x8ed9,
++      0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026, 0x0036,
++      0x00e6, 0x0156, 0x2019, 0x112a, 0x231c, 0x83ff, 0x01e8, 0x2071,
++      0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205,
++      0x9306, 0x1190, 0x2011, 0x0276, 0x20a9, 0x0004, 0x9d98, 0x000a,
++      0x080c, 0x9d60, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, 0x9d98,
++      0x0006, 0x080c, 0x9d60, 0x1100, 0x015e, 0x00ee, 0x003e, 0x002e,
++      0x0005, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8,
++      0x7038, 0x9086, 0x0800, 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084,
++      0x0f00, 0x9086, 0x0100, 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac,
++      0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6,
++      0x00d6, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126,
++      0x2091, 0x8000, 0x2029, 0x130d, 0x252c, 0x2021, 0x1313, 0x2424,
++      0x2061, 0x15c0, 0x2071, 0x1100, 0x724c, 0x706c, 0x9202, 0x1a04,
++      0x9d4c, 0x080c, 0xc15b, 0x0904, 0x9d45, 0x6720, 0x9786, 0x0001,
++      0x05e0, 0x9786, 0x0007, 0x05c8, 0x2500, 0x9c06, 0x05b0, 0x2400,
++      0x9c06, 0x0598, 0x3e08, 0x9186, 0x0002, 0x1140, 0x6010, 0x9005,
++      0x0128, 0x9080, 0x0000, 0x2004, 0xd0bc, 0x1538, 0x00c6, 0x6000,
++      0x9086, 0x0004, 0x1110, 0x080c, 0x1509, 0x9786, 0x0008, 0x1148,
++      0x080c, 0xab2e, 0x1130, 0x00ce, 0x080c, 0x97dc, 0x080c, 0x8f09,
++      0x00a0, 0x6014, 0x2068, 0x080c, 0xa942, 0x0160, 0x9786, 0x0003,
++      0x11e8, 0x6867, 0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c, 0x5b76,
++      0x080c, 0xab11, 0x080c, 0x8f09, 0x00ce, 0x9ce0, 0x0018, 0x7060,
++      0x9c02, 0x1210, 0x0804, 0x9cfc, 0x012e, 0x000e, 0x002e, 0x004e,
++      0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x9786, 0x0006,
++      0x1118, 0x080c, 0xc0e9, 0x0c30, 0x9786, 0x000a, 0x09e0, 0x08c8,
++      0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0x9d60,
++      0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, 0x0008,
++      0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906,
++      0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300,
++      0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, 0x1140,
++      0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005,
++      0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000,
++      0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004, 0x908a,
++      0x0053, 0x1a0c, 0x0d7e, 0x080c, 0xab1d, 0x0120, 0x080c, 0xab2e,
++      0x0168, 0x0028, 0x080c, 0x2886, 0x080c, 0xab2e, 0x0138, 0x080c,
++      0x79ab, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x080c, 0x97dc,
++      0x0cb0, 0x9182, 0x0040, 0x0002, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf,
++      0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dd1,
++      0x9dd1, 0x9dd1, 0x9dd1, 0x9dcf, 0x9dcf, 0x9dcf, 0x9dd1, 0x080c,
++      0x0d7e, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x756e,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e, 0x0005, 0x9186,
++      0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0x9e6c, 0x9186,
++      0x0027, 0x11e8, 0x080c, 0x79ab, 0x080c, 0x2862, 0x00d6, 0x6114,
++      0x2168, 0x080c, 0xa942, 0x0168, 0x6867, 0x0103, 0x687b, 0x0029,
++      0x6877, 0x0000, 0x697c, 0xc1c5, 0x697e, 0x080c, 0x5b76, 0x080c,
++      0xab11, 0x00de, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x9186,
++      0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x0430, 0x9186, 0x0046,
++      0x0150, 0x9186, 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186,
++      0x0048, 0x190c, 0x0d7e, 0x2001, 0x0109, 0x2004, 0xd084, 0x0198,
++      0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x745c,
++      0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, 0x0002,
++      0x1110, 0x0804, 0x9eaf, 0x0005, 0x0002, 0x9e4a, 0x9e48, 0x9e48,
++      0x9e48, 0x9e48, 0x9e48, 0x9e48, 0x9e48, 0x9e48, 0x9e48, 0x9e48,
++      0x9e65, 0x9e65, 0x9e65, 0x9e65, 0x9e48, 0x9e65, 0x9e48, 0x9e65,
++      0x080c, 0x0d7e, 0x080c, 0x79ab, 0x00d6, 0x6114, 0x2168, 0x080c,
++      0xa942, 0x0168, 0x6867, 0x0103, 0x687b, 0x0006, 0x6877, 0x0000,
++      0x6880, 0xc0ec, 0x6882, 0x080c, 0x5b76, 0x080c, 0xab11, 0x00de,
++      0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x080c, 0x79ab, 0x080c,
++      0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x0002, 0x9e82, 0x9e80, 0x9e80,
++      0x9e80, 0x9e80, 0x9e80, 0x9e80, 0x9e80, 0x9e80, 0x9e80, 0x9e80,
++      0x9e99, 0x9e99, 0x9e99, 0x9e99, 0x9e80, 0x9ea8, 0x9e80, 0x9e99,
++      0x080c, 0x0d7e, 0x00d6, 0x080c, 0x79ab, 0x6014, 0x2068, 0x2001,
++      0x12c2, 0x2004, 0x6042, 0x697c, 0xd1ac, 0x0140, 0x6003, 0x0004,
++      0x687c, 0x9085, 0x0400, 0x687e, 0x00de, 0x0005, 0x6003, 0x0002,
++      0x0cb8, 0x080c, 0x79ab, 0x2001, 0x12c0, 0x2004, 0x601a, 0x2001,
++      0x12c2, 0x2004, 0x6042, 0x6003, 0x000f, 0x080c, 0x7aa4, 0x0005,
++      0x080c, 0x79ab, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x9182,
++      0x0040, 0x0002, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec8,
++      0x9fa9, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6,
++      0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9ec6, 0x9fd8, 0x080c, 0x0d7e,
++      0x00d6, 0x6114, 0x2168, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1518,
++      0x6010, 0x2004, 0xd0bc, 0x1904, 0x9f94, 0x687b, 0x0000, 0x6867,
++      0x0103, 0x6e76, 0x687c, 0xd0ac, 0x0128, 0x6834, 0x6938, 0x9115,
++      0x190c, 0xa12c, 0x080c, 0x599a, 0x6210, 0x2268, 0x6a3c, 0x82ff,
++      0x0110, 0x8211, 0x6a3e, 0x7044, 0xd0e4, 0x1904, 0x9f74, 0x080c,
++      0x8ed9, 0x00de, 0x0005, 0x968c, 0x0c00, 0x0148, 0x6010, 0x2004,
++      0xd0bc, 0x1904, 0x9f78, 0x7348, 0x6b92, 0x734c, 0x6b8e, 0x968c,
++      0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, 0x0028, 0x1118, 0x687b,
++      0x001c, 0x00e8, 0xd6dc, 0x01a0, 0x687b, 0x0015, 0x687c, 0xd0ac,
++      0x0170, 0x6938, 0x6a34, 0x2100, 0x9205, 0x0148, 0x7048, 0x9106,
++      0x1118, 0x704c, 0x9206, 0x0118, 0x6992, 0x6a8e, 0xc6dc, 0x0038,
++      0xd6d4, 0x0118, 0x687b, 0x0007, 0x0010, 0x687b, 0x0000, 0x6867,
++      0x0103, 0x6e76, 0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100, 0x1130,
++      0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804, 0x9ece, 0x735c, 0x6b86,
++      0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036,
++      0x2308, 0x2019, 0x0018, 0x9d90, 0x0025, 0x080c, 0xa5c9, 0x003e,
++      0xd6cc, 0x0904, 0x9ee2, 0x7154, 0x698a, 0x81ff, 0x0904, 0x9ee2,
++      0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x9d90, 0x0029,
++      0x080c, 0xa5c9, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, 0xaf7b,
++      0x0804, 0x9ee2, 0x6868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x698a,
++      0x0c50, 0x00f6, 0x2d78, 0x080c, 0xa568, 0x00fe, 0x080c, 0xaf7b,
++      0x080c, 0xa5b9, 0x0804, 0x9ee4, 0x080c, 0xac0b, 0x0804, 0x9ef1,
++      0x687c, 0xd0ac, 0x0904, 0x9efb, 0x6024, 0xd0dc, 0x1904, 0x9efb,
++      0x6880, 0xd0bc, 0x1904, 0x9efb, 0x7348, 0x6838, 0x9306, 0x11e8,
++      0x734c, 0x6834, 0x931e, 0x0904, 0x9efb, 0xd6d4, 0x01b0, 0x6b38,
++      0x9305, 0x0904, 0x9efb, 0x0088, 0x687c, 0xd0ac, 0x0904, 0x9ed5,
++      0x6838, 0x6934, 0x9105, 0x0904, 0x9ed5, 0x6024, 0xd0dc, 0x1904,
++      0x9ed5, 0x6880, 0xd0bc, 0x1904, 0x9ed5, 0x080c, 0xac39, 0x0804,
++      0x9ef1, 0x00f6, 0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00,
++      0x7e0c, 0x7d08, 0x6014, 0x2078, 0x787c, 0xd0ac, 0x0138, 0x6003,
++      0x0002, 0x00fe, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0x79ac,
++      0x910a, 0x2300, 0x7ab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203,
++      0x0e90, 0x7c36, 0x7b3a, 0x7e46, 0x7d4a, 0x00fe, 0x6043, 0x0000,
++      0x2c10, 0x080c, 0x1605, 0x080c, 0x75db, 0x080c, 0x7b72, 0x0005,
++      0x0005, 0x9182, 0x0040, 0x0002, 0x9fef, 0x9fef, 0x9fef, 0x9fef,
++      0x9fef, 0x9ff1, 0xa085, 0x9fef, 0x9fef, 0xa09b, 0xa103, 0x9fef,
++      0x9fef, 0x9fef, 0x9fef, 0xa112, 0x9fef, 0x9fef, 0x9fef, 0x080c,
++      0x0d7e, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0x0260, 0x6114,
++      0x2178, 0x7644, 0x7e76, 0x96b4, 0x0fff, 0x7f7c, 0xc7e5, 0x7f7e,
++      0x6210, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff,
++      0x0904, 0xa080, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048,
++      0x7892, 0x704c, 0x788e, 0x9284, 0x0300, 0x0904, 0xa080, 0x080c,
++      0x0eb6, 0x090c, 0x0d7e, 0x2d00, 0x787a, 0x7f7c, 0xc7cd, 0x7f7e,
++      0x6867, 0x0103, 0x7868, 0x686a, 0x786c, 0x686e, 0x7870, 0x6872,
++      0x6e76, 0x968c, 0x0c00, 0x0120, 0x7348, 0x6b92, 0x734c, 0x6b8e,
++      0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118,
++      0x687b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0x687b, 0x0015, 0x0038,
++      0xd6d4, 0x0118, 0x687b, 0x0007, 0x0010, 0x687b, 0x0000, 0x6f7e,
++      0x7880, 0x6882, 0x7884, 0x6886, 0x901e, 0xd6c4, 0x0190, 0x735c,
++      0x6b86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008,
++      0x0036, 0x2308, 0x2019, 0x0018, 0x9d90, 0x0025, 0x080c, 0xa5c9,
++      0x003e, 0xd6cc, 0x01e8, 0x7154, 0x698a, 0x81ff, 0x01c8, 0x9192,
++      0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x9d90, 0x0029, 0x080c,
++      0xa5c9, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0x7868, 0xd0fc,
++      0x0120, 0x2009, 0x0020, 0x698a, 0x0c68, 0x2d78, 0x080c, 0xa568,
++      0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x00f6, 0x6003, 0x0003,
++      0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2078,
++      0x7c36, 0x7b3a, 0x7e46, 0x7d4a, 0x00fe, 0x2c10, 0x080c, 0x1605,
++      0x080c, 0x856f, 0x0005, 0x00d6, 0x2001, 0x12c2, 0x2004, 0x6042,
++      0x6003, 0x0002, 0x080c, 0x7a55, 0x080c, 0x7b72, 0x6114, 0x2168,
++      0x697c, 0xd1e4, 0x0904, 0xa0fe, 0xd1cc, 0x0570, 0x6978, 0x6868,
++      0xd0fc, 0x0500, 0x0016, 0x687c, 0x0006, 0x6880, 0x0006, 0x9d90,
++      0x0019, 0x9198, 0x0019, 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304,
++      0x2012, 0x8318, 0x8210, 0x1f04, 0xa0bf, 0x015e, 0x000e, 0x6882,
++      0x000e, 0x687e, 0x001e, 0x6874, 0x0006, 0x2168, 0x080c, 0x0edf,
++      0x001e, 0x0440, 0x0016, 0x080c, 0x0edf, 0x00de, 0x6974, 0x0016,
++      0x080c, 0xa5b9, 0x001e, 0x00f0, 0x6867, 0x0103, 0x6974, 0x9184,
++      0x00ff, 0x90b6, 0x0002, 0x0180, 0x9086, 0x0028, 0x1118, 0x687b,
++      0x001c, 0x0060, 0xd1dc, 0x0118, 0x687b, 0x0015, 0x0038, 0xd1d4,
++      0x0118, 0x687b, 0x0007, 0x0010, 0x687b, 0x0000, 0x0016, 0x080c,
++      0x599a, 0x001e, 0xd1e4, 0x1120, 0x080c, 0x8ed9, 0x00de, 0x0005,
++      0x080c, 0xac0b, 0x0cd8, 0x2019, 0x0001, 0x080c, 0x8847, 0x6003,
++      0x0002, 0x2001, 0x12c2, 0x2004, 0x6042, 0x080c, 0x7a55, 0x080c,
++      0x7b72, 0x0005, 0x080c, 0x7a55, 0x080c, 0x2862, 0x00d6, 0x6114,
++      0x2168, 0x080c, 0xa942, 0x0150, 0x6867, 0x0103, 0x687b, 0x0029,
++      0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11, 0x00de, 0x080c,
++      0x8ed9, 0x080c, 0x7b72, 0x0005, 0x687b, 0x0015, 0xd1fc, 0x0138,
++      0x687b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0x6992,
++      0x688e, 0x0005, 0x9182, 0x0040, 0x0002, 0xa151, 0xa151, 0xa151,
++      0xa151, 0xa151, 0xa153, 0xa151, 0xa151, 0xa1f7, 0xa151, 0xa151,
++      0xa151, 0xa151, 0xa151, 0xa151, 0xa151, 0xa151, 0xa151, 0xa151,
++      0xa31d, 0x080c, 0x0d7e, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071,
++      0x0260, 0x6114, 0x2178, 0x7644, 0x7e76, 0x96b4, 0x0fff, 0x7f7c,
++      0xc7e5, 0x7f7e, 0x6210, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211,
++      0x6a3e, 0x86ff, 0x0904, 0xa1f0, 0x9694, 0xff00, 0x9284, 0x0c00,
++      0x0120, 0x7048, 0x7892, 0x704c, 0x788e, 0x9284, 0x0300, 0x0904,
++      0xa1f0, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4,
++      0x7e76, 0x0c38, 0x080c, 0x0eb6, 0x090c, 0x0d7e, 0x2d00, 0x787a,
++      0x7f7c, 0x97bd, 0x0200, 0x7f7e, 0x6867, 0x0103, 0x7868, 0x686a,
++      0x786c, 0x686e, 0x7870, 0x6872, 0x7044, 0x9084, 0xf000, 0x9635,
++      0x6e76, 0x968c, 0x0c00, 0x0120, 0x7348, 0x6b92, 0x734c, 0x6b8e,
++      0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118,
++      0x687b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0x687b, 0x0015, 0x0038,
++      0xd6d4, 0x0118, 0x687b, 0x0007, 0x0010, 0x687b, 0x0000, 0x6f7e,
++      0x7880, 0x6882, 0x7884, 0x6886, 0x901e, 0xd6c4, 0x0190, 0x735c,
++      0x6b86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008,
++      0x0036, 0x2308, 0x2019, 0x0018, 0x9d90, 0x0025, 0x080c, 0xa5c9,
++      0x003e, 0xd6cc, 0x01e8, 0x7154, 0x698a, 0x81ff, 0x01c8, 0x9192,
++      0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x9d90, 0x0029, 0x080c,
++      0xa5c9, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0x7868, 0xd0fc,
++      0x0120, 0x2009, 0x0020, 0x698a, 0x0c68, 0x2d78, 0x080c, 0xa568,
++      0x080c, 0x14d3, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x2001,
++      0x12c2, 0x2004, 0x6042, 0x00d6, 0x6114, 0x2168, 0x683c, 0x6940,
++      0x9105, 0x1118, 0x687c, 0xc0dc, 0x687e, 0x6003, 0x0002, 0x697c,
++      0xd1e4, 0x0904, 0xa318, 0x6043, 0x0000, 0x6010, 0x2004, 0xd0bc,
++      0x11f8, 0xd1cc, 0x0904, 0xa2e7, 0x6978, 0x6868, 0xd0fc, 0x0904,
++      0xa2a8, 0x0016, 0x687c, 0x0006, 0x6880, 0x0006, 0x00f6, 0x2178,
++      0x7974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xa27b, 0x9086,
++      0x0028, 0x15e8, 0x687b, 0x001c, 0x787b, 0x001c, 0x0804, 0xa283,
++      0x6024, 0xd0f4, 0x11d0, 0x6838, 0x6a34, 0x9205, 0x09d0, 0x6838,
++      0x6a90, 0x9206, 0x1120, 0x688c, 0x6a34, 0x9206, 0x0990, 0x6024,
++      0xd0d4, 0x1148, 0x69ac, 0x6834, 0x9102, 0x603a, 0x69b0, 0x6838,
++      0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00d6, 0x2068,
++      0x683c, 0x8000, 0x683e, 0x00de, 0x9006, 0x6876, 0x6892, 0x688e,
++      0x687c, 0xc0e4, 0x687e, 0xd0cc, 0x0130, 0x00d6, 0x6878, 0x2068,
++      0x080c, 0x0edf, 0x00de, 0x080c, 0xac39, 0x0804, 0xa318, 0xd1dc,
++      0x0158, 0x687b, 0x0015, 0x787b, 0x0015, 0x080c, 0xaea9, 0x0118,
++      0x7974, 0xc1dc, 0x7976, 0x0078, 0xd1d4, 0x0128, 0x687b, 0x0007,
++      0x787b, 0x0007, 0x0040, 0x687c, 0xd0ac, 0x0128, 0x6834, 0x6938,
++      0x9115, 0x190c, 0xa12c, 0x687c, 0x787e, 0x6890, 0x7892, 0x688c,
++      0x788e, 0x9d90, 0x0019, 0x9f98, 0x0019, 0x2009, 0x0020, 0x0156,
++      0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa291, 0x015e,
++      0x00fe, 0x000e, 0x6882, 0x000e, 0x687e, 0x080c, 0xaf7b, 0x001e,
++      0x6874, 0x0006, 0x2168, 0x080c, 0x0edf, 0x001e, 0x0804, 0xa314,
++      0x0016, 0x00f6, 0x2178, 0x7974, 0x9184, 0x00ff, 0x90b6, 0x0002,
++      0x01e0, 0x9086, 0x0028, 0x1128, 0x687b, 0x001c, 0x787b, 0x001c,
++      0x00e0, 0xd1dc, 0x0158, 0x687b, 0x0015, 0x787b, 0x0015, 0x080c,
++      0xaea9, 0x0118, 0x7974, 0xc1dc, 0x7976, 0x0078, 0xd1d4, 0x0128,
++      0x687b, 0x0007, 0x787b, 0x0007, 0x0040, 0x687c, 0xd0ac, 0x0128,
++      0x6834, 0x6938, 0x9115, 0x190c, 0xa12c, 0x6890, 0x7892, 0x688c,
++      0x788e, 0x687c, 0x787e, 0x00fe, 0x080c, 0x0edf, 0x00de, 0x080c,
++      0xaf7b, 0x6974, 0x0016, 0x080c, 0xa5b9, 0x001e, 0x0468, 0x6867,
++      0x0103, 0x6974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086,
++      0x0028, 0x1118, 0x687b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0x687b,
++      0x0015, 0x080c, 0xaea9, 0x0118, 0x6974, 0xc1dc, 0x6976, 0x0078,
++      0xd1d4, 0x0118, 0x687b, 0x0007, 0x0050, 0x687b, 0x0000, 0x687c,
++      0xd0ac, 0x0128, 0x6834, 0x6938, 0x9115, 0x190c, 0xa12c, 0x6974,
++      0x0016, 0x080c, 0x599a, 0x001e, 0xd1e4, 0x1120, 0x080c, 0x8ed9,
++      0x00de, 0x0005, 0x080c, 0xac0b, 0x0cd8, 0x0005, 0x080c, 0x79ab,
++      0x0010, 0x080c, 0x7a55, 0x080c, 0xa942, 0x01c0, 0x00d6, 0x6114,
++      0x2168, 0x6867, 0x0103, 0x2009, 0x110c, 0x210c, 0xd18c, 0x11c0,
++      0xd184, 0x1198, 0x6108, 0x697a, 0x918e, 0x0029, 0x1110, 0x080c,
++      0xc3c7, 0x6877, 0x0000, 0x080c, 0x5b76, 0x00de, 0x080c, 0x8ed9,
++      0x080c, 0x7aa4, 0x080c, 0x7b72, 0x0005, 0x687b, 0x0004, 0x0c88,
++      0x687b, 0x0004, 0x0c70, 0x9182, 0x0040, 0x0002, 0xa361, 0xa361,
++      0xa361, 0xa361, 0xa361, 0xa363, 0xa361, 0xa366, 0xa361, 0xa361,
++      0xa361, 0xa361, 0xa361, 0xa361, 0xa361, 0xa361, 0xa361, 0xa361,
++      0xa361, 0x080c, 0x0d7e, 0x080c, 0x8ed9, 0x0005, 0x0006, 0x0026,
++      0x9016, 0x080c, 0x137c, 0x002e, 0x000e, 0x0005, 0x9182, 0x0085,
++      0x0002, 0xa380, 0xa37e, 0xa37e, 0xa38c, 0xa37e, 0xa37e, 0xa37e,
++      0xa37e, 0xa37e, 0xa37e, 0xa37e, 0xa37e, 0xa37e, 0x080c, 0x0d7e,
++      0x6003, 0x0001, 0x6106, 0x080c, 0x756e, 0x0126, 0x2091, 0x8000,
++      0x080c, 0x7aa4, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6,
++      0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xa932, 0x01a0,
++      0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e,
++      0x1158, 0x00c6, 0x2d60, 0x080c, 0xa5e6, 0x00ce, 0x0128, 0x6803,
++      0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001,
++      0x080c, 0x756e, 0x080c, 0x7aa4, 0x9280, 0x0004, 0x2004, 0xd0bc,
++      0x0150, 0x6824, 0xd0ec, 0x0138, 0x00c6, 0x2260, 0x6043, 0x0000,
++      0x080c, 0xac39, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005,
++      0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7e,
++      0x908a, 0x0092, 0x1a0c, 0x0d7e, 0x9082, 0x0085, 0x0072, 0x9186,
++      0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7e, 0x080c, 0x79ab,
++      0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0xa3f2, 0xa3f4, 0xa3f4,
++      0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2, 0xa3f2,
++      0xa3f2, 0xa3f2, 0x080c, 0x0d7e, 0x080c, 0x79ab, 0x080c, 0x8f09,
++      0x080c, 0x7aa4, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082,
++      0x0085, 0x2008, 0x04a8, 0x9186, 0x0027, 0x11e8, 0x080c, 0x79ab,
++      0x080c, 0x2862, 0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x0150,
++      0x6867, 0x0103, 0x6877, 0x0000, 0x687b, 0x0029, 0x080c, 0x5b76,
++      0x080c, 0xab11, 0x00de, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005,
++      0x080c, 0x8f6e, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, 0x79ab,
++      0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x0d60, 0x6867, 0x0103,
++      0x6877, 0x0000, 0x687b, 0x0006, 0x6880, 0xc0ec, 0x6882, 0x08f0,
++      0x0002, 0xa448, 0xa446, 0xa446, 0xa446, 0xa446, 0xa446, 0xa460,
++      0xa446, 0xa446, 0xa446, 0xa446, 0xa446, 0xa446, 0x080c, 0x0d7e,
++      0x080c, 0x79ab, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
++      0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x12c0, 0x0010, 0x2001,
++      0x12c1, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x7aa4, 0x0005,
++      0x080c, 0x79ab, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
++      0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x12c0, 0x0010, 0x2001,
++      0x12c1, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x7aa4, 0x0005,
++      0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, 0x080c,
++      0x8f6e, 0x0005, 0xa48f, 0xa48f, 0xa48f, 0xa48f, 0xa491, 0xa4ea,
++      0xa48f, 0xa48f, 0xa48f, 0xa48f, 0xa48f, 0xa48f, 0xa48f, 0x080c,
++      0x0d7e, 0x00d6, 0x6010, 0x2004, 0xd0bc, 0x0168, 0x6034, 0x908c,
++      0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118,
++      0x00de, 0x0804, 0xa4fb, 0x080c, 0xa942, 0x1118, 0x080c, 0xab11,
++      0x00f0, 0x6014, 0x2068, 0x687c, 0xd0e4, 0x1110, 0x080c, 0xab11,
++      0x6867, 0x0103, 0x6880, 0xd0b4, 0x0128, 0x687b, 0x0006, 0xc0ec,
++      0x6882, 0x0048, 0xd0bc, 0x0118, 0x687b, 0x0002, 0x0020, 0x687b,
++      0x0005, 0x080c, 0xac07, 0x6877, 0x0000, 0x080c, 0x5b76, 0x2c68,
++      0x080c, 0x8e83, 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b,
++      0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c,
++      0x613e, 0x6910, 0x6112, 0x080c, 0xad70, 0x6954, 0x6156, 0x6023,
++      0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x2d60, 0x080c, 0x8ed9,
++      0x00de, 0x0005, 0x6010, 0x2004, 0xd0bc, 0x0598, 0x6034, 0x908c,
++      0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118,
++      0x9186, 0x0039, 0x1530, 0x00d6, 0x2c68, 0x080c, 0xaf4e, 0x1904,
++      0xa540, 0x080c, 0x8e83, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023,
++      0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934,
++      0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954,
++      0x6156, 0x080c, 0xad70, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x2d60,
++      0x00f8, 0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x01c8, 0x6867,
++      0x0103, 0x6880, 0xd0b4, 0x0128, 0xc0ec, 0x6882, 0x687b, 0x0006,
++      0x0048, 0xd0bc, 0x0118, 0x687b, 0x0002, 0x0020, 0x687b, 0x0005,
++      0x080c, 0xac07, 0x6877, 0x0000, 0x080c, 0x5b76, 0x080c, 0xab11,
++      0x00de, 0x080c, 0x8ed9, 0x0005, 0x0016, 0x00d6, 0x6014, 0x2068,
++      0x080c, 0xa942, 0x0140, 0x6867, 0x0103, 0x687b, 0x0028, 0x6877,
++      0x0000, 0x080c, 0x5b76, 0x00de, 0x001e, 0x9186, 0x0013, 0x0148,
++      0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x8f6e,
++      0x0030, 0x080c, 0x79ab, 0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005,
++      0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029, 0x0001, 0x9182, 0x0101,
++      0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018,
++      0x2009, 0x0020, 0x9f90, 0x0029, 0x080c, 0xa5c9, 0x96b2, 0x0020,
++      0x7804, 0x906d, 0x0110, 0x080c, 0x0edf, 0x080c, 0x0eb6, 0x0520,
++      0x8528, 0x6867, 0x0110, 0x686b, 0x0000, 0x2d20, 0x7c06, 0x968a,
++      0x003d, 0x1228, 0x2608, 0x9d90, 0x001b, 0x0499, 0x00a8, 0x96b2,
++      0x003c, 0x2009, 0x003c, 0x2d78, 0x9d90, 0x001b, 0x0451, 0x0c28,
++      0x2079, 0x0200, 0x7817, 0x0000, 0x00fe, 0x852f, 0x95ad, 0x0003,
++      0x7d66, 0x95ac, 0x0000, 0x0048, 0x2079, 0x0200, 0x7817, 0x0000,
++      0x00fe, 0x852f, 0x95ad, 0x0003, 0x7d66, 0x00de, 0x006e, 0x005e,
++      0x0005, 0x00f6, 0x8dff, 0x0158, 0x6804, 0x907d, 0x0130, 0x6807,
++      0x0000, 0x080c, 0x5b76, 0x2f68, 0x0cb8, 0x080c, 0x5b76, 0x00fe,
++      0x0005, 0x00f6, 0x0156, 0x2079, 0x0200, 0x9184, 0x0001, 0x0108,
++      0x8108, 0x810c, 0x21a8, 0x2300, 0x9e00, 0x2004, 0x8007, 0x2012,
++      0x8318, 0x9386, 0x0020, 0x1120, 0x2018, 0x7814, 0x8000, 0x7816,
++      0x8210, 0x1f04, 0xa5d3, 0x015e, 0x00fe, 0x0005, 0x0066, 0x0126,
++      0x2091, 0x8000, 0x2031, 0x0001, 0x6020, 0x9084, 0x000f, 0x0083,
++      0x012e, 0x006e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031,
++      0x0000, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005,
++      0xa621, 0xa621, 0xa61c, 0xa643, 0xa60f, 0xa61c, 0xa643, 0xa61c,
++      0xa60f, 0xa60f, 0xa61c, 0xa61c, 0xa61c, 0xa60f, 0xa60f, 0x080c,
++      0x0d7e, 0x0036, 0x2019, 0x0010, 0x080c, 0xbd23, 0x6023, 0x0006,
++      0x6003, 0x0007, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001,
++      0x0005, 0x00d6, 0x86ff, 0x11d8, 0x6014, 0x2068, 0x080c, 0xa942,
++      0x01c0, 0x6864, 0x9086, 0x0139, 0x1128, 0x687b, 0x0005, 0x6883,
++      0x0000, 0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x5d95, 0x080c,
++      0xac07, 0x080c, 0x5b76, 0x080c, 0x8f09, 0x9085, 0x0001, 0x00de,
++      0x0005, 0x9006, 0x0ce0, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7e,
++      0x000b, 0x0005, 0xa65a, 0xa67b, 0xa65c, 0xa69a, 0xa678, 0xa65a,
++      0xa61c, 0xa621, 0xa621, 0xa61c, 0xa61c, 0xa61c, 0xa61c, 0xa61c,
++      0xa61c, 0xa61c, 0x080c, 0x0d7e, 0x86ff, 0x11b8, 0x6020, 0x9086,
++      0x0006, 0x0198, 0x00d6, 0x6014, 0x2068, 0x080c, 0xa942, 0x0110,
++      0x080c, 0xac07, 0x00de, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
++      0x0002, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x9085, 0x0001, 0x0005,
++      0x080c, 0x1509, 0x0c08, 0x00e6, 0x2071, 0x1304, 0x7024, 0x9c06,
++      0x1110, 0x080c, 0x87a2, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006,
++      0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x8968,
++      0x009e, 0x008e, 0x0010, 0x080c, 0x86b8, 0x00ee, 0x1928, 0x080c,
++      0xa61c, 0x0005, 0x0036, 0x00e6, 0x2071, 0x1304, 0x703c, 0x9c06,
++      0x1138, 0x901e, 0x080c, 0x8847, 0x00ee, 0x003e, 0x0804, 0xa65c,
++      0x080c, 0x8a8d, 0x00ee, 0x003e, 0x1904, 0xa65c, 0x080c, 0xa61c,
++      0x0005, 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005,
++      0xa6ce, 0xa759, 0xa8a3, 0xa6d9, 0x8f09, 0xa6ce, 0xbd15, 0x8ed9,
++      0xa759, 0xa6c7, 0xa90e, 0xa6c7, 0xa6c7, 0xa6c7, 0xa6c7, 0x080c,
++      0x0d7e, 0x080c, 0xab2e, 0x1110, 0x080c, 0x97dc, 0x0005, 0x080c,
++      0x79ab, 0x080c, 0x7aa4, 0x080c, 0x8ed9, 0x0005, 0x601b, 0x0001,
++      0x0005, 0x080c, 0xa942, 0x0120, 0x6014, 0x9080, 0x0025, 0x2c02,
++      0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7e, 0x000b, 0x0005, 0xa6f7,
++      0xa6f9, 0xa719, 0xa72b, 0xa738, 0xa6f7, 0xa6ce, 0xa6ce, 0xa6ce,
++      0xa72b, 0xa72b, 0xa6f7, 0xa6f7, 0xa6f7, 0xa6f7, 0xa735, 0x080c,
++      0x0d7e, 0x00e6, 0x6014, 0x2070, 0x7080, 0xc0b5, 0x7082, 0x2071,
++      0x1304, 0x7024, 0x9c06, 0x0190, 0x080c, 0x86b8, 0x6007, 0x0085,
++      0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x12c1, 0x2004, 0x601a,
++      0x080c, 0x756e, 0x080c, 0x7aa4, 0x00ee, 0x0005, 0x601b, 0x0001,
++      0x0cd8, 0x00d6, 0x6014, 0x2068, 0x6880, 0xc0b5, 0x6882, 0x00de,
++      0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x756e,
++      0x080c, 0x7aa4, 0x0005, 0x00d6, 0x601b, 0x0001, 0x6014, 0x2068,
++      0x6880, 0xc0b5, 0x6882, 0x00de, 0x0005, 0x080c, 0x8ed9, 0x0005,
++      0x6014, 0x9005, 0x01d8, 0x9088, 0x001f, 0x210c, 0xd1e4, 0x01b0,
++      0x9080, 0x0021, 0x2004, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a,
++      0x2001, 0x0037, 0x2c08, 0x080c, 0x130c, 0x6000, 0x9086, 0x0004,
++      0x1120, 0x2009, 0x0048, 0x080c, 0x8f53, 0x0005, 0x080c, 0x1509,
++      0x0800, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7e, 0x000b, 0x0005,
++      0xa770, 0xa6d6, 0xa772, 0xa770, 0xa772, 0xa772, 0xa6cf, 0xa770,
++      0xa6c9, 0xa6c9, 0xa770, 0xa770, 0xa770, 0xa770, 0xa770, 0xa770,
++      0x080c, 0x0d7e, 0x6010, 0x00d6, 0x2068, 0x6804, 0x9084, 0x00ff,
++      0x00de, 0x908a, 0x000c, 0x1a0c, 0x0d7e, 0x000b, 0x0005, 0xa78b,
++      0xa849, 0xa78d, 0xa7cb, 0xa78d, 0xa7cb, 0xa78d, 0xa79b, 0xa78b,
++      0xa7cb, 0xa78b, 0xa7b7, 0x080c, 0x0d7e, 0x6004, 0x908e, 0x0016,
++      0x05a8, 0x908e, 0x0004, 0x0590, 0x908e, 0x0002, 0x0578, 0x908e,
++      0x0052, 0x0904, 0xa845, 0x6004, 0x080c, 0xab2e, 0x0904, 0xa862,
++      0x908e, 0x0021, 0x0904, 0xa866, 0x908e, 0x0022, 0x0904, 0xa862,
++      0x908e, 0x003d, 0x0904, 0xa866, 0x908e, 0x0039, 0x0904, 0xa86a,
++      0x908e, 0x0035, 0x0904, 0xa86a, 0x908e, 0x001e, 0x0188, 0x908e,
++      0x0001, 0x1150, 0x6010, 0x00d6, 0x2068, 0x6804, 0x9084, 0x00ff,
++      0x00de, 0x9086, 0x0006, 0x0110, 0x080c, 0x2862, 0x080c, 0x97dc,
++      0x080c, 0x8f09, 0x0005, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016,
++      0x0904, 0xa836, 0x9186, 0x0002, 0x15b8, 0x2001, 0x1136, 0x2004,
++      0xd08c, 0x1178, 0x080c, 0x62e4, 0x1160, 0x2001, 0x12a8, 0x2003,
++      0x0001, 0x2001, 0x1100, 0x2003, 0x0001, 0x080c, 0x621a, 0x0804,
++      0xa88c, 0x6010, 0x2068, 0x2001, 0x1136, 0x2004, 0xd0ac, 0x1904,
++      0xa88c, 0x68a0, 0xd0bc, 0x1904, 0xa88c, 0x6840, 0x9084, 0x00ff,
++      0x9005, 0x0190, 0x8001, 0x6842, 0x6017, 0x0000, 0x6023, 0x0007,
++      0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0x8e83, 0x0128, 0x2d00,
++      0x6012, 0x6023, 0x0001, 0x0450, 0x00de, 0x00ce, 0x6004, 0x908e,
++      0x0002, 0x11a8, 0x6010, 0x9080, 0x0028, 0x2004, 0x9086, 0x007e,
++      0x1170, 0x2009, 0x1136, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071,
++      0x1100, 0x080c, 0x5092, 0x00ee, 0x080c, 0x97dc, 0x0020, 0x080c,
++      0x97dc, 0x080c, 0x2862, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c,
++      0x2886, 0x012e, 0x00ee, 0x080c, 0x8f09, 0x0005, 0x2001, 0x0002,
++      0x080c, 0x5568, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x75be,
++      0x080c, 0x7aa4, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2886, 0x0804,
++      0xa7c6, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010,
++      0x2068, 0x6840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xa80c, 0x8001,
++      0x6842, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x00de,
++      0x00ce, 0x0898, 0x080c, 0x97dc, 0x0804, 0xa7c8, 0x080c, 0x9809,
++      0x0804, 0xa7c8, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xaf4e, 0x00de,
++      0x0118, 0x080c, 0x8ed9, 0x00b8, 0x6004, 0x8007, 0x6134, 0x918c,
++      0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
++      0x0002, 0x603c, 0x600a, 0x2001, 0x12c1, 0x2004, 0x601a, 0x080c,
++      0x756e, 0x080c, 0x7aa4, 0x0005, 0x00de, 0x00ce, 0x080c, 0x97dc,
++      0x080c, 0x2862, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2886,
++      0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000,
++      0x012e, 0x00ee, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7e,
++      0x00d6, 0x0013, 0x00de, 0x0005, 0xa8bc, 0xa8bc, 0xa8bc, 0xa8bc,
++      0xa8bc, 0xa8bc, 0xa8bc, 0xa8bc, 0xa8bc, 0xa6ce, 0xa8bc, 0xa6d6,
++      0xa8be, 0xa6d6, 0xa8cb, 0xa8bc, 0x080c, 0x0d7e, 0x6004, 0x9086,
++      0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x756e,
++      0x080c, 0x7aa4, 0x0005, 0x080c, 0xab11, 0x080c, 0xa942, 0x0570,
++      0x080c, 0x2862, 0x080c, 0xa942, 0x0168, 0x6014, 0x2068, 0x6867,
++      0x0103, 0x687b, 0x0006, 0x6877, 0x0000, 0x6880, 0xc0ed, 0x6882,
++      0x080c, 0x5b76, 0x2c68, 0x080c, 0x8e83, 0x0150, 0x6810, 0x6012,
++      0x080c, 0xad70, 0x00c6, 0x2d60, 0x080c, 0x8f09, 0x00ce, 0x0008,
++      0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003,
++      0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0078, 0x6034, 0x908c,
++      0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118,
++      0x080c, 0x2862, 0x08b8, 0x080c, 0x8f09, 0x0005, 0x6000, 0x908a,
++      0x0016, 0x1a0c, 0x0d7e, 0x000b, 0x0005, 0xa925, 0xa925, 0xa927,
++      0xa927, 0xa927, 0xa925, 0xa925, 0xa925, 0xa925, 0xa925, 0xa925,
++      0xa925, 0xa925, 0xa925, 0xa925, 0xa925, 0x080c, 0x0d7e, 0x080c,
++      0x8a8d, 0x6114, 0x2168, 0x687b, 0x0006, 0x080c, 0x5b76, 0x080c,
++      0x8ed9, 0x0005, 0x9284, 0x0007, 0x1158, 0x9282, 0x15c0, 0x0240,
++      0x2001, 0x1118, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005,
++      0x9006, 0x0ce8, 0x0026, 0x6214, 0x9294, 0xf000, 0x002e, 0x0005,
++      0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061,
++      0x15c0, 0x2071, 0x1100, 0x734c, 0x706c, 0x9302, 0x12a8, 0x6020,
++      0x9206, 0x1160, 0x080c, 0xacea, 0x0148, 0x080c, 0xab2e, 0x1110,
++      0x080c, 0x97dc, 0x00c6, 0x080c, 0x8ed9, 0x00ce, 0x9ce0, 0x0018,
++      0x7060, 0x9c02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e, 0x00ce,
++      0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c,
++      0x81ff, 0x0128, 0x2061, 0x1389, 0x6112, 0x080c, 0x2862, 0x9006,
++      0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6,
++      0x0056, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83, 0x005e,
++      0x0180, 0x6616, 0x6512, 0x080c, 0xad70, 0x6023, 0x0003, 0x2009,
++      0x004b, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x005e, 0x00ce,
++      0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000,
++      0x62a0, 0x00c6, 0x080c, 0x8f26, 0x005e, 0x0538, 0x6017, 0x0000,
++      0x6512, 0x080c, 0xad70, 0x6023, 0x0003, 0x0016, 0x00c6, 0x2560,
++      0x00ce, 0x080c, 0x76f0, 0x0076, 0x903e, 0x080c, 0x75ee, 0x2c08,
++      0x080c, 0xbec2, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x8ed9,
++      0x9085, 0x0001, 0x0030, 0x2009, 0x004c, 0x080c, 0x8f53, 0x9085,
++      0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00f6,
++      0x00c6, 0x0046, 0x00c6, 0x080c, 0x8e83, 0x2c78, 0x00ce, 0x0180,
++      0x7e16, 0x2c00, 0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c,
++      0xaa35, 0x2f60, 0x2009, 0x004d, 0x080c, 0x8f53, 0x9085, 0x0001,
++      0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6,
++      0x080c, 0x8e83, 0x2c78, 0x00ce, 0x0178, 0x7e16, 0x2c00, 0x7812,
++      0x7823, 0x0003, 0x2021, 0x0005, 0x0481, 0x2f60, 0x2009, 0x004e,
++      0x080c, 0x8f53, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005,
++      0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x8e83, 0x2c78, 0x00ce,
++      0x01c0, 0x7e16, 0x2c00, 0x7812, 0x7823, 0x0003, 0x2021, 0x0004,
++      0x00a1, 0x2001, 0x12a9, 0x2004, 0xd0fc, 0x0120, 0x2f60, 0x080c,
++      0x8ed9, 0x0028, 0x2f60, 0x2009, 0x0052, 0x080c, 0x8f53, 0x9085,
++      0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x0096, 0x0076, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x572a, 0x0158, 0x2001, 0xaa3a, 0x0006,
++      0x900e, 0x2400, 0x080c, 0x5d95, 0x080c, 0x5b76, 0x000e, 0x0807,
++      0x2418, 0x080c, 0x7947, 0x62a0, 0x0086, 0x2041, 0x0001, 0x2039,
++      0x0001, 0x2608, 0x080c, 0x7708, 0x008e, 0x080c, 0x75ee, 0x2f08,
++      0x2648, 0x080c, 0xbec2, 0x613c, 0x81ff, 0x090c, 0x77c0, 0x080c,
++      0x7aa4, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091,
++      0x8000, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x0188, 0x660a, 0x6112,
++      0x080c, 0xad70, 0x6023, 0x0001, 0x2d00, 0x6016, 0x2009, 0x001f,
++      0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
++      0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83,
++      0x001e, 0x01b0, 0x660a, 0x6112, 0x080c, 0xad70, 0x6023, 0x0008,
++      0x2d00, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x137e, 0x00fe, 0x2009,
++      0x0021, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
++      0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c,
++      0x8e83, 0x001e, 0x0188, 0x660a, 0x6112, 0x080c, 0xad70, 0x6023,
++      0x0001, 0x2d00, 0x6016, 0x2009, 0x003d, 0x080c, 0x8f53, 0x9085,
++      0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126,
++      0x2091, 0x8000, 0x00c6, 0x080c, 0x8f26, 0x001e, 0x0180, 0x6112,
++      0x080c, 0xad70, 0x6023, 0x0001, 0x2d00, 0x6016, 0x2009, 0x0000,
++      0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
++      0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83,
++      0x001e, 0x0188, 0x660a, 0x6112, 0x080c, 0xad70, 0x6023, 0x0001,
++      0x2d00, 0x6016, 0x2009, 0x0044, 0x080c, 0x8f53, 0x9085, 0x0001,
++      0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091,
++      0x8000, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x0188, 0x660a, 0x6112,
++      0x080c, 0xad70, 0x6023, 0x0001, 0x2d00, 0x6016, 0x2009, 0x0049,
++      0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
++      0x0cd8, 0x0026, 0x00d6, 0x6210, 0x2268, 0x6a3c, 0x82ff, 0x0110,
++      0x8211, 0x6a3e, 0x00de, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004,
++      0x908e, 0x0002, 0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004,
++      0x0110, 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x00d6,
++      0x6014, 0x906d, 0x0148, 0x6864, 0x9086, 0x0139, 0x0138, 0x6868,
++      0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00de, 0x000e,
++      0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83,
++      0x001e, 0x0190, 0x6112, 0x080c, 0xad70, 0x6023, 0x0001, 0x2d00,
++      0x6016, 0x080c, 0x2862, 0x2009, 0x0028, 0x080c, 0x8f53, 0x9085,
++      0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015,
++      0x1188, 0x2011, 0x1122, 0x2204, 0x9086, 0x0074, 0x1158, 0x080c,
++      0x9bfa, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x75be, 0x080c,
++      0x7aa4, 0x0070, 0x6014, 0x9080, 0x001a, 0x2004, 0xd0fc, 0x0148,
++      0x2001, 0x0001, 0x080c, 0xaf0f, 0x080c, 0x97dc, 0x080c, 0x8ed9,
++      0x0005, 0x00d6, 0x6014, 0x906d, 0x090c, 0x0d7e, 0x687b, 0x0030,
++      0x6883, 0x0000, 0x6897, 0x4005, 0x689b, 0x0004, 0x6867, 0x0139,
++      0x0126, 0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x00de, 0x080c,
++      0x8ed9, 0x0c30, 0x9186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c,
++      0x5568, 0x00e8, 0x9186, 0x0015, 0x1518, 0x2011, 0x1122, 0x2204,
++      0x9086, 0x0014, 0x11e8, 0x6010, 0x00d6, 0x2068, 0x080c, 0x56a8,
++      0x00de, 0x080c, 0x9cc9, 0x11a0, 0x6010, 0x00d6, 0x2068, 0x6890,
++      0x00de, 0x9005, 0x0168, 0x2001, 0x0006, 0x080c, 0x5568, 0x6014,
++      0x9080, 0x001a, 0x2004, 0xd0fc, 0x0170, 0x080c, 0x9275, 0x0050,
++      0x6014, 0x9080, 0x001a, 0x2004, 0xd0fc, 0x01d0, 0x080c, 0x97dc,
++      0x080c, 0x8ed9, 0x0005, 0x6014, 0x00d6, 0x906d, 0x090c, 0x0d7e,
++      0x687b, 0x0000, 0x6883, 0x0000, 0x6897, 0x4000, 0x0126, 0x2091,
++      0x8000, 0x080c, 0x5b76, 0x012e, 0x00de, 0x080c, 0x8ed9, 0x0c50,
++      0x6014, 0x00d6, 0x906d, 0x090c, 0x0d7e, 0x687b, 0x0030, 0x6883,
++      0x0000, 0x6897, 0x4005, 0x689b, 0x0004, 0x6867, 0x0139, 0x0126,
++      0x2091, 0x8000, 0x080c, 0x5b76, 0x012e, 0x00de, 0x080c, 0x8ed9,
++      0x0888, 0x6878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005, 0x6880,
++      0xc0ad, 0x6882, 0x0005, 0x6043, 0x0000, 0x6017, 0x0000, 0x6003,
++      0x0001, 0x6007, 0x0050, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x0005,
++      0x00c6, 0x6010, 0x2004, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f,
++      0x0013, 0x00ce, 0x0005, 0xa6ce, 0xac34, 0xac34, 0xac37, 0xc172,
++      0xc18d, 0xc190, 0xa6ce, 0xa6ce, 0xa6ce, 0xa6ce, 0xa6ce, 0xa6ce,
++      0xa6ce, 0xa6ce, 0x080c, 0x0d7e, 0xa001, 0xa001, 0x0005, 0x0009,
++      0x0005, 0x6010, 0x2004, 0xd0bc, 0x0550, 0x00f6, 0x2c78, 0x080c,
++      0x8e83, 0x1128, 0x2001, 0x12c2, 0x2004, 0x7842, 0x00f8, 0x7810,
++      0x6012, 0x080c, 0xad70, 0x7820, 0x9086, 0x0003, 0x0128, 0x7808,
++      0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a,
++      0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7954,
++      0x6156, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x2f60, 0x00fe, 0x0005,
++      0x0016, 0x00f6, 0x6814, 0x2078, 0x787c, 0xd0e4, 0x0180, 0xc0e4,
++      0x787e, 0x7877, 0x0000, 0x7893, 0x0000, 0x788f, 0x0000, 0xd0cc,
++      0x0130, 0x7878, 0x00d6, 0x2068, 0x080c, 0x0edf, 0x00de, 0x6830,
++      0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005,
++      0x0168, 0x9006, 0x602e, 0x6032, 0x00c8, 0x681c, 0xc085, 0x681e,
++      0x6803, 0x0004, 0x6824, 0xc0f4, 0xc0d5, 0x6826, 0x6814, 0x2078,
++      0x78ac, 0x6938, 0x9102, 0x78b0, 0x693c, 0x9103, 0x1e50, 0x683c,
++      0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a,
++      0x6808, 0x603e, 0x6910, 0x6112, 0x6954, 0x6156, 0x6023, 0x0001,
++      0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4,
++      0x00fe, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8,
++      0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024,
++      0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0x6c3e, 0x6b42, 0x0046,
++      0x0036, 0x2400, 0x6cac, 0x9402, 0x6836, 0x2300, 0x6bb0, 0x9303,
++      0x683a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005,
++      0xd0f4, 0x1138, 0x683c, 0x603a, 0x6840, 0x603e, 0x6024, 0xc0f5,
++      0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, 0x01b8,
++      0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, 0x0037,
++      0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e,
++      0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e,
++      0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001,
++      0x12bc, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x73f0,
++      0x2001, 0x12c0, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001,
++      0x12be, 0x200c, 0x8000, 0x2014, 0x2071, 0x1297, 0x711a, 0x721e,
++      0x2001, 0x0064, 0x080c, 0x73f0, 0x2001, 0x12c1, 0x82ff, 0x1110,
++      0x2011, 0x0014, 0x2202, 0x2001, 0x12c2, 0x9288, 0x000a, 0x2102,
++      0x2001, 0x136b, 0x2102, 0x2001, 0x0032, 0x080c, 0x130c, 0x080c,
++      0x58af, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006,
++      0x0016, 0x00e6, 0x2001, 0x12c0, 0x2003, 0x0028, 0x2001, 0x12c1,
++      0x2003, 0x0014, 0x2071, 0x1297, 0x701b, 0x0000, 0x701f, 0x07d0,
++      0x2001, 0x12c2, 0x2009, 0x001e, 0x2102, 0x2001, 0x136b, 0x2102,
++      0x2001, 0x0032, 0x080c, 0x130c, 0x00ee, 0x001e, 0x000e, 0x0005,
++      0x00d6, 0x6058, 0x906d, 0x0110, 0x080c, 0x0ecf, 0x00de, 0x0005,
++      0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83,
++      0x001e, 0x0178, 0x6112, 0x0ca1, 0x6023, 0x0001, 0x2d00, 0x6016,
++      0x2009, 0x0033, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce,
++      0x0005, 0x9006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0x1100,
++      0x9186, 0x0015, 0x11f8, 0x7088, 0x9086, 0x0018, 0x11d8, 0x6014,
++      0x2068, 0x6a3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x7c86, 0x01d0,
++      0x7074, 0x6a50, 0x9206, 0x1158, 0x7078, 0x6a54, 0x9206, 0x1138,
++      0x6210, 0x9290, 0x0028, 0x2214, 0x900e, 0x080c, 0x28a5, 0x080c,
++      0x9275, 0x0020, 0x080c, 0x97dc, 0x080c, 0x8ed9, 0x00fe, 0x00ee,
++      0x00de, 0x0005, 0x7058, 0x6a54, 0x9206, 0x0d50, 0x0c80, 0x00c6,
++      0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8e83, 0x001e, 0x0180,
++      0x6112, 0x080c, 0xad70, 0x6023, 0x0001, 0x2d00, 0x6016, 0x2009,
++      0x004d, 0x080c, 0x8f53, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
++      0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x00c6,
++      0x080c, 0x8e83, 0x001e, 0x0178, 0x6112, 0x080c, 0xad70, 0x6023,
++      0x0001, 0x2d00, 0x6016, 0x001e, 0x080c, 0x8f53, 0x9085, 0x0001,
++      0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026,
++      0x0036, 0x0046, 0x0056, 0x0066, 0x00d6, 0x00e6, 0x00f6, 0x2071,
++      0x1100, 0x9186, 0x0015, 0x1538, 0x7188, 0x6014, 0x2068, 0x6814,
++      0x8003, 0x9106, 0x1500, 0x20e1, 0x0000, 0x2001, 0x12da, 0x2003,
++      0x0000, 0x6014, 0x20e9, 0x0001, 0x2068, 0x6830, 0x20a8, 0x9d80,
++      0x001b, 0x20a0, 0x2001, 0x12da, 0x0016, 0x200c, 0x080c, 0xb4ed,
++      0x001e, 0x6804, 0x9005, 0x0110, 0x2068, 0x0c78, 0x6014, 0x2070,
++      0x7067, 0x0103, 0x0010, 0x080c, 0x97dc, 0x080c, 0x8ed9, 0x00fe,
++      0x00ee, 0x00de, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e,
++      0x0005, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0x1100, 0x9186, 0x0015,
++      0x11c0, 0x7088, 0x9086, 0x0004, 0x11a0, 0x6014, 0x90e8, 0x001b,
++      0x2c78, 0x080c, 0x7c86, 0x01a8, 0x7074, 0x6a08, 0x9206, 0x1130,
++      0x7078, 0x6a0c, 0x9206, 0x1110, 0x080c, 0x2862, 0x080c, 0x9275,
++      0x0020, 0x080c, 0x97dc, 0x080c, 0x8ed9, 0x00fe, 0x00ee, 0x00de,
++      0x0005, 0x7058, 0x6a0c, 0x9206, 0x0d78, 0x0c80, 0x00d6, 0x00e6,
++      0x00f6, 0x2071, 0x1100, 0x9186, 0x0015, 0x11f0, 0x7088, 0x9086,
++      0x0004, 0x11d0, 0x6014, 0x90e8, 0x0031, 0x2c78, 0x080c, 0x7c86,
++      0x0558, 0x7074, 0x6a08, 0x9206, 0x1130, 0x7078, 0x6a0c, 0x9206,
++      0x1110, 0x080c, 0x2862, 0x6014, 0x2068, 0x687b, 0x0000, 0x6883,
++      0x0000, 0x6897, 0x4000, 0x0050, 0x6014, 0x2068, 0x687b, 0x0030,
++      0x6883, 0x0000, 0x6897, 0x4005, 0x689b, 0x0004, 0x0126, 0x2091,
++      0x8000, 0x6867, 0x0139, 0x080c, 0x5b76, 0x012e, 0x080c, 0x8ed9,
++      0x00fe, 0x00ee, 0x00de, 0x0005, 0x7058, 0x6a0c, 0x9206, 0x09c8,
++      0x08d0, 0x0016, 0x0026, 0x687c, 0xd0ac, 0x0178, 0x6938, 0x6a34,
++      0x2100, 0x9205, 0x0150, 0x6890, 0x9106, 0x1118, 0x688c, 0x9206,
++      0x0120, 0x6992, 0x6a8e, 0x9085, 0x0001, 0x002e, 0x001e, 0x0005,
++      0x00d6, 0x0036, 0x6314, 0x2368, 0x687a, 0x6982, 0x929e, 0x4000,
++      0x1558, 0x6310, 0x00c6, 0x2360, 0x900e, 0x6868, 0xd0f4, 0x1140,
++      0x080c, 0x57d6, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d,
++      0x6a96, 0x699a, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x20e9, 0x0001,
++      0x9d80, 0x0031, 0x20a0, 0x9c80, 0x0006, 0x2098, 0x080c, 0x504f,
++      0x20a9, 0x0004, 0x9d80, 0x0035, 0x20a0, 0x9c80, 0x000a, 0x2098,
++      0x080c, 0x504f, 0x00ce, 0x00a0, 0x6a96, 0x3918, 0x9398, 0x0006,
++      0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0x689b, 0x0004, 0x6ba2,
++      0x6310, 0x00c6, 0x2360, 0x6004, 0x00ce, 0x9084, 0x00ff, 0x689e,
++      0x080c, 0x5b76, 0x6017, 0x0000, 0x003e, 0x00de, 0x0005, 0x0026,
++      0x0036, 0x0046, 0x00e6, 0x00d6, 0x00f6, 0x6214, 0x2268, 0x6210,
++      0x2270, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0x7014, 0x9084,
++      0x00ff, 0x900e, 0x080c, 0x1f63, 0x2118, 0x831f, 0x939c, 0xff00,
++      0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c,
++      0x3f23, 0x00a8, 0x9096, 0x0001, 0x1148, 0x8dff, 0x0180, 0x689b,
++      0x000d, 0x7838, 0x68a6, 0x783c, 0x68aa, 0x0048, 0x9096, 0x0002,
++      0x1130, 0x689b, 0x000d, 0x7838, 0x68a6, 0x783c, 0x68aa, 0x00fe,
++      0x00de, 0x00ee, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026,
++      0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c,
++      0xa932, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
++      0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160,
++      0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106,
++      0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005,
++      0x9085, 0x0001, 0x0cc8, 0x6974, 0xd1cc, 0x0188, 0x918c, 0x00ff,
++      0x918e, 0x0002, 0x1160, 0x69a8, 0x918c, 0x0f00, 0x810f, 0x918e,
++      0x0001, 0x1128, 0x6834, 0x6938, 0x9115, 0x190c, 0xa12c, 0x0005,
++      0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7e, 0x0013, 0x006e,
++      0x0005, 0xafa9, 0xb5ee, 0xb74e, 0xafa9, 0xafa9, 0xafa9, 0xafa9,
++      0xafa9, 0xafe0, 0xb7d1, 0xafa9, 0xafa9, 0xafa9, 0xafa9, 0xafa9,
++      0xafa9, 0x080c, 0x0d7e, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c,
++      0x0d7e, 0x0013, 0x006e, 0x0005, 0xafc4, 0xbcae, 0xafc4, 0xafc4,
++      0xafc4, 0xafc4, 0xafc4, 0xafc4, 0xbc5d, 0xbd02, 0xafc4, 0xc2b5,
++      0xc2eb, 0xc2b5, 0xc2eb, 0xafc4, 0x080c, 0x0d7e, 0x6000, 0x9082,
++      0x0016, 0x1a0c, 0x0d7e, 0x6000, 0x000a, 0x0005, 0xafde, 0xb91e,
++      0xba17, 0xba39, 0xbaf9, 0xafde, 0xbbd0, 0xbb7b, 0xb7dd, 0xbc33,
++      0xbc48, 0xafde, 0xafde, 0xafde, 0xafde, 0xafde, 0x080c, 0x0d7e,
++      0x91b2, 0x0053, 0x1a0c, 0x0d7e, 0x2100, 0x91b2, 0x0040, 0x1a04,
++      0xb414, 0x0002, 0xb02a, 0xb214, 0xb02a, 0xb02a, 0xb02a, 0xb21d,
++      0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a,
++      0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a,
++      0xb02a, 0xb02c, 0xb087, 0xb096, 0xb0f8, 0xb122, 0xb1a0, 0xb1ff,
++      0xb02a, 0xb02a, 0xb220, 0xb02a, 0xb02a, 0xb235, 0xb242, 0xb02a,
++      0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb2c9, 0xb02a, 0xb02a, 0xb2d8,
++      0xb02a, 0xb02a, 0xb294, 0xb02a, 0xb02a, 0xb02a, 0xb2f0, 0xb02a,
++      0xb02a, 0xb02a, 0xb368, 0xb02a, 0xb02a, 0xb02a, 0xb02a, 0xb02a,
++      0xb02a, 0xb3dd, 0x080c, 0x0d7e, 0x080c, 0x588e, 0x1150, 0x2001,
++      0x1136, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008,
++      0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804,
++      0xb20d, 0x080c, 0x587e, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016,
++      0x6210, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x76f0,
++      0x0076, 0x903e, 0x080c, 0x75ee, 0x2c08, 0x080c, 0xbec2, 0x007e,
++      0x001e, 0x2e60, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610,
++      0x00c6, 0x2660, 0x080c, 0x5617, 0x00ce, 0x96b0, 0x0001, 0x2634,
++      0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, 0xbe06, 0x1904,
++      0xb0f2, 0x080c, 0xbda3, 0x1120, 0x6007, 0x0008, 0x0804, 0xb20d,
++      0x6007, 0x0009, 0x0804, 0xb20d, 0x080c, 0xbfdb, 0x0128, 0x080c,
++      0xbe06, 0x0d78, 0x0804, 0xb0f2, 0x6017, 0x1900, 0x0c88, 0x080c,
++      0x297d, 0x1904, 0xb411, 0x6106, 0x080c, 0xbd61, 0x6007, 0x0006,
++      0x0804, 0xb20d, 0x6007, 0x0007, 0x0804, 0xb20d, 0x080c, 0xc327,
++      0x1904, 0xb411, 0x080c, 0x297d, 0x1904, 0xb411, 0x00d6, 0x6610,
++      0x2668, 0x6e04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001,
++      0x0001, 0x080c, 0x5556, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006,
++      0x0188, 0x9686, 0x0004, 0x0170, 0x6e04, 0x96b4, 0x00ff, 0x9686,
++      0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110,
++      0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003,
++      0x1138, 0x90b2, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, 0x0130,
++      0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b8, 0x00ee, 0x080c,
++      0xbe64, 0x1198, 0x9686, 0x0006, 0x1148, 0x0026, 0x6210, 0x9290,
++      0x0028, 0x2214, 0x900e, 0x080c, 0x28a5, 0x002e, 0x080c, 0x56a8,
++      0x6007, 0x000a, 0x00de, 0x0804, 0xb20d, 0x6007, 0x000b, 0x00de,
++      0x0804, 0xb20d, 0x080c, 0x2862, 0x6007, 0x0001, 0x0804, 0xb20d,
++      0x080c, 0xc327, 0x1904, 0xb411, 0x080c, 0x297d, 0x1904, 0xb411,
++      0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1950, 0x90b2, 0x0014,
++      0x0a38, 0x7030, 0x9084, 0x0003, 0x1918, 0x6610, 0x00d6, 0x2668,
++      0x6e04, 0x00de, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x9290,
++      0x0028, 0x2214, 0x900e, 0x080c, 0x28a5, 0x002e, 0x6007, 0x000c,
++      0x0804, 0xb20d, 0x080c, 0x588e, 0x1140, 0x2001, 0x1136, 0x2004,
++      0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xb039, 0x080c,
++      0x587e, 0x6610, 0x96b0, 0x0001, 0x2634, 0x9684, 0x00ff, 0x9082,
++      0x0006, 0x06e8, 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x5592,
++      0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120,
++      0x9686, 0x0006, 0x1904, 0xb0f2, 0x080c, 0xbe71, 0x1120, 0x6007,
++      0x000e, 0x0804, 0xb20d, 0x0046, 0x6410, 0x94a0, 0x0028, 0x2424,
++      0x94a4, 0x00ff, 0x8427, 0x0046, 0x080c, 0x2862, 0x004e, 0x0016,
++      0x9006, 0x2009, 0x1153, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029,
++      0x080c, 0xc12f, 0x6010, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802,
++      0x00de, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xb20d, 0x2001,
++      0x0001, 0x080c, 0x5556, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9,
++      0x0004, 0x2019, 0x1105, 0x2011, 0x0270, 0x080c, 0x9d60, 0x003e,
++      0x002e, 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637,
++      0x9682, 0x0004, 0x0a04, 0xb0f2, 0x9682, 0x0007, 0x0a04, 0xb14c,
++      0x0804, 0xb0f2, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xb20d,
++      0x080c, 0x588e, 0x1140, 0x2001, 0x1136, 0x2004, 0x9084, 0x0009,
++      0x9086, 0x0008, 0x1110, 0x0804, 0xb039, 0x080c, 0x587e, 0x6610,
++      0x96b0, 0x0001, 0x2634, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06b8,
++      0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006,
++      0x1904, 0xb0f2, 0x080c, 0xbe99, 0x1138, 0x080c, 0xbda3, 0x1120,
++      0x6007, 0x0010, 0x0804, 0xb20d, 0x0046, 0x6410, 0x94a0, 0x0028,
++      0x2424, 0x94a4, 0x00ff, 0x8427, 0x0046, 0x080c, 0x2862, 0x004e,
++      0x0016, 0x9006, 0x2009, 0x1153, 0x210c, 0xd1a4, 0x0158, 0x2009,
++      0x0029, 0x080c, 0xc12f, 0x6010, 0x00d6, 0x2068, 0x6800, 0xc0e5,
++      0x6802, 0x00de, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c,
++      0xbfdb, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0950,
++      0x0804, 0xb0f2, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c,
++      0x297d, 0x1904, 0xb411, 0x080c, 0xc327, 0x1904, 0xb411, 0x080c,
++      0xb588, 0x1904, 0xb0f2, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c,
++      0x75be, 0x080c, 0x7aa4, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001,
++      0x080c, 0x75be, 0x080c, 0x7aa4, 0x0cb0, 0x6007, 0x0005, 0x0c68,
++      0x080c, 0xc327, 0x1904, 0xb411, 0x080c, 0x297d, 0x1904, 0xb411,
++      0x080c, 0xb588, 0x1904, 0xb0f2, 0x6007, 0x0020, 0x6003, 0x0001,
++      0x080c, 0x75be, 0x080c, 0x7aa4, 0x0005, 0x080c, 0x297d, 0x1904,
++      0xb411, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c,
++      0x7aa4, 0x0005, 0x080c, 0xc327, 0x1904, 0xb411, 0x080c, 0x297d,
++      0x1904, 0xb411, 0x080c, 0xb588, 0x1904, 0xb0f2, 0x0016, 0x0026,
++      0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08,
++      0x080c, 0xa932, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188,
++      0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240,
++      0x2c08, 0x9006, 0x080c, 0xc101, 0x1180, 0x7244, 0x9286, 0xffff,
++      0x01b0, 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296,
++      0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007,
++      0x1d80, 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x8ed9, 0x2160,
++      0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4,
++      0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x5556,
++      0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1105,
++      0x2011, 0x0276, 0x080c, 0x9d60, 0x003e, 0x002e, 0x001e, 0x015e,
++      0x0120, 0x6007, 0x0031, 0x0804, 0xb20d, 0x080c, 0x9a13, 0x080c,
++      0x62e4, 0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, 0x6300, 0x1158,
++      0x2001, 0x12a8, 0x2003, 0x0001, 0x2001, 0x1100, 0x2003, 0x0001,
++      0x080c, 0x621a, 0x0010, 0x080c, 0x62be, 0x003e, 0x002e, 0x000e,
++      0x0005, 0x080c, 0x297d, 0x1904, 0xb411, 0x6106, 0x080c, 0xb5a4,
++      0x6007, 0x002b, 0x0804, 0xb20d, 0x6007, 0x002c, 0x0804, 0xb20d,
++      0x080c, 0xc327, 0x1904, 0xb411, 0x080c, 0x297d, 0x1904, 0xb411,
++      0x080c, 0xb588, 0x1904, 0xb0f2, 0x6106, 0x080c, 0xb5a8, 0x1120,
++      0x6007, 0x002e, 0x0804, 0xb20d, 0x6007, 0x002f, 0x0804, 0xb20d,
++      0x080c, 0x297d, 0x1904, 0xb411, 0x00e6, 0x00d6, 0x00c6, 0x6010,
++      0x9080, 0x0001, 0x200c, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158,
++      0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de,
++      0x00ee, 0x0804, 0xb214, 0x2001, 0x1172, 0x2004, 0xd0e4, 0x0904,
++      0xb365, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108,
++      0x720c, 0x080c, 0x58cb, 0x0140, 0x6010, 0x2068, 0x6810, 0x9106,
++      0x1118, 0x6814, 0x9206, 0x01f8, 0x080c, 0x58c6, 0x15a0, 0x2069,
++      0x1100, 0x6878, 0x9206, 0x1578, 0x6874, 0x9106, 0x1560, 0x7210,
++      0x080c, 0xa932, 0x0568, 0x080c, 0xc19f, 0x0550, 0x622e, 0x6007,
++      0x0036, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00ce,
++      0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, 0x080c,
++      0xa932, 0x01b0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, 0x1180,
++      0x08f8, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xc101, 0x2c10,
++      0x2160, 0x0130, 0x08a8, 0x6007, 0x0037, 0x6017, 0x1500, 0x08c8,
++      0x6007, 0x0037, 0x6017, 0x1700, 0x08a0, 0x6007, 0x0012, 0x0888,
++      0x080c, 0x297d, 0x1904, 0xb411, 0x6010, 0x9080, 0x0001, 0x2004,
++      0x9084, 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, 0xb214, 0x00e6,
++      0x00d6, 0x00c6, 0x2001, 0x1172, 0x2004, 0xd0e4, 0x0904, 0xb3d5,
++      0x2069, 0x1100, 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, 0x623e,
++      0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001,
++      0x080c, 0xc101, 0x2c10, 0x00ce, 0x0598, 0x080c, 0xa932, 0x0580,
++      0x00c6, 0x0026, 0x2260, 0x080c, 0xa5e6, 0x002e, 0x00ce, 0x7118,
++      0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0158, 0x9186, 0x0005,
++      0x0118, 0x9186, 0x0007, 0x1178, 0x9280, 0x0005, 0x2004, 0x9005,
++      0x0150, 0x0056, 0x7510, 0x7614, 0x080c, 0xc1b8, 0x005e, 0x00ce,
++      0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017,
++      0x2a00, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x0c78,
++      0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x1700, 0x6003, 0x0001,
++      0x080c, 0x756e, 0x080c, 0x7aa4, 0x0c10, 0x6007, 0x003b, 0x602f,
++      0x000b, 0x6017, 0x0000, 0x0804, 0xb339, 0x00e6, 0x0026, 0x080c,
++      0x588e, 0x0548, 0x080c, 0x587e, 0x080c, 0xc392, 0x1510, 0x2071,
++      0x1100, 0x70d8, 0xc085, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72a8,
++      0x9284, 0x00ff, 0x7076, 0x78e6, 0x9284, 0xff00, 0x7278, 0x9205,
++      0x707a, 0x78ea, 0x00fe, 0x70e3, 0x0000, 0x080c, 0x58cb, 0x0120,
++      0x2011, 0x131d, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2679,
++      0x0010, 0x080c, 0xc3be, 0x002e, 0x00ee, 0x080c, 0x8ed9, 0x0804,
++      0xb213, 0x080c, 0x8ed9, 0x0005, 0x2600, 0x0002, 0xb428, 0xb428,
++      0xb428, 0xb428, 0xb428, 0xb42a, 0xb428, 0xb428, 0xb428, 0xb428,
++      0xb443, 0xb428, 0xb428, 0xb428, 0xb455, 0xb462, 0xb491, 0xb428,
++      0x080c, 0x0d7e, 0x080c, 0xc327, 0x1d20, 0x080c, 0x297d, 0x1d08,
++      0x080c, 0xb588, 0x1138, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c,
++      0x75be, 0x0005, 0x080c, 0x2862, 0x6007, 0x0001, 0x6003, 0x0001,
++      0x080c, 0x75be, 0x0005, 0x080c, 0xc327, 0x1958, 0x080c, 0x297d,
++      0x1940, 0x080c, 0xb588, 0x1d70, 0x703c, 0x6016, 0x6007, 0x004a,
++      0x6003, 0x0001, 0x080c, 0x75be, 0x0005, 0x080c, 0xb496, 0x0904,
++      0xb411, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c,
++      0x7aa4, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c,
++      0x00ff, 0x81ff, 0x01f8, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001,
++      0x12f4, 0x2004, 0x9106, 0x11a0, 0x7144, 0x2001, 0x12f5, 0x2004,
++      0x9106, 0x0180, 0x9186, 0x0002, 0x1158, 0x2011, 0x0276, 0x20a9,
++      0x0004, 0x6010, 0x6010, 0x9098, 0x000a, 0x080c, 0x9d60, 0x0110,
++      0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4,
++      0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, 0x0016, 0x00d6,
++      0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1100,
++      0x7088, 0x908a, 0x00f9, 0x16c8, 0x20e1, 0x0000, 0x20e9, 0x0001,
++      0x2001, 0x12da, 0x2003, 0x0000, 0x080c, 0x0e9d, 0x0570, 0x2d00,
++      0x6016, 0x7088, 0x8004, 0x6816, 0x908a, 0x001e, 0x02b8, 0x6833,
++      0x001e, 0x20a9, 0x001e, 0x9d80, 0x001b, 0x20a0, 0x2001, 0x12da,
++      0x0016, 0x200c, 0x0451, 0x001e, 0x2d70, 0x080c, 0x0e9d, 0x01a8,
++      0x2d00, 0x7006, 0x2100, 0x81ff, 0x0168, 0x0c30, 0x6832, 0x20a8,
++      0x9d80, 0x001b, 0x20a0, 0x2001, 0x12da, 0x0016, 0x200c, 0x00a9,
++      0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, 0x1100, 0x708b,
++      0x0000, 0x6014, 0x2068, 0x080c, 0x0edf, 0x9006, 0x012e, 0x01de,
++      0x01ce, 0x00ee, 0x00de, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026,
++      0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, 0x080c, 0x1b40, 0x2099,
++      0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003,
++      0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x1b40, 0x2099,
++      0x0260, 0x0ca8, 0x080c, 0x1b40, 0x2061, 0x12da, 0x6004, 0x2098,
++      0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8,
++      0x4003, 0x22a8, 0x8108, 0x080c, 0x1b40, 0x2099, 0x0260, 0x0ca8,
++      0x2061, 0x12da, 0x2019, 0x0280, 0x3300, 0x931e, 0x0110, 0x6006,
++      0x0020, 0x2001, 0x0260, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021,
++      0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e,
++      0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8,
++      0x080c, 0x1b58, 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312,
++      0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8,
++      0x22a8, 0x8108, 0x080c, 0x1b58, 0x20a1, 0x0240, 0x0c98, 0x080c,
++      0x1b58, 0x2061, 0x12dd, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312,
++      0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138,
++      0x22a8, 0x8108, 0x080c, 0x1b58, 0x20a1, 0x0240, 0x0c98, 0x2061,
++      0x12dd, 0x2019, 0x0260, 0x3400, 0x931e, 0x0110, 0x6006, 0x0020,
++      0x2001, 0x0240, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296,
++      0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005,
++      0x00d6, 0x0066, 0x6610, 0x2668, 0x6e04, 0x96b4, 0xff00, 0x8637,
++      0x9686, 0x0006, 0x0170, 0x9686, 0x0004, 0x0158, 0x6e04, 0x96b4,
++      0x00ff, 0x9686, 0x0006, 0x0128, 0x9686, 0x0004, 0x0110, 0x9085,
++      0x0001, 0x006e, 0x00de, 0x0005, 0x00d6, 0x0441, 0x00de, 0x0005,
++      0x00d6, 0x0489, 0x11e8, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084,
++      0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0118, 0x2009,
++      0x0001, 0x0058, 0xd1ec, 0x0160, 0x6920, 0x918c, 0x00ff, 0x6824,
++      0x080c, 0x1f63, 0x1128, 0x2110, 0x900e, 0x080c, 0x28a5, 0x0018,
++      0x9085, 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x2069, 0x026d,
++      0x6800, 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001,
++      0x0008, 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808,
++      0x9084, 0xff00, 0x9086, 0x0800, 0x1140, 0x6800, 0x9084, 0x00ff,
++      0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2,
++      0x0053, 0x1a0c, 0x0d7e, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2,
++      0x0040, 0x1a04, 0xb720, 0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6,
++      0x0014, 0x190c, 0x0d7e, 0x2001, 0x0007, 0x080c, 0x5592, 0x080c,
++      0x79ab, 0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0xb64e, 0xb650,
++      0xb64e, 0xb64e, 0xb64e, 0xb650, 0xb661, 0xb719, 0xb6b8, 0xb719,
++      0xb6cc, 0xb719, 0xb661, 0xb719, 0xb711, 0xb719, 0xb711, 0xb719,
++      0xb719, 0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb64e,
++      0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb650, 0xb64e, 0xb719, 0xb64e,
++      0xb64e, 0xb719, 0xb64e, 0xb716, 0xb719, 0xb64e, 0xb64e, 0xb64e,
++      0xb64e, 0xb719, 0xb719, 0xb64e, 0xb719, 0xb719, 0xb64e, 0xb65c,
++      0xb64e, 0xb64e, 0xb64e, 0xb64e, 0xb715, 0xb719, 0xb64e, 0xb64e,
++      0xb719, 0xb719, 0xb64e, 0xb64e, 0xb64e, 0xb64e, 0x080c, 0x0d7e,
++      0x080c, 0x79ab, 0x2001, 0x12c0, 0x2004, 0x601a, 0x6003, 0x0002,
++      0x080c, 0x7aa4, 0x0804, 0xb71f, 0x9006, 0x080c, 0x5556, 0x0804,
++      0xb719, 0x080c, 0x58c6, 0x1904, 0xb719, 0x9006, 0x080c, 0x5556,
++      0x6010, 0x9080, 0x0004, 0x2004, 0x9086, 0x00ff, 0x1140, 0x00f6,
++      0x2079, 0x1100, 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0438, 0x6010,
++      0x00c6, 0x2060, 0x6000, 0xd0f4, 0x1178, 0x6010, 0x9005, 0x0160,
++      0x0036, 0x0046, 0x63a0, 0x2021, 0x0007, 0x080c, 0x4026, 0x004e,
++      0x003e, 0x00ce, 0x0804, 0xb719, 0x00ce, 0x080c, 0x2982, 0x1904,
++      0xb719, 0x2001, 0x1100, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6,
++      0x2079, 0x1100, 0x78a0, 0x8000, 0x78a2, 0x00fe, 0x2001, 0x0002,
++      0x080c, 0x5568, 0x080c, 0x79ab, 0x6023, 0x0001, 0x6003, 0x0001,
++      0x6007, 0x0002, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x6110, 0x00c6,
++      0x2160, 0x2009, 0x0001, 0x080c, 0x7206, 0x00ce, 0x0804, 0xb71f,
++      0x6610, 0x00d6, 0x2668, 0x6e04, 0x00de, 0x96b4, 0xff00, 0x8637,
++      0x9686, 0x0006, 0x0904, 0xb719, 0x9686, 0x0004, 0x0904, 0xb719,
++      0x2001, 0x0004, 0x0804, 0xb717, 0x2001, 0x1100, 0x2004, 0x9086,
++      0x0003, 0x1160, 0x0036, 0x0046, 0x6010, 0x9080, 0x0028, 0x201c,
++      0x2021, 0x0006, 0x080c, 0x4026, 0x004e, 0x003e, 0x2001, 0x0006,
++      0x080c, 0xb73d, 0x6610, 0x00d6, 0x2668, 0x6e04, 0x00de, 0x0066,
++      0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0120, 0x2001,
++      0x0006, 0x080c, 0x5592, 0x080c, 0x58c6, 0x1518, 0x2001, 0x1136,
++      0x2004, 0xd0a4, 0x01f0, 0x00d6, 0x6610, 0x2668, 0x6e04, 0x00de,
++      0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1100,
++      0x78a0, 0x8000, 0x78a2, 0x00fe, 0x0804, 0xb69e, 0x2001, 0x0004,
++      0x0030, 0x2001, 0x0006, 0x0449, 0x0020, 0x0018, 0x0010, 0x080c,
++      0x5592, 0x080c, 0x79ab, 0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005,
++      0x2600, 0x0002, 0xb734, 0xb734, 0xb734, 0xb734, 0xb734, 0xb736,
++      0xb734, 0xb734, 0xb734, 0xb734, 0xb736, 0xb734, 0xb734, 0xb734,
++      0xb736, 0xb736, 0xb736, 0xb736, 0x080c, 0x0d7e, 0x080c, 0x79ab,
++      0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x0016, 0x00d6, 0x6110,
++      0x2168, 0x6900, 0xd184, 0x0138, 0x080c, 0x5568, 0x9006, 0x080c,
++      0x5556, 0x080c, 0x2886, 0x00de, 0x001e, 0x0005, 0x6610, 0x00d6,
++      0x2668, 0x6804, 0x9084, 0xff00, 0x8007, 0x00de, 0x90b2, 0x000c,
++      0x1a0c, 0x0d7e, 0x91b6, 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6,
++      0x0016, 0x190c, 0x0d7e, 0x006b, 0x0005, 0x98b0, 0x98b0, 0x98b0,
++      0x98b0, 0x98b0, 0x98b0, 0xb7bb, 0xb77d, 0x98b0, 0x98b0, 0x98b0,
++      0x98b0, 0x98b0, 0x98b0, 0x98b0, 0x98b0, 0x98b0, 0x98b0, 0xb7bb,
++      0xb7c2, 0x98b0, 0x98b0, 0x98b0, 0x98b0, 0x00f6, 0x080c, 0x58c6,
++      0x11d8, 0x6010, 0x907d, 0x01c0, 0x7800, 0xd0f4, 0x1118, 0x7810,
++      0x9005, 0x1190, 0x9006, 0x080c, 0x5556, 0x2001, 0x0002, 0x080c,
++      0x5568, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
++      0x75be, 0x080c, 0x7aa4, 0x00e8, 0x2011, 0x0263, 0x2204, 0x8211,
++      0x220c, 0x080c, 0x1f63, 0x11a8, 0x00c6, 0x080c, 0x5608, 0x0120,
++      0x00ce, 0x080c, 0x8ed9, 0x0068, 0x6010, 0x0006, 0x6014, 0x0006,
++      0x080c, 0x5100, 0x000e, 0x6016, 0x000e, 0x6012, 0x00ce, 0x080c,
++      0x8ed9, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c,
++      0x8ed9, 0x0005, 0x080c, 0x9bf7, 0x1148, 0x6003, 0x0001, 0x6007,
++      0x0001, 0x080c, 0x75be, 0x080c, 0x7aa4, 0x0010, 0x080c, 0x8ed9,
++      0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7e, 0x080c, 0x79ab,
++      0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0x9182, 0x0040, 0x0002,
++      0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f5, 0xb7f3, 0xb7f3, 0xb7f3,
++      0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3, 0xb7f3,
++      0xb7f3, 0xb7f3, 0xb7f3, 0x080c, 0x0d7e, 0x00d6, 0x00e6, 0x00f6,
++      0x0046, 0x0026, 0x6210, 0x9280, 0x002b, 0x2004, 0x9005, 0x1190,
++      0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xb858,
++      0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c,
++      0x73af, 0x0020, 0x9026, 0x080c, 0xc363, 0x0c50, 0x080c, 0x0eb6,
++      0x090c, 0x0d7e, 0x6003, 0x0007, 0x2d00, 0x6867, 0x010d, 0x9006,
++      0x6802, 0x686a, 0x6c8a, 0x2c00, 0x688e, 0x6008, 0x68e2, 0x6010,
++      0x2078, 0x78a0, 0x8007, 0x7130, 0x697a, 0x0016, 0x9084, 0xff00,
++      0x6876, 0x687f, 0x0000, 0x6883, 0x0000, 0x6887, 0x0036, 0x080c,
++      0x5b76, 0x001e, 0x9486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c,
++      0xc0b9, 0x0804, 0xb8b2, 0x9486, 0x0400, 0x1130, 0x2019, 0x0002,
++      0x080c, 0xc072, 0x0804, 0xb8b2, 0x9486, 0x0200, 0x1110, 0x080c,
++      0xc05a, 0x9486, 0x1000, 0x1110, 0x080c, 0xc0a1, 0x0804, 0xb8b2,
++      0x2069, 0x1354, 0x6a00, 0xd284, 0x0904, 0xb91a, 0x9284, 0x0300,
++      0x1904, 0xb913, 0x6804, 0x9005, 0x0904, 0xb8fb, 0x2d78, 0x6003,
++      0x0007, 0x080c, 0x0e9d, 0x0904, 0xb8bc, 0x7800, 0xd08c, 0x1118,
++      0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x9006, 0x6802, 0x6867,
++      0x0116, 0x686a, 0x6008, 0x68e2, 0x2c00, 0x687a, 0x6010, 0x2078,
++      0x78a0, 0x8007, 0x7130, 0x69b6, 0x6876, 0x7928, 0x69ba, 0x792c,
++      0x69be, 0x7930, 0x69c2, 0x7934, 0x69c6, 0x6883, 0x003d, 0x7044,
++      0x9084, 0x0003, 0x9080, 0xb8b8, 0x2005, 0x687e, 0x20a9, 0x000a,
++      0x2001, 0x0270, 0x9d90, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080,
++      0x20e1, 0x0000, 0x20e9, 0x0001, 0x2098, 0x22a0, 0x4003, 0x200b,
++      0x0000, 0x2001, 0x027a, 0x200c, 0x69b2, 0x8000, 0x200c, 0x69ae,
++      0x080c, 0x5b76, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x0005,
++      0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x110f, 0x2004, 0xd084,
++      0x0120, 0x080c, 0x0eb6, 0x1904, 0xb86d, 0x6017, 0x0100, 0x6003,
++      0x0001, 0x6007, 0x0041, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x0c10,
++      0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, 0x1200, 0x1198,
++      0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, 0x0700, 0x910d,
++      0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x756e,
++      0x080c, 0x7aa4, 0x0838, 0x6868, 0x602e, 0x686c, 0x6032, 0x6017,
++      0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x756e, 0x080c,
++      0x7aa4, 0x0804, 0xb8b2, 0x2001, 0x110d, 0x2004, 0xd0ec, 0x0120,
++      0x2011, 0x8049, 0x080c, 0x3f23, 0x6017, 0x0300, 0x0010, 0x6017,
++      0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x756e, 0x080c,
++      0x7aa4, 0x0804, 0xb8b2, 0x6017, 0x0500, 0x0c98, 0x6017, 0x0600,
++      0x0804, 0xb8d0, 0x6017, 0x0200, 0x0804, 0xb8d0, 0x9186, 0x0013,
++      0x1160, 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0d7e, 0x9082, 0x0040,
++      0x0a0c, 0x0d7e, 0x2008, 0x0804, 0xb9ca, 0x9186, 0x0051, 0x0140,
++      0x9186, 0x0047, 0x11e8, 0x6004, 0x9086, 0x0041, 0x0904, 0xb97e,
++      0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xb97e, 0x0126, 0x2091,
++      0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x745c, 0x002e, 0x001e,
++      0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xba17,
++      0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014,
++      0x0500, 0x190c, 0x0d7e, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0,
++      0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006,
++      0x0016, 0x0026, 0x080c, 0x745c, 0x002e, 0x001e, 0x000e, 0x00ce,
++      0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0d7e, 0x0804,
++      0xbaf9, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x8f6e,
++      0x0005, 0xb994, 0xb996, 0xb996, 0xb9ba, 0xb994, 0xb994, 0xb994,
++      0xb994, 0xb994, 0xb994, 0xb994, 0xb994, 0xb994, 0xb994, 0xb994,
++      0xb994, 0xb994, 0xb994, 0xb994, 0x080c, 0x0d7e, 0x080c, 0x79ab,
++      0x080c, 0x7aa4, 0x0036, 0x00d6, 0x6014, 0x906d, 0x01c0, 0x9d84,
++      0xf000, 0x01a8, 0x6003, 0x0002, 0x6010, 0x2004, 0xd0bc, 0x1178,
++      0x2019, 0x0004, 0x080c, 0xc0e9, 0x6017, 0x0000, 0x6018, 0x9005,
++      0x1120, 0x2001, 0x12c1, 0x2004, 0x601a, 0x6003, 0x0007, 0x00de,
++      0x003e, 0x0005, 0x00d6, 0x080c, 0x79ab, 0x080c, 0x7aa4, 0x080c,
++      0xa942, 0x0120, 0x6014, 0x2068, 0x080c, 0x0ecf, 0x080c, 0x8f09,
++      0x00de, 0x0005, 0x0002, 0xb9de, 0xb9fb, 0xb9e7, 0xba11, 0xb9de,
++      0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de,
++      0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0xb9de, 0x080c, 0x0d7e,
++      0x6014, 0x9088, 0x001f, 0x2104, 0x9085, 0x0400, 0x200a, 0x080c,
++      0x79ab, 0x6014, 0x9080, 0x001f, 0x2004, 0xd0b4, 0x0138, 0x6003,
++      0x0007, 0x2009, 0x0043, 0x080c, 0x8f53, 0x0010, 0x6003, 0x0004,
++      0x080c, 0x7aa4, 0x0005, 0x080c, 0x79ab, 0x6114, 0x9184, 0xf000,
++      0x0128, 0x9180, 0x001f, 0x200c, 0xd1ec, 0x1138, 0x080c, 0x7384,
++      0x080c, 0x8ed9, 0x080c, 0x7aa4, 0x0005, 0x080c, 0xc32e, 0x0db0,
++      0x0cc8, 0x080c, 0x79ab, 0x2009, 0x0041, 0x0804, 0xbb7b, 0x9182,
++      0x0040, 0x0002, 0xba2d, 0xba2f, 0xba2d, 0xba2d, 0xba2d, 0xba2d,
++      0xba2d, 0xba2d, 0xba2d, 0xba2d, 0xba2d, 0xba2d, 0xba2d, 0xba2d,
++      0xba2d, 0xba2d, 0xba2d, 0xba30, 0xba2d, 0x080c, 0x0d7e, 0x0005,
++      0x00d6, 0x080c, 0x7384, 0x00de, 0x080c, 0xc381, 0x080c, 0x8ed9,
++      0x0005, 0x9182, 0x0040, 0x0002, 0xba4f, 0xba4f, 0xba4f, 0xba4f,
++      0xba4f, 0xba4f, 0xba4f, 0xba51, 0xba4f, 0xba54, 0xbac4, 0xba4f,
++      0xba4f, 0xba4f, 0xba4f, 0xbac4, 0xba4f, 0xba4f, 0xba4f, 0x080c,
++      0x0d7e, 0x080c, 0x8f6e, 0x0005, 0x2001, 0x0105, 0x2004, 0x9084,
++      0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, 0x2001, 0x0131, 0x2004,
++      0x9105, 0x1904, 0xbac4, 0x2009, 0x110c, 0x2104, 0xd0d4, 0x0904,
++      0xbac4, 0xc0d4, 0x200a, 0x2009, 0x0105, 0x2104, 0x9084, 0xe7fd,
++      0x9085, 0x0010, 0x200a, 0x2001, 0x1172, 0x2004, 0xd0e4, 0x1528,
++      0x603b, 0x0000, 0x080c, 0x7a55, 0x6014, 0x00d6, 0x2068, 0x687c,
++      0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, 0x0002, 0x0508, 0x2001,
++      0x110c, 0x2004, 0xd0d4, 0x11e0, 0x080c, 0x7b69, 0x2009, 0x0041,
++      0x00de, 0x0804, 0xbb7b, 0x080c, 0x7b69, 0x6003, 0x0007, 0x601b,
++      0x0000, 0x080c, 0x7384, 0x00de, 0x0005, 0x2001, 0x0100, 0x2004,
++      0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, 0x2004, 0x603a, 0x0890,
++      0x2001, 0x110c, 0x200c, 0xc1d4, 0x2102, 0xd1cc, 0x0110, 0x080c,
++      0x2369, 0x080c, 0x7b69, 0x6014, 0x9080, 0x001f, 0x200c, 0xd1ec,
++      0x1130, 0x080c, 0x7384, 0x080c, 0x8ed9, 0x00de, 0x0005, 0x080c,
++      0xc32e, 0x0db8, 0x00de, 0x0005, 0x2001, 0x110c, 0x200c, 0xc1d4,
++      0x2102, 0x0036, 0x080c, 0x7a55, 0x080c, 0x7b69, 0x6014, 0x00d6,
++      0x2068, 0x6010, 0x2004, 0xd0bc, 0x0188, 0x687c, 0x9084, 0x0003,
++      0x9086, 0x0002, 0x0140, 0x68ac, 0x6330, 0x931a, 0x6332, 0x68b0,
++      0x632c, 0x931b, 0x632e, 0x6003, 0x0002, 0x0080, 0x2019, 0x0004,
++      0x080c, 0xc0e9, 0x6018, 0x9005, 0x1128, 0x2001, 0x12c1, 0x2004,
++      0x8003, 0x601a, 0x6017, 0x0000, 0x6003, 0x0007, 0x00de, 0x003e,
++      0x0005, 0x9182, 0x0040, 0x0002, 0xbb10, 0xbb10, 0xbb10, 0xbb10,
++      0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb12, 0xbb10, 0xbb10, 0xbb10,
++      0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb10, 0xbb57,
++      0x080c, 0x0d7e, 0x6014, 0x00d6, 0x2068, 0x6834, 0x6a38, 0x6110,
++      0x210c, 0xd1bc, 0x1190, 0x920d, 0x1518, 0x687c, 0xd0fc, 0x0128,
++      0x2009, 0x0041, 0x00de, 0x0804, 0xbb7b, 0x6003, 0x0007, 0x601b,
++      0x0000, 0x080c, 0x7384, 0x00de, 0x0005, 0x6124, 0xd1f4, 0x1d58,
++      0x0006, 0x0046, 0x6cac, 0x9422, 0x69b0, 0x2200, 0x910b, 0x6030,
++      0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8,
++      0x6110, 0x210c, 0xd1bc, 0x1178, 0x2009, 0x110d, 0x210c, 0xd19c,
++      0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x00e9, 0x080c,
++      0x7386, 0x00de, 0x0005, 0x6003, 0x0002, 0x00de, 0x0005, 0x6024,
++      0xd0f4, 0x0128, 0x080c, 0x1303, 0x1904, 0xbb12, 0x0005, 0x6014,
++      0x00d6, 0x2068, 0x6834, 0x6938, 0x00de, 0x9105, 0x1120, 0x080c,
++      0x1303, 0x1904, 0xbb12, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000,
++      0x8212, 0x9291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015,
++      0x6a9a, 0x6896, 0x0005, 0x9182, 0x0040, 0x0208, 0x0062, 0x9186,
++      0x0013, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7e, 0x6024, 0xd0dc,
++      0x090c, 0x0d7e, 0x0005, 0xbb9e, 0xbba5, 0xbbb1, 0xbbbd, 0xbb9e,
++      0xbb9e, 0xbb9e, 0xbbcc, 0xbb9e, 0xbba0, 0xbba0, 0xbb9e, 0xbb9e,
++      0xbb9e, 0xbb9e, 0xbba0, 0xbb9e, 0xbba0, 0xbb9e, 0x080c, 0x0d7e,
++      0x6024, 0xd0dc, 0x090c, 0x0d7e, 0x0005, 0x6003, 0x0001, 0x6106,
++      0x080c, 0x756e, 0x0126, 0x2091, 0x8000, 0x080c, 0x7aa4, 0x012e,
++      0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x756e, 0x0126, 0x2091,
++      0x8000, 0x080c, 0x7aa4, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106,
++      0x2c10, 0x080c, 0x1605, 0x0126, 0x2091, 0x8000, 0x080c, 0x75db,
++      0x080c, 0x7b72, 0x012e, 0x0005, 0x9016, 0x080c, 0x137c, 0x0005,
++      0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0x9182, 0x0040, 0x0023,
++      0x00de, 0x003e, 0x012e, 0x0005, 0xbbec, 0xbbee, 0xbc00, 0xbc1a,
++      0xbbec, 0xbbec, 0xbbec, 0xbc2f, 0xbbec, 0xbbec, 0xbbec, 0xbbec,
++      0xbbec, 0xbbec, 0xbbec, 0xbbec, 0x080c, 0x0d7e, 0x6014, 0x2068,
++      0x687c, 0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0,
++      0x6003, 0x0001, 0x6106, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x0490,
++      0x6014, 0x2068, 0x687c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e,
++      0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x756e, 0x080c,
++      0x7aa4, 0x0400, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c,
++      0xc0e9, 0x00c0, 0x6014, 0x2068, 0x687c, 0xd0fc, 0x0d98, 0x909c,
++      0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10,
++      0x080c, 0x1605, 0x080c, 0x75db, 0x080c, 0x7b72, 0x0018, 0x9016,
++      0x080c, 0x137c, 0x0005, 0x080c, 0x79ab, 0x6114, 0x81ff, 0x0158,
++      0x00d6, 0x2168, 0x080c, 0xc3c7, 0x0036, 0x2019, 0x0029, 0x080c,
++      0xc0e9, 0x003e, 0x00de, 0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005,
++      0x080c, 0x7a55, 0x6114, 0x81ff, 0x0158, 0x00d6, 0x2168, 0x080c,
++      0xc3c7, 0x0036, 0x2019, 0x0029, 0x080c, 0xc0e9, 0x003e, 0x00de,
++      0x080c, 0x8f09, 0x080c, 0x7b72, 0x0005, 0x9182, 0x0085, 0x0002,
++      0xbc6f, 0xbc6d, 0xbc6d, 0xbc7b, 0xbc6d, 0xbc6d, 0xbc6d, 0xbc6d,
++      0xbc6d, 0xbc6d, 0xbc6d, 0xbc6d, 0xbc6d, 0x080c, 0x0d7e, 0x6003,
++      0x000b, 0x6106, 0x080c, 0x756e, 0x0126, 0x2091, 0x8000, 0x080c,
++      0x7aa4, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xc327, 0x0118,
++      0x080c, 0x8ed9, 0x0440, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001,
++      0x110d, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x9080, 0x0028, 0x2024,
++      0x8427, 0x2c00, 0x2011, 0x014e, 0x080c, 0x91b2, 0x7220, 0x080c,
++      0xbf8f, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224,
++      0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c,
++      0x756e, 0x080c, 0x7aa4, 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013,
++      0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7e, 0x908a, 0x0092,
++      0x1a0c, 0x0d7e, 0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130,
++      0x9186, 0x0014, 0x0118, 0x080c, 0x8f6e, 0x0050, 0x2001, 0x0007,
++      0x080c, 0x5592, 0x080c, 0x79ab, 0x080c, 0x8f09, 0x080c, 0x7aa4,
++      0x0005, 0xbcde, 0xbce0, 0xbce0, 0xbcde, 0xbcde, 0xbcde, 0xbcde,
++      0xbcde, 0xbcde, 0xbcde, 0xbcde, 0xbcde, 0xbcde, 0x080c, 0x0d7e,
++      0x080c, 0x79ab, 0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0x9182,
++      0x0085, 0x0a0c, 0x0d7e, 0x9182, 0x0092, 0x1a0c, 0x0d7e, 0x9182,
++      0x0085, 0x0002, 0xbcff, 0xbcff, 0xbcff, 0xbd01, 0xbcff, 0xbcff,
++      0xbcff, 0xbcff, 0xbcff, 0xbcff, 0xbcff, 0xbcff, 0xbcff, 0x080c,
++      0x0d7e, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130,
++      0x9186, 0x0027, 0x0118, 0x080c, 0x8f6e, 0x0030, 0x080c, 0x79ab,
++      0x080c, 0x8f09, 0x080c, 0x7aa4, 0x0005, 0x0036, 0x080c, 0xc381,
++      0x6043, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023, 0x0006, 0x6003,
++      0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, 0x0086,
++      0x2c40, 0x0096, 0x904e, 0x080c, 0x8968, 0x009e, 0x008e, 0x1570,
++      0x0076, 0x2c38, 0x080c, 0x8a0a, 0x007e, 0x1540, 0x6000, 0x9086,
++      0x0000, 0x0520, 0x6020, 0x9086, 0x0007, 0x0500, 0x00d6, 0x601c,
++      0xd084, 0x0150, 0x080c, 0xc381, 0x2001, 0x12c0, 0x2004, 0x601a,
++      0x080c, 0x1509, 0x6023, 0x0007, 0x6014, 0x2068, 0x080c, 0xa942,
++      0x0110, 0x080c, 0xc0e9, 0x00de, 0x6017, 0x0000, 0x080c, 0xc381,
++      0x6023, 0x0007, 0x2001, 0x12c0, 0x2004, 0x601a, 0x003e, 0x012e,
++      0x0005, 0x00f6, 0x00c6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938,
++      0x783c, 0x080c, 0x1f63, 0x1590, 0x0016, 0x00c6, 0x080c, 0x5608,
++      0x1558, 0x001e, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c,
++      0x8ac9, 0x080c, 0x76f0, 0x0076, 0x903e, 0x080c, 0x75ee, 0x007e,
++      0x001e, 0x0076, 0x903e, 0x080c, 0xbec2, 0x007e, 0x0026, 0x6204,
++      0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004,
++      0x1118, 0x62a0, 0x080c, 0x2915, 0x002e, 0x001e, 0x080c, 0x5100,
++      0x6612, 0x6516, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e,
++      0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009,
++      0x1122, 0x2104, 0x9086, 0x0074, 0x1904, 0xbdfb, 0x2069, 0x0260,
++      0x6944, 0x9182, 0x0100, 0x06d8, 0x6940, 0x9184, 0x8000, 0x0904,
++      0xbdf8, 0x2001, 0x12a7, 0x2004, 0x9005, 0x1160, 0x6010, 0x2070,
++      0x7010, 0x9084, 0x00ff, 0x0118, 0x7000, 0xd0f4, 0x0118, 0x9184,
++      0x0800, 0x0570, 0x6948, 0x918a, 0x0001, 0x0620, 0x694c, 0x2009,
++      0x0205, 0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182,
++      0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001,
++      0x0288, 0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100,
++      0x00a0, 0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017,
++      0x0700, 0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028,
++      0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008,
++      0x9006, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6,
++      0x0026, 0x0036, 0x0156, 0x6210, 0x2268, 0x6b04, 0x9394, 0x00ff,
++      0x9286, 0x0006, 0x0190, 0x9286, 0x0004, 0x0178, 0x9394, 0xff00,
++      0x8217, 0x9286, 0x0006, 0x0148, 0x9286, 0x0004, 0x0130, 0x00c6,
++      0x2d60, 0x080c, 0x5617, 0x00ce, 0x04c0, 0x2011, 0x0276, 0x20a9,
++      0x0004, 0x9d98, 0x000a, 0x080c, 0x9d60, 0x1580, 0x2011, 0x027a,
++      0x20a9, 0x0004, 0x9d98, 0x0006, 0x080c, 0x9d60, 0x1538, 0x0046,
++      0x0016, 0x6aa0, 0x9294, 0x00ff, 0x8227, 0x9006, 0x2009, 0x1153,
++      0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xc12f, 0x6800,
++      0xc0e5, 0x6802, 0x2019, 0x0029, 0x080c, 0x76f0, 0x0076, 0x2039,
++      0x0000, 0x080c, 0x75ee, 0x2c08, 0x080c, 0xbec2, 0x007e, 0x2001,
++      0x0007, 0x080c, 0x5592, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e,
++      0x002e, 0x00de, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800,
++      0x9086, 0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de,
++      0x0005, 0x00c6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079,
++      0x026c, 0x7930, 0x7834, 0x080c, 0x1f63, 0x11a0, 0x080c, 0x5608,
++      0x1188, 0x2011, 0x0270, 0x20a9, 0x0004, 0x9c98, 0x000a, 0x080c,
++      0x9d60, 0x1140, 0x2011, 0x0274, 0x20a9, 0x0004, 0x9c98, 0x0006,
++      0x080c, 0x9d60, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce,
++      0x0005, 0x00c6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011,
++      0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x1f63, 0x11a0, 0x080c,
++      0x5608, 0x1188, 0x2011, 0x0276, 0x20a9, 0x0004, 0x9c98, 0x000a,
++      0x080c, 0x9d60, 0x1140, 0x2011, 0x027a, 0x20a9, 0x0004, 0x9c98,
++      0x0006, 0x080c, 0x9d60, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e,
++      0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056,
++      0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0x130d,
++      0x252c, 0x2021, 0x1313, 0x2424, 0x2061, 0x15c0, 0x2071, 0x1100,
++      0x764c, 0x706c, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1389, 0x000e,
++      0x0128, 0x8001, 0x9602, 0x1a04, 0xbf4b, 0x0018, 0x9606, 0x0904,
++      0xbf4b, 0x2100, 0x9c06, 0x0904, 0xbf42, 0x080c, 0xc15b, 0x0904,
++      0xbf42, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x2982, 0x0904,
++      0xbf66, 0x6004, 0x9086, 0x0000, 0x1904, 0xbf66, 0x9786, 0x0004,
++      0x0904, 0xbf66, 0x9786, 0x0007, 0x05e8, 0x2500, 0x9c06, 0x05d0,
++      0x2400, 0x9c06, 0x05b8, 0x080c, 0xc16b, 0x15a0, 0x88ff, 0x0118,
++      0x6054, 0x9906, 0x1578, 0x00d6, 0x6000, 0x9086, 0x0004, 0x1120,
++      0x0016, 0x080c, 0x1509, 0x001e, 0x9786, 0x0008, 0x1148, 0x080c,
++      0xab2e, 0x1130, 0x080c, 0x97dc, 0x00de, 0x080c, 0x8f09, 0x00d0,
++      0x6014, 0x2068, 0x080c, 0xa942, 0x0190, 0x9786, 0x0003, 0x1528,
++      0x6867, 0x0103, 0x6b7a, 0x6877, 0x0000, 0x080c, 0xc3c7, 0x0016,
++      0x080c, 0xac01, 0x080c, 0x5b76, 0x001e, 0x080c, 0xab11, 0x00de,
++      0x080c, 0x8f09, 0x9ce0, 0x0018, 0x2001, 0x1118, 0x2004, 0x9c02,
++      0x1210, 0x0804, 0xbed6, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e,
++      0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150,
++      0x9386, 0x0005, 0x0128, 0x080c, 0xc3c7, 0x080c, 0xc0e9, 0x08f8,
++      0x00de, 0x0c00, 0x9786, 0x000a, 0x0968, 0x0850, 0x080c, 0xc16b,
++      0x19c8, 0x81ff, 0x09b8, 0x9180, 0x0001, 0x2004, 0x9086, 0x0018,
++      0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1958, 0x6000,
++      0x9086, 0x0002, 0x1938, 0x080c, 0xab1d, 0x0130, 0x080c, 0xab2e,
++      0x1908, 0x080c, 0x97dc, 0x0038, 0x080c, 0x2886, 0x080c, 0xab2e,
++      0x1110, 0x080c, 0x97dc, 0x080c, 0x8f09, 0x0804, 0xbf42, 0x00c6,
++      0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xc101, 0x001e,
++      0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005,
++      0xbfae, 0xbfae, 0xbfae, 0xbfae, 0xbfae, 0xbfae, 0xbfb0, 0xbfae,
++      0xbfae, 0xbfae, 0xbfae, 0x8f09, 0x8f09, 0xbfae, 0x9006, 0x0005,
++      0x0046, 0x0016, 0x7010, 0x9080, 0x0028, 0x2024, 0x94a4, 0x00ff,
++      0x8427, 0x2c00, 0x2009, 0x0020, 0x080c, 0xc12f, 0x001e, 0x004e,
++      0x0036, 0x2019, 0x0002, 0x080c, 0xbd23, 0x003e, 0x9085, 0x0001,
++      0x0005, 0x00d6, 0x6014, 0x906d, 0x9084, 0xf000, 0x0130, 0x080c,
++      0xa5f3, 0x687b, 0x0005, 0x080c, 0x5b76, 0x00de, 0x080c, 0x8f09,
++      0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x5556, 0x0156,
++      0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1105, 0x2011,
++      0x0276, 0x080c, 0x9d60, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005,
++      0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0026,
++      0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x15c0, 0x2079, 0x0001,
++      0x8fff, 0x0904, 0xc04d, 0x2071, 0x1100, 0x764c, 0x706c, 0x8001,
++      0x9602, 0x1a04, 0xc04d, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x15a0,
++      0x2078, 0x080c, 0xc15b, 0x0580, 0x2400, 0x9c06, 0x0568, 0x6720,
++      0x9786, 0x0006, 0x1548, 0x9786, 0x0007, 0x0530, 0x88ff, 0x1140,
++      0x6010, 0x9206, 0x1508, 0x85ff, 0x0118, 0x6054, 0x9106, 0x11e0,
++      0x00d6, 0x601c, 0xd084, 0x0150, 0x080c, 0xc381, 0x2001, 0x12c0,
++      0x2004, 0x601a, 0x080c, 0x1509, 0x6023, 0x0007, 0x6014, 0x2068,
++      0x080c, 0xa942, 0x0120, 0x0046, 0x080c, 0xc0e9, 0x004e, 0x00de,
++      0x080c, 0x8f09, 0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x1118,
++      0x2004, 0x9c02, 0x1210, 0x0804, 0xc000, 0x9006, 0x012e, 0x002e,
++      0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5,
++      0x0001, 0x0ca0, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001,
++      0x2c20, 0x2019, 0x0002, 0x6210, 0x0096, 0x904e, 0x080c, 0x8968,
++      0x009e, 0x008e, 0x903e, 0x080c, 0x8a0a, 0x080c, 0xbff1, 0x005e,
++      0x007e, 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156,
++      0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c,
++      0x5608, 0x1198, 0x2c10, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029,
++      0x0001, 0x0096, 0x904e, 0x080c, 0x8968, 0x009e, 0x008e, 0x903e,
++      0x080c, 0x8a0a, 0x080c, 0xbff1, 0x005e, 0x003e, 0x001e, 0x8108,
++      0x1f04, 0xc07d, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e,
++      0x0005, 0x0076, 0x0056, 0x6210, 0x0086, 0x9046, 0x2029, 0x0001,
++      0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0x8968, 0x009e, 0x008e,
++      0x903e, 0x080c, 0x8a0a, 0x2c20, 0x080c, 0xbff1, 0x005e, 0x007e,
++      0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20,
++      0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x5608, 0x11a8,
++      0x2c10, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c,
++      0xc363, 0x004e, 0x0096, 0x904e, 0x080c, 0x8968, 0x009e, 0x008e,
++      0x903e, 0x080c, 0x8a0a, 0x080c, 0xbff1, 0x003e, 0x001e, 0x8108,
++      0x1f04, 0xc0c3, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e,
++      0x0005, 0x0016, 0x00f6, 0x9d82, 0x45c0, 0x0280, 0x9d82, 0xffff,
++      0x1268, 0x6800, 0x907d, 0x0138, 0x6803, 0x0000, 0x6b82, 0x080c,
++      0x5b76, 0x2f68, 0x0cb0, 0x6b82, 0x080c, 0x5b76, 0x00fe, 0x001e,
++      0x0005, 0x00e6, 0x0046, 0x0036, 0x2061, 0x15c0, 0x9005, 0x1138,
++      0x2071, 0x1100, 0x744c, 0x706c, 0x8001, 0x9402, 0x12d8, 0x2100,
++      0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206,
++      0x1130, 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0,
++      0x0018, 0x2001, 0x1118, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085,
++      0x0001, 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x00d6,
++      0x0006, 0x080c, 0x0eb6, 0x000e, 0x090c, 0x0d7e, 0x6867, 0x010d,
++      0x688e, 0x0026, 0x2010, 0x080c, 0xa932, 0x2001, 0x0000, 0x0120,
++      0x2200, 0x9080, 0x0015, 0x2004, 0x002e, 0x687a, 0x6986, 0x6c76,
++      0x687f, 0x0000, 0x2001, 0x12c8, 0x2004, 0x6882, 0x9006, 0x68e2,
++      0x6802, 0x686a, 0x688a, 0x0126, 0x2091, 0x8000, 0x080c, 0x5b76,
++      0x012e, 0x00de, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786,
++      0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110,
++      0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x2070, 0x70a0, 0x9206,
++      0x00ee, 0x0005, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007,
++      0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003,
++      0x000b, 0x6023, 0x0005, 0x2001, 0x12c1, 0x2004, 0x601a, 0x080c,
++      0x756e, 0x080c, 0x7aa4, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005,
++      0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xac39, 0x0030,
++      0x080c, 0xc381, 0x080c, 0x7384, 0x080c, 0x8ed9, 0x0005, 0x9280,
++      0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xc1b3, 0xc1b3, 0xc1b3,
++      0xc1b5, 0xc1b3, 0xc1b5, 0xc1b5, 0xc1b3, 0xc1b5, 0xc1b3, 0xc1b3,
++      0xc1b3, 0xc1b3, 0xc1b3, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005,
++      0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xc1cc, 0xc1cc,
++      0xc1cc, 0xc1cc, 0xc1cc, 0xc1cc, 0xc1d9, 0xc1cc, 0xc1cc, 0xc1cc,
++      0xc1cc, 0xc1cc, 0xc1cc, 0xc1cc, 0x6007, 0x003b, 0x602f, 0x0009,
++      0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4,
++      0x0005, 0x00c6, 0x2260, 0x080c, 0xc381, 0x6043, 0x0000, 0x6024,
++      0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268,
++      0x9186, 0x0007, 0x1904, 0xc234, 0x6814, 0x9005, 0x0138, 0x9080,
++      0x001f, 0x2004, 0xd0fc, 0x1110, 0x00de, 0x08b0, 0x6007, 0x003a,
++      0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00c6, 0x2d60,
++      0x6100, 0x9186, 0x0002, 0x1904, 0xc2b2, 0x6014, 0x9005, 0x1138,
++      0x6000, 0x9086, 0x0007, 0x190c, 0x0d7e, 0x0804, 0xc2b2, 0x908c,
++      0xf000, 0x1130, 0x0028, 0x2068, 0x6800, 0x9005, 0x1de0, 0x2d00,
++      0x9080, 0x001f, 0x2004, 0x9084, 0x0003, 0x9086, 0x0002, 0x1180,
++      0x6014, 0x2068, 0x687c, 0xc0dc, 0xc0f4, 0x687e, 0x6880, 0xc0f4,
++      0xc0fc, 0x6882, 0x2009, 0x0043, 0x080c, 0xbb7b, 0x0804, 0xc2b2,
++      0x2009, 0x0041, 0x0804, 0xc2ac, 0x9186, 0x0005, 0x15b8, 0x6814,
++      0x9080, 0x001f, 0x2004, 0xd0bc, 0x1118, 0x00de, 0x0804, 0xc1cc,
++      0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0d7e, 0x0804, 0xc1ec, 0x6007,
++      0x003a, 0x6003, 0x0001, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x00c6,
++      0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904,
++      0xc2b2, 0x6814, 0x9080, 0x001f, 0x200c, 0xc1f4, 0xc1dc, 0x2102,
++      0x8000, 0x200c, 0xc1f4, 0xc1fc, 0xc1bc, 0x2102, 0x00f6, 0x2c78,
++      0x080c, 0x137e, 0x00fe, 0x2009, 0x0042, 0x04f0, 0x0036, 0x00d6,
++      0x00d6, 0x080c, 0x0eb6, 0x003e, 0x090c, 0x0d7e, 0x6867, 0x010d,
++      0x9006, 0x6802, 0x686a, 0x688a, 0x6b8e, 0x6887, 0x0045, 0x2c00,
++      0x6892, 0x6038, 0x68a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010,
++      0x9080, 0x0028, 0x2004, 0x9084, 0x00ff, 0x8007, 0x6354, 0x6b7a,
++      0x6876, 0x9006, 0x687e, 0x6882, 0x6d9a, 0x6e96, 0x689f, 0x0001,
++      0x080c, 0x5b76, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xbd23,
++      0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a,
++      0x6342, 0x00de, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007,
++      0x080c, 0xbb7b, 0x00ce, 0x00de, 0x0005, 0x9186, 0x0013, 0x1128,
++      0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178,
++      0x080c, 0x79ab, 0x0036, 0x00d6, 0x6014, 0x2068, 0x2019, 0x0004,
++      0x080c, 0xc0e9, 0x00de, 0x003e, 0x080c, 0x7aa4, 0x0005, 0x9186,
++      0x0014, 0x0d70, 0x080c, 0x8f6e, 0x0005, 0xc2e4, 0xc2e2, 0xc2e2,
++      0xc2e2, 0xc2e2, 0xc2e2, 0xc2e4, 0xc2e2, 0xc2e2, 0xc2e2, 0xc2e2,
++      0xc2e2, 0xc2e2, 0x080c, 0x0d7e, 0x080c, 0x79ab, 0x6003, 0x000c,
++      0x080c, 0x7aa4, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085,
++      0x0208, 0x001a, 0x080c, 0x8f6e, 0x0005, 0xc302, 0xc302, 0xc302,
++      0xc302, 0xc304, 0xc324, 0xc302, 0xc302, 0xc302, 0xc302, 0xc302,
++      0xc302, 0xc302, 0x080c, 0x0d7e, 0x00d6, 0x2c68, 0x080c, 0x8e83,
++      0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c,
++      0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910,
++      0x6112, 0x6023, 0x0004, 0x080c, 0x756e, 0x080c, 0x7aa4, 0x2d60,
++      0x080c, 0x8ed9, 0x00de, 0x0005, 0x080c, 0x8ed9, 0x0005, 0x00e6,
++      0x6010, 0x2070, 0x7000, 0xd0ec, 0x00ee, 0x0005, 0x2009, 0x1172,
++      0x210c, 0xd1ec, 0x0578, 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026,
++      0xd0cc, 0x0150, 0x2001, 0x12c2, 0x2004, 0x6042, 0x2009, 0x1172,
++      0x210c, 0xd1f4, 0x11e8, 0x0080, 0x2009, 0x1172, 0x210c, 0xd1f4,
++      0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00a0, 0x2001, 0x12c2,
++      0x200c, 0x8103, 0x9100, 0x6042, 0x6010, 0x9088, 0x002b, 0x2104,
++      0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000,
++      0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, 0x92f0,
++      0x002b, 0x2e04, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054,
++      0x9106, 0x1138, 0x600c, 0x2072, 0x080c, 0x7384, 0x080c, 0x8ed9,
++      0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e,
++      0x0005, 0x00d6, 0x6010, 0x90e8, 0x002b, 0x2d04, 0x9005, 0x0140,
++      0x9c06, 0x0120, 0x2d04, 0x90e8, 0x0003, 0x0cb8, 0x600c, 0x206a,
++      0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x112a, 0x2204,
++      0x9084, 0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x11d8, 0x8318,
++      0x2334, 0x2204, 0x9084, 0xff00, 0x9636, 0x11a0, 0x2011, 0x0270,
++      0x20a9, 0x0004, 0x6010, 0x9098, 0x000a, 0x080c, 0x9d60, 0x1150,
++      0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x9098, 0x0006, 0x080c,
++      0x9d60, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071,
++      0x1100, 0x080c, 0x5092, 0x080c, 0x2679, 0x00ee, 0x0005, 0x00e6,
++      0x6010, 0x2070, 0x7000, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005,
++      0x6880, 0xc0e5, 0x6882, 0x0005, 0x00e6, 0x00c6, 0x0076, 0x0066,
++      0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029,
++      0x130d, 0x252c, 0x2021, 0x1313, 0x2424, 0x2061, 0x15c0, 0x2071,
++      0x1100, 0x764c, 0x706c, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001,
++      0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400,
++      0x9c06, 0x01d0, 0x080c, 0xc15b, 0x01b8, 0x080c, 0xc16b, 0x11a0,
++      0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1509, 0x001e,
++      0x080c, 0xab1d, 0x1110, 0x080c, 0x2886, 0x080c, 0xab2e, 0x1110,
++      0x080c, 0x97dc, 0x080c, 0x8f09, 0x9ce0, 0x0018, 0x2001, 0x1118,
++      0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e,
++      0x005e, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006,
++      0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0x1140, 0xd5a4, 0x0118,
++      0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032,
++      0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, 0x908e, 0x0003, 0x0148,
++      0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x2071, 0x114a,
++      0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006,
++      0x00e6, 0x2091, 0x8000, 0x2071, 0x1142, 0x0021, 0x00ee, 0x000e,
++      0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04,
++      0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0x1140, 0x0c99, 0x00ee,
++      0x0005, 0x00e6, 0x2071, 0x1144, 0x0c69, 0x00ee, 0x0005, 0x0126,
++      0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1140, 0x7044, 0x8000,
++      0x7046, 0x00ee, 0x000e, 0x012e, 0x0005, 0x8064, 0x0008, 0x0010,
++      0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4404, 0x0003, 0x8060,
++      0x0000, 0x0400, 0x0000, 0x580a, 0x0003, 0x7933, 0x0003, 0x5089,
++      0x0003, 0x4c07, 0x000b, 0xbac0, 0x0009, 0x0082, 0x0008, 0x0c07,
++      0x0003, 0x15fe, 0x0008, 0x3407, 0x000b, 0x808c, 0x0008, 0x0001,
++      0x0000, 0x0000, 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002,
++      0x0000, 0x0819, 0x000b, 0x4022, 0x0000, 0x001a, 0x0003, 0x4122,
++      0x0008, 0x4447, 0x0002, 0x0de5, 0x000b, 0x0bfe, 0x0008, 0x11a0,
++      0x0001, 0x11c7, 0x0003, 0x0ca0, 0x0001, 0x11c7, 0x0003, 0x9180,
++      0x0001, 0x0004, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009,
++      0x0008, 0x4426, 0x0003, 0x8080, 0x0001, 0x0004, 0x0000, 0x7f62,
++      0x0008, 0x8066, 0x0000, 0x0411, 0x0000, 0x442c, 0x0003, 0x808c,
++      0x0008, 0x0000, 0x0008, 0x03fe, 0x0000, 0x43e0, 0x0001, 0x0dc4,
++      0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, 0x0dc4,
++      0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x7f62, 0x0008, 0x8066,
++      0x0000, 0x0019, 0x0000, 0x443b, 0x0003, 0x0240, 0x0002, 0x09c1,
++      0x0003, 0x00fe, 0x0000, 0x31c4, 0x000b, 0x112a, 0x0000, 0x002e,
++      0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c07, 0x0003, 0x9780,
++      0x0001, 0x000f, 0x0008, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0011,
++      0x0008, 0x444a, 0x0003, 0x808c, 0x0008, 0x0002, 0x0000, 0x01fe,
++      0x0008, 0x42e0, 0x0009, 0x0db7, 0x0003, 0x00fe, 0x0000, 0x43e0,
++      0x0001, 0x0db7, 0x0003, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632,
++      0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x7f62,
++      0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x445c, 0x000b, 0x808a,
++      0x0008, 0x0003, 0x0008, 0x9a80, 0x0009, 0x0002, 0x0000, 0x7f62,
++      0x0008, 0x5862, 0x000b, 0x8066, 0x0000, 0x3679, 0x0000, 0x4465,
++      0x000b, 0x5866, 0x0003, 0x8054, 0x0008, 0x0011, 0x0008, 0x8074,
++      0x0000, 0x1010, 0x0008, 0x1efe, 0x0000, 0x3007, 0x0003, 0x006f,
++      0x0004, 0x0007, 0x0003, 0x1cfe, 0x0008, 0x1b80, 0x0009, 0x7f62,
++      0x0008, 0x8066, 0x0000, 0x0231, 0x0008, 0x4474, 0x000b, 0x5875,
++      0x000b, 0x0140, 0x0008, 0x0242, 0x0000, 0x1f43, 0x0002, 0x0c7f,
++      0x0003, 0x0d44, 0x0000, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a,
++      0x0008, 0x0083, 0x0003, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548,
++      0x0008, 0x064a, 0x0000, 0x5883, 0x000b, 0x8054, 0x0008, 0x0001,
++      0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f, 0x3a40,
++      0x000a, 0x0c0a, 0x000b, 0x2b24, 0x0008, 0x2b24, 0x0008, 0x588d,
++      0x0003, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, 0x08d7,
++      0x0003, 0x3a45, 0x000a, 0x08c8, 0x000b, 0x1e10, 0x000a, 0x7f3c,
++      0x0000, 0x08c5, 0x0003, 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60,
++      0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x449d,
++      0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x00fe, 0x0000, 0x34c2,
++      0x000b, 0x1cfe, 0x0008, 0xff80, 0x0009, 0x0001, 0x0000, 0x7f62,
++      0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44a8, 0x0003, 0x00fe,
++      0x0000, 0x31a0, 0x0003, 0x0038, 0x0000, 0x00fe, 0x0000, 0xff80,
++      0x0009, 0x0019, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009,
++      0x0008, 0x44b2, 0x000b, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e,
++      0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62,
++      0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44bc, 0x0003, 0x8060,
++      0x0000, 0x0400, 0x0000, 0x003a, 0x0008, 0x1dfe, 0x0000, 0x0099,
++      0x000b, 0x0036, 0x0008, 0x006f, 0x0004, 0x00d7, 0x000b, 0x8074,
++      0x0000, 0x2000, 0x0000, 0x00d7, 0x000b, 0x3a44, 0x0002, 0x09ca,
++      0x000b, 0x8074, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e,
++      0x0000, 0x35a0, 0x000b, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700,
++      0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0ce5, 0x0003, 0x8074,
++      0x0000, 0x4040, 0x0008, 0x58d7, 0x0003, 0x5089, 0x0003, 0x3a46,
++      0x000a, 0x0ce5, 0x0003, 0x3a47, 0x0002, 0x08e2, 0x0003, 0x8054,
++      0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x0126,
++      0x000b, 0x92c0, 0x0009, 0x0f88, 0x0008, 0x0807, 0x000b, 0x9a80,
++      0x0009, 0x0002, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x362a,
++      0x0000, 0x44ea, 0x0003, 0x2000, 0x0000, 0x2000, 0x0000, 0x2102,
++      0x0000, 0x2102, 0x0000, 0x2204, 0x0000, 0x2204, 0x0000, 0x2306,
++      0x0000, 0x2306, 0x0000, 0x2408, 0x0000, 0x2408, 0x0000, 0x250a,
++      0x0000, 0x250a, 0x0000, 0x260c, 0x0000, 0x260c, 0x0000, 0x270e,
++      0x0000, 0x270e, 0x0000, 0x2810, 0x0000, 0x2810, 0x0000, 0x2912,
++      0x0000, 0x2912, 0x0000, 0x9a80, 0x0009, 0x0007, 0x0000, 0x7f62,
++      0x0008, 0x8066, 0x0000, 0x0052, 0x0000, 0x4504, 0x000b, 0x92c0,
++      0x0009, 0x0780, 0x0008, 0x0db1, 0x0003, 0x124b, 0x0002, 0x090d,
++      0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x09a0, 0x000b, 0x3a46,
++      0x000a, 0x0d1a, 0x000b, 0x590f, 0x000b, 0x8054, 0x0008, 0x0004,
++      0x0000, 0x1243, 0x000a, 0x0924, 0x000b, 0x8010, 0x0008, 0x000d,
++      0x0000, 0x0191, 0x0004, 0x1810, 0x0000, 0x0191, 0x0004, 0x0124,
++      0x0003, 0x194d, 0x000a, 0x091e, 0x000b, 0x1243, 0x000a, 0x09a7,
++      0x0003, 0x591e, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, 0x0188,
++      0x000c, 0x1810, 0x0000, 0x0191, 0x0004, 0x8074, 0x0000, 0xf000,
++      0x0008, 0x3a42, 0x0002, 0x0d2c, 0x000b, 0x15fe, 0x0008, 0x3445,
++      0x000b, 0x0d30, 0x0000, 0x0007, 0x0003, 0x0d30, 0x0000, 0x8074,
++      0x0000, 0x0501, 0x0000, 0x8010, 0x0008, 0x000c, 0x0008, 0x0191,
++      0x0004, 0x0007, 0x0003, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0d43,
++      0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0940, 0x0003, 0x15fe,
++      0x0008, 0x3ce0, 0x0009, 0x0940, 0x0003, 0x0183, 0x0004, 0x8076,
++      0x0008, 0x0040, 0x0000, 0x0180, 0x000b, 0x8076, 0x0008, 0x0041,
++      0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0d48,
++      0x0003, 0x3c1e, 0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0037,
++      0x0000, 0x0d65, 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0d40,
++      0x000b, 0x1afe, 0x0008, 0xff80, 0x0009, 0x000d, 0x0000, 0x7f62,
++      0x0008, 0x2604, 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706,
++      0x0008, 0x2808, 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a,
++      0x0000, 0x8066, 0x0000, 0x0422, 0x0000, 0x455c, 0x0003, 0x0188,
++      0x000c, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0xf000,
++      0x0008, 0x8072, 0x0000, 0x8000, 0x0000, 0x0126, 0x000b, 0xbbe0,
++      0x0009, 0x0038, 0x0000, 0x0d77, 0x0003, 0x18fe, 0x0000, 0x3ce0,
++      0x0009, 0x0974, 0x000b, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0d3c,
++      0x0003, 0x0183, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x8072,
++      0x0000, 0x8000, 0x0000, 0x01c1, 0x000b, 0x8076, 0x0008, 0x0042,
++      0x0008, 0x0180, 0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0d80,
++      0x000b, 0x3a44, 0x0002, 0x0c09, 0x000b, 0x8072, 0x0000, 0x8000,
++      0x0000, 0x8000, 0x000f, 0x0007, 0x0003, 0x8072, 0x0000, 0x8000,
++      0x0000, 0x0007, 0x0003, 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80,
++      0x0001, 0x0007, 0x0000, 0x018c, 0x000b, 0x1930, 0x000a, 0x7f00,
++      0x0000, 0x9880, 0x0001, 0x0007, 0x0000, 0x7f62, 0x0008, 0x8066,
++      0x0000, 0x000a, 0x0008, 0x458f, 0x000b, 0x4000, 0x000f, 0x2191,
++      0x0003, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009, 0x0090,
++      0x0008, 0x099a, 0x000b, 0x8074, 0x0000, 0x0706, 0x0000, 0x019c,
++      0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, 0x8010,
++      0x0008, 0x0008, 0x0000, 0x01cf, 0x0003, 0x0188, 0x000c, 0x8010,
++      0x0008, 0x0007, 0x0000, 0x0191, 0x0004, 0x1810, 0x0000, 0x0191,
++      0x0004, 0x01d9, 0x000b, 0x0188, 0x000c, 0x8010, 0x0008, 0x001b,
++      0x0008, 0x0191, 0x0004, 0x1810, 0x0000, 0x0191, 0x0004, 0x8074,
++      0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x0007, 0x0003, 0x8010,
++      0x0008, 0x0009, 0x0008, 0x01cf, 0x0003, 0x8010, 0x0008, 0x0005,
++      0x0008, 0x01cf, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010,
++      0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x0853, 0x0003, 0x3a44,
++      0x0002, 0x0c07, 0x0003, 0x0d2a, 0x0008, 0x01cf, 0x0003, 0x8010,
++      0x0008, 0x0003, 0x0008, 0x01d1, 0x0003, 0x8010, 0x0008, 0x000b,
++      0x0000, 0x01d1, 0x0003, 0x8010, 0x0008, 0x0002, 0x0000, 0x01d1,
++      0x0003, 0x3a47, 0x0002, 0x0cd7, 0x000b, 0x8010, 0x0008, 0x0006,
++      0x0008, 0x01d1, 0x0003, 0x8074, 0x0000, 0xf000, 0x0008, 0x0191,
++      0x0004, 0x0194, 0x0004, 0x3a40, 0x000a, 0x0807, 0x000b, 0x8010,
++      0x0008, 0x000c, 0x0008, 0x0191, 0x0004, 0x0007, 0x0003, 0x8074,
++      0x0000, 0xf080, 0x0000, 0x0d30, 0x0000, 0x2e4d, 0x0002, 0x2e4d,
++      0x0002, 0x09e2, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, 0x0007,
++      0x0003, 0x8054, 0x0008, 0x0009, 0x0008, 0x0007, 0x0003, 0x3a44,
++      0x0002, 0x0c07, 0x0003, 0x01c4, 0x000b, 0xde59, 0xf666, 0x0001,
++      0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
++      0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xfe91
++};
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp.c  2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,6714 @@
++/* @(#)isp.c 1.86 */
++/*
++ * Machine and OS Independent (well, as best as possible)
++ * code for the Qlogic ISP SCSI adapters.
++ *
++ * Copyright (c) 1997, 1998, 1999, 2000, 2001 by Matthew Jacob
++ * Feral Software
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++/*
++ * Inspiration and ideas about this driver are from Erik Moe's Linux driver
++ * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some
++ * ideas dredged from the Solaris driver.
++ */
++
++/*
++ * Include header file appropriate for platform we're building on.
++ */
++
++#ifdef        __NetBSD__
++#include <dev/ic/isp_netbsd.h>
++#endif
++#ifdef        __FreeBSD__
++#include <dev/isp/isp_freebsd.h>
++#endif
++#ifdef        __OpenBSD__
++#include <dev/ic/isp_openbsd.h>
++#endif
++#ifdef        __linux__
++#include "isp_linux.h"
++#endif
++#ifdef        __svr4__
++#include "isp_solaris.h"
++#endif
++
++/*
++ * General defines
++ */
++
++#define       MBOX_DELAY_COUNT        1000000 / 100
++
++/*
++ * Local static data
++ */
++static const char portshift[] =
++    "Target %d Loop ID 0x%x (Port 0x%x) => Loop 0x%x (Port 0x%x)";
++static const char portdup[] =
++    "Target %d duplicates Target %d- killing off both";
++static const char retained[] =
++    "Retaining Loop ID 0x%x for Target %d (Port 0x%x)";
++static const char lretained[] =
++    "Retained login of Target %d (Loop ID 0x%x) Port 0x%x";
++static const char plogout[] =
++    "Logging out Target %d at Loop ID 0x%x (Port 0x%x)";
++static const char plogierr[] =
++    "Command Error in PLOGI for Port 0x%x (0x%x)";
++static const char nopdb[] =
++    "Could not get PDB for Device @ Port 0x%x";
++static const char pdbmfail1[] =
++    "PDB Loop ID info for Device @ Port 0x%x does not match up (0x%x)";
++static const char pdbmfail2[] =
++    "PDB Port info for Device @ Port 0x%x does not match up (0x%x)";
++static const char ldumped[] =
++    "Target %d (Loop ID 0x%x) Port 0x%x dumped after login info mismatch";
++static const char notresp[] =
++  "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d";
++static const char xact1[] =
++    "HBA attempted queued transaction with disconnect not set for %d.%d.%d";
++static const char xact2[] =
++    "HBA attempted queued transaction to target routine %d on target %d bus %d";
++static const char xact3[] =
++    "HBA attempted queued cmd for %d.%d.%d when queueing disabled";
++static const char pskip[] =
++    "SCSI phase skipped for target %d.%d.%d";
++static const char topology[] =
++    "Loop ID %d, AL_PA 0x%x, Port ID 0x%x, Loop State 0x%x, Topology '%s'";
++static const char swrej[] =
++    "Fabric Nameserver rejected %s (Reason=0x%x Expl=0x%x) for Port ID 0x%x";
++static const char finmsg[] =
++    "(%d.%d.%d): FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x";
++static const char sc0[] =
++    "%s CHAN %d FTHRSH %d IID %d RESETD %d RETRYC %d RETRYD %d ASD 0x%x";
++static const char sc1[] =
++    "%s RAAN 0x%x DLAN 0x%x DDMAB 0x%x CDMAB 0x%x SELTIME %d MQD %d";
++static const char sc2[] = "%s CHAN %d TGT %d FLAGS 0x%x 0x%x/0x%x";
++static const char sc3[] = "Generated";
++static const char sc4[] = "NVRAM";
++static const char bun[] =
++    "bad underrun for %d.%d (count %d, resid %d, status %s)";
++
++/*
++ * Local function prototypes.
++ */
++static int isp_parse_async(struct ispsoftc *, u_int16_t);
++static int isp_handle_other_response(struct ispsoftc *, int, isphdr_t *,
++    u_int16_t *);
++static void
++isp_parse_status(struct ispsoftc *, ispstatusreq_t *, XS_T *);
++static void isp_fastpost_complete(struct ispsoftc *, u_int16_t);
++static int isp_mbox_continue(struct ispsoftc *);
++static void isp_scsi_init(struct ispsoftc *);
++static void isp_scsi_channel_init(struct ispsoftc *, int);
++static void isp_fibre_init(struct ispsoftc *);
++static void isp_mark_getpdb_all(struct ispsoftc *);
++static int isp_getmap(struct ispsoftc *, fcpos_map_t *);
++static int isp_getpdb(struct ispsoftc *, int, isp_pdb_t *);
++static u_int64_t isp_get_portname(struct ispsoftc *, int, int);
++static int isp_fclink_test(struct ispsoftc *, int);
++static char *isp2100_fw_statename(int);
++static int isp_pdb_sync(struct ispsoftc *);
++static int isp_scan_loop(struct ispsoftc *);
++static int isp_fabric_mbox_cmd(struct ispsoftc *, mbreg_t *);
++static int isp_scan_fabric(struct ispsoftc *, int);
++static void isp_register_fc4_type(struct ispsoftc *);
++static void isp_fw_state(struct ispsoftc *);
++static void isp_mboxcmd_qnw(struct ispsoftc *, mbreg_t *, int);
++static void isp_mboxcmd(struct ispsoftc *, mbreg_t *, int);
++
++static void isp_update(struct ispsoftc *);
++static void isp_update_bus(struct ispsoftc *, int);
++static void isp_setdfltparm(struct ispsoftc *, int);
++static int isp_read_nvram(struct ispsoftc *);
++static void isp_rdnvram_word(struct ispsoftc *, int, u_int16_t *);
++static void isp_parse_nvram_1020(struct ispsoftc *, u_int8_t *);
++static void isp_parse_nvram_1080(struct ispsoftc *, int, u_int8_t *);
++static void isp_parse_nvram_12160(struct ispsoftc *, int, u_int8_t *);
++static void isp_parse_nvram_2100(struct ispsoftc *, u_int8_t *);
++
++/*
++ * Reset Hardware.
++ *
++ * Hit the chip over the head, download new f/w if available and set it running.
++ *
++ * Locking done elsewhere.
++ */
++
++void
++isp_reset(struct ispsoftc *isp)
++{
++      mbreg_t mbs;
++      u_int16_t code_org;
++      int loops, i, dodnld = 1;
++      char *btype = "????";
++
++      isp->isp_state = ISP_NILSTATE;
++
++      /*
++       * Basic types (SCSI, FibreChannel and PCI or SBus)
++       * have been set in the MD code. We figure out more
++       * here. Possibly more refined types based upon PCI
++       * identification. Chip revision has been gathered.
++       *
++       * After we've fired this chip up, zero out the conf1 register
++       * for SCSI adapters and do other settings for the 2100.
++       */
++
++      /*
++       * Get the current running firmware revision out of the
++       * chip before we hit it over the head (if this is our
++       * first time through). Note that we store this as the
++       * 'ROM' firmware revision- which it may not be. In any
++       * case, we don't really use this yet, but we may in
++       * the future.
++       */
++      if (isp->isp_touched == 0) {
++              /*
++               * First see whether or not we're sitting in the ISP PROM.
++               * If we've just been reset, we'll have the string "ISP   "
++               * spread through outgoing mailbox registers 1-3. We do
++               * this for PCI cards because otherwise we really don't
++               * know what state the card is in and we could hang if
++               * we try this command otherwise.
++               *
++               * For SBus cards, we just do this because they almost
++               * certainly will be running firmware by now.
++               */
++              if (ISP_READ(isp, OUTMAILBOX1) != 0x4953 ||
++                  ISP_READ(isp, OUTMAILBOX2) != 0x5020 ||
++                  ISP_READ(isp, OUTMAILBOX3) != 0x2020) {
++                      /*
++                       * Just in case it was paused...
++                       */
++                      ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
++                      mbs.param[0] = MBOX_ABOUT_FIRMWARE;
++                      isp_mboxcmd(isp, &mbs, MBLOGNONE);
++                      if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++                              isp->isp_romfw_rev[0] = mbs.param[1];
++                              isp->isp_romfw_rev[1] = mbs.param[2];
++                              isp->isp_romfw_rev[2] = mbs.param[3];
++                      }
++              }
++              isp->isp_touched = 1;
++      }
++
++      DISABLE_INTS(isp);
++
++      /*
++       * Set up default request/response queue in-pointer/out-pointer
++       * register indices.
++       */
++      if (IS_23XX(isp)) {
++              isp->isp_rqstinrp = BIU_REQINP;
++              isp->isp_rqstoutrp = BIU_REQOUTP;
++              isp->isp_respinrp = BIU_RSPINP;
++              isp->isp_respoutrp = BIU_RSPOUTP;
++      } else {
++              isp->isp_rqstinrp = INMAILBOX4;
++              isp->isp_rqstoutrp = OUTMAILBOX4;
++              isp->isp_respinrp = OUTMAILBOX5;
++              isp->isp_respoutrp = INMAILBOX5;
++      }
++
++      /*
++       * Put the board into PAUSE mode (so we can read the SXP registers
++       * or write FPM/FBM registers).
++       */
++      ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++
++      if (IS_FC(isp)) {
++              switch (isp->isp_type) {
++              case ISP_HA_FC_2100:
++                      btype = "2100";
++                      break;
++              case ISP_HA_FC_2200:
++                      btype = "2200";
++                      break;
++              case ISP_HA_FC_2300:
++                      btype = "2300";
++                      break;
++              case ISP_HA_FC_2312:
++                      btype = "2312";
++                      break;
++              default:
++                      break;
++              }
++              /*
++               * While we're paused, reset the FPM module and FBM fifos.
++               */
++              ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
++              ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
++              ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
++              ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
++              ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
++      } else if (IS_1240(isp)) {
++              sdparam *sdp = isp->isp_param;
++              btype = "1240";
++              isp->isp_clock = 60;
++              sdp->isp_ultramode = 1;
++              sdp++;
++              sdp->isp_ultramode = 1;
++              /*
++               * XXX: Should probably do some bus sensing.
++               */
++      } else if (IS_ULTRA2(isp)) {
++              static const char m[] = "bus %d is in %s Mode";
++              u_int16_t l;
++              sdparam *sdp = isp->isp_param;
++
++              isp->isp_clock = 100;
++
++              if (IS_1280(isp))
++                      btype = "1280";
++              else if (IS_1080(isp))
++                      btype = "1080";
++              else if (IS_10160(isp))
++                      btype = "10160";
++              else if (IS_12160(isp))
++                      btype = "12160";
++              else
++                      btype = "<UNKLVD>";
++
++              l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK;
++              switch (l) {
++              case ISP1080_LVD_MODE:
++                      sdp->isp_lvdmode = 1;
++                      isp_prt(isp, ISP_LOGCONFIG, m, 0, "LVD");
++                      break;
++              case ISP1080_HVD_MODE:
++                      sdp->isp_diffmode = 1;
++                      isp_prt(isp, ISP_LOGCONFIG, m, 0, "Differential");
++                      break;
++              case ISP1080_SE_MODE:
++                      sdp->isp_ultramode = 1;
++                      isp_prt(isp, ISP_LOGCONFIG, m, 0, "Single-Ended");
++                      break;
++              default:
++                      isp_prt(isp, ISP_LOGERR,
++                          "unknown mode on bus %d (0x%x)", 0, l);
++                      break;
++              }
++
++              if (IS_DUALBUS(isp)) {
++                      sdp++;
++                      l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT);
++                      l &= ISP1080_MODE_MASK;
++                      switch(l) {
++                      case ISP1080_LVD_MODE:
++                              sdp->isp_lvdmode = 1;
++                              isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD");
++                              break;
++                      case ISP1080_HVD_MODE:
++                              sdp->isp_diffmode = 1;
++                              isp_prt(isp, ISP_LOGCONFIG,
++                                  m, 1, "Differential");
++                              break;
++                      case ISP1080_SE_MODE:
++                              sdp->isp_ultramode = 1;
++                              isp_prt(isp, ISP_LOGCONFIG,
++                                  m, 1, "Single-Ended");
++                              break;
++                      default:
++                              isp_prt(isp, ISP_LOGERR,
++                                  "unknown mode on bus %d (0x%x)", 1, l);
++                              break;
++                      }
++              }
++      } else {
++              sdparam *sdp = isp->isp_param;
++              i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK;
++              switch (i) {
++              default:
++                      isp_prt(isp, ISP_LOGALL, "Unknown Chip Type 0x%x", i);
++                      /* FALLTHROUGH */
++              case 1:
++                      btype = "1020";
++                      isp->isp_type = ISP_HA_SCSI_1020;
++                      isp->isp_clock = 40;
++                      break;
++              case 2:
++                      /*
++                       * Some 1020A chips are Ultra Capable, but don't
++                       * run the clock rate up for that unless told to
++                       * do so by the Ultra Capable bits being set.
++                       */
++                      btype = "1020A";
++                      isp->isp_type = ISP_HA_SCSI_1020A;
++                      isp->isp_clock = 40;
++                      break;
++              case 3:
++                      btype = "1040";
++                      isp->isp_type = ISP_HA_SCSI_1040;
++                      isp->isp_clock = 60;
++                      break;
++              case 4:
++                      btype = "1040A";
++                      isp->isp_type = ISP_HA_SCSI_1040A;
++                      isp->isp_clock = 60;
++                      break;
++              case 5:
++                      btype = "1040B";
++                      isp->isp_type = ISP_HA_SCSI_1040B;
++                      isp->isp_clock = 60;
++                      break;
++              case 6:
++                      btype = "1040C";
++                      isp->isp_type = ISP_HA_SCSI_1040C;
++                      isp->isp_clock = 60;
++                        break;
++              }
++              /*
++               * Now, while we're at it, gather info about ultra
++               * and/or differential mode.
++               */
++              if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) {
++                      isp_prt(isp, ISP_LOGCONFIG, "Differential Mode");
++                      sdp->isp_diffmode = 1;
++              } else {
++                      sdp->isp_diffmode = 0;
++              }
++              i = ISP_READ(isp, RISC_PSR);
++              if (isp->isp_bustype == ISP_BT_SBUS) {
++                      i &= RISC_PSR_SBUS_ULTRA;
++              } else {
++                      i &= RISC_PSR_PCI_ULTRA;
++              }
++              if (i != 0) {
++                      isp_prt(isp, ISP_LOGCONFIG, "Ultra Mode Capable");
++                      sdp->isp_ultramode = 1;
++                      /*
++                       * If we're in Ultra Mode, we have to be 60MHz clock-
++                       * even for the SBus version.
++                       */
++                      isp->isp_clock = 60;
++              } else {
++                      sdp->isp_ultramode = 0;
++                      /*
++                       * Clock is known. Gronk.
++                       */
++              }
++
++              /*
++               * Machine dependent clock (if set) overrides
++               * our generic determinations.
++               */
++              if (isp->isp_mdvec->dv_clock) {
++                      if (isp->isp_mdvec->dv_clock < isp->isp_clock) {
++                              isp->isp_clock = isp->isp_mdvec->dv_clock;
++                      }
++              }
++
++      }
++
++      /*
++       * Clear instrumentation
++       */
++      isp->isp_intcnt = isp->isp_intbogus = 0;
++
++      /*
++       * Do MD specific pre initialization
++       */
++      ISP_RESET0(isp);
++
++again:
++
++      /*
++       * Hit the chip over the head with hammer,
++       * and give the ISP a chance to recover.
++       */
++
++      if (IS_SCSI(isp)) {
++              ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET);
++              /*
++               * A slight delay...
++               */
++              USEC_DELAY(100);
++
++              /*
++               * Clear data && control DMA engines.
++               */
++              ISP_WRITE(isp, CDMA_CONTROL,
++                  DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
++              ISP_WRITE(isp, DDMA_CONTROL,
++                  DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
++
++
++      } else {
++              ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
++              /*
++               * A slight delay...
++               */
++              USEC_DELAY(100);
++
++              /*
++               * Clear data && control DMA engines.
++               */
++              ISP_WRITE(isp, CDMA2100_CONTROL,
++                      DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
++              ISP_WRITE(isp, TDMA2100_CONTROL,
++                      DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
++              ISP_WRITE(isp, RDMA2100_CONTROL,
++                      DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
++      }
++
++      /*
++       * Wait for ISP to be ready to go...
++       */
++      loops = MBOX_DELAY_COUNT;
++      for (;;) {
++              if (IS_SCSI(isp)) {
++                      if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET))
++                              break;
++              } else {
++                      if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET))
++                              break;
++              }
++              USEC_DELAY(100);
++              if (--loops < 0) {
++                      ISP_DUMPREGS(isp, "chip reset timed out");
++                      return;
++              }
++      }
++
++      /*
++       * After we've fired this chip up, zero out the conf1 register
++       * for SCSI adapters and other settings for the 2100.
++       */
++
++      if (IS_SCSI(isp)) {
++              ISP_WRITE(isp, BIU_CONF1, 0);
++      } else {
++              ISP_WRITE(isp, BIU2100_CSR, 0);
++      }
++
++      /*
++       * Reset RISC Processor
++       */
++      ISP_WRITE(isp, HCCR, HCCR_CMD_RESET);
++      USEC_DELAY(100);
++      /* Clear semaphore register (just to be sure) */
++      ISP_WRITE(isp, BIU_SEMA, 0);
++
++      /*
++       * Establish some initial burst rate stuff.
++       * (only for the 1XX0 boards). This really should
++       * be done later after fetching from NVRAM.
++       */
++      if (IS_SCSI(isp)) {
++              u_int16_t tmp = isp->isp_mdvec->dv_conf1;
++              /*
++               * Busted FIFO. Turn off all but burst enables.
++               */
++              if (isp->isp_type == ISP_HA_SCSI_1040A) {
++                      tmp &= BIU_BURST_ENABLE;
++              }
++              ISP_SETBITS(isp, BIU_CONF1, tmp);
++              if (tmp & BIU_BURST_ENABLE) {
++                      ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST);
++                      ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST);
++              }
++#ifdef        PTI_CARDS
++              if (((sdparam *) isp->isp_param)->isp_ultramode) {
++                      while (ISP_READ(isp, RISC_MTR) != 0x1313) {
++                              ISP_WRITE(isp, RISC_MTR, 0x1313);
++                              ISP_WRITE(isp, HCCR, HCCR_CMD_STEP);
++                      }
++              } else {
++                      ISP_WRITE(isp, RISC_MTR, 0x1212);
++              }
++              /*
++               * PTI specific register
++               */
++              ISP_WRITE(isp, RISC_EMB, DUAL_BANK)
++#else
++              ISP_WRITE(isp, RISC_MTR, 0x1212);
++#endif
++      } else {
++              ISP_WRITE(isp, RISC_MTR2100, 0x1212);
++              if (IS_2200(isp) || IS_23XX(isp)) {
++                      ISP_WRITE(isp, HCCR, HCCR_2X00_DISABLE_PARITY_PAUSE);
++              }
++      }
++
++      ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); /* release paused processor */
++
++      /*
++       * Do MD specific post initialization
++       */
++      ISP_RESET1(isp);
++
++      /*
++       * Wait for everything to finish firing up.
++       *
++       * Avoid doing this on the 2312 because you can generate a PCI
++       * parity error (chip breakage).
++       */
++      if (IS_23XX(isp)) {
++              USEC_DELAY(5);
++      } else {
++              loops = MBOX_DELAY_COUNT;
++              while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
++                      USEC_DELAY(100);
++                      if (--loops < 0) {
++                              isp_prt(isp, ISP_LOGERR,
++                                  "MBOX_BUSY never cleared on reset");
++                              return;
++                      }
++              }
++      }
++
++      /*
++       * Up until this point we've done everything by just reading or
++       * setting registers. From this point on we rely on at least *some*
++       * kind of firmware running in the card.
++       */
++
++      /*
++       * Do some sanity checking.
++       */
++      mbs.param[0] = MBOX_NO_OP;
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return;
++      }
++
++      if (IS_SCSI(isp)) {
++              mbs.param[0] = MBOX_MAILBOX_REG_TEST;
++              mbs.param[1] = 0xdead;
++              mbs.param[2] = 0xbeef;
++              mbs.param[3] = 0xffff;
++              mbs.param[4] = 0x1111;
++              mbs.param[5] = 0xa5a5;
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      return;
++              }
++              if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef ||
++                  mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 ||
++                  mbs.param[5] != 0xa5a5) {
++                      isp_prt(isp, ISP_LOGERR,
++                          "Register Test Failed (0x%x 0x%x 0x%x 0x%x 0x%x)",
++                          mbs.param[1], mbs.param[2], mbs.param[3],
++                          mbs.param[4], mbs.param[5]);
++                      return;
++              }
++
++      }
++
++      /*
++       * Download new Firmware, unless requested not to do so.
++       * This is made slightly trickier in some cases where the
++       * firmware of the ROM revision is newer than the revision
++       * compiled into the driver. So, where we used to compare
++       * versions of our f/w and the ROM f/w, now we just see
++       * whether we have f/w at all and whether a config flag
++       * has disabled our download.
++       */
++      if ((isp->isp_mdvec->dv_ispfw == NULL) ||
++          (isp->isp_confopts & ISP_CFG_NORELOAD)) {
++              dodnld = 0;
++      }
++
++      if (IS_23XX(isp))
++              code_org = ISP_CODE_ORG_2300;
++      else
++              code_org = ISP_CODE_ORG;
++
++      if (dodnld) {
++              isp->isp_mbxworkp = (void *) &isp->isp_mdvec->dv_ispfw[1];
++              isp->isp_mbxwrk0 = isp->isp_mdvec->dv_ispfw[3] - 1;
++              isp->isp_mbxwrk1 = code_org + 1;
++              mbs.param[0] = MBOX_WRITE_RAM_WORD;
++              mbs.param[1] = code_org;
++              mbs.param[2] = isp->isp_mdvec->dv_ispfw[0];
++              isp_mboxcmd(isp, &mbs, MBLOGNONE);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      isp_prt(isp, ISP_LOGERR,
++                          "F/W download failed at word %d",
++                          isp->isp_mbxwrk1 - code_org);
++                      dodnld = 0;
++                      goto again;
++              }
++              /*
++               * Verify that it downloaded correctly.
++               */
++              mbs.param[0] = MBOX_VERIFY_CHECKSUM;
++              mbs.param[1] = code_org;
++              isp_mboxcmd(isp, &mbs, MBLOGNONE);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      isp_prt(isp, ISP_LOGERR, "Ram Checksum Failure");
++                      return;
++              }
++              isp->isp_loaded_fw = 1;
++      } else {
++              isp->isp_loaded_fw = 0;
++              isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
++      }
++
++      /*
++       * Now start it rolling.
++       *
++       * If we didn't actually download f/w,
++       * we still need to (re)start it.
++       */
++
++
++      mbs.param[0] = MBOX_EXEC_FIRMWARE;
++      mbs.param[1] = code_org;
++      isp_mboxcmd(isp, &mbs, MBLOGNONE);
++      /*
++       * Give it a chance to start.
++       */
++      USEC_DELAY(500);
++
++      if (IS_SCSI(isp)) {
++              /*
++               * Set CLOCK RATE, but only if asked to.
++               */
++              if (isp->isp_clock) {
++                      mbs.param[0] = MBOX_SET_CLOCK_RATE;
++                      mbs.param[1] = isp->isp_clock;
++                      isp_mboxcmd(isp, &mbs, MBLOGALL);
++                      /* we will try not to care if this fails */
++              }
++      }
++
++      mbs.param[0] = MBOX_ABOUT_FIRMWARE;
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return;
++      }
++
++      /*
++       * The SBus firmware that we are using apparently does not return
++       * major, minor, micro revisions in the mailbox registers, which
++       * is really, really, annoying.
++       */
++      if (ISP_SBUS_SUPPORTED && isp->isp_bustype == ISP_BT_SBUS) {
++              if (dodnld) {
++#ifdef        ISP_TARGET_MODE
++                      isp->isp_fwrev[0] = 7;
++                      isp->isp_fwrev[1] = 55;
++#else
++                      isp->isp_fwrev[0] = 1;
++                      isp->isp_fwrev[1] = 37;
++#endif
++                      isp->isp_fwrev[2] = 0;
++              } 
++      } else {
++              isp->isp_fwrev[0] = mbs.param[1];
++              isp->isp_fwrev[1] = mbs.param[2];
++              isp->isp_fwrev[2] = mbs.param[3];
++      }
++      isp_prt(isp, ISP_LOGCONFIG,
++          "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d",
++          btype, isp->isp_revision, dodnld? "loaded" : "resident",
++          isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]);
++
++      if (IS_FC(isp)) {
++              /*
++               * We do not believe firmware attributes for 2100 code less
++               * than 1.17.0, unless it's the firmware we specifically
++               * are loading.
++               *
++               * Note that all 22XX and 23XX f/w is greater than 1.X.0.
++               */
++              if (!(ISP_FW_NEWER_THAN(isp, 1, 17, 0))) {
++#ifdef        USE_SMALLER_2100_FIRMWARE
++                      FCPARAM(isp)->isp_fwattr = ISP_FW_ATTR_SCCLUN;
++#else
++                      FCPARAM(isp)->isp_fwattr = 0;
++#endif
++              } else {
++                      FCPARAM(isp)->isp_fwattr = mbs.param[6];
++                      isp_prt(isp, ISP_LOGDEBUG0,
++                          "Firmware Attributes = 0x%x", mbs.param[6]);
++              }
++              if (ISP_READ(isp, BIU2100_CSR) & BIU2100_PCI64) {
++                      isp_prt(isp, ISP_LOGCONFIG,
++                          "Installed in 64-Bit PCI slot");
++              }
++      }
++
++      if (isp->isp_romfw_rev[0] || isp->isp_romfw_rev[1] ||
++          isp->isp_romfw_rev[2]) {
++              isp_prt(isp, ISP_LOGCONFIG, "Last F/W revision was %d.%d.%d",
++                  isp->isp_romfw_rev[0], isp->isp_romfw_rev[1],
++                  isp->isp_romfw_rev[2]);
++      }
++
++      mbs.param[0] = MBOX_GET_FIRMWARE_STATUS;
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return;
++      }
++      isp->isp_maxcmds = mbs.param[2];
++      isp_prt(isp, ISP_LOGINFO,
++          "%d max I/O commands supported", mbs.param[2]);
++      isp_fw_state(isp);
++
++      /*
++       * Set up DMA for the request and result mailboxes.
++       */
++      if (ISP_MBOXDMASETUP(isp) != 0) {
++              isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
++              return;
++      }
++      isp->isp_state = ISP_RESETSTATE;
++
++      /*
++       * Okay- now that we have new firmware running, we now (re)set our
++       * notion of how many luns we support. This is somewhat tricky because
++       * if we haven't loaded firmware, we sometimes do not have an easy way
++       * of knowing how many luns we support.
++       *
++       * Expanded lun firmware gives you 32 luns for SCSI cards and
++       * 16384 luns for Fibre Channel cards.
++       *
++       * It turns out that even for QLogic 2100s with ROM 1.10 and above
++       * we do get a firmware attributes word returned in mailbox register 6.
++       *
++       * Because the lun is in a different position in the Request Queue
++       * Entry structure for Fibre Channel with expanded lun firmware, we
++       * can only support one lun (lun zero) when we don't know what kind
++       * of firmware we're running.
++       */
++      if (IS_SCSI(isp)) {
++              if (dodnld) {
++                      if (IS_ULTRA2(isp) || IS_ULTRA3(isp)) {
++                              isp->isp_maxluns = 32;
++                      } else {
++                              isp->isp_maxluns = 8;
++                      }
++              } else {
++                      isp->isp_maxluns = 8;
++              }
++      } else {
++              if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++                      isp->isp_maxluns = 16384;
++              } else {
++                      isp->isp_maxluns = 16;
++              }
++      }
++}
++
++/*
++ * Initialize Parameters of Hardware to a known state.
++ *
++ * Locks are held before coming here.
++ */
++
++void
++isp_init(struct ispsoftc *isp)
++{
++      /*
++       * Must do this first to get defaults established.
++       */
++      isp_setdfltparm(isp, 0);
++      if (IS_DUALBUS(isp)) {
++              isp_setdfltparm(isp, 1);
++      }
++      if (IS_FC(isp)) {
++              isp_fibre_init(isp);
++      } else {
++              isp_scsi_init(isp);
++      }
++}
++
++static void
++isp_scsi_init(struct ispsoftc *isp)
++{
++      sdparam *sdp_chan0, *sdp_chan1;
++      mbreg_t mbs;
++
++      sdp_chan0 = isp->isp_param;
++      sdp_chan1 = sdp_chan0;
++      if (IS_DUALBUS(isp)) {
++              sdp_chan1++;
++      }
++
++      /*
++       * If we have no role (neither target nor initiator), return.
++       */
++      if (isp->isp_role == ISP_ROLE_NONE) {
++              return;
++      }
++
++      /* First do overall per-card settings. */
++
++      /*
++       * If we have fast memory timing enabled, turn it on.
++       */
++      if (sdp_chan0->isp_fast_mttr) {
++              ISP_WRITE(isp, RISC_MTR, 0x1313);
++      }
++
++      /*
++       * Set Retry Delay and Count.
++       * You set both channels at the same time.
++       */
++      mbs.param[0] = MBOX_SET_RETRY_COUNT;
++      mbs.param[1] = sdp_chan0->isp_retry_count;
++      mbs.param[2] = sdp_chan0->isp_retry_delay;
++      mbs.param[6] = sdp_chan1->isp_retry_count;
++      mbs.param[7] = sdp_chan1->isp_retry_delay;
++
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return;
++      }
++
++      /*
++       * Set ASYNC DATA SETUP time. This is very important.
++       */
++      mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME;
++      mbs.param[1] = sdp_chan0->isp_async_data_setup;
++      mbs.param[2] = sdp_chan1->isp_async_data_setup;
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return;
++      }
++
++      /*
++       * Set ACTIVE Negation State.
++       */
++      mbs.param[0] = MBOX_SET_ACT_NEG_STATE;
++      mbs.param[1] =
++          (sdp_chan0->isp_req_ack_active_neg << 4) |
++          (sdp_chan0->isp_data_line_active_neg << 5);
++      mbs.param[2] =
++          (sdp_chan1->isp_req_ack_active_neg << 4) |
++          (sdp_chan1->isp_data_line_active_neg << 5);
++
++      isp_mboxcmd(isp, &mbs, MBLOGNONE);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              isp_prt(isp, ISP_LOGERR,
++                  "failed to set active negation state (%d,%d), (%d,%d)",
++                  sdp_chan0->isp_req_ack_active_neg,
++                  sdp_chan0->isp_data_line_active_neg,
++                  sdp_chan1->isp_req_ack_active_neg,
++                  sdp_chan1->isp_data_line_active_neg);
++              /*
++               * But don't return.
++               */
++      }
++
++      /*
++       * Set the Tag Aging limit
++       */
++      mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT;
++      mbs.param[1] = sdp_chan0->isp_tag_aging;
++      mbs.param[2] = sdp_chan1->isp_tag_aging;
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)",
++                  sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging);
++              return;
++      }
++
++      /*
++       * Set selection timeout.
++       */
++      mbs.param[0] = MBOX_SET_SELECT_TIMEOUT;
++      mbs.param[1] = sdp_chan0->isp_selection_timeout;
++      mbs.param[2] = sdp_chan1->isp_selection_timeout;
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return;
++      }
++
++      /* now do per-channel settings */
++      isp_scsi_channel_init(isp, 0);
++      if (IS_DUALBUS(isp))
++              isp_scsi_channel_init(isp, 1);
++
++      /*
++       * Now enable request/response queues
++       */
++
++      if (IS_ULTRA2(isp) || IS_1240(isp)) {
++              mbs.param[0] = MBOX_INIT_RES_QUEUE_A64;
++              mbs.param[1] = RESULT_QUEUE_LEN(isp);
++              mbs.param[2] = DMA_WD1(isp->isp_result_dma);
++              mbs.param[3] = DMA_WD0(isp->isp_result_dma);
++              mbs.param[4] = 0;
++              mbs.param[6] = DMA_WD3(isp->isp_result_dma);
++              mbs.param[7] = DMA_WD2(isp->isp_result_dma);
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      return;
++              }
++              isp->isp_residx = mbs.param[5];
++
++              mbs.param[0] = MBOX_INIT_REQ_QUEUE_A64;
++              mbs.param[1] = RQUEST_QUEUE_LEN(isp);
++              mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
++              mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
++              mbs.param[5] = 0;
++              mbs.param[6] = DMA_WD3(isp->isp_result_dma);
++              mbs.param[7] = DMA_WD2(isp->isp_result_dma);
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      return;
++              }
++              isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
++      } else {
++              mbs.param[0] = MBOX_INIT_RES_QUEUE;
++              mbs.param[1] = RESULT_QUEUE_LEN(isp);
++              mbs.param[2] = DMA_WD1(isp->isp_result_dma);
++              mbs.param[3] = DMA_WD0(isp->isp_result_dma);
++              mbs.param[4] = 0;
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      return;
++              }
++              isp->isp_residx = mbs.param[5];
++
++              mbs.param[0] = MBOX_INIT_REQ_QUEUE;
++              mbs.param[1] = RQUEST_QUEUE_LEN(isp);
++              mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
++              mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
++              mbs.param[5] = 0;
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      return;
++              }
++              isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
++      }
++
++      /*
++       * Turn on Fast Posting, LVD transitions
++       *
++       * Ultra2 F/W always has had fast posting (and LVD transitions)
++       *
++       * Ultra and older (i.e., SBus) cards may not. It's just safer
++       * to assume not for them.
++       */
++
++      mbs.param[0] = MBOX_SET_FW_FEATURES;
++      mbs.param[1] = 0;
++      if (IS_ULTRA2(isp))
++              mbs.param[1] |= FW_FEATURE_LVD_NOTIFY;
++#ifndef       ISP_NO_RIO
++      if (IS_ULTRA2(isp) || IS_1240(isp))
++              mbs.param[1] |= FW_FEATURE_RIO_16BIT;
++#else
++#ifndef       ISP_NO_FASTPOST
++      if (IS_ULTRA2(isp) || IS_1240(isp))
++              mbs.param[1] |= FW_FEATURE_FAST_POST;
++#endif
++#endif
++      if (mbs.param[1] != 0) {
++              u_int16_t sfeat = mbs.param[1];
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++                      isp_prt(isp, ISP_LOGINFO,
++                          "Enabled FW features (0x%x)", sfeat);
++              }
++      }
++
++      /*
++       * Let the outer layers decide whether to issue a SCSI bus reset.
++       */
++      isp->isp_state = ISP_INITSTATE;
++}
++
++static void
++isp_scsi_channel_init(struct ispsoftc *isp, int channel)
++{
++      sdparam *sdp;
++      mbreg_t mbs;
++      int tgt;
++
++      sdp = isp->isp_param;
++      sdp += channel;
++
++      /*
++       * Set (possibly new) Initiator ID.
++       */
++      mbs.param[0] = MBOX_SET_INIT_SCSI_ID;
++      mbs.param[1] = (channel << 7) | sdp->isp_initiator_id;
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return;
++      }
++      isp_prt(isp, ISP_LOGINFO, "Initiator ID is %d on Channel %d",
++          sdp->isp_initiator_id, channel);
++
++
++      /*
++       * Set current per-target parameters to an initial safe minimum.
++       */
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              int lun;
++              u_int16_t sdf;
++
++              if (sdp->isp_devparam[tgt].dev_enable == 0) {
++                      continue;
++              }
++#ifndef       ISP_TARGET_MODE
++              sdf = sdp->isp_devparam[tgt].goal_flags;
++              sdf &= DPARM_SAFE_DFLT;
++              /*
++               * It is not quite clear when this changed over so that
++               * we could force narrow and async for 1000/1020 cards,
++               * but assume that this is only the case for loaded
++               * firmware.
++               */
++              if (isp->isp_loaded_fw) {
++                      sdf |= DPARM_NARROW | DPARM_ASYNC;
++              }
++#else
++              /*
++               * The !$*!)$!$)* f/w uses the same index into some
++               * internal table to decide how to respond to negotiations,
++               * so if we've said "let's be safe" for ID X, and ID X
++               * selects *us*, the negotiations will back to 'safe'
++               * (as in narrow/async). What the f/w *should* do is
++               * use the initiator id settings to decide how to respond.
++               */
++              sdp->isp_devparam[tgt].goal_flags = sdf = DPARM_DEFAULT;
++#endif
++              mbs.param[0] = MBOX_SET_TARGET_PARAMS;
++              mbs.param[1] = (channel << 15) | (tgt << 8);
++              mbs.param[2] = sdf;
++              if ((sdf & DPARM_SYNC) == 0) {
++                      mbs.param[3] = 0;
++              } else {
++                      mbs.param[3] =
++                          (sdp->isp_devparam[tgt].goal_offset << 8) |
++                          (sdp->isp_devparam[tgt].goal_period);
++              }
++              isp_prt(isp, ISP_LOGDEBUG0,
++                  "Initial Settings bus%d tgt%d flags 0x%x off 0x%x per 0x%x",
++                  channel, tgt, mbs.param[2], mbs.param[3] >> 8,
++                  mbs.param[3] & 0xff);
++              isp_mboxcmd(isp, &mbs, MBLOGNONE);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      sdf = DPARM_SAFE_DFLT;
++                      mbs.param[0] = MBOX_SET_TARGET_PARAMS;
++                      mbs.param[1] = (tgt << 8) | (channel << 15);
++                      mbs.param[2] = sdf;
++                      mbs.param[3] = 0;
++                      isp_mboxcmd(isp, &mbs, MBLOGALL);
++                      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                              continue;
++                      }
++              }
++
++              /*
++               * We don't update any information directly from the f/w
++               * because we need to run at least one command to cause a
++               * new state to be latched up. So, we just assume that we
++               * converge to the values we just had set.
++               *
++               * Ensure that we don't believe tagged queuing is enabled yet.
++               * It turns out that sometimes the ISP just ignores our
++               * attempts to set parameters for devices that it hasn't
++               * seen yet.
++               */
++              sdp->isp_devparam[tgt].actv_flags = sdf & ~DPARM_TQING;
++              for (lun = 0; lun < (int) isp->isp_maxluns; lun++) {
++                      mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS;
++                      mbs.param[1] = (channel << 15) | (tgt << 8) | lun;
++                      mbs.param[2] = sdp->isp_max_queue_depth;
++                      mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle;
++                      isp_mboxcmd(isp, &mbs, MBLOGALL);
++                      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                              break;
++                      }
++              }
++      }
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              if (sdp->isp_devparam[tgt].dev_refresh) {
++                      isp->isp_sendmarker |= (1 << channel);
++                      isp->isp_update |= (1 << channel);
++                      break;
++              }
++      }
++}
++
++/*
++ * Fibre Channel specific initialization.
++ *
++ * Locks are held before coming here.
++ */
++static void
++isp_fibre_init(struct ispsoftc *isp)
++{
++      fcparam *fcp;
++      isp_icb_t local, *icbp = &local;
++      mbreg_t mbs;
++      int loopid;
++      u_int64_t nwwn, pwwn;
++
++      fcp = isp->isp_param;
++
++      /*
++       * Do this *before* initializing the firmware.
++       */
++      isp_mark_getpdb_all(isp);
++      fcp->isp_fwstate = FW_CONFIG_WAIT;
++      fcp->isp_loopstate = LOOP_NIL;
++
++      /*
++       * If we have no role (neither target nor initiator), return.
++       */
++      if (isp->isp_role == ISP_ROLE_NONE) {
++              return;
++      }
++
++      loopid = fcp->isp_loopid;
++      MEMZERO(icbp, sizeof (*icbp));
++      icbp->icb_version = ICB_VERSION1;
++
++      /*
++       * Firmware Options are either retrieved from NVRAM or
++       * are patched elsewhere. We check them for sanity here
++       * and make changes based on board revision, but otherwise
++       * let others decide policy.
++       */
++
++      /*
++       * If this is a 2100 < revision 5, we have to turn off FAIRNESS.
++       */
++      if ((isp->isp_type == ISP_HA_FC_2100) && isp->isp_revision < 5) {
++              fcp->isp_fwoptions &= ~ICBOPT_FAIRNESS;
++      }
++
++      /*
++       * We have to use FULL LOGIN even though it resets the loop too much
++       * because otherwise port database entries don't get updated after
++       * a LIP- this is a known f/w bug for 2100 f/w less than 1.17.0.
++       */
++      if (!ISP_FW_NEWER_THAN(isp, 1, 17, 0)) {
++              fcp->isp_fwoptions |= ICBOPT_FULL_LOGIN;
++      }
++
++      /*
++       * Insist on Port Database Update Async notifications
++       */
++      fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
++
++      /*
++       * Make sure that target role reflects into fwoptions.
++       */
++      if (isp->isp_role & ISP_ROLE_TARGET) {
++              fcp->isp_fwoptions |= ICBOPT_TGT_ENABLE;
++      } else {
++              fcp->isp_fwoptions &= ~ICBOPT_TGT_ENABLE;
++      }
++
++      /*
++       * Propagate all of this into the ICB structure.
++       */
++      icbp->icb_fwoptions = fcp->isp_fwoptions;
++      icbp->icb_maxfrmlen = fcp->isp_maxfrmlen;
++      if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN ||
++          icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
++              isp_prt(isp, ISP_LOGERR,
++                  "bad frame length (%d) from NVRAM- using %d",
++                  fcp->isp_maxfrmlen, ICB_DFLT_FRMLEN);
++              icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN;
++      }
++      icbp->icb_maxalloc = fcp->isp_maxalloc;
++      if (icbp->icb_maxalloc < 1) {
++              isp_prt(isp, ISP_LOGERR,
++                  "bad maximum allocation (%d)- using 16", fcp->isp_maxalloc);
++              icbp->icb_maxalloc = 16;
++      }
++      icbp->icb_execthrottle = fcp->isp_execthrottle;
++      if (icbp->icb_execthrottle < 1) {
++              isp_prt(isp, ISP_LOGERR,
++                  "bad execution throttle of %d- using 16",
++                  fcp->isp_execthrottle);
++              icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
++      }
++      icbp->icb_retry_delay = fcp->isp_retry_delay;
++      icbp->icb_retry_count = fcp->isp_retry_count;
++      icbp->icb_hardaddr = loopid;
++      /*
++       * Right now we just set extended options to prefer point-to-point
++       * over loop based upon some soft config options.
++       * 
++       * NB: for the 2300, ICBOPT_EXTENDED is required.
++       */
++      if (IS_2200(isp) || IS_23XX(isp)) {
++              icbp->icb_fwoptions |= ICBOPT_EXTENDED;
++              /*
++               * Prefer or force Point-To-Point instead Loop?
++               */
++              switch(isp->isp_confopts & ISP_CFG_PORT_PREF) {
++              case ISP_CFG_NPORT:
++                      icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP;
++                      break;
++              case ISP_CFG_NPORT_ONLY:
++                      icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY;
++                      break;
++              case ISP_CFG_LPORT_ONLY:
++                      icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY;
++                      break;
++              default:
++                      icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP;
++                      break;
++              }
++              if (IS_23XX(isp)) {
++                      /*
++                       * QLogic recommends that FAST Posting be turned
++                       * off for 23XX cards and instead allow the HBA
++                       * to write response queue entries and interrupt
++                       * after a delay (ZIO).
++                       *
++                       * If we set ZIO, it will disable fast posting,
++                       * so we don't need to clear it in fwoptions.
++                       */
++#ifndef       ISP_NO_ZIO
++                      icbp->icb_xfwoptions |= ICBXOPT_ZIO;
++#else
++                      icbp->icb_fwoptions |= ICBOPT_FAST_POST;
++#endif
++#if   0
++                      /*
++                       * Values, in 100us increments. The default
++                       * is 2 (200us) if a value 0 (default) is
++                       * selected.
++                       */
++                      icbp->icb_idelaytimer = 2;
++#endif
++
++                      if (isp->isp_confopts & ISP_CFG_ONEGB) {
++                              icbp->icb_zfwoptions |= ICBZOPT_RATE_ONEGB;
++                      } else if (isp->isp_confopts & ISP_CFG_TWOGB) {
++                              icbp->icb_zfwoptions |= ICBZOPT_RATE_TWOGB;
++                      } else {
++                              icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO;
++                      }
++              }
++      }
++
++#ifndef       ISP_NO_RIO_FC
++      /*
++       * RIO seems to be enabled in 2100s for fw >= 1.17.0.
++       *
++       * I've had some questionable problems with RIO on 2200.
++       * More specifically, on a 2204 I had problems with RIO
++       * on a Linux system where I was dropping commands right
++       * and left. It's not clear to me what the actual problem
++       * was.
++       *
++       * 23XX Cards do not support RIO. Instead they support ZIO.
++       */
++#if   0
++      if (!IS_23XX(isp) && ISP_FW_NEWER_THAN(isp, 1, 17, 0)) {
++              icbp->icb_xfwoptions |= ICBXOPT_RIO_16BIT;
++              icbp->icb_racctimer = 4;
++              icbp->icb_idelaytimer = 8;
++      }
++#endif
++#endif
++
++      /*
++       * For 22XX > 2.1.26 && 23XX, set someoptions.
++       * XXX: Probably okay for newer 2100 f/w too.
++       */
++      if (ISP_FW_NEWER_THAN(isp, 2, 26, 0)) {
++              /*
++               * Turn on LIP F8 async event (1)
++               * Turn on generate AE 8013 on all LIP Resets (2)
++               * Disable LIP F7 switching (8)
++               */
++              mbs.param[0] = MBOX_SET_FIRMWARE_OPTIONS;
++              mbs.param[1] = 0xb;
++              mbs.param[2] = 0;
++              mbs.param[3] = 0;
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++      }
++      icbp->icb_logintime = 30;       /* 30 second login timeout */
++
++      if (IS_23XX(isp)) {
++              ISP_WRITE(isp, isp->isp_rqstinrp, 0);
++              ISP_WRITE(isp, isp->isp_rqstoutrp, 0);
++              ISP_WRITE(isp, isp->isp_respinrp, 0);
++              ISP_WRITE(isp, isp->isp_respoutrp, 0);
++      }
++
++      nwwn = ISP_NODEWWN(isp);
++      pwwn = ISP_PORTWWN(isp);
++      if (nwwn && pwwn) {
++              icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS;
++              MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, nwwn);
++              MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, pwwn);
++              isp_prt(isp, ISP_LOGDEBUG1,
++                  "Setting ICB Node 0x%08x%08x Port 0x%08x%08x",
++                  ((u_int32_t) (nwwn >> 32)),
++                  ((u_int32_t) (nwwn & 0xffffffff)),
++                  ((u_int32_t) (pwwn >> 32)),
++                  ((u_int32_t) (pwwn & 0xffffffff)));
++      } else {
++              isp_prt(isp, ISP_LOGDEBUG1, "Not using any WWNs");
++              icbp->icb_fwoptions &= ~(ICBOPT_BOTH_WWNS|ICBOPT_FULL_LOGIN);
++      }
++      icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp);
++      icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp);
++      icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma);
++      icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma);
++      icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma);
++      icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma);
++      icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma);
++      icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma);
++      icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma);
++      icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma);
++      isp_prt(isp, ISP_LOGDEBUG0,
++          "isp_fibre_init: fwopt 0x%x xfwopt 0x%x zfwopt 0x%x",
++          icbp->icb_fwoptions, icbp->icb_xfwoptions, icbp->icb_zfwoptions);
++
++      FC_SCRATCH_ACQUIRE(isp);
++      isp_put_icb(isp, icbp, (isp_icb_t *)fcp->isp_scratch);
++
++      /*
++       * Init the firmware
++       */
++      mbs.param[0] = MBOX_INIT_FIRMWARE;
++      mbs.param[1] = 0;
++      mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++      mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++      mbs.param[4] = 0;
++      mbs.param[5] = 0;
++      mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++      mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      FC_SCRATCH_RELEASE(isp);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return;
++      }
++      isp->isp_reqidx = isp->isp_reqodx = 0;
++      isp->isp_residx = 0;
++      isp->isp_sendmarker = 1;
++
++      /*
++       * Whatever happens, we're now committed to being here.
++       */
++      isp->isp_state = ISP_INITSTATE;
++}
++
++/*
++ * Fibre Channel Support- get the port database for the id.
++ *
++ * Locks are held before coming here. Return 0 if success,
++ * else failure.
++ */
++
++static int
++isp_getmap(struct ispsoftc *isp, fcpos_map_t *map)
++{
++      fcparam *fcp = (fcparam *) isp->isp_param;
++      mbreg_t mbs;
++
++      mbs.param[0] = MBOX_GET_FC_AL_POSITION_MAP;
++      mbs.param[1] = 0;
++      mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++      mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++      /*
++       * Unneeded. For the 2100, except for initializing f/w, registers
++       * 4/5 have to not be written to.
++       *      mbs.param[4] = 0;
++       *      mbs.param[5] = 0;
++       *
++       */
++      mbs.param[6] = 0;
++      mbs.param[7] = 0;
++      FC_SCRATCH_ACQUIRE(isp);
++      isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
++      if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++              MEMCPY(map, fcp->isp_scratch, sizeof (fcpos_map_t));
++              map->fwmap = mbs.param[1] != 0;
++              FC_SCRATCH_RELEASE(isp);
++              return (0);
++      }
++      FC_SCRATCH_RELEASE(isp);
++      return (-1);
++}
++
++static void
++isp_mark_getpdb_all(struct ispsoftc *isp)
++{
++      fcparam *fcp = (fcparam *) isp->isp_param;
++      int i;
++      for (i = 0; i < MAX_FC_TARG; i++) {
++              fcp->portdb[i].valid = fcp->portdb[i].fabric_dev = 0;
++      }
++}
++
++static int
++isp_getpdb(struct ispsoftc *isp, int id, isp_pdb_t *pdbp)
++{
++      fcparam *fcp = (fcparam *) isp->isp_param;
++      mbreg_t mbs;
++
++      mbs.param[0] = MBOX_GET_PORT_DB;
++      mbs.param[1] = id << 8;
++      mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++      mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++      /*
++       * Unneeded. For the 2100, except for initializing f/w, registers
++       * 4/5 have to not be written to.
++       *      mbs.param[4] = 0;
++       *      mbs.param[5] = 0;
++       *
++       */
++      mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++      mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++      FC_SCRATCH_ACQUIRE(isp);
++      isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
++      if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++              isp_get_pdb(isp, (isp_pdb_t *)fcp->isp_scratch, pdbp);
++              FC_SCRATCH_RELEASE(isp);
++              return (0);
++      }
++      FC_SCRATCH_RELEASE(isp);
++      return (-1);
++}
++
++static u_int64_t
++isp_get_portname(struct ispsoftc *isp, int loopid, int nodename)
++{
++      u_int64_t wwn = 0;
++      mbreg_t mbs;
++
++      mbs.param[0] = MBOX_GET_PORT_NAME;
++      mbs.param[1] = loopid << 8;
++      if (nodename)
++              mbs.param[1] |= 1;
++      isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR);
++      if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++              wwn =
++                  (((u_int64_t)(mbs.param[2] & 0xff)) << 56) |
++                  (((u_int64_t)(mbs.param[2] >> 8))   << 48) |
++                  (((u_int64_t)(mbs.param[3] & 0xff)) << 40) |
++                  (((u_int64_t)(mbs.param[3] >> 8))   << 32) |
++                  (((u_int64_t)(mbs.param[6] & 0xff)) << 24) |
++                  (((u_int64_t)(mbs.param[6] >> 8))   << 16) |
++                  (((u_int64_t)(mbs.param[7] & 0xff)) <<  8) |
++                  (((u_int64_t)(mbs.param[7] >> 8)));
++      }
++      return (wwn);
++}
++
++/*
++ * Make sure we have good FC link and know our Loop ID.
++ */
++
++static int
++isp_fclink_test(struct ispsoftc *isp, int usdelay)
++{
++      static char *toponames[] = {
++              "Private Loop",
++              "FL Port",
++              "N-Port to N-Port",
++              "F Port",
++              "F Port (no FLOGI_ACC response)"
++      };
++      mbreg_t mbs;
++      int count, check_for_fabric;
++      u_int8_t lwfs;
++      fcparam *fcp;
++      struct lportdb *lp;
++      isp_pdb_t pdb;
++
++      fcp = isp->isp_param;
++
++      /*
++       * XXX: Here is where we would start a 'loop dead' timeout
++       */
++
++      /*
++       * Wait up to N microseconds for F/W to go to a ready state.
++       */
++      lwfs = FW_CONFIG_WAIT;
++      count = 0;
++      while (count < usdelay) {
++              u_int64_t enano;
++              u_int32_t wrk;
++              NANOTIME_T hra, hrb;
++
++              GET_NANOTIME(&hra);
++              isp_fw_state(isp);
++              if (lwfs != fcp->isp_fwstate) {
++                      isp_prt(isp, ISP_LOGINFO, "Firmware State <%s->%s>",
++                          isp2100_fw_statename((int)lwfs),
++                          isp2100_fw_statename((int)fcp->isp_fwstate));
++                      lwfs = fcp->isp_fwstate;
++              }
++              if (fcp->isp_fwstate == FW_READY) {
++                      break;
++              }
++              GET_NANOTIME(&hrb);
++
++              /*
++               * Get the elapsed time in nanoseconds.
++               * Always guaranteed to be non-zero.
++               */
++              enano = NANOTIME_SUB(&hrb, &hra);
++
++              isp_prt(isp, ISP_LOGDEBUG1,
++                  "usec%d: 0x%lx->0x%lx enano 0x%x%08x",
++                  count, (long) GET_NANOSEC(&hra), (long) GET_NANOSEC(&hrb),
++                  (u_int32_t)(enano >> 32), (u_int32_t)(enano & 0xffffffff));
++
++              /*
++               * If the elapsed time is less than 1 millisecond,
++               * delay a period of time up to that millisecond of
++               * waiting.
++               *
++               * This peculiar code is an attempt to try and avoid
++               * invoking u_int64_t math support functions for some
++               * platforms where linkage is a problem.
++               */
++              if (enano < (1000 * 1000)) {
++                      count += 1000;
++                      enano = (1000 * 1000) - enano;
++                      while (enano > (u_int64_t) 4000000000U) {
++                              USEC_SLEEP(isp, 4000000);
++                              enano -= (u_int64_t) 4000000000U;
++                      }
++                      wrk = enano;
++                      wrk /= 1000;
++                      USEC_SLEEP(isp, wrk);
++              } else {
++                      while (enano > (u_int64_t) 4000000000U) {
++                              count += 4000000;
++                              enano -= (u_int64_t) 4000000000U;
++                      }
++                      wrk = enano;
++                      count += (wrk / 1000);
++              }
++      }
++
++      /*
++       * If we haven't gone to 'ready' state, return.
++       */
++      if (fcp->isp_fwstate != FW_READY) {
++              return (-1);
++      }
++
++      /*
++       * Get our Loop ID (if possible). We really need to have it.
++       */
++      mbs.param[0] = MBOX_GET_LOOP_ID;
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              return (-1);
++      }
++      fcp->isp_loopid = mbs.param[1];
++      if (IS_2200(isp) || IS_23XX(isp)) {
++              int topo = (int) mbs.param[6];
++              if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB)
++                      topo = TOPO_PTP_STUB;
++              fcp->isp_topo = topo;
++      } else {
++              fcp->isp_topo = TOPO_NL_PORT;
++      }
++      fcp->isp_portid = fcp->isp_alpa = mbs.param[2] & 0xff;
++
++      /*
++       * Check to see if we're on a fabric by trying to see if we
++       * can talk to the fabric name server. This can be a bit
++       * tricky because if we're a 2100, we should check always
++       * (in case we're connected to a server doing aliasing).
++       */
++      fcp->isp_onfabric = 0;
++
++      if (IS_2100(isp)) {
++              /*
++               * Don't bother with fabric if we are using really old
++               * 2100 firmware. It's just not worth it.
++               */
++              if (ISP_FW_NEWER_THAN(isp, 1, 15, 37)) {
++                      check_for_fabric = 1;
++              } else {
++                      check_for_fabric = 0;
++              }
++      } else if (fcp->isp_topo == TOPO_FL_PORT ||
++          fcp->isp_topo == TOPO_F_PORT) {
++              check_for_fabric = 1;
++      } else
++              check_for_fabric = 0;
++
++      if (check_for_fabric && isp_getpdb(isp, FL_PORT_ID, &pdb) == 0) {
++              int loopid = FL_PORT_ID;
++              if (IS_2100(isp)) {
++                      fcp->isp_topo = TOPO_FL_PORT;
++              }
++
++              if (BITS2WORD(pdb.pdb_portid_bits) == 0) {
++                      /*
++                       * Crock.
++                       */
++                      fcp->isp_topo = TOPO_NL_PORT;
++                      goto not_on_fabric;
++              }
++              fcp->isp_portid = mbs.param[2] | ((int) mbs.param[3] << 16);
++
++              /*
++               * Save the Fabric controller's port database entry.
++               */
++              lp = &fcp->portdb[loopid];
++              lp->node_wwn =
++                  (((u_int64_t)pdb.pdb_nodename[0]) << 56) |
++                  (((u_int64_t)pdb.pdb_nodename[1]) << 48) |
++                  (((u_int64_t)pdb.pdb_nodename[2]) << 40) |
++                  (((u_int64_t)pdb.pdb_nodename[3]) << 32) |
++                  (((u_int64_t)pdb.pdb_nodename[4]) << 24) |
++                  (((u_int64_t)pdb.pdb_nodename[5]) << 16) |
++                  (((u_int64_t)pdb.pdb_nodename[6]) <<  8) |
++                  (((u_int64_t)pdb.pdb_nodename[7]));
++              lp->port_wwn =
++                  (((u_int64_t)pdb.pdb_portname[0]) << 56) |
++                  (((u_int64_t)pdb.pdb_portname[1]) << 48) |
++                  (((u_int64_t)pdb.pdb_portname[2]) << 40) |
++                  (((u_int64_t)pdb.pdb_portname[3]) << 32) |
++                  (((u_int64_t)pdb.pdb_portname[4]) << 24) |
++                  (((u_int64_t)pdb.pdb_portname[5]) << 16) |
++                  (((u_int64_t)pdb.pdb_portname[6]) <<  8) |
++                  (((u_int64_t)pdb.pdb_portname[7]));
++              lp->roles =
++                  (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
++              lp->portid = BITS2WORD(pdb.pdb_portid_bits);
++              lp->loopid = pdb.pdb_loopid;
++              lp->loggedin = lp->valid = 1;
++              fcp->isp_onfabric = 1;
++              (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
++              isp_register_fc4_type(isp);
++      } else {
++not_on_fabric:
++              fcp->isp_onfabric = 0;
++              fcp->portdb[FL_PORT_ID].valid = 0;
++      }
++
++      fcp->isp_gbspeed = 1;
++      if (IS_23XX(isp)) {
++              mbs.param[0] = MBOX_GET_SET_DATA_RATE;
++              mbs.param[1] = MBGSD_GET_RATE;
++              /* mbs.param[2] undefined if we're just getting rate */
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++                      if (mbs.param[1] == MBGSD_TWOGB) {
++                              isp_prt(isp, ISP_LOGINFO, "2Gb link speed/s");
++                              fcp->isp_gbspeed = 2;
++                      }
++              }
++      }
++
++      isp_prt(isp, ISP_LOGCONFIG, topology, fcp->isp_loopid, fcp->isp_alpa,
++          fcp->isp_portid, fcp->isp_loopstate, toponames[fcp->isp_topo]);
++
++      /*
++       * Announce ourselves, too. This involves synthesizing an entry.
++       */
++      if (fcp->isp_iid_set == 0) {
++              fcp->isp_iid_set = 1;
++              fcp->isp_iid = fcp->isp_loopid;
++              lp = &fcp->portdb[fcp->isp_iid];
++      } else {
++              lp = &fcp->portdb[fcp->isp_iid];
++              if (fcp->isp_portid != lp->portid ||
++                  fcp->isp_loopid != lp->loopid ||
++                  fcp->isp_nodewwn != ISP_NODEWWN(isp) ||
++                  fcp->isp_portwwn != ISP_PORTWWN(isp)) {
++                      lp->valid = 0;
++                      count = fcp->isp_iid;
++                      (void) isp_async(isp, ISPASYNC_PROMENADE, &count);
++              }
++      }
++      lp->loopid = fcp->isp_loopid;
++      lp->portid = fcp->isp_portid;
++      lp->node_wwn = ISP_NODEWWN(isp);
++      lp->port_wwn = ISP_PORTWWN(isp);
++      switch (isp->isp_role) {
++      case ISP_ROLE_NONE:
++              lp->roles = 0;
++              break;
++      case ISP_ROLE_TARGET:
++              lp->roles = SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT;
++              break;
++      case ISP_ROLE_INITIATOR:
++              lp->roles = SVC3_INI_ROLE >> SVC3_ROLE_SHIFT;
++              break;
++      case ISP_ROLE_BOTH:
++              lp->roles = (SVC3_INI_ROLE|SVC3_TGT_ROLE) >> SVC3_ROLE_SHIFT;
++              break;
++      }
++      lp->loggedin = lp->valid = 1;
++      count = fcp->isp_iid;
++      (void) isp_async(isp, ISPASYNC_PROMENADE, &count);
++      return (0);
++}
++
++static char *
++isp2100_fw_statename(int state)
++{
++      switch(state) {
++      case FW_CONFIG_WAIT:    return "Config Wait";
++      case FW_WAIT_AL_PA:     return "Waiting for AL_PA";
++      case FW_WAIT_LOGIN:     return "Wait Login";
++      case FW_READY:          return "Ready";
++      case FW_LOSS_OF_SYNC:   return "Loss Of Sync";
++      case FW_ERROR:          return "Error";
++      case FW_REINIT:         return "Re-Init";
++      case FW_NON_PART:       return "Nonparticipating";
++      default:                return "?????";
++      }
++}
++
++/*
++ * Synchronize our soft copy of the port database with what the f/w thinks
++ * (with a view toward possibly for a specific target....)
++ */
++
++static int
++isp_pdb_sync(struct ispsoftc *isp)
++{
++      struct lportdb *lp;
++      fcparam *fcp = isp->isp_param;
++      isp_pdb_t pdb;
++      int loopid, base, lim;
++
++      /*
++       * Make sure we're okay for doing this right now.
++       */
++      if (fcp->isp_loopstate != LOOP_PDB_RCVD &&
++          fcp->isp_loopstate != LOOP_FSCAN_DONE &&
++          fcp->isp_loopstate != LOOP_LSCAN_DONE) {
++              return (-1);
++      }
++
++      if (fcp->isp_topo == TOPO_FL_PORT || fcp->isp_topo == TOPO_NL_PORT ||
++          fcp->isp_topo == TOPO_N_PORT) {
++              if (fcp->isp_loopstate < LOOP_LSCAN_DONE) {
++                      if (isp_scan_loop(isp) != 0) {
++                              return (-1);
++                      }
++              }
++      }
++      fcp->isp_loopstate = LOOP_SYNCING_PDB;
++
++      /*
++       * If we get this far, we've settled our differences with the f/w
++       * (for local loop device) and we can say that the loop state is ready.
++       */
++
++      if (fcp->isp_topo == TOPO_NL_PORT) {
++              fcp->loop_seen_once = 1;
++              fcp->isp_loopstate = LOOP_READY;
++              return (0);
++      }
++
++      /*
++       * Find all Fabric Entities that didn't make it from one scan to the
++       * next and let the world know they went away. Scan the whole database.
++       */
++      for (lp = &fcp->portdb[0]; lp < &fcp->portdb[MAX_FC_TARG]; lp++) {
++              if (lp->was_fabric_dev && lp->fabric_dev == 0) {
++                      loopid = lp - fcp->portdb;
++                      lp->valid = 0;  /* should already be set */
++                      (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
++                      MEMZERO((void *) lp, sizeof (*lp));
++                      continue;
++              }
++              lp->was_fabric_dev = lp->fabric_dev;
++      }
++
++      if (fcp->isp_topo == TOPO_FL_PORT)
++              base = FC_SNS_ID+1;
++      else
++              base = 0;
++
++      if (fcp->isp_topo == TOPO_N_PORT)
++              lim = 1;
++      else
++              lim = MAX_FC_TARG;
++
++      /*
++       * Now log in any fabric devices that the outer layer has
++       * left for us to see. This seems the most sane policy
++       * for the moment.
++       */
++      for (lp = &fcp->portdb[base]; lp < &fcp->portdb[lim]; lp++) {
++              u_int32_t portid;
++              mbreg_t mbs;
++
++              loopid = lp - fcp->portdb;
++              if (loopid >= FL_PORT_ID && loopid <= FC_SNS_ID) {
++                      continue;
++              }
++
++              /*
++               * Anything here?
++               */
++              if (lp->port_wwn == 0) {
++                      continue;
++              }
++
++              /*
++               * Don't try to log into yourself.
++               */
++              if ((portid = lp->portid) == fcp->isp_portid) {
++                      continue;
++              }
++
++
++              /*
++               * If we'd been logged in- see if we still are and we haven't
++               * changed. If so, no need to log ourselves out, etc..
++               *
++               * Unfortunately, our charming Qlogic f/w has decided to
++               * return a valid port database entry for a fabric device
++               * that has, in fact, gone away. And it hangs trying to
++               * log it out.
++               */
++              if (lp->loggedin && lp->force_logout == 0 &&
++                  isp_getpdb(isp, lp->loopid, &pdb) == 0) {
++                      int nrole;
++                      u_int64_t nwwnn, nwwpn;
++                      nwwnn =
++                          (((u_int64_t)pdb.pdb_nodename[0]) << 56) |
++                          (((u_int64_t)pdb.pdb_nodename[1]) << 48) |
++                          (((u_int64_t)pdb.pdb_nodename[2]) << 40) |
++                          (((u_int64_t)pdb.pdb_nodename[3]) << 32) |
++                          (((u_int64_t)pdb.pdb_nodename[4]) << 24) |
++                          (((u_int64_t)pdb.pdb_nodename[5]) << 16) |
++                          (((u_int64_t)pdb.pdb_nodename[6]) <<  8) |
++                          (((u_int64_t)pdb.pdb_nodename[7]));
++                      nwwpn =
++                          (((u_int64_t)pdb.pdb_portname[0]) << 56) |
++                          (((u_int64_t)pdb.pdb_portname[1]) << 48) |
++                          (((u_int64_t)pdb.pdb_portname[2]) << 40) |
++                          (((u_int64_t)pdb.pdb_portname[3]) << 32) |
++                          (((u_int64_t)pdb.pdb_portname[4]) << 24) |
++                          (((u_int64_t)pdb.pdb_portname[5]) << 16) |
++                          (((u_int64_t)pdb.pdb_portname[6]) <<  8) |
++                          (((u_int64_t)pdb.pdb_portname[7]));
++                      nrole = (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >>
++                          SVC3_ROLE_SHIFT;
++                      if (pdb.pdb_loopid == lp->loopid && lp->portid ==
++                          (u_int32_t) BITS2WORD(pdb.pdb_portid_bits) &&
++                          nwwnn == lp->node_wwn && nwwpn == lp->port_wwn &&
++                          lp->roles == nrole && lp->force_logout == 0) {
++                              lp->loggedin = lp->valid = 1;
++                              isp_prt(isp, ISP_LOGCONFIG, lretained,
++                                  (int) (lp - fcp->portdb),
++                                  (int) lp->loopid, lp->portid);
++                              continue;
++                      }
++              }
++
++              if (fcp->isp_fwstate != FW_READY ||
++                  fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++                      return (-1);
++              }
++
++              /*
++               * Force a logout if we were logged in.
++               */
++              if (lp->loggedin) {
++                      if (lp->force_logout ||
++                          isp_getpdb(isp, lp->loopid, &pdb) == 0) {
++                              mbs.param[0] = MBOX_FABRIC_LOGOUT;
++                              mbs.param[1] = lp->loopid << 8;
++                              mbs.param[2] = 0;
++                              mbs.param[3] = 0;
++                              isp_mboxcmd(isp, &mbs, MBLOGNONE);
++                              isp_prt(isp, ISP_LOGINFO, plogout,
++                                  (int) (lp - fcp->portdb), lp->loopid,
++                                  lp->portid);
++                      }
++                      lp->force_logout = lp->loggedin = 0;
++                      if (fcp->isp_fwstate != FW_READY ||
++                          fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++                              return (-1);
++                      }
++              }
++
++              /*
++               * And log in....
++               */
++              loopid = lp - fcp->portdb;
++              lp->loopid = FL_PORT_ID;
++              do {
++                      mbs.param[0] = MBOX_FABRIC_LOGIN;
++                      mbs.param[1] = loopid << 8;
++                      mbs.param[2] = portid >> 16;
++                      mbs.param[3] = portid & 0xffff;
++                      isp_mboxcmd(isp, &mbs, MBLOGALL & ~(MBOX_LOOP_ID_USED |
++                          MBOX_PORT_ID_USED | MBOX_COMMAND_ERROR));
++                      if (fcp->isp_fwstate != FW_READY ||
++                          fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++                              return (-1);
++                      }
++                      switch (mbs.param[0]) {
++                      case MBOX_LOOP_ID_USED:
++                              /*
++                               * Try the next available loop id.
++                               */
++                              loopid++;
++                              break;
++                      case MBOX_PORT_ID_USED:
++                              /*
++                               * This port is already logged in.
++                               * Snaffle the loop id it's using if it's
++                               * nonzero, otherwise we're hosed.
++                               */
++                              if (mbs.param[1] != 0) {
++                                      loopid = mbs.param[1];
++                                      isp_prt(isp, ISP_LOGINFO, retained,
++                                          loopid, (int) (lp - fcp->portdb),
++                                          lp->portid);
++                              } else {
++                                      loopid = MAX_FC_TARG;
++                                      break;
++                              }
++                              /* FALLTHROUGH */
++                      case MBOX_COMMAND_COMPLETE:
++                              lp->loggedin = 1;
++                              lp->loopid = loopid;
++                              break;
++                      case MBOX_COMMAND_ERROR:
++                              isp_prt(isp, ISP_LOGINFO, plogierr,
++                                  portid, mbs.param[1]);
++                              /* FALLTHROUGH */
++                      case MBOX_ALL_IDS_USED: /* We're outta IDs */
++                      default:
++                              loopid = MAX_FC_TARG;
++                              break;
++                      }
++              } while (lp->loopid == FL_PORT_ID && loopid < MAX_FC_TARG);
++
++              /*
++               * If we get here and we haven't set a Loop ID,
++               * we failed to log into this device.
++               */
++
++              if (lp->loopid == FL_PORT_ID) {
++                      lp->loopid = 0;
++                      continue;
++              }
++
++              /*
++               * Make sure we can get the approriate port information.
++               */
++              if (isp_getpdb(isp, lp->loopid, &pdb) != 0) {
++                      isp_prt(isp, ISP_LOGWARN, nopdb, lp->portid);
++                      goto dump_em;
++              }
++
++              if (fcp->isp_fwstate != FW_READY ||
++                  fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++                      return (-1);
++              }
++
++              if (pdb.pdb_loopid != lp->loopid) {
++                      isp_prt(isp, ISP_LOGWARN, pdbmfail1,
++                          lp->portid, pdb.pdb_loopid);
++                      goto dump_em;
++              }
++
++              if (lp->portid != (u_int32_t) BITS2WORD(pdb.pdb_portid_bits)) {
++                      isp_prt(isp, ISP_LOGWARN, pdbmfail2,
++                          lp->portid, BITS2WORD(pdb.pdb_portid_bits));
++                      goto dump_em;
++              }
++
++              lp->roles =
++                  (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
++              lp->node_wwn =
++                  (((u_int64_t)pdb.pdb_nodename[0]) << 56) |
++                  (((u_int64_t)pdb.pdb_nodename[1]) << 48) |
++                  (((u_int64_t)pdb.pdb_nodename[2]) << 40) |
++                  (((u_int64_t)pdb.pdb_nodename[3]) << 32) |
++                  (((u_int64_t)pdb.pdb_nodename[4]) << 24) |
++                  (((u_int64_t)pdb.pdb_nodename[5]) << 16) |
++                  (((u_int64_t)pdb.pdb_nodename[6]) <<  8) |
++                  (((u_int64_t)pdb.pdb_nodename[7]));
++              lp->port_wwn =
++                  (((u_int64_t)pdb.pdb_portname[0]) << 56) |
++                  (((u_int64_t)pdb.pdb_portname[1]) << 48) |
++                  (((u_int64_t)pdb.pdb_portname[2]) << 40) |
++                  (((u_int64_t)pdb.pdb_portname[3]) << 32) |
++                  (((u_int64_t)pdb.pdb_portname[4]) << 24) |
++                  (((u_int64_t)pdb.pdb_portname[5]) << 16) |
++                  (((u_int64_t)pdb.pdb_portname[6]) <<  8) |
++                  (((u_int64_t)pdb.pdb_portname[7]));
++              /*
++               * Check to make sure this all makes sense.
++               */
++              if (lp->node_wwn && lp->port_wwn) {
++                      lp->valid = 1;
++                      loopid = lp - fcp->portdb;
++                      (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
++                      continue;
++              }
++dump_em:
++              lp->valid = 0;
++              isp_prt(isp, ISP_LOGINFO,
++                  ldumped, loopid, lp->loopid, lp->portid);
++              mbs.param[0] = MBOX_FABRIC_LOGOUT;
++              mbs.param[1] = lp->loopid << 8;
++              mbs.param[2] = 0;
++              mbs.param[3] = 0;
++              isp_mboxcmd(isp, &mbs, MBLOGNONE);
++              if (fcp->isp_fwstate != FW_READY ||
++                  fcp->isp_loopstate != LOOP_SYNCING_PDB) {
++                      return (-1);
++              }
++      }
++      /*
++       * If we get here, we've for sure seen not only a valid loop
++       * but know what is or isn't on it, so mark this for usage
++       * in isp_start.
++       */
++      fcp->loop_seen_once = 1;
++      fcp->isp_loopstate = LOOP_READY;
++      return (0);
++}
++
++static int
++isp_scan_loop(struct ispsoftc *isp)
++{
++      struct lportdb *lp;
++      fcparam *fcp = isp->isp_param;
++      isp_pdb_t pdb;
++      int loopid, lim, hival;
++
++      switch (fcp->isp_topo) {
++      case TOPO_NL_PORT:
++              hival = FL_PORT_ID;
++              break;
++      case TOPO_N_PORT:
++              hival = 2;
++              break;
++      case TOPO_FL_PORT:
++              hival = FC_PORT_ID;
++              break;
++      default:
++              fcp->isp_loopstate = LOOP_LSCAN_DONE;
++              return (0);
++      }
++      fcp->isp_loopstate = LOOP_SCANNING_LOOP;
++
++      /*
++       * make sure the temp port database is clean...
++       */
++      MEMZERO((void *)fcp->tport, sizeof (fcp->tport));
++
++      /*
++       * Run through the local loop ports and get port database info
++       * for each loop ID.
++       *
++       * There's a somewhat unexplained situation where the f/w passes back
++       * the wrong database entity- if that happens, just restart (up to
++       * FL_PORT_ID times).
++       */
++      for (lim = loopid = 0; loopid < hival; loopid++) {
++              lp = &fcp->tport[loopid];
++
++              /*
++               * Don't even try for ourselves...
++               */
++              if (loopid == fcp->isp_loopid)
++                      continue;
++
++              lp->node_wwn = isp_get_portname(isp, loopid, 1);
++              if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
++                      return (-1);
++              if (lp->node_wwn == 0)
++                      continue;
++              lp->port_wwn = isp_get_portname(isp, loopid, 0);
++              if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
++                      return (-1);
++              if (lp->port_wwn == 0) {
++                      lp->node_wwn = 0;
++                      continue;
++              }
++
++              /*
++               * Get an entry....
++               */
++              if (isp_getpdb(isp, loopid, &pdb) != 0) {
++                      if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
++                              return (-1);
++                      continue;
++              }
++              if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) {
++                      return (-1);
++              }
++
++              /*
++               * If the returned database element doesn't match what we
++               * asked for, restart the process entirely (up to a point...).
++               */
++              if (pdb.pdb_loopid != loopid) {
++                      loopid = 0;
++                      if (lim++ < hival) {
++                              continue;
++                      }
++                      isp_prt(isp, ISP_LOGWARN,
++                          "giving up on synchronizing the port database");
++                      return (-1);
++              }
++
++              /*
++               * Save the pertinent info locally.
++               */
++              lp->node_wwn =
++                  (((u_int64_t)pdb.pdb_nodename[0]) << 56) |
++                  (((u_int64_t)pdb.pdb_nodename[1]) << 48) |
++                  (((u_int64_t)pdb.pdb_nodename[2]) << 40) |
++                  (((u_int64_t)pdb.pdb_nodename[3]) << 32) |
++                  (((u_int64_t)pdb.pdb_nodename[4]) << 24) |
++                  (((u_int64_t)pdb.pdb_nodename[5]) << 16) |
++                  (((u_int64_t)pdb.pdb_nodename[6]) <<  8) |
++                  (((u_int64_t)pdb.pdb_nodename[7]));
++              lp->port_wwn =
++                  (((u_int64_t)pdb.pdb_portname[0]) << 56) |
++                  (((u_int64_t)pdb.pdb_portname[1]) << 48) |
++                  (((u_int64_t)pdb.pdb_portname[2]) << 40) |
++                  (((u_int64_t)pdb.pdb_portname[3]) << 32) |
++                  (((u_int64_t)pdb.pdb_portname[4]) << 24) |
++                  (((u_int64_t)pdb.pdb_portname[5]) << 16) |
++                  (((u_int64_t)pdb.pdb_portname[6]) <<  8) |
++                  (((u_int64_t)pdb.pdb_portname[7]));
++              lp->roles =
++                  (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
++              lp->portid = BITS2WORD(pdb.pdb_portid_bits);
++              lp->loopid = pdb.pdb_loopid;
++      }
++
++      /*
++       * Mark all of the permanent local loop database entries as invalid
++       * (except our own entry).
++       */
++      for (loopid = 0; loopid < hival; loopid++) {
++              if (loopid == fcp->isp_iid) {
++                      fcp->portdb[loopid].valid = 1;
++                      fcp->portdb[loopid].loopid = fcp->isp_loopid;
++                      continue;
++              }
++              fcp->portdb[loopid].valid = 0;
++      }
++
++      /*
++       * Now merge our local copy of the port database into our saved copy.
++       * Notify the outer layers of new devices arriving.
++       */
++      for (loopid = 0; loopid < hival; loopid++) {
++              int i;
++
++              /*
++               * If we don't have a non-zero Port WWN, we're not here.
++               */
++              if (fcp->tport[loopid].port_wwn == 0) {
++                      continue;
++              }
++
++              /*
++               * Skip ourselves.
++               */
++              if (loopid == fcp->isp_iid) {
++                      continue;
++              }
++
++              /*
++               * For the purposes of deciding whether this is the
++               * 'same' device or not, we only search for an identical
++               * Port WWN. Node WWNs may or may not be the same as
++               * the Port WWN, and there may be multiple different
++               * Port WWNs with the same Node WWN. It would be chaos
++               * to have multiple identical Port WWNs, so we don't
++               * allow that.
++               */
++
++              for (i = 0; i < hival; i++) {
++                      int j;
++                      if (fcp->portdb[i].port_wwn == 0)
++                              continue;
++                      if (fcp->portdb[i].port_wwn !=
++                          fcp->tport[loopid].port_wwn)
++                              continue;
++                      /*
++                       * We found this WWN elsewhere- it's changed
++                       * loopids then. We don't change it's actual
++                       * position in our cached port database- we
++                       * just change the actual loop ID we'd use.
++                       */
++                      if (fcp->portdb[i].loopid != loopid) {
++                              isp_prt(isp, ISP_LOGINFO, portshift, i,
++                                  fcp->portdb[i].loopid,
++                                  fcp->portdb[i].portid, loopid,
++                                  fcp->tport[loopid].portid);
++                      }
++                      fcp->portdb[i].portid = fcp->tport[loopid].portid;
++                      fcp->portdb[i].loopid = loopid;
++                      fcp->portdb[i].valid = 1;
++                      fcp->portdb[i].roles = fcp->tport[loopid].roles;
++
++                      /*
++                       * Now make sure this Port WWN doesn't exist elsewhere
++                       * in the port database.
++                       */
++                      for (j = i+1; j < hival; j++) {
++                              if (fcp->portdb[i].port_wwn !=
++                                  fcp->portdb[j].port_wwn) {
++                                      continue;
++                              }
++                              isp_prt(isp, ISP_LOGWARN, portdup, j, i);
++                              /*
++                               * Invalidate the 'old' *and* 'new' ones.
++                               * This is really harsh and not quite right,
++                               * but if this happens, we really don't know
++                               * who is what at this point.
++                               */
++                              fcp->portdb[i].valid = 0;
++                              fcp->portdb[j].valid = 0;
++                      }
++                      break;
++              }
++
++              /*
++               * If we didn't traverse the entire port database,
++               * then we found (and remapped) an existing entry.
++               * No need to notify anyone- go for the next one.
++               */
++              if (i < hival) {
++                      isp_prt(isp, ISP_LOGINFO, retained,
++                          fcp->portdb[i].loopid, i, fcp->portdb[i].portid);
++                      continue;
++              }
++
++              /*
++               * We've not found this Port WWN anywhere. It's a new entry.
++               * See if we can leave it where it is (with target == loopid).
++               */
++              if (fcp->portdb[loopid].port_wwn != 0) {
++                      for (lim = 0; lim < hival; lim++) {
++                              if (fcp->portdb[lim].port_wwn == 0)
++                                      break;
++                      }
++                      /* "Cannot Happen" */
++                      if (lim == hival) {
++                              isp_prt(isp, ISP_LOGWARN, "Remap Overflow");
++                              continue;
++                      }
++                      i = lim;
++              } else {
++                      i = loopid;
++              }
++
++              /*
++               * NB:  The actual loopid we use here is loopid- we may
++               *      in fact be at a completely different index (target).
++               */
++              fcp->portdb[i].loopid = loopid;
++              fcp->portdb[i].port_wwn = fcp->tport[loopid].port_wwn;
++              fcp->portdb[i].node_wwn = fcp->tport[loopid].node_wwn;
++              fcp->portdb[i].roles = fcp->tport[loopid].roles;
++              fcp->portdb[i].portid = fcp->tport[loopid].portid;
++              fcp->portdb[i].valid = 1;
++
++              /*
++               * Tell the outside world we've arrived.
++               */
++              (void) isp_async(isp, ISPASYNC_PROMENADE, &i);
++      }
++
++      /*
++       * Now find all previously used targets that are now invalid and
++       * notify the outer layers that they're gone.
++       */
++      for (lp = &fcp->portdb[0]; lp < &fcp->portdb[hival]; lp++) {
++              if (lp->valid || lp->port_wwn == 0) {
++                      continue;
++              }
++
++              /*
++               * Tell the outside world we've gone
++               * away and erase our pdb entry.
++               *
++               */
++              loopid = lp - fcp->portdb;
++              (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid);
++              MEMZERO((void *) lp, sizeof (*lp));
++      }
++      fcp->isp_loopstate = LOOP_LSCAN_DONE;
++      return (0);
++}
++
++
++static int
++isp_fabric_mbox_cmd(struct ispsoftc *isp, mbreg_t *mbp)
++{
++      isp_mboxcmd(isp, mbp, MBLOGNONE);
++      if (mbp->param[0] != MBOX_COMMAND_COMPLETE) {
++              if (FCPARAM(isp)->isp_loopstate == LOOP_SCANNING_FABRIC) {
++                      FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
++              }
++              if (mbp->param[0] == MBOX_COMMAND_ERROR) {
++                      char tbuf[16];
++                      char *m;
++                      switch (mbp->param[1]) {
++                      case 1:
++                              m = "No Loop";
++                              break;
++                      case 2:
++                              m = "Failed to allocate IOCB buffer";
++                              break;
++                      case 3:
++                              m = "Failed to allocate XCB buffer";
++                              break;
++                      case 4:
++                              m = "timeout or transmit failed";
++                              break;
++                      case 5:
++                              m = "no fabric loop";
++                              break;
++                      case 6:
++                              m = "remote device not a target";
++                              break;
++                      default:
++                              SNPRINTF(tbuf, sizeof tbuf, "%x",
++                                  mbp->param[1]);
++                              m = tbuf;
++                              break;
++                      }
++                      isp_prt(isp, ISP_LOGERR, "SNS Failed- %s", m);
++              }
++              return (-1);
++      }
++
++      if (FCPARAM(isp)->isp_fwstate != FW_READY ||
++          FCPARAM(isp)->isp_loopstate < LOOP_SCANNING_FABRIC) {
++              return (-1);
++      }
++      return(0);
++}
++
++#ifdef        ISP_USE_GA_NXT
++static int
++isp_scan_fabric(struct ispsoftc *isp, int ftype)
++{
++      fcparam *fcp = isp->isp_param;
++      u_int32_t portid, first_portid, last_portid;
++      int hicap, last_port_same;
++
++      if (fcp->isp_onfabric == 0) {
++              fcp->isp_loopstate = LOOP_FSCAN_DONE;
++              return (0);
++      }
++
++      FC_SCRATCH_ACQUIRE(isp);
++
++      /*
++       * Since Port IDs are 24 bits, we can check against having seen
++       * anything yet with this value.
++       */
++      last_port_same = 0;
++      last_portid = 0xffffffff;       /* not a port */
++      first_portid = portid = fcp->isp_portid;
++      fcp->isp_loopstate = LOOP_SCANNING_FABRIC;
++
++      for (hicap = 0; hicap < GA_NXT_MAX; hicap++) {
++              mbreg_t mbs;
++              sns_screq_t *rq;
++              sns_ga_nxt_rsp_t *rs0, *rs1;
++              struct lportdb lcl;
++              u_int8_t sc[SNS_GA_NXT_RESP_SIZE];
++
++              rq = (sns_screq_t *)sc;
++              MEMZERO((void *) rq, SNS_GA_NXT_REQ_SIZE);
++              rq->snscb_rblen = SNS_GA_NXT_RESP_SIZE >> 1;
++              rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+0x100);
++              rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+0x100);
++              rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+0x100);
++              rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+0x100);
++              rq->snscb_sblen = 6;
++              rq->snscb_data[0] = SNS_GA_NXT;
++              rq->snscb_data[4] = portid & 0xffff;
++              rq->snscb_data[5] = (portid >> 16) & 0xff;
++              isp_put_sns_request(isp, rq, (sns_screq_t *) fcp->isp_scratch);
++              MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GA_NXT_REQ_SIZE);
++              mbs.param[0] = MBOX_SEND_SNS;
++              mbs.param[1] = SNS_GA_NXT_REQ_SIZE >> 1;
++              mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++              mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++              /*
++               * Leave 4 and 5 alone
++               */
++              mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++              mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++              if (isp_fabric_mbox_cmd(isp, &mbs)) {
++                      if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++                              fcp->isp_loopstate = LOOP_PDB_RCVD;
++                      }
++                      FC_SCRATCH_RELEASE(isp);
++                      return (-1);
++              }
++              MEMORYBARRIER(isp, SYNC_SFORCPU, 0x100, SNS_GA_NXT_RESP_SIZE);
++              rs1 = (sns_ga_nxt_rsp_t *) sc;
++              rs0 = (sns_ga_nxt_rsp_t *) ((u_int8_t *)fcp->isp_scratch+0x100);
++              isp_get_ga_nxt_response(isp, rs0, rs1);
++              if (rs1->snscb_cthdr.ct_response != FS_ACC) {
++                      int level;
++                      if (rs1->snscb_cthdr.ct_reason == 9 &&
++                          rs1->snscb_cthdr.ct_explanation == 7)
++                              level = ISP_LOGDEBUG0;
++                      else
++                              level = ISP_LOGWARN;
++                      isp_prt(isp, level, swrej, "GA_NXT",
++                          rs1->snscb_cthdr.ct_reason,
++                          rs1->snscb_cthdr.ct_explanation, portid);
++                      FC_SCRATCH_RELEASE(isp);
++                      fcp->isp_loopstate = LOOP_FSCAN_DONE;
++                      return (0);
++              }
++              portid =
++                  (((u_int32_t) rs1->snscb_port_id[0]) << 16) |
++                  (((u_int32_t) rs1->snscb_port_id[1]) << 8) |
++                  (((u_int32_t) rs1->snscb_port_id[2]));
++
++              /*
++               * XXX: We should check to make sure that this entry
++               * XXX: supports the type(s) we are interested in.
++               */
++              /*
++               * Okay, we now have information about a fabric object.
++               * If it is the type we're interested in, tell the outer layers
++               * about it. The outer layer needs to  know: Port ID, WWNN,
++               * WWPN, FC4 type, and port type.
++               *
++               * The lportdb structure is adequate for this.
++               */
++              MEMZERO(&lcl, sizeof (lcl));
++              lcl.port_type = rs1->snscb_port_type;
++              lcl.fc4_type = ftype;
++              lcl.portid = portid;
++              lcl.node_wwn =
++                  (((u_int64_t)rs1->snscb_nodename[0]) << 56) |
++                  (((u_int64_t)rs1->snscb_nodename[1]) << 48) |
++                  (((u_int64_t)rs1->snscb_nodename[2]) << 40) |
++                  (((u_int64_t)rs1->snscb_nodename[3]) << 32) |
++                  (((u_int64_t)rs1->snscb_nodename[4]) << 24) |
++                  (((u_int64_t)rs1->snscb_nodename[5]) << 16) |
++                  (((u_int64_t)rs1->snscb_nodename[6]) <<  8) |
++                  (((u_int64_t)rs1->snscb_nodename[7]));
++              lcl.port_wwn =
++                  (((u_int64_t)rs1->snscb_portname[0]) << 56) |
++                  (((u_int64_t)rs1->snscb_portname[1]) << 48) |
++                  (((u_int64_t)rs1->snscb_portname[2]) << 40) |
++                  (((u_int64_t)rs1->snscb_portname[3]) << 32) |
++                  (((u_int64_t)rs1->snscb_portname[4]) << 24) |
++                  (((u_int64_t)rs1->snscb_portname[5]) << 16) |
++                  (((u_int64_t)rs1->snscb_portname[6]) <<  8) |
++                  (((u_int64_t)rs1->snscb_portname[7]));
++
++              /*
++               * Does this fabric object support the type we want?
++               * If not, skip it.
++               */
++              if (rs1->snscb_fc4_types[ftype >> 5] & (1 << (ftype & 0x1f))) {
++                      if (first_portid == portid) {
++                              lcl.last_fabric_dev = 1;
++                      } else {
++                              lcl.last_fabric_dev = 0;
++                      }
++                      (void) isp_async(isp, ISPASYNC_FABRIC_DEV, &lcl);
++              } else {
++                      isp_prt(isp, ISP_LOGDEBUG0,
++                          "PortID 0x%x doesn't support FC4 type 0x%x",
++                          portid, ftype);
++              }
++              if (first_portid == portid) {
++                      fcp->isp_loopstate = LOOP_FSCAN_DONE;
++                      FC_SCRATCH_RELEASE(isp);
++                      return (0);
++              }
++              if (portid == last_portid) {
++                      if (last_port_same++ > 20) {
++                              isp_prt(isp, ISP_LOGWARN,
++                                  "tangled fabric database detected");
++                              break;
++                      }
++              } else {
++                      last_port_same = 0 ;
++                      last_portid = portid;
++              }
++      }
++      FC_SCRATCH_RELEASE(isp);
++      if (hicap >= GA_NXT_MAX) {
++              isp_prt(isp, ISP_LOGWARN, "fabric too big (> %d)", GA_NXT_MAX);
++      }
++      fcp->isp_loopstate = LOOP_FSCAN_DONE;
++      return (0);
++}
++#else
++#define       GIDLEN  ((ISP2100_SCRLEN >> 1) + 16)
++#define       NGENT   ((GIDLEN - 16) >> 2)
++
++#define       IGPOFF  (ISP2100_SCRLEN - GIDLEN)
++#define       GXOFF   (256)
++
++static int
++isp_scan_fabric(struct ispsoftc *isp, int ftype)
++{
++      fcparam *fcp = FCPARAM(isp);
++      mbreg_t mbs;
++      int i;
++      sns_gid_ft_req_t *rq;
++      sns_gid_ft_rsp_t *rs0, *rs1;
++
++      if (fcp->isp_onfabric == 0) {
++              fcp->isp_loopstate = LOOP_FSCAN_DONE;
++              return (0);
++      }
++
++      FC_SCRATCH_ACQUIRE(isp);
++      fcp->isp_loopstate = LOOP_SCANNING_FABRIC;
++
++      rq = (sns_gid_ft_req_t *)fcp->tport;
++      MEMZERO((void *) rq, SNS_GID_FT_REQ_SIZE);
++      rq->snscb_rblen = GIDLEN >> 1;
++      rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+IGPOFF);
++      rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+IGPOFF);
++      rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+IGPOFF);
++      rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+IGPOFF);
++      rq->snscb_sblen = 6;
++      rq->snscb_cmd = SNS_GID_FT;
++      rq->snscb_mword_div_2 = NGENT;
++      rq->snscb_fc4_type = ftype;
++      isp_put_gid_ft_request(isp, rq, (sns_gid_ft_req_t *) fcp->isp_scratch);
++      MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GID_FT_REQ_SIZE);
++      mbs.param[0] = MBOX_SEND_SNS;
++      mbs.param[1] = SNS_GID_FT_REQ_SIZE >> 1;
++      mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++      mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++
++      /*
++       * Leave 4 and 5 alone
++       */
++      mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++      mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++      if (isp_fabric_mbox_cmd(isp, &mbs)) {
++              if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++                      fcp->isp_loopstate = LOOP_PDB_RCVD;
++              }
++              FC_SCRATCH_RELEASE(isp);
++              return (-1);
++      }
++      if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++              FC_SCRATCH_RELEASE(isp);
++              return (-1);
++      }
++      MEMORYBARRIER(isp, SYNC_SFORCPU, IGPOFF, GIDLEN);
++      rs1 = (sns_gid_ft_rsp_t *) fcp->tport;
++      rs0 = (sns_gid_ft_rsp_t *) ((u_int8_t *)fcp->isp_scratch+IGPOFF);
++      isp_get_gid_ft_response(isp, rs0, rs1, NGENT);
++      if (rs1->snscb_cthdr.ct_response != FS_ACC) {
++              int level;
++              if (rs1->snscb_cthdr.ct_reason == 9 &&
++                  rs1->snscb_cthdr.ct_explanation == 7)
++                      level = ISP_LOGDEBUG0;
++              else
++                      level = ISP_LOGWARN;
++              isp_prt(isp, level, swrej, "GID_FT",
++                  rs1->snscb_cthdr.ct_reason,
++                  rs1->snscb_cthdr.ct_explanation, 0);
++              FC_SCRATCH_RELEASE(isp);
++              fcp->isp_loopstate = LOOP_FSCAN_DONE;
++              return (0);
++      }
++
++      /*
++       * Okay, we now have a list of Port IDs for this class of device.
++       * Go through the list and for each one get the WWPN/WWNN for it
++       * and tell the outer layers about it. The outer layer needs to
++       * know: Port ID, WWNN, WWPN, FC4 type, and (possibly) port type.
++       *
++       * The lportdb structure is adequate for this.
++       */
++      i = -1;
++      do {
++              sns_gxn_id_req_t grqbuf, *gq = &grqbuf;
++              sns_gxn_id_rsp_t *gs0, grsbuf, *gs1 = &grsbuf;
++              struct lportdb lcl;
++#if   0
++              sns_gff_id_rsp_t *fs0, ffsbuf, *fs1 = &ffsbuf;
++#endif
++
++              i++;
++              MEMZERO(&lcl, sizeof (lcl));
++              lcl.fc4_type = ftype;
++              lcl.portid =
++                  (((u_int32_t) rs1->snscb_ports[i].portid[0]) << 16) |
++                  (((u_int32_t) rs1->snscb_ports[i].portid[1]) << 8) |
++                  (((u_int32_t) rs1->snscb_ports[i].portid[2]));
++
++              MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
++              gq->snscb_rblen = SNS_GXN_ID_RESP_SIZE >> 1;
++              gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
++              gq->snscb_sblen = 6;
++              gq->snscb_cmd = SNS_GPN_ID;
++              gq->snscb_portid = lcl.portid;
++              isp_put_gxn_id_request(isp, gq,
++                  (sns_gxn_id_req_t *) fcp->isp_scratch);
++              MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
++              mbs.param[0] = MBOX_SEND_SNS;
++              mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
++              mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++              mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++              /*
++               * Leave 4 and 5 alone
++               */
++              mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++              mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++              if (isp_fabric_mbox_cmd(isp, &mbs)) {
++                      if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++                              fcp->isp_loopstate = LOOP_PDB_RCVD;
++                      }
++                      FC_SCRATCH_RELEASE(isp);
++                      return (-1);
++              }
++              if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++                      FC_SCRATCH_RELEASE(isp);
++                      return (-1);
++              }
++              MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GXN_ID_RESP_SIZE);
++              gs0 = (sns_gxn_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF);
++              isp_get_gxn_id_response(isp, gs0, gs1);
++              if (gs1->snscb_cthdr.ct_response != FS_ACC) {
++                      isp_prt(isp, ISP_LOGWARN, swrej, "GPN_ID",
++                          gs1->snscb_cthdr.ct_reason,
++                          gs1->snscb_cthdr.ct_explanation, lcl.portid);
++                      if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++                              FC_SCRATCH_RELEASE(isp);
++                              return (-1);
++                      }
++                      continue;
++              }
++              lcl.port_wwn = 
++                  (((u_int64_t)gs1->snscb_wwn[0]) << 56) |
++                  (((u_int64_t)gs1->snscb_wwn[1]) << 48) |
++                  (((u_int64_t)gs1->snscb_wwn[2]) << 40) |
++                  (((u_int64_t)gs1->snscb_wwn[3]) << 32) |
++                  (((u_int64_t)gs1->snscb_wwn[4]) << 24) |
++                  (((u_int64_t)gs1->snscb_wwn[5]) << 16) |
++                  (((u_int64_t)gs1->snscb_wwn[6]) <<  8) |
++                  (((u_int64_t)gs1->snscb_wwn[7]));
++
++              MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
++              gq->snscb_rblen = SNS_GXN_ID_RESP_SIZE >> 1;
++              gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
++              gq->snscb_sblen = 6;
++              gq->snscb_cmd = SNS_GNN_ID;
++              gq->snscb_portid = lcl.portid;
++              isp_put_gxn_id_request(isp, gq,
++                  (sns_gxn_id_req_t *) fcp->isp_scratch);
++              MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
++              mbs.param[0] = MBOX_SEND_SNS;
++              mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
++              mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++              mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++              /*
++               * Leave 4 and 5 alone
++               */
++              mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++              mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++              if (isp_fabric_mbox_cmd(isp, &mbs)) {
++                      if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++                              fcp->isp_loopstate = LOOP_PDB_RCVD;
++                      }
++                      FC_SCRATCH_RELEASE(isp);
++                      return (-1);
++              }
++              if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++                      FC_SCRATCH_RELEASE(isp);
++                      return (-1);
++              }
++              MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GXN_ID_RESP_SIZE);
++              gs0 = (sns_gxn_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF);
++              isp_get_gxn_id_response(isp, gs0, gs1);
++              if (gs1->snscb_cthdr.ct_response != FS_ACC) {
++                      isp_prt(isp, ISP_LOGWARN, swrej, "GNN_ID",
++                          gs1->snscb_cthdr.ct_reason,
++                          gs1->snscb_cthdr.ct_explanation, lcl.portid);
++                      if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++                              FC_SCRATCH_RELEASE(isp);
++                              return (-1);
++                      }
++                      continue;
++              }
++              lcl.node_wwn = 
++                  (((u_int64_t)gs1->snscb_wwn[0]) << 56) |
++                  (((u_int64_t)gs1->snscb_wwn[1]) << 48) |
++                  (((u_int64_t)gs1->snscb_wwn[2]) << 40) |
++                  (((u_int64_t)gs1->snscb_wwn[3]) << 32) |
++                  (((u_int64_t)gs1->snscb_wwn[4]) << 24) |
++                  (((u_int64_t)gs1->snscb_wwn[5]) << 16) |
++                  (((u_int64_t)gs1->snscb_wwn[6]) <<  8) |
++                  (((u_int64_t)gs1->snscb_wwn[7]));
++
++              /*
++               * The QLogic f/w is bouncing this with a parameter error.
++               */
++#if   0
++              /*
++               * Try and get FC4 Features (FC-GS-3 only).
++               * We can use the sns_gxn_id_req_t for this request.
++               */
++              MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t));
++              gq->snscb_rblen = SNS_GFF_ID_RESP_SIZE >> 1;
++              gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF);
++              gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF);
++              gq->snscb_sblen = 6;
++              gq->snscb_cmd = SNS_GFF_ID;
++              gq->snscb_portid = lcl.portid;
++              isp_put_gxn_id_request(isp, gq,
++                  (sns_gxn_id_req_t *) fcp->isp_scratch);
++              MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE);
++              mbs.param[0] = MBOX_SEND_SNS;
++              mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1;
++              mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++              mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++              /*
++               * Leave 4 and 5 alone
++               */
++              mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++              mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++              if (isp_fabric_mbox_cmd(isp, &mbs)) {
++                      if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) {
++                              fcp->isp_loopstate = LOOP_PDB_RCVD;
++                      }
++                      FC_SCRATCH_RELEASE(isp);
++                      return (-1);
++              }
++              if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++                      FC_SCRATCH_RELEASE(isp);
++                      return (-1);
++              }
++              MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GFF_ID_RESP_SIZE);
++              fs0 = (sns_gff_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF);
++              isp_get_gff_id_response(isp, fs0, fs1);
++              if (fs1->snscb_cthdr.ct_response != FS_ACC) {
++                      isp_prt(isp, /* ISP_LOGDEBUG0 */ ISP_LOGWARN,
++                          swrej, "GFF_ID",
++                          fs1->snscb_cthdr.ct_reason,
++                          fs1->snscb_cthdr.ct_explanation, lcl.portid);
++                      if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) {
++                              FC_SCRATCH_RELEASE(isp);
++                              return (-1);
++                      }
++              } else {
++                      int index = (ftype >> 3);
++                      int bshft = (ftype & 0x7) * 4;
++                      int fc4_fval =
++                          (fs1->snscb_fc4_features[index] >> bshft) & 0xf;
++                      if (fc4_fval & 0x1) {
++                              lcl.roles |=
++                                  (SVC3_INI_ROLE >> SVC3_ROLE_SHIFT);
++                      }
++                      if (fc4_fval & 0x2) {
++                              lcl.roles |=
++                                  (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT);
++                      }
++              }
++#endif
++
++              /*
++               * If we really want to know what kind of port type this is,
++               * we have to run another CT command. Otherwise, we'll leave
++               * it as undefined.
++               *
++              lcl.port_type = 0;
++               */
++              if (rs1->snscb_ports[i].control & 0x80) {
++                      lcl.last_fabric_dev = 1;
++              } else {
++                      lcl.last_fabric_dev = 0;
++              }
++              (void) isp_async(isp, ISPASYNC_FABRIC_DEV, &lcl);
++
++      } while ((rs1->snscb_ports[i].control & 0x80) == 0 && i < NGENT-1);
++
++      /*
++       * If we're not at the last entry, our list isn't big enough.
++       */
++      if ((rs1->snscb_ports[i].control & 0x80) == 0) {
++              isp_prt(isp, ISP_LOGWARN, "fabric too big for scratch area");
++      }
++
++      FC_SCRATCH_RELEASE(isp);
++      fcp->isp_loopstate = LOOP_FSCAN_DONE;
++      return (0);
++}
++#endif
++
++static void
++isp_register_fc4_type(struct ispsoftc *isp)
++{
++      fcparam *fcp = isp->isp_param;
++      u_int8_t local[SNS_RFT_ID_REQ_SIZE];
++      sns_screq_t *reqp = (sns_screq_t *) local;
++      mbreg_t mbs;
++
++      MEMZERO((void *) reqp, SNS_RFT_ID_REQ_SIZE);
++      reqp->snscb_rblen = SNS_RFT_ID_RESP_SIZE >> 1;
++      reqp->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma + 0x100);
++      reqp->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma + 0x100);
++      reqp->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma + 0x100);
++      reqp->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma + 0x100);
++      reqp->snscb_sblen = 22;
++      reqp->snscb_data[0] = SNS_RFT_ID;
++      reqp->snscb_data[4] = fcp->isp_portid & 0xffff;
++      reqp->snscb_data[5] = (fcp->isp_portid >> 16) & 0xff;
++      reqp->snscb_data[6] = (1 << FC4_SCSI);
++#if   0
++      reqp->snscb_data[6] |= (1 << FC4_IP);   /* ISO/IEC 8802-2 LLC/SNAP */
++#endif
++      FC_SCRATCH_ACQUIRE(isp);
++      isp_put_sns_request(isp, reqp, (sns_screq_t *) fcp->isp_scratch);
++      mbs.param[0] = MBOX_SEND_SNS;
++      mbs.param[1] = SNS_RFT_ID_REQ_SIZE >> 1;
++      mbs.param[2] = DMA_WD1(fcp->isp_scdma);
++      mbs.param[3] = DMA_WD0(fcp->isp_scdma);
++      /*
++       * Leave 4 and 5 alone
++       */
++      mbs.param[6] = DMA_WD3(fcp->isp_scdma);
++      mbs.param[7] = DMA_WD2(fcp->isp_scdma);
++      isp_mboxcmd(isp, &mbs, MBLOGALL);
++      FC_SCRATCH_RELEASE(isp);
++      if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++              isp_prt(isp, ISP_LOGDEBUG0, "Register FC4 types succeeded");
++      }
++}
++
++/*
++ * Start a command. Locking is assumed done in the caller.
++ */
++
++int
++isp_start(XS_T *xs)
++{
++      struct ispsoftc *isp;
++      u_int16_t nxti, optr, handle;
++      u_int8_t local[QENTRY_LEN];
++      ispreq_t *reqp, *qep;
++      int target, i;
++
++      XS_INITERR(xs);
++      isp = XS_ISP(xs);
++
++      /*
++       * Check to make sure we're supporting initiator role.
++       */
++      if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) {
++              XS_SETERR(xs, HBA_SELTIMEOUT);
++              return (CMD_COMPLETE);
++      }
++
++      /*
++       * Now make sure we're running.
++       */
++
++      if (isp->isp_state != ISP_RUNSTATE) {
++              isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE");
++              XS_SETERR(xs, HBA_BOTCH);
++              return (CMD_COMPLETE);
++      }
++
++      /*
++       * Check command CDB length, etc.. We really are limited to 16 bytes
++       * for Fibre Channel, but can do up to 44 bytes in parallel SCSI,
++       * but probably only if we're running fairly new firmware (we'll
++       * let the old f/w choke on an extended command queue entry).
++       */
++
++      if (XS_CDBLEN(xs) > (IS_FC(isp)? 16 : 44) || XS_CDBLEN(xs) == 0) {
++              isp_prt(isp, ISP_LOGERR,
++                  "unsupported cdb length (%d, CDB[0]=0x%x)",
++                  XS_CDBLEN(xs), XS_CDBP(xs)[0] & 0xff);
++              XS_SETERR(xs, HBA_BOTCH);
++              return (CMD_COMPLETE);
++      }
++
++      /*
++       * Check to see whether we have good firmware state still or
++       * need to refresh our port database for this target.
++       */
++      target = XS_TGT(xs);
++      if (IS_FC(isp)) {
++              fcparam *fcp = isp->isp_param;
++              struct lportdb *lp;
++#ifdef        HANDLE_LOOPSTATE_IN_OUTER_LAYERS
++              if (fcp->isp_fwstate != FW_READY ||
++                  fcp->isp_loopstate != LOOP_READY) {
++                      return (CMD_RQLATER);
++              }
++
++              /*
++               * If we're not on a Fabric, we can't have a target
++               * above FL_PORT_ID-1.
++               *
++               * If we're on a fabric and *not* connected as an F-port,
++               * we can't have a target less than FC_SNS_ID+1. This
++               * keeps us from having to sort out the difference between
++               * local public loop devices and those which we might get
++               * from a switch's database.
++               */
++              if (fcp->isp_onfabric == 0) {
++                      if (target >= FL_PORT_ID) {
++                              XS_SETERR(xs, HBA_SELTIMEOUT);
++                              return (CMD_COMPLETE);
++                      }
++              } else {
++                      if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
++                              XS_SETERR(xs, HBA_SELTIMEOUT);
++                              return (CMD_COMPLETE);
++                      }
++                      /*
++                       * We used to exclude having local loop ports
++                       * at the same time that we have fabric ports.
++                       * That is, we used to exclude having ports
++                       * at < FL_PORT_ID if we're FL-port.
++                       *
++                       * That's wrong. The only thing that could be
++                       * dicey is if the switch you're connected to
++                       * has these local loop ports appear on the
++                       * fabric and we somehow attach them twice.
++                       */
++              }
++#else
++              /*
++               * Check for f/w being in ready state. If the f/w
++               * isn't in ready state, then we don't know our
++               * loop ID and the f/w hasn't completed logging
++               * into all targets on the loop. If this is the
++               * case, then bounce the command. We pretend this is
++               * a SELECTION TIMEOUT error if we've never gone to
++               * FW_READY state at all- in this case we may not
++               * be hooked to a loop at all and we shouldn't hang
++               * the machine for this. Otherwise, defer this command
++               * until later.
++               */
++              if (fcp->isp_fwstate != FW_READY) {
++                      /*
++                       * Give ourselves at most a 250ms delay.
++                       */
++                      if (isp_fclink_test(isp, 250000)) {
++                              XS_SETERR(xs, HBA_SELTIMEOUT);
++                              if (fcp->loop_seen_once) {
++                                      return (CMD_RQLATER);
++                              } else {
++                                      return (CMD_COMPLETE);
++                              }
++                      }
++              }
++
++              /*
++               * If we're not on a Fabric, we can't have a target
++               * above FL_PORT_ID-1.
++               *
++               * If we're on a fabric and *not* connected as an F-port,
++               * we can't have a target less than FC_SNS_ID+1. This
++               * keeps us from having to sort out the difference between
++               * local public loop devices and those which we might get
++               * from a switch's database.
++               */
++              if (fcp->isp_onfabric == 0) {
++                      if (target >= FL_PORT_ID) {
++                              XS_SETERR(xs, HBA_SELTIMEOUT);
++                              return (CMD_COMPLETE);
++                      }
++              } else {
++                      if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
++                              XS_SETERR(xs, HBA_SELTIMEOUT);
++                              return (CMD_COMPLETE);
++                      }
++                      if (fcp->isp_topo != TOPO_F_PORT &&
++                          target < FL_PORT_ID) {
++                              XS_SETERR(xs, HBA_SELTIMEOUT);
++                              return (CMD_COMPLETE);
++                      }
++              }
++
++              /*
++               * If our loop state is such that we haven't yet received
++               * a "Port Database Changed" notification (after a LIP or
++               * a Loop Reset or firmware initialization), then defer
++               * sending commands for a little while, but only if we've
++               * seen a valid loop at one point (otherwise we can get
++               * stuck at initialization time).
++               */
++              if (fcp->isp_loopstate < LOOP_PDB_RCVD) {
++                      XS_SETERR(xs, HBA_SELTIMEOUT);
++                      if (fcp->loop_seen_once) {
++                              return (CMD_RQLATER);
++                      } else {
++                              return (CMD_COMPLETE);
++                      }
++              }
++
++              /*
++               * If we're in the middle of loop or fabric scanning
++               * or merging the port databases, retry this command later.
++               */
++              if (fcp->isp_loopstate == LOOP_SCANNING_FABRIC ||
++                  fcp->isp_loopstate == LOOP_SCANNING_LOOP ||
++                  fcp->isp_loopstate == LOOP_SYNCING_PDB) {
++                      return (CMD_RQLATER);
++              }
++
++              /*
++               * If our loop state is now such that we've just now
++               * received a Port Database Change notification, then
++               * we have to go off and (re)scan the fabric. We back
++               * out and try again later if this doesn't work.
++               */
++              if (fcp->isp_loopstate == LOOP_PDB_RCVD && fcp->isp_onfabric) {
++                      if (isp_scan_fabric(isp, FC4_SCSI)) {
++                              return (CMD_RQLATER);
++                      }
++                      if (fcp->isp_fwstate != FW_READY ||
++                          fcp->isp_loopstate < LOOP_FSCAN_DONE) {
++                              return (CMD_RQLATER);
++                      }
++              }
++
++              /*
++               * If our loop state is now such that we've just now
++               * received a Port Database Change notification, then
++               * we have to go off and (re)synchronize our port
++               * database.
++               */
++              if (fcp->isp_loopstate < LOOP_READY) {
++                      if (isp_pdb_sync(isp)) {
++                              return (CMD_RQLATER);
++                      }
++                      if (fcp->isp_fwstate != FW_READY ||
++                          fcp->isp_loopstate != LOOP_READY) {
++                              return (CMD_RQLATER);
++                      }
++              }
++
++              /*
++               * XXX: Here's were we would cancel any loop_dead flag
++               * XXX: also cancel in dead_loop timeout that's running
++               */
++#endif
++
++              /*
++               * Now check whether we should even think about pursuing this.
++               */
++              lp = &fcp->portdb[target];
++              if (lp->valid == 0) {
++                      XS_SETERR(xs, HBA_SELTIMEOUT);
++                      return (CMD_COMPLETE);
++              }
++              if ((lp->roles & (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT)) == 0) {
++                      isp_prt(isp, ISP_LOGDEBUG2,
++                          "Target %d does not have target service", target);
++                      XS_SETERR(xs, HBA_SELTIMEOUT);
++                      return (CMD_COMPLETE);
++              }
++              /*
++               * Now turn target into what the actual Loop ID is.
++               */
++              target = lp->loopid;
++      }
++
++      /*
++       * Next check to see if any HBA or Device
++       * parameters need to be updated.
++       */
++      if (isp->isp_update != 0) {
++              isp_update(isp);
++      }
++
++      if (isp_getrqentry(isp, &nxti, &optr, (void *)&qep)) {
++              isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow");
++              XS_SETERR(xs, HBA_BOTCH);
++              return (CMD_EAGAIN);
++      }
++
++      /*
++       * Now see if we need to synchronize the ISP with respect to anything.
++       * We do dual duty here (cough) for synchronizing for busses other
++       * than which we got here to send a command to.
++       */
++      reqp = (ispreq_t *) local;
++      if (isp->isp_sendmarker) {
++              u_int8_t n = (IS_DUALBUS(isp)? 2: 1);
++              /*
++               * Check ports to send markers for...
++               */
++              for (i = 0; i < n; i++) {
++                      if ((isp->isp_sendmarker & (1 << i)) == 0) {
++                              continue;
++                      }
++                      MEMZERO((void *) reqp, QENTRY_LEN);
++                      reqp->req_header.rqs_entry_count = 1;
++                      reqp->req_header.rqs_entry_type = RQSTYPE_MARKER;
++                      reqp->req_modifier = SYNC_ALL;
++                      reqp->req_target = i << 7;      /* insert bus number */
++                      isp_put_request(isp, reqp, qep);
++                      ISP_ADD_REQUEST(isp, nxti);
++                      isp->isp_sendmarker &= ~(1 << i);
++                      if (isp_getrqentry(isp, &nxti, &optr, (void *) &qep)) {
++                              isp_prt(isp, ISP_LOGDEBUG0,
++                                  "Request Queue Overflow+");
++                              XS_SETERR(xs, HBA_BOTCH);
++                              return (CMD_EAGAIN);
++                      }
++              }
++      }
++
++      MEMZERO((void *)reqp, QENTRY_LEN);
++      reqp->req_header.rqs_entry_count = 1;
++      if (IS_FC(isp)) {
++              reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS;
++      } else {
++              if (XS_CDBLEN(xs) > 12)
++                      reqp->req_header.rqs_entry_type = RQSTYPE_CMDONLY;
++              else
++                      reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST;
++      }
++      /* reqp->req_header.rqs_flags = 0; */
++      /* reqp->req_header.rqs_seqno = 0; */
++      if (IS_FC(isp)) {
++              /*
++               * See comment in isp_intr
++               */
++              /* XS_RESID(xs) = 0; */
++
++              /*
++               * Fibre Channel always requires some kind of tag.
++               * The Qlogic drivers seem be happy not to use a tag,
++               * but this breaks for some devices (IBM drives).
++               */
++              if (XS_TAG_P(xs)) {
++                      ((ispreqt2_t *)reqp)->req_flags = XS_TAG_TYPE(xs);
++              } else {
++                      /*
++                       * If we don't know what tag to use, use HEAD OF QUEUE
++                       * for Request Sense or Simple.
++                       */
++                      if (XS_CDBP(xs)[0] == 0x3)      /* REQUEST SENSE */
++                              ((ispreqt2_t *)reqp)->req_flags = REQFLAG_HTAG;
++                      else
++                              ((ispreqt2_t *)reqp)->req_flags = REQFLAG_STAG;
++              }
++      } else {
++              sdparam *sdp = (sdparam *)isp->isp_param;
++              sdp += XS_CHANNEL(xs);
++              if ((sdp->isp_devparam[target].actv_flags & DPARM_TQING) &&
++                  XS_TAG_P(xs)) {
++                      reqp->req_flags = XS_TAG_TYPE(xs);
++              }
++      }
++      reqp->req_target = target | (XS_CHANNEL(xs) << 7);
++      if (IS_SCSI(isp)) {
++              reqp->req_lun_trn = XS_LUN(xs);
++              reqp->req_cdblen = XS_CDBLEN(xs);
++      } else {
++              if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)
++                      ((ispreqt2_t *)reqp)->req_scclun = XS_LUN(xs);
++              else
++                      ((ispreqt2_t *)reqp)->req_lun_trn = XS_LUN(xs);
++      }
++      MEMCPY(reqp->req_cdb, XS_CDBP(xs), XS_CDBLEN(xs));
++
++      reqp->req_time = XS_TIME(xs) / 1000;
++      if (reqp->req_time == 0 && XS_TIME(xs)) {
++              reqp->req_time = 1;
++      }
++
++      if (isp_save_xs(isp, xs, &handle)) {
++              isp_prt(isp, ISP_LOGDEBUG0, "out of xflist pointers");
++              XS_SETERR(xs, HBA_BOTCH);
++              return (CMD_EAGAIN);
++      }
++      reqp->req_handle = handle;
++
++      /*
++       * Set up DMA and/or do any bus swizzling of the request entry
++       * so that the Qlogic F/W understands what is being asked of it.
++       */
++      i = ISP_DMASETUP(isp, xs, reqp, &nxti, optr);
++      if (i != CMD_QUEUED) {
++              isp_destroy_handle(isp, handle);
++              /*
++               * dmasetup sets actual error in packet, and
++               * return what we were given to return.
++               */
++              return (i);
++      }
++      XS_SETERR(xs, HBA_NOERROR);
++      isp_prt(isp, ISP_LOGDEBUG2,
++          "START cmd for %d.%d.%d cmd 0x%x datalen %ld",
++          XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), XS_CDBP(xs)[0],
++          (long) XS_XFRLEN(xs));
++      ISP_ADD_REQUEST(isp, nxti);
++      isp->isp_nactive++;
++      return (CMD_QUEUED);
++}
++
++/*
++ * isp control
++ * Locks (ints blocked) assumed held.
++ */
++
++int
++isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg)
++{
++      XS_T *xs;
++      mbreg_t mbs;
++      int bus, tgt;
++      u_int16_t handle;
++
++      switch (ctl) {
++      default:
++              isp_prt(isp, ISP_LOGERR, "Unknown Control Opcode 0x%x", ctl);
++              break;
++
++      case ISPCTL_RESET_BUS:
++              /*
++               * Issue a bus reset.
++               */
++              mbs.param[0] = MBOX_BUS_RESET;
++              mbs.param[2] = 0;
++              if (IS_SCSI(isp)) {
++                      mbs.param[1] =
++                          ((sdparam *) isp->isp_param)->isp_bus_reset_delay;
++                      if (mbs.param[1] < 2)
++                              mbs.param[1] = 2;
++                      bus = *((int *) arg);
++                      if (IS_DUALBUS(isp))
++                              mbs.param[2] = bus;
++              } else {
++                      mbs.param[1] = 10;
++                      bus = 0;
++              }
++              isp->isp_sendmarker |= (1 << bus);
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      break;
++              }
++              isp_prt(isp, ISP_LOGINFO,
++                  "driver initiated bus reset of bus %d", bus);
++              return (0);
++
++      case ISPCTL_RESET_DEV:
++              tgt = (*((int *) arg)) & 0xffff;
++              bus = (*((int *) arg)) >> 16;
++              mbs.param[0] = MBOX_ABORT_TARGET;
++              mbs.param[1] = (tgt << 8) | (bus << 15);
++              mbs.param[2] = 3;       /* 'delay', in seconds */
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      break;
++              }
++              isp_prt(isp, ISP_LOGINFO,
++                  "Target %d on Bus %d Reset Succeeded", tgt, bus);
++              isp->isp_sendmarker |= (1 << bus);
++              return (0);
++
++      case ISPCTL_ABORT_CMD:
++              xs = (XS_T *) arg;
++              tgt = XS_TGT(xs);
++              handle = isp_find_handle(isp, xs);
++              if (handle == 0) {
++                      isp_prt(isp, ISP_LOGWARN,
++                          "cannot find handle for command to abort");
++                      break;
++              }
++              bus = XS_CHANNEL(xs);
++              mbs.param[0] = MBOX_ABORT;
++              if (IS_FC(isp)) {
++                      if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)  {
++                              mbs.param[1] = tgt << 8;
++                              mbs.param[4] = 0;
++                              mbs.param[5] = 0;
++                              mbs.param[6] = XS_LUN(xs);
++                      } else {
++                              mbs.param[1] = tgt << 8 | XS_LUN(xs);
++                      }
++              } else {
++                      mbs.param[1] =
++                          (bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs);
++              }
++              mbs.param[3] = 0;
++              mbs.param[2] = handle;
++              isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR);
++              if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++                      return (0);
++              }
++              /*
++               * XXX: Look for command in the REQUEST QUEUE. That is,
++               * XXX: It hasen't been picked up by firmware yet.
++               */
++              break;
++
++      case ISPCTL_UPDATE_PARAMS:
++
++              isp_update(isp);
++              return (0);
++
++      case ISPCTL_FCLINK_TEST:
++
++              if (IS_FC(isp)) {
++                      int usdelay = (arg)? *((int *) arg) : 250000;
++                      return (isp_fclink_test(isp, usdelay));
++              }
++              break;
++
++      case ISPCTL_SCAN_FABRIC:
++
++              if (IS_FC(isp)) {
++                      int ftype = (arg)? *((int *) arg) : FC4_SCSI;
++                      return (isp_scan_fabric(isp, ftype));
++              }
++              break;
++
++      case ISPCTL_SCAN_LOOP:
++
++              if (IS_FC(isp)) {
++                      return (isp_scan_loop(isp));
++              }
++              break;
++
++      case ISPCTL_PDB_SYNC:
++
++              if (IS_FC(isp)) {
++                      return (isp_pdb_sync(isp));
++              }
++              break;
++
++      case ISPCTL_SEND_LIP:
++
++              if (IS_FC(isp)) {
++                      mbs.param[0] = MBOX_INIT_LIP;
++                      isp_mboxcmd(isp, &mbs, MBLOGALL);
++                      if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++                              return (0);
++                      }
++              }
++              break;
++
++      case ISPCTL_GET_POSMAP:
++
++              if (IS_FC(isp) && arg) {
++                      return (isp_getmap(isp, arg));
++              }
++              break;
++
++      case ISPCTL_RUN_MBOXCMD:
++
++              isp_mboxcmd(isp, arg, MBLOGALL);
++              return(0);
++
++#ifdef        ISP_TARGET_MODE
++      case ISPCTL_TOGGLE_TMODE:
++      {
++
++              /*
++               * We don't check/set against role here- that's the
++               * responsibility for the outer layer to coordinate.
++               */
++              if (IS_SCSI(isp)) {
++                      int param = *(int *)arg;
++                      mbs.param[0] = MBOX_ENABLE_TARGET_MODE;
++                      mbs.param[1] = param & 0xffff;
++                      mbs.param[2] = param >> 16;
++                      isp_mboxcmd(isp, &mbs, MBLOGALL);
++                      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                              break;
++                      }
++              }
++              return (0);
++      }
++#endif
++      }
++      return (-1);
++}
++
++/*
++ * Interrupt Service Routine(s).
++ *
++ * External (OS) framework has done the appropriate locking,
++ * and the locking will be held throughout this function.
++ */
++
++/*
++ * Limit our stack depth by sticking with the max likely number
++ * of completions on a request queue at any one time.
++ */
++#ifndef       MAX_REQUESTQ_COMPLETIONS
++#define       MAX_REQUESTQ_COMPLETIONS        64
++#endif
++
++void
++isp_intr(struct ispsoftc *isp, u_int16_t isr, u_int16_t sema, u_int16_t mbox)
++{
++      XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs;
++      u_int16_t iptr, optr, junk;
++      int i, nlooked = 0, ndone = 0;
++
++again:
++      /*
++       * Is this a mailbox related interrupt?
++       * The mailbox semaphore will be nonzero if so.
++       */
++      if (sema) {
++              if (mbox & 0x4000) {
++                      isp->isp_intmboxc++;
++                      if (isp->isp_mboxbsy) {
++                              int i = 0, obits = isp->isp_obits;
++                              isp->isp_mboxtmp[i++] = mbox;
++                              for (i = 1; i < MAX_MAILBOX; i++) {
++                                      if ((obits & (1 << i)) == 0) {
++                                              continue;
++                                      }
++                                      isp->isp_mboxtmp[i] =
++                                          ISP_READ(isp, MBOX_OFF(i));
++                              }
++                              if (isp->isp_mbxwrk0) {
++                                      if (isp_mbox_continue(isp) == 0) {
++                                              return;
++                                      }
++                              }
++                              MBOX_NOTIFY_COMPLETE(isp);
++                      } else {
++                              isp_prt(isp, ISP_LOGWARN,
++                                  "Mbox Command Async (0x%x) with no waiters",
++                                  mbox);
++                      }
++              } else if (isp_parse_async(isp, mbox) < 0) {
++                      return;
++              }
++              if ((IS_FC(isp) && mbox != ASYNC_RIO_RESP) ||
++                  isp->isp_state != ISP_RUNSTATE) {
++                      ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++                      ISP_WRITE(isp, BIU_SEMA, 0);
++                      return;
++              }
++      }
++
++      /*
++       * We can't be getting this now.
++       */
++      if (isp->isp_state != ISP_RUNSTATE) {
++              isp_prt(isp, ISP_LOGWARN,
++                  "interrupt (ISR=%x SEMA=%x) when not ready", isr, sema);
++              /*
++               * Thank you very much!  *Burrrp*!
++               */
++              WRITE_RESPONSE_QUEUE_OUT_POINTER(isp,
++                  READ_RESPONSE_QUEUE_IN_POINTER(isp));
++
++              ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++              ISP_WRITE(isp, BIU_SEMA, 0);
++              return;
++      }
++
++      /*
++       * Get the current Response Queue Out Pointer.
++       *
++       * If we're a 2300, we can ask what hardware what it thinks.
++       */
++      if (IS_23XX(isp)) {
++              optr = ISP_READ(isp, isp->isp_respoutrp);
++              /*
++               * Debug: to be taken out eventually
++               */
++              if (isp->isp_residx != optr) {
++                      isp_prt(isp, ISP_LOGWARN, "optr %x soft optr %x",
++                          optr, isp->isp_residx);
++              }
++      } else {
++              optr = isp->isp_residx;
++      }
++
++      /*
++       * You *must* read the Response Queue In Pointer
++       * prior to clearing the RISC interrupt.
++       *
++       * Debounce the 2300 if revision less than 2.
++       */
++      if (IS_2100(isp) || (IS_2300(isp) && isp->isp_revision < 2)) {
++              i = 0;
++              do {
++                      iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
++                      junk = READ_RESPONSE_QUEUE_IN_POINTER(isp);
++              } while (junk != iptr && ++i < 1000);
++
++              if (iptr != junk) {
++                      ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++                      isp_prt(isp, ISP_LOGWARN,
++                          "Response Queue Out Pointer Unstable (%x, %x)",
++                          iptr, junk);
++                      return;
++              }
++      } else {
++              iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
++      }
++      isp->isp_resodx = iptr;
++
++
++      if (optr == iptr && sema == 0) {
++              /*
++               * There are a lot of these- reasons unknown- mostly on
++               * faster Alpha machines.
++               *
++               * I tried delaying after writing HCCR_CMD_CLEAR_RISC_INT to
++               * make sure the old interrupt went away (to avoid 'ringing'
++               * effects), but that didn't stop this from occurring.
++               */
++              if (IS_23XX(isp)) {
++                      USEC_DELAY(100);
++                      iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp);
++                      junk = ISP_READ(isp, BIU_R2HSTSLO);
++              } else {
++                      junk = ISP_READ(isp, BIU_ISR);
++              }
++              if (optr == iptr) {
++                      if (IS_23XX(isp)) {
++                              ;
++                      } else {
++                              sema = ISP_READ(isp, BIU_SEMA);
++                              mbox = ISP_READ(isp, OUTMAILBOX0);
++                              if ((sema & 0x3) && (mbox & 0x8000)) {
++                                      goto again;
++                              }
++                      }
++                      isp->isp_intbogus++;
++                      isp_prt(isp, ISP_LOGDEBUG1,
++                          "bogus intr- isr %x (%x) iptr %x optr %x",
++                          isr, junk, iptr, optr);
++              }
++      }
++      isp->isp_resodx = iptr;
++      ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++      ISP_WRITE(isp, BIU_SEMA, 0);
++
++      if (isp->isp_rspbsy) {
++              return;
++      }
++      isp->isp_rspbsy = 1;
++
++      while (optr != iptr) {
++              ispstatusreq_t local, *sp = &local;
++              isphdr_t *hp;
++              int type;
++              u_int16_t oop;
++              int buddaboom = 0;
++
++              hp = (isphdr_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr);
++              oop = optr;
++              optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp));
++              nlooked++;
++              /*
++               * Synchronize our view of this response queue entry.
++               */
++              MEMORYBARRIER(isp, SYNC_RESULT, oop, QENTRY_LEN);
++
++              type = isp_get_response_type(isp, hp);
++
++              if (type == RQSTYPE_RESPONSE) {
++                      isp_get_response(isp, (ispstatusreq_t *) hp, sp);
++              } else if (type == RQSTYPE_RIO2) {
++                      isp_rio2_t rio;
++                      isp_get_rio2(isp, (isp_rio2_t *) hp, &rio);
++                      for (i = 0; i < rio.req_header.rqs_seqno; i++) {
++                              isp_fastpost_complete(isp, rio.req_handles[i]);
++                      }
++                      if (isp->isp_fpcchiwater < rio.req_header.rqs_seqno)
++                              isp->isp_fpcchiwater = rio.req_header.rqs_seqno;
++                      MEMZERO(hp, QENTRY_LEN);        /* PERF */
++                      continue;
++              } else {
++                      /*
++                       * Somebody reachable via isp_handle_other_response
++                       * may have updated the response queue pointers for
++                       * us, so we reload our goal index.
++                       */
++                      if (isp_handle_other_response(isp, type, hp, &optr)) {
++                              iptr = isp->isp_resodx;
++                              MEMZERO(hp, QENTRY_LEN);        /* PERF */
++                              continue;
++                      }
++
++                      /*
++                       * After this point, we'll just look at the header as
++                       * we don't know how to deal with the rest of the
++                       * response.
++                       */
++                      isp_get_response(isp, (ispstatusreq_t *) hp, sp);
++
++                      /*
++                       * It really has to be a bounced request just copied
++                       * from the request queue to the response queue. If
++                       * not, something bad has happened.
++                       */
++                      if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) {
++                              isp_prt(isp, ISP_LOGERR, notresp,
++                                  sp->req_header.rqs_entry_type, oop, optr,
++                                  nlooked);
++                              if (isp->isp_dblev & ISP_LOGDEBUG0) {
++                                      isp_print_bytes(isp, "Queue Entry",
++                                          QENTRY_LEN, sp);
++                              }
++                              MEMZERO(hp, QENTRY_LEN);        /* PERF */
++                              continue;
++                      }
++                      buddaboom = 1;
++              }
++
++              if (sp->req_header.rqs_flags & 0xf) {
++#define       _RQS_OFLAGS     \
++      ~(RQSFLAG_CONTINUATION|RQSFLAG_FULL|RQSFLAG_BADHEADER|RQSFLAG_BADPACKET)
++                      if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) {
++                              isp_prt(isp, ISP_LOGWARN,
++                                  "continuation segment");
++                              WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
++                              continue;
++                      }
++                      if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
++                              isp_prt(isp, ISP_LOGDEBUG1,
++                                  "internal queues full");
++                              /*
++                               * We'll synthesize a QUEUE FULL message below.
++                               */
++                      }
++                      if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) {
++                              isp_prt(isp, ISP_LOGERR,  "bad header flag");
++                              buddaboom++;
++                      }
++                      if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) {
++                              isp_prt(isp, ISP_LOGERR, "bad request packet");
++                              buddaboom++;
++                      }
++                      if (sp->req_header.rqs_flags & _RQS_OFLAGS) {
++                              isp_prt(isp, ISP_LOGERR,
++                                  "unknown flags (0x%x) in response",
++                                  sp->req_header.rqs_flags);
++                              buddaboom++;
++                      }
++#undef        _RQS_OFLAGS
++              }
++              if (sp->req_handle > isp->isp_maxcmds || sp->req_handle < 1) {
++                      MEMZERO(hp, QENTRY_LEN);        /* PERF */
++                      isp_prt(isp, ISP_LOGERR,
++                          "bad request handle %d (type 0x%x, flags 0x%x)",
++                          sp->req_handle, sp->req_header.rqs_entry_type,
++                          sp->req_header.rqs_flags);
++                      WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
++                      continue;
++              }
++              xs = isp_find_xs(isp, sp->req_handle);
++              if (xs == NULL) {
++                      u_int8_t ts = sp->req_completion_status & 0xff;
++                      MEMZERO(hp, QENTRY_LEN);        /* PERF */
++                      /*
++                       * Only whine if this isn't the expected fallout of
++                       * aborting the command.
++                       */
++                      if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) {
++                              isp_prt(isp, ISP_LOGERR,
++                                  "cannot find handle 0x%x (type 0x%x)",
++                                  sp->req_handle,
++                                  sp->req_header.rqs_entry_type);
++                      } else if (ts != RQCS_ABORTED) {
++                              isp_prt(isp, ISP_LOGERR,
++                                  "cannot find handle 0x%x (status 0x%x)",
++                                  sp->req_handle, ts);
++                      }
++                      WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
++                      continue;
++              }
++              isp_destroy_handle(isp, sp->req_handle);
++              if (sp->req_status_flags & RQSTF_BUS_RESET) {
++                      XS_SETERR(xs, HBA_BUSRESET);
++                      isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
++              }
++              if (buddaboom) {
++                      XS_SETERR(xs, HBA_BOTCH);
++              }
++
++              if (IS_FC(isp) && (sp->req_scsi_status & RQCS_SV)) {
++                      /*
++                       * Fibre Channel F/W doesn't say we got status
++                       * if there's Sense Data instead. I guess they
++                       * think it goes w/o saying.
++                       */
++                      sp->req_state_flags |= RQSF_GOT_STATUS;
++              }
++              if (sp->req_state_flags & RQSF_GOT_STATUS) {
++                      *XS_STSP(xs) = sp->req_scsi_status & 0xff;
++              }
++
++              switch (sp->req_header.rqs_entry_type) {
++              case RQSTYPE_RESPONSE:
++                      XS_SET_STATE_STAT(isp, xs, sp);
++                      isp_parse_status(isp, sp, xs);
++                      if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) &&
++                          (*XS_STSP(xs) == SCSI_BUSY)) {
++                              XS_SETERR(xs, HBA_TGTBSY);
++                      }
++                      if (IS_SCSI(isp)) {
++                              XS_RESID(xs) = sp->req_resid;
++                              if ((sp->req_state_flags & RQSF_GOT_STATUS) &&
++                                  (*XS_STSP(xs) == SCSI_CHECK) &&
++                                  (sp->req_state_flags & RQSF_GOT_SENSE)) {
++                                      XS_SAVE_SENSE(xs, sp);
++                              }
++                              /*
++                               * A new synchronous rate was negotiated for
++                               * this target. Mark state such that we'll go
++                               * look up that which has changed later.
++                               */
++                              if (sp->req_status_flags & RQSTF_NEGOTIATION) {
++                                      int t = XS_TGT(xs);
++                                      sdparam *sdp = isp->isp_param;
++                                      sdp += XS_CHANNEL(xs);
++                                      sdp->isp_devparam[t].dev_refresh = 1;
++                                      isp->isp_update |=
++                                          (1 << XS_CHANNEL(xs));
++                              }
++                      } else {
++                              if (sp->req_status_flags & RQSF_XFER_COMPLETE) {
++                                      XS_RESID(xs) = 0;
++                              } else if (sp->req_scsi_status & RQCS_RESID) {
++                                      XS_RESID(xs) = sp->req_resid;
++                              } else {
++                                      XS_RESID(xs) = 0;
++                              }
++                              if ((sp->req_state_flags & RQSF_GOT_STATUS) &&
++                                  (*XS_STSP(xs) == SCSI_CHECK) &&
++                                  (sp->req_scsi_status & RQCS_SV)) {
++                                      XS_SAVE_SENSE(xs, sp);
++                                      /* solely for the benefit of debug */
++                                      sp->req_state_flags |= RQSF_GOT_SENSE;
++                              }
++                      }
++                      isp_prt(isp, ISP_LOGDEBUG2,
++                         "asked for %ld got resid %ld", (long) XS_XFRLEN(xs),
++                         (long) sp->req_resid);
++                      break;
++              case RQSTYPE_REQUEST:
++                      if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
++                              /*
++                               * Force Queue Full status.
++                               */
++                              *XS_STSP(xs) = SCSI_QFULL;
++                              XS_SETERR(xs, HBA_NOERROR);
++                      } else if (XS_NOERR(xs)) {
++                              /*
++                               * ????
++                               */
++                              isp_prt(isp, ISP_LOGDEBUG0,
++                                  "Request Queue Entry bounced back");
++                              XS_SETERR(xs, HBA_BOTCH);
++                      }
++                      XS_RESID(xs) = XS_XFRLEN(xs);
++                      break;
++              default:
++                      isp_prt(isp, ISP_LOGWARN,
++                          "unhandled response queue type 0x%x",
++                          sp->req_header.rqs_entry_type);
++                      if (XS_NOERR(xs)) {
++                              XS_SETERR(xs, HBA_BOTCH);
++                      }
++                      break;
++              }
++
++              /*
++               * Free any dma resources. As a side effect, this may
++               * also do any cache flushing necessary for data coherence.                      */
++              if (XS_XFRLEN(xs)) {
++                      ISP_DMAFREE(isp, xs, sp->req_handle);
++              }
++
++              if (((isp->isp_dblev & (ISP_LOGDEBUG2|ISP_LOGDEBUG3))) ||
++                  ((isp->isp_dblev & ISP_LOGDEBUG1) && ((!XS_NOERR(xs)) ||
++                  (*XS_STSP(xs) != SCSI_GOOD)))) {
++                      char skey;
++                      if (sp->req_state_flags & RQSF_GOT_SENSE) {
++                              skey = XS_SNSKEY(xs) & 0xf;
++                              if (skey < 10)
++                                      skey += '0';
++                              else
++                                      skey += 'a' - 10;
++                      } else if (*XS_STSP(xs) == SCSI_CHECK) {
++                              skey = '?';
++                      } else {
++                              skey = '.';
++                      }
++                      isp_prt(isp, ISP_LOGALL, finmsg, XS_CHANNEL(xs),
++                          XS_TGT(xs), XS_LUN(xs), XS_XFRLEN(xs), XS_RESID(xs),
++                          *XS_STSP(xs), skey, XS_ERR(xs));
++              }
++
++              if (isp->isp_nactive > 0)
++                  isp->isp_nactive--;
++              complist[ndone++] = xs; /* defer completion call until later */
++              MEMZERO(hp, QENTRY_LEN);        /* PERF */
++              if (ndone == MAX_REQUESTQ_COMPLETIONS) {
++                      break;
++              }
++      }
++
++      /*
++       * If we looked at any commands, then it's valid to find out
++       * what the outpointer is. It also is a trigger to update the
++       * ISP's notion of what we've seen so far.
++       */
++      if (nlooked) {
++              WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr);
++              /*
++               * While we're at it, read the requst queue out pointer.
++               */
++              isp->isp_reqodx = READ_REQUEST_QUEUE_OUT_POINTER(isp);
++              if (isp->isp_rscchiwater < ndone)
++                      isp->isp_rscchiwater = ndone;
++      }
++
++      isp->isp_residx = optr;
++      isp->isp_rspbsy = 0;
++      for (i = 0; i < ndone; i++) {
++              xs = complist[i];
++              if (xs) {
++                      isp->isp_rsltccmplt++;
++                      isp_done(xs);
++              }
++      }
++}
++
++/*
++ * Support routines.
++ */
++
++static int
++isp_parse_async(struct ispsoftc *isp, u_int16_t mbox)
++{
++      int rval = 0;
++      int bus;
++
++      if (IS_DUALBUS(isp)) {
++              bus = ISP_READ(isp, OUTMAILBOX6);
++      } else {
++              bus = 0;
++      }
++      isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox);
++
++      switch (mbox) {
++      case ASYNC_BUS_RESET:
++              isp->isp_sendmarker |= (1 << bus);
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_async(isp, bus, mbox))
++                      rval = -1;
++#endif
++              isp_async(isp, ISPASYNC_BUS_RESET, &bus);
++              break;
++      case ASYNC_SYSTEM_ERROR:
++#ifdef        ISP_FW_CRASH_DUMP
++              /*
++               * If we have crash dumps enabled, it's up to the handler
++               * for isp_async to reinit stuff and restart the firmware
++               * after performing the crash dump. The reason we do things
++               * this way is that we may need to activate a kernel thread
++               * to do all the crash dump goop.
++               */
++              isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++#else
++              isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++              isp_reinit(isp);
++              isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++#endif
++              rval = -1;
++              break;
++
++      case ASYNC_RQS_XFER_ERR:
++              isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error");
++              break;
++
++      case ASYNC_RSP_XFER_ERR:
++              isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error");
++              break;
++
++      case ASYNC_QWAKEUP:
++              /*
++               * We've just been notified that the Queue has woken up.
++               * We don't need to be chatty about this- just unlatch things
++               * and move on.
++               */
++              mbox = READ_REQUEST_QUEUE_OUT_POINTER(isp);
++              break;
++
++      case ASYNC_TIMEOUT_RESET:
++              isp_prt(isp, ISP_LOGWARN,
++                  "timeout initiated SCSI bus reset of bus %d", bus);
++              isp->isp_sendmarker |= (1 << bus);
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_async(isp, bus, mbox))
++                      rval = -1;
++#endif
++              break;
++
++      case ASYNC_DEVICE_RESET:
++              isp_prt(isp, ISP_LOGINFO, "device reset on bus %d", bus);
++              isp->isp_sendmarker |= (1 << bus);
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_async(isp, bus, mbox))
++                      rval = -1;
++#endif
++              break;
++
++      case ASYNC_EXTMSG_UNDERRUN:
++              isp_prt(isp, ISP_LOGWARN, "extended message underrun");
++              break;
++
++      case ASYNC_SCAM_INT:
++              isp_prt(isp, ISP_LOGINFO, "SCAM interrupt");
++              break;
++
++      case ASYNC_HUNG_SCSI:
++              isp_prt(isp, ISP_LOGERR,
++                  "stalled SCSI Bus after DATA Overrun");
++              /* XXX: Need to issue SCSI reset at this point */
++              break;
++
++      case ASYNC_KILLED_BUS:
++              isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun");
++              break;
++
++      case ASYNC_BUS_TRANSIT:
++              mbox = ISP_READ(isp, OUTMAILBOX2);
++              switch (mbox & 0x1c00) {
++              case SXP_PINS_LVD_MODE:
++                      isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode");
++                      SDPARAM(isp)->isp_diffmode = 0;
++                      SDPARAM(isp)->isp_ultramode = 0;
++                      SDPARAM(isp)->isp_lvdmode = 1;
++                      break;
++              case SXP_PINS_HVD_MODE:
++                      isp_prt(isp, ISP_LOGINFO,
++                          "Transition to Differential mode");
++                      SDPARAM(isp)->isp_diffmode = 1;
++                      SDPARAM(isp)->isp_ultramode = 0;
++                      SDPARAM(isp)->isp_lvdmode = 0;
++                      break;
++              case SXP_PINS_SE_MODE:
++                      isp_prt(isp, ISP_LOGINFO,
++                          "Transition to Single Ended mode");
++                      SDPARAM(isp)->isp_diffmode = 0;
++                      SDPARAM(isp)->isp_ultramode = 1;
++                      SDPARAM(isp)->isp_lvdmode = 0;
++                      break;
++              default:
++                      isp_prt(isp, ISP_LOGWARN,
++                          "Transition to Unknown Mode 0x%x", mbox);
++                      break;
++              }
++              /*
++               * XXX: Set up to renegotiate again!
++               */
++              /* Can only be for a 1080... */
++              isp->isp_sendmarker |= (1 << bus);
++              break;
++
++      /*
++       * We can use bus, which will always be zero for FC cards,
++       * as a mailbox pattern accumulator to be checked below.
++       */
++      case ASYNC_RIO5:
++              bus = 0x1ce;    /* outgoing mailbox regs 1-3, 6-7 */
++              break;
++
++      case ASYNC_RIO4:
++              bus = 0x14e;    /* outgoing mailbox regs 1-3, 6 */
++              break;
++
++      case ASYNC_RIO3:
++              bus = 0x10e;    /* outgoing mailbox regs 1-3 */
++              break;
++
++      case ASYNC_RIO2:
++              bus = 0x106;    /* outgoing mailbox regs 1-2 */
++              break;
++
++      case ASYNC_RIO1:
++      case ASYNC_CMD_CMPLT:
++              bus = 0x102;    /* outgoing mailbox regs 1 */
++              break;
++
++      case ASYNC_RIO_RESP:
++              return (rval);
++
++      case ASYNC_CTIO_DONE:
++      {
++#ifdef        ISP_TARGET_MODE
++              int handle =
++                  (ISP_READ(isp, OUTMAILBOX2) << 16) | 
++                  (ISP_READ(isp, OUTMAILBOX1));
++              if (isp_target_async(isp, handle, mbox))
++                      rval = -1;
++#else
++              isp_prt(isp, ISP_LOGINFO, "Fast Posting CTIO done");
++#endif
++              isp->isp_fphccmplt++;   /* count it as a fast posting intr */
++              break;
++      }
++      case ASYNC_LIP_F8:
++      case ASYNC_LIP_OCCURRED:
++              FCPARAM(isp)->isp_lipseq =
++                  ISP_READ(isp, OUTMAILBOX1);
++              FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++              FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
++              isp->isp_sendmarker = 1;
++              isp_mark_getpdb_all(isp);
++              isp_async(isp, ISPASYNC_LIP, NULL);
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_async(isp, bus, mbox))
++                      rval = -1;
++#endif
++              /*
++               * We've had problems with data corruption occuring on
++               * commands that complete (with no apparent error) after
++               * we receive a LIP. This has been observed mostly on
++               * Local Loop topologies. To be safe, let's just mark
++               * all active commands as dead.
++               */
++              if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT ||
++                  FCPARAM(isp)->isp_topo == TOPO_FL_PORT) {
++                      int i, j;
++                      for (i = j = 0; i < isp->isp_maxcmds; i++) {
++                              XS_T *xs;
++                              xs = isp->isp_xflist[i];
++                              if (xs != NULL) {
++                                      j++;
++                                      XS_SETERR(xs, HBA_BUSRESET);
++                              }
++                      }
++                      if (j) {
++                              isp_prt(isp, ISP_LOGERR,
++                                  "LIP destroyed %d active commands", j);
++                      }
++              }
++              break;
++
++      case ASYNC_LOOP_UP:
++              isp->isp_sendmarker = 1;
++              FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++              FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
++              isp_mark_getpdb_all(isp);
++              isp_async(isp, ISPASYNC_LOOP_UP, NULL);
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_async(isp, bus, mbox))
++                      rval = -1;
++#endif
++              break;
++
++      case ASYNC_LOOP_DOWN:
++              isp->isp_sendmarker = 1;
++              FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++              FCPARAM(isp)->isp_loopstate = LOOP_NIL;
++              isp_mark_getpdb_all(isp);
++              isp_async(isp, ISPASYNC_LOOP_DOWN, NULL);
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_async(isp, bus, mbox))
++                      rval = -1;
++#endif
++              break;
++
++      case ASYNC_LOOP_RESET:
++              isp->isp_sendmarker = 1;
++              FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++              FCPARAM(isp)->isp_loopstate = LOOP_NIL;
++              isp_mark_getpdb_all(isp);
++              isp_async(isp, ISPASYNC_LOOP_RESET, NULL);
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_async(isp, bus, mbox))
++                      rval = -1;
++#endif
++              break;
++
++      case ASYNC_PDB_CHANGED:
++              isp->isp_sendmarker = 1;
++              FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
++              isp_mark_getpdb_all(isp);
++              isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_PDB);
++              break;
++
++      case ASYNC_CHANGE_NOTIFY:
++              /*
++               * Not correct, but it will force us to rescan the loop.
++               */
++              FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
++              isp_mark_getpdb_all(isp);
++              isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_SNS);
++              break;
++
++      case ASYNC_PTPMODE:
++              if (FCPARAM(isp)->isp_onfabric)
++                      FCPARAM(isp)->isp_topo = TOPO_F_PORT;
++              else
++                      FCPARAM(isp)->isp_topo = TOPO_N_PORT;
++              isp_mark_getpdb_all(isp);
++              isp->isp_sendmarker = 1;
++              FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++              FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
++              isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_async(isp, bus, mbox))
++                      rval = -1;
++#endif
++              isp_prt(isp, ISP_LOGINFO, "Point-to-Point mode");
++              break;
++
++      case ASYNC_CONNMODE:
++              mbox = ISP_READ(isp, OUTMAILBOX1);
++              isp_mark_getpdb_all(isp);
++              switch (mbox) {
++              case ISP_CONN_LOOP:
++                      isp_prt(isp, ISP_LOGINFO,
++                          "Point-to-Point -> Loop mode");
++                      break;
++              case ISP_CONN_PTP:
++                      isp_prt(isp, ISP_LOGINFO,
++                          "Loop -> Point-to-Point mode");
++                      break;
++              case ISP_CONN_BADLIP:
++                      isp_prt(isp, ISP_LOGWARN,
++                          "Point-to-Point -> Loop mode (BAD LIP)");
++                      break;
++              case ISP_CONN_FATAL:
++                      isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR");
++#ifdef        ISP_FW_CRASH_DUMP
++                      isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++#else
++                      isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++                      isp_reinit(isp);
++                      isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++#endif
++                      return (-1);
++              case ISP_CONN_LOOPBACK:
++                      isp_prt(isp, ISP_LOGWARN,
++                          "Looped Back in Point-to-Point mode");
++                      break;
++              default:
++                      isp_prt(isp, ISP_LOGWARN,
++                          "Unknown connection mode (0x%x)", mbox);
++                      break;
++              }
++              isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
++              isp->isp_sendmarker = 1;
++              FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++              FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD;
++              break;
++
++      default:
++              isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox);
++              break;
++      }
++
++      if (bus & 0x100) {
++              int i, nh;
++              u_int16_t handles[5];
++
++              for (nh = 0, i = 1; i < MAX_MAILBOX; i++) {
++                      if ((bus & (1 << i)) == 0) {
++                              continue;
++                      }
++                      handles[nh++] = ISP_READ(isp, MBOX_OFF(i));
++              }
++              for (i = 0; i < nh; i++) {
++                      isp_fastpost_complete(isp, handles[i]);
++                      isp_prt(isp,  ISP_LOGDEBUG3,
++                          "fast post completion of %u", handles[i]);
++              }
++              if (isp->isp_fpcchiwater < nh)
++                      isp->isp_fpcchiwater = nh;
++      } else {
++              isp->isp_intoasync++;
++      }
++      return (rval);
++}
++
++/*
++ * Handle other response entries. A pointer to the request queue output
++ * index is here in case we want to eat several entries at once, although
++ * this is not used currently.
++ */
++
++static int
++isp_handle_other_response(struct ispsoftc *isp, int type,
++    isphdr_t *hp, u_int16_t *optrp)
++{
++      switch (type) {
++      case RQSTYPE_STATUS_CONT:
++              isp_prt(isp, ISP_LOGINFO, "Ignored Continuation Response");
++              return (1);
++      case RQSTYPE_ATIO:
++      case RQSTYPE_CTIO:
++      case RQSTYPE_ENABLE_LUN:
++      case RQSTYPE_MODIFY_LUN:
++      case RQSTYPE_NOTIFY:
++      case RQSTYPE_NOTIFY_ACK:
++      case RQSTYPE_CTIO1:
++      case RQSTYPE_ATIO2:
++      case RQSTYPE_CTIO2:
++      case RQSTYPE_CTIO3:
++              isp->isp_rsltccmplt++;  /* count as a response completion */
++#ifdef        ISP_TARGET_MODE
++              if (isp_target_notify(isp, (ispstatusreq_t *) hp, optrp)) {
++                      return (1);
++              }
++#endif
++              /* FALLTHROUGH */
++      case RQSTYPE_REQUEST:
++      default:
++              if (isp_async(isp, ISPASYNC_UNHANDLED_RESPONSE, hp)) {
++                      return (1);
++              }
++              isp_prt(isp, ISP_LOGWARN, "Unhandled Response Type 0x%x",
++                  isp_get_response_type(isp, hp));
++              return (0);
++      }
++}
++
++static void
++isp_parse_status(struct ispsoftc *isp, ispstatusreq_t *sp, XS_T *xs)
++{
++      switch (sp->req_completion_status & 0xff) {
++      case RQCS_COMPLETE:
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_NOERROR);
++              }
++              return;
++
++      case RQCS_INCOMPLETE:
++              if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) {
++                      isp_prt(isp, ISP_LOGDEBUG1,
++                          "Selection Timeout for %d.%d.%d",
++                          XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++                      if (XS_NOERR(xs)) {
++                              XS_SETERR(xs, HBA_SELTIMEOUT);
++                      }
++                      return;
++              }
++              isp_prt(isp, ISP_LOGERR,
++                  "command incomplete for %d.%d.%d, state 0x%x",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs),
++                  sp->req_state_flags);
++              break;
++
++      case RQCS_DMA_ERROR:
++              isp_prt(isp, ISP_LOGERR, "DMA error for command on %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_TRANSPORT_ERROR:
++      {
++              char buf[172];
++              SNPRINTF(buf, sizeof (buf), "states=>");
++              if (sp->req_state_flags & RQSF_GOT_BUS) {
++                      SNPRINTF(buf, sizeof (buf), "%s GOT_BUS", buf);
++              }
++              if (sp->req_state_flags & RQSF_GOT_TARGET) {
++                      SNPRINTF(buf, sizeof (buf), "%s GOT_TGT", buf);
++              }
++              if (sp->req_state_flags & RQSF_SENT_CDB) {
++                      SNPRINTF(buf, sizeof (buf), "%s SENT_CDB", buf);
++              }
++              if (sp->req_state_flags & RQSF_XFRD_DATA) {
++                      SNPRINTF(buf, sizeof (buf), "%s XFRD_DATA", buf);
++              }
++              if (sp->req_state_flags & RQSF_GOT_STATUS) {
++                      SNPRINTF(buf, sizeof (buf), "%s GOT_STS", buf);
++              }
++              if (sp->req_state_flags & RQSF_GOT_SENSE) {
++                      SNPRINTF(buf, sizeof (buf), "%s GOT_SNS", buf);
++              }
++              if (sp->req_state_flags & RQSF_XFER_COMPLETE) {
++                      SNPRINTF(buf, sizeof (buf), "%s XFR_CMPLT", buf);
++              }
++              SNPRINTF(buf, sizeof (buf), "%s\nstatus=>", buf);
++              if (sp->req_status_flags & RQSTF_DISCONNECT) {
++                      SNPRINTF(buf, sizeof (buf), "%s Disconnect", buf);
++              }
++              if (sp->req_status_flags & RQSTF_SYNCHRONOUS) {
++                      SNPRINTF(buf, sizeof (buf), "%s Sync_xfr", buf);
++              }
++              if (sp->req_status_flags & RQSTF_PARITY_ERROR) {
++                      SNPRINTF(buf, sizeof (buf), "%s Parity", buf);
++              }
++              if (sp->req_status_flags & RQSTF_BUS_RESET) {
++                      SNPRINTF(buf, sizeof (buf), "%s Bus_Reset", buf);
++              }
++              if (sp->req_status_flags & RQSTF_DEVICE_RESET) {
++                      SNPRINTF(buf, sizeof (buf), "%s Device_Reset", buf);
++              }
++              if (sp->req_status_flags & RQSTF_ABORTED) {
++                      SNPRINTF(buf, sizeof (buf), "%s Aborted", buf);
++              }
++              if (sp->req_status_flags & RQSTF_TIMEOUT) {
++                      SNPRINTF(buf, sizeof (buf), "%s Timeout", buf);
++              }
++              if (sp->req_status_flags & RQSTF_NEGOTIATION) {
++                      SNPRINTF(buf, sizeof (buf), "%s Negotiation", buf);
++              }
++              isp_prt(isp, ISP_LOGERR, "%s", buf);
++              isp_prt(isp, ISP_LOGERR, "transport error for %d.%d.%d:\n%s",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), buf);
++              break;
++      }
++      case RQCS_RESET_OCCURRED:
++              isp_prt(isp, ISP_LOGWARN,
++                  "bus reset destroyed command for %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_BUSRESET);
++              }
++              return;
++
++      case RQCS_ABORTED:
++              isp_prt(isp, ISP_LOGERR, "command aborted for %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              isp->isp_sendmarker |= (1 << XS_CHANNEL(xs));
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_ABORTED);
++              }
++              return;
++
++      case RQCS_TIMEOUT:
++              isp_prt(isp, ISP_LOGWARN, "command timed out for %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              /*
++               * Check to see if we logged out the device.
++               */
++              if (IS_FC(isp)) {
++                      if ((sp->req_completion_status & RQSTF_LOGOUT) &&
++                          FCPARAM(isp)->portdb[XS_TGT(xs)].valid &&
++                          FCPARAM(isp)->portdb[XS_TGT(xs)].fabric_dev) {
++                              FCPARAM(isp)->portdb[XS_TGT(xs)].relogin = 1;
++                      }
++              }
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_CMDTIMEOUT);
++              }
++              return;
++
++      case RQCS_DATA_OVERRUN:
++              XS_RESID(xs) = sp->req_resid;
++              isp_prt(isp, ISP_LOGERR, "data overrun for command on %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_DATAOVR);
++              }
++              return;
++
++      case RQCS_COMMAND_OVERRUN:
++              isp_prt(isp, ISP_LOGERR,
++                  "command overrun for command on %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_STATUS_OVERRUN:
++              isp_prt(isp, ISP_LOGERR,
++                  "status overrun for command on %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_BAD_MESSAGE:
++              isp_prt(isp, ISP_LOGERR,
++                  "msg not COMMAND COMPLETE after status %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_NO_MESSAGE_OUT:
++              isp_prt(isp, ISP_LOGERR,
++                  "No MESSAGE OUT phase after selection on %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_EXT_ID_FAILED:
++              isp_prt(isp, ISP_LOGERR, "EXTENDED IDENTIFY failed %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_IDE_MSG_FAILED:
++              isp_prt(isp, ISP_LOGERR,
++                  "INITIATOR DETECTED ERROR rejected by %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_ABORT_MSG_FAILED:
++              isp_prt(isp, ISP_LOGERR, "ABORT OPERATION rejected by %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_REJECT_MSG_FAILED:
++              isp_prt(isp, ISP_LOGERR, "MESSAGE REJECT rejected by %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_NOP_MSG_FAILED:
++              isp_prt(isp, ISP_LOGERR, "NOP rejected by %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_PARITY_ERROR_MSG_FAILED:
++              isp_prt(isp, ISP_LOGERR,
++                  "MESSAGE PARITY ERROR rejected by %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_DEVICE_RESET_MSG_FAILED:
++              isp_prt(isp, ISP_LOGWARN,
++                  "BUS DEVICE RESET rejected by %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_ID_MSG_FAILED:
++              isp_prt(isp, ISP_LOGERR, "IDENTIFY rejected by %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_UNEXP_BUS_FREE:
++              isp_prt(isp, ISP_LOGERR, "%d.%d.%d had an unexpected bus free",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_DATA_UNDERRUN:
++      {
++              if (IS_FC(isp)) {
++                      int ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
++                      if (!ru_marked || sp->req_resid > XS_XFRLEN(xs)) {
++                              isp_prt(isp, ISP_LOGWARN, bun, XS_TGT(xs),
++                                  XS_LUN(xs), XS_XFRLEN(xs), sp->req_resid,
++                                  (ru_marked)? "marked" : "not marked");
++                              if (XS_NOERR(xs)) {
++                                      XS_SETERR(xs, HBA_BOTCH);
++                              }
++                              return;
++                      }
++              }
++              XS_RESID(xs) = sp->req_resid;
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_NOERROR);
++              }
++              return;
++      }
++
++      case RQCS_XACT_ERR1:
++              isp_prt(isp, ISP_LOGERR, xact1, XS_CHANNEL(xs),
++                  XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_XACT_ERR2:
++              isp_prt(isp, ISP_LOGERR, xact2,
++                  XS_LUN(xs), XS_TGT(xs), XS_CHANNEL(xs));
++              break;
++
++      case RQCS_XACT_ERR3:
++              isp_prt(isp, ISP_LOGERR, xact3,
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_BAD_ENTRY:
++              isp_prt(isp, ISP_LOGERR, "Invalid IOCB entry type detected");
++              break;
++
++      case RQCS_QUEUE_FULL:
++              isp_prt(isp, ISP_LOGDEBUG0,
++                  "internal queues full for %d.%d.%d status 0x%x",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), *XS_STSP(xs));
++
++              /*
++               * If QFULL or some other status byte is set, then this
++               * isn't an error, per se.
++               *
++               * Unfortunately, some QLogic f/w writers have, in
++               * some cases, ommitted to *set* status to QFULL.
++               *
++
++              if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_NOERROR);
++                      return;
++              }
++
++               *
++               *
++               */
++
++              *XS_STSP(xs) = SCSI_QFULL;
++              XS_SETERR(xs, HBA_NOERROR);
++              return;
++
++      case RQCS_PHASE_SKIPPED:
++              isp_prt(isp, ISP_LOGERR, pskip, XS_CHANNEL(xs),
++                  XS_TGT(xs), XS_LUN(xs));
++              break;
++
++      case RQCS_ARQS_FAILED:
++              isp_prt(isp, ISP_LOGERR,
++                  "Auto Request Sense failed for %d.%d.%d",
++                  XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_ARQFAIL);
++              }
++              return;
++
++      case RQCS_WIDE_FAILED:
++              isp_prt(isp, ISP_LOGERR,
++                  "Wide Negotiation failed for %d.%d.%d",
++                  XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
++              if (IS_SCSI(isp)) {
++                      sdparam *sdp = isp->isp_param;
++                      sdp += XS_CHANNEL(xs);
++                      sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_WIDE;
++                      sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
++                      isp->isp_update |= (1 << XS_CHANNEL(xs));
++              }
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_NOERROR);
++              }
++              return;
++
++      case RQCS_SYNCXFER_FAILED:
++              isp_prt(isp, ISP_LOGERR,
++                  "SDTR Message failed for target %d.%d.%d",
++                  XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
++              if (IS_SCSI(isp)) {
++                      sdparam *sdp = isp->isp_param;
++                      sdp += XS_CHANNEL(xs);
++                      sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_SYNC;
++                      sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
++                      isp->isp_update |= (1 << XS_CHANNEL(xs));
++              }
++              break;
++
++      case RQCS_LVD_BUSERR:
++              isp_prt(isp, ISP_LOGERR,
++                  "Bad LVD condition while talking to %d.%d.%d",
++                  XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs));
++              break;
++
++      case RQCS_PORT_UNAVAILABLE:
++              /*
++               * No such port on the loop. Moral equivalent of SELTIMEO
++               */
++      case RQCS_PORT_LOGGED_OUT:
++              /*
++               * It was there (maybe)- treat as a selection timeout.
++               */
++              if ((sp->req_completion_status & 0xff) == RQCS_PORT_UNAVAILABLE)
++                      isp_prt(isp, ISP_LOGINFO,
++                          "port unavailable for target %d", XS_TGT(xs));
++              else
++                      isp_prt(isp, ISP_LOGINFO,
++                          "port logout for target %d", XS_TGT(xs));
++              /*
++               * If we're on a local loop, force a LIP (which is overkill)
++               * to force a re-login of this unit. If we're on fabric,
++               * then we'll have to relogin as a matter of course.
++               */
++              if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT ||
++                  FCPARAM(isp)->isp_topo == TOPO_FL_PORT) {
++                      mbreg_t mbs;
++                      mbs.param[0] = MBOX_INIT_LIP;
++                      isp_mboxcmd_qnw(isp, &mbs, 1);
++              }
++
++              /*
++               * Probably overkill.
++               */
++              isp->isp_sendmarker = 1;
++              FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD;
++              isp_mark_getpdb_all(isp);
++              isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER);
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_SELTIMEOUT);
++              }
++              return;
++
++      case RQCS_PORT_CHANGED:
++              isp_prt(isp, ISP_LOGWARN,
++                  "port changed for target %d", XS_TGT(xs));
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_SELTIMEOUT);
++              }
++              return;
++
++      case RQCS_PORT_BUSY:
++              isp_prt(isp, ISP_LOGWARN,
++                  "port busy for target %d", XS_TGT(xs));
++              if (XS_NOERR(xs)) {
++                      XS_SETERR(xs, HBA_TGTBSY);
++              }
++              return;
++
++      default:
++              isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x",
++                  sp->req_completion_status);
++              break;
++      }
++      if (XS_NOERR(xs)) {
++              XS_SETERR(xs, HBA_BOTCH);
++      }
++}
++
++static void
++isp_fastpost_complete(struct ispsoftc *isp, u_int16_t fph)
++{
++      XS_T *xs;
++
++      if (fph == 0) {
++              return;
++      }
++      xs = isp_find_xs(isp, fph);
++      if (xs == NULL) {
++              isp_prt(isp, ISP_LOGWARN,
++                  "Command for fast post handle 0x%x not found", fph);
++              return;
++      }
++      isp_destroy_handle(isp, fph);
++
++      /*
++       * Since we don't have a result queue entry item,
++       * we must believe that SCSI status is zero and
++       * that all data transferred.
++       */
++      XS_SET_STATE_STAT(isp, xs, NULL);
++      XS_RESID(xs) = 0;
++      *XS_STSP(xs) = SCSI_GOOD;
++      if (XS_XFRLEN(xs)) {
++              ISP_DMAFREE(isp, xs, fph);
++      }
++      if (isp->isp_nactive)
++              isp->isp_nactive--;
++      isp->isp_fphccmplt++;
++      isp_done(xs);
++}
++
++static int
++isp_mbox_continue(struct ispsoftc *isp)
++{
++      mbreg_t mbs;
++      u_int16_t *ptr;
++
++      switch (isp->isp_lastmbxcmd) {
++      case MBOX_WRITE_RAM_WORD:
++      case MBOX_READ_RAM_WORD:
++      case MBOX_READ_RAM_WORD_EXTENDED:
++              break;
++      default:
++              return (1);
++      }
++      if (isp->isp_mboxtmp[0] != MBOX_COMMAND_COMPLETE) {
++              isp->isp_mbxwrk0 = 0;
++              return (-1);
++      }
++
++
++      /*
++       * Clear the previous interrupt.
++       */
++      ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++      ISP_WRITE(isp, BIU_SEMA, 0);
++
++      /*
++       * Continue with next word.
++       */
++      ptr = isp->isp_mbxworkp;
++      switch (isp->isp_lastmbxcmd) {
++      case MBOX_WRITE_RAM_WORD:
++              mbs.param[2] = *ptr++;
++              mbs.param[1] = isp->isp_mbxwrk1++;
++              break;
++      case MBOX_READ_RAM_WORD:
++      case MBOX_READ_RAM_WORD_EXTENDED:
++              *ptr++ = isp->isp_mboxtmp[2];
++              mbs.param[1] = isp->isp_mbxwrk1++;
++              break;
++      }
++      isp->isp_mbxworkp = ptr;
++      mbs.param[0] = isp->isp_lastmbxcmd;
++      isp->isp_mbxwrk0 -= 1;
++      isp_mboxcmd_qnw(isp, &mbs, 0);
++      return (0);
++}
++
++
++#define       HIBYT(x)                        ((x) >> 0x8)
++#define       LOBYT(x)                        ((x)  & 0xff)
++#define       ISPOPMAP(a, b)                  (((a) << 8) | (b))
++static const u_int16_t mbpscsi[] = {
++      ISPOPMAP(0x01, 0x01),   /* 0x00: MBOX_NO_OP */
++      ISPOPMAP(0x1f, 0x01),   /* 0x01: MBOX_LOAD_RAM */
++      ISPOPMAP(0x03, 0x01),   /* 0x02: MBOX_EXEC_FIRMWARE */
++      ISPOPMAP(0x1f, 0x01),   /* 0x03: MBOX_DUMP_RAM */
++      ISPOPMAP(0x07, 0x07),   /* 0x04: MBOX_WRITE_RAM_WORD */
++      ISPOPMAP(0x03, 0x07),   /* 0x05: MBOX_READ_RAM_WORD */
++      ISPOPMAP(0x3f, 0x3f),   /* 0x06: MBOX_MAILBOX_REG_TEST */
++      ISPOPMAP(0x03, 0x07),   /* 0x07: MBOX_VERIFY_CHECKSUM   */
++      ISPOPMAP(0x01, 0x0f),   /* 0x08: MBOX_ABOUT_FIRMWARE */
++      ISPOPMAP(0x00, 0x00),   /* 0x09: */
++      ISPOPMAP(0x00, 0x00),   /* 0x0a: */
++      ISPOPMAP(0x00, 0x00),   /* 0x0b: */
++      ISPOPMAP(0x00, 0x00),   /* 0x0c: */
++      ISPOPMAP(0x00, 0x00),   /* 0x0d: */
++      ISPOPMAP(0x01, 0x05),   /* 0x0e: MBOX_CHECK_FIRMWARE */
++      ISPOPMAP(0x00, 0x00),   /* 0x0f: */
++      ISPOPMAP(0x1f, 0x1f),   /* 0x10: MBOX_INIT_REQ_QUEUE */
++      ISPOPMAP(0x3f, 0x3f),   /* 0x11: MBOX_INIT_RES_QUEUE */
++      ISPOPMAP(0x0f, 0x0f),   /* 0x12: MBOX_EXECUTE_IOCB */
++      ISPOPMAP(0x03, 0x03),   /* 0x13: MBOX_WAKE_UP   */
++      ISPOPMAP(0x01, 0x3f),   /* 0x14: MBOX_STOP_FIRMWARE */
++      ISPOPMAP(0x0f, 0x0f),   /* 0x15: MBOX_ABORT */
++      ISPOPMAP(0x03, 0x03),   /* 0x16: MBOX_ABORT_DEVICE */
++      ISPOPMAP(0x07, 0x07),   /* 0x17: MBOX_ABORT_TARGET */
++      ISPOPMAP(0x07, 0x07),   /* 0x18: MBOX_BUS_RESET */
++      ISPOPMAP(0x03, 0x07),   /* 0x19: MBOX_STOP_QUEUE */
++      ISPOPMAP(0x03, 0x07),   /* 0x1a: MBOX_START_QUEUE */
++      ISPOPMAP(0x03, 0x07),   /* 0x1b: MBOX_SINGLE_STEP_QUEUE */
++      ISPOPMAP(0x03, 0x07),   /* 0x1c: MBOX_ABORT_QUEUE */
++      ISPOPMAP(0x03, 0x4f),   /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
++      ISPOPMAP(0x00, 0x00),   /* 0x1e: */
++      ISPOPMAP(0x01, 0x07),   /* 0x1f: MBOX_GET_FIRMWARE_STATUS */
++      ISPOPMAP(0x01, 0x07),   /* 0x20: MBOX_GET_INIT_SCSI_ID */
++      ISPOPMAP(0x01, 0x07),   /* 0x21: MBOX_GET_SELECT_TIMEOUT */
++      ISPOPMAP(0x01, 0xc7),   /* 0x22: MBOX_GET_RETRY_COUNT   */
++      ISPOPMAP(0x01, 0x07),   /* 0x23: MBOX_GET_TAG_AGE_LIMIT */
++      ISPOPMAP(0x01, 0x03),   /* 0x24: MBOX_GET_CLOCK_RATE */
++      ISPOPMAP(0x01, 0x07),   /* 0x25: MBOX_GET_ACT_NEG_STATE */
++      ISPOPMAP(0x01, 0x07),   /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */
++      ISPOPMAP(0x01, 0x07),   /* 0x27: MBOX_GET_PCI_PARAMS */
++      ISPOPMAP(0x03, 0x4f),   /* 0x28: MBOX_GET_TARGET_PARAMS */
++      ISPOPMAP(0x03, 0x0f),   /* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */
++      ISPOPMAP(0x01, 0x07),   /* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */
++      ISPOPMAP(0x00, 0x00),   /* 0x2b: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2c: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2d: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2e: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2f: */
++      ISPOPMAP(0x03, 0x03),   /* 0x30: MBOX_SET_INIT_SCSI_ID */
++      ISPOPMAP(0x07, 0x07),   /* 0x31: MBOX_SET_SELECT_TIMEOUT */
++      ISPOPMAP(0xc7, 0xc7),   /* 0x32: MBOX_SET_RETRY_COUNT   */
++      ISPOPMAP(0x07, 0x07),   /* 0x33: MBOX_SET_TAG_AGE_LIMIT */
++      ISPOPMAP(0x03, 0x03),   /* 0x34: MBOX_SET_CLOCK_RATE */
++      ISPOPMAP(0x07, 0x07),   /* 0x35: MBOX_SET_ACT_NEG_STATE */
++      ISPOPMAP(0x07, 0x07),   /* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */
++      ISPOPMAP(0x07, 0x07),   /* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */
++      ISPOPMAP(0x4f, 0x4f),   /* 0x38: MBOX_SET_TARGET_PARAMS */
++      ISPOPMAP(0x0f, 0x0f),   /* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */
++      ISPOPMAP(0x07, 0x07),   /* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */
++      ISPOPMAP(0x00, 0x00),   /* 0x3b: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3c: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3d: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3e: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3f: */
++      ISPOPMAP(0x01, 0x03),   /* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */
++      ISPOPMAP(0x3f, 0x01),   /* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */
++      ISPOPMAP(0x03, 0x07),   /* 0x42: MBOX_EXEC_BIOS_IOCB */
++      ISPOPMAP(0x00, 0x00),   /* 0x43: */
++      ISPOPMAP(0x00, 0x00),   /* 0x44: */
++      ISPOPMAP(0x03, 0x03),   /* 0x45: SET SYSTEM PARAMETER */
++      ISPOPMAP(0x01, 0x03),   /* 0x46: GET SYSTEM PARAMETER */
++      ISPOPMAP(0x00, 0x00),   /* 0x47: */
++      ISPOPMAP(0x01, 0xcf),   /* 0x48: GET SCAM CONFIGURATION */
++      ISPOPMAP(0xcf, 0xcf),   /* 0x49: SET SCAM CONFIGURATION */
++      ISPOPMAP(0x03, 0x03),   /* 0x4a: MBOX_SET_FIRMWARE_FEATURES */
++      ISPOPMAP(0x01, 0x03),   /* 0x4b: MBOX_GET_FIRMWARE_FEATURES */
++      ISPOPMAP(0x00, 0x00),   /* 0x4c: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4d: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4e: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4f: */
++      ISPOPMAP(0xdf, 0xdf),   /* 0x50: LOAD RAM A64 */
++      ISPOPMAP(0xdf, 0xdf),   /* 0x51: DUMP RAM A64 */
++      ISPOPMAP(0xdf, 0xff),   /* 0x52: INITIALIZE REQUEST QUEUE A64 */
++      ISPOPMAP(0xef, 0xff),   /* 0x53: INITIALIZE RESPONSE QUEUE A64 */
++      ISPOPMAP(0xcf, 0x01),   /* 0x54: EXECUTE IOCB A64 */
++      ISPOPMAP(0x07, 0x01),   /* 0x55: ENABLE TARGET MODE */
++      ISPOPMAP(0x03, 0x0f),   /* 0x56: GET TARGET STATUS */
++      ISPOPMAP(0x00, 0x00),   /* 0x57: */
++      ISPOPMAP(0x00, 0x00),   /* 0x58: */
++      ISPOPMAP(0x00, 0x00),   /* 0x59: */
++      ISPOPMAP(0x03, 0x03),   /* 0x5a: SET DATA OVERRUN RECOVERY MODE */
++      ISPOPMAP(0x01, 0x03),   /* 0x5b: GET DATA OVERRUN RECOVERY MODE */
++      ISPOPMAP(0x0f, 0x0f),   /* 0x5c: SET HOST DATA */
++      ISPOPMAP(0x01, 0x01)    /* 0x5d: GET NOST DATA */
++};
++
++#ifndef       ISP_STRIPPED
++static char *scsi_mbcmd_names[] = {
++      "NO-OP",
++      "LOAD RAM",
++      "EXEC FIRMWARE",
++      "DUMP RAM",
++      "WRITE RAM WORD",
++      "READ RAM WORD",
++      "MAILBOX REG TEST",
++      "VERIFY CHECKSUM",
++      "ABOUT FIRMWARE",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "CHECK FIRMWARE",
++      NULL,
++      "INIT REQUEST QUEUE",
++      "INIT RESULT QUEUE",
++      "EXECUTE IOCB",
++      "WAKE UP",
++      "STOP FIRMWARE",
++      "ABORT",
++      "ABORT DEVICE",
++      "ABORT TARGET",
++      "BUS RESET",
++      "STOP QUEUE",
++      "START QUEUE",
++      "SINGLE STEP QUEUE",
++      "ABORT QUEUE",
++      "GET DEV QUEUE STATUS",
++      NULL,
++      "GET FIRMWARE STATUS",
++      "GET INIT SCSI ID",
++      "GET SELECT TIMEOUT",
++      "GET RETRY COUNT",
++      "GET TAG AGE LIMIT",
++      "GET CLOCK RATE",
++      "GET ACT NEG STATE",
++      "GET ASYNC DATA SETUP TIME",
++      "GET PCI PARAMS",
++      "GET TARGET PARAMS",
++      "GET DEV QUEUE PARAMS",
++      "GET RESET DELAY PARAMS",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "SET INIT SCSI ID",
++      "SET SELECT TIMEOUT",
++      "SET RETRY COUNT",
++      "SET TAG AGE LIMIT",
++      "SET CLOCK RATE",
++      "SET ACT NEG STATE",
++      "SET ASYNC DATA SETUP TIME",
++      "SET PCI CONTROL PARAMS",
++      "SET TARGET PARAMS",
++      "SET DEV QUEUE PARAMS",
++      "SET RESET DELAY PARAMS",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "RETURN BIOS BLOCK ADDR",
++      "WRITE FOUR RAM WORDS",
++      "EXEC BIOS IOCB",
++      NULL,
++      NULL,
++      "SET SYSTEM PARAMETER",
++      "GET SYSTEM PARAMETER",
++      NULL,
++      "GET SCAM CONFIGURATION",
++      "SET SCAM CONFIGURATION",
++      "SET FIRMWARE FEATURES",
++      "GET FIRMWARE FEATURES",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "LOAD RAM A64",
++      "DUMP RAM A64",
++      "INITIALIZE REQUEST QUEUE A64",
++      "INITIALIZE RESPONSE QUEUE A64",
++      "EXECUTE IOCB A64",
++      "ENABLE TARGET MODE",
++      "GET TARGET MODE STATE",
++      NULL,
++      NULL,
++      NULL,
++      "SET DATA OVERRUN RECOVERY MODE",
++      "GET DATA OVERRUN RECOVERY MODE",
++      "SET HOST DATA",
++      "GET NOST DATA",
++};
++#endif
++
++static const u_int16_t mbpfc[] = {
++      ISPOPMAP(0x01, 0x01),   /* 0x00: MBOX_NO_OP */
++      ISPOPMAP(0x1f, 0x01),   /* 0x01: MBOX_LOAD_RAM */
++      ISPOPMAP(0x03, 0x01),   /* 0x02: MBOX_EXEC_FIRMWARE */
++      ISPOPMAP(0xdf, 0x01),   /* 0x03: MBOX_DUMP_RAM */
++      ISPOPMAP(0x07, 0x07),   /* 0x04: MBOX_WRITE_RAM_WORD */
++      ISPOPMAP(0x03, 0x07),   /* 0x05: MBOX_READ_RAM_WORD */
++      ISPOPMAP(0xff, 0xff),   /* 0x06: MBOX_MAILBOX_REG_TEST */
++      ISPOPMAP(0x03, 0x05),   /* 0x07: MBOX_VERIFY_CHECKSUM   */
++      ISPOPMAP(0x01, 0x4f),   /* 0x08: MBOX_ABOUT_FIRMWARE */
++      ISPOPMAP(0xdf, 0x01),   /* 0x09: LOAD RAM */
++      ISPOPMAP(0xdf, 0x01),   /* 0x0a: DUMP RAM */
++      ISPOPMAP(0x00, 0x00),   /* 0x0b: */
++      ISPOPMAP(0x00, 0x00),   /* 0x0c: */
++      ISPOPMAP(0x00, 0x00),   /* 0x0d: */
++      ISPOPMAP(0x01, 0x05),   /* 0x0e: MBOX_CHECK_FIRMWARE */
++      ISPOPMAP(0x03, 0x07),   /* 0x0f: MBOX_READ_RAM_WORD_EXTENDED(1) */
++      ISPOPMAP(0x1f, 0x11),   /* 0x10: MBOX_INIT_REQ_QUEUE */
++      ISPOPMAP(0x2f, 0x21),   /* 0x11: MBOX_INIT_RES_QUEUE */
++      ISPOPMAP(0x0f, 0x01),   /* 0x12: MBOX_EXECUTE_IOCB */
++      ISPOPMAP(0x03, 0x03),   /* 0x13: MBOX_WAKE_UP   */
++      ISPOPMAP(0x01, 0xff),   /* 0x14: MBOX_STOP_FIRMWARE */
++      ISPOPMAP(0x4f, 0x01),   /* 0x15: MBOX_ABORT */
++      ISPOPMAP(0x07, 0x01),   /* 0x16: MBOX_ABORT_DEVICE */
++      ISPOPMAP(0x07, 0x01),   /* 0x17: MBOX_ABORT_TARGET */
++      ISPOPMAP(0x03, 0x03),   /* 0x18: MBOX_BUS_RESET */
++      ISPOPMAP(0x07, 0x05),   /* 0x19: MBOX_STOP_QUEUE */
++      ISPOPMAP(0x07, 0x05),   /* 0x1a: MBOX_START_QUEUE */
++      ISPOPMAP(0x07, 0x05),   /* 0x1b: MBOX_SINGLE_STEP_QUEUE */
++      ISPOPMAP(0x07, 0x05),   /* 0x1c: MBOX_ABORT_QUEUE */
++      ISPOPMAP(0x07, 0x03),   /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
++      ISPOPMAP(0x00, 0x00),   /* 0x1e: */
++      ISPOPMAP(0x01, 0x07),   /* 0x1f: MBOX_GET_FIRMWARE_STATUS */
++      ISPOPMAP(0x01, 0x4f),   /* 0x20: MBOX_GET_LOOP_ID */
++      ISPOPMAP(0x00, 0x00),   /* 0x21: */
++      ISPOPMAP(0x01, 0x07),   /* 0x22: MBOX_GET_RETRY_COUNT   */
++      ISPOPMAP(0x00, 0x00),   /* 0x23: */
++      ISPOPMAP(0x00, 0x00),   /* 0x24: */
++      ISPOPMAP(0x00, 0x00),   /* 0x25: */
++      ISPOPMAP(0x00, 0x00),   /* 0x26: */
++      ISPOPMAP(0x00, 0x00),   /* 0x27: */
++      ISPOPMAP(0x01, 0x03),   /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */
++      ISPOPMAP(0x03, 0x07),   /* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */
++      ISPOPMAP(0x00, 0x00),   /* 0x2a: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2b: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2c: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2d: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2e: */
++      ISPOPMAP(0x00, 0x00),   /* 0x2f: */
++      ISPOPMAP(0x00, 0x00),   /* 0x30: */
++      ISPOPMAP(0x00, 0x00),   /* 0x31: */
++      ISPOPMAP(0x07, 0x07),   /* 0x32: MBOX_SET_RETRY_COUNT   */
++      ISPOPMAP(0x00, 0x00),   /* 0x33: */
++      ISPOPMAP(0x00, 0x00),   /* 0x34: */
++      ISPOPMAP(0x00, 0x00),   /* 0x35: */
++      ISPOPMAP(0x00, 0x00),   /* 0x36: */
++      ISPOPMAP(0x00, 0x00),   /* 0x37: */
++      ISPOPMAP(0x0f, 0x01),   /* 0x38: MBOX_SET_FIRMWARE_OPTIONS */
++      ISPOPMAP(0x0f, 0x07),   /* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */
++      ISPOPMAP(0x00, 0x00),   /* 0x3a: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3b: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3c: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3d: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3e: */
++      ISPOPMAP(0x00, 0x00),   /* 0x3f: */
++      ISPOPMAP(0x03, 0x01),   /* 0x40: MBOX_LOOP_PORT_BYPASS */
++      ISPOPMAP(0x03, 0x01),   /* 0x41: MBOX_LOOP_PORT_ENABLE */
++      ISPOPMAP(0x03, 0x07),   /* 0x42: MBOX_GET_RESOURCE_COUNTS */
++      ISPOPMAP(0x01, 0x01),   /* 0x43: MBOX_REQUEST_NON_PARTICIPATING_MODE */
++      ISPOPMAP(0x00, 0x00),   /* 0x44: */
++      ISPOPMAP(0x00, 0x00),   /* 0x45: */
++      ISPOPMAP(0x00, 0x00),   /* 0x46: */
++      ISPOPMAP(0xcf, 0x03),   /* 0x47: GET PORT_DATABASE ENHANCED */
++      ISPOPMAP(0x00, 0x00),   /* 0x48: */
++      ISPOPMAP(0x00, 0x00),   /* 0x49: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4a: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4b: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4c: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4d: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4e: */
++      ISPOPMAP(0x00, 0x00),   /* 0x4f: */
++      ISPOPMAP(0x00, 0x00),   /* 0x50: */
++      ISPOPMAP(0x00, 0x00),   /* 0x51: */
++      ISPOPMAP(0x00, 0x00),   /* 0x52: */
++      ISPOPMAP(0x00, 0x00),   /* 0x53: */
++      ISPOPMAP(0xcf, 0x01),   /* 0x54: EXECUTE IOCB A64 */
++      ISPOPMAP(0x00, 0x00),   /* 0x55: */
++      ISPOPMAP(0x00, 0x00),   /* 0x56: */
++      ISPOPMAP(0x00, 0x00),   /* 0x57: */
++      ISPOPMAP(0x00, 0x00),   /* 0x58: */
++      ISPOPMAP(0x00, 0x00),   /* 0x59: */
++      ISPOPMAP(0x00, 0x00),   /* 0x5a: */
++      ISPOPMAP(0x03, 0x01),   /* 0x5b: MBOX_DRIVER_HEARTBEAT */
++      ISPOPMAP(0xcf, 0x01),   /* 0x5c: MBOX_FW_HEARTBEAT */
++      ISPOPMAP(0x07, 0x03),   /* 0x5d: MBOX_GET_SET_DATA_RATE */
++      ISPOPMAP(0x00, 0x00),   /* 0x5e: */
++      ISPOPMAP(0x00, 0x00),   /* 0x5f: */
++      ISPOPMAP(0xfd, 0x31),   /* 0x60: MBOX_INIT_FIRMWARE */
++      ISPOPMAP(0x00, 0x00),   /* 0x61: */
++      ISPOPMAP(0x01, 0x01),   /* 0x62: MBOX_INIT_LIP */
++      ISPOPMAP(0xcd, 0x03),   /* 0x63: MBOX_GET_FC_AL_POSITION_MAP */
++      ISPOPMAP(0xcf, 0x01),   /* 0x64: MBOX_GET_PORT_DB */
++      ISPOPMAP(0x07, 0x01),   /* 0x65: MBOX_CLEAR_ACA */
++      ISPOPMAP(0x07, 0x01),   /* 0x66: MBOX_TARGET_RESET */
++      ISPOPMAP(0x07, 0x01),   /* 0x67: MBOX_CLEAR_TASK_SET */
++      ISPOPMAP(0x07, 0x01),   /* 0x68: MBOX_ABORT_TASK_SET */
++      ISPOPMAP(0x01, 0x07),   /* 0x69: MBOX_GET_FW_STATE */
++      ISPOPMAP(0x03, 0xcf),   /* 0x6a: MBOX_GET_PORT_NAME */
++      ISPOPMAP(0xcf, 0x01),   /* 0x6b: MBOX_GET_LINK_STATUS */
++      ISPOPMAP(0x0f, 0x01),   /* 0x6c: MBOX_INIT_LIP_RESET */
++      ISPOPMAP(0x00, 0x00),   /* 0x6d: */
++      ISPOPMAP(0xcf, 0x03),   /* 0x6e: MBOX_SEND_SNS */
++      ISPOPMAP(0x0f, 0x07),   /* 0x6f: MBOX_FABRIC_LOGIN */
++      ISPOPMAP(0x03, 0x01),   /* 0x70: MBOX_SEND_CHANGE_REQUEST */
++      ISPOPMAP(0x03, 0x03),   /* 0x71: MBOX_FABRIC_LOGOUT */
++      ISPOPMAP(0x0f, 0x0f),   /* 0x72: MBOX_INIT_LIP_LOGIN */
++      ISPOPMAP(0x00, 0x00),   /* 0x73: */
++      ISPOPMAP(0x07, 0x01),   /* 0x74: LOGIN LOOP PORT */
++      ISPOPMAP(0xcf, 0x03),   /* 0x75: GET PORT/NODE NAME LIST */
++      ISPOPMAP(0x4f, 0x01),   /* 0x76: SET VENDOR ID */
++      ISPOPMAP(0xcd, 0x01),   /* 0x77: INITIALIZE IP MAILBOX */
++      ISPOPMAP(0x00, 0x00),   /* 0x78: */
++      ISPOPMAP(0x00, 0x00),   /* 0x79: */
++      ISPOPMAP(0x00, 0x00),   /* 0x7a: */
++      ISPOPMAP(0x00, 0x00),   /* 0x7b: */
++      ISPOPMAP(0x4f, 0x03),   /* 0x7c: Get ID List */
++      ISPOPMAP(0xcf, 0x01),   /* 0x7d: SEND LFA */
++      ISPOPMAP(0x07, 0x01)    /* 0x7e: Lun RESET */
++};
++/*
++ * Footnotes
++ *
++ * (1): this sets bits 21..16 in mailbox register #8, which we nominally 
++ *    do not access at this time in the core driver. The caller is
++ *    responsible for setting this register first (Gross!).
++ */
++
++#ifndef       ISP_STRIPPED
++static char *fc_mbcmd_names[] = {
++      "NO-OP",
++      "LOAD RAM",
++      "EXEC FIRMWARE",
++      "DUMP RAM",
++      "WRITE RAM WORD",
++      "READ RAM WORD",
++      "MAILBOX REG TEST",
++      "VERIFY CHECKSUM",
++      "ABOUT FIRMWARE",
++      "LOAD RAM",
++      "DUMP RAM",
++      NULL,
++      NULL,
++      "READ RAM WORD EXTENDED",
++      "CHECK FIRMWARE",
++      NULL,
++      "INIT REQUEST QUEUE",
++      "INIT RESULT QUEUE",
++      "EXECUTE IOCB",
++      "WAKE UP",
++      "STOP FIRMWARE",
++      "ABORT",
++      "ABORT DEVICE",
++      "ABORT TARGET",
++      "BUS RESET",
++      "STOP QUEUE",
++      "START QUEUE",
++      "SINGLE STEP QUEUE",
++      "ABORT QUEUE",
++      "GET DEV QUEUE STATUS",
++      NULL,
++      "GET FIRMWARE STATUS",
++      "GET LOOP ID",
++      NULL,
++      "GET RETRY COUNT",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "GET FIRMWARE OPTIONS",
++      "GET PORT QUEUE PARAMS",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "SET RETRY COUNT",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "SET FIRMWARE OPTIONS",
++      "SET PORT QUEUE PARAMS",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "LOOP PORT BYPASS",
++      "LOOP PORT ENABLE",
++      "GET RESOURCE COUNTS",
++      "REQUEST NON PARTICIPATING MODE",
++      NULL,
++      NULL,
++      NULL,
++      "GET PORT DATABASE,, ENHANCED",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "EXECUTE IOCB A64",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "DRIVER HEARTBEAT",
++      NULL,
++      "GET/SET DATA RATE",
++      NULL,
++      NULL,
++      "INIT FIRMWARE",
++      NULL,
++      "INIT LIP",
++      "GET FC-AL POSITION MAP",
++      "GET PORT DATABASE",
++      "CLEAR ACA",
++      "TARGET RESET",
++      "CLEAR TASK SET",
++      "ABORT TASK SET",
++      "GET FW STATE",
++      "GET PORT NAME",
++      "GET LINK STATUS",
++      "INIT LIP RESET",
++      NULL,
++      "SEND SNS",
++      "FABRIC LOGIN",
++      "SEND CHANGE REQUEST",
++      "FABRIC LOGOUT",
++      "INIT LIP LOGIN",
++      NULL,
++      "LOGIN LOOP PORT",
++      "GET PORT/NODE NAME LIST",
++      "SET VENDOR ID",
++      "INITIALIZE IP MAILBOX",
++      NULL,
++      NULL,
++      NULL,
++      NULL,
++      "Get ID List",
++      "SEND LFA",
++      "Lun RESET"
++};
++#endif
++
++static void
++isp_mboxcmd_qnw(struct ispsoftc *isp, mbreg_t *mbp, int nodelay)
++{
++      unsigned int ibits, obits, box, opcode;
++      const u_int16_t *mcp;
++
++      if (IS_FC(isp)) {
++              mcp = mbpfc;
++      } else {
++              mcp = mbpscsi;
++      }
++      opcode = mbp->param[0];
++      ibits = HIBYT(mcp[opcode]) & NMBOX_BMASK(isp);
++      obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp);
++      for (box = 0; box < MAX_MAILBOX; box++) {
++              if (ibits & (1 << box)) {
++                      ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
++              }
++              if (nodelay == 0) {
++                      isp->isp_mboxtmp[box] = mbp->param[box] = 0;
++              }
++      }
++      if (nodelay == 0) {
++              isp->isp_lastmbxcmd = opcode;
++              isp->isp_obits = obits;
++              isp->isp_mboxbsy = 1;
++      }
++      ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
++      /*
++       * Oddly enough, if we're not delaying for an answer,
++       * delay a bit to give the f/w a chance to pick up the
++       * command.
++       */
++      if (nodelay) {
++              USEC_DELAY(1000);
++      }
++}
++
++static void
++isp_mboxcmd(struct ispsoftc *isp, mbreg_t *mbp, int logmask)
++{
++      char *cname, *xname, tname[16], mname[16];
++      unsigned int lim, ibits, obits, box, opcode;
++      const u_int16_t *mcp;
++
++      if (IS_FC(isp)) {
++              mcp = mbpfc;
++              lim = (sizeof (mbpfc) / sizeof (mbpfc[0]));
++      } else {
++              mcp = mbpscsi;
++              lim = (sizeof (mbpscsi) / sizeof (mbpscsi[0]));
++      }
++
++      if ((opcode = mbp->param[0]) >= lim) {
++              mbp->param[0] = MBOX_INVALID_COMMAND;
++              isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode);
++              return;
++      }
++
++      ibits = HIBYT(mcp[opcode]) & NMBOX_BMASK(isp);
++      obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp);
++
++      if (ibits == 0 && obits == 0) {
++              mbp->param[0] = MBOX_COMMAND_PARAM_ERROR;
++              isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode);
++              return;
++      }
++
++      /*
++       * Get exclusive usage of mailbox registers.
++       */
++      MBOX_ACQUIRE(isp);
++
++      for (box = 0; box < MAX_MAILBOX; box++) {
++              if (ibits & (1 << box)) {
++                      ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
++              }
++              isp->isp_mboxtmp[box] = mbp->param[box] = 0;
++      }
++
++      isp->isp_lastmbxcmd = opcode;
++
++      /*
++       * We assume that we can't overwrite a previous command.
++       */
++      isp->isp_obits = obits;
++      isp->isp_mboxbsy = 1;
++
++      /*
++       * Set Host Interrupt condition so that RISC will pick up mailbox regs.
++       */
++      ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
++
++      /*
++       * While we haven't finished the command, spin our wheels here.
++       */
++      MBOX_WAIT_COMPLETE(isp);
++
++      if (isp->isp_mboxbsy) {
++              /*
++               * Command timed out.
++               */
++              isp->isp_mboxbsy = 0;
++              MBOX_RELEASE(isp);
++              return;
++      }
++
++      /*
++       * Copy back output registers.
++       */
++      for (box = 0; box < MAX_MAILBOX; box++) {
++              if (obits & (1 << box)) {
++                      mbp->param[box] = isp->isp_mboxtmp[box];
++              }
++      }
++
++      MBOX_RELEASE(isp);
++
++      if (logmask == 0 || opcode == MBOX_EXEC_FIRMWARE) {
++              return;
++      }
++#ifdef        ISP_STRIPPED
++      cname = NULL;
++#else
++      cname = (IS_FC(isp))? fc_mbcmd_names[opcode] : scsi_mbcmd_names[opcode];
++#endif
++      if (cname == NULL) {
++              cname = tname;
++              SNPRINTF(tname, sizeof tname, "opcode %x", opcode);
++      }
++
++      /*
++       * Just to be chatty here...
++       */
++      xname = NULL;
++      switch (mbp->param[0]) {
++      case MBOX_COMMAND_COMPLETE:
++              break;
++      case MBOX_INVALID_COMMAND:
++              if (logmask & MBLOGMASK(MBOX_COMMAND_COMPLETE))
++                      xname = "INVALID COMMAND";
++              break;
++      case MBOX_HOST_INTERFACE_ERROR:
++              if (logmask & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR))
++                      xname = "HOST INTERFACE ERROR";
++              break;
++      case MBOX_TEST_FAILED:
++              if (logmask & MBLOGMASK(MBOX_TEST_FAILED))
++                      xname = "TEST FAILED";
++              break;
++      case MBOX_COMMAND_ERROR:
++              if (logmask & MBLOGMASK(MBOX_COMMAND_ERROR))
++                      xname = "COMMAND ERROR";
++              break;
++      case MBOX_COMMAND_PARAM_ERROR:
++              if (logmask & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR))
++                      xname = "COMMAND PARAMETER ERROR";
++              break;
++      case MBOX_LOOP_ID_USED:
++              if (logmask & MBLOGMASK(MBOX_LOOP_ID_USED))
++                      xname = "LOOP ID ALREADY IN USE";
++              break;
++      case MBOX_PORT_ID_USED:
++              if (logmask & MBLOGMASK(MBOX_PORT_ID_USED))
++                      xname = "PORT ID ALREADY IN USE";
++              break;
++      case MBOX_ALL_IDS_USED:
++              if (logmask & MBLOGMASK(MBOX_ALL_IDS_USED))
++                      xname = "ALL LOOP IDS IN USE";
++              break;
++      case 0:         /* special case */
++              xname = "TIMEOUT";
++              break;
++      default:
++              SNPRINTF(mname, sizeof mname, "error 0x%x", mbp->param[0]);
++              xname = mname;
++              break;
++      }
++      if (xname)
++              isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s)",
++                  cname, xname);
++}
++
++static void
++isp_fw_state(struct ispsoftc *isp)
++{
++      if (IS_FC(isp)) {
++              mbreg_t mbs;
++              fcparam *fcp = isp->isp_param;
++
++              mbs.param[0] = MBOX_GET_FW_STATE;
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
++                      fcp->isp_fwstate = mbs.param[1];
++              }
++      }
++}
++
++static void
++isp_update(struct ispsoftc *isp)
++{
++      int bus, upmask;
++
++      for (bus = 0, upmask = isp->isp_update; upmask != 0; bus++) {
++              if (upmask & (1 << bus)) {
++                      isp_update_bus(isp, bus);
++              }
++              upmask &= ~(1 << bus);
++      }
++}
++
++static void
++isp_update_bus(struct ispsoftc *isp, int bus)
++{
++      int tgt;
++      mbreg_t mbs;
++      sdparam *sdp;
++
++      isp->isp_update &= ~(1 << bus);
++      if (IS_FC(isp)) {
++              /*
++               * There are no 'per-bus' settings for Fibre Channel.
++               */
++              return;
++      }
++      sdp = isp->isp_param;
++      sdp += bus;
++
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              u_int16_t flags, period, offset;
++              int get;
++
++              if (sdp->isp_devparam[tgt].dev_enable == 0) {
++                      sdp->isp_devparam[tgt].dev_update = 0;
++                      sdp->isp_devparam[tgt].dev_refresh = 0;
++                      isp_prt(isp, ISP_LOGDEBUG0,
++                          "skipping target %d bus %d update", tgt, bus);
++                      continue;
++              }
++              /*
++               * If the goal is to update the status of the device,
++               * take what's in goal_flags and try and set the device
++               * toward that. Otherwise, if we're just refreshing the
++               * current device state, get the current parameters.
++               */
++
++              /*
++               * Refresh overrides set
++               */
++              if (sdp->isp_devparam[tgt].dev_refresh) {
++                      mbs.param[0] = MBOX_GET_TARGET_PARAMS;
++                      sdp->isp_devparam[tgt].dev_refresh = 0;
++                      get = 1;
++              } else if (sdp->isp_devparam[tgt].dev_update) {
++                      mbs.param[0] = MBOX_SET_TARGET_PARAMS;
++                      /*
++                       * Make sure goal_flags has "Renegotiate on Error"
++                       * on and "Freeze Queue on Error" off.
++                       */
++                      sdp->isp_devparam[tgt].goal_flags |= DPARM_RENEG;
++                      sdp->isp_devparam[tgt].goal_flags &= ~DPARM_QFRZ;
++
++                      mbs.param[2] = sdp->isp_devparam[tgt].goal_flags;
++
++                      /*
++                       * Insist that PARITY must be enabled
++                       * if SYNC or WIDE is enabled.
++                       */
++                      if ((mbs.param[2] & (DPARM_SYNC|DPARM_WIDE)) != 0) {
++                              mbs.param[2] |= DPARM_PARITY;
++                      }
++
++                      if ((mbs.param[2] & DPARM_SYNC) == 0) {
++                              mbs.param[3] = 0;
++                      } else {
++                              mbs.param[3] =
++                                  (sdp->isp_devparam[tgt].goal_offset << 8) |
++                                  (sdp->isp_devparam[tgt].goal_period);
++                      }
++                      /*
++                       * A command completion later that has
++                       * RQSTF_NEGOTIATION set can cause
++                       * the dev_refresh/announce cycle also.
++                       *
++                       * Note: It is really important to update our current
++                       * flags with at least the state of TAG capabilities-
++                       * otherwise we might try and send a tagged command
++                       * when we have it all turned off. So change it here
++                       * to say that current already matches goal.
++                       */
++                      sdp->isp_devparam[tgt].actv_flags &= ~DPARM_TQING;
++                      sdp->isp_devparam[tgt].actv_flags |=
++                          (sdp->isp_devparam[tgt].goal_flags & DPARM_TQING);
++                      isp_prt(isp, ISP_LOGDEBUG0,
++                          "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x",
++                          bus, tgt, mbs.param[2], mbs.param[3] >> 8,
++                          mbs.param[3] & 0xff);
++                      sdp->isp_devparam[tgt].dev_update = 0;
++                      sdp->isp_devparam[tgt].dev_refresh = 1;
++                      get = 0;
++              } else {
++                      continue;
++              }
++              mbs.param[1] = (bus << 15) | (tgt << 8);
++              isp_mboxcmd(isp, &mbs, MBLOGALL);
++              if (get == 0) {
++                      isp->isp_sendmarker |= (1 << bus);
++                      continue;
++              }
++              flags = mbs.param[2];
++              period = mbs.param[3] & 0xff;
++              offset = mbs.param[3] >> 8;
++              sdp->isp_devparam[tgt].actv_flags = flags;
++              sdp->isp_devparam[tgt].actv_period = period;
++              sdp->isp_devparam[tgt].actv_offset = offset;
++              get = (bus << 16) | tgt;
++              (void) isp_async(isp, ISPASYNC_NEW_TGT_PARAMS, &get);
++      }
++
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              if (sdp->isp_devparam[tgt].dev_update ||
++                  sdp->isp_devparam[tgt].dev_refresh) {
++                      isp->isp_update |= (1 << bus);
++                      break;
++              }
++      }
++}
++
++#ifndef       DEFAULT_FRAMESIZE
++#define       DEFAULT_FRAMESIZE(isp)          ICB_DFLT_FRMLEN
++#endif
++#ifndef       DEFAULT_EXEC_THROTTLE
++#define       DEFAULT_EXEC_THROTTLE(isp)      ISP_EXEC_THROTTLE
++#endif
++
++static void
++isp_setdfltparm(struct ispsoftc *isp, int channel)
++{
++      int tgt;
++      mbreg_t mbs;
++      sdparam *sdp;
++
++      if (IS_FC(isp)) {
++              fcparam *fcp = (fcparam *) isp->isp_param;
++              int nvfail;
++
++              fcp += channel;
++              if (fcp->isp_gotdparms) {
++                      return;
++              }
++              fcp->isp_gotdparms = 1;
++              fcp->isp_maxfrmlen = DEFAULT_FRAMESIZE(isp);
++              fcp->isp_maxalloc = ICB_DFLT_ALLOC;
++              fcp->isp_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
++              fcp->isp_retry_delay = ICB_DFLT_RDELAY;
++              fcp->isp_retry_count = ICB_DFLT_RCOUNT;
++              /* Platform specific.... */
++              fcp->isp_loopid = DEFAULT_LOOPID(isp);
++              fcp->isp_nodewwn = DEFAULT_NODEWWN(isp);
++              fcp->isp_portwwn = DEFAULT_PORTWWN(isp);
++              fcp->isp_fwoptions = 0;
++              fcp->isp_fwoptions |= ICBOPT_FAIRNESS;
++              fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
++              fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
++#ifndef       ISP_NO_FASTPOST_FC
++              fcp->isp_fwoptions |= ICBOPT_FAST_POST;
++#endif
++              if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX)
++                      fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX;
++
++              /*
++               * Make sure this is turned off now until we get
++               * extended options from NVRAM
++               */
++              fcp->isp_fwoptions &= ~ICBOPT_EXTENDED;
++
++              /*
++               * Now try and read NVRAM unless told to not do so.
++               * This will set fcparam's isp_nodewwn && isp_portwwn.
++               */
++              if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
++                      nvfail = isp_read_nvram(isp);
++                      if (nvfail)
++                              isp->isp_confopts |= ISP_CFG_NONVRAM;
++              } else {
++                      nvfail = 1;
++              }
++              /*
++               * Set node && port to override platform set defaults
++               * unless the nvram read failed (or none was done),
++               * or the platform code wants to use what had been
++               * set in the defaults.
++               */
++              if (nvfail) {
++                      isp->isp_confopts |= ISP_CFG_OWNWWPN|ISP_CFG_OWNWWNN;
++              }
++              if (isp->isp_confopts & ISP_CFG_OWNWWNN) {
++                      isp_prt(isp, ISP_LOGCONFIG, "Using Node WWN 0x%08x%08x",
++                          (u_int32_t) (DEFAULT_NODEWWN(isp) >> 32),
++                          (u_int32_t) (DEFAULT_NODEWWN(isp) & 0xffffffff));
++                      ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp);
++              } else {
++                      /*
++                       * We always start out with values derived
++                       * from NVRAM or our platform default.
++                       */
++                      ISP_NODEWWN(isp) = fcp->isp_nodewwn;
++              }
++              if (isp->isp_confopts & ISP_CFG_OWNWWPN) {
++                      isp_prt(isp, ISP_LOGCONFIG, "Using Port WWN 0x%08x%08x",
++                          (u_int32_t) (DEFAULT_PORTWWN(isp) >> 32),
++                          (u_int32_t) (DEFAULT_PORTWWN(isp) & 0xffffffff));
++                      ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp);
++              } else {
++                      /*
++                       * We always start out with values derived
++                       * from NVRAM or our platform default.
++                       */
++                      ISP_PORTWWN(isp) = fcp->isp_portwwn;
++              }
++              return;
++      }
++
++      sdp = (sdparam *) isp->isp_param;
++      sdp += channel;
++
++      /*
++       * Been there, done that, got the T-shirt...
++       */
++      if (sdp->isp_gotdparms) {
++              return;
++      }
++      sdp->isp_gotdparms = 1;
++
++      /*
++       * Establish some default parameters.
++       */
++      sdp->isp_cmd_dma_burst_enable = 0;
++      sdp->isp_data_dma_burst_enabl = 1;
++      sdp->isp_fifo_threshold = 0;
++      sdp->isp_initiator_id = DEFAULT_IID(isp);
++      if (isp->isp_type >= ISP_HA_SCSI_1040) {
++              sdp->isp_async_data_setup = 9;
++      } else {
++              sdp->isp_async_data_setup = 6;
++      }
++      sdp->isp_selection_timeout = 250;
++      sdp->isp_max_queue_depth = MAXISPREQUEST(isp);
++      sdp->isp_tag_aging = 8;
++      sdp->isp_bus_reset_delay = 5;
++      /*
++       * Don't retry selection, busy or queue full automatically- reflect
++       * these back to us.
++       */
++      sdp->isp_retry_count = 0;
++      sdp->isp_retry_delay = 0;
++
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE;
++              sdp->isp_devparam[tgt].dev_enable = 1;
++      }
++
++      /*
++       * If we've not been told to avoid reading NVRAM, try and read it.
++       * If we're successful reading it, we can then return because NVRAM
++       * will tell us what the desired settings are. Otherwise, we establish
++       * some reasonable 'fake' nvram and goal defaults.
++       */
++
++      if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
++              if (isp_read_nvram(isp) == 0) {
++                      return;
++              }
++      }
++
++      /*
++       * Now try and see whether we have specific values for them.
++       */
++      if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
++              mbs.param[0] = MBOX_GET_ACT_NEG_STATE;
++              isp_mboxcmd(isp, &mbs, MBLOGNONE);
++              if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++                      sdp->isp_req_ack_active_neg = 1;
++                      sdp->isp_data_line_active_neg = 1;
++              } else {
++                      sdp->isp_req_ack_active_neg =
++                          (mbs.param[1+channel] >> 4) & 0x1;
++                      sdp->isp_data_line_active_neg =
++                          (mbs.param[1+channel] >> 5) & 0x1;
++              }
++      }
++
++      isp_prt(isp, ISP_LOGDEBUG0, sc0, sc3,
++          0, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
++          sdp->isp_bus_reset_delay, sdp->isp_retry_count,
++          sdp->isp_retry_delay, sdp->isp_async_data_setup);
++      isp_prt(isp, ISP_LOGDEBUG0, sc1, sc3,
++          sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
++          sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
++          sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
++
++      /*
++       * The trick here is to establish a default for the default (honk!)
++       * state (goal_flags). Then try and get the current status from
++       * the card to fill in the current state. We don't, in fact, set
++       * the default to the SAFE default state- that's not the goal state.
++       */
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              u_int8_t off, per;
++              sdp->isp_devparam[tgt].actv_offset = 0;
++              sdp->isp_devparam[tgt].actv_period = 0;
++              sdp->isp_devparam[tgt].actv_flags = 0;
++
++              sdp->isp_devparam[tgt].goal_flags =
++                  sdp->isp_devparam[tgt].nvrm_flags = DPARM_DEFAULT;
++
++              /*
++               * We default to Wide/Fast for versions less than a 1040
++               * (unless it's SBus).
++               */
++              if (IS_ULTRA3(isp)) {
++                      off = ISP_80M_SYNCPARMS >> 8;
++                      per = ISP_80M_SYNCPARMS & 0xff;
++              } else if (IS_ULTRA2(isp)) {
++                      off = ISP_40M_SYNCPARMS >> 8;
++                      per = ISP_40M_SYNCPARMS & 0xff;
++              } else if (IS_1240(isp)) {
++                      off = ISP_20M_SYNCPARMS >> 8;
++                      per = ISP_20M_SYNCPARMS & 0xff;
++              } else if ((isp->isp_bustype == ISP_BT_SBUS &&
++                  isp->isp_type < ISP_HA_SCSI_1020A) ||
++                  (isp->isp_bustype == ISP_BT_PCI &&
++                  isp->isp_type < ISP_HA_SCSI_1040) ||
++                  (isp->isp_clock && isp->isp_clock < 60) ||
++                  (sdp->isp_ultramode == 0)) {
++                      off = ISP_10M_SYNCPARMS >> 8;
++                      per = ISP_10M_SYNCPARMS & 0xff;
++              } else {
++                      off = ISP_20M_SYNCPARMS_1040 >> 8;
++                      per = ISP_20M_SYNCPARMS_1040 & 0xff;
++              }
++              sdp->isp_devparam[tgt].goal_offset =
++                  sdp->isp_devparam[tgt].nvrm_offset = off;
++              sdp->isp_devparam[tgt].goal_period =
++                  sdp->isp_devparam[tgt].nvrm_period = per;
++
++              isp_prt(isp, ISP_LOGDEBUG0, sc2, sc3,
++                  channel, tgt, sdp->isp_devparam[tgt].nvrm_flags,
++                  sdp->isp_devparam[tgt].nvrm_offset,
++                  sdp->isp_devparam[tgt].nvrm_period);
++      }
++}
++
++/*
++ * Re-initialize the ISP and complete all orphaned commands
++ * with a 'botched' notice. The reset/init routines should
++ * not disturb an already active list of commands.
++ *
++ * Locks held prior to coming here.
++ */
++
++void
++isp_reinit(struct ispsoftc *isp)
++{
++      XS_T *xs;
++      u_int16_t handle;
++
++      if (IS_FC(isp)) {
++              isp_mark_getpdb_all(isp);
++      }
++      isp_reset(isp);
++      if (isp->isp_state != ISP_RESETSTATE) {
++              isp_prt(isp, ISP_LOGERR, "isp_reinit cannot reset card");
++      } else if (isp->isp_role != ISP_ROLE_NONE) {
++              isp_init(isp);
++              if (isp->isp_state == ISP_INITSTATE) {
++                      isp->isp_state = ISP_RUNSTATE;
++              }
++              if (isp->isp_state != ISP_RUNSTATE) {
++                      isp_prt(isp, ISP_LOGERR,
++                          "isp_reinit cannot restart card");
++              }
++      }
++      isp->isp_nactive = 0;
++
++      for (handle = 1; (int) handle <= isp->isp_maxcmds; handle++) {
++              xs = isp_find_xs(isp, handle);
++              if (xs == NULL) {
++                      continue;
++              }
++              isp_destroy_handle(isp, handle);
++              if (XS_XFRLEN(xs)) {
++                      ISP_DMAFREE(isp, xs, handle);
++                      XS_RESID(xs) = XS_XFRLEN(xs);
++              } else {
++                      XS_RESID(xs) = 0;
++              }
++              XS_SETERR(xs, HBA_BUSRESET);
++              isp_done(xs);
++      }
++}
++
++/*
++ * NVRAM Routines
++ */
++static int
++isp_read_nvram(struct ispsoftc *isp)
++{
++      int i, amt;
++      u_int8_t csum, minversion;
++      union {
++              u_int8_t _x[ISP2100_NVRAM_SIZE];
++              u_int16_t _s[ISP2100_NVRAM_SIZE>>1];
++      } _n;
++#define       nvram_data      _n._x
++#define       nvram_words     _n._s
++
++      if (IS_FC(isp)) {
++              amt = ISP2100_NVRAM_SIZE;
++              minversion = 1;
++      } else if (IS_ULTRA2(isp)) {
++              amt = ISP1080_NVRAM_SIZE;
++              minversion = 0;
++      } else {
++              amt = ISP_NVRAM_SIZE;
++              minversion = 2;
++      }
++
++      /*
++       * Just read the first two words first to see if we have a valid
++       * NVRAM to continue reading the rest with.
++       */
++      for (i = 0; i < 2; i++) {
++              isp_rdnvram_word(isp, i, &nvram_words[i]);
++      }
++      if (nvram_data[0] != 'I' || nvram_data[1] != 'S' ||
++          nvram_data[2] != 'P') {
++              if (isp->isp_bustype != ISP_BT_SBUS) {
++                      isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header");
++                      isp_prt(isp, ISP_LOGDEBUG0, "%x %x %x",
++                          nvram_data[0], nvram_data[1], nvram_data[2]);
++              }
++              return (-1);
++      }
++      for (i = 2; i < amt>>1; i++) {
++              isp_rdnvram_word(isp, i, &nvram_words[i]);
++      }
++      for (csum = 0, i = 0; i < amt; i++) {
++              csum += nvram_data[i];
++      }
++      if (csum != 0) {
++              isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum");
++              return (-1);
++      }
++      if (ISP_NVRAM_VERSION(nvram_data) < minversion) {
++              isp_prt(isp, ISP_LOGWARN, "version %d NVRAM not understood",
++                  ISP_NVRAM_VERSION(nvram_data));
++              return (-1);
++      }
++
++      if (IS_ULTRA3(isp)) {
++              isp_parse_nvram_12160(isp, 0, nvram_data);
++              if (IS_12160(isp))
++                      isp_parse_nvram_12160(isp, 1, nvram_data);
++      } else if (IS_1080(isp)) {
++              isp_parse_nvram_1080(isp, 0, nvram_data);
++      } else if (IS_1280(isp) || IS_1240(isp)) {
++              isp_parse_nvram_1080(isp, 0, nvram_data);
++              isp_parse_nvram_1080(isp, 1, nvram_data);
++      } else if (IS_SCSI(isp)) {
++              isp_parse_nvram_1020(isp, nvram_data);
++      } else {
++              isp_parse_nvram_2100(isp, nvram_data);
++      }
++      return (0);
++#undef        nvram_data
++#undef        nvram_words
++}
++
++static void
++isp_rdnvram_word(struct ispsoftc *isp, int wo, u_int16_t *rp)
++{
++      int i, cbits;
++      u_int16_t bit, rqst;
++
++      ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
++      USEC_DELAY(2);
++      ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
++      USEC_DELAY(2);
++
++      if (IS_FC(isp)) {
++              wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1);
++              if (IS_2312(isp) && isp->isp_port) {
++                      wo += 128;
++              }
++              rqst = (ISP_NVRAM_READ << 8) | wo;
++              cbits = 10;
++      } else if (IS_ULTRA2(isp)) {
++              wo &= ((ISP1080_NVRAM_SIZE >> 1) - 1);
++              rqst = (ISP_NVRAM_READ << 8) | wo;
++              cbits = 10;
++      } else {
++              wo &= ((ISP_NVRAM_SIZE >> 1) - 1);
++              rqst = (ISP_NVRAM_READ << 6) | wo;
++              cbits = 8;
++      }
++
++      /*
++       * Clock the word select request out...
++       */
++      for (i = cbits; i >= 0; i--) {
++              if ((rqst >> i) & 1) {
++                      bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT;
++              } else {
++                      bit = BIU_NVRAM_SELECT;
++              }
++              ISP_WRITE(isp, BIU_NVRAM, bit);
++              USEC_DELAY(2);
++              ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK);
++              USEC_DELAY(2);
++              ISP_WRITE(isp, BIU_NVRAM, bit);
++              USEC_DELAY(2);
++      }
++      /*
++       * Now read the result back in (bits come back in MSB format).
++       */
++      *rp = 0;
++      for (i = 0; i < 16; i++) {
++              u_int16_t rv;
++              *rp <<= 1;
++              ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
++              USEC_DELAY(2);
++              rv = ISP_READ(isp, BIU_NVRAM);
++              if (rv & BIU_NVRAM_DATAIN) {
++                      *rp |= 1;
++              }
++              USEC_DELAY(2);
++              ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
++              USEC_DELAY(2);
++      }
++      ISP_WRITE(isp, BIU_NVRAM, 0);
++      USEC_DELAY(2);
++      ISP_SWIZZLE_NVRAM_WORD(isp, rp);
++}
++
++static void
++isp_parse_nvram_1020(struct ispsoftc *isp, u_int8_t *nvram_data)
++{
++      sdparam *sdp = (sdparam *) isp->isp_param;
++      int tgt;
++
++      sdp->isp_fifo_threshold =
++              ISP_NVRAM_FIFO_THRESHOLD(nvram_data) |
++              (ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2);
++
++      if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
++              sdp->isp_initiator_id =
++                      ISP_NVRAM_INITIATOR_ID(nvram_data);
++
++      sdp->isp_bus_reset_delay =
++              ISP_NVRAM_BUS_RESET_DELAY(nvram_data);
++
++      sdp->isp_retry_count =
++              ISP_NVRAM_BUS_RETRY_COUNT(nvram_data);
++
++      sdp->isp_retry_delay =
++              ISP_NVRAM_BUS_RETRY_DELAY(nvram_data);
++
++      sdp->isp_async_data_setup =
++              ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data);
++
++      if (isp->isp_type >= ISP_HA_SCSI_1040) {
++              if (sdp->isp_async_data_setup < 9) {
++                      sdp->isp_async_data_setup = 9;
++              }
++      } else {
++              if (sdp->isp_async_data_setup != 6) {
++                      sdp->isp_async_data_setup = 6;
++              }
++      }
++
++      sdp->isp_req_ack_active_neg =
++              ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data);
++
++      sdp->isp_data_line_active_neg =
++              ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data);
++
++      sdp->isp_data_dma_burst_enabl =
++              ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data);
++
++      sdp->isp_cmd_dma_burst_enable =
++              ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data);
++
++      sdp->isp_tag_aging =
++              ISP_NVRAM_TAG_AGE_LIMIT(nvram_data);
++
++      sdp->isp_selection_timeout =
++              ISP_NVRAM_SELECTION_TIMEOUT(nvram_data);
++
++      sdp->isp_max_queue_depth =
++              ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data);
++
++      sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data);
++
++      isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
++          0, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
++          sdp->isp_bus_reset_delay, sdp->isp_retry_count,
++          sdp->isp_retry_delay, sdp->isp_async_data_setup);
++      isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
++          sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
++          sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
++          sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
++
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              sdp->isp_devparam[tgt].dev_enable =
++                      ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt);
++              sdp->isp_devparam[tgt].exc_throttle =
++                      ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt);
++              sdp->isp_devparam[tgt].nvrm_offset =
++                      ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt);
++              sdp->isp_devparam[tgt].nvrm_period =
++                      ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt);
++              /*
++               * We probably shouldn't lie about this, but it
++               * it makes it much safer if we limit NVRAM values
++               * to sanity.
++               */
++              if (isp->isp_type < ISP_HA_SCSI_1040) {
++                      /*
++                       * If we're not ultra, we can't possibly
++                       * be a shorter period than this.
++                       */
++                      if (sdp->isp_devparam[tgt].nvrm_period < 0x19) {
++                              sdp->isp_devparam[tgt].nvrm_period = 0x19;
++                      }
++                      if (sdp->isp_devparam[tgt].nvrm_offset > 0xc) {
++                              sdp->isp_devparam[tgt].nvrm_offset = 0x0c;
++                      }
++              } else {
++                      if (sdp->isp_devparam[tgt].nvrm_offset > 0x8) {
++                              sdp->isp_devparam[tgt].nvrm_offset = 0x8;
++                      }
++              }
++              sdp->isp_devparam[tgt].nvrm_flags = 0;
++              if (ISP_NVRAM_TGT_RENEG(nvram_data, tgt))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
++              sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
++              if (ISP_NVRAM_TGT_TQING(nvram_data, tgt))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
++              if (ISP_NVRAM_TGT_SYNC(nvram_data, tgt))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
++              if (ISP_NVRAM_TGT_WIDE(nvram_data, tgt))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
++              if (ISP_NVRAM_TGT_PARITY(nvram_data, tgt))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
++              if (ISP_NVRAM_TGT_DISC(nvram_data, tgt))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
++              sdp->isp_devparam[tgt].actv_flags = 0; /* we don't know */
++              isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
++                  0, tgt, sdp->isp_devparam[tgt].nvrm_flags,
++                  sdp->isp_devparam[tgt].nvrm_offset,
++                  sdp->isp_devparam[tgt].nvrm_period);
++              sdp->isp_devparam[tgt].goal_offset =
++                  sdp->isp_devparam[tgt].nvrm_offset;
++              sdp->isp_devparam[tgt].goal_period =
++                  sdp->isp_devparam[tgt].nvrm_period;
++              sdp->isp_devparam[tgt].goal_flags =
++                  sdp->isp_devparam[tgt].nvrm_flags;
++      }
++}
++
++static void
++isp_parse_nvram_1080(struct ispsoftc *isp, int bus, u_int8_t *nvram_data)
++{
++      sdparam *sdp = (sdparam *) isp->isp_param;
++      int tgt;
++
++      sdp += bus;
++
++      sdp->isp_fifo_threshold =
++          ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data);
++
++      if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
++              sdp->isp_initiator_id =
++                  ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus);
++
++      sdp->isp_bus_reset_delay =
++          ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
++
++      sdp->isp_retry_count =
++          ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
++
++      sdp->isp_retry_delay =
++          ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
++
++      sdp->isp_async_data_setup =
++          ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
++
++      sdp->isp_req_ack_active_neg =
++          ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
++
++      sdp->isp_data_line_active_neg =
++          ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
++
++      sdp->isp_data_dma_burst_enabl =
++          ISP1080_NVRAM_BURST_ENABLE(nvram_data);
++
++      sdp->isp_cmd_dma_burst_enable =
++          ISP1080_NVRAM_BURST_ENABLE(nvram_data);
++
++      sdp->isp_selection_timeout =
++          ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
++
++      sdp->isp_max_queue_depth =
++           ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
++
++      isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
++          bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
++          sdp->isp_bus_reset_delay, sdp->isp_retry_count,
++          sdp->isp_retry_delay, sdp->isp_async_data_setup);
++      isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
++          sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
++          sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
++          sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
++
++
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              sdp->isp_devparam[tgt].dev_enable =
++                  ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
++              sdp->isp_devparam[tgt].exc_throttle =
++                      ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
++              sdp->isp_devparam[tgt].nvrm_offset =
++                      ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
++              sdp->isp_devparam[tgt].nvrm_period =
++                      ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
++              sdp->isp_devparam[tgt].nvrm_flags = 0;
++              if (ISP1080_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
++              sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
++              if (ISP1080_NVRAM_TGT_TQING(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
++              if (ISP1080_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
++              if (ISP1080_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
++              if (ISP1080_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
++              if (ISP1080_NVRAM_TGT_DISC(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
++              sdp->isp_devparam[tgt].actv_flags = 0;
++              isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
++                  bus, tgt, sdp->isp_devparam[tgt].nvrm_flags,
++                  sdp->isp_devparam[tgt].nvrm_offset,
++                  sdp->isp_devparam[tgt].nvrm_period);
++              sdp->isp_devparam[tgt].goal_offset =
++                  sdp->isp_devparam[tgt].nvrm_offset;
++              sdp->isp_devparam[tgt].goal_period =
++                  sdp->isp_devparam[tgt].nvrm_period;
++              sdp->isp_devparam[tgt].goal_flags =
++                  sdp->isp_devparam[tgt].nvrm_flags;
++      }
++}
++
++static void
++isp_parse_nvram_12160(struct ispsoftc *isp, int bus, u_int8_t *nvram_data)
++{
++      sdparam *sdp = (sdparam *) isp->isp_param;
++      int tgt;
++
++      sdp += bus;
++
++      sdp->isp_fifo_threshold =
++          ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data);
++
++      if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
++              sdp->isp_initiator_id =
++                  ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus);
++
++      sdp->isp_bus_reset_delay =
++          ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
++
++      sdp->isp_retry_count =
++          ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
++
++      sdp->isp_retry_delay =
++          ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
++
++      sdp->isp_async_data_setup =
++          ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
++
++      sdp->isp_req_ack_active_neg =
++          ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
++
++      sdp->isp_data_line_active_neg =
++          ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
++
++      sdp->isp_data_dma_burst_enabl =
++          ISP12160_NVRAM_BURST_ENABLE(nvram_data);
++
++      sdp->isp_cmd_dma_burst_enable =
++          ISP12160_NVRAM_BURST_ENABLE(nvram_data);
++
++      sdp->isp_selection_timeout =
++          ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
++
++      sdp->isp_max_queue_depth =
++           ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
++
++      isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4,
++          bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id,
++          sdp->isp_bus_reset_delay, sdp->isp_retry_count,
++          sdp->isp_retry_delay, sdp->isp_async_data_setup);
++      isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4,
++          sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg,
++          sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable,
++          sdp->isp_selection_timeout, sdp->isp_max_queue_depth);
++
++      for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
++              sdp->isp_devparam[tgt].dev_enable =
++                  ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
++              sdp->isp_devparam[tgt].exc_throttle =
++                      ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
++              sdp->isp_devparam[tgt].nvrm_offset =
++                      ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
++              sdp->isp_devparam[tgt].nvrm_period =
++                      ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
++              sdp->isp_devparam[tgt].nvrm_flags = 0;
++              if (ISP12160_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
++              sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
++              if (ISP12160_NVRAM_TGT_TQING(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
++              if (ISP12160_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
++              if (ISP12160_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
++              if (ISP12160_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
++              if (ISP12160_NVRAM_TGT_DISC(nvram_data, tgt, bus))
++                      sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
++              sdp->isp_devparam[tgt].actv_flags = 0;
++              isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4,
++                  bus, tgt, sdp->isp_devparam[tgt].nvrm_flags,
++                  sdp->isp_devparam[tgt].nvrm_offset,
++                  sdp->isp_devparam[tgt].nvrm_period);
++              sdp->isp_devparam[tgt].goal_offset =
++                  sdp->isp_devparam[tgt].nvrm_offset;
++              sdp->isp_devparam[tgt].goal_period =
++                  sdp->isp_devparam[tgt].nvrm_period;
++              sdp->isp_devparam[tgt].goal_flags =
++                  sdp->isp_devparam[tgt].nvrm_flags;
++      }
++}
++
++static void
++isp_parse_nvram_2100(struct ispsoftc *isp, u_int8_t *nvram_data)
++{
++      fcparam *fcp = (fcparam *) isp->isp_param;
++      u_int64_t wwn;
++
++      /*
++       * There is NVRAM storage for both Port and Node entities-
++       * but the Node entity appears to be unused on all the cards
++       * I can find. However, we should account for this being set
++       * at some point in the future.
++       *
++       * Qlogic WWNs have an NAA of 2, but usually nothing shows up in
++       * bits 48..60. In the case of the 2202, it appears that they do
++       * use bit 48 to distinguish between the two instances on the card.
++       * The 2204, which I've never seen, *probably* extends this method.
++       */
++      wwn = ISP2100_NVRAM_PORT_NAME(nvram_data);
++      if (wwn) {
++              isp_prt(isp, ISP_LOGCONFIG, "NVRAM Port WWN 0x%08x%08x",
++                  (u_int32_t) (wwn >> 32), (u_int32_t) (wwn & 0xffffffff));
++              if ((wwn >> 60) == 0) {
++                      wwn |= (((u_int64_t) 2)<< 60);
++              }
++      }
++      fcp->isp_portwwn = wwn;
++      if (IS_2200(isp) || IS_23XX(isp)) {
++              wwn = ISP2200_NVRAM_NODE_NAME(nvram_data);
++              if (wwn) {
++                      isp_prt(isp, ISP_LOGCONFIG, "NVRAM Node WWN 0x%08x%08x",
++                          (u_int32_t) (wwn >> 32),
++                          (u_int32_t) (wwn & 0xffffffff));
++                      if ((wwn >> 60) == 0) {
++                              wwn |= (((u_int64_t) 2)<< 60);
++                      }
++              }
++      } else {
++              wwn &= ~((u_int64_t) 0xfff << 48);
++      }
++      fcp->isp_nodewwn = wwn;
++
++      /*
++       * Make sure we have both Node and Port as non-zero values.
++       */
++      if (fcp->isp_nodewwn != 0 && fcp->isp_portwwn == 0) {
++              fcp->isp_portwwn = fcp->isp_nodewwn;
++      } else if (fcp->isp_nodewwn == 0 && fcp->isp_portwwn != 0) {
++              fcp->isp_nodewwn = fcp->isp_portwwn;
++      }
++
++      /*
++       * Make the Node and Port values sane if they're NAA == 2.
++       * This means to clear bits 48..56 for the Node WWN and
++       * make sure that there's some non-zero value in 48..56
++       * for the Port WWN.
++       */
++      if (fcp->isp_nodewwn && fcp->isp_portwwn) {
++              if ((fcp->isp_nodewwn & (((u_int64_t) 0xfff) << 48)) != 0 &&
++                  (fcp->isp_nodewwn >> 60) == 2) {
++                      fcp->isp_nodewwn &= ~((u_int64_t) 0xfff << 48);
++              }
++              if ((fcp->isp_portwwn & (((u_int64_t) 0xfff) << 48)) == 0 &&
++                  (fcp->isp_portwwn >> 60) == 2) {
++                      fcp->isp_portwwn |= ((u_int64_t) 1 << 56);
++              }
++      }
++
++      isp_prt(isp, ISP_LOGDEBUG0,
++          "NVRAM: maxfrmlen %d execthrottle %d fwoptions 0x%x loopid %x",
++          ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data),
++          ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data),
++          ISP2100_NVRAM_OPTIONS(nvram_data),
++          ISP2100_NVRAM_HARDLOOPID(nvram_data));
++
++      fcp->isp_maxalloc =
++              ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data);
++      if ((isp->isp_confopts & ISP_CFG_OWNFSZ) == 0)
++              fcp->isp_maxfrmlen =
++                      ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data);
++      fcp->isp_retry_delay =
++              ISP2100_NVRAM_RETRY_DELAY(nvram_data);
++      fcp->isp_retry_count =
++              ISP2100_NVRAM_RETRY_COUNT(nvram_data);
++      if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
++              fcp->isp_loopid =
++                      ISP2100_NVRAM_HARDLOOPID(nvram_data);
++      if ((isp->isp_confopts & ISP_CFG_OWNEXCTHROTTLE) == 0)
++              fcp->isp_execthrottle =
++                      ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data);
++      fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data);
++}
++
++#ifdef        ISP_FW_CRASH_DUMP
++static void isp2200_fw_dump(struct ispsoftc *);
++static void isp2300_fw_dump(struct ispsoftc *);
++
++static void
++isp2200_fw_dump(struct ispsoftc *isp)
++{
++      int i, j;
++      mbreg_t mbs;
++      u_int16_t *ptr;
++
++      ptr = FCPARAM(isp)->isp_dump_data;
++      if (ptr == NULL) {
++              isp_prt(isp, ISP_LOGERR,
++                 "No place to dump RISC registers and SRAM");
++              return;
++      }
++      if (*ptr++) {
++              isp_prt(isp, ISP_LOGERR,
++                 "dump area for RISC registers and SRAM already used");
++              return;
++      }
++      ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++      for (i = 0; i < 100; i++) {
++              USEC_DELAY(100);
++              if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++                      break;
++              }
++      }
++      if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++              /*
++               * PBIU Registers
++               */
++              for (i = 0; i < 8; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + (i << 1));
++              }
++
++              /*
++               * Mailbox Registers
++               */
++              for (i = 0; i < 8; i++) {
++                      *ptr++ = ISP_READ(isp, MBOX_BLOCK + (i << 1));
++              }
++
++              /*
++               * DMA Registers
++               */
++              for (i = 0; i < 48; i++) {
++                      *ptr++ = ISP_READ(isp, DMA_BLOCK + 0x20 + (i << 1));
++              }
++
++              /*
++               * RISC H/W Registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0);
++              for (i = 0; i < 16; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0xA0 + (i << 1));
++              }
++
++              /*
++               * RISC GP Registers
++               */
++              for (j = 0; j < 8; j++) {
++                      ISP_WRITE(isp, BIU_BLOCK + 0xA4, 0x2000 + (j << 8));
++                      for (i = 0; i < 16; i++) {
++                              *ptr++ =
++                                  ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++                      }
++              }
++
++              /*
++               * Frame Buffer Hardware Registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0x10);
++              for (i = 0; i < 16; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++              }
++
++              /*
++               * Fibre Protocol Module 0 Hardware Registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0x20);
++              for (i = 0; i < 64; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++              }
++
++              /*
++               * Fibre Protocol Module 1 Hardware Registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0x30);
++              for (i = 0; i < 64; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++              }
++      } else {
++              isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause");
++              return;
++      }
++      isp_prt(isp, ISP_LOGALL,
++         "isp_fw_dump: RISC registers dumped successfully");
++      ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
++      for (i = 0; i < 100; i++) {
++              USEC_DELAY(100);
++              if (ISP_READ(isp, OUTMAILBOX0) == 0) {
++                      break;
++              }
++      }
++      if (ISP_READ(isp, OUTMAILBOX0) != 0) {
++              isp_prt(isp, ISP_LOGERR, "Board Would Not Reset");
++              return;
++      }
++      ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++      for (i = 0; i < 100; i++) {
++              USEC_DELAY(100);
++              if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++                      break;
++              }
++      }
++      if ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) {
++              isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause After Reset");
++              return;
++      }
++      ISP_WRITE(isp, RISC_EMB, 0xf2);
++      ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
++      for (i = 0; i < 100; i++) {
++              USEC_DELAY(100);
++              if ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) {
++                      break;
++              }
++      }
++      ENABLE_INTS(isp);
++      mbs.param[0] = MBOX_READ_RAM_WORD;
++      mbs.param[1] = 0x1000;
++      isp->isp_mbxworkp = (void *) ptr;
++      isp->isp_mbxwrk0 = 0xefff;      /* continuation count */
++      isp->isp_mbxwrk1 = 0x1001;      /* next SRAM address */
++      isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              isp_prt(isp, ISP_LOGWARN,
++                  "RAM DUMP FAILED @ WORD %x", isp->isp_mbxwrk1);
++              return;
++      }
++      ptr = isp->isp_mbxworkp;        /* finish fetch of final word */
++      *ptr++ = isp->isp_mboxtmp[2];
++      isp_prt(isp, ISP_LOGALL, "isp_fw_dump: SRAM dumped successfully");
++      FCPARAM(isp)->isp_dump_data[0] = isp->isp_type; /* now used */
++      (void) isp_async(isp, ISPASYNC_FW_DUMPED, 0);
++}
++
++static void
++isp2300_fw_dump(struct ispsoftc *isp)
++{
++      int i, j;
++      mbreg_t mbs;
++      u_int16_t *ptr;
++
++      ptr = FCPARAM(isp)->isp_dump_data;
++      if (ptr == NULL) {
++              isp_prt(isp, ISP_LOGERR,
++                 "No place to dump RISC registers and SRAM");
++              return;
++      }
++      if (*ptr++) {
++              isp_prt(isp, ISP_LOGERR,
++                 "dump area for RISC registers and SRAM already used");
++              return;
++      }
++      ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++      for (i = 0; i < 100; i++) {
++              USEC_DELAY(100);
++              if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++                      break;
++              }
++      }
++      if (ISP_READ(isp, HCCR) & HCCR_PAUSE) {
++              /*
++               * PBIU registers
++               */
++              for (i = 0; i < 8; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + (i << 1));
++              }
++
++              /*
++               * ReqQ-RspQ-Risc2Host Status registers
++               */
++              for (i = 0; i < 8; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x10 + (i << 1));
++              }
++
++              /*
++               * Mailbox Registers
++               */
++              for (i = 0; i < 32; i++) {
++                      *ptr++ =
++                          ISP_READ(isp, PCI_MBOX_REGS2300_OFF + (i << 1));
++              }
++
++              /*
++               * Auto Request Response DMA registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0x40);
++              for (i = 0; i < 32; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++              }
++
++              /*
++               * DMA registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0x50);
++              for (i = 0; i < 48; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++              }
++
++              /*
++               * RISC hardware registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0);
++              for (i = 0; i < 16; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0xA0 + (i << 1));
++              }
++
++              /*
++               * RISC GP? registers
++               */
++              for (j = 0; j < 8; j++) {
++                      ISP_WRITE(isp, BIU_BLOCK + 0xA4, 0x2000 + (j << 9));
++                      for (i = 0; i < 16; i++) {
++                              *ptr++ =
++                                  ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++                      }
++              }
++
++              /*
++               * frame buffer hardware registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0x10);
++              for (i = 0; i < 64; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++              }
++
++              /*
++               * FPM B0 hardware registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0x20);
++              for (i = 0; i < 64; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++              }
++
++              /*
++               * FPM B1 hardware registers
++               */
++              ISP_WRITE(isp, BIU2100_CSR, 0x30);
++              for (i = 0; i < 64; i++) {
++                      *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1));
++              }
++      } else {
++              isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause");
++              return;
++      }
++      isp_prt(isp, ISP_LOGALL,
++         "isp_fw_dump: RISC registers dumped successfully");
++      ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
++      for (i = 0; i < 100; i++) {
++              USEC_DELAY(100);
++              if (ISP_READ(isp, OUTMAILBOX0) == 0) {
++                      break;
++              }
++      }
++      if (ISP_READ(isp, OUTMAILBOX0) != 0) {
++              isp_prt(isp, ISP_LOGERR, "Board Would Not Reset");
++              return;
++      }
++      ENABLE_INTS(isp);
++      mbs.param[0] = MBOX_READ_RAM_WORD;
++      mbs.param[1] = 0x800;
++      isp->isp_mbxworkp = (void *) ptr;
++      isp->isp_mbxwrk0 = 0xf7ff;      /* continuation count */
++      isp->isp_mbxwrk1 = 0x801;       /* next SRAM address */
++      isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              isp_prt(isp, ISP_LOGWARN,
++                  "RAM DUMP FAILED @ WORD %x", isp->isp_mbxwrk1);
++              return;
++      }
++      ptr = isp->isp_mbxworkp;        /* finish fetch of final word */
++      *ptr++ = isp->isp_mboxtmp[2];
++
++      /*
++       * We don't have access to mailbox registers 8.. onward
++       * in our 'common' device model- so we have to set it
++       * here and hope it stays the same!
++       */
++      ISP_WRITE(isp, PCI_MBOX_REGS2300_OFF + (8 << 1), 0x1);
++
++      mbs.param[0] = MBOX_READ_RAM_WORD_EXTENDED;
++      mbs.param[1] = 0;
++      isp->isp_mbxworkp = (void *) ptr;
++      isp->isp_mbxwrk0 = 0xffff;      /* continuation count */
++      isp->isp_mbxwrk1 = 0x1;         /* next SRAM address */
++      isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
++      if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
++              isp_prt(isp, ISP_LOGWARN,
++                  "RAM DUMP FAILED @ WORD %x", 0x10000 + isp->isp_mbxwrk1);
++              return;
++      }
++      ptr = isp->isp_mbxworkp;        /* finish final word */
++      *ptr++ = mbs.param[2];
++      isp_prt(isp, ISP_LOGALL, "isp_fw_dump: SRAM dumped successfully");
++      FCPARAM(isp)->isp_dump_data[0] = isp->isp_type; /* now used */
++      (void) isp_async(isp, ISPASYNC_FW_DUMPED, 0);
++}
++
++void
++isp_fw_dump(struct ispsoftc *isp)
++{
++      if (IS_2200(isp))
++              isp2200_fw_dump(isp);
++      else if (IS_23XX(isp))
++              isp2300_fw_dump(isp);
++}
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_cb_ops.c   2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,646 @@
++/* %W% */
++/*
++ * Qlogic ISP Host Adapter procfs and open/close entry points
++ *---------------------------------------
++ *
++ * Copyright (c) 2003 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * the GNU Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * PMB #825
++ * 5214-F Diamond Hts Blvd
++ * San Francisco, CA, 94131
++ * mjacob@feral.com
++ *
++ *----
++ * proc safe pretty print code courtesy of Gerard Roudier (groudier@free.fr)
++ *
++ */
++
++#include "isp_linux.h"
++#include "isp_ioctl.h"
++#include <asm/uaccess.h>
++#ifdef        CONFIG_PROC_FS
++
++/*
++ * 'safe' proc pretty print code 
++ */
++struct info_str {
++    char *buffer;
++    int length;
++    off_t offset;
++    int pos;
++};
++
++static void
++copy_mem_info(struct info_str *info, char *data, int len)
++{
++      if (info->pos + len > info->offset + info->length)
++              len = info->offset + info->length - info->pos;
++
++      if (info->pos + len < info->offset) {
++              info->pos += len;
++              return;
++      }
++
++      if (info->pos < info->offset) {
++              off_t partial;
++
++              partial = info->offset - info->pos;
++              data += partial;
++              info->pos += partial;
++              len  -= partial;
++      }
++
++      if (len > 0) {
++              memcpy(info->buffer, data, len);
++              info->pos += len;
++              info->buffer += len;
++      }
++}
++
++static int
++copy_info(struct info_str *info, char *fmt, ...)
++{
++      va_list args;
++      char buf[256];
++      int len;
++
++      va_start(args, fmt);
++      len = vsprintf(buf, fmt, args);
++      va_end(args);
++
++      copy_mem_info(info, buf, len);
++      return (len);
++}
++
++
++int
++isplinux_proc_info(char *buf, char **st, off_t off, int len, int host, int io)
++{
++    int i;
++    struct info_str info;
++    struct ispsoftc *isp;
++
++    isp = isplist;
++    while (isp) {
++      if (isp->isp_host->host_no == host) {
++          break;
++      }
++      isp = isp->isp_next;
++    }
++    if (isp == NULL) {
++      return (-ENODEV);
++    }
++
++    if (io) {
++      buf[len] = 0;
++      io = -ENOSYS;
++      if (strncmp(buf, "debug=", 6) == 0) {
++          unsigned long debug;
++          char *p = &buf[6], *q;
++          debug = simple_strtoul(p, &q, 16);
++          if (q == &buf[6]) {
++              isp_prt(isp, ISP_LOGERR, "Garbled Debug Line '%s'", buf);
++              return (-EINVAL);
++          }
++          isp_prt(isp, ISP_LOGINFO, "setting debug level to 0x%lx", debug);
++          ISP_LOCKU_SOFTC(isp);
++          isp->isp_dblev = debug;
++          ISP_UNLKU_SOFTC(isp);
++          io = len;
++      } else if (strncmp(buf, "rescan", 6) == 0) {
++          if (IS_FC(isp)) {
++              SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 1);
++              io = len;
++          }
++      } else if (strncmp(buf, "lip", 3) == 0) {
++          if (IS_FC(isp)) {
++              ISP_LOCKU_SOFTC(isp);
++              (void) isp_control(isp, ISPCTL_SEND_LIP, 0);
++              ISP_UNLKU_SOFTC(isp);
++              io = len;
++          }
++      } else if (strncmp(buf, "busreset=", 9) == 0) {
++          char *p = &buf[6], *q;
++          int bus = (int) simple_strtoul(p, &q, 16);
++          if (q == &buf[6]) {
++              isp_prt(isp, ISP_LOGERR, "Garbled Bus Reset Line '%s'", buf);
++              return (-EINVAL);
++          }
++          ISP_LOCKU_SOFTC(isp);
++          (void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
++          ISP_UNLKU_SOFTC(isp);
++          io = len;
++      } else if (strncmp(buf, "devreset=", 9) == 0) {
++          char *p = &buf[6], *q;
++          int dev = (int) simple_strtoul(p, &q, 16);
++          if (q == &buf[6]) {
++              isp_prt(isp, ISP_LOGERR, "Garbled Dev Reset Line '%s'", buf);
++              return (-EINVAL);
++          }
++          /* always bus 0 */
++          ISP_LOCKU_SOFTC(isp);
++          (void) isp_control(isp, ISPCTL_RESET_DEV, &dev);
++          ISP_UNLKU_SOFTC(isp);
++          io = len;
++      } else if (strncmp(buf, "reset", 5) == 0) {
++          ISP_LOCKU_SOFTC(isp);
++          io = isp_drain_reset(isp, "proc_reset");
++          ISP_UNLKU_SOFTC(isp);
++          if (io == 0)
++              io = len;
++          else
++              io = -EIO;
++      } else if (strncmp(buf, "drain", 5) == 0) {
++          ISP_LOCKU_SOFTC(isp);
++          io = isp_drain(isp, "proc_reset");
++          ISP_UNLKU_SOFTC(isp);
++          if (io == 0)
++              io = len;
++          else
++              io = -EIO;
++      }
++#ifdef        ISP_FW_CRASH_DUMP
++      else if (strncmp(buf, "fwcrash", 7) == 0) {
++          if (IS_FC(isp)) {
++              ISP_LOCKU_SOFTC(isp);
++              SEND_THREAD_EVENT(isp, ISP_THREAD_FW_CRASH_DUMP, 0);
++              ISP_UNLKU_SOFTC(isp);
++              io = len;
++          }
++      }
++#endif
++      return (io);
++    }
++
++    ISP_LOCKU_SOFTC(isp);
++    if (st)
++      *st = buf;
++    info.buffer       = buf;
++    info.length       = len;
++    info.offset       = off;
++    info.pos  = 0;
++    
++    copy_info(&info, (char *)isplinux_info(isp->isp_host));
++#ifdef        HBA_VERSION
++    copy_info(&info, "\n HBA Version %s, built %s, %s",
++      HBA_VERSION, __DATE__, __TIME__);
++#endif
++    copy_info(&info, "\n DEVID %x role %d\n",
++      isp->isp_osinfo.device_id, isp->isp_role);
++    copy_info(&info,
++        " Interrupt Stats:\n"
++      "  total=0x%08x%08x bogus=0x%08x%08x\n"
++      "  MboxC=0x%08x%08x async=0x%08x%08x\n"
++      "  CRslt=0x%08x%08x CPost=0x%08x%08x\n"
++      "  RspnsCHiWater=0x%04x FastPostC_Hiwater=0x%04x\n",
++      (u_int32_t) (isp->isp_intcnt >> 32),
++      (u_int32_t) (isp->isp_intcnt & 0xffffffff),
++      (u_int32_t) (isp->isp_intbogus >> 32),
++      (u_int32_t) (isp->isp_intbogus & 0xffffffff),
++      (u_int32_t) (isp->isp_intmboxc >> 32),
++      (u_int32_t) (isp->isp_intmboxc & 0xffffffff),
++      (u_int32_t) (isp->isp_intoasync >> 32),
++      (u_int32_t) (isp->isp_intoasync & 0xffffffff),
++      (u_int32_t) (isp->isp_rsltccmplt >> 32),
++      (u_int32_t) (isp->isp_rsltccmplt & 0xffffffff),
++      (u_int32_t) (isp->isp_fphccmplt >> 32),
++      (u_int32_t) (isp->isp_fphccmplt & 0xffffffff),
++      isp->isp_rscchiwater, isp->isp_fpcchiwater);
++    copy_info(&info,
++      " Request In %d Request Out %d Result %d Nactv %d"
++      " HiWater %u QAVAIL %d WtQHi %d\n",
++      isp->isp_reqidx, isp->isp_reqodx, isp->isp_residx, isp->isp_nactive,
++      isp->isp_osinfo.hiwater, ISP_QAVAIL(isp),
++      isp->isp_osinfo.wqhiwater);
++    for (i = 0; i < isp->isp_maxcmds; i++) {
++      if (isp->isp_xflist[i]) {
++          copy_info(&info, " %d:%p", i, isp->isp_xflist[i]);
++      }
++    }
++    copy_info(&info, "\n");
++    if (isp->isp_osinfo.wqnext) {
++      Scsi_Cmnd *f = isp->isp_osinfo.wqnext;
++      copy_info(&info, "WaitQ(%d)", isp->isp_osinfo.wqcnt);
++      while (f) {
++          copy_info(&info, "->%p", f);
++          f = (Scsi_Cmnd *) f->host_scribble;
++      }
++      copy_info(&info, "\n");
++    }
++    if (isp->isp_osinfo.dqnext) {
++      Scsi_Cmnd *f = isp->isp_osinfo.dqnext;
++      copy_info(&info, "DoneQ");
++      while (f) {
++          copy_info(&info, "->%p", f);
++          f = (Scsi_Cmnd *) f->host_scribble;
++      }
++        copy_info(&info, "\n");
++    }
++    if (IS_FC(isp)) {
++      fcparam *fcp = isp->isp_param;
++      copy_info(&info,
++          "Loop ID: %d AL_PA 0x%x Port ID 0x%x FW State %x Loop State %x\n",
++          fcp->isp_loopid, fcp->isp_alpa, fcp->isp_portid, fcp->isp_fwstate,
++          fcp->isp_loopstate);
++      copy_info(&info, "Port WWN 0x%08x%08x Node WWN 0x%08x%08x\n",
++          (unsigned int) (ISP_PORTWWN(isp) >> 32),
++          (unsigned int) (ISP_PORTWWN(isp) & 0xffffffff),
++          (unsigned int) (ISP_NODEWWN(isp) >> 32),
++          (unsigned int) (ISP_NODEWWN(isp) & 0xffffffff));
++      for (i = 0; i < MAX_FC_TARG; i++) {
++          if (fcp->portdb[i].valid == 0 && i < FL_PORT_ID)
++              continue;
++          if (fcp->portdb[i].port_wwn == 0)
++              continue;
++          copy_info(&info, "TGT % 3d Loop ID % 3d Port id 0x%04x, role %s"
++              "\n Port WWN 0x%08x%08x Node WWN 0x%08x%08x\n\n", i,
++              fcp->portdb[i].loopid,
++              fcp->portdb[i].portid, class3_roles[fcp->portdb[i].roles],
++              (unsigned int) (fcp->portdb[i].port_wwn >> 32),
++              (unsigned int) (fcp->portdb[i].port_wwn & 0xffffffff),
++              (unsigned int) (fcp->portdb[i].node_wwn >> 32),
++              (unsigned int) (fcp->portdb[i].node_wwn & 0xffffffff));
++      }
++    } else {
++      sdparam *sdp = (sdparam *)isp->isp_param;
++
++      copy_info(&info, "Initiator ID: %d\n", sdp->isp_initiator_id);
++      copy_info(&info, "Target Flag  Period Offset\n");
++      for (i = 0; i < MAX_TARGETS; i++) {
++          copy_info(&info, "%6d: 0x%04x 0x%04x 0x%x\n",
++              i, sdp->isp_devparam[i].actv_flags,
++              sdp->isp_devparam[i].actv_offset,
++              sdp->isp_devparam[i].actv_period);
++      }
++      if (IS_DUALBUS(isp)) {
++          sdp++;
++          copy_info(&info, "\nInitiator ID: %d, Channel B\n",
++              sdp->isp_initiator_id);
++          copy_info(&info,
++              "Target     CurFlag    DevFlag  Period Offset B-Channel\n");
++          for (i = 0; i < MAX_TARGETS; i++) {
++                  copy_info(&info, "%6d: 0x%04x 0x%04x 0x%x\n",
++                      i, sdp->isp_devparam[i].actv_flags,
++                      sdp->isp_devparam[i].actv_offset,
++                      sdp->isp_devparam[i].actv_period);
++          }
++      }
++    }
++    ISP_UNLKU_SOFTC(isp);
++    return (info.pos > info.offset ? info.pos - info.offset : 0);
++}
++
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++static int isp_open(struct inode *, struct file *);
++static int isp_close(struct inode *, struct file *);
++static int
++isp_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
++
++struct file_operations isp_procfs_operations = {
++ owner:               THIS_MODULE,
++ open:                isp_open,
++ release:     isp_close,
++ ioctl:               isp_ioctl,
++};
++
++static struct proc_dir_entry *isp_root = 0;
++
++void
++isplinux_init_proc(struct ispsoftc *isp)
++{
++    struct proc_dir_entry *isp_entry;
++    char tbuf[64];
++
++    SNPRINTF(tbuf, sizeof(tbuf), "isp%d@0x%x", isp->isp_unit,
++      isp->isp_osinfo.device_id);
++    if (isp_root == NULL) {
++      isp_root = proc_mkdir("isp", 0);
++    }
++    if (isp_root) {
++      isp_entry = create_proc_entry(tbuf, S_IFREG|S_IRUGO|S_IWUSR, isp_root);
++      if (isp_entry == NULL) {
++          return;
++      }
++      isp_entry->proc_fops = &isp_procfs_operations;
++    }
++}
++
++void
++isplinux_undo_proc(struct ispsoftc *isp)
++{
++    char tbuf[64];
++    SNPRINTF(tbuf, sizeof(tbuf), "isp/isp%d@0x%x", isp->isp_unit,
++      isp->isp_osinfo.device_id);
++    remove_proc_entry(tbuf, 0);
++    remove_proc_entry("isp", 0);
++}
++
++static struct ispsoftc *
++get_isp_from_procname(const unsigned char *name)
++{
++    struct ispsoftc *isp;
++
++    for (isp = isplist; isp; isp = isp->isp_next) {
++      char tbuf[32];
++      SNPRINTF(tbuf, sizeof(tbuf), "isp%d@0x%x", isp->isp_unit,
++         isp->isp_osinfo.device_id);
++      if (strcmp(name, tbuf) == 0) {
++          return (isp);
++      }
++    }
++    return (0);
++}
++
++static int
++isp_open(struct inode *ip, struct file *fp)
++{
++    struct ispsoftc *isp = get_isp_from_procname(fp->f_dentry->d_name.name);
++    if (isp == NULL) {
++      return (-ENXIO);
++    }
++    if (isp->isp_isopen) {
++      return (-EBUSY);
++    }
++    isp->isp_isopen = 1;
++    fp->private_data = isp;
++    return (0);
++}
++
++static int
++isp_close(struct inode *ip, struct file *fp)
++{
++    struct ispsoftc *isp = fp->private_data;
++    isp->isp_isopen = 0;
++    return (0);
++}
++
++static int
++isp_ioctl(struct inode *ip, struct file *fp, unsigned int c, unsigned long arg)
++{
++    struct ispsoftc *isp = fp->private_data;
++    int rv, inarg, outarg;
++    fcparam *fcp;
++
++    if (isp == (struct ispsoftc *)NULL) {
++      return -ENXIO;
++    }
++
++    if (IS_SCSI(isp)) {
++      switch (c) {
++      case ISP_SDBLEV:
++      case ISP_RESCAN:
++      case ISP_GETROLE:
++      case ISP_SETROLE:
++      case ISP_RESETHBA:
++              break;
++      default:
++              return (-EINVAL);
++      }
++      fcp = NULL;
++    } else {
++      fcp = isp->isp_param;
++    }
++
++    rv = 0;
++    isp_prt(isp, ISP_LOGDEBUG0, "isp_ioctl: cmd=%x", c);
++
++    switch (c) {
++    case ISP_GET_STATS:
++    {
++      isp_stats_t stats;
++
++      MEMZERO(&stats, sizeof stats);
++      stats.isp_stat_version = ISP_STATS_VERSION;
++      stats.isp_type = isp->isp_type;
++      stats.isp_revision = isp->isp_revision;
++      ISP_LOCK_SOFTC(isp);
++      stats.isp_stats[ISP_INTCNT] = isp->isp_intcnt;
++      stats.isp_stats[ISP_INTBOGUS] = isp->isp_intbogus;
++      stats.isp_stats[ISP_INTMBOXC] = isp->isp_intmboxc;
++      stats.isp_stats[ISP_INGOASYNC] = isp->isp_intoasync;
++      stats.isp_stats[ISP_RSLTCCMPLT] = isp->isp_rsltccmplt;
++      stats.isp_stats[ISP_FPHCCMCPLT] = isp->isp_fphccmplt;
++      stats.isp_stats[ISP_RSCCHIWAT] = isp->isp_rscchiwater;
++      stats.isp_stats[ISP_FPCCHIWAT] = isp->isp_fpcchiwater;
++      ISP_UNLK_SOFTC(isp);
++      if (COPYOUT(&stats, (void *)arg, sizeof (stats), 0)) {
++              rv = EFAULT;
++      }
++      break;
++    }
++    case ISP_CLR_STATS:
++      ISP_LOCK_SOFTC(isp);
++      isp->isp_intcnt = 0;
++      isp->isp_intbogus = 0;
++      isp->isp_intmboxc = 0;
++      isp->isp_intoasync = 0;
++      isp->isp_rsltccmplt = 0;
++      isp->isp_fphccmplt = 0;
++      isp->isp_rscchiwater = 0;
++      isp->isp_fpcchiwater = 0;
++      ISP_UNLK_SOFTC(isp);
++      break;
++#ifdef        ISP_FW_CRASH_DUMP
++    case ISP_GET_FW_CRASH_DUMP:
++    {
++      u_int16_t *ptr = fcp->isp_dump_data;
++      size_t sz;
++      if (IS_2200(isp))
++              sz = QLA2200_RISC_IMAGE_DUMP_SIZE;
++      else
++              sz = QLA2300_RISC_IMAGE_DUMP_SIZE;
++      ISP_LOCK_SOFTC(isp);
++      if (ptr && *ptr) {
++              if (COPYOUT(ptr, (void *)arg, sz, mode)) {
++                      rv = EFAULT;
++              } else {
++                      *ptr = 0;
++              }
++      } else {
++              rv = ENXIO;
++      }
++      ISP_UNLK_SOFTC(isp);
++      break;
++    }
++
++    case ISP_FORCE_CRASH_DUMP:
++      ISP_LOCK_SOFTC(isp);
++      isp_async(isp, ISPASYNC_FW_CRASH, NULL);
++      ISP_UNLK_SOFTC(isp);
++      break;
++#endif
++    case ISP_SDBLEV:
++      if (COPYIN((void *)arg, &inarg, sizeof (inarg), 0)) {
++              rv = EFAULT;
++              break;
++      }
++      outarg = isp->isp_dblev;
++      isp->isp_dblev = inarg;
++      if (COPYOUT(&outarg, (void *)arg, sizeof (outarg), 0)) {
++              rv = EFAULT;
++              break;
++      }
++      break;
++
++    case ISP_RESCAN:
++      if (IS_FC(isp)) {
++          ISP_LOCKU_SOFTC(isp);
++          SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0)
++          ISP_UNLKU_SOFTC(isp);
++      }
++      break;
++
++    case ISP_GETROLE:
++      outarg = isp->isp_role;
++      if (COPYOUT(&outarg, (void *)arg, sizeof (outarg), 0)) {
++              rv = EFAULT;
++              break;
++      }
++      break;
++
++    case ISP_SETROLE:
++      if (COPYIN((void *)arg, &inarg, sizeof (inarg), 0)) {
++              rv = EFAULT;
++              break;
++      }
++      if (inarg & ~(ISP_ROLE_INITIATOR|ISP_ROLE_TARGET)) {
++              rv = EINVAL;
++              break;
++      }
++      /*
++       * Check to see if we're already in that role.
++       */
++      if (isp->isp_role == inarg) {
++              outarg = isp->isp_role;
++              if (COPYOUT(&outarg, (void *)arg, sizeof (outarg), mode)) {
++                      rv = EFAULT;
++              }
++              break;
++      }
++      /*FALLTHROUGH*/
++    case ISP_RESETHBA:
++    {
++      ISP_LOCK_SOFTC(isp);
++      if (c == ISP_SETROLE) {
++              outarg = isp->isp_role;
++              isp->isp_role = inarg;
++      }
++      if (isp_drain_reset(isp, "isp_ioctl")) {
++              ISP_UNLK_SOFTC(isp);
++              rv = EIO;
++              break;
++      }
++      isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++      ISP_UNLK_SOFTC(isp);
++      if (c == ISP_SETROLE &&
++          COPYOUT(&outarg, (void *)arg, sizeof (outarg), mode)) {
++              rv = EFAULT;
++              break;
++      }
++      break;
++    }
++    case ISP_FC_LIP:
++      ISP_LOCK_SOFTC(isp);
++      if (isp_control(isp, ISPCTL_SEND_LIP, NULL)) {
++              rv = EIO;
++      }
++      ISP_UNLK_SOFTC(isp);
++      break;
++    case ISP_FC_GETDINFO:
++    {
++      struct isp_fc_device local, *ifc = &local;
++      struct lportdb *lp;
++
++      if (COPYIN((void *)arg, ifc, sizeof (*ifc), mode)) {
++              rv = EFAULT;
++              break;
++      }
++      if (ifc->loopid < 0 || ifc->loopid >= MAX_FC_TARG) {
++              rv = EINVAL;
++              break;
++      }
++      ISP_LOCK_SOFTC(isp);
++      lp = &FCPARAM(isp)->portdb[ifc->loopid];
++      if (lp->valid) {
++              ifc->loopid = lp->loopid;
++              ifc->portid = lp->portid;
++              ifc->node_wwn = lp->node_wwn;
++              ifc->port_wwn = lp->port_wwn;
++              rv = 0;
++      } else {
++              rv = ENODEV;
++      }
++      ISP_UNLK_SOFTC(isp);
++      if (rv == 0) {
++              if (COPYOUT((void *)ifc, (void *)arg,
++                  sizeof (*ifc), mode)) {
++                      rv = EFAULT;
++              }
++      }
++      break;
++    }
++    case ISP_FC_GETHINFO:
++    {
++      struct isp_hba_device local, *hba = &local;
++      MEMZERO(hba, sizeof (*hba));
++      ISP_LOCK_SOFTC(isp);
++      hba->fc_speed = FCPARAM(isp)->isp_gbspeed;
++      hba->fc_scsi_supported = 1;
++      hba->fc_topology = FCPARAM(isp)->isp_topo + 1;
++      hba->fc_loopid = FCPARAM(isp)->isp_loopid;
++      hba->active_node_wwn = FCPARAM(isp)->isp_nodewwn;
++      hba->active_port_wwn = FCPARAM(isp)->isp_portwwn;
++      ISP_UNLK_SOFTC(isp);
++      if (COPYOUT(hba, (void *)arg, sizeof (*hba), mode)) {
++          rv = EFAULT;
++          break;
++      }
++      break;
++    }
++    default:
++      rv = EINVAL;
++      break;
++    }
++    return(rv? -rv : 0);
++}
++#endif        /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) */
++#endif
++/*
++ * mode: c
++ * Local variables:
++ * c-indent-level: 4
++ * c-brace-imaginary-offset: 0
++ * c-brace-offset: -4
++ * c-argdecl-indent: 4
++ * c-label-offset: -4
++ * c-continued-statement-offset: 4
++ * c-continued-brace-offset: 0
++ * End:
++ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_inline.h   2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,1495 @@
++/* @(#)isp_inline.h 1.20 */
++/*
++ * Qlogic Host Adapter Inline Functions
++ *
++ * Copyright (c) 1999, 2000, 2001 by Matthew Jacob
++ * Feral Software
++ * All rights reserved.
++ * mjacob@feral.com
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ */
++#ifndef       _ISP_INLINE_H
++#define       _ISP_INLINE_H
++
++/*
++ * Handle Functions.
++ * For each outstanding command there will be a non-zero handle.
++ * There will be at most isp_maxcmds handles, and isp_lasthdls
++ * will be a seed for the last handled allocated.
++ */
++
++static INLINE int isp_save_xs(struct ispsoftc *, XS_T *, u_int16_t *);
++static INLINE XS_T *isp_find_xs(struct ispsoftc *, u_int16_t);
++static INLINE u_int16_t isp_find_handle(struct ispsoftc *, XS_T *);
++static INLINE int isp_handle_index(u_int16_t);
++static INLINE void isp_destroy_handle(struct ispsoftc *, u_int16_t);
++static INLINE void isp_remove_handle(struct ispsoftc *, XS_T *);
++
++static INLINE int
++isp_save_xs(struct ispsoftc *isp, XS_T *xs, u_int16_t *handlep)
++{
++      int i, j;
++
++      for (j = isp->isp_lasthdls, i = 0; i < (int) isp->isp_maxcmds; i++) {
++              if (isp->isp_xflist[j] == NULL) {
++                      break;
++              }
++              if (++j == isp->isp_maxcmds) {
++                      j = 0;
++              }
++      }
++      if (i == isp->isp_maxcmds) {
++              return (-1);
++      }
++      isp->isp_xflist[j] = xs;
++      *handlep = j+1;
++      if (++j == isp->isp_maxcmds)
++              j = 0;
++      isp->isp_lasthdls = (u_int16_t)j;
++      return (0);
++}
++
++static INLINE XS_T *
++isp_find_xs(struct ispsoftc *isp, u_int16_t handle)
++{
++      if (handle < 1 || handle > (u_int16_t) isp->isp_maxcmds) {
++              return (NULL);
++      } else {
++              return (isp->isp_xflist[handle - 1]);
++      }
++}
++
++static INLINE u_int16_t
++isp_find_handle(struct ispsoftc *isp, XS_T *xs)
++{
++      int i;
++      if (xs != NULL) {
++              for (i = 0; i < isp->isp_maxcmds; i++) {
++                      if (isp->isp_xflist[i] == xs) {
++                              return ((u_int16_t) i+1);
++                      }
++              }
++      }
++      return (0);
++}
++
++static INLINE int
++isp_handle_index(u_int16_t handle)
++{
++      return (handle-1);
++}
++
++static INLINE void
++isp_destroy_handle(struct ispsoftc *isp, u_int16_t handle)
++{
++      if (handle > 0 && handle <= (u_int16_t) isp->isp_maxcmds) {
++              isp->isp_xflist[isp_handle_index(handle)] = NULL;
++      }
++}
++
++static INLINE void
++isp_remove_handle(struct ispsoftc *isp, XS_T *xs)
++{
++      isp_destroy_handle(isp, isp_find_handle(isp, xs));
++}
++
++static INLINE int
++isp_getrqentry(struct ispsoftc *, u_int16_t *, u_int16_t *, void **);
++
++static INLINE int
++isp_getrqentry(struct ispsoftc *isp, u_int16_t *iptrp,
++    u_int16_t *optrp, void **resultp)
++{
++      volatile u_int16_t iptr, optr;
++
++      optr = isp->isp_reqodx = READ_REQUEST_QUEUE_OUT_POINTER(isp);
++      iptr = isp->isp_reqidx;
++      *resultp = ISP_QUEUE_ENTRY(isp->isp_rquest, iptr);
++      iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN(isp));
++      if (iptr == optr) {
++              return (1);
++      }
++      if (optrp)
++              *optrp = optr;
++      if (iptrp)
++              *iptrp = iptr;
++      return (0);
++}
++
++static INLINE void isp_print_qentry (struct ispsoftc *, char *, int, void *);
++
++
++#define       TBA     (4 * (((QENTRY_LEN >> 2) * 3) + 1) + 1)
++static INLINE void
++isp_print_qentry(struct ispsoftc *isp, char *msg, int idx, void *arg)
++{
++      char buf[TBA];
++      int amt, i, j;
++      u_int8_t *ptr = arg;
++
++      isp_prt(isp, ISP_LOGALL, "%s index %d=>", msg, idx);
++      for (buf[0] = 0, amt = i = 0; i < 4; i++) {
++              buf[0] = 0;
++              SNPRINTF(buf, TBA, "  ");
++              for (j = 0; j < (QENTRY_LEN >> 2); j++) {
++                      SNPRINTF(buf, TBA, "%s %02x", buf, ptr[amt++] & 0xff);
++              }
++              isp_prt(isp, ISP_LOGALL, buf);
++      }
++}
++
++static INLINE void isp_print_bytes(struct ispsoftc *, char *, int, void *);
++
++static INLINE void
++isp_print_bytes(struct ispsoftc *isp, char *msg, int amt, void *arg)
++{
++      char buf[128];
++      u_int8_t *ptr = arg;
++      int off;
++
++      if (msg)
++              isp_prt(isp, ISP_LOGALL, "%s:", msg);
++      off = 0;
++      buf[0] = 0;
++      while (off < amt) {
++              int j, to;
++              to = off;
++              for (j = 0; j < 16; j++) {
++                      SNPRINTF(buf, 128, "%s %02x", buf, ptr[off++] & 0xff);
++                      if (off == amt)
++                              break;
++              }
++              isp_prt(isp, ISP_LOGALL, "0x%08x:%s", to, buf);
++              buf[0] = 0;
++      }
++}
++
++/*
++ * Do the common path to try and ensure that link is up, we've scanned
++ * the fabric (if we're on a fabric), and that we've synchronized this
++ * all with our own database and done the appropriate logins.
++ *
++ * We repeatedly check for firmware state and loop state after each
++ * action because things may have changed while we were doing this.
++ * Any failure or change of state causes us to return a nonzero value.
++ *
++ * We honor HBA roles in that if we're not in Initiator mode, we don't
++ * attempt to sync up the database (that's for somebody else to do,
++ * if ever).
++ *
++ * We assume we enter here with any locks held.
++ */
++
++static INLINE int isp_fc_runstate(struct ispsoftc *, int);
++
++static INLINE int
++isp_fc_runstate(struct ispsoftc *isp, int tval)
++{
++      fcparam *fcp;
++      int *tptr;
++
++      if (IS_SCSI(isp))
++              return (0);
++
++      tptr = tval? &tval : NULL;
++      if (isp_control(isp, ISPCTL_FCLINK_TEST, tptr) != 0) {
++              return (-1);
++      }
++      fcp = FCPARAM(isp);
++      if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate < LOOP_PDB_RCVD)
++              return (-1);
++      if (isp_control(isp, ISPCTL_SCAN_FABRIC, NULL) != 0) {
++              return (-1);
++      }
++      if (isp_control(isp, ISPCTL_SCAN_LOOP, NULL) != 0) {
++              return (-1);
++      }
++      if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) {
++              return (0);
++      }
++      if (isp_control(isp, ISPCTL_PDB_SYNC, NULL) != 0) {
++              return (-1);
++      }
++      if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate != LOOP_READY) {
++              return (-1);
++      }
++      return (0);
++}
++
++/*
++ * Functions to move stuff to a form that the QLogic RISC engine understands
++ * and functions to move stuff back to a form the processor understands.
++ *
++ * Each platform is required to provide the 8, 16 and 32 bit
++ * swizzle and unswizzle macros (ISP_IOX{PUT|GET}_{8,16,32})
++ *
++ * The assumption is that swizzling and unswizzling is mostly done 'in place'
++ * (with a few exceptions for efficiency).
++ */
++
++static INLINE void isp_copy_out_hdr(struct ispsoftc *, isphdr_t *, isphdr_t *);
++static INLINE void isp_copy_in_hdr(struct ispsoftc *, isphdr_t *, isphdr_t *);
++static INLINE int isp_get_response_type(struct ispsoftc *, isphdr_t *);
++
++static INLINE void
++isp_put_request(struct ispsoftc *, ispreq_t *, ispreq_t *);
++static INLINE void
++isp_put_request_t2(struct ispsoftc *, ispreqt2_t *, ispreqt2_t *);
++static INLINE void
++isp_put_request_t3(struct ispsoftc *, ispreqt3_t *, ispreqt3_t *);
++static INLINE void
++isp_put_extended_request(struct ispsoftc *, ispextreq_t *, ispextreq_t *);
++static INLINE void
++isp_put_cont_req(struct ispsoftc *, ispcontreq_t *, ispcontreq_t *);
++static INLINE void
++isp_put_cont64_req(struct ispsoftc *, ispcontreq64_t *, ispcontreq64_t *);
++static INLINE void
++isp_get_response(struct ispsoftc *, ispstatusreq_t *, ispstatusreq_t *);
++static INLINE void
++isp_get_response_x(struct ispsoftc *, ispstatus_cont_t *, ispstatus_cont_t *);
++static INLINE void
++isp_get_rio2(struct ispsoftc *, isp_rio2_t *, isp_rio2_t *);
++static INLINE void
++isp_put_icb(struct ispsoftc *, isp_icb_t *, isp_icb_t *);
++static INLINE void
++isp_get_pdb(struct ispsoftc *, isp_pdb_t *, isp_pdb_t *);
++static INLINE void
++isp_get_ct_hdr(struct ispsoftc *isp, ct_hdr_t *, ct_hdr_t *);
++static INLINE void
++isp_put_sns_request(struct ispsoftc *, sns_screq_t *, sns_screq_t *);
++static INLINE void
++isp_put_gid_ft_request(struct ispsoftc *, sns_gid_ft_req_t *,
++    sns_gid_ft_req_t *);
++static INLINE void
++isp_put_gxn_id_request(struct ispsoftc *, sns_gxn_id_req_t *,
++    sns_gxn_id_req_t *);
++static INLINE void
++isp_get_sns_response(struct ispsoftc *, sns_scrsp_t *, sns_scrsp_t *, int);
++static INLINE void
++isp_get_gid_ft_response(struct ispsoftc *, sns_gid_ft_rsp_t *,
++    sns_gid_ft_rsp_t *, int);
++static INLINE void
++isp_get_gxn_id_response(struct ispsoftc *, sns_gxn_id_rsp_t *,
++    sns_gxn_id_rsp_t *);
++static INLINE void
++isp_get_gff_id_response(struct ispsoftc *, sns_gff_id_rsp_t *,
++    sns_gff_id_rsp_t *);
++static INLINE void
++isp_get_ga_nxt_response(struct ispsoftc *, sns_ga_nxt_rsp_t *,
++    sns_ga_nxt_rsp_t *);
++#ifdef        ISP_TARGET_MODE
++#ifndef       _ISP_TARGET_H
++#include "isp_target.h"
++#endif
++static INLINE void
++isp_put_atio(struct ispsoftc *, at_entry_t *, at_entry_t *);
++static INLINE void
++isp_get_atio(struct ispsoftc *, at_entry_t *, at_entry_t *);
++static INLINE void
++isp_put_atio2(struct ispsoftc *, at2_entry_t *, at2_entry_t *);
++static INLINE void
++isp_get_atio2(struct ispsoftc *, at2_entry_t *, at2_entry_t *);
++static INLINE void
++isp_put_ctio(struct ispsoftc *, ct_entry_t *, ct_entry_t *);
++static INLINE void
++isp_get_ctio(struct ispsoftc *, ct_entry_t *, ct_entry_t *);
++static INLINE void
++isp_put_ctio2(struct ispsoftc *, ct2_entry_t *, ct2_entry_t *);
++static INLINE void
++isp_get_ctio2(struct ispsoftc *, ct2_entry_t *, ct2_entry_t *);
++static INLINE void
++isp_put_enable_lun(struct ispsoftc *, lun_entry_t *, lun_entry_t *);
++static INLINE void
++isp_get_enable_lun(struct ispsoftc *, lun_entry_t *, lun_entry_t *);
++static INLINE void
++isp_put_notify(struct ispsoftc *, in_entry_t *, in_entry_t *);
++static INLINE void
++isp_get_notify(struct ispsoftc *, in_entry_t *, in_entry_t *);
++static INLINE void
++isp_put_notify_fc(struct ispsoftc *, in_fcentry_t *, in_fcentry_t *);
++static INLINE void
++isp_get_notify_fc(struct ispsoftc *, in_fcentry_t *, in_fcentry_t *);
++static INLINE void
++isp_put_notify_ack(struct ispsoftc *, na_entry_t *, na_entry_t *);
++static INLINE void
++isp_get_notify_ack(struct ispsoftc *, na_entry_t *, na_entry_t *);
++static INLINE void
++isp_put_notify_ack_fc(struct ispsoftc *, na_fcentry_t *, na_fcentry_t *);
++static INLINE void
++isp_get_notify_ack_fc(struct ispsoftc *, na_fcentry_t *, na_fcentry_t *);
++#endif
++
++#define       ISP_IS_SBUS(isp)        \
++      (ISP_SBUS_SUPPORTED && (isp)->isp_bustype == ISP_BT_SBUS)
++
++/*
++ * Swizzle/Copy Functions
++ */
++static INLINE void
++isp_copy_out_hdr(struct ispsoftc *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
++{
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type,
++                  &hpdst->rqs_entry_count);
++              ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count,
++                  &hpdst->rqs_entry_type);
++              ISP_IOXPUT_8(isp, hpsrc->rqs_seqno,
++                  &hpdst->rqs_flags);
++              ISP_IOXPUT_8(isp, hpsrc->rqs_flags,
++                  &hpdst->rqs_seqno);
++      } else {
++              ISP_IOXPUT_8(isp, hpsrc->rqs_entry_type,
++                  &hpdst->rqs_entry_type);
++              ISP_IOXPUT_8(isp, hpsrc->rqs_entry_count,
++                  &hpdst->rqs_entry_count);
++              ISP_IOXPUT_8(isp, hpsrc->rqs_seqno,
++                  &hpdst->rqs_seqno);
++              ISP_IOXPUT_8(isp, hpsrc->rqs_flags,
++                  &hpdst->rqs_flags);
++      }
++}
++
++static INLINE void
++isp_copy_in_hdr(struct ispsoftc *isp, isphdr_t *hpsrc, isphdr_t *hpdst)
++{
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type,
++                  hpdst->rqs_entry_count);
++              ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count,
++                  hpdst->rqs_entry_type);
++              ISP_IOXGET_8(isp, &hpsrc->rqs_seqno,
++                  hpdst->rqs_flags);
++              ISP_IOXGET_8(isp, &hpsrc->rqs_flags,
++                  hpdst->rqs_seqno);
++      } else {
++              ISP_IOXGET_8(isp, &hpsrc->rqs_entry_type,
++                  hpdst->rqs_entry_type);
++              ISP_IOXGET_8(isp, &hpsrc->rqs_entry_count,
++                  hpdst->rqs_entry_count);
++              ISP_IOXGET_8(isp, &hpsrc->rqs_seqno,
++                  hpdst->rqs_seqno);
++              ISP_IOXGET_8(isp, &hpsrc->rqs_flags,
++                  hpdst->rqs_flags);
++      }
++}
++
++static INLINE int
++isp_get_response_type(struct ispsoftc *isp, isphdr_t *hp)
++{
++      u_int8_t type;
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXGET_8(isp, &hp->rqs_entry_count, type);
++      } else {
++              ISP_IOXGET_8(isp, &hp->rqs_entry_type, type);
++      }
++      return ((int)type);
++}
++
++static INLINE void
++isp_put_request(struct ispsoftc *isp, ispreq_t *rqsrc, ispreq_t *rqdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &rqsrc->req_header, &rqdst->req_header);
++      ISP_IOXPUT_32(isp, rqsrc->req_handle, &rqdst->req_handle);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_target);
++              ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_lun_trn);
++      } else {
++              ISP_IOXPUT_8(isp, rqsrc->req_lun_trn, &rqdst->req_lun_trn);
++              ISP_IOXPUT_8(isp, rqsrc->req_target, &rqdst->req_target);
++      }
++      ISP_IOXPUT_16(isp, rqsrc->req_cdblen, &rqdst->req_cdblen);
++      ISP_IOXPUT_16(isp, rqsrc->req_flags, &rqdst->req_flags);
++      ISP_IOXPUT_16(isp, rqsrc->req_time, &rqdst->req_time);
++      ISP_IOXPUT_16(isp, rqsrc->req_seg_count, &rqdst->req_seg_count);
++      for (i = 0; i < 12; i++) {
++              ISP_IOXPUT_8(isp, rqsrc->req_cdb[i], &rqdst->req_cdb[i]);
++      }
++      for (i = 0; i < ISP_RQDSEG; i++) {
++              ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_base,
++                  &rqdst->req_dataseg[i].ds_base);
++              ISP_IOXPUT_32(isp, rqsrc->req_dataseg[i].ds_count,
++                  &rqdst->req_dataseg[i].ds_count);
++      }
++}
++
++static INLINE void
++isp_put_request_t2(struct ispsoftc *isp, ispreqt2_t *tqsrc, ispreqt2_t *tqdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &tqsrc->req_header, &tqdst->req_header);
++      ISP_IOXPUT_32(isp, tqsrc->req_handle, &tqdst->req_handle);
++      ISP_IOXPUT_8(isp, tqsrc->req_lun_trn, &tqdst->req_lun_trn);
++      ISP_IOXPUT_8(isp, tqsrc->req_target, &tqdst->req_target);
++      ISP_IOXPUT_16(isp, tqsrc->req_scclun, &tqdst->req_scclun);
++      ISP_IOXPUT_16(isp, tqsrc->req_flags,  &tqdst->req_flags);
++      ISP_IOXPUT_16(isp, tqsrc->_res2, &tqdst->_res2);
++      ISP_IOXPUT_16(isp, tqsrc->req_time, &tqdst->req_time);
++      ISP_IOXPUT_16(isp, tqsrc->req_seg_count, &tqdst->req_seg_count);
++      for (i = 0; i < 16; i++) {
++              ISP_IOXPUT_8(isp, tqsrc->req_cdb[i], &tqdst->req_cdb[i]);
++      }
++      ISP_IOXPUT_32(isp, tqsrc->req_totalcnt, &tqdst->req_totalcnt);
++      for (i = 0; i < ISP_RQDSEG_T2; i++) {
++              ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_base,
++                  &tqdst->req_dataseg[i].ds_base);
++              ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_count,
++                  &tqdst->req_dataseg[i].ds_count);
++      }
++}
++
++static INLINE void
++isp_put_request_t3(struct ispsoftc *isp, ispreqt3_t *tqsrc, ispreqt3_t *tqdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &tqsrc->req_header, &tqdst->req_header);
++      ISP_IOXPUT_32(isp, tqsrc->req_handle, &tqdst->req_handle);
++      ISP_IOXPUT_8(isp, tqsrc->req_lun_trn, &tqdst->req_lun_trn);
++      ISP_IOXPUT_8(isp, tqsrc->req_target, &tqdst->req_target);
++      ISP_IOXPUT_16(isp, tqsrc->req_scclun, &tqdst->req_scclun);
++      ISP_IOXPUT_16(isp, tqsrc->req_flags,  &tqdst->req_flags);
++      ISP_IOXPUT_16(isp, tqsrc->_res2, &tqdst->_res2);
++      ISP_IOXPUT_16(isp, tqsrc->req_time, &tqdst->req_time);
++      ISP_IOXPUT_16(isp, tqsrc->req_seg_count, &tqdst->req_seg_count);
++      for (i = 0; i < 16; i++) {
++              ISP_IOXPUT_8(isp, tqsrc->req_cdb[i], &tqdst->req_cdb[i]);
++      }
++      ISP_IOXPUT_32(isp, tqsrc->req_totalcnt, &tqdst->req_totalcnt);
++      for (i = 0; i < ISP_RQDSEG_T3; i++) {
++              ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_base,
++                  &tqdst->req_dataseg[i].ds_base);
++              ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_basehi,
++                  &tqdst->req_dataseg[i].ds_basehi);
++              ISP_IOXPUT_32(isp, tqsrc->req_dataseg[i].ds_count,
++                  &tqdst->req_dataseg[i].ds_count);
++      }
++}
++
++static INLINE void
++isp_put_extended_request(struct ispsoftc *isp, ispextreq_t *xqsrc,
++    ispextreq_t *xqdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &xqsrc->req_header, &xqdst->req_header);
++      ISP_IOXPUT_32(isp, xqsrc->req_handle, &xqdst->req_handle);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXPUT_8(isp, xqsrc->req_lun_trn, &xqdst->req_target);
++              ISP_IOXPUT_8(isp, xqsrc->req_target, &xqdst->req_lun_trn);
++      } else {
++              ISP_IOXPUT_8(isp, xqsrc->req_lun_trn, &xqdst->req_lun_trn);
++              ISP_IOXPUT_8(isp, xqsrc->req_target, &xqdst->req_target);
++      }
++      ISP_IOXPUT_16(isp, xqsrc->req_cdblen, &xqdst->req_cdblen);
++      ISP_IOXPUT_16(isp, xqsrc->req_flags, &xqdst->req_flags);
++      ISP_IOXPUT_16(isp, xqsrc->req_time, &xqdst->req_time);
++      ISP_IOXPUT_16(isp, xqsrc->req_seg_count, &xqdst->req_seg_count);
++      for (i = 0; i < 44; i++) {
++              ISP_IOXPUT_8(isp, xqsrc->req_cdb[i], &xqdst->req_cdb[i]);
++      }
++}
++
++static INLINE void
++isp_put_cont_req(struct ispsoftc *isp, ispcontreq_t *cqsrc, ispcontreq_t *cqdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &cqsrc->req_header, &cqdst->req_header);
++      for (i = 0; i < ISP_CDSEG; i++) {
++              ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_base,
++                  &cqdst->req_dataseg[i].ds_base);
++              ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_count,
++                  &cqdst->req_dataseg[i].ds_count);
++      }
++}
++
++static INLINE void
++isp_put_cont64_req(struct ispsoftc *isp, ispcontreq64_t *cqsrc,
++    ispcontreq64_t *cqdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &cqsrc->req_header, &cqdst->req_header);
++      for (i = 0; i < ISP_CDSEG64; i++) {
++              ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_base,
++                  &cqdst->req_dataseg[i].ds_base);
++              ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_basehi,
++                  &cqdst->req_dataseg[i].ds_basehi);
++              ISP_IOXPUT_32(isp, cqsrc->req_dataseg[i].ds_count,
++                  &cqdst->req_dataseg[i].ds_count);
++      }
++}
++
++static INLINE void
++isp_get_response(struct ispsoftc *isp, ispstatusreq_t *spsrc,
++    ispstatusreq_t *spdst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &spsrc->req_header, &spdst->req_header);
++      ISP_IOXGET_32(isp, &spsrc->req_handle, spdst->req_handle);
++      ISP_IOXGET_16(isp, &spsrc->req_scsi_status, spdst->req_scsi_status);
++      ISP_IOXGET_16(isp, &spsrc->req_completion_status,
++          spdst->req_completion_status);
++      ISP_IOXGET_16(isp, &spsrc->req_state_flags, spdst->req_state_flags);
++      ISP_IOXGET_16(isp, &spsrc->req_status_flags, spdst->req_status_flags);
++      ISP_IOXGET_16(isp, &spsrc->req_time, spdst->req_time);
++      ISP_IOXGET_16(isp, &spsrc->req_sense_len, spdst->req_sense_len);
++      ISP_IOXGET_32(isp, &spsrc->req_resid, spdst->req_resid);
++      for (i = 0; i < 8; i++) {
++              ISP_IOXGET_8(isp, &spsrc->req_response[i],
++                  spdst->req_response[i]);
++      }
++      for (i = 0; i < 32; i++) {
++              ISP_IOXGET_8(isp, &spsrc->req_sense_data[i],
++                  spdst->req_sense_data[i]);
++      }
++}
++
++static INLINE void
++isp_get_response_x(struct ispsoftc *isp, ispstatus_cont_t *cpsrc,
++    ispstatus_cont_t *cpdst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &cpsrc->req_header, &cpdst->req_header);
++      for (i = 0; i < 60; i++) {
++              ISP_IOXGET_8(isp, &cpsrc->req_sense_data[i],
++                  cpdst->req_sense_data[i]);
++      }
++}
++
++static INLINE void
++isp_get_rio2(struct ispsoftc *isp, isp_rio2_t *r2src, isp_rio2_t *r2dst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &r2src->req_header, &r2dst->req_header);
++      if (r2dst->req_header.rqs_seqno > 30)
++              r2dst->req_header.rqs_seqno = 30;
++      for (i = 0; i < r2dst->req_header.rqs_seqno; i++) {
++              ISP_IOXGET_16(isp, &r2src->req_handles[i],
++                  r2dst->req_handles[i]);
++      }
++      while (i < 30) {
++              r2dst->req_handles[i++] = 0;
++      }
++}
++
++static INLINE void
++isp_put_icb(struct ispsoftc *isp, isp_icb_t *Is, isp_icb_t *Id)
++{
++      int i;
++      ISP_SWAP8(Is->icb_version, Is->_reserved0);
++      ISP_IOXPUT_8(isp, Is->icb_version, &Id->icb_version);
++      ISP_IOXPUT_8(isp, Is->_reserved0, &Id->_reserved0);
++      ISP_IOXPUT_16(isp, Is->icb_fwoptions, &Id->icb_fwoptions);
++      ISP_IOXPUT_16(isp, Is->icb_maxfrmlen, &Id->icb_maxfrmlen);
++      ISP_IOXPUT_16(isp, Is->icb_maxalloc, &Id->icb_maxalloc);
++      ISP_IOXPUT_16(isp, Is->icb_execthrottle, &Id->icb_execthrottle);
++      ISP_SWAP8(Is->icb_retry_count, Is->icb_retry_delay);
++      ISP_IOXPUT_8(isp, Is->icb_retry_count, &Id->icb_retry_count);
++      ISP_IOXPUT_8(isp, Is->icb_retry_delay, &Id->icb_retry_delay);
++      for (i = 0; i < 8; i++) {
++              ISP_IOXPUT_8(isp, Is->icb_portname[i], &Id->icb_portname[i]);
++      }
++      ISP_IOXPUT_16(isp, Is->icb_hardaddr, &Id->icb_hardaddr);
++      ISP_SWAP8(Is->icb_iqdevtype, Is->icb_logintime);
++      ISP_IOXPUT_8(isp, Is->icb_iqdevtype, &Id->icb_iqdevtype);
++      ISP_IOXPUT_8(isp, Is->icb_logintime, &Id->icb_logintime);
++      for (i = 0; i < 8; i++) {
++              ISP_IOXPUT_8(isp, Is->icb_nodename[i], &Id->icb_nodename[i]);
++      }
++      ISP_IOXPUT_16(isp, Is->icb_rqstout, &Id->icb_rqstout);
++      ISP_IOXPUT_16(isp, Is->icb_rspnsin, &Id->icb_rspnsin);
++      ISP_IOXPUT_16(isp, Is->icb_rqstqlen, &Id->icb_rqstqlen);
++      ISP_IOXPUT_16(isp, Is->icb_rsltqlen, &Id->icb_rsltqlen);
++      for (i = 0; i < 4; i++) {
++              ISP_IOXPUT_16(isp, Is->icb_rqstaddr[i], &Id->icb_rqstaddr[i]);
++      }
++      for (i = 0; i < 4; i++) {
++              ISP_IOXPUT_16(isp, Is->icb_respaddr[i], &Id->icb_respaddr[i]);
++      }
++      ISP_IOXPUT_16(isp, Is->icb_lunenables, &Id->icb_lunenables);
++      ISP_SWAP8(Is->icb_ccnt, Is->icb_icnt);
++      ISP_IOXPUT_8(isp, Is->icb_ccnt, &Id->icb_ccnt);
++      ISP_IOXPUT_8(isp, Is->icb_icnt, &Id->icb_icnt);
++      ISP_IOXPUT_16(isp, Is->icb_lunetimeout, &Id->icb_lunetimeout);
++      ISP_IOXPUT_16(isp, Is->icb_xfwoptions, &Id->icb_xfwoptions);
++      ISP_SWAP8(Is->icb_racctimer, Is->icb_idelaytimer);
++      ISP_IOXPUT_8(isp, Is->icb_racctimer, &Id->icb_racctimer);
++      ISP_IOXPUT_8(isp, Is->icb_idelaytimer, &Id->icb_idelaytimer);
++      ISP_IOXPUT_16(isp, Is->icb_zfwoptions, &Id->icb_zfwoptions);
++}
++
++static INLINE void
++isp_get_pdb(struct ispsoftc *isp, isp_pdb_t *src, isp_pdb_t *dst)
++{
++      int i;
++      ISP_IOXGET_16(isp, &src->pdb_options, dst->pdb_options);
++        ISP_IOXGET_8(isp, &src->pdb_mstate, dst->pdb_mstate);
++        ISP_IOXGET_8(isp, &src->pdb_sstate, dst->pdb_sstate);
++      for (i = 0; i < 4; i++) {
++              ISP_IOXGET_8(isp, &src->pdb_hardaddr_bits[i],
++                  dst->pdb_hardaddr_bits[i]);
++      }
++      for (i = 0; i < 4; i++) {
++              ISP_IOXGET_8(isp, &src->pdb_portid_bits[i],
++                  dst->pdb_portid_bits[i]);
++      }
++      for (i = 0; i < 8; i++) {
++              ISP_IOXGET_8(isp, &src->pdb_nodename[i], dst->pdb_nodename[i]);
++      }
++      for (i = 0; i < 8; i++) {
++              ISP_IOXGET_8(isp, &src->pdb_portname[i], dst->pdb_portname[i]);
++      }
++      ISP_IOXGET_16(isp, &src->pdb_execthrottle, dst->pdb_execthrottle);
++      ISP_IOXGET_16(isp, &src->pdb_exec_count, dst->pdb_exec_count);
++      ISP_IOXGET_8(isp, &src->pdb_retry_count, dst->pdb_retry_count);
++      ISP_IOXGET_8(isp, &src->pdb_retry_delay, dst->pdb_retry_delay);
++      ISP_IOXGET_16(isp, &src->pdb_resalloc, dst->pdb_resalloc);
++      ISP_IOXGET_16(isp, &src->pdb_curalloc, dst->pdb_curalloc);
++      ISP_IOXGET_16(isp, &src->pdb_qhead, dst->pdb_qhead);
++      ISP_IOXGET_16(isp, &src->pdb_qtail, dst->pdb_qtail);
++      ISP_IOXGET_16(isp, &src->pdb_tl_next, dst->pdb_tl_next);
++      ISP_IOXGET_16(isp, &src->pdb_tl_last, dst->pdb_tl_last);
++      ISP_IOXGET_16(isp, &src->pdb_features, dst->pdb_features);
++      ISP_IOXGET_16(isp, &src->pdb_pconcurrnt, dst->pdb_pconcurrnt);
++      ISP_IOXGET_16(isp, &src->pdb_roi, dst->pdb_roi);
++      ISP_IOXGET_8(isp, &src->pdb_target, dst->pdb_target);
++      ISP_IOXGET_8(isp, &src->pdb_initiator, dst->pdb_initiator);
++      ISP_IOXGET_16(isp, &src->pdb_rdsiz, dst->pdb_rdsiz);
++      ISP_IOXGET_16(isp, &src->pdb_ncseq, dst->pdb_ncseq);
++      ISP_IOXGET_16(isp, &src->pdb_noseq, dst->pdb_noseq);
++      ISP_IOXGET_16(isp, &src->pdb_labrtflg, dst->pdb_labrtflg);
++      ISP_IOXGET_16(isp, &src->pdb_lstopflg, dst->pdb_lstopflg);
++      ISP_IOXGET_16(isp, &src->pdb_sqhead, dst->pdb_sqhead);
++      ISP_IOXGET_16(isp, &src->pdb_sqtail, dst->pdb_sqtail);
++      ISP_IOXGET_16(isp, &src->pdb_ptimer, dst->pdb_ptimer);
++      ISP_IOXGET_16(isp, &src->pdb_nxt_seqid, dst->pdb_nxt_seqid);
++      ISP_IOXGET_16(isp, &src->pdb_fcount, dst->pdb_fcount);
++      ISP_IOXGET_16(isp, &src->pdb_prli_len, dst->pdb_prli_len);
++      ISP_IOXGET_16(isp, &src->pdb_prli_svc0, dst->pdb_prli_svc0);
++      ISP_IOXGET_16(isp, &src->pdb_prli_svc3, dst->pdb_prli_svc3);
++      ISP_IOXGET_16(isp, &src->pdb_loopid, dst->pdb_loopid);
++      ISP_IOXGET_16(isp, &src->pdb_il_ptr, dst->pdb_il_ptr);
++      ISP_IOXGET_16(isp, &src->pdb_sl_ptr, dst->pdb_sl_ptr);
++}
++
++
++/*
++ * CT_HDR canonicalization- only needed for SNS responses
++ */
++static INLINE void
++isp_get_ct_hdr(struct ispsoftc *isp, ct_hdr_t *src, ct_hdr_t *dst)
++{
++      ISP_IOXGET_8(isp, &src->ct_revision, dst->ct_revision);
++      ISP_IOXGET_8(isp, &src->ct_portid[0], dst->ct_portid[0]);
++      ISP_IOXGET_8(isp, &src->ct_portid[1], dst->ct_portid[1]);
++      ISP_IOXGET_8(isp, &src->ct_portid[2], dst->ct_portid[2]);
++      ISP_IOXGET_8(isp, &src->ct_fcs_type, dst->ct_fcs_type);
++      ISP_IOXGET_8(isp, &src->ct_fcs_subtype, dst->ct_fcs_subtype);
++      ISP_IOXGET_8(isp, &src->ct_options, dst->ct_options);
++      ISP_IOXGET_8(isp, &src->ct_res0, dst->ct_res0);
++      ISP_IOXGET_16(isp, &src->ct_response, dst->ct_response);
++      dst->ct_response = (dst->ct_response << 8) | (dst->ct_response >> 8);
++      ISP_IOXGET_16(isp, &src->ct_resid, dst->ct_resid);
++      dst->ct_resid = (dst->ct_resid << 8) | (dst->ct_resid >> 8);
++      ISP_IOXGET_8(isp, &src->ct_res1, dst->ct_res1);
++      ISP_IOXGET_8(isp, &src->ct_reason, dst->ct_reason);
++      ISP_IOXGET_8(isp, &src->ct_explanation, dst->ct_explanation);
++      ISP_IOXGET_8(isp, &src->ct_vunique, dst->ct_vunique);
++}
++
++/*
++ * Generic SNS request - not particularly useful since the per-command data
++ * isn't always 16 bit words.
++ */
++static INLINE void
++isp_put_sns_request(struct ispsoftc *isp, sns_screq_t *src, sns_screq_t *dst)
++{
++      int i, nw = (int) src->snscb_sblen;
++      ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
++      for (i = 0; i < 4; i++) {
++              ISP_IOXPUT_16(isp, src->snscb_addr[i], &dst->snscb_addr[i]);
++      }
++      ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
++      for (i = 0; i < nw; i++) {
++              ISP_IOXPUT_16(isp, src->snscb_data[i], &dst->snscb_data[i]);
++      }
++      
++}
++
++static INLINE void
++isp_put_gid_ft_request(struct ispsoftc *isp, sns_gid_ft_req_t *src,
++    sns_gid_ft_req_t *dst)
++{
++      ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
++      ISP_IOXPUT_16(isp, src->snscb_res0, &dst->snscb_res0);
++      ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
++      ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
++      ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
++      ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
++      ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
++      ISP_IOXPUT_16(isp, src->snscb_res1, &dst->snscb_res1);
++      ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
++      ISP_IOXPUT_16(isp, src->snscb_mword_div_2, &dst->snscb_mword_div_2);
++      ISP_IOXPUT_32(isp, src->snscb_res3, &dst->snscb_res3);
++      ISP_IOXPUT_32(isp, src->snscb_fc4_type, &dst->snscb_fc4_type);
++}
++
++static INLINE void
++isp_put_gxn_id_request(struct ispsoftc *isp, sns_gxn_id_req_t *src,
++    sns_gxn_id_req_t *dst)
++{
++      ISP_IOXPUT_16(isp, src->snscb_rblen, &dst->snscb_rblen);
++      ISP_IOXPUT_16(isp, src->snscb_res0, &dst->snscb_res0);
++      ISP_IOXPUT_16(isp, src->snscb_addr[0], &dst->snscb_addr[0]);
++      ISP_IOXPUT_16(isp, src->snscb_addr[1], &dst->snscb_addr[1]);
++      ISP_IOXPUT_16(isp, src->snscb_addr[2], &dst->snscb_addr[2]);
++      ISP_IOXPUT_16(isp, src->snscb_addr[3], &dst->snscb_addr[3]);
++      ISP_IOXPUT_16(isp, src->snscb_sblen, &dst->snscb_sblen);
++      ISP_IOXPUT_16(isp, src->snscb_res1, &dst->snscb_res1);
++      ISP_IOXPUT_16(isp, src->snscb_cmd, &dst->snscb_cmd);
++      ISP_IOXPUT_16(isp, src->snscb_res2, &dst->snscb_res2);
++      ISP_IOXPUT_32(isp, src->snscb_res3, &dst->snscb_res3);
++      ISP_IOXPUT_32(isp, src->snscb_portid, &dst->snscb_portid);
++}
++
++/*
++ * Generic SNS response - not particularly useful since the per-command data
++ * isn't always 16 bit words.
++ */
++static INLINE void
++isp_get_sns_response(struct ispsoftc *isp, sns_scrsp_t *src,
++    sns_scrsp_t *dst, int nwords)
++{
++      int i;
++      isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++      ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
++      for (i = 0; i < 3; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_port_id[i],
++                  dst->snscb_port_id[i]);
++      }
++      for (i = 0; i < 8; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_portname[i],
++                  dst->snscb_portname[i]);
++      }
++      for (i = 0; i < nwords; i++) {
++              ISP_IOXGET_16(isp, &src->snscb_data[i], dst->snscb_data[i]);
++      }
++}
++
++static INLINE void
++isp_get_gid_ft_response(struct ispsoftc *isp, sns_gid_ft_rsp_t *src,
++    sns_gid_ft_rsp_t *dst, int nwords)
++{
++      int i;
++      isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++      for (i = 0; i < nwords; i++) {
++              int j;
++              ISP_IOXGET_8(isp,
++                  &src->snscb_ports[i].control,
++                  dst->snscb_ports[i].control);
++              for (j = 0; j < 3; j++) {
++                      ISP_IOXGET_8(isp,
++                          &src->snscb_ports[i].portid[j],
++                          dst->snscb_ports[i].portid[j]);
++              }
++              if (dst->snscb_ports[i].control & 0x80) {
++                      break;
++              }
++      }
++}
++
++static INLINE void
++isp_get_gxn_id_response(struct ispsoftc *isp, sns_gxn_id_rsp_t *src,
++    sns_gxn_id_rsp_t *dst)
++{
++      int i;
++      isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++      for (i = 0; i < 8; i++)
++              ISP_IOXGET_8(isp, &src->snscb_wwn[i], dst->snscb_wwn[i]);
++}
++
++static INLINE void
++isp_get_gff_id_response(struct ispsoftc *isp, sns_gff_id_rsp_t *src,
++    sns_gff_id_rsp_t *dst)
++{
++      int i;
++      isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++      for (i = 0; i < 32; i++) {
++              ISP_IOXGET_32(isp, &src->snscb_fc4_features[i],
++                  dst->snscb_fc4_features[i]);
++      }
++}
++
++static INLINE void
++isp_get_ga_nxt_response(struct ispsoftc *isp, sns_ga_nxt_rsp_t *src,
++    sns_ga_nxt_rsp_t *dst)
++{
++      int i;
++      isp_get_ct_hdr(isp, &src->snscb_cthdr, &dst->snscb_cthdr);
++      ISP_IOXGET_8(isp, &src->snscb_port_type, dst->snscb_port_type);
++      for (i = 0; i < 3; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_port_id[i],
++                  dst->snscb_port_id[i]);
++      }
++      for (i = 0; i < 8; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_portname[i],
++                  dst->snscb_portname[i]);
++      }
++      ISP_IOXGET_8(isp, &src->snscb_pnlen, dst->snscb_pnlen);
++      for (i = 0; i < 255; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_pname[i], dst->snscb_pname[i]);
++      }
++      for (i = 0; i < 8; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_nodename[i],
++                  dst->snscb_nodename[i]);
++      }
++      ISP_IOXGET_8(isp, &src->snscb_nnlen, dst->snscb_nnlen);
++      for (i = 0; i < 255; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_nname[i], dst->snscb_nname[i]);
++      }
++      for (i = 0; i < 8; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_ipassoc[i],
++                  dst->snscb_ipassoc[i]);
++      }
++      for (i = 0; i < 16; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_ipaddr[i], dst->snscb_ipaddr[i]);
++      }
++      for (i = 0; i < 4; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_svc_class[i],
++                  dst->snscb_svc_class[i]);
++      }
++      for (i = 0; i < 32; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_fc4_types[i],
++                  dst->snscb_fc4_types[i]);
++      }
++      for (i = 0; i < 8; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_fpname[i], dst->snscb_fpname[i]);
++      }
++      ISP_IOXGET_8(isp, &src->snscb_reserved, dst->snscb_reserved);
++      for (i = 0; i < 3; i++) {
++              ISP_IOXGET_8(isp, &src->snscb_hardaddr[i],
++                  dst->snscb_hardaddr[i]);
++      }
++}
++
++#ifdef        ISP_TARGET_MODE
++static INLINE void
++isp_put_atio(struct ispsoftc *isp, at_entry_t *atsrc, at_entry_t *atdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &atsrc->at_header, &atdst->at_header);
++      ISP_IOXPUT_16(isp, atsrc->at_reserved, &atdst->at_reserved);
++      ISP_IOXPUT_16(isp, atsrc->at_handle, &atdst->at_handle);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXPUT_8(isp, atsrc->at_lun, &atdst->at_iid);
++              ISP_IOXPUT_8(isp, atsrc->at_iid, &atdst->at_lun);
++              ISP_IOXPUT_8(isp, atsrc->at_cdblen, &atdst->at_tgt);
++              ISP_IOXPUT_8(isp, atsrc->at_tgt, &atdst->at_cdblen);
++              ISP_IOXPUT_8(isp, atsrc->at_status, &atdst->at_scsi_status);
++              ISP_IOXPUT_8(isp, atsrc->at_scsi_status, &atdst->at_status);
++              ISP_IOXPUT_8(isp, atsrc->at_tag_val, &atdst->at_tag_type);
++              ISP_IOXPUT_8(isp, atsrc->at_tag_type, &atdst->at_tag_val);
++      } else {
++              ISP_IOXPUT_8(isp, atsrc->at_lun, &atdst->at_lun);
++              ISP_IOXPUT_8(isp, atsrc->at_iid, &atdst->at_iid);
++              ISP_IOXPUT_8(isp, atsrc->at_cdblen, &atdst->at_cdblen);
++              ISP_IOXPUT_8(isp, atsrc->at_tgt, &atdst->at_tgt);
++              ISP_IOXPUT_8(isp, atsrc->at_status, &atdst->at_status);
++              ISP_IOXPUT_8(isp, atsrc->at_scsi_status,
++                  &atdst->at_scsi_status);
++              ISP_IOXPUT_8(isp, atsrc->at_tag_val, &atdst->at_tag_val);
++              ISP_IOXPUT_8(isp, atsrc->at_tag_type, &atdst->at_tag_type);
++      }
++      ISP_IOXPUT_32(isp, atsrc->at_flags, &atdst->at_flags);
++      for (i = 0; i < ATIO_CDBLEN; i++) {
++              ISP_IOXPUT_8(isp, atsrc->at_cdb[i], &atdst->at_cdb[i]);
++      }
++      for (i = 0; i < QLTM_SENSELEN; i++) {
++              ISP_IOXPUT_8(isp, atsrc->at_sense[i], &atdst->at_sense[i]);
++      }
++}
++
++static INLINE void
++isp_get_atio(struct ispsoftc *isp, at_entry_t *atsrc, at_entry_t *atdst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &atsrc->at_header, &atdst->at_header);
++      ISP_IOXGET_16(isp, &atsrc->at_reserved, atdst->at_reserved);
++      ISP_IOXGET_16(isp, &atsrc->at_handle, atdst->at_handle);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXGET_8(isp, &atsrc->at_lun, atdst->at_iid);
++              ISP_IOXGET_8(isp, &atsrc->at_iid, atdst->at_lun);
++              ISP_IOXGET_8(isp, &atsrc->at_cdblen, atdst->at_tgt);
++              ISP_IOXGET_8(isp, &atsrc->at_tgt, atdst->at_cdblen);
++              ISP_IOXGET_8(isp, &atsrc->at_status, atdst->at_scsi_status);
++              ISP_IOXGET_8(isp, &atsrc->at_scsi_status, atdst->at_status);
++              ISP_IOXGET_8(isp, &atsrc->at_tag_val, atdst->at_tag_type);
++              ISP_IOXGET_8(isp, &atsrc->at_tag_type, atdst->at_tag_val);
++      } else {
++              ISP_IOXGET_8(isp, &atsrc->at_lun, atdst->at_lun);
++              ISP_IOXGET_8(isp, &atsrc->at_iid, atdst->at_iid);
++              ISP_IOXGET_8(isp, &atsrc->at_cdblen, atdst->at_cdblen);
++              ISP_IOXGET_8(isp, &atsrc->at_tgt, atdst->at_tgt);
++              ISP_IOXGET_8(isp, &atsrc->at_status, atdst->at_status);
++              ISP_IOXGET_8(isp, &atsrc->at_scsi_status,
++                  atdst->at_scsi_status);
++              ISP_IOXGET_8(isp, &atsrc->at_tag_val, atdst->at_tag_val);
++              ISP_IOXGET_8(isp, &atsrc->at_tag_type, atdst->at_tag_type);
++      }
++      ISP_IOXGET_32(isp, &atsrc->at_flags, atdst->at_flags);
++      for (i = 0; i < ATIO_CDBLEN; i++) {
++              ISP_IOXGET_8(isp, &atsrc->at_cdb[i], atdst->at_cdb[i]);
++      }
++      for (i = 0; i < QLTM_SENSELEN; i++) {
++              ISP_IOXGET_8(isp, &atsrc->at_sense[i], atdst->at_sense[i]);
++      }
++}
++
++static INLINE void
++isp_put_atio2(struct ispsoftc *isp, at2_entry_t *atsrc, at2_entry_t *atdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &atsrc->at_header, &atdst->at_header);
++      ISP_IOXPUT_32(isp, atsrc->at_reserved, &atdst->at_reserved);
++      ISP_IOXPUT_8(isp, atsrc->at_lun, &atdst->at_lun);
++      ISP_IOXPUT_8(isp, atsrc->at_iid, &atdst->at_iid);
++      ISP_IOXPUT_16(isp, atsrc->at_rxid, &atdst->at_rxid);
++      ISP_IOXPUT_16(isp, atsrc->at_flags, &atdst->at_flags);
++      ISP_IOXPUT_16(isp, atsrc->at_status, &atdst->at_status);
++      ISP_IOXPUT_8(isp, atsrc->at_crn, &atdst->at_crn);
++      ISP_IOXPUT_8(isp, atsrc->at_taskcodes, &atdst->at_taskcodes);
++      ISP_IOXPUT_8(isp, atsrc->at_taskflags, &atdst->at_taskflags);
++      ISP_IOXPUT_8(isp, atsrc->at_execodes, &atdst->at_execodes);
++      for (i = 0; i < ATIO2_CDBLEN; i++) {
++              ISP_IOXPUT_8(isp, atsrc->at_cdb[i], &atdst->at_cdb[i]);
++      }
++      ISP_IOXPUT_32(isp, atsrc->at_datalen, &atdst->at_datalen);
++      ISP_IOXPUT_16(isp, atsrc->at_scclun, &atdst->at_scclun);
++      for (i = 0; i < 4; i++) {
++              ISP_IOXPUT_16(isp, atsrc->at_wwpn[i], &atdst->at_wwpn[i]);
++      }
++      for (i = 0; i < 6; i++) {
++              ISP_IOXPUT_16(isp, atsrc->at_reserved2[i],
++                  &atdst->at_reserved2[i]);
++      }
++      ISP_IOXPUT_16(isp, atsrc->at_oxid, &atdst->at_oxid);
++}
++
++static INLINE void
++isp_get_atio2(struct ispsoftc *isp, at2_entry_t *atsrc, at2_entry_t *atdst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &atsrc->at_header, &atdst->at_header);
++      ISP_IOXGET_32(isp, &atsrc->at_reserved, atdst->at_reserved);
++      ISP_IOXGET_8(isp, &atsrc->at_lun, atdst->at_lun);
++      ISP_IOXGET_8(isp, &atsrc->at_iid, atdst->at_iid);
++      ISP_IOXGET_16(isp, &atsrc->at_rxid, atdst->at_rxid);
++      ISP_IOXGET_16(isp, &atsrc->at_flags, atdst->at_flags);
++      ISP_IOXGET_16(isp, &atsrc->at_status, atdst->at_status);
++      ISP_IOXGET_8(isp, &atsrc->at_crn, atdst->at_crn);
++      ISP_IOXGET_8(isp, &atsrc->at_taskcodes, atdst->at_taskcodes);
++      ISP_IOXGET_8(isp, &atsrc->at_taskflags, atdst->at_taskflags);
++      ISP_IOXGET_8(isp, &atsrc->at_execodes, atdst->at_execodes);
++      for (i = 0; i < ATIO2_CDBLEN; i++) {
++              ISP_IOXGET_8(isp, &atsrc->at_cdb[i], atdst->at_cdb[i]);
++      }
++      ISP_IOXGET_32(isp, &atsrc->at_datalen, atdst->at_datalen);
++      ISP_IOXGET_16(isp, &atsrc->at_scclun, atdst->at_scclun);
++      for (i = 0; i < 4; i++) {
++              ISP_IOXGET_16(isp, &atsrc->at_wwpn[i], atdst->at_wwpn[i]);
++      }
++      for (i = 0; i < 6; i++) {
++              ISP_IOXGET_16(isp, &atsrc->at_reserved2[i],
++                  atdst->at_reserved2[i]);
++      }
++      ISP_IOXGET_16(isp, &atsrc->at_oxid, atdst->at_oxid);
++}
++
++static INLINE void
++isp_put_ctio(struct ispsoftc *isp, ct_entry_t *ctsrc, ct_entry_t *ctdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &ctsrc->ct_header, &ctdst->ct_header);
++      ISP_IOXPUT_16(isp, ctsrc->ct_reserved, &ctdst->ct_reserved);
++      ISP_IOXPUT_16(isp, ctsrc->ct_fwhandle, &ctdst->ct_fwhandle);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXPUT_8(isp, ctsrc->ct_iid, &ctdst->ct_lun);
++              ISP_IOXPUT_8(isp, ctsrc->ct_lun, &ctdst->ct_iid);
++              ISP_IOXPUT_8(isp, ctsrc->ct_tgt, &ctdst->ct_reserved2);
++              ISP_IOXPUT_8(isp, ctsrc->ct_reserved2, &ctdst->ct_tgt);
++              ISP_IOXPUT_8(isp, ctsrc->ct_status, &ctdst->ct_scsi_status);
++              ISP_IOXPUT_8(isp, ctsrc->ct_scsi_status, &ctdst->ct_status);
++              ISP_IOXPUT_8(isp, ctsrc->ct_tag_type, &ctdst->ct_tag_val);
++              ISP_IOXPUT_8(isp, ctsrc->ct_tag_val, &ctdst->ct_tag_type);
++      } else {
++              ISP_IOXPUT_8(isp, ctsrc->ct_iid, &ctdst->ct_iid);
++              ISP_IOXPUT_8(isp, ctsrc->ct_lun, &ctdst->ct_lun);
++              ISP_IOXPUT_8(isp, ctsrc->ct_tgt, &ctdst->ct_tgt);
++              ISP_IOXPUT_8(isp, ctsrc->ct_reserved2, &ctdst->ct_reserved2);
++              ISP_IOXPUT_8(isp, ctsrc->ct_scsi_status,
++                  &ctdst->ct_scsi_status);
++              ISP_IOXPUT_8(isp, ctsrc->ct_status, &ctdst->ct_status);
++              ISP_IOXPUT_8(isp, ctsrc->ct_tag_type, &ctdst->ct_tag_type);
++              ISP_IOXPUT_8(isp, ctsrc->ct_tag_val, &ctdst->ct_tag_val);
++      }
++      ISP_IOXPUT_32(isp, ctsrc->ct_flags, &ctdst->ct_flags);
++      ISP_IOXPUT_32(isp, ctsrc->ct_xfrlen, &ctdst->ct_xfrlen);
++      ISP_IOXPUT_32(isp, ctsrc->ct_resid, &ctdst->ct_resid);
++      ISP_IOXPUT_16(isp, ctsrc->ct_timeout, &ctdst->ct_timeout);
++      ISP_IOXPUT_16(isp, ctsrc->ct_seg_count, &ctdst->ct_seg_count);
++      for (i = 0; i < ISP_RQDSEG; i++) {
++              ISP_IOXPUT_32(isp, ctsrc->ct_dataseg[i].ds_base,
++                  &ctdst->ct_dataseg[i].ds_base);
++              ISP_IOXPUT_32(isp, ctsrc->ct_dataseg[i].ds_count,
++                  &ctdst->ct_dataseg[i].ds_count);
++      }
++}
++
++static INLINE void
++isp_get_ctio(struct ispsoftc *isp, ct_entry_t *ctsrc, ct_entry_t *ctdst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &ctsrc->ct_header, &ctdst->ct_header);
++      ISP_IOXGET_16(isp, &ctsrc->ct_reserved, ctdst->ct_reserved);
++      ISP_IOXGET_16(isp, &ctsrc->ct_fwhandle, ctdst->ct_fwhandle);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXGET_8(isp, &ctsrc->ct_lun, ctdst->ct_iid);
++              ISP_IOXGET_8(isp, &ctsrc->ct_iid, ctdst->ct_lun);
++              ISP_IOXGET_8(isp, &ctsrc->ct_reserved2, ctdst->ct_tgt);
++              ISP_IOXGET_8(isp, &ctsrc->ct_tgt, ctdst->ct_reserved2);
++              ISP_IOXGET_8(isp, &ctsrc->ct_status, ctdst->ct_scsi_status);
++              ISP_IOXGET_8(isp, &ctsrc->ct_scsi_status, ctdst->ct_status);
++              ISP_IOXGET_8(isp, &ctsrc->ct_tag_val, ctdst->ct_tag_type);
++              ISP_IOXGET_8(isp, &ctsrc->ct_tag_type, ctdst->ct_tag_val);
++      } else {
++              ISP_IOXGET_8(isp, &ctsrc->ct_lun, ctdst->ct_lun);
++              ISP_IOXGET_8(isp, &ctsrc->ct_iid, ctdst->ct_iid);
++              ISP_IOXGET_8(isp, &ctsrc->ct_reserved2, ctdst->ct_reserved2);
++              ISP_IOXGET_8(isp, &ctsrc->ct_tgt, ctdst->ct_tgt);
++              ISP_IOXGET_8(isp, &ctsrc->ct_status, ctdst->ct_status);
++              ISP_IOXGET_8(isp, &ctsrc->ct_scsi_status,
++                  ctdst->ct_scsi_status);
++              ISP_IOXGET_8(isp, &ctsrc->ct_tag_val, ctdst->ct_tag_val);
++              ISP_IOXGET_8(isp, &ctsrc->ct_tag_type, ctdst->ct_tag_type);
++      }
++      ISP_IOXGET_32(isp, &ctsrc->ct_flags, ctdst->ct_flags);
++      ISP_IOXGET_32(isp, &ctsrc->ct_xfrlen, ctdst->ct_xfrlen);
++      ISP_IOXGET_32(isp, &ctsrc->ct_resid, ctdst->ct_resid);
++      ISP_IOXGET_16(isp, &ctsrc->ct_timeout, ctdst->ct_timeout);
++      ISP_IOXGET_16(isp, &ctsrc->ct_seg_count, ctdst->ct_seg_count);
++      for (i = 0; i < ISP_RQDSEG; i++) {
++              ISP_IOXGET_32(isp,
++                  &ctsrc->ct_dataseg[i].ds_base,
++                  ctdst->ct_dataseg[i].ds_base);
++              ISP_IOXGET_32(isp,
++                  &ctsrc->ct_dataseg[i].ds_count,
++                  ctdst->ct_dataseg[i].ds_count);
++      }
++}
++
++static INLINE void
++isp_put_ctio2(struct ispsoftc *isp, ct2_entry_t *ctsrc, ct2_entry_t *ctdst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &ctsrc->ct_header, &ctdst->ct_header);
++      ISP_IOXPUT_16(isp, ctsrc->ct_reserved, &ctdst->ct_reserved);
++      ISP_IOXPUT_16(isp, ctsrc->ct_fwhandle, &ctdst->ct_fwhandle);
++      ISP_IOXPUT_8(isp, ctsrc->ct_lun, &ctdst->ct_lun);
++      ISP_IOXPUT_8(isp, ctsrc->ct_iid, &ctdst->ct_iid);
++      ISP_IOXPUT_16(isp, ctsrc->ct_rxid, &ctdst->ct_rxid);
++      ISP_IOXPUT_16(isp, ctsrc->ct_flags, &ctdst->ct_flags);
++      ISP_IOXPUT_16(isp, ctsrc->ct_timeout, &ctdst->ct_timeout);
++      ISP_IOXPUT_16(isp, ctsrc->ct_seg_count, &ctdst->ct_seg_count);
++      ISP_IOXPUT_32(isp, ctsrc->ct_resid, &ctdst->ct_resid);
++      ISP_IOXPUT_32(isp, ctsrc->ct_reloff, &ctdst->ct_reloff);
++      if ((ctsrc->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE0) {
++              ISP_IOXPUT_32(isp, ctsrc->rsp.m0._reserved,
++                  &ctdst->rsp.m0._reserved);
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m0._reserved2,
++                  &ctdst->rsp.m0._reserved2);
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m0.ct_scsi_status,
++                  &ctdst->rsp.m0.ct_scsi_status);
++              ISP_IOXPUT_32(isp, ctsrc->rsp.m0.ct_xfrlen,
++                  &ctdst->rsp.m0.ct_xfrlen);
++              if (ctsrc->ct_header.rqs_entry_type == RQSTYPE_CTIO2) {
++                      for (i = 0; i < ISP_RQDSEG_T2; i++) {
++                              ISP_IOXPUT_32(isp,
++                                  ctsrc->rsp.m0.ct_dataseg[i].ds_base,
++                                  &ctdst->rsp.m0.ct_dataseg[i].ds_base);
++                              ISP_IOXPUT_32(isp,
++                                  ctsrc->rsp.m0.ct_dataseg[i].ds_count,
++                                  &ctdst->rsp.m0.ct_dataseg[i].ds_count);
++                      }
++              } else if (ctsrc->ct_header.rqs_entry_type == RQSTYPE_CTIO3) {
++                      for (i = 0; i < ISP_RQDSEG_T3; i++) {
++                              ISP_IOXPUT_32(isp,
++                                  ctsrc->rsp.m0.ct_dataseg64[i].ds_base,
++                                  &ctdst->rsp.m0.ct_dataseg64[i].ds_base);
++                              ISP_IOXPUT_32(isp,
++                                  ctsrc->rsp.m0.ct_dataseg64[i].ds_basehi,
++                                  &ctdst->rsp.m0.ct_dataseg64[i].ds_basehi);
++                              ISP_IOXPUT_32(isp,
++                                  ctsrc->rsp.m0.ct_dataseg64[i].ds_count,
++                                  &ctdst->rsp.m0.ct_dataseg64[i].ds_count);
++                      }
++              } else if (ctsrc->ct_header.rqs_entry_type == RQSTYPE_CTIO4) {
++                      ISP_IOXPUT_16(isp, ctsrc->rsp.m0.ct_dslist.ds_type,
++                          &ctdst->rsp.m0.ct_dslist.ds_type);
++                      ISP_IOXPUT_32(isp, ctsrc->rsp.m0.ct_dslist.ds_segment,
++                          &ctdst->rsp.m0.ct_dslist.ds_segment);
++                      ISP_IOXPUT_32(isp, ctsrc->rsp.m0.ct_dslist.ds_base,
++                          &ctdst->rsp.m0.ct_dslist.ds_base);
++              }
++      } else if ((ctsrc->ct_flags & CT2_FLAG_MMASK) == CT2_FLAG_MODE1) {
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m1._reserved,
++                  &ctdst->rsp.m1._reserved);
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m1._reserved2,
++                  &ctdst->rsp.m1._reserved2);
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m1.ct_senselen,
++                  &ctdst->rsp.m1.ct_senselen);
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m1.ct_scsi_status,
++                  &ctdst->rsp.m1.ct_scsi_status);
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m1.ct_resplen,
++                  &ctdst->rsp.m1.ct_resplen);
++              for (i = 0; i < MAXRESPLEN; i++) {
++                      ISP_IOXPUT_8(isp, ctsrc->rsp.m1.ct_resp[i],
++                          &ctdst->rsp.m1.ct_resp[i]);
++              }
++      } else {
++              ISP_IOXPUT_32(isp, ctsrc->rsp.m2._reserved,
++                  &ctdst->rsp.m2._reserved);
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m2._reserved2,
++                  &ctdst->rsp.m2._reserved2);
++              ISP_IOXPUT_16(isp, ctsrc->rsp.m2._reserved3,
++                  &ctdst->rsp.m2._reserved3);
++              ISP_IOXPUT_32(isp, ctsrc->rsp.m2.ct_datalen,
++                  &ctdst->rsp.m2.ct_datalen);
++              ISP_IOXPUT_32(isp, ctsrc->rsp.m2.ct_fcp_rsp_iudata.ds_base,
++                  &ctdst->rsp.m2.ct_fcp_rsp_iudata.ds_base);
++              ISP_IOXPUT_32(isp, ctsrc->rsp.m2.ct_fcp_rsp_iudata.ds_count,
++                  &ctdst->rsp.m2.ct_fcp_rsp_iudata.ds_count);
++      }
++}
++
++static INLINE void
++isp_get_ctio2(struct ispsoftc *isp, ct2_entry_t *ctsrc, ct2_entry_t *ctdst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &ctsrc->ct_header, &ctdst->ct_header);
++      ISP_IOXGET_16(isp, &ctsrc->ct_reserved, ctdst->ct_reserved);
++      ISP_IOXGET_16(isp, &ctsrc->ct_fwhandle, ctdst->ct_fwhandle);
++      ISP_IOXGET_8(isp, &ctsrc->ct_lun, ctdst->ct_lun);
++      ISP_IOXGET_8(isp, &ctsrc->ct_iid, ctdst->ct_iid);
++      ISP_IOXGET_16(isp, &ctsrc->ct_rxid, ctdst->ct_rxid);
++      ISP_IOXGET_16(isp, &ctsrc->ct_flags, ctdst->ct_flags);
++      ISP_IOXGET_16(isp, &ctsrc->ct_status, ctdst->ct_status);
++      ISP_IOXGET_16(isp, &ctsrc->ct_timeout, ctdst->ct_timeout);
++      ISP_IOXGET_16(isp, &ctsrc->ct_seg_count, ctdst->ct_seg_count);
++      ISP_IOXGET_32(isp, &ctsrc->ct_reloff, ctdst->ct_reloff);
++      ISP_IOXGET_32(isp, &ctsrc->ct_resid, ctdst->ct_resid);
++      for (i = 0; i < 4; i++) {
++              ISP_IOXGET_32(isp, &ctsrc->rsp.fw._reserved[i],
++                  ctdst->rsp.fw._reserved[i]);
++      }
++      ISP_IOXGET_16(isp, &ctsrc->rsp.fw.ct_scsi_status,
++          ctdst->rsp.fw.ct_scsi_status);
++      for (i = 0; i < QLTM_SENSELEN; i++) {
++              ISP_IOXGET_8(isp, &ctsrc->rsp.fw.ct_sense[i],
++                  ctdst->rsp.fw.ct_sense[i]);
++      }
++}
++
++static INLINE void
++isp_put_enable_lun(struct ispsoftc *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &lesrc->le_header, &ledst->le_header);
++      ISP_IOXPUT_32(isp, lesrc->le_reserved, &ledst->le_reserved);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_rsvd);
++              ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_lun);
++              ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_tgt);
++              ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_ops);
++              ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_reserved2);
++              ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_status);
++              ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_in_count);
++              ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_cmd_count);
++              ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb7len);
++              ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb6len);
++      } else {
++              ISP_IOXPUT_8(isp, lesrc->le_lun, &ledst->le_lun);
++              ISP_IOXPUT_8(isp, lesrc->le_rsvd, &ledst->le_rsvd);
++              ISP_IOXPUT_8(isp, lesrc->le_ops, &ledst->le_ops);
++              ISP_IOXPUT_8(isp, lesrc->le_tgt, &ledst->le_tgt);
++              ISP_IOXPUT_8(isp, lesrc->le_status, &ledst->le_status);
++              ISP_IOXPUT_8(isp, lesrc->le_reserved2, &ledst->le_reserved2);
++              ISP_IOXPUT_8(isp, lesrc->le_cmd_count, &ledst->le_cmd_count);
++              ISP_IOXPUT_8(isp, lesrc->le_in_count, &ledst->le_in_count);
++              ISP_IOXPUT_8(isp, lesrc->le_cdb6len, &ledst->le_cdb6len);
++              ISP_IOXPUT_8(isp, lesrc->le_cdb7len, &ledst->le_cdb7len);
++      }
++      ISP_IOXPUT_32(isp, lesrc->le_flags, &ledst->le_flags);
++      ISP_IOXPUT_16(isp, lesrc->le_timeout, &ledst->le_timeout);
++      for (i = 0; i < 20; i++) {
++              ISP_IOXPUT_8(isp, lesrc->le_reserved3[i],
++                  &ledst->le_reserved3[i]);
++      }
++}
++
++static INLINE void
++isp_get_enable_lun(struct ispsoftc *isp, lun_entry_t *lesrc, lun_entry_t *ledst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &lesrc->le_header, &ledst->le_header);
++      ISP_IOXGET_32(isp, &lesrc->le_reserved, ledst->le_reserved);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_rsvd);
++              ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_lun);
++              ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_tgt);
++              ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_ops);
++              ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_reserved2);
++              ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_status);
++              ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_in_count);
++              ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_cmd_count);
++              ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb7len);
++              ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb6len);
++      } else {
++              ISP_IOXGET_8(isp, &lesrc->le_lun, ledst->le_lun);
++              ISP_IOXGET_8(isp, &lesrc->le_rsvd, ledst->le_rsvd);
++              ISP_IOXGET_8(isp, &lesrc->le_ops, ledst->le_ops);
++              ISP_IOXGET_8(isp, &lesrc->le_tgt, ledst->le_tgt);
++              ISP_IOXGET_8(isp, &lesrc->le_status, ledst->le_status);
++              ISP_IOXGET_8(isp, &lesrc->le_reserved2, ledst->le_reserved2);
++              ISP_IOXGET_8(isp, &lesrc->le_cmd_count, ledst->le_cmd_count);
++              ISP_IOXGET_8(isp, &lesrc->le_in_count, ledst->le_in_count);
++              ISP_IOXGET_8(isp, &lesrc->le_cdb6len, ledst->le_cdb6len);
++              ISP_IOXGET_8(isp, &lesrc->le_cdb7len, ledst->le_cdb7len);
++      }
++      ISP_IOXGET_32(isp, &lesrc->le_flags, ledst->le_flags);
++      ISP_IOXGET_16(isp, &lesrc->le_timeout, ledst->le_timeout);
++      for (i = 0; i < 20; i++) {
++              ISP_IOXGET_8(isp, &lesrc->le_reserved3[i],
++                  ledst->le_reserved3[i]);
++      }
++}
++
++static INLINE void
++isp_put_notify(struct ispsoftc *isp, in_entry_t *insrc, in_entry_t *indst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &insrc->in_header, &indst->in_header);
++      ISP_IOXPUT_32(isp, insrc->in_reserved, &indst->in_reserved);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXPUT_8(isp, insrc->in_lun, &indst->in_iid);
++              ISP_IOXPUT_8(isp, insrc->in_iid, &indst->in_lun);
++              ISP_IOXPUT_8(isp, insrc->in_reserved2, &indst->in_tgt);
++              ISP_IOXPUT_8(isp, insrc->in_tgt, &indst->in_reserved2);
++              ISP_IOXPUT_8(isp, insrc->in_status, &indst->in_rsvd2);
++              ISP_IOXPUT_8(isp, insrc->in_rsvd2, &indst->in_status);
++              ISP_IOXPUT_8(isp, insrc->in_tag_val, &indst->in_tag_type);
++              ISP_IOXPUT_8(isp, insrc->in_tag_type, &indst->in_tag_val);
++      } else {
++              ISP_IOXPUT_8(isp, insrc->in_lun, &indst->in_lun);
++              ISP_IOXPUT_8(isp, insrc->in_iid, &indst->in_iid);
++              ISP_IOXPUT_8(isp, insrc->in_reserved2, &indst->in_reserved2);
++              ISP_IOXPUT_8(isp, insrc->in_tgt, &indst->in_tgt);
++              ISP_IOXPUT_8(isp, insrc->in_status, &indst->in_status);
++              ISP_IOXPUT_8(isp, insrc->in_rsvd2, &indst->in_rsvd2);
++              ISP_IOXPUT_8(isp, insrc->in_tag_val, &indst->in_tag_val);
++              ISP_IOXPUT_8(isp, insrc->in_tag_type, &indst->in_tag_type);
++      }
++      ISP_IOXPUT_32(isp, insrc->in_flags, &indst->in_flags);
++      ISP_IOXPUT_16(isp, insrc->in_seqid, &indst->in_seqid);
++      for (i = 0; i < IN_MSGLEN; i++) {
++              ISP_IOXPUT_8(isp, insrc->in_msg[i], &indst->in_msg[i]);
++      }
++      for (i = 0; i < IN_RSVDLEN; i++) {
++              ISP_IOXPUT_8(isp, insrc->in_reserved3[i],
++                  &indst->in_reserved3[i]);
++      }
++      for (i = 0; i < QLTM_SENSELEN; i++) {
++              ISP_IOXPUT_8(isp, insrc->in_sense[i],
++                  &indst->in_sense[i]);
++      }
++}
++
++static INLINE void
++isp_get_notify(struct ispsoftc *isp, in_entry_t *insrc, in_entry_t *indst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &insrc->in_header, &indst->in_header);
++      ISP_IOXGET_32(isp, &insrc->in_reserved, indst->in_reserved);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXGET_8(isp, &insrc->in_lun, indst->in_iid);
++              ISP_IOXGET_8(isp, &insrc->in_iid, indst->in_lun);
++              ISP_IOXGET_8(isp, &insrc->in_reserved2, indst->in_tgt);
++              ISP_IOXGET_8(isp, &insrc->in_tgt, indst->in_reserved2);
++              ISP_IOXGET_8(isp, &insrc->in_status, indst->in_rsvd2);
++              ISP_IOXGET_8(isp, &insrc->in_rsvd2, indst->in_status);
++              ISP_IOXGET_8(isp, &insrc->in_tag_val, indst->in_tag_type);
++              ISP_IOXGET_8(isp, &insrc->in_tag_type, indst->in_tag_val);
++      } else {
++              ISP_IOXGET_8(isp, &insrc->in_lun, indst->in_lun);
++              ISP_IOXGET_8(isp, &insrc->in_iid, indst->in_iid);
++              ISP_IOXGET_8(isp, &insrc->in_reserved2, indst->in_reserved2);
++              ISP_IOXGET_8(isp, &insrc->in_tgt, indst->in_tgt);
++              ISP_IOXGET_8(isp, &insrc->in_status, indst->in_status);
++              ISP_IOXGET_8(isp, &insrc->in_rsvd2, indst->in_rsvd2);
++              ISP_IOXGET_8(isp, &insrc->in_tag_val, indst->in_tag_val);
++              ISP_IOXGET_8(isp, &insrc->in_tag_type, indst->in_tag_type);
++      }
++      ISP_IOXGET_32(isp, &insrc->in_flags, indst->in_flags);
++      ISP_IOXGET_16(isp, &insrc->in_seqid, indst->in_seqid);
++      for (i = 0; i < IN_MSGLEN; i++) {
++              ISP_IOXGET_8(isp, &insrc->in_msg[i], indst->in_msg[i]);
++      }
++      for (i = 0; i < IN_RSVDLEN; i++) {
++              ISP_IOXGET_8(isp, &insrc->in_reserved3[i],
++                  indst->in_reserved3[i]);
++      }
++      for (i = 0; i < QLTM_SENSELEN; i++) {
++              ISP_IOXGET_8(isp, &insrc->in_sense[i],
++                  indst->in_sense[i]);
++      }
++}
++
++static INLINE void
++isp_put_notify_fc(struct ispsoftc *isp, in_fcentry_t *insrc,
++    in_fcentry_t *indst)
++{
++      isp_copy_out_hdr(isp, &insrc->in_header, &indst->in_header);
++      ISP_IOXPUT_32(isp, insrc->in_reserved, &indst->in_reserved);
++      ISP_IOXPUT_8(isp, insrc->in_lun, &indst->in_lun);
++      ISP_IOXPUT_8(isp, insrc->in_iid, &indst->in_iid);
++      ISP_IOXPUT_16(isp, insrc->in_scclun, &indst->in_scclun);
++      ISP_IOXPUT_32(isp, insrc->in_reserved2, &indst->in_reserved2);
++      ISP_IOXPUT_16(isp, insrc->in_status, &indst->in_status);
++      ISP_IOXPUT_16(isp, insrc->in_task_flags, &indst->in_task_flags);
++      ISP_IOXPUT_16(isp, insrc->in_seqid, &indst->in_seqid);
++}
++
++static INLINE void
++isp_get_notify_fc(struct ispsoftc *isp, in_fcentry_t *insrc,
++    in_fcentry_t *indst)
++{
++      isp_copy_in_hdr(isp, &insrc->in_header, &indst->in_header);
++      ISP_IOXGET_32(isp, &insrc->in_reserved, indst->in_reserved);
++      ISP_IOXGET_8(isp, &insrc->in_lun, indst->in_lun);
++      ISP_IOXGET_8(isp, &insrc->in_iid, indst->in_iid);
++      ISP_IOXGET_16(isp, &insrc->in_scclun, indst->in_scclun);
++      ISP_IOXGET_32(isp, &insrc->in_reserved2, indst->in_reserved2);
++      ISP_IOXGET_16(isp, &insrc->in_status, indst->in_status);
++      ISP_IOXGET_16(isp, &insrc->in_task_flags, indst->in_task_flags);
++      ISP_IOXGET_16(isp, &insrc->in_seqid, indst->in_seqid);
++}
++
++static INLINE void
++isp_put_notify_ack(struct ispsoftc *isp, na_entry_t *nasrc,  na_entry_t *nadst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &nasrc->na_header, &nadst->na_header);
++      ISP_IOXPUT_32(isp, nasrc->na_reserved, &nadst->na_reserved);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXPUT_8(isp, nasrc->na_lun, &nadst->na_iid);
++              ISP_IOXPUT_8(isp, nasrc->na_iid, &nadst->na_lun);
++              ISP_IOXPUT_8(isp, nasrc->na_status, &nadst->na_event);
++              ISP_IOXPUT_8(isp, nasrc->na_event, &nadst->na_status);
++      } else {
++              ISP_IOXPUT_8(isp, nasrc->na_lun, &nadst->na_lun);
++              ISP_IOXPUT_8(isp, nasrc->na_iid, &nadst->na_iid);
++              ISP_IOXPUT_8(isp, nasrc->na_status, &nadst->na_status);
++              ISP_IOXPUT_8(isp, nasrc->na_event, &nadst->na_event);
++      }
++      ISP_IOXPUT_32(isp, nasrc->na_flags, &nadst->na_flags);
++      for (i = 0; i < NA_RSVDLEN; i++) {
++              ISP_IOXPUT_16(isp, nasrc->na_reserved3[i],
++                  &nadst->na_reserved3[i]);
++      }
++}
++
++static INLINE void
++isp_get_notify_ack(struct ispsoftc *isp, na_entry_t *nasrc, na_entry_t *nadst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &nasrc->na_header, &nadst->na_header);
++      ISP_IOXGET_32(isp, &nasrc->na_reserved, nadst->na_reserved);
++      if (ISP_IS_SBUS(isp)) {
++              ISP_IOXGET_8(isp, &nasrc->na_lun, nadst->na_iid);
++              ISP_IOXGET_8(isp, &nasrc->na_iid, nadst->na_lun);
++              ISP_IOXGET_8(isp, &nasrc->na_status, nadst->na_event);
++              ISP_IOXGET_8(isp, &nasrc->na_event, nadst->na_status);
++      } else {
++              ISP_IOXGET_8(isp, &nasrc->na_lun, nadst->na_lun);
++              ISP_IOXGET_8(isp, &nasrc->na_iid, nadst->na_iid);
++              ISP_IOXGET_8(isp, &nasrc->na_status, nadst->na_status);
++              ISP_IOXGET_8(isp, &nasrc->na_event, nadst->na_event);
++      }
++      ISP_IOXGET_32(isp, &nasrc->na_flags, nadst->na_flags);
++      for (i = 0; i < NA_RSVDLEN; i++) {
++              ISP_IOXGET_16(isp, &nasrc->na_reserved3[i],
++                  nadst->na_reserved3[i]);
++      }
++}
++
++static INLINE void
++isp_put_notify_ack_fc(struct ispsoftc *isp, na_fcentry_t *nasrc,
++    na_fcentry_t *nadst)
++{
++      int i;
++      isp_copy_out_hdr(isp, &nasrc->na_header, &nadst->na_header);
++      ISP_IOXPUT_32(isp, nasrc->na_reserved, &nadst->na_reserved);
++      ISP_IOXPUT_8(isp, nasrc->na_lun, &nadst->na_lun);
++      ISP_IOXPUT_8(isp, nasrc->na_iid, &nadst->na_iid);
++      ISP_IOXPUT_16(isp, nasrc->na_scclun, &nadst->na_scclun);
++      ISP_IOXPUT_16(isp, nasrc->na_flags, &nadst->na_flags);
++      ISP_IOXPUT_16(isp, nasrc->na_reserved2, &nadst->na_reserved2);
++      ISP_IOXPUT_16(isp, nasrc->na_status, &nadst->na_status);
++      ISP_IOXPUT_16(isp, nasrc->na_task_flags, &nadst->na_task_flags);
++      ISP_IOXPUT_16(isp, nasrc->na_seqid, &nadst->na_seqid);
++      for (i = 0; i < NA2_RSVDLEN; i++) {
++              ISP_IOXPUT_16(isp, nasrc->na_reserved3[i],
++                  &nadst->na_reserved3[i]);
++      }
++}
++
++static INLINE void
++isp_get_notify_ack_fc(struct ispsoftc *isp, na_fcentry_t *nasrc,
++    na_fcentry_t *nadst)
++{
++      int i;
++      isp_copy_in_hdr(isp, &nasrc->na_header, &nadst->na_header);
++      ISP_IOXGET_32(isp, &nasrc->na_reserved, nadst->na_reserved);
++      ISP_IOXGET_8(isp, &nasrc->na_lun, nadst->na_lun);
++      ISP_IOXGET_8(isp, &nasrc->na_iid, nadst->na_iid);
++      ISP_IOXGET_16(isp, &nasrc->na_scclun, nadst->na_scclun);
++      ISP_IOXGET_16(isp, &nasrc->na_flags, nadst->na_flags);
++      ISP_IOXGET_16(isp, &nasrc->na_reserved2, nadst->na_reserved2);
++      ISP_IOXGET_16(isp, &nasrc->na_status, nadst->na_status);
++      ISP_IOXGET_16(isp, &nasrc->na_task_flags, nadst->na_task_flags);
++      ISP_IOXGET_16(isp, &nasrc->na_seqid, nadst->na_seqid);
++      for (i = 0; i < NA2_RSVDLEN; i++) {
++              ISP_IOXGET_16(isp, &nasrc->na_reserved3[i],
++                  nadst->na_reserved3[i]);
++      }
++}
++#endif
++#endif        /* _ISP_INLINE_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_ioctl.h    2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,128 @@
++/* %W% */
++/*
++ * ioctl definitions for Qlogic FC/SCSI HBA driver
++ */
++#define       ISP_IOC         (0x4D4A5100)    /* 'MJQ' << 8 */
++
++/*
++ * This ioctl sets/retrieves the debugging level for this hba instance.
++ * Note that this is not a simple integer level- see ispvar.h for definitions.
++ *
++ * The arguments is a pointer to an integer with the new debugging level.
++ * The old value is written into this argument.
++ */
++
++#define       ISP_SDBLEV      (ISP_IOC | 1)
++
++/*
++ * This ioctl resets the HBA. Use with caution.
++ */
++#define       ISP_RESETHBA    (ISP_IOC | 2)
++
++/*
++ * This ioctl performs a fibre chanel rescan.
++ */
++#define       ISP_RESCAN      (ISP_IOC | 3)
++
++/*
++ * This ioctl performs a reset and then will set the adapter to the
++ * role that was passed in (the old role will be returned). It almost
++ * goes w/o saying: use with caution.
++ */
++#define ISP_SETROLE     (ISP_IOC | 4)
++
++#define ISP_ROLE_NONE           0x0
++#define ISP_ROLE_INITIATOR      0x1
++#define ISP_ROLE_TARGET         0x2
++#define ISP_ROLE_BOTH           (ISP_ROLE_TARGET|ISP_ROLE_INITIATOR)
++#ifndef ISP_DEFAULT_ROLES
++#define ISP_DEFAULT_ROLES       ISP_ROLE_BOTH
++#endif
++
++/*
++ * Get the current adapter role
++ */
++#define ISP_GETROLE     (ISP_IOC | 5)
++
++/*
++ * Get/Clear Stats
++ */
++#define       ISP_STATS_VERSION       0
++typedef struct {
++      u_int8_t        isp_stat_version;
++      u_int8_t        isp_type;               /* (ro) reflects chip type */
++      u_int8_t        isp_revision;           /* (ro) reflects chip version */
++      u_int8_t        unused1;
++      u_int32_t       unused2;
++      /*
++       * Statistics Counters
++       */
++#define       ISP_NSTATS      16
++#define       ISP_INTCNT      0
++#define       ISP_INTBOGUS    1
++#define       ISP_INTMBOXC    2
++#define       ISP_INGOASYNC   3
++#define       ISP_RSLTCCMPLT  4
++#define       ISP_FPHCCMCPLT  5
++#define       ISP_RSCCHIWAT   6
++#define       ISP_FPCCHIWAT   7
++      u_int64_t       isp_stats[ISP_NSTATS];
++} isp_stats_t;
++
++#define       ISP_GET_STATS   (ISP_IOC | 6)
++#define       ISP_CLR_STATS   (ISP_IOC | 7)
++
++/*
++ * Initiate a LIP
++ */
++#define       ISP_FC_LIP      (ISP_IOC | 8)
++
++/*
++ * Return the Port Database structure for the named device, or ENODEV if none.
++ * Caller fills in virtual loopid (0..255), aka 'target'. The driver returns
++ * ENODEV (if nothing valid there) or the actual loopid (for local loop devices
++ * only), 24 bit Port ID and Node and Port WWNs.
++ */
++struct isp_fc_device {
++      u_int32_t       loopid; /* 0..255 */
++      u_int32_t       portid; /* 24 bit Port ID */
++      u_int64_t       node_wwn;
++      u_int64_t       port_wwn;
++};
++#define       ISP_FC_GETDINFO (ISP_IOC | 9)
++
++/*
++ * Get F/W crash dump
++ */
++#define       ISP_GET_FW_CRASH_DUMP   (ISP_IOC | 10)
++#define       ISP_FORCE_CRASH_DUMP    (ISP_IOC | 11)
++
++/*
++ * Get information about this Host Adapter, including current connection
++ * topology and capabilities.
++ */
++struct isp_hba_device {
++      u_int32_t
++                                      : 8,
++                                      : 4,
++              fc_speed                : 4,    /* Gbps */
++                                      : 2,
++              fc_class2               : 1,
++              fc_ip_supported         : 1,
++              fc_scsi_supported       : 1,
++              fc_topology             : 3,
++              fc_loopid               : 8;
++      u_int64_t       nvram_node_wwn;
++      u_int64_t       nvram_port_wwn;
++      u_int64_t       active_node_wwn;
++      u_int64_t       active_port_wwn;
++};
++
++#define       ISP_TOPO_UNKNOWN        0       /* connection topology unknown */
++#define       ISP_TOPO_FCAL           1       /* private or PL_DA */
++#define       ISP_TOPO_LPORT          2       /* public loop */
++#define       ISP_TOPO_NPORT          3       /* N-port */
++#define       ISP_TOPO_FPORT          4       /* F-port */
++
++#define       ISP_FC_GETHINFO         (ISP_IOC|12)
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_linux.c    2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,3015 @@
++/* @(#)isp_linux.c 1.66 */
++/*
++ * Qlogic ISP Host Adapter Common Bus Linux routies
++ *---------------------------------------
++ *
++ * Copyright (c) 1998, 1999, 2000, 2001 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * the GNU Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * PMB #825
++ * 5214-F Diamond Hts Blvd
++ * San Francisco, CA, 94131
++ * mjacob@feral.com
++ *
++ *--------
++ * Bug fixes from Janice McLaughlin (janus@somemore.com)
++ * gratefully acknowledged.
++ *
++ */
++
++#define       ISP_MODULE      1
++#include "isp_linux.h"
++#include "linux/smp_lock.h"
++
++
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define       scsi_add_timer          _scsi_add_timer
++#define       scsi_delete_timer       _scsi_delete_timer
++static INLINE void _scsi_add_timer(Scsi_Cmnd *, int, void ((*)(Scsi_Cmnd *)));
++static INLINE int _scsi_delete_timer(Scsi_Cmnd *);
++
++static INLINE void
++scsi_add_timer(Scsi_Cmnd *SCset, int timeout, void (*complete)(Scsi_Cmnd *))
++{
++    if (SCset->eh_timeout.function != NULL) {
++      del_timer(&SCset->eh_timeout);
++    }
++    SCset->eh_timeout.data = (unsigned long) SCset;
++    SCset->eh_timeout.expires = jiffies + timeout;
++    SCset->eh_timeout.function = (void (*)(unsigned long))complete;
++    add_timer(&SCset->eh_timeout);
++}
++static INLINE int
++scsi_delete_timer(Scsi_Cmnd *SCset)
++{
++    if (SCset->eh_timeout.function != NULL) {
++      del_timer(&SCset->eh_timeout);
++    }
++    SCset->eh_timeout.data = 0UL;
++    SCset->eh_timeout.function = NULL;
++    return 0;
++}
++#else
++extern void scsi_add_timer(Scsi_Cmnd *, int, void ((*)(Scsi_Cmnd *)));
++extern int scsi_delete_timer(Scsi_Cmnd *);
++#endif
++static int isp_task_thread(void *);
++
++struct ispsoftc *isplist = NULL;
++const char *class3_roles[4] = {
++    "None", "Target", "Initiator", "Target/Initiator"
++};
++int isp_debug = 0;
++int isp_throttle = 0;
++int isp_cmd_per_lun = 0;
++int isp_unit_seed = 0;
++int isp_disable = 0;
++int isp_nofwreload = 0;
++int isp_nonvram = 0;
++int isp_maxluns = 8;
++int isp_fcduplex = 0;
++int isp_nport_only = 0;
++int isp_loop_only = 0;
++int isp_deadloop_time = 30;   /* how long to wait before assume loop dead */
++int isp_xtime = 0;
++int isp_default_frame_size;
++int isp_default_exec_throttle;
++
++static char *isp_roles;
++static char *isp_wwpns;
++static char *isp_wwnns;
++
++
++#ifdef        LINUX_ISP_TARGET_MODE
++#ifndef       ISP_PARENT_TARGET
++#define       ISP_PARENT_TARGET       scsi_target_handler
++#endif
++extern void ISP_PARENT_TARGET (qact_e, void *);
++static void isp_taction(qact_e, void *);
++static INLINE int nolunsenabled(struct ispsoftc *, int);
++static void isp_target_start_ctio(struct ispsoftc *, tmd_cmd_t *);
++static int isp_handle_platform_atio(struct ispsoftc *, at_entry_t *);
++static int isp_handle_platform_atio2(struct ispsoftc *, at2_entry_t *);
++static int isp_handle_platform_ctio(struct ispsoftc *, void *);
++static int isp_handle_platform_ctio_fastpost(struct ispsoftc *, u_int32_t);
++static void isp_target_putback_atio(struct ispsoftc *, tmd_cmd_t *);
++static void isp_complete_ctio(struct ispsoftc *, tmd_cmd_t *);
++#endif
++
++extern int isplinux_pci_detect(Scsi_Host_Template *);
++extern void isplinux_pci_release(struct Scsi_Host *);
++
++int
++isplinux_detect(Scsi_Host_Template *tmpt)
++{
++    int rval;
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++    extern struct proc_dir_entry proc_scsi_qlc;
++    tmpt->proc_dir = &proc_scsi_qlc;
++#else
++    tmpt->proc_name = "isp";
++#endif
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    spin_unlock_irq(&io_request_lock);
++    rval = isplinux_pci_detect(tmpt);
++    spin_lock_irq(&io_request_lock);
++#else
++    rval = isplinux_pci_detect(tmpt);
++#endif
++    return (rval);
++}
++
++/* io_request_lock *not* held here */
++int
++isplinux_release(struct Scsi_Host *host)
++{
++    struct ispsoftc *isp = (struct ispsoftc *) host->hostdata;
++#ifdef        ISP_TARGET_MODE
++    isp_detach_target(isp);
++#endif
++    if (isp->isp_osinfo.task_thread) {
++        SEND_THREAD_EVENT(isp, ISP_THREAD_EXIT, 1);
++    }
++    ISP_LOCKU_SOFTC(isp);
++    isp->isp_role = ISP_ROLE_NONE;
++    ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++    if (IS_FC(isp)) {
++      ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
++      ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
++      ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
++      ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
++      ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
++    }
++    isp->dogactive = 0;
++    del_timer(&isp->isp_osinfo.timer);
++    DISABLE_INTS(isp);
++    if (isp->isp_bustype == ISP_BT_PCI) {
++      isplinux_pci_release(host);
++    }
++    ISP_UNLKU_SOFTC(isp);
++#ifdef        ISP_FW_CRASH_DUMP
++    if (FCPARAM(isp)->isp_dump_data) {
++      size_t amt;
++      if (IS_2200(isp))
++          amt = QLA2200_RISC_IMAGE_DUMP_SIZE;
++      else
++          amt = QLA2200_RISC_IMAGE_DUMP_SIZE;
++      isp_prt(isp, ISP_LOGCONFIG, "freeing crash dump area");
++      isp_kfree(FCPARAM(isp)->isp_dump_data, amt);
++      FCPARAM(isp)->isp_dump_data = 0;
++    }
++#if defined(CONFIG_PROC_FS) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    /*
++     * Undo any PROCFS stuff
++     */
++    isplinux_undo_proc(isp);
++#endif
++    return (1);
++#endif
++}
++
++const char *
++isplinux_info(struct Scsi_Host *host)
++{
++    struct ispsoftc *isp = (struct ispsoftc *) host->hostdata;
++    if (IS_FC(isp)) {
++      static char *foo = "Driver for a Qlogic ISP 2X00 Host Adapter";
++      foo[26] = '0';
++      foo[27] = '0';
++      if (isp->isp_type == ISP_HA_FC_2100)
++          foo[25] = '1';
++      else if (isp->isp_type == ISP_HA_FC_2200)
++          foo[25] = '2';
++      else if (isp->isp_type == ISP_HA_FC_2300)
++          foo[25] = '3';
++      else if (isp->isp_type == ISP_HA_FC_2312) {
++          foo[25] = '3';
++          foo[26] = '1';
++          foo[27] = '2';
++      }
++      return (foo);
++    } else if (IS_1240(isp)) {
++      return ("Driver for a Qlogic ISP 1240 Host Adapter");
++    } else if (IS_1080(isp)) {
++      return ("Driver for a Qlogic ISP 1080 Host Adapter");
++    } else if (IS_1280(isp)) {
++      return ("Driver for a Qlogic ISP 1280 Host Adapter");
++    } else if (IS_10160(isp)) {
++      return ("Driver for a Qlogic ISP 10160 Host Adapter");
++    } else if (IS_12160(isp)) {
++      return ("Driver for a Qlogic ISP 12160 Host Adapter");
++    } else {
++      return ("Driver for a Qlogic ISP 1020/1040 Host Adapter");
++    }
++}
++
++static INLINE void
++isplinux_append_to_waitq(struct ispsoftc *isp, Scsi_Cmnd *Cmnd)
++{
++    /*
++     * If we're a fibre channel card and we consider the loop to be
++     * down, we just finish the command here and now.
++     */
++    if (IS_FC(isp) && isp->isp_deadloop) {
++      XS_INITERR(Cmnd);
++      XS_SETERR(Cmnd, DID_NO_CONNECT);
++
++      /*
++       * Add back a timer else scsi_done drops this on the floor.
++       */
++      scsi_add_timer(Cmnd, Cmnd->timeout_per_command, Cmnd->done);
++      isp_prt(isp, ISP_LOGDEBUG0, "giving up on target %d", XS_TGT(Cmnd));
++      ISP_UNLK_SOFTC(isp);
++      ISP_LOCK_SCSI_DONE(isp);
++      (*Cmnd->scsi_done)(Cmnd);
++      ISP_UNLK_SCSI_DONE(isp);
++      ISP_LOCK_SOFTC(isp);
++      return;
++    }
++
++    isp->isp_osinfo.wqcnt++;
++    if (isp->isp_osinfo.wqhiwater < isp->isp_osinfo.wqcnt)
++      isp->isp_osinfo.wqhiwater = isp->isp_osinfo.wqcnt;
++    if (isp->isp_osinfo.wqnext == NULL) {
++      isp->isp_osinfo.wqtail = isp->isp_osinfo.wqnext = Cmnd;
++    } else {
++      isp->isp_osinfo.wqtail->host_scribble = (unsigned char *) Cmnd;
++      isp->isp_osinfo.wqtail = Cmnd;
++    }
++    Cmnd->host_scribble = NULL;
++
++
++    /*
++     * Stop the clock for this command.
++     */
++    (void) scsi_delete_timer(Cmnd);
++}
++
++static INLINE void
++isplinux_insert_head_waitq(struct ispsoftc *isp, Scsi_Cmnd *Cmnd)
++{
++    isp->isp_osinfo.wqcnt++;
++    if (isp->isp_osinfo.wqnext == NULL) {
++      isp->isp_osinfo.wqtail = isp->isp_osinfo.wqnext = Cmnd;
++      Cmnd->host_scribble = NULL;
++    } else {
++      Cmnd->host_scribble = (unsigned char *) isp->isp_osinfo.wqnext;
++      isp->isp_osinfo.wqnext = Cmnd;
++    }
++}
++
++static INLINE Scsi_Cmnd *
++isp_remove_from_waitq(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp;
++    Scsi_Cmnd *f;
++    if (Cmnd == NULL)
++      return (Cmnd);
++    isp = XS_ISP(Cmnd);
++    if ((f = isp->isp_osinfo.wqnext) == Cmnd) {
++      isp->isp_osinfo.wqnext = (Scsi_Cmnd *) Cmnd->host_scribble;
++    } else {
++      Scsi_Cmnd *b = f;
++      while (f) {
++          f = (Scsi_Cmnd *) b->host_scribble;
++          if (f == Cmnd) {
++              b->host_scribble = f->host_scribble;
++              if (isp->isp_osinfo.wqtail == Cmnd)
++                   isp->isp_osinfo.wqtail = b;
++              break;
++          }
++          b = f;
++      }
++    }
++    if (f) {
++      f->host_scribble = NULL;
++      isp->isp_osinfo.wqcnt -= 1;
++    }
++    return (f);
++}
++
++static INLINE void
++isplinux_runwaitq(struct ispsoftc *isp)
++{
++    Scsi_Cmnd *f;
++    if (isp->isp_blocked || isp->isp_draining)
++      return;
++    while ((f = isp_remove_from_waitq(isp->isp_osinfo.wqnext)) != NULL) {
++      int result = isp_start(f);
++      /*
++       * Restart the timer for this command if it is queued or completing.
++       */
++      if (result == CMD_QUEUED || result == CMD_COMPLETE) {
++          int ntime = f->timeout_per_command * (isp_xtime? isp_xtime : 1);
++          scsi_add_timer(f, ntime, f->done);
++      }
++      if (result == CMD_QUEUED) {
++          if (isp->isp_osinfo.hiwater < isp->isp_nactive)
++              isp->isp_osinfo.hiwater = isp->isp_nactive;
++          continue;
++      }
++
++      /*
++       * If we cannot start a command on a fibre channel card, it means
++       * that loop state isn't ready for us to do so. Activate the FC
++       * thread to rediscover loop and fabric residency- but not if
++       * we consider the loop to be dead. If the loop is considered dead,
++       * we wait until a PDB Changed after a Loop UP activates the FC
++       * thread.
++       */
++      if (result == CMD_RQLATER && IS_FC(isp) && isp->isp_deadloop == 0) {
++          SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++      }
++
++      /*
++       * Put the command back on the wait queue. Don't change any
++       * timer parameters for it because they were established
++       * when we originally put the command on the waitq in the first
++       * place.
++       */
++      if (result == CMD_EAGAIN || result == CMD_RQLATER) {
++          isplinux_insert_head_waitq(isp, f);
++          break;
++      }
++      if (result == CMD_COMPLETE) {
++          isp_done(f);
++      } else {
++          panic("isplinux_runwaitq: result %d", result);
++      }
++    }
++}
++
++static INLINE void
++isplinux_flushwaitq(struct ispsoftc *isp)
++{
++    Scsi_Cmnd *Cmnd, *Ncmnd;
++   
++    if ((Cmnd = isp->isp_osinfo.wqnext) == NULL) {
++      return;
++    }
++    isp->isp_osinfo.wqnext = isp->isp_osinfo.wqtail = NULL;
++    isp->isp_osinfo.wqcnt = 0;
++    ISP_UNLK_SOFTC(isp);
++    do {
++        Ncmnd = (Scsi_Cmnd *) Cmnd->host_scribble;
++        Cmnd->host_scribble = NULL;
++      XS_INITERR(Cmnd);
++      XS_SETERR(Cmnd, DID_NO_CONNECT);
++      /*
++       * Add back a timer else scsi_done drops this on the floor.
++       */
++      scsi_add_timer(Cmnd, Cmnd->timeout_per_command, Cmnd->done);
++      ISP_LOCK_SCSI_DONE(isp);
++      (*Cmnd->scsi_done)(Cmnd);
++      ISP_UNLK_SCSI_DONE(isp);
++    } while ((Cmnd = Ncmnd) != NULL);
++    ISP_LOCK_SOFTC(isp);
++}
++
++static INLINE Scsi_Cmnd *
++isplinux_remove_from_doneq(Scsi_Cmnd *Cmnd)
++{
++    Scsi_Cmnd *f;
++    struct ispsoftc *isp;
++
++    if (Cmnd == NULL)
++      return (NULL);
++    isp = XS_ISP(Cmnd);
++    if (isp->isp_osinfo.dqnext == NULL)
++      return (NULL);
++    if ((f = isp->isp_osinfo.dqnext) == Cmnd) {
++      isp->isp_osinfo.dqnext = (Scsi_Cmnd *) Cmnd->host_scribble;
++    } else {
++      Scsi_Cmnd *b = f;
++      while (f) {
++          f = (Scsi_Cmnd *) b->host_scribble;
++          if (f == Cmnd) {
++              b->host_scribble = f->host_scribble;
++              if (isp->isp_osinfo.dqtail == Cmnd)
++                   isp->isp_osinfo.dqtail = b;
++              break;
++          }
++          b = f;
++      }
++    }
++    if (f) {
++      f->host_scribble = NULL;
++    }
++    return (f);
++}
++
++int
++isplinux_queuecommand(Scsi_Cmnd *Cmnd, void (*donecmd)(Scsi_Cmnd *))
++{
++    struct Scsi_Host *host = XS_HOST(Cmnd);
++    struct ispsoftc *isp = (struct ispsoftc *) (host->hostdata);
++    int result;
++
++
++    Cmnd->scsi_done = donecmd;
++    Cmnd->sense_buffer[0] = 0;
++    if (isp_xtime) {
++      Cmnd->timeout *= isp_xtime;
++    }
++
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCK_SOFTC(isp);
++
++    /*
++     * First off, see whether we need to (re)init the HBA.
++     * If we need to and fail to, pretend that this was a selection timeout.
++     */
++    if (isp->isp_state != ISP_RUNSTATE) {
++      if (isp->isp_role != ISP_ROLE_NONE) {
++          isplinux_reinit(isp);
++      }
++      if (isp->isp_state != ISP_RUNSTATE) {
++          ISP_UNLK_SOFTC(isp);
++          ISP_DRIVER_EXIT_LOCK(isp);
++          XS_INITERR(Cmnd);
++          XS_SETERR(Cmnd, DID_NO_CONNECT);
++          (*Cmnd->scsi_done)(Cmnd);
++          return (0);
++      }
++    }
++
++
++   /*
++    * See if we're currently blocked. If we are, just queue up the command
++    * to be run later.
++    */
++   if (isp->isp_blocked || isp->isp_draining) {
++      isplinux_append_to_waitq(isp, Cmnd);
++      ISP_UNLK_SOFTC(isp);
++      ISP_DRIVER_EXIT_LOCK(isp);
++      return (0);
++   }
++
++   /*
++    * Next see if we have any stored up commands to run. If so, run them.
++    * If we get back from this with commands still ready to run, put the
++    * current command at the tail of waiting commands to be run later.
++    */
++
++    isplinux_runwaitq(isp);
++    if (isp->isp_osinfo.wqnext) {
++      isplinux_append_to_waitq(isp, Cmnd);
++      ISP_UNLK_SOFTC(isp);
++      ISP_DRIVER_EXIT_LOCK(isp);
++      return (0);
++    }
++
++   /*
++    * Finally, try and run this command.
++    */
++
++    result = isp_start(Cmnd);
++    if (result == CMD_QUEUED) {
++      if (isp->isp_osinfo.hiwater < isp->isp_nactive)
++          isp->isp_osinfo.hiwater = isp->isp_nactive;
++      result = 0;
++      if (isp_xtime) {
++              int ntime = isp_xtime * Cmnd->timeout_per_command;
++              scsi_delete_timer(Cmnd);
++              scsi_add_timer(Cmnd, ntime, Cmnd->done);
++      }
++    } else if (result == CMD_EAGAIN) {
++      /*
++       * We ran out of request queue space (or could not
++       * get DMA resources). Tell the upper layer to try
++       * later.
++       */
++      result = 1;
++    } else if (result == CMD_RQLATER) {
++      /*
++       * Temporarily hold off on this one.
++       * Typically this means for fibre channel
++       * that the loop is down or we're processing
++       * some other change (e.g., fabric membership
++       * change)
++       */
++      isplinux_append_to_waitq(isp, Cmnd);
++      if (IS_FC(isp) && isp->isp_deadloop == 0) {
++          SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++      }
++      result = 0;
++    } else if (result == CMD_COMPLETE) {
++      result = -1;
++    } else {
++      panic("unknown return code %d from isp_start", result);
++    }
++    ISP_UNLK_SOFTC(isp);
++    ISP_DRIVER_EXIT_LOCK(isp);
++    if (result == -1) {
++      Cmnd->result &= ~0xff;
++      Cmnd->result |= Cmnd->SCp.Status;
++        Cmnd->host_scribble = NULL;
++      (*Cmnd->scsi_done)(Cmnd);
++      result = 0;
++    }
++    return (result);
++}
++
++static INLINE void isplinux_scsi_probe_done(Scsi_Cmnd *);
++
++static INLINE void
++isplinux_scsi_probe_done(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp = XS_ISP(Cmnd);
++
++    /*
++     * If we haven't seen this target yet, check the command result. If
++     * it was an inquiry and it succeeded okay, then we can update our
++     * notions about this target's capabilities.
++     *
++     * If the command did *not* succeed, we also update our notions about
++     * this target's capabilities (pessimistically) - it's probably not there.
++     * All of this so we can know when we're done so we stop wasting cycles
++     * seeing whether we can enable sync mode or not.
++     */
++
++    if (isp->isp_psco[XS_CHANNEL(Cmnd)][XS_TGT(Cmnd)] == 0) {
++      int i, b;
++      caddr_t iqd;
++      sdparam *sdp = (sdparam *) isp->isp_param;
++
++      sdp += XS_CHANNEL(Cmnd);
++      if (Cmnd->cmnd[0] == 0x12 && host_byte(Cmnd->result) == DID_OK) {
++          if (Cmnd->use_sg == 0) {
++              iqd = (caddr_t) Cmnd->buffer;
++          } else {
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++              iqd = ((struct scatterlist *) Cmnd->request_buffer)->address;
++#else
++              struct scatterlist *sg;
++              sg = (struct scatterlist *) Cmnd->request_buffer;
++              iqd = page_address(sg->page) + sg->offset;
++#endif
++          }
++          sdp->isp_devparam[XS_TGT(Cmnd)].goal_flags &=
++              ~(DPARM_TQING|DPARM_SYNC|DPARM_WIDE);
++          if (iqd[7] & 0x2) {
++              sdp->isp_devparam[XS_TGT(Cmnd)].goal_flags |= DPARM_TQING;
++          }
++          if (iqd[7] & 0x10) {
++              sdp->isp_devparam[XS_TGT(Cmnd)].goal_flags |= DPARM_SYNC;
++          }
++          if (iqd[7] & 0x20) {
++              sdp->isp_devparam[XS_TGT(Cmnd)].goal_flags |= DPARM_WIDE;
++          }
++          sdp->isp_devparam[XS_TGT(Cmnd)].dev_update = 1;
++          isp->isp_psco[XS_CHANNEL(Cmnd)][XS_TGT(Cmnd)] = 1;
++      } else if (host_byte(Cmnd->result) != DID_OK) {
++          isp->isp_psco[XS_CHANNEL(Cmnd)][XS_TGT(Cmnd)] = 1;
++      }
++
++      isp->isp_dutydone = 1;
++      for (b = 0; b < (IS_DUALBUS(isp)?2 : 1) && isp->isp_dutydone; b++) {
++          for (i = 0; i < MAX_TARGETS; i++) {
++              if (i != sdp->isp_initiator_id) {
++                  if (isp->isp_psco[b][i] == 0) {
++                      isp->isp_dutydone = 0;
++                      break;
++                  }
++              }
++          }
++      }
++
++      /*
++       * Have we scanned all busses and all targets? You only get
++       * one chance (per reset) to see what devices on this bus have
++       * to offer.
++       */
++      if (isp->isp_dutydone) {
++          for (b = 0; b < (IS_DUALBUS(isp)?2 : 1) && isp->isp_dutydone; b++) {
++              for (i = 0; i < MAX_TARGETS; i++) {
++                  isp->isp_psco[b][i] = 0;
++              }
++              isp->isp_update |= (1 << b);
++          }
++      }           
++    }
++}
++
++void
++isp_done(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp = XS_ISP(Cmnd);
++
++    if (IS_SCSI(isp) && isp->isp_dutydone == 0)  {
++      isplinux_scsi_probe_done(Cmnd);
++    }
++
++    Cmnd->result &= ~0xff;
++    Cmnd->result |= Cmnd->SCp.Status;
++
++    if (Cmnd->SCp.Status != GOOD) {
++      isp_prt(isp, ISP_LOGDEBUG0, "%d.%d.%d: cmd finishes with status 0x%x",
++          XS_CHANNEL(Cmnd), XS_TGT(Cmnd), XS_LUN(Cmnd), Cmnd->SCp.Status);
++    }
++
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,99)
++    Cmnd->resid = XS_RESID(Cmnd);
++#endif
++    /*
++     * Queue command on completion queue.
++     */
++    if (isp->isp_osinfo.dqnext == NULL) {
++      isp->isp_osinfo.dqnext = Cmnd;
++    } else {
++      isp->isp_osinfo.dqtail->host_scribble = (unsigned char *) Cmnd;
++    }
++    isp->isp_osinfo.dqtail = Cmnd;
++    Cmnd->host_scribble = NULL;
++}
++
++/*
++ * Error handling routines
++ */
++
++int
++isplinux_abort(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp;
++    u_int16_t handle;
++
++    if (Cmnd == NULL || XS_HOST(Cmnd) == NULL) {
++      return (FAILED);
++    }
++
++    isp = XS_ISP(Cmnd);
++    if (Cmnd->serial_number != Cmnd->serial_number_at_timeout) {
++      isp_prt(isp, ISP_LOGWARN, "isplinux_abort: serial number mismatch");
++      return (FAILED);
++    }
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCKU_SOFTC(isp);
++    handle = isp_find_handle(isp, Cmnd);
++    if (handle == 0) {
++      int wqfnd = 0;
++      Scsi_Cmnd *NewCmnd = isp_remove_from_waitq(Cmnd);
++      if (NewCmnd == NULL) {
++              NewCmnd = isplinux_remove_from_doneq(Cmnd);
++              wqfnd++;
++      }
++      ISP_UNLKU_SOFTC(isp);
++      isp_prt(isp, ISP_LOGINFO,
++          "isplinux_abort: found %d:%p for non-running cmd for %d.%d.%d",
++          wqfnd, NewCmnd, XS_CHANNEL(Cmnd), XS_TGT(Cmnd), XS_LUN(Cmnd));
++      if (NewCmnd == NULL) {
++          ISP_DRIVER_EXIT_LOCK(isp);
++          return (FAILED);
++      }
++    } else {
++      if (isp_control(isp, ISPCTL_ABORT_CMD, Cmnd)) {
++          ISP_UNLKU_SOFTC(isp);
++          ISP_DRIVER_EXIT_LOCK(isp);
++          return (FAILED);
++      }
++      if (isp->isp_nactive > 0)
++          isp->isp_nactive--;
++      isp_destroy_handle(isp, handle);
++      ISP_UNLKU_SOFTC(isp);
++      ISP_DRIVER_EXIT_LOCK(isp);
++      isp_prt(isp, ISP_LOGINFO,
++          "isplinux_abort: aborted running cmd (handle 0x%x) for %d.%d.%d",
++          handle, XS_CHANNEL(Cmnd), XS_TGT(Cmnd), XS_LUN(Cmnd));
++    }
++    Cmnd->result = DID_ABORT << 16;
++    (*Cmnd->scsi_done)(Cmnd);
++    return (SUCCESS);
++}
++
++/*
++ * XXX: What does the midlayer expect for commands in process?
++ * XXX: Are we supposed to clean up dead commands ourselves?
++ */
++int
++isplinux_bdr(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp;
++    int arg;
++
++    if (Cmnd == NULL || XS_HOST(Cmnd) == NULL) {
++      return (FAILED);
++    }
++
++    isp = XS_ISP(Cmnd);
++    arg = XS_CHANNEL(Cmnd) << 16 | XS_TGT(Cmnd);
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCKU_SOFTC(isp);
++    arg = isp_control(isp, ISPCTL_RESET_DEV, &arg);
++    ISP_UNLKU_SOFTC(isp);
++    ISP_DRIVER_EXIT_LOCK(isp);
++    isp_prt(isp, ISP_LOGINFO, "Bus Device Reset %succesfully sent to %d.%d.%d",
++      arg == 0? "s" : "uns", XS_CHANNEL(Cmnd), XS_TGT(Cmnd), XS_LUN(Cmnd));
++    return ((arg == 0)? SUCCESS : FAILED);
++}
++
++/*
++ * XXX: What does the midlayer expect for commands in process?
++ */
++int
++isplinux_sreset(Scsi_Cmnd *Cmnd)
++{
++    struct ispsoftc *isp;
++    int arg;
++
++    if (Cmnd == NULL || XS_HOST(Cmnd) == NULL)
++      return (FAILED);
++
++    isp = XS_ISP(Cmnd);
++    arg = XS_CHANNEL(Cmnd);
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCKU_SOFTC(isp);
++    arg = isp_control(isp, ISPCTL_RESET_BUS, &arg);
++    ISP_UNLKU_SOFTC(isp);
++    ISP_DRIVER_EXIT_LOCK(isp);
++    isp_prt(isp, ISP_LOGINFO, "SCSI Bus Reset on Channel %d %succesful",
++      XS_CHANNEL(Cmnd), arg == 0? "s" : "uns");
++    return ((arg == 0)? SUCCESS : FAILED);
++}
++
++/*
++ * We call completion on any commands owned here-
++ * except the one we were called with.
++ */
++int
++isplinux_hreset(Scsi_Cmnd *Cmnd)
++{
++    Scsi_Cmnd *tmp, *dq, *wq, *xqf, *xql;
++    struct ispsoftc *isp;
++    u_int16_t handle;
++
++    if (Cmnd == NULL || XS_HOST(Cmnd) == NULL)
++      return (FAILED);
++
++    isp = XS_ISP(Cmnd);
++
++    isp_prt(isp, ISP_LOGINFO, "Resetting Host Adapter");
++
++    ISP_DRIVER_ENTRY_LOCK(isp);
++    ISP_LOCKU_SOFTC(isp);
++
++    /*
++     * Save pending, running, and completed commands.
++     */
++    xql = xqf = NULL;
++    for (handle = 1; handle <= isp->isp_maxcmds; handle++) {
++      tmp = isp_find_xs(isp, handle);
++      if (tmp == NULL) {
++          continue;
++        }
++      isp_destroy_handle(isp, handle);
++      tmp->host_scribble = NULL;
++      if (xqf) {
++          xql->host_scribble = (unsigned char *) tmp;
++      } else {
++          xqf = xql = tmp;
++      }
++        xql = tmp;
++    }
++    dq = isp->isp_osinfo.dqnext;
++    isp->isp_osinfo.dqnext = NULL;
++    wq = isp->isp_osinfo.wqnext;
++    isp->isp_osinfo.wqnext = NULL;
++    isp->isp_nactive = 0;
++
++    isplinux_reinit(isp);
++
++    ISP_UNLKU_SOFTC(isp);
++    ISP_DRIVER_EXIT_LOCK(isp);
++
++    /*
++     * Call completion on the detritus, skipping the one we were called with.
++     */
++    while ((tmp = xqf) != NULL) {
++      xqf = (Scsi_Cmnd *) tmp->host_scribble;
++      tmp->host_scribble = NULL;
++      if (tmp == Cmnd)
++          continue;
++      tmp->result = DID_RESET << 16;
++      /*
++       * Get around silliness in midlayer.
++       */
++      tmp->flags |= IS_RESETTING;
++      if (tmp->scsi_done)
++          (*tmp->scsi_done)(tmp);
++    }
++    while ((tmp = wq) != NULL) {
++      wq = (Scsi_Cmnd *) tmp->host_scribble;
++      tmp->host_scribble = NULL;
++      if (tmp == Cmnd)
++          continue;
++      tmp->result = DID_RESET << 16;
++      /*
++       * Get around silliness in midlayer.
++       */
++      tmp->flags |= IS_RESETTING;
++      if (tmp->scsi_done)
++          (*tmp->scsi_done)(tmp);
++    }
++    while ((tmp = dq) != NULL) {
++      dq = (Scsi_Cmnd *) tmp->host_scribble;
++      tmp->host_scribble = NULL;
++      if (tmp == Cmnd)
++          continue;
++      tmp->result = DID_RESET << 16;
++      /*
++       * Get around silliness in midlayer.
++       */
++      tmp->flags |= IS_RESETTING;
++      if (tmp->scsi_done)
++          (*tmp->scsi_done)(tmp);
++    }
++    Cmnd->result = DID_RESET << 16;
++    return (SUCCESS);
++}
++
++
++#ifdef        LINUX_ISP_TARGET_MODE
++void
++isp_attach_target(struct ispsoftc *isp)
++{
++    int i;
++    hba_register_t hba;
++
++    isp->isp_osinfo.pool = isp_kzalloc(NTGT_CMDS * TMD_SIZE, GFP_KERNEL);
++    if (isp->isp_osinfo.pool == NULL) {
++      isp_prt(isp, ISP_LOGERR, "cannot allocate TMD structures");
++      return;
++    }
++    for (i = 0; i < NTGT_CMDS-1; i++) {
++      isp->isp_osinfo.pool[i].cd_private = &isp->isp_osinfo.pool[i+1];
++    }
++    isp->isp_osinfo.pending_t = NULL;
++    isp->isp_osinfo.tfreelist = isp->isp_osinfo.pool;
++
++    hba.r_identity = isp;
++    sprintf(hba.r_name, "isp");
++    hba.r_inst = isp->isp_unit;
++    hba.r_version = QR_VERSION;
++    hba.r_action = (void (*)(tact_e, void *))isp_taction;
++    if (IS_FC(isp)) {
++      hba.r_type = R_FC;
++    } else{
++      hba.r_type = R_SCSI;
++    }
++    ISP_UNLKU_SOFTC(isp);
++    ISP_PARENT_TARGET(QOUT_HBA_REG, &hba);
++    ISP_LOCKU_SOFTC(isp);
++}
++
++void
++isp_detach_target(struct ispsoftc *isp)
++{
++    hba_register_t hba;
++
++    hba.r_identity = isp;
++    sprintf(hba.r_name, "isp");
++    hba.r_inst = isp->isp_unit;
++    hba.r_version = QR_VERSION;
++    hba.r_action = (void (*)(tact_e, void *))isp_taction;
++    if (IS_FC(isp)) {
++      hba.r_type = R_FC;
++    } else{
++      hba.r_type = R_SCSI;
++    }
++    ISP_PARENT_TARGET(QOUT_HBA_UNREG, &hba);
++    if (isp->isp_osinfo.pool) {
++      isp_kfree(isp->isp_osinfo.pool, NTGT_CMDS * TMD_SIZE);
++      isp->isp_osinfo.pool = 0;
++    }
++}
++
++static void
++isp_taction(qact_e action, void *arg)
++{
++    tmd_cmd_t *tmd;
++    struct ispsoftc *isp;
++
++    switch (action) {
++    case QIN_HBA_REG:
++    {
++      hba_register_t *hp = (hba_register_t *) arg;
++      isp = hp->r_identity;
++      isp_prt(isp, ISP_LOGINFO, "completed target registration");
++      ISP_LOCK_SOFTC(isp);
++      isp->isp_osinfo.hcb = 1;
++      ISP_UNLK_SOFTC(isp);
++      ISP_PARENT_TARGET(QOUT_HBA_REG, hp);
++      break;
++    }
++    case QIN_ENABLE:
++    case QIN_DISABLE:
++    {
++      enadis_t *ep = arg;
++      int bus, lun, tgt, chan;
++
++      isp = ep->cd_hba;
++      bus = (int) ep->cd_chan;
++      lun = (int) ep->cd_lun;
++      tgt = (int) ep->cd_tgt;
++      chan = (int) ep->cd_chan;
++      ep->cd_error = isp_en_dis_lun(isp, (action == QIN_ENABLE)? 1 : chan,
++          bus, tgt, lun);
++      ISP_PARENT_TARGET(action, ep);
++      break;
++    }
++    case QIN_TMD_CONT:
++      tmd = (tmd_cmd_t *) arg;
++      isp = tmd->cd_hba;
++      isp_target_start_ctio(isp, tmd);
++      break;
++
++    case QIN_TMD_FIN:
++      tmd = (tmd_cmd_t *) arg;
++      isp = tmd->cd_hba;
++      MEMZERO(tmd, TMD_SIZE);
++      ISP_LOCK_SOFTC(isp);
++      tmd->cd_private = isp->isp_osinfo.tfreelist;
++      isp->isp_osinfo.tfreelist = tmd;
++      ISP_UNLK_SOFTC(isp);
++      break;
++
++    case QIN_IOCTL:
++    {
++      ioctl_cmd_t *ip = arg;
++      ip->i_errno = ENOTTY;
++      ISP_PARENT_TARGET(QOUT_IOCTL, ip);
++      break;
++    }
++    case QIN_HBA_UNREG:
++    {
++      hba_register_t *hp = (hba_register_t *) arg;
++      isp = hp->r_identity;
++      isp->isp_osinfo.hcb = 0;
++      ISP_PARENT_TARGET(QOUT_HBA_REG, hp);
++      break;
++    }
++    default:
++      break;
++   }
++}
++
++static INLINE int
++nolunsenabled(struct ispsoftc *isp, int port)
++{
++    int i, wbase, wend;
++
++    if (IS_FC(isp)) {
++      wbase = 0;
++      wend = TM_MAX_LUN_FC >> 5;
++    } else {
++      if (port) {
++              wend = TM_MAX_LUN_FC >> 5;
++              wbase = wend >> 1;
++      } else {
++              wend = (TM_MAX_LUN_FC >> 5) >> 1;
++              wbase = 0;
++      }
++    }
++    for (i = wbase; i < wend; i++) {
++      if (isp->isp_osinfo.lunbmap[i]) {
++          return (0);
++      }
++    }
++    return (1);
++}
++
++
++
++static void
++isp_target_start_ctio(struct ispsoftc *isp, tmd_cmd_t *tmd)
++{
++    void *qe;
++    u_int16_t *hp, save_handle;
++    u_int32_t *rp;
++    u_int16_t nxti, optr;
++    u_int8_t local[QENTRY_LEN];
++
++    /*
++     * If the transfer length is zero, we have to be sending status.
++     * If we're sending data, we have to have one and only one data
++     * direction set.
++     */
++    if (tmd->cd_xfrlen == 0) {
++      if ((tmd->cd_hflags & CDFH_STSVALID) == 0) {
++          isp_prt(isp, ISP_LOGERR, "CTIO, no data, and no status is wrong");
++          tmd->cd_error = -EINVAL;
++          tmd->cd_lflags |= CDFL_ERROR;
++          return;
++      }
++    } else {
++      if ((tmd->cd_hflags & CDFH_DATA_MASK) == 0) {
++          isp_prt(isp, ISP_LOGERR, "data CTIO with no direction is wrong");
++          tmd->cd_error = -EINVAL;
++          tmd->cd_lflags |= CDFL_ERROR;
++          return;
++      }
++      if ((tmd->cd_hflags & CDFH_DATA_MASK) == CDFH_DATA_MASK) {
++          isp_prt(isp, ISP_LOGERR, "data CTIO with both directions is wrong");
++          tmd->cd_error = -EINVAL;
++          tmd->cd_lflags |= CDFL_ERROR;
++          return;
++      }
++    }
++    tmd->cd_lflags &= ~CDFL_ERROR;
++    MEMZERO(local, QENTRY_LEN);
++
++    ISP_LOCK_SOFTC(isp);
++    if (isp_getrqentry(isp, &nxti, &optr, &qe)) {
++      isp_prt(isp, ISP_LOGWARN,
++          "isp_target_start_ctio: request queue overflow");
++      tmd->cd_error = -ENOMEM;
++      tmd->cd_lflags |= CDFL_ERROR;
++      ISP_UNLK_SOFTC(isp);
++      return;
++    }
++
++    /*
++     * We're either moving data or completing a command here (or both).
++     */
++
++    if (IS_FC(isp)) {
++      ct2_entry_t *cto = (ct2_entry_t *) local;
++      u_int16_t *ssptr = NULL;
++
++      cto->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
++      cto->ct_header.rqs_entry_count = 1;
++      cto->ct_iid = tmd->cd_iid;
++      if ((FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) == 0)
++              cto->ct_lun = tmd->cd_lun;
++      else
++              cto->ct_lun = 0;
++      cto->ct_rxid = tmd->cd_tagval;
++      if (cto->ct_rxid == 0) {
++          isp_prt(isp, ISP_LOGERR, "a tagval of zero is not acceptable");
++          tmd->cd_error = -EINVAL;
++          tmd->cd_lflags |= CDFL_ERROR;
++          ISP_UNLK_SOFTC(isp);
++          return;
++      }
++      cto->ct_flags = CT2_FASTPOST;
++
++      if (tmd->cd_xfrlen == 0) {
++          cto->ct_flags |= CT2_FLAG_MODE1 | CT2_NO_DATA | CT2_SENDSTATUS;
++          ssptr = &cto->rsp.m1.ct_scsi_status;
++          *ssptr = tmd->cd_scsi_status;
++          if ((tmd->cd_hflags & CDFH_SNSVALID) != 0) {
++              MEMCPY(cto->rsp.m1.ct_resp, tmd->cd_sense, QLTM_SENSELEN);
++              cto->rsp.m1.ct_senselen = QLTM_SENSELEN;
++              cto->rsp.m1.ct_scsi_status |= CT2_SNSLEN_VALID;
++          }
++      } else {
++          cto->ct_flags |= CT2_FLAG_MODE0;
++          if (tmd->cd_hflags & CDFH_DATA_IN) {
++              cto->ct_flags |= CT2_DATA_IN;
++          } else {
++              cto->ct_flags |= CT2_DATA_OUT;
++          }
++          if (tmd->cd_hflags & CDFH_STSVALID) {
++              ssptr = &cto->rsp.m0.ct_scsi_status;
++              cto->ct_flags |= CT2_SENDSTATUS;
++              cto->rsp.m0.ct_scsi_status = tmd->cd_scsi_status;
++              /*
++               * It will be up to the low level mapping routine
++               * to check for sense data.
++               */
++          }
++          /*
++           * We assume we'll transfer what we say we'll transfer.
++           * It should get added back in if we fail.
++           */
++          tmd->cd_resid -= tmd->cd_xfrlen;
++      }
++
++      if (ssptr && tmd->cd_resid) {
++          cto->ct_resid = tmd->cd_resid;
++          *ssptr |= CT2_DATA_UNDER;
++      } else {
++          cto->ct_resid = 0;
++      }
++      isp_prt(isp, ISP_LOGTDEBUG0,
++          "CTIO2[%x] ssts %x flags %x resid %d",
++          cto->ct_rxid, tmd->cd_scsi_status, cto->ct_flags, cto->ct_resid);
++      hp = &cto->ct_syshandle;
++      rp = &cto->ct_resid;
++      if (cto->ct_flags & CT2_SENDSTATUS) {
++          cto->ct_flags |= CT2_CCINCR;
++      }
++    } else {
++      ct_entry_t *cto = (ct_entry_t *) local;
++
++      cto->ct_header.rqs_entry_type = RQSTYPE_CTIO;
++      cto->ct_header.rqs_entry_count = 1;
++      cto->ct_iid = tmd->cd_iid;
++      cto->ct_tgt = tmd->cd_tgt;
++      cto->ct_lun = tmd->cd_lun;
++      cto->ct_flags = 0;
++      cto->ct_fwhandle = AT_GET_HANDLE(tmd->cd_tagval);
++      if (AT_HAS_TAG(tmd->cd_tagval)) {
++          cto->ct_tag_val = AT_GET_TAG(tmd->cd_tagval);
++          cto->ct_flags |= CT_TQAE;
++      }
++      if (tmd->cd_lflags & CDFL_NODISC) {
++          cto->ct_flags |= CT_NODISC;
++      }
++      if (tmd->cd_xfrlen == 0) {
++          cto->ct_flags |= CT_NO_DATA | CT_SENDSTATUS;
++          cto->ct_scsi_status = tmd->cd_scsi_status;
++          cto->ct_resid = 0;
++      } else {
++          if (tmd->cd_hflags & CDFH_STSVALID) {
++              cto->ct_flags |= CT_SENDSTATUS;
++          }
++          if (tmd->cd_hflags & CDFH_DATA_IN) {
++              cto->ct_flags |= CT_DATA_IN;
++          } else {
++              cto->ct_flags |= CT_DATA_OUT;
++          }
++          /*
++           * We assume we'll transfer what we say we'll transfer.
++           * Otherwise, the command is dead.
++           */
++          tmd->cd_resid -= tmd->cd_xfrlen;
++          if (tmd->cd_hflags & CDFH_STSVALID) {
++              cto->ct_resid = tmd->cd_resid;
++          }
++      }
++      isp_prt(isp, ISP_LOGTDEBUG0, "CTIO[%x] ssts %x resid %d cd_hflags %x",
++          AT_GET_HANDLE(tmd->cd_tagval), tmd->cd_scsi_status, tmd->cd_resid,
++          tmd->cd_hflags);
++      hp = &cto->ct_syshandle;
++      rp = &cto->ct_resid;
++      if (cto->ct_flags & CT_SENDSTATUS) {
++          cto->ct_flags |= CT_CCINCR;
++      }
++    }
++
++    if (isp_save_xs(isp, (XS_T *)tmd, hp)) {
++      isp_prt(isp, ISP_LOGERR, "isp_target_start_ctio: No XFLIST pointers");
++      tmd->cd_error = -ENOMEM;
++      tmd->cd_lflags |= CDFL_ERROR;
++      ISP_UNLK_SOFTC(isp);
++      ISP_PARENT_TARGET(QOUT_TMD_DONE, tmd);
++      return;
++    }
++
++    /*
++     * Call the dma setup routines for this entry (and any subsequent
++     * CTIOs) if there's data to move, and then tell the f/w it's got
++     * new things to play with. As with isp_start's usage of DMA setup,
++     * any swizzling is done in the machine dependent layer. Because
++     * of this, we put the request onto the queue area first in native
++     * format.
++     */
++
++    save_handle = *hp;
++    switch (ISP_DMASETUP(isp, (XS_T *)tmd, (ispreq_t *) local, &nxti, optr)) {
++    case CMD_QUEUED:
++      ISP_ADD_REQUEST(isp, nxti);
++      ISP_UNLK_SOFTC(isp);
++      return;
++
++    case CMD_EAGAIN:
++      tmd->cd_error = -ENOMEM;
++      tmd->cd_lflags |= CDFL_ERROR;
++      isp_destroy_handle(isp, save_handle);
++      break;
++
++    case CMD_COMPLETE:
++      tmd->cd_error = *rp;    /* propagated back */
++      tmd->cd_lflags |= CDFL_ERROR;
++      isp_destroy_handle(isp, save_handle);
++      break;
++
++    default:
++      tmd->cd_error = -EFAULT;        /* probably dma mapping failure */
++      tmd->cd_lflags |= CDFL_ERROR;
++      isp_destroy_handle(isp, save_handle);
++      break;
++    }
++    ISP_UNLK_SOFTC(isp);
++    ISP_PARENT_TARGET(QOUT_TMD_DONE, tmd);
++}
++
++/*
++ * Handle ATIO stuff that the generic code can't.
++ * This means handling CDBs.
++ */
++
++static int
++isp_handle_platform_atio(struct ispsoftc *isp, at_entry_t *aep)
++{
++    tmd_cmd_t *tmd;
++    int status;
++
++    /*
++     * The firmware status (except for the QLTM_SVALID bit)
++     * indicates why this ATIO was sent to us.
++     *
++     * If QLTM_SVALID is set, the firware has recommended Sense Data.
++     *
++     * If the DISCONNECTS DISABLED bit is set in the flags field,
++     * we're still connected on the SCSI bus.
++     */
++    status = aep->at_status;
++
++    if ((status & ~QLTM_SVALID) == AT_PHASE_ERROR) {
++      /*
++       * Bus Phase Sequence error. We should have sense data
++       * suggested by the f/w. I'm not sure quite yet what
++       * to do about this.
++       */
++      isp_prt(isp, ISP_LOGERR, "PHASE ERROR in atio");
++      isp_endcmd(isp, aep, SCSI_BUSY, 0);
++      return (0);
++    }
++
++    if ((status & ~QLTM_SVALID) != AT_CDB) {
++      isp_prt(isp, ISP_LOGERR, "bad atio (0x%x) leaked to platform", status);
++      isp_endcmd(isp, aep, SCSI_BUSY, 0);
++      return (0);
++    }
++
++    if ((tmd = isp->isp_osinfo.tfreelist) == NULL) {
++      /*
++       * We're out of resources.
++       *
++       * Because we can't autofeed sense data back with a command for
++       * parallel SCSI, we can't give back a CHECK CONDITION. We'll give
++       * back a QUEUE FULL or BUSY status instead.
++       */
++      isp_prt(isp, ISP_LOGERR,
++          "no ATIOS for lun %d from initiator %d on channel %d",
++          aep->at_lun, GET_IID_VAL(aep->at_iid), GET_BUS_VAL(aep->at_iid));
++      if (aep->at_flags & AT_TQAE)
++          isp_endcmd(isp, aep, SCSI_QFULL, 0);
++      else
++          isp_endcmd(isp, aep, SCSI_BUSY, 0);
++      return (0);
++    }
++    isp->isp_osinfo.tfreelist = tmd->cd_private;
++    tmd->cd_lflags = CDFL_BUSY;
++    tmd->cd_chan = GET_BUS_VAL(aep->at_iid);
++    tmd->cd_iid = GET_IID_VAL(aep->at_iid);
++    tmd->cd_tgt = aep->at_tgt;
++    tmd->cd_lun = aep->at_lun;
++    if (aep->at_flags & AT_NODISC) {
++      tmd->cd_lflags |= CDFL_NODISC;
++    }
++    if (status & QLTM_SVALID) {
++      MEMCPY(tmd->cd_sense, aep->at_sense, QLTM_SENSELEN);
++      tmd->cd_lflags |= CDFL_SNSVALID;
++    }
++    MEMCPY(tmd->cd_cdb, aep->at_cdb, min(TMD_CDBLEN, ATIO_CDBLEN));
++    AT_MAKE_TAGID(tmd->cd_tagval, aep);
++    tmd->cd_tagtype = aep->at_tag_type;
++    tmd->cd_hba = isp;
++    tmd->cd_data = NULL;
++    tmd->cd_hflags = 0;
++    tmd->cd_totlen = tmd->cd_resid = tmd->cd_xfrlen = tmd->cd_error = 0;
++    tmd->cd_scsi_status = 0;
++    isp_prt(isp, ISP_LOGTDEBUG1,
++        "ATIO[%x] CDB=0x%x bus %d iid%d->lun%d tag 0x%x ttype 0x%x %s",
++      aep->at_handle, aep->at_cdb[0] & 0xff, GET_BUS_VAL(aep->at_iid),
++      GET_IID_VAL(aep->at_iid), aep->at_lun, aep->at_tag_val & 0xff,
++      aep->at_tag_type, (aep->at_flags & AT_NODISC)?
++      "nondisc" : "disconnecting");
++    if (isp->isp_osinfo.hcb == 0) {
++      isp_endcmd(isp, aep, SCSI_BUSY, 0);
++    } else {
++      isp->isp_osinfo.tfreelist = tmd->cd_private;
++      tmd->cd_lreserved[0].bytes[0] = QOUT_TMD_START;
++      tmd->cd_lreserved[1].ptrs[0] = isp->isp_osinfo.pending_t;
++      isp->isp_osinfo.pending_t = tmd;
++    }
++    return (0);
++}
++
++static int
++isp_handle_platform_atio2(struct ispsoftc *isp, at2_entry_t *aep)
++{
++    tmd_cmd_t *tmd;
++    int lun;
++
++    /*
++     * The firmware status (except for the QLTM_SVALID bit)
++     * indicates why this ATIO was sent to us.
++     *
++     * If QLTM_SVALID is set, the firware has recommended Sense Data.
++     */
++    if ((aep->at_status & ~QLTM_SVALID) != AT_CDB) {
++      isp_prt(isp, ISP_LOGERR, "bad atio (0x%x) leaked to platform",
++          aep->at_status);
++      isp_endcmd(isp, aep, SCSI_BUSY, 0);
++      return (0);
++    }
++    if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)
++      lun = aep->at_scclun;
++    else
++      lun = aep->at_lun;
++
++    /*
++     * If we're out of resources, just send a QFULL status back.
++     */
++    if ((tmd = isp->isp_osinfo.tfreelist) == NULL) {
++      isp_endcmd(isp, aep, SCSI_QFULL, 0);
++      return (0);
++    }
++    tmd->cd_lflags = CDFL_BUSY;
++    tmd->cd_iid = aep->at_iid;
++    tmd->cd_tgt = ((fcparam *)isp->isp_param)->isp_loopid;
++    tmd->cd_lun = lun;
++    tmd->cd_chan = 0;
++    MEMCPY(tmd->cd_cdb, aep->at_cdb, min(TMD_CDBLEN, ATIO2_CDBLEN));
++    switch (aep->at_taskflags & ATIO2_TC_ATTR_MASK) {
++    case ATIO2_TC_ATTR_SIMPLEQ:
++      tmd->cd_tagtype = MSG_SIMPLE_Q_TAG;
++      break;
++    case ATIO2_TC_ATTR_HEADOFQ:
++      tmd->cd_tagtype = MSG_HEAD_OF_Q_TAG;
++      break;
++    case ATIO2_TC_ATTR_ORDERED:
++      tmd->cd_tagtype = MSG_ORDERED_Q_TAG;
++      break;
++    case ATIO2_TC_ATTR_ACAQ:          /* ?? */
++    case ATIO2_TC_ATTR_UNTAGGED:
++    default:
++      tmd->cd_tagtype = 0;
++      break;
++    }
++    switch (aep->at_execodes & (ATIO2_EX_WRITE|ATIO2_EX_READ)) {
++    case ATIO2_EX_WRITE:
++      tmd->cd_lflags |= CDFL_DATA_OUT;
++      break;
++    case ATIO2_EX_READ:
++      tmd->cd_lflags |= CDFL_DATA_IN;
++      break;
++    case ATIO2_EX_WRITE|ATIO2_EX_READ:
++      tmd->cd_lflags |= CDFL_BIDIR;
++      isp_prt(isp, ISP_LOGWARN, "ATIO2 with both read/write set");
++      break;
++    default:
++      break;
++    }
++    tmd->cd_tagval = aep->at_rxid;
++    tmd->cd_hba = isp;
++    tmd->cd_data = NULL;
++    tmd->cd_hflags = 0;
++    tmd->cd_totlen = aep->at_datalen;
++    tmd->cd_resid = tmd->cd_xfrlen = tmd->cd_error = 0;
++    tmd->cd_scsi_status = 0;
++    if ((isp->isp_dblev & ISP_LOGTDEBUG0) || isp->isp_osinfo.hcb == 0) {
++      const char *sstr;
++      switch (tmd->cd_lflags & CDFL_BIDIR) {
++      default:
++          sstr = "nodatadir";
++          break;
++      case CDFL_DATA_OUT:
++          sstr = "DATA OUT";
++          break;
++      case CDFL_DATA_IN:
++          sstr = "DATA IN";
++          break;
++      case CDFL_DATA_OUT|CDFL_DATA_IN:
++          sstr = "BIDIR";
++          break;
++      }
++      isp_prt(isp, ISP_LOGALL,
++          "ATIO2[%x] CDB=0x%x iid %d for lun %d tcode 0x%x dlen %d %s",
++          aep->at_rxid, aep->at_cdb[0] & 0xff, aep->at_iid,
++          lun, aep->at_taskcodes, aep->at_datalen, sstr);
++    }
++    if (isp->isp_osinfo.hcb == 0) {
++      if (aep->at_cdb[0] == INQUIRY && lun == 0) {
++          if (aep->at_cdb[1] == 0 && aep->at_cdb[2] == 0) {
++              static u_int8_t inqdata[] = {
++                  DEFAULT_DEVICE_TYPE, 0x0, 0x2, 0x2, 32, 0, 0, 0x40,
++                  'L', 'I', 'N', 'U', 'X', ' ', ' ', ' ',
++                  'T', 'A', 'R', 'G', 'E', 'T', ' ', 'D',
++                  'D', 'E', 'V', 'I', 'C', 'E', ' ', ' ',
++                  '0', '0', '0', '1'
++              };
++              struct scatterlist single, *dp = &single;
++              MEMZERO(dp, sizeof (*dp));
++              dp->address = inqdata;
++              dp->length = sizeof (inqdata);
++              tmd->cd_data = dp;
++              tmd->cd_resid = tmd->cd_xfrlen = sizeof (inqdata);
++              tmd->cd_hflags |= CDFH_DATA_IN|CDFH_STSVALID;
++              ISP_DROP_LK_SOFTC(isp);
++              isp_target_start_ctio(isp, tmd);
++              ISP_IGET_LK_SOFTC(isp);
++          } else {
++              /*
++               * Illegal field in CDB
++               *  0x24 << 24 | 0x5 << 12 | ECMD_SVALID | SCSI_CHECK
++               */
++              isp_endcmd(isp, aep, 0x24005102, 0);
++          }
++      } else if (lun == 0) {
++              /*
++               * Not Ready, Cause Not Reportable
++               *
++               *  0x4 << 24 | 0x2 << 12 | ECMD_SVALID | SCSI_CHECK
++               */
++              isp_endcmd(isp, aep, 0x04002102, 0);
++      } else {
++          /*
++           * Logical Unit Not Supported:
++           *  0x25 << 24 | 0x5 << 12 | ECMD_SVALID | SCSI_CHECK
++           */
++          isp_endcmd(isp, aep, 0x25005102, 0);
++      }
++      MEMZERO(tmd, TMD_SIZE);
++      return (0);
++    }
++    isp->isp_osinfo.tfreelist = tmd->cd_private;
++    tmd->cd_lreserved[0].bytes[0] = QOUT_TMD_START;
++    tmd->cd_lreserved[1].ptrs[0] = isp->isp_osinfo.pending_t;
++    isp->isp_osinfo.pending_t = tmd;
++    return (0);
++}
++
++static int
++isp_handle_platform_ctio(struct ispsoftc *isp, void *arg)
++{
++    tmd_cmd_t *tmd;
++    int sentstatus, ok, resid = 0, sts;
++
++    /*
++     * CTIO and CTIO2 are close enough....
++     */
++    tmd = (tmd_cmd_t *) isp_find_xs(isp, ((ct_entry_t *)arg)->ct_syshandle);
++    if (tmd == NULL) {
++      isp_prt(isp, ISP_LOGERR, "isp_handle_platform_ctio: null tmd");
++      return (0);
++    }
++    isp_destroy_handle(isp, ((ct_entry_t *)arg)->ct_syshandle);
++
++    if (IS_FC(isp)) {
++      ct2_entry_t *ct = arg;
++      sentstatus = ct->ct_flags & CT2_SENDSTATUS;
++      if (sentstatus) {
++          tmd->cd_lflags |= CDFL_SENTSTATUS;
++      }
++      sts = ct->ct_status & ~QLTM_SVALID;
++      ok = (ct->ct_status & ~QLTM_SVALID) == CT_OK;
++      if (ok && sentstatus && (tmd->cd_hflags & CDFH_SNSVALID)) {
++          tmd->cd_lflags |= CDFL_SENTSENSE;
++      }
++      isp_prt(isp, ISP_LOGTDEBUG1,
++          "CTIO2[%x] sts 0x%x flg 0x%x sns %d %s",
++          ct->ct_rxid, ct->ct_status, ct->ct_flags,
++          (tmd->cd_lflags & CDFL_SENTSENSE) != 0,
++          sentstatus? "FIN" : "MID");
++      if ((ct->ct_flags & CT2_DATAMASK) != CT2_NO_DATA) {
++          resid = ct->ct_resid;
++      }
++    } else {
++      ct_entry_t *ct = arg;
++      sts = ct->ct_status & ~QLTM_SVALID;
++      sentstatus = ct->ct_flags & CT_SENDSTATUS;
++      if (sentstatus) {
++          tmd->cd_lflags |= CDFL_SENTSTATUS;
++      }
++      ok = (ct->ct_status & ~QLTM_SVALID) == CT_OK;
++      if (ok && sentstatus && (tmd->cd_hflags & CDFH_SNSVALID)) {
++          tmd->cd_lflags |= CDFL_SENTSENSE;
++      }
++      isp_prt(isp, ISP_LOGTDEBUG1,
++          "CTIO[%x] tag %x iid %x tgt %d lun %d sts 0x%x flg %x %s",
++          ct->ct_fwhandle, ct->ct_tag_val, ct->ct_iid, ct->ct_tgt,
++          ct->ct_lun, ct->ct_status, ct->ct_flags,
++          sentstatus? "FIN" : "MID");
++      if (ct->ct_status & QLTM_SVALID) {
++          char *sp = (char *)ct;
++          sp += CTIO_SENSE_OFFSET;
++          MEMCPY(tmd->cd_sense, sp, QLTM_SENSELEN);
++          tmd->cd_lflags |= CDFL_SNSVALID;
++      }
++      if ((ct->ct_flags & CT_DATAMASK) != CT_NO_DATA) {
++          resid = ct->ct_resid;
++      }
++    }
++    tmd->cd_resid += resid;
++
++    /*
++     * We're here either because intermediate data transfers are done
++     * and/or the final status CTIO (which may have joined with a
++     * Data Transfer) is done.
++     *
++     * In any case, for this platform, the upper layers figure out
++     * what to do next, so all we do here is collect status and
++     * pass information along.
++     */
++    isp_prt(isp, ISP_LOGTDEBUG0, "%s CTIO done (resid %d)",
++      (sentstatus)? "  FINAL " : "MIDTERM ", tmd->cd_resid);
++
++    if (!ok) {
++      isp_prt(isp, ISP_LOGERR, "CTIO ended with badstate (0x%x)", sts);
++      tmd->cd_lflags |= CDFL_ERROR;
++      tmd->cd_error = -EIO;
++      isp_target_putback_atio(isp, tmd);
++    } else {
++      isp_complete_ctio(isp, tmd);
++    }
++    return (0);
++}
++
++static int
++isp_handle_platform_ctio_fastpost(struct ispsoftc *isp, u_int32_t token)
++{
++    tmd_cmd_t *tmd;
++    u_int16_t handle;
++
++    handle = token & 0xffff;
++    tmd = (tmd_cmd_t *) isp_find_xs(isp, handle);
++    if (tmd == NULL) {
++      isp_prt(isp, ISP_LOGERR,
++          "isp_handle_platform_ctio_fastpost: null tmd");
++      return (0);
++    }
++    isp_destroy_handle(isp, handle);
++    isp_prt(isp, ISP_LOGTDEBUG1, "CTIOx[%x] fastpost complete", tmd->cd_tagval);
++    /*
++     * In this implementation we only set fast posting for the last ctio2
++     * of a command where we haven't sent sense data as well.
++     */
++    tmd->cd_lflags |= CDFL_SENTSTATUS;
++    isp_complete_ctio(isp, tmd);
++    return (0);
++}
++
++static void
++isp_target_putback_atio(struct ispsoftc *isp, tmd_cmd_t *tmd)
++{
++    u_int16_t nxti;
++    u_int8_t local[QENTRY_LEN];
++    void *qe;
++
++    if (isp_getrqentry(isp, &nxti, NULL, &qe)) {
++      isp_prt(isp, ISP_LOGWARN,
++          "isp_target_putback_atio: Request Queue Overflow");
++      /* XXXX */
++      isp_complete_ctio(isp, tmd);
++      return;
++    }
++    MEMZERO(local, sizeof (local));
++    if (IS_FC(isp)) {
++      at2_entry_t *at = (at2_entry_t *) local;
++      at->at_header.rqs_entry_type = RQSTYPE_ATIO2;
++      at->at_header.rqs_entry_count = 1;
++      if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)
++          at->at_scclun = (uint16_t) tmd->cd_lun;
++      else
++          at->at_lun = (uint8_t) tmd->cd_lun;
++      at->at_status = CT_OK;
++      at->at_rxid = tmd->cd_tagval;
++      isp_put_atio2(isp, at, qe);
++    } else {
++      at_entry_t *at = (at_entry_t *)local;
++      at->at_header.rqs_entry_type = RQSTYPE_ATIO;
++      at->at_header.rqs_entry_count = 1;
++      at->at_iid = tmd->cd_iid;
++      at->at_iid |= tmd->cd_chan << 7;
++      at->at_tgt = tmd->cd_tgt;
++      at->at_lun = tmd->cd_lun;
++      at->at_status = CT_OK;
++      at->at_tag_val = AT_GET_TAG(tmd->cd_tagval);
++      at->at_handle = AT_GET_HANDLE(tmd->cd_tagval);
++      isp_put_atio(isp, at, qe);
++    }
++    ISP_TDQE(isp, "isp_target_putback_atio", isp->isp_reqidx, qe);
++    ISP_ADD_REQUEST(isp, nxti);
++    isp_complete_ctio(isp, tmd);
++}
++
++static void
++isp_complete_ctio(struct ispsoftc *isp, tmd_cmd_t *tmd)
++{
++    if (isp->isp_osinfo.hcb == 0) {
++      isp_prt(isp, ISP_LOGWARN, "nobody to tell about completing command");
++      MEMZERO(tmd, TMD_SIZE);
++      tmd->cd_private = isp->isp_osinfo.tfreelist;
++      isp->isp_osinfo.tfreelist = tmd;
++    } else {
++      tmd->cd_lreserved[0].bytes[0] = QOUT_TMD_DONE;
++      tmd->cd_lreserved[1].ptrs[0] = isp->isp_osinfo.pending_t;
++      isp->isp_osinfo.pending_t = tmd;
++    }
++}
++
++int
++isp_en_dis_lun(struct ispsoftc *isp, int enable, int bus, int tgt, int lun)
++{
++    DECLARE_MUTEX_LOCKED(rsem);
++    u_int16_t rstat;
++    int rv, enabled, cmd;
++
++    /*
++     * First, we can't do anything unless we have an upper
++     * level target driver to route commands to.
++     */
++    if (isp->isp_osinfo.hcb == 0) {
++      return (-EINVAL);
++    }
++
++    /*
++     * Second, check for sanity of enable argument.
++     */
++    enabled = ((isp->isp_osinfo.tmflags & (1 << bus)) != 0);
++    if (enable == 0 && enabled == 0) {
++      return (-EINVAL);
++    }
++
++    /*
++     * Third, check to see if we're enabling on fibre channel
++     * and don't yet have a notion of who the heck we are (no
++     * loop yet).
++     */
++    if (IS_FC(isp) && !enabled) {
++      ISP_LOCK_SOFTC(isp);
++      if ((isp->isp_role & ISP_ROLE_TARGET) == 0) {
++          isp->isp_role |= ISP_ROLE_TARGET;
++          if (isp_drain_reset(isp, "lun enables")) {
++              return (-EIO);
++          }
++      }
++      ISP_UNLK_SOFTC(isp);
++      SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 1);
++    }
++
++    /*
++     * If this is a wildcard target, select our initiator
++     * id/loop id for use as what we enable as.
++     */
++
++    if (tgt == -1) {
++      if (IS_FC(isp)) {
++          tgt = ((fcparam *)isp->isp_param)->isp_loopid;
++      } else {
++          tgt = ((sdparam *)isp->isp_param)->isp_initiator_id;
++      }
++    }
++
++    /*
++     * Do some sanity checking on lun arguments.
++     */
++
++    if (lun < 0 || lun >= (IS_FC(isp)? TM_MAX_LUN_FC : TM_MAX_LUN_SCSI)) {
++      return (-EINVAL);
++    }
++
++    /*
++     * Snag the semaphore on the return state value on enables/disables.
++     */
++    if (down_interruptible(&isp->isp_osinfo.tgt_inisem)) {
++      return (-EINTR);
++    }
++
++    if (enable && LUN_BTST(isp, bus, lun)) {
++      up(&isp->isp_osinfo.tgt_inisem);
++      return (-EEXIST);
++    }
++    if (!enable && !LUN_BTST(isp, bus, lun)) {
++      up(&isp->isp_osinfo.tgt_inisem);
++      return (-NODEV);
++    }
++
++    if (enable && nolunsenabled(isp, bus)) {
++      int av = (bus << 31) | ENABLE_TARGET_FLAG;
++      ISP_LOCK_SOFTC(isp);
++      rv = isp_control(isp, ISPCTL_TOGGLE_TMODE, &av);
++      ISP_UNLK_SOFTC(isp);
++      if (rv) {
++          up(&isp->isp_osinfo.tgt_inisem);
++          return (-EIO);
++      }
++    }
++
++    ISP_LOCK_SOFTC(isp);
++    isp->isp_osinfo.rsemap = &rsem;
++    if (enable) {
++      u_int32_t seq = isp->isp_osinfo.rollinfo++;
++      int n, ulun = lun;
++
++      cmd = RQSTYPE_ENABLE_LUN;
++      n = DFLT_INOT_CNT;
++      if (IS_FC(isp) && lun != 0) {
++          cmd = RQSTYPE_MODIFY_LUN;
++          n = 0;
++          /*
++           * For SCC firmware, we only deal with setting
++           * (enabling or modifying) lun 0.
++           */
++          ulun = 0;
++      }
++      rstat = LUN_ERR;
++      if (isp_lun_cmd(isp, cmd, bus, tgt, ulun, DFLT_CMND_CNT, n, seq)) {
++          isp_prt(isp, ISP_LOGERR, "isp_lun_cmd failed");
++          goto out;
++      }
++      ISP_UNLK_SOFTC(isp);
++      down(isp->isp_osinfo.rsemap);
++      ISP_LOCK_SOFTC(isp);
++      isp->isp_osinfo.rsemap = NULL;
++      rstat = isp->isp_osinfo.rstatus;
++      if (rstat != LUN_OK) {
++          isp_prt(isp, ISP_LOGERR, "MODIFY/ENABLE LUN returned 0x%x", rstat);
++          goto out;
++      }
++    } else {
++      int n, ulun = lun;
++      u_int32_t seq;
++
++      rstat = LUN_ERR;
++      seq = isp->isp_osinfo.rollinfo++;
++      cmd = -RQSTYPE_MODIFY_LUN;
++
++      n = DFLT_INOT_CNT;
++      if (IS_FC(isp) && lun != 0) {
++          n = 0;
++          /*
++           * For SCC firmware, we only deal with setting
++           * (enabling or modifying) lun 0.
++           */
++          ulun = 0;
++      }
++      if (isp_lun_cmd(isp, cmd, bus, tgt, ulun, DFLT_CMND_CNT, n, seq)) {
++          isp_prt(isp, ISP_LOGERR, "isp_lun_cmd failed");
++          goto out;
++      }
++      ISP_UNLK_SOFTC(isp);
++      down(isp->isp_osinfo.rsemap);
++      ISP_LOCK_SOFTC(isp);
++      isp->isp_osinfo.rsemap = NULL;
++      rstat = isp->isp_osinfo.rstatus;
++      if (rstat != LUN_OK) {
++          isp_prt(isp, ISP_LOGERR, "MODIFY LUN returned 0x%x", rstat);
++          goto out;
++      }
++      if (IS_FC(isp) && lun) {
++          goto out;
++      }
++      seq = isp->isp_osinfo.rollinfo++;
++      isp->isp_osinfo.rsemap = &rsem;
++
++      rstat = LUN_ERR;
++      cmd = -RQSTYPE_ENABLE_LUN;
++      if (isp_lun_cmd(isp, cmd, bus, tgt, lun, 0, 0, seq)) {
++          isp_prt(isp, ISP_LOGERR, "isp_lun_cmd failed");
++          goto out;
++      }
++      ISP_UNLK_SOFTC(isp);
++      down(isp->isp_osinfo.rsemap);
++      ISP_LOCK_SOFTC(isp);
++      isp->isp_osinfo.rsemap = NULL;
++      rstat = isp->isp_osinfo.rstatus;
++      if (rstat != LUN_OK) {
++          isp_prt(isp, ISP_LOGERR, "DISABLE LUN returned 0x%x", rstat);
++          goto out;
++      }
++    }
++out:
++
++    if (rstat != LUN_OK) {
++      isp_prt(isp, ISP_LOGERR, "lun %d %sable failed", lun,
++          (enable) ? "en" : "dis");
++      ISP_UNLK_SOFTC(isp);
++      up(&isp->isp_osinfo.tgt_inisem);
++      return (-EIO);
++    } else {
++      isp_prt(isp, ISP_LOGINFO,
++          "lun %d now %sabled for target mode on channel %d", lun,
++          (enable)? "en" : "dis", bus);
++      if (enable == 0) {
++          LUN_BCLR(isp, bus, lun);
++          if (nolunsenabled(isp, bus)) {
++              int av = bus << 31;
++              rv = isp_control(isp, ISPCTL_TOGGLE_TMODE, &av);
++              if (rv) {
++                  isp_prt(isp, ISP_LOGERR,
++                      "failed to disable target mode on channel %d", bus);
++                  /* but proceed */
++                  ISP_UNLK_SOFTC(isp);
++                  return (-EIO);
++              }
++              isp->isp_osinfo.tmflags &= ~(1 << bus);
++              isp->isp_role &= ~ISP_ROLE_TARGET;
++              if (IS_FC(isp)) {
++                  if (isp_drain_reset(isp, "lun disables")) {
++                      return (-EIO);
++                  }
++                  if ((isp->isp_role & ISP_ROLE_INITIATOR) != 0) {
++                      ISP_UNLK_SOFTC(isp);
++                      SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 1);
++                      ISP_LOCK_SOFTC(isp);
++                  }
++              }
++          }
++      } else {
++          isp->isp_osinfo.tmflags |= (1 << bus);
++          LUN_BSET(isp, bus, lun);
++      }
++      ISP_UNLK_SOFTC(isp);
++      up(&isp->isp_osinfo.tgt_inisem);
++      return (0);
++    }
++}
++#endif
++
++#ifdef        ISP_PRIVATE_ASYNC
++#define       ISP_ASYNC       isp_async_level1
++#else
++#define       ISP_ASYNC       isp_async
++#endif
++
++int
++ISP_ASYNC(struct ispsoftc *isp, ispasync_t cmd, void *arg)
++{
++    switch (cmd) {
++    case ISPASYNC_NEW_TGT_PARAMS:
++      if (IS_SCSI(isp)) {
++          sdparam *sdp = isp->isp_param;
++          char *wt;
++          int mhz, flags, bus, tgt, period;
++
++          tgt = *((int *) arg);
++          bus = (tgt >> 16) & 0xffff;
++          tgt &= 0xffff;
++
++          sdp += bus;
++          flags = sdp->isp_devparam[tgt].actv_flags;
++          period = sdp->isp_devparam[tgt].actv_period;
++          if ((flags & DPARM_SYNC) && period &&
++              (sdp->isp_devparam[tgt].actv_offset) != 0) {
++              if (sdp->isp_lvdmode || period < 0xc) {
++                  switch (period) {
++                  case 0x9:
++                      mhz = 80;
++                      break;
++                  case 0xa:
++                      mhz = 40;
++                      break;
++                  case 0xb:
++                      mhz = 33;
++                      break;
++                  case 0xc:
++                      mhz = 25;
++                      break;
++                  default:
++                      mhz = 1000 / (period * 4);
++                      break;
++                  }
++              } else {
++                  mhz = 1000 / (period * 4);
++              }
++          } else {
++              mhz = 0;
++          }
++          switch (flags & (DPARM_WIDE|DPARM_TQING)) {
++          case DPARM_WIDE:
++              wt = ", 16 bit wide";
++              break;
++          case DPARM_TQING:
++              wt = ", Tagged Queueing Enabled";
++              break;
++          case DPARM_WIDE|DPARM_TQING:
++              wt = ", 16 bit wide, Tagged Queueing Enabled";
++              break;
++          default:
++              wt = " ";
++              break;
++          }
++          if (mhz) {
++              isp_prt(isp, ISP_LOGINFO,
++                  "Channel %d Target %d at %dMHz Max Offset %d%s",
++                  bus, tgt, mhz, sdp->isp_devparam[tgt].actv_offset, wt);
++          } else {
++              isp_prt(isp, ISP_LOGINFO, "Channel %d Target %d Async Mode%s",
++                  bus, tgt, wt);
++          }
++      }
++      break;
++    case ISPASYNC_LIP:
++      isp_prt(isp, ISP_LOGINFO, "LIP Received");
++      break;
++    case ISPASYNC_LOOP_RESET:
++      isp_prt(isp, ISP_LOGINFO, "Loop Reset Received");
++      break;
++    case ISPASYNC_BUS_RESET:
++      isp_prt(isp, ISP_LOGINFO, "SCSI bus %d reset detected", *((int *) arg));
++      break;
++    case ISPASYNC_LOOP_DOWN:
++      isp_prt(isp, ISP_LOGINFO, "Loop DOWN");
++      break;
++    case ISPASYNC_LOOP_UP:
++      isp_prt(isp, ISP_LOGINFO, "Loop UP");
++      break;
++    case ISPASYNC_PROMENADE:
++    {
++      fcparam *fcp = isp->isp_param;
++      struct lportdb *lp;
++      int tgt;
++
++      tgt = *((int *) arg);
++      lp = &fcp->portdb[tgt];
++
++      if (lp->valid) {
++          isp_prt(isp, ISP_LOGINFO,
++              "ID %d (Loop 0x%x) Port WWN 0x%08x%08x @ 0x%x arrived, role %s",
++              tgt, lp->loopid, (unsigned int) (lp->port_wwn >> 32),
++              (unsigned int) (lp->port_wwn & 0xffffffff), lp->portid,
++              class3_roles[fcp->portdb[tgt].roles]);
++      } else {
++          isp_prt(isp, ISP_LOGINFO,
++              "ID %d (Loop 0x%x) Port WWN 0x%08x%08x @ 0x%x departed", tgt,
++              lp->loopid, (unsigned int) (lp->port_wwn >> 32),
++              (unsigned int) (lp->port_wwn & 0xffffffff), lp->portid);
++#ifdef        DEVICE_POLICY_IS_FLUID
++              MEMZERO((void *) lp, sizeof (*lp));
++#endif
++      }
++      break;
++    }
++    case ISPASYNC_CHANGE_NOTIFY:
++      if (arg == ISPASYNC_CHANGE_PDB) {
++              isp_prt(isp, ISP_LOGINFO,
++                  "Port Database Changed");
++      } else if (arg == ISPASYNC_CHANGE_SNS) {
++              isp_prt(isp, ISP_LOGINFO,
++                  "Name Server Database Changed");
++      }
++      SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++      break;
++    case ISPASYNC_FABRIC_DEV:
++    {
++      int target, base, lim;
++      fcparam *fcp = isp->isp_param;
++      struct lportdb *lp = NULL;
++      struct lportdb *clp = (struct lportdb *) arg;
++      char *pt;
++
++      switch (clp->port_type) {
++      case 1:
++              pt = "   N_Port";
++              break;
++      case 2:
++              pt = "  NL_Port";
++              break;
++      case 3:
++              pt = "F/NL_Port";
++              break;
++      case 0x7f:
++              pt = "  Nx_Port";
++              break;
++      case 0x81:
++              pt = "  F_port";
++              break;
++      case 0x82:
++              pt = "  FL_Port";
++              break;
++      case 0x84:
++              pt = "   E_port";
++              break;
++      default:
++              pt = " ";
++              break;
++      }
++
++      isp_prt(isp, ISP_LOGINFO,
++          "%s Fabric Device @ PortID 0x%x", pt, clp->portid);
++
++      /*
++       * If we don't have an initiator role we bail.
++       *
++       * We just use ISPASYNC_FABRIC_DEV for announcement purposes.
++       */
++
++      if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) {
++              break;
++      }
++
++      /*
++       * Is this entry for us? If so, we bail.
++       */
++
++      if (fcp->isp_portid == clp->portid) {
++              break;
++      }
++
++      /*
++       * Else, the default policy is to find room for it in
++       * our local port database. Later, when we execute
++       * the call to isp_pdb_sync either this newly arrived
++       * or already logged in device will be (re)announced.
++       */
++
++      if (fcp->isp_topo == TOPO_FL_PORT)
++              base = FC_SNS_ID+1;
++      else
++              base = 0;
++
++      if (fcp->isp_topo == TOPO_N_PORT)
++              lim = 1;
++      else
++              lim = MAX_FC_TARG;
++
++      /*
++       * Is it already in our list?
++       */
++      for (target = base; target < lim; target++) {
++              if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
++                      continue;
++              }
++              lp = &fcp->portdb[target];
++              if (lp->port_wwn == clp->port_wwn &&
++                  lp->node_wwn == clp->node_wwn) {
++                      lp->fabric_dev = 1;
++                      /*
++                       * Propagate possibly new port id.
++                       */
++                      lp->portid = clp->portid;
++                      break;
++              }
++      }
++      if (target < lim) {
++              break;
++      }
++      for (target = base; target < lim; target++) {
++              if (target >= FL_PORT_ID && target <= FC_SNS_ID) {
++                      continue;
++              }
++              lp = &fcp->portdb[target];
++              if (lp->port_wwn == 0) {
++                      break;
++              }
++      }
++      if (target == lim) {
++              isp_prt(isp, ISP_LOGWARN,
++                  "out of space for fabric devices");
++              break;
++      }
++      lp->port_type = clp->port_type;
++      lp->fc4_type = clp->fc4_type;
++      lp->node_wwn = clp->node_wwn;
++      lp->port_wwn = clp->port_wwn;
++      lp->portid = clp->portid;
++      lp->fabric_dev = 1;
++      break;
++    }
++#ifdef        LINUX_ISP_TARGET_MODE
++    case ISPASYNC_TARGET_MESSAGE:
++    {
++      tmd_msg_t *mp = arg;
++      isp_prt(isp, ISP_LOGTDEBUG2,
++          "bus %d iid %d tgt %d lun %d ttype %x tval %x msg[0]=%x",
++          mp->nt_bus, (int) mp->nt_iid, (int) mp->nt_tgt, (int) mp->nt_lun,
++          mp->nt_tagtype, mp->nt_tagval, mp->nt_msg[0]);
++      break;
++    }
++    case ISPASYNC_TARGET_EVENT:
++    {
++      tmd_event_t *ep = arg;
++      switch (ep->ev_event) {
++      case  ASYNC_CTIO_DONE:
++          /*
++           * ACK the interrupt first
++           */
++          ISP_WRITE(isp, BIU_SEMA, 0);
++          ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
++          isp_handle_platform_ctio_fastpost(isp, ep->ev_bus);
++          break;
++      default:
++          isp_prt(isp, ISP_LOGTDEBUG2,
++              "bus %d event code 0x%x", ep->ev_bus, ep->ev_event);
++      }
++      break;
++    }
++    case ISPASYNC_TARGET_ACTION:
++      switch (((isphdr_t *)arg)->rqs_entry_type) {
++      default:
++          isp_prt(isp, ISP_LOGWARN, "event 0x%x for unhandled target action",
++              ((isphdr_t *)arg)->rqs_entry_type);
++          break;
++      case RQSTYPE_ATIO:
++          (void) isp_handle_platform_atio(isp, (at_entry_t *) arg);
++          break;
++      case RQSTYPE_ATIO2:
++          (void) isp_handle_platform_atio2(isp, (at2_entry_t *)arg);
++          break;
++      case RQSTYPE_CTIO2:
++      case RQSTYPE_CTIO:
++          (void) isp_handle_platform_ctio(isp, arg);
++          break;
++      case RQSTYPE_ENABLE_LUN:
++      case RQSTYPE_MODIFY_LUN:
++          isp->isp_osinfo.rstatus = ((lun_entry_t *)arg)->le_status;
++          if (isp->isp_osinfo.rsemap) {
++              up(isp->isp_osinfo.rsemap);
++          }
++          break;
++      }
++      break;
++#endif
++    case ISPASYNC_UNHANDLED_RESPONSE:
++      break;
++    case ISPASYNC_FW_CRASH:
++    {
++      u_int16_t mbox1, mbox6;
++      mbox1 = ISP_READ(isp, OUTMAILBOX1);
++      if (IS_DUALBUS(isp)) {
++          mbox6 = ISP_READ(isp, OUTMAILBOX6);
++      } else {
++          mbox6 = 0;
++      }
++      isp_prt(isp, ISP_LOGERR,
++          "Internal F/W Error on bus %d @ RISC Address 0x%x", mbox6, mbox1);
++#ifdef        ISP_FW_CRASH_DUMP
++      if (IS_FC(isp)) {
++          isp->isp_blocked = 1;
++          SEND_THREAD_EVENT(isp, ISP_THREAD_FW_CRASH_DUMP, 0);
++      } else {
++          isp_reinit(isp);
++          isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++      }
++#endif
++      break;
++    }
++    case ISPASYNC_FW_RESTARTED:
++    {
++      if (IS_FC(isp)) {
++          SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++      }
++      break;
++    }
++    default:
++      return (-1);
++    }
++    return (0);
++}
++
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#include "sd.h"
++int
++isplinux_biosparam(Disk *disk, kdev_t n, int ip[])
++{
++    int size = disk->capacity;
++    ip[0] = 64;
++    ip[1] = 32;
++    ip[2] = size >> 11;
++    if (ip[2] > 1024) {
++      ip[0] = 255;
++      ip[1] = 63;
++      ip[2] = size / (ip[0] * ip[1]);
++    }
++    return (0);
++}
++
++/*
++ * Set the queue depth for this device.
++ */
++
++void
++isplinux_sqd(struct Scsi_Host *host, Scsi_Device *devs)
++{
++    while (devs) {
++      if (devs->host == host && devs->tagged_supported == 0) {
++          /*
++           * If this device doesn't support tagged operations, don't waste
++           * queue space for it, even if it has multiple luns.
++           */
++          devs->queue_depth = 2;
++      } else if (devs->host == host) {
++          int depth = 2;
++          struct ispsoftc *isp = (struct ispsoftc *) host->hostdata;
++
++          if (IS_SCSI(isp)) {
++              sdparam *sdp = isp->isp_param;
++              sdp += devs->channel;
++              depth = sdp->isp_devparam[devs->id].exc_throttle;
++          } else {
++              depth = FCPARAM(isp)->isp_execthrottle;
++          }
++          if (isp_throttle) {
++              /*
++               * This limit is due to the size of devs->queue_depth
++               */
++              depth = (unsigned char) min(isp_throttle, 255);;
++          }
++          if (depth < 4) {
++              depth = 4;
++          }
++          devs->queue_depth = depth;
++      }
++      devs = devs->next;
++    }
++}
++
++#else
++int
++isplinux_biosparam(struct scsi_device *sdev, struct block_device *n,
++                 sector_t capacity, int ip[])
++{
++    int size = capacity;
++    ip[0] = 64;
++    ip[1] = 32;
++    ip[2] = size >> 11;
++    if (ip[2] > 1024) {
++      ip[0] = 255;
++      ip[1] = 63;
++      ip[2] = size / (ip[0] * ip[1]);
++    }
++    return (0);
++}
++
++static int
++isplinux_slave_configure(Scsi_Device * device)
++{
++    if (device->tagged_supported) {
++      /*
++       *  FIX LATER
++       */
++      scsi_adjust_queue_depth(device, MSG_ORDERED_TAG, 63);
++    }
++    return 0;
++}
++#endif
++
++/*
++ * Periodic watchdog timer.. the main purpose here is to restart
++ * commands that were pegged on resources, etc...
++ */
++void
++isplinux_timer(unsigned long arg)
++{
++    Scsi_Cmnd *Cmnd;
++    struct ispsoftc *isp = (struct ispsoftc *) arg;
++
++    ISP_ILOCK_SOFTC(isp);
++    if (IS_FC(isp)) {
++      int rql;
++      if (isp->isp_role & ISP_ROLE_INITIATOR)
++          rql = LOOP_READY;
++      else
++          rql = LOOP_LSCAN_DONE;
++      if (isp->isp_fcrswdog || FCPARAM(isp)->isp_fwstate != FW_READY ||
++          FCPARAM(isp)->isp_loopstate < rql) {
++          isp->isp_fcrswdog = 0;
++          if (isp->isp_deadloop == 0 && isp->isp_role != ISP_ROLE_NONE) {
++              SEND_THREAD_EVENT(isp, ISP_THREAD_FC_RESCAN, 0);
++          }
++      }
++    }
++    isplinux_runwaitq(isp);
++    if ((Cmnd = isp->isp_osinfo.dqnext) != NULL) {
++      isp->isp_osinfo.dqnext = isp->isp_osinfo.dqtail = NULL;
++    }
++    if (isp->dogactive) {
++      isp->isp_osinfo.timer.expires = jiffies + ISP_WATCH_TIME;
++      add_timer(&isp->isp_osinfo.timer);
++    }
++    ISP_IUNLK_SOFTC(isp);
++    if (Cmnd) {
++      ISP_LOCK_SCSI_DONE(isp);
++        while (Cmnd) {
++          Scsi_Cmnd *f = (Scsi_Cmnd *) Cmnd->host_scribble;
++          Cmnd->host_scribble = NULL;
++          /*
++           * Get around silliness in midlayer.
++           */
++          if (host_byte(Cmnd->result) == DID_RESET) {
++              Cmnd->flags |= IS_RESETTING;
++          }
++          (*Cmnd->scsi_done)(Cmnd);
++          Cmnd = f;
++      }
++      ISP_UNLK_SCSI_DONE(isp);
++    }
++}
++
++void
++isplinux_mbtimer(unsigned long arg)
++{
++    struct ispsoftc *isp = (struct ispsoftc *) arg;
++    ISP_ILOCK_SOFTC(isp);
++    if (isp->mbox_waiting) {
++      isp->mbox_waiting = 0;
++      up(&isp->mbox_c_sem);
++    }
++    ISP_IUNLK_SOFTC(isp);
++}
++
++irqreturn_t
++isplinux_intr(int irq, void *arg, struct pt_regs *pt)
++{
++    struct ispsoftc *isp = arg;
++    u_int16_t isr, sema, mbox;
++    Scsi_Cmnd *Cmnd;
++
++    ISP_ILOCK_SOFTC(isp);
++    isp->isp_intcnt++;
++    if (ISP_READ_ISR(isp, &isr, &sema, &mbox) == 0) {
++      isp->isp_intbogus++;
++      ISP_IUNLK_SOFTC(isp);
++      return IRQ_NONE;
++    }
++    isp_intr(isp, isr, sema, mbox);
++    isplinux_runwaitq(isp);
++    if ((Cmnd = isp->isp_osinfo.dqnext) != NULL) {
++      isp->isp_osinfo.dqnext = isp->isp_osinfo.dqtail = NULL;
++    }
++#ifdef        LINUX_ISP_TARGET_MODE
++    if (isp->isp_osinfo.pending_t) {
++      struct tmd_cmd *tmd = isp->isp_osinfo.pending_t;
++      isp->isp_osinfo.pending_t = NULL;
++      ISP_IUNLK_SOFTC(isp);
++      do {
++          struct tmd_cmd *next = tmd->cd_lreserved[1].ptrs[0];
++          tmd->cd_lreserved[1].ptrs[0] = NULL;
++          ISP_PARENT_TARGET(tmd->cd_lreserved[0].bytes[0], tmd);
++          tmd = next;
++      } while (tmd != NULL);
++    } else {
++      ISP_IUNLK_SOFTC(isp);
++    }
++#else
++    ISP_IUNLK_SOFTC(isp);
++#endif
++    if (Cmnd) {
++      ISP_LOCK_SCSI_DONE(isp);
++        while (Cmnd) {
++          Scsi_Cmnd *f = (Scsi_Cmnd *) Cmnd->host_scribble;
++          Cmnd->host_scribble = NULL;
++          /*
++           * Get around silliness in midlayer.
++           */
++          if (host_byte(Cmnd->result) == DID_RESET) {
++              Cmnd->flags |= IS_RESETTING;
++          }
++          (*Cmnd->scsi_done)(Cmnd);
++          Cmnd = f;
++      }
++      ISP_UNLK_SCSI_DONE(isp);
++    }
++    return IRQ_HANDLED;
++}
++
++static INLINE int
++isp_parse_rolearg(struct ispsoftc *isp, char *roles)
++{
++    char *role = roles;
++
++    while (role && *role) {
++      unsigned int id;
++      char *eqtok, *commatok, *p, *q;
++      
++      eqtok = role;
++      eqtok = strchr(role, '=');
++      if (eqtok == NULL)
++         break;
++      *eqtok = 0;
++      commatok = strchr(eqtok+1, ',');
++      if (commatok)
++          *commatok = 0;
++      if (strncmp(role, "0x", 2) == 0)
++          q = role + 2;
++      else
++          q = role;
++      if (*q == '*')
++          id = isp->isp_osinfo.device_id;
++      else
++          id = simple_strtoul(q, &p, 16);
++      *eqtok = '=';
++      if (p != q && id == isp->isp_osinfo.device_id) {
++          p = eqtok + 1;
++          if (strcmp(p, "none") == 0) {
++              if (commatok) {
++                  *commatok = ',';
++              }
++              return (ISP_ROLE_NONE);
++          }
++          if (strcmp(p, "target") == 0) {
++              if (commatok) {
++                  *commatok = ',';
++              }
++              return (ISP_ROLE_TARGET);
++          }
++          if (strcmp(p, "initiator") == 0) {
++              if (commatok) {
++                  *commatok = ',';
++              }
++              return (ISP_ROLE_INITIATOR);
++          }
++          if (strcmp(p, "both") == 0) {
++              if (commatok) {
++                  *commatok = ',';
++              }
++              return (ISP_ROLE_BOTH);
++          }
++          break;
++      }
++        if (commatok) {
++          role = commatok+1;
++          *commatok = ',';
++      } else {
++          break;
++      }
++    }
++    return (ISP_DEFAULT_ROLES);
++}
++
++static INLINE u_int64_t
++isp_parse_wwnarg(struct ispsoftc *isp, char *wwns)
++{
++    char *wwnt = wwns;
++    u_int64_t wwn = 0;
++
++    while (wwn == 0 && wwnt && *wwnt) {
++      unsigned int id;
++      char *eqtok, *commatok, *p, *q;
++      
++      eqtok = wwnt;
++      eqtok = strchr(wwnt, '=');
++      if (eqtok == NULL)
++         break;
++      *eqtok = 0;
++      commatok = strchr(eqtok+1, ',');
++      if (commatok)
++          *commatok = 0;
++      if (strncmp(wwnt, "0x", 2) == 0)
++          q = wwnt + 2;
++      else
++          q = wwnt;
++      id = simple_strtoul(q, &p, 16);
++      if (p != q && id == isp->isp_osinfo.device_id) {
++          unsigned long t, t2;
++          p = eqtok + 1;
++          while (*p) {
++              p++;
++          }
++          p -= 8;
++          if (p > eqtok + 1) {
++              char *q;
++              char c;
++              q = p;
++              t = simple_strtoul(p, &q, 16);
++              c = *p;
++              *p = 0;
++              t2 = simple_strtoul(eqtok+1, NULL, 16);
++              *p = c;
++          } else {
++              t = simple_strtoul(eqtok+1, NULL, 16);
++              t2 = 0;
++          }
++          wwn = (((u_int64_t) t2) << 32) | (u_int64_t) t;
++      }
++      *eqtok = '=';
++        if (commatok) {
++          wwnt = commatok+1;
++          *commatok = ',';
++      } else {
++          break;
++      }
++    }
++    return (wwn);
++}
++
++void
++isplinux_common_init(struct ispsoftc *isp)
++{
++    /*
++     * Set up config options, etc...
++     */
++    if (isp_debug) {
++      isp->isp_dblev = isp_debug;
++    } else {
++      isp->isp_dblev = ISP_LOGCONFIG|ISP_LOGWARN|ISP_LOGERR;
++    }
++
++    if (isp_nofwreload & (1 << isp->isp_unit)) {
++      isp->isp_confopts |= ISP_CFG_NORELOAD;
++    }
++    if (isp_nonvram & (1 << isp->isp_unit)) {
++      isp->isp_confopts |= ISP_CFG_NONVRAM;
++    }
++    if (IS_FC(isp)) {
++      if (isp_fcduplex & (1 << isp->isp_unit)) {
++          isp->isp_confopts |= ISP_CFG_FULL_DUPLEX;
++      }
++        isp->isp_defwwpn = isp_parse_wwnarg(isp, isp_wwpns);
++      if (isp->isp_defwwpn == 0) {
++          isp->isp_defwwpn = (u_int64_t) 0x400000007F7F7F01;
++      } else {
++          isp->isp_confopts |= ISP_CFG_OWNWWPN;
++      }
++        isp->isp_defwwnn = isp_parse_wwnarg(isp, isp_wwnns);
++      if (isp->isp_defwwnn == 0) {
++          isp->isp_defwwnn = (u_int64_t) 0x400000007F7F7F02;
++      } else {
++          isp->isp_confopts |= ISP_CFG_OWNWWNN;
++      }
++      isp->isp_osinfo.host->max_id = MAX_FC_TARG; 
++      if (IS_2200(isp) || IS_2300(isp)) {
++          if (isp_nport_only & (1 << isp->isp_unit)) {
++              isp->isp_confopts |= ISP_CFG_NPORT_ONLY;
++          } else if (isp_loop_only & (1 << isp->isp_unit)) {
++              isp->isp_confopts |= ISP_CFG_LPORT_ONLY;
++          } else {
++              isp->isp_confopts |= ISP_CFG_NPORT;
++          }
++      }
++      isp->isp_osinfo.host->this_id = MAX_FC_TARG+1;
++#ifdef        ISP_FW_CRASH_DUMP
++      if (IS_2200(isp))
++          FCPARAM(isp)->isp_dump_data =
++              isp_kalloc(QLA2200_RISC_IMAGE_DUMP_SIZE, GFP_KERNEL);
++      else if (IS_23XX(isp))
++          FCPARAM(isp)->isp_dump_data =
++              isp_kalloc(QLA2300_RISC_IMAGE_DUMP_SIZE, GFP_KERNEL);
++      if (FCPARAM(isp)->isp_dump_data) {
++          isp_prt(isp, ISP_LOGCONFIG, "f/w crash dump area allocated");
++          FCPARAM(isp)->isp_dump_data[0] = 0;
++      }
++#endif
++      if (isp_default_frame_size) {
++          if (isp_default_frame_size != 512 &&
++              isp_default_frame_size != 1024 &&
++              isp_default_frame_size != 2048) {
++                  isp_prt(isp, ISP_LOGERR,
++                      "bad frame size (%d), defaulting to (%d)",
++                      isp_default_frame_size, ICB_DFLT_FRMLEN);
++              isp_default_frame_size = 0;
++          }
++      }
++      if (isp_default_frame_size) {
++          isp->isp_confopts |= ISP_CFG_OWNFSZ;
++          isp->isp_osinfo.storep->fibre_scsi.default_frame_size =
++              isp_default_frame_size;
++      } else {
++          isp->isp_osinfo.storep->fibre_scsi.default_frame_size =
++              isp_default_frame_size = ICB_DFLT_FRMLEN;
++      }
++      if (isp_default_exec_throttle) {
++          if (isp_default_exec_throttle < 16 ||
++              isp_default_exec_throttle > 255) {
++              isp_prt(isp, ISP_LOGERR,
++                  "bad execution throttle size (%d), defaulting to (%d)",
++                  isp_default_exec_throttle, ICB_DFLT_THROTTLE);
++              isp_default_exec_throttle = 0;
++          }
++      }
++      if (isp_default_exec_throttle) {
++          isp->isp_confopts |= ISP_CFG_OWNEXCTHROTTLE;
++          isp->isp_osinfo.storep->fibre_scsi.default_exec_throttle =
++              isp_default_exec_throttle;
++      } else {
++          isp->isp_osinfo.storep->fibre_scsi.default_exec_throttle =
++              ICB_DFLT_THROTTLE;
++      }
++    } else {
++      isp->isp_osinfo.host->max_id = MAX_TARGETS;
++      isp->isp_osinfo.host->this_id = 7;      /* temp default */
++    }
++    isp->isp_role = isp_parse_rolearg(isp, isp_roles);
++
++
++    /*
++     * Initialize locks
++     */
++    ISP_LOCK_INIT(isp);
++    ISP_TLOCK_INIT(isp);
++    sema_init(&isp->mbox_sem, 1);
++    sema_init(&isp->mbox_c_sem, 0);
++    sema_init(&isp->fcs_sem, 1);
++
++#if defined(CONFIG_PROC_FS) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    /*
++     * Initialize any PROCFS stuff
++     */
++    isplinux_init_proc(isp);
++#endif
++
++    /*
++     * Start watchdog timer
++     */
++    ISP_LOCK_SOFTC(isp);
++    init_timer(&isp->isp_osinfo.timer);
++    isp->isp_osinfo.timer.data = (unsigned long) isp;
++    isp->isp_osinfo.timer.function = isplinux_timer;
++    isp->isp_osinfo.timer.expires = jiffies + ISP_WATCH_TIME;
++    add_timer(&isp->isp_osinfo.timer);
++    isp->dogactive = 1;
++    if (IS_FC(isp)) {
++      DECLARE_MUTEX_LOCKED(sem);
++      ISP_UNLK_SOFTC(isp);
++      isp->isp_osinfo.task_ctl_sem = &sem;
++      kernel_thread(isp_task_thread, isp, 0);
++      down(&sem);
++      isp->isp_osinfo.task_ctl_sem = NULL;
++      ISP_LOCK_SOFTC(isp);
++    }
++    isplinux_reinit(isp);
++#ifdef        LINUX_ISP_TARGET_MODE
++    sema_init(&isp->isp_osinfo.tgt_inisem, 1);
++#endif
++#ifdef        ISP_TARGET_MODE
++    isp_attach_target(isp);
++#endif
++    ISP_UNLK_SOFTC(isp);
++}
++
++void
++isplinux_reinit(struct ispsoftc *isp)
++{
++    int maxluns = isp_maxluns;
++    isp_reset(isp);
++    if (isp->isp_state != ISP_RESETSTATE) {
++      isp_prt(isp, ISP_LOGERR, "failed to enter RESET state");
++      return;
++    } 
++    /*
++     * Until the midlayer starts using REPORT LUNS to dertermine how many
++     * luns there are for SCSI-3 devices and sets a reasonable limit for
++     * SCSI-2 devices, we'll follow this ruleset:
++     * 
++     *        If our isp_maxluns parameter is unchanged from its default, we
++     *        limit ourselves to 8 luns for parallel SCSI, 256 for FC-SCSI.
++     *
++     *        If somebody has set isp_maxluns away from the fefault, we follow that.
++     *
++     *        We filter any value through the HBA maximum
++     */
++    if (isp_maxluns == 8) {
++      if (IS_FC(isp)) {
++              maxluns = 256;
++      }
++    }
++    isp->isp_osinfo.host->max_lun = min(maxluns, ISP_MAX_LUNS(isp));
++    isp_init(isp);
++    if (isp->isp_role == ISP_ROLE_NONE) {
++      return;
++    }
++    if (isp->isp_state != ISP_INITSTATE) {
++      isp_prt(isp, ISP_LOGERR, "failed to enter INIT state");
++      return;
++    }
++    isp->isp_state = ISP_RUNSTATE;
++
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    isp->isp_osinfo.host->can_queue = isp->isp_maxcmds;
++#else
++    isp->isp_osinfo.host->can_queue = min(255, isp->isp_maxcmds);
++#endif
++    if (isp->isp_osinfo.host->can_queue == 0)
++      isp->isp_osinfo.host->can_queue = 1;
++
++    if (IS_FC(isp)) {
++      isp->isp_osinfo.host->this_id = MAX_FC_TARG;
++      /*
++       * This is *not* the same as execution throttle- that is set
++       * in isplinux_sqd and is per-device.
++       *
++       * What we try and do here is take how much we can queue at
++       * a given time and spread it, reasonably, over all the luns
++       * we expect to run at a time.
++       */
++      if (isp_cmd_per_lun) {
++          isp->isp_osinfo.host->cmd_per_lun = isp_cmd_per_lun;
++      } else {
++          /*
++           * JAWAG.
++           */
++          isp->isp_osinfo.host->cmd_per_lun = isp->isp_maxcmds >> 3;
++      }
++
++      /*
++       * We seem to need a bit of settle time.
++       */
++      USEC_DELAY(1 * 1000000);
++    } else {
++      int bus;
++
++      if (isp_cmd_per_lun) {
++          isp->isp_osinfo.host->cmd_per_lun = isp_cmd_per_lun;
++      } else {
++          /*
++           * Maximum total commands spread over either 8 targets,
++           * or 4 targets, 2 luns, etc.
++           */
++          isp->isp_osinfo.host->cmd_per_lun = isp->isp_maxcmds >> 3;
++      }
++
++      /*
++       * No way to give different ID's for the second bus.
++       */
++      isp->isp_osinfo.host->this_id = SDPARAM(isp)->isp_initiator_id;
++      bus = 0;
++      (void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
++      if (IS_DUALBUS(isp)) {
++          bus = 1;
++          (void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
++      }
++      /*
++       * Bus Reset delay handled by firmware.
++       */
++    }
++}
++
++int
++isp_drain_reset(struct ispsoftc *isp, char *msg)
++{
++    isp->isp_blocked = 1;
++    /*
++     * Drain active commands.
++     */
++    if (isp_drain(isp, msg)) {
++      isp->isp_failed = 1;
++      isp->isp_blocked = 0;
++      return (-1);
++    }
++    isp_reinit(isp);
++    if ((isp->isp_role == ISP_ROLE_NONE && isp->isp_state < ISP_RESETSTATE) ||
++        (isp->isp_role != ISP_ROLE_NONE && isp->isp_state < ISP_RUNSTATE)) {
++      isp->isp_blocked = 0;
++      return (-1);
++    }
++    isp->isp_failed = 0;
++    isp->isp_blocked = 0;
++    return (0);
++}
++
++int
++isp_drain(struct ispsoftc *isp, char *whom)
++{
++    int nslept;
++
++    if (isp->isp_nactive == 0)
++      return (0);
++
++    isp->isp_draining = 1;
++    nslept = 0;
++    isp_prt(isp, ISP_LOGDEBUG0, "draining %d commands", isp->isp_nactive);
++    while (isp->isp_nactive) {
++        USEC_SLEEP(isp, 100000);      /* drops lock */
++      if (++nslept >= (60 * 10)) {    /* 60 seconds */
++              isp_prt(isp, ISP_LOGERR, "%s: command drain timed out", whom);
++              isp->isp_draining = 0;
++              return (-1);
++      }
++    }
++    isp_prt(isp, ISP_LOGDEBUG0, "done draining commands");
++    isp->isp_draining = 0;
++    isplinux_runwaitq(isp);
++    return (0);
++}
++
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#define       ISP_THREAD_CAN_EXIT     isp->isp_host->loaded_as_module
++#else
++#define       ISP_THREAD_CAN_EXIT     0
++#endif
++
++static int
++isp_task_thread(void *arg)
++{
++    DECLARE_MUTEX_LOCKED(thread_sleep_semaphore);
++    struct ispsoftc *isp = arg;
++    unsigned long flags;
++    int action, nactions, exit_thread = 0;
++    isp_thread_action_t curactions[MAX_THREAD_ACTION];
++
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    /* XXX: Not really sure why the 2.5.X changes do this */
++    if (ISP_THREAD_CAN_EXIT) {
++      siginitsetinv(&current->blocked, sigmask(SIGHUP));
++    } else {
++      siginitsetinv(&current->blocked, 0);
++    }
++    lock_kernel();
++    daemonize();
++    sprintf(current->comm, "isp_thrd%d", isp->isp_unit);
++#else
++    lock_kernel();
++    daemonize("isp_thrd%d", isp->isp_unit);
++#endif
++    isp->isp_osinfo.task_thread = current;
++    isp->isp_osinfo.task_request = &thread_sleep_semaphore;
++    unlock_kernel();
++
++    if (isp->isp_osinfo.task_ctl_sem) {
++      up(isp->isp_osinfo.task_ctl_sem);
++    }
++    isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread starting");
++
++    while (exit_thread == 0) {
++      isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread sleeping");
++      down_interruptible(&thread_sleep_semaphore);
++      if (ISP_THREAD_CAN_EXIT) {
++          if (signal_pending(current))
++              break;
++      }
++      isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread running");
++
++      spin_lock_irqsave(&isp->isp_osinfo.tlock, flags);
++      nactions = isp->isp_osinfo.nt_actions;
++      isp->isp_osinfo.nt_actions = 0;
++      for (action = 0; action < nactions; action++) {
++              curactions[action] = isp->isp_osinfo.t_actions[action];
++              isp->isp_osinfo.t_actions[action].thread_action = 0;
++              isp->isp_osinfo.t_actions[action].thread_waiter = 0;
++      }
++      spin_unlock_irqrestore(&isp->isp_osinfo.tlock, flags);
++
++      for (action = 0; action < nactions; action++) {
++          isp_thread_action_t *tap = &curactions[action];
++          isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread[%d]: action %d (%p)",
++              action, tap->thread_action, tap->thread_waiter);
++          switch (tap->thread_action) {
++          case ISP_THREAD_NIL:
++              break;
++#ifdef        ISP_FW_CRASH_DUMP
++          case ISP_THREAD_FW_CRASH_DUMP:
++              ISP_LOCKU_SOFTC(isp);
++              FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT;
++              FCPARAM(isp)->isp_loopstate = LOOP_NIL;
++              isp_fw_dump(isp);
++              SEND_THREAD_EVENT(isp, ISP_THREAD_REINIT, 0);
++              ISP_UNLKU_SOFTC(isp);
++              break;
++#endif
++          case ISP_THREAD_REINIT:
++          {
++              int level;
++              ISP_LOCKU_SOFTC(isp);
++              level = (isp->isp_role == ISP_ROLE_NONE)?
++                  ISP_RESETSTATE : ISP_INITSTATE;
++              isp_reinit(isp);
++              if (isp->isp_state >= level) {
++                  isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
++              } else {
++                  SEND_THREAD_EVENT(isp, ISP_THREAD_REINIT, 0);
++              }
++              ISP_UNLKU_SOFTC(isp);
++              break;
++          }
++          case ISP_THREAD_FC_RESCAN:
++              ISP_LOCKU_SOFTC(isp);
++              if (isp_fc_runstate(isp, 250000) == 0) {
++                  isp->isp_deadloop = 0;
++                  isp->isp_downcnt = 0;
++                  isp->isp_fcrspend = 0;
++                  isp->isp_blocked = 0;
++                  isplinux_runwaitq(isp);
++              } else {
++                  /*
++                   * Try again in a little while.
++                   */
++                  isp->isp_fcrspend = 0;
++                  if (++isp->isp_downcnt == isp_deadloop_time) {
++                      isp_prt(isp, ISP_LOGWARN, "assuming loop is dead");
++                      FCPARAM(isp)->loop_seen_once = 0;
++                      isp->isp_deadloop = 1;
++                      isp->isp_downcnt = 0;
++                      isp->isp_blocked = 0;   /* unblock anyway */
++                      isplinux_flushwaitq(isp);
++                  } else {
++                      isp->isp_fcrswdog = 1;
++                  }
++              }
++              ISP_UNLKU_SOFTC(isp);
++              break;
++          case ISP_THREAD_EXIT:
++              if (ISP_THREAD_CAN_EXIT) {
++                  exit_thread = 1;
++              }
++              break;
++         default:
++              break;
++         }
++         if (tap->thread_waiter) {
++              isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread signalling %p",
++                  tap->thread_waiter);
++              up(tap->thread_waiter);
++         }
++      }
++    }
++    isp_prt(isp, ISP_LOGDEBUG1, "isp_task_thread exiting");
++    isp->isp_osinfo.task_request = NULL;
++    return (0);
++}
++
++void
++isp_prt(struct ispsoftc *isp, int level, const char *fmt, ...)
++{
++    char buf[256];
++    char *prefl;
++    va_list ap;
++
++    if (level != ISP_LOGALL && (level & isp->isp_dblev) == 0) {
++      return;
++    }
++    if (level & ISP_LOGERR) {
++      prefl = KERN_ERR "%s: ";
++    } else if (level & ISP_LOGWARN) {
++      prefl = KERN_WARNING "%s: ";
++    } else if (level & ISP_LOGINFO) {
++      prefl = KERN_NOTICE "%s: ";
++    } else if (level & ISP_LOGCONFIG) {
++      prefl = KERN_INFO "%s: ";
++    } else {
++      prefl = "%s: ";
++    }
++    printk(prefl, isp->isp_name);
++    va_start(ap, fmt);
++    vsprintf(buf, fmt, ap);
++    va_end(ap);
++    printk("%s\n", buf);
++}
++
++char *
++isp_snprintf(char *buf, size_t amt, const char *fmt, ...)
++{
++    va_list ap;
++    ARGSUSED(amt);
++    va_start(ap, fmt);
++    (void) vsprintf(buf, fmt, ap);
++    va_end(ap);
++    return (buf);
++}
++
++#ifdef MODULE
++#ifndef       ISP_LICENSE
++#define       ISP_LICENSE     "Dual BSD/GPL"
++#endif
++#ifdef        MODULE_LICENSE
++MODULE_LICENSE( ISP_LICENSE );
++#endif
++MODULE_PARM(isp_debug, "i");
++MODULE_PARM(isp_disable, "i");
++MODULE_PARM(isp_nonvram, "i");
++MODULE_PARM(isp_nofwreload, "i");
++MODULE_PARM(isp_maxluns, "i");
++MODULE_PARM(isp_throttle, "i");
++MODULE_PARM(isp_cmd_per_lun, "i");
++MODULE_PARM(isp_roles, "s");
++MODULE_PARM(isp_fcduplex, "i");
++MODULE_PARM(isp_wwpns, "s");
++MODULE_PARM(isp_wwnns, "s");
++MODULE_PARM(isp_nport_only, "i");
++MODULE_PARM(isp_loop_only, "i");
++MODULE_PARM(isp_deadloop_time, "i");
++MODULE_PARM(isp_xtime, "i");
++MODULE_PARM(isp_default_frame_size, "i");
++MODULE_PARM(isp_default_exec_throttle, "i");
++#endif
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,3,27)
++struct proc_dir_entry proc_scsi_qlc = {
++    PROC_SCSI_QLOGICISP, 3, "isp", S_IFDIR | S_IRUGO | S_IXUGO, 2
++};
++#endif
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) || defined(MODULE)
++Scsi_Host_Template driver_template = QLOGICISP;
++#include "scsi_module.c"
++#endif
++/*
++ * mode: c
++ * Local variables:
++ * c-indent-level: 4
++ * c-brace-imaginary-offset: 0
++ * c-brace-offset: -4
++ * c-argdecl-indent: 4
++ * c-label-offset: -4
++ * c-continued-statement-offset: 4
++ * c-continued-brace-offset: 0
++ * End:
++ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_linux.h    2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,1035 @@
++/* @(#)isp_linux.h 1.51 */
++/*
++ * Qlogic ISP SCSI Host Adapter Linux Wrapper Definitions
++ *---------------------------------------
++ * Copyright (c) 1998, 1999, 2000, 2001 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * the GNU Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * PMB #825
++ * 5214-F Diamond Hts Blvd
++ * San Francisco, CA, 94131
++ * mjacob@feral.com
++ */
++
++#ifndef _ISP_LINUX_H
++#define _ISP_LINUX_H
++
++#include <linux/vmalloc.h>
++
++#ifndef       ISP_MODULE
++#define       __NO_VERSION__
++#endif
++#ifdef        LINUX_ISP_TARGET_MODE
++#define       EXPORT_SYMTAB
++#endif
++
++#include <linux/version.h>
++#ifndef       KERNEL_VERSION
++#define KERNEL_VERSION(v,p,s)         (((v)<<16)+(p<<8)+s)
++#endif
++#define       _KVC    KERNEL_VERSION
++
++#if LINUX_VERSION_CODE <= _KVC(2,2,0)
++#error        "Linux 2.0 and 2.1 kernels are not supported anymore"
++#endif
++#if LINUX_VERSION_CODE >= _KVC(2,3,0) && LINUX_VERSION_CODE < _KVC(2,4,0)
++#error        "Linux 2.3 kernels are not supported"
++#endif
++
++#ifndef       UNUSED_PARAMETER
++#define       UNUSED_PARAMETER(x)     (void) x
++#endif
++
++#include <linux/autoconf.h>
++#ifdef        CONFIG_SMP
++#define       __SMP__ 1
++#endif
++
++#define COPYIN(u, k, n, m) \
++      copy_from_user((void*)(k), (const void*)(u), (n))
++#define COPYOUT(k, u, n, m) \
++      copy_to_user((void*)(u), (const void*)(k), (n))
++
++/*
++ * Be nice and get ourselves out of the way of other drivers.
++ * Note that if all the other drivers are there, then the only
++ * thing we'd attach to that they wouldn't would be the obsolete
++ *  and unavailable 1240 or the 23XX.
++ */
++#ifdef        CONFIG_SCSI_QLOGIC_ISP
++#define       ISP_DISABLE_1020_SUPPORT 1
++#endif
++#ifdef        CONFIG_SCSI_QLOGIC_FC
++#define       ISP_DISABLE_2100_SUPPORT 1
++#define       ISP_DISABLE_2200_SUPPORT 1
++#endif
++#ifdef        CONFIG_SCSI_QLOGIC_1280
++#define       ISP_DISABLE_1080_SUPPORT 1
++#define       ISP_DISABLE_12160_SUPPORT 1
++#endif
++
++#include <linux/module.h>
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/types.h>
++#include <linux/blk.h>
++#include <linux/blkdev.h>
++#include <linux/delay.h>
++#include <linux/ioport.h>
++#include <linux/mm.h>
++#include <linux/sched.h>
++#include <linux/stat.h>
++#include <linux/pci.h>
++#include <asm/dma.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#include <linux/smp.h>
++#include <linux/spinlock.h>
++#else
++#include <asm/spinlock.h>
++#endif
++#include <asm/system.h>
++#include <asm/byteorder.h>
++#include <linux/interrupt.h>
++#include "scsi.h"
++#include "hosts.h"
++
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,2,14)
++#define       DECLARE_MUTEX_LOCKED(sem) struct semaphore sem = MUTEX_LOCKED
++#define       __set_current_state(state_value)                        \
++      do { current->state = (state_value); } while (0)
++static __inline void daemonize(void);
++static __inline void daemonize(void)
++{
++      struct fs_struct *fs;
++
++      exit_mm(current);
++      current->session = 1;
++      current->pgrp = 1;
++      current->tty = NULL;
++      exit_fs(current);       /* current->fs->count--; */
++      fs = init_task.fs;
++      current->fs = fs;
++      atomic_inc(&fs->count);
++}
++#endif
++/*
++ * These bits and pieces of keeping track of Linux versions
++ * and some of the various foo items for locking/unlocking
++ * gratefully borrowed from (amongst others) Doug Ledford
++ * and Gerard Roudier.
++ */
++
++#define       PWRB(p, o, r)   pci_write_config_byte(p->pci_dev, o, r)
++#define       PWRW(p, o, r)   pci_write_config_word(p->pci_dev, o, r)
++#define       PWRL(p, o, r)   pci_write_config_dword(p->pci_dev, o, r)
++#define       PRDW(p, o, r)   pci_read_config_word(p->pci_dev, o, r)
++#define       PRDD(p, o, r)   pci_read_config_dword(p->pci_dev, o, r)
++#define       PRDB(p, o, r)   pci_read_config_byte(p->pci_dev, o, r)
++
++#ifndef       bus_dvma_to_mem
++#if defined (__alpha__)
++#define bus_dvma_to_mem(p)              ((p) & 0xfffffffful)
++#else
++#define bus_dvma_to_mem(p)              (p)
++#endif
++#endif
++
++#if defined (__powerpc__)
++#undef        __pa
++#define       __pa(x) x
++#endif
++#if defined (__i386__) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#undef        __pa
++#define       __pa(x) x
++#endif
++#if defined (__sparc__) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#undef        __pa
++#define       __pa(x) x
++#endif
++#if defined (__alpha__) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#undef        __pa
++#define       __pa(x) x
++#endif
++
++/*
++ * Efficiency- get rid of SBus code && tests unless we need them.
++ */
++#if   defined(__sparcv9__ ) || defined(__sparc__)
++#define       ISP_SBUS_SUPPORTED      1
++#else
++#define       ISP_SBUS_SUPPORTED      0
++#endif
++
++#define       ISP_PLATFORM_VERSION_MAJOR      2
++#define       ISP_PLATFORM_VERSION_MINOR      1
++
++#ifndef       BIG_ENDIAN
++#define       BIG_ENDIAN      4321
++#endif
++#ifndef       LITTLE_ENDIAN
++#define       LITTLE_ENDIAN   1234
++#endif
++
++#ifdef        __BIG_ENDIAN
++#define       BYTE_ORDER      BIG_ENDIAN
++#endif
++#ifdef        __LITTLE_ENDIAN
++#define       BYTE_ORDER      LITTLE_ENDIAN
++#endif
++
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define       DMA_ADDR_T              unsigned long
++#define       QLA_SG_C(sg)            sg->length
++#define       QLA_SG_A(sg)            virt_to_bus(sg->address)
++#else
++#define       DMA_ADDR_T              dma_addr_t
++#define       QLA_SG_C(sg)            sg_dma_len(sg)
++#define       QLA_SG_A(sg)            sg_dma_address(sg)
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,4,16)
++#define       DMA_HTYPE_T             char *
++#define       QLA_HANDLE(cmd)         (cmd)->SCp.ptr
++#else
++#define       DMA_HTYPE_T             dma_addr_t
++#define       QLA_HANDLE(cmd)         (cmd)->SCp.dma_handle
++#endif
++#endif
++
++#define       HANDLE_LOOPSTATE_IN_OUTER_LAYERS        1
++#ifdef        min
++#undef        min
++#endif
++#ifdef        max
++#undef        max
++#endif
++
++
++/*
++ * Normally this should be taken care of by typedefs,
++ * but linux includes are a complete dog's breakfast.
++ */
++
++#define       u_int8_t        unsigned char
++#define       u_int16_t       unsigned short
++#define       u_int32_t       unsigned int
++#if BITS_PER_LONG == 64
++#define       u_int64_t       unsigned long
++#else
++#define       u_int64_t       unsigned long long
++#endif
++#define       int8_t          char
++#define       int16_t         short
++#define       int32_t         int
++#define       u_long          unsigned long
++#define       u_int           unsigned int
++#define       u_char          unsigned char
++typedef u_long vm_offset_t;
++
++#ifdef        LINUX_ISP_TARGET_MODE
++#define       DEFAULT_DEVICE_TYPE     3
++#define       NTGT_CMDS               256
++
++#define       _WIX(isp, b, ix)        (((b << 6)) | (ix >> 5))
++#define       _BIX(isp, ix)           (1 << (ix & 0x1f))
++
++#define       LUN_BTST(isp, b, ix)    \
++      (((isp)->isp_osinfo.lunbmap[_WIX(isp, b, ix)] & _BIX(isp, ix)) != 0)
++
++#define       LUN_BSET(isp, b, ix)    \
++      isp->isp_osinfo.lunbmap[_WIX(isp, b, ix)] |= _BIX(isp, ix)
++
++#define       LUN_BCLR(isp, b, ix)    \
++      isp->isp_osinfo.lunbmap[_WIX(isp, b, ix)] &= ~_BIX(isp, ix)
++
++#endif
++
++typedef struct {
++      enum {
++          ISP_THREAD_NIL=1,
++          ISP_THREAD_FC_RESCAN,
++          ISP_THREAD_REINIT,
++          ISP_THREAD_FW_CRASH_DUMP,
++          ISP_THREAD_EXIT
++      }                       thread_action;
++      struct semaphore *      thread_waiter;
++} isp_thread_action_t;
++#define       MAX_THREAD_ACTION       10
++
++union pstore;
++struct isposinfo {
++    struct ispsoftc *         isp_next;
++    struct Scsi_Host *                host;
++    Scsi_Cmnd                 *wqnext, *wqtail;
++    Scsi_Cmnd                 *dqnext, *dqtail;
++    union pstore              *storep;
++    char                      hbaname[16];
++    unsigned short            instance;
++    unsigned short            wqcnt;
++    unsigned short            wqhiwater;
++    unsigned short            hiwater;
++    struct timer_list         timer;
++    struct timer_list         _mbtimer;
++    struct semaphore          _mbox_sem;
++    struct semaphore          _mbox_c_sem;
++    struct semaphore          _fcs_sem;
++    spinlock_t                        slock;
++    unsigned volatile int
++              _downcnt        : 8,
++                              : 15,
++              _isopen         : 1,
++              _deadloop       : 1,
++              _draining       : 1,
++              _blocked        : 1,
++              _fcrswdog       : 1,
++              _fcrspend       : 1,
++              _dogactive      : 1,
++              _mbox_waiting   : 1,
++              _mbintsok       : 1;
++    void *                    misc[8]; /* private platform variant usage */
++    unsigned long             _iflags;
++    struct task_struct *      task_thread;
++    struct semaphore *                task_request;
++    struct semaphore *                task_ctl_sem;
++    spinlock_t                        tlock;
++    unsigned int              nt_actions;
++    unsigned int              device_id;
++    isp_thread_action_t               t_actions[MAX_THREAD_ACTION];
++#ifdef        LINUX_ISP_TARGET_MODE
++#define       TM_WANTED               0x08
++#define       TM_BUSY                 0x04
++#define       TM_TMODE_ENABLED        0x03
++    u_int32_t         rollinfo        : 16,
++                      rstatus         : 8,
++                                      : 3,
++                      hcb             : 1,
++                      tmflags         : 4;
++    struct semaphore          tgt_inisem;
++    struct semaphore *                rsemap;
++   /*
++    * This is very inefficient, but is in fact big enough
++    * to cover a complete bitmap for Fibre Channel, as well
++    * as the dual bus SCSI cards. This works out without
++    * overflow easily because the most you can enable
++    * for the SCSI cards is 64 luns (x 2 busses).
++    *
++    * For Fibre Channel, we can run the max luns up to 16384
++    * but we'll default to the minimum we can support here.
++    */
++#define       TM_MAX_LUN_FC           128
++#define       TM_MAX_LUN_SCSI         64
++    u_int32_t                 lunbmap[TM_MAX_LUN_FC >> 5];
++    struct tmd_cmd *          pending_t;
++    struct tmd_cmd *          tfreelist;
++    struct tmd_cmd *          pool;
++#endif
++};
++#define       mbtimer         isp_osinfo._mbtimer
++#define       dogactive       isp_osinfo._dogactive
++#define       mbox_sem        isp_osinfo._mbox_sem
++#define       mbox_c_sem      isp_osinfo._mbox_c_sem
++#define       fcs_sem         isp_osinfo._fcs_sem
++#define       mbintsok        isp_osinfo._mbintsok
++#define       mbox_waiting    isp_osinfo._mbox_waiting
++#define       isp_pbuf        isp_osinfo._pbuf
++#define       isp_fcrspend    isp_osinfo._fcrspend
++#define       isp_fcrswdog    isp_osinfo._fcrswdog
++#define       isp_blocked     isp_osinfo._blocked
++#define       isp_draining    isp_osinfo._draining
++#define       isp_downcnt     isp_osinfo._downcnt
++#define       isp_isopen      isp_osinfo._isopen
++#define       isp_deadloop    isp_osinfo._deadloop
++
++#define       iflags          isp_osinfo._iflags
++
++#define       SEND_THREAD_EVENT(isp, action, dowait)                          \
++if (isp->isp_osinfo.task_request) {                                   \
++    unsigned long flags;                                              \
++    spin_lock_irqsave(&isp->isp_osinfo.tlock, flags);                 \
++    if (isp->isp_osinfo.nt_actions >= MAX_THREAD_ACTION) {            \
++      spin_unlock_irqrestore(&isp->isp_osinfo.tlock, flags);          \
++      isp_prt(isp, ISP_LOGERR, "thread event overflow");              \
++    } else if (action == ISP_THREAD_FC_RESCAN && isp->isp_fcrspend) { \
++      spin_unlock_irqrestore(&isp->isp_osinfo.tlock, flags);          \
++    } else {                                                          \
++      DECLARE_MUTEX_LOCKED(sem);                                      \
++      isp_thread_action_t *tap;                                       \
++      tap = &isp->isp_osinfo.t_actions[isp->isp_osinfo.nt_actions++]; \
++      tap->thread_action = action;                                    \
++      if (dowait)                                                     \
++          tap->thread_waiter = &sem;                                  \
++      else                                                            \
++          tap->thread_waiter = 0;                                     \
++      if (action == ISP_THREAD_FC_RESCAN)                             \
++          isp->isp_fcrspend = 1;                                      \
++      up(isp->isp_osinfo.task_request);                               \
++      spin_unlock_irqrestore(&isp->isp_osinfo.tlock, flags);          \
++      if (dowait) {                                                   \
++          down(&sem);                                                 \
++          isp_prt(isp, ISP_LOGDEBUG1,                                 \
++              "action %d done from %p", action, &sem);                \
++      } else {                                                        \
++          isp_prt(isp, ISP_LOGDEBUG1,                                 \
++              "action %d sent", action);                              \
++      }                                                               \
++    }                                                                 \
++}
++
++/*
++ * Locking macros...
++ */
++#define       ISP_LOCK_INIT(isp)              spin_lock_init(&isp->isp_osinfo.slock)
++#define       ISP_LOCK_SOFTC(isp)             {                               \
++              unsigned long _flags;                                   \
++              spin_lock_irqsave(&isp->isp_osinfo.slock, _flags);      \
++              isp->iflags = _flags;                                   \
++      }
++#define       ISP_UNLK_SOFTC(isp)             {                               \
++              unsigned long _flags = isp->iflags;                     \
++              spin_unlock_irqrestore(&isp->isp_osinfo.slock, _flags); \
++      }
++
++#define       ISP_ILOCK_SOFTC                 ISP_LOCK_SOFTC
++#define       ISP_IUNLK_SOFTC                 ISP_UNLK_SOFTC
++#define       ISP_IGET_LK_SOFTC               ISP_LOCK_SOFTC
++#define       ISP_DROP_LK_SOFTC               ISP_UNLK_SOFTC
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define       ISP_LOCK_SCSI_DONE(isp)         {                               \
++              unsigned long _flags;                                   \
++              spin_lock_irqsave(&io_request_lock, _flags);            \
++              isp->iflags = _flags;                                   \
++      }
++#define       ISP_UNLK_SCSI_DONE(isp)         {                               \
++              unsigned long _flags = isp->iflags;                     \
++              spin_unlock_irqrestore(&io_request_lock, _flags);       \
++      }
++#else
++#define       ISP_LOCK_SCSI_DONE(isp)         do { } while(0)
++#define       ISP_UNLK_SCSI_DONE(isp)         do { } while(0)
++#endif
++#define       ISP_LOCKU_SOFTC                 ISP_ILOCK_SOFTC
++#define       ISP_UNLKU_SOFTC                 ISP_IUNLK_SOFTC
++#define       ISP_TLOCK_INIT(isp)             spin_lock_init(&isp->isp_osinfo.tlock)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#define       ISP_DRIVER_ENTRY_LOCK(isp)      spin_unlock_irq(&io_request_lock)
++#define       ISP_DRIVER_EXIT_LOCK(isp)       spin_lock_irq(&io_request_lock)
++#else
++#define       ISP_DRIVER_ENTRY_LOCK(isp)      \
++      spin_unlock_irq(isp->isp_osinfo.host->host_lock)
++#define       ISP_DRIVER_EXIT_LOCK(isp)       \
++      spin_lock_irq(isp->isp_osinfo.host->host_lock)
++#endif
++
++#define       ISP_MUST_POLL(isp)      (in_interrupt() || isp->mbintsok == 0)
++/*
++ * Misc SCSI defines
++ */
++#define       MSG_SIMPLE_Q_TAG        0x21
++#define       MSG_HEAD_OF_Q_TAG       0x22
++#define       MSG_ORDERED_Q_TAG       0x23
++
++/*
++ * Required Macros/Defines
++ */
++
++#define       INLINE                  __inline
++
++#if   LINUX_VERSION_CODE > KERNEL_VERSION(2,4,18) && \
++    defined(CONFIG_HIGHMEM64G) && !defined(LINUX_ISP_TARGET_MODE)
++#define       ISP_DAC_SUPPORTED       1
++#else
++#define       ISP_DAC_SUPPORTED       0
++#endif
++
++#define       ISP2100_SCRLEN          0x800
++
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define       MEMZERO                 _isp_memzero
++#define       MEMCPY                  _isp_memcpy
++#else
++#define       MEMZERO(b, a)           memset(b, 0, a)
++#define       MEMCPY                  memcpy
++#endif
++#define       SNPRINTF                isp_snprintf
++#define       USEC_DELAY              _isp_usec_delay
++#define       USEC_SLEEP(isp, x)                                              \
++              ISP_DROP_LK_SOFTC(isp);                                 \
++              __set_current_state(TASK_UNINTERRUPTIBLE);              \
++              (void) schedule_timeout(_usec_to_jiffies(x));           \
++              ISP_IGET_LK_SOFTC(isp)
++
++#define       NANOTIME_T              struct timeval
++/* for prior to 2.2.19, use do_gettimeofday, and, well, it'll be inaccurate */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
++#define       GET_NANOTIME(ptr)       \
++      (ptr)->tv_sec = 0, (ptr)->tv_usec = 0, get_fast_time(ptr)
++#else
++#define       GET_NANOTIME(ptr)       \
++      (ptr)->tv_sec = 0, (ptr)->tv_usec = 0, do_gettimeofday(ptr)
++#endif
++#define       GET_NANOSEC(x)          \
++  ((u_int64_t) ((((u_int64_t)(x)->tv_sec) * 1000000 + (x)->tv_usec)))
++#define       NANOTIME_SUB            _isp_microtime_sub
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++#define       MAXISPREQUEST(isp)      256
++#else
++#define       MAXISPREQUEST(isp)      ((IS_FC(isp) || IS_ULTRA2(isp))? 1024 : 256)
++#endif
++
++#if   defined(__i386__)
++#define       MEMORYBARRIER(isp, type, offset, size)  barrier()
++#elif defined(__alpha__)
++#define       MEMORYBARRIER(isp, type, offset, size)  mb()
++#elif defined(__sparc__)
++#define       MEMORYBARRIER(isp, type, offset, size)  mb()
++#elif defined(__powerpc__)
++#define       MEMORYBARRIER(isp, type, offset, size)  \
++      __asm__ __volatile__("eieio" ::: "memory")
++#else
++#  ifdef mb
++#    define   MEMORYBARRIER(isp, type, offset, size)  mb()
++#  else
++#    define   MEMORYBARRIER(isp, type, offset, size)  barrier()
++#  endif
++#endif
++
++#define       MBOX_ACQUIRE(isp)                                               \
++      /*                                                              \
++       * Try and acquire semaphore the easy way first-                \
++       * with our lock already held.                                  \
++       */                                                             \
++      if (down_trylock(&isp->mbox_sem)) {                             \
++          if (in_interrupt()) {                                       \
++              mbp->param[0] = MBOX_HOST_INTERFACE_ERROR;              \
++              isp_prt(isp, ISP_LOGERR, "cannot acquire MBOX sema");   \
++              return;                                                 \
++          }                                                           \
++          ISP_DROP_LK_SOFTC(isp);                                     \
++          down(&isp->mbox_sem);                                       \
++          ISP_IGET_LK_SOFTC(isp);                                     \
++      }
++
++#define       MBOX_WAIT_COMPLETE(isp)                                         \
++      if (ISP_MUST_POLL(isp)) {                                       \
++              int j, lim = 5000000;                                   \
++              if (isp->isp_mbxwrk0) {                                 \
++                      lim *= 12;                                      \
++              }                                                       \
++              for (j = 0; j < 5000000; j += 100) {                    \
++                      u_int16_t isr, sema, mbox;                      \
++                      if (isp->isp_mboxbsy == 0) {                    \
++                              break;                                  \
++                      }                                               \
++                      if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) {    \
++                              isp_intr(isp, isr, sema, mbox);         \
++                              if (isp->isp_mboxbsy == 0) {            \
++                                      break;                          \
++                              }                                       \
++                      }                                               \
++                      ISP_DROP_LK_SOFTC(isp);                         \
++                      udelay(100);                                    \
++                      ISP_IGET_LK_SOFTC(isp);                         \
++              }                                                       \
++              if (isp->isp_mboxbsy != 0) {                            \
++                      isp_prt(isp, ISP_LOGWARN,                       \
++                          "Polled Mailbox Command (0x%x) Timeout",    \
++                          isp->isp_lastmbxcmd);                       \
++                      isp->isp_mboxbsy = 0;                           \
++              }                                                       \
++      } else {                                                        \
++              int lim = (isp->isp_mbxwrk0)? 60 : 5;                   \
++              init_timer(&isp->mbtimer);                              \
++              isp->mbtimer.data = (unsigned long) isp;                \
++              isp->mbtimer.function = isplinux_mbtimer;               \
++              isp->mbtimer.expires = jiffies + (lim * HZ);            \
++              add_timer(&isp->mbtimer);                               \
++              isp->mbox_waiting = 1;                                  \
++              ISP_DROP_LK_SOFTC(isp);                                 \
++              down(&isp->mbox_c_sem);                                 \
++              ISP_IGET_LK_SOFTC(isp);                                 \
++              isp->mbox_waiting = 0;                                  \
++              del_timer(&isp->mbtimer);                               \
++              if (isp->isp_mboxbsy != 0) {                            \
++                      isp_prt(isp, ISP_LOGWARN,                       \
++                          "Interrupting Mailbox Command (0x%x) Timeout",\
++                          isp->isp_lastmbxcmd);                       \
++                      isp->isp_mboxbsy = 0;                           \
++              }                                                       \
++      }
++
++#define       MBOX_NOTIFY_COMPLETE(isp)                                       \
++      if (isp->mbox_waiting) {                                        \
++              isp->mbox_waiting = 0;                                  \
++              up(&isp->mbox_c_sem);                                   \
++      }                                                               \
++      isp->isp_mboxbsy = 0
++
++#define       MBOX_RELEASE(isp)       up(&isp->mbox_sem)
++
++#define       FC_SCRATCH_ACQUIRE(isp)                                         \
++      /*                                                              \
++       * Try and acquire semaphore the easy way first-                \
++       * with our lock already held.                                  \
++       */                                                             \
++      if (in_interrupt()) {                                           \
++              while (down_trylock(&isp->fcs_sem)) {                   \
++                      ISP_DROP_LK_SOFTC(isp);                         \
++                      USEC_DELAY(5000);                               \
++                      ISP_IGET_LK_SOFTC(isp);                         \
++              }                                                       \
++      } else {                                                        \
++          ISP_DROP_LK_SOFTC(isp);                                     \
++          down(&isp->fcs_sem);                                        \
++          ISP_IGET_LK_SOFTC(isp);                                     \
++      }
++
++#define       FC_SCRATCH_RELEASE(isp) up(&isp->fcs_sem)
++
++
++#ifndef       SCSI_GOOD
++#define       SCSI_GOOD       0x0
++#endif
++#ifndef       SCSI_CHECK
++#define       SCSI_CHECK      0x2
++#endif
++#ifndef       SCSI_BUSY
++#define       SCSI_BUSY       0x8
++#endif
++#ifndef       SCSI_QFULL
++#define       SCSI_QFULL      0x28
++#endif
++
++#define       XS_T                    Scsi_Cmnd
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#define       XS_HOST(Cmnd)           Cmnd->device->host
++#define       XS_ISP(Cmnd)            ((struct ispsoftc *) (Cmnd)->host->hostdata)
++#define       XS_CHANNEL(Cmnd)        (Cmnd)->channel
++#define       XS_TGT(Cmnd)            (Cmnd)->target
++#define       XS_LUN(Cmnd)            (Cmnd)->lun
++#else
++#define       XS_HOST(Cmnd)           Cmnd->device->host
++#define       XS_ISP(Cmnd)            \
++      ((struct ispsoftc *) (Cmnd)->device->host->hostdata)
++#define       XS_CHANNEL(Cmnd)        (Cmnd)->device->channel
++#define       XS_TGT(Cmnd)            (Cmnd)->device->id
++#define       XS_LUN(Cmnd)            (Cmnd)->device->lun
++#endif
++#define       XS_CDBP(Cmnd)           (Cmnd)->cmnd
++#define       XS_CDBLEN(Cmnd)         (Cmnd)->cmd_len
++#define       XS_XFRLEN(Cmnd)         (Cmnd)->request_bufflen
++#define       XS_TIME(Cmnd)           (Cmnd)->timeout
++#define       XS_RESID(Cmnd)          (Cmnd)->SCp.this_residual
++#define       XS_STSP(Cmnd)           (&(Cmnd)->SCp.Status)
++#define       XS_SNSP(Cmnd)           (Cmnd)->sense_buffer
++#define       XS_SNSLEN(Cmnd)         (sizeof (Cmnd)->sense_buffer)
++#define       XS_SNSKEY(Cmnd)         ((Cmnd)->sense_buffer[2] & 0xf)
++#define       XS_TAG_P(Cmnd)          (Cmnd->device->tagged_supported != 0)
++#define       XS_TAG_TYPE(xs)         REQFLAG_STAG
++
++#define       XS_SETERR(xs, v)        \
++      if ((v) == HBA_TGTBSY) { \
++              (xs)->SCp.Status = SCSI_BUSY; \
++      } else { \
++              (xs)->result &= ~0xff0000; \
++              (xs)->result |= ((v) << 16); \
++      }
++
++#     define  HBA_NOERROR             DID_OK
++#     define  HBA_BOTCH               DID_ERROR
++#     define  HBA_CMDTIMEOUT          DID_TIME_OUT
++#     define  HBA_SELTIMEOUT          DID_NO_CONNECT
++#     define  HBA_TGTBSY              123456 /* special handling */
++#     define  HBA_BUSRESET            DID_RESET
++#     define  HBA_ABORTED             DID_ABORT
++#     define  HBA_DATAOVR             DID_ERROR
++#     define  HBA_ARQFAIL             DID_ERROR
++
++#define       XS_ERR(xs)              host_byte((xs)->result)
++
++#define       XS_NOERR(xs)            host_byte((xs)->result) == DID_OK
++
++#define       XS_INITERR(xs)          (xs)->result = 0, (xs)->SCp.Status = 0
++
++#define       XS_SAVE_SENSE(Cmnd, sp)                         \
++      MEMCPY(&Cmnd->sense_buffer, sp->req_sense_data, \
++          min(sizeof Cmnd->sense_buffer, sp->req_sense_len))
++
++#define       XS_SET_STATE_STAT(a, b, c)
++
++#define       DEFAULT_IID(x)          7
++#define       DEFAULT_LOOPID(x)       111
++#define       DEFAULT_NODEWWN(isp)    (isp)->isp_defwwnn
++#define       DEFAULT_PORTWWN(isp)    (isp)->isp_defwwpn
++#define       DEFAULT_FRAME_SIZE(isp) \
++    (IS_SCSI(isp)? 0 : isp->isp_osinfo.storep->fibre_scsi.default_frame_size)
++#define       DEFAULT_EXEC_ALLOC(isp) \
++    (IS_SCSI(isp)? 0 : isp->isp_osinfo.storep->fibre_scsi.default_exec_alloc)
++#define       ISP_NODEWWN(isp)        (isp)->isp_nvramwwnn
++#define       ISP_PORTWWN(isp)        (isp)->isp_nvramwwpn
++
++#define       ISP_IOXPUT_8(isp, s, d)         *(d) = s
++#define       ISP_IOXPUT_16(isp, s, d)        *(d) = cpu_to_le16(s)
++#define       ISP_IOXPUT_32(isp, s, d)        *(d) = cpu_to_le32(s)
++
++#define       ISP_IOXGET_8(isp, s, d)         d = *(s)
++#define       ISP_IOXGET_16(isp, s, d)        d = le16_to_cpu(*((u_int16_t *)s))
++#define       ISP_IOXGET_32(isp, s, d)        d = le32_to_cpu(*((u_int32_t *)s))
++
++#define       ISP_SWIZZLE_NVRAM_WORD(isp, rp) *rp = le16_to_cpu(*rp)
++
++
++/*
++ * Includes of common header files
++ */
++#include "ispreg.h"
++#include "ispvar.h"
++#include "ispmbox.h"
++
++/*
++ * isp_osinfo definitions, extensions and shorthand.
++ */
++
++/*
++ * Parameter storage. The order of tags is important- sdparam && fcp
++ * must come first because isp->isp_params is set to point there...
++ */
++union pstore {
++    struct {
++      sdparam _sdp[2];        /* they need to be sequential */
++      u_char psc_opts[2][MAX_TARGETS];
++      u_char dutydone;
++    } parallel_scsi;
++    struct {
++      fcparam fcp;
++      u_int64_t wwnn;
++      u_int64_t wwpn;
++      u_int64_t nvram_wwnn;
++      u_int64_t nvram_wwpn;
++      u_int16_t default_frame_size;
++      u_int16_t default_exec_throttle;
++    } fibre_scsi;
++};
++#define       isp_next        isp_osinfo.isp_next
++#define       isp_name        isp_osinfo.hbaname
++#define       isp_host        isp_osinfo.host
++#define       isp_unit        isp_osinfo.instance
++#define       isp_psco        isp_osinfo.storep->parallel_scsi.psc_opts
++#define       isp_dutydone    isp_osinfo.storep->parallel_scsi.dutydone
++#define       isp_defwwnn     isp_osinfo.storep->fibre_scsi.wwnn
++#define       isp_defwwpn     isp_osinfo.storep->fibre_scsi.wwpn
++#define       isp_nvramwwnn   isp_osinfo.storep->fibre_scsi.nvram_wwnn
++#define       isp_nvramwwpn   isp_osinfo.storep->fibre_scsi.nvram_wwpn
++
++/*
++ * Driver prototypes..
++ */
++void isplinux_timer(unsigned long);
++void isplinux_mbtimer(unsigned long);
++irqreturn_t isplinux_intr(int, void *, struct pt_regs *);
++void isplinux_common_init(struct ispsoftc *);
++#ifdef        CONFIG_PROC_FS
++void isplinux_init_proc(struct ispsoftc *);
++void isplinux_undo_proc(struct ispsoftc *);
++#endif
++void isplinux_reinit(struct ispsoftc *);
++void isplinux_sqd(struct Scsi_Host *, Scsi_Device *);
++
++int isp_drain_reset(struct ispsoftc *, char *);
++int isp_drain(struct ispsoftc *, char *);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++static INLINE void _isp_memcpy(void *, void *, size_t);
++static INLINE void _isp_memzero(void *,  size_t);
++#endif
++static INLINE u_int64_t _isp_microtime_sub(struct timeval *, struct timeval *);
++static INLINE void _isp_usec_delay(unsigned int);
++static INLINE unsigned long _usec_to_jiffies(unsigned int);
++
++int isplinux_proc_info(char *, char **, off_t, int, int, int);
++int isplinux_detect(Scsi_Host_Template *);
++int isplinux_release(struct Scsi_Host *);
++#define       ISPLINUX_RELEASE        isplinux_release
++const char *isplinux_info(struct Scsi_Host *);
++int isplinux_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++int isplinux_biosparam(Disk *, kdev_t, int[]);
++#else
++int isplinux_biosparam(struct scsi_device *, struct block_device *,
++    sector_t, int[]); 
++#endif
++
++
++/*
++ * Driver wide data...
++ */
++extern int isp_debug;
++extern int isp_unit_seed;
++extern int isp_disable;
++extern int isp_nofwreload;
++extern int isp_nonvram;
++extern int isp_fcduplex;
++extern struct ispsoftc *isplist;
++extern const char *class3_roles[4];
++
++/*
++ * Platform private flags
++ */
++#ifndef NULL
++#define NULL ((void *) 0)
++#endif
++
++#define       ISP_WATCH_TIME          HZ
++
++#ifndef       min
++#define min(a,b) (((a)<(b))?(a):(b))
++#endif
++#ifndef       max
++#define       max(a, b)               (((a) > (b)) ? (a) : (b))
++#endif
++#ifndef       roundup
++#define       roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
++#endif
++#ifndef       ARGSUSED
++#define       ARGSUSED(x)     x = x
++#endif
++
++
++
++
++/*
++ * Platform specific 'inline' or support functions
++ */
++
++#ifdef        __sparc__
++#define       _SBSWAP(isp, b, c)                                              \
++      if (isp->isp_bustype == ISP_BT_SBUS) {                          \
++              u_int8_t tmp = b;                                       \
++              b = c;                                                  \
++              c = tmp;                                                \
++      }
++#else
++#define       _SBSWAP(a, b, c)
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
++static INLINE void
++_isp_memcpy(void *to, void *from, size_t amt)
++{
++      unsigned char *x = to; unsigned char *y = from;
++      while (amt-- != 0) *x++ = *y++;
++}
++
++static INLINE void
++_isp_memzero(void *to, size_t amt)
++{
++      unsigned char *x = to;
++      while (amt-- != 0) *x++ = 0;
++}
++
++static INLINE unsigned long IspOrder(int);
++static INLINE unsigned long
++IspOrder(int nelem)
++{
++    unsigned long order, rsize;
++
++    order = 0;
++    rsize = PAGE_SIZE;
++    while (rsize < (unsigned long) ISP_QUEUE_SIZE(nelem)) {
++      order++;
++      rsize <<= 1;
++    }
++    return (order);
++}
++#endif
++
++static INLINE u_int64_t
++_isp_microtime_sub(struct timeval *b, struct timeval *a)
++{
++      u_int64_t elapsed;
++      struct timeval x = *b;
++      x.tv_sec -= a->tv_sec;
++      x.tv_usec -= a->tv_usec;
++        if (x.tv_usec < 0) {
++                x.tv_sec--;
++                x.tv_usec += 1000000;
++        }
++        if (x.tv_usec >= 1000000) {
++                x.tv_sec++;
++                x.tv_usec -= 1000000;
++        }
++      elapsed = GET_NANOSEC(&x);
++      if (elapsed == 0)
++              elapsed++;
++      if ((int64_t) elapsed < 0)      /* !!!! */
++              return (1000);
++      return (elapsed * 1000);
++}
++
++static INLINE void
++_isp_usec_delay(unsigned int usecs)
++{
++    while (usecs > 1000) {
++      mdelay(1);
++      usecs -= 1000;
++    }
++    if (usecs)
++      udelay(usecs);
++}
++
++static INLINE unsigned long
++_usec_to_jiffies(unsigned int usecs)
++{
++      struct timespec lt;
++      if (usecs == 0)
++              usecs++;
++      lt.tv_sec = 0;
++      lt.tv_nsec = usecs * 1000;
++      return (timespec_to_jiffies(&lt));
++}
++
++#define       GetPages(a)     __get_dma_pages(GFP_ATOMIC|GFP_DMA, a)
++#define       RlsPages(a, b)  free_pages((unsigned long) a, b)
++
++char *isp_snprintf(char *, size_t, const char *, ...);
++
++static INLINE void *isp_kalloc(size_t, int);
++static INLINE void *isp_kzalloc(size_t, int);
++static INLINE void isp_kfree(void *, size_t);
++
++static INLINE void *
++isp_kalloc(size_t size, int flags)
++{
++    void *ptr;
++    if (size > PAGE_SIZE) {
++        ptr = vmalloc(size);
++    } else {
++        ptr = kmalloc(size, flags);
++    }
++    return (ptr);
++}
++
++static INLINE void *
++isp_kzalloc(size_t size, int flags)
++{
++    void *ptr = isp_kalloc(size, flags);
++    if (ptr != NULL){
++        memset(ptr, 0, size);
++    }
++    return (ptr);
++}
++
++static INLINE void
++isp_kfree(void *ptr, size_t size)
++{
++    if (size > PAGE_SIZE) {
++        vfree(ptr);
++    } else {
++        kfree(ptr);
++    }
++}
++
++/*
++ * Common inline functions
++ */
++
++#include "isp_inline.h"
++
++#ifdef        ISP_TARGET_MODE
++void isp_attach_target(ispsoftc_t *);
++void isp_detach_target(ispsoftc_t *);
++int isp_target_async(struct ispsoftc *, int, int);
++int isp_target_notify(struct ispsoftc *, void *, u_int16_t *);
++#endif
++#ifdef        LINUX_ISP_TARGET_MODE
++int isp_en_dis_lun(struct ispsoftc *, int, int, int, int);
++#endif
++/*
++ * Config data
++ */
++
++int isplinux_abort(Scsi_Cmnd *);
++int isplinux_bdr(Scsi_Cmnd *);
++int isplinux_sreset(Scsi_Cmnd *);
++int isplinux_hreset(Scsi_Cmnd *);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#define QLOGICISP {                                                   \
++      next:                           NULL,                           \
++      module:                         NULL,                           \
++      proc_info:                      isplinux_proc_info,             \
++      name:                           "Qlogic ISP 10X0/2X00",         \
++      detect:                         isplinux_detect,                \
++      release:                        ISPLINUX_RELEASE,               \
++      info:                           isplinux_info,                  \
++      queuecommand:                   isplinux_queuecommand,          \
++      use_new_eh_code:                1,                              \
++      eh_abort_handler:               isplinux_abort,                 \
++      eh_device_reset_handler:        isplinux_bdr,                   \
++      eh_bus_reset_handler:           isplinux_sreset,                \
++      eh_host_reset_handler:          isplinux_hreset,                \
++      bios_param:                     isplinux_biosparam,             \
++      can_queue:                      1,                              \
++      sg_tablesize:                   SG_ALL,                         \
++      use_clustering:                 ENABLE_CLUSTERING,              \
++      cmd_per_lun:                    1                               \
++}
++#else
++#define QLOGICISP {                                                   \
++      module:                         NULL,                           \
++      proc_info:                      isplinux_proc_info,             \
++      name:                           "Qlogic ISP 10X0/2X00",         \
++      detect:                         isplinux_detect,                \
++      release:                        ISPLINUX_RELEASE,               \
++      info:                           isplinux_info,                  \
++      queuecommand:                   isplinux_queuecommand,          \
++      eh_abort_handler:               isplinux_abort,                 \
++      eh_device_reset_handler:        isplinux_bdr,                   \
++      eh_bus_reset_handler:           isplinux_sreset,                \
++      eh_host_reset_handler:          isplinux_hreset,                \
++      bios_param:                     isplinux_biosparam,             \
++      can_queue:                      1,                              \
++      sg_tablesize:                   SG_ALL,                         \
++      use_clustering:                 ENABLE_CLUSTERING,              \
++      cmd_per_lun:                    1,                              \
++      slave_configure:                isplinux_slave_configure,       \
++}
++#endif
++/*
++ * mode: c
++ * Local variables:
++ * c-indent-level: 4
++ * c-brace-imaginary-offset: 0
++ * c-brace-offset: -4
++ * c-argdecl-indent: 4
++ * c-label-offset: -4
++ * c-continued-statement-offset: 4
++ * c-continued-brace-offset: 0
++ * End:
++ */
++#endif /* _ISP_LINUX_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/ispmbox.h      2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,938 @@
++/* @(#)ispmbox.h 1.24 */
++/*
++ * Mailbox and Queue Entry Definitions for for Qlogic ISP SCSI adapters.
++ *
++ * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ */
++#ifndef       _ISPMBOX_H
++#define       _ISPMBOX_H
++
++/*
++ * Mailbox Command Opcodes
++ */
++#define MBOX_NO_OP                    0x0000
++#define MBOX_LOAD_RAM                 0x0001
++#define MBOX_EXEC_FIRMWARE            0x0002
++#define MBOX_DUMP_RAM                 0x0003
++#define MBOX_WRITE_RAM_WORD           0x0004
++#define MBOX_READ_RAM_WORD            0x0005
++#define MBOX_MAILBOX_REG_TEST         0x0006
++#define MBOX_VERIFY_CHECKSUM          0x0007
++#define MBOX_ABOUT_FIRMWARE           0x0008
++                                      /*   9 */
++                                      /*   a */
++                                      /*   b */
++                                      /*   c */
++                                      /*   d */
++#define MBOX_CHECK_FIRMWARE           0x000e
++#define       MBOX_READ_RAM_WORD_EXTENDED     0x000f
++#define MBOX_INIT_REQ_QUEUE           0x0010
++#define MBOX_INIT_RES_QUEUE           0x0011
++#define MBOX_EXECUTE_IOCB             0x0012
++#define MBOX_WAKE_UP                  0x0013
++#define MBOX_STOP_FIRMWARE            0x0014
++#define MBOX_ABORT                    0x0015
++#define MBOX_ABORT_DEVICE             0x0016
++#define MBOX_ABORT_TARGET             0x0017
++#define MBOX_BUS_RESET                        0x0018
++#define MBOX_STOP_QUEUE                       0x0019
++#define MBOX_START_QUEUE              0x001a
++#define MBOX_SINGLE_STEP_QUEUE                0x001b
++#define MBOX_ABORT_QUEUE              0x001c
++#define MBOX_GET_DEV_QUEUE_STATUS     0x001d
++                                      /*  1e */
++#define MBOX_GET_FIRMWARE_STATUS      0x001f
++#define MBOX_GET_INIT_SCSI_ID         0x0020
++#define MBOX_GET_SELECT_TIMEOUT               0x0021
++#define MBOX_GET_RETRY_COUNT          0x0022
++#define MBOX_GET_TAG_AGE_LIMIT                0x0023
++#define MBOX_GET_CLOCK_RATE           0x0024
++#define MBOX_GET_ACT_NEG_STATE                0x0025
++#define MBOX_GET_ASYNC_DATA_SETUP_TIME        0x0026
++#define MBOX_GET_SBUS_PARAMS          0x0027
++#define               MBOX_GET_PCI_PARAMS     MBOX_GET_SBUS_PARAMS
++#define MBOX_GET_TARGET_PARAMS                0x0028
++#define MBOX_GET_DEV_QUEUE_PARAMS     0x0029
++#define       MBOX_GET_RESET_DELAY_PARAMS     0x002a
++                                      /*  2b */
++                                      /*  2c */
++                                      /*  2d */
++                                      /*  2e */
++                                      /*  2f */
++#define MBOX_SET_INIT_SCSI_ID         0x0030
++#define MBOX_SET_SELECT_TIMEOUT               0x0031
++#define MBOX_SET_RETRY_COUNT          0x0032
++#define MBOX_SET_TAG_AGE_LIMIT                0x0033
++#define MBOX_SET_CLOCK_RATE           0x0034
++#define MBOX_SET_ACT_NEG_STATE                0x0035
++#define MBOX_SET_ASYNC_DATA_SETUP_TIME        0x0036
++#define MBOX_SET_SBUS_CONTROL_PARAMS  0x0037
++#define               MBOX_SET_PCI_PARAMETERS 0x0037
++#define MBOX_SET_TARGET_PARAMS                0x0038
++#define MBOX_SET_DEV_QUEUE_PARAMS     0x0039
++#define       MBOX_SET_RESET_DELAY_PARAMS     0x003a
++                                      /*  3b */
++                                      /*  3c */
++                                      /*  3d */
++                                      /*  3e */
++                                      /*  3f */
++#define       MBOX_RETURN_BIOS_BLOCK_ADDR     0x0040
++#define       MBOX_WRITE_FOUR_RAM_WORDS       0x0041
++#define       MBOX_EXEC_BIOS_IOCB             0x0042
++#define       MBOX_SET_FW_FEATURES            0x004a
++#define       MBOX_GET_FW_FEATURES            0x004b
++#define               FW_FEATURE_FAST_POST    0x1
++#define               FW_FEATURE_LVD_NOTIFY   0x2
++#define               FW_FEATURE_RIO_32BIT    0x4
++#define               FW_FEATURE_RIO_16BIT    0x8
++
++#define       MBOX_INIT_REQ_QUEUE_A64         0x0052
++#define       MBOX_INIT_RES_QUEUE_A64         0x0053
++
++#define       MBOX_ENABLE_TARGET_MODE         0x0055
++#define               ENABLE_TARGET_FLAG      0x8000
++#define               ENABLE_TQING_FLAG       0x0004
++#define               ENABLE_MANDATORY_DISC   0x0002
++#define       MBOX_GET_TARGET_STATUS          0x0056
++
++/* These are for the ISP2X00 FC cards */
++#define       MBOX_GET_LOOP_ID                0x0020
++#define       MBOX_GET_FIRMWARE_OPTIONS       0x0028
++#define       MBOX_SET_FIRMWARE_OPTIONS       0x0038
++#define       MBOX_GET_RESOURCE_COUNT         0x0042
++#define       MBOX_ENHANCED_GET_PDB           0x0047
++#define       MBOX_EXEC_COMMAND_IOCB_A64      0x0054
++#define       MBOX_INIT_FIRMWARE              0x0060
++#define       MBOX_GET_INIT_CONTROL_BLOCK     0x0061
++#define       MBOX_INIT_LIP                   0x0062
++#define       MBOX_GET_FC_AL_POSITION_MAP     0x0063
++#define       MBOX_GET_PORT_DB                0x0064
++#define       MBOX_CLEAR_ACA                  0x0065
++#define       MBOX_TARGET_RESET               0x0066
++#define       MBOX_CLEAR_TASK_SET             0x0067
++#define       MBOX_ABORT_TASK_SET             0x0068
++#define       MBOX_GET_FW_STATE               0x0069
++#define       MBOX_GET_PORT_NAME              0x006A
++#define       MBOX_GET_LINK_STATUS            0x006B
++#define       MBOX_INIT_LIP_RESET             0x006C
++#define       MBOX_SEND_SNS                   0x006E
++#define       MBOX_FABRIC_LOGIN               0x006F
++#define       MBOX_SEND_CHANGE_REQUEST        0x0070
++#define       MBOX_FABRIC_LOGOUT              0x0071
++#define       MBOX_INIT_LIP_LOGIN             0x0072
++
++#define       MBOX_DRIVER_HEARTBEAT           0x005B
++#define       MBOX_FW_HEARTBEAT               0x005C
++
++#define       MBOX_GET_SET_DATA_RATE          0x005D  /* 23XX only */
++#define               MBGSD_GET_RATE  0
++#define               MBGSD_SET_RATE  1
++#define               MBGSD_ONEGB     0
++#define               MBGSD_TWOGB     1
++#define               MBGSD_AUTO      2
++
++
++#define       ISP2100_SET_PCI_PARAM           0x00ff
++
++#define       MBOX_BUSY                       0x04
++
++typedef struct {
++      u_int16_t param[8];
++} mbreg_t;
++
++/*
++ * Mailbox Command Complete Status Codes
++ */
++#define       MBOX_COMMAND_COMPLETE           0x4000
++#define       MBOX_INVALID_COMMAND            0x4001
++#define       MBOX_HOST_INTERFACE_ERROR       0x4002
++#define       MBOX_TEST_FAILED                0x4003
++#define       MBOX_COMMAND_ERROR              0x4005
++#define       MBOX_COMMAND_PARAM_ERROR        0x4006
++#define       MBOX_PORT_ID_USED               0x4007
++#define       MBOX_LOOP_ID_USED               0x4008
++#define       MBOX_ALL_IDS_USED               0x4009
++#define       MBOX_NOT_LOGGED_IN              0x400A
++#define       MBLOGALL                        0x000f
++#define       MBLOGNONE                       0x0000
++#define       MBLOGMASK(x)                    ((x) & 0xf)
++
++/*
++ * Asynchronous event status codes
++ */
++#define       ASYNC_BUS_RESET                 0x8001
++#define       ASYNC_SYSTEM_ERROR              0x8002
++#define       ASYNC_RQS_XFER_ERR              0x8003
++#define       ASYNC_RSP_XFER_ERR              0x8004
++#define       ASYNC_QWAKEUP                   0x8005
++#define       ASYNC_TIMEOUT_RESET             0x8006
++#define       ASYNC_DEVICE_RESET              0x8007
++#define       ASYNC_EXTMSG_UNDERRUN           0x800A
++#define       ASYNC_SCAM_INT                  0x800B
++#define       ASYNC_HUNG_SCSI                 0x800C
++#define       ASYNC_KILLED_BUS                0x800D
++#define       ASYNC_BUS_TRANSIT               0x800E  /* LVD -> HVD, eg. */
++#define       ASYNC_LIP_OCCURRED              0x8010
++#define       ASYNC_LOOP_UP                   0x8011
++#define       ASYNC_LOOP_DOWN                 0x8012
++#define       ASYNC_LOOP_RESET                0x8013
++#define       ASYNC_PDB_CHANGED               0x8014
++#define       ASYNC_CHANGE_NOTIFY             0x8015
++#define       ASYNC_LIP_F8                    0x8016
++#define       ASYNC_CMD_CMPLT                 0x8020
++#define       ASYNC_CTIO_DONE                 0x8021
++#define       ASYNC_IP_XMIT_DONE              0x8022
++#define       ASYNC_IP_RECV_DONE              0x8023
++#define       ASYNC_IP_BROADCAST              0x8024
++#define       ASYNC_IP_RCVQ_LOW               0x8025
++#define       ASYNC_IP_RCVQ_EMPTY             0x8026
++#define       ASYNC_IP_RECV_DONE_ALIGNED      0x8027
++#define       ASYNC_PTPMODE                   0x8030
++#define       ASYNC_RIO1                      0x8031
++#define       ASYNC_RIO2                      0x8032
++#define       ASYNC_RIO3                      0x8033
++#define       ASYNC_RIO4                      0x8034
++#define       ASYNC_RIO5                      0x8035
++#define       ASYNC_CONNMODE                  0x8036
++#define               ISP_CONN_LOOP           1
++#define               ISP_CONN_PTP            2
++#define               ISP_CONN_BADLIP         3
++#define               ISP_CONN_FATAL          4
++#define               ISP_CONN_LOOPBACK       5
++#define       ASYNC_RIO_RESP                  0x8040
++#define       ASYNC_RIO_COMP                  0x8042
++/*
++ * 2.01.31 2200 Only. Need Bit 13 in Mailbox 1 for Set Firmware Options
++ * mailbox command to enable this.
++ */
++#define       ASYNC_QFULL_SENT                0x8049
++
++/*
++ * Mailbox Usages
++ */
++
++#define       WRITE_REQUEST_QUEUE_IN_POINTER(isp, value)      \
++      ISP_WRITE(isp, isp->isp_rqstinrp, value)
++
++#define       READ_REQUEST_QUEUE_OUT_POINTER(isp)             \
++      ISP_READ(isp, isp->isp_rqstoutrp)
++
++#define       READ_RESPONSE_QUEUE_IN_POINTER(isp)             \
++      ISP_READ(isp, isp->isp_respinrp)
++
++#define       WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, value)    \
++      ISP_WRITE(isp, isp->isp_respoutrp, value)
++
++/*
++ * Command Structure Definitions
++ */
++
++typedef struct {
++      u_int32_t       ds_base;
++      u_int32_t       ds_count;
++} ispds_t;
++
++typedef struct {
++      u_int32_t       ds_base;
++      u_int32_t       ds_basehi;
++      u_int32_t       ds_count;
++} ispds64_t;
++
++#define       DSTYPE_32BIT    0
++#define       DSTYPE_64BIT    1
++typedef struct {
++      u_int16_t       ds_type;        /* 0-> ispds_t, 1-> ispds64_t */
++      u_int32_t       ds_segment;     /* unused */
++      u_int32_t       ds_base;        /* 32 bit address of DSD list */
++} ispdslist_t;
++
++
++/*
++ * These elements get swizzled around for SBus instances.
++ */
++#define       ISP_SWAP8(a, b) {               \
++      u_int8_t tmp;                   \
++      tmp = a;                        \
++      a = b;                          \
++      b = tmp;                        \
++}
++typedef struct {
++      u_int8_t        rqs_entry_type;
++      u_int8_t        rqs_entry_count;
++      u_int8_t        rqs_seqno;
++      u_int8_t        rqs_flags;
++} isphdr_t;
++
++/* RQS Flag definitions */
++#define       RQSFLAG_CONTINUATION    0x01
++#define       RQSFLAG_FULL            0x02
++#define       RQSFLAG_BADHEADER       0x04
++#define       RQSFLAG_BADPACKET       0x08
++
++/* RQS entry_type definitions */
++#define       RQSTYPE_REQUEST         0x01
++#define       RQSTYPE_DATASEG         0x02
++#define       RQSTYPE_RESPONSE        0x03
++#define       RQSTYPE_MARKER          0x04
++#define       RQSTYPE_CMDONLY         0x05
++#define       RQSTYPE_ATIO            0x06    /* Target Mode */
++#define       RQSTYPE_CTIO            0x07    /* Target Mode */
++#define       RQSTYPE_SCAM            0x08
++#define       RQSTYPE_A64             0x09
++#define       RQSTYPE_A64_CONT        0x0a
++#define       RQSTYPE_ENABLE_LUN      0x0b    /* Target Mode */
++#define       RQSTYPE_MODIFY_LUN      0x0c    /* Target Mode */
++#define       RQSTYPE_NOTIFY          0x0d    /* Target Mode */
++#define       RQSTYPE_NOTIFY_ACK      0x0e    /* Target Mode */
++#define       RQSTYPE_CTIO1           0x0f    /* Target Mode */
++#define       RQSTYPE_STATUS_CONT     0x10
++#define       RQSTYPE_T2RQS           0x11
++#define       RQSTYPE_IP_XMIT         0x13
++#define       RQSTYPE_T4RQS           0x15
++#define       RQSTYPE_ATIO2           0x16    /* Target Mode */
++#define       RQSTYPE_CTIO2           0x17    /* Target Mode */
++#define       RQSTYPE_CSET0           0x18
++#define       RQSTYPE_T3RQS           0x19
++#define       RQSTYPE_IP_XMIT_64      0x1b
++#define       RQSTYPE_CTIO4           0x1e    /* Target Mode */
++#define       RQSTYPE_CTIO3           0x1f    /* Target Mode */
++#define       RQSTYPE_RIO1            0x21
++#define       RQSTYPE_RIO2            0x22
++#define       RQSTYPE_IP_RECV         0x23
++#define       RQSTYPE_IP_RECV_CONT    0x24
++
++
++#define       ISP_RQDSEG      4
++typedef struct {
++      isphdr_t        req_header;
++      u_int32_t       req_handle;
++      u_int8_t        req_lun_trn;
++      u_int8_t        req_target;
++      u_int16_t       req_cdblen;
++#define       req_modifier    req_cdblen      /* marker packet */
++      u_int16_t       req_flags;
++      u_int16_t       req_reserved;
++      u_int16_t       req_time;
++      u_int16_t       req_seg_count;
++      u_int8_t        req_cdb[12];
++      ispds_t         req_dataseg[ISP_RQDSEG];
++} ispreq_t;
++
++#define       ispreq64_t      ispreqt3_t      /* same as.... */
++#define       ISP_RQDSEG_A64  2
++
++/*
++ * A request packet can also be a marker packet.
++ */
++#define SYNC_DEVICE   0
++#define SYNC_TARGET   1
++#define SYNC_ALL      2
++
++#define       ISP_RQDSEG_T2           3
++typedef struct {
++      isphdr_t        req_header;
++      u_int32_t       req_handle;
++      u_int8_t        req_lun_trn;
++      u_int8_t        req_target;
++      u_int16_t       req_scclun;
++      u_int16_t       req_flags;
++      u_int16_t       _res2;
++      u_int16_t       req_time;
++      u_int16_t       req_seg_count;
++      u_int8_t        req_cdb[16];
++      u_int32_t       req_totalcnt;
++      ispds_t         req_dataseg[ISP_RQDSEG_T2];
++} ispreqt2_t;
++
++#define       ISP_RQDSEG_T3           2
++typedef struct {
++      isphdr_t        req_header;
++      u_int32_t       req_handle;
++      u_int8_t        req_lun_trn;
++      u_int8_t        req_target;
++      u_int16_t       req_scclun;
++      u_int16_t       req_flags;
++      u_int16_t       _res2;
++      u_int16_t       req_time;
++      u_int16_t       req_seg_count;
++      u_int8_t        req_cdb[16];
++      u_int32_t       req_totalcnt;
++      ispds64_t       req_dataseg[ISP_RQDSEG_T3];
++} ispreqt3_t;
++
++/* req_flag values */
++#define       REQFLAG_NODISCON        0x0001
++#define       REQFLAG_HTAG            0x0002
++#define       REQFLAG_OTAG            0x0004
++#define       REQFLAG_STAG            0x0008
++#define       REQFLAG_TARGET_RTN      0x0010
++
++#define       REQFLAG_NODATA          0x0000
++#define       REQFLAG_DATA_IN         0x0020
++#define       REQFLAG_DATA_OUT        0x0040
++#define       REQFLAG_DATA_UNKNOWN    0x0060
++
++#define       REQFLAG_DISARQ          0x0100
++#define       REQFLAG_FRC_ASYNC       0x0200
++#define       REQFLAG_FRC_SYNC        0x0400
++#define       REQFLAG_FRC_WIDE        0x0800
++#define       REQFLAG_NOPARITY        0x1000
++#define       REQFLAG_STOPQ           0x2000
++#define       REQFLAG_XTRASNS         0x4000
++#define       REQFLAG_PRIORITY        0x8000
++
++typedef struct {
++      isphdr_t        req_header;
++      u_int32_t       req_handle;
++      u_int8_t        req_lun_trn;
++      u_int8_t        req_target;
++      u_int16_t       req_cdblen;
++      u_int16_t       req_flags;
++      u_int16_t       _res1;
++      u_int16_t       req_time;
++      u_int16_t       req_seg_count;
++      u_int8_t        req_cdb[44];
++} ispextreq_t;
++
++#define       ISP_CDSEG       7
++typedef struct {
++      isphdr_t        req_header;
++      u_int32_t       _res1;
++      ispds_t         req_dataseg[ISP_CDSEG];
++} ispcontreq_t;
++
++#define       ISP_CDSEG64     5
++typedef struct {
++      isphdr_t        req_header;
++      ispds64_t       req_dataseg[ISP_CDSEG64];
++} ispcontreq64_t;
++
++typedef struct {
++      isphdr_t        req_header;
++      u_int32_t       req_handle;
++      u_int16_t       req_scsi_status;
++      u_int16_t       req_completion_status;
++      u_int16_t       req_state_flags;
++      u_int16_t       req_status_flags;
++      u_int16_t       req_time;
++#define       req_response_len        req_time        /* FC only */
++      u_int16_t       req_sense_len;
++      u_int32_t       req_resid;
++      u_int8_t        req_response[8];        /* FC only */
++      u_int8_t        req_sense_data[32];
++} ispstatusreq_t;
++
++typedef struct {
++      isphdr_t        req_header;
++      u_int8_t        req_sense_data[60];
++} ispstatus_cont_t;
++
++/* 
++ * For Qlogic 2X00, the high order byte of SCSI status has
++ * additional meaning.
++ */
++#define       RQCS_RU 0x800   /* Residual Under */
++#define       RQCS_RO 0x400   /* Residual Over */
++#define       RQCS_RESID      (RQCS_RU|RQCS_RO)
++#define       RQCS_SV 0x200   /* Sense Length Valid */
++#define       RQCS_RV 0x100   /* FCP Response Length Valid */
++
++/* 
++ * Completion Status Codes.
++ */
++#define RQCS_COMPLETE                 0x0000
++#define RQCS_DMA_ERROR                        0x0002
++#define RQCS_RESET_OCCURRED           0x0004
++#define RQCS_ABORTED                  0x0005
++#define RQCS_TIMEOUT                  0x0006
++#define RQCS_DATA_OVERRUN             0x0007
++#define RQCS_DATA_UNDERRUN            0x0015
++#define       RQCS_QUEUE_FULL                 0x001C
++
++/* 1X00 Only Completion Codes */
++#define RQCS_INCOMPLETE                       0x0001
++#define RQCS_TRANSPORT_ERROR          0x0003
++#define RQCS_COMMAND_OVERRUN          0x0008
++#define RQCS_STATUS_OVERRUN           0x0009
++#define RQCS_BAD_MESSAGE              0x000a
++#define RQCS_NO_MESSAGE_OUT           0x000b
++#define RQCS_EXT_ID_FAILED            0x000c
++#define RQCS_IDE_MSG_FAILED           0x000d
++#define RQCS_ABORT_MSG_FAILED         0x000e
++#define RQCS_REJECT_MSG_FAILED                0x000f
++#define RQCS_NOP_MSG_FAILED           0x0010
++#define RQCS_PARITY_ERROR_MSG_FAILED  0x0011
++#define RQCS_DEVICE_RESET_MSG_FAILED  0x0012
++#define RQCS_ID_MSG_FAILED            0x0013
++#define RQCS_UNEXP_BUS_FREE           0x0014
++#define       RQCS_XACT_ERR1                  0x0018
++#define       RQCS_XACT_ERR2                  0x0019
++#define       RQCS_XACT_ERR3                  0x001A
++#define       RQCS_BAD_ENTRY                  0x001B
++#define       RQCS_PHASE_SKIPPED              0x001D
++#define       RQCS_ARQS_FAILED                0x001E
++#define       RQCS_WIDE_FAILED                0x001F
++#define       RQCS_SYNCXFER_FAILED            0x0020
++#define       RQCS_LVD_BUSERR                 0x0021
++
++/* 2X00 Only Completion Codes */
++#define       RQCS_PORT_UNAVAILABLE           0x0028
++#define       RQCS_PORT_LOGGED_OUT            0x0029
++#define       RQCS_PORT_CHANGED               0x002A
++#define       RQCS_PORT_BUSY                  0x002B
++
++/*
++ * 1X00 specific State Flags 
++ */
++#define RQSF_GOT_BUS                  0x0100
++#define RQSF_GOT_TARGET                       0x0200
++#define RQSF_SENT_CDB                 0x0400
++#define RQSF_XFRD_DATA                        0x0800
++#define RQSF_GOT_STATUS                       0x1000
++#define RQSF_GOT_SENSE                        0x2000
++#define       RQSF_XFER_COMPLETE              0x4000
++
++/*
++ * 2X00 specific State Flags
++ * (same as 1X00 except RQSF_GOT_BUS/RQSF_GOT_TARGET are not available)
++ */
++#define       RQSF_DATA_IN                    0x0020
++#define       RQSF_DATA_OUT                   0x0040
++#define       RQSF_STAG                       0x0008
++#define       RQSF_OTAG                       0x0004
++#define       RQSF_HTAG                       0x0002
++/*
++ * 1X00 Status Flags
++ */
++#define RQSTF_DISCONNECT              0x0001
++#define RQSTF_SYNCHRONOUS             0x0002
++#define RQSTF_PARITY_ERROR            0x0004
++#define RQSTF_BUS_RESET                       0x0008
++#define RQSTF_DEVICE_RESET            0x0010
++#define RQSTF_ABORTED                 0x0020
++#define RQSTF_TIMEOUT                 0x0040
++#define RQSTF_NEGOTIATION             0x0080
++
++/*
++ * 2X00 specific state flags
++ */
++/* RQSF_SENT_CDB      */
++/* RQSF_XFRD_DATA     */
++/* RQSF_GOT_STATUS    */
++/* RQSF_XFER_COMPLETE */
++
++/*
++ * 2X00 specific status flags
++ */
++/* RQSTF_ABORTED */
++/* RQSTF_TIMEOUT */
++#define       RQSTF_DMA_ERROR                 0x0080
++#define       RQSTF_LOGOUT                    0x2000
++
++/*
++ * Miscellaneous
++ */
++#ifndef       ISP_EXEC_THROTTLE
++#define       ISP_EXEC_THROTTLE       16
++#endif
++
++/*
++ * About Firmware returns an 'attribute' word in mailbox 6.
++ */
++#define       ISP_FW_ATTR_TMODE       0x01
++#define       ISP_FW_ATTR_SCCLUN      0x02
++#define       ISP_FW_ATTR_FABRIC      0x04
++#define       ISP_FW_ATTR_CLASS2      0x08
++#define       ISP_FW_ATTR_FCTAPE      0x10
++#define       ISP_FW_ATTR_IP          0x20
++
++/*
++ * Reduced Interrupt Operation Response Queue Entreis
++ */
++
++typedef struct {
++      isphdr_t        req_header;
++      u_int32_t       req_handles[15];
++} isp_rio1_t;
++
++typedef struct {
++      isphdr_t        req_header;
++      u_int16_t       req_handles[30];
++} isp_rio2_t;
++
++/*
++ * FC (ISP2100) specific data structures
++ */
++
++/*
++ * Initialization Control Block
++ *
++ * Version One (prime) format.
++ */
++typedef struct isp_icb {
++      u_int8_t        icb_version;
++      u_int8_t        _reserved0;
++      u_int16_t       icb_fwoptions;
++      u_int16_t       icb_maxfrmlen;
++      u_int16_t       icb_maxalloc;
++      u_int16_t       icb_execthrottle;
++      u_int8_t        icb_retry_count;
++      u_int8_t        icb_retry_delay;
++      u_int8_t        icb_portname[8];
++      u_int16_t       icb_hardaddr;
++      u_int8_t        icb_iqdevtype;
++      u_int8_t        icb_logintime;
++      u_int8_t        icb_nodename[8];
++      u_int16_t       icb_rqstout;
++      u_int16_t       icb_rspnsin;
++      u_int16_t       icb_rqstqlen;
++      u_int16_t       icb_rsltqlen;
++      u_int16_t       icb_rqstaddr[4];
++      u_int16_t       icb_respaddr[4];
++      u_int16_t       icb_lunenables;
++      u_int8_t        icb_ccnt;
++      u_int8_t        icb_icnt;
++      u_int16_t       icb_lunetimeout;
++      u_int16_t       _reserved1;
++      u_int16_t       icb_xfwoptions;
++      u_int8_t        icb_racctimer;
++      u_int8_t        icb_idelaytimer;
++      u_int16_t       icb_zfwoptions;
++      u_int16_t       _reserved2[13];
++} isp_icb_t;
++#define       ICB_VERSION1    1
++
++#define       ICBOPT_HARD_ADDRESS     0x0001
++#define       ICBOPT_FAIRNESS         0x0002
++#define       ICBOPT_FULL_DUPLEX      0x0004
++#define       ICBOPT_FAST_POST        0x0008
++#define       ICBOPT_TGT_ENABLE       0x0010
++#define       ICBOPT_INI_DISABLE      0x0020
++#define       ICBOPT_INI_ADISC        0x0040
++#define       ICBOPT_INI_TGTTYPE      0x0080
++#define       ICBOPT_PDBCHANGE_AE     0x0100
++#define       ICBOPT_NOLIP            0x0200
++#define       ICBOPT_SRCHDOWN         0x0400
++#define       ICBOPT_PREVLOOP         0x0800
++#define       ICBOPT_STOP_ON_QFULL    0x1000
++#define       ICBOPT_FULL_LOGIN       0x2000
++#define       ICBOPT_BOTH_WWNS        0x4000
++#define       ICBOPT_EXTENDED         0x8000
++
++#define       ICBXOPT_CLASS2_ACK0     0x0200
++#define       ICBXOPT_CLASS2          0x0100
++#define       ICBXOPT_LOOP_ONLY       (0 << 4)
++#define       ICBXOPT_PTP_ONLY        (1 << 4)
++#define       ICBXOPT_LOOP_2_PTP      (2 << 4)
++#define       ICBXOPT_PTP_2_LOOP      (3 << 4)
++
++/*
++ * The lower 4 bits of the xfwoptions field are the OPERATION MODE bits.
++ * RIO is not defined for the 23XX cards
++ */
++#define       ICBXOPT_RIO_OFF         0
++#define       ICBXOPT_RIO_16BIT       1
++#define       ICBXOPT_RIO_32BIT       2
++#define       ICBXOPT_RIO_16BIT_IOCB  3
++#define       ICBXOPT_RIO_32BIT_IOCB  4
++#define       ICBXOPT_ZIO             5       
++
++#define       ICBZOPT_ENA_RDXFR_RDY   0x01
++#define       ICBZOPT_ENA_OOF         (1 << 6) /* out of order frame handling */
++/* These 3 only apply to the 2300 */
++#define       ICBZOPT_RATE_ONEGB      (MBGSD_ONEGB << 14)
++#define       ICBZOPT_RATE_TWOGB      (MBGSD_TWOGB << 14)
++#define       ICBZOPT_RATE_AUTO       (MBGSD_AUTO << 14)
++
++
++#define       ICB_MIN_FRMLEN          256
++#define       ICB_MAX_FRMLEN          2112
++#define       ICB_DFLT_FRMLEN         1024
++#define       ICB_DFLT_ALLOC          256
++#define       ICB_DFLT_THROTTLE       16
++#define       ICB_DFLT_RDELAY         5
++#define       ICB_DFLT_RCOUNT         3
++
++
++#define       RQRSP_ADDR0015  0
++#define       RQRSP_ADDR1631  1
++#define       RQRSP_ADDR3247  2
++#define       RQRSP_ADDR4863  3
++
++
++#define       ICB_NNM0        7
++#define       ICB_NNM1        6
++#define       ICB_NNM2        5
++#define       ICB_NNM3        4
++#define       ICB_NNM4        3
++#define       ICB_NNM5        2
++#define       ICB_NNM6        1
++#define       ICB_NNM7        0
++
++#define       MAKE_NODE_NAME_FROM_WWN(array, wwn)     \
++      array[ICB_NNM0] = (u_int8_t) ((wwn >>  0) & 0xff), \
++      array[ICB_NNM1] = (u_int8_t) ((wwn >>  8) & 0xff), \
++      array[ICB_NNM2] = (u_int8_t) ((wwn >> 16) & 0xff), \
++      array[ICB_NNM3] = (u_int8_t) ((wwn >> 24) & 0xff), \
++      array[ICB_NNM4] = (u_int8_t) ((wwn >> 32) & 0xff), \
++      array[ICB_NNM5] = (u_int8_t) ((wwn >> 40) & 0xff), \
++      array[ICB_NNM6] = (u_int8_t) ((wwn >> 48) & 0xff), \
++      array[ICB_NNM7] = (u_int8_t) ((wwn >> 56) & 0xff)
++
++/*
++ * FC-AL Position Map
++ *
++ * This is an at most 128 byte map that returns either
++ * the LILP or Firmware generated list of ports.
++ *
++ * We deviate a bit from the returned qlogic format to
++ * use an extra bit to say whether this was a LILP or
++ * f/w generated map.
++ */
++typedef struct {
++      u_int8_t        fwmap   : 1,
++                      count   : 7;
++      u_int8_t        map[127];
++} fcpos_map_t;
++
++/*
++ * Port Data Base Element
++ */
++
++typedef struct {
++      u_int16_t       pdb_options;
++      u_int8_t        pdb_mstate;
++      u_int8_t        pdb_sstate;
++#define       BITS2WORD(x)    ((x)[0] << 16 | (x)[3] << 8 | (x)[2])
++      u_int8_t        pdb_hardaddr_bits[4];
++      u_int8_t        pdb_portid_bits[4];
++      u_int8_t        pdb_nodename[8];
++      u_int8_t        pdb_portname[8];
++      u_int16_t       pdb_execthrottle;
++      u_int16_t       pdb_exec_count;
++      u_int8_t        pdb_retry_count;
++      u_int8_t        pdb_retry_delay;
++      u_int16_t       pdb_resalloc;
++      u_int16_t       pdb_curalloc;
++      u_int16_t       pdb_qhead;
++      u_int16_t       pdb_qtail;
++      u_int16_t       pdb_tl_next;
++      u_int16_t       pdb_tl_last;
++      u_int16_t       pdb_features;   /* PLOGI, Common Service */
++      u_int16_t       pdb_pconcurrnt; /* PLOGI, Common Service */
++      u_int16_t       pdb_roi;        /* PLOGI, Common Service */
++      u_int8_t        pdb_target;
++      u_int8_t        pdb_initiator;  /* PLOGI, Class 3 Control Flags */
++      u_int16_t       pdb_rdsiz;      /* PLOGI, Class 3 */
++      u_int16_t       pdb_ncseq;      /* PLOGI, Class 3 */
++      u_int16_t       pdb_noseq;      /* PLOGI, Class 3 */
++      u_int16_t       pdb_labrtflg;
++      u_int16_t       pdb_lstopflg;
++      u_int16_t       pdb_sqhead;
++      u_int16_t       pdb_sqtail;
++      u_int16_t       pdb_ptimer;
++      u_int16_t       pdb_nxt_seqid;
++      u_int16_t       pdb_fcount;
++      u_int16_t       pdb_prli_len;
++      u_int16_t       pdb_prli_svc0;
++      u_int16_t       pdb_prli_svc3;
++      u_int16_t       pdb_loopid;
++      u_int16_t       pdb_il_ptr;
++      u_int16_t       pdb_sl_ptr;
++} isp_pdb_t;
++
++#define       PDB_OPTIONS_XMITTING    (1<<11)
++#define       PDB_OPTIONS_LNKXMIT     (1<<10)
++#define       PDB_OPTIONS_ABORTED     (1<<9)
++#define       PDB_OPTIONS_ADISC       (1<<1)
++
++#define       PDB_STATE_DISCOVERY     0
++#define       PDB_STATE_WDISC_ACK     1
++#define       PDB_STATE_PLOGI         2
++#define       PDB_STATE_PLOGI_ACK     3
++#define       PDB_STATE_PRLI          4
++#define       PDB_STATE_PRLI_ACK      5
++#define       PDB_STATE_LOGGED_IN     6
++#define       PDB_STATE_PORT_UNAVAIL  7
++#define       PDB_STATE_PRLO          8
++#define       PDB_STATE_PRLO_ACK      9
++#define       PDB_STATE_PLOGO         10
++#define       PDB_STATE_PLOG_ACK      11
++
++#define               SVC3_TGT_ROLE           0x10
++#define       SVC3_INI_ROLE           0x20
++#define                       SVC3_ROLE_MASK  0x30
++#define                       SVC3_ROLE_SHIFT 4
++
++/*
++ * CT definition
++ *
++ * This is as the QLogic f/w documentations defines it- which is just opposite,
++ * bit wise, from what the specification defines it as. Additionally, the
++ * ct_response and ct_resid (really from FC-GS-2) need to be byte swapped.
++ */
++
++typedef struct {
++      u_int8_t        ct_revision;
++      u_int8_t        ct_portid[3];
++      u_int8_t        ct_fcs_type;
++      u_int8_t        ct_fcs_subtype;
++      u_int8_t        ct_options;
++      u_int8_t        ct_res0;
++      u_int16_t       ct_response;
++      u_int16_t       ct_resid;
++      u_int8_t        ct_res1;
++      u_int8_t        ct_reason;
++      u_int8_t        ct_explanation;
++      u_int8_t        ct_vunique;
++} ct_hdr_t;
++#define       FS_ACC  0x8002
++#define       FS_RJT  0x8001
++
++#define       FC4_IP          5 /* ISO/EEC 8802-2 LLC/SNAP "Out of Order Delivery" */
++#define       FC4_SCSI        8 /* SCSI-3 via Fivre Channel Protocol (FCP) */
++#define       FC4_FC_SVC      0x20    /* Fibre Channel Services */
++
++#define       SNS_GA_NXT      0x100
++#define       SNS_GPN_ID      0x112
++#define       SNS_GNN_ID      0x113
++#define       SNS_GFF_ID      0x11F
++#define       SNS_GID_FT      0x171
++#define       SNS_RFT_ID      0x217
++typedef struct {
++      u_int16_t       snscb_rblen;    /* response buffer length (words) */
++      u_int16_t       snscb_res0;
++      u_int16_t       snscb_addr[4];  /* response buffer address */
++      u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
++      u_int16_t       snscb_res1;
++      u_int16_t       snscb_data[1];  /* variable data */
++} sns_screq_t;        /* Subcommand Request Structure */
++
++typedef struct {
++      u_int16_t       snscb_rblen;    /* response buffer length (words) */
++      u_int16_t       snscb_res0;
++      u_int16_t       snscb_addr[4];  /* response buffer address */
++      u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
++      u_int16_t       snscb_res1;
++      u_int16_t       snscb_cmd;
++      u_int16_t       snscb_res2;
++      u_int32_t       snscb_res3;
++      u_int32_t       snscb_port;
++} sns_ga_nxt_req_t;
++#define       SNS_GA_NXT_REQ_SIZE     (sizeof (sns_ga_nxt_req_t))
++
++typedef struct {
++      u_int16_t       snscb_rblen;    /* response buffer length (words) */
++      u_int16_t       snscb_res0;
++      u_int16_t       snscb_addr[4];  /* response buffer address */
++      u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
++      u_int16_t       snscb_res1;
++      u_int16_t       snscb_cmd;
++      u_int16_t       snscb_res2;
++      u_int32_t       snscb_res3;
++      u_int32_t       snscb_portid;
++} sns_gxn_id_req_t;
++#define       SNS_GXN_ID_REQ_SIZE     (sizeof (sns_gxn_id_req_t))
++
++typedef struct {
++      u_int16_t       snscb_rblen;    /* response buffer length (words) */
++      u_int16_t       snscb_res0;
++      u_int16_t       snscb_addr[4];  /* response buffer address */
++      u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
++      u_int16_t       snscb_res1;
++      u_int16_t       snscb_cmd;
++      u_int16_t       snscb_mword_div_2;
++      u_int32_t       snscb_res3;
++      u_int32_t       snscb_fc4_type;
++} sns_gid_ft_req_t;
++#define       SNS_GID_FT_REQ_SIZE     (sizeof (sns_gid_ft_req_t))
++
++typedef struct {
++      u_int16_t       snscb_rblen;    /* response buffer length (words) */
++      u_int16_t       snscb_res0;
++      u_int16_t       snscb_addr[4];  /* response buffer address */
++      u_int16_t       snscb_sblen;    /* subcommand buffer length (words) */
++      u_int16_t       snscb_res1;
++      u_int16_t       snscb_cmd;
++      u_int16_t       snscb_res2;
++      u_int32_t       snscb_res3;
++      u_int32_t       snscb_port;
++      u_int32_t       snscb_fc4_types[8];
++} sns_rft_id_req_t;
++#define       SNS_RFT_ID_REQ_SIZE     (sizeof (sns_rft_id_req_t))
++
++typedef struct {
++      ct_hdr_t        snscb_cthdr;
++      u_int8_t        snscb_port_type;
++      u_int8_t        snscb_port_id[3];
++      u_int8_t        snscb_portname[8];
++      u_int16_t       snscb_data[1];  /* variable data */
++} sns_scrsp_t;        /* Subcommand Response Structure */
++
++typedef struct {
++      ct_hdr_t        snscb_cthdr;
++      u_int8_t        snscb_port_type;
++      u_int8_t        snscb_port_id[3];
++      u_int8_t        snscb_portname[8];
++      u_int8_t        snscb_pnlen;            /* symbolic port name length */
++      u_int8_t        snscb_pname[255];       /* symbolic port name */
++      u_int8_t        snscb_nodename[8];
++      u_int8_t        snscb_nnlen;            /* symbolic node name length */
++      u_int8_t        snscb_nname[255];       /* symbolic node name */
++      u_int8_t        snscb_ipassoc[8];
++      u_int8_t        snscb_ipaddr[16];
++      u_int8_t        snscb_svc_class[4];
++      u_int8_t        snscb_fc4_types[32];
++      u_int8_t        snscb_fpname[8];
++      u_int8_t        snscb_reserved;
++      u_int8_t        snscb_hardaddr[3];
++} sns_ga_nxt_rsp_t;   /* Subcommand Response Structure */
++#define       SNS_GA_NXT_RESP_SIZE    (sizeof (sns_ga_nxt_rsp_t))
++
++typedef struct {
++      ct_hdr_t        snscb_cthdr;
++      u_int8_t        snscb_wwn[8];
++} sns_gxn_id_rsp_t;
++#define       SNS_GXN_ID_RESP_SIZE    (sizeof (sns_gxn_id_rsp_t))
++
++typedef struct {
++      ct_hdr_t        snscb_cthdr;
++      u_int32_t       snscb_fc4_features[32];
++} sns_gff_id_rsp_t;
++#define       SNS_GFF_ID_RESP_SIZE    (sizeof (sns_gff_id_rsp_t))
++
++typedef struct {
++      ct_hdr_t        snscb_cthdr;
++      struct {
++              u_int8_t        control;
++              u_int8_t        portid[3];
++      } snscb_ports[1];
++} sns_gid_ft_rsp_t;
++#define       SNS_GID_FT_RESP_SIZE(x) ((sizeof (sns_gid_ft_rsp_t)) + ((x - 1) << 2))
++
++#define       SNS_RFT_ID_RESP_SIZE    (sizeof (ct_hdr_t))
++
++#endif        /* _ISPMBOX_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_pci.c      2003-07-19 17:06:34.000000000 -0700
+@@ -0,0 +1,2363 @@
++/* @(#)isp_pci.c 1.39 */
++/*
++ * Qlogic ISP Host Adapter PCI specific probe and attach routines
++ *---------------------------------------
++ * Copyright (c) 1998, 1999, 2000, 2001 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * the GNU Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * PMB #825
++ * 5214-F Diamond Hts Blvd
++ * San Francisco, CA, 94131
++ * mjacob@feral.com
++ */
++
++#include "isp_linux.h"
++#if   defined(__powerpc__) || defined(__sparc__)
++static int isp_pci_mapmem = 0xffffffff;
++#else
++static int isp_pci_mapmem = 0;
++#endif
++#if   defined(__sparc__)
++#undef        ioremap_nocache
++#define       ioremap_nocache ioremap
++#endif
++static int isplinux_pci_init(struct Scsi_Host *);
++static u_int16_t isp_pci_rd_reg(struct ispsoftc *, int);
++static void isp_pci_wr_reg(struct ispsoftc *, int, u_int16_t);
++#if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT))
++static u_int16_t isp_pci_rd_reg_1080(struct ispsoftc *, int);
++static void isp_pci_wr_reg_1080(struct ispsoftc *, int, u_int16_t);
++#endif
++static int
++isp_pci_rd_isr(struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *);
++#ifndef       ISP_DISABLE_2300_SUPPORT
++static int
++isp_pci_rd_isr_2300(struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *);
++#endif
++static int isp_pci_mbxdma(struct ispsoftc *);
++static int
++isp_pci_dmasetup(struct ispsoftc *, XS_T *, ispreq_t *, u_int16_t *, u_int16_t);
++
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++static void isp_pci_dmateardown(struct ispsoftc *, XS_T *, u_int16_t);
++#define       IS_HIGH_ISP_ADDR(addr)  (addr >= (u_int64_t) 0x100000000)
++#else
++#define       isp_pci_dmateardown     NULL
++#define       IS_HIGH_ISP_ADDR(addr)  0
++#define       sg_dma_address(sg)      virt_to_bus(sg->address)
++#define       sg_dma_len(sg)          sg->length
++#endif
++
++#if   ISP_DAC_SUPPORTED == 1
++#define       ISP_A64                 1
++#define       HIWD(x)                 ((x) >> 32)
++#else
++#define       ISP_A64                 0
++#define       HIWD(x)                 0
++#endif
++#define       LOWD(x)                 x
++
++static void isp_pci_reset1(struct ispsoftc *);
++static void isp_pci_dumpregs(struct ispsoftc *, const char *);
++
++#ifndef       ISP_CODE_ORG
++#define       ISP_CODE_ORG            0x1000
++#endif
++
++#ifndef       ISP_DISABLE_1020_SUPPORT
++#include "asm_1040.h"
++#define       ISP_1040_RISC_CODE      (u_int16_t *) isp_1040_risc_code
++#else
++#define       ISP_1040_RISC_CODE      NULL
++#endif
++
++#ifndef       ISP_DISABLE_1080_SUPPORT
++#include "asm_1080.h"
++#define       ISP_1080_RISC_CODE      (u_int16_t *) isp_1080_risc_code
++#else
++#define       ISP_1080_RISC_CODE      NULL
++#endif
++
++#ifndef       ISP_DISABLE_12160_SUPPORT
++#include "asm_12160.h"
++#define       ISP_12160_RISC_CODE     (u_int16_t *) isp_12160_risc_code
++#else
++#define       ISP_12160_RISC_CODE     NULL
++#endif
++
++#ifndef       ISP_DISABLE_2100_SUPPORT
++#include "asm_2100.h"
++#define       ISP_2100_RISC_CODE      (u_int16_t *) isp_2100_risc_code
++#else
++#define       ISP_2100_RISC_CODE      NULL
++#endif
++
++#ifndef       ISP_DISABLE_2200_SUPPORT
++#include "asm_2200.h"
++#define       ISP_2200_RISC_CODE      (u_int16_t *) isp_2200_risc_code
++#else
++#define       ISP_2200_RISC_CODE      NULL
++#endif
++
++#ifndef       ISP_DISABLE_2300_SUPPORT
++#include "asm_2300.h"
++#define       ISP_2300_RISC_CODE      (u_int16_t *) isp_2300_risc_code
++#else
++#define       ISP_2300_RISC_CODE      NULL
++#endif
++
++#ifndef       ISP_DISABLE_1020_SUPPORT
++static struct ispmdvec mdvec = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg,
++    isp_pci_wr_reg,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_1040_RISC_CODE,
++    BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64
++};
++#endif
++
++#ifndef       ISP_DISABLE_1080_SUPPORT
++static struct ispmdvec mdvec_1080 = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg_1080,
++    isp_pci_wr_reg_1080,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_1080_RISC_CODE,
++    BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_128
++};
++#endif
++
++#ifndef       ISP_DISABLE_12160_SUPPORT
++static struct ispmdvec mdvec_12160 = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg_1080,
++    isp_pci_wr_reg_1080,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_12160_RISC_CODE,
++    BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_128
++};
++#endif
++
++#ifndef       ISP_DISABLE_2100_SUPPORT
++static struct ispmdvec mdvec_2100 = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg,
++    isp_pci_wr_reg,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_2100_RISC_CODE
++};
++#endif
++
++#ifndef       ISP_DISABLE_2200_SUPPORT
++static struct ispmdvec mdvec_2200 = {
++    isp_pci_rd_isr,
++    isp_pci_rd_reg,
++    isp_pci_wr_reg,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_2200_RISC_CODE
++};
++#endif
++
++#ifndef       ISP_DISABLE_2300_SUPPORT
++static struct ispmdvec mdvec_2300 = {
++    isp_pci_rd_isr_2300,
++    isp_pci_rd_reg,
++    isp_pci_wr_reg,
++    isp_pci_mbxdma,
++    isp_pci_dmasetup,
++    isp_pci_dmateardown,
++    NULL,
++    isp_pci_reset1,
++    isp_pci_dumpregs,
++    ISP_2300_RISC_CODE
++};
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP1020
++#define       PCI_DEVICE_ID_QLOGIC_ISP1020    0x1020
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP1020
++#define       PCI_DEVICE_ID_QLOGIC_ISP1020    0x1020
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP1080
++#define       PCI_DEVICE_ID_QLOGIC_ISP1080    0x1080
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP10160
++#define       PCI_DEVICE_ID_QLOGIC_ISP10160   0x1016
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP12160
++#define       PCI_DEVICE_ID_QLOGIC_ISP12160   0x1216
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP1240
++#define       PCI_DEVICE_ID_QLOGIC_ISP1240    0x1240
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP1280
++#define       PCI_DEVICE_ID_QLOGIC_ISP1280    0x1280
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP2100
++#define       PCI_DEVICE_ID_QLOGIC_ISP2100    0x2100
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP2200
++#define       PCI_DEVICE_ID_QLOGIC_ISP2200    0x2200
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP2300
++#define       PCI_DEVICE_ID_QLOGIC_ISP2300    0x2300
++#endif
++
++#ifndef       PCI_DEVICE_ID_QLOGIC_ISP2312
++#define       PCI_DEVICE_ID_QLOGIC_ISP2312    0x2312
++#endif
++
++#define       PCI_DFLT_LTNCY  0x40
++#define       PCI_DFLT_LNSZ   0x10
++#define       PCI_CMD_ISP     \
++ (PCI_COMMAND_MASTER|PCI_COMMAND_INVALIDATE|PCI_COMMAND_PARITY|PCI_COMMAND_SERR)
++
++/*
++ * Encapsulating softc... Order of elements is important. The tag
++ * pci_isp must come first because of multiple structure punning
++ * (Scsi_Host * == struct isp_pcisoftc * == struct ispsofct *).
++ */
++struct isp_pcisoftc {
++    struct ispsoftc   pci_isp;
++    struct pci_dev *  pci_dev;
++    vm_offset_t               port;   /* I/O port address */
++    vm_offset_t               paddr;  /* Physical Memory Address */
++    vm_offset_t               vaddr;  /* Mapped Memory Address */
++    vm_offset_t               poff[_NREG_BLKS];
++    union pstore      params;
++};
++
++/*
++ * Gratefully borrowed from Gerard Roudier's sym53c8xx driver
++ */
++static INLINE vm_offset_t
++map_pci_mem(u_long base, u_long size)
++{
++    u_long page_base  = ((u_long) base) & PAGE_MASK;
++    u_long page_offs  = ((u_long) base) - page_base;
++    u_long map_size =  roundup(page_offs+size, PAGE_SIZE);
++    u_long page_remapped = (u_long) ioremap_nocache(page_base, map_size);
++    (void) map_size;
++    return (vm_offset_t) (page_remapped ? (page_remapped + page_offs) : 0);
++}
++
++static INLINE
++void unmap_pci_mem(vm_offset_t vaddr, u_long size)
++{
++    if (vaddr)
++      iounmap((void *) (vaddr & PAGE_MASK));
++}
++
++static INLINE int 
++map_isp_mem(struct isp_pcisoftc *isp_pci, u_short cmd, vm_offset_t mem_base)
++{
++    if (cmd & PCI_COMMAND_MEMORY) {
++      isp_pci->paddr = __pa(mem_base);
++      isp_pci->paddr &= PCI_BASE_ADDRESS_MEM_MASK;
++      isp_pci->vaddr = map_pci_mem(isp_pci->paddr, 0xff);
++      return (isp_pci->vaddr != (vm_offset_t) 0);
++    }
++    return (0);
++}
++
++static INLINE int 
++map_isp_io(struct isp_pcisoftc *isp_pci, u_short cmd, vm_offset_t io_base)
++{
++    if ((cmd & PCI_COMMAND_IO) && (io_base & 3) == 1) {
++      isp_pci->port = io_base & PCI_BASE_ADDRESS_IO_MASK;
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)
++      if (check_region(isp_pci->port, 0xff)) {
++          return (0);
++      }
++#endif
++      request_region(isp_pci->port, 0xff, "isp");
++      return (1);
++    }
++    return (0);
++}
++
++#define       ISP_PCI_BUS     pcidev->bus->number
++#define       ISP_PCI_DEVICE  pcidev->devfn
++#define       ISEARCH_RESET   pcidev = NULL
++#define       ISEARCH(x)      \
++  (pcidev = pci_find_device(PCI_VENDOR_ID_QLOGIC, x, pcidev)) != NULL
++#define       ISEARCH_NEXT
++#define       ISTORE_ARGS             struct pci_dev *pcidev
++#define       ISTORE_FNDARGS          ISTORE_ARGS
++#define       ISTORE_FNCARGS          pcidev
++#define       ISTORE_ISP_INFO(x)      (x)->pci_dev = pcidev
++
++static INLINE struct isp_pcisoftc *
++isplinux_pci_addhost(Scsi_Host_Template *tmpt, ISTORE_FNDARGS)
++{
++    struct Scsi_Host *host;
++    struct ispsoftc *isp;
++    struct isp_pcisoftc *pci_isp;
++
++    host = scsi_register(tmpt, sizeof(struct isp_pcisoftc));
++    if (host == NULL) {
++      printk("isplinux_pci_addhost: scsi_register failed\n");
++      return (NULL);
++    }
++    pci_isp = (struct isp_pcisoftc *) host->hostdata;
++    if (pci_isp == NULL) {
++      printk("isplinux_pci_addhost: cannot get softc out of scsi_register\n");
++      return (NULL);
++    }
++    ISTORE_ISP_INFO(pci_isp);
++    isp = (struct ispsoftc *) pci_isp;
++    isp->isp_host = host;
++    isp->isp_osinfo.storep = &pci_isp->params;
++    if (isplinux_pci_init(host)) {
++      scsi_unregister(host);
++      return (NULL);
++    }
++    isp->isp_next = isplist;
++    isplist = isp;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4)
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,61)
++    scsi_set_device(host, &pci_isp->pci_dev->dev);
++#else
++    scsi_set_pci_device(host, pci_isp->pci_dev);
++#endif
++#endif
++    return (pci_isp);
++}
++
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,18) && \
++      LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++#include <linux/reboot.h>
++static int
++isp_notify_reboot(struct notifier_block *ispnb, unsigned long Event, void *b)
++{
++    struct ispsoftc *isp;
++    switch (Event) {
++    case SYS_RESTART:
++    case SYS_HALT:
++    case SYS_POWER_OFF:
++      break;
++    default:
++      return (NOTIFY_DONE);
++    }
++    for (isp = isplist; isp != NULL; isp = isp->isp_next) {
++      ISP_LOCKU_SOFTC(isp);
++      ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++      if (IS_FC(isp)) {
++          ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
++          ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
++          ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
++          ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
++          ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
++      }
++      ISP_UNLKU_SOFTC(isp);
++    }
++    return (NOTIFY_OK);
++}
++static struct notifier_block isp_notifier = {
++      notifier_call:  isp_notify_reboot,
++      next:           NULL,
++      priority:       0
++};
++#endif
++
++static int isp_nfound = 0;
++int
++isplinux_pci_detect(Scsi_Host_Template *tmpt)
++{
++    static const char *fmt =
++      "ISP SCSI and Fibre Channel Host Adapter Driver\n"
++      "      Linux Platform Version %d.%d\n"
++      "      Common Core Code Version %d.%d\n"
++      "      Built on %s, %s\n";
++    struct isp_pcisoftc *pci_isp;
++    ISTORE_ARGS;
++
++    printk(fmt, ISP_PLATFORM_VERSION_MAJOR, ISP_PLATFORM_VERSION_MINOR,
++      ISP_CORE_VERSION_MAJOR, ISP_CORE_VERSION_MINOR, __DATE__ , __TIME__ );
++
++#ifndef       ISP_DISABLE_1020_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP1020); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++#endif
++
++#ifndef       ISP_DISABLE_1080_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP1240); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP1080); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP1280); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++#endif
++
++#ifndef       ISP_DISABLE_12160_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP10160); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP12160); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++#endif
++
++#ifndef       ISP_DISABLE_2100_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP2100); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++#endif
++
++#ifndef       ISP_DISABLE_2200_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP2200); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++#endif
++
++#ifndef       ISP_DISABLE_2300_SUPPORT
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP2300); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++    for (ISEARCH_RESET; ISEARCH(PCI_DEVICE_ID_QLOGIC_ISP2312); ISEARCH_NEXT) {
++      pci_isp = isplinux_pci_addhost(tmpt, ISTORE_FNCARGS);
++        if (pci_isp) {
++              isp_nfound++;
++      }
++    }
++#endif
++    /*
++     * Don't do reboot notifier stuff for 2.5.X yet
++     */
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,18) && \
++      LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    if (isp_nfound) {
++      register_reboot_notifier(&isp_notifier);
++    }
++#endif
++    return (isp_nfound);
++}
++
++void
++isplinux_pci_release(struct Scsi_Host *host)
++{
++    struct ispsoftc *isp = (struct ispsoftc *) host->hostdata;
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) host->hostdata;
++    free_irq(host->irq, pcs);
++    if (pcs->vaddr != 0) {
++      unmap_pci_mem(pcs->vaddr, 0xff);
++      pcs->vaddr = 0;
++    } else {
++      release_region(pcs->port, 0xff);
++      pcs->port = 0;
++    }
++    kfree(isp->isp_xflist);
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    pci_free_consistent(pcs->pci_dev, RQUEST_QUEUE_LEN(isp) * QENTRY_LEN,
++      isp->isp_rquest, isp->isp_rquest_dma);
++    pci_free_consistent(pcs->pci_dev, RESULT_QUEUE_LEN(isp) * QENTRY_LEN,
++      isp->isp_result, isp->isp_result_dma);
++    if (IS_FC(isp)) {
++      pci_free_consistent(pcs->pci_dev, ISP2100_SCRLEN,
++          FCPARAM(isp)->isp_scratch, FCPARAM(isp)->isp_scdma);
++    }
++#else
++    RlsPages(isp->isp_rquest, IspOrder(RQUEST_QUEUE_LEN(isp)));
++    RlsPages(isp->isp_result, IspOrder(RESULT_QUEUE_LEN(isp)));
++    if (IS_FC(isp) && FCPARAM(isp)->isp_scratch) {
++      RlsPages(FCPARAM(isp)->isp_scratch, 1);
++    }
++#endif
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,18) && \
++      LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    if (--isp_nfound <= 0) {
++        unregister_reboot_notifier(&isp_notifier);
++    }
++#endif
++}
++
++static int
++isplinux_pci_init(struct Scsi_Host *host)
++{
++    static char *nomap = "cannot map either memory or I/O space";
++    unsigned long io_base, mem_base;
++    unsigned int irq, pci_cmd_isp = PCI_CMD_ISP;
++    struct isp_pcisoftc *isp_pci;
++    u_char rev, lnsz, timer;
++    u_short vid, did, cmd;
++    char loc[32];
++    struct ispsoftc *isp;
++
++    isp_pci = (struct isp_pcisoftc *) host->hostdata;
++    isp = (struct ispsoftc *) isp_pci;
++    sprintf(loc, "isp@<PCI%d,Slot%d,Func%d>", isp_pci->pci_dev->bus->number,
++      PCI_SLOT(isp_pci->pci_dev->devfn), PCI_FUNC(isp_pci->pci_dev->devfn));
++    if (PRDW(isp_pci, PCI_COMMAND, &cmd) ||
++      PRDB(isp_pci, PCI_CACHE_LINE_SIZE, &lnsz) ||
++      PRDB(isp_pci, PCI_LATENCY_TIMER, &timer) ||
++      PRDB(isp_pci, PCI_CLASS_REVISION, &rev)) {
++      printk("%s: error reading PCI configuration", loc);
++      return (1);
++    }
++    vid = isp_pci->pci_dev->vendor;
++    did = isp_pci->pci_dev->device;
++
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    io_base = pci_resource_start(isp_pci->pci_dev, 0);
++    if (pci_resource_flags(isp_pci->pci_dev, 0) & PCI_BASE_ADDRESS_MEM_TYPE_64)
++      irq = 2;
++    else
++      irq = 1;
++    mem_base = pci_resource_start(isp_pci->pci_dev, irq);
++    if (pci_resource_flags(isp_pci->pci_dev, irq) &
++      PCI_BASE_ADDRESS_MEM_TYPE_64) {
++#if   BITS_PER_LONG == 64
++      mem_base |= pci_resource_start(isp_pci->pci_dev, irq+1) << 32;
++#else
++      isp_pci_mapmem &= ~(1 << isp->isp_unit);
++#endif
++    }
++#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) */
++    io_base = isp_pci->pci_dev->base_address[0];
++    mem_base = isp_pci->pci_dev->base_address[1];
++    if (mem_base & PCI_BASE_ADDRESS_MEM_TYPE_64) {
++#if   BITS_PER_LONG == 64
++      mem_base |= isp_pci->pci_dev->base_address[2] << 32;
++#else
++      isp_pci_mapmem &= ~(1 << isp->isp_unit);
++#endif
++    }
++#endif        /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) */
++    irq = isp_pci->pci_dev->irq;
++
++    if (vid != PCI_VENDOR_ID_QLOGIC) {
++      printk("%s: 0x%04x is not QLogic's PCI Vendor ID\n", loc, vid);
++      return (1);
++    }
++
++    isp_pci->poff[BIU_BLOCK >> _BLK_REG_SHFT] = BIU_REGS_OFF;
++    isp_pci->poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS_OFF;
++    isp_pci->poff[SXP_BLOCK >> _BLK_REG_SHFT] = PCI_SXP_REGS_OFF;
++    isp_pci->poff[RISC_BLOCK >> _BLK_REG_SHFT] = PCI_RISC_REGS_OFF;
++    isp_pci->poff[DMA_BLOCK >> _BLK_REG_SHFT] = DMA_REGS_OFF;
++    switch (did) {
++    case PCI_DEVICE_ID_QLOGIC_ISP1020:
++      break;
++    case PCI_DEVICE_ID_QLOGIC_ISP1080:
++    case PCI_DEVICE_ID_QLOGIC_ISP1240:
++    case PCI_DEVICE_ID_QLOGIC_ISP1280:
++    case PCI_DEVICE_ID_QLOGIC_ISP10160:
++    case PCI_DEVICE_ID_QLOGIC_ISP12160:
++      isp_pci->poff[DMA_BLOCK >> _BLK_REG_SHFT] = ISP1080_DMA_REGS_OFF;
++      break;
++    case PCI_DEVICE_ID_QLOGIC_ISP2200:
++    case PCI_DEVICE_ID_QLOGIC_ISP2100:
++      isp_pci->poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS2100_OFF;
++      break;
++    case PCI_DEVICE_ID_QLOGIC_ISP2300:
++      pci_cmd_isp &= ~PCI_COMMAND_INVALIDATE; /* per errata */
++      isp_pci->poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS2300_OFF;
++      break;
++    case PCI_DEVICE_ID_QLOGIC_ISP2312:
++      isp->isp_port = PCI_FUNC(isp_pci->pci_dev->devfn);
++      isp_pci->poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS2300_OFF;
++      break;
++    default:
++      printk("%s: Device ID 0x%04x is not a known Qlogic Device", loc, did);
++      return (1);
++    }
++
++    /*
++     * Bump unit seed- we're here, whether we complete the attachment or not.
++     */
++    isp->isp_unit = isp_unit_seed++;
++    sprintf(isp->isp_name, "isp%d", isp->isp_unit);
++
++    isp->isp_osinfo.device_id =
++      ((isp_pci->pci_dev->bus->number) << 16)         |
++        (PCI_SLOT(isp_pci->pci_dev->devfn) << 8)      |
++      (PCI_FUNC(isp_pci->pci_dev->devfn));
++
++    if (isp_disable & (1 << isp->isp_unit)) {
++      isp_prt(isp, ISP_LOGALL, "disabled at user request");
++      return (1);
++    }
++
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    if (pci_enable_device(isp_pci->pci_dev)) {
++      printk("%s: fails to be PCI_ENABLEd\n", loc);
++      return (1);
++    }
++    (void) PRDW(isp_pci, PCI_COMMAND, &cmd);
++#endif
++
++    if ((cmd & PCI_CMD_ISP) != pci_cmd_isp) {
++      if (isp_debug & ISP_LOGINFO)
++          printk("%s: rewriting command register from 0x%x to 0x%x\n",
++              loc, cmd, (cmd & ~PCI_CMD_ISP) | pci_cmd_isp);
++      cmd &= ~PCI_CMD_ISP;
++      cmd |= pci_cmd_isp;
++      PWRW(isp_pci, PCI_COMMAND, cmd);
++    }
++
++    if (lnsz != PCI_DFLT_LNSZ) {
++      if (isp_debug & ISP_LOGINFO)
++          printk("%s: rewriting cache line size from 0x%x to 0x%x\n",
++              loc, lnsz, PCI_DFLT_LNSZ);
++      lnsz = PCI_DFLT_LNSZ;
++      PWRB(isp_pci, PCI_CACHE_LINE_SIZE, lnsz);
++    }
++
++#ifdef        __sparc__
++    if (PRDB(isp_pci, PCI_MIN_GNT, &rev)) {
++      printk("%s: unable to read min grant\n", loc);
++      return (1);
++    }
++    if (rev) {
++      rev = (rev << 3) & 0xff;
++    }
++    if (rev == 0) {
++      rev = 64;
++    }
++    if (isp_debug & ISP_LOGINFO) {
++      printk("%s: rewriting latency timer from 0x%x to 0x%x\n",
++          loc, timer, rev);
++    }
++    PWRB(isp_pci, PCI_LATENCY_TIMER, rev);
++#else
++    if (timer < PCI_DFLT_LTNCY) {
++      if (isp_debug & ISP_LOGINFO)
++          printk("%s: rewriting latency timer from 0x%x to 0x%x\n",
++              loc, timer, PCI_DFLT_LTNCY);
++      timer = PCI_DFLT_LTNCY;
++      PWRB(isp_pci, PCI_LATENCY_TIMER, timer);
++    }
++#endif
++
++    if ((cmd & (PCI_COMMAND_MEMORY|PCI_COMMAND_IO)) == 0) {
++#ifdef        __powerpc__
++      if (io_base == 0 && mem_base == 0) {
++          printk("%s: you lose- no register access defined.\n", loc);
++          return (1);
++      }
++      if (io_base)
++              cmd |= PCI_COMMAND_IO;
++      if (mem_base)
++              cmd |= PCI_COMMAND_MEMORY;
++      PWRW(isp_pci, PCI_COMMAND, cmd);
++#else
++      printk("%s: you lose- no register access defined.\n", loc);
++      return (1);
++#endif
++    }
++
++    /*
++     * Disable the ROM.
++     */
++    PWRL(isp_pci, PCI_ROM_ADDRESS, 0);
++
++    /*
++     * Set up stuff...
++     */
++    isp_pci->port = isp_pci->vaddr = 0;
++
++    /*
++     * If we prefer to map memory space over I/O, try that first.
++     */
++    if (isp_pci_mapmem & (1 << isp->isp_unit)) {
++      if (map_isp_mem(isp_pci, cmd, mem_base) == 0) {
++          if (map_isp_io(isp_pci, cmd, io_base) == 0) {
++              isp_prt(isp, ISP_LOGERR, nomap);
++              return (1);
++          }
++      }
++    } else {
++      if (map_isp_io(isp_pci, cmd, io_base) == 0) {
++          if (map_isp_mem(isp_pci, cmd, mem_base) == 0) {
++              isp_prt(isp, ISP_LOGERR, nomap);
++              return (1);
++          }
++      }
++    }
++    if (isp_pci->vaddr) {
++      isp_prt(isp, ISP_LOGCONFIG,
++          "mapped memory 0x%lx at 0x%lx\n", isp_pci->paddr, isp_pci->vaddr);
++      host->io_port = isp_pci->paddr;
++    } else {
++        isp_prt(isp, ISP_LOGCONFIG,
++          "mapped I/O space at 0x%lx\n", isp_pci->port);
++      host->io_port = isp_pci->port;
++    }
++    host->irq = 0;
++    isp_pci->pci_isp.isp_revision = rev;
++#ifndef       ISP_DISABLE_1020_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP1020) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec;
++      isp_pci->pci_isp.isp_type = ISP_HA_SCSI_UNKNOWN;
++    } 
++#endif
++#ifndef       ISP_DISABLE_1080_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP1080) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_1080;
++      isp_pci->pci_isp.isp_type = ISP_HA_SCSI_1080;
++    }
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP1240) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_1080;
++      isp_pci->pci_isp.isp_type = ISP_HA_SCSI_1240;
++      host->max_channel = 1;
++    }
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP1280) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_1080;
++      isp_pci->pci_isp.isp_type = ISP_HA_SCSI_1280;
++      host->max_channel = 1;
++    }
++#endif
++#ifndef       ISP_DISABLE_12160_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP10160) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_12160;
++      isp_pci->pci_isp.isp_type = ISP_HA_SCSI_12160;
++    }
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP12160) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_12160;
++      isp_pci->pci_isp.isp_type = ISP_HA_SCSI_12160;
++      host->max_channel = 1;
++    }
++#endif
++#ifndef       ISP_DISABLE_2100_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP2100) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_2100;
++      isp_pci->pci_isp.isp_type = ISP_HA_FC_2100;
++    }
++#endif
++#ifndef       ISP_DISABLE_2200_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP2200) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_2200;
++      isp_pci->pci_isp.isp_type = ISP_HA_FC_2200;
++    }
++#endif
++#ifndef       ISP_DISABLE_2300_SUPPORT
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP2300) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_2300;
++      isp_pci->pci_isp.isp_type = ISP_HA_FC_2300;
++    }
++    if (did == PCI_DEVICE_ID_QLOGIC_ISP2312) {
++      isp_pci->pci_isp.isp_mdvec = &mdvec_2300;
++      isp_pci->pci_isp.isp_type = ISP_HA_FC_2312;
++    }
++
++    if (IS_23XX(isp)) {
++      /*
++       * Can't tell if the ROM will hang on 'ABOUT FIRMWARE' command
++       */
++      isp->isp_touched = 1;
++    }
++#endif
++
++    if (request_irq(irq, isplinux_intr, SA_SHIRQ, isp->isp_name, isp_pci)) {
++      isp_prt(isp, ISP_LOGERR, "could not snag irq %u (0x%x)", irq, irq);
++      goto bad;
++    }
++    host->irq = irq;
++#if   LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++    host->select_queue_depths = isplinux_sqd;
++#endif
++    isp->isp_param = &isp_pci->params;
++#if   LINUX_VERSION_CODE > KERNEL_VERSION(2,4,19)
++    host->highmem_io = 0;
++    if (IS_FC(isp) || IS_ULTRA2(isp) || IS_1240(isp)) {
++      if (!ISP_A64 || pci_set_dma_mask(isp_pci->pci_dev, (u64) 0xffffffffffffffffULL)) {
++          if (pci_set_dma_mask(isp_pci->pci_dev, (u64)0xffffffff)) {
++              isp_prt(isp, ISP_LOGERR, "cannot set 32 bit dma mask");
++              goto bad;
++          } else {
++              isp_prt(isp, ISP_LOGCONFIG, "enabling 32 bit DMA");
++              host->highmem_io = 1;
++          }
++      } else {
++          isp_prt(isp, ISP_LOGCONFIG, "enabling 64 bit DMA");
++      }
++        host->highmem_io = 1;
++    }
++#endif
++
++    /*
++     * At this point, we're committed to keeping this adapter around.
++     */
++    isplinux_common_init(isp);
++    return (0);
++bad:
++    if (host->irq) {
++      DISABLE_INTS(isp);
++      free_irq(host->irq, isp_pci);
++      host->irq = 0;
++    }
++    if (isp_pci->vaddr != 0) {
++      unmap_pci_mem(isp_pci->vaddr, 0xff);
++      isp_pci->vaddr = 0;
++    } else {
++      release_region(isp_pci->port, 0xff);
++      isp_pci->port = 0;
++    }
++    return (1);
++}
++
++static INLINE u_int16_t
++ispregrd(struct isp_pcisoftc *pcs, vm_offset_t offset)
++{
++    u_int16_t rv;
++    if (pcs->vaddr) {
++      offset += pcs->vaddr;
++      rv = readw(offset);
++    } else {
++      offset += pcs->port;
++      rv = inw(offset);
++    }
++    return (rv);
++}
++
++static INLINE void
++ispregwr(struct isp_pcisoftc *pcs, vm_offset_t offset, u_int16_t val)
++{
++    if (pcs->vaddr) {
++      offset += pcs->vaddr;
++      writew(val, offset);
++    } else {
++      offset += pcs->port;
++      outw(val, offset);
++    }
++    MEMORYBARRIER(isp, SYNC_REG, offset, 2);
++}
++
++static INLINE int
++isp_pci_rd_debounced(struct isp_pcisoftc *pcs, vm_offset_t off, u_int16_t *rp)
++{
++    u_int16_t val0, val1;
++    int i = 0;
++    do {
++      val0 = ispregrd(pcs, off);
++      val1 = ispregrd(pcs, off);
++    } while (val0 != val1 && ++i < 1000);
++    if (val0 != val1) {
++      return (1);
++    }
++    *rp = val0;
++    return (0);
++}
++
++#define       IspVirt2Off(a, x)       \
++      ((a)->poff[((x) & _BLK_REG_MASK) >> _BLK_REG_SHFT] + ((x) & 0xff))
++
++static int
++isp_pci_rd_isr(struct ispsoftc *isp, u_int16_t *isrp,
++    u_int16_t *semap, u_int16_t *mbp)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int16_t isr, sema;
++
++    if (IS_2100(isp)) {
++      if (isp_pci_rd_debounced(pcs, IspVirt2Off(pcs, BIU_ISR), &isr)) {
++          return (0);
++        }
++      if (isp_pci_rd_debounced(pcs, IspVirt2Off(pcs, BIU_SEMA), &sema)) {
++          return (0);
++        }
++    } else {
++      isr = ispregrd(pcs, IspVirt2Off(pcs, BIU_ISR));
++      sema = ispregrd(pcs, IspVirt2Off(pcs, BIU_SEMA));
++    }
++    isp_prt(isp, ISP_LOGDEBUG3, "ISR 0x%x SEMA 0x%x", isr, sema);
++    isr &= INT_PENDING_MASK(isp);
++    sema &= BIU_SEMA_LOCK;
++    if (isr == 0 && sema == 0) {
++      return (0);
++    }
++    *isrp = isr;
++    if ((*semap = sema) != 0) {
++      if (IS_2100(isp)) {
++          if (isp_pci_rd_debounced(pcs, IspVirt2Off(pcs, OUTMAILBOX0), mbp)) {
++              return (0);
++          }
++      } else {
++          *mbp = ispregrd(pcs, IspVirt2Off(pcs, OUTMAILBOX0));
++      }
++    }
++    return (1);
++}
++
++#ifndef       ISP_DISABLE_2300_SUPPORT
++static INLINE u_int32_t
++ispregrd32(struct isp_pcisoftc *pcs, vm_offset_t offset)
++{
++    u_int32_t rv;
++    if (pcs->vaddr) {
++      offset += pcs->vaddr;
++      rv = readl(offset);
++    } else {
++      offset += pcs->port;
++      rv = inl(offset);
++    }
++    return (rv);
++}
++
++static int
++isp_pci_rd_isr_2300(struct ispsoftc *isp, u_int16_t *isrp,
++    u_int16_t *semap, u_int16_t *mbox0p)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int32_t r2hisr;
++
++   /*
++    * Avoid parity errors on the 2312.
++    */
++    if (!(ispregrd(pcs, IspVirt2Off(pcs, BIU_ISR)) & BIU2100_ISR_RISC_INT)) {
++      *isrp = 0;
++      return (0);
++    }
++
++    r2hisr = ispregrd32(pcs, IspVirt2Off(pcs, BIU_R2HSTSLO));
++    isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr);
++    if ((r2hisr & BIU_R2HST_INTR) == 0) {
++      *isrp = 0;
++      return (0);
++    }
++    switch (r2hisr & BIU_R2HST_ISTAT_MASK) {
++    case ISPR2HST_ROM_MBX_OK:
++    case ISPR2HST_ROM_MBX_FAIL:
++    case ISPR2HST_MBX_OK:
++    case ISPR2HST_MBX_FAIL:
++    case ISPR2HST_ASYNC_EVENT:
++      *isrp = r2hisr & 0xffff;
++      *mbox0p = (r2hisr >> 16);
++      *semap = 1;
++      return (1);
++    case ISPR2HST_RIO_16:
++      *isrp = r2hisr & 0xffff;
++      *mbox0p = ASYNC_RIO1;
++      *semap = 1;
++      return (1);
++    case ISPR2HST_FPOST:
++      *isrp = r2hisr & 0xffff;
++      *mbox0p = ASYNC_CMD_CMPLT;
++      *semap = 1;
++      return (1);
++    case ISPR2HST_FPOST_CTIO:
++      *isrp = r2hisr & 0xffff;
++      *mbox0p = ASYNC_CTIO_DONE;
++      *semap = 1;
++      return (1);
++    case ISPR2HST_RSPQ_UPDATE:
++      *isrp = r2hisr & 0xffff;
++      *mbox0p = 0;
++      *semap = 0;
++      return (1);
++   default:
++      return (0);
++   }
++}
++#endif
++
++static u_int16_t
++isp_pci_rd_reg(struct ispsoftc *isp, int regoff)
++{
++    u_int16_t rv, oldconf = 0;
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
++      /*
++       * We will assume that someone has paused the RISC processor.
++       */
++      oldconf = ispregrd(pcs, IspVirt2Off(pcs, BIU_CONF1));
++      ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf | BIU_PCI_CONF1_SXP);
++    }
++    rv = ispregrd(pcs, IspVirt2Off(pcs, regoff));
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
++      ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf);
++    }
++    return (rv);
++}
++
++static void
++isp_pci_wr_reg(struct ispsoftc *isp, int regoff, u_int16_t val)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int16_t oldconf = 0;
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
++      /*
++       * We will assume that someone has paused the RISC processor.
++       */
++      oldconf = ispregrd(pcs, IspVirt2Off(pcs, BIU_CONF1));
++      ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf | BIU_PCI_CONF1_SXP);
++    }
++    ispregwr(pcs, IspVirt2Off(pcs, regoff), val);
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) {
++      ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf);
++    }
++}
++
++#if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT))
++static u_int16_t
++isp_pci_rd_reg_1080(struct ispsoftc *isp, int regoff)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int16_t rv, oldconf = 0;
++
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK ||
++      (regoff & _BLK_REG_MASK) == (SXP_BLOCK|SXP_BANK1_SELECT)) {
++      u_int16_t tmpconf;
++      /*
++       * We will assume that someone has paused the RISC processor.
++       */
++      oldconf = ispregrd(pcs,  IspVirt2Off(pcs, BIU_CONF1));
++      tmpconf = oldconf & ~BIU_PCI1080_CONF1_DMA;
++      if (IS_1280(isp)) {
++          if (regoff & SXP_BANK1_SELECT) {
++              tmpconf |= BIU_PCI1080_CONF1_SXP0;
++          } else {
++              tmpconf |= BIU_PCI1080_CONF1_SXP1;
++          }
++      } else {
++          tmpconf |= BIU_PCI1080_CONF1_SXP0;
++      }
++      ispregwr(pcs,  IspVirt2Off(pcs, BIU_CONF1), tmpconf);
++    } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) {
++      oldconf = ispregrd(pcs,  IspVirt2Off(pcs, BIU_CONF1));
++      ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1),
++          oldconf | BIU_PCI1080_CONF1_DMA);
++    }
++    rv = ispregrd(pcs, IspVirt2Off(pcs, regoff));
++    if (oldconf) {
++      ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf);
++    }
++    return (rv);
++}
++
++static void
++isp_pci_wr_reg_1080(struct ispsoftc *isp, int regoff, u_int16_t val)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++    u_int16_t oldconf = 0;
++
++    if ((regoff & _BLK_REG_MASK) == SXP_BLOCK ||
++      (regoff & _BLK_REG_MASK) == (SXP_BLOCK|SXP_BANK1_SELECT)) {
++      u_int16_t tmpconf;
++      /*
++       * We will assume that someone has paused the RISC processor.
++       */
++      oldconf = ispregrd(pcs,  IspVirt2Off(pcs, BIU_CONF1));
++      tmpconf = oldconf & ~BIU_PCI1080_CONF1_DMA;
++      if (IS_1280(isp)) {
++          if (regoff & SXP_BANK1_SELECT) {
++              tmpconf |= BIU_PCI1080_CONF1_SXP0;
++          } else {
++              tmpconf |= BIU_PCI1080_CONF1_SXP1;
++          }
++      } else {
++          tmpconf |= BIU_PCI1080_CONF1_SXP0;
++      }
++      ispregwr(pcs,  IspVirt2Off(pcs, BIU_CONF1), tmpconf);
++    } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) {
++      oldconf = ispregrd(pcs,  IspVirt2Off(pcs, BIU_CONF1));
++      ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1),
++          oldconf | BIU_PCI1080_CONF1_DMA);
++    }
++    ispregwr(pcs, IspVirt2Off(pcs, regoff), val);
++    if (oldconf) {
++      ispregwr(pcs, IspVirt2Off(pcs, BIU_CONF1), oldconf);
++    }
++}
++#endif
++
++static int
++isp_pci_mbxdma(struct ispsoftc *isp)
++{
++    if (isp->isp_xflist == NULL) {
++      size_t amt = isp->isp_maxcmds * sizeof (XS_T **);
++      isp->isp_xflist = kmalloc(amt, GFP_KERNEL);
++      if (isp->isp_xflist == NULL) {
++          isp_prt(isp, ISP_LOGERR, "unable to allocate xflist array");
++          return (1);
++      }
++      MEMZERO(isp->isp_xflist, amt);
++    }
++    if (isp->isp_rquest == NULL) {
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++      struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++      dma_addr_t busaddr;
++      isp->isp_rquest =
++          pci_alloc_consistent(pcs->pci_dev,
++              RQUEST_QUEUE_LEN(isp) * QENTRY_LEN, &busaddr);
++      if (isp->isp_rquest == NULL) {
++          isp_prt(isp, ISP_LOGERR, "unable to allocate request queue");
++          return (1);
++      }
++      isp->isp_rquest_dma = busaddr;
++#else
++      isp->isp_rquest = (caddr_t) GetPages(IspOrder(RQUEST_QUEUE_LEN(isp)));
++      if (isp->isp_rquest == NULL) {
++          isp_prt(isp, ISP_LOGERR, "unable to allocate request queue");
++          return (1);
++      }
++      /*
++       * Map the Request queue.
++       */
++      isp->isp_rquest_dma = virt_to_bus(isp->isp_rquest);
++#endif
++      if (isp->isp_rquest_dma & 0x3f) {
++          isp_prt(isp, ISP_LOGERR, "Request Queue not on 64 byte boundary");
++          return (1);
++        }
++      MEMZERO(isp->isp_rquest, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)));
++    }
++
++    if (isp->isp_result == NULL) {
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++      struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++      dma_addr_t busaddr;
++      isp->isp_result =
++          pci_alloc_consistent(pcs->pci_dev,
++              RESULT_QUEUE_LEN(isp) * QENTRY_LEN, &busaddr);
++      if (isp->isp_result == NULL) {
++          isp_prt(isp, ISP_LOGERR, "unable to allocate result queue");
++          return (1);
++      }
++      isp->isp_result_dma = busaddr;
++#else
++      isp->isp_result = (caddr_t) GetPages(IspOrder(RESULT_QUEUE_LEN(isp)));
++      if (isp->isp_result == NULL) {
++          isp_prt(isp, ISP_LOGERR, "unable to allocate result queue");
++          free_pages((unsigned long)isp->isp_rquest,
++              IspOrder(RQUEST_QUEUE_LEN(isp)));
++          return (1);
++      }
++      /*
++       * Map the result queue.
++       */
++      isp->isp_result_dma = virt_to_bus(isp->isp_result);
++#endif
++      if (isp->isp_rquest_dma & 0x3f) {
++          isp_prt(isp, ISP_LOGERR, "Result Queue not on 64 byte boundary");
++          return (1);
++        }
++      MEMZERO(isp->isp_result, ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)));
++    }
++
++    if (IS_FC(isp)) {
++      fcparam *fcp = isp->isp_param;
++      if (fcp->isp_scratch == NULL) {
++#if   LINUX_VERSION_CODE > KERNEL_VERSION(2,3,92)
++          struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++          dma_addr_t busaddr;
++          fcp->isp_scratch =
++              pci_alloc_consistent(pcs->pci_dev, ISP2100_SCRLEN, &busaddr);
++          if (fcp->isp_scratch == NULL) {
++              isp_prt(isp, ISP_LOGERR, "unable to allocate scratch space");
++              return (1);
++          }
++          fcp->isp_scdma = busaddr;
++#else
++         /*
++          * Just get a page....
++          */
++          fcp->isp_scratch = (void *) GetPages(1);
++          if (fcp->isp_scratch == NULL) {
++              isp_prt(isp, ISP_LOGERR, "unable to allocate scratch space");
++              return (1);
++          }
++          fcp->isp_scdma = virt_to_bus((void *)fcp->isp_scratch);
++#endif
++          MEMZERO(fcp->isp_scratch, ISP2100_SCRLEN);
++          if (fcp->isp_scdma & 0x7) {
++              isp_prt(isp, ISP_LOGERR, "scratch space not 8 byte aligned");
++              return (1);
++          }
++      }
++    }
++    return (0);
++}
++
++#ifdef        LINUX_ISP_TARGET_MODE
++/*
++ * We need to handle DMA for target mode differently from initiator mode.
++ * 
++ * DMA mapping and construction and submission of CTIO Request Entries
++ * and rendevous for completion are very tightly coupled because we start
++ * out by knowing (per platform) how much data we have to move, but we
++ * don't know, up front, how many DMA mapping segments will have to be used
++ * cover that data, so we don't know how many CTIO Request Entries we
++ * will end up using. Further, for performance reasons we may want to
++ * (on the last CTIO for Fibre Channel), send status too (if all went well).
++ *
++ * The standard vector still goes through isp_pci_dmasetup, but the callback
++ * for the DMA mapping routines comes here instead with the whole transfer
++ * mapped and a pointer to a partially filled in already allocated request
++ * queue entry. We finish the job.
++ */
++
++static int tdma_mk(struct ispsoftc *, tmd_cmd_t *, ct_entry_t *,
++    u_int16_t *, u_int16_t);
++#define       STATUS_WITH_DATA        1
++    
++static int
++tdma_mk(struct ispsoftc *isp, tmd_cmd_t *tcmd, ct_entry_t *cto,
++    u_int16_t *nxtip, u_int16_t optr)
++{
++    static const char ctx[] =
++      "CTIO[%x] lun %d for iid%d flgs 0x%x sts 0x%x ssts 0x%x res %u %s";
++    struct scatterlist *sg;
++    ct_entry_t *qe;
++    u_int8_t scsi_status;
++    u_int16_t curi, nxti, handle;
++    u_int32_t sflags;
++    int32_t resid;
++    int nth_ctio, nctios, send_status, nseg;
++
++
++    curi = isp->isp_reqidx;
++    qe = (ct_entry_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx);
++
++    cto->ct_xfrlen = 0;
++    cto->ct_seg_count = 0;
++    cto->ct_header.rqs_entry_count = 1;
++    MEMZERO(cto->ct_dataseg, sizeof (cto->ct_dataseg));
++
++    if (tcmd->cd_xfrlen == 0) {
++      ISP_TDQE(isp, "tdma_mk[no data]", curi, cto);
++      isp_prt(isp, ISP_LOGTDEBUG1, ctx, cto->ct_fwhandle, (int) tcmd->cd_lun,
++          (int) cto->ct_iid, cto->ct_flags, cto->ct_status,
++          cto->ct_scsi_status, cto->ct_resid, "<END>");
++      isp_put_ctio(isp, cto, qe);
++      return (CMD_QUEUED);
++    }
++
++    sg = tcmd->cd_data;
++    nseg = 0;
++    resid = (int32_t) tcmd->cd_xfrlen;
++    while (resid > 0) {
++      nseg++;
++      resid -= sg_dma_len(sg);
++      sg++;
++    }
++    sg = tcmd->cd_data;
++#if    LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    {
++      struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++      int new_seg_cnt;
++      new_seg_cnt = pci_map_sg(pcs->pci_dev, sg, nseg,
++        (cto->ct_flags & CT_DATA_IN)? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
++      if (new_seg_cnt == 0) {
++          isp_prt(isp, ISP_LOGWARN, "unable to dma map request");
++          cto->ct_resid = -ENOMEM;
++          return (CMD_COMPLETE);
++      }
++      if (new_seg_cnt != nseg) {
++          isp_prt(isp, ISP_LOGERR, "new seg cnt != old");
++          cto->ct_resid = -EINVAL;
++          return (CMD_COMPLETE);
++      }
++    }
++#endif
++    nctios = nseg / ISP_RQDSEG;
++    if (nseg % ISP_RQDSEG) {
++      nctios++;
++    }
++
++    /*
++     * Save handle, and potentially any SCSI status, which
++     * we'll reinsert on the last CTIO we're going to send.
++     */
++    handle = cto->ct_syshandle;
++    cto->ct_syshandle = 0;
++    cto->ct_header.rqs_seqno = 0;
++    send_status = (cto->ct_flags & CT_SENDSTATUS) != 0;
++
++    if (send_status) {
++      sflags = cto->ct_flags & (CT_SENDSTATUS | CT_CCINCR);
++      cto->ct_flags &= ~(CT_SENDSTATUS|CT_CCINCR);
++      /*
++       * Preserve residual.
++       */
++      resid = cto->ct_resid;
++
++      /*
++       * Save actual SCSI status.
++       */
++      scsi_status = cto->ct_scsi_status;
++
++#ifndef       STATUS_WITH_DATA
++      sflags |= CT_NO_DATA;
++      /*
++       * We can't do a status at the same time as a data CTIO, so
++       * we need to synthesize an extra CTIO at this level.
++       */
++      nctios++;
++#endif
++    } else {
++      sflags = scsi_status = resid = 0;
++    }
++
++    cto->ct_resid = 0;
++    cto->ct_scsi_status = 0;
++
++    nxti = *nxtip;
++
++    for (nth_ctio = 0; nth_ctio < nctios; nth_ctio++) {
++      int seglim;
++
++      seglim = nseg;
++      if (seglim) {
++          int seg;
++
++          if (seglim > ISP_RQDSEG)
++              seglim = ISP_RQDSEG;
++
++          for (seg = 0; seg < seglim; seg++, nseg--) {
++              /*
++               * Unlike normal initiator commands, we don't do
++               * any swizzling here.
++               */
++              cto->ct_dataseg[seg].ds_base = (u_int32_t) sg_dma_address(sg);
++              cto->ct_dataseg[seg].ds_count = (u_int32_t) sg_dma_len(sg);
++              cto->ct_xfrlen += sg_dma_len(sg);
++              sg++;
++          }
++          cto->ct_seg_count = seg;
++      } else {
++          /*
++           * This case should only happen when we're
++           * sending an extra CTIO with final status.
++           */
++          if (send_status == 0) {
++              isp_prt(isp, ISP_LOGERR,
++                  "tdma_mk ran out of segments, no status to send");
++              return (CMD_EAGAIN);
++          }
++      }
++
++      /*
++       * At this point, the fields ct_lun, ct_iid, ct_tagval, ct_tagtype, and
++       * ct_timeout have been carried over unchanged from what our caller had
++       * set.
++       *
++       * The dataseg fields and the seg_count fields we just got through
++       * setting. The data direction we've preserved all along and only
++       * clear it if we're now sending status.
++       */
++
++      if (nth_ctio == nctios - 1) {
++          /*
++           * We're the last in a sequence of CTIOs, so mark this
++           * CTIO and save the handle to the command such that when
++           * this CTIO completes we can free dma resources and
++           * do whatever else we need to do to finish the rest
++           * of the command.
++           */
++          cto->ct_syshandle = handle;
++          cto->ct_header.rqs_seqno = 1;
++
++          if (send_status) {
++              cto->ct_scsi_status = scsi_status;
++              cto->ct_flags |= sflags;
++              cto->ct_resid = resid;
++          }
++          if (send_status) {
++              isp_prt(isp, ISP_LOGTDEBUG1, ctx, 
++                  cto->ct_fwhandle, (int) tcmd->cd_lun, (int) cto->ct_iid,
++                  cto->ct_flags, cto->ct_status, cto->ct_scsi_status,
++                  cto->ct_resid, "<END>");
++          } else {
++              isp_prt(isp, ISP_LOGTDEBUG1, ctx, 
++                  cto->ct_fwhandle, (int) tcmd->cd_lun, (int) cto->ct_iid,
++                  cto->ct_flags, cto->ct_status, cto->ct_scsi_status,
++                  cto->ct_resid, "<MID>");
++          }
++          isp_put_ctio(isp, cto, qe);
++          ISP_TDQE(isp, "last tdma_mk", curi, cto);
++          if (nctios > 1) {
++              MEMORYBARRIER(isp, SYNC_REQUEST, curi, QENTRY_LEN);
++          }
++      } else {
++          ct_entry_t *oqe = qe;
++
++          /*
++           * Make sure handle fields are clean
++           */
++          cto->ct_syshandle = 0;
++          cto->ct_header.rqs_seqno = 0;
++
++          isp_prt(isp, ISP_LOGTDEBUG1,
++              "CTIO[%x] lun%d for ID%d ct_flags 0x%x",
++              cto->ct_fwhandle, (int) tcmd->cd_lun,
++              (int) cto->ct_iid, cto->ct_flags);
++
++          /*
++           * Get a new CTIO
++           */
++          qe = (ct_entry_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti);
++          nxti = ISP_NXT_QENTRY(nxti, RQUEST_QUEUE_LEN(isp));
++          if (nxti == optr) {
++              isp_prt(isp, ISP_LOGERR, "queue overflow in tdma_mk");
++              return (CMD_EAGAIN);
++          }
++
++         /*
++          * Now that we're done with the old CTIO,
++          * flush it out to the request queue.
++          */
++          ISP_TDQE(isp, "tdma_mk", curi, cto);
++          isp_put_ctio(isp, cto, oqe);
++          if (nth_ctio != 0) {
++              MEMORYBARRIER(isp, SYNC_REQUEST, curi, QENTRY_LEN);
++          }
++          curi = ISP_NXT_QENTRY(curi, RQUEST_QUEUE_LEN(isp));
++
++          /*
++           * Reset some fields in the CTIO so we can reuse
++           * for the next one we'll flush to the request
++           * queue.
++           */
++          cto->ct_header.rqs_entry_type = RQSTYPE_CTIO;
++          cto->ct_header.rqs_entry_count = 1;
++          cto->ct_header.rqs_flags = 0;
++          cto->ct_status = 0;
++          cto->ct_scsi_status = 0;
++          cto->ct_xfrlen = 0;
++          cto->ct_resid = 0;
++          cto->ct_seg_count = 0;
++          MEMZERO(cto->ct_dataseg, sizeof (cto->ct_dataseg));
++      }
++    }
++    *nxtip = nxti;
++    return (CMD_QUEUED);
++}
++
++static int tdma_mkfc(struct ispsoftc *, tmd_cmd_t *, ct2_entry_t *,
++    u_int16_t *, u_int16_t);
++
++
++/*
++ * We're passed a pointer to a prototype ct2_entry_t.
++ *
++ * If it doesn't contain any data movement, it has to be for sending status,
++ * possibly with Sense Data as well, so we send a single CTIO2. This should
++ * be a Mode 1 CTIO2, and it's up to the caller to set up the Sense Data
++ * and flags appropriately.
++ *
++ * If it does contain data movement, it may *also* be for sending status
++ * (possibly with Sense Data also). It's possible to describe to the firmware
++ * what we want in one CTIO2. However, under some conditions it is not,
++ * so we must also send a *second* CTIO2 after the first one.
++ *
++ * If the data to be sent is in segments that exceeds that which we can
++ * fit into a CTIO2 (likely, as there's only room for 3 segments), we
++ * utilize normal continuation entries, which get pushed after the
++ * first CTIO2, and possibly are followed by a final CTIO2.
++ *
++ * In any case, it's up to the caller to send us a Mode 0 CTIO2 describing
++ * the data to be moved (if any) and the appropriate flags indicating
++ * status. We'll clear and set as appropriate. We'll also check to see
++ * whether Sense Data is attempting to be sent and retrieve it as appropriate.
++ *
++ * In all cases the caller should not assume that the prototype CTIO2
++ * has been left unchanged.
++ */
++
++static int
++tdma_mkfc(struct ispsoftc *isp, tmd_cmd_t *tmd, ct2_entry_t *cto,
++    u_int16_t *nxtip, u_int16_t optr)
++{
++    static const char ctx[] = 
++      "CTIO2[%x] lun %d for iid %d flgs 0x%x sts 0x%x ssts 0x%x res %d %s";
++    struct scatterlist *sg;
++    void *qe;
++    ct2_entry_t ct2, *cto2;
++    u_int16_t swd, curi, nxti;
++    u_int32_t bc;
++    long xfcnt;       /* must be signed */
++    int nseg, seg;
++
++    nxti = *nxtip;
++    curi = isp->isp_reqidx;
++    qe = ISP_QUEUE_ENTRY(isp->isp_rquest, curi);
++    if (cto->ct_flags & CT2_FASTPOST) {
++      if ((tmd->cd_hflags & (CDFH_STSVALID|CDFH_SNSVALID)) != CDFH_STSVALID) {
++          cto->ct_flags &= ~CT2_FASTPOST;
++      }
++    }
++
++    /*
++     * Handle commands that transfer no data right away.
++     */
++    if (tmd->cd_xfrlen == 0) {
++      if ((cto->ct_flags & CT2_FLAG_MMASK) != CT2_FLAG_MODE1) {
++          isp_prt(isp, ISP_LOGERR,
++              "tdma_mkfc, a status CTIO2 without MODE1 set (0x%x)",
++              cto->ct_flags);
++          cto->ct_resid = -EINVAL;
++          return (CMD_COMPLETE);
++      }
++      cto->ct_header.rqs_entry_count = 1;
++      cto->ct_header.rqs_seqno = 1;
++
++      /* ct_syshandle contains the synchronization handle set by caller */
++      /*
++       * We preserve ct_lun, ct_iid, ct_rxid. We set the data movement
++       * flags to NO DATA and clear relative offset flags. We preserve
++       * ct_resid and the response area. We assume that if there is
++       * associated sense data that it has been appropriately set by
++       * the caller.
++       */
++      cto->ct_flags |= CT2_NO_DATA;
++      if (cto->ct_resid > 0)
++          cto->rsp.m1.ct_scsi_status |= CT2_DATA_UNDER;
++      else if (cto->ct_resid < 0)
++          cto->rsp.m1.ct_scsi_status |= CT2_DATA_OVER;
++      cto->ct_seg_count = 0;
++      cto->ct_reloff = 0;
++      isp_prt(isp, ISP_LOGTDEBUG1, ctx, cto->ct_rxid, (int) tmd->cd_lun,
++          cto->ct_iid, cto->ct_flags, cto->ct_status,
++          cto->rsp.m1.ct_scsi_status, cto->ct_resid, "<END>");
++      isp_put_ctio2(isp, cto, qe);
++      ISP_TDQE(isp, "tdma_mkfc[no data]", curi, qe);
++      return (CMD_QUEUED);
++    }
++
++    if ((cto->ct_flags & CT2_FLAG_MMASK) != CT2_FLAG_MODE0) {
++      isp_prt(isp, ISP_LOGERR,
++          "tdma_mkfc, a data CTIO2 without MODE0 set (0x%x)", cto->ct_flags);
++      cto->ct_resid = -EINVAL;
++      return (CMD_COMPLETE);
++    }
++
++   /*
++    * First, count and map all S/G segments
++    *
++    * The byte counter has to be signed because
++    * we can have descriptors that are, in fact,
++    * longer than our data transfer count.
++    */
++    sg = tmd->cd_data;
++    nseg = 0;
++    xfcnt = tmd->cd_xfrlen;
++    while (xfcnt > 0) {
++        nseg++;
++        xfcnt -= sg_dma_len(sg);
++        sg++;
++    }
++    sg = tmd->cd_data;
++#if    LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++    {
++      struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++      int new_seg_cnt;
++      new_seg_cnt = pci_map_sg(pcs->pci_dev, sg, nseg,
++        (cto->ct_flags & CT2_DATA_IN)? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
++      if (new_seg_cnt == 0) {
++          isp_prt(isp, ISP_LOGWARN, "unable to dma map request");
++          cto->ct_resid = -ENOMEM;
++          return (CMD_COMPLETE);
++      }
++      if (new_seg_cnt != nseg) {
++          isp_prt(isp, ISP_LOGERR, "new seg cnt != old");
++          cto->ct_resid = -EINVAL;
++          return (CMD_COMPLETE);
++      }
++    }
++#endif
++
++   /*
++    * Second, figure out whether we need to send a final separate CTIO2
++    *
++    * The 2100/2200 firmware documentation indicates that if we have
++    * good SCSI status (0), but still have a residual, we can still
++    * describe this as part of a Mode 0 CTIO2. The 2300 firmware docs
++    * seem to indicate that if we wish to convey a non-zero residual,
++    * we can't do it as part of a Mode 0 CTIO2. To be safe, as well
++    * as follow the most likely occurrences, we'll push a second
++    * Mode 1 CTIO2 in any case that we have nonzero SCSI status
++    * or a residual.
++    */
++    swd = cto->rsp.m0.ct_scsi_status;
++
++    if ((cto->ct_flags & CT2_SENDSTATUS) && ((swd & 0xf) || cto->ct_resid)) {
++      cto2 = &ct2;
++      /*
++       * Copy over CTIO2
++       */
++      MEMCPY(cto2, cto, sizeof (ct2_entry_t));
++
++      /*
++       * Clear fields from first CTIO2 that now need to be cleared
++       */
++      cto->ct_flags &= ~(CT2_SENDSTATUS|CT2_CCINCR|CT2_FASTPOST);
++      cto->ct_resid = 0;
++      cto->ct_syshandle = 0;
++      cto->rsp.m0.ct_scsi_status = 0;
++
++      /*
++       * Reset fields in the second CTIO2 as appropriate.
++       */
++      cto2->ct_flags &= ~(CT2_FLAG_MMASK|CT2_DATAMASK);
++      cto2->ct_flags |= CT2_NO_DATA|CT2_NO_DATA|CT2_FLAG_MODE1;
++      cto2->ct_seg_count = 0;
++      cto2->ct_reloff = 0;
++      MEMZERO(&cto2->rsp, sizeof (cto2->rsp));
++      cto2->rsp.m1.ct_scsi_status = swd;
++      if ((swd & 0xf) == SCSI_CHECK && (swd & CT2_SNSLEN_VALID)) {
++              MEMCPY(cto2->rsp.m1.ct_resp, tmd->cd_sense, QLTM_SENSELEN);
++                cto2->rsp.m1.ct_senselen = QLTM_SENSELEN;
++                cto2->rsp.m1.ct_scsi_status |= CT2_SNSLEN_VALID;
++      }
++    } else {
++      cto2 = NULL;
++    }
++
++    /*
++     * Third, Fill in the data segments in the first CTIO2 itself.
++     */
++    xfcnt = tmd->cd_xfrlen;
++    cto->ct_seg_count = nseg;
++
++    for (seg = 0; seg < min(nseg, ISP_RQDSEG_T2); seg++) {
++      cto->rsp.m0.ct_dataseg[seg].ds_base = sg_dma_address(sg);
++      bc = min(sg_dma_len(sg), xfcnt);
++      cto->rsp.m0.ct_dataseg[seg].ds_count = bc;
++      cto->rsp.m0.ct_xfrlen += bc;
++      xfcnt -= bc;
++      isp_prt(isp, ISP_LOGTDEBUG1, "  ent0[%d]%lx:%lu", seg,
++          (unsigned long)sg_dma_address(sg), (unsigned long)sg_dma_len(sg));
++      sg++;
++    }
++
++    /*
++     * Now do any continuation segments that are required.
++     */
++    while (seg < nseg) {
++      int curseg;
++      ispcontreq_t local, *crq = &local;
++
++      qe = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti);
++      curi = nxti;
++      nxti = ISP_NXT_QENTRY(curi, RQUEST_QUEUE_LEN(isp));
++      if (nxti == optr) {
++          isp_prt(isp, ISP_LOGTDEBUG0, 
++              "tdma_mkfc: request queue overflow");
++          cto->ct_resid = -EAGAIN;
++          return (CMD_COMPLETE);
++        }
++      cto->ct_header.rqs_entry_count++;
++      MEMZERO((void *)crq, sizeof (*crq));
++      crq->req_header.rqs_entry_count = 1;
++      crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
++      for (curseg = 0; seg < nseg && curseg < ISP_CDSEG; curseg++, seg++) {
++          crq->req_dataseg[curseg].ds_base = sg_dma_address(sg);
++          bc = min(sg_dma_len(sg), xfcnt);
++          crq->req_dataseg[curseg].ds_count = bc;
++          cto->rsp.m0.ct_xfrlen += bc;
++          xfcnt -= bc;
++          isp_prt(isp, ISP_LOGTDEBUG1, "  ent%d[%d]%lx:%lu",
++              cto->ct_header.rqs_entry_count - 1, curseg,
++              (unsigned long)sg_dma_address(sg), (unsigned long)bc);
++          sg++;
++      }
++      isp_put_cont_req(isp, crq, (ispcontreq_t *)qe);
++      MEMORYBARRIER(isp, SYNC_REQUEST, curi, QENTRY_LEN);
++      ISP_TDQE(isp, "tdma_mkfc:cont", curi, cto);
++    }
++
++    /*
++     * If we have a final CTIO2, allocate and push *that*
++     * onto the request queue.
++     */
++    if (cto2) {
++      qe = (ct2_entry_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti);
++      curi = nxti;
++      nxti = ISP_NXT_QENTRY(curi, RQUEST_QUEUE_LEN(isp));
++      if (nxti == optr) {
++          isp_prt(isp, ISP_LOGTDEBUG0, 
++              "tdma_mkfc: request queue overflow");
++          cto->ct_resid = -EAGAIN;
++          return (CMD_COMPLETE);
++        }
++      MEMORYBARRIER(isp, SYNC_REQUEST, curi, QENTRY_LEN);
++      isp_put_ctio2(isp, cto2, (ct2_entry_t *)qe);
++      ISP_TDQE(isp, "tdma_mkfc:final", curi, cto2);
++    }
++    qe = ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx);
++    isp_put_ctio2(isp, cto, qe);
++    ISP_TDQE(isp, "tdma_mkfc", isp->isp_reqidx, cto);
++    *nxtip = nxti;
++    return (CMD_QUEUED);
++}
++#endif
++
++#if   LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
++#define       FOURG_SEG(x)    (((u64) (x)) & 0xffffffff00000000ULL)
++
++static int
++isp_pci_dmasetup(struct ispsoftc *isp, Scsi_Cmnd *Cmnd, ispreq_t *rq,
++    u_int16_t *nxi, u_int16_t optr)
++{
++    struct scatterlist *sg, *savesg;
++    DMA_ADDR_T one_shot_addr, last_synthetic_addr;
++    unsigned int one_shot_length, last_synthetic_count;
++    int segcnt, seg, ovseg, seglim;
++    void *h;
++    u_int16_t nxti;
++
++
++#ifdef        LINUX_ISP_TARGET_MODE
++    if (rq->req_header.rqs_entry_type == RQSTYPE_CTIO ||
++        rq->req_header.rqs_entry_type == RQSTYPE_CTIO2) {
++      int s;
++      if (IS_SCSI(isp))
++          s = tdma_mk(isp, (tmd_cmd_t *)Cmnd, (ct_entry_t *)rq, nxi, optr);
++      else
++          s = tdma_mkfc(isp, (tmd_cmd_t *)Cmnd, (ct2_entry_t *)rq, nxi, optr);
++      return (s);
++   }
++#endif
++
++    nxti = *nxi;
++    h = (void *) ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx);
++
++    if (Cmnd->sc_data_direction == SCSI_DATA_NONE ||
++        Cmnd->request_bufflen == 0) {
++      rq->req_seg_count = 1;
++      goto mbxsync;
++    }
++
++    if (IS_FC(isp)) {
++      seglim = ISP_RQDSEG_T2;
++      ((ispreqt2_t *)rq)->req_totalcnt = Cmnd->request_bufflen;
++      if (Cmnd->sc_data_direction == SCSI_DATA_WRITE) {
++          ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_OUT;
++      } else if (Cmnd->sc_data_direction == SCSI_DATA_READ) {
++          ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_IN;
++      } else {
++          isp_prt(isp, ISP_LOGERR,
++              "unkown data direction (%x) for %d byte request (opcode 0x%x)",
++              Cmnd->sc_data_direction, Cmnd->request_bufflen, Cmnd->cmnd[0]);
++          XS_SETERR(Cmnd, HBA_BOTCH);
++          return (CMD_COMPLETE);
++      }
++    } else {
++      if (Cmnd->cmd_len > 12)
++          seglim = 0;
++      else
++          seglim = ISP_RQDSEG;
++      if (Cmnd->sc_data_direction == SCSI_DATA_WRITE) {
++          rq->req_flags |= REQFLAG_DATA_OUT;
++      } else if (Cmnd->sc_data_direction == SCSI_DATA_READ) {
++          rq->req_flags |= REQFLAG_DATA_IN;
++      } else {
++          isp_prt(isp, ISP_LOGERR,
++              "unkown data direction (%x) for %d byte request (opcode 0x%x)",
++              Cmnd->sc_data_direction, Cmnd->request_bufflen, Cmnd->cmnd[0]);
++          XS_SETERR(Cmnd, HBA_BOTCH);
++          return (CMD_COMPLETE);
++      }
++    }
++
++    one_shot_addr = (DMA_ADDR_T) 0;
++    one_shot_length = 0;
++    if ((segcnt = Cmnd->use_sg) == 0) {
++      struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++      segcnt = 1;
++      sg = NULL;
++      one_shot_length = Cmnd->request_bufflen;
++      one_shot_addr = pci_map_single(pcs->pci_dev,
++          Cmnd->request_buffer, Cmnd->request_bufflen,
++          scsi_to_pci_dma_dir(Cmnd->sc_data_direction));
++      QLA_HANDLE(Cmnd) = (DMA_HTYPE_T) one_shot_addr;
++    } else {
++      struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;
++      sg = (struct scatterlist *) Cmnd->request_buffer;
++      segcnt = pci_map_sg(pcs->pci_dev, sg, Cmnd->use_sg,
++          scsi_to_pci_dma_dir(Cmnd->sc_data_direction));
++    }
++    if (segcnt == 0) {
++      isp_prt(isp, ISP_LOGWARN, "unable to dma map request");
++      XS_SETERR(Cmnd, HBA_BOTCH);
++      return (CMD_EAGAIN);
++    }
++    savesg = sg;
++
++again:
++    last_synthetic_count = 0;
++    last_synthetic_addr = 0;
++    for (seg = 0, rq->req_seg_count = 0;
++       seg < segcnt && rq->req_seg_count < seglim;
++       seg++, rq->req_seg_count++) {
++      DMA_ADDR_T addr;
++      unsigned int length;
++
++      if (sg) {
++              length = QLA_SG_C(sg);
++              addr = QLA_SG_A(sg);
++              sg++;
++      } else {
++              length = one_shot_length;
++              addr = one_shot_addr;
++      }
++
++      if (ISP_A64 && IS_HIGH_ISP_ADDR(addr)) {
++         if (IS_FC(isp)) {
++              if (rq->req_header.rqs_entry_type != RQSTYPE_T3RQS) {
++                      rq->req_header.rqs_entry_type = RQSTYPE_T3RQS;
++                      seglim = ISP_RQDSEG_T3;
++                      sg = savesg;
++                      goto again;
++              }
++         } else {
++              if (rq->req_header.rqs_entry_type != RQSTYPE_A64) {
++                      rq->req_header.rqs_entry_type = RQSTYPE_A64;
++                      seglim = ISP_RQDSEG_A64;
++                      sg = savesg;
++                      goto again;
++              }
++         }
++      }
++      if (ISP_A64 && rq->req_header.rqs_entry_type == RQSTYPE_T3RQS) {
++          ispreqt3_t *rq3 = (ispreqt3_t *)rq;
++          rq3->req_dataseg[rq3->req_seg_count].ds_count = length;
++          rq3->req_dataseg[rq3->req_seg_count].ds_base = LOWD(addr);
++          rq3->req_dataseg[rq3->req_seg_count].ds_basehi = HIWD(addr);
++          /*
++           * Make sure we don't cross a 4GB boundary.
++           */
++          if (FOURG_SEG(addr) != FOURG_SEG(addr + length)) {
++              isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u (TRUNC'd)",
++                  rq->req_seg_count, (long long)addr, length);
++              rq3->req_dataseg[rq3->req_seg_count].ds_count =
++                  (unsigned int) (FOURG_SEG(addr + length) - addr);
++              addr += rq3->req_dataseg[rq3->req_seg_count].ds_count;
++              length -= rq3->req_dataseg[rq3->req_seg_count].ds_count;
++              /*
++               * Do we have space to split it here?
++               */
++              if (rq3->req_seg_count == seglim - 1) {
++                  last_synthetic_count = length;
++                  last_synthetic_addr = addr;
++              } else {
++                  rq3->req_seg_count++;
++                  rq3->req_dataseg[rq3->req_seg_count].ds_count = length;
++                  rq3->req_dataseg[rq3->req_seg_count].ds_base = LOWD(addr);
++                  rq3->req_dataseg[rq3->req_seg_count].ds_basehi = HIWD(addr);
++              }
++          }
++      } else if (ISP_A64 && rq->req_header.rqs_entry_type == RQSTYPE_A64) {
++          ispreq64_t *rq6 = (ispreq64_t *)rq;
++          rq6->req_dataseg[rq6->req_seg_count].ds_count = length;
++          rq6->req_dataseg[rq6->req_seg_count].ds_base = LOWD(addr);
++          rq6->req_dataseg[rq6->req_seg_count].ds_basehi = HIWD(addr);
++          /*
++           * Make sure we don't cross a 4GB boundary.
++           */
++          if (FOURG_SEG(addr) != FOURG_SEG(addr + length)) {
++              isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u (TRUNC'd)",
++                  rq->req_seg_count, (long long)addr, length);
++              rq6->req_dataseg[rq6->req_seg_count].ds_count =
++                  (unsigned int) (FOURG_SEG(addr + length) - addr);
++              addr += rq6->req_dataseg[rq6->req_seg_count].ds_count;
++              length -= rq6->req_dataseg[rq6->req_seg_count].ds_count;
++              /*
++               * Do we have space to split it here?
++               */
++              if (rq6->req_seg_count == seglim - 1) {
++                  last_synthetic_count = length;
++                  last_synthetic_addr = LOWD(addr);
++              } else {
++                  rq6->req_seg_count++;
++                  rq6->req_dataseg[rq6->req_seg_count].ds_count = length;
++                  rq6->req_dataseg[rq6->req_seg_count].ds_base = LOWD(addr);
++                  rq6->req_dataseg[rq6->req_seg_count].ds_basehi = HIWD(addr);
++              }
++          }
++      } else if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
++          ispreqt2_t *rq2 = (ispreqt2_t *)rq;
++          rq2->req_dataseg[rq2->req_seg_count].ds_count = length;
++          rq2->req_dataseg[rq2->req_seg_count].ds_base = addr;
++      } else {
++          rq->req_dataseg[rq->req_seg_count].ds_count = length;
++          rq->req_dataseg[rq->req_seg_count].ds_base = addr;
++      }
++      isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u",
++          rq->req_seg_count, (long long)addr, length);
++    }
++
++    if (seg == segcnt && last_synthetic_count == 0) {
++      goto mbxsync;
++    }
++
++    do {
++      int lim;
++      u_int16_t curip;
++      ispcontreq_t local, *crq = &local, *qep;
++
++      curip = nxti;
++      qep = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, curip);
++      nxti = ISP_NXT_QENTRY((curip), RQUEST_QUEUE_LEN(isp));
++      if (nxti == optr) {
++          isp_pci_dmateardown(isp, Cmnd, 0);
++          isp_prt(isp, ISP_LOGDEBUG0, "out of space for continuations");
++          XS_SETERR(Cmnd, HBA_BOTCH);
++          return (CMD_EAGAIN);
++      }
++      rq->req_header.rqs_entry_count++;
++      MEMZERO((void *)crq, sizeof (*crq));
++      crq->req_header.rqs_entry_count = 1;
++      if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS ||
++          rq->req_header.rqs_entry_type == RQSTYPE_A64) {
++          crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
++          lim = ISP_CDSEG64;
++      } else {
++          crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
++          lim = ISP_CDSEG;
++      }
++
++      for (ovseg = 0; (seg < segcnt || last_synthetic_count) && ovseg < lim;
++          rq->req_seg_count++, seg++, ovseg++, sg++) {
++          DMA_ADDR_T addr;
++          unsigned int length;
++
++          if (last_synthetic_count) {
++              addr = last_synthetic_addr;
++              length = last_synthetic_count;
++              last_synthetic_count = 0;
++              sg--;
++              seg--;
++          } else {
++              addr = QLA_SG_A(sg);
++              length = QLA_SG_C(sg);
++          }
++
++          if (length == 0) {
++              panic("zero length s-g element at line %d", __LINE__);
++          }
++          isp_prt(isp, ISP_LOGDEBUG1, "seg%d[%d]%llx:%u",
++              rq->req_header.rqs_entry_count-1, ovseg,
++              (unsigned long long) addr, length);
++
++          if (crq->req_header.rqs_entry_type == RQSTYPE_A64_CONT) {
++              ispcontreq64_t *xrq = (ispcontreq64_t *) crq;
++              xrq->req_dataseg[ovseg].ds_count = length;
++              xrq->req_dataseg[ovseg].ds_base = LOWD(addr);
++              xrq->req_dataseg[ovseg].ds_basehi = HIWD(addr);
++              /*
++               * Make sure we don't cross a 4GB boundary.
++               */
++              if (FOURG_SEG(addr) != FOURG_SEG(addr + length)) {
++                  isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u (TRUNC'd)",
++                      rq->req_seg_count, (long long)addr, length);
++                  xrq->req_dataseg[ovseg].ds_count =
++                      (unsigned int) (FOURG_SEG(addr + length) - addr);
++                  addr += xrq->req_dataseg[ovseg].ds_count;
++                  length -= xrq->req_dataseg[ovseg].ds_count;
++                  /*
++                   * Do we have space to split it here?
++                   */
++                  if (ovseg == lim - 1) {
++                      last_synthetic_count = length;
++                      last_synthetic_addr = addr;
++                  } else {
++                      ovseg++;
++                      xrq->req_dataseg[ovseg].ds_count = length;
++                      xrq->req_dataseg[ovseg].ds_base = LOWD(addr);
++                      xrq->req_dataseg[ovseg].ds_basehi = HIWD(addr);
++                  }
++              }
++              continue;
++          }
++          /*
++           * We get here if we're a 32 bit continuation entry.
++           * We also check for being over 32 bits with our PCI
++           * address. If we are, we set ourselves up to do 64
++           * bit addressing and start the whole mapping process
++           * all over again- we apparently can't really mix types
++           */
++          if (ISP_A64 && IS_HIGH_ISP_ADDR(addr)) {
++              if (IS_FC(isp)) {
++                  rq->req_header.rqs_entry_type = RQSTYPE_T3RQS;
++                  seglim = ISP_RQDSEG_T3;
++              } else {
++                  rq->req_header.rqs_entry_type = RQSTYPE_A64;
++                  seglim = ISP_RQDSEG_A64;
++              }
++              sg = savesg;
++              nxti = *nxi;
++              rq->req_header.rqs_entry_count = 1;
++              goto again;
++          }
++          crq->req_dataseg[ovseg].ds_count = length;
++          crq->req_dataseg[ovseg].ds_base = addr;
++      }
++      MEMORYBARRIER(isp, SYNC_REQUEST, curip, QENTRY_LEN);
++      if (crq->req_header.rqs_entry_type == RQSTYPE_A64_CONT) {
++          isp_put_cont64_req(isp,
++              (ispcontreq64_t *)crq, (ispcontreq64_t *)qep);
++      } else {
++          isp_put_cont_req(isp, crq, qep);
++      }
++    } while (seg < segcnt || last_synthetic_count);
++mbxsync:
++    if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS) {
++      isp_put_request_t3(isp, (ispreqt3_t *) rq, (ispreqt3_t *) h);
++    } else if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
++      isp_put_request_t2(isp, (ispreqt2_t *) rq, (ispreqt2_t *) h);
++    } else {
++      isp_put_request(isp, (ispreq_t *) rq, (ispreq_t *) h);
++    }
++    *nxi = nxti;
++    return (CMD_QUEUED);
++}
++
++static void
++isp_pci_dmateardown(struct ispsoftc *isp, Scsi_Cmnd *Cmnd, u_int16_t handle)
++{
++#ifdef        LINUX_ISP_TARGET_MODE
++    if (Cmnd->sc_magic != SCSI_CMND_MAGIC) {
++      struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp;
++      tmd_cmd_t *tmd = (tmd_cmd_t *) Cmnd;
++      struct scatterlist *sg = tmd->cd_data;
++      int nseg = 0;
++
++      while (sg->address) {
++              nseg++;
++              sg++;
++      }
++        pci_unmap_sg(pcs->pci_dev, tmd->cd_data, nseg,
++          (tmd->cd_hflags & CDFH_DATA_IN)? PCI_DMA_TODEVICE :
++          PCI_DMA_FROMDEVICE);
++    } else
++#endif
++    if (Cmnd->sc_data_direction != SCSI_DATA_NONE) {
++      struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp;
++      if (Cmnd->use_sg) {
++          pci_unmap_sg(pcs->pci_dev, (struct scatterlist *)Cmnd->buffer,
++              Cmnd->use_sg, scsi_to_pci_dma_dir(Cmnd->sc_data_direction));
++      } else if (Cmnd->request_bufflen) {
++          DMA_ADDR_T handle = (DMA_ADDR_T) QLA_HANDLE(Cmnd);
++          pci_unmap_single(pcs->pci_dev, handle, Cmnd->request_bufflen,
++              scsi_to_pci_dma_dir(Cmnd->sc_data_direction));
++      }
++    }
++}
++
++#else
++
++static int
++isp_pci_dmasetup(struct ispsoftc *isp, Scsi_Cmnd *Cmnd, ispreq_t *rq,
++    u_int16_t *nxi, u_int16_t optr)
++{
++    struct scatterlist *sg;
++    DMA_ADDR_T one_shot_addr;
++    unsigned int one_shot_length;
++    int segcnt, seg, ovseg, seglim;
++    void *h;
++    u_int16_t nxti;
++
++#ifdef        LINUX_ISP_TARGET_MODE
++    if (rq->req_header.rqs_entry_type == RQSTYPE_CTIO ||
++        rq->req_header.rqs_entry_type == RQSTYPE_CTIO2) {
++      int s;
++      if (IS_SCSI(isp))
++          s = tdma_mk(isp, (tmd_cmd_t *)Cmnd, (ct_entry_t *)rq, nxi, optr);
++      else
++          s = tdma_mkfc(isp, (tmd_cmd_t *)Cmnd, (ct2_entry_t *)rq, nxi, optr);
++      return (s);
++   }
++#endif
++
++    nxti = *nxi;
++    h = (void *) ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx);
++
++    if (Cmnd->request_bufflen == 0) {
++      rq->req_seg_count = 1;
++      goto mbxsync;
++    }
++
++    if (IS_FC(isp)) {
++      if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS)
++          seglim = ISP_RQDSEG_T3;
++      else
++          seglim = ISP_RQDSEG_T2;
++      ((ispreqt2_t *)rq)->req_totalcnt = Cmnd->request_bufflen;
++      /*
++       * Linux doesn't make it easy to tell which direction
++       * the data is expected to go, and you really need to
++       * know this for FC. We'll have to assume that some
++       * of these commands that might be used for writes
++       * our outbounds and all else are inbound.
++       */
++      switch (Cmnd->cmnd[0]) {
++      case FORMAT_UNIT:
++      case WRITE_6:
++      case MODE_SELECT:
++      case SEND_DIAGNOSTIC:
++      case WRITE_10:
++      case WRITE_BUFFER:
++      case WRITE_LONG:
++      case WRITE_SAME:
++      case MODE_SELECT_10:
++      case WRITE_12:
++      case WRITE_VERIFY_12:
++      case SEND_VOLUME_TAG:
++          ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_OUT;
++          break;
++      default:
++          ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_IN;
++      }
++    } else {
++      if (Cmnd->cmd_len > 12)
++          seglim = 0;
++      else
++          seglim = ISP_RQDSEG;
++      rq->req_flags |=  REQFLAG_DATA_OUT | REQFLAG_DATA_IN;
++    }
++
++    one_shot_addr = (DMA_ADDR_T) 0;
++    one_shot_length = 0;
++    if ((segcnt = Cmnd->use_sg) == 0) {
++      segcnt = 1;
++      sg = NULL;
++      one_shot_length = Cmnd->request_bufflen;
++      one_shot_addr = virt_to_bus(Cmnd->request_buffer);
++    } else {
++      sg = (struct scatterlist *) Cmnd->request_buffer;
++    }
++    if (segcnt == 0) {
++      isp_prt(isp, ISP_LOGWARN, "unable to dma map request");
++      XS_SETERR(Cmnd, HBA_BOTCH);
++      return (CMD_EAGAIN);
++    }
++
++    for (seg = 0, rq->req_seg_count = 0;
++       seg < segcnt && rq->req_seg_count < seglim;
++       seg++, rq->req_seg_count++) {
++      DMA_ADDR_T addr;
++      unsigned int length;
++
++      if (sg) {
++              length = QLA_SG_C(sg);
++              addr = QLA_SG_A(sg);
++              sg++;
++      } else {
++              length = one_shot_length;
++              addr = one_shot_addr;
++      }
++
++      if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
++          ispreqt2_t *rq2 = (ispreqt2_t *)rq;
++          rq2->req_dataseg[rq2->req_seg_count].ds_count = length;
++          rq2->req_dataseg[rq2->req_seg_count].ds_base = addr;
++      } else {
++          rq->req_dataseg[rq->req_seg_count].ds_count = length;
++          rq->req_dataseg[rq->req_seg_count].ds_base = addr;
++      }
++      isp_prt(isp, ISP_LOGDEBUG1, "seg0[%d]%llx:%u from %p", seg,
++          (long long)addr, length, sg? sg->address : Cmnd->request_buffer);
++    }
++
++    if (seg == segcnt) {
++      goto mbxsync;
++    }
++
++    do {
++      int lim;
++      u_int16_t curip;
++      ispcontreq_t local, *crq = &local, *qep;
++
++      curip = nxti;
++      qep = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, curip);
++      nxti = ISP_NXT_QENTRY((curip), RQUEST_QUEUE_LEN(isp));
++      if (nxti == optr) {
++          isp_prt(isp, ISP_LOGDEBUG0, "out of space for continuations");
++          XS_SETERR(Cmnd, HBA_BOTCH);
++          return (CMD_EAGAIN);
++      }
++      rq->req_header.rqs_entry_count++;
++      MEMZERO((void *)crq, sizeof (*crq));
++      crq->req_header.rqs_entry_count = 1;
++      if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS) {
++          lim = ISP_CDSEG64;
++          crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT;
++      } else {
++          lim = ISP_CDSEG;
++          crq->req_header.rqs_entry_type = RQSTYPE_DATASEG;
++      }
++
++      for (ovseg = 0; seg < segcnt && ovseg < lim;
++           rq->req_seg_count++, seg++, ovseg++, sg++) {
++          if (sg_dma_len(sg) == 0) {
++              panic("zero length s-g element at line %d", __LINE__);
++          }
++          crq->req_dataseg[ovseg].ds_count = QLA_SG_C(sg);
++          crq->req_dataseg[ovseg].ds_base = QLA_SG_A(sg);
++          isp_prt(isp, ISP_LOGDEBUG1, "seg%d[%d]%llx:%u from %p",
++              rq->req_header.rqs_entry_count-1, ovseg,
++              (unsigned long long) QLA_SG_A(sg), QLA_SG_C(sg), sg->address);
++      }
++      MEMORYBARRIER(isp, SYNC_REQUEST, curip, QENTRY_LEN);
++      isp_put_cont_req(isp, crq, qep);
++    } while (seg < segcnt);
++mbxsync:
++    if (rq->req_header.rqs_entry_type == RQSTYPE_T3RQS) {
++      isp_put_request_t3(isp, (ispreqt3_t *) rq, (ispreqt3_t *) h);
++    } else if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
++      isp_put_request_t2(isp, (ispreqt2_t *) rq, (ispreqt2_t *) h);
++    } else {
++      isp_put_request(isp, (ispreq_t *) rq, (ispreq_t *) h);
++    }
++    *nxi = nxti;
++    return (CMD_QUEUED);
++}
++#endif
++
++static void
++isp_pci_reset1(struct ispsoftc *isp)
++{
++    isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS);
++    ENABLE_INTS(isp);
++    isp->mbintsok = 1;
++}
++
++static void
++isp_pci_dumpregs(struct ispsoftc *isp, const char *msg)
++{
++    struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp;    
++    u_int16_t csr;
++
++    pci_read_config_word(pcs->pci_dev, PCI_COMMAND, &csr);
++    printk("%s: ", isp->isp_name);
++    if (msg)
++      printk("%s\n", msg);
++    if (IS_SCSI(isp))
++      printk("    biu_conf1=%x", ISP_READ(isp, BIU_CONF1));
++    else
++      printk("    biu_csr=%x", ISP_READ(isp, BIU2100_CSR));
++    printk(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR),
++         ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA));
++    printk("risc_hccr=%x\n", ISP_READ(isp, HCCR));
++    if (IS_SCSI(isp)) {
++      ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
++      printk("    cdma_conf=%x cdma_sts=%x cdma_fifostat=%x\n",
++             ISP_READ(isp, CDMA_CONF), ISP_READ(isp, CDMA_STATUS),
++             ISP_READ(isp, CDMA_FIFO_STS));
++      printk("    ddma_conf=%x ddma_sts=%x ddma_fifostat=%x\n",
++             ISP_READ(isp, DDMA_CONF), ISP_READ(isp, DDMA_STATUS),
++             ISP_READ(isp, DDMA_FIFO_STS));
++      printk("    sxp_int=%x sxp_gross=%x sxp(scsi_ctrl)=%x\n",
++             ISP_READ(isp, SXP_INTERRUPT),
++             ISP_READ(isp, SXP_GROSS_ERR),
++             ISP_READ(isp, SXP_PINS_CTRL));
++      ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
++    }
++    printk("    mbox regs: %x %x %x %x %x\n",
++         ISP_READ(isp, OUTMAILBOX0), ISP_READ(isp, OUTMAILBOX1),
++         ISP_READ(isp, OUTMAILBOX2), ISP_READ(isp, OUTMAILBOX3),
++         ISP_READ(isp, OUTMAILBOX4));
++    printk("    PCI Status Command/Status=%x\n", csr);
++}
++
++#ifdef        MODULE
++MODULE_PARM(isp_pci_mapmem, "i");
++#endif
++/*
++ * mode: c
++ * Local variables:
++ * c-indent-level: 4
++ * c-brace-imaginary-offset: 0
++ * c-brace-offset: -4
++ * c-argdecl-indent: 4
++ * c-label-offset: -4
++ * c-continued-statement-offset: 4
++ * c-continued-brace-offset: 0
++ * End:
++ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/ispreg.h       2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,1011 @@
++/* @(#)ispreg.h 1.6 */
++/*
++ * Machine Independent (well, as best as possible) register
++ * definitions for Qlogic ISP SCSI adapters.
++ *
++ * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++#ifndef       _ISPREG_H
++#define       _ISPREG_H
++
++/*
++ * Hardware definitions for the Qlogic ISP  registers.
++ */
++
++/*
++ * This defines types of access to various registers.
++ *
++ *    R:              Read Only
++ *    W:              Write Only
++ *    RW:             Read/Write
++ *
++ *    R*, W*, RW*:    Read Only, Write Only, Read/Write, but only
++ *                    if RISC processor in ISP is paused.
++ */
++
++/*
++ * Offsets for various register blocks.
++ *
++ * Sad but true, different architectures have different offsets.
++ *
++ * Don't be alarmed if none of this makes sense. The original register
++ * layout set some defines in a certain pattern. Everything else has been
++ * grafted on since. For example, the ISP1080 manual will state that DMA
++ * registers start at 0x80 from the base of the register address space.
++ * That's true, but for our purposes, we define DMA_REGS_OFF for the 1080
++ * to start at offset 0x60 because the DMA registers are all defined to
++ * be DMA_BLOCK+0x20 and so on. Clear?
++ */
++
++#define       BIU_REGS_OFF                    0x00
++
++#define       PCI_MBOX_REGS_OFF               0x70
++#define       PCI_MBOX_REGS2100_OFF           0x10
++#define       PCI_MBOX_REGS2300_OFF           0x40
++#define       SBUS_MBOX_REGS_OFF              0x80
++
++#define       PCI_SXP_REGS_OFF                0x80
++#define       SBUS_SXP_REGS_OFF               0x200
++
++#define       PCI_RISC_REGS_OFF               0x80
++#define       SBUS_RISC_REGS_OFF              0x400
++
++/* Bless me! Chip designers have putzed it again! */
++#define       ISP1080_DMA_REGS_OFF            0x60
++#define       DMA_REGS_OFF                    0x00    /* same as BIU block */
++
++#define       SBUS_REGSIZE                    0x450
++#define       PCI_REGSIZE                     0x100
++
++/*
++ * NB:        The *_BLOCK definitions have no specific hardware meaning.
++ *    They serve simply to note to the MD layer which block of
++ *    registers offsets are being accessed.
++ */
++#define       _NREG_BLKS      5
++#define       _BLK_REG_SHFT   13
++#define       _BLK_REG_MASK   (7 << _BLK_REG_SHFT)
++#define       BIU_BLOCK       (0 << _BLK_REG_SHFT)
++#define       MBOX_BLOCK      (1 << _BLK_REG_SHFT)
++#define       SXP_BLOCK       (2 << _BLK_REG_SHFT)
++#define       RISC_BLOCK      (3 << _BLK_REG_SHFT)
++#define       DMA_BLOCK       (4 << _BLK_REG_SHFT)
++
++/*
++ * Bus Interface Block Register Offsets
++ */
++
++#define       BIU_ID_LO       (BIU_BLOCK+0x0)         /* R  : Bus ID, Low */
++#define               BIU2100_FLASH_ADDR      (BIU_BLOCK+0x0)
++#define       BIU_ID_HI       (BIU_BLOCK+0x2)         /* R  : Bus ID, High */
++#define               BIU2100_FLASH_DATA      (BIU_BLOCK+0x2)
++#define       BIU_CONF0       (BIU_BLOCK+0x4)         /* R  : Bus Configuration #0 */
++#define       BIU_CONF1       (BIU_BLOCK+0x6)         /* R  : Bus Configuration #1 */
++#define               BIU2100_CSR             (BIU_BLOCK+0x6)
++#define       BIU_ICR         (BIU_BLOCK+0x8)         /* RW : Bus Interface Ctrl */
++#define       BIU_ISR         (BIU_BLOCK+0xA)         /* R  : Bus Interface Status */
++#define       BIU_SEMA        (BIU_BLOCK+0xC)         /* RW : Bus Semaphore */
++#define       BIU_NVRAM       (BIU_BLOCK+0xE)         /* RW : Bus NVRAM */
++/*
++ * These are specific to the 2300.
++ *
++ * They *claim* you can read BIU_R2HSTSLO with a full 32 bit access
++ * and get both registers, but I'm a bit dubious about that. But the
++ * point here is that the top 16 bits are firmware defined bits that
++ * the RISC processor uses to inform the host about something- usually
++ * something which was nominally in a mailbox register.
++ */
++#define       BIU_REQINP      (BIU_BLOCK+0x10)        /* Request Queue In */
++#define       BIU_REQOUTP     (BIU_BLOCK+0x12)        /* Request Queue Out */
++#define       BIU_RSPINP      (BIU_BLOCK+0x14)        /* Response Queue In */
++#define       BIU_RSPOUTP     (BIU_BLOCK+0x16)        /* Response Queue Out */
++
++#define       BIU_R2HSTSLO    (BIU_BLOCK+0x18)
++#define       BIU_R2HSTSHI    (BIU_BLOCK+0x1A)
++
++#define       BIU_R2HST_INTR          (1 << 15)       /* RISC to Host Interrupt */
++#define       BIU_R2HST_PAUSED        (1 <<  8)       /* RISC paused */
++#define       BIU_R2HST_ISTAT_MASK    0x3f            /* intr information && status */
++#define               ISPR2HST_ROM_MBX_OK     0x1     /* ROM mailbox cmd done ok */
++#define               ISPR2HST_ROM_MBX_FAIL   0x2     /* ROM mailbox cmd done fail */
++#define               ISPR2HST_MBX_OK         0x10    /* mailbox cmd done ok */
++#define               ISPR2HST_MBX_FAIL       0x11    /* mailbox cmd done fail */
++#define               ISPR2HST_ASYNC_EVENT    0x12    /* Async Event */
++#define               ISPR2HST_RSPQ_UPDATE    0x13    /* Response Queue Update */
++#define               ISPR2HST_RQST_UPDATE    0x14    /* Resquest Queue Update */
++#define               ISPR2HST_RIO_16         0x15    /* RIO 1-16 */
++#define               ISPR2HST_FPOST          0x16    /* Low 16 bits fast post */
++#define               ISPR2HST_FPOST_CTIO     0x17    /* Low 16 bits fast post ctio */
++
++#define       DFIFO_COMMAND   (BIU_BLOCK+0x60)        /* RW : Command FIFO Port */
++#define               RDMA2100_CONTROL        DFIFO_COMMAND
++#define       DFIFO_DATA      (BIU_BLOCK+0x62)        /* RW : Data FIFO Port */
++
++/*
++ * Putzed DMA register layouts.
++ */
++#define       CDMA_CONF       (DMA_BLOCK+0x20)        /* RW*: DMA Configuration */
++#define               CDMA2100_CONTROL        CDMA_CONF
++#define       CDMA_CONTROL    (DMA_BLOCK+0x22)        /* RW*: DMA Control */
++#define       CDMA_STATUS     (DMA_BLOCK+0x24)        /* R  : DMA Status */
++#define       CDMA_FIFO_STS   (DMA_BLOCK+0x26)        /* R  : DMA FIFO Status */
++#define       CDMA_COUNT      (DMA_BLOCK+0x28)        /* RW*: DMA Transfer Count */
++#define       CDMA_ADDR0      (DMA_BLOCK+0x2C)        /* RW*: DMA Address, Word 0 */
++#define       CDMA_ADDR1      (DMA_BLOCK+0x2E)        /* RW*: DMA Address, Word 1 */
++#define       CDMA_ADDR2      (DMA_BLOCK+0x30)        /* RW*: DMA Address, Word 2 */
++#define       CDMA_ADDR3      (DMA_BLOCK+0x32)        /* RW*: DMA Address, Word 3 */
++
++#define       DDMA_CONF       (DMA_BLOCK+0x40)        /* RW*: DMA Configuration */
++#define               TDMA2100_CONTROL        DDMA_CONF
++#define       DDMA_CONTROL    (DMA_BLOCK+0x42)        /* RW*: DMA Control */
++#define       DDMA_STATUS     (DMA_BLOCK+0x44)        /* R  : DMA Status */
++#define       DDMA_FIFO_STS   (DMA_BLOCK+0x46)        /* R  : DMA FIFO Status */
++#define       DDMA_COUNT_LO   (DMA_BLOCK+0x48)        /* RW*: DMA Xfer Count, Low */
++#define       DDMA_COUNT_HI   (DMA_BLOCK+0x4A)        /* RW*: DMA Xfer Count, High */
++#define       DDMA_ADDR0      (DMA_BLOCK+0x4C)        /* RW*: DMA Address, Word 0 */
++#define       DDMA_ADDR1      (DMA_BLOCK+0x4E)        /* RW*: DMA Address, Word 1 */
++/* these are for the 1040A cards */
++#define       DDMA_ADDR2      (DMA_BLOCK+0x50)        /* RW*: DMA Address, Word 2 */
++#define       DDMA_ADDR3      (DMA_BLOCK+0x52)        /* RW*: DMA Address, Word 3 */
++
++
++/*
++ * Bus Interface Block Register Definitions
++ */
++/* BUS CONFIGURATION REGISTER #0 */
++#define       BIU_CONF0_HW_MASK               0x000F  /* Hardware revision mask */
++/* BUS CONFIGURATION REGISTER #1 */
++
++#define       BIU_SBUS_CONF1_PARITY           0x0100  /* Enable parity checking */
++#define       BIU_SBUS_CONF1_FCODE_MASK       0x00F0  /* Fcode cycle mask */
++
++#define       BIU_PCI_CONF1_FIFO_128          0x0040  /* 128 bytes FIFO threshold */
++#define       BIU_PCI_CONF1_FIFO_64           0x0030  /* 64 bytes FIFO threshold */
++#define       BIU_PCI_CONF1_FIFO_32           0x0020  /* 32 bytes FIFO threshold */
++#define       BIU_PCI_CONF1_FIFO_16           0x0010  /* 16 bytes FIFO threshold */
++#define       BIU_BURST_ENABLE                0x0004  /* Global enable Bus bursts */
++#define       BIU_SBUS_CONF1_FIFO_64          0x0003  /* 64 bytes FIFO threshold */
++#define       BIU_SBUS_CONF1_FIFO_32          0x0002  /* 32 bytes FIFO threshold */
++#define       BIU_SBUS_CONF1_FIFO_16          0x0001  /* 16 bytes FIFO threshold */
++#define       BIU_SBUS_CONF1_FIFO_8           0x0000  /* 8 bytes FIFO threshold */
++#define       BIU_SBUS_CONF1_BURST8           0x0008  /* Enable 8-byte  bursts */
++#define       BIU_PCI_CONF1_SXP               0x0008  /* SXP register select */
++
++#define       BIU_PCI1080_CONF1_SXP0          0x0100  /* SXP bank #1 select */
++#define       BIU_PCI1080_CONF1_SXP1          0x0200  /* SXP bank #2 select */
++#define       BIU_PCI1080_CONF1_DMA           0x0300  /* DMA bank select */
++
++/* ISP2100 Bus Control/Status Register */
++
++#define       BIU2100_ICSR_REGBSEL            0x30    /* RW: register bank select */
++#define               BIU2100_RISC_REGS       (0 << 4)        /* RISC Regs */
++#define               BIU2100_FB_REGS         (1 << 4)        /* FrameBuffer Regs */
++#define               BIU2100_FPM0_REGS       (2 << 4)        /* FPM 0 Regs */
++#define               BIU2100_FPM1_REGS       (3 << 4)        /* FPM 1 Regs */
++#define       BIU2100_PCI64                   0x04    /*  R: 64 Bit PCI slot */
++#define       BIU2100_FLASH_ENABLE            0x02    /* RW: Enable Flash RAM */
++#define       BIU2100_SOFT_RESET              0x01
++/* SOFT RESET FOR ISP2100 is same bit, but in this register, not ICR */
++
++
++/* BUS CONTROL REGISTER */
++#define       BIU_ICR_ENABLE_DMA_INT          0x0020  /* Enable DMA interrupts */
++#define       BIU_ICR_ENABLE_CDMA_INT         0x0010  /* Enable CDMA interrupts */
++#define       BIU_ICR_ENABLE_SXP_INT          0x0008  /* Enable SXP interrupts */
++#define       BIU_ICR_ENABLE_RISC_INT         0x0004  /* Enable Risc interrupts */
++#define       BIU_ICR_ENABLE_ALL_INTS         0x0002  /* Global enable all inter */
++#define       BIU_ICR_SOFT_RESET              0x0001  /* Soft Reset of ISP */
++
++#define       BIU2100_ICR_ENABLE_ALL_INTS     0x8000
++#define       BIU2100_ICR_ENA_FPM_INT         0x0020
++#define       BIU2100_ICR_ENA_FB_INT          0x0010
++#define       BIU2100_ICR_ENA_RISC_INT        0x0008
++#define       BIU2100_ICR_ENA_CDMA_INT        0x0004
++#define       BIU2100_ICR_ENABLE_RXDMA_INT    0x0002
++#define       BIU2100_ICR_ENABLE_TXDMA_INT    0x0001
++#define       BIU2100_ICR_DISABLE_ALL_INTS    0x0000
++
++#define       ENABLE_INTS(isp)        (IS_SCSI(isp))?  \
++ ISP_WRITE(isp, BIU_ICR, BIU_ICR_ENABLE_RISC_INT | BIU_ICR_ENABLE_ALL_INTS) : \
++ ISP_WRITE(isp, BIU_ICR, BIU2100_ICR_ENA_RISC_INT | BIU2100_ICR_ENABLE_ALL_INTS)
++
++#define       INTS_ENABLED(isp)       ((IS_SCSI(isp))?  \
++ (ISP_READ(isp, BIU_ICR) & (BIU_ICR_ENABLE_RISC_INT|BIU_ICR_ENABLE_ALL_INTS)) :\
++ (ISP_READ(isp, BIU_ICR) & \
++      (BIU2100_ICR_ENA_RISC_INT|BIU2100_ICR_ENABLE_ALL_INTS)))
++
++#define       DISABLE_INTS(isp)       ISP_WRITE(isp, BIU_ICR, 0)
++
++/* BUS STATUS REGISTER */
++#define       BIU_ISR_DMA_INT                 0x0020  /* DMA interrupt pending */
++#define       BIU_ISR_CDMA_INT                0x0010  /* CDMA interrupt pending */
++#define       BIU_ISR_SXP_INT                 0x0008  /* SXP interrupt pending */
++#define       BIU_ISR_RISC_INT                0x0004  /* Risc interrupt pending */
++#define       BIU_ISR_IPEND                   0x0002  /* Global interrupt pending */
++
++#define       BIU2100_ISR_INT_PENDING         0x8000  /* Global interrupt pending */
++#define       BIU2100_ISR_FPM_INT             0x0020  /* FPM interrupt pending */
++#define       BIU2100_ISR_FB_INT              0x0010  /* FB interrupt pending */
++#define       BIU2100_ISR_RISC_INT            0x0008  /* Risc interrupt pending */
++#define       BIU2100_ISR_CDMA_INT            0x0004  /* CDMA interrupt pending */
++#define       BIU2100_ISR_RXDMA_INT_PENDING   0x0002  /* Global interrupt pending */
++#define       BIU2100_ISR_TXDMA_INT_PENDING   0x0001  /* Global interrupt pending */
++
++#define       INT_PENDING(isp, isr)   (IS_FC(isp)? \
++      ((isr & BIU2100_ISR_RISC_INT) != 0) : ((isr & BIU_ISR_RISC_INT) != 0))
++
++#define       INT_PENDING_MASK(isp)   \
++      (IS_FC(isp)? BIU2100_ISR_RISC_INT: BIU_ISR_RISC_INT)
++
++/* BUS SEMAPHORE REGISTER */
++#define       BIU_SEMA_STATUS         0x0002  /* Semaphore Status Bit */
++#define       BIU_SEMA_LOCK           0x0001  /* Semaphore Lock Bit */
++
++/* NVRAM SEMAPHORE REGISTER */
++#define       BIU_NVRAM_CLOCK         0x0001
++#define       BIU_NVRAM_SELECT        0x0002
++#define       BIU_NVRAM_DATAOUT       0x0004
++#define       BIU_NVRAM_DATAIN        0x0008
++#define               ISP_NVRAM_READ          6
++
++/* COMNMAND && DATA DMA CONFIGURATION REGISTER */
++#define       DMA_ENABLE_SXP_DMA              0x0008  /* Enable SXP to DMA Data */
++#define       DMA_ENABLE_INTS                 0x0004  /* Enable interrupts to RISC */
++#define       DMA_ENABLE_BURST                0x0002  /* Enable Bus burst trans */
++#define       DMA_DMA_DIRECTION               0x0001  /*
++                                               * Set DMA direction:
++                                               *      0 - DMA FIFO to host
++                                               *      1 - Host to DMA FIFO
++                                               */
++
++/* COMMAND && DATA DMA CONTROL REGISTER */
++#define       DMA_CNTRL_SUSPEND_CHAN          0x0010  /* Suspend DMA transfer */
++#define       DMA_CNTRL_CLEAR_CHAN            0x0008  /*
++                                               * Clear FIFO and DMA Channel,
++                                               * reset DMA registers
++                                               */
++#define       DMA_CNTRL_CLEAR_FIFO            0x0004  /* Clear DMA FIFO */
++#define       DMA_CNTRL_RESET_INT             0x0002  /* Clear DMA interrupt */
++#define       DMA_CNTRL_STROBE                0x0001  /* Start DMA transfer */
++
++/*
++ * Variants of same for 2100
++ */
++#define       DMA_CNTRL2100_CLEAR_CHAN        0x0004
++#define       DMA_CNTRL2100_RESET_INT         0x0002
++
++
++
++/* DMA STATUS REGISTER */
++#define       DMA_SBUS_STATUS_PIPE_MASK       0x00C0  /* DMA Pipeline status mask */
++#define       DMA_SBUS_STATUS_CHAN_MASK       0x0030  /* Channel status mask */
++#define       DMA_SBUS_STATUS_BUS_PARITY      0x0008  /* Parity Error on bus */
++#define       DMA_SBUS_STATUS_BUS_ERR         0x0004  /* Error Detected on bus */
++#define       DMA_SBUS_STATUS_TERM_COUNT      0x0002  /* DMA Transfer Completed */
++#define       DMA_SBUS_STATUS_INTERRUPT       0x0001  /* Enable DMA channel inter */
++
++#define       DMA_PCI_STATUS_INTERRUPT        0x8000  /* Enable DMA channel inter */
++#define       DMA_PCI_STATUS_RETRY_STAT       0x4000  /* Retry status */
++#define       DMA_PCI_STATUS_CHAN_MASK        0x3000  /* Channel status mask */
++#define       DMA_PCI_STATUS_FIFO_OVR         0x0100  /* DMA FIFO overrun cond */
++#define       DMA_PCI_STATUS_FIFO_UDR         0x0080  /* DMA FIFO underrun cond */
++#define       DMA_PCI_STATUS_BUS_ERR          0x0040  /* Error Detected on bus */
++#define       DMA_PCI_STATUS_BUS_PARITY       0x0020  /* Parity Error on bus */
++#define       DMA_PCI_STATUS_CLR_PEND         0x0010  /* DMA clear pending */
++#define       DMA_PCI_STATUS_TERM_COUNT       0x0008  /* DMA Transfer Completed */
++#define       DMA_PCI_STATUS_DMA_SUSP         0x0004  /* DMA suspended */
++#define       DMA_PCI_STATUS_PIPE_MASK        0x0003  /* DMA Pipeline status mask */
++
++/* DMA Status Register, pipeline status bits */
++#define       DMA_SBUS_PIPE_FULL              0x00C0  /* Both pipeline stages full */
++#define       DMA_SBUS_PIPE_OVERRUN           0x0080  /* Pipeline overrun */
++#define       DMA_SBUS_PIPE_STAGE1            0x0040  /*
++                                               * Pipeline stage 1 Loaded,
++                                               * stage 2 empty
++                                               */
++#define       DMA_PCI_PIPE_FULL               0x0003  /* Both pipeline stages full */
++#define       DMA_PCI_PIPE_OVERRUN            0x0002  /* Pipeline overrun */
++#define       DMA_PCI_PIPE_STAGE1             0x0001  /*
++                                               * Pipeline stage 1 Loaded,
++                                               * stage 2 empty
++                                               */
++#define       DMA_PIPE_EMPTY                  0x0000  /* All pipeline stages empty */
++
++/* DMA Status Register, channel status bits */
++#define       DMA_SBUS_CHAN_SUSPEND   0x0030  /* Channel error or suspended */
++#define       DMA_SBUS_CHAN_TRANSFER  0x0020  /* Chan transfer in progress */
++#define       DMA_SBUS_CHAN_ACTIVE    0x0010  /* Chan trans to host active */
++#define       DMA_PCI_CHAN_TRANSFER   0x3000  /* Chan transfer in progress */
++#define       DMA_PCI_CHAN_SUSPEND    0x2000  /* Channel error or suspended */
++#define       DMA_PCI_CHAN_ACTIVE     0x1000  /* Chan trans to host active */
++#define       ISP_DMA_CHAN_IDLE       0x0000  /* Chan idle (normal comp) */
++
++
++/* DMA FIFO STATUS REGISTER */
++#define       DMA_FIFO_STATUS_OVERRUN         0x0200  /* FIFO Overrun Condition */
++#define       DMA_FIFO_STATUS_UNDERRUN        0x0100  /* FIFO Underrun Condition */
++#define       DMA_FIFO_SBUS_COUNT_MASK        0x007F  /* FIFO Byte count mask */
++#define       DMA_FIFO_PCI_COUNT_MASK         0x00FF  /* FIFO Byte count mask */
++
++/*
++ * Mailbox Block Register Offsets
++ */
++
++#define       INMAILBOX0      (MBOX_BLOCK+0x0)
++#define       INMAILBOX1      (MBOX_BLOCK+0x2)
++#define       INMAILBOX2      (MBOX_BLOCK+0x4)
++#define       INMAILBOX3      (MBOX_BLOCK+0x6)
++#define       INMAILBOX4      (MBOX_BLOCK+0x8)
++#define       INMAILBOX5      (MBOX_BLOCK+0xA)
++#define       INMAILBOX6      (MBOX_BLOCK+0xC)
++#define       INMAILBOX7      (MBOX_BLOCK+0xE)
++
++#define       OUTMAILBOX0     (MBOX_BLOCK+0x0)
++#define       OUTMAILBOX1     (MBOX_BLOCK+0x2)
++#define       OUTMAILBOX2     (MBOX_BLOCK+0x4)
++#define       OUTMAILBOX3     (MBOX_BLOCK+0x6)
++#define       OUTMAILBOX4     (MBOX_BLOCK+0x8)
++#define       OUTMAILBOX5     (MBOX_BLOCK+0xA)
++#define       OUTMAILBOX6     (MBOX_BLOCK+0xC)
++#define       OUTMAILBOX7     (MBOX_BLOCK+0xE)
++
++#define       MBOX_OFF(n)     (MBOX_BLOCK + ((n) << 1))
++#define       NMBOX(isp)      \
++      (((((isp)->isp_type & ISP_HA_SCSI) >= ISP_HA_SCSI_1040A) || \
++       ((isp)->isp_type & ISP_HA_FC))? 8 : 6)
++#define       NMBOX_BMASK(isp)        \
++      (((((isp)->isp_type & ISP_HA_SCSI) >= ISP_HA_SCSI_1040A) || \
++       ((isp)->isp_type & ISP_HA_FC))? 0xff : 0x3f)
++
++#define       MAX_MAILBOX     8
++
++/*
++ * Fibre Protocol Module and Frame Buffer Register Offsets/Definitions (2X00).
++ * NB: The RISC processor must be paused and the appropriate register
++ * bank selected via BIU2100_CSR bits.
++ */
++
++#define       FPM_DIAG_CONFIG (BIU_BLOCK + 0x96)
++#define               FPM_SOFT_RESET          0x0100
++
++#define       FBM_CMD         (BIU_BLOCK + 0xB8)
++#define               FBMCMD_FIFO_RESET_ALL   0xA000
++
++
++/*
++ * SXP Block Register Offsets
++ */
++#define       SXP_PART_ID     (SXP_BLOCK+0x0)         /* R  : Part ID Code */
++#define       SXP_CONFIG1     (SXP_BLOCK+0x2)         /* RW*: Configuration Reg #1 */
++#define       SXP_CONFIG2     (SXP_BLOCK+0x4)         /* RW*: Configuration Reg #2 */
++#define       SXP_CONFIG3     (SXP_BLOCK+0x6)         /* RW*: Configuration Reg #2 */
++#define       SXP_INSTRUCTION (SXP_BLOCK+0xC)         /* RW*: Instruction Pointer */
++#define       SXP_RETURN_ADDR (SXP_BLOCK+0x10)        /* RW*: Return Address */
++#define       SXP_COMMAND     (SXP_BLOCK+0x14)        /* RW*: Command */
++#define       SXP_INTERRUPT   (SXP_BLOCK+0x18)        /* R  : Interrupt */
++#define       SXP_SEQUENCE    (SXP_BLOCK+0x1C)        /* RW*: Sequence */
++#define       SXP_GROSS_ERR   (SXP_BLOCK+0x1E)        /* R  : Gross Error */
++#define       SXP_EXCEPTION   (SXP_BLOCK+0x20)        /* RW*: Exception Enable */
++#define       SXP_OVERRIDE    (SXP_BLOCK+0x24)        /* RW*: Override */
++#define       SXP_LIT_BASE    (SXP_BLOCK+0x28)        /* RW*: Literal Base */
++#define       SXP_USER_FLAGS  (SXP_BLOCK+0x2C)        /* RW*: User Flags */
++#define       SXP_USER_EXCEPT (SXP_BLOCK+0x30)        /* RW*: User Exception */
++#define       SXP_BREAKPOINT  (SXP_BLOCK+0x34)        /* RW*: Breakpoint */
++#define       SXP_SCSI_ID     (SXP_BLOCK+0x40)        /* RW*: SCSI ID */
++#define       SXP_DEV_CONFIG1 (SXP_BLOCK+0x42)        /* RW*: Device Config Reg #1 */
++#define       SXP_DEV_CONFIG2 (SXP_BLOCK+0x44)        /* RW*: Device Config Reg #2 */
++#define       SXP_PHASE_PTR   (SXP_BLOCK+0x48)        /* RW*: SCSI Phase Pointer */
++#define       SXP_BUF_PTR     (SXP_BLOCK+0x4C)        /* RW*: SCSI Buffer Pointer */
++#define       SXP_BUF_CTR     (SXP_BLOCK+0x50)        /* RW*: SCSI Buffer Counter */
++#define       SXP_BUFFER      (SXP_BLOCK+0x52)        /* RW*: SCSI Buffer */
++#define       SXP_BUF_BYTE    (SXP_BLOCK+0x54)        /* RW*: SCSI Buffer Byte */
++#define       SXP_BUF_WD      (SXP_BLOCK+0x56)        /* RW*: SCSI Buffer Word */
++#define       SXP_BUF_WD_TRAN (SXP_BLOCK+0x58)        /* RW*: SCSI Buffer Wd xlate */
++#define       SXP_FIFO        (SXP_BLOCK+0x5A)        /* RW*: SCSI FIFO */
++#define       SXP_FIFO_STATUS (SXP_BLOCK+0x5C)        /* RW*: SCSI FIFO Status */
++#define       SXP_FIFO_TOP    (SXP_BLOCK+0x5E)        /* RW*: SCSI FIFO Top Resid */
++#define       SXP_FIFO_BOTTOM (SXP_BLOCK+0x60)        /* RW*: SCSI FIFO Bot Resid */
++#define       SXP_TRAN_REG    (SXP_BLOCK+0x64)        /* RW*: SCSI Transferr Reg */
++#define       SXP_TRAN_CNT_LO (SXP_BLOCK+0x68)        /* RW*: SCSI Trans Count */
++#define       SXP_TRAN_CNT_HI (SXP_BLOCK+0x6A)        /* RW*: SCSI Trans Count */
++#define       SXP_TRAN_CTR_LO (SXP_BLOCK+0x6C)        /* RW*: SCSI Trans Counter */
++#define       SXP_TRAN_CTR_HI (SXP_BLOCK+0x6E)        /* RW*: SCSI Trans Counter */
++#define       SXP_ARB_DATA    (SXP_BLOCK+0x70)        /* R  : SCSI Arb Data */
++#define       SXP_PINS_CTRL   (SXP_BLOCK+0x72)        /* RW*: SCSI Control Pins */
++#define       SXP_PINS_DATA   (SXP_BLOCK+0x74)        /* RW*: SCSI Data Pins */
++#define       SXP_PINS_DIFF   (SXP_BLOCK+0x76)        /* RW*: SCSI Diff Pins */
++
++/* for 1080/1280/1240 only */
++#define       SXP_BANK1_SELECT        0x100
++
++
++/* SXP CONF1 REGISTER */
++#define       SXP_CONF1_ASYNCH_SETUP          0xF000  /* Asynchronous setup time */
++#define       SXP_CONF1_SELECTION_UNIT        0x0000  /* Selection time unit */
++#define       SXP_CONF1_SELECTION_TIMEOUT     0x0600  /* Selection timeout */
++#define       SXP_CONF1_CLOCK_FACTOR          0x00E0  /* Clock factor */
++#define       SXP_CONF1_SCSI_ID               0x000F  /* SCSI id */
++
++/* SXP CONF2 REGISTER */
++#define       SXP_CONF2_DISABLE_FILTER        0x0040  /* Disable SCSI rec filters */
++#define       SXP_CONF2_REQ_ACK_PULLUPS       0x0020  /* Enable req/ack pullups */
++#define       SXP_CONF2_DATA_PULLUPS          0x0010  /* Enable data pullups */
++#define       SXP_CONF2_CONFIG_AUTOLOAD       0x0008  /* Enable dev conf auto-load */
++#define       SXP_CONF2_RESELECT              0x0002  /* Enable reselection */
++#define       SXP_CONF2_SELECT                0x0001  /* Enable selection */
++
++/* SXP INTERRUPT REGISTER */
++#define       SXP_INT_PARITY_ERR              0x8000  /* Parity error detected */
++#define       SXP_INT_GROSS_ERR               0x4000  /* Gross error detected */
++#define       SXP_INT_FUNCTION_ABORT          0x2000  /* Last cmd aborted */
++#define       SXP_INT_CONDITION_FAILED        0x1000  /* Last cond failed test */
++#define       SXP_INT_FIFO_EMPTY              0x0800  /* SCSI FIFO is empty */
++#define       SXP_INT_BUF_COUNTER_ZERO        0x0400  /* SCSI buf count == zero */
++#define       SXP_INT_XFER_ZERO               0x0200  /* SCSI trans count == zero */
++#define       SXP_INT_INT_PENDING             0x0080  /* SXP interrupt pending */
++#define       SXP_INT_CMD_RUNNING             0x0040  /* SXP is running a command */
++#define       SXP_INT_INT_RETURN_CODE         0x000F  /* Interrupt return code */
++
++
++/* SXP GROSS ERROR REGISTER */
++#define       SXP_GROSS_OFFSET_RESID          0x0040  /* Req/Ack offset not zero */
++#define       SXP_GROSS_OFFSET_UNDERFLOW      0x0020  /* Req/Ack offset underflow */
++#define       SXP_GROSS_OFFSET_OVERFLOW       0x0010  /* Req/Ack offset overflow */
++#define       SXP_GROSS_FIFO_UNDERFLOW        0x0008  /* SCSI FIFO underflow */
++#define       SXP_GROSS_FIFO_OVERFLOW         0x0004  /* SCSI FIFO overflow */
++#define       SXP_GROSS_WRITE_ERR             0x0002  /* SXP and RISC wrote to reg */
++#define       SXP_GROSS_ILLEGAL_INST          0x0001  /* Bad inst loaded into SXP */
++
++/* SXP EXCEPTION REGISTER */
++#define       SXP_EXCEPT_USER_0               0x8000  /* Enable user exception #0 */
++#define       SXP_EXCEPT_USER_1               0x4000  /* Enable user exception #1 */
++#define       PCI_SXP_EXCEPT_SCAM             0x0400  /* SCAM Selection enable */
++#define       SXP_EXCEPT_BUS_FREE             0x0200  /* Enable Bus Free det */
++#define       SXP_EXCEPT_TARGET_ATN           0x0100  /* Enable TGT mode atten det */
++#define       SXP_EXCEPT_RESELECTED           0x0080  /* Enable ReSEL exc handling */
++#define       SXP_EXCEPT_SELECTED             0x0040  /* Enable SEL exc handling */
++#define       SXP_EXCEPT_ARBITRATION          0x0020  /* Enable ARB exc handling */
++#define       SXP_EXCEPT_GROSS_ERR            0x0010  /* Enable gross error except */
++#define       SXP_EXCEPT_BUS_RESET            0x0008  /* Enable Bus Reset except */
++
++      /* SXP OVERRIDE REGISTER */
++#define       SXP_ORIDE_EXT_TRIGGER           0x8000  /* Enable external trigger */
++#define       SXP_ORIDE_STEP                  0x4000  /* Enable single step mode */
++#define       SXP_ORIDE_BREAKPOINT            0x2000  /* Enable breakpoint reg */
++#define       SXP_ORIDE_PIN_WRITE             0x1000  /* Enable write to SCSI pins */
++#define       SXP_ORIDE_FORCE_OUTPUTS         0x0800  /* Force SCSI outputs on */
++#define       SXP_ORIDE_LOOPBACK              0x0400  /* Enable SCSI loopback mode */
++#define       SXP_ORIDE_PARITY_TEST           0x0200  /* Enable parity test mode */
++#define       SXP_ORIDE_TRISTATE_ENA_PINS     0x0100  /* Tristate SCSI enable pins */
++#define       SXP_ORIDE_TRISTATE_PINS         0x0080  /* Tristate SCSI pins */
++#define       SXP_ORIDE_FIFO_RESET            0x0008  /* Reset SCSI FIFO */
++#define       SXP_ORIDE_CMD_TERMINATE         0x0004  /* Terminate cur SXP com */
++#define       SXP_ORIDE_RESET_REG             0x0002  /* Reset SXP registers */
++#define       SXP_ORIDE_RESET_MODULE          0x0001  /* Reset SXP module */
++
++/* SXP COMMANDS */
++#define       SXP_RESET_BUS_CMD               0x300b
++
++/* SXP SCSI ID REGISTER */
++#define       SXP_SELECTING_ID                0x0F00  /* (Re)Selecting id */
++#define       SXP_SELECT_ID                   0x000F  /* Select id */
++
++/* SXP DEV CONFIG1 REGISTER */
++#define       SXP_DCONF1_SYNC_HOLD            0x7000  /* Synchronous data hold */
++#define       SXP_DCONF1_SYNC_SETUP           0x0F00  /* Synchronous data setup */
++#define       SXP_DCONF1_SYNC_OFFSET          0x000F  /* Synchronous data offset */
++
++
++/* SXP DEV CONFIG2 REGISTER */
++#define       SXP_DCONF2_FLAGS_MASK           0xF000  /* Device flags */
++#define       SXP_DCONF2_WIDE                 0x0400  /* Enable wide SCSI */
++#define       SXP_DCONF2_PARITY               0x0200  /* Enable parity checking */
++#define       SXP_DCONF2_BLOCK_MODE           0x0100  /* Enable blk mode xfr count */
++#define       SXP_DCONF2_ASSERTION_MASK       0x0007  /* Assersion period mask */
++
++
++/* SXP PHASE POINTER REGISTER */
++#define       SXP_PHASE_STATUS_PTR            0x1000  /* Status buffer offset */
++#define       SXP_PHASE_MSG_IN_PTR            0x0700  /* Msg in buffer offset */
++#define       SXP_PHASE_COM_PTR               0x00F0  /* Command buffer offset */
++#define       SXP_PHASE_MSG_OUT_PTR           0x0007  /* Msg out buffer offset */
++
++
++/* SXP FIFO STATUS REGISTER */
++#define       SXP_FIFO_TOP_RESID              0x8000  /* Top residue reg full */
++#define       SXP_FIFO_ACK_RESID              0x4000  /* Wide transfers odd resid */
++#define       SXP_FIFO_COUNT_MASK             0x001C  /* Words in SXP FIFO */
++#define       SXP_FIFO_BOTTOM_RESID           0x0001  /* Bottom residue reg full */
++
++
++/* SXP CONTROL PINS REGISTER */
++#define       SXP_PINS_CON_PHASE              0x8000  /* Scsi phase valid */
++#define       SXP_PINS_CON_PARITY_HI          0x0400  /* Parity pin */
++#define       SXP_PINS_CON_PARITY_LO          0x0200  /* Parity pin */
++#define       SXP_PINS_CON_REQ                0x0100  /* SCSI bus REQUEST */
++#define       SXP_PINS_CON_ACK                0x0080  /* SCSI bus ACKNOWLEDGE */
++#define       SXP_PINS_CON_RST                0x0040  /* SCSI bus RESET */
++#define       SXP_PINS_CON_BSY                0x0020  /* SCSI bus BUSY */
++#define       SXP_PINS_CON_SEL                0x0010  /* SCSI bus SELECT */
++#define       SXP_PINS_CON_ATN                0x0008  /* SCSI bus ATTENTION */
++#define       SXP_PINS_CON_MSG                0x0004  /* SCSI bus MESSAGE */
++#define       SXP_PINS_CON_CD                 0x0002  /* SCSI bus COMMAND */
++#define       SXP_PINS_CON_IO                 0x0001  /* SCSI bus INPUT */
++
++/*
++ * Set the hold time for the SCSI Bus Reset to be 250 ms
++ */
++#define       SXP_SCSI_BUS_RESET_HOLD_TIME    250
++
++/* SXP DIFF PINS REGISTER */
++#define       SXP_PINS_DIFF_SENSE             0x0200  /* DIFFSENS sig on SCSI bus */
++#define       SXP_PINS_DIFF_MODE              0x0100  /* DIFFM signal */
++#define       SXP_PINS_DIFF_ENABLE_OUTPUT     0x0080  /* Enable SXP SCSI data drv */
++#define       SXP_PINS_DIFF_PINS_MASK         0x007C  /* Differential control pins */
++#define       SXP_PINS_DIFF_TARGET            0x0002  /* Enable SXP target mode */
++#define       SXP_PINS_DIFF_INITIATOR         0x0001  /* Enable SXP initiator mode */
++
++/* Ultra2 only */
++#define       SXP_PINS_LVD_MODE               0x1000
++#define       SXP_PINS_HVD_MODE               0x0800
++#define       SXP_PINS_SE_MODE                0x0400
++
++/* The above have to be put together with the DIFFM pin to make sense */
++#define       ISP1080_LVD_MODE                (SXP_PINS_LVD_MODE)
++#define       ISP1080_HVD_MODE                (SXP_PINS_HVD_MODE|SXP_PINS_DIFF_MODE)
++#define       ISP1080_SE_MODE                 (SXP_PINS_SE_MODE)
++#define       ISP1080_MODE_MASK       \
++    (SXP_PINS_LVD_MODE|SXP_PINS_HVD_MODE|SXP_PINS_SE_MODE|SXP_PINS_DIFF_MODE)
++
++/*
++ * RISC and Host Command and Control Block Register Offsets
++ */
++
++#define       RISC_ACC        RISC_BLOCK+0x0  /* RW*: Accumulator */
++#define       RISC_R1         RISC_BLOCK+0x2  /* RW*: GP Reg R1  */
++#define       RISC_R2         RISC_BLOCK+0x4  /* RW*: GP Reg R2  */
++#define       RISC_R3         RISC_BLOCK+0x6  /* RW*: GP Reg R3  */
++#define       RISC_R4         RISC_BLOCK+0x8  /* RW*: GP Reg R4  */
++#define       RISC_R5         RISC_BLOCK+0xA  /* RW*: GP Reg R5  */
++#define       RISC_R6         RISC_BLOCK+0xC  /* RW*: GP Reg R6  */
++#define       RISC_R7         RISC_BLOCK+0xE  /* RW*: GP Reg R7  */
++#define       RISC_R8         RISC_BLOCK+0x10 /* RW*: GP Reg R8  */
++#define       RISC_R9         RISC_BLOCK+0x12 /* RW*: GP Reg R9  */
++#define       RISC_R10        RISC_BLOCK+0x14 /* RW*: GP Reg R10 */
++#define       RISC_R11        RISC_BLOCK+0x16 /* RW*: GP Reg R11 */
++#define       RISC_R12        RISC_BLOCK+0x18 /* RW*: GP Reg R12 */
++#define       RISC_R13        RISC_BLOCK+0x1a /* RW*: GP Reg R13 */
++#define       RISC_R14        RISC_BLOCK+0x1c /* RW*: GP Reg R14 */
++#define       RISC_R15        RISC_BLOCK+0x1e /* RW*: GP Reg R15 */
++#define       RISC_PSR        RISC_BLOCK+0x20 /* RW*: Processor Status */
++#define       RISC_IVR        RISC_BLOCK+0x22 /* RW*: Interrupt Vector */
++#define       RISC_PCR        RISC_BLOCK+0x24 /* RW*: Processor Ctrl */
++#define       RISC_RAR0       RISC_BLOCK+0x26 /* RW*: Ram Address #0 */
++#define       RISC_RAR1       RISC_BLOCK+0x28 /* RW*: Ram Address #1 */
++#define       RISC_LCR        RISC_BLOCK+0x2a /* RW*: Loop Counter */
++#define       RISC_PC         RISC_BLOCK+0x2c /* R  : Program Counter */
++#define       RISC_MTR        RISC_BLOCK+0x2e /* RW*: Memory Timing */
++#define               RISC_MTR2100    RISC_BLOCK+0x30
++
++#define       RISC_EMB        RISC_BLOCK+0x30 /* RW*: Ext Mem Boundary */
++#define               DUAL_BANK       8
++#define       RISC_SP         RISC_BLOCK+0x32 /* RW*: Stack Pointer */
++#define       RISC_HRL        RISC_BLOCK+0x3e /* R *: Hardware Rev Level */
++#define       HCCR            RISC_BLOCK+0x40 /* RW : Host Command & Ctrl */
++#define       BP0             RISC_BLOCK+0x42 /* RW : Processor Brkpt #0 */
++#define       BP1             RISC_BLOCK+0x44 /* RW : Processor Brkpt #1 */
++#define       TCR             RISC_BLOCK+0x46 /*  W : Test Control */
++#define       TMR             RISC_BLOCK+0x48 /*  W : Test Mode */
++
++
++/* PROCESSOR STATUS REGISTER */
++#define       RISC_PSR_FORCE_TRUE             0x8000
++#define       RISC_PSR_LOOP_COUNT_DONE        0x4000
++#define       RISC_PSR_RISC_INT               0x2000
++#define       RISC_PSR_TIMER_ROLLOVER         0x1000
++#define       RISC_PSR_ALU_OVERFLOW           0x0800
++#define       RISC_PSR_ALU_MSB                0x0400
++#define       RISC_PSR_ALU_CARRY              0x0200
++#define       RISC_PSR_ALU_ZERO               0x0100
++
++#define       RISC_PSR_PCI_ULTRA              0x0080
++#define       RISC_PSR_SBUS_ULTRA             0x0020
++
++#define       RISC_PSR_DMA_INT                0x0010
++#define       RISC_PSR_SXP_INT                0x0008
++#define       RISC_PSR_HOST_INT               0x0004
++#define       RISC_PSR_INT_PENDING            0x0002
++#define       RISC_PSR_FORCE_FALSE            0x0001
++
++
++/* Host Command and Control */
++#define       HCCR_CMD_NOP                    0x0000  /* NOP */
++#define       HCCR_CMD_RESET                  0x1000  /* Reset RISC */
++#define       HCCR_CMD_PAUSE                  0x2000  /* Pause RISC */
++#define       HCCR_CMD_RELEASE                0x3000  /* Release Paused RISC */
++#define       HCCR_CMD_STEP                   0x4000  /* Single Step RISC */
++#define       HCCR_2X00_DISABLE_PARITY_PAUSE  0x4001  /*
++                                               * Disable RISC pause on FPM
++                                               * parity error.
++                                               */
++#define       HCCR_CMD_SET_HOST_INT           0x5000  /* Set Host Interrupt */
++#define       HCCR_CMD_CLEAR_HOST_INT         0x6000  /* Clear Host Interrupt */
++#define       HCCR_CMD_CLEAR_RISC_INT         0x7000  /* Clear RISC interrupt */
++#define       HCCR_CMD_BREAKPOINT             0x8000  /* Change breakpoint enables */
++#define       PCI_HCCR_CMD_BIOS               0x9000  /* Write BIOS (disable) */
++#define       PCI_HCCR_CMD_PARITY             0xA000  /* Write parity enable */
++#define       PCI_HCCR_CMD_PARITY_ERR         0xE000  /* Generate parity error */
++#define       HCCR_CMD_TEST_MODE              0xF000  /* Set Test Mode */
++
++#define       ISP2100_HCCR_PARITY_ENABLE_2    0x0400
++#define       ISP2100_HCCR_PARITY_ENABLE_1    0x0200
++#define       ISP2100_HCCR_PARITY_ENABLE_0    0x0100
++#define       ISP2100_HCCR_PARITY             0x0001
++
++#define       PCI_HCCR_PARITY                 0x0400  /* Parity error flag */
++#define       PCI_HCCR_PARITY_ENABLE_1        0x0200  /* Parity enable bank 1 */
++#define       PCI_HCCR_PARITY_ENABLE_0        0x0100  /* Parity enable bank 0 */
++
++#define       HCCR_HOST_INT                   0x0080  /* R  : Host interrupt set */
++#define       HCCR_RESET                      0x0040  /* R  : reset in progress */
++#define       HCCR_PAUSE                      0x0020  /* R  : RISC paused */
++
++#define       PCI_HCCR_BIOS                   0x0001  /*  W : BIOS enable */
++
++/*
++ * NVRAM Definitions (PCI cards only)
++ */
++
++#define       ISPBSMX(c, byte, shift, mask)   \
++      (((c)[(byte)] >> (shift)) & (mask))
++/*
++ * Qlogic 1020/1040 NVRAM is an array of 128 bytes.
++ *
++ * Some portion of the front of this is for general host adapter properties
++ * This is followed by an array of per-target parameters, and is tailed off
++ * with a checksum xor byte at offset 127. For non-byte entities data is
++ * stored in Little Endian order.
++ */
++
++#define       ISP_NVRAM_SIZE  128
++
++#define       ISP_NVRAM_VERSION(c)                    (c)[4]
++#define       ISP_NVRAM_FIFO_THRESHOLD(c)             ISPBSMX(c, 5, 0, 0x03)
++#define       ISP_NVRAM_BIOS_DISABLE(c)               ISPBSMX(c, 5, 2, 0x01)
++#define       ISP_NVRAM_HBA_ENABLE(c)                 ISPBSMX(c, 5, 3, 0x01)
++#define       ISP_NVRAM_INITIATOR_ID(c)               ISPBSMX(c, 5, 4, 0x0f)
++#define       ISP_NVRAM_BUS_RESET_DELAY(c)            (c)[6]
++#define       ISP_NVRAM_BUS_RETRY_COUNT(c)            (c)[7]
++#define       ISP_NVRAM_BUS_RETRY_DELAY(c)            (c)[8]
++#define       ISP_NVRAM_ASYNC_DATA_SETUP_TIME(c)      ISPBSMX(c, 9, 0, 0x0f)
++#define       ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(c)    ISPBSMX(c, 9, 4, 0x01)
++#define       ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(c)  ISPBSMX(c, 9, 5, 0x01)
++#define       ISP_NVRAM_DATA_DMA_BURST_ENABLE(c)      ISPBSMX(c, 9, 6, 0x01)
++#define       ISP_NVRAM_CMD_DMA_BURST_ENABLE(c)       ISPBSMX(c, 9, 7, 0x01)
++#define       ISP_NVRAM_TAG_AGE_LIMIT(c)              (c)[10]
++#define       ISP_NVRAM_LOWTRM_ENABLE(c)              ISPBSMX(c, 11, 0, 0x01)
++#define       ISP_NVRAM_HITRM_ENABLE(c)               ISPBSMX(c, 11, 1, 0x01)
++#define       ISP_NVRAM_PCMC_BURST_ENABLE(c)          ISPBSMX(c, 11, 2, 0x01)
++#define       ISP_NVRAM_ENABLE_60_MHZ(c)              ISPBSMX(c, 11, 3, 0x01)
++#define       ISP_NVRAM_SCSI_RESET_DISABLE(c)         ISPBSMX(c, 11, 4, 0x01)
++#define       ISP_NVRAM_ENABLE_AUTO_TERM(c)           ISPBSMX(c, 11, 5, 0x01)
++#define       ISP_NVRAM_FIFO_THRESHOLD_128(c)         ISPBSMX(c, 11, 6, 0x01)
++#define       ISP_NVRAM_AUTO_TERM_SUPPORT(c)          ISPBSMX(c, 11, 7, 0x01)
++#define       ISP_NVRAM_SELECTION_TIMEOUT(c)          (((c)[12]) | ((c)[13] << 8))
++#define       ISP_NVRAM_MAX_QUEUE_DEPTH(c)            (((c)[14]) | ((c)[15] << 8))
++#define       ISP_NVRAM_SCSI_BUS_SIZE(c)              ISPBSMX(c, 16, 0, 0x01)
++#define       ISP_NVRAM_SCSI_BUS_TYPE(c)              ISPBSMX(c, 16, 1, 0x01)
++#define       ISP_NVRAM_ADAPTER_CLK_SPEED(c)          ISPBSMX(c, 16, 2, 0x01)
++#define       ISP_NVRAM_SOFT_TERM_SUPPORT(c)          ISPBSMX(c, 16, 3, 0x01)
++#define       ISP_NVRAM_FLASH_ONBOARD(c)              ISPBSMX(c, 16, 4, 0x01)
++#define       ISP_NVRAM_FAST_MTTR_ENABLE(c)           ISPBSMX(c, 22, 0, 0x01)
++
++#define       ISP_NVRAM_TARGOFF                       28
++#define       ISP_NVARM_TARGSIZE                      6
++#define       _IxT(tgt, tidx)                 \
++      (ISP_NVRAM_TARGOFF + (ISP_NVARM_TARGSIZE * (tgt)) + (tidx))
++#define       ISP_NVRAM_TGT_RENEG(c, t)               ISPBSMX(c, _IxT(t, 0), 0, 0x01)
++#define       ISP_NVRAM_TGT_QFRZ(c, t)                ISPBSMX(c, _IxT(t, 0), 1, 0x01)
++#define       ISP_NVRAM_TGT_ARQ(c, t)                 ISPBSMX(c, _IxT(t, 0), 2, 0x01)
++#define       ISP_NVRAM_TGT_TQING(c, t)               ISPBSMX(c, _IxT(t, 0), 3, 0x01)
++#define       ISP_NVRAM_TGT_SYNC(c, t)                ISPBSMX(c, _IxT(t, 0), 4, 0x01)
++#define       ISP_NVRAM_TGT_WIDE(c, t)                ISPBSMX(c, _IxT(t, 0), 5, 0x01)
++#define       ISP_NVRAM_TGT_PARITY(c, t)              ISPBSMX(c, _IxT(t, 0), 6, 0x01)
++#define       ISP_NVRAM_TGT_DISC(c, t)                ISPBSMX(c, _IxT(t, 0), 7, 0x01)
++#define       ISP_NVRAM_TGT_EXEC_THROTTLE(c, t)       ISPBSMX(c, _IxT(t, 1), 0, 0xff)
++#define       ISP_NVRAM_TGT_SYNC_PERIOD(c, t)         ISPBSMX(c, _IxT(t, 2), 0, 0xff)
++#define       ISP_NVRAM_TGT_SYNC_OFFSET(c, t)         ISPBSMX(c, _IxT(t, 3), 0, 0x0f)
++#define       ISP_NVRAM_TGT_DEVICE_ENABLE(c, t)       ISPBSMX(c, _IxT(t, 3), 4, 0x01)
++#define       ISP_NVRAM_TGT_LUN_DISABLE(c, t)         ISPBSMX(c, _IxT(t, 3), 5, 0x01)
++
++/*
++ * Qlogic 1080/1240 NVRAM is an array of 256 bytes.
++ *
++ * Some portion of the front of this is for general host adapter properties
++ * This is followed by an array of per-target parameters, and is tailed off
++ * with a checksum xor byte at offset 256. For non-byte entities data is
++ * stored in Little Endian order.
++ */
++
++#define       ISP1080_NVRAM_SIZE      256
++
++#define       ISP1080_NVRAM_VERSION(c)                ISP_NVRAM_VERSION(c)
++
++/* Offset 5 */
++/*
++      u_int8_t bios_configuration_mode     :2;
++      u_int8_t bios_disable                :1;
++      u_int8_t selectable_scsi_boot_enable :1;
++      u_int8_t cd_rom_boot_enable          :1;
++      u_int8_t disable_loading_risc_code   :1;
++      u_int8_t enable_64bit_addressing     :1;
++      u_int8_t unused_7                    :1;
++ */
++
++/* Offsets 6, 7 */
++/*
++        u_int8_t boot_lun_number    :5;
++        u_int8_t scsi_bus_number    :1;
++        u_int8_t unused_6           :1;
++        u_int8_t unused_7           :1;
++        u_int8_t boot_target_number :4;
++        u_int8_t unused_12          :1;
++        u_int8_t unused_13          :1;
++        u_int8_t unused_14          :1;
++        u_int8_t unused_15          :1;
++ */
++
++#define       ISP1080_NVRAM_HBA_ENABLE(c)                     ISPBSMX(c, 16, 3, 0x01)
++
++#define       ISP1080_NVRAM_BURST_ENABLE(c)                   ISPBSMX(c, 16, 1, 0x01)
++#define       ISP1080_NVRAM_FIFO_THRESHOLD(c)                 ISPBSMX(c, 16, 4, 0x0f)
++
++#define       ISP1080_NVRAM_AUTO_TERM_SUPPORT(c)              ISPBSMX(c, 17, 7, 0x01)
++#define       ISP1080_NVRAM_BUS0_TERM_MODE(c)                 ISPBSMX(c, 17, 0, 0x03)
++#define       ISP1080_NVRAM_BUS1_TERM_MODE(c)                 ISPBSMX(c, 17, 2, 0x03)
++
++#define       ISP1080_ISP_PARAMETER(c)                        \
++      (((c)[18]) | ((c)[19] << 8))
++
++#define       ISP1080_FAST_POST(c)                            ISPBSMX(c, 20, 0, 0x01)
++#define       ISP1080_REPORT_LVD_TRANSITION(c)                ISPBSMX(c, 20, 1, 0x01)
++
++#define       ISP1080_BUS1_OFF                                112
++
++#define       ISP1080_NVRAM_INITIATOR_ID(c, b)                \
++      ISPBSMX(c, ((b == 0)? 0 : ISP1080_BUS1_OFF) + 24, 0, 0x0f)
++#define       ISP1080_NVRAM_BUS_RESET_DELAY(c, b)             \
++      (c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 25]
++#define       ISP1080_NVRAM_BUS_RETRY_COUNT(c, b)             \
++      (c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 26]
++#define       ISP1080_NVRAM_BUS_RETRY_DELAY(c, b)             \
++      (c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 27]
++
++#define       ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(c, b)       \
++      ISPBSMX(c, ((b == 0)? 0 : ISP1080_BUS1_OFF) + 28, 0, 0x0f)
++#define       ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(c, b)     \
++      ISPBSMX(c, ((b == 0)? 0 : ISP1080_BUS1_OFF) + 28, 4, 0x01)
++#define       ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(c, b)   \
++      ISPBSMX(c, ((b == 0)? 0 : ISP1080_BUS1_OFF) + 28, 5, 0x01)
++#define       ISP1080_NVRAM_SELECTION_TIMEOUT(c, b)           \
++      (((c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 30]) | \
++      ((c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 31] << 8))
++#define       ISP1080_NVRAM_MAX_QUEUE_DEPTH(c, b)             \
++      (((c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 32]) | \
++      ((c)[((b == 0)? 0 : ISP1080_BUS1_OFF) + 33] << 8))
++
++#define       ISP1080_NVRAM_TARGOFF(b)                \
++      ((b == 0)? 40: (40 + ISP1080_BUS1_OFF))
++#define       ISP1080_NVRAM_TARGSIZE                  6
++#define       _IxT8(tgt, tidx, b)                     \
++      (ISP1080_NVRAM_TARGOFF((b)) + (ISP1080_NVRAM_TARGSIZE * (tgt)) + (tidx))
++
++#define       ISP1080_NVRAM_TGT_RENEG(c, t, b)                \
++      ISPBSMX(c, _IxT8(t, 0, (b)), 0, 0x01)
++#define       ISP1080_NVRAM_TGT_QFRZ(c, t, b)                 \
++      ISPBSMX(c, _IxT8(t, 0, (b)), 1, 0x01)
++#define       ISP1080_NVRAM_TGT_ARQ(c, t, b)                  \
++      ISPBSMX(c, _IxT8(t, 0, (b)), 2, 0x01)
++#define       ISP1080_NVRAM_TGT_TQING(c, t, b)                \
++      ISPBSMX(c, _IxT8(t, 0, (b)), 3, 0x01)
++#define       ISP1080_NVRAM_TGT_SYNC(c, t, b)                 \
++      ISPBSMX(c, _IxT8(t, 0, (b)), 4, 0x01)
++#define       ISP1080_NVRAM_TGT_WIDE(c, t, b)                 \
++      ISPBSMX(c, _IxT8(t, 0, (b)), 5, 0x01)
++#define       ISP1080_NVRAM_TGT_PARITY(c, t, b)               \
++      ISPBSMX(c, _IxT8(t, 0, (b)), 6, 0x01)
++#define       ISP1080_NVRAM_TGT_DISC(c, t, b)                 \
++      ISPBSMX(c, _IxT8(t, 0, (b)), 7, 0x01)
++#define       ISP1080_NVRAM_TGT_EXEC_THROTTLE(c, t, b)        \
++      ISPBSMX(c, _IxT8(t, 1, (b)), 0, 0xff)
++#define       ISP1080_NVRAM_TGT_SYNC_PERIOD(c, t, b)          \
++      ISPBSMX(c, _IxT8(t, 2, (b)), 0, 0xff)
++#define       ISP1080_NVRAM_TGT_SYNC_OFFSET(c, t, b)          \
++      ISPBSMX(c, _IxT8(t, 3, (b)), 0, 0x0f)
++#define       ISP1080_NVRAM_TGT_DEVICE_ENABLE(c, t, b)        \
++      ISPBSMX(c, _IxT8(t, 3, (b)), 4, 0x01)
++#define       ISP1080_NVRAM_TGT_LUN_DISABLE(c, t, b)          \
++      ISPBSMX(c, _IxT8(t, 3, (b)), 5, 0x01)
++
++#define       ISP12160_NVRAM_HBA_ENABLE       ISP1080_NVRAM_HBA_ENABLE
++#define       ISP12160_NVRAM_BURST_ENABLE     ISP1080_NVRAM_BURST_ENABLE
++#define       ISP12160_NVRAM_FIFO_THRESHOLD   ISP1080_NVRAM_FIFO_THRESHOLD
++#define       ISP12160_NVRAM_AUTO_TERM_SUPPORT        ISP1080_NVRAM_AUTO_TERM_SUPPORT
++#define       ISP12160_NVRAM_BUS0_TERM_MODE   ISP1080_NVRAM_BUS0_TERM_MODE
++#define       ISP12160_NVRAM_BUS1_TERM_MODE   ISP1080_NVRAM_BUS1_TERM_MODE
++#define       ISP12160_ISP_PARAMETER          ISP12160_ISP_PARAMETER
++#define       ISP12160_FAST_POST              ISP1080_FAST_POST
++#define       ISP12160_REPORT_LVD_TRANSITION  ISP1080_REPORT_LVD_TRANSTION
++
++#define       ISP12160_NVRAM_INITIATOR_ID                     \
++      ISP1080_NVRAM_INITIATOR_ID
++#define       ISP12160_NVRAM_BUS_RESET_DELAY                  \
++      ISP1080_NVRAM_BUS_RESET_DELAY
++#define       ISP12160_NVRAM_BUS_RETRY_COUNT                  \
++      ISP1080_NVRAM_BUS_RETRY_COUNT
++#define       ISP12160_NVRAM_BUS_RETRY_DELAY                  \
++      ISP1080_NVRAM_BUS_RETRY_DELAY
++#define       ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME            \
++      ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME
++#define       ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION          \
++      ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION
++#define       ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION        \
++      ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION
++#define       ISP12160_NVRAM_SELECTION_TIMEOUT                \
++      ISP1080_NVRAM_SELECTION_TIMEOUT
++#define       ISP12160_NVRAM_MAX_QUEUE_DEPTH                  \
++      ISP1080_NVRAM_MAX_QUEUE_DEPTH
++
++
++#define       ISP12160_BUS0_OFF       24
++#define       ISP12160_BUS1_OFF       136
++
++#define       ISP12160_NVRAM_TARGOFF(b)               \
++      (((b == 0)? ISP12160_BUS0_OFF : ISP12160_BUS1_OFF) + 16)
++
++#define       ISP12160_NVRAM_TARGSIZE                 6
++#define       _IxT16(tgt, tidx, b)                    \
++      (ISP12160_NVRAM_TARGOFF((b))+(ISP12160_NVRAM_TARGSIZE * (tgt))+(tidx))
++
++#define       ISP12160_NVRAM_TGT_RENEG(c, t, b)               \
++      ISPBSMX(c, _IxT16(t, 0, (b)), 0, 0x01)
++#define       ISP12160_NVRAM_TGT_QFRZ(c, t, b)                \
++      ISPBSMX(c, _IxT16(t, 0, (b)), 1, 0x01)
++#define       ISP12160_NVRAM_TGT_ARQ(c, t, b)                 \
++      ISPBSMX(c, _IxT16(t, 0, (b)), 2, 0x01)
++#define       ISP12160_NVRAM_TGT_TQING(c, t, b)               \
++      ISPBSMX(c, _IxT16(t, 0, (b)), 3, 0x01)
++#define       ISP12160_NVRAM_TGT_SYNC(c, t, b)                \
++      ISPBSMX(c, _IxT16(t, 0, (b)), 4, 0x01)
++#define       ISP12160_NVRAM_TGT_WIDE(c, t, b)                \
++      ISPBSMX(c, _IxT16(t, 0, (b)), 5, 0x01)
++#define       ISP12160_NVRAM_TGT_PARITY(c, t, b)              \
++      ISPBSMX(c, _IxT16(t, 0, (b)), 6, 0x01)
++#define       ISP12160_NVRAM_TGT_DISC(c, t, b)                \
++      ISPBSMX(c, _IxT16(t, 0, (b)), 7, 0x01)
++
++#define       ISP12160_NVRAM_TGT_EXEC_THROTTLE(c, t, b)       \
++      ISPBSMX(c, _IxT16(t, 1, (b)), 0, 0xff)
++#define       ISP12160_NVRAM_TGT_SYNC_PERIOD(c, t, b)         \
++      ISPBSMX(c, _IxT16(t, 2, (b)), 0, 0xff)
++
++#define       ISP12160_NVRAM_TGT_SYNC_OFFSET(c, t, b)         \
++      ISPBSMX(c, _IxT16(t, 3, (b)), 0, 0x1f)
++#define       ISP12160_NVRAM_TGT_DEVICE_ENABLE(c, t, b)       \
++      ISPBSMX(c, _IxT16(t, 3, (b)), 5, 0x01)
++
++#define       ISP12160_NVRAM_PPR_OPTIONS(c, t, b)             \
++      ISPBSMX(c, _IxT16(t, 4, (b)), 0, 0x0f)
++#define       ISP12160_NVRAM_PPR_WIDTH(c, t, b)               \
++      ISPBSMX(c, _IxT16(t, 4, (b)), 4, 0x03)
++#define       ISP12160_NVRAM_PPR_ENABLE(c, t, b)              \
++      ISPBSMX(c, _IxT16(t, 4, (b)), 7, 0x01)
++
++/*
++ * Qlogic 2XXX NVRAM is an array of 256 bytes.
++ *
++ * Some portion of the front of this is for general RISC engine parameters,
++ * mostly reflecting the state of the last INITIALIZE FIRMWARE mailbox command.
++ *
++ * This is followed by some general host adapter parameters, and ends with
++ * a checksum xor byte at offset 255. For non-byte entities data is stored
++ * in Little Endian order.
++ */
++#define       ISP2100_NVRAM_SIZE      256
++/* ISP_NVRAM_VERSION is in same overall place */
++#define       ISP2100_NVRAM_RISCVER(c)                (c)[6]
++#define       ISP2100_NVRAM_OPTIONS(c)                (c)[8]
++#define       ISP2100_NVRAM_MAXFRAMELENGTH(c)         (((c)[10]) | ((c)[11] << 8))
++#define       ISP2100_NVRAM_MAXIOCBALLOCATION(c)      (((c)[12]) | ((c)[13] << 8))
++#define       ISP2100_NVRAM_EXECUTION_THROTTLE(c)     (((c)[14]) | ((c)[15] << 8))
++#define       ISP2100_NVRAM_RETRY_COUNT(c)            (c)[16]
++#define       ISP2100_NVRAM_RETRY_DELAY(c)            (c)[17]
++
++#define       ISP2100_NVRAM_PORT_NAME(c)      (\
++              (((u_int64_t)(c)[18]) << 56) | \
++              (((u_int64_t)(c)[19]) << 48) | \
++              (((u_int64_t)(c)[20]) << 40) | \
++              (((u_int64_t)(c)[21]) << 32) | \
++              (((u_int64_t)(c)[22]) << 24) | \
++              (((u_int64_t)(c)[23]) << 16) | \
++              (((u_int64_t)(c)[24]) <<  8) | \
++              (((u_int64_t)(c)[25]) <<  0))
++
++#define       ISP2100_NVRAM_HARDLOOPID(c)             (c)[26]
++
++#define       ISP2200_NVRAM_NODE_NAME(c)      (\
++              (((u_int64_t)(c)[30]) << 56) | \
++              (((u_int64_t)(c)[31]) << 48) | \
++              (((u_int64_t)(c)[32]) << 40) | \
++              (((u_int64_t)(c)[33]) << 32) | \
++              (((u_int64_t)(c)[34]) << 24) | \
++              (((u_int64_t)(c)[35]) << 16) | \
++              (((u_int64_t)(c)[36]) <<  8) | \
++              (((u_int64_t)(c)[37]) <<  0))
++
++#define       ISP2100_NVRAM_HBA_OPTIONS(c)            (c)[70]
++#define       ISP2100_NVRAM_HBA_DISABLE(c)            ISPBSMX(c, 70, 0, 0x01)
++#define       ISP2100_NVRAM_BIOS_DISABLE(c)           ISPBSMX(c, 70, 1, 0x01)
++#define       ISP2100_NVRAM_LUN_DISABLE(c)            ISPBSMX(c, 70, 2, 0x01)
++#define       ISP2100_NVRAM_ENABLE_SELECT_BOOT(c)     ISPBSMX(c, 70, 3, 0x01)
++#define       ISP2100_NVRAM_DISABLE_CODELOAD(c)       ISPBSMX(c, 70, 4, 0x01)
++#define       ISP2100_NVRAM_SET_CACHELINESZ(c)        ISPBSMX(c, 70, 5, 0x01)
++
++#define       ISP2100_NVRAM_BOOT_NODE_NAME(c) (\
++              (((u_int64_t)(c)[72]) << 56) | \
++              (((u_int64_t)(c)[73]) << 48) | \
++              (((u_int64_t)(c)[74]) << 40) | \
++              (((u_int64_t)(c)[75]) << 32) | \
++              (((u_int64_t)(c)[76]) << 24) | \
++              (((u_int64_t)(c)[77]) << 16) | \
++              (((u_int64_t)(c)[78]) <<  8) | \
++              (((u_int64_t)(c)[79]) <<  0))
++
++#define       ISP2100_NVRAM_BOOT_LUN(c)               (c)[80]
++
++#define       ISP2200_HBA_FEATURES(c)                 (c)[232] | ((c)[233] << 8)
++
++/*
++ * Firmware Crash Dump
++ *
++ * QLogic needs specific information format when they look at firmware crashes.
++ *
++ * This is incredibly kernel memory consumptive (to say the least), so this
++ * code is only compiled in when needed.
++ */
++
++#define       QLA2200_RISC_IMAGE_DUMP_SIZE                                    \
++      (1 * sizeof (u_int16_t)) +      /* 'used' flag (also HBA type) */ \
++      (352 * sizeof (u_int16_t)) +    /* RISC registers */            \
++      (61440 * sizeof (u_int16_t))    /* RISC SRAM (offset 0x1000..0xffff) */
++#define       QLA2300_RISC_IMAGE_DUMP_SIZE                                    \
++      (1 * sizeof (u_int16_t)) +      /* 'used' flag (also HBA type) */ \
++      (464 * sizeof (u_int16_t)) +    /* RISC registers */            \
++      (63488 * sizeof (u_int16_t)) +  /* RISC SRAM (0x0800..0xffff) */ \
++      (4096 * sizeof (u_int16_t)) +   /* RISC SRAM (0x10000..0x10FFF) */ \
++      (61440 * sizeof (u_int16_t))    /* RISC SRAM (0x11000..0x1FFFF) */
++/* the larger of the two */
++#define       ISP_CRASH_IMAGE_SIZE    QLA2300_RISC_IMAGE_DUMP_SIZE
++#endif        /* _ISPREG_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_target.c   2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,1195 @@
++/* @(#)isp_target.c 1.21 */
++/*
++ * Machine and OS Independent Target Mode Code for the Qlogic SCSI/FC adapters.
++ *
++ * Copyright (c) 1999, 2000, 2001 by Matthew Jacob
++ * All rights reserved.
++ * mjacob@feral.com
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ */
++
++/*
++ * Bug fixes gratefully acknowledged from:
++ *    Oded Kedem <oded@kashya.com>
++ */
++/*
++ * Include header file appropriate for platform we're building on.
++ */
++
++#ifdef        __NetBSD__
++#include <dev/ic/isp_netbsd.h>
++#endif
++#ifdef        __FreeBSD__
++#include <dev/isp/isp_freebsd.h>
++#endif
++#ifdef        __OpenBSD__
++#include <dev/ic/isp_openbsd.h>
++#endif
++#ifdef        __linux__
++#include "isp_linux.h"
++#endif
++
++#ifdef        ISP_TARGET_MODE
++static const char atiocope[] =
++    "ATIO returned for lun %d because it was in the middle of Bus Device Reset "
++    "on bus %d";
++static const char atior[] =
++    "ATIO returned on for lun %d on from IID %d because a Bus Reset occurred "
++    "on bus %d";
++
++static void isp_got_msg(struct ispsoftc *, int, in_entry_t *);
++static void isp_got_msg_fc(struct ispsoftc *, int, in_fcentry_t *);
++static void isp_notify_ack(struct ispsoftc *, void *);
++static void isp_handle_atio(struct ispsoftc *, at_entry_t *);
++static void isp_handle_atio2(struct ispsoftc *, at2_entry_t *);
++static void isp_handle_ctio(struct ispsoftc *, ct_entry_t *);
++static void isp_handle_ctio2(struct ispsoftc *, ct2_entry_t *);
++
++/*
++ * The Qlogic driver gets an interrupt to look at response queue entries.
++ * Some of these are status completions for initiatior mode commands, but
++ * if target mode is enabled, we get a whole wad of response queue entries
++ * to be handled here.
++ *
++ * Basically the split into 3 main groups: Lun Enable/Modification responses,
++ * SCSI Command processing, and Immediate Notification events.
++ *
++ * You start by writing a request queue entry to enable target mode (and
++ * establish some resource limitations which you can modify later).
++ * The f/w responds with a LUN ENABLE or LUN MODIFY response with
++ * the status of this action. If the enable was successful, you can expect...
++ *
++ * Response queue entries with SCSI commands encapsulate show up in an ATIO
++ * (Accept Target IO) type- sometimes with enough info to stop the command at
++ * this level. Ultimately the driver has to feed back to the f/w's request
++ * queue a sequence of CTIOs (continue target I/O) that describe data to
++ * be moved and/or status to be sent) and finally finishing with sending
++ * to the f/w's response queue an ATIO which then completes the handshake
++ * with the f/w for that command. There's a lot of variations on this theme,
++ * including flags you can set in the CTIO for the Qlogic 2X00 fibre channel
++ * cards that 'auto-replenish' the f/w's ATIO count, but this is the basic
++ * gist of it.
++ *
++ * The third group that can show up in the response queue are Immediate
++ * Notification events. These include things like notifications of SCSI bus
++ * resets, or Bus Device Reset messages or other messages received. This
++ * a classic oddbins area. It can get  a little weird because you then turn
++ * around and acknowledge the Immediate Notify by writing an entry onto the
++ * request queue and then the f/w turns around and gives you an acknowledgement
++ * to *your* acknowledgement on the response queue (the idea being to let
++ * the f/w tell you when the event is *really* over I guess).
++ *
++ */
++
++
++/*
++ * A new response queue entry has arrived. The interrupt service code
++ * has already swizzled it into the platform dependent from canonical form.
++ *
++ * Because of the way this driver is designed, unfortunately most of the
++ * actual synchronization work has to be done in the platform specific
++ * code- we have no synchroniation primitives in the common code.
++ */
++
++int
++isp_target_notify(struct ispsoftc *isp, void *vptr, u_int16_t *optrp)
++{
++      u_int16_t status, seqid;
++      union {
++              at_entry_t      *atiop;
++              at2_entry_t     *at2iop;
++              ct_entry_t      *ctiop;
++              ct2_entry_t     *ct2iop;
++              lun_entry_t     *lunenp;
++              in_entry_t      *inotp;
++              in_fcentry_t    *inot_fcp;
++              na_entry_t      *nackp;
++              na_fcentry_t    *nack_fcp;
++              isphdr_t        *hp;
++              void *          *vp;
++#define       atiop           unp.atiop
++#define       at2iop          unp.at2iop
++#define       ctiop           unp.ctiop
++#define       ct2iop          unp.ct2iop
++#define       lunenp          unp.lunenp
++#define       inotp           unp.inotp
++#define       inot_fcp        unp.inot_fcp
++#define       nackp           unp.nackp
++#define       nack_fcp        unp.nack_fcp
++#define       hdrp            unp.hp
++      } unp;
++      u_int8_t local[QENTRY_LEN];
++      int bus, type, rval = 1;
++
++      type = isp_get_response_type(isp, (isphdr_t *)vptr);
++      unp.vp = vptr;
++
++      ISP_TDQE(isp, "isp_target_notify", (int) *optrp, vptr);
++
++      switch(type) {
++      case RQSTYPE_ATIO:
++              isp_get_atio(isp, atiop, (at_entry_t *) local);
++              isp_handle_atio(isp, (at_entry_t *) local);
++              break;
++      case RQSTYPE_CTIO:
++              isp_get_ctio(isp, ctiop, (ct_entry_t *) local);
++              isp_handle_ctio(isp, (ct_entry_t *) local);
++              break;
++      case RQSTYPE_ATIO2:
++              isp_get_atio2(isp, at2iop, (at2_entry_t *) local);
++              isp_handle_atio2(isp, (at2_entry_t *) local);
++              break;
++      case RQSTYPE_CTIO2:
++              isp_get_ctio2(isp, ct2iop, (ct2_entry_t *) local);
++              isp_handle_ctio2(isp, (ct2_entry_t *) local);
++              break;
++      case RQSTYPE_ENABLE_LUN:
++      case RQSTYPE_MODIFY_LUN:
++              isp_get_enable_lun(isp, lunenp, (lun_entry_t *) local);
++              (void) isp_async(isp, ISPASYNC_TARGET_ACTION, local);
++              break;
++
++      case RQSTYPE_NOTIFY:
++              /*
++               * Either the ISP received a SCSI message it can't
++               * handle, or it's returning an Immed. Notify entry
++               * we sent. We can send Immed. Notify entries to
++               * increment the firmware's resource count for them
++               * (we set this initially in the Enable Lun entry).
++               */
++              bus = 0;
++              if (IS_FC(isp)) {
++                      isp_get_notify_fc(isp, inot_fcp, (in_fcentry_t *)local);
++                      inot_fcp = (in_fcentry_t *) local;
++                      status = inot_fcp->in_status;
++                      seqid = inot_fcp->in_seqid;
++              } else {
++                      isp_get_notify(isp, inotp, (in_entry_t *)local);
++                      inotp = (in_entry_t *) local;
++                      status = inotp->in_status & 0xff;
++                      seqid = inotp->in_seqid;
++                      if (IS_DUALBUS(isp)) {
++                              bus = GET_BUS_VAL(inotp->in_iid);
++                              SET_BUS_VAL(inotp->in_iid, 0);
++                      }
++              }
++              isp_prt(isp, ISP_LOGTDEBUG0,
++                  "Immediate Notify On Bus %d, status=0x%x seqid=0x%x",
++                  bus, status, seqid);
++
++              /*
++               * ACK it right away.
++               */
++              isp_notify_ack(isp, (status == IN_RESET)? NULL : local);
++              switch (status) {
++              case IN_RESET:
++                      (void) isp_async(isp, ISPASYNC_BUS_RESET, &bus);
++                      break;
++              case IN_MSG_RECEIVED:
++              case IN_IDE_RECEIVED:
++                      if (IS_FC(isp)) {
++                              isp_got_msg_fc(isp, bus, (in_fcentry_t *)local);
++                      } else {
++                              isp_got_msg(isp, bus, (in_entry_t *)local);
++                      }
++                      break;
++              case IN_RSRC_UNAVAIL:
++                      isp_prt(isp, ISP_LOGWARN, "Firmware out of ATIOs");
++                      break;
++              case IN_PORT_LOGOUT:
++              case IN_ABORT_TASK:
++              case IN_PORT_CHANGED:
++              case IN_GLOBAL_LOGO:
++                      (void) isp_async(isp, ISPASYNC_TARGET_ACTION, &local);
++                      break;
++              default:
++                      isp_prt(isp, ISP_LOGERR,
++                          "bad status (0x%x) in isp_target_notify", status);
++                      break;
++              }
++              break;
++
++      case RQSTYPE_NOTIFY_ACK:
++              /*
++               * The ISP is acknowledging our acknowledgement of an
++               * Immediate Notify entry for some asynchronous event.
++               */
++              if (IS_FC(isp)) {
++                      isp_get_notify_ack_fc(isp, nack_fcp,
++                          (na_fcentry_t *)local);
++                      nack_fcp = (na_fcentry_t *)local;
++                      isp_prt(isp, ISP_LOGTDEBUG1,
++                          "Notify Ack status=0x%x seqid 0x%x",
++                          nack_fcp->na_status, nack_fcp->na_seqid);
++              } else {
++                      isp_get_notify_ack(isp, nackp, (na_entry_t *)local);
++                      nackp = (na_entry_t *)local;
++                      isp_prt(isp, ISP_LOGTDEBUG1,
++                          "Notify Ack event 0x%x status=0x%x seqid 0x%x",
++                          nackp->na_event, nackp->na_status, nackp->na_seqid);
++              }
++              break;
++      default:
++              isp_prt(isp, ISP_LOGERR,
++                  "Unknown entry type 0x%x in isp_target_notify", type);
++              rval = 0;
++              break;
++      }
++#undef        atiop
++#undef        at2iop
++#undef        ctiop
++#undef        ct2iop
++#undef        lunenp
++#undef        inotp
++#undef        inot_fcp
++#undef        nackp
++#undef        nack_fcp
++#undef        hdrp
++      return (rval);
++}
++
++ 
++/*
++ * Toggle (on/off) target mode for bus/target/lun
++ *
++ * The caller has checked for overlap and legality.
++ *
++ * Note that not all of bus, target or lun can be paid attention to.
++ * Note also that this action will not be complete until the f/w writes
++ * response entry. The caller is responsible for synchronizing this.
++ */
++int
++isp_lun_cmd(struct ispsoftc *isp, int cmd, int bus, int tgt, int lun,
++    int cmd_cnt, int inot_cnt, u_int32_t opaque)
++{
++      lun_entry_t el;
++      u_int16_t nxti, optr;
++      void *outp;
++
++
++      MEMZERO(&el, sizeof (el));
++      if (IS_DUALBUS(isp)) {
++              el.le_rsvd = (bus & 0x1) << 7;
++      }
++      el.le_cmd_count = cmd_cnt;
++      el.le_in_count = inot_cnt;
++      if (cmd == RQSTYPE_ENABLE_LUN) {
++              if (IS_SCSI(isp)) {
++                      el.le_flags = LUN_TQAE|LUN_DISAD;
++                      el.le_cdb6len = 12;
++                      el.le_cdb7len = 12;
++              }
++      } else if (cmd == -RQSTYPE_ENABLE_LUN) {
++              cmd = RQSTYPE_ENABLE_LUN;
++              el.le_cmd_count = 0;
++              el.le_in_count = 0;
++      } else if (cmd == -RQSTYPE_MODIFY_LUN) {
++              cmd = RQSTYPE_MODIFY_LUN;
++              el.le_ops = LUN_CCDECR | LUN_INDECR;
++      } else {
++              el.le_ops = LUN_CCINCR | LUN_ININCR;
++      }
++      el.le_header.rqs_entry_type = cmd;
++      el.le_header.rqs_entry_count = 1;
++      el.le_reserved = opaque;
++      if (IS_SCSI(isp)) {
++              el.le_tgt = tgt;
++              el.le_lun = lun;
++      } else if ((FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) == 0) {
++              el.le_lun = lun;
++      }
++      el.le_timeout = 2;
++
++      if (isp_getrqentry(isp, &nxti, &optr, &outp)) {
++              isp_prt(isp, ISP_LOGERR,
++                  "Request Queue Overflow in isp_lun_cmd");
++              return (-1);
++      }
++      ISP_TDQE(isp, "isp_lun_cmd", (int) optr, &el);
++      isp_put_enable_lun(isp, &el, outp);
++      ISP_ADD_REQUEST(isp, nxti);
++      return (0);
++}
++
++
++int
++isp_target_put_entry(struct ispsoftc *isp, void *ap)
++{
++      void *outp;
++      u_int16_t nxti, optr;
++      u_int8_t etype = ((isphdr_t *) ap)->rqs_entry_type;
++
++      if (isp_getrqentry(isp, &nxti, &optr, &outp)) {
++              isp_prt(isp, ISP_LOGWARN,
++                  "Request Queue Overflow in isp_target_put_entry");
++              return (-1);
++      }
++      switch (etype) {
++      case RQSTYPE_ATIO:
++              isp_put_atio(isp, (at_entry_t *) ap, (at_entry_t *) outp);
++              break;
++      case RQSTYPE_ATIO2:
++              isp_put_atio2(isp, (at2_entry_t *) ap, (at2_entry_t *) outp);
++              break;
++      case RQSTYPE_CTIO:
++              isp_put_ctio(isp, (ct_entry_t *) ap, (ct_entry_t *) outp);
++              break;
++      case RQSTYPE_CTIO2:
++              isp_put_ctio2(isp, (ct2_entry_t *) ap, (ct2_entry_t *) outp);
++              break;
++      default:
++              isp_prt(isp, ISP_LOGERR,
++                  "Unknown type 0x%x in isp_put_entry", etype);
++              return (-1);
++      }
++
++      ISP_TDQE(isp, "isp_target_put_entry", (int) optr, ap);
++      ISP_ADD_REQUEST(isp, nxti);
++      return (0);
++}
++
++int
++isp_target_put_atio(struct ispsoftc *isp, void *arg)
++{
++      union {
++              at_entry_t _atio;
++              at2_entry_t _atio2;
++      } atun;
++
++      MEMZERO(&atun, sizeof atun);
++      if (IS_FC(isp)) {
++              at2_entry_t *aep = arg;
++              atun._atio2.at_header.rqs_entry_type = RQSTYPE_ATIO2;
++              atun._atio2.at_header.rqs_entry_count = 1;
++              if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++                      atun._atio2.at_scclun = (u_int16_t) aep->at_scclun;
++              } else {
++                      atun._atio2.at_lun = (u_int8_t) aep->at_lun;
++              }
++              atun._atio2.at_iid = aep->at_iid;
++              atun._atio2.at_rxid = aep->at_rxid;
++              atun._atio2.at_status = CT_OK;
++      } else {
++              at_entry_t *aep = arg;
++              atun._atio.at_header.rqs_entry_type = RQSTYPE_ATIO;
++              atun._atio.at_header.rqs_entry_count = 1;
++              atun._atio.at_handle = aep->at_handle;
++              atun._atio.at_iid = aep->at_iid;
++              atun._atio.at_tgt = aep->at_tgt;
++              atun._atio.at_lun = aep->at_lun;
++              atun._atio.at_tag_type = aep->at_tag_type;
++              atun._atio.at_tag_val = aep->at_tag_val;
++              atun._atio.at_status = (aep->at_flags & AT_TQAE);
++              atun._atio.at_status |= CT_OK;
++      }
++      return (isp_target_put_entry(isp, &atun));
++}
++
++/*
++ * Command completion- both for handling cases of no resources or
++ * no blackhole driver, or other cases where we have to, inline,
++ * finish the command sanely, or for normal command completion.
++ *
++ * The 'completion' code value has the scsi status byte in the low 8 bits.
++ * If status is a CHECK CONDITION and bit 8 is nonzero, then bits 12..15 have
++ * the sense key and  bits 16..23 have the ASCQ and bits 24..31 have the ASC
++ * values.
++ *
++ * NB: the key, asc, ascq, cannot be used for parallel SCSI as it doesn't
++ * NB: inline SCSI sense reporting. As such, we lose this information. XXX.
++ *
++ * For both parallel && fibre channel, we use the feature that does
++ * an automatic resource autoreplenish so we don't have then later do
++ * put of an atio to replenish the f/w's resource count.
++ */
++
++int
++isp_endcmd(struct ispsoftc *isp, void *arg, u_int32_t code, u_int16_t hdl)
++{
++      int sts;
++      union {
++              ct_entry_t _ctio;
++              ct2_entry_t _ctio2;
++      } un;
++
++      MEMZERO(&un, sizeof un);
++      sts = code & 0xff;
++
++      if (IS_FC(isp)) {
++              at2_entry_t *aep = arg;
++              ct2_entry_t *cto = &un._ctio2;
++
++              cto->ct_header.rqs_entry_type = RQSTYPE_CTIO2;
++              cto->ct_header.rqs_entry_count = 1;
++              cto->ct_iid = aep->at_iid;
++              if ((FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) == 0) {
++                      cto->ct_lun = aep->at_lun;
++              }
++              cto->ct_rxid = aep->at_rxid;
++              cto->rsp.m1.ct_scsi_status = sts & 0xff;
++              cto->ct_flags = CT2_SENDSTATUS | CT2_NO_DATA | CT2_FLAG_MODE1;
++              if (hdl == 0) {
++                      cto->ct_flags |= CT2_CCINCR;
++              }
++              if (aep->at_datalen) {
++                      cto->ct_resid = aep->at_datalen;
++                      cto->rsp.m1.ct_scsi_status |= CT2_DATA_UNDER;
++              }
++              if ((sts & 0xff) == SCSI_CHECK && (sts & ECMD_SVALID)) {
++                      cto->rsp.m1.ct_resp[0] = 0xf0;
++                      cto->rsp.m1.ct_resp[2] = (code >> 12) & 0xf;
++                      cto->rsp.m1.ct_resp[7] = 8;
++                      cto->rsp.m1.ct_resp[12] = (code >> 24) & 0xff;
++                      cto->rsp.m1.ct_resp[13] = (code >> 16) & 0xff;
++                      cto->rsp.m1.ct_senselen = 16;
++                      cto->rsp.m1.ct_scsi_status |= CT2_SNSLEN_VALID;
++              }
++              cto->ct_syshandle = hdl;
++      } else {
++              at_entry_t *aep = arg;
++              ct_entry_t *cto = &un._ctio;
++
++              cto->ct_header.rqs_entry_type = RQSTYPE_CTIO;
++              cto->ct_header.rqs_entry_count = 1;
++              cto->ct_fwhandle = aep->at_handle;
++              cto->ct_iid = aep->at_iid;
++              cto->ct_tgt = aep->at_tgt;
++              cto->ct_lun = aep->at_lun;
++              cto->ct_tag_type = aep->at_tag_type;
++              cto->ct_tag_val = aep->at_tag_val;
++              if (aep->at_flags & AT_TQAE) {
++                      cto->ct_flags |= CT_TQAE;
++              }
++              cto->ct_flags = CT_SENDSTATUS | CT_NO_DATA;
++              if (hdl == 0) {
++                      cto->ct_flags |= CT_CCINCR;
++              }
++              cto->ct_scsi_status = sts;
++              cto->ct_syshandle = hdl;
++      }
++      return (isp_target_put_entry(isp, &un));
++}
++
++int
++isp_target_async(struct ispsoftc *isp, int bus, int event)
++{
++      tmd_event_t evt;
++      tmd_msg_t msg;
++
++      switch (event) {
++      /*
++       * These three we handle here to propagate an effective bus reset
++       * upstream, but these do not require any immediate notify actions
++       * so we return when done.
++       */
++      case ASYNC_LIP_F8:
++      case ASYNC_LIP_OCCURRED:
++      case ASYNC_LOOP_UP:
++      case ASYNC_LOOP_DOWN:
++      case ASYNC_LOOP_RESET:
++      case ASYNC_PTPMODE:
++              /*
++               * These don't require any immediate notify actions. We used
++               * treat them like SCSI Bus Resets, but that was just plain
++               * wrong. Let the normal CTIO completion report what occurred.
++               */
++                return (0);
++
++      case ASYNC_BUS_RESET:
++      case ASYNC_TIMEOUT_RESET:
++              if (IS_FC(isp)) {
++                      return (0); /* we'll be getting an inotify instead */
++              }
++              evt.ev_bus = bus;
++              evt.ev_event = event;
++              (void) isp_async(isp, ISPASYNC_TARGET_EVENT, &evt);
++              break;
++      case ASYNC_DEVICE_RESET:
++              /*
++               * Bus Device Reset resets a specific target, so
++               * we pass this as a synthesized message.
++               */
++              MEMZERO(&msg, sizeof msg);
++              if (IS_FC(isp)) {
++                      msg.nt_iid = FCPARAM(isp)->isp_loopid;
++              } else {
++                      msg.nt_iid = SDPARAM(isp)->isp_initiator_id;
++              }
++              msg.nt_bus = bus;
++              msg.nt_msg[0] = MSG_BUS_DEV_RESET;
++              (void) isp_async(isp, ISPASYNC_TARGET_MESSAGE, &msg);
++              break;
++      case ASYNC_CTIO_DONE:
++              evt.ev_bus = bus;
++              evt.ev_event = event;
++              (void) isp_async(isp, ISPASYNC_TARGET_EVENT, &evt);
++              return (0);
++      default:
++              isp_prt(isp, ISP_LOGERR,
++                  "isp_target_async: unknown event 0x%x", event);
++              break;
++      }
++      if (isp->isp_state == ISP_RUNSTATE)
++              isp_notify_ack(isp, NULL);
++      return(0);
++}
++
++
++/*
++ * Process a received message.
++ * The ISP firmware can handle most messages, there are only
++ * a few that we need to deal with:
++ * - abort: clean up the current command
++ * - abort tag and clear queue
++ */
++
++static void
++isp_got_msg(struct ispsoftc *isp, int bus, in_entry_t *inp)
++{
++      u_int8_t status = inp->in_status & ~QLTM_SVALID;
++
++      if (status == IN_IDE_RECEIVED || status == IN_MSG_RECEIVED) {
++              tmd_msg_t msg;
++
++              MEMZERO(&msg, sizeof (msg));
++              msg.nt_bus = bus;
++              msg.nt_iid = inp->in_iid;
++              msg.nt_tgt = inp->in_tgt;
++              msg.nt_lun = inp->in_lun;
++              msg.nt_tagtype = inp->in_tag_type;
++              msg.nt_tagval = inp->in_tag_val;
++              MEMCPY(msg.nt_msg, inp->in_msg, IN_MSGLEN);
++              (void) isp_async(isp, ISPASYNC_TARGET_MESSAGE, &msg);
++      } else {
++              isp_prt(isp, ISP_LOGERR,
++                  "unknown immediate notify status 0x%x", inp->in_status);
++      }
++}
++
++/*
++ * Synthesize a message from the task management flags in a FCP_CMND_IU.
++ */
++static void
++isp_got_msg_fc(struct ispsoftc *isp, int bus, in_fcentry_t *inp)
++{
++      int lun;
++      static const char f1[] = "%s from iid %d lun %d seq 0x%x";
++      static const char f2[] = 
++          "unknown %s 0x%x lun %d iid %d task flags 0x%x seq 0x%x\n";
++
++      if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++              lun = inp->in_scclun;
++      } else {
++              lun = inp->in_lun;
++      }
++
++      if (inp->in_status != IN_MSG_RECEIVED) {
++              isp_prt(isp, ISP_LOGINFO, f2, "immediate notify status",
++                  inp->in_status, lun, inp->in_iid,
++                  inp->in_task_flags,  inp->in_seqid);
++      } else {
++              tmd_msg_t msg;
++
++              MEMZERO(&msg, sizeof (msg));
++              msg.nt_bus = bus;
++              msg.nt_iid = inp->in_iid;
++              msg.nt_tagval = inp->in_seqid;
++              msg.nt_lun = lun;
++
++              if (inp->in_task_flags & TASK_FLAGS_ABORT_TASK) {
++                      isp_prt(isp, ISP_LOGINFO, f1, "ABORT TASK",
++                          inp->in_iid, lun, inp->in_seqid);
++                      msg.nt_msg[0] = MSG_ABORT_TAG;
++              } else if (inp->in_task_flags & TASK_FLAGS_CLEAR_TASK_SET) {
++                      isp_prt(isp, ISP_LOGINFO, f1, "CLEAR TASK SET",
++                          inp->in_iid, lun, inp->in_seqid);
++                      msg.nt_msg[0] = MSG_CLEAR_QUEUE;
++              } else if (inp->in_task_flags & TASK_FLAGS_TARGET_RESET) {
++                      isp_prt(isp, ISP_LOGINFO, f1, "TARGET RESET",
++                          inp->in_iid, lun, inp->in_seqid);
++                      msg.nt_msg[0] = MSG_BUS_DEV_RESET;
++              } else if (inp->in_task_flags & TASK_FLAGS_CLEAR_ACA) {
++                      isp_prt(isp, ISP_LOGINFO, f1, "CLEAR ACA",
++                          inp->in_iid, lun, inp->in_seqid);
++                      /* ???? */
++                      msg.nt_msg[0] = MSG_REL_RECOVERY;
++              } else if (inp->in_task_flags & TASK_FLAGS_TERMINATE_TASK) {
++                      isp_prt(isp, ISP_LOGINFO, f1, "TERMINATE TASK",
++                          inp->in_iid, lun, inp->in_seqid);
++                      msg.nt_msg[0] = MSG_TERM_IO_PROC;
++              } else {
++                      isp_prt(isp, ISP_LOGWARN, f2, "task flag",
++                          inp->in_status, lun, inp->in_iid,
++                          inp->in_task_flags,  inp->in_seqid);
++              }
++              if (msg.nt_msg[0]) {
++                      (void) isp_async(isp, ISPASYNC_TARGET_MESSAGE, &msg);
++              }
++      }
++}
++
++static void
++isp_notify_ack(struct ispsoftc *isp, void *arg)
++{
++      char storage[QENTRY_LEN];
++      u_int16_t nxti, optr;
++      void *outp;
++
++      if (isp_getrqentry(isp, &nxti, &optr, &outp)) {
++              isp_prt(isp, ISP_LOGWARN,
++                  "Request Queue Overflow For isp_notify_ack");
++              return;
++      }
++
++      MEMZERO(storage, QENTRY_LEN);
++
++      if (IS_FC(isp)) {
++              na_fcentry_t *na = (na_fcentry_t *) storage;
++              if (arg) {
++                      in_fcentry_t *inp = arg;
++                      MEMCPY(storage, arg, sizeof (isphdr_t));
++                      na->na_iid = inp->in_iid;
++                      if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++                              na->na_lun = inp->in_scclun;
++                      } else {
++                              na->na_lun = inp->in_lun;
++                      }
++                      na->na_task_flags = inp->in_task_flags;
++                      na->na_seqid = inp->in_seqid;
++                      na->na_flags = NAFC_RCOUNT;
++                      na->na_status = inp->in_status;
++                      if (inp->in_status == IN_RESET) {
++                              na->na_flags |= NAFC_RST_CLRD;
++                      }
++              } else {
++                      na->na_flags = NAFC_RST_CLRD;
++              }
++              na->na_header.rqs_entry_type = RQSTYPE_NOTIFY_ACK;
++              na->na_header.rqs_entry_count = 1;
++              isp_put_notify_ack_fc(isp, na, (na_fcentry_t *)outp);
++      } else {
++              na_entry_t *na = (na_entry_t *) storage;
++              if (arg) {
++                      in_entry_t *inp = arg;
++                      MEMCPY(storage, arg, sizeof (isphdr_t));
++                      na->na_iid = inp->in_iid;
++                      na->na_lun = inp->in_lun;
++                      na->na_tgt = inp->in_tgt;
++                      na->na_seqid = inp->in_seqid;
++                      if (inp->in_status == IN_RESET) {
++                              na->na_event = NA_RST_CLRD;
++                      }
++              } else {
++                      na->na_event = NA_RST_CLRD;
++              }
++              na->na_header.rqs_entry_type = RQSTYPE_NOTIFY_ACK;
++              na->na_header.rqs_entry_count = 1;
++              isp_put_notify_ack(isp, na, (na_entry_t *)outp);
++      }
++      ISP_TDQE(isp, "isp_notify_ack", (int) optr, storage);
++      ISP_ADD_REQUEST(isp, nxti);
++}
++
++static void
++isp_handle_atio(struct ispsoftc *isp, at_entry_t *aep)
++{
++      int lun;
++      lun = aep->at_lun;
++      /*
++       * The firmware status (except for the QLTM_SVALID bit) indicates
++       * why this ATIO was sent to us.
++       *
++       * If QLTM_SVALID is set, the firware has recommended Sense Data.
++       *
++       * If the DISCONNECTS DISABLED bit is set in the flags field,
++       * we're still connected on the SCSI bus - i.e. the initiator
++       * did not set DiscPriv in the identify message. We don't care
++       * about this so it's ignored.
++       */
++
++      switch(aep->at_status & ~QLTM_SVALID) {
++      case AT_PATH_INVALID:
++              /*
++               * ATIO rejected by the firmware due to disabled lun.
++               */
++              isp_prt(isp, ISP_LOGERR,
++                  "rejected ATIO for disabled lun %d", lun);
++              break;
++      case AT_NOCAP:
++              /*
++               * Requested Capability not available
++               * We sent an ATIO that overflowed the firmware's
++               * command resource count.
++               */
++              isp_prt(isp, ISP_LOGERR,
++                  "rejected ATIO for lun %d because of command count"
++                  " overflow", lun);
++              break;
++
++      case AT_BDR_MSG:
++              /*
++               * If we send an ATIO to the firmware to increment
++               * its command resource count, and the firmware is
++               * recovering from a Bus Device Reset, it returns
++               * the ATIO with this status. We set the command
++               * resource count in the Enable Lun entry and do
++               * not increment it. Therefore we should never get
++               * this status here.
++               */
++              isp_prt(isp, ISP_LOGERR, atiocope, lun,
++                  GET_BUS_VAL(aep->at_iid));
++              break;
++
++      case AT_CDB:            /* Got a CDB */
++      case AT_PHASE_ERROR:    /* Bus Phase Sequence Error */
++              /*
++               * Punt to platform specific layer.
++               */
++              (void) isp_async(isp, ISPASYNC_TARGET_ACTION, aep);
++              break;
++
++      case AT_RESET:
++              /*
++               * A bus reset came along and blew away this command. Why
++               * they do this in addition the async event code stuff,
++               * I dunno.
++               *
++               * Ignore it because the async event will clear things
++               * up for us.
++               */
++              isp_prt(isp, ISP_LOGWARN, atior, lun,
++                  GET_IID_VAL(aep->at_iid), GET_BUS_VAL(aep->at_iid));
++              break;
++
++
++      default:
++              isp_prt(isp, ISP_LOGERR,
++                  "Unknown ATIO status 0x%x from initiator %d for lun %d",
++                  aep->at_status, aep->at_iid, lun);
++              (void) isp_target_put_atio(isp, aep);
++              break;
++      }
++}
++
++static void
++isp_handle_atio2(struct ispsoftc *isp, at2_entry_t *aep)
++{
++      int lun;
++
++      if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
++              lun = aep->at_scclun;
++      } else {
++              lun = aep->at_lun;
++      }
++
++      /*
++       * The firmware status (except for the QLTM_SVALID bit) indicates
++       * why this ATIO was sent to us.
++       *
++       * If QLTM_SVALID is set, the firware has recommended Sense Data.
++       *
++       * If the DISCONNECTS DISABLED bit is set in the flags field,
++       * we're still connected on the SCSI bus - i.e. the initiator
++       * did not set DiscPriv in the identify message. We don't care
++       * about this so it's ignored.
++       */
++
++      switch(aep->at_status & ~QLTM_SVALID) {
++      case AT_PATH_INVALID:
++              /*
++               * ATIO rejected by the firmware due to disabled lun.
++               */
++              isp_prt(isp, ISP_LOGERR,
++                  "rejected ATIO2 for disabled lun %d", lun);
++              break;
++      case AT_NOCAP:
++              /*
++               * Requested Capability not available
++               * We sent an ATIO that overflowed the firmware's
++               * command resource count.
++               */
++              isp_prt(isp, ISP_LOGERR,
++                  "rejected ATIO2 for lun %d- command count overflow", lun);
++              break;
++
++      case AT_BDR_MSG:
++              /*
++               * If we send an ATIO to the firmware to increment
++               * its command resource count, and the firmware is
++               * recovering from a Bus Device Reset, it returns
++               * the ATIO with this status. We set the command
++               * resource count in the Enable Lun entry and no
++               * not increment it. Therefore we should never get
++               * this status here.
++               */
++              isp_prt(isp, ISP_LOGERR, atiocope, lun, 0);
++              break;
++
++      case AT_CDB:            /* Got a CDB */
++              /*
++               * Punt to platform specific layer.
++               */
++              (void) isp_async(isp, ISPASYNC_TARGET_ACTION, aep);
++              break;
++
++      case AT_RESET:
++              /*
++               * A bus reset came along an blew away this command. Why
++               * they do this in addition the async event code stuff,
++               * I dunno.
++               *
++               * Ignore it because the async event will clear things
++               * up for us.
++               */
++              isp_prt(isp, ISP_LOGERR, atior, lun, aep->at_iid, 0);
++              break;
++
++
++      default:
++              isp_prt(isp, ISP_LOGERR,
++                  "Unknown ATIO2 status 0x%x from initiator %d for lun %d",
++                  aep->at_status, aep->at_iid, lun);
++              (void) isp_target_put_atio(isp, aep);
++              break;
++      }
++}
++
++static void
++isp_handle_ctio(struct ispsoftc *isp, ct_entry_t *ct)
++{
++      void *xs;
++      int pl = ISP_LOGTDEBUG2;
++      char *fmsg = NULL;
++
++      if (ct->ct_syshandle) {
++              xs = isp_find_xs(isp, ct->ct_syshandle);
++              if (xs == NULL)
++                      pl = ISP_LOGALL;
++      } else {
++              xs = NULL;
++      }
++
++      switch(ct->ct_status & ~QLTM_SVALID) {
++      case CT_OK:
++              /*
++               * There are generally 3 possibilities as to why we'd get
++               * this condition:
++               *      We disconnected after receiving a CDB.
++               *      We sent or received data.
++               *      We sent status & command complete.
++               */
++
++              if (ct->ct_flags & CT_SENDSTATUS) {
++                      break;
++              } else if ((ct->ct_flags & CT_DATAMASK) == CT_NO_DATA) {
++                      /*
++                       * Nothing to do in this case.
++                       */
++                      isp_prt(isp, pl, "CTIO- iid %d disconnected OK",
++                          ct->ct_iid);
++                      return;
++              }
++              break;
++
++      case CT_BDR_MSG:
++              /*
++               * Bus Device Reset message received or the SCSI Bus has
++               * been Reset; the firmware has gone to Bus Free.
++               *
++               * The firmware generates an async mailbox interupt to
++               * notify us of this and returns outstanding CTIOs with this
++               * status. These CTIOs are handled in that same way as
++               * CT_ABORTED ones, so just fall through here.
++               */
++              fmsg = "Bus Device Reset";
++              /*FALLTHROUGH*/
++      case CT_RESET:
++              if (fmsg == NULL)
++                      fmsg = "Bus Reset";
++              /*FALLTHROUGH*/
++      case CT_ABORTED:
++              /*
++               * When an Abort message is received the firmware goes to
++               * Bus Free and returns all outstanding CTIOs with the status
++               * set, then sends us an Immediate Notify entry.
++               */
++              if (fmsg == NULL)
++                      fmsg = "ABORT TAG message sent by Initiator";
++
++              isp_prt(isp, ISP_LOGWARN, "CTIO destroyed by %s", fmsg);
++              break;
++
++      case CT_INVAL:
++              /*
++               * CTIO rejected by the firmware due to disabled lun.
++               * "Cannot Happen".
++               */
++              isp_prt(isp, ISP_LOGERR,
++                  "Firmware rejected CTIO for disabled lun %d",
++                  ct->ct_lun);
++              break;
++
++      case CT_NOPATH:
++              /*
++               * CTIO rejected by the firmware due "no path for the
++               * nondisconnecting nexus specified". This means that
++               * we tried to access the bus while a non-disconnecting
++               * command is in process.
++               */
++              isp_prt(isp, ISP_LOGERR,
++                  "Firmware rejected CTIO for bad nexus %d/%d/%d",
++                  ct->ct_iid, ct->ct_tgt, ct->ct_lun);
++              break;
++
++      case CT_RSELTMO:
++              fmsg = "Reselection";
++              /*FALLTHROUGH*/
++      case CT_TIMEOUT:
++              if (fmsg == NULL)
++                      fmsg = "Command";
++              isp_prt(isp, ISP_LOGERR, "Firmware timed out on %s", fmsg);
++              break;
++
++      case    CT_PANIC:
++              if (fmsg == NULL)
++                      fmsg = "Unrecoverable Error";
++              /*FALLTHROUGH*/
++      case CT_ERR:
++              if (fmsg == NULL)
++                      fmsg = "Completed with Error";
++              /*FALLTHROUGH*/
++      case CT_PHASE_ERROR:
++              if (fmsg == NULL)
++                      fmsg = "Phase Sequence Error";
++              /*FALLTHROUGH*/
++      case CT_TERMINATED:
++              if (fmsg == NULL)
++                      fmsg = "terminated by TERMINATE TRANSFER";
++              /*FALLTHROUGH*/
++      case CT_NOACK:
++              if (fmsg == NULL)
++                      fmsg = "unacknowledged Immediate Notify pending";
++              isp_prt(isp, ISP_LOGERR, "CTIO returned by f/w- %s", fmsg);
++              break;
++      default:
++              isp_prt(isp, ISP_LOGERR, "Unknown CTIO status 0x%x",
++                  ct->ct_status & ~QLTM_SVALID);
++              break;
++      }
++
++      if (xs == NULL) {
++              /*
++               * There may be more than one CTIO for a data transfer,
++               * or this may be a status CTIO we're not monitoring.
++               *
++               * The assumption is that they'll all be returned in the
++               * order we got them.
++               */
++              if (ct->ct_syshandle == 0) {
++                      if ((ct->ct_flags & CT_SENDSTATUS) == 0) {
++                              isp_prt(isp, pl,
++                                  "intermediate CTIO completed ok");
++                      } else {
++                              isp_prt(isp, pl,
++                                  "unmonitored CTIO completed ok");
++                      }
++              } else {
++                      isp_prt(isp, pl,
++                          "NO xs for CTIO (handle 0x%x) status 0x%x",
++                          ct->ct_syshandle, ct->ct_status & ~QLTM_SVALID);
++              }
++      } else {
++              /*
++               * Final CTIO completed. Release DMA resources and
++               * notify platform dependent layers.
++               */
++              if ((ct->ct_flags & CT_DATAMASK) != CT_NO_DATA) {
++                      ISP_DMAFREE(isp, xs, ct->ct_syshandle);
++              }
++              isp_prt(isp, pl, "final CTIO complete");
++              /*
++               * The platform layer will destroy the handle if appropriate.
++               */
++              (void) isp_async(isp, ISPASYNC_TARGET_ACTION, ct);
++      }
++}
++
++static void
++isp_handle_ctio2(struct ispsoftc *isp, ct2_entry_t *ct)
++{
++      XS_T *xs;
++      int pl = ISP_LOGTDEBUG2;
++      char *fmsg = NULL;
++
++      if (ct->ct_syshandle) {
++              xs = isp_find_xs(isp, ct->ct_syshandle);
++              if (xs == NULL)
++                      pl = ISP_LOGALL;
++      } else {
++              xs = NULL;
++      }
++
++      switch(ct->ct_status & ~QLTM_SVALID) {
++      case CT_BUS_ERROR:
++              isp_prt(isp, ISP_LOGERR, "PCI DMA Bus Error");
++              /* FALL Through */
++      case CT_DATA_OVER:
++      case CT_DATA_UNDER:
++      case CT_OK:
++              /*
++               * There are generally 2 possibilities as to why we'd get
++               * this condition:
++               *      We sent or received data.
++               *      We sent status & command complete.
++               */
++
++              break;
++
++      case CT_BDR_MSG:
++              /*
++               * Target Reset function received.
++               *
++               * The firmware generates an async mailbox interupt to
++               * notify us of this and returns outstanding CTIOs with this
++               * status. These CTIOs are handled in that same way as
++               * CT_ABORTED ones, so just fall through here.
++               */
++              fmsg = "TARGET RESET Task Management Function Received";
++              /*FALLTHROUGH*/
++      case CT_RESET:
++              if (fmsg == NULL)
++                      fmsg = "LIP Reset";
++              /*FALLTHROUGH*/
++      case CT_ABORTED:
++              /*
++               * When an Abort message is received the firmware goes to
++               * Bus Free and returns all outstanding CTIOs with the status
++               * set, then sends us an Immediate Notify entry.
++               */
++              if (fmsg == NULL)
++                      fmsg = "ABORT Task Management Function Received";
++
++              isp_prt(isp, ISP_LOGERR, "CTIO2 destroyed by %s", fmsg);
++              break;
++
++      case CT_INVAL:
++              /*
++               * CTIO rejected by the firmware - invalid data direction.
++               */
++              isp_prt(isp, ISP_LOGERR, "CTIO2 had wrong data directiond");
++              break;
++
++      case CT_RSELTMO:
++              fmsg = "failure to reconnect to initiator";
++              /*FALLTHROUGH*/
++      case CT_TIMEOUT:
++              if (fmsg == NULL)
++                      fmsg = "command";
++              isp_prt(isp, ISP_LOGERR, "Firmware timed out on %s", fmsg);
++              break;
++
++      case CT_ERR:
++              fmsg = "Completed with Error";
++              /*FALLTHROUGH*/
++      case CT_LOGOUT:
++              if (fmsg == NULL)
++                      fmsg = "Port Logout";
++              /*FALLTHROUGH*/
++      case CT_PORTNOTAVAIL:
++              if (fmsg == NULL)
++                      fmsg = "Port not available";
++              /*FALLTHROUGH*/
++      case CT_PORTCHANGED:
++              if (fmsg == NULL)
++                      fmsg = "Port Changed";
++              /*FALLTHROUGH*/
++      case CT_NOACK:
++              if (fmsg == NULL)
++                      fmsg = "unacknowledged Immediate Notify pending";
++              isp_prt(isp, ISP_LOGERR, "CTIO returned by f/w- %s", fmsg);
++              break;
++
++      case CT_INVRXID:
++              /*
++               * CTIO rejected by the firmware because an invalid RX_ID.
++               * Just print a message.
++               */
++              isp_prt(isp, ISP_LOGERR,
++                  "CTIO2 completed with Invalid RX_ID 0x%x", ct->ct_rxid);
++              break;
++
++      default:
++              isp_prt(isp, ISP_LOGERR, "Unknown CTIO2 status 0x%x",
++                  ct->ct_status & ~QLTM_SVALID);
++              break;
++      }
++
++      if (xs == NULL) {
++              /*
++               * There may be more than one CTIO for a data transfer,
++               * or this may be a status CTIO we're not monitoring.
++               *
++               * The assumption is that they'll all be returned in the
++               * order we got them.
++               */
++              if (ct->ct_syshandle == 0) {
++                      if ((ct->ct_flags & CT_SENDSTATUS) == 0) {
++                              isp_prt(isp, pl,
++                                  "intermediate CTIO completed ok");
++                      } else {
++                              isp_prt(isp, pl,
++                                  "unmonitored CTIO completed ok");
++                      }
++              } else {
++                      isp_prt(isp, pl,
++                          "NO xs for CTIO (handle 0x%x) status 0x%x",
++                          ct->ct_syshandle, ct->ct_status & ~QLTM_SVALID);
++              }
++      } else {
++              if ((ct->ct_flags & CT2_DATAMASK) != CT2_NO_DATA) {
++                      ISP_DMAFREE(isp, xs, ct->ct_syshandle);
++              }
++              if (ct->ct_flags & CT_SENDSTATUS) {
++                      /*
++                       * Sent status and command complete.
++                       *
++                       * We're now really done with this command, so we
++                       * punt to the platform dependent layers because
++                       * only there can we do the appropriate command
++                       * complete thread synchronization.
++                       */
++                      isp_prt(isp, pl, "status CTIO complete");
++              } else {
++                      /*
++                       * Final CTIO completed. Release DMA resources and
++                       * notify platform dependent layers.
++                       */
++                      isp_prt(isp, pl, "data CTIO complete");
++              }
++              (void) isp_async(isp, ISPASYNC_TARGET_ACTION, ct);
++              /*
++               * The platform layer will destroy the handle if appropriate.
++               */
++      }
++}
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_target.h   2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,562 @@
++/* @(#)isp_target.h 1.18 */
++/*
++ * Qlogic Target Mode Structure and Flag Definitions
++ *
++ * Copyright (c) 1997, 1998
++ * Patrick Stirling
++ * pms@psconsult.com
++ * All rights reserved.
++ *
++ * Additional Copyright (c) 1999, 2000, 2001
++ * Matthew Jacob
++ * mjacob@feral.com
++ * All rights reserved.
++ *
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ */
++#ifndef       _ISP_TARGET_H
++#define       _ISP_TARGET_H
++
++/*
++ * Defines for all entry types
++ */
++#define QLTM_SVALID   0x80
++#define       QLTM_SENSELEN   18
++
++/*
++ * Structure for Enable Lun and Modify Lun queue entries
++ */
++typedef struct {
++      isphdr_t        le_header;
++      u_int32_t       le_reserved;
++      u_int8_t        le_lun;
++      u_int8_t        le_rsvd;
++      u_int8_t        le_ops;         /* Modify LUN only */
++      u_int8_t        le_tgt;         /* Not for FC */
++      u_int32_t       le_flags;       /* Not for FC */
++      u_int8_t        le_status;
++      u_int8_t        le_reserved2;
++      u_int8_t        le_cmd_count;
++      u_int8_t        le_in_count;
++      u_int8_t        le_cdb6len;     /* Not for FC */
++      u_int8_t        le_cdb7len;     /* Not for FC */
++      u_int16_t       le_timeout;
++      u_int16_t       le_reserved3[20];
++} lun_entry_t;
++
++/*
++ * le_flags values
++ */
++#define LUN_TQAE      0x00000002      /* bit1  Tagged Queue Action Enable */
++#define LUN_DSSM      0x01000000      /* bit24 Disable Sending SDP Message */
++#define       LUN_DISAD       0x02000000      /* bit25 Disable autodisconnect */
++#define LUN_DM                0x40000000      /* bit30 Disconnects Mandatory */
++
++/*
++ * le_ops values
++ */
++#define LUN_CCINCR    0x01    /* increment command count */
++#define LUN_CCDECR    0x02    /* decrement command count */
++#define LUN_ININCR    0x40    /* increment immed. notify count */
++#define LUN_INDECR    0x80    /* decrement immed. notify count */
++
++/*
++ * le_status values
++ */
++#define       LUN_OK          0x01    /* we be rockin' */
++#define LUN_ERR               0x04    /* request completed with error */
++#define LUN_INVAL     0x06    /* invalid request */
++#define LUN_NOCAP     0x16    /* can't provide requested capability */
++#define LUN_ENABLED   0x3E    /* LUN already enabled */
++
++/*
++ * Immediate Notify Entry structure
++ */
++#define IN_MSGLEN     8       /* 8 bytes */
++#define IN_RSVDLEN    8       /* 8 words */
++typedef struct {
++      isphdr_t        in_header;
++      u_int32_t       in_reserved;
++      u_int8_t        in_lun;         /* lun */
++      u_int8_t        in_iid;         /* initiator */
++      u_int8_t        in_reserved2;
++      u_int8_t        in_tgt;         /* target */
++      u_int32_t       in_flags;
++      u_int8_t        in_status;
++      u_int8_t        in_rsvd2;
++      u_int8_t        in_tag_val;     /* tag value */
++      u_int8_t        in_tag_type;    /* tag type */
++      u_int16_t       in_seqid;       /* sequence id */
++      u_int8_t        in_msg[IN_MSGLEN];      /* SCSI message bytes */
++      u_int16_t       in_reserved3[IN_RSVDLEN];
++      u_int8_t        in_sense[QLTM_SENSELEN];/* suggested sense data */
++} in_entry_t;
++
++typedef struct {
++      isphdr_t        in_header;
++      u_int32_t       in_reserved;
++      u_int8_t        in_lun;         /* lun */
++      u_int8_t        in_iid;         /* initiator */
++      u_int16_t       in_scclun;
++      u_int32_t       in_reserved2;
++      u_int16_t       in_status;
++      u_int16_t       in_task_flags;
++      u_int16_t       in_seqid;       /* sequence id */
++} in_fcentry_t;
++
++/*
++ * Values for the in_status field
++ */
++#define       IN_REJECT       0x0D    /* Message Reject message received */
++#define IN_RESET      0x0E    /* Bus Reset occurred */
++#define IN_NO_RCAP    0x16    /* requested capability not available */
++#define IN_IDE_RECEIVED       0x33    /* Initiator Detected Error msg received */
++#define IN_RSRC_UNAVAIL       0x34    /* resource unavailable */
++#define IN_MSG_RECEIVED       0x36    /* SCSI message received */
++#define       IN_ABORT_TASK   0x20    /* task named in RX_ID is being aborted (FC) */
++#define       IN_PORT_LOGOUT  0x29    /* port has logged out (FC) */
++#define       IN_PORT_CHANGED 0x2A    /* port changed */
++#define       IN_GLOBAL_LOGO  0x2E    /* all ports logged out */
++#define       IN_NO_NEXUS     0x3B    /* Nexus not established */
++
++/*
++ * Values for the in_task_flags field- should only get one at a time!
++ */
++#define       TASK_FLAGS_ABORT_TASK           (1<<9)
++#define       TASK_FLAGS_CLEAR_TASK_SET       (1<<10)
++#define       TASK_FLAGS_TARGET_RESET         (1<<13)
++#define       TASK_FLAGS_CLEAR_ACA            (1<<14)
++#define       TASK_FLAGS_TERMINATE_TASK       (1<<15)
++
++#ifndef       MSG_ABORT_TAG
++#define       MSG_ABORT_TAG           0x06
++#endif
++#ifndef       MSG_CLEAR_QUEUE
++#define       MSG_CLEAR_QUEUE         0x0e
++#endif
++#ifndef       MSG_BUS_DEV_RESET
++#define       MSG_BUS_DEV_RESET       0x0b
++#endif
++#ifndef       MSG_REL_RECOVERY
++#define       MSG_REL_RECOVERY        0x10
++#endif
++#ifndef       MSG_TERM_IO_PROC
++#define       MSG_TERM_IO_PROC        0x11
++#endif
++
++
++/*
++ * Notify Acknowledge Entry structure
++ */
++#define NA_RSVDLEN    22
++typedef struct {
++      isphdr_t        na_header;
++      u_int32_t       na_reserved;
++      u_int8_t        na_lun;         /* lun */
++      u_int8_t        na_iid;         /* initiator */
++      u_int8_t        na_reserved2;
++      u_int8_t        na_tgt;         /* target */
++      u_int32_t       na_flags;
++      u_int8_t        na_status;
++      u_int8_t        na_event;
++      u_int16_t       na_seqid;       /* sequence id */
++      u_int16_t       na_reserved3[NA_RSVDLEN];
++} na_entry_t;
++
++/*
++ * Value for the na_event field
++ */
++#define NA_RST_CLRD   0x80    /* Clear an async event notification */
++#define       NA_OK           0x01    /* Notify Acknowledge Succeeded */
++#define       NA_INVALID      0x06    /* Invalid Notify Acknowledge */
++
++#define       NA2_RSVDLEN     21
++typedef struct {
++      isphdr_t        na_header;
++      u_int32_t       na_reserved;
++      u_int8_t        na_lun;         /* lun */
++      u_int8_t        na_iid;         /* initiator */
++      u_int16_t       na_scclun;
++      u_int16_t       na_flags;
++      u_int16_t       na_reserved2;
++      u_int16_t       na_status;
++      u_int16_t       na_task_flags;
++      u_int16_t       na_seqid;       /* sequence id */
++      u_int16_t       na_reserved3[NA2_RSVDLEN];
++} na_fcentry_t;
++#define       NAFC_RCOUNT     0x80    /* increment resource count */
++#define NAFC_RST_CLRD 0x20    /* Clear LIP Reset */
++/*
++ * Accept Target I/O Entry structure
++ */
++#define ATIO_CDBLEN   26
++
++typedef struct {
++      isphdr_t        at_header;
++      u_int16_t       at_reserved;
++      u_int16_t       at_handle;
++      u_int8_t        at_lun;         /* lun */
++      u_int8_t        at_iid;         /* initiator */
++      u_int8_t        at_cdblen;      /* cdb length */
++      u_int8_t        at_tgt;         /* target */
++      u_int32_t       at_flags;
++      u_int8_t        at_status;      /* firmware status */
++      u_int8_t        at_scsi_status; /* scsi status */
++      u_int8_t        at_tag_val;     /* tag value */
++      u_int8_t        at_tag_type;    /* tag type */
++      u_int8_t        at_cdb[ATIO_CDBLEN];    /* received CDB */
++      u_int8_t        at_sense[QLTM_SENSELEN];/* suggested sense data */
++} at_entry_t;
++
++/*
++ * at_flags values
++ */
++#define AT_NODISC     0x00008000      /* disconnect disabled */
++#define AT_TQAE               0x00000002      /* Tagged Queue Action enabled */
++
++/*
++ * at_status values
++ */
++#define AT_PATH_INVALID       0x07    /* ATIO sent to firmware for disabled lun */
++#define       AT_RESET        0x0E    /* SCSI Bus Reset Occurred */
++#define AT_PHASE_ERROR        0x14    /* Bus phase sequence error */
++#define AT_NOCAP      0x16    /* Requested capability not available */
++#define AT_BDR_MSG    0x17    /* Bus Device Reset msg received */
++#define AT_CDB                0x3D    /* CDB received */
++
++/*
++ * Macros to create and fetch and test concatenated handle and tag value macros
++ */
++
++#define       AT_MAKE_TAGID(tid, aep)                                         \
++      tid = ((aep)->at_handle << 16);                                 \
++      if ((aep)->at_flags & AT_TQAE)                                  \
++              (tid) |= ((aep)->at_tag_val + 1)
++
++#define       CT_MAKE_TAGID(tid, ct)                                          \
++      tid = ((ct)->ct_fwhandle << 16);                                \
++      if ((ct)->ct_flags & CT_TQAE)                                   \
++              (tid) |= ((ct)->ct_tag_val + 1)
++
++#define       AT_HAS_TAG(val)         ((val) & 0xffff)
++#define       AT_GET_TAG(val)         AT_HAS_TAG(val) - 1
++#define       AT_GET_HANDLE(val)      ((val) >> 16)
++
++/*
++ * Accept Target I/O Entry structure, Type 2
++ */
++#define ATIO2_CDBLEN  16
++
++typedef struct {
++      isphdr_t        at_header;
++      u_int32_t       at_reserved;
++      u_int8_t        at_lun;         /* lun or reserved */
++      u_int8_t        at_iid;         /* initiator */
++      u_int16_t       at_rxid;        /* response ID */
++      u_int16_t       at_flags;
++      u_int16_t       at_status;      /* firmware status */
++      u_int8_t        at_crn;         /* command reference number */
++      u_int8_t        at_taskcodes;
++      u_int8_t        at_taskflags;
++      u_int8_t        at_execodes;
++      u_int8_t        at_cdb[ATIO2_CDBLEN];   /* received CDB */
++      u_int32_t       at_datalen;             /* allocated data len */
++      u_int16_t       at_scclun;              /* SCC Lun or reserved */
++      u_int16_t       at_wwpn[4];             /* WWPN of initiator */
++      u_int16_t       at_reserved2[6];
++      u_int16_t       at_oxid;
++} at2_entry_t;
++
++#define       ATIO2_WWPN_OFFSET       0x2A
++#define       ATIO2_OXID_OFFSET       0x3E
++
++#define       ATIO2_TC_ATTR_MASK      0x7
++#define       ATIO2_TC_ATTR_SIMPLEQ   0
++#define       ATIO2_TC_ATTR_HEADOFQ   1
++#define       ATIO2_TC_ATTR_ORDERED   2
++#define       ATIO2_TC_ATTR_ACAQ      4
++#define       ATIO2_TC_ATTR_UNTAGGED  5
++
++#define       ATIO2_EX_WRITE          0x1
++#define       ATIO2_EX_READ           0x2
++
++/*
++ * Continue Target I/O Entry structure
++ * Request from driver. The response from the
++ * ISP firmware is the same except that the last 18
++ * bytes are overwritten by suggested sense data if
++ * the 'autosense valid' bit is set in the status byte.
++ */
++typedef struct {
++      isphdr_t        ct_header;
++      u_int16_t       ct_reserved;
++#define       ct_syshandle    ct_reserved     /* we use this */
++      u_int16_t       ct_fwhandle;    /* required by f/w */
++      u_int8_t        ct_lun; /* lun */
++      u_int8_t        ct_iid; /* initiator id */
++      u_int8_t        ct_reserved2;
++      u_int8_t        ct_tgt; /* our target id */
++      u_int32_t       ct_flags;
++      u_int8_t        ct_status;      /* isp status */
++      u_int8_t        ct_scsi_status; /* scsi status */
++      u_int8_t        ct_tag_val;     /* tag value */
++      u_int8_t        ct_tag_type;    /* tag type */
++      u_int32_t       ct_xfrlen;      /* transfer length */
++      u_int32_t       ct_resid;       /* residual length */
++      u_int16_t       ct_timeout;
++      u_int16_t       ct_seg_count;
++      /*
++       * This is so we can share tag name space with
++       * CTIO{2,3,4} with the minimum of pain.
++       */
++      union {
++              ispds_t         ct_a[ISP_RQDSEG];
++      } _u;
++#define       ct_dataseg      _u.ct_a
++} ct_entry_t;
++
++/*
++ * For some of the dual port SCSI adapters, port (bus #) is reported
++ * in the MSbit of ct_iid. Bit fields are a bit too awkward here.
++ *
++ * Note that this does not apply to FC adapters at all which can and
++ * do report IIDs between 129 && 255 (these represent devices that have
++ * logged in across a SCSI fabric).
++ */
++#define       GET_IID_VAL(x)          (x & 0x3f)
++#define       GET_BUS_VAL(x)          ((x >> 7) & 0x1)
++#define       SET_IID_VAL(y, x)       y = ((y & ~0x3f) | (x & 0x3f))
++#define       SET_BUS_VAL(y, x)       y = ((y & 0x3f) | ((x & 0x1) << 7))
++
++/*
++ * ct_flags values
++ */
++#define CT_TQAE               0x00000002      /* bit  1, Tagged Queue Action enable */
++#define CT_DATA_IN    0x00000040      /* bits 6&7, Data direction */
++#define CT_DATA_OUT   0x00000080      /* bits 6&7, Data direction */
++#define CT_NO_DATA    0x000000C0      /* bits 6&7, Data direction */
++#define       CT_CCINCR       0x00000100      /* bit 8, autoincrement atio count */
++#define CT_DATAMASK   0x000000C0      /* bits 6&7, Data direction */
++#define       CT_INISYNCWIDE  0x00004000      /* bit 14, Do Sync/Wide Negotiation */
++#define CT_NODISC     0x00008000      /* bit 15, Disconnects disabled */
++#define CT_DSDP               0x01000000      /* bit 24, Disable Save Data Pointers */
++#define CT_SENDRDP    0x04000000      /* bit 26, Send Restore Pointers msg */
++#define CT_SENDSTATUS 0x80000000      /* bit 31, Send SCSI status byte */
++
++/*
++ * ct_status values
++ * - set by the firmware when it returns the CTIO
++ */
++#define CT_OK         0x01    /* completed without error */
++#define CT_ABORTED    0x02    /* aborted by host */
++#define CT_ERR                0x04    /* see sense data for error */
++#define CT_INVAL      0x06    /* request for disabled lun */
++#define CT_NOPATH     0x07    /* invalid ITL nexus */
++#define       CT_INVRXID      0x08    /* (FC only) Invalid RX_ID */
++#define       CT_DATA_OVER    0x09    /* (FC only) Data Overrun */
++#define CT_RSELTMO    0x0A    /* reselection timeout after 2 tries */
++#define CT_TIMEOUT    0x0B    /* timed out */
++#define CT_RESET      0x0E    /* SCSI Bus Reset occurred */
++#define       CT_PARITY       0x0F    /* Uncorrectable Parity Error */
++#define       CT_BUS_ERROR    0x10    /* (FC Only) DMA PCI Error */
++#define       CT_PANIC        0x13    /* Unrecoverable Error */
++#define CT_PHASE_ERROR        0x14    /* Bus phase sequence error */
++#define CT_BDR_MSG    0x17    /* Bus Device Reset msg received */
++#define       CT_DATA_UNDER   0x15    /* (FC only) Data Underrun */
++#define CT_TERMINATED 0x19    /* due to Terminate Transfer mbox cmd */
++#define       CT_PORTNOTAVAIL 0x28    /* port not available */
++#define       CT_LOGOUT       0x29    /* port logout */
++#define       CT_PORTCHANGED  0x2A    /* port changed */
++#define       CT_IDE          0x33    /* Initiator Detected Error */
++#define CT_NOACK      0x35    /* Outstanding Immed. Notify. entry */
++
++/*
++ * When the firmware returns a CTIO entry, it may overwrite the last
++ * part of the structure with sense data. This starts at offset 0x2E
++ * into the entry, which is in the middle of ct_dataseg[1]. Rather
++ * than define a new struct for this, I'm just using the sense data
++ * offset.
++ */
++#define CTIO_SENSE_OFFSET     0x2E
++
++/*
++ * Entry length in u_longs. All entries are the same size so
++ * any one will do as the numerator.
++ */
++#define UINT32_ENTRY_SIZE     (sizeof(at_entry_t)/sizeof(u_int32_t))
++
++/*
++ * QLA2100 CTIO (type 2) entry
++ */
++#define       MAXRESPLEN      26
++typedef struct {
++      isphdr_t        ct_header;
++      u_int16_t       ct_reserved;
++      u_int16_t       ct_fwhandle;    /* just to match CTIO */
++      u_int8_t        ct_lun;         /* lun */
++      u_int8_t        ct_iid;         /* initiator id */
++      u_int16_t       ct_rxid;        /* response ID */
++      u_int16_t       ct_flags;
++      u_int16_t       ct_status;      /* isp status */
++      u_int16_t       ct_timeout;
++      u_int16_t       ct_seg_count;
++      u_int32_t       ct_reloff;      /* relative offset */
++      int32_t         ct_resid;       /* residual length */
++      union {
++              /*
++               * The three different modes that the target driver
++               * can set the CTIO{2,3,4} up as.
++               *
++               * The first is for sending FCP_DATA_IUs as well as
++               * (optionally) sending a terminal SCSI status FCP_RSP_IU.
++               *
++               * The second is for sending SCSI sense data in an FCP_RSP_IU.
++               * Note that no FCP_DATA_IUs will be sent.
++               *
++               * The third is for sending FCP_RSP_IUs as built specifically
++               * in system memory as located by the isp_dataseg.
++               */
++              struct {
++                      u_int32_t _reserved;
++                      u_int16_t _reserved2;
++                      u_int16_t ct_scsi_status;
++                      u_int32_t ct_xfrlen;
++                      union {
++                              ispds_t ct_a[ISP_RQDSEG_T2];    /* CTIO2 */
++                              ispds64_t ct_b[ISP_RQDSEG_T3];  /* CTIO3 */
++                              ispdslist_t ct_c;               /* CTIO4 */
++                      } _u;
++#define       ct_dataseg      _u.ct_a
++#define       ct_dataseg64    _u.ct_b
++#define       ct_dslist       _u.ct_c
++              } m0;
++              struct {
++                      u_int16_t _reserved;
++                      u_int16_t _reserved2;
++                      u_int16_t ct_senselen;
++                      u_int16_t ct_scsi_status;
++                      u_int16_t ct_resplen;
++                      u_int8_t  ct_resp[MAXRESPLEN];
++              } m1;
++              struct {
++                      u_int32_t _reserved;
++                      u_int16_t _reserved2;
++                      u_int16_t _reserved3;
++                      u_int32_t ct_datalen;
++                      ispds_t ct_fcp_rsp_iudata;
++              } m2;
++              /*
++               * CTIO2 returned from F/W...
++               */
++              struct {
++                      u_int32_t _reserved[4];
++                      u_int16_t ct_scsi_status;
++                      u_int8_t  ct_sense[QLTM_SENSELEN];
++              } fw;
++      } rsp;
++} ct2_entry_t;
++
++/*
++ * ct_flags values for CTIO2
++ */
++#define       CT2_FLAG_MMASK  0x0003
++#define       CT2_FLAG_MODE0  0x0000
++#define       CT2_FLAG_MODE1  0x0001
++#define       CT2_FLAG_MODE2  0x0002
++#define CT2_DATA_IN   CT_DATA_IN
++#define CT2_DATA_OUT  CT_DATA_OUT
++#define CT2_NO_DATA   CT_NO_DATA
++#define CT2_DATAMASK  CT_DATAMASK
++#define       CT2_CCINCR      0x0100
++#define       CT2_FASTPOST    0x0200
++#define       CT2_TERMINATE   0x4000
++#define CT2_SENDSTATUS        0x8000
++
++/*
++ * ct_status values are (mostly) the same as that for ct_entry.
++ */
++
++/*
++ * ct_scsi_status values- the low 8 bits are the normal SCSI status
++ * we know and love. The upper 8 bits are validity markers for FCP_RSP_IU
++ * fields.
++ */
++#define       CT2_RSPLEN_VALID        0x0100
++#define       CT2_SNSLEN_VALID        0x0200
++#define       CT2_DATA_OVER           0x0400
++#define       CT2_DATA_UNDER          0x0800
++
++/*
++ * Debug macros
++ */
++
++#define       ISP_TDQE(isp, msg, idx, arg)    \
++    if (isp->isp_dblev & ISP_LOGTDEBUG2) isp_print_qentry(isp, msg, idx, arg)
++
++#ifdef        ISP_TARGET_FUNCTIONS
++/*
++ * The functions below are for the publicly available
++ * target mode functions that are internal to the Qlogic driver.
++ */
++
++/*
++ * This function handles new response queue entry appropriate for target mode.
++ */
++int isp_target_notify(struct ispsoftc *, void *, u_int16_t *);
++
++/*
++ * Enable/Disable/Modify a logical unit.
++ * (softc, cmd, bus, tgt, lun, cmd_cnt, inotify_cnt, opaque)
++ */
++#define       DFLT_CMND_CNT   0xfe    /* unmonitored */
++#define       DFLT_INOT_CNT   16
++int isp_lun_cmd(struct ispsoftc *, int, int, int, int, int, int, u_int32_t);
++
++/*
++ * General request queue 'put' routine for target mode entries.
++ */
++int isp_target_put_entry(struct ispsoftc *isp, void *);
++
++/*
++ * General routine to put back an ATIO entry-
++ * used for replenishing f/w resource counts.
++ * The argument is a pointer to a source ATIO
++ * or ATIO2.
++ */
++int isp_target_put_atio(struct ispsoftc *, void *);
++
++/*
++ * General routine to send a final CTIO for a command- used mostly for
++ * local responses.
++ */
++int isp_endcmd(struct ispsoftc *, void *, u_int32_t, u_int16_t);
++#define       ECMD_SVALID     0x100
++
++/*
++ * Handle an asynchronous event
++ *
++ * Return nonzero if the interrupt that generated this event has been dismissed.
++ */
++
++int isp_target_async(struct ispsoftc *, int, int);
++#endif
++#endif        /* _ISP_TARGET_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/isp_tpublic.h  2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,396 @@
++/* @(#)isp_tpublic.h 1.11 */
++/*
++ * Qlogic ISP Host Adapter Public Target Interface Structures && Routines
++ *---------------------------------------
++ * Copyright (c) 2000, 2001, 2002, 2003 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification, immediately at the beginning of the file.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * Matthew Jacob
++ * Feral Software
++ * mjacob@feral.com
++ */
++
++/*
++ * Required software target mode message and event handling structures.
++ *
++ * The message and event structures are used by the MI layer
++ * to propagate messages and events upstream.
++ */
++
++#ifndef       IN_MSGLEN
++#define       IN_MSGLEN       8
++#endif
++typedef struct {
++      void *          nt_hba;                 /* HBA tag */
++      u_int64_t       nt_iid;                 /* inititator id */
++      u_int64_t       nt_tgt;                 /* target id */
++      u_int64_t       nt_lun;                 /* logical unit */
++      u_int32_t       nt_tagval;              /* tag value */
++      u_int8_t        nt_bus;                 /* bus */
++      u_int8_t        nt_tagtype;             /* tag type */
++      u_int8_t        nt_msg[IN_MSGLEN];      /* message content */
++} tmd_msg_t;
++
++typedef struct {
++      void *          ev_hba;                 /* HBA tag */
++      u_int32_t       ev_bus;                 /* bus */
++      u_int32_t       ev_event;               /* type of async event */
++} tmd_event_t;
++
++/*
++ * Suggested Software Target Mode Command Handling structure.
++ *
++ * A note about terminology:
++ *
++ *   MD stands for "Machine Dependent".
++ *
++ *    This driver is structured in three layers: Outer MD, core, and inner MD.
++ *    The latter also is bus dependent (i.e., is cognizant of PCI bus issues
++ *    as well as platform issues).
++ *
++ *
++ *   "Outer Layer" means "Other Module"
++ *
++ *    Some additional module that actually implements SCSI target command
++ *    policy is the recipient of incoming commands and the source of the
++ *    disposition for them.
++ *
++ * The command structure below is one suggested possible MD command structure,
++ * but since the handling of thbis is entirely in the MD layer, there is
++ * no explicit or implicit requirement that it be used.
++ *
++ * The cd_private tag should be used by the MD layer to keep a free list
++ * of these structures. Code outside of this driver can then use this
++ * to identify it's own unit structures. That is, when not on the MD
++ * layer's freelist, the MD layer should shove into it the identifier
++ * that the outer layer has for it- passed in on an initial QIN_HBA_REG
++ * call (see below).
++ *
++ * The cd_hba tag is a tag that uniquely identifies the HBA this target
++ * mode command is coming from. The outer layer has to pass this back
++ * unchanged to avoid chaos.
++ *
++ * The cd_iid, cd_tgt, cd_lun and cd_bus tags are used to identify the
++ * id of the initiator who sent us a command, the target claim to be, the
++ * lun on the target we claim to be, and the bus instance (for multiple
++ * bus host adapters) that this applies to (consider it an extra Port
++ * parameter). The iid, tgt and lun values are deliberately chosen to be
++ * fat so that, for example, World Wide Names can be used instead of
++ * the units that the Qlogic firmware uses (in the case where the MD
++ * layer maintains a port database, for example).
++ *
++ * The cd_tagtype field specifies what kind of command tag has been
++ * sent with the command. The cd_tagval is the tag's value (low 16
++ * bits). It also contains (in the upper 16 bits) any command handle.
++ *
++ *
++ * N.B.: when the MD layer sends this command to outside software
++ * the outside software likely *MUST* return the same cd_tagval that
++ * was in place because this value is likely what the Qlogic f/w uses
++ * to identify a command.
++ *
++ * The cd_cdb contains storage for the passed in command descriptor block.
++ * This is the maximum size we can get out of the Qlogic f/w. There's no
++ * passed in length because whoever decodes the command to act upon it
++ * will know what the appropriate length is.
++ *
++ * The tag cd_lflags are the flags set by the MD driver when it gets
++ * command incoming or when it needs to inform any outside entities
++ * that the last requested action failed.
++ *
++ * The tag cd_hflags should be set by any outside software to indicate
++ * the validity of sense and status fields (defined below) and to indicate
++ * the direction data is expected to move. It is an error to have both
++ * CDFH_DATA_IN and CDFH_DATA_OUT set.
++ *
++ * If the CDFH_STSVALID flag is set, the command should be completed (after
++ * sending any data and/or status). If CDFH_SNSVALID is set and the MD layer
++ * can also handle sending the associated sense data (either back with an
++ * FCP RESPONSE IU for Fibre Channel or otherwise automatically handling a
++ * REQUEST SENSE from the initator for this target/lun), the MD layer will
++ * set the CDFL_SENTSENSE flag on successful transmission of the sense data.
++ * It is an error for the CDFH_SNSVALID bit to be set and CDFH_STSVALID not
++ * to be set. It is an error for the CDFH_SNSVALID be set and the associated
++ * SCSI status (cd_scsi_status) not be set to CHECK CONDITON.
++ * 
++ * The tag cd_data points to a data segment to either be filled or
++ * read from depending on the direction of data movement. The tag
++ * is undefined if no data direction is set. The MD layer and outer
++ * layers must agree on the meaning of cd_data.
++ *
++ * The tag cd_totlen is the total data amount expected to be moved
++ * over the life of the command. It *may* be set by the MD layer, possibly
++ * from the datalen field of an FCP CMND IU unit. If it shows up in the outer
++ * layers set to zero and the CDB indicates data should be moved, the outer
++ * layer should set it to the amount expected to be moved.
++ *
++ * The tag cd_resid should be the total residual of data not transferred.
++ * The outer layers need to set this at the begining of command processing
++ * to equal cd_totlen. As data is successfully moved, this value is decreased.
++ * At the end of a command, any nonzero residual indicates the number of bytes
++ * requested but not moved. XXXXXXXXXXXXXXXXXXXXXXX TOO VAGUE!!! 
++ *
++ * The tag cd_xfrlen is the length of the currently active data transfer.
++ * This allows several interations between any outside software and the
++ * MD layer to move data.
++ *
++ * The reason that total length and total residual have to be tracked
++ * is that fibre channel FCP DATA IU units have to have a relative
++ * offset field.
++ *
++ * N.B.: there is no necessary 1-to-1 correspondence between any one
++ * data transfer segment and the number of CTIOs that will be generated
++ * satisfy the current data transfer segment. It's not also possible to
++ * predict how big a transfer can be before it will be 'too big'. Be
++ * reasonable- a 64KB transfer is 'reasonable'. A 1MB transfer may not
++ * be. A 32MB transfer is unreasonable. The problem here has to do with
++ * how CTIOs can be used to map passed data pointers. In systems which
++ * have page based scatter-gather requirements, each PAGESIZEd chunk will
++ * consume one data segment descriptor- you get 3 or 4 of them per CTIO.
++ * The size of the REQUEST QUEUE you drop a CTIO onto is finite (typically
++ * it's 256, but on some systems it's even smaller, and note you have to
++ * sure this queue with the initiator side of this driver).
++ *
++ * The tags cd_sense and cd_scsi_status are pretty obvious.
++ *
++ * The tag cd_error is to communicate between the MD layer and outer software
++ * the current error conditions.
++ *
++ * The tag cd_lreserved, cd_hreserved are scratch areas for use for the MD
++ * and outer layers respectively.
++ * 
++ */
++
++#ifndef       TMD_CDBLEN
++#define       TMD_CDBLEN      18      /* 16 bytes, plus pad for alignment */
++#endif
++#ifndef       QLTM_SENSELEN
++#define       QLTM_SENSELEN   18
++#endif
++#ifndef       QCDS
++#define       QCDS    8
++#endif
++
++typedef struct tmd_cmd {
++      void *                  cd_private;     /* private data pointer */
++      void *                  cd_hba;         /* HBA tag */
++      void *                  cd_data;        /* 'pointer' to data */
++      u_int64_t               cd_iid;         /* initiator ID */
++      u_int64_t               cd_tgt;         /* target id */
++      u_int64_t               cd_lun;         /* logical unit */
++      u_int32_t               cd_tagval;      /* tag value */
++      u_int32_t               cd_lflags;      /* flags lower level sets */
++      u_int32_t               cd_hflags;      /* flags higher level sets */
++      u_int32_t               cd_totlen;      /* total data requirement */
++      u_int32_t               cd_resid;       /* total data residual */
++      u_int32_t               cd_xfrlen;      /* current data requirement */
++      int32_t                 cd_error;       /* current error */
++      u_int16_t               cd_scsi_status; /* closing SCSI status */
++      u_int8_t                cd_chan;        /* channel on card */
++      u_int8_t                cd_tagtype;     /* tag type */
++      u_int8_t                cd_sense[QLTM_SENSELEN];
++      u_int8_t                cd_cdb[TMD_CDBLEN];     /* Command */
++      union {
++              void *          ptrs[QCDS / sizeof (void *)];
++              u_int64_t       llongs[QCDS / sizeof (u_int64_t)];
++              u_int32_t       longs[QCDS / sizeof (u_int32_t)];
++              u_int16_t       shorts[QCDS / sizeof (u_int16_t)];
++              u_int8_t        bytes[QCDS];
++      } cd_lreserved[2], cd_hreserved[2];
++} tmd_cmd_t;
++
++#ifndef       TMD_SIZE
++#define       TMD_SIZE        (sizeof (tmd_cmd_t))
++#endif
++
++/*
++ * Note that NODISC (obviously) doesn't apply to non-SPI transport.
++ *
++ * Note that knowing the data direction and lengh at the time of receipt of
++ * a command from the initiator is a feature only of Fibre Channel.
++ *
++ * The CDFL_BIDIR is in anticipation of the adoption of some newer
++ * features required by OSD.
++ *
++ * The principle selector for MD layer to know whether data is to
++ * be transferred in any QOUT_TMD_CONT call is cd_xfrlen- the
++ * flags CDFH_DATA_IN and CDFH_DATA_OUT define which direction.
++ */
++#define       CDFL_SNSVALID   0x01            /* sense data (from f/w) good */
++#define       CDFL_SENTSTATUS 0x02            /* last action sent status */
++#define       CDFL_DATA_IN    0x04            /* target (us) -> initiator (them) */
++#define       CDFL_DATA_OUT   0x08            /* initiator (them) -> target (us) */
++#define       CDFL_BIDIR      0x0C            /* bidirectional data */
++#define       CDFL_ERROR      0x10            /* last action ended in error */
++#define       CDFL_NODISC     0x20            /* disconnects disabled */
++#define       CDFL_SENTSENSE  0x40            /* last action sent sense data */
++#define       CDFL_BUSY       0x80            /* this command is not on a free list */
++#define       CDFL_PRIVATE    0xFF000000      /* private layer flags */
++
++#define       CDFH_SNSVALID   0x01            /* sense data (from outer layer) good */
++#define       CDFH_STSVALID   0x02            /* status valid */
++#define       CDFH_DATA_IN    0x04            /* target (us) -> initiator (them) */
++#define       CDFH_DATA_OUT   0x08            /* initiator (them) -> target (us) */
++#define       CDFH_DATA_MASK  0x0C            /* mask to cover data direction */
++#define       CDFH_PRIVATE    0xFF000000      /* private layer flags */
++
++
++/*
++ * Action codes set by the Qlogic MD target driver for
++ * the external layer to figure out what to do with.
++ */
++typedef enum {
++      QOUT_HBA_REG=0, /* the argument is a pointer to a hba_register_t */
++      QOUT_ENABLE,    /* the argument is a pointer to a enadis_t */
++      QOUT_DISABLE,   /* the argument is a pointer to a enadis_t */
++      QOUT_TMD_START, /* the argument is a pointer to a tmd_cmd_t */
++      QOUT_TMD_DONE,  /* the argument is a pointer to a tmd_cmd_t */
++      QOUT_TEVENT,    /* the argument is a pointer to a tmd_event_t */
++      QOUT_TMSG,      /* the argument is a pointer to a tmd_msg_t */
++      QOUT_IOCTL,     /* the argument is a pointer to a ioctl_cmd_t */
++      QOUT_HBA_UNREG  /* the argument is a pointer to a hba_register_t */
++} tact_e;
++
++/*
++ * Action codes set by the external layer for the
++ * MD Qlogic driver to figure out what to do with.
++ */
++typedef enum {
++      QIN_HBA_REG=99, /* the argument is a pointer to a hba_register_t */
++      QIN_ENABLE,     /* the argument is a pointer to a enadis_t */
++      QIN_DISABLE,    /* the argument is a pointer to a enadis_t */
++      QIN_TMD_CONT,   /* the argument is a pointer to a tmd_cmd_t */
++      QIN_TMD_FIN,    /* the argument is a pointer to a tmd_cmd_t */
++      QIN_IOCTL,      /* the argument is a pointer to a ioctl_cmd_t */
++      QIN_HBA_UNREG,  /* the argument is a pointer to a hba_register_t */
++} qact_e;
++
++
++/*
++ * A word about the START/CONT/DONE/FIN dance:
++ *
++ *    When the HBA is enabled for receiving commands, one may show up
++ *    without notice. When that happens, the Qlogic target mode driver
++ *    gets a tmd_cmd_t, fills it with the info that just arrived, and
++ *    calls the outer layer with a QOUT_TMD_START code and pointer to
++ *    the tmd_cmd_t.
++ *
++ *    The outer layer decodes the command, fetches data, prepares stuff,
++ *    whatever, and starts by passing back the pointer with a QIN_TMD_CONT
++ *    code which causes the Qlogic target mode driver to generate CTIOs to
++ *    satisfy whatever action needs to be taken. When those CTIOs complete,
++ *    the Qlogic target driver sends the pointer to the cmd_tmd_t back with
++ *    a QOUT_TMD_DONE code. This repeats for as long as necessary.
++ *
++ *    The outer layer signals it wants to end the command by settings within
++ *    the tmd_cmd_t itself. When the final QIN_TMD_CONT is reported completed,
++ *    the outer layer frees the tmd_cmd_t by sending the pointer to it
++ *    back with a QIN_TMD_FIN code.
++ *
++ *    The graph looks like:
++ *
++ *    QOUT_TMD_START -> [ QIN_TMD_CONT -> QOUT_TMD_DONE ] * -> QIN_TMD_FIN.
++ *
++ */
++
++/*
++ * A word about ENABLE/DISABLE: the argument is a pointer to a enadis_t
++ * with cd_hba, cd_iid, cd_chan, cd_tgt and cd_lun filled out.
++ *
++ * If an error occurs in either enabling or disabling the described lun
++ * cd_error is set with an appropriate non-zero value.
++ *
++ * Logical unit zero must be the first enabled and the last disabled.
++ */
++typedef struct {
++      void *                  cd_private;     /* for outer layer usage */
++      void *                  cd_hba;         /* HBA tag */
++      u_int64_t               cd_iid;         /* initiator ID */
++      u_int64_t               cd_tgt;         /* target id */
++      u_int64_t               cd_lun;         /* logical unit */
++      u_int8_t                cd_chan;        /* channel on card */
++      int32_t                 cd_error;
++} enadis_t;
++
++/*
++ * This structure is used to register to other software modules the
++ * binding of an HBA identifier, driver name and instance and the
++ * lun width capapbilities of this target driver. It's up to each
++ * platform to figure out how it wants to do this, but a typical
++ * sequence would be for the MD layer to find some external module's
++ * entry point and start by sending a QOUT_HBA_REG with info filled
++ * in, and the external module to call back with a QIN_HBA_REG that
++ * passes back the corresponding information.
++ */
++#define       QR_VERSION      1
++typedef struct {
++      void *  r_identity;
++      void   (*r_action)(qact_e, void *);
++      char    r_name[8];
++      int     r_inst;
++      int     r_version;
++      enum { R_FC, R_SCSI } r_type;
++} hba_register_t;
++
++/*
++ * This structure is used to pass an encapsulated ioctl through to the
++ * MD layer. In many implementations it's often convenient to open just
++ * one device, but actions you want to take need to be taken on the
++ * underlying HBA. Rather than invent a separate protocol for each action,
++ * an ioctl passthrough seems simpler.
++ *
++ * In order to avoid cross domain copy problems, though, the caller will
++ * be responsible for allocating and providing a staging area for all ioctl
++ * related data. This, unavoidably, requires some ioctl decode capability
++ * in the outer layer code.`
++ *
++ * And also, albeit being cheesy, we'll define a few internal ioctls here.
++ */
++typedef struct {
++      void *  i_identity;     /* HBA tag */
++      void *  i_syncptr;      /* synchronization pointer */
++      int     i_cmd;          /* ioctl command */
++      void *  i_arg;          /* ioctl argument area */
++      int     i_errno;        /* ioctl error return */
++} ioctl_cmd_t;
++
++#define       QI_IOC  ('Q' << 8)
++#define       QI_SCSI_TINI    QI_IOC|0
++#define       QI_SCSI_CMD     QI_IOC|1
++#define       QI_WWPN_XLT     QI_IOC|2
++
++/*
++ * Target handler functions.
++ *
++ * The MD target handler function (the outer layer calls this)
++ * should be be prototyped like:
++ *
++ *    void target_action(qact_e, void *arg)
++ *
++ * The outer layer target handler function (the MD layer calls this)
++ * should be be prototyped like:
++ *
++ *    void system_target_handler(tact_e, void *arg)
++ */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/ispvar.h       2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,902 @@
++/* @(#)ispvar.h 1.44 */
++/*
++ * Soft Definitions for for Qlogic ISP SCSI adapters.
++ *
++ * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice immediately at the beginning of the file, without modification,
++ *    this list of conditions, and the following disclaimer.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ */
++
++#ifndef       _ISPVAR_H
++#define       _ISPVAR_H
++
++#if defined(__NetBSD__) || defined(__OpenBSD__)
++#include <dev/ic/ispmbox.h>
++#ifdef        ISP_TARGET_MODE
++#include <dev/ic/isp_target.h>
++#include <dev/ic/isp_tpublic.h>
++#endif
++#endif
++#ifdef        __FreeBSD__
++#include <dev/isp/ispmbox.h>
++#ifdef        ISP_TARGET_MODE
++#include <dev/isp/isp_target.h>
++#include <dev/isp/isp_tpublic.h>
++#endif
++#endif
++#ifdef        __linux__
++#include "ispmbox.h"
++#ifdef        ISP_TARGET_MODE
++#include "isp_target.h"
++#include "isp_tpublic.h"
++#endif
++#endif
++
++#define       ISP_CORE_VERSION_MAJOR  2
++#define       ISP_CORE_VERSION_MINOR  7
++
++/*
++ * Vector for bus specific code to provide specific services.
++ */
++struct ispsoftc;
++struct ispmdvec {
++      int             (*dv_rd_isr)
++          (struct ispsoftc *, u_int16_t *, u_int16_t *, u_int16_t *);
++      u_int16_t       (*dv_rd_reg) (struct ispsoftc *, int);
++      void            (*dv_wr_reg) (struct ispsoftc *, int, u_int16_t);
++      int             (*dv_mbxdma) (struct ispsoftc *);
++      int             (*dv_dmaset) (struct ispsoftc *,
++          XS_T *, ispreq_t *, u_int16_t *, u_int16_t);
++      void            (*dv_dmaclr)
++          (struct ispsoftc *, XS_T *, u_int16_t);
++      void            (*dv_reset0) (struct ispsoftc *);
++      void            (*dv_reset1) (struct ispsoftc *);
++      void            (*dv_dregs) (struct ispsoftc *, const char *);
++      u_int16_t       *dv_ispfw;      /* ptr to f/w */
++      u_int16_t       dv_conf1;
++      u_int16_t       dv_clock;       /* clock frequency */
++};
++
++/*
++ * Overall parameters
++ */
++#define       MAX_TARGETS             16
++#define       MAX_FC_TARG             256
++#define       ISP_MAX_TARGETS(isp)    (IS_FC(isp)? MAX_FC_TARG : MAX_TARGETS)
++#define       ISP_MAX_LUNS(isp)       (isp)->isp_maxluns
++
++/*
++ * 'Types'
++ */
++#ifdef        ISP_DAC_SUPPORTED
++typedef       u_int64_t       isp_dma_addr_t;
++#else
++typedef       u_int32_t       isp_dma_addr_t;
++#endif
++
++/*
++ * Macros to access ISP registers through bus specific layers-
++ * mostly wrappers to vector through the mdvec structure.
++ */
++#define       ISP_READ_ISR(isp, isrp, semap, mbox0p)  \
++      (*(isp)->isp_mdvec->dv_rd_isr)(isp, isrp, semap, mbox0p)
++
++#define       ISP_READ(isp, reg)      \
++      (*(isp)->isp_mdvec->dv_rd_reg)((isp), (reg))
++
++#define       ISP_WRITE(isp, reg, val)        \
++      (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), (val))
++
++#define       ISP_MBOXDMASETUP(isp)   \
++      (*(isp)->isp_mdvec->dv_mbxdma)((isp))
++
++#define       ISP_DMASETUP(isp, xs, req, iptrp, optr) \
++      (*(isp)->isp_mdvec->dv_dmaset)((isp), (xs), (req), (iptrp), (optr))
++
++#define       ISP_DMAFREE(isp, xs, hndl)      \
++      if ((isp)->isp_mdvec->dv_dmaclr) \
++          (*(isp)->isp_mdvec->dv_dmaclr)((isp), (xs), (hndl))
++
++#define       ISP_RESET0(isp) \
++      if ((isp)->isp_mdvec->dv_reset0) (*(isp)->isp_mdvec->dv_reset0)((isp))
++#define       ISP_RESET1(isp) \
++      if ((isp)->isp_mdvec->dv_reset1) (*(isp)->isp_mdvec->dv_reset1)((isp))
++#define       ISP_DUMPREGS(isp, m)    \
++      if ((isp)->isp_mdvec->dv_dregs) (*(isp)->isp_mdvec->dv_dregs)((isp),(m))
++
++#define       ISP_SETBITS(isp, reg, val)      \
++ (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), ISP_READ((isp), (reg)) | (val))
++
++#define       ISP_CLRBITS(isp, reg, val)      \
++ (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), ISP_READ((isp), (reg)) & ~(val))
++
++/*
++ * The MEMORYBARRIER macro is defined per platform (to provide synchronization
++ * on Request and Response Queues, Scratch DMA areas, and Registers)
++ *
++ * Defined Memory Barrier Synchronization Types
++ */
++#define       SYNC_REQUEST    0       /* request queue synchronization */
++#define       SYNC_RESULT     1       /* result queue synchronization */
++#define       SYNC_SFORDEV    2       /* scratch, sync for ISP */
++#define       SYNC_SFORCPU    3       /* scratch, sync for CPU */
++#define       SYNC_REG        4       /* for registers */
++
++/*
++ * Request/Response Queue defines and macros.
++ * The maximum is defined per platform (and can be based on board type).
++ */
++/* This is the size of a queue entry (request and response) */
++#define       QENTRY_LEN                      64
++/* Both request and result queue length must be a power of two */
++#define       RQUEST_QUEUE_LEN(x)             MAXISPREQUEST(x)
++#ifdef        ISP_TARGET_MODE
++#define       RESULT_QUEUE_LEN(x)             MAXISPREQUEST(x)
++#else
++#define       RESULT_QUEUE_LEN(x)             \
++      (((MAXISPREQUEST(x) >> 2) < 64)? 64 : MAXISPREQUEST(x) >> 2)
++#endif
++#define       ISP_QUEUE_ENTRY(q, idx)         ((q) + ((idx) * QENTRY_LEN))
++#define       ISP_QUEUE_SIZE(n)               ((n) * QENTRY_LEN)
++#define       ISP_NXT_QENTRY(idx, qlen)       (((idx) + 1) & ((qlen)-1))
++#define       ISP_QFREE(in, out, qlen)        \
++      ((in == out)? (qlen - 1) : ((in > out)? \
++      ((qlen - 1) - (in - out)) : (out - in - 1)))
++#define       ISP_QAVAIL(isp) \
++      ISP_QFREE(isp->isp_reqidx, isp->isp_reqodx, RQUEST_QUEUE_LEN(isp))
++
++#define       ISP_ADD_REQUEST(isp, nxti)                                      \
++      MEMORYBARRIER(isp, SYNC_REQUEST, isp->isp_reqidx, QENTRY_LEN);  \
++      WRITE_REQUEST_QUEUE_IN_POINTER(isp, nxti);                      \
++      isp->isp_reqidx = nxti
++
++/*
++ * SCSI Specific Host Adapter Parameters- per bus, per target
++ */
++
++typedef struct {
++      u_int           isp_gotdparms           : 1,
++                      isp_req_ack_active_neg  : 1,
++                      isp_data_line_active_neg: 1,
++                      isp_cmd_dma_burst_enable: 1,
++                      isp_data_dma_burst_enabl: 1,
++                      isp_fifo_threshold      : 3,
++                      isp_ultramode           : 1,
++                      isp_diffmode            : 1,
++                      isp_lvdmode             : 1,
++                      isp_fast_mttr           : 1,    /* fast sram */
++                      isp_initiator_id        : 4,
++                      isp_async_data_setup    : 4;
++      u_int16_t       isp_selection_timeout;
++      u_int16_t       isp_max_queue_depth;
++      u_int8_t        isp_tag_aging;
++      u_int8_t        isp_bus_reset_delay;
++      u_int8_t        isp_retry_count;
++      u_int8_t        isp_retry_delay;
++      struct {
++              u_int32_t       
++                      exc_throttle    :       8,
++                                      :       1,
++                      dev_enable      :       1,      /* ignored */
++                      dev_update      :       1,
++                      dev_refresh     :       1,
++                      actv_offset     :       4,
++                      goal_offset     :       4,
++                      nvrm_offset     :       4;
++              u_int8_t        actv_period;    /* current sync period */
++              u_int8_t        goal_period;    /* goal sync period */
++              u_int8_t        nvrm_period;    /* nvram sync period */
++              u_int16_t       actv_flags;     /* current device flags */
++              u_int16_t       goal_flags;     /* goal device flags */
++              u_int16_t       nvrm_flags;     /* nvram device flags */
++      } isp_devparam[MAX_TARGETS];
++} sdparam;
++
++/*
++ * Device Flags
++ */
++#define       DPARM_DISC      0x8000
++#define       DPARM_PARITY    0x4000
++#define       DPARM_WIDE      0x2000
++#define       DPARM_SYNC      0x1000
++#define       DPARM_TQING     0x0800
++#define       DPARM_ARQ       0x0400
++#define       DPARM_QFRZ      0x0200
++#define       DPARM_RENEG     0x0100
++#define       DPARM_NARROW    0x0080
++#define       DPARM_ASYNC     0x0040
++#define       DPARM_PPR       0x0020
++#define       DPARM_DEFAULT   (0xFF00 & ~DPARM_QFRZ)
++#define       DPARM_SAFE_DFLT (DPARM_DEFAULT & ~(DPARM_WIDE|DPARM_SYNC|DPARM_TQING))
++
++
++/* technically, not really correct, as they need to be rated based upon clock */
++#define       ISP_80M_SYNCPARMS       0x0c09
++#define       ISP_40M_SYNCPARMS       0x0c0a
++#define       ISP_20M_SYNCPARMS       0x0c0c
++#define       ISP_20M_SYNCPARMS_1040  0x080c
++#define       ISP_10M_SYNCPARMS       0x0c19
++#define       ISP_08M_SYNCPARMS       0x0c25
++#define       ISP_05M_SYNCPARMS       0x0c32
++#define       ISP_04M_SYNCPARMS       0x0c41
++
++/*
++ * Fibre Channel Specifics
++ */
++#define       FL_PORT_ID              0x7e    /* FL_Port Special ID */
++#define       FC_PORT_ID              0x7f    /* Fabric Controller Special ID */
++#define       FC_SNS_ID               0x80    /* SNS Server Special ID */
++
++/* #define    ISP_USE_GA_NXT  1 */    /* Use GA_NXT with switches */
++#ifndef       GA_NXT_MAX
++#define       GA_NXT_MAX      256
++#endif
++
++typedef struct {
++      u_int32_t               isp_fwoptions   : 16,
++                              isp_gbspeed     : 2,
++                              isp_iid_set     : 1,
++                              loop_seen_once  : 1,
++                              isp_loopstate   : 4,    /* Current Loop State */
++                              isp_fwstate     : 3,    /* ISP F/W state */
++                              isp_gotdparms   : 1,
++                              isp_topo        : 3,
++                              isp_onfabric    : 1;
++      u_int8_t                isp_iid;        /* 'initiator' id */
++      u_int8_t                isp_loopid;     /* hard loop id */
++      u_int8_t                isp_alpa;       /* ALPA */
++      u_int32_t               isp_portid;
++      volatile u_int16_t      isp_lipseq;     /* LIP sequence # */
++      u_int16_t               isp_fwattr;     /* firmware attributes */
++      u_int8_t                isp_execthrottle;
++      u_int8_t                isp_retry_delay;
++      u_int8_t                isp_retry_count;
++      u_int8_t                isp_reserved;
++      u_int16_t               isp_maxalloc;
++      u_int16_t               isp_maxfrmlen;
++      u_int64_t               isp_nodewwn;
++      u_int64_t               isp_portwwn;
++      /*
++       * Port Data Base. This is indexed by 'target', which is invariate.
++       * However, elements within can move around due to loop changes,
++       * so the actual loop ID passed to the F/W is in this structure.
++       * The first time the loop is seen up, loopid will match the index
++       * (except for fabric nodes which are above mapped above FC_SNS_ID
++       * and are completely virtual), but subsequent LIPs can cause things
++       * to move around.
++       */
++      struct lportdb {
++              u_int32_t
++                                      port_type       : 8,
++                                      loopid          : 8,
++                                      fc4_type        : 4,
++                                      last_fabric_dev : 1,
++                                                      : 2,
++                                      relogin         : 1,
++                                      force_logout    : 1,
++                                      was_fabric_dev  : 1,
++                                      fabric_dev      : 1,
++                                      loggedin        : 1,
++                                      roles           : 2,
++                                      valid           : 1;
++              u_int32_t               portid;
++              u_int64_t               node_wwn;
++              u_int64_t               port_wwn;
++      } portdb[MAX_FC_TARG], tport[FC_PORT_ID];
++
++      /*
++       * Scratch DMA mapped in area to fetch Port Database stuff, etc.
++       */
++      caddr_t                 isp_scratch;
++      isp_dma_addr_t          isp_scdma;
++#ifdef        ISP_FW_CRASH_DUMP
++      u_int16_t               *isp_dump_data;
++#endif
++} fcparam;
++
++#define       FW_CONFIG_WAIT          0
++#define       FW_WAIT_AL_PA           1
++#define       FW_WAIT_LOGIN           2
++#define       FW_READY                3
++#define       FW_LOSS_OF_SYNC         4
++#define       FW_ERROR                5
++#define       FW_REINIT               6
++#define       FW_NON_PART             7
++
++#define       LOOP_NIL                0
++#define       LOOP_LIP_RCVD           1
++#define       LOOP_PDB_RCVD           2
++#define       LOOP_SCANNING_FABRIC    3
++#define       LOOP_FSCAN_DONE         4
++#define       LOOP_SCANNING_LOOP      5
++#define       LOOP_LSCAN_DONE         6
++#define       LOOP_SYNCING_PDB        7
++#define       LOOP_READY              8
++
++#define       TOPO_NL_PORT            0
++#define       TOPO_FL_PORT            1
++#define       TOPO_N_PORT             2
++#define       TOPO_F_PORT             3
++#define       TOPO_PTP_STUB           4
++
++/*
++ * Soft Structure per host adapter
++ */
++typedef struct ispsoftc {
++      /*
++       * Platform (OS) specific data
++       */
++      struct isposinfo        isp_osinfo;
++
++      /*
++       * Pointer to bus specific functions and data
++       */
++      struct ispmdvec *       isp_mdvec;
++
++      /*
++       * (Mostly) nonvolatile state. Board specific parameters
++       * may contain some volatile state (e.g., current loop state).
++       */
++
++      void *                  isp_param;      /* type specific */
++      u_int16_t               isp_fwrev[3];   /* Loaded F/W revision */
++      u_int16_t               isp_romfw_rev[3]; /* PROM F/W revision */
++      u_int16_t               isp_maxcmds;    /* max possible I/O cmds */
++      u_int8_t                isp_type;       /* HBA Chip Type */
++      u_int8_t                isp_revision;   /* HBA Chip H/W Revision */
++      u_int32_t               isp_maxluns;    /* maximum luns supported */
++
++      u_int32_t               isp_clock       : 8,    /* input clock */
++                                              : 4,
++                              isp_port        : 1,    /* 23XX only */
++                              isp_failed      : 1,    /* board failed */
++                              isp_open        : 1,    /* opened (ioctl) */
++                              isp_touched     : 1,    /* board ever seen? */
++                              isp_bustype     : 1,    /* SBus or PCI */
++                              isp_loaded_fw   : 1,    /* loaded firmware */
++                              isp_role        : 2,    /* roles supported */
++                              isp_dblev       : 12;   /* debug log mask */
++
++      u_int32_t               isp_confopts;           /* config options */
++
++      u_int16_t               isp_rqstinrp;   /* register for REQINP */
++      u_int16_t               isp_rqstoutrp;  /* register for REQOUTP */
++      u_int16_t               isp_respinrp;   /* register for RESINP */
++      u_int16_t               isp_respoutrp;  /* register for RESOUTP */
++
++      /*
++       * Instrumentation
++       */
++      u_int64_t               isp_intcnt;             /* total int count */
++      u_int64_t               isp_intbogus;           /* spurious int count */
++      u_int64_t               isp_intmboxc;           /* mbox completions */
++      u_int64_t               isp_intoasync;          /* other async */
++      u_int64_t               isp_rsltccmplt;         /* CMDs on result q */
++      u_int64_t               isp_fphccmplt;          /* CMDs via fastpost */
++      u_int16_t               isp_rscchiwater;
++      u_int16_t               isp_fpcchiwater;
++
++      /*
++       * Volatile state
++       */
++
++      volatile u_int32_t
++              isp_obits       :       8,      /* mailbox command output */
++              isp_mboxbsy     :       1,      /* mailbox command active */
++              isp_state       :       3,
++              isp_sendmarker  :       2,      /* send a marker entry */
++              isp_update      :       2,      /* update parameters */
++              isp_nactive     :       16;     /* how many commands active */
++      volatile u_int16_t      isp_reqodx;     /* index of last ISP pickup */
++      volatile u_int16_t      isp_reqidx;     /* index of next request */
++      volatile u_int16_t      isp_residx;     /* index of next result */
++      volatile u_int16_t      isp_resodx;     /* index of next result */
++      volatile u_int16_t      isp_rspbsy;
++      volatile u_int16_t      isp_lasthdls;   /* last handle seed */
++      volatile u_int16_t      isp_mboxtmp[MAX_MAILBOX];
++      volatile u_int16_t      isp_lastmbxcmd; /* last mbox command sent */
++      volatile u_int16_t      isp_mbxwrk0;
++      volatile u_int16_t      isp_mbxwrk1;
++      volatile u_int16_t      isp_mbxwrk2;
++      void *                  isp_mbxworkp;
++
++      /*
++       * Active commands are stored here, indexed by handle functions.
++       */
++      XS_T **isp_xflist;
++
++      /*
++       * request/result queue pointers and dma handles for them.
++       */
++      caddr_t                 isp_rquest;
++      caddr_t                 isp_result;
++      isp_dma_addr_t          isp_rquest_dma;
++      isp_dma_addr_t          isp_result_dma;
++} ispsoftc_t;
++
++#define       SDPARAM(isp)    ((sdparam *) (isp)->isp_param)
++#define       FCPARAM(isp)    ((fcparam *) (isp)->isp_param)
++
++/*
++ * ISP Driver Run States
++ */
++#define       ISP_NILSTATE    0
++#define       ISP_RESETSTATE  1
++#define       ISP_INITSTATE   2
++#define       ISP_RUNSTATE    3
++
++/*
++ * ISP Configuration Options
++ */
++#define       ISP_CFG_NORELOAD        0x80    /* don't download f/w */
++#define       ISP_CFG_NONVRAM         0x40    /* ignore NVRAM */
++#define       ISP_CFG_TWOGB           0x20    /* force 2GB connection (23XX only) */
++#define       ISP_CFG_ONEGB           0x10    /* force 1GB connection (23XX only) */
++#define       ISP_CFG_FULL_DUPLEX     0x01    /* Full Duplex (Fibre Channel only) */
++#define       ISP_CFG_PORT_PREF       0x0C    /* Mask for Port Prefs (2200 only) */
++#define       ISP_CFG_LPORT           0x00    /* prefer {N/F}L-Port connection */
++#define       ISP_CFG_NPORT           0x04    /* prefer {N/F}-Port connection */
++#define       ISP_CFG_NPORT_ONLY      0x08    /* insist on {N/F}-Port connection */
++#define       ISP_CFG_LPORT_ONLY      0x0C    /* insist on {N/F}L-Port connection */
++#define       ISP_CFG_OWNWWPN         0x100   /* override NVRAM wwpn */
++#define       ISP_CFG_OWNWWNN         0x200   /* override NVRAM wwnn */
++#define       ISP_CFG_OWNFSZ          0x400   /* override NVRAM frame size */
++#define       ISP_CFG_OWNLOOPID       0x800   /* override NVRAM loopid */
++#define       ISP_CFG_OWNEXCTHROTTLE  0x1000  /* override NVRAM execution throttle */
++
++/*
++ * Prior to calling isp_reset for the first time, the outer layer
++ * should set isp_role to one of NONE, INITIATOR, TARGET, BOTH.
++ *
++ * If you set ISP_ROLE_NONE, the cards will be reset, new firmware loaded,
++ * NVRAM read, and defaults set, but any further initialization (e.g.
++ * INITIALIZE CONTROL BLOCK commands for 2X00 cards) won't be done.
++ *
++ * If INITIATOR MODE isn't set, attempts to run commands will be stopped
++ * at isp_start and completed with the moral equivalent of SELECTION TIMEOUT.
++ *
++ * If TARGET MODE is set, it doesn't mean that the rest of target mode support
++ * needs to be enabled, or will even work. What happens with the 2X00 cards
++ * here is that if you have enabled it with TARGET MODE as part of the ICB
++ * options, but you haven't given the f/w any ram resources for ATIOs or
++ * Immediate Notifies, the f/w just handles what it can and you never see
++ * anything. Basically, it sends a single byte of data (the first byte,
++ * which you can set as part of the INITIALIZE CONTROL BLOCK command) for
++ * INQUIRY, and sends back QUEUE FULL status for any other command.
++ *
++ */
++#define       ISP_ROLE_NONE           0x0
++#define       ISP_ROLE_INITIATOR      0x1
++#define       ISP_ROLE_TARGET         0x2
++#define       ISP_ROLE_BOTH           (ISP_ROLE_TARGET|ISP_ROLE_INITIATOR)
++#define       ISP_ROLE_EITHER         ISP_ROLE_BOTH
++#ifndef       ISP_DEFAULT_ROLES
++#define       ISP_DEFAULT_ROLES       ISP_ROLE_INITIATOR
++#endif
++
++
++/*
++ * Firmware related defines
++ */
++#define       ISP_CODE_ORG                    0x1000  /* default f/w code start */
++#define       ISP_CODE_ORG_2300               0x0800  /* ..except for 2300s */
++#define       ISP_FW_REV(maj, min, mic)       ((maj << 24) | (min << 16) | mic)
++#define       ISP_FW_MAJOR(code)              ((code >> 24) & 0xff)
++#define       ISP_FW_MINOR(code)              ((code >> 16) & 0xff)
++#define       ISP_FW_MICRO(code)              ((code >>  8) & 0xff)
++#define       ISP_FW_REVX(xp)                 ((xp[0]<<24) | (xp[1] << 16) | xp[2])
++#define       ISP_FW_MAJORX(xp)               (xp[0])
++#define       ISP_FW_MINORX(xp)               (xp[1])
++#define       ISP_FW_MICROX(xp)               (xp[2])
++#define       ISP_FW_NEWER_THAN(i, major, minor, micro)               \
++ (ISP_FW_REVX((i)->isp_fwrev) > ISP_FW_REV(major, minor, micro))
++
++/*
++ * Bus (implementation) types
++ */
++#define       ISP_BT_PCI              0       /* PCI Implementations */
++#define       ISP_BT_SBUS             1       /* SBus Implementations */
++
++/*
++ * If we have not otherwise defined SBus support away make sure
++ * it is defined here such that the code is included as default
++ */
++#ifndef       ISP_SBUS_SUPPORTED
++#define       ISP_SBUS_SUPPORTED      1
++#endif
++
++/*
++ * Chip Types
++ */
++#define       ISP_HA_SCSI             0xf
++#define       ISP_HA_SCSI_UNKNOWN     0x1
++#define       ISP_HA_SCSI_1020        0x2
++#define       ISP_HA_SCSI_1020A       0x3
++#define       ISP_HA_SCSI_1040        0x4
++#define       ISP_HA_SCSI_1040A       0x5
++#define       ISP_HA_SCSI_1040B       0x6
++#define       ISP_HA_SCSI_1040C       0x7
++#define       ISP_HA_SCSI_1240        0x8
++#define       ISP_HA_SCSI_1080        0x9
++#define       ISP_HA_SCSI_1280        0xa
++#define       ISP_HA_SCSI_10160       0xb
++#define       ISP_HA_SCSI_12160       0xc
++#define       ISP_HA_FC               0xf0
++#define       ISP_HA_FC_2100          0x10
++#define       ISP_HA_FC_2200          0x20
++#define       ISP_HA_FC_2300          0x30
++#define       ISP_HA_FC_2312          0x40
++
++#define       IS_SCSI(isp)    (isp->isp_type & ISP_HA_SCSI)
++#define       IS_1240(isp)    (isp->isp_type == ISP_HA_SCSI_1240)
++#define       IS_1080(isp)    (isp->isp_type == ISP_HA_SCSI_1080)
++#define       IS_1280(isp)    (isp->isp_type == ISP_HA_SCSI_1280)
++#define       IS_10160(isp)   (isp->isp_type == ISP_HA_SCSI_10160)
++#define       IS_12160(isp)   (isp->isp_type == ISP_HA_SCSI_12160)
++
++#define       IS_12X0(isp)    (IS_1240(isp) || IS_1280(isp))
++#define       IS_1X160(isp)   (IS_10160(isp) || IS_12160(isp))
++#define       IS_DUALBUS(isp) (IS_12X0(isp) || IS_12160(isp))
++#define       IS_ULTRA2(isp)  (IS_1080(isp) || IS_1280(isp) || IS_1X160(isp))
++#define       IS_ULTRA3(isp)  (IS_1X160(isp))
++
++#define       IS_FC(isp)      ((isp)->isp_type & ISP_HA_FC)
++#define       IS_2100(isp)    ((isp)->isp_type == ISP_HA_FC_2100)
++#define       IS_2200(isp)    ((isp)->isp_type == ISP_HA_FC_2200)
++#define       IS_23XX(isp)    ((isp)->isp_type >= ISP_HA_FC_2300)
++#define       IS_2300(isp)    ((isp)->isp_type == ISP_HA_FC_2300)
++#define       IS_2312(isp)    ((isp)->isp_type == ISP_HA_FC_2312)
++
++/*
++ * DMA cookie macros
++ */
++#ifdef        ISP_DAC_SUPPORTRED
++#define       DMA_WD3(x)      (((x) >> 48) & 0xffff)
++#define       DMA_WD2(x)      (((x) >> 32) & 0xffff)
++#else
++#define       DMA_WD3(x)      0
++#define       DMA_WD2(x)      0
++#endif
++#define       DMA_WD1(x)      (((x) >> 16) & 0xffff)
++#define       DMA_WD0(x)      (((x) & 0xffff))
++
++/*
++ * Core System Function Prototypes
++ */
++
++/*
++ * Reset Hardware. Totally. Assumes that you'll follow this with
++ * a call to isp_init.
++ */
++void isp_reset(struct ispsoftc *);
++
++/*
++ * Initialize Hardware to known state
++ */
++void isp_init(struct ispsoftc *);
++
++/*
++ * Reset the ISP and call completion for any orphaned commands.
++ */
++void isp_reinit(struct ispsoftc *);
++
++#ifdef        ISP_FW_CRASH_DUMP
++/*
++ * Dump firmware entry point.
++ */
++void isp_fw_dump(struct ispsoftc *isp);
++#endif
++
++/*
++ * Internal Interrupt Service Routine
++ *
++ * The outer layers do the spade work to get the appropriate status register,
++ * semaphore register and first mailbox register (if appropriate). This also
++ * means that most spurious/bogus interrupts not for us can be filtered first.
++ */
++void isp_intr(struct ispsoftc *, u_int16_t, u_int16_t, u_int16_t);
++
++
++/*
++ * Command Entry Point- Platform Dependent layers call into this
++ */
++int isp_start(XS_T *);
++/* these values are what isp_start returns */
++#define       CMD_COMPLETE    101     /* command completed */
++#define       CMD_EAGAIN      102     /* busy- maybe retry later */
++#define       CMD_QUEUED      103     /* command has been queued for execution */
++#define       CMD_RQLATER     104     /* requeue this command later */
++
++/*
++ * Command Completion Point- Core layers call out from this with completed cmds
++ */
++void isp_done(XS_T *);
++
++/*
++ * Platform Dependent to External to Internal Control Function
++ *
++ * Assumes locks are held on entry. You should note that with many of
++ * these commands and locks may be released while this is occurring.
++ *
++ * A few notes about some of these functions:
++ *
++ * ISPCTL_FCLINK_TEST tests to make sure we have good fibre channel link.
++ * The argument is a pointer to an integer which is the time, in microseconds,
++ * we should wait to see whether we have good link. This test, if successful,
++ * lets us know our connection topology and our Loop ID/AL_PA and so on.
++ * You can't get anywhere without this.
++ *
++ * ISPCTL_SCAN_FABRIC queries the name server (if we're on a fabric) for
++ * all entities using the FC Generic Services subcommand GET ALL NEXT.
++ * For each found entity, an ISPASYNC_FABRICDEV event is generated (see
++ * below).
++ *
++ * ISPCTL_SCAN_LOOP does a local loop scan. This is only done if the connection
++ * topology is NL or FL port (private or public loop). Since the Qlogic f/w
++ * 'automatically' manages local loop connections, this function essentially
++ * notes the arrival, departure, and possible shuffling around of local loop
++ * entities. Thus for each arrival and departure this generates an isp_async
++ * event of ISPASYNC_PROMENADE (see below).
++ *
++ * ISPCTL_PDB_SYNC is somewhat misnamed. It actually is the final step, in
++ * order, of ISPCTL_FCLINK_TEST, ISPCTL_SCAN_FABRIC, and ISPCTL_SCAN_LOOP.
++ * The main purpose of ISPCTL_PDB_SYNC is to complete management of logging
++ * and logging out of fabric devices (if one is on a fabric) and then marking
++ * the 'loop state' as being ready to now be used for sending commands to
++ * devices. Originally fabric name server and local loop scanning were
++ * part of this function. It's now been separated to allow for finer control.
++ */
++typedef enum {
++      ISPCTL_RESET_BUS,               /* Reset Bus */
++      ISPCTL_RESET_DEV,               /* Reset Device */
++      ISPCTL_ABORT_CMD,               /* Abort Command */
++      ISPCTL_UPDATE_PARAMS,           /* Update Operating Parameters (SCSI) */
++      ISPCTL_FCLINK_TEST,             /* Test FC Link Status */
++      ISPCTL_SCAN_FABRIC,             /* (Re)scan Fabric Name Server */
++      ISPCTL_SCAN_LOOP,               /* (Re)scan Local Loop */
++      ISPCTL_PDB_SYNC,                /* Synchronize Port Database */
++      ISPCTL_SEND_LIP,                /* Send a LIP */
++      ISPCTL_GET_POSMAP,              /* Get FC-AL position map */
++      ISPCTL_RUN_MBOXCMD,             /* run a mailbox command */
++      ISPCTL_TOGGLE_TMODE             /* toggle target mode */
++} ispctl_t;
++int isp_control(struct ispsoftc *, ispctl_t, void *);
++
++
++/*
++ * Platform Dependent to Internal to External Control Function
++ * (each platform must provide such a function)
++ *
++ * Assumes locks are held.
++ *
++ * A few notes about some of these functions:
++ *
++ * ISPASYNC_CHANGE_NOTIFY notifies the outer layer that a change has
++ * occurred that invalidates the list of fabric devices known and/or
++ * the list of known loop devices. The argument passed is a pointer
++ * whose values are defined below  (local loop change, name server
++ * change, other). 'Other' may simply be a LIP, or a change in
++ * connection topology.
++ *
++ * ISPASYNC_FABRIC_DEV announces the next element in a list of
++ * fabric device names we're getting out of the name server. The
++ * argument points to a GET ALL NEXT response structure. The list
++ * is known to terminate with an entry that refers to ourselves.
++ * One of the main purposes of this function is to allow outer
++ * layers, which are OS dependent, to set policy as to which fabric
++ * devices might actually be logged into (and made visible) later
++ * at ISPCTL_PDB_SYNC time. Since there's a finite number of fabric
++ * devices that we can log into (256 less 3 'reserved' for F-port
++ * topologies), and fabrics can grow up to 8 million or so entries
++ * (24 bits of Port Address, less a wad of reserved spaces), clearly
++ * we had better let the OS determine login policy.
++ *
++ * ISPASYNC_PROMENADE has an argument that is a pointer to an integer which
++ * is an index into the portdb in the softc ('target'). Whether that entry's
++ * valid tag is set or not says whether something has arrived or departed.
++ * The name refers to a favorite pastime of many city dwellers- watching
++ * people come and go, talking of Michaelangelo, and so on..
++ *
++ * ISPASYNC_UNHANDLED_RESPONSE gives outer layers a chance to parse a
++ * response queue entry not otherwise handled. The outer layer should
++ * return non-zero if it handled it. The 'arg' points to an unmassaged
++ * response queue entry.
++ */
++
++typedef enum {
++      ISPASYNC_NEW_TGT_PARAMS,        /* New Target Parameters Negotiated */
++      ISPASYNC_BUS_RESET,             /* Bus Was Reset */
++      ISPASYNC_LOOP_DOWN,             /* FC Loop Down */
++      ISPASYNC_LOOP_UP,               /* FC Loop Up */
++      ISPASYNC_LIP,                   /* LIP Received */
++      ISPASYNC_LOOP_RESET,            /* Loop Reset Received */
++      ISPASYNC_CHANGE_NOTIFY,         /* FC Change Notification */
++      ISPASYNC_FABRIC_DEV,            /* FC Fabric Device Arrival */
++      ISPASYNC_PROMENADE,             /* FC Objects coming && going */
++      ISPASYNC_TARGET_MESSAGE,        /* target message */
++      ISPASYNC_TARGET_EVENT,          /* target asynchronous event */
++      ISPASYNC_TARGET_ACTION,         /* other target command action */
++      ISPASYNC_CONF_CHANGE,           /* Platform Configuration Change */
++      ISPASYNC_UNHANDLED_RESPONSE,    /* Unhandled Response Entry */
++      ISPASYNC_FW_CRASH,              /* Firmware has crashed */
++      ISPASYNC_FW_DUMPED,             /* Firmware crashdump taken */
++      ISPASYNC_FW_RESTARTED           /* Firmware has been restarted */
++} ispasync_t;
++int isp_async(struct ispsoftc *, ispasync_t, void *);
++
++#define       ISPASYNC_CHANGE_PDB     ((void *) 0)
++#define       ISPASYNC_CHANGE_SNS     ((void *) 1)
++#define       ISPASYNC_CHANGE_OTHER   ((void *) 2)
++
++/*
++ * Platform Dependent Error and Debug Printout
++ */
++#ifdef        __GNUC__
++void isp_prt(struct ispsoftc *, int level, const char *, ...)
++      __attribute__((__format__(__printf__,3,4)));
++#else
++void isp_prt(struct ispsoftc *, int level, const char *, ...);
++#endif
++
++#define       ISP_LOGALL      0x0     /* log always */
++#define       ISP_LOGCONFIG   0x1     /* log configuration messages */
++#define       ISP_LOGINFO     0x2     /* log informational messages */
++#define       ISP_LOGWARN     0x4     /* log warning messages */
++#define       ISP_LOGERR      0x8     /* log error messages */
++#define       ISP_LOGDEBUG0   0x10    /* log simple debug messages */
++#define       ISP_LOGDEBUG1   0x20    /* log intermediate debug messages */
++#define       ISP_LOGDEBUG2   0x40    /* log most debug messages */
++#define       ISP_LOGDEBUG3   0x80    /* log high frequency debug messages */
++#define       ISP_LOGDEBUG4   0x100   /* log high frequency debug messages */
++#define       ISP_LOGTDEBUG0  0x200   /* log simple debug messages (target mode) */
++#define       ISP_LOGTDEBUG1  0x400   /* log intermediate debug messages (target) */
++#define       ISP_LOGTDEBUG2  0x800   /* log all debug messages (target) */
++
++/*
++ * Each Platform provides it's own isposinfo substructure of the ispsoftc
++ * defined above.
++ *
++ * Each platform must also provide the following macros/defines:
++ *
++ *
++ *    INLINE          -       platform specific define for 'inline' functions
++ *
++ *    ISP_DAC_SUPPORTED -     Is DAC (Dual Address Cycle) is supported?
++ *                            Basically means whether or not DMA for PCI
++ *                            PCI cards (Ultra2 or better or FC) works
++ *                            above 4GB.
++ *
++ *    ISP2100_SCRLEN  -       length for the Fibre Channel scratch DMA area
++ *
++ *    MEMZERO(dst, src)                       platform zeroing function
++ *    MEMCPY(dst, src, count)                 platform copying function
++ *    SNPRINTF(buf, bufsize, fmt, ...)        snprintf
++ *    USEC_DELAY(usecs)                       microsecond spindelay function
++ *    USEC_SLEEP(isp, usecs)                  microsecond sleep function
++ *
++ *    NANOTIME_T                              nanosecond time type
++ *
++ *    GET_NANOTIME(NANOTIME_T *)              get current nanotime.
++ *
++ *    GET_NANOSEC(NANOTIME_T *)               get u_int64_t from NANOTIME_T
++ *
++ *    NANOTIME_SUB(NANOTIME_T *, NANOTIME_T *)
++ *                                            subtract two NANOTIME_T values
++ *
++ *
++ *    MAXISPREQUEST(struct ispsoftc *)        maximum request queue size
++ *                                            for this particular board type
++ *
++ *    MEMORYBARRIER(struct ispsoftc *, barrier_type, offset, size)
++ *
++ *            Function/Macro the provides memory synchronization on
++ *            various objects so that the ISP's and the system's view
++ *            of the same object is consistent.
++ *
++ *    MBOX_ACQUIRE(struct ispsoftc *)         acquire lock on mailbox regs
++ *    MBOX_WAIT_COMPLETE(struct ispsoftc *)   wait for mailbox cmd to be done
++ *    MBOX_NOTIFY_COMPLETE(struct ispsoftc *) notification of mbox cmd donee
++ *    MBOX_RELEASE(struct ispsoftc *)         release lock on mailbox regs
++ *
++ *    FC_SCRATCH_ACQUIRE(struct ispsoftc *)   acquire lock on FC scratch area
++ *    FC_SCRATCH_RELEASE(struct ispsoftc *)   acquire lock on FC scratch area
++ *
++ *    SCSI_GOOD       SCSI 'Good' Status
++ *    SCSI_CHECK      SCSI 'Check Condition' Status
++ *    SCSI_BUSY       SCSI 'Busy' Status
++ *    SCSI_QFULL      SCSI 'Queue Full' Status
++ *
++ *    XS_T            Platform SCSI transaction type (i.e., command for HBA)
++ *    XS_ISP(xs)      gets an instance out of an XS_T
++ *    XS_CHANNEL(xs)  gets the channel (bus # for DUALBUS cards) ""
++ *    XS_TGT(xs)      gets the target ""
++ *    XS_LUN(xs)      gets the lun ""
++ *    XS_CDBP(xs)     gets a pointer to the scsi CDB ""
++ *    XS_CDBLEN(xs)   gets the CDB's length ""
++ *    XS_XFRLEN(xs)   gets the associated data transfer length ""
++ *    XS_TIME(xs)     gets the time (in milliseconds) for this command
++ *    XS_RESID(xs)    gets the current residual count
++ *    XS_STSP(xs)     gets a pointer to the SCSI status byte ""
++ *    XS_SNSP(xs)     gets a pointer to the associate sense data
++ *    XS_SNSLEN(xs)   gets the length of sense data storage
++ *    XS_SNSKEY(xs)   dereferences XS_SNSP to get the current stored Sense Key
++ *    XS_TAG_P(xs)    predicate of whether this command should be tagged
++ *    XS_TAG_TYPE(xs) which type of tag to use
++ *    XS_SETERR(xs)   set error state
++ *
++ *            HBA_NOERROR     command has no erros
++ *            HBA_BOTCH       hba botched something
++ *            HBA_CMDTIMEOUT  command timed out
++ *            HBA_SELTIMEOUT  selection timed out (also port logouts for FC)
++ *            HBA_TGTBSY      target returned a BUSY status
++ *            HBA_BUSRESET    bus reset destroyed command
++ *            HBA_ABORTED     command was aborted (by request)
++ *            HBA_DATAOVR     a data overrun was detected
++ *            HBA_ARQFAIL     Automatic Request Sense failed
++ *
++ *    XS_ERR(xs)      return current error state
++ *    XS_NOERR(xs)    there is no error currently set
++ *    XS_INITERR(xs)  initialize error state
++ *
++ *    XS_SAVE_SENSE(xs, sp)           save sense data
++ *
++ *    XS_SET_STATE_STAT(isp, sp, xs)  platform dependent interpreter of
++ *                                    response queue entry status bits
++ *
++ *
++ *    DEFAULT_IID(struct ispsoftc *)          Default SCSI initiator ID
++ *    DEFAULT_LOOPID(struct ispsoftc *)       Default FC Loop ID
++ *    DEFAULT_NODEWWN(struct ispsoftc *)      Default Node WWN
++ *    DEFAULT_PORTWWN(struct ispsoftc *)      Default Port WWN
++ *    DEFAULT_FRAMESIZE(struct ispsoftc *)    Default Frame Size
++ *    DEFAULT_EXEC_THROTTLE(struct ispsoftc *) Default Execution Throttle
++ *            These establish reasonable defaults for each platform.
++ *            These must be available independent of card NVRAM and are
++ *            to be used should NVRAM not be readable.
++ *
++ *    ISP_NODEWWN(struct ispsoftc *)  FC Node WWN to use
++ *    ISP_PORTWWN(struct ispsoftc *)  FC Port WWN to use
++ *
++ *            These are to be used after NVRAM is read. The tags
++ *            in fcparam.isp_{node,port}wwn reflect the values
++ *            read from NVRAM (possibly corrected for card botches).
++ *            Each platform can take that information and override
++ *            it or ignore and return the Node and Port WWNs to be
++ *            used when sending the Qlogic f/w the Initialization Control
++ *            Block.
++ *
++ *    (XXX these do endian specific transformations- in transition XXX)
++ *
++ *    ISP_IOXPUT_8(struct ispsoftc *, u_int8_t srcval, u_int8_t *dstptr)
++ *    ISP_IOXPUT_16(struct ispsoftc *, u_int16_t srcval, u_int16_t *dstptr)
++ *    ISP_IOXPUT_32(struct ispsoftc *, u_int32_t srcval, u_int32_t *dstptr)
++ *
++ *    ISP_IOXGET_8(struct ispsoftc *, u_int8_t *srcptr, u_int8_t dstrval)
++ *    ISP_IOXGET_16(struct ispsoftc *, u_int16_t *srcptr, u_int16_t dstrval)
++ *    ISP_IOXGET_32(struct ispsoftc *, u_int32_t *srcptr, u_int32_t dstrval)
++ *
++ *    ISP_SWIZZLE_NVRAM_WORD(struct ispsoftc *, u_int16_t *)
++ */
++
++#endif        /* _ISPVAR_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/scsi/isp/Makefile       2003-07-19 17:06:33.000000000 -0700
+@@ -0,0 +1,7 @@
++obj-$(CONFIG_SCSI_FERAL_ISP)  += isp_mod.o
++
++EXTRA_CFLAGS                  += -Idrivers/scsi -g
++EXTRA_LDFLAGS                 += -g
++
++isp_mod-y                     += isp_pci.o isp_linux.o isp.o \
++                              isp_cb_ops.o isp_target.o
+--- linux-2.6.0-test1/drivers/scsi/jazz_esp.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/jazz_esp.c 2003-07-19 17:03:50.000000000 -0700
+@@ -11,7 +11,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+--- linux-2.6.0-test1/drivers/scsi/Kconfig     2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/Kconfig    2003-07-19 17:06:33.000000000 -0700
+@@ -1834,6 +1834,15 @@ config WD33C93_PIO
+ #      bool 'Cyberstorm Mk III SCSI support (EXPERIMENTAL)' CONFIG_CYBERSTORMIII_SCSI
+ #      bool 'GVP Turbo 040/060 SCSI support (EXPERIMENTAL)' CONFIG_GVP_TURBO_SCSI
++
++config SCSI_FERAL_ISP
++      tristate "Feral ISP driver for 10x0/12x0/2x00"
++      depends on SCSI
++      help
++        Feral Driver for the following qlogic ISP chips
++        1020/1040/1080/1280/12160/2100/2200/2300
++        If this doesn't work, there are other drivers for these chips
++        below.
+ endmenu
+ source "drivers/scsi/pcmcia/Kconfig"
+--- linux-2.6.0-test1/drivers/scsi/lasi700.c   2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/lasi700.c  2003-07-19 17:03:50.000000000 -0700
+@@ -128,7 +128,8 @@ lasi700_driver_callback(struct parisc_de
+       }
+       dev_set_drvdata(&dev->dev, host);
+-      scsi_add_host(host, &dev->dev);
++      scsi_add_host(host, &dev->dev); /* XXX handle failure */
++      scsi_scan_host(host);
+       return 0;
+@@ -165,7 +166,6 @@ static void __exit
+ lasi700_exit(void)
+ {
+       unregister_parisc_driver(&lasi700_driver);
+-      scsi_sysfs_release_attributes(&lasi700_template);
+ }
+ module_init(lasi700_init);
+--- linux-2.6.0-test1/drivers/scsi/mac53c94.c  2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/mac53c94.c 2003-07-19 17:03:50.000000000 -0700
+@@ -12,7 +12,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/spinlock.h>
+--- linux-2.6.0-test1/drivers/scsi/mac_esp.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/mac_esp.c  2003-07-19 17:03:50.000000000 -0700
+@@ -19,7 +19,7 @@
+ #include <linux/ctype.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/mac_scsi.c  2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/mac_scsi.c 2003-07-19 17:03:50.000000000 -0700
+@@ -39,7 +39,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/Makefile    2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/Makefile   2003-07-19 17:06:33.000000000 -0700
+@@ -70,6 +70,7 @@ obj-$(CONFIG_SCSI_NCR53C406A)        += NCR53c4
+ obj-$(CONFIG_SCSI_NCR_D700)   += NCR_D700.o 53c700.o
+ obj-$(CONFIG_SCSI_NCR_Q720)   += NCR_Q720_mod.o
+ obj-$(CONFIG_SCSI_SYM53C416)  += sym53c416.o
++obj-$(CONFIG_SCSI_FERAL_ISP)  += isp/
+ obj-$(CONFIG_SCSI_QLOGIC_FAS) += qlogicfas.o
+ obj-$(CONFIG_SCSI_QLOGIC_ISP) += qlogicisp.o 
+ obj-$(CONFIG_SCSI_QLOGIC_FC)  += qlogicfc.o 
+--- linux-2.6.0-test1/drivers/scsi/mca_53c9x.c 2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/scsi/mca_53c9x.c        2003-07-19 17:03:50.000000000 -0700
+@@ -37,7 +37,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/mca-legacy.h>
+--- linux-2.6.0-test1/drivers/scsi/megaraid.c  2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/megaraid.c 2003-07-19 17:03:50.000000000 -0700
+@@ -32,7 +32,7 @@
+ #include <linux/mm.h>
+ #include <linux/fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/uaccess.h>
+ #include <asm/io.h>
+ #include <linux/delay.h>
+--- linux-2.6.0-test1/drivers/scsi/mesh.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/mesh.c     2003-07-19 17:03:50.000000000 -0700
+@@ -21,7 +21,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/mvme147.c   2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/scsi/mvme147.c  2003-07-19 17:03:50.000000000 -0700
+@@ -1,6 +1,6 @@
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/mvme16x.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/mvme16x.c  2003-07-19 17:03:50.000000000 -0700
+@@ -5,7 +5,7 @@
+  */
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+--- linux-2.6.0-test1/drivers/scsi/NCR53c406a.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/NCR53c406a.c       2003-07-19 17:05:05.000000000 -0700
+@@ -51,7 +51,7 @@
+ #include <asm/bitops.h>
+ #include <asm/irq.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ #include "scsi.h"
+ #include "hosts.h"
+@@ -450,6 +450,7 @@ static __inline__ int NCR53c406a_pio_wri
+ static int __init NCR53c406a_detect(Scsi_Host_Template * tpnt)
+ {
++      int present = 0;
+       struct Scsi_Host *shpnt = NULL;
+ #ifndef PORT_BASE
+       int i;
+@@ -522,7 +523,7 @@ static int __init NCR53c406a_detect(Scsi
+       DEB(printk("NCR53c406a: using port_base 0x%x\n", port_base));
+-      tpnt->present = 1;
++      present = 1;
+       tpnt->proc_name = "NCR53c406a";
+       shpnt = scsi_register(tpnt, 0);
+@@ -576,7 +577,7 @@ static int __init NCR53c406a_detect(Scsi
+       sprintf(info_msg, "NCR53c406a at 0x%x, IRQ %d, %s PIO mode.", port_base, irq_level, fast_pio ? "fast" : "slow");
+ #endif
+-      return (tpnt->present);
++      return (present);
+ #if USE_DMA
+       err_free_irq:
+--- linux-2.6.0-test1/drivers/scsi/ncr53c8xx.c 2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/ncr53c8xx.c        2003-07-19 17:03:50.000000000 -0700
+@@ -140,7 +140,7 @@
+ #include <linux/timer.h>
+ #include <linux/stat.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,35)
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/NCR53C9x.c  2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/NCR53C9x.c 2003-07-19 17:03:50.000000000 -0700
+@@ -29,7 +29,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+--- linux-2.6.0-test1/drivers/scsi/NCR_D700.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/NCR_D700.c 2003-07-19 17:03:50.000000000 -0700
+@@ -218,7 +218,8 @@ NCR_D700_probe_one(struct NCR_D700_priva
+               goto irq_failed;
+       }
+-      scsi_add_host(host, p->dev);
++      scsi_add_host(host, p->dev); /* XXX handle failure */
++      scsi_scan_host(host);
+       p->hosts[siop] = host;
+       hostdata->dev = p->dev;
+@@ -387,7 +388,6 @@ static int __init NCR_D700_init(void)
+ static void __exit NCR_D700_exit(void)
+ {
+       mca_unregister_driver(&NCR_D700_driver);
+-      scsi_sysfs_release_attributes(&NCR_D700_driver_template);
+ }
+ module_init(NCR_D700_init);
+--- linux-2.6.0-test1/drivers/scsi/NCR_Q720.c  2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/NCR_Q720.c 2003-07-19 17:03:50.000000000 -0700
+@@ -85,6 +85,7 @@ NCR_Q720_probe_one(struct NCR_Q720_priva
+       __u8 scsr1 = readb(vaddr + NCR_Q720_SCSR_OFFSET + 1);
+       __u8 differential = readb(vaddr + NCR_Q720_SCSR_OFFSET) & 0x20;
+       __u8 version;
++      int error;
+       scsi_id = scsr1 >> 4;
+       /* enable burst length 16 (FIXME: should allow this) */
+@@ -120,9 +121,12 @@ NCR_Q720_probe_one(struct NCR_Q720_priva
+       scsr1 &= ~0x01;
+       writeb(scsr1, vaddr + NCR_Q720_SCSR_OFFSET + 1);
+-      scsi_add_host(p->hosts[siop], p->dev);
+-
+-      return 0;
++      error = scsi_add_host(p->hosts[siop], p->dev);
++      if (error)
++              ncr53c8xx_release(p->hosts[siop]);
++      else
++              scsi_scan_host(p->hosts[siop]);
++      return error;
+  fail:
+       return -ENODEV;
+@@ -347,7 +351,6 @@ static void __exit
+ NCR_Q720_exit(void)
+ {
+       mca_unregister_driver(&NCR_Q720_driver);
+-      //scsi_sysfs_release_attributes(&NCR_Q720_driver_template);
+ }
+ module_init(NCR_Q720_init);
+--- linux-2.6.0-test1/drivers/scsi/nsp32.c     2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/nsp32.c    2003-07-19 17:03:50.000000000 -0700
+@@ -25,7 +25,7 @@
+ #include <linux/timer.h>
+ #include <linux/ioport.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/pci.h>
+ #include <linux/delay.h>
+@@ -1820,7 +1820,8 @@ static int nsp32_detect(struct pci_dev *
+               goto free_irq;
+         }
+-      scsi_add_host(host, &pdev->dev);
++      scsi_add_host(host, &pdev->dev); /* XXX handle failure */
++      scsi_scan_host(host);
+       pci_set_drvdata(pdev, host);
+       return 0;
+--- linux-2.6.0-test1/drivers/scsi/oktagon_esp.c       2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/scsi/oktagon_esp.c      2003-07-19 17:03:50.000000000 -0700
+@@ -20,7 +20,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/reboot.h>
+--- linux-2.6.0-test1/drivers/scsi/osst.c      2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/osst.c     2003-07-19 17:03:50.000000000 -0700
+@@ -46,7 +46,7 @@ const char * osst_version = "0.99.0";
+ #include <linux/spinlock.h>
+ #include <linux/vmalloc.h>
+ #include <linux/version.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/devfs_fs_kernel.h>
+ #include <asm/uaccess.h>
+ #include <asm/dma.h>
+--- linux-2.6.0-test1/drivers/scsi/pas16.c     2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/pas16.c    2003-07-19 17:03:50.000000000 -0700
+@@ -117,7 +117,8 @@
+ #include <linux/proc_fs.h>
+ #include <linux/sched.h>
+ #include <asm/io.h>
+-#include <linux/blk.h>
++#include <asm/dma.h>
++#include <linux/blkdev.h>
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+--- linux-2.6.0-test1/drivers/scsi/pc980155.c  2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/pc980155.c 2003-07-19 17:03:50.000000000 -0700
+@@ -11,7 +11,7 @@
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/ioport.h>
+ #include <linux/interrupt.h>
+ #include <linux/types.h>
+--- linux-2.6.0-test1/drivers/scsi/pci2000.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/pci2000.c  2003-07-19 17:03:50.000000000 -0700
+@@ -35,7 +35,7 @@
+  ****************************************************************************/
+ #define PCI2000_VERSION               "1.20"
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+--- linux-2.6.0-test1/drivers/scsi/pci2220i.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/pci2220i.c 2003-07-19 17:03:50.000000000 -0700
+@@ -50,7 +50,7 @@
+ #include <linux/sched.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/timer.h>
+ #include <linux/spinlock.h>
+--- linux-2.6.0-test1/drivers/scsi/pcmcia/aha152x_stub.c       2003-06-14 12:18:33.000000000 -0700
++++ 25/drivers/scsi/pcmcia/aha152x_stub.c      2003-07-19 17:03:50.000000000 -0700
+@@ -44,7 +44,7 @@
+ #include <linux/ioport.h>
+ #include <scsi/scsi.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <scsi/scsi_ioctl.h>
+ #include "scsi.h"
+@@ -278,7 +278,8 @@ static void aha152x_config_cs(dev_link_t
+       goto cs_failed;
+     }
+-    scsi_add_host(host, NULL);
++    scsi_add_host(host, NULL); /* XXX handle failure */
++    scsi_scan_host(host);
+     sprintf(info->node.dev_name, "scsi%d", host->host_no);
+     link->dev = &info->node;
+--- linux-2.6.0-test1/drivers/scsi/pcmcia/fdomain_stub.c       2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/scsi/pcmcia/fdomain_stub.c      2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #include <linux/ioport.h>
+ #include <scsi/scsi.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <scsi/scsi_ioctl.h>
+ #include "scsi.h"
+@@ -254,7 +254,8 @@ static void fdomain_config(dev_link_t *l
+       goto cs_failed;
+     }
+  
+-    scsi_add_host(host, NULL);
++    scsi_add_host(host, NULL); /* XXX handle failure */
++    scsi_scan_host(host);
+     sprintf(info->node.dev_name, "scsi%d", host->host_no);
+     link->dev = &info->node;
+--- linux-2.6.0-test1/drivers/scsi/pcmcia/nsp_cs.c     2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/pcmcia/nsp_cs.c    2003-07-19 17:03:50.000000000 -0700
+@@ -44,7 +44,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/stat.h>
+ #include <asm/io.h>
+@@ -1773,7 +1773,8 @@ static void nsp_cs_config(dev_link_t *li
+                      req.Base+req.Size-1);
+       printk("\n");
+-      scsi_add_host(host, NULL);
++      scsi_add_host(host, NULL); /* XXX handle failure */
++      scsi_scan_host(host);
+       link->state &= ~DEV_CONFIG_PENDING;
+       return;
+--- linux-2.6.0-test1/drivers/scsi/pcmcia/qlogic_stub.c        2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/scsi/pcmcia/qlogic_stub.c       2003-07-19 17:03:50.000000000 -0700
+@@ -42,7 +42,7 @@
+ #include <asm/io.h>
+ #include <scsi/scsi.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <scsi/scsi_ioctl.h>
+ #include "scsi.h"
+@@ -270,7 +270,8 @@ static void qlogic_config(dev_link_t * l
+       link->dev = &info->node;
+       info->host = host;
+-      scsi_add_host(host, NULL);
++      scsi_add_host(host, NULL); /* XXX handle failure */
++      scsi_scan_host(host);
+ out:
+       link->state &= ~DEV_CONFIG_PENDING;
+--- linux-2.6.0-test1/drivers/scsi/pluto.c     2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/scsi/pluto.c    2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/ppa.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/ppa.c      2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,7 @@
+ /* The following #define is to avoid a clash with hosts.c */
+ #define PPA_CODE 1
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include <linux/parport.h>
+ #include <linux/workqueue.h>
+--- linux-2.6.0-test1/drivers/scsi/ppa.h       2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/scsi/ppa.h      2003-07-19 17:03:50.000000000 -0700
+@@ -82,7 +82,7 @@
+ #include  <linux/delay.h>
+ #include  <linux/proc_fs.h>
+ #include  <linux/stat.h>
+-#include  <linux/blk.h>
++#include  <linux/blkdev.h>
+ #include  <linux/sched.h>
+ #include  <linux/interrupt.h>
+--- linux-2.6.0-test1/drivers/scsi/psi240i.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/psi240i.c  2003-07-19 17:03:50.000000000 -0700
+@@ -26,7 +26,7 @@
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/qla1280.c   2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/scsi/qla1280.c  2003-07-19 17:03:50.000000000 -0700
+@@ -252,7 +252,7 @@
+ #include <linux/timer.h>
+ #include <linux/pci.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/workqueue.h>
+ #include <linux/stat.h>
+ #include <linux/slab.h>
+@@ -327,7 +327,7 @@
+ /* 3.16 */
+ #ifdef QLA_64BIT_PTR
+ #define pci_dma_lo32(a)               (a & 0xffffffff)
+-#define pci_dma_hi32(a)               (a >> 32)
++#define pci_dma_hi32(a)               ((a >> 16)>>16)
+ #else
+ #define pci_dma_lo32(a)               (a & 0xffffffff)
+ #define pci_dma_hi32(a)               0
+--- linux-2.6.0-test1/drivers/scsi/qlogicfas.c 2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/qlogicfas.c        2003-07-19 17:03:50.000000000 -0700
+@@ -127,7 +127,7 @@
+ #endif
+ #include <linux/module.h>
+-#include <linux/blk.h>                /* to get disk capacity */
++#include <linux/blkdev.h>             /* to get disk capacity */
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/init.h>
+@@ -140,6 +140,7 @@
+ #include <asm/io.h>
+ #include <asm/irq.h>
++#include <asm/dma.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/scsi/qlogicfc.c  2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/scsi/qlogicfc.c 2003-07-19 17:03:50.000000000 -0700
+@@ -50,7 +50,7 @@
+  *
+  */
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+ #include <linux/ioport.h>
+--- linux-2.6.0-test1/drivers/scsi/qlogicisp.c 2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/scsi/qlogicisp.c        2003-07-19 17:03:50.000000000 -0700
+@@ -20,7 +20,7 @@
+  * General Public License for more details.
+  */
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/qlogicpti.c 2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/scsi/qlogicpti.c        2003-07-19 17:03:50.000000000 -0700
+@@ -17,7 +17,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/scsicam.c   2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/scsi/scsicam.c  2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,7 @@
+ #include <linux/fs.h>
+ #include <linux/genhd.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/buffer_head.h>
+ #include <asm/unaligned.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/scsi_debug.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/scsi_debug.c       2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #include <linux/vmalloc.h>
+ #include <linux/moduleparam.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsicam.h>
+@@ -687,7 +687,7 @@ static int resp_mode_sense(unsigned char
+       pcontrol = (cmd[2] & 0xc0) >> 6;
+       pcode = cmd[2] & 0x3f;
+       msense_6 = (MODE_SENSE == cmd[0]);
+-      alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[6]);
++      alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
+       /* printk(KERN_INFO "msense: dbd=%d pcontrol=%d pcode=%d "
+               "msense_6=%d alloc_len=%d\n", dbd, pcontrol, pcode, "
+               "msense_6, alloc_len); */
+@@ -1701,7 +1701,8 @@ static int sdebug_driver_probe(struct de
+                 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
+                 error = -ENODEV;
+               scsi_host_put(hpnt);
+-        }
++        } else
++              scsi_scan_host(hpnt);
+         return error;
+--- linux-2.6.0-test1/drivers/scsi/scsi.h      2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi.h     2003-07-19 17:03:50.000000000 -0700
+@@ -174,11 +174,6 @@ extern const char *scsi_extd_sense_forma
+ #define SCSI_MLQUEUE_DEVICE_BUSY 0x1056
+ #define SCSI_MLQUEUE_EH_RETRY    0x1057
+-extern int scsi_sysfs_modify_sdev_attribute(struct device_attribute ***dev_attrs,
+-                                          struct device_attribute *attr);
+-extern int scsi_sysfs_modify_shost_attribute(struct class_device_attribute ***class_attrs,
+-                                           struct class_device_attribute *attr);
+-
+ /*
+  * Legacy dma direction interfaces.
+  *
+--- linux-2.6.0-test1/drivers/scsi/scsi_ioctl.c        2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi_ioctl.c       2003-07-19 17:03:50.000000000 -0700
+@@ -18,7 +18,7 @@
+ #include <linux/mm.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsi_ioctl.h>
+--- linux-2.6.0-test1/drivers/scsi/scsi_lib.c  2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi_lib.c 2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,7 @@
+  */
+ #include <linux/bio.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/completion.h>
+ #include <linux/kernel.h>
+ #include <linux/mempool.h>
+@@ -444,22 +444,8 @@ static void scsi_run_queue(struct reques
+  */
+ static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
+ {
+-      unsigned long flags;
+-
+-      spin_lock_irqsave(q->queue_lock, flags);
+-      cmd->request->special = cmd;
+-      if (blk_rq_tagged(cmd->request))
+-              blk_queue_end_tag(q, cmd->request);
+-
+-      /*
+-       * set REQ_SPECIAL - we have a command
+-       * clear REQ_DONTPREP - we assume the sg table has been 
+-       *      nuked so we need to set it up again.
+-       */
+-      cmd->request->flags |= REQ_SPECIAL;
+       cmd->request->flags &= ~REQ_DONTPREP;
+-      __elv_add_request(q, cmd->request, 0, 0);
+-      spin_unlock_irqrestore(q->queue_lock, flags);
++      blk_insert_request(q, cmd->request, 1, cmd);
+       scsi_run_queue(q);
+ }
+@@ -1213,9 +1199,7 @@ static void scsi_request_fn(struct reque
+        * later time.
+        */
+       spin_lock_irq(q->queue_lock);
+-      if (blk_rq_tagged(req))
+-              blk_queue_end_tag(q, req);
+-      __elv_add_request(q, req, 0, 0);
++      blk_requeue_request(q, req);
+       sdev->device_busy--;
+       if(sdev->device_busy == 0)
+               blk_plug_device(q);
+@@ -1426,17 +1410,17 @@ __scsi_mode_sense(struct scsi_request *s
+       if(scsi_status_is_good(sreq->sr_result)) {
+               data->header_length = header_length;
+               if(use_10_for_ms) {
+-                      data->length = buffer[0]*256 + buffer[1];
++                      data->length = buffer[0]*256 + buffer[1] + 2;
+                       data->medium_type = buffer[2];
+                       data->device_specific = buffer[3];
+                       data->longlba = buffer[4] & 0x01;
+                       data->block_descriptor_length = buffer[6]*256
+                               + buffer[7];
+               } else {
+-                      data->length = buffer[0];
++                      data->length = buffer[0] + 1;
+                       data->medium_type = buffer[1];
+-                      data->device_specific = buffer[3];
+-                      data->block_descriptor_length = buffer[4];
++                      data->device_specific = buffer[2];
++                      data->block_descriptor_length = buffer[3];
+               }
+       }
+--- linux-2.6.0-test1/drivers/scsi/scsi_module.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/scsi_module.c      2003-07-19 17:05:05.000000000 -0700
+@@ -33,13 +33,14 @@ static int __init init_this_scsi_driver(
+       INIT_LIST_HEAD(&sht->legacy_hosts);
+       sht->detect(sht);
+-      if (!sht->present)
++      if (list_empty(&sht->legacy_hosts))
+               return -ENODEV;
+       list_for_each_entry(shost, &sht->legacy_hosts, sht_legacy_list) {
+               error = scsi_add_host(shost, NULL);
+               if (error)
+                       goto fail;
++              scsi_scan_host(shost);
+       }
+       return 0;
+  fail:
+--- linux-2.6.0-test1/drivers/scsi/scsi_pc98.c 2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/scsi/scsi_pc98.c        2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,7 @@
+ #include <linux/fs.h>
+ #include <linux/kernel.h>
+ #include <linux/genhd.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/pc9800.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/scsi_priv.h 2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/scsi_priv.h        2003-07-19 17:05:05.000000000 -0700
+@@ -90,11 +90,15 @@ extern void scsi_exit_queue(void);
+ /* scsi_proc.c */
+ #ifdef CONFIG_PROC_FS
++extern void scsi_proc_hostdir_add(struct scsi_host_template *);
++extern void scsi_proc_hostdir_rm(struct scsi_host_template *);
+ extern void scsi_proc_host_add(struct Scsi_Host *);
+ extern void scsi_proc_host_rm(struct Scsi_Host *);
+ extern int scsi_init_procfs(void);
+ extern void scsi_exit_procfs(void);
+ #else
++# define scsi_proc_hostdir_add(sht)   do { } while (0)
++# define scsi_proc_hostdir_rm(sht)    do { } while (0)
+ # define scsi_proc_host_add(shost)    do { } while (0)
+ # define scsi_proc_host_rm(shost)     do { } while (0)
+ # define scsi_init_procfs()           (0)
+@@ -102,7 +106,6 @@ extern void scsi_exit_procfs(void);
+ #endif /* CONFIG_PROC_FS */
+ /* scsi_scan.c */
+-extern void scsi_scan_host(struct Scsi_Host *);
+ extern void scsi_forget_host(struct Scsi_Host *);
+ extern void scsi_free_sdev(struct scsi_device *);
+ extern void scsi_free_shost(struct Scsi_Host *);
+@@ -117,11 +120,6 @@ extern void scsi_sysfs_remove_host(struc
+ extern int scsi_sysfs_register(void);
+ extern void scsi_sysfs_unregister(void);
+-/* definitions for the linker default sections covering the host
+- * class and device attributes */
+-extern struct class_device_attribute *scsi_sysfs_shost_attrs[];
+-extern struct device_attribute *scsi_sysfs_sdev_attrs[];
+-
+ extern struct class shost_class;
+ extern struct bus_type scsi_bus_type;
+--- linux-2.6.0-test1/drivers/scsi/scsi_proc.c 2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/scsi_proc.c        2003-07-19 17:05:05.000000000 -0700
+@@ -23,7 +23,7 @@
+ #include <linux/slab.h>
+ #include <linux/proc_fs.h>
+ #include <linux/errno.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/seq_file.h>
+ #include <asm/uaccess.h>
+@@ -41,6 +41,8 @@
+ struct proc_dir_entry *proc_scsi;
+ EXPORT_SYMBOL(proc_scsi);
++/* Protect sht->present and sht->proc_dir */
++static DECLARE_MUTEX(global_host_template_sem);
+ static int proc_scsi_read(char *buffer, char **start, off_t offset,
+                         int length, int *eof, void *data)
+@@ -77,16 +79,10 @@ out:
+       return ret;
+ }
+-void scsi_proc_host_add(struct Scsi_Host *shost)
++void scsi_proc_hostdir_add(struct scsi_host_template *sht)
+ {
+-      struct scsi_host_template *sht = shost->hostt;
+-      struct proc_dir_entry *p;
+-      char name[10];
+-
+-      if (!sht->proc_info)
+-              return;
+-
+-      if (!sht->proc_dir) {
++      down(&global_host_template_sem);
++      if (!sht->present++) {
+               sht->proc_dir = proc_mkdir(sht->proc_name, proc_scsi);
+               if (!sht->proc_dir) {
+                       printk(KERN_ERR "%s: proc_mkdir failed for %s\n",
+@@ -95,6 +91,27 @@ void scsi_proc_host_add(struct Scsi_Host
+               }
+               sht->proc_dir->owner = sht->module;
+       }
++      up(&global_host_template_sem);
++}
++
++void scsi_proc_hostdir_rm(struct scsi_host_template *sht)
++{
++      down(&global_host_template_sem);
++      if (!--sht->present && sht->proc_dir) {
++              remove_proc_entry(sht->proc_name, proc_scsi);
++              sht->proc_dir = NULL;
++      }
++      up(&global_host_template_sem);
++}
++
++void scsi_proc_host_add(struct Scsi_Host *shost)
++{
++      struct scsi_host_template *sht = shost->hostt;
++      struct proc_dir_entry *p;
++      char name[10];
++
++      if (!sht->proc_dir)
++              return;
+       sprintf(name,"%d", shost->host_no);
+       p = create_proc_read_entry(name, S_IFREG | S_IRUGO | S_IWUSR,
+@@ -107,20 +124,18 @@ void scsi_proc_host_add(struct Scsi_Host
+       } 
+       p->write_proc = proc_scsi_write_proc;
+-      p->owner = shost->hostt->module;
++      p->owner = sht->module;
+ }
+ void scsi_proc_host_rm(struct Scsi_Host *shost)
+ {
+-      struct scsi_host_template *sht = shost->hostt;
+       char name[10];
+-      if (sht->proc_info) {
+-              sprintf(name,"%d", shost->host_no);
+-              remove_proc_entry(name, sht->proc_dir);
+-              if (!sht->present)
+-                      remove_proc_entry(sht->proc_name, proc_scsi);
+-      }
++      if (!shost->hostt->proc_dir)
++              return;
++
++      sprintf(name,"%d", shost->host_no);
++      remove_proc_entry(name, shost->hostt->proc_dir);
+ }
+ static int proc_print_scsidevice(struct device *dev, void *data)
+--- linux-2.6.0-test1/drivers/scsi/scsi_scan.c 2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/scsi/scsi_scan.c        2003-07-19 17:03:50.000000000 -0700
+@@ -29,7 +29,7 @@
+ #include <linux/module.h>
+ #include <linux/moduleparam.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+@@ -464,8 +464,7 @@ static void scsi_set_name(struct scsi_de
+       while (i >= 0 && type[i] == ' ')
+               type[i--] = '\0';
+-      snprintf(sdev->sdev_driverfs_dev.name, DEVICE_NAME_SIZE, "SCSI %s",
+-               type);
++      snprintf(sdev->sdev_gendev.name, DEVICE_NAME_SIZE, "SCSI %s", type);
+ }
+ /**
+--- linux-2.6.0-test1/drivers/scsi/scsi_syms.c 2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi_syms.c        2003-07-19 17:03:50.000000000 -0700
+@@ -11,7 +11,7 @@
+ #include <linux/slab.h>
+ #include <linux/ioport.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/fs.h>
+ #include <asm/system.h>
+@@ -34,6 +34,7 @@ EXPORT_SYMBOL(scsi_register_driver);
+ EXPORT_SYMBOL(scsi_register_interface);
+ EXPORT_SYMBOL(scsi_host_alloc);
+ EXPORT_SYMBOL(scsi_add_host);
++EXPORT_SYMBOL(scsi_scan_host);
+ EXPORT_SYMBOL(scsi_remove_host);
+ EXPORT_SYMBOL(scsi_host_get);
+ EXPORT_SYMBOL(scsi_host_put);
+--- linux-2.6.0-test1/drivers/scsi/scsi_sysfs.c        2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/scsi_sysfs.c       2003-07-19 17:03:50.000000000 -0700
+@@ -45,7 +45,7 @@ shost_rd_attr(cmd_per_lun, "%hd\n");
+ shost_rd_attr(sg_tablesize, "%hu\n");
+ shost_rd_attr(unchecked_isa_dma, "%d\n");
+-struct class_device_attribute *scsi_sysfs_shost_attrs[] = {
++static struct class_device_attribute *scsi_sysfs_shost_attrs[] = {
+       &class_device_attr_unique_id,
+       &class_device_attr_host_busy,
+       &class_device_attr_cmd_per_lun,
+@@ -204,7 +204,7 @@ store_rescan_field (struct device *dev, 
+ static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field)
+ /* Default template for device attributes.  May NOT be modified */
+-struct device_attribute *scsi_sysfs_sdev_attrs[] = {
++static struct device_attribute *scsi_sysfs_sdev_attrs[] = {
+       &dev_attr_device_blocked,
+       &dev_attr_queue_depth,
+       &dev_attr_type,
+@@ -228,6 +228,42 @@ static void scsi_device_release(struct d
+       scsi_free_sdev(sdev);
+ }
++static struct device_attribute *attr_overridden(
++              struct device_attribute **attrs,
++              struct device_attribute *attr)
++{
++      int i;
++
++      if (!attrs)
++              return NULL;
++      for (i = 0; attrs[i]; i++)
++              if (!strcmp(attrs[i]->attr.name, attr->attr.name))
++                      return attrs[i];
++      return NULL;
++}
++
++static int attr_add(struct device *dev, struct device_attribute *attr)
++{
++      struct device_attribute *base_attr;
++
++      /*
++       * Spare the caller from having to copy things it's not interested in.
++       */
++      base_attr = attr_overridden(scsi_sysfs_sdev_attrs, attr);
++      if (base_attr) {
++              /* extend permissions */
++              attr->attr.mode |= base_attr->attr.mode;
++
++              /* override null show/store with default */
++              if (!attr->show)
++                      attr->show = base_attr->show;
++              if (!attr->store)
++                      attr->store = base_attr->store;
++      }
++
++      return device_create_file(dev, attr);
++}
++
+ /**
+  * scsi_device_register - register a scsi device with the scsi bus
+  * @sdev:     scsi_device to register
+@@ -239,20 +275,20 @@ int scsi_device_register(struct scsi_dev
+ {
+       int error = 0, i;
+-      device_initialize(&sdev->sdev_driverfs_dev);
+-      sprintf(sdev->sdev_driverfs_dev.bus_id,"%d:%d:%d:%d",
++      device_initialize(&sdev->sdev_gendev);
++      sprintf(sdev->sdev_gendev.bus_id,"%d:%d:%d:%d",
+               sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
+-      sdev->sdev_driverfs_dev.parent = &sdev->host->host_gendev;
+-      sdev->sdev_driverfs_dev.bus = &scsi_bus_type;
+-      sdev->sdev_driverfs_dev.release = scsi_device_release;
++      sdev->sdev_gendev.parent = &sdev->host->shost_gendev;
++      sdev->sdev_gendev.bus = &scsi_bus_type;
++      sdev->sdev_gendev.release = scsi_device_release;
+       class_device_initialize(&sdev->sdev_classdev);
+-      sdev->sdev_classdev.dev = &sdev->sdev_driverfs_dev;
++      sdev->sdev_classdev.dev = &sdev->sdev_gendev;
+       sdev->sdev_classdev.class = &sdev_class;
+       snprintf(sdev->sdev_classdev.class_id, BUS_ID_SIZE, "%d:%d:%d:%d",
+               sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
+-      error = device_add(&sdev->sdev_driverfs_dev);
++      error = device_add(&sdev->sdev_gendev);
+       if (error) {
+               printk(KERN_INFO "error 1\n");
+               return error;
+@@ -260,16 +296,28 @@ int scsi_device_register(struct scsi_dev
+       error = class_device_add(&sdev->sdev_classdev);
+       if (error) {
+               printk(KERN_INFO "error 2\n");
+-              device_unregister(&sdev->sdev_driverfs_dev);
++              device_unregister(&sdev->sdev_gendev);
+               return error;
+       }
+-      for (i = 0; !error && sdev->host->hostt->sdev_attrs[i] != NULL; i++)
+-              error = device_create_file(&sdev->sdev_driverfs_dev,
+-                                         sdev->host->hostt->sdev_attrs[i]);
+-
+-      if (error)
+-              scsi_device_unregister(sdev);
++      if (sdev->host->hostt->sdev_attrs) {
++              for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) {
++                      error = attr_add(&sdev->sdev_gendev,
++                                      sdev->host->hostt->sdev_attrs[i]);
++                      if (error)
++                              scsi_device_unregister(sdev);
++              }
++      }
++      
++      for (i = 0; scsi_sysfs_sdev_attrs[i]; i++) {
++              if (!attr_overridden(sdev->host->hostt->sdev_attrs,
++                                      scsi_sysfs_sdev_attrs[i])) {
++                      error = device_create_file(&sdev->sdev_gendev,
++                                      scsi_sysfs_sdev_attrs[i]);
++                      if (error)
++                              scsi_device_unregister(sdev);
++              }
++      }
+       return error;
+ }
+@@ -280,12 +328,8 @@ int scsi_device_register(struct scsi_dev
+  **/
+ void scsi_device_unregister(struct scsi_device *sdev)
+ {
+-      int i;
+-
+-      for (i = 0; sdev->host->hostt->sdev_attrs[i] != NULL; i++)
+-              device_remove_file(&sdev->sdev_driverfs_dev, sdev->host->hostt->sdev_attrs[i]);
+       class_device_unregister(&sdev->sdev_classdev);
+-      device_unregister(&sdev->sdev_driverfs_dev);
++      device_unregister(&sdev->sdev_gendev);
+ }
+ int scsi_register_driver(struct device_driver *drv)
+@@ -315,20 +359,57 @@ static void scsi_host_release(struct dev
+ void scsi_sysfs_init_host(struct Scsi_Host *shost)
+ {
+-      device_initialize(&shost->host_gendev);
+-      snprintf(shost->host_gendev.bus_id, BUS_ID_SIZE, "host%d",
++      device_initialize(&shost->shost_gendev);
++      snprintf(shost->shost_gendev.bus_id, BUS_ID_SIZE, "host%d",
+               shost->host_no);
+-      snprintf(shost->host_gendev.name, DEVICE_NAME_SIZE, "%s",
++      snprintf(shost->shost_gendev.name, DEVICE_NAME_SIZE, "%s",
+               shost->hostt->proc_name);
+-      shost->host_gendev.release = scsi_host_release;
++      shost->shost_gendev.release = scsi_host_release;
+-      class_device_initialize(&shost->class_dev);
+-      shost->class_dev.dev = &shost->host_gendev;
+-      shost->class_dev.class = &shost_class;
+-      snprintf(shost->class_dev.class_id, BUS_ID_SIZE, "host%d",
++      class_device_initialize(&shost->shost_classdev);
++      shost->shost_classdev.dev = &shost->shost_gendev;
++      shost->shost_classdev.class = &shost_class;
++      snprintf(shost->shost_classdev.class_id, BUS_ID_SIZE, "host%d",
+                 shost->host_no);
+ }
++static struct class_device_attribute *class_attr_overridden(
++              struct class_device_attribute **attrs,
++              struct class_device_attribute *attr)
++{
++      int i;
++
++      if (!attrs)
++              return NULL;
++      for (i = 0; attrs[i]; i++)
++              if (!strcmp(attrs[i]->attr.name, attr->attr.name))
++                      return attrs[i];
++      return NULL;
++}
++
++static int class_attr_add(struct class_device *classdev,
++              struct class_device_attribute *attr)
++{
++      struct class_device_attribute *base_attr;
++
++      /*
++       * Spare the caller from having to copy things it's not interested in.
++       */
++      base_attr = class_attr_overridden(scsi_sysfs_shost_attrs, attr);
++      if (base_attr) {
++              /* extend permissions */
++              attr->attr.mode |= base_attr->attr.mode;
++
++              /* override null show/store with default */
++              if (!attr->show)
++                      attr->show = base_attr->show;
++              if (!attr->store)
++                      attr->store = base_attr->store;
++      }
++
++      return class_device_create_file(classdev, attr);
++}
++
+ /**
+  * scsi_sysfs_add_host - add scsi host to subsystem
+  * @shost:     scsi host struct to add to subsystem
+@@ -336,31 +417,44 @@ void scsi_sysfs_init_host(struct Scsi_Ho
+  **/
+ int scsi_sysfs_add_host(struct Scsi_Host *shost, struct device *dev)
+ {
+-      int i, error;
++      int error, i;
+-      if (!shost->host_gendev.parent)
+-              shost->host_gendev.parent = dev ? dev : &legacy_bus;
++      if (!shost->shost_gendev.parent)
++              shost->shost_gendev.parent = dev ? dev : &legacy_bus;
+-      error = device_add(&shost->host_gendev);
++      error = device_add(&shost->shost_gendev);
+       if (error)
+               return error;
+-      error = class_device_add(&shost->class_dev);
++      error = class_device_add(&shost->shost_classdev);
+       if (error)
+               goto clean_device;
+-      for (i = 0; !error && shost->hostt->shost_attrs[i] != NULL; i++)
+-              error = class_device_create_file(&shost->class_dev,
+-                                         shost->hostt->shost_attrs[i]);
+-      if (error)
+-              goto clean_class;
++      if (shost->hostt->shost_attrs) {
++              for (i = 0; shost->hostt->shost_attrs[i]; i++) {
++                      error = class_attr_add(&shost->shost_classdev,
++                                      shost->hostt->shost_attrs[i]);
++                      if (error)
++                              goto clean_class;
++              }
++      }
++
++      for (i = 0; scsi_sysfs_shost_attrs[i]; i++) {
++              if (!class_attr_overridden(shost->hostt->shost_attrs,
++                                      scsi_sysfs_shost_attrs[i])) {
++                      error = class_device_create_file(&shost->shost_classdev,
++                                      scsi_sysfs_shost_attrs[i]);
++                      if (error)
++                              goto clean_class;
++              }
++      }
+       return error;
+ clean_class:
+-      class_device_del(&shost->class_dev);
++      class_device_del(&shost->shost_classdev);
+ clean_device:
+-      device_del(&shost->host_gendev);
++      device_del(&shost->shost_gendev);
+       return error;
+ }
+@@ -371,133 +465,6 @@ clean_device:
+  **/
+ void scsi_sysfs_remove_host(struct Scsi_Host *shost)
+ {
+-      class_device_del(&shost->class_dev);
+-      device_del(&shost->host_gendev);
+-}
+-
+-/** scsi_sysfs_modify_shost_attribute - modify or add a host class attribute
+- *
+- * @class_attrs:host class attribute list to be added to or modified
+- * @attr:     individual attribute to change or added
+- *
+- * returns zero if successful or error if not
+- **/
+-int scsi_sysfs_modify_shost_attribute(
+-                      struct class_device_attribute ***class_attrs,
+-                      struct class_device_attribute *attr)
+-{
+-      int modify = -1;
+-      int num_attrs;
+-
+-      if(*class_attrs == NULL)
+-              *class_attrs = scsi_sysfs_shost_attrs;
+-
+-      for(num_attrs=0; (*class_attrs)[num_attrs] != NULL; num_attrs++)
+-              if(strcmp((*class_attrs)[num_attrs]->attr.name,
+-                              attr->attr.name) == 0)
+-                      modify = num_attrs;
+-
+-      if(*class_attrs == scsi_sysfs_shost_attrs || modify < 0) {
+-              /* note: need space for null at the end as well */
+-              struct class_device_attribute **tmp_attrs =
+-                              kmalloc(sizeof(*tmp_attrs) *
+-                                        (num_attrs + (modify >= 0 ? 1 : 2)),
+-                                      GFP_KERNEL);
+-              if(tmp_attrs == NULL)
+-                      return -ENOMEM;
+-              memcpy(tmp_attrs, *class_attrs, sizeof(*tmp_attrs) *
+-                              (num_attrs + 1));
+-              if(*class_attrs != scsi_sysfs_shost_attrs)
+-                      kfree(*class_attrs);
+-              *class_attrs = tmp_attrs;
+-      }
+-      if(modify >= 0) {
+-              /* spare the caller from having to copy things it's
+-               * not interested in */
+-              struct class_device_attribute *old_attr =
+-                      (*class_attrs)[modify];
+-              /* extend permissions */
+-              attr->attr.mode |= old_attr->attr.mode;
+-
+-              /* override null show/store with default */
+-              if(attr->show == NULL)
+-                      attr->show = old_attr->show;
+-              if(attr->store == NULL)
+-                      attr->store = old_attr->store;
+-              (*class_attrs)[modify] = attr;
+-      } else {
+-              (*class_attrs)[num_attrs++] = attr;
+-              (*class_attrs)[num_attrs] = NULL;
+-      }
+-
+-      return 0;
+-}
+-EXPORT_SYMBOL(scsi_sysfs_modify_shost_attribute);
+-
+-/** scsi_sysfs_modify_sdev_attribute - modify or add a host device attribute
+- *
+- * @dev_attrs:        pointer to the attribute list to be added to or modified
+- * @attr:     individual attribute to change or added
+- *
+- * returns zero if successful or error if not
+- **/
+-int scsi_sysfs_modify_sdev_attribute(struct device_attribute ***dev_attrs,
+-                                   struct device_attribute *attr)
+-{
+-      int modify = -1;
+-      int num_attrs;
+-
+-      if(*dev_attrs == NULL)
+-              *dev_attrs = scsi_sysfs_sdev_attrs;
+-
+-      for(num_attrs=0; (*dev_attrs)[num_attrs] != NULL; num_attrs++)
+-              if(strcmp((*dev_attrs)[num_attrs]->attr.name,
+-                              attr->attr.name) == 0)
+-                      modify = num_attrs;
+-
+-      if(*dev_attrs == scsi_sysfs_sdev_attrs || modify < 0) {
+-              /* note: need space for null at the end as well */
+-              struct device_attribute **tmp_attrs =
+-                              kmalloc(sizeof(*tmp_attrs) *
+-                                        (num_attrs + (modify >= 0 ? 1 : 2)),
+-                                      GFP_KERNEL);
+-              if(tmp_attrs == NULL)
+-                      return -ENOMEM;
+-              memcpy(tmp_attrs, *dev_attrs, sizeof(*tmp_attrs) *
+-                              (num_attrs + 1));
+-              if(*dev_attrs != scsi_sysfs_sdev_attrs)
+-                      kfree(*dev_attrs);
+-              *dev_attrs = tmp_attrs;
+-      }
+-      if(modify >= 0) {
+-              /* spare the caller from having to copy things it's
+-               * not interested in */
+-              struct device_attribute *old_attr =
+-                      (*dev_attrs)[modify];
+-              /* extend permissions */
+-              attr->attr.mode |= old_attr->attr.mode;
+-
+-              /* override null show/store with default */
+-              if(attr->show == NULL)
+-                      attr->show = old_attr->show;
+-              if(attr->store == NULL)
+-                      attr->store = old_attr->store;
+-              (*dev_attrs)[modify] = attr;
+-      } else {
+-              (*dev_attrs)[num_attrs++] = attr;
+-              (*dev_attrs)[num_attrs] = NULL;
+-      }
+-
+-      return 0;
+-}
+-EXPORT_SYMBOL(scsi_sysfs_modify_sdev_attribute);
+-
+-void scsi_sysfs_release_attributes(struct scsi_host_template *hostt)
+-{
+-      if(hostt->sdev_attrs != scsi_sysfs_sdev_attrs)
+-              kfree(hostt->sdev_attrs);
+-
+-      if(hostt->shost_attrs != scsi_sysfs_shost_attrs)
+-              kfree(hostt->shost_attrs);
++      class_device_del(&shost->shost_classdev);
++      device_del(&shost->shost_gendev);
+ }
+-EXPORT_SYMBOL(scsi_sysfs_release_attributes);
+--- linux-2.6.0-test1/drivers/scsi/sd.c        2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sd.c       2003-07-19 17:03:50.000000000 -0700
+@@ -43,7 +43,7 @@
+ #include <linux/init.h>
+ #include <linux/reboot.h>
+ #include <linux/vmalloc.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <asm/uaccess.h>
+@@ -606,35 +606,8 @@ not_present:
+ static void sd_rescan(struct device *dev)
+ {
+-      struct scsi_device *sdp = to_scsi_device(dev);
+       struct scsi_disk *sdkp = dev_get_drvdata(dev);
+-      struct gendisk *gd;
+-      struct scsi_request *SRpnt;
+-      unsigned char *buffer;
+-
+-      if (!sdkp || sdp->online == FALSE || !sdkp->media_present)
+-              return;
+-              
+-      gd = sdkp->disk;
+-      
+-      SCSI_LOG_HLQUEUE(3, printk("sd_rescan: disk=%s\n", gd->disk_name));
+-      
+-      SRpnt = scsi_allocate_request(sdp);
+-      if (!SRpnt) {
+-              printk(KERN_WARNING "(sd_rescan:) Request allocation "
+-                     "failure.\n");
+-              return;
+-      }
+-
+-      if (sdkp->device->host->unchecked_isa_dma)
+-              buffer = kmalloc(512, GFP_DMA);
+-      else
+-              buffer = kmalloc(512, GFP_KERNEL);
+-
+-      sd_read_capacity(sdkp, gd->disk_name, SRpnt, buffer);
+-      set_capacity(gd, sdkp->capacity);       
+-      scsi_release_request(SRpnt);
+-      kfree(buffer);
++      sd_revalidate_disk(sdkp->disk);
+ }
+ static struct block_device_operations sd_fops = {
+@@ -1318,7 +1291,7 @@ static int sd_probe(struct device *dev)
+       sd_revalidate_disk(gd);
+-      gd->driverfs_dev = &sdp->sdev_driverfs_dev;
++      gd->driverfs_dev = &sdp->sdev_gendev;
+       gd->flags = GENHD_FL_DRIVERFS;
+       if (sdp->removable)
+               gd->flags |= GENHD_FL_REMOVABLE;
+--- linux-2.6.0-test1/drivers/scsi/seagate.c   2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/seagate.c  2003-07-19 17:03:50.000000000 -0700
+@@ -95,7 +95,7 @@
+ #include <linux/proc_fs.h>
+ #include <linux/init.h>
+ #include <linux/delay.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/stat.h>
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/sg.c        2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sg.c       2003-07-19 17:06:39.000000000 -0700
+@@ -61,7 +61,7 @@ static int sg_version_num = 30529;   /* 2 
+ #include <asm/uaccess.h>
+ #include <asm/system.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsi_driver.h>
+@@ -83,7 +83,7 @@ static void sg_proc_cleanup(void);
+ #define SG_ALLOW_DIO_DEF 0
+ #define SG_ALLOW_DIO_CODE /* compile out by commenting this define */
+-#define SG_MAX_DEVS_MASK ((1U << KDEV_MINOR_BITS) - 1)
++#define SG_MAX_DEVS_MASK 255
+ /*
+  * Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
+--- linux-2.6.0-test1/drivers/scsi/sgiwd93.c   2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/scsi/sgiwd93.c  2003-07-19 17:03:50.000000000 -0700
+@@ -15,7 +15,7 @@
+ #include <linux/init.h>
+ #include <linux/types.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/version.h>
+ #include <linux/delay.h>
+ #include <linux/spinlock.h>
+--- linux-2.6.0-test1/drivers/scsi/sim710.c    2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/sim710.c   2003-07-19 17:03:50.000000000 -0700
+@@ -29,7 +29,7 @@
+ #include <linux/config.h>
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/device.h>
+ #include <linux/init.h>
+ #include <linux/mca.h>
+@@ -138,7 +138,8 @@ sim710_probe_common(struct device *dev, 
+               goto out_unregister;
+       }
+-      scsi_add_host(host, dev);
++      scsi_add_host(host, dev); /* XXX handle failure */
++      scsi_scan_host(host);
+       hostdata->dev = dev;
+       return 0;
+--- linux-2.6.0-test1/drivers/scsi/sr.c        2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sr.c       2003-07-19 17:06:39.000000000 -0700
+@@ -43,7 +43,7 @@
+ #include <linux/cdrom.h>
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/uaccess.h>
+ #include "scsi.h"
+@@ -59,7 +59,7 @@
+ MODULE_PARM(xa_test, "i");    /* see sr_ioctl.c */
+-#define SR_DISKS      (1 << KDEV_MINOR_BITS)
++#define SR_DISKS      256
+ #define MAX_RETRIES   3
+ #define SR_TIMEOUT    (30 * HZ)
+@@ -533,7 +533,7 @@ static int sr_probe(struct device *dev)
+       snprintf(disk->devfs_name, sizeof(disk->devfs_name),
+                       "%s/cd", sdev->devfs_name);
+-      disk->driverfs_dev = &sdev->sdev_driverfs_dev;
++      disk->driverfs_dev = &sdev->sdev_gendev;
+       register_cdrom(&cd->cdi);
+       set_capacity(disk, cd->capacity);
+       disk->private_data = &cd->driver;
+--- linux-2.6.0-test1/drivers/scsi/sr_ioctl.c  2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/scsi/sr_ioctl.c 2003-07-19 17:03:50.000000000 -0700
+@@ -4,7 +4,7 @@
+ #include <linux/fs.h>
+ #include <linux/errno.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/blkpg.h>
+ #include <linux/cdrom.h>
+ #include <asm/io.h>
+--- linux-2.6.0-test1/drivers/scsi/sr_vendor.c 2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/scsi/sr_vendor.c        2003-07-19 17:03:50.000000000 -0700
+@@ -39,7 +39,7 @@
+ #include <linux/string.h>
+ #include <linux/bcd.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+ #include <scsi/scsi_ioctl.h>
+--- linux-2.6.0-test1/drivers/scsi/st.c        2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/st.c       2003-07-19 17:03:50.000000000 -0700
+@@ -32,7 +32,7 @@ static char *verstr = "20030622";
+ #include <linux/ioctl.h>
+ #include <linux/fcntl.h>
+ #include <linux/spinlock.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/moduleparam.h>
+ #include <linux/devfs_fs_kernel.h>
+ #include <asm/uaccess.h>
+--- linux-2.6.0-test1/drivers/scsi/sun3_scsi.c 2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/scsi/sun3_scsi.c        2003-07-19 17:03:50.000000000 -0700
+@@ -61,7 +61,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/scsi/sun3_scsi_vme.c     2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/scsi/sun3_scsi_vme.c    2003-07-19 17:03:50.000000000 -0700
+@@ -23,7 +23,7 @@
+ #include <linux/sched.h>
+ #include <linux/ioport.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/io.h>
+ #include <asm/system.h>
+--- linux-2.6.0-test1/drivers/scsi/sun3x_esp.c 2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/sun3x_esp.c        2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/types.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/proc_fs.h>
+ #include <linux/stat.h>
+ #include <linux/delay.h>
+--- linux-2.6.0-test1/drivers/scsi/sym53c416.c 2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/sym53c416.c        2003-07-19 17:03:50.000000000 -0700
+@@ -40,7 +40,7 @@
+ #include <asm/dma.h>
+ #include <asm/system.h>
+ #include <asm/io.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/version.h>
+ #include <linux/isapnp.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/sym53c8xx_2/sym_glue.c      2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sym53c8xx_2/sym_glue.c     2003-07-19 17:03:50.000000000 -0700
+@@ -1110,6 +1110,7 @@ static int sym_eh_handler(int op, char *
+       int sts = -1;
+       struct sym_eh_wait eh, *ep = &eh;
+       char devname[20];
++      unsigned long flags;
+       sprintf(devname, "%s:%d:%d", sym_name(np), cmd->device->id, cmd->device->lun);
+@@ -1201,7 +1202,11 @@ finish:
+               ep->timer.data = (u_long)cmd;
+               ep->timed_out = 1;      /* Be pessimistic for once :) */
+               add_timer(&ep->timer);
++              local_save_flags(flags);
++              spin_unlock_irq(cmd->device->host->host_lock);
+               down(&ep->sem);
++              local_irq_restore(flags);
++              spin_lock(cmd->device->host->host_lock);
+               if (ep->timed_out)
+                       sts = -2;
+       }
+--- linux-2.6.0-test1/drivers/scsi/sym53c8xx_2/sym_glue.h      2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/scsi/sym53c8xx_2/sym_glue.h     2003-07-19 17:03:50.000000000 -0700
+@@ -84,7 +84,7 @@
+ #include <linux/stat.h>
+ #include <linux/interrupt.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #ifdef __sparc__
+ #  include <asm/irq.h>
+--- linux-2.6.0-test1/drivers/scsi/sym53c8xx_2/sym_hipd.c      2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/sym53c8xx_2/sym_hipd.c     2003-07-19 17:04:52.000000000 -0700
+@@ -800,7 +800,8 @@ static int sym_prepare_setting(hcb_p np,
+        * Btw, 'period' is in tenths of nanoseconds.
+        */
+       period = (4 * div_10M[0] + np->clock_khz - 1) / np->clock_khz;
+-      if      (period <= 250)         np->minsync = 10;
++      if      (period == 250)         np->minsync = 9;
++      else if (period <= 250)         np->minsync = 10;
+       else if (period <= 303)         np->minsync = 11;
+       else if (period <= 500)         np->minsync = 12;
+       else                            np->minsync = (period + 40 - 1) / 40;
+--- linux-2.6.0-test1/drivers/scsi/sym53c8xx.c 2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/scsi/sym53c8xx.c        2003-07-19 17:03:50.000000000 -0700
+@@ -123,7 +123,7 @@
+ #include <linux/timer.h>
+ #include <linux/stat.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,35)
+ #include <linux/init.h>
+@@ -1327,7 +1327,7 @@ MODULE_PARM(sym53c8xx, "s");
+ #define SetScsiAbortResult(cmd) SetScsiResult(cmd, DID_ABORT, 0xff)
+ #endif
+-static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs);
++static irqreturn_t sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs);
+ static void sym53c8xx_timeout(unsigned long np);
+ #define initverbose (driver_setup.verbose)
+@@ -7374,7 +7374,7 @@ void ncr_complete (ncb_p np, ccb_p cp)
+               }
+               if (cp->xerr_status & XE_BAD_PHASE) {
+                       PRINT_ADDR(cmd);
+-                      printk ("illegal scsi phase (4/5).\n");
++                      printk ("invalid scsi phase (4/5).\n");
+               }
+               if (cp->xerr_status & XE_SODL_UNRUN) {
+                       PRINT_ADDR(cmd);
+@@ -13660,7 +13660,7 @@ printk("sym53c8xx : command successfully
+ **   routine for each host that uses this IRQ.
+ */
+-static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs)
++static irqreturn_t sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs)
+ {
+      unsigned long flags;
+      ncb_p np = (ncb_p) dev_id;
+@@ -13685,6 +13685,7 @@ static void sym53c8xx_intr(int irq, void
+           ncr_flush_done_cmds(done_list);
+           NCR_UNLOCK_SCSI_DONE(done_list->device->host, flags);
+      }
++     return IRQ_HANDLED;
+ }
+ /*
+--- linux-2.6.0-test1/drivers/scsi/t128.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/t128.c     2003-07-19 17:03:50.000000000 -0700
+@@ -110,7 +110,7 @@
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <asm/io.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+ #include <linux/init.h>
+--- linux-2.6.0-test1/drivers/scsi/tmscsim.c   2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/scsi/tmscsim.c  2003-07-19 17:03:50.000000000 -0700
+@@ -224,7 +224,7 @@
+ #include <linux/mm.h>
+ #include <linux/config.h>
+ #include <linux/version.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/timer.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/u14-34f.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/u14-34f.c  2003-07-19 17:03:50.000000000 -0700
+@@ -414,7 +414,7 @@
+ #include <asm/system.h>
+ #include <asm/byteorder.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/stat.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/drivers/scsi/ultrastor.c 2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/ultrastor.c        2003-07-19 17:03:50.000000000 -0700
+@@ -128,7 +128,7 @@
+  */
+ #include <linux/module.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/interrupt.h>
+ #include <linux/stddef.h>
+ #include <linux/string.h>
+--- linux-2.6.0-test1/drivers/scsi/wd33c93.c   2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/scsi/wd33c93.c  2003-07-19 17:03:50.000000000 -0700
+@@ -79,7 +79,7 @@
+ #include <linux/delay.h>
+ #include <linux/version.h>
+ #include <linux/init.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <asm/irq.h>
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/scsi/wd7000.c    2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/scsi/wd7000.c   2003-07-19 17:03:50.000000000 -0700
+@@ -174,7 +174,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/ioport.h>
+ #include <linux/proc_fs.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/init.h>
+ #include <linux/stat.h>
+--- linux-2.6.0-test1/drivers/scsi/zalon.c     2003-07-02 14:53:15.000000000 -0700
++++ 25/drivers/scsi/zalon.c    2003-07-19 17:03:50.000000000 -0700
+@@ -7,7 +7,7 @@
+ #include <linux/types.h>
+ #include <linux/stat.h>
+ #include <linux/mm.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/sched.h>
+ #include <linux/version.h>
+ #include <linux/config.h>
+@@ -85,7 +85,7 @@ zalon_scsi_callback(struct parisc_device
+ {
+       struct gsc_irq gsc_irq;
+       u32 zalon_vers;
+-      int irq;
++      int irq, error = -ENODEV;
+       unsigned long zalon = dev->hpa;
+       unsigned long io_port = zalon + GSC_SCSI_ZALON_OFFSET;
+       static int unit = 0;
+@@ -147,11 +147,18 @@ zalon_scsi_callback(struct parisc_device
+       dev_set_drvdata(&dev->dev, host);
+-      scsi_add_host(host, &dev->dev);
++      error = scsi_add_host(host, &dev->dev);
++      if (error)
++              goto fail_free_irq;
++      scsi_scan_host(host);
+       return 0;
++
++ fail_free_irq:
++      free_irq(irq, host);
+  fail:
+-      return -ENODEV;
++      ncr53c8xx_release(host);
++      return error;
+ }
+ static struct parisc_device_id zalon_tbl[] = {
+--- linux-2.6.0-test1/drivers/serial/8250.c    2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/serial/8250.c   2003-07-19 17:04:02.000000000 -0700
+@@ -823,7 +823,7 @@ receive_chars(struct uart_8250_port *up,
+               if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) {
+                       tty->flip.work.func((void *)tty);
+                       if (tty->flip.count >= TTY_FLIPBUF_SIZE)
+-                              return; // if TTY_DONT_FLIP is set
++                              return; /* if TTY_DONT_FLIP is set */
+               }
+               ch = serial_inp(up, UART_RX);
+               *tty->flip.char_buf_ptr = ch;
+@@ -1183,13 +1183,20 @@ static void serial8250_break_ctl(struct 
+       serial_out(up, UART_LCR, up->lcr);
+       spin_unlock_irqrestore(&up->port.lock, flags);
+ }
++#ifdef CONFIG_KGDB
++static int kgdb_irq = -1;
++#endif
+ static int serial8250_startup(struct uart_port *port)
+ {
+       struct uart_8250_port *up = (struct uart_8250_port *)port;
+       unsigned long flags;
+       int retval;
+-
++#ifdef CONFIG_KGDB
++      if ( up->port.irq == kgdb_irq){
++              return -EBUSY;
++      }
++#endif
+       if (up->port.type == PORT_16C950) {
+               /* Wake up and initialize UART */
+               up->acr = 0;
+@@ -1853,6 +1860,11 @@ static void __init serial8250_register_p
+       for (i = 0; i < UART_NR; i++) {
+               struct uart_8250_port *up = &serial8250_ports[i];
++#ifdef CONFIG_KGDB
++              if(up->port.irq == kgdb_irq){
++                      up->port.iobase = up->port.mapbase = 0;
++              }
++#endif
+               up->port.line = i;
+               up->port.ops = &serial8250_pops;
+               init_timer(&up->timer);
+@@ -2116,7 +2128,31 @@ void serial8250_resume_port(int line, u3
+ {
+       uart_resume_port(&serial8250_reg, &serial8250_ports[line].port, level);
+ }
+-
++#ifdef CONFIG_KGDB
++/*
++ * Find all the ports using the given irq and shut them down.
++ * Result should be that the irq will be released.
++ */
++void shutdown_for_kgdb(struct async_struct * info)
++{
++        int irq = info->state->irq;
++        struct uart_8250_port *up;
++      int ttyS;
++
++      kgdb_irq = irq;                 /* save for later init */
++      for (ttyS = 0; ttyS < UART_NR; ttyS++){
++              up =  &serial8250_ports[ttyS];
++              if( up->port.irq == irq && (irq_lists + irq)->head){
++#ifdef CONFIG_DEBUG_SPINLOCK   /* ugly business... */
++                      if(up->port.lock.magic != SPINLOCK_MAGIC){
++                              spin_lock_init(&up->port.lock);
++                      }
++#endif
++                      serial8250_shutdown(&up->port);
++              }
++        }
++}
++#endif
+ static int __init serial8250_init(void)
+ {
+       int ret, i;
+--- linux-2.6.0-test1/drivers/serial/core.c    2003-07-10 18:50:31.000000000 -0700
++++ 25/drivers/serial/core.c   2003-07-19 17:03:50.000000000 -0700
+@@ -1667,23 +1667,25 @@ static int uart_line_info(char *buf, str
+               return ret + 1;
+       }
+-      status = port->ops->get_mctrl(port);
+-
+-      ret += sprintf(buf + ret, " tx:%d rx:%d",
+-                      port->icount.tx, port->icount.rx);
+-      if (port->icount.frame)
+-              ret += sprintf(buf + ret, " fe:%d",
+-                      port->icount.frame);
+-      if (port->icount.parity)
+-              ret += sprintf(buf + ret, " pe:%d",
+-                      port->icount.parity);
+-      if (port->icount.brk)
+-              ret += sprintf(buf + ret, " brk:%d",
+-                      port->icount.brk);
+-      if (port->icount.overrun)
+-              ret += sprintf(buf + ret, " oe:%d",
+-                      port->icount.overrun);
+-
++      if(capable(CAP_SYS_ADMIN))
++      {
++              status = port->ops->get_mctrl(port);
++
++              ret += sprintf(buf + ret, " tx:%d rx:%d",
++                              port->icount.tx, port->icount.rx);
++              if (port->icount.frame)
++                      ret += sprintf(buf + ret, " fe:%d",
++                              port->icount.frame);
++              if (port->icount.parity)
++                      ret += sprintf(buf + ret, " pe:%d",
++                              port->icount.parity);
++              if (port->icount.brk)
++                      ret += sprintf(buf + ret, " brk:%d",
++                              port->icount.brk);
++              if (port->icount.overrun)
++                      ret += sprintf(buf + ret, " oe:%d",
++                              port->icount.overrun);
++      
+ #define INFOBIT(bit,str) \
+       if (port->mctrl & (bit)) \
+               strncat(stat_buf, (str), sizeof(stat_buf) - \
+@@ -1693,19 +1695,22 @@ static int uart_line_info(char *buf, str
+               strncat(stat_buf, (str), sizeof(stat_buf) - \
+                      strlen(stat_buf) - 2)
+-      stat_buf[0] = '\0';
+-      stat_buf[1] = '\0';
+-      INFOBIT(TIOCM_RTS, "|RTS");
+-      STATBIT(TIOCM_CTS, "|CTS");
+-      INFOBIT(TIOCM_DTR, "|DTR");
+-      STATBIT(TIOCM_DSR, "|DSR");
+-      STATBIT(TIOCM_CAR, "|CD");
+-      STATBIT(TIOCM_RNG, "|RI");
+-      if (stat_buf[0])
+-              stat_buf[0] = ' ';
+-      strcat(stat_buf, "\n");
+-
+-      ret += sprintf(buf + ret, stat_buf);
++              stat_buf[0] = '\0';
++              stat_buf[1] = '\0';
++              INFOBIT(TIOCM_RTS, "|RTS");
++              STATBIT(TIOCM_CTS, "|CTS");
++              INFOBIT(TIOCM_DTR, "|DTR");
++              STATBIT(TIOCM_DSR, "|DSR");
++              STATBIT(TIOCM_CAR, "|CD");
++              STATBIT(TIOCM_RNG, "|RI");
++              if (stat_buf[0])
++                      stat_buf[0] = ' ';
++              strcat(stat_buf, "\n");
++      
++              ret += sprintf(buf + ret, stat_buf);
++      }
++#undef STATBIT
++#undef INFOBIT
+       return ret;
+ }
+--- linux-2.6.0-test1/drivers/serial/Kconfig   2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/serial/Kconfig  2003-07-19 17:03:50.000000000 -0700
+@@ -404,14 +404,19 @@ config SERIAL_SUNSAB_CONSOLE
+         on your Sparc system as the console, you can do so by answering
+         Y to this option.
+-config V850E_NB85E_UART
++config V850E_UART
+       bool "NEC V850E on-chip UART support"
+-      depends on V850E_NB85E || V850E2_ANNA || V850E_AS85EP1
++      depends on V850E_MA1 || V850E_ME2 || V850E_TEG || V850E2_ANNA || V850E_AS85EP1
+       default y
+-config V850E_NB85E_UART_CONSOLE
++config V850E_UARTB
++        bool
++      depends V850E_UART && V850E_ME2
++      default y
++
++config V850E_UART_CONSOLE
+       bool "Use NEC V850E on-chip UART for console"
+-      depends on V850E_NB85E_UART
++      depends on V850E_UART
+ config SERIAL98
+       tristate "PC-9800 8251-based primary serial port support"
+@@ -426,12 +431,12 @@ config SERIAL98_CONSOLE
+ config SERIAL_CORE
+       tristate
+-      default m if SERIAL_AMBA!=y && SERIAL_CLPS711X!=y && SERIAL_21285!=y && !SERIAL_SA1100 && !SERIAL_ANAKIN && !SERIAL_UART00 && SERIAL_8250!=y && SERIAL_MUX!=y && !SERIAL_ROCKETPORT && !SERIAL_SUNCORE && !V850E_NB85E_UART && (SERIAL_AMBA=m || SERIAL_CLPS711X=m || SERIAL_21285=m || SERIAL_8250=m || SERIAL_MUX=m || SERIAL98=m)
+-      default y if SERIAL_AMBA=y || SERIAL_CLPS711X=y || SERIAL_21285=y || SERIAL_SA1100 || SERIAL_ANAKIN || SERIAL_UART00 || SERIAL_8250=y || SERIAL_MUX=y || SERIAL_ROCKETPORT || SERIAL_SUNCORE || V850E_NB85E_UART || SERIAL98=y
++      default m if SERIAL_AMBA!=y && SERIAL_CLPS711X!=y && SERIAL_21285!=y && !SERIAL_SA1100 && !SERIAL_ANAKIN && !SERIAL_UART00 && SERIAL_8250!=y && SERIAL_MUX!=y && !SERIAL_ROCKETPORT && !SERIAL_SUNCORE && !V850E_UART && (SERIAL_AMBA=m || SERIAL_CLPS711X=m || SERIAL_21285=m || SERIAL_8250=m || SERIAL_MUX=m || SERIAL98=m)
++      default y if SERIAL_AMBA=y || SERIAL_CLPS711X=y || SERIAL_21285=y || SERIAL_SA1100 || SERIAL_ANAKIN || SERIAL_UART00 || SERIAL_8250=y || SERIAL_MUX=y || SERIAL_ROCKETPORT || SERIAL_SUNCORE || V850E_UART || SERIAL98=y
+ config SERIAL_CORE_CONSOLE
+       bool
+-      depends on SERIAL_AMBA_CONSOLE || SERIAL_CLPS711X_CONSOLE || SERIAL_21285_CONSOLE || SERIAL_SA1100_CONSOLE || SERIAL_ANAKIN_CONSOLE || SERIAL_UART00_CONSOLE || SERIAL_8250_CONSOLE || SERIAL_MUX_CONSOLE || SERIAL_SUNZILOG_CONSOLE || SERIAL_SUNSU_CONSOLE || SERIAL_SUNSAB_CONSOLE || V850E_NB85E_UART_CONSOLE || SERIAL98_CONSOLE
++      depends on SERIAL_AMBA_CONSOLE || SERIAL_CLPS711X_CONSOLE || SERIAL_21285_CONSOLE || SERIAL_SA1100_CONSOLE || SERIAL_ANAKIN_CONSOLE || SERIAL_UART00_CONSOLE || SERIAL_8250_CONSOLE || SERIAL_MUX_CONSOLE || SERIAL_SUNZILOG_CONSOLE || SERIAL_SUNSU_CONSOLE || SERIAL_SUNSAB_CONSOLE || V850E_UART_CONSOLE || SERIAL98_CONSOLE
+       default y
+ config SERIAL_68328
+--- linux-2.6.0-test1/drivers/serial/Makefile  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/serial/Makefile 2003-07-19 17:03:50.000000000 -0700
+@@ -29,5 +29,5 @@ obj-$(CONFIG_SERIAL_MUX) += mux.o
+ obj-$(CONFIG_SERIAL_68328) += 68328serial.o
+ obj-$(CONFIG_SERIAL_68360) += 68360serial.o
+ obj-$(CONFIG_SERIAL_COLDFIRE) += mcfserial.o
+-obj-$(CONFIG_V850E_NB85E_UART) += nb85e_uart.o
++obj-$(CONFIG_V850E_UART) += v850e_uart.o
+ obj-$(CONFIG_SERIAL98) += serial98.o
+--- linux-2.6.0-test1/drivers/serial/nb85e_uart.c      2003-06-14 12:18:30.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,610 +0,0 @@
+-/*
+- * drivers/serial/nb85e_uart.c -- Serial I/O using V850E/NB85E on-chip UART
+- *
+- *  Copyright (C) 2001,02,03  NEC Corporation
+- *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/module.h>
+-#include <linux/console.h>
+-#include <linux/tty.h>
+-#include <linux/tty_flip.h>
+-#include <linux/serial.h>
+-#include <linux/serial_core.h>
+-
+-#include <asm/nb85e_uart.h>
+-#include <asm/nb85e_utils.h>
+-
+-/* Initial UART state.  This may be overridden by machine-dependent headers. */
+-#ifndef NB85E_UART_INIT_BAUD
+-#define NB85E_UART_INIT_BAUD  115200
+-#endif
+-#ifndef NB85E_UART_INIT_CFLAGS
+-#define NB85E_UART_INIT_CFLAGS        (B115200 | CS8 | CREAD)
+-#endif
+-
+-/* XXX This should be in a header file.  */
+-#define NB85E_UART_BRGC_MIN   8
+-
+-/* A string used for prefixing printed descriptions; since the same UART
+-   macro is actually used on other chips than the V850E/NB85E.  This must
+-   be a constant string.  */
+-#ifndef NB85E_UART_CHIP_NAME
+-#define NB85E_UART_CHIP_NAME "V850E/NB85E"
+-#endif
+-
+-\f
+-/* Helper functions for doing baud-rate/frequency calculations.  */
+-
+-/* Calculate the minimum value for CKSR on this processor.  */
+-static inline unsigned cksr_min (void)
+-{
+-      int min = 0;
+-      unsigned freq = NB85E_UART_BASE_FREQ;
+-      while (freq > NB85E_UART_CKSR_MAX_FREQ) {
+-              freq >>= 1;
+-              min++;
+-      }
+-      return min;
+-}
+-
+-/* Minimum baud rate possible.  */
+-#define min_baud() \
+-   ((NB85E_UART_BASE_FREQ >> NB85E_UART_CKSR_MAX) / (2 * 255) + 1)
+-
+-/* Maximum baud rate possible.  The error is quite high at max, though.  */
+-#define max_baud() \
+-   ((NB85E_UART_BASE_FREQ >> cksr_min()) / (2 * NB85E_UART_BRGC_MIN))
+-
+-\f
+-/* Low-level UART functions.  */
+-
+-/* These masks define which control bits affect TX/RX modes, respectively.  */
+-#define RX_BITS \
+-  (NB85E_UART_ASIM_PS_MASK | NB85E_UART_ASIM_CL_8 | NB85E_UART_ASIM_ISRM)
+-#define TX_BITS \
+-  (NB85E_UART_ASIM_PS_MASK | NB85E_UART_ASIM_CL_8 | NB85E_UART_ASIM_SL_2)
+-
+-/* The UART require various delays after writing control registers.  */
+-static inline void nb85e_uart_delay (unsigned cycles)
+-{
+-      /* The loop takes 2 insns, so loop CYCLES / 2 times.  */
+-      register unsigned count = cycles >> 1;
+-      while (--count != 0)
+-              /* nothing */;
+-}
+-
+-/* Configure and turn on uart channel CHAN, using the termios `control
+-   modes' bits in CFLAGS, and a baud-rate of BAUD.  */
+-void nb85e_uart_configure (unsigned chan, unsigned cflags, unsigned baud)
+-{
+-      int flags;
+-      unsigned new_config = 0; /* What we'll write to the control reg. */
+-      unsigned new_clk_divlog2; /* New baud-rate generate clock divider. */
+-      unsigned new_brgen_count; /* New counter max for baud-rate generator.*/
+-      /* These are the current values corresponding to the above.  */
+-      unsigned old_config, old_clk_divlog2, old_brgen_count;
+-
+-      /* Calculate new baud-rate generator config values.  */
+-
+-      /* Calculate the log2 clock divider and baud-rate counter values
+-         (note that the UART divides the resulting clock by 2, so
+-         multiply BAUD by 2 here to compensate).  */
+-      calc_counter_params (NB85E_UART_BASE_FREQ, baud * 2,
+-                           cksr_min(), NB85E_UART_CKSR_MAX, 8/*bits*/,
+-                           &new_clk_divlog2, &new_brgen_count);
+-
+-      /* Figure out new configuration of control register.  */
+-      if (cflags & CSTOPB)
+-              /* Number of stop bits, 1 or 2.  */
+-              new_config |= NB85E_UART_ASIM_SL_2;
+-      if ((cflags & CSIZE) == CS8)
+-              /* Number of data bits, 7 or 8.  */
+-              new_config |= NB85E_UART_ASIM_CL_8;
+-      if (! (cflags & PARENB))
+-              /* No parity check/generation.  */
+-              new_config |= NB85E_UART_ASIM_PS_NONE;
+-      else if (cflags & PARODD)
+-              /* Odd parity check/generation.  */
+-              new_config |= NB85E_UART_ASIM_PS_ODD;
+-      else
+-              /* Even parity check/generation.  */
+-              new_config |= NB85E_UART_ASIM_PS_EVEN;
+-      if (cflags & CREAD)
+-              /* Reading enabled.  */
+-              new_config |= NB85E_UART_ASIM_RXE;
+-
+-      new_config |= NB85E_UART_ASIM_TXE; /* Writing is always enabled.  */
+-      new_config |= NB85E_UART_ASIM_CAE;
+-      new_config |= NB85E_UART_ASIM_ISRM; /* Errors generate a read-irq.  */
+-
+-      /* Disable interrupts while we're twiddling the hardware.  */
+-      local_irq_save (flags);
+-
+-#ifdef NB85E_UART_PRE_CONFIGURE
+-      NB85E_UART_PRE_CONFIGURE (chan, cflags, baud);
+-#endif
+-
+-      old_config = NB85E_UART_ASIM (chan);
+-      old_clk_divlog2 = NB85E_UART_CKSR (chan);
+-      old_brgen_count = NB85E_UART_BRGC (chan);
+-
+-      if (new_clk_divlog2 != old_clk_divlog2
+-          || new_brgen_count != old_brgen_count)
+-      {
+-              /* The baud rate has changed.  First, disable the UART.  */
+-              NB85E_UART_ASIM (chan) = 0;
+-              old_config = 0;
+-              /* Reprogram the baud-rate generator.  */
+-              NB85E_UART_CKSR (chan) = new_clk_divlog2;
+-              NB85E_UART_BRGC (chan) = new_brgen_count;
+-      }
+-
+-      if (! (old_config & NB85E_UART_ASIM_CAE)) {
+-              /* If we are enabling the uart for the first time, start
+-                 by turning on the enable bit, which must be done
+-                 before turning on any other bits.  */
+-              NB85E_UART_ASIM (chan) = NB85E_UART_ASIM_CAE;
+-              /* Enabling the uart also resets it.  */
+-              old_config = NB85E_UART_ASIM_CAE;
+-      }
+-
+-      if (new_config != old_config) {
+-              /* Which of the TXE/RXE bits we'll temporarily turn off
+-                 before changing other control bits.  */
+-              unsigned temp_disable = 0;
+-              /* Which of the TXE/RXE bits will be enabled.  */
+-              unsigned enable = 0;
+-              unsigned changed_bits = new_config ^ old_config;
+-
+-              /* Which of RX/TX will be enabled in the new configuration.  */
+-              if (new_config & RX_BITS)
+-                      enable |= (new_config & NB85E_UART_ASIM_RXE);
+-              if (new_config & TX_BITS)
+-                      enable |= (new_config & NB85E_UART_ASIM_TXE);
+-
+-              /* Figure out which of RX/TX needs to be disabled; note
+-                 that this will only happen if they're not already
+-                 disabled.  */
+-              if (changed_bits & RX_BITS)
+-                      temp_disable |= (old_config & NB85E_UART_ASIM_RXE);
+-              if (changed_bits & TX_BITS)
+-                      temp_disable |= (old_config & NB85E_UART_ASIM_TXE);
+-
+-              /* We have to turn off RX and/or TX mode before changing
+-                 any associated control bits.  */
+-              if (temp_disable)
+-                      NB85E_UART_ASIM (chan) = old_config & ~temp_disable;
+-
+-              /* Write the new control bits, while RX/TX are disabled. */ 
+-              if (changed_bits & ~enable)
+-                      NB85E_UART_ASIM (chan) = new_config & ~enable;
+-
+-              /* The UART may not be reset properly unless we
+-                 wait at least 2 `basic-clocks' until turning
+-                 on the TXE/RXE bits again.  A `basic clock'
+-                 is the clock used by the baud-rate generator, i.e.,
+-                 the cpu clock divided by the 2^new_clk_divlog2.  */
+-              nb85e_uart_delay (1 << (new_clk_divlog2 + 1));
+-
+-              /* Write the final version, with enable bits turned on.  */
+-              NB85E_UART_ASIM (chan) = new_config;
+-      }
+-
+-      local_irq_restore (flags);
+-}
+-
+-\f
+-/*  Low-level console. */
+-
+-#ifdef CONFIG_V850E_NB85E_UART_CONSOLE
+-
+-static void nb85e_uart_cons_write (struct console *co,
+-                                 const char *s, unsigned count)
+-{
+-      if (count > 0) {
+-              unsigned chan = co->index;
+-              unsigned irq = IRQ_INTST (chan);
+-              int irq_was_enabled, irq_was_pending, flags;
+-
+-              /* We don't want to get `transmission completed' (INTST)
+-                 interrupts, since we're busy-waiting, so we disable
+-                 them while sending (we don't disable interrupts
+-                 entirely because sending over a serial line is really
+-                 slow).  We save the status of INTST and restore it
+-                 when we're done so that using printk doesn't
+-                 interfere with normal serial transmission (other than
+-                 interleaving the output, of course!).  This should
+-                 work correctly even if this function is interrupted
+-                 and the interrupt printks something.  */
+-
+-              /* Disable interrupts while fiddling with INTST.  */
+-              local_irq_save (flags);
+-              /* Get current INTST status.  */
+-              irq_was_enabled = nb85e_intc_irq_enabled (irq);
+-              irq_was_pending = nb85e_intc_irq_pending (irq);
+-              /* Disable INTST if necessary.  */
+-              if (irq_was_enabled)
+-                      nb85e_intc_disable_irq (irq);
+-              /* Turn interrupts back on.  */
+-              local_irq_restore (flags);
+-
+-              /* Send characters.  */
+-              while (count > 0) {
+-                      int ch = *s++;
+-
+-                      if (ch == '\n') {
+-                              /* We don't have the benefit of a tty
+-                                 driver, so translate NL into CR LF.  */
+-                              nb85e_uart_wait_for_xmit_ok (chan);
+-                              nb85e_uart_putc (chan, '\r');
+-                      }
+-
+-                      nb85e_uart_wait_for_xmit_ok (chan);
+-                      nb85e_uart_putc (chan, ch);
+-
+-                      count--;
+-              }
+-
+-              /* Restore saved INTST status.  */
+-              if (irq_was_enabled) {
+-                      /* Wait for the last character we sent to be
+-                         completely transmitted (as we'll get an INTST
+-                         interrupt at that point).  */
+-                      nb85e_uart_wait_for_xmit_done (chan);
+-                      /* Clear pending interrupts received due
+-                         to our transmission, unless there was already
+-                         one pending, in which case we want the
+-                         handler to be called.  */
+-                      if (! irq_was_pending)
+-                              nb85e_intc_clear_pending_irq (irq);
+-                      /* ... and then turn back on handling.  */
+-                      nb85e_intc_enable_irq (irq);
+-              }
+-      }
+-}
+-
+-extern struct uart_driver nb85e_uart_driver;
+-static struct console nb85e_uart_cons =
+-{
+-    .name     = "ttyS",
+-    .write    = nb85e_uart_cons_write,
+-    .device   = uart_console_device,
+-    .flags    = CON_PRINTBUFFER,
+-    .cflag    = NB85E_UART_INIT_CFLAGS,
+-    .index    = -1,
+-    .data     = &nb85e_uart_driver,
+-};
+-
+-void nb85e_uart_cons_init (unsigned chan)
+-{
+-      nb85e_uart_configure (chan, NB85E_UART_INIT_CFLAGS,
+-                            NB85E_UART_INIT_BAUD);
+-      nb85e_uart_cons.index = chan;
+-      register_console (&nb85e_uart_cons);
+-      printk ("Console: %s on-chip UART channel %d\n",
+-              NB85E_UART_CHIP_NAME, chan);
+-}
+-
+-#define NB85E_UART_CONSOLE &nb85e_uart_cons
+-
+-#else /* !CONFIG_V850E_NB85E_UART_CONSOLE */
+-#define NB85E_UART_CONSOLE 0
+-#endif /* CONFIG_V850E_NB85E_UART_CONSOLE */
+-\f
+-/* TX/RX interrupt handlers.  */
+-
+-static void nb85e_uart_stop_tx (struct uart_port *port, unsigned tty_stop);
+-
+-void nb85e_uart_tx (struct uart_port *port)
+-{
+-      struct circ_buf *xmit = &port->info->xmit;
+-      int stopped = uart_tx_stopped (port);
+-
+-      if (nb85e_uart_xmit_ok (port->line)) {
+-              int tx_ch;
+-
+-              if (port->x_char) {
+-                      tx_ch = port->x_char;
+-                      port->x_char = 0;
+-              } else if (!uart_circ_empty (xmit) && !stopped) {
+-                      tx_ch = xmit->buf[xmit->tail];
+-                      xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+-              } else
+-                      goto no_xmit;
+-
+-              nb85e_uart_putc (port->line, tx_ch);
+-              port->icount.tx++;
+-
+-              if (uart_circ_chars_pending (xmit) < WAKEUP_CHARS)
+-                      uart_write_wakeup (port);
+-      }
+-
+- no_xmit:
+-      if (uart_circ_empty (xmit) || stopped)
+-              nb85e_uart_stop_tx (port, stopped);
+-}
+-
+-static void nb85e_uart_tx_irq (int irq, void *data, struct pt_regs *regs)
+-{
+-      struct uart_port *port = data;
+-      nb85e_uart_tx (port);
+-}
+-
+-static void nb85e_uart_rx_irq (int irq, void *data, struct pt_regs *regs)
+-{
+-      struct uart_port *port = data;
+-      unsigned ch_stat = TTY_NORMAL;
+-      unsigned ch = NB85E_UART_RXB (port->line);
+-      unsigned err = NB85E_UART_ASIS (port->line);
+-
+-      if (err) {
+-              if (err & NB85E_UART_ASIS_OVE) {
+-                      ch_stat = TTY_OVERRUN;
+-                      port->icount.overrun++;
+-              } else if (err & NB85E_UART_ASIS_FE) {
+-                      ch_stat = TTY_FRAME;
+-                      port->icount.frame++;
+-              } else if (err & NB85E_UART_ASIS_PE) {
+-                      ch_stat = TTY_PARITY;
+-                      port->icount.parity++;
+-              }
+-      }
+-
+-      port->icount.rx++;
+-
+-      tty_insert_flip_char (port->info->tty, ch, ch_stat);
+-      tty_schedule_flip (port->info->tty);
+-}
+-\f
+-/* Control functions for the serial framework.  */
+-
+-static void nb85e_uart_nop (struct uart_port *port) { }
+-static int nb85e_uart_success (struct uart_port *port) { return 0; }
+-
+-static unsigned nb85e_uart_tx_empty (struct uart_port *port)
+-{
+-      return TIOCSER_TEMT;    /* Can't detect.  */
+-}
+-
+-static void nb85e_uart_set_mctrl (struct uart_port *port, unsigned mctrl)
+-{
+-#ifdef NB85E_UART_SET_RTS
+-      NB85E_UART_SET_RTS (port->line, (mctrl & TIOCM_RTS));
+-#endif
+-}
+-
+-static unsigned nb85e_uart_get_mctrl (struct uart_port *port)
+-{
+-      /* We don't support DCD or DSR, so consider them permanently active. */
+-      int mctrl = TIOCM_CAR | TIOCM_DSR;
+-
+-      /* We may support CTS.  */
+-#ifdef NB85E_UART_CTS
+-      mctrl |= NB85E_UART_CTS(port->line) ? TIOCM_CTS : 0;
+-#else
+-      mctrl |= TIOCM_CTS;
+-#endif
+-
+-      return mctrl;
+-}
+-
+-static void nb85e_uart_start_tx (struct uart_port *port, unsigned tty_start)
+-{
+-      nb85e_intc_disable_irq (IRQ_INTST (port->line));
+-      nb85e_uart_tx (port);
+-      nb85e_intc_enable_irq (IRQ_INTST (port->line));
+-}
+-
+-static void nb85e_uart_stop_tx (struct uart_port *port, unsigned tty_stop)
+-{
+-      nb85e_intc_disable_irq (IRQ_INTST (port->line));
+-}
+-
+-static void nb85e_uart_start_rx (struct uart_port *port)
+-{
+-      nb85e_intc_enable_irq (IRQ_INTSR (port->line));
+-}
+-
+-static void nb85e_uart_stop_rx (struct uart_port *port)
+-{
+-      nb85e_intc_disable_irq (IRQ_INTSR (port->line));
+-}
+-
+-static void nb85e_uart_break_ctl (struct uart_port *port, int break_ctl)
+-{
+-      /* Umm, do this later.  */
+-}
+-
+-static int nb85e_uart_startup (struct uart_port *port)
+-{
+-      int err;
+-
+-      /* Alloc RX irq.  */
+-      err = request_irq (IRQ_INTSR (port->line), nb85e_uart_rx_irq,
+-                         SA_INTERRUPT, "nb85e_uart", port);
+-      if (err)
+-              return err;
+-
+-      /* Alloc TX irq.  */
+-      err = request_irq (IRQ_INTST (port->line), nb85e_uart_tx_irq,
+-                         SA_INTERRUPT, "nb85e_uart", port);
+-      if (err) {
+-              free_irq (IRQ_INTSR (port->line), port);
+-              return err;
+-      }
+-
+-      nb85e_uart_start_rx (port);
+-
+-      return 0;
+-}
+-
+-static void nb85e_uart_shutdown (struct uart_port *port)
+-{
+-      /* Disable port interrupts.  */
+-      free_irq (IRQ_INTST (port->line), port);
+-      free_irq (IRQ_INTSR (port->line), port);
+-
+-      /* Turn off xmit/recv enable bits.  */
+-      NB85E_UART_ASIM (port->line)
+-              &= ~(NB85E_UART_ASIM_TXE | NB85E_UART_ASIM_RXE);
+-      /* Then reset the channel.  */
+-      NB85E_UART_ASIM (port->line) = 0;
+-}
+-
+-static void
+-nb85e_uart_set_termios (struct uart_port *port, struct termios *termios,
+-                      struct termios *old)
+-{
+-      unsigned cflags = termios->c_cflag;
+-
+-      /* Restrict flags to legal values.  */
+-      if ((cflags & CSIZE) != CS7 && (cflags & CSIZE) != CS8)
+-              /* The new value of CSIZE is invalid, use the old value.  */
+-              cflags = (cflags & ~CSIZE)
+-                      | (old ? (old->c_cflag & CSIZE) : CS8);
+-
+-      termios->c_cflag = cflags;
+-
+-      nb85e_uart_configure (port->line, cflags,
+-                            uart_get_baud_rate (port, termios, old,
+-                                                min_baud(), max_baud()));
+-}
+-
+-static const char *nb85e_uart_type (struct uart_port *port)
+-{
+-      return port->type == PORT_NB85E_UART ? "nb85e_uart" : 0;
+-}
+-
+-static void nb85e_uart_config_port (struct uart_port *port, int flags)
+-{
+-      if (flags & UART_CONFIG_TYPE)
+-              port->type = PORT_NB85E_UART;
+-}
+-
+-static int
+-nb85e_uart_verify_port (struct uart_port *port, struct serial_struct *ser)
+-{
+-      if (ser->type != PORT_UNKNOWN && ser->type != PORT_NB85E_UART)
+-              return -EINVAL;
+-      if (ser->irq != IRQ_INTST (port->line))
+-              return -EINVAL;
+-      return 0;
+-}
+-
+-static struct uart_ops nb85e_uart_ops = {
+-      .tx_empty       = nb85e_uart_tx_empty,
+-      .get_mctrl      = nb85e_uart_get_mctrl,
+-      .set_mctrl      = nb85e_uart_set_mctrl,
+-      .start_tx       = nb85e_uart_start_tx,
+-      .stop_tx        = nb85e_uart_stop_tx,
+-      .stop_rx        = nb85e_uart_stop_rx,
+-      .enable_ms      = nb85e_uart_nop,
+-      .break_ctl      = nb85e_uart_break_ctl,
+-      .startup        = nb85e_uart_startup,
+-      .shutdown       = nb85e_uart_shutdown,
+-      .set_termios    = nb85e_uart_set_termios,
+-      .type           = nb85e_uart_type,
+-      .release_port   = nb85e_uart_nop,
+-      .request_port   = nb85e_uart_success,
+-      .config_port    = nb85e_uart_config_port,
+-      .verify_port    = nb85e_uart_verify_port,
+-};
+-\f
+-/* Initialization and cleanup.  */
+-
+-static struct uart_driver nb85e_uart_driver = {
+-      .owner                  = THIS_MODULE,
+-      .driver_name            = "nb85e_uart",
+-      .devfs_name             = "tts/",
+-      .dev_name               = "ttyS",
+-      .major                  = TTY_MAJOR,
+-      .minor                  = NB85E_UART_MINOR_BASE,
+-      .nr                     = NB85E_UART_NUM_CHANNELS,
+-      .cons                   = NB85E_UART_CONSOLE,
+-};
+-
+-
+-static struct uart_port nb85e_uart_ports[NB85E_UART_NUM_CHANNELS];
+-
+-static int __init nb85e_uart_init (void)
+-{
+-      int rval;
+-
+-      printk (KERN_INFO "%s on-chip UART\n", NB85E_UART_CHIP_NAME);
+-
+-      rval = uart_register_driver (&nb85e_uart_driver);
+-      if (rval == 0) {
+-              unsigned chan;
+-
+-              for (chan = 0; chan < NB85E_UART_NUM_CHANNELS; chan++) {
+-                      struct uart_port *port = &nb85e_uart_ports[chan];
+-                      
+-                      memset (port, 0, sizeof *port);
+-
+-                      port->ops = &nb85e_uart_ops;
+-                      port->line = chan;
+-                      port->iotype = SERIAL_IO_MEM;
+-                      port->flags = UPF_BOOT_AUTOCONF;
+-
+-                      /* We actually use multiple IRQs, but the serial
+-                         framework seems to mainly use this for
+-                         informational purposes anyway.  Here we use the TX
+-                         irq.  */
+-                      port->irq = IRQ_INTST (chan);
+-
+-                      /* The serial framework doesn't really use these
+-                         membase/mapbase fields for anything useful, but
+-                         it requires that they be something non-zero to
+-                         consider the port `valid', and also uses them
+-                         for informational purposes.  */
+-                      port->membase = (void *)NB85E_UART_BASE_ADDR (chan);
+-                      port->mapbase = NB85E_UART_BASE_ADDR (chan);
+-
+-                      /* The framework insists on knowing the uart's master
+-                         clock freq, though it doesn't seem to do anything
+-                         useful for us with it.  We must make it at least
+-                         higher than (the maximum baud rate * 16), otherwise
+-                         the framework will puke during its internal
+-                         calculations, and force the baud rate to be 9600.
+-                         To be accurate though, just repeat the calculation
+-                         we use when actually setting the speed.
+-
+-                         The `* 8' means `* 16 / 2':  16 to account for for
+-                         the serial framework's built-in bias, and 2 because
+-                         there's an additional / 2 in the hardware.  */
+-                      port->uartclk =
+-                              (NB85E_UART_BASE_FREQ >> cksr_min()) * 8;
+-
+-                      uart_add_one_port (&nb85e_uart_driver, port);
+-              }
+-      }
+-
+-      return rval;
+-}
+-
+-static void __exit nb85e_uart_exit (void)
+-{
+-      unsigned chan;
+-
+-      for (chan = 0; chan < NB85E_UART_NUM_CHANNELS; chan++)
+-              uart_remove_one_port (&nb85e_uart_driver,
+-                                    &nb85e_uart_ports[chan]);
+-
+-      uart_unregister_driver (&nb85e_uart_driver);
+-}
+-
+-module_init (nb85e_uart_init);
+-module_exit (nb85e_uart_exit);
+-
+-MODULE_AUTHOR ("Miles Bader");
+-MODULE_DESCRIPTION ("NEC " NB85E_UART_CHIP_NAME " on-chip UART");
+-MODULE_LICENSE ("GPL");
+--- linux-2.6.0-test1/drivers/serial/sunsu.c   2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/serial/sunsu.c  2003-07-19 17:03:50.000000000 -0700
+@@ -102,6 +102,7 @@ struct uart_sunsu_port {
+       int                     l1_down;
+ #ifdef CONFIG_SERIO
+       struct serio            serio;
++      int                     serio_open;
+ #endif
+ };
+@@ -1021,12 +1022,13 @@ static int sunsu_serio_write(struct seri
+ static int sunsu_serio_open(struct serio *serio)
+ {
++      struct uart_sunsu_port *up = serio->driver;
+       unsigned long flags;
+       int ret;
+       spin_lock_irqsave(&sunsu_serio_lock, flags);
+-      if (serio->private == NULL) {
+-              serio->private = (void *) -1L;
++      if (!up->serio_open) {
++              up->serio_open = 1;
+               ret = 0;
+       } else
+               ret = -EBUSY;
+@@ -1037,10 +1039,11 @@ static int sunsu_serio_open(struct serio
+ static void sunsu_serio_close(struct serio *serio)
+ {
++      struct uart_sunsu_port *up = serio->driver;
+       unsigned long flags;
+       spin_lock_irqsave(&sunsu_serio_lock, flags);
+-      serio->private = NULL;
++      up->serio_open = 0;
+       spin_unlock_irqrestore(&sunsu_serio_lock, flags);
+ }
+--- linux-2.6.0-test1/drivers/serial/sunzilog.c        2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/serial/sunzilog.c       2003-07-19 17:03:50.000000000 -0700
+@@ -112,6 +112,7 @@ struct uart_sunzilog_port {
+ #ifdef CONFIG_SERIO
+       struct serio                    serio;
++      int                             serio_open;
+ #endif
+ };
+@@ -1311,12 +1312,13 @@ static int sunzilog_serio_write(struct s
+ static int sunzilog_serio_open(struct serio *serio)
+ {
++      struct uart_sunzilog_port *up = serio->driver;
+       unsigned long flags;
+       int ret;
+       spin_lock_irqsave(&sunzilog_serio_lock, flags);
+-      if (serio->private == NULL) {
+-              serio->private = (void *) -1L;
++      if (!up->serio_open) {
++              up->serio_open = 1;
+               ret = 0;
+       } else
+               ret = -EBUSY;
+@@ -1327,10 +1329,11 @@ static int sunzilog_serio_open(struct se
+ static void sunzilog_serio_close(struct serio *serio)
+ {
++      struct uart_sunzilog_port *up = serio->driver;
+       unsigned long flags;
+       spin_lock_irqsave(&sunzilog_serio_lock, flags);
+-      serio->private = NULL;
++      up->serio_open = 0;
+       spin_unlock_irqrestore(&sunzilog_serio_lock, flags);
+ }
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/serial/v850e_uart.c     2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,549 @@
++/*
++ * drivers/serial/v850e_uart.c -- Serial I/O using V850E on-chip UART or UARTB
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* This driver supports both the original V850E UART interface (called
++   merely `UART' in the docs) and the newer `UARTB' interface, which is
++   roughly a superset of the first one.  The selection is made at
++   configure time -- if CONFIG_V850E_UARTB is defined, then UARTB is
++   presumed, otherwise the old UART -- as these are on-CPU UARTS, a system
++   can never have both.
++
++   The UARTB interface also has a 16-entry FIFO mode, which is not
++   yet supported by this driver.  */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/console.h>
++#include <linux/tty.h>
++#include <linux/tty_flip.h>
++#include <linux/serial.h>
++#include <linux/serial_core.h>
++
++#include <asm/v850e_uart.h>
++
++/* Initial UART state.  This may be overridden by machine-dependent headers. */
++#ifndef V850E_UART_INIT_BAUD
++#define V850E_UART_INIT_BAUD  115200
++#endif
++#ifndef V850E_UART_INIT_CFLAGS
++#define V850E_UART_INIT_CFLAGS        (B115200 | CS8 | CREAD)
++#endif
++
++/* A string used for prefixing printed descriptions; since the same UART
++   macro is actually used on other chips than the V850E.  This must be a
++   constant string.  */
++#ifndef V850E_UART_CHIP_NAME
++#define V850E_UART_CHIP_NAME  "V850E"
++#endif
++
++#define V850E_UART_MINOR_BASE 64         /* First tty minor number */
++
++\f
++/* Low-level UART functions.  */
++
++/* Configure and turn on uart channel CHAN, using the termios `control
++   modes' bits in CFLAGS, and a baud-rate of BAUD.  */
++void v850e_uart_configure (unsigned chan, unsigned cflags, unsigned baud)
++{
++      int flags;
++      v850e_uart_speed_t old_speed;
++      v850e_uart_config_t old_config;
++      v850e_uart_speed_t new_speed = v850e_uart_calc_speed (baud);
++      v850e_uart_config_t new_config = v850e_uart_calc_config (cflags);
++
++      /* Disable interrupts while we're twiddling the hardware.  */
++      local_irq_save (flags);
++
++#ifdef V850E_UART_PRE_CONFIGURE
++      V850E_UART_PRE_CONFIGURE (chan, cflags, baud);
++#endif
++
++      old_config = V850E_UART_CONFIG (chan);
++      old_speed = v850e_uart_speed (chan);
++
++      if (! v850e_uart_speed_eq (old_speed, new_speed)) {
++              /* The baud rate has changed.  First, disable the UART.  */
++              V850E_UART_CONFIG (chan) = V850E_UART_CONFIG_FINI;
++              old_config = 0; /* Force the uart to be re-initialized. */
++
++              /* Reprogram the baud-rate generator.  */
++              v850e_uart_set_speed (chan, new_speed);
++      }
++
++      if (! (old_config & V850E_UART_CONFIG_ENABLED)) {
++              /* If we are using the uart for the first time, start by
++                 enabling it, which must be done before turning on any
++                 other bits.  */
++              V850E_UART_CONFIG (chan) = V850E_UART_CONFIG_INIT;
++              /* See the initial state.  */
++              old_config = V850E_UART_CONFIG (chan);
++      }
++
++      if (new_config != old_config) {
++              /* Which of the TXE/RXE bits we'll temporarily turn off
++                 before changing other control bits.  */
++              unsigned temp_disable = 0;
++              /* Which of the TXE/RXE bits will be enabled.  */
++              unsigned enable = 0;
++              unsigned changed_bits = new_config ^ old_config;
++
++              /* Which of RX/TX will be enabled in the new configuration.  */
++              if (new_config & V850E_UART_CONFIG_RX_BITS)
++                      enable |= (new_config & V850E_UART_CONFIG_RX_ENABLE);
++              if (new_config & V850E_UART_CONFIG_TX_BITS)
++                      enable |= (new_config & V850E_UART_CONFIG_TX_ENABLE);
++
++              /* Figure out which of RX/TX needs to be disabled; note
++                 that this will only happen if they're not already
++                 disabled.  */
++              if (changed_bits & V850E_UART_CONFIG_RX_BITS)
++                      temp_disable
++                              |= (old_config & V850E_UART_CONFIG_RX_ENABLE);
++              if (changed_bits & V850E_UART_CONFIG_TX_BITS)
++                      temp_disable
++                              |= (old_config & V850E_UART_CONFIG_TX_ENABLE);
++
++              /* We have to turn off RX and/or TX mode before changing
++                 any associated control bits.  */
++              if (temp_disable)
++                      V850E_UART_CONFIG (chan) = old_config & ~temp_disable;
++
++              /* Write the new control bits, while RX/TX are disabled. */ 
++              if (changed_bits & ~enable)
++                      V850E_UART_CONFIG (chan) = new_config & ~enable;
++
++              v850e_uart_config_delay (new_config, new_speed);
++
++              /* Write the final version, with enable bits turned on.  */
++              V850E_UART_CONFIG (chan) = new_config;
++      }
++
++      local_irq_restore (flags);
++}
++
++\f
++/*  Low-level console. */
++
++#ifdef CONFIG_V850E_UART_CONSOLE
++
++static void v850e_uart_cons_write (struct console *co,
++                                 const char *s, unsigned count)
++{
++      if (count > 0) {
++              unsigned chan = co->index;
++              unsigned irq = V850E_UART_TX_IRQ (chan);
++              int irq_was_enabled, irq_was_pending, flags;
++
++              /* We don't want to get `transmission completed'
++                 interrupts, since we're busy-waiting, so we disable them
++                 while sending (we don't disable interrupts entirely
++                 because sending over a serial line is really slow).  We
++                 save the status of the tx interrupt and restore it when
++                 we're done so that using printk doesn't interfere with
++                 normal serial transmission (other than interleaving the
++                 output, of course!).  This should work correctly even if
++                 this function is interrupted and the interrupt printks
++                 something.  */
++
++              /* Disable interrupts while fiddling with tx interrupt.  */
++              local_irq_save (flags);
++              /* Get current tx interrupt status.  */
++              irq_was_enabled = v850e_intc_irq_enabled (irq);
++              irq_was_pending = v850e_intc_irq_pending (irq);
++              /* Disable tx interrupt if necessary.  */
++              if (irq_was_enabled)
++                      v850e_intc_disable_irq (irq);
++              /* Turn interrupts back on.  */
++              local_irq_restore (flags);
++
++              /* Send characters.  */
++              while (count > 0) {
++                      int ch = *s++;
++
++                      if (ch == '\n') {
++                              /* We don't have the benefit of a tty
++                                 driver, so translate NL into CR LF.  */
++                              v850e_uart_wait_for_xmit_ok (chan);
++                              v850e_uart_putc (chan, '\r');
++                      }
++
++                      v850e_uart_wait_for_xmit_ok (chan);
++                      v850e_uart_putc (chan, ch);
++
++                      count--;
++              }
++
++              /* Restore saved tx interrupt status.  */
++              if (irq_was_enabled) {
++                      /* Wait for the last character we sent to be
++                         completely transmitted (as we'll get an
++                         interrupt interrupt at that point).  */
++                      v850e_uart_wait_for_xmit_done (chan);
++                      /* Clear pending interrupts received due
++                         to our transmission, unless there was already
++                         one pending, in which case we want the
++                         handler to be called.  */
++                      if (! irq_was_pending)
++                              v850e_intc_clear_pending_irq (irq);
++                      /* ... and then turn back on handling.  */
++                      v850e_intc_enable_irq (irq);
++              }
++      }
++}
++
++extern struct uart_driver v850e_uart_driver;
++static struct console v850e_uart_cons =
++{
++    .name     = "ttyS",
++    .write    = v850e_uart_cons_write,
++    .device   = uart_console_device,
++    .flags    = CON_PRINTBUFFER,
++    .cflag    = V850E_UART_INIT_CFLAGS,
++    .index    = -1,
++    .data     = &v850e_uart_driver,
++};
++
++void v850e_uart_cons_init (unsigned chan)
++{
++      v850e_uart_configure (chan, V850E_UART_INIT_CFLAGS,
++                            V850E_UART_INIT_BAUD);
++      v850e_uart_cons.index = chan;
++      register_console (&v850e_uart_cons);
++      printk ("Console: %s on-chip UART channel %d\n",
++              V850E_UART_CHIP_NAME, chan);
++}
++
++/* This is what the init code actually calls.  */
++static int v850e_uart_console_init (void)
++{
++      v850e_uart_cons_init (V850E_UART_CONSOLE_CHANNEL);
++      return 0;
++}
++console_initcall(v850e_uart_console_init);
++
++#define V850E_UART_CONSOLE &v850e_uart_cons
++
++#else /* !CONFIG_V850E_UART_CONSOLE */
++#define V850E_UART_CONSOLE 0
++#endif /* CONFIG_V850E_UART_CONSOLE */
++\f
++/* TX/RX interrupt handlers.  */
++
++static void v850e_uart_stop_tx (struct uart_port *port, unsigned tty_stop);
++
++void v850e_uart_tx (struct uart_port *port)
++{
++      struct circ_buf *xmit = &port->info->xmit;
++      int stopped = uart_tx_stopped (port);
++
++      if (v850e_uart_xmit_ok (port->line)) {
++              int tx_ch;
++
++              if (port->x_char) {
++                      tx_ch = port->x_char;
++                      port->x_char = 0;
++              } else if (!uart_circ_empty (xmit) && !stopped) {
++                      tx_ch = xmit->buf[xmit->tail];
++                      xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
++              } else
++                      goto no_xmit;
++
++              v850e_uart_putc (port->line, tx_ch);
++              port->icount.tx++;
++
++              if (uart_circ_chars_pending (xmit) < WAKEUP_CHARS)
++                      uart_write_wakeup (port);
++      }
++
++ no_xmit:
++      if (uart_circ_empty (xmit) || stopped)
++              v850e_uart_stop_tx (port, stopped);
++}
++
++static irqreturn_t v850e_uart_tx_irq(int irq, void *data, struct pt_regs *regs)
++{
++      struct uart_port *port = data;
++      v850e_uart_tx (port);
++      return IRQ_HANDLED;
++}
++
++static irqreturn_t v850e_uart_rx_irq(int irq, void *data, struct pt_regs *regs)
++{
++      struct uart_port *port = data;
++      unsigned ch_stat = TTY_NORMAL;
++      unsigned ch = v850e_uart_getc (port->line);
++      unsigned err = v850e_uart_err (port->line);
++
++      if (err) {
++              if (err & V850E_UART_ERR_OVERRUN) {
++                      ch_stat = TTY_OVERRUN;
++                      port->icount.overrun++;
++              } else if (err & V850E_UART_ERR_FRAME) {
++                      ch_stat = TTY_FRAME;
++                      port->icount.frame++;
++              } else if (err & V850E_UART_ERR_PARITY) {
++                      ch_stat = TTY_PARITY;
++                      port->icount.parity++;
++              }
++      }
++
++      port->icount.rx++;
++
++      tty_insert_flip_char (port->info->tty, ch, ch_stat);
++      tty_schedule_flip (port->info->tty);
++
++      return IRQ_HANDLED;
++}
++
++\f
++/* Control functions for the serial framework.  */
++
++static void v850e_uart_nop (struct uart_port *port) { }
++static int v850e_uart_success (struct uart_port *port) { return 0; }
++
++static unsigned v850e_uart_tx_empty (struct uart_port *port)
++{
++      return TIOCSER_TEMT;    /* Can't detect.  */
++}
++
++static void v850e_uart_set_mctrl (struct uart_port *port, unsigned mctrl)
++{
++#ifdef V850E_UART_SET_RTS
++      V850E_UART_SET_RTS (port->line, (mctrl & TIOCM_RTS));
++#endif
++}
++
++static unsigned v850e_uart_get_mctrl (struct uart_port *port)
++{
++      /* We don't support DCD or DSR, so consider them permanently active. */
++      int mctrl = TIOCM_CAR | TIOCM_DSR;
++
++      /* We may support CTS.  */
++#ifdef V850E_UART_CTS
++      mctrl |= V850E_UART_CTS(port->line) ? TIOCM_CTS : 0;
++#else
++      mctrl |= TIOCM_CTS;
++#endif
++
++      return mctrl;
++}
++
++static void v850e_uart_start_tx (struct uart_port *port, unsigned tty_start)
++{
++      v850e_intc_disable_irq (V850E_UART_TX_IRQ (port->line));
++      v850e_uart_tx (port);
++      v850e_intc_enable_irq (V850E_UART_TX_IRQ (port->line));
++}
++
++static void v850e_uart_stop_tx (struct uart_port *port, unsigned tty_stop)
++{
++      v850e_intc_disable_irq (V850E_UART_TX_IRQ (port->line));
++}
++
++static void v850e_uart_start_rx (struct uart_port *port)
++{
++      v850e_intc_enable_irq (V850E_UART_RX_IRQ (port->line));
++}
++
++static void v850e_uart_stop_rx (struct uart_port *port)
++{
++      v850e_intc_disable_irq (V850E_UART_RX_IRQ (port->line));
++}
++
++static void v850e_uart_break_ctl (struct uart_port *port, int break_ctl)
++{
++      /* Umm, do this later.  */
++}
++
++static int v850e_uart_startup (struct uart_port *port)
++{
++      int err;
++
++      /* Alloc RX irq.  */
++      err = request_irq (V850E_UART_RX_IRQ (port->line), v850e_uart_rx_irq,
++                         SA_INTERRUPT, "v850e_uart", port);
++      if (err)
++              return err;
++
++      /* Alloc TX irq.  */
++      err = request_irq (V850E_UART_TX_IRQ (port->line), v850e_uart_tx_irq,
++                         SA_INTERRUPT, "v850e_uart", port);
++      if (err) {
++              free_irq (V850E_UART_RX_IRQ (port->line), port);
++              return err;
++      }
++
++      v850e_uart_start_rx (port);
++
++      return 0;
++}
++
++static void v850e_uart_shutdown (struct uart_port *port)
++{
++      /* Disable port interrupts.  */
++      free_irq (V850E_UART_TX_IRQ (port->line), port);
++      free_irq (V850E_UART_RX_IRQ (port->line), port);
++
++      /* Turn off xmit/recv enable bits.  */
++      V850E_UART_CONFIG (port->line)
++              &= ~(V850E_UART_CONFIG_TX_ENABLE
++                   | V850E_UART_CONFIG_RX_ENABLE);
++      /* Then reset the channel.  */
++      V850E_UART_CONFIG (port->line) = 0;
++}
++
++static void
++v850e_uart_set_termios (struct uart_port *port, struct termios *termios,
++                      struct termios *old)
++{
++      unsigned cflags = termios->c_cflag;
++
++      /* Restrict flags to legal values.  */
++      if ((cflags & CSIZE) != CS7 && (cflags & CSIZE) != CS8)
++              /* The new value of CSIZE is invalid, use the old value.  */
++              cflags = (cflags & ~CSIZE)
++                      | (old ? (old->c_cflag & CSIZE) : CS8);
++
++      termios->c_cflag = cflags;
++
++      v850e_uart_configure (port->line, cflags,
++                            uart_get_baud_rate (port, termios, old,
++                                                v850e_uart_min_baud(),
++                                                v850e_uart_max_baud()));
++}
++
++static const char *v850e_uart_type (struct uart_port *port)
++{
++      return port->type == PORT_V850E_UART ? "v850e_uart" : 0;
++}
++
++static void v850e_uart_config_port (struct uart_port *port, int flags)
++{
++      if (flags & UART_CONFIG_TYPE)
++              port->type = PORT_V850E_UART;
++}
++
++static int
++v850e_uart_verify_port (struct uart_port *port, struct serial_struct *ser)
++{
++      if (ser->type != PORT_UNKNOWN && ser->type != PORT_V850E_UART)
++              return -EINVAL;
++      if (ser->irq != V850E_UART_TX_IRQ (port->line))
++              return -EINVAL;
++      return 0;
++}
++
++static struct uart_ops v850e_uart_ops = {
++      .tx_empty       = v850e_uart_tx_empty,
++      .get_mctrl      = v850e_uart_get_mctrl,
++      .set_mctrl      = v850e_uart_set_mctrl,
++      .start_tx       = v850e_uart_start_tx,
++      .stop_tx        = v850e_uart_stop_tx,
++      .stop_rx        = v850e_uart_stop_rx,
++      .enable_ms      = v850e_uart_nop,
++      .break_ctl      = v850e_uart_break_ctl,
++      .startup        = v850e_uart_startup,
++      .shutdown       = v850e_uart_shutdown,
++      .set_termios    = v850e_uart_set_termios,
++      .type           = v850e_uart_type,
++      .release_port   = v850e_uart_nop,
++      .request_port   = v850e_uart_success,
++      .config_port    = v850e_uart_config_port,
++      .verify_port    = v850e_uart_verify_port,
++};
++\f
++/* Initialization and cleanup.  */
++
++static struct uart_driver v850e_uart_driver = {
++      .owner                  = THIS_MODULE,
++      .driver_name            = "v850e_uart",
++      .devfs_name             = "tts/",
++      .dev_name               = "ttyS",
++      .major                  = TTY_MAJOR,
++      .minor                  = V850E_UART_MINOR_BASE,
++      .nr                     = V850E_UART_NUM_CHANNELS,
++      .cons                   = V850E_UART_CONSOLE,
++};
++
++
++static struct uart_port v850e_uart_ports[V850E_UART_NUM_CHANNELS];
++
++static int __init v850e_uart_init (void)
++{
++      int rval;
++
++      printk (KERN_INFO "%s on-chip UART\n", V850E_UART_CHIP_NAME);
++
++      rval = uart_register_driver (&v850e_uart_driver);
++      if (rval == 0) {
++              unsigned chan;
++
++              for (chan = 0; chan < V850E_UART_NUM_CHANNELS; chan++) {
++                      struct uart_port *port = &v850e_uart_ports[chan];
++                      
++                      memset (port, 0, sizeof *port);
++
++                      port->ops = &v850e_uart_ops;
++                      port->line = chan;
++                      port->iotype = SERIAL_IO_MEM;
++                      port->flags = UPF_BOOT_AUTOCONF;
++
++                      /* We actually use multiple IRQs, but the serial
++                         framework seems to mainly use this for
++                         informational purposes anyway.  Here we use the TX
++                         irq.  */
++                      port->irq = V850E_UART_TX_IRQ (chan);
++
++                      /* The serial framework doesn't really use these
++                         membase/mapbase fields for anything useful, but
++                         it requires that they be something non-zero to
++                         consider the port `valid', and also uses them
++                         for informational purposes.  */
++                      port->membase = (void *)V850E_UART_BASE_ADDR (chan);
++                      port->mapbase = V850E_UART_BASE_ADDR (chan);
++
++                      /* The framework insists on knowing the uart's master
++                         clock freq, though it doesn't seem to do anything
++                         useful for us with it.  We must make it at least
++                         higher than (the maximum baud rate * 16), otherwise
++                         the framework will puke during its internal
++                         calculations, and force the baud rate to be 9600.
++                         To be accurate though, just repeat the calculation
++                         we use when actually setting the speed.  */
++                      port->uartclk = v850e_uart_max_clock() * 16;
++
++                      uart_add_one_port (&v850e_uart_driver, port);
++              }
++      }
++
++      return rval;
++}
++
++static void __exit v850e_uart_exit (void)
++{
++      unsigned chan;
++
++      for (chan = 0; chan < V850E_UART_NUM_CHANNELS; chan++)
++              uart_remove_one_port (&v850e_uart_driver,
++                                    &v850e_uart_ports[chan]);
++
++      uart_unregister_driver (&v850e_uart_driver);
++}
++
++module_init (v850e_uart_init);
++module_exit (v850e_uart_exit);
++
++MODULE_AUTHOR ("Miles Bader");
++MODULE_DESCRIPTION ("NEC " V850E_UART_CHIP_NAME " on-chip UART");
++MODULE_LICENSE ("GPL");
+--- linux-2.6.0-test1/drivers/telephony/ixj.c  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/telephony/ixj.c 2003-07-19 17:03:50.000000000 -0700
+@@ -23,6 +23,7 @@
+  * Fixes:           David Huggins-Daines, <dhd@cepstral.com>
+  *                  Fabio Ferrari, <fabio.ferrari@digitro.com.br>
+  *                  Artis Kugevics, <artis@mt.lv>
++ *                  Daniele Bellucci, <bellucda@tiscali.it>
+  *
+  * More information about the hardware related to this driver can be found  
+  * at our website:    http://www.quicknet.net
+@@ -45,6 +46,10 @@ static char ixj_c_revision[] = "$Revisio
+ /*
+  * $Log: 2.6.0-test1-mm2.patch,v $
+  * Revision 1.1.2.2  2003/07/22 07:20:21  braam
+  * - these should apply, but they don't quite compile (something with netdump)
+  *
++ *
++ * Revision 4.8  2003/07/09 19:39:00  Daniele Bellucci
++ * Audit some copy_*_user and minor cleanup.
++ *
+  * Revision 4.7  2001/08/13 06:19:33  craigs
+  * Added additional changes from Alan Cox and John Anderson for
+  * 2.2 to 2.4 cleanup and bounds checking
+@@ -363,12 +368,9 @@ static IXJ ixj[IXJMAX];
+ static IXJ *ixj_alloc(void)
+ {
+       int cnt;
+-      for(cnt=0; cnt<IXJMAX; cnt++)
+-      {
++      for(cnt=0; cnt<IXJMAX; cnt++) {
+               if(!ixj[cnt].DSPbase)
+-              {
+                       return &ixj[cnt];
+-              }
+       }
+       return NULL;
+ }
+@@ -6260,9 +6262,11 @@ static int ixj_ioctl(struct inode *inode
+               break;
+       case IXJCTL_CIDCW:
+               if(arg) {
+-                      copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID));
+-              }
+-              else {
++                      if (copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID))) {
++                              retval = -EFAULT;
++                              break;
++                      }
++              } else {
+                       memset(&j->cid_send, 0, sizeof(PHONE_CID));
+               }
+               ixj_write_cidcw(j);
+@@ -6273,14 +6277,12 @@ static int ixj_ioctl(struct inode *inode
+                 /* Fall through */
+       case PHONE_RING_START:
+               if(arg) {
+-                      if(copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID)))
+-                      {
++                      if (copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID))) {
+                               retval = -EFAULT;
+                               break;
+                       }
+                       ixj_write_cid(j);
+-              }
+-              else {
++              } else {
+                       memset(&j->cid_send, 0, sizeof(PHONE_CID));
+               }
+               ixj_ring_start(j);
+@@ -6696,7 +6698,8 @@ static int ixj_ioctl(struct inode *inode
+       case IXJCTL_SET_FILTER_RAW:
+               if (copy_from_user(&jfr, (char *) arg, sizeof(jfr))) 
+                       retval = -EFAULT;
+-              retval = ixj_init_filter_raw(j, &jfr);
++              else
++                      retval = ixj_init_filter_raw(j, &jfr);
+               break;
+       case IXJCTL_GET_FILTER_HIST:
+               if(arg<0||arg>3)
+@@ -6705,8 +6708,10 @@ static int ixj_ioctl(struct inode *inode
+                       retval = j->filter_hist[arg];
+               break;
+       case IXJCTL_INIT_TONE:
+-              copy_from_user(&ti, (char *) arg, sizeof(ti));
+-              retval = ixj_init_tone(j, &ti);
++              if (copy_from_user(&ti, (char *) arg, sizeof(ti)))
++                      retval = -EFAULT;
++              else
++                      retval = ixj_init_tone(j, &ti);
+               break;
+       case IXJCTL_TONE_CADENCE:
+               retval = ixj_build_cadence(j, (IXJ_CADENCE *) arg);
+@@ -6715,8 +6720,10 @@ static int ixj_ioctl(struct inode *inode
+               retval = ixj_build_filter_cadence(j, (IXJ_FILTER_CADENCE *) arg);
+               break;
+       case IXJCTL_SIGCTL:
+-              if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF)))
++              if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF))) {
+                       retval = -EFAULT;
++                      break;
++              }
+               j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
+               if(j->sigdef.event < 33) {
+                       raise = 1;
+@@ -7693,7 +7700,7 @@ MODULE_DESCRIPTION("Quicknet VoIP Teleph
+ MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
+ MODULE_LICENSE("GPL");
+-void ixj_exit(void)
++static void __exit ixj_exit(void)
+ {
+         cleanup();
+ }
+@@ -7852,7 +7859,7 @@ int __init ixj_probe_pci(int *cnt)
+       return probe;
+ }
+-int __init ixj_init(void)
++static int __init ixj_init(void)
+ {
+       int cnt = 0;
+       int probe = 0;   
+--- linux-2.6.0-test1/drivers/telephony/Kconfig        2003-06-14 12:18:00.000000000 -0700
++++ 25/drivers/telephony/Kconfig       2003-07-19 17:03:50.000000000 -0700
+@@ -39,7 +39,7 @@ config PHONE_IXJ
+ config PHONE_IXJ_PCMCIA
+       tristate "QuickNet Internet LineJack/PhoneJack PCMCIA support"
+-      depends on PHONE_IXJ
++      depends on PHONE_IXJ && PCMCIA
+       help
+         Say Y here to configure in PCMCIA service support for the Quicknet
+         cards manufactured by Quicknet Technologies, Inc.  This changes the
+--- linux-2.6.0-test1/drivers/usb/class/bluetty.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/class/bluetty.c     2003-07-19 17:03:50.000000000 -0700
+@@ -1320,7 +1320,8 @@ int usb_bluetooth_init(void)
+       bluetooth_tty_driver->owner = THIS_MODULE;
+       bluetooth_tty_driver->driver_name = "usb-bluetooth";
+-      bluetooth_tty_driver->name = "usb/ttub/";
++      bluetooth_tty_driver->name = "ttyUB";
++      bluetooth_tty_driver->devfs_name = "usb/ttub/";
+       bluetooth_tty_driver->major = BLUETOOTH_TTY_MAJOR;
+       bluetooth_tty_driver->minor_start = 0;
+       bluetooth_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
+--- linux-2.6.0-test1/drivers/usb/class/cdc-acm.c      2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/class/cdc-acm.c     2003-07-19 17:03:50.000000000 -0700
+@@ -765,7 +765,8 @@ static int __init acm_init(void)
+               return -ENOMEM;
+       acm_tty_driver->owner = THIS_MODULE,
+       acm_tty_driver->driver_name = "acm",
+-      acm_tty_driver->name = "usb/acm/",
++      acm_tty_driver->name = "ttyACM",
++      acm_tty_driver->devfs_name = "usb/acm/",
+       acm_tty_driver->major = ACM_TTY_MAJOR,
+       acm_tty_driver->minor_start = 0,
+       acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
+--- linux-2.6.0-test1/drivers/usb/class/usblp.c        2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/class/usblp.c       2003-07-19 17:03:50.000000000 -0700
+@@ -359,7 +359,6 @@ static int usblp_open(struct inode *inod
+       file->private_data = usblp;
+       usblp->writeurb->transfer_buffer_length = 0;
+-      usblp->writeurb->status = 0;
+       usblp->wcomplete = 1; /* we begin writeable */
+       usblp->rcomplete = 0;
+@@ -833,22 +832,15 @@ static int usblp_probe(struct usb_interf
+       init_waitqueue_head(&usblp->wait);
+       usblp->ifnum = intf->altsetting->desc.bInterfaceNumber;
+-      retval = usb_register_dev(intf, &usblp_class);
+-      if (retval) {
+-              err("Not able to get a minor for this device.");
+-              goto abort;
+-      }
+-      usblp->minor = intf->minor;
+-
+       usblp->writeurb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!usblp->writeurb) {
+               err("out of memory");
+-              goto abort_minor;
++              goto abort;
+       }
+       usblp->readurb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!usblp->readurb) {
+               err("out of memory");
+-              goto abort_minor;
++              goto abort;
+       }
+       /* Malloc device ID string buffer to the largest expected length,
+@@ -856,7 +848,7 @@ static int usblp_probe(struct usb_interf
+        * could change in length. */
+       if (!(usblp->device_id_string = kmalloc(USBLP_DEVICE_ID_SIZE, GFP_KERNEL))) {
+               err("out of memory for device_id_string");
+-              goto abort_minor;
++              goto abort;
+       }
+       usblp->writebuf = usblp->readbuf = NULL;
+@@ -868,19 +860,19 @@ static int usblp_probe(struct usb_interf
+       if (!(usblp->writebuf = usb_buffer_alloc(dev, USBLP_BUF_SIZE,
+                               GFP_KERNEL, &usblp->writeurb->transfer_dma))) {
+               err("out of memory for write buf");
+-              goto abort_minor;
++              goto abort;
+       }
+       if (!(usblp->readbuf = usb_buffer_alloc(dev, USBLP_BUF_SIZE,
+                               GFP_KERNEL, &usblp->readurb->transfer_dma))) {
+               err("out of memory for read buf");
+-              goto abort_minor;
++              goto abort;
+       }
+       /* Allocate buffer for printer status */
+       usblp->statusbuf = kmalloc(STATUS_BUF_SIZE, GFP_KERNEL);
+       if (!usblp->statusbuf) {
+               err("out of memory for statusbuf");
+-              goto abort_minor;
++              goto abort;
+       }
+       /* Lookup quirks for this printer. */
+@@ -894,12 +886,12 @@ static int usblp_probe(struct usb_interf
+               dbg("incompatible printer-class device 0x%4.4X/0x%4.4X",
+                       dev->descriptor.idVendor,
+                       dev->descriptor.idProduct);
+-              goto abort_minor;
++              goto abort;
+       }
+       /* Setup the selected alternate setting and endpoints. */
+       if (usblp_set_protocol(usblp, protocol) < 0)
+-              goto abort_minor;
++              goto abort;
+       /* Retrieve and store the device ID string. */
+       usblp_cache_device_id_string(usblp);
+@@ -920,10 +912,17 @@ static int usblp_probe(struct usb_interf
+       usblp->present = 1;
++      retval = usb_register_dev(intf, &usblp_class);
++      if (retval) {
++              err("Not able to get a minor for this device.");
++              goto abort_intfdata;
++      }
++      usblp->minor = intf->minor;
++
+       return 0;
+-abort_minor:
+-      usb_deregister_dev(intf, &usblp_class);
++abort_intfdata:
++      usb_set_intfdata (intf, NULL);
+ abort:
+       if (usblp) {
+               if (usblp->writebuf)
+--- linux-2.6.0-test1/drivers/usb/core/file.c  2003-06-14 12:18:51.000000000 -0700
++++ 25/drivers/usb/core/file.c 2003-07-19 17:06:13.000000000 -0700
+@@ -93,7 +93,7 @@ static ssize_t show_dev(struct class_dev
+ {
+       struct usb_interface *intf = class_dev_to_usb_interface(class_dev);
+       dev_t dev = MKDEV(USB_MAJOR, intf->minor);
+-      return sprintf(buf, "%04x\n", dev);
++      return print_dev_t(buf, dev);
+ }
+ static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+--- linux-2.6.0-test1/drivers/usb/core/hcd.c   2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/core/hcd.c  2003-07-19 17:03:50.000000000 -0700
+@@ -1293,7 +1293,8 @@ rescan:
+       }
+       /* then kill any current requests */
+-      spin_lock_irqsave (&hcd_data_lock, flags);
++      local_irq_save (flags);
++      spin_lock (&hcd_data_lock);
+       list_for_each_entry (urb, &dev->urb_list, urb_list) {
+               int     tmp = urb->pipe;
+@@ -1311,13 +1312,13 @@ rescan:
+               if (urb->status != -EINPROGRESS)
+                       continue;
+               usb_get_urb (urb);
+-              spin_unlock_irqrestore (&hcd_data_lock, flags);
++              spin_unlock (&hcd_data_lock);
+-              spin_lock_irqsave (&urb->lock, flags);
++              spin_lock (&urb->lock);
+               tmp = urb->status;
+               if (tmp == -EINPROGRESS)
+                       urb->status = -ESHUTDOWN;
+-              spin_unlock_irqrestore (&urb->lock, flags);
++              spin_unlock (&urb->lock);
+               /* kick hcd unless it's already returning this */
+               if (tmp == -EINPROGRESS) {
+@@ -1340,7 +1341,8 @@ rescan:
+               /* list contents may have changed */
+               goto rescan;
+       }
+-      spin_unlock_irqrestore (&hcd_data_lock, flags);
++      spin_unlock (&hcd_data_lock);
++      local_irq_restore (flags);
+       /* synchronize with the hardware, so old configuration state
+        * clears out immediately (and will be freed).
+--- linux-2.6.0-test1/drivers/usb/core/hcd-pci.c       2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/core/hcd-pci.c      2003-07-19 17:03:50.000000000 -0700
+@@ -81,7 +81,7 @@ int usb_hcd_pci_probe (struct pci_dev *d
+       
+         if (!dev->irq) {
+               err ("Found HC with no IRQ.  Check BIOS/PCI %s setup!",
+-                      dev->slot_name);
++                      pci_name(dev));
+               return -ENODEV;
+         }
+       
+@@ -99,7 +99,7 @@ int usb_hcd_pci_probe (struct pci_dev *d
+                       retval = -EFAULT;
+ clean_1:
+                       release_mem_region (resource, len);
+-                      err ("init %s fail, %d", dev->slot_name, retval);
++                      err ("init %s fail, %d", pci_name(dev), retval);
+                       return retval;
+               }
+@@ -136,7 +136,7 @@ clean_2:
+                       goto clean_1;
+               } else {
+                       release_region (resource, len);
+-                      err ("init %s fail, %d", dev->slot_name, retval);
++                      err ("init %s fail, %d", pci_name(dev), retval);
+                       return retval;
+               }
+       }
+@@ -144,7 +144,7 @@ clean_2:
+       hcd->driver = driver;
+       hcd->description = driver->description;
+       hcd->pdev = dev;
+-      hcd->self.bus_name = dev->slot_name;
++      hcd->self.bus_name = pci_name(dev);
+       hcd->product_desc = dev->dev.name;
+       hcd->self.controller = &dev->dev;
+       hcd->controller = hcd->self.controller;
+@@ -279,6 +279,7 @@ EXPORT_SYMBOL (usb_hcd_pci_remove);
+ /**
+  * usb_hcd_pci_suspend - power management suspend of a PCI-based HCD
+  * @dev: USB Host Controller being suspended
++ * @state: state that the controller is going into
+  *
+  * Store this function in the HCD's struct pci_driver as suspend().
+  */
+--- linux-2.6.0-test1/drivers/usb/core/usb.c   2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/core/usb.c  2003-07-19 17:03:50.000000000 -0700
+@@ -80,6 +80,23 @@ static struct device_driver usb_generic_
+ static int usb_generic_driver_data;
++/* deallocate hcd/hardware state ... and nuke all pending urbs */
++static void nuke_urbs(struct usb_device *dev)
++{
++      void (*disable)(struct usb_device *, int);
++      int i;
++
++      if (!dev || !dev->bus || !dev->bus->op || !dev->bus->op->disable)
++              return;
++      dbg("nuking urbs assigned to %s", dev->dev.bus_id);
++
++      disable = dev->bus->op->disable;
++      for (i = 0; i < 15; i++) {
++              disable(dev, i);
++              disable(dev, USB_DIR_IN | i);
++      }
++}
++
+ /* needs to be called with BKL held */
+ int usb_device_probe(struct device *dev)
+ {
+@@ -116,6 +133,9 @@ int usb_device_remove(struct device *dev
+       down(&driver->serialize);
++      /* release all urbs for this device */
++      nuke_urbs(interface_to_usbdev(intf));
++
+       if (intf->driver && intf->driver->disconnect)
+               intf->driver->disconnect(intf);
+@@ -896,6 +916,9 @@ void usb_disconnect(struct usb_device **
+                       usb_disconnect(child);
+       }
++      /* deallocate hcd/hardware state ... and nuke all pending urbs */
++      nuke_urbs(dev);
++
+       /* disconnect() drivers from interfaces (a key side effect) */
+       dev_dbg (&dev->dev, "unregistering interfaces\n");
+       if (dev->actconfig) {
+@@ -908,16 +931,6 @@ void usb_disconnect(struct usb_device **
+               }
+       }
+-      /* deallocate hcd/hardware state */
+-      if (ops->disable) {
+-              void    (*disable)(struct usb_device *, int) = ops->disable;
+-
+-              for (i = 0; i < 15; i++) {
+-                      disable (dev, i);
+-                      disable (dev, USB_DIR_IN | i);
+-              }
+-      }
+-
+       dev_dbg (&dev->dev, "unregistering device\n");
+       /* Free the device number and remove the /proc/bus/usb entry */
+       if (dev->devnum > 0) {
+--- linux-2.6.0-test1/drivers/usb/gadget/ether.c       2003-06-14 12:18:35.000000000 -0700
++++ 25/drivers/usb/gadget/ether.c      2003-07-19 17:03:50.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * ether.c -- CDC 1.1 Ethernet gadget driver
++ * ether.c -- Ethernet gadget driver, with CDC and non-CDC options
+  *
+  * Copyright (C) 2003 David Brownell
+  *
+@@ -58,21 +58,23 @@
+ /*-------------------------------------------------------------------------*/
+ /*
+- * "Communications Device Class" (CDC) Ethernet class driver
++ * Ethernet gadget driver -- with CDC and non-CDC options
+  *
+  * CDC Ethernet is the standard USB solution for sending Ethernet frames
+  * using USB.  Real hardware tends to use the same framing protocol but look
+  * different for control features.  And Microsoft pushes their own approach
+  * (RNDIS) instead of the standard.
++ *
++ * There's some hardware that can't talk CDC.  We make that hardware
++ * implement a "minimalist" vendor-agnostic CDC core:  same framing, but
++ * link-level setup only requires activating the configuration.
+  */
+-#define DRIVER_DESC           "CDC Ethernet Gadget"
+-#define DRIVER_VERSION                "29 April 2003"
++#define DRIVER_DESC           "Ethernet Gadget"
++#define DRIVER_VERSION                "Bastille Day 2003"
+ static const char shortname [] = "ether";
+ static const char driver_desc [] = DRIVER_DESC;
+-static const char control_name [] = "Communications Control";
+-static const char data_name [] = "CDC Ethernet Data";
+ #define MIN_PACKET    sizeof(struct ethhdr)
+ #define       MAX_PACKET      ETH_DATA_LEN    /* biggest packet we'll rx/tx */
+@@ -92,8 +94,7 @@ struct eth_dev {
+       const struct usb_endpoint_descriptor
+                               *in, *out, *status;
+-      struct semaphore        mutex;
+-      struct net_device       net;
++      struct net_device       *net;
+       struct net_device_stats stats;
+       atomic_t                tx_qlen;
+@@ -112,7 +113,7 @@ struct eth_dev {
+ static unsigned qmult = 4;
+-#define HS_FACTOR     15
++#define HS_FACTOR     5
+ #define qlen(gadget) \
+       (qmult*((gadget->speed == USB_SPEED_HIGH) ? HS_FACTOR : 1))
+@@ -128,7 +129,7 @@ module_param (qmult, uint, S_IRUGO|S_IWU
+ /* Thanks to NetChip Technologies for donating this product ID.
+  *
+- * DO NOT REUSE THESE IDs with any other driver!!  Ever!!
++ * DO NOT REUSE THESE IDs with a protocol-incompatible driver!!  Ever!!
+  * Instead:  allocate your own, using normal USB-IF procedures.
+  */
+ #define DRIVER_VENDOR_NUM     0x0525          /* NetChip */
+@@ -158,6 +159,11 @@ module_param (qmult, uint, S_IRUGO|S_IWU
+  * for some reason doesn't handle full speed bulk maxpacket of 64.
+  */
++#define DEV_CONFIG_VALUE      3       /* some hardware cares */
++
++/* #undef on hardware that can't implement CDC */
++#define       DEV_CONFIG_CDC
++
+ /*
+  * NetChip 2280, PCI based.
+  *
+@@ -172,7 +178,7 @@ module_param (qmult, uint, S_IRUGO|S_IWU
+ #define DRIVER_VERSION_NUM    0x0101
+ #define EP0_MAXPACKET         64
+ static const char EP_OUT_NAME [] = "ep-a";
+-#define EP_OUT_NUM    2
++#define EP_OUT_NUM    1
+ static const char EP_IN_NAME [] = "ep-b";
+ #define EP_IN_NUM     2
+ static const char EP_STATUS_NAME [] = "ep-f";
+@@ -194,22 +200,21 @@ static inline void hw_optimize (struct u
+ #endif
+ /*
+- * PXA-250 UDC:  widely used in second gen Linux-capable PDAs.
++ * PXA-2xx UDC:  widely used in second gen Linux-capable ARM PDAs
++ * and other products.
+  *
+- * no limitations except from set_interface: docs say "no" to a third
+- * interface. and the interrupt-only endpoints don't toggle, so we'll
+- * just use a bulk-capable one instead.
++ * multiple interfaces (or altsettings) aren't usable.  so this hardware
++ * can't implement CDC, which needs both capabilities.
+  */
+-#ifdef        CONFIG_USB_ETH_PXA250
+-#define CHIP                  "pxa250"
++#ifdef        CONFIG_USB_ETH_PXA2XX
++#undef        DEV_CONFIG_CDC
++#define CHIP                  "pxa2xx"
+ #define DRIVER_VERSION_NUM    0x0103
+ #define EP0_MAXPACKET         16
+-static const char EP_OUT_NAME [] = "ep12out-bulk";
+-#define EP_OUT_NUM    12
+-static const char EP_IN_NAME [] = "ep11in-bulk";
+-#define EP_IN_NUM     11
+-static const char EP_STATUS_NAME [] = "ep6in-bulk";
+-#define EP_STATUS_NUM 6
++static const char EP_OUT_NAME [] = "ep2out-bulk";
++#define EP_OUT_NUM    2
++static const char EP_IN_NAME [] = "ep1in-bulk";
++#define EP_IN_NUM     1
+ /* doesn't support bus-powered operation */
+ #define SELFPOWER USB_CONFIG_ATT_SELFPOWER
+ /* supports remote wakeup, but this driver doesn't */
+@@ -247,6 +252,29 @@ static const char EP_IN_NAME [] = "ep2in
+ #     error Configure some USB peripheral controller driver!
+ #endif
++/* We normally expect hardware that can talk CDC.  That involves
++ * using multiple interfaces and altsettings, and maybe a status
++ * interrupt.  Driver binding to be done according to USB-IF class,
++ * though you can use different VENDOR and PRODUCT numbers if you
++ * want (and they're officially assigned).
++ * 
++ * For hardware that can't talk CDC, we use the same vendor ID that
++ * ARM Linux has used for ethernet-over-usb, both with sa1100 and
++ * with pxa250.  We're protocol-compatible, if the host-side drivers
++ * use the endpoint descriptors.  DRIVER_VERSION_NUM is nonzero, so
++ * drivers that need to hard-wire endpoint numbers have a hook.
++ */
++#ifdef        DEV_CONFIG_CDC
++#define       DEV_CONFIG_CLASS        USB_CLASS_COMM
++#else 
++#define       DEV_CONFIG_CLASS        USB_CLASS_VENDOR_SPEC
++#undef        EP_STATUS_NUM
++#undef        DRIVER_VENDOR_NUM
++#undef        DRIVER_PRODUCT_NUM
++#define       DRIVER_VENDOR_NUM       0x049f
++#define       DRIVER_PRODUCT_NUM      0x505a
++#endif /* CONFIG_CDC_ETHER */
++
+ /* power usage is config specific.
+  * hardware that supports remote wakeup defaults to disabling it.
+  */
+@@ -274,7 +302,8 @@ static const char EP_IN_NAME [] = "ep2in
+ /*-------------------------------------------------------------------------*/
+ #define xprintk(d,level,fmt,args...) \
+-      dev_printk(level , &(d)->gadget->dev , fmt , ## args)
++      printk(level "%s %s: " fmt , shortname , (d)->gadget->dev.bus_id , \
++              ## args)
+ #ifdef DEBUG
+ #undef DEBUG
+@@ -309,7 +338,7 @@ static const char EP_IN_NAME [] = "ep2in
+ /*
+  * DESCRIPTORS ... most are static, but strings and (full) configuration
+  * descriptors are built on demand.  Notice how most of the cdc descriptors
+- * add no value to simple (typical) configurations.
++ * aren't needed in the "minimalist" mode.
+  */
+ #define STRING_MANUFACTURER           1
+@@ -323,15 +352,14 @@ static const char EP_IN_NAME [] = "ep2in
+ /*
+  * This device advertises one configuration.
+  */
+-#define       CONFIG_CDC_ETHER        3
+-
+ static const struct usb_device_descriptor
+ device_desc = {
+       .bLength =              sizeof device_desc,
+       .bDescriptorType =      USB_DT_DEVICE,
+       .bcdUSB =               __constant_cpu_to_le16 (0x0200),
+-      .bDeviceClass =         USB_CLASS_COMM,
++
++      .bDeviceClass =         DEV_CONFIG_CLASS,
+       .bDeviceSubClass =      0,
+       .bDeviceProtocol =      0,
+       .bMaxPacketSize0 =      EP0_MAXPACKET,
+@@ -350,13 +378,26 @@ eth_config = {
+       .bDescriptorType =      USB_DT_CONFIG,
+       /* compute wTotalLength on the fly */
++#ifdef        DEV_CONFIG_CDC
+       .bNumInterfaces =       2,
+-      .bConfigurationValue =  CONFIG_CDC_ETHER,
++#else
++      .bNumInterfaces =       1,
++#endif
++      .bConfigurationValue =  DEV_CONFIG_VALUE,
+       .iConfiguration =       STRING_PRODUCT,
+       .bmAttributes =         USB_CONFIG_ATT_ONE | SELFPOWER | WAKEUP,
+       .bMaxPower =            (MAX_USB_POWER + 1) / 2,
+ };
++#ifdef        DEV_CONFIG_CDC
++
++/*
++ * Compared to the "minimalist" non-CDC model, the CDC model adds
++ * three class descriptors, two interface descrioptors, and a status
++ * endpoint.  Both have a "data" interface and two bulk endpoints.
++ * There are also differences in how control requests are handled.
++ */
++
+ /* master comm interface optionally has a status notification endpoint */
+ static const struct usb_interface_descriptor
+@@ -446,7 +487,7 @@ static const struct ether_desc ether_des
+  * some drivers (like current Linux cdc-ether!) "need" it to exist even
+  * if they ignore the connect/disconnect notifications that real aether
+  * can provide.  more advanced cdc configurations might want to support
+- * encapsulated commands.
++ * encapsulated commands (vendor-specific, using control-OUT).
+  */
+  
+ #define LOG2_STATUS_INTERVAL_MSEC     6
+@@ -494,6 +535,29 @@ data_intf = {
+       .bInterfaceProtocol =   0,
+       .iInterface =           STRING_DATA,
+ };
++#else
++
++/*
++ * "Minimalist" non-CDC option is a simple vendor-neutral model that most
++ * full speed controllers can handle:  one interface, two bulk endpoints.
++ */
++
++static const struct usb_interface_descriptor
++data_intf = {
++      .bLength =              sizeof data_intf,
++      .bDescriptorType =      USB_DT_INTERFACE,
++
++      .bInterfaceNumber =     0,
++      .bAlternateSetting =    0,
++      .bNumEndpoints =        2,
++      .bInterfaceClass =      USB_CLASS_VENDOR_SPEC,
++      .bInterfaceSubClass =   0,
++      .bInterfaceProtocol =   0,
++      .iInterface =           STRING_DATA,
++};
++
++#endif        /* DEV_CONFIG_CDC */
++
+ static const struct usb_endpoint_descriptor
+ fs_source_desc = {
+@@ -563,12 +627,12 @@ dev_qualifier = {
+       .bDescriptorType =      USB_DT_DEVICE_QUALIFIER,
+       .bcdUSB =               __constant_cpu_to_le16 (0x0200),
+-      .bDeviceClass =         USB_CLASS_VENDOR_SPEC,
++      .bDeviceClass =         DEV_CONFIG_CLASS,
+       /* assumes ep0 uses the same value for both speeds ... */
+       .bMaxPacketSize0 =      EP0_MAXPACKET,
+-      .bNumConfigurations =   2,
++      .bNumConfigurations =   1,
+ };
+ /* maxpacket and other transfer characteristics vary by speed. */
+@@ -581,16 +645,24 @@ dev_qualifier = {
+ #endif        /* !HIGHSPEED */
++/*-------------------------------------------------------------------------*/
++
++/* descriptors that are built on-demand */
++
++#ifdef        DEV_CONFIG_CDC
+ /* address that the host will use ... usually assigned at random */
+ static char                           ethaddr [2 * ETH_ALEN + 1];
++#endif
+ /* static strings, in iso 8859/1 */
+ static struct usb_string              strings [] = {
+       { STRING_MANUFACTURER,  UTS_SYSNAME " " UTS_RELEASE "/" CHIP, },
+       { STRING_PRODUCT,       driver_desc, },
++#ifdef        DEV_CONFIG_CDC
+       { STRING_ETHADDR,       ethaddr, },
+-      { STRING_CONTROL,       control_name, },
+-      { STRING_DATA,          data_name, },
++      { STRING_CONTROL,       "CDC Communications Control", },
++#endif
++      { STRING_DATA,          "Ethernet Data", },
+       {  }            /* end of list */
+ };
+@@ -607,14 +679,18 @@ static int
+ config_buf (enum usb_device_speed speed, u8 *buf, u8 type, unsigned index)
+ {
+       const unsigned  config_len = USB_DT_CONFIG_SIZE
+-                              + 3 * USB_DT_INTERFACE_SIZE
++#ifdef DEV_CONFIG_CDC
++                              + 2 * USB_DT_INTERFACE_SIZE
+                               + sizeof header_desc
+                               + sizeof union_desc
+                               + sizeof ether_desc
+ #ifdef        EP_STATUS_NUM
+                               + USB_DT_ENDPOINT_SIZE
+ #endif
++#endif /* DEV_CONFIG_CDC */
++                              + USB_DT_INTERFACE_SIZE
+                               + 2 * USB_DT_ENDPOINT_SIZE;
++
+ #ifdef HIGHSPEED
+       int             hs;
+ #endif
+@@ -636,6 +712,7 @@ config_buf (enum usb_device_speed speed,
+               hs = !hs;
+ #endif
++#ifdef DEV_CONFIG_CDC
+       /* control interface, class descriptors, optional status endpoint */
+       memcpy (buf, &control_intf, USB_DT_INTERFACE_SIZE);
+       buf += USB_DT_INTERFACE_SIZE;
+@@ -660,6 +737,7 @@ config_buf (enum usb_device_speed speed,
+       /* default data altsetting has no endpoints */
+       memcpy (buf, &data_nop_intf, USB_DT_INTERFACE_SIZE);
+       buf += USB_DT_INTERFACE_SIZE;
++#endif /* DEV_CONFIG_CDC */
+       /* the "real" data interface has two endpoints */
+       memcpy (buf, &data_intf, USB_DT_INTERFACE_SIZE);
+@@ -684,6 +762,8 @@ config_buf (enum usb_device_speed speed,
+ /*-------------------------------------------------------------------------*/
++static void eth_start (struct eth_dev *dev, int gfp_flags);
++
+ static int
+ set_ether_config (struct eth_dev *dev, int gfp_flags)
+ {
+@@ -694,7 +774,8 @@ set_ether_config (struct eth_dev *dev, i
+       gadget_for_each_ep (ep, gadget) {
+               const struct usb_endpoint_descriptor    *d;
+-              /* NOTE:  the host isn't allowed to use these two data
++#ifdef        DEV_CONFIG_CDC
++              /* With CDC,  the host isn't allowed to use these two data
+                * endpoints in the default altsetting for the interface.
+                * so we don't activate them yet.
+                */
+@@ -714,10 +795,11 @@ set_ether_config (struct eth_dev *dev, i
+                       dev->out_ep = ep;
+                       dev->out = d;
+                       continue;
++              }
+ #ifdef        EP_STATUS_NUM
+               /* optional status/notification endpoint */
+-              } else if (strcmp (ep->name, EP_STATUS_NAME) == 0) {
++              else if (strcmp (ep->name, EP_STATUS_NAME) == 0) {
+                       d = ep_desc (gadget, &hs_status_desc, &fs_status_desc);
+                       result = usb_ep_enable (ep, d);
+                       if (result == 0) {
+@@ -726,16 +808,57 @@ set_ether_config (struct eth_dev *dev, i
+                               dev->status = d;
+                               continue;
+                       }
++              }
+ #endif
++#else /* !CONFIG_CDC_ETHER */
++
++              /* non-CDC is simpler:  if the device is there,
++               * it's live with rx and tx endpoints.
++               */
++              /* one endpoint writes data back IN to the host */
++              if (strcmp (ep->name, EP_IN_NAME) == 0) {
++                      d = ep_desc (gadget, &hs_source_desc, &fs_source_desc);
++                      result = usb_ep_enable (ep, d);
++                      if (result == 0) {
++                              ep->driver_data = dev;
++                              dev->in_ep = ep;
++                              dev->in = d;
++                              continue;
++                      }
++
++              /* one endpoint just reads OUT packets */
++              } else if (strcmp (ep->name, EP_OUT_NAME) == 0) {
++                      d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc);
++                      result = usb_ep_enable (ep, d);
++                      if (result == 0) {
++                              ep->driver_data = dev;
++                              dev->out_ep = ep;
++                              dev->out = d;
++                              continue;
++                      }
++              }
++
++#endif /* !CONFIG_CDC_ETHER */
++
+               /* ignore any other endpoints */
+-              } else
++              else
+                       continue;
+               /* stop on error */
+               ERROR (dev, "can't enable %s, result %d\n", ep->name, result);
+               break;
+       }
++      if (!result && (!dev->in_ep || !dev->out_ep))
++              result = -ENODEV;
++
++#ifndef       DEV_CONFIG_CDC
++      if (result == 0) {
++              netif_carrier_on (dev->net);
++              if (netif_running (dev->net))
++                      eth_start (dev, GFP_ATOMIC);
++      }
++#endif /* !CONFIG_CDC_ETHER */
+       if (result == 0)
+               DEBUG (dev, "qlen %d\n", qlen (gadget));
+@@ -751,8 +874,8 @@ static void eth_reset_config (struct eth
+       DEBUG (dev, "%s\n", __FUNCTION__);
+-      netif_stop_queue (&dev->net);
+-      netif_carrier_off (&dev->net);
++      netif_stop_queue (dev->net);
++      netif_carrier_off (dev->net);
+       /* just disable endpoints, forcing completion of pending i/o.
+        * all our completion handlers free their requests in this case.
+@@ -797,7 +920,7 @@ eth_set_config (struct eth_dev *dev, uns
+       hw_optimize (gadget);
+       switch (number) {
+-      case CONFIG_CDC_ETHER:
++      case DEV_CONFIG_VALUE:
+               result = set_ether_config (dev, gfp_flags);
+               break;
+       default:
+@@ -807,8 +930,6 @@ eth_set_config (struct eth_dev *dev, uns
+               return result;
+       }
+-      if (!result && (!dev->in_ep || !dev->out_ep))
+-              result = -ENODEV;
+       if (result)
+               eth_reset_config (dev);
+       else {
+@@ -896,6 +1017,7 @@ static void issue_start_status (struct e
+        * FIXME ugly idiom, maybe we'd be better with just
+        * a "cancel the whole queue" primitive since any
+        * unlink-one primitive has way too many error modes.
++       * here, we "know" toggle is already clear...
+        */
+       usb_ep_disable (dev->status_ep);
+       usb_ep_enable (dev->status_ep, dev->status);
+@@ -953,8 +1075,6 @@ static void eth_setup_complete (struct u
+  */
+ #define CDC_SET_ETHERNET_PACKET_FILTER        0x43    /* required */
+-static void eth_start (struct eth_dev *dev, int gfp_flags);
+-
+ /*
+  * The setup() callback implements all the ep0 functionality that's not
+  * handled lower down.  CDC has a number of less-common features:
+@@ -1018,6 +1138,17 @@ eth_setup (struct usb_gadget *gadget, co
+               value = eth_set_config (dev, ctrl->wValue, GFP_ATOMIC);
+               spin_unlock (&dev->lock);
+               break;
++#ifdef        CONFIG_USB_ETH_PXA2XX
++      /* PXA UDC prevents us from using SET_INTERFACE in normal ways.
++       * And it hides GET_CONFIGURATION and GET_INTERFACE too.
++       */
++      case USB_REQ_SET_INTERFACE:
++              spin_lock (&dev->lock);
++              value = eth_set_config (dev, DEV_CONFIG_VALUE, GFP_ATOMIC);
++              spin_unlock (&dev->lock);
++              break;
++
++#else /* hardware that that stays out of our way */
+       case USB_REQ_GET_CONFIGURATION:
+               if (ctrl->bRequestType != USB_DIR_IN)
+                       break;
+@@ -1056,15 +1187,15 @@ eth_setup (struct usb_gadget *gadget, co
+                       if (ctrl->wValue == 1) {
+                               usb_ep_enable (dev->in_ep, dev->in);
+                               usb_ep_enable (dev->out_ep, dev->out);
+-                              netif_carrier_on (&dev->net);
++                              netif_carrier_on (dev->net);
+ #ifdef        EP_STATUS_NUM
+                               issue_start_status (dev);
+ #endif
+-                              if (netif_running (&dev->net))
++                              if (netif_running (dev->net))
+                                       eth_start (dev, GFP_ATOMIC);
+                       } else {
+-                              netif_stop_queue (&dev->net);
+-                              netif_carrier_off (&dev->net);
++                              netif_stop_queue (dev->net);
++                              netif_carrier_off (dev->net);
+                       }
+                       value = 0;
+                       break;
+@@ -1079,12 +1210,14 @@ eth_setup (struct usb_gadget *gadget, co
+               /* if carrier is on, data interface is active. */
+               *(u8 *)req->buf =
+-                      ((ctrl->wIndex == 1) && netif_carrier_ok (&dev->net))
++                      ((ctrl->wIndex == 1) && netif_carrier_ok (dev->net))
+                               ? 1
+                               : 0,
+               value = min (ctrl->wLength, (u16) 1);
+               break;
++#endif
++#ifdef DEV_CONFIG_CDC
+       case CDC_SET_ETHERNET_PACKET_FILTER:
+               /* see 6.2.30: no data, wIndex = interface,
+                * wValue = packet filter bitmap
+@@ -1099,6 +1232,7 @@ eth_setup (struct usb_gadget *gadget, co
+                */
+               value = 0;
+               break;
++#endif /* DEV_CONFIG_CDC */
+       default:
+               VDEBUG (dev,
+@@ -1129,8 +1263,8 @@ eth_disconnect (struct usb_gadget *gadge
+       unsigned long           flags;
+       spin_lock_irqsave (&dev->lock, flags);
+-      netif_stop_queue (&dev->net);
+-      netif_carrier_off (&dev->net);
++      netif_stop_queue (dev->net);
++      netif_carrier_off (dev->net);
+       eth_reset_config (dev);
+       spin_unlock_irqrestore (&dev->lock, flags);
+@@ -1175,10 +1309,10 @@ static int eth_ethtool_ioctl (struct net
+               memset (&info, 0, sizeof info);
+               info.cmd = ETHTOOL_GDRVINFO;
+-              strncpy (info.driver, shortname, sizeof info.driver);
+-              strncpy (info.version, DRIVER_VERSION, sizeof info.version);
+-              strncpy (info.fw_version, CHIP, sizeof info.fw_version);
+-              strncpy (info.bus_info, dev->gadget->dev.bus_id,
++              strlcpy (info.driver, shortname, sizeof info.driver);
++              strlcpy (info.version, DRIVER_VERSION, sizeof info.version);
++              strlcpy (info.fw_version, CHIP, sizeof info.fw_version);
++              strlcpy (info.bus_info, dev->gadget->dev.bus_id,
+                       sizeof info.bus_info);
+               if (copy_to_user (useraddr, &info, sizeof (info)))
+                       return -EFAULT;
+@@ -1227,7 +1361,7 @@ rx_submit (struct eth_dev *dev, struct u
+       int                     retval = 0;
+       size_t                  size;
+-      size = (sizeof (struct ethhdr) + dev->net.mtu + RX_EXTRA);
++      size = (sizeof (struct ethhdr) + dev->net->mtu + RX_EXTRA);
+       if ((skb = alloc_skb (size, gfp_flags)) == 0) {
+               DEBUG (dev, "no rx skb\n");
+@@ -1241,16 +1375,9 @@ rx_submit (struct eth_dev *dev, struct u
+       req->complete = rx_complete;
+       req->context = skb;
+-      if (netif_running (&dev->net)) {
+-              retval = usb_ep_queue (dev->out_ep, req, gfp_flags);
+-              if (retval == -ENOMEM)
+-                      defer_kevent (dev, WORK_RX_MEMORY);
+-              if (retval)
+-                      DEBUG (dev, "%s %d\n", __FUNCTION__, retval);
+-      } else {
+-              DEBUG (dev, "%s stopped\n", __FUNCTION__);
+-              retval = -ENOLINK;
+-      }
++      retval = usb_ep_queue (dev->out_ep, req, gfp_flags);
++      if (retval == -ENOMEM)
++              defer_kevent (dev, WORK_RX_MEMORY);
+       if (retval) {
+               DEBUG (dev, "rx submit --> %d\n", retval);
+               dev_kfree_skb_any (skb);
+@@ -1278,8 +1405,8 @@ static void rx_complete (struct usb_ep *
+                       break;
+               }
+-              skb->dev = &dev->net;
+-              skb->protocol = eth_type_trans (skb, &dev->net);
++              skb->dev = dev->net;
++              skb->protocol = eth_type_trans (skb, dev->net);
+               dev->stats.rx_packets++;
+               dev->stats.rx_bytes += skb->len;
+@@ -1294,9 +1421,7 @@ static void rx_complete (struct usb_ep *
+       case -ECONNRESET:               // unlink
+       case -ESHUTDOWN:                // disconnect etc
+               VDEBUG (dev, "rx shutdown, code %d\n", status);
+-              usb_ep_free_request (dev->out_ep, req);
+-              req = 0;
+-              break;
++              goto clean;
+       /* data overrun */
+       case -EOVERFLOW:
+@@ -1311,7 +1436,11 @@ static void rx_complete (struct usb_ep *
+       if (skb)
+               dev_kfree_skb_any (skb);
+-
++      if (!netif_running (dev->net)) {
++clean:
++              usb_ep_free_request (dev->out_ep, req);
++              req = 0;
++      }
+       if (req)
+               rx_submit (dev, req, GFP_ATOMIC);
+ }
+@@ -1323,7 +1452,7 @@ static void eth_work (void *_dev)
+       if (test_bit (WORK_RX_MEMORY, &dev->todo)) {
+               struct usb_request      *req = 0;
+-              if (netif_running (&dev->net))
++              if (netif_running (dev->net))
+                       req = usb_ep_alloc_request (dev->in_ep, GFP_KERNEL);
+               else
+                       clear_bit (WORK_RX_MEMORY, &dev->todo);
+@@ -1342,18 +1471,25 @@ static void tx_complete (struct usb_ep *
+       struct sk_buff  *skb = req->context;
+       struct eth_dev  *dev = ep->driver_data;
+-      if (req->status)
++      switch (req->status) {
++      default:
+               dev->stats.tx_errors++;
+-      else
++              VDEBUG (dev, "tx err %d\n", req->status);
++              /* FALLTHROUGH */
++      case -ECONNRESET:               // unlink
++      case -ESHUTDOWN:                // disconnect etc
++              break;
++      case 0:
+               dev->stats.tx_bytes += skb->len;
++      }
+       dev->stats.tx_packets++;
+       usb_ep_free_request (ep, req);
+       dev_kfree_skb_any (skb);
+       atomic_inc (&dev->tx_qlen);
+-      if (netif_carrier_ok (&dev->net))
+-              netif_wake_queue (&dev->net);
++      if (netif_carrier_ok (dev->net))
++              netif_wake_queue (dev->net);
+ }
+ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net)
+@@ -1437,7 +1573,7 @@ static void eth_start (struct eth_dev *d
+       /* and open the tx floodgates */ 
+       atomic_set (&dev->tx_qlen, size);
+-      netif_wake_queue (&dev->net);
++      netif_wake_queue (dev->net);
+ }
+ static int eth_open (struct net_device *net)
+@@ -1445,10 +1581,8 @@ static int eth_open (struct net_device *
+       struct eth_dev          *dev = (struct eth_dev *) net->priv;
+       DEBUG (dev, "%s\n", __FUNCTION__);
+-      down (&dev->mutex);
+-      if (netif_carrier_ok (&dev->net))
++      if (netif_carrier_ok (dev->net))
+               eth_start (dev, GFP_KERNEL);
+-      up (&dev->mutex);
+       return 0;
+ }
+@@ -1457,7 +1591,6 @@ static int eth_stop (struct net_device *
+       struct eth_dev          *dev = (struct eth_dev *) net->priv;
+       DEBUG (dev, "%s\n", __FUNCTION__);
+-      down (&dev->mutex);
+       netif_stop_queue (net);
+       DEBUG (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n",
+@@ -1469,7 +1602,7 @@ static int eth_stop (struct net_device *
+       if (dev->gadget->speed != USB_SPEED_UNKNOWN) {
+               usb_ep_disable (dev->in_ep);
+               usb_ep_disable (dev->out_ep);
+-              if (netif_carrier_ok (&dev->net)) {
++              if (netif_carrier_ok (dev->net)) {
+                       DEBUG (dev, "host still using in/out endpoints\n");
+                       usb_ep_enable (dev->in_ep, dev->in);
+                       usb_ep_enable (dev->out_ep, dev->out);
+@@ -1480,7 +1613,6 @@ static int eth_stop (struct net_device *
+ #endif
+       }
+-      up (&dev->mutex);
+       return 0;
+ }
+@@ -1492,7 +1624,6 @@ eth_unbind (struct usb_gadget *gadget)
+       struct eth_dev          *dev = get_gadget_data (gadget);
+       DEBUG (dev, "unbind\n");
+-      down (&dev->mutex);
+       /* we've already been disconnected ... no i/o is active */
+       if (dev->req) {
+@@ -1500,15 +1631,13 @@ eth_unbind (struct usb_gadget *gadget)
+                               dev->req->buf, dev->req->dma,
+                               USB_BUFSIZ);
+               usb_ep_free_request (gadget->ep0, dev->req);
++              dev->req = 0;
+       }
+-      unregister_netdev (&dev->net);
+-      up (&dev->mutex);
++      unregister_netdev (dev->net);
+       /* assuming we used keventd, it must quiesce too */
+       flush_scheduled_work ();
+-
+-      kfree (dev);
+       set_gadget_data (gadget, 0);
+ }
+@@ -1517,22 +1646,24 @@ eth_bind (struct usb_gadget *gadget)
+ {
+       struct eth_dev          *dev;
+       struct net_device       *net;
++      int                     status = -ENOMEM;
++#ifdef        DEV_CONFIG_CDC
+       u8                      node_id [ETH_ALEN];
+       /* just one upstream link at a time */
+       if (ethaddr [0] != 0)
+               return -ENODEV;
++#endif
+-      dev = kmalloc (sizeof *dev, SLAB_KERNEL);
+-      if (!dev)
+-              return -ENOMEM;
+-      memset (dev, 0, sizeof *dev);
++      net = alloc_etherdev (sizeof *dev);
++      if (!net)
++              return status;
++      dev = net->priv;
+       spin_lock_init (&dev->lock);
+-      init_MUTEX_LOCKED (&dev->mutex);
+       INIT_WORK (&dev->work, eth_work, dev);
+       /* network device setup */
+-      net = &dev->net;
++      dev->net = net;
+       SET_MODULE_OWNER (net);
+       net->priv = dev;
+       strcpy (net->name, "usb%d");
+@@ -1545,6 +1676,7 @@ eth_bind (struct usb_gadget *gadget)
+       net->dev_addr [0] &= 0xfe;      // clear multicast bit
+       net->dev_addr [0] |= 0x02;      // set local assignment bit (IEEE802)
++#ifdef        DEV_CONFIG_CDC
+       /* ... another address for the host, on the other end of the
+        * link, gets exported through CDC (see CDC spec table 41)
+        */
+@@ -1554,6 +1686,7 @@ eth_bind (struct usb_gadget *gadget)
+       snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X",
+               node_id [0], node_id [1], node_id [2],
+               node_id [3], node_id [4], node_id [5]);
++#endif
+       net->change_mtu = eth_change_mtu;
+       net->get_stats = eth_get_stats;
+@@ -1567,36 +1700,38 @@ eth_bind (struct usb_gadget *gadget)
+       /* preallocate control response and buffer */
+       dev->req = usb_ep_alloc_request (gadget->ep0, GFP_KERNEL);
+       if (!dev->req)
+-              goto enomem;
++              goto fail;
+       dev->req->complete = eth_setup_complete;
+       dev->req->buf = usb_ep_alloc_buffer (gadget->ep0, USB_BUFSIZ,
+                               &dev->req->dma, GFP_KERNEL);
+       if (!dev->req->buf) {
+               usb_ep_free_request (gadget->ep0, dev->req);
+-              goto enomem;
++              goto fail;
+       }
+       /* finish hookup to lower layer ... */
+       dev->gadget = gadget;
+       set_gadget_data (gadget, dev);
+       gadget->ep0->driver_data = dev;
+-
++      INFO (dev, "%s, " CHIP ", version: " DRIVER_VERSION "\n", driver_desc);
++#ifdef        DEV_CONFIG_CDC
++      INFO (dev, "CDC host enet %s\n", ethaddr);
++#endif
++      
+       /* two kinds of host-initiated state changes:
+        *  - iff DATA transfer is active, carrier is "on"
+        *  - tx queueing enabled if open *and* carrier is "on"
+        */
+-      INFO (dev, "%s, host enet %s, version: " DRIVER_VERSION "\n",
+-                      driver_desc, ethaddr);
+-      register_netdev (&dev->net);
+-      netif_stop_queue (&dev->net);
+-      netif_carrier_off (&dev->net);
+-
+-      up (&dev->mutex);
+-      return 0;
++      netif_stop_queue (dev->net);
++      netif_carrier_off (dev->net);
+-enomem:
++      // SET_NETDEV_DEV (dev->net, &gadget->dev);
++      status = register_netdev (dev->net);
++      if (status == 0)
++              return status;
++fail:
+       eth_unbind (gadget);
+-      return -ENOMEM;
++      return status;
+ }
+ /*-------------------------------------------------------------------------*/
+--- linux-2.6.0-test1/drivers/usb/gadget/net2280.c     2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/gadget/net2280.c    2003-07-19 17:03:50.000000000 -0700
+@@ -2496,7 +2496,7 @@ static void net2280_remove (struct pci_d
+       device_remove_file (&pdev->dev, &dev_attr_registers);
+       pci_set_drvdata (pdev, 0);
+-      INFO (dev, "unbind from pci %s\n", pdev->slot_name);
++      INFO (dev, "unbind from pci %s\n", pci_name(pdev));
+       kfree (dev);
+       the_controller = 0;
+@@ -2518,7 +2518,7 @@ static int net2280_probe (struct pci_dev
+        * usb_gadget_driver_{register,unregister}() must change.
+        */
+       if (the_controller) {
+-              WARN (the_controller, "ignoring %s\n", pdev->slot_name);
++              WARN (the_controller, "ignoring %s\n", pci_name(pdev));
+               return -EBUSY;
+       }
+@@ -2534,7 +2534,7 @@ static int net2280_probe (struct pci_dev
+       dev->pdev = pdev;
+       dev->gadget.ops = &net2280_ops;
+-      strcpy (dev->gadget.dev.bus_id, pdev->slot_name);
++      strcpy (dev->gadget.dev.bus_id, pci_name(pdev));
+       strcpy (dev->gadget.dev.name, pdev->dev.name);
+       dev->gadget.dev.parent = &pdev->dev;
+       dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
+--- linux-2.6.0-test1/drivers/usb/gadget/net2280.h     2003-06-14 12:18:29.000000000 -0700
++++ 25/drivers/usb/gadget/net2280.h    2003-07-19 17:03:50.000000000 -0700
+@@ -654,7 +654,7 @@ static inline void net2280_led_shutdown 
+ #define xprintk(dev,level,fmt,args...) \
+       printk(level "%s %s: " fmt , driver_name , \
+-                      dev->pdev->slot_name , ## args)
++                      pci_name(dev->pdev) , ## args)
+ #ifdef DEBUG
+ #undef DEBUG
+--- linux-2.6.0-test1/drivers/usb/gadget/zero.c        2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/usb/gadget/zero.c       2003-07-19 17:03:50.000000000 -0700
+@@ -92,7 +92,7 @@
+ /*-------------------------------------------------------------------------*/
+-#define DRIVER_VERSION                "19 Feb 2003"
++#define DRIVER_VERSION                "Bastille Day 2003"
+ static const char shortname [] = "zero";
+ static const char longname [] = "Gadget Zero";
+@@ -160,18 +160,18 @@ static inline void hw_optimize (struct u
+ #endif
+ /*
+- * PXA-250 UDC:  widely used in second gen Linux-capable PDAs.
++ * PXA-2xx UDC:  widely used in second gen Linux-capable PDAs.
+  *
+  * This has fifteen fixed-function full speed endpoints, and it
+  * can support all USB transfer types.
+  *
+- * It only supports three configurations (numbered 1, 2, or 3)
+- * with two interfaces each ... there's partial hardware support
+- * for set_configuration and set_interface, preventing some more
+- * interesting config/interface/endpoint arrangements.
++ * These supports three or four configurations, with fixed numbers.
++ * The hardware interprets SET_INTERFACE, net effect is that you
++ * can't use altsettings or reset the interfaces independently.
++ * So stick to a single interface.
+  */
+-#ifdef        CONFIG_USB_ZERO_PXA250
+-#define CHIP                  "pxa250"
++#ifdef        CONFIG_USB_ZERO_PXA2XX
++#define CHIP                  "pxa2xx"
+ #define DRIVER_VERSION_NUM    0x0103
+ #define EP0_MAXPACKET         16
+ static const char EP_OUT_NAME [] = "ep12out-bulk";
+@@ -291,9 +291,12 @@ struct zero_dev {
+ static unsigned buflen = 4096;
+ static unsigned qlen = 32;
++static unsigned pattern = 0;
+ module_param (buflen, uint, S_IRUGO|S_IWUSR);
+ module_param (qlen, uint, S_IRUGO|S_IWUSR);
++module_param (pattern, uint, S_IRUGO|S_IWUSR);
++
+ /*
+  * Normally the "loopback" configuration is second (index 1) so
+@@ -497,8 +500,8 @@ static struct usb_gadget_strings   stringt
+ /*
+  * config descriptors are also handcrafted.  these must agree with code
+- * that sets configurations, and with code managing interface altsettings.
+- * other complexity may come from:
++ * that sets configurations, and with code managing interfaces and their
++ * altsettings.  other complexity may come from:
+  *
+  *  - high speed support, including "other speed config" rules
+  *  - multiple configurations
+@@ -506,7 +509,7 @@ static struct usb_gadget_strings   stringt
+  *  - embedded class or vendor-specific descriptors
+  *
+  * this handles high speed, and has a second config that could as easily
+- * have been an alternate interface setting.
++ * have been an alternate interface setting (on most hardware).
+  *
+  * NOTE:  to demonstrate (and test) more USB capabilities, this driver
+  * should include an altsetting to test interrupt transfers, including
+@@ -608,16 +611,29 @@ check_read_data (
+       struct usb_request      *req
+ )
+ {
+-      int i;
++      unsigned        i;
++      u8              *buf = req->buf;
+-      for (i = 0; i < req->actual; i++) {
+-              if (((u8 *)req->buf) [i] != 0) {
+-                      ERROR (dev, "nonzero OUT byte from host, "
+-                                      "buf [%d] = %d\n",
+-                                      i, ((u8 *)req->buf) [i]);
+-                      usb_ep_set_halt (ep);
+-                      return -EINVAL;
++      for (i = 0; i < req->actual; i++, buf++) {
++              switch (pattern) {
++              /* all-zeroes has no synchronization issues */
++              case 0:
++                      if (*buf == 0)
++                              continue;
++                      break;
++              /* mod63 stays in sync with short-terminated transfers,
++               * or otherwise when host and gadget agree on how large
++               * each usb transfer request should be.  resync is done
++               * with set_interface or set_config.
++               */
++              case 1:
++                      if (*buf == (u8)(i % 63))
++                              continue;
++                      break;
+               }
++              ERROR (dev, "bad OUT byte, buf [%d] = %d\n", i, *buf);
++              usb_ep_set_halt (ep);
++              return -EINVAL;
+       }
+       return 0;
+ }
+@@ -629,7 +645,18 @@ reinit_write_data (
+       struct usb_request      *req
+ )
+ {
+-      memset (req->buf, 0, req->length);
++      unsigned        i;
++      u8              *buf = req->buf;
++
++      switch (pattern) {
++      case 0:
++              memset (req->buf, 0, req->length);
++              break;
++      case 1:
++              for  (i = 0; i < req->length; i++)
++                      *buf++ = (u8) (i % 63);
++              break;
++      }
+ }
+ /* if there is only one request in the queue, there'll always be an
+@@ -651,10 +678,13 @@ static void source_sink_complete (struct
+               break;
+       /* this endpoint is normally active while we're configured */
++      case -ECONNABORTED:             /* hardware forced ep reset */
+       case -ECONNRESET:               /* request dequeued */
+       case -ESHUTDOWN:                /* disconnect from host */
+               VDEBUG (dev, "%s gone (%d), %d/%d\n", ep->name, status,
+                               req->actual, req->length);
++              if (ep == dev->out_ep)
++                      check_read_data (dev, ep, req);
+               free_ep_req (ep, req);
+               return;
+@@ -693,6 +723,9 @@ source_sink_start_ep (struct usb_ep *ep,
+       memset (req->buf, 0, req->length);
+       req->complete = source_sink_complete;
++      if (strcmp (ep->name, EP_IN_NAME) == 0)
++              reinit_write_data (ep->driver_data, ep, req);
++
+       status = usb_ep_queue (ep, req, gfp_flags);
+       if (status) {
+               struct zero_dev *dev = ep->driver_data;
+@@ -801,6 +834,8 @@ static void loopback_complete (struct us
+        * rely on the hardware driver to clean up on disconnect or
+        * endpoint disable.
+        */
++      case -ECONNABORTED:             /* hardware forced ep reset */
++      case -ECONNRESET:               /* request dequeued */
+       case -ESHUTDOWN:                /* disconnect from host */
+               free_ep_req (ep, req);
+               return;
+@@ -905,7 +940,7 @@ static void zero_reset_config (struct ze
+  *
+  * note that some device controller hardware will constrain what this
+  * code can do, perhaps by disallowing more than one configuration or
+- * by limiting configuration choices (like the pxa250).
++ * by limiting configuration choices (like the pxa2xx).
+  */
+ static int
+ zero_set_config (struct zero_dev *dev, unsigned number, int gfp_flags)
+@@ -1046,7 +1081,8 @@ zero_setup (struct usb_gadget *gadget, c
+               break;
+       /* until we add altsetting support, or other interfaces,
+-       * only 0/0 are possible.
++       * only 0/0 are possible.  pxa2xx only supports 0/0 (poorly)
++       * and already killed pending endpoint I/O.
+        */
+       case USB_REQ_SET_INTERFACE:
+               if (ctrl->bRequestType != USB_RECIP_INTERFACE)
+--- linux-2.6.0-test1/drivers/usb/host/ohci-hcd.c      2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/usb/host/ohci-hcd.c     2003-07-19 17:03:50.000000000 -0700
+@@ -319,6 +319,7 @@ ohci_endpoint_disable (struct usb_hcd *h
+       int                     epnum = ep & USB_ENDPOINT_NUMBER_MASK;
+       unsigned long           flags;
+       struct ed               *ed;
++      unsigned                limit = 1000;
+       /* ASSERT:  any requests/urbs are being unlinked */
+       /* ASSERT:  nobody can be submitting urbs for this any more */
+@@ -337,6 +338,8 @@ rescan:
+               ed->state = ED_IDLE;
+       switch (ed->state) {
+       case ED_UNLINK:         /* wait for hw to finish? */
++              /* major IRQ delivery trouble loses INTR_SF too... */
++              WARN_ON (limit-- == 0);
+               spin_unlock_irqrestore (&ohci->lock, flags);
+               set_current_state (TASK_UNINTERRUPTIBLE);
+               schedule_timeout (1);
+--- linux-2.6.0-test1/drivers/usb/host/ohci-q.c        2003-06-14 12:18:34.000000000 -0700
++++ 25/drivers/usb/host/ohci-q.c       2003-07-19 17:03:50.000000000 -0700
+@@ -43,6 +43,16 @@ finish_urb (struct ohci_hcd *ohci, struc
+       spin_lock (&urb->lock);
+       if (likely (urb->status == -EINPROGRESS))
+               urb->status = 0;
++      /* report short control reads right even though the data TD always
++       * has TD_R set.  (much simpler, but creates the 1-td limit.)
++       */
++      if (unlikely (urb->transfer_flags & URB_SHORT_NOT_OK)
++                      && unlikely (usb_pipecontrol (urb->pipe))
++                      && urb->actual_length < urb->transfer_buffer_length
++                      && usb_pipein (urb->pipe)
++                      && urb->status == 0) {
++              urb->status = -EREMOTEIO;
++      }
+       spin_unlock (&urb->lock);
+       // what lock protects these?
+--- linux-2.6.0-test1/drivers/usb/host/uhci-hcd.c      2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/host/uhci-hcd.c     2003-07-19 17:03:50.000000000 -0700
+@@ -2007,19 +2007,17 @@ static int suspend_allowed(struct uhci_h
+       unsigned int io_addr = uhci->io_addr;
+       int i;
+-      if (!uhci->hcd.pdev ||
+-           uhci->hcd.pdev->vendor != PCI_VENDOR_ID_INTEL ||
+-           uhci->hcd.pdev->device != PCI_DEVICE_ID_INTEL_82371AB_2)
++      if (!uhci->hcd.pdev || uhci->hcd.pdev->vendor != PCI_VENDOR_ID_INTEL)
+               return 1;
+-      /* This is a 82371AB/EB/MB USB controller which has a bug that
+-       * causes false resume indications if any port has an
+-       * over current condition.  To prevent problems, we will not
+-       * allow a global suspend if any ports are OC.
++      /* Some of Intel's USB controllers have a bug that causes false
++       * resume indications if any port has an over current condition.
++       * To prevent problems, we will not allow a global suspend if
++       * any ports are OC.
+        *
+-       * Some motherboards using the 82371AB/EB/MB (but not the USB portion)
+-       * appear to hardwire the over current inputs active to disable
+-       * the USB ports.
++       * Some motherboards using Intel's chipsets (but not using all
++       * the USB ports) appear to hardwire the over current inputs active
++       * to disable the USB ports.
+        */
+       /* check for over current condition on any port */
+--- linux-2.6.0-test1/drivers/usb/image/hpusbscsi.c    2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/image/hpusbscsi.c   2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+ #include <linux/smp_lock.h>
+ #include <linux/usb.h>
+ #include <asm/atomic.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "../../scsi/scsi.h"
+ #include "../../scsi/hosts.h"
+@@ -109,7 +109,8 @@ hpusbscsi_usb_probe(struct usb_interface
+               goto out_unlink_controlurb;
+       new->host->hostdata[0] = (unsigned long)new;
+-      scsi_add_host(new->host, &intf->dev);
++      scsi_add_host(new->host, &intf->dev); /* XXX handle failure */
++      scsi_scan_host(new->host);
+       new->sense_command[0] = REQUEST_SENSE;
+       new->sense_command[4] = HPUSBSCSI_SENSE_LENGTH;
+@@ -306,7 +307,10 @@ DEBUG("Getting status byte %d \n",hpusbs
+       if(unlikely(u->status < 0)) {
+                 if (likely(hpusbscsi->state != HP_STATE_FREE))
+                         handle_usb_error(hpusbscsi);
+-              return;
++              if (u->status == -ECONNRESET || u->status == -ENOENT || u->status == -ESHUTDOWN)
++                      return;
++              else
++                      goto resub;
+       }
+       scsi_state = hpusbscsi->scsi_state_byte;
+@@ -348,6 +352,8 @@ DEBUG("Getting status byte %d \n",hpusbs
+       TRACE_STATE;
+               break;
+       }
++resub:
++      usb_submit_urb(u, GFP_ATOMIC);
+ }
+ static void simple_command_callback(struct urb *u, struct pt_regs *regs)
+@@ -427,7 +433,7 @@ static void simple_done (struct urb *u, 
+                               hpusbscsi->state = HP_STATE_WAIT;
+                       } else {
+                               issue_request_sense(hpusbscsi);
+-                      }                       
++                      }
+               }
+       } else {
+               if (likely(hpusbscsi->scallback != NULL))
+--- linux-2.6.0-test1/drivers/usb/image/microtek.c     2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/image/microtek.c    2003-07-19 17:03:50.000000000 -0700
+@@ -134,7 +134,7 @@
+ #include <linux/proc_fs.h>
+ #include <asm/atomic.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "../../scsi/scsi.h"
+ #include "../../scsi/hosts.h"
+@@ -817,7 +817,8 @@ static int mts_usb_probe(struct usb_inte
+               goto out_free_urb;
+       new_desc->host->hostdata[0] = (unsigned long)new_desc;
+-      scsi_add_host(new_desc->host, NULL);
++      scsi_add_host(new_desc->host, NULL); /* XXX handle failure */
++      scsi_scan_host(new_desc->host);
+       usb_set_intfdata(intf, new_desc);
+       return 0;
+--- linux-2.6.0-test1/drivers/usb/image/scanner.c      2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/usb/image/scanner.c     2003-07-19 17:03:50.000000000 -0700
+@@ -364,6 +364,11 @@
+  *      Mustek, Pacific Image Electronics, Plustek, and Visioneer scanners.
+  *      Fixed names of some other scanners.
+  *
++ * 0.4.14  2003-07-15
++ *    - Fixed race between open and probe (Oliver Neukum).
++ *    - Added vendor/product ids for Avision, Canon, HP, Microtek and Relisys scanners.
++ *    - Clean up irq urb when not enough memory is available.
++ *
+  * TODO
+  *    - Performance
+  *    - Select/poll methods
+@@ -1068,6 +1073,9 @@ probe_scanner(struct usb_interface *intf
+ /* Ok, now initialize all the relevant values */
+       if (!(scn->obuf = (char *)kmalloc(OBUF_SIZE, GFP_KERNEL))) {
+               err("probe_scanner(%d): Not enough memory for the output buffer.", intf->minor);
++              if (have_intr)
++                      usb_unlink_urb(scn->scn_irq);
++              usb_free_urb(scn->scn_irq);
+               kfree(scn);
+               up(&scn_mutex);
+               return -ENOMEM;
+@@ -1076,6 +1084,9 @@ probe_scanner(struct usb_interface *intf
+       if (!(scn->ibuf = (char *)kmalloc(IBUF_SIZE, GFP_KERNEL))) {
+               err("probe_scanner(%d): Not enough memory for the input buffer.", intf->minor);
++              if (have_intr)
++                      usb_unlink_urb(scn->scn_irq);
++              usb_free_urb(scn->scn_irq);
+               kfree(scn->obuf);
+               kfree(scn);
+               up(&scn_mutex);
+@@ -1117,10 +1128,9 @@ probe_scanner(struct usb_interface *intf
+       info ("USB scanner device (0x%04x/0x%04x) now attached to %s",
+             dev->descriptor.idVendor, dev->descriptor.idProduct, name);
+-      up(&scn_mutex);
+-
+       usb_set_intfdata(intf, scn);
+-
++      up(&scn_mutex);
++      
+       return 0;
+ }
+--- linux-2.6.0-test1/drivers/usb/image/scanner.h      2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/usb/image/scanner.h     2003-07-19 17:03:50.000000000 -0700
+@@ -43,7 +43,7 @@
+ // #define DEBUG
+-#define DRIVER_VERSION "0.4.13"
++#define DRIVER_VERSION "0.4.14"
+ #define DRIVER_DESC "USB Scanner Driver"
+ #include <linux/usb.h>
+@@ -103,6 +103,7 @@ static struct usb_device_id scanner_devi
+       /* Avision */
+       { USB_DEVICE(0x0638, 0x0268) }, /* iVina 1200U */
+       { USB_DEVICE(0x0638, 0x0a10) }, /* iVina FB1600 (=Umax Astra 4500) */
++      { USB_DEVICE(0x0638, 0x0a20) }, /* iVina FB1800 (=Umax Astra 4700) */
+       /* Benq: see Acer */
+       /* Brother */
+       { USB_DEVICE(0x04f9, 0x010f) }, /* MFC 5100C */
+@@ -115,10 +116,12 @@ static struct usb_device_id scanner_devi
+       { USB_DEVICE(0x04a9, 0x2206) }, /* CanoScan N650U/N656U */
+       { USB_DEVICE(0x04a9, 0x2207) }, /* CanoScan N1220U */
+       { USB_DEVICE(0x04a9, 0x2208) }, /* CanoScan D660U */ 
++      { USB_DEVICE(0x04a9, 0x220a) }, /* CanoScan D2400UF */
+       { USB_DEVICE(0x04a9, 0x220b) }, /* CanoScan D646U */
+       { USB_DEVICE(0x04a9, 0x220c) }, /* CanoScan D1250U2 */
+       { USB_DEVICE(0x04a9, 0x220d) }, /* CanoScan N670U/N676U/LIDE 20 */
+       { USB_DEVICE(0x04a9, 0x220e) }, /* CanoScan N1240U/LIDE 30 */
++      { USB_DEVICE(0x04a9, 0x220f) }, /* CanoScan 8000F */
+       { USB_DEVICE(0x04a9, 0x2213) }, /* LIDE 50 */
+       { USB_DEVICE(0x04a9, 0x3042) }, /* FS4000US */
+       /* Colorado -- See Primax/Colorado below */
+@@ -158,6 +161,7 @@ static struct usb_device_id scanner_devi
+       { USB_DEVICE(0x03f0, 0x0901) }, /* ScanJet 2300C */
+       { USB_DEVICE(0x03F0, 0x1005) }, /* ScanJet 5400C */
+       { USB_DEVICE(0x03F0, 0x1105) }, /* ScanJet 5470C */
++      { USB_DEVICE(0x03f0, 0x1205) }, /* ScanJet 5550C */
+       { USB_DEVICE(0x03f0, 0x1305) }, /* Scanjet 4570c */
+       { USB_DEVICE(0x03f0, 0x1411) }, /* PSC 750 */
+       { USB_DEVICE(0x03f0, 0x2005) }, /* ScanJet 3570c */
+@@ -173,6 +177,7 @@ static struct usb_device_id scanner_devi
+       /* Memorex */
+       { USB_DEVICE(0x0461, 0x0346) }, /* 6136u - repackaged Primax ? */
+       /* Microtek */
++      { USB_DEVICE(0x05da, 0x20c9) }, /* ScanMaker 6700 */
+       { USB_DEVICE(0x05da, 0x30ce) }, /* ScanMaker 3800 */
+       { USB_DEVICE(0x05da, 0x30cf) }, /* ScanMaker 4800 */
+       { USB_DEVICE(0x04a7, 0x0224) }, /* Scanport 3000 (actually Visioneer?)*/
+@@ -250,6 +255,7 @@ static struct usb_device_id scanner_devi
+       { USB_DEVICE(0x06dc, 0x0014) }, /* Winscan Pro 2448U */
+       /* Relisis */
+       // { USB_DEVICE(0x0475, 0x0103) },      /* Episode - undetected endpoint */
++      { USB_DEVICE(0x0475, 0x0210) }, /* Scorpio Ultra 3 */
+       /* Seiko/Epson Corp. */
+       { USB_DEVICE(0x04b8, 0x0101) }, /* Perfection 636U and 636Photo */
+       { USB_DEVICE(0x04b8, 0x0102) }, /* GT-2200 */
+--- linux-2.6.0-test1/drivers/usb/media/dabusb.c       2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/usb/media/dabusb.c      2003-07-19 17:03:50.000000000 -0700
+@@ -721,7 +721,7 @@ static struct usb_class_driver dabusb_cl
+ /* --------------------------------------------------------------------- */
+-static int dabusb_probe (struct usb_interface *intf, 
++static int dabusb_probe (struct usb_interface *intf,
+                        const struct usb_device_id *id)
+ {
+       struct usb_device *usbdev = interface_to_usbdev(intf);
+@@ -738,9 +738,7 @@ static int dabusb_probe (struct usb_inte
+       if (intf->altsetting->desc.bInterfaceNumber != _DABUSB_IF && usbdev->descriptor.idProduct == 0x9999)
+               return -ENODEV;
+-      retval = usb_register_dev(intf, &dabusb_class);
+-      if (retval)
+-              return -ENOMEM;
++
+       s = &dabusb[intf->minor];
+@@ -766,8 +764,15 @@ static int dabusb_probe (struct usb_inte
+               }
+       }
+       dbg("bound to interface: %d", ifnum);
+-      up (&s->mutex);
+       usb_set_intfdata (intf, s);
++      up (&s->mutex);
++
++      retval = usb_register_dev(intf, &dabusb_class);
++      if (retval) {
++              usb_set_intfdata (intf, NULL);
++              return -ENOMEM;
++      }
++
+       return 0;
+       reject:
+--- linux-2.6.0-test1/drivers/usb/media/vicam.c        2003-06-26 22:07:25.000000000 -0700
++++ 25/drivers/usb/media/vicam.c       2003-07-19 17:04:54.000000000 -0700
+@@ -611,15 +611,20 @@ vicam_ioctl(struct inode *inode, struct 
+       case VIDIOCSPICT:
+               {
+-                      struct video_picture *vp = (struct video_picture *) arg;
++                      struct video_picture vp;
+-                      DBG("VIDIOCSPICT depth = %d, pal = %d\n", vp->depth,
+-                          vp->palette);
++                      if (copy_from_user(&vp, arg, sizeof (vp))) {
++                              retval = -EFAULT;
++                              break;
++                      }
+-                      cam->gain = vp->brightness >> 8;
++                      DBG("VIDIOCSPICT depth = %d, pal = %d\n", vp.depth,
++                          vp.palette);
+-                      if (vp->depth != 24
+-                          || vp->palette != VIDEO_PALETTE_RGB24)
++                      cam->gain = vp.brightness >> 8;
++
++                      if (vp.depth != 24
++                          || vp.palette != VIDEO_PALETTE_RGB24)
+                               retval = -EINVAL;
+                       break;
+@@ -652,10 +657,15 @@ vicam_ioctl(struct inode *inode, struct 
+       case VIDIOCSWIN:
+               {
+-                      struct video_window *vw = (struct video_window *) arg;
+-                      DBG("VIDIOCSWIN %d x %d\n", vw->width, vw->height);
++                      struct video_window vw;
++
++                      if (copy_from_user(&vw, arg, sizeof (vw))) {
++                              retval = -EFAULT;
++                              break;
++                      }
++                      DBG("VIDIOCSWIN %d x %d\n", vw.width, vw.height);
+-                      if ( vw->width != 320 || vw->height != 240 )
++                      if ( vw.width != 320 || vw.height != 240 )
+                               retval = -EFAULT;
+                       
+                       break;
+--- linux-2.6.0-test1/drivers/usb/misc/usblcd.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/misc/usblcd.c       2003-07-19 17:03:50.000000000 -0700
+@@ -1,4 +1,4 @@
+-/***************************************************************************** 
++/*****************************************************************************
+  *                          USBLCD Kernel Driver                             *
+  *        See http://www.usblcd.de for Hardware and Documentation.           *
+  *                            Version 1.03                                   *
+@@ -18,7 +18,7 @@
+ #include <asm/uaccess.h>
+ #include <linux/usb.h>
+-#define DRIVER_VERSION "USBLCD Driver Version 1.03"
++#define DRIVER_VERSION "USBLCD Driver Version 1.04"
+ #define USBLCD_MINOR          144
+@@ -257,7 +257,7 @@ static int probe_lcd(struct usb_interfac
+       struct lcd_usb_data *lcd = &lcd_instance;
+       int i;
+       int retval;
+-      
++
+       if (dev->descriptor.idProduct != 0x0001  ) {
+               warn(KERN_INFO "USBLCD model not supported.");
+               return -ENODEV;
+@@ -274,30 +274,32 @@ static int probe_lcd(struct usb_interfac
+               (i & 0xF000)>>12,(i & 0xF00)>>8,(i & 0xF0)>>4,(i & 0xF),
+               dev->devnum);
+-      retval = usb_register_dev(intf, &usb_lcd_class);
+-      if (retval) {
+-              err("Not able to get a minor for this device.");
+-              return -ENOMEM;
+-      }
++
+       lcd->present = 1;
+       lcd->lcd_dev = dev;
+       if (!(lcd->obuf = (char *) kmalloc(OBUF_SIZE, GFP_KERNEL))) {
+               err("probe_lcd: Not enough memory for the output buffer");
+-              usb_deregister_dev(intf, &usb_lcd_class);
+               return -ENOMEM;
+       }
+       dbg("probe_lcd: obuf address:%p", lcd->obuf);
+       if (!(lcd->ibuf = (char *) kmalloc(IBUF_SIZE, GFP_KERNEL))) {
+               err("probe_lcd: Not enough memory for the input buffer");
+-              usb_deregister_dev(intf, &usb_lcd_class);
+               kfree(lcd->obuf);
+               return -ENOMEM;
+       }
+       dbg("probe_lcd: ibuf address:%p", lcd->ibuf);
++      retval = usb_register_dev(intf, &usb_lcd_class);
++      if (retval) {
++              err("Not able to get a minor for this device.");
++              kfree(lcd->obuf);
++              kfree(lcd->ibuf);
++              return -ENOMEM;
++      }
++
+       usb_set_intfdata (intf, lcd);
+       return 0;
+ }
+--- linux-2.6.0-test1/drivers/usb/misc/usbtest.c       2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/misc/usbtest.c      2003-07-19 17:03:50.000000000 -0700
+@@ -47,6 +47,7 @@ struct usbtest_info {
+       const char              *name;
+       u8                      ep_in;          /* bulk/intr source */
+       u8                      ep_out;         /* bulk/intr sink */
++      unsigned                autoconf : 1;
+       int                     alt;
+ };
+@@ -78,6 +79,61 @@ static struct usb_device *testdev_to_usb
+ /*-------------------------------------------------------------------------*/
++static int
++get_endpoints (struct usbtest_dev *dev, struct usb_interface *intf)
++{
++      int                             tmp;
++      struct usb_host_interface       *alt;
++      struct usb_host_endpoint        *in, *out;
++      struct usb_device               *udev;
++
++      for (tmp = 0; tmp < intf->max_altsetting; tmp++) {
++              unsigned        ep;
++
++              in = out = 0;
++              alt = intf->altsetting + tmp;
++
++              /* take the first altsetting with in-bulk + out-bulk;
++               * ignore other endpoints and altsetttings.
++               */
++              for (ep = 0; ep < alt->desc.bNumEndpoints; ep++) {
++                      struct usb_host_endpoint        *e;
++
++                      e = alt->endpoint + ep;
++                      if (e->desc.bmAttributes != USB_ENDPOINT_XFER_BULK)
++                              continue;
++                      if (e->desc.bEndpointAddress & USB_DIR_IN) {
++                              if (!in)
++                                      in = e;
++                      } else {
++                              if (!out)
++                                      out = e;
++                      }
++                      if (in && out)
++                              goto found;
++              }
++      }
++      return -EINVAL;
++
++found:
++      udev = testdev_to_usbdev (dev);
++      if (alt->desc.bAlternateSetting != 0) {
++              tmp = usb_set_interface (udev,
++                              alt->desc.bInterfaceNumber,
++                              alt->desc.bAlternateSetting);
++              if (tmp < 0)
++                      return tmp;
++      }
++
++      dev->in_pipe = usb_rcvbulkpipe (udev,
++                      in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
++      dev->out_pipe = usb_sndbulkpipe (udev,
++                      out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
++      return 0;
++}
++
++/*-------------------------------------------------------------------------*/
++
+ /* Support for testing basic non-queued I/O streams.
+  *
+  * These just package urbs as requests that can be easily canceled.
+@@ -1275,14 +1331,26 @@ usbtest_probe (struct usb_interface *int
+                       wtest = " intr-out";
+               }
+       } else {
+-              if (info->ep_in) {
+-                      dev->in_pipe = usb_rcvbulkpipe (udev, info->ep_in);
+-                      rtest = " bulk-in";
++              if (info->autoconf) {
++                      int status;
++
++                      status = get_endpoints (dev, intf);
++                      if (status < 0) {
++                              dbg ("couldn't get endpoints, %d\n", status);
++                              return status;
++                      }
++              } else {
++                      if (info->ep_in)
++                              dev->in_pipe = usb_rcvbulkpipe (udev,
++                                                      info->ep_in);
++                      if (info->ep_out)
++                              dev->out_pipe = usb_sndbulkpipe (udev,
++                                                      info->ep_out);
+               }
+-              if (info->ep_out) {
+-                      dev->out_pipe = usb_sndbulkpipe (udev, info->ep_out);
++              if (dev->in_pipe)
++                      rtest = " bulk-in";
++              if (dev->out_pipe)
+                       wtest = " bulk-out";
+-              }
+       }
+       usb_set_intfdata (intf, dev);
+@@ -1336,11 +1404,6 @@ static struct usbtest_info ez2_info = {
+ };
+ /* ezusb family device with dedicated usb test firmware,
+- * or a peripheral running Linux and 'zero.c' test firmware.
+- *
+- * FIXME usbtest should read the descriptors, since compatible
+- * test firmware might run on hardware (pxa250 for one) that
+- * can't configure an ep2in-bulk.
+  */
+ static struct usbtest_info fw_info = {
+       .name           = "usb test device",
+@@ -1349,10 +1412,20 @@ static struct usbtest_info fw_info = {
+       .alt            = 0,
+ };
++/* peripheral running Linux and 'zero.c' test firmware, or
++ * its user-mode cousin. different versions of this use
++ * different hardware with the same vendor/product codes.
++ * host side MUST rely on the endpoint descriptors.
++ */
++static struct usbtest_info gz_info = {
++      .name           = "Linux gadget zero",
++      .autoconf       = 1,
++      .alt            = 0,
++};
++
+ static struct usbtest_info um_info = {
+-      .name           = "user mode test driver",
+-      .ep_in          = 7,
+-      .ep_out         = 3,
++      .name           = "Linux user mode test driver",
++      .autoconf       = 1,
+       .alt            = -1,
+ };
+@@ -1418,7 +1491,7 @@ static struct usb_device_id id_table [] 
+       /* "Gadget Zero" firmware runs under Linux */
+       { USB_DEVICE (0x0525, 0xa4a0),
+-              .driver_info = (unsigned long) &fw_info,
++              .driver_info = (unsigned long) &gz_info,
+               },
+       /* so does a user-mode variant */
+--- linux-2.6.0-test1/drivers/usb/net/ax8817x.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/net/ax8817x.c       2003-07-19 17:03:50.000000000 -0700
+@@ -1208,6 +1208,7 @@ static int ax8817x_bind(struct usb_inter
+       net->init = ax8817x_net_init;
+       net->priv = ax_info;
++      SET_NETDEV_DEV(net, &intf->dev);
+       ret = register_netdev(net);
+       if (ret < 0) {
+               err("%s: Failed net init (%d)\n", __FUNCTION__, ret);
+--- linux-2.6.0-test1/drivers/usb/net/catc.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/net/catc.c  2003-07-19 17:03:50.000000000 -0700
+@@ -936,6 +936,7 @@ static int catc_probe(struct usb_interfa
+       printk("%2.2x.\n", netdev->dev_addr[i]);
+       usb_set_intfdata(intf, catc);
++      SET_NETDEV_DEV(netdev, &intf->dev);
+       if (register_netdev(netdev) != 0) {
+               usb_set_intfdata(intf, NULL);
+               usb_free_urb(catc->ctrl_urb);
+--- linux-2.6.0-test1/drivers/usb/net/kaweth.c 2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/net/kaweth.c        2003-07-19 17:03:50.000000000 -0700
+@@ -1123,8 +1123,9 @@ static int kaweth_probe(
+       if (dma_supported (&intf->dev, 0xffffffffffffffffULL))
+               kaweth->net->features |= NETIF_F_HIGHDMA;
++      SET_NETDEV_DEV(netdev, &intf->dev);
+       if (register_netdev(netdev) != 0) {
+-              kaweth_err("Error calling init_etherdev.");
++              kaweth_err("Error registering netdev.");
+               goto err_intfdata;
+       }
+--- linux-2.6.0-test1/drivers/usb/net/pegasus.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/net/pegasus.c       2003-07-19 17:03:50.000000000 -0700
+@@ -1262,7 +1262,6 @@ static int pegasus_probe(struct usb_inte
+       }
+       set_ethernet_addr(pegasus);
+       fill_skb_pool(pegasus);
+-      printk("%s: %s\n", net->name, usb_dev_id[dev_index].name);
+       if (pegasus->features & PEGASUS_II) {
+               info("setup Pegasus II specific registers");
+               setup_pegasus_II(pegasus);
+@@ -1273,9 +1272,11 @@ static int pegasus_probe(struct usb_inte
+               pegasus->phy = 1;
+       }
+       usb_set_intfdata(intf, pegasus);
++      SET_NETDEV_DEV(net, &intf->dev);
+       res = register_netdev(net);
+       if (res)
+               goto out4;
++      printk("%s: %s\n", net->name, usb_dev_id[dev_index].name);
+       return 0;
+ out4:
+--- linux-2.6.0-test1/drivers/usb/net/rtl8150.c        2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/net/rtl8150.c       2003-07-19 17:03:50.000000000 -0700
+@@ -830,6 +830,7 @@ static int rtl8150_probe(struct usb_inte
+       
+       usb_set_intfdata(intf, dev);
++      SET_NETDEV_DEV(netdev, &intf->dev);
+       if (register_netdev(netdev) != 0) {
+               err("couldn't register the device");
+               goto out2;
+--- linux-2.6.0-test1/drivers/usb/net/usbnet.c 2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/net/usbnet.c        2003-07-19 17:03:50.000000000 -0700
+@@ -2602,7 +2602,7 @@ usbnet_probe (struct usb_interface *udev
+       dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);
+       
+-      SET_NETDEV_DEV(dev->net, &dev->udev->dev);
++      SET_NETDEV_DEV(dev->net, &udev->dev);
+       status = register_netdev (dev->net);
+       if (status)
+               goto out3;
+--- linux-2.6.0-test1/drivers/usb/serial/ftdi_sio.c    2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/serial/ftdi_sio.c   2003-07-19 17:03:50.000000000 -0700
+@@ -257,6 +257,7 @@ static struct usb_device_id id_table_8U2
+       { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0, 0x3ff) },
+       { USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0, 0x3ff) },
+       { USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0, 0x3ff) },
++      { USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0, 0x3ff) },
+       { USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_0_PID, 0, 0x3ff) },
+       { USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_1_PID, 0, 0x3ff) },
+       { USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_2_PID, 0, 0x3ff) },
+@@ -321,6 +322,7 @@ static struct usb_device_id id_table_FT2
+       { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0x400, 0xffff) },
+       { USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0x400, 0xffff) },
+       { USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0x400, 0xffff) },
++      { USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0x400, 0xffff) },
+       { USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_0_PID, 0x400, 0xffff) },
+       { USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_1_PID, 0x400, 0xffff) },
+       { USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_2_PID, 0x400, 0xffff) },
+@@ -396,6 +398,7 @@ static __devinitdata struct usb_device_i
+       { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
++      { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) },
+       { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) },
+       { USB_DEVICE(FTDI_MTXORB_VID, FTDI_MTXORB_0_PID) },
+--- linux-2.6.0-test1/drivers/usb/serial/ftdi_sio.h    2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/serial/ftdi_sio.h   2003-07-19 17:03:50.000000000 -0700
+@@ -105,7 +105,13 @@
+ #define SEALEVEL_2803_6_PID   0X2863  /* SeaLINK+8 (2803) Port 6 */
+ #define SEALEVEL_2803_7_PID   0X2873  /* SeaLINK+8 (2803) Port 7 */
+ #define SEALEVEL_2803_8_PID   0X2883  /* SeaLINK+8 (2803) Port 8 */
++
++/*
++ * DSS-20 Sync Station for Sony Ericsson P800
++ */
+  
++#define FTDI_DSS20_PID          0xFC82  
++
+ /*
+  * Home Electronics (www.home-electro.com) USB gadgets
+  */
+--- linux-2.6.0-test1/drivers/usb/serial/ipaq.c        2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/usb/serial/ipaq.c       2003-07-19 17:03:50.000000000 -0700
+@@ -125,10 +125,13 @@ static struct usb_device_id ipaq_id_tabl
+       { USB_DEVICE(LINKUP_VENDOR_ID, LINKUP_PRODUCT_ID) },
+       { USB_DEVICE(MICROSOFT_VENDOR_ID, MICROSOFT_00CE_ID) },
+       { USB_DEVICE(PORTATEC_VENDOR_ID, PORTATEC_PRODUCT_ID) },
++      { USB_DEVICE(ROVER_VENDOR_ID, ROVER_P5_ID) },
+       { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_WIRELESS_ID) },
+       { USB_DEVICE(SOCKET_VENDOR_ID, SOCKET_PRODUCT_ID) },
+       { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_ID) },
++      { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_E310_ID) },
+       { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_E740_ID) },
++      { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_E335_ID) },
+       { USB_DEVICE(HTC_VENDOR_ID, HTC_PRODUCT_ID) },
+       { USB_DEVICE(NEC_VENDOR_ID, NEC_PRODUCT_ID) },
+       { USB_DEVICE(ASUS_VENDOR_ID, ASUS_A600_PRODUCT_ID) },
+--- linux-2.6.0-test1/drivers/usb/serial/ipaq.h        2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/usb/serial/ipaq.h       2003-07-19 17:03:50.000000000 -0700
+@@ -61,6 +61,9 @@
+ #define PORTATEC_VENDOR_ID    0x0961
+ #define PORTATEC_PRODUCT_ID   0x0010
++#define ROVER_VENDOR_ID               0x047b
++#define ROVER_P5_ID           0x3000
++
+ #define SAGEM_VENDOR_ID               0x5e04
+ #define SAGEM_WIRELESS_ID     0xce00
+@@ -69,7 +72,9 @@
+ #define TOSHIBA_VENDOR_ID     0x0930
+ #define TOSHIBA_PRODUCT_ID    0x0700
++#define TOSHIBA_E310_ID               0x0705
+ #define TOSHIBA_E740_ID               0x0706
++#define TOSHIBA_E335_ID               0x0707
+ #define HTC_VENDOR_ID         0x0bb4
+ #define HTC_PRODUCT_ID                0x00ce
+--- linux-2.6.0-test1/drivers/usb/serial/usb-serial.c  2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/usb/serial/usb-serial.c 2003-07-19 17:03:50.000000000 -0700
+@@ -530,7 +530,9 @@ static void serial_close(struct tty_stru
+       /* if disconnect beat us to the punch here, there's nothing to do */
+       if (tty && tty->driver_data) {
+               __serial_close(port, filp);
++              tty->driver_data = NULL;
+       }
++      port->tty = NULL;
+ }
+ static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
+--- linux-2.6.0-test1/drivers/usb/serial/visor.c       2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/serial/visor.c      2003-07-19 17:03:50.000000000 -0700
+@@ -509,18 +509,17 @@ static void visor_write_bulk_callback (s
+ {
+       struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
++      /* free up the transfer buffer, as usb_free_urb() does not do this */
++      kfree (urb->transfer_buffer);
++
+       if (port_paranoia_check (port, __FUNCTION__))
+               return;
+       
+       dbg("%s - port %d", __FUNCTION__, port->number);
+       
+-      if (urb->status) {
+-              dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
+-              return;
+-      }
+-
+-      /* free up the transfer buffer, as usb_free_urb() does not do this */
+-      kfree (urb->transfer_buffer);
++      if (urb->status)
++              dbg("%s - nonzero write bulk status received: %d",
++                  __FUNCTION__, urb->status);
+       schedule_work(&port->work);
+ }
+--- linux-2.6.0-test1/drivers/usb/storage/debug.h      2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/usb/storage/debug.h     2003-07-19 17:03:50.000000000 -0700
+@@ -46,7 +46,6 @@
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
+ #include <linux/cdrom.h>
+ #include "usb.h"
+--- linux-2.6.0-test1/drivers/usb/storage/isd200.c     2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/isd200.c    2003-07-19 17:03:50.000000000 -0700
+@@ -280,6 +280,7 @@ struct isd200_info {
+       /* maximum number of LUNs supported */
+       unsigned char MaxLUNs;
++      struct scsi_cmnd srb;
+ };
+@@ -404,15 +405,15 @@ static int isd200_action( struct us_data
+                         void* pointer, int value )
+ {
+       union ata_cdb ata;
+-      struct scsi_cmnd srb;
+       struct scsi_device srb_dev;
+       struct isd200_info *info = (struct isd200_info *)us->extra;
++      struct scsi_cmnd *srb = &info->srb;
+       int status;
+       memset(&ata, 0, sizeof(ata));
+-      memset(&srb, 0, sizeof(srb));
+       memset(&srb_dev, 0, sizeof(srb_dev));
+-      srb.device = &srb_dev;
++      srb->device = &srb_dev;
++      ++srb->serial_number;
+       ata.generic.SignatureByte0 = info->ConfigData.ATAMajorCommand;
+       ata.generic.SignatureByte1 = info->ConfigData.ATAMinorCommand;
+@@ -425,9 +426,9 @@ static int isd200_action( struct us_data
+               ata.generic.RegisterSelect =
+                 REG_CYLINDER_LOW | REG_CYLINDER_HIGH |
+                 REG_STATUS | REG_ERROR;
+-              srb.sc_data_direction = SCSI_DATA_READ;
+-              srb.request_buffer = pointer;
+-              srb.request_bufflen = value;
++              srb->sc_data_direction = SCSI_DATA_READ;
++              srb->request_buffer = pointer;
++              srb->request_bufflen = value;
+               break;
+       case ACTION_ENUM:
+@@ -437,7 +438,7 @@ static int isd200_action( struct us_data
+                                          ACTION_SELECT_5;
+               ata.generic.RegisterSelect = REG_DEVICE_HEAD;
+               ata.write.DeviceHeadByte = value;
+-              srb.sc_data_direction = SCSI_DATA_NONE;
++              srb->sc_data_direction = SCSI_DATA_NONE;
+               break;
+       case ACTION_RESET:
+@@ -446,7 +447,7 @@ static int isd200_action( struct us_data
+                                          ACTION_SELECT_3|ACTION_SELECT_4;
+               ata.generic.RegisterSelect = REG_DEVICE_CONTROL;
+               ata.write.DeviceControlByte = ATA_DC_RESET_CONTROLLER;
+-              srb.sc_data_direction = SCSI_DATA_NONE;
++              srb->sc_data_direction = SCSI_DATA_NONE;
+               break;
+       case ACTION_REENABLE:
+@@ -455,7 +456,7 @@ static int isd200_action( struct us_data
+                                          ACTION_SELECT_3|ACTION_SELECT_4;
+               ata.generic.RegisterSelect = REG_DEVICE_CONTROL;
+               ata.write.DeviceControlByte = ATA_DC_REENABLE_CONTROLLER;
+-              srb.sc_data_direction = SCSI_DATA_NONE;
++              srb->sc_data_direction = SCSI_DATA_NONE;
+               break;
+       case ACTION_SOFT_RESET:
+@@ -464,16 +465,16 @@ static int isd200_action( struct us_data
+               ata.generic.RegisterSelect = REG_DEVICE_HEAD | REG_COMMAND;
+               ata.write.DeviceHeadByte = info->DeviceHead;
+               ata.write.CommandByte = WIN_SRST;
+-              srb.sc_data_direction = SCSI_DATA_NONE;
++              srb->sc_data_direction = SCSI_DATA_NONE;
+               break;
+       case ACTION_IDENTIFY:
+               US_DEBUGP("   isd200_action(IDENTIFY)\n");
+               ata.generic.RegisterSelect = REG_COMMAND;
+               ata.write.CommandByte = WIN_IDENTIFY;
+-              srb.sc_data_direction = SCSI_DATA_READ;
+-              srb.request_buffer = (void *)&info->drive;
+-              srb.request_bufflen = sizeof(struct hd_driveid);
++              srb->sc_data_direction = SCSI_DATA_READ;
++              srb->request_buffer = (void *)&info->drive;
++              srb->request_bufflen = sizeof(struct hd_driveid);
+               break;
+       default:
+@@ -481,9 +482,9 @@ static int isd200_action( struct us_data
+               break;
+       }
+-      memcpy(srb.cmnd, &ata, sizeof(ata.generic));
+-      srb.cmd_len = sizeof(ata.generic);
+-      status = usb_stor_Bulk_transport(&srb, us);
++      memcpy(srb->cmnd, &ata, sizeof(ata.generic));
++      srb->cmd_len = sizeof(ata.generic);
++      status = usb_stor_Bulk_transport(srb, us);
+       if (status == USB_STOR_TRANSPORT_GOOD)
+               status = ISD200_GOOD;
+       else {
+@@ -834,7 +835,7 @@ static int isd200_try_enum(struct us_dat
+                          int detect )
+ {
+       int status = ISD200_GOOD;
+-      unsigned char regs[8];
++      unsigned char *regs = us->iobuf;
+       unsigned long endTime;
+       struct isd200_info *info = (struct isd200_info *)us->extra;
+       int recheckAsMaster = FALSE;
+@@ -856,7 +857,7 @@ static int isd200_try_enum(struct us_dat
+                       break;
+               status = isd200_action( us, ACTION_READ_STATUS, 
+-                                      regs, sizeof(regs) );
++                                      regs, 8 );
+               if ( status != ISD200_GOOD )
+                       break;
+--- linux-2.6.0-test1/drivers/usb/storage/jumpshot.c   2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/usb/storage/jumpshot.c  2003-07-19 17:03:50.000000000 -0700
+@@ -86,7 +86,6 @@ static inline int jumpshot_bulk_write(st
+ static int jumpshot_get_status(struct us_data  *us)
+ {
+-      unsigned char reply;
+       int rc;
+       if (!us)
+@@ -94,14 +93,14 @@ static int jumpshot_get_status(struct us
+       // send the setup
+       rc = usb_stor_ctrl_transfer(us, us->recv_ctrl_pipe,
+-                                 0, 0xA0, 0, 7, &reply, 1);
++                                 0, 0xA0, 0, 7, us->iobuf, 1);
+       if (rc != USB_STOR_XFER_GOOD)
+               return USB_STOR_TRANSPORT_ERROR;
+-      if (reply != 0x50) {
++      if (us->iobuf[0] != 0x50) {
+               US_DEBUGP("jumpshot_get_status:  0x%2x\n",
+-                        (unsigned short) (reply));
++                        us->iobuf[0]);
+               return USB_STOR_TRANSPORT_ERROR;
+       }
+@@ -115,7 +114,7 @@ static int jumpshot_read_data(struct us_
+                             unsigned char *dest, 
+                             int use_sg)
+ {
+-      unsigned char command[] = { 0, 0, 0, 0, 0, 0xe0, 0x20 };
++      unsigned char *command = us->iobuf;
+       unsigned char *buffer = NULL;
+       unsigned char *ptr;
+       unsigned char  thistime;
+@@ -154,7 +153,8 @@ static int jumpshot_read_data(struct us_
+               command[3] = (sector >>  8) & 0xFF;
+               command[4] = (sector >> 16) & 0xFF;
+-              command[5] |= (sector >> 24) & 0x0F;
++              command[5] = 0xE0 | ((sector >> 24) & 0x0F);
++              command[6] = 0x20;
+               // send the setup + command
+               result = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
+@@ -199,7 +199,7 @@ static int jumpshot_write_data(struct us
+                              unsigned char *src, 
+                              int use_sg)
+ {
+-      unsigned char command[7] = { 0, 0, 0, 0, 0, 0xE0, 0x30 };
++      unsigned char *command = us->iobuf;
+       unsigned char *buffer = NULL;
+       unsigned char *ptr;
+       unsigned char  thistime;
+@@ -240,7 +240,8 @@ static int jumpshot_write_data(struct us
+               command[3] = (sector >>  8) & 0xFF;
+               command[4] = (sector >> 16) & 0xFF;
+-              command[5] |= (sector >> 24) & 0x0F;
++              command[5] = 0xE0 | ((sector >> 24) & 0x0F);
++              command[6] = 0x30;
+               // send the setup + command
+               result = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
+@@ -291,13 +292,19 @@ static int jumpshot_write_data(struct us
+ static int jumpshot_id_device(struct us_data *us,
+                             struct jumpshot_info *info)
+ {
+-      unsigned char command[2] = { 0xe0, 0xec };
+-      unsigned char reply[512];
++      unsigned char *command = us->iobuf;
++      unsigned char *reply;
+       int      rc;
+       if (!us || !info)
+               return USB_STOR_TRANSPORT_ERROR;
++      command[0] = 0xE0;
++      command[1] = 0xEC;
++      reply = kmalloc(512, GFP_NOIO);
++      if (!reply)
++              return USB_STOR_TRANSPORT_ERROR;
++
+       // send the setup
+       rc = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
+                                  0, 0x20, 0, 6, command, 2);
+@@ -305,20 +312,27 @@ static int jumpshot_id_device(struct us_
+       if (rc != USB_STOR_XFER_GOOD) {
+               US_DEBUGP("jumpshot_id_device:  Gah! "
+                         "send_control for read_capacity failed\n");
+-              return rc;
++              rc = USB_STOR_TRANSPORT_ERROR;
++              goto leave;
+       }
+       // read the reply
+       rc = jumpshot_bulk_read(us, reply, sizeof(reply));
+-      if (rc != USB_STOR_XFER_GOOD)
+-              return USB_STOR_TRANSPORT_ERROR;
++      if (rc != USB_STOR_XFER_GOOD) {
++              rc = USB_STOR_TRANSPORT_ERROR;
++              goto leave;
++      }
+       info->sectors = ((u32)(reply[117]) << 24) |
+                       ((u32)(reply[116]) << 16) |
+                       ((u32)(reply[115]) <<  8) |
+                       ((u32)(reply[114])      );
+-      return USB_STOR_TRANSPORT_GOOD;
++      rc = USB_STOR_TRANSPORT_GOOD;
++
++ leave:
++      kfree(reply);
++      return rc;
+ }
+ static int jumpshot_handle_mode_sense(struct us_data *us,
+--- linux-2.6.0-test1/drivers/usb/storage/protocol.c   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/protocol.c  2003-07-19 17:03:50.000000000 -0700
+@@ -130,8 +130,9 @@ static void fix_read_capacity(Scsi_Cmnd 
+ void usb_stor_qic157_command(Scsi_Cmnd *srb, struct us_data *us)
+ {
+       /* Pad the ATAPI command with zeros 
++       *
+        * NOTE: This only works because a Scsi_Cmnd struct field contains
+-       * a unsigned char cmnd[12], so we know we have storage available
++       * a unsigned char cmnd[16], so we know we have storage available
+        */
+       for (; srb->cmd_len<12; srb->cmd_len++)
+               srb->cmnd[srb->cmd_len] = 0;
+@@ -149,13 +150,10 @@ void usb_stor_qic157_command(Scsi_Cmnd *
+ void usb_stor_ATAPI_command(Scsi_Cmnd *srb, struct us_data *us)
+ {
+-      int old_cmnd = 0;
+-
+-      /* Fix some commands -- this is a form of mode translation
+-       * ATAPI devices only accept 12 byte long commands 
++      /* Pad the ATAPI command with zeros 
+        *
+        * NOTE: This only works because a Scsi_Cmnd struct field contains
+-       * a unsigned char cmnd[12], so we know we have storage available
++       * a unsigned char cmnd[16], so we know we have storage available
+        */
+       /* Pad the ATAPI command with zeros */
+@@ -165,60 +163,10 @@ void usb_stor_ATAPI_command(Scsi_Cmnd *s
+       /* set command length to 12 bytes */
+       srb->cmd_len = 12;
+-      /* determine the correct (or minimum) data length for these commands */
+-      switch (srb->cmnd[0]) {
+-
+-              /* change MODE_SENSE/MODE_SELECT from 6 to 10 byte commands */
+-      case MODE_SENSE:
+-      case MODE_SELECT:
+-              /* save the command so we can tell what it was */
+-              old_cmnd = srb->cmnd[0];
+-
+-              srb->cmnd[11] = 0;
+-              srb->cmnd[10] = 0;
+-              srb->cmnd[9] = 0;
+-              srb->cmnd[8] = srb->cmnd[4];
+-              srb->cmnd[7] = 0;
+-              srb->cmnd[6] = 0;
+-              srb->cmnd[5] = 0;
+-              srb->cmnd[4] = 0;
+-              srb->cmnd[3] = 0;
+-              srb->cmnd[2] = srb->cmnd[2];
+-              srb->cmnd[1] = srb->cmnd[1];
+-              srb->cmnd[0] = srb->cmnd[0] | 0x40;
+-              break;
+-
+-              /* change READ_6/WRITE_6 to READ_10/WRITE_10, which 
+-               * are ATAPI commands */
+-      case WRITE_6:
+-      case READ_6:
+-              srb->cmnd[11] = 0;
+-              srb->cmnd[10] = 0;
+-              srb->cmnd[9] = 0;
+-              srb->cmnd[8] = srb->cmnd[4];
+-              srb->cmnd[7] = 0;
+-              srb->cmnd[6] = 0;
+-              srb->cmnd[5] = srb->cmnd[3];
+-              srb->cmnd[4] = srb->cmnd[2];
+-              srb->cmnd[3] = srb->cmnd[1] & 0x1F;
+-              srb->cmnd[2] = 0;
+-              srb->cmnd[1] = srb->cmnd[1] & 0xE0;
+-              srb->cmnd[0] = srb->cmnd[0] | 0x20;
+-              break;
+-      } /* end switch on cmnd[0] */
+-
+-      /* convert MODE_SELECT data here */
+-      if (old_cmnd == MODE_SELECT)
+-              usb_stor_scsiSense6to10(srb);
+-
+       /* send the command to the transport layer */
+       usb_stor_invoke_transport(srb, us);
+-      if (srb->result == SAM_STAT_GOOD) {
+-
+-              /* Fix the MODE_SENSE data if we translated the command */
+-              if (old_cmnd == MODE_SENSE)
+-                      usb_stor_scsiSense10to6(srb);
++      if (srb->result == SAM_STAT_GOOD) {
+               /* fix the INQUIRY data if necessary */
+               fix_inquiry_data(srb);
+       }
+@@ -227,19 +175,23 @@ void usb_stor_ATAPI_command(Scsi_Cmnd *s
+ void usb_stor_ufi_command(Scsi_Cmnd *srb, struct us_data *us)
+ {
+-      int old_cmnd = 0;
+-
+       /* fix some commands -- this is a form of mode translation
+        * UFI devices only accept 12 byte long commands 
+        *
+        * NOTE: This only works because a Scsi_Cmnd struct field contains
+-       * a unsigned char cmnd[12], so we know we have storage available
++       * a unsigned char cmnd[16], so we know we have storage available
+        */
++      /* Pad the ATAPI command with zeros */
++      for (; srb->cmd_len<12; srb->cmd_len++)
++              srb->cmnd[srb->cmd_len] = 0;
++
+       /* set command length to 12 bytes (this affects the transport layer) */
+       srb->cmd_len = 12;
+-      /* determine the correct (or minimum) data length for these commands */
++      /* XXX We should be constantly re-evaluating the need for these */
++
++      /* determine the correct data length for these commands */
+       switch (srb->cmnd[0]) {
+               /* for INQUIRY, UFI devices only ever return 36 bytes */
+@@ -247,33 +199,6 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb
+               srb->cmnd[4] = 36;
+               break;
+-              /* change MODE_SENSE/MODE_SELECT from 6 to 10 byte commands */
+-      case MODE_SENSE:
+-      case MODE_SELECT:
+-              /* save the command so we can tell what it was */
+-              old_cmnd = srb->cmnd[0];
+-
+-              srb->cmnd[11] = 0;
+-              srb->cmnd[10] = 0;
+-              srb->cmnd[9] = 0;
+-
+-              /* if we're sending data, we send all.  If getting data, 
+-               * get the minimum */
+-              if (srb->cmnd[0] == MODE_SELECT)
+-                      srb->cmnd[8] = srb->cmnd[4];
+-              else
+-                      srb->cmnd[8] = 8;
+-
+-              srb->cmnd[7] = 0;
+-              srb->cmnd[6] = 0;
+-              srb->cmnd[5] = 0;
+-              srb->cmnd[4] = 0;
+-              srb->cmnd[3] = 0;
+-              srb->cmnd[2] = srb->cmnd[2];
+-              srb->cmnd[1] = srb->cmnd[1];
+-              srb->cmnd[0] = srb->cmnd[0] | 0x40;
+-              break;
+-
+               /* again, for MODE_SENSE_10, we get the minimum (8) */
+       case MODE_SENSE_10:
+               srb->cmnd[7] = 0;
+@@ -284,38 +209,12 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb
+       case REQUEST_SENSE:
+               srb->cmnd[4] = 18;
+               break;
+-
+-              /* change READ_6/WRITE_6 to READ_10/WRITE_10, which 
+-               * are UFI commands */
+-      case WRITE_6:
+-      case READ_6:
+-              srb->cmnd[11] = 0;
+-              srb->cmnd[10] = 0;
+-              srb->cmnd[9] = 0;
+-              srb->cmnd[8] = srb->cmnd[4];
+-              srb->cmnd[7] = 0;
+-              srb->cmnd[6] = 0;
+-              srb->cmnd[5] = srb->cmnd[3];
+-              srb->cmnd[4] = srb->cmnd[2];
+-              srb->cmnd[3] = srb->cmnd[1] & 0x1F;
+-              srb->cmnd[2] = 0;
+-              srb->cmnd[1] = srb->cmnd[1] & 0xE0;
+-              srb->cmnd[0] = srb->cmnd[0] | 0x20;
+-              break;
+       } /* end switch on cmnd[0] */
+-      /* convert MODE_SELECT data here */
+-      if (old_cmnd == MODE_SELECT)
+-              usb_stor_scsiSense6to10(srb);
+-
+       /* send the command to the transport layer */
+       usb_stor_invoke_transport(srb, us);
+-      if (srb->result == SAM_STAT_GOOD) {
+-
+-              /* Fix the MODE_SENSE data if we translated the command */
+-              if (old_cmnd == MODE_SENSE)
+-                      usb_stor_scsiSense10to6(srb);
++      if (srb->result == SAM_STAT_GOOD) {
+               /* Fix the data for an INQUIRY, if necessary */
+               fix_inquiry_data(srb);
+       }
+@@ -323,68 +222,10 @@ void usb_stor_ufi_command(Scsi_Cmnd *srb
+ void usb_stor_transparent_scsi_command(Scsi_Cmnd *srb, struct us_data *us)
+ {
+-      int old_cmnd = 0;
+-
+-      /* This code supports devices which do not support {READ|WRITE}_6
+-       * Apparently, neither Windows or MacOS will use these commands,
+-       * so some devices do not support them
+-       */
+-      if (us->flags & US_FL_MODE_XLATE) {
+-              US_DEBUGP("Invoking Mode Translation\n");
+-              /* save the old command for later */
+-              old_cmnd = srb->cmnd[0];
+-
+-              switch (srb->cmnd[0]) {
+-              /* change READ_6/WRITE_6 to READ_10/WRITE_10 */
+-              case WRITE_6:
+-              case READ_6:
+-                      srb->cmd_len = 12;
+-                      srb->cmnd[11] = 0;
+-                      srb->cmnd[10] = 0;
+-                      srb->cmnd[9] = 0;
+-                      srb->cmnd[8] = srb->cmnd[4];
+-                      srb->cmnd[7] = 0;
+-                      srb->cmnd[6] = 0;
+-                      srb->cmnd[5] = srb->cmnd[3];
+-                      srb->cmnd[4] = srb->cmnd[2];
+-                      srb->cmnd[3] = srb->cmnd[1] & 0x1F;
+-                      srb->cmnd[2] = 0;
+-                      srb->cmnd[1] = srb->cmnd[1] & 0xE0;
+-                      srb->cmnd[0] = srb->cmnd[0] | 0x20;
+-                      break;
+-
+-              /* convert MODE_SELECT data here */
+-              case MODE_SENSE:
+-              case MODE_SELECT:
+-                      srb->cmd_len = 12;
+-                      srb->cmnd[11] = 0;
+-                      srb->cmnd[10] = 0;
+-                      srb->cmnd[9] = 0;
+-                      srb->cmnd[8] = srb->cmnd[4];
+-                      srb->cmnd[7] = 0;
+-                      srb->cmnd[6] = 0;
+-                      srb->cmnd[5] = 0;
+-                      srb->cmnd[4] = 0;
+-                      srb->cmnd[3] = 0;
+-                      srb->cmnd[2] = srb->cmnd[2];
+-                      srb->cmnd[1] = srb->cmnd[1];
+-                      srb->cmnd[0] = srb->cmnd[0] | 0x40;
+-                      break;
+-              } /* switch (srb->cmnd[0]) */
+-      } /* if (us->flags & US_FL_MODE_XLATE) */
+-
+-      /* convert MODE_SELECT data here */
+-      if ((us->flags & US_FL_MODE_XLATE) && (old_cmnd == MODE_SELECT))
+-              usb_stor_scsiSense6to10(srb);
+-
+       /* send the command to the transport layer */
+       usb_stor_invoke_transport(srb, us);
+-      if (srb->result == SAM_STAT_GOOD) {
+-
+-              /* Fix the MODE_SENSE data if we translated the command */
+-              if ((us->flags & US_FL_MODE_XLATE) && (old_cmnd == MODE_SENSE))
+-                      usb_stor_scsiSense10to6(srb);
++      if (srb->result == SAM_STAT_GOOD) {
+               /* Fix the INQUIRY data if necessary */
+               fix_inquiry_data(srb);
+--- linux-2.6.0-test1/drivers/usb/storage/protocol.h   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/protocol.h  2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #ifndef _PROTOCOL_H_
+ #define _PROTOCOL_H_
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "usb.h"
+--- linux-2.6.0-test1/drivers/usb/storage/scsiglue.c   2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/storage/scsiglue.c  2003-07-19 17:03:50.000000000 -0700
+@@ -263,7 +263,6 @@ static int proc_info (struct Scsi_Host *
+ #define DO_FLAG(a)    if (f & US_FL_##a)  pos += sprintf(pos, " " #a)
+               DO_FLAG(SINGLE_LUN);
+-              DO_FLAG(MODE_XLATE);
+               DO_FLAG(SCM_MULT_TARG);
+               DO_FLAG(FIX_INQUIRY);
+               DO_FLAG(FIX_CAPACITY);
+@@ -346,499 +345,3 @@ unsigned char usb_stor_sense_invalidCDB[
+       [12]    = 0x24                      /* Invalid Field in CDB */
+ };
+-#define USB_STOR_SCSI_SENSE_HDRSZ 4
+-#define USB_STOR_SCSI_SENSE_10_HDRSZ 8
+-
+-struct usb_stor_scsi_sense_hdr
+-{
+-  __u8* dataLength;
+-  __u8* mediumType;
+-  __u8* devSpecParms;
+-  __u8* blkDescLength;
+-};
+-
+-typedef struct usb_stor_scsi_sense_hdr Usb_Stor_Scsi_Sense_Hdr;
+-
+-union usb_stor_scsi_sense_hdr_u
+-{
+-  Usb_Stor_Scsi_Sense_Hdr hdr;
+-  __u8* array[USB_STOR_SCSI_SENSE_HDRSZ];
+-};
+-
+-typedef union usb_stor_scsi_sense_hdr_u Usb_Stor_Scsi_Sense_Hdr_u;
+-
+-struct usb_stor_scsi_sense_hdr_10
+-{
+-  __u8* dataLengthMSB;
+-  __u8* dataLengthLSB;
+-  __u8* mediumType;
+-  __u8* devSpecParms;
+-  __u8* reserved1;
+-  __u8* reserved2;
+-  __u8* blkDescLengthMSB;
+-  __u8* blkDescLengthLSB;
+-};
+-
+-typedef struct usb_stor_scsi_sense_hdr_10 Usb_Stor_Scsi_Sense_Hdr_10;
+-
+-union usb_stor_scsi_sense_hdr_10_u
+-{
+-  Usb_Stor_Scsi_Sense_Hdr_10 hdr;
+-  __u8* array[USB_STOR_SCSI_SENSE_10_HDRSZ];
+-};
+-
+-typedef union usb_stor_scsi_sense_hdr_10_u Usb_Stor_Scsi_Sense_Hdr_10_u;
+-
+-void usb_stor_scsiSenseParseBuffer( Scsi_Cmnd* , Usb_Stor_Scsi_Sense_Hdr_u*,
+-                                  Usb_Stor_Scsi_Sense_Hdr_10_u*, int* );
+-
+-int usb_stor_scsiSense10to6( Scsi_Cmnd* the10 )
+-{
+-  __u8 *buffer=0;
+-  int outputBufferSize = 0;
+-  int length=0;
+-  struct scatterlist *sg = 0;
+-  int i=0, j=0, element=0;
+-  Usb_Stor_Scsi_Sense_Hdr_u the6Locations;
+-  Usb_Stor_Scsi_Sense_Hdr_10_u the10Locations;
+-  int sb=0,si=0,db=0,di=0;
+-  int sgLength=0;
+-
+-  US_DEBUGP("-- converting 10 byte sense data to 6 byte\n");
+-  the10->cmnd[0] = the10->cmnd[0] & 0xBF;
+-
+-  /* Determine buffer locations */
+-  usb_stor_scsiSenseParseBuffer( the10, &the6Locations, &the10Locations,
+-                               &length );
+-
+-  /* Work out minimum buffer to output */
+-  outputBufferSize = *the10Locations.hdr.dataLengthLSB;
+-  outputBufferSize += USB_STOR_SCSI_SENSE_HDRSZ;
+-
+-  /* Check to see if we need to trucate the output */
+-  if ( outputBufferSize > length )
+-    {
+-      printk( KERN_WARNING USB_STORAGE 
+-            "Had to truncate MODE_SENSE_10 buffer into MODE_SENSE.\n" );
+-      printk( KERN_WARNING USB_STORAGE
+-            "outputBufferSize is %d and length is %d.\n",
+-            outputBufferSize, length );
+-    }
+-  outputBufferSize = length;
+-
+-  /* Data length */
+-  if ( *the10Locations.hdr.dataLengthMSB != 0 ) /* MSB must be zero */
+-    {
+-      printk( KERN_WARNING USB_STORAGE 
+-            "Command will be truncated to fit in SENSE6 buffer.\n" );
+-      *the6Locations.hdr.dataLength = 0xff;
+-    }
+-  else
+-    {
+-      *the6Locations.hdr.dataLength = *the10Locations.hdr.dataLengthLSB;
+-    }
+-
+-  /* Medium type and DevSpecific parms */
+-  *the6Locations.hdr.mediumType = *the10Locations.hdr.mediumType;
+-  *the6Locations.hdr.devSpecParms = *the10Locations.hdr.devSpecParms;
+-
+-  /* Block descriptor length */
+-  if ( *the10Locations.hdr.blkDescLengthMSB != 0 ) /* MSB must be zero */
+-    {
+-      printk( KERN_WARNING USB_STORAGE 
+-            "Command will be truncated to fit in SENSE6 buffer.\n" );
+-      *the6Locations.hdr.blkDescLength = 0xff;
+-    }
+-  else
+-    {
+-      *the6Locations.hdr.blkDescLength = *the10Locations.hdr.blkDescLengthLSB;
+-    }
+-
+-  if ( the10->use_sg == 0 )
+-    {
+-      buffer = the10->request_buffer;
+-      /* Copy the rest of the data */
+-      memmove( &(buffer[USB_STOR_SCSI_SENSE_HDRSZ]),
+-             &(buffer[USB_STOR_SCSI_SENSE_10_HDRSZ]),
+-             outputBufferSize - USB_STOR_SCSI_SENSE_HDRSZ );
+-      /* initialise last bytes left in buffer due to smaller header */
+-      memset( &(buffer[outputBufferSize
+-          -(USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ)]),
+-            0,
+-            USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ );
+-    }
+-  else
+-    {
+-      sg = (struct scatterlist *) the10->request_buffer;
+-      /* scan through this scatterlist and figure out starting positions */
+-      for ( i=0; i < the10->use_sg; i++)
+-      {
+-        sgLength = sg[i].length;
+-        for ( j=0; j<sgLength; j++ )
+-          {
+-            /* get to end of header */
+-            if ( element == USB_STOR_SCSI_SENSE_HDRSZ )
+-              {
+-                db=i;
+-                di=j;
+-              }
+-            if ( element == USB_STOR_SCSI_SENSE_10_HDRSZ )
+-              {
+-                sb=i;
+-                si=j;
+-                /* we've found both sets now, exit loops */
+-                j=sgLength;
+-                i=the10->use_sg;
+-              }
+-            element++;
+-          }
+-      }
+-
+-      /* Now we know where to start the copy from */
+-      element = USB_STOR_SCSI_SENSE_HDRSZ;
+-      while ( element < outputBufferSize
+-            -(USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ) )
+-      {
+-        /* check limits */
+-        if ( sb >= the10->use_sg ||
+-             si >= sg[sb].length ||
+-             db >= the10->use_sg ||
+-             di >= sg[db].length )
+-          {
+-            printk( KERN_ERR USB_STORAGE
+-                    "Buffer overrun averted, this shouldn't happen!\n" );
+-            break;
+-          }
+-
+-        /* copy one byte */
+-        {
+-              char *src = sg_address(sg[sb]) + si;
+-              char *dst = sg_address(sg[db]) + di;
+-
+-               *dst = *src;
+-        }
+-
+-        /* get next destination */
+-        if ( sg[db].length-1 == di )
+-          {
+-            db++;
+-            di=0;
+-          }
+-        else
+-          {
+-            di++;
+-          }
+-
+-        /* get next source */
+-        if ( sg[sb].length-1 == si )
+-          {
+-            sb++;
+-            si=0;
+-          }
+-        else
+-          {
+-            si++;
+-          }
+-
+-        element++;
+-      }
+-      /* zero the remaining bytes */
+-      while ( element < outputBufferSize )
+-      {
+-        /* check limits */
+-        if ( db >= the10->use_sg ||
+-             di >= sg[db].length )
+-          {
+-            printk( KERN_ERR USB_STORAGE
+-                    "Buffer overrun averted, this shouldn't happen!\n" );
+-            break;
+-          }
+-
+-        *(char*)(sg_address(sg[db])) = 0;
+-
+-        /* get next destination */
+-        if ( sg[db].length-1 == di )
+-          {
+-            db++;
+-            di=0;
+-          }
+-        else
+-          {
+-            di++;
+-          }
+-        element++;
+-      }
+-    }
+-
+-  /* All done any everything was fine */
+-  return 0;
+-}
+-
+-int usb_stor_scsiSense6to10( Scsi_Cmnd* the6 )
+-{
+-  /* will be used to store part of buffer */  
+-  __u8 tempBuffer[USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ],
+-    *buffer=0;
+-  int outputBufferSize = 0;
+-  int length=0;
+-  struct scatterlist *sg = 0;
+-  int i=0, j=0, element=0;
+-  Usb_Stor_Scsi_Sense_Hdr_u the6Locations;
+-  Usb_Stor_Scsi_Sense_Hdr_10_u the10Locations;
+-  int sb=0,si=0,db=0,di=0;
+-  int lsb=0,lsi=0,ldb=0,ldi=0;
+-
+-  US_DEBUGP("-- converting 6 byte sense data to 10 byte\n");
+-  the6->cmnd[0] = the6->cmnd[0] | 0x40;
+-
+-  /* Determine buffer locations */
+-  usb_stor_scsiSenseParseBuffer( the6, &the6Locations, &the10Locations,
+-                               &length );
+-
+-  /* Work out minimum buffer to output */
+-  outputBufferSize = *the6Locations.hdr.dataLength;
+-  outputBufferSize += USB_STOR_SCSI_SENSE_10_HDRSZ;
+-
+-  /* Check to see if we need to trucate the output */
+-  if ( outputBufferSize > length )
+-    {
+-      printk( KERN_WARNING USB_STORAGE 
+-            "Had to truncate MODE_SENSE into MODE_SENSE_10 buffer.\n" );
+-      printk( KERN_WARNING USB_STORAGE
+-            "outputBufferSize is %d and length is %d.\n",
+-            outputBufferSize, length );
+-    }
+-  outputBufferSize = length;
+-
+-  /* Block descriptor length - save these before overwriting */
+-  tempBuffer[2] = *the10Locations.hdr.blkDescLengthMSB;
+-  tempBuffer[3] = *the10Locations.hdr.blkDescLengthLSB;
+-  *the10Locations.hdr.blkDescLengthLSB = *the6Locations.hdr.blkDescLength;
+-  *the10Locations.hdr.blkDescLengthMSB = 0;
+-
+-  /* reserved - save these before overwriting */
+-  tempBuffer[0] = *the10Locations.hdr.reserved1;
+-  tempBuffer[1] = *the10Locations.hdr.reserved2;
+-  *the10Locations.hdr.reserved1 = *the10Locations.hdr.reserved2 = 0;
+-
+-  /* Medium type and DevSpecific parms */
+-  *the10Locations.hdr.devSpecParms = *the6Locations.hdr.devSpecParms;
+-  *the10Locations.hdr.mediumType = *the6Locations.hdr.mediumType;
+-
+-  /* Data length */
+-  *the10Locations.hdr.dataLengthLSB = *the6Locations.hdr.dataLength;
+-  *the10Locations.hdr.dataLengthMSB = 0;
+-
+-  if ( !the6->use_sg )
+-    {
+-      buffer = the6->request_buffer;
+-      /* Copy the rest of the data */
+-      memmove( &(buffer[USB_STOR_SCSI_SENSE_10_HDRSZ]),
+-            &(buffer[USB_STOR_SCSI_SENSE_HDRSZ]),
+-            outputBufferSize-USB_STOR_SCSI_SENSE_10_HDRSZ );
+-      /* Put the first four bytes (after header) in place */
+-      memcpy( &(buffer[USB_STOR_SCSI_SENSE_10_HDRSZ]),
+-            tempBuffer,
+-            USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ );
+-    }
+-  else
+-    {
+-      sg = (struct scatterlist *) the6->request_buffer;
+-      /* scan through this scatterlist and figure out ending positions */
+-      for ( i=0; i < the6->use_sg; i++)
+-      {
+-        for ( j=0; j<sg[i].length; j++ )
+-          {
+-            /* get to end of header */
+-            if ( element == USB_STOR_SCSI_SENSE_HDRSZ )
+-              {
+-                ldb=i;
+-                ldi=j;
+-              }
+-            if ( element == USB_STOR_SCSI_SENSE_10_HDRSZ )
+-              {
+-                lsb=i;
+-                lsi=j;
+-                /* we've found both sets now, exit loops */
+-                j=sg[i].length;
+-                i=the6->use_sg;
+-                break;
+-              }
+-            element++;
+-          }
+-      }
+-      /* scan through this scatterlist and figure out starting positions */
+-      element = length-1;
+-      /* destination is the last element */
+-      db=the6->use_sg-1;
+-      di=sg[db].length-1;
+-      for ( i=the6->use_sg-1; i >= 0; i--)
+-      {
+-        for ( j=sg[i].length-1; j>=0; j-- )
+-          {
+-            /* get to end of header and find source for copy */
+-            if ( element == length - 1
+-                 - (USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ) )
+-              {
+-                sb=i;
+-                si=j;
+-                /* we've found both sets now, exit loops */
+-                j=-1;
+-                i=-1;
+-              }
+-            element--;
+-          }
+-      }
+-      /* Now we know where to start the copy from */
+-      element = length-1
+-      - (USB_STOR_SCSI_SENSE_10_HDRSZ-USB_STOR_SCSI_SENSE_HDRSZ);
+-      while ( element >= USB_STOR_SCSI_SENSE_10_HDRSZ )
+-      {
+-        /* check limits */
+-        if ( ( sb <= lsb && si < lsi ) ||
+-             ( db <= ldb && di < ldi ) )
+-          {
+-            printk( KERN_ERR USB_STORAGE
+-                    "Buffer overrun averted, this shouldn't happen!\n" );
+-            break;
+-          }
+-
+-        /* copy one byte */
+-        {
+-              char *src = sg_address(sg[sb]) + si;
+-              char *dst = sg_address(sg[db]) + di;
+-
+-               *dst = *src;
+-        }
+-
+-        /* get next destination */
+-        if ( di == 0 )
+-          {
+-            db--;
+-            di=sg[db].length-1;
+-          }
+-        else
+-          {
+-            di--;
+-          }
+-
+-        /* get next source */
+-        if ( si == 0 )
+-          {
+-            sb--;
+-            si=sg[sb].length-1;
+-          }
+-        else
+-          {
+-            si--;
+-          }
+-
+-        element--;
+-      }
+-      /* copy the remaining four bytes */
+-      while ( element >= USB_STOR_SCSI_SENSE_HDRSZ )
+-      {
+-        /* check limits */
+-        if ( db <= ldb && di < ldi )
+-          {
+-            printk( KERN_ERR USB_STORAGE
+-                    "Buffer overrun averted, this shouldn't happen!\n" );
+-            break;
+-          }
+-
+-       {
+-               char *dst = sg_address(sg[db]) + di;
+-
+-               *dst = tempBuffer[element-USB_STOR_SCSI_SENSE_HDRSZ];
+-       }
+-
+-
+-        /* get next destination */
+-        if ( di == 0 )
+-          {
+-            db--;
+-            di=sg[db].length-1;
+-          }
+-        else
+-          {
+-            di--;
+-          }
+-        element--;
+-      }
+-    }
+-
+-  /* All done and everything was fine */
+-  return 0;
+-}
+-
+-void usb_stor_scsiSenseParseBuffer( Scsi_Cmnd* srb, Usb_Stor_Scsi_Sense_Hdr_u* the6,
+-                             Usb_Stor_Scsi_Sense_Hdr_10_u* the10,
+-                             int* length_p )
+-
+-{
+-  int i = 0, j=0, element=0;
+-  struct scatterlist *sg = 0;
+-  int length = 0;
+-  __u8* buffer=0;
+-
+-  /* are we scatter-gathering? */
+-  if ( srb->use_sg != 0 )
+-    {
+-      /* loop over all the scatter gather structures and 
+-       * get pointer to the data members in the headers
+-       * (also work out the length while we're here)
+-       */
+-      sg = (struct scatterlist *) srb->request_buffer;
+-      for (i = 0; i < srb->use_sg; i++)
+-      {
+-        length += sg[i].length;
+-        /* We only do the inner loop for the headers */
+-        if ( element < USB_STOR_SCSI_SENSE_10_HDRSZ )
+-          {
+-            /* scan through this scatterlist */
+-            for ( j=0; j<sg[i].length; j++ )
+-              {
+-                if ( element < USB_STOR_SCSI_SENSE_HDRSZ )
+-                  {
+-                    /* fill in the pointers for both header types */
+-                    the6->array[element] = sg_address(sg[i]) + j;
+-                    the10->array[element] = sg_address(sg[i]) + j;
+-
+-                  }
+-                else if ( element < USB_STOR_SCSI_SENSE_10_HDRSZ )
+-                  {
+-                    /* only the longer headers still cares now */
+-                    the10->array[element] = sg_address(sg[i]) + j;
+-                     
+-                  }
+-                /* increase element counter */
+-                element++;
+-              }
+-          }
+-      }
+-    }
+-  else
+-    {
+-      length = srb->request_bufflen;
+-      buffer = srb->request_buffer;
+-      if ( length < USB_STOR_SCSI_SENSE_10_HDRSZ )
+-      printk( KERN_ERR USB_STORAGE
+-              "Buffer length smaller than header!!" );
+-      for( i=0; i<USB_STOR_SCSI_SENSE_10_HDRSZ; i++ )
+-      {
+-        if ( i < USB_STOR_SCSI_SENSE_HDRSZ )
+-          {
+-            the6->array[i] = &(buffer[i]);
+-            the10->array[i] = &(buffer[i]);
+-          }
+-        else
+-          {
+-            the10->array[i] = &(buffer[i]);
+-          }
+-      }
+-    }
+-
+-  /* Set value of length passed in */
+-  *length_p = length;
+-}
+-
+--- linux-2.6.0-test1/drivers/usb/storage/scsiglue.h   2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/scsiglue.h  2003-07-19 17:03:50.000000000 -0700
+@@ -41,7 +41,7 @@
+ #ifndef _SCSIGLUE_H_
+ #define _SCSIGLUE_H_
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "scsi.h"
+ #include "hosts.h"
+--- linux-2.6.0-test1/drivers/usb/storage/sddr09.c     2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/usb/storage/sddr09.c    2003-07-19 17:03:50.000000000 -0700
+@@ -261,12 +261,13 @@ sddr09_send_scsi_command(struct us_data 
+  */
+ static int
+ sddr09_test_unit_ready(struct us_data *us) {
+-      unsigned char command[6] = {
+-              0, LUNBITS, 0, 0, 0, 0
+-      };
++      unsigned char *command = us->iobuf;
+       int result;
+-      result = sddr09_send_scsi_command(us, command, sizeof(command));
++      memset(command, 0, 6);
++      command[1] = LUNBITS;
++
++      result = sddr09_send_scsi_command(us, command, 6);
+       US_DEBUGP("sddr09_test_unit_ready returns %d\n", result);
+@@ -281,12 +282,15 @@ sddr09_test_unit_ready(struct us_data *u
+  */
+ static int
+ sddr09_request_sense(struct us_data *us, unsigned char *sensebuf, int buflen) {
+-      unsigned char command[12] = {
+-              0x03, LUNBITS, 0, 0, buflen, 0, 0, 0, 0, 0, 0, 0
+-      };
++      unsigned char *command = us->iobuf;
+       int result;
+-      result = sddr09_send_scsi_command(us, command, sizeof(command));
++      memset(command, 0, 12);
++      command[0] = 0x03;
++      command[1] = LUNBITS;
++      command[4] = buflen;
++
++      result = sddr09_send_scsi_command(us, command, 12);
+       if (result != USB_STOR_TRANSPORT_GOOD) {
+               US_DEBUGP("request sense failed\n");
+               return result;
+@@ -331,20 +335,23 @@ sddr09_readX(struct us_data *us, int x, 
+            int nr_of_pages, int bulklen, unsigned char *buf,
+            int use_sg) {
+-      unsigned char command[12] = {
+-              0xe8, LUNBITS | x, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-      };
++      unsigned char *command = us->iobuf;
+       int result;
++      command[0] = 0xE8;
++      command[1] = LUNBITS | x;
+       command[2] = MSB_of(fromaddress>>16);
+       command[3] = LSB_of(fromaddress>>16); 
+       command[4] = MSB_of(fromaddress & 0xFFFF);
+       command[5] = LSB_of(fromaddress & 0xFFFF); 
+-
++      command[6] = 0;
++      command[7] = 0;
++      command[8] = 0;
++      command[9] = 0;
+       command[10] = MSB_of(nr_of_pages);
+       command[11] = LSB_of(nr_of_pages);
+-      result = sddr09_send_scsi_command(us, command, sizeof(command));
++      result = sddr09_send_scsi_command(us, command, 12);
+       if (result != USB_STOR_TRANSPORT_GOOD) {
+               US_DEBUGP("Result for send_control in sddr09_read2%d %d\n",
+@@ -458,17 +465,18 @@ sddr09_read23(struct us_data *us, unsign
+  */
+ static int
+ sddr09_erase(struct us_data *us, unsigned long Eaddress) {
+-      unsigned char command[12] = {
+-              0xea, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-      };
++      unsigned char *command = us->iobuf;
+       int result;
++      memset(command, 0, 12);
++      command[0] = 0xEA;
++      command[1] = LUNBITS;
+       command[6] = MSB_of(Eaddress>>16);
+       command[7] = LSB_of(Eaddress>>16);
+       command[8] = MSB_of(Eaddress & 0xFFFF);
+       command[9] = LSB_of(Eaddress & 0xFFFF);
+-      result = sddr09_send_scsi_command(us, command, sizeof(command));
++      result = sddr09_send_scsi_command(us, command, 12);
+       if (result != USB_STOR_TRANSPORT_GOOD)
+               US_DEBUGP("Result for send_control in sddr09_erase %d\n",
+@@ -493,11 +501,12 @@ sddr09_writeX(struct us_data *us,
+             unsigned long Waddress, unsigned long Eaddress,
+             int nr_of_pages, int bulklen, unsigned char *buf, int use_sg) {
+-      unsigned char command[12] = {
+-              0xe9, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-      };
++      unsigned char *command = us->iobuf;
+       int result;
++      command[0] = 0xE9;
++      command[1] = LUNBITS;
++
+       command[2] = MSB_of(Waddress>>16);
+       command[3] = LSB_of(Waddress>>16);
+       command[4] = MSB_of(Waddress & 0xFFFF);
+@@ -511,7 +520,7 @@ sddr09_writeX(struct us_data *us,
+       command[10] = MSB_of(nr_of_pages);
+       command[11] = LSB_of(nr_of_pages);
+-      result = sddr09_send_scsi_command(us, command, sizeof(command));
++      result = sddr09_send_scsi_command(us, command, 12);
+       if (result != USB_STOR_TRANSPORT_GOOD) {
+               US_DEBUGP("Result for send_control in sddr09_writeX %d\n",
+@@ -554,15 +563,15 @@ sddr09_write_inplace(struct us_data *us,
+  */
+ static int
+ sddr09_read_sg_test_only(struct us_data *us) {
+-      unsigned char command[15] = {
+-              0xe7, LUNBITS, 0
+-      };
++      unsigned char *command = us->iobuf;
+       int result, bulklen, nsg, ct;
+       unsigned char *buf;
+       unsigned long address;
+       nsg = bulklen = 0;
+-
++      command[0] = 0xE7;
++      command[1] = LUNBITS;
++      command[2] = 0;
+       address = 040000; ct = 1;
+       nsg++;
+       bulklen += (ct << 9);
+@@ -628,20 +637,22 @@ sddr09_read_sg_test_only(struct us_data 
+ static int
+ sddr09_read_status(struct us_data *us, unsigned char *status) {
+-      unsigned char command[12] = {
+-              0xec, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-      };
+-      unsigned char data[64];
++      unsigned char *command = us->iobuf;
++      unsigned char *data = us->iobuf;
+       int result;
+       US_DEBUGP("Reading status...\n");
+-      result = sddr09_send_scsi_command(us, command, sizeof(command));
++      memset(command, 0, 12);
++      command[0] = 0xEC;
++      command[1] = LUNBITS;
++
++      result = sddr09_send_scsi_command(us, command, 12);
+       if (result != USB_STOR_TRANSPORT_GOOD)
+               return result;
+       result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
+-                                     data, sizeof(data), NULL);
++                                     data, 64, NULL);
+       *status = data[0];
+       return (result == USB_STOR_XFER_GOOD ?
+                       USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
+@@ -953,13 +964,15 @@ sddr09_read_control(struct us_data *us,
+  */
+ static int
+ sddr09_read_deviceID(struct us_data *us, unsigned char *deviceID) {
+-      unsigned char command[12] = {
+-              0xed, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-      };
+-      unsigned char content[64];
++      unsigned char *command = us->iobuf;
++      unsigned char *content = us->iobuf;
+       int result, i;
+-      result = sddr09_send_scsi_command(us, command, sizeof(command));
++      memset(command, 0, 12);
++      command[0] = 0xED;
++      command[1] = LUNBITS;
++
++      result = sddr09_send_scsi_command(us, command, 12);
+       if (result != USB_STOR_TRANSPORT_GOOD)
+               return result;
+@@ -1006,11 +1019,13 @@ sddr09_get_wp(struct us_data *us, struct
+ static int
+ sddr09_reset(struct us_data *us) {
+-      unsigned char command[12] = {
+-              0xeb, LUNBITS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+-      };
++      unsigned char *command = us->iobuf;
++
++      memset(command, 0, 12);
++      command[0] = 0xEB;
++      command[1] = LUNBITS;
+-      return sddr09_send_scsi_command(us, command, sizeof(command));
++      return sddr09_send_scsi_command(us, command, 12);
+ }
+ #endif
+@@ -1313,7 +1328,7 @@ sddr09_init_card_info(struct us_data *us
+ int
+ sddr09_init(struct us_data *us) {
+       int result;
+-      unsigned char data[18];
++      unsigned char *data = us->iobuf;
+       result = sddr09_send_command(us, 0x01, USB_DIR_IN, data, 2);
+       if (result != USB_STOR_TRANSPORT_GOOD) {
+@@ -1333,10 +1348,10 @@ sddr09_init(struct us_data *us) {
+       US_DEBUGP("SDDR09init: %02X %02X\n", data[0], data[1]);
+       // get 07 00
+-      result = sddr09_request_sense(us, data, sizeof(data));
++      result = sddr09_request_sense(us, data, 18);
+       if (result == USB_STOR_TRANSPORT_GOOD && data[2] != 0) {
+               int j;
+-              for (j=0; j<sizeof(data); j++)
++              for (j=0; j<18; j++)
+                       printk(" %02X", data[j]);
+               printk("\n");
+               // get 70 00 00 00 00 00 00 * 00 00 00 00 00 00
+--- linux-2.6.0-test1/drivers/usb/storage/sddr55.c     2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/usb/storage/sddr55.c    2003-07-19 17:03:50.000000000 -0700
+@@ -91,13 +91,14 @@ sddr55_bulk_transport(struct us_data *us
+ static int sddr55_status(struct us_data *us)
+ {
+       int result;
+-      unsigned char command[8] = {
+-              0, 0, 0, 0, 0, 0xb0, 0, 0x80
+-      };
+-      unsigned char status[8];
++      unsigned char *command = us->iobuf;
++      unsigned char *status = us->iobuf;
+       struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra;
+       /* send command */
++      memset(command, 0, 8);
++      command[5] = 0xB0;
++      command[7] = 0x80;
+       result = sddr55_bulk_transport(us,
+               SCSI_DATA_WRITE, command, 8);
+@@ -158,10 +159,8 @@ static int sddr55_read_data(struct us_da
+               int use_sg) {
+       int result = USB_STOR_TRANSPORT_GOOD;
+-      unsigned char command[8] = {
+-              0, 0, 0, 0, 0, 0xb0, 0, 0x85
+-      };
+-      unsigned char status[8];
++      unsigned char *command = us->iobuf;
++      unsigned char *status = us->iobuf;
+       struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra;
+       unsigned int pba;
+@@ -205,11 +204,15 @@ static int sddr55_read_data(struct us_da
+                       address = (pba << info->blockshift) + page;
++                      command[0] = 0;
+                       command[1] = LSB_of(address>>16);
+                       command[2] = LSB_of(address>>8);
+                       command[3] = LSB_of(address);
++                      command[4] = 0;
++                      command[5] = 0xB0;
+                       command[6] = LSB_of(pages << (1 - info->smallpageshift));
++                      command[7] = 0x85;
+                       /* send command */
+                       result = sddr55_bulk_transport(us,
+@@ -274,10 +277,8 @@ static int sddr55_write_data(struct us_d
+               int use_sg) {
+       int result = USB_STOR_TRANSPORT_GOOD;
+-      unsigned char command[8] = {
+-              0, 0, 0, 0, 0, 0xb0, 0, 0x86
+-      };
+-      unsigned char status[8];
++      unsigned char *command = us->iobuf;
++      unsigned char *status = us->iobuf;
+       struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra;
+       unsigned int pba;
+@@ -380,6 +381,8 @@ static int sddr55_write_data(struct us_d
+               command[6] = MSB_of(lba % 1000);
+               command[4] |= LSB_of(pages >> info->smallpageshift);
++              command[5] = 0xB0;
++              command[7] = 0x86;
+               /* send command */
+               result = sddr55_bulk_transport(us,
+@@ -473,11 +476,12 @@ static int sddr55_read_deviceID(struct u
+               unsigned char *deviceID) {
+       int result;
+-      unsigned char command[8] = {
+-              0, 0, 0, 0, 0, 0xb0, 0, 0x84
+-      };
+-      unsigned char content[64];
++      unsigned char *command = us->iobuf;
++      unsigned char *content = us->iobuf;
++      memset(command, 0, 8);
++      command[5] = 0xB0;
++      command[7] = 0x84;
+       result = sddr55_bulk_transport(us, SCSI_DATA_WRITE, command, 8);
+       US_DEBUGP("Result of send_control for device ID is %d\n",
+@@ -598,7 +602,7 @@ static int sddr55_read_map(struct us_dat
+       struct sddr55_card_info *info = (struct sddr55_card_info *)(us->extra);
+       int numblocks;
+       unsigned char *buffer;
+-      unsigned char command[8] = { 0, 0, 0, 0, 0, 0xb0, 0, 0x8a};     
++      unsigned char *command = us->iobuf;
+       int i;
+       unsigned short lba;
+       unsigned short max_lba;
+@@ -614,7 +618,10 @@ static int sddr55_read_map(struct us_dat
+       if (!buffer)
+               return -1;
++      memset(command, 0, 8);
++      command[5] = 0xB0;
+       command[6] = numblocks * 2 / 256;
++      command[7] = 0x8A;
+       result = sddr55_bulk_transport(us, SCSI_DATA_WRITE, command, 8);
+--- linux-2.6.0-test1/drivers/usb/storage/transport.h  2003-06-22 12:04:44.000000000 -0700
++++ 25/drivers/usb/storage/transport.h 2003-07-19 17:03:50.000000000 -0700
+@@ -42,7 +42,7 @@
+ #define _TRANSPORT_H_
+ #include <linux/config.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include "usb.h"
+ #include "scsi.h"
+--- linux-2.6.0-test1/drivers/usb/storage/unusual_devs.h       2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/storage/unusual_devs.h      2003-07-19 17:03:50.000000000 -0700
+@@ -119,7 +119,7 @@ UNUSUAL_DEV(  0x04b8, 0x0602, 0x0110, 0x
+ UNUSUAL_DEV(  0x04cb, 0x0100, 0x0000, 0x2210,
+               "Fujifilm",
+               "FinePix 1400Zoom",
+-              US_SC_8070, US_PR_CBI, NULL, US_FL_FIX_INQUIRY),
++              US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY),
+ /* Reported by Peter Wächtler <pwaechtler@loewe-komp.de>
+  * The device needs the flags only.
+@@ -236,7 +236,7 @@ UNUSUAL_DEV(  0x0525, 0xa140, 0x0100, 0x
+ UNUSUAL_DEV(  0x054c, 0x0010, 0x0106, 0x0450, 
+               "Sony",
+               "DSC-S30/S70/S75/505V/F505/F707/F717/P8", 
+-              US_SC_SCSI, US_PR_CB, NULL,
++              US_SC_SCSI, US_PR_DEVICE, NULL,
+               US_FL_SINGLE_LUN | US_FL_MODE_XLATE ),
+ /* Reported by wim@geeks.nl */
+@@ -555,7 +555,7 @@ UNUSUAL_DEV( 0x0839, 0x000a, 0x0001, 0x0
+ UNUSUAL_DEV(  0x08ca, 0x2011, 0x0000, 0x9999,
+               "AIPTEK",
+               "PocketCAM 3Mega",
+-              US_SC_SCSI, US_PR_BULK, NULL,
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_MODE_XLATE ),
+ /* aeb */
+--- linux-2.6.0-test1/drivers/usb/storage/usb.c        2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/storage/usb.c       2003-07-19 17:03:50.000000000 -0700
+@@ -958,6 +958,8 @@ static int storage_probe(struct usb_inte
+               goto BadDevice;
+       }
++      scsi_scan_host(us->host);
++
+       printk(KERN_DEBUG 
+              "WARNING: USB Mass Storage data integrity not assured\n");
+       printk(KERN_DEBUG 
+--- linux-2.6.0-test1/drivers/usb/storage/usb.h        2003-07-02 14:53:16.000000000 -0700
++++ 25/drivers/usb/storage/usb.h       2003-07-19 17:03:50.000000000 -0700
+@@ -45,7 +45,7 @@
+ #define _USB_H_
+ #include <linux/usb.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/smp_lock.h>
+ #include <linux/completion.h>
+ #include <linux/version.h>
+@@ -69,11 +69,10 @@ struct us_unusual_dev {
+ /* Flag definitions: these entries are static */
+ #define US_FL_SINGLE_LUN      0x00000001 /* allow access to only LUN 0            */
+-#define US_FL_MODE_XLATE      0x00000002 /* translate _6 to _10 commands for
+-                                                  Win/MacOS compatibility */
++#define US_FL_MODE_XLATE      0          /* [no longer used]                */
+ #define US_FL_IGNORE_SER      0                /* [no longer used]                */
+ #define US_FL_SCM_MULT_TARG   0x00000020 /* supports multiple targets     */
+-#define US_FL_FIX_INQUIRY     0x00000040 /* INQUIRY response needs fixing   */
++#define US_FL_FIX_INQUIRY     0x00000040 /* INQUIRY response needs faking   */
+ #define US_FL_FIX_CAPACITY    0x00000080 /* READ CAPACITY response too big  */
+ /* Dynamic flag definitions: used in set_bit() etc. */
+--- linux-2.6.0-test1/drivers/usb/usb-skeleton.c       2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/usb/usb-skeleton.c      2003-07-19 17:03:50.000000000 -0700
+@@ -507,7 +507,7 @@ static int skel_probe(struct usb_interfa
+       struct usb_endpoint_descriptor *endpoint;
+       size_t buffer_size;
+       int i;
+-      int retval;
++      int retval = -ENOMEM;
+       /* See if the device offered us matches what we can accept */
+       if ((udev->descriptor.idVendor != USB_SKEL_VENDOR_ID) ||
+@@ -515,18 +515,11 @@ static int skel_probe(struct usb_interfa
+               return -ENODEV;
+       }
+-      retval = usb_register_dev (interface, &skel_class);
+-      if (retval) {
+-              /* something prevented us from registering this driver */
+-              err ("Not able to get a minor for this device.");
+-              goto exit;
+-      }
+-
+       /* allocate memory for our device state and initialize it */
+       dev = kmalloc (sizeof(struct usb_skel), GFP_KERNEL);
+       if (dev == NULL) {
+               err ("Out of memory");
+-              goto exit_minor;
++              goto error;
+       }
+       memset (dev, 0x00, sizeof (*dev));
+@@ -603,24 +596,24 @@ static int skel_probe(struct usb_interfa
+       /* allow device read, write and ioctl */
+       dev->present = 1;
++      /* we can register the device now, as it is ready */
++      usb_set_intfdata (interface, dev);
++      retval = usb_register_dev (interface, &skel_class);
++      if (retval) {
++              /* something prevented us from registering this driver */
++              err ("Not able to get a minor for this device.");
++              usb_set_intfdata (interface, NULL);
++              goto error;
++      }
++
++
+       /* let the user know what node this device is now attached to */
+       info ("USB Skeleton device now attached to USBSkel-%d", dev->minor);
+-
+-      goto exit;
++      return 0;
+ error:
+       skel_delete (dev);
+-      dev = NULL;
+-
+-exit_minor:
+-      usb_deregister_dev (interface, &skel_class);
+-
+-exit:
+-      if (dev) {
+-              usb_set_intfdata (interface, dev);
+-              return 0;
+-      }
+-      return -ENODEV;
++      return retval;
+ }
+--- linux-2.6.0-test1/drivers/video/cfbimgblt.c        2003-06-26 22:07:25.000000000 -0700
++++ 25/drivers/video/cfbimgblt.c       2003-07-19 17:04:55.000000000 -0700
+@@ -325,7 +325,7 @@ void cfb_imageblit(struct fb_info *p, co
+               else 
+                       slow_imageblit(image, p, dst1, fgcolor, bgcolor,
+                                       start_index, pitch_index);
+-      } else if (image->depth == bpp) 
++      } else if (image->depth <= bpp) 
+               color_imageblit(image, p, dst1, start_index, pitch_index);
+ }
+--- linux-2.6.0-test1/drivers/video/chipsfb.c  2003-06-14 12:18:09.000000000 -0700
++++ 25/drivers/video/chipsfb.c 2003-07-19 17:04:55.000000000 -0700
+@@ -85,7 +85,7 @@ static struct pmu_sleep_notifier chips_s
+ /*
+  * Exported functions
+  */
+-int chips_init(void);
++int chipsfb_init(void);
+ static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *);
+ static int chipsfb_check_var(struct fb_var_screeninfo *var,
+@@ -460,7 +460,7 @@ static struct pci_driver chipsfb_driver 
+       .remove =       __devexit_p(chipsfb_remove),
+ };
+-int __init chips_init(void)
++int __init chipsfb_init(void)
+ {
+       return pci_module_init(&chipsfb_driver);
+ }
+--- linux-2.6.0-test1/drivers/video/console/fbcon.c    2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/video/console/fbcon.c   2003-07-19 17:04:55.000000000 -0700
+@@ -195,8 +195,7 @@ static void fb_flashcursor(void *private
+ {
+       struct fb_info *info = (struct fb_info *) private;
+-      /* Test to see if the cursor is erased but still on */
+-      if (!info || (info->cursor.rop == ROP_COPY))
++      if (!info)
+               return;
+       info->cursor.enable ^= 1;
+       info->fbops->fb_cursor(info, &info->cursor);
+@@ -226,8 +225,7 @@ static void cursor_timer_handler(unsigne
+       struct fb_info *info = (struct fb_info *) dev_addr;
+       
+       schedule_work(&info->queue);    
+-      cursor_timer.expires = jiffies + HZ / 5;
+-      add_timer(&cursor_timer);
++      mod_timer(&cursor_timer, jiffies + HZ/5);
+ }
+ int __init fb_console_setup(char *this_opt)
+@@ -308,97 +306,6 @@ int set_con2fb_map(int unit, int newidx)
+ }
+ /*
+- * drawing helpers
+- */
+-static void putcs_unaligned(struct vc_data *vc, struct fb_info *info,
+-                          struct fb_image *image, int count,
+-                          const unsigned short *s)
+-{
+-      unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
+-      unsigned int width = (vc->vc_font.width + 7) >> 3;
+-      unsigned int cellsize = vc->vc_font.height * width;
+-      unsigned int maxcnt = info->pixmap.size/cellsize;
+-      unsigned int shift_low = 0, mod = vc->vc_font.width % 8;
+-      unsigned int shift_high = 8, size, pitch, cnt, k;
+-      unsigned int buf_align = info->pixmap.buf_align - 1;
+-      unsigned int scan_align = info->pixmap.scan_align - 1;
+-      unsigned int idx = vc->vc_font.width >> 3;
+-      u8 mask, *src, *dst, *dst0;
+-
+-      while (count) {
+-              if (count > maxcnt)
+-                      cnt = k = maxcnt;
+-              else
+-                      cnt = k = count;
+-
+-              image->width = vc->vc_font.width * cnt;
+-              pitch = ((image->width + 7) >> 3) + scan_align;
+-              pitch &= ~scan_align;
+-              size = pitch * vc->vc_font.height + buf_align;
+-              size &= ~buf_align;
+-              dst0 = info->pixmap.addr + fb_get_buffer_offset(info, size);
+-              image->data = dst0;
+-              while (k--) {
+-                      src = vc->vc_font.data + (scr_readw(s++) & charmask)*
+-                      cellsize;
+-                      dst = dst0;
+-                      mask = (u8) (0xfff << shift_high);
+-                      move_buf_unaligned(info, dst, src, pitch, image->height,
+-                                      mask, shift_high, shift_low, mod, idx);
+-                      shift_low += mod;
+-                      dst0 += (shift_low >= 8) ? width : width - 1;
+-                      shift_low &= 7;
+-                      shift_high = 8 - shift_low;
+-              }
+-              info->fbops->fb_imageblit(info, image);
+-              image->dx += cnt * vc->vc_font.width;
+-              count -= cnt;
+-              atomic_dec(&info->pixmap.count);
+-              smp_mb__after_atomic_dec();
+-      }
+-}
+-
+-static void putcs_aligned(struct vc_data *vc, struct fb_info *info,
+-                        struct fb_image *image, int count,
+-                        const unsigned short *s)
+-{
+-      unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
+-      unsigned int width = vc->vc_font.width >> 3;
+-      unsigned int cellsize = vc->vc_font.height * width;
+-      unsigned int maxcnt = info->pixmap.size/cellsize;
+-      unsigned int scan_align = info->pixmap.scan_align - 1;
+-      unsigned int buf_align = info->pixmap.buf_align - 1;
+-      unsigned int pitch, cnt, size, k;
+-      u8 *src, *dst, *dst0;
+-
+-      while (count) {
+-              if (count > maxcnt)
+-                      cnt = k = maxcnt;
+-              else
+-                      cnt = k = count;
+-              
+-              pitch = width * cnt + scan_align;
+-              pitch &= ~scan_align;
+-              size = pitch * vc->vc_font.height + buf_align;
+-              size &= ~buf_align;
+-              image->width = vc->vc_font.width * cnt;
+-              dst0 = info->pixmap.addr + fb_get_buffer_offset(info, size);
+-              image->data = dst0;
+-              while (k--) {
+-                      src = vc->vc_font.data + (scr_readw(s++)&charmask)*cellsize;
+-                      dst = dst0;
+-                      move_buf_aligned(info, dst, src, pitch, width, image->height);
+-                      dst0 += width;
+-              }
+-              info->fbops->fb_imageblit(info, image);
+-              image->dx += cnt * vc->vc_font.width;
+-              count -= cnt;
+-              atomic_dec(&info->pixmap.count);
+-              smp_mb__after_atomic_dec();
+-      }
+-}
+-
+-/*
+  * Accelerated handlers.
+  */
+ void accel_bmove(struct vc_data *vc, struct fb_info *info, int sy, 
+@@ -432,48 +339,21 @@ void accel_clear(struct vc_data *vc, str
+       info->fbops->fb_fillrect(info, &region);
+ }     
+-static void accel_putc(struct vc_data *vc, struct fb_info *info,
+-                      int c, int ypos, int xpos)
++void accel_putcs(struct vc_data *vc, struct fb_info *info,
++                      const unsigned short *s, int count, int yy, int xx)
+ {
+       unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
+       unsigned int width = (vc->vc_font.width + 7) >> 3;
++      unsigned int cellsize = vc->vc_font.height * width;
++      unsigned int maxcnt = info->pixmap.size/cellsize;
+       unsigned int scan_align = info->pixmap.scan_align - 1;
+       unsigned int buf_align = info->pixmap.buf_align - 1;
++      unsigned int shift_low = 0, mod = vc->vc_font.width % 8;
++      unsigned int shift_high = 8, pitch, cnt, size, k;
+       int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
+       int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
+-      unsigned int size, pitch;
+-      struct fb_image image;
+-      u8 *src, *dst;
+-
+-      image.dx = xpos * vc->vc_font.width;
+-      image.dy = ypos * vc->vc_font.height;
+-      image.width = vc->vc_font.width;
+-      image.height = vc->vc_font.height;
+-      image.fg_color = attr_fgcol(fgshift, c);
+-      image.bg_color = attr_bgcol(bgshift, c);
+-      image.depth = 1;
+-
+-      pitch = width + scan_align;
+-      pitch &= ~scan_align;
+-      size = pitch * vc->vc_font.height;
+-      size += buf_align;
+-      size &= ~buf_align;
+-      dst = info->pixmap.addr + fb_get_buffer_offset(info, size);
+-      image.data = dst;
+-      src = vc->vc_font.data + (c & charmask) * vc->vc_font.height * width;
+-
+-      move_buf_aligned(info, dst, src, pitch, width, image.height);
+-
+-      info->fbops->fb_imageblit(info, &image);
+-      atomic_dec(&info->pixmap.count);
+-      smp_mb__after_atomic_dec();
+-}
+-
+-void accel_putcs(struct vc_data *vc, struct fb_info *info,
+-                      const unsigned short *s, int count, int yy, int xx)
+-{
+-      int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
+-      int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
++      unsigned int idx = vc->vc_font.width >> 3;
++      u8 *src, *dst, *dst0, mask;
+       struct fb_image image;
+       u16 c = scr_readw(s);
+@@ -484,10 +364,44 @@ void accel_putcs(struct vc_data *vc, str
+       image.height = vc->vc_font.height;
+       image.depth = 1;
+-      if (!(vc->vc_font.width & 7))
+-               putcs_aligned(vc, info, &image, count, s);
+-        else
+-               putcs_unaligned(vc, info, &image, count, s);
++      while (count) {
++              if (count > maxcnt)
++                      cnt = k = maxcnt;
++              else
++                      cnt = k = count;
++
++              image.width = vc->vc_font.width * cnt;
++              pitch = ((image.width + 7) >> 3) + scan_align;
++              pitch &= ~scan_align;
++              size = pitch * vc->vc_font.height + buf_align;
++              size &= ~buf_align;
++              dst0 = fb_get_buffer_offset(info, &info->pixmap, size);
++              image.data = dst0;
++              while (k--) {
++                      src = vc->vc_font.data + (scr_readw(s++) & charmask)*cellsize;
++                      dst = dst0;
++              
++                      if (mod) {
++                              mask = (u8) (0xfff << shift_high);
++                              move_buf_unaligned(info, &info->pixmap, dst, src, pitch,
++                                                 image.height, mask, shift_high, 
++                                                 shift_low, mod, idx);
++                              shift_low += mod;
++                              dst0 += (shift_low >= 8) ? width : width - 1;
++                              shift_low &= 7;
++                              shift_high = 8 - shift_low;
++                      } else {
++                              move_buf_aligned(info, &info->pixmap, dst, src, pitch, idx, 
++                                               image.height);
++                              dst0 += width;
++                      }       
++              }
++              info->fbops->fb_imageblit(info, &image);
++              image.dx += cnt * vc->vc_font.width;
++              count -= cnt;
++              atomic_dec(&info->pixmap.count);
++              smp_mb__after_atomic_dec();
++      }
+ }
+ void accel_clear_margins(struct vc_data *vc, struct fb_info *info,
+@@ -676,7 +590,7 @@ static const char *fbcon_startup(void)
+       if (!info->queue.func) {
+               INIT_WORK(&info->queue, fb_flashcursor, info);
+               
+-              cursor_timer.expires = jiffies + HZ / 50;
++              cursor_timer.expires = jiffies + HZ / 5;
+               cursor_timer.data = (unsigned long ) info;
+               add_timer(&cursor_timer);
+       }
+@@ -728,15 +642,13 @@ static __inline__ void updatescrollmode(
+ static void fbcon_set_display(struct vc_data *vc, int init, int logo)
+ {
+       struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
++      int nr_rows, nr_cols, old_rows, old_cols, i, charcnt = 256;
+       struct display *p = &fb_display[vc->vc_num];
+-      int nr_rows, nr_cols;
+-      int old_rows, old_cols;
+       unsigned short *save = NULL, *r, *q;
+-      int i, charcnt = 256;
+       struct font_desc *font;
+       if (vc->vc_num != fg_console || (info->flags & FBINFO_FLAG_MODULE) ||
+-          info->fix.type == FB_TYPE_TEXT)
++          (info->fix.type == FB_TYPE_TEXT))
+               logo = 0;
+       info->var.xoffset = info->var.yoffset = p->yscroll = 0; /* reset wrap/pan */
+@@ -960,19 +872,51 @@ static void fbcon_clear(struct vc_data *
+               accel_clear(vc, info, real_y(p, sy), sx, height, width);
+ }
+-
+ static void fbcon_putc(struct vc_data *vc, int c, int ypos, int xpos)
+ {
+       struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
++      unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++      unsigned int scan_align = info->pixmap.scan_align - 1;
++      unsigned int buf_align = info->pixmap.buf_align - 1;
++      unsigned int width = (vc->vc_font.width + 7) >> 3;
++      int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
++      int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
+       struct display *p = &fb_display[vc->vc_num];
+-
++      unsigned int size, pitch;
++      struct fb_image image;
++      u8 *src, *dst;
++      
+       if (!info->fbops->fb_blank && console_blanked)
+               return;
+       if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
+               return;
+-      accel_putc(vc, info, c, real_y(p, ypos), xpos);
++      image.dx = xpos * vc->vc_font.width;
++      image.dy = real_y(p, ypos) * vc->vc_font.height;
++      image.width = vc->vc_font.width;
++      image.height = vc->vc_font.height;
++      image.fg_color = attr_fgcol(fgshift, c);
++      image.bg_color = attr_bgcol(bgshift, c);
++      image.depth = 1;
++
++      src = vc->vc_font.data + (c & charmask) * vc->vc_font.height * width;
++
++      pitch = width + scan_align;
++      pitch &= ~scan_align;
++      size = pitch * vc->vc_font.height;
++      size += buf_align;
++      size &= ~buf_align;
++
++      dst = fb_get_buffer_offset(info, &info->pixmap, size);
++      image.data = dst;
++      
++      move_buf_aligned(info, &info->pixmap, dst, src, pitch, width,
++                      image.height);
++
++      info->fbops->fb_imageblit(info, &image);
++      atomic_dec(&info->pixmap.count);
++      smp_mb__after_atomic_dec();
+ }
+ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
+@@ -994,12 +938,16 @@ static void fbcon_cursor(struct vc_data 
+ {
+       struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
+       unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++      unsigned int scan_align = info->sprite.scan_align - 1;
++      unsigned int buf_align = info->sprite.buf_align - 1;
+       int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
+       int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
+       struct display *p = &fb_display[vc->vc_num];
+-      int w = (vc->vc_font.width + 7) >> 3, c;
+-      int y = real_y(p, vc->vc_y);
++      int y = real_y(p, vc->vc_y), d_pitch, dsize;
++      int s_pitch = (vc->vc_font.width + 7) >> 3;
++      int size = s_pitch * vc->vc_font.height, c;
+       struct fb_cursor cursor;
++      u8 *src, *dst;
+       
+       if (mode & CM_SOFTBACK) {
+               mode &= ~CM_SOFTBACK;
+@@ -1012,28 +960,27 @@ static void fbcon_cursor(struct vc_data 
+       } else if (softback_lines)
+               fbcon_set_origin(vc);
+-      c = scr_readw((u16 *) vc->vc_pos);
+-
+-      cursor.image.data = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
+-      cursor.set = FB_CUR_SETCUR;
+-      cursor.image.depth = 1;
+-      
+       switch (mode) {
+       case CM_ERASE:
+-              if (info->cursor.rop == ROP_XOR) {
++              del_timer(&cursor_timer);
++              if (info->cursor.enable) {
+                       info->cursor.enable = 0;
+-                      info->cursor.rop = ROP_COPY;
+-                      info->fbops->fb_cursor(info, &cursor);
+-              }       
++                      info->fbops->fb_cursor(info, &info->cursor);
++              }
+               break;
+       case CM_MOVE:
+       case CM_DRAW:
++              memset(&cursor, 0, sizeof(struct fb_cursor));
+               info->cursor.enable = 1;
+-              
++
++              c = scr_readw((u16 *) vc->vc_pos);
++
++              src = vc->vc_font.data + ((c & charmask) * size);
+               if (info->cursor.image.fg_color != attr_fgcol(fgshift, c) ||
+                   info->cursor.image.bg_color != attr_bgcol(bgshift, c)) {
+                       cursor.image.fg_color = attr_fgcol(fgshift, c);
+                       cursor.image.bg_color = attr_bgcol(bgshift, c);
++                      cursor.image.depth = 1;
+                       cursor.set |= FB_CUR_SETCMAP;
+               }
+               
+@@ -1056,18 +1003,29 @@ static void fbcon_cursor(struct vc_data 
+                       cursor.set |= FB_CUR_SETHOT;
+               }
++              src = vc->vc_font.data + ((c & charmask) * size);
++
++              d_pitch = (s_pitch + scan_align) & ~scan_align;
++              dsize = d_pitch * vc->vc_font.height + buf_align;
++              dsize &= ~buf_align;
++              dst = fb_get_buffer_offset(info, &info->sprite, dsize);
++              move_buf_aligned(info, &info->sprite, dst, src, d_pitch, s_pitch, vc->vc_font.height);
++              info->cursor.image.data = dst;
++              cursor.set |= FB_CUR_SETSHAPE;
++              
+               if ((cursor.set & FB_CUR_SETSIZE) || ((vc->vc_cursor_type & 0x0f) != p->cursor_shape)) {
+-                      char *mask = kmalloc(w*vc->vc_font.height, GFP_ATOMIC);
+-                      int cur_height, size, i = 0;
++                      char *mask = kmalloc(dsize, GFP_ATOMIC);
++                      int cur_height, i, j, k;
+                       if (!mask)      return; 
+-              
++      
++                      memset(mask, 0, dsize);
++                      
+                       if (info->cursor.mask)
+                               kfree(info->cursor.mask);
+                       info->cursor.mask = mask;
+       
+                       p->cursor_shape = vc->vc_cursor_type & 0x0f;
+-                      cursor.set |= FB_CUR_SETSHAPE;
+                       switch (vc->vc_cursor_type & 0x0f) {
+                       case CUR_NONE:
+@@ -1090,15 +1048,18 @@ static void fbcon_cursor(struct vc_data 
+                               cur_height = vc->vc_font.height;
+                               break;
+                       }
+-                      size = (vc->vc_font.height - cur_height) * w;
+-                      while (size--)
+-                              mask[i++] = 0;
+-                      size = cur_height * w;
+-                      while (size--)
+-                              mask[i++] = 0xff;
++                      i = (vc->vc_font.height - cur_height) * d_pitch;
++                      for (j = 0; j < cur_height; j++) {
++                              for (k = 0; k < s_pitch; k++)   
++                                      mask[i++] = 0xff;
++                              i += (d_pitch - s_pitch);
++                      }
+               }
+               info->cursor.rop = ROP_XOR;
+               info->fbops->fb_cursor(info, &cursor);
++              atomic_dec(&info->sprite.count);
++              smp_mb__after_atomic_dec();
++              mod_timer(&cursor_timer, jiffies + HZ/5);
+               vbl_cursor_cnt = CURSOR_DRAW_DELAY;
+               break;
+       }
+@@ -1826,9 +1787,11 @@ static int fbcon_do_set_font(struct vc_d
+       vc->vc_font.height = h;
+       if (vc->vc_hi_font_mask && cnt == 256) {
+               vc->vc_hi_font_mask = 0;
+-              if (vc->vc_can_do_color)
++              if (vc->vc_can_do_color) {
+                       vc->vc_complement_mask >>= 1;
+-
++                      vc->vc_s_complement_mask >>= 1;
++              }
++                      
+               /* ++Edmund: reorder the attribute bits */
+               if (vc->vc_can_do_color) {
+                       unsigned short *cp =
+@@ -1847,9 +1810,11 @@ static int fbcon_do_set_font(struct vc_d
+               }
+       } else if (!vc->vc_hi_font_mask && cnt == 512) {
+               vc->vc_hi_font_mask = 0x100;
+-              if (vc->vc_can_do_color)
++              if (vc->vc_can_do_color) {
+                       vc->vc_complement_mask <<= 1;
+-
++                      vc->vc_s_complement_mask <<= 1;
++              }
++                      
+               /* ++Edmund: reorder the attribute bits */
+               {
+                       unsigned short *cp =
+--- linux-2.6.0-test1/drivers/video/controlfb.c        2003-06-14 12:18:00.000000000 -0700
++++ 25/drivers/video/controlfb.c       2003-07-19 17:04:55.000000000 -0700
+@@ -136,8 +136,8 @@ static int controlfb_check_var (struct f
+ /*
+  * inititialization
+  */
+-int control_init(void);
+-void control_setup(char *);
++int controlfb_init(void);
++void controlfb_setup(char *);
+ /******************** Prototypes for internal functions **********************/
+@@ -475,7 +475,7 @@ try_again:
+       /* Apply default var */
+       var.activate = FB_ACTIVATE_NOW;
+-      rc = fb_set_var(&var, &p->info);
++      rc = fb_set_var(&p->info, &var);
+       if (rc && (vmode != VMODE_640_480_60 || cmode != CMODE_8))
+               goto try_again;
+@@ -553,7 +553,7 @@ static void control_set_hardware(struct 
+ /*
+  * Called from fbmem.c for probing & initializing
+  */
+-int __init control_init(void)
++int __init controlfb_init(void)
+ {
+       struct device_node *dp;
+@@ -1057,7 +1057,7 @@ static void control_cleanup(void)
+ /*
+  * Parse user speficied options (`video=controlfb:')
+  */
+-void __init control_setup(char *options)
++void __init controlfb_setup(char *options)
+ {
+       char *this_opt;
+--- linux-2.6.0-test1/drivers/video/epson1355fb.c      2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/video/epson1355fb.c     2003-07-19 17:04:55.000000000 -0700
+@@ -1,541 +1,714 @@
+ /*
+- * linux/drivers/video/epson1355fb.c
+- *    -- Support for the Epson SED1355 LCD/CRT controller
++ * linux/drivers/video/epson1355fb.c -- Epson S1D13505 frame buffer for 2.5.
+  *
+- * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
++ * Epson Research S1D13505 Embedded RAMDAC LCD/CRT Controller
++ *   (previously known as SED1355)
+  *
+- * based on linux/drivers/video/skeletonfb.c, which was
++ * Cf. http://www.erd.epson.com/vdc/html/S1D13505.html
++ *
++ *
++ * Copyright (C) Hewlett-Packard Company.  All rights reserved.
++ *
++ * Written by Christopher Hoover <ch@hpl.hp.com>
++ *
++ * Adapted from:
++ *
++ *  linux/drivers/video/skeletonfb.c
++ *  Modified to new api Jan 2001 by James Simmons (jsimmons@transvirtual.com)
+  *  Created 28 Dec 1997 by Geert Uytterhoeven
+  *
++ *  linux/drivers/video/epson1355fb.c (2.4 driver)
++ *  Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
++ *
+  * This file is subject to the terms and conditions of the GNU General Public
+- * License.  See the file COPYING in the main directory of this archive
+- * for more details.
+- */
+-/* TODO (roughly in order of priority):
+- * 16 bpp support
+- * crt support
+- * hw cursor support
+- * SwivelView
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ *
++ * Noteworthy Issues
++ * -----------------
++ *
++ * This driver is complicated by the fact that this is a 16-bit chip
++ * and, on at least one platform (ceiva), we can only do 16-bit reads
++ * and writes to the framebuffer.  We hide this from user space
++ * except in the case of mmap().
++ *
++ *
++ * To Do
++ * -----
++ *
++ * - Test 8-bit pseudocolor mode
++ * - Allow setting bpp, virtual resolution 
++ * - Implement horizontal panning
++ * - (maybe) Implement hardware cursor
+  */
+-#include <asm/io.h>
+-#include <linux/config.h>
+-#include <linux/delay.h>
+-#include <linux/errno.h>
+-#include <linux/fb.h>
+-#include <linux/init.h>
+-#include <linux/kernel.h>
+-#include <linux/slab.h>
+-#include <linux/mm.h>
+ #include <linux/module.h>
+-#include <linux/sched.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
+ #include <linux/string.h>
++#include <linux/mm.h>
+ #include <linux/tty.h>
+-#include <video/fbcon-cfb8.h>
+-#include <video/fbcon-mfb.h>
+-#include <video/fbcon.h>
+-
+-/* Register defines.  The docs don't seem to provide nice mnemonic names
+- * so I made them up myself ... */
+-
+-#define E1355_PANEL   0x02
+-#define E1355_DISPLAY 0x0D
+-#define E1355_MISC    0x1B
+-#define E1355_GPIO    0x20
+-#define E1355_LUT_INDEX 0x24
+-#define E1355_LUT_DATA        0x26
++#include <linux/slab.h>
++#include <linux/delay.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <linux/ioport.h>
++#include <asm/types.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
++
++#include <video/epson1355.h>
++
++static struct fb_info info;
++
++static struct epson1355fb_par {
++      unsigned long reg_addr;
++} par;
++
++static u32 pseudo_palette[16];
++
++/* ------------------------------------------------------------------------- */
+ #ifdef CONFIG_SUPERH
+-#define E1355_REG_BASE        CONFIG_E1355_REG_BASE
+-#define E1355_FB_BASE CONFIG_E1355_FB_BASE
+-static inline u8 e1355_read_reg(int index)
++static inline u8 epson1355_read_reg(int index)
+ {
+-      return ctrl_inb(E1355_REG_BASE + index);
++      return ctrl_inb(par.reg_addr + index);
+ }
+-static inline void e1355_write_reg(u8 data, int index)
++static inline void epson1355_write_reg(u8 data, int index)
+ {
+-      ctrl_outb(data, E1355_REG_BASE + index);
++      ctrl_outb(data, par.reg_addr + index);
+ }
+-static inline u16 e1355_read_reg16(int index)
++#elif defined(CONFIG_ARM)
++
++# ifdef CONFIG_ARCH_CEIVA
++#  include <asm/arch/hardware.h>
++#  define EPSON1355FB_BASE_PHYS       (CEIVA_PHYS_SED1355)
++# endif
++
++static inline u8 epson1355_read_reg(int index)
+ {
+-      return e1355_read_reg(index) + (e1355_read_reg(index+1) << 8);
++      return __raw_readb(par.reg_addr + index);
+ }
+-static inline void e1355_write_reg16(u16 data, int index)
++static inline void epson1355_write_reg(u8 data, int index)
+ {
+-      e1355_write_reg((data&0xff), index);
+-      e1355_write_reg(((data>>8)&0xff), index + 1);
++      __raw_writeb(data, par.reg_addr + index);
+ }
++
+ #else
+-#error unknown architecture
++# error "no architecture-specific epson1355_{read,write}_reg"
+ #endif
+-struct e1355fb_info {
+-      struct fb_info_gen gen;
+-};
+-
+-static int current_par_valid = 0;
+-static struct display disp;
++#ifndef EPSON1355FB_BASE_PHYS
++# error  "EPSON1355FB_BASE_PHYS is not defined"
++#endif
+-static struct fb_var_screeninfo default_var;
++#define EPSON1355FB_REGS_OFS  (0)
++#define EPSON1355FB_REGS_PHYS (EPSON1355FB_BASE_PHYS + EPSON1355FB_REGS_OFS)
++#define EPSON1355FB_REGS_LEN  (64)
+-int e1355fb_init(void);
+-int e1355fb_setup(char*);
+-static int e1355_encode_var(struct fb_var_screeninfo *var, const void *par,
+-                          struct fb_info_gen *info);
+-/* ------------------- chipset specific functions -------------------------- */
++#define EPSON1355FB_FB_OFS    (0x00200000)
++#define EPSON1355FB_FB_PHYS   (EPSON1355FB_BASE_PHYS + EPSON1355FB_FB_OFS)
++#define EPSON1355FB_FB_LEN    (2 * 1024 * 1024)
++/* ------------------------------------------------------------------------- */
+-static void disable_hw_cursor(void)
++static inline u16 epson1355_read_reg16(int index)
+ {
+-      u8 curs;
++      u8 lo = epson1355_read_reg(index);
++      u8 hi = epson1355_read_reg(index + 1);
+-      curs = e1355_read_reg(0x27);
+-      curs &= ~0xc0;
+-      e1355_write_reg(curs, 0x27);
++      return (hi << 8) | lo;
+ }
+-static void e1355_detect(void)
++static inline void epson1355_write_reg16(u16 data, int index)
+ {
+-      u8 rev;
++      u8 lo = data & 0xff;
++      u8 hi = (data >> 8) & 0xff;
+-      e1355_write_reg(0x00, E1355_MISC);
++      epson1355_write_reg(lo, index);
++      epson1355_write_reg(hi, index + 1);
++}
+-      rev = e1355_read_reg(0x00);
++static inline u32 epson1355_read_reg20(int index)
++{
++      u8 b0 = epson1355_read_reg(index);
++      u8 b1 = epson1355_read_reg(index + 1);
++      u8 b2 = epson1355_read_reg(index + 2);
+-      if ((rev & 0xfc) != 0x0c) {
+-              printk(KERN_WARNING "Epson 1355 not detected\n");
+-      }
++      return (b2 & 0x0f) << 16 | (b1 << 8) | b0;
++}
+-      /* XXX */
+-      disable_hw_cursor();
++static inline void epson1355_write_reg20(u32 data, int index)
++{
++      u8 b0 = data & 0xff;
++      u8 b1 = (data >> 8) & 0xff;
++      u8 b2 = (data >> 16) & 0x0f;
+-      e1355_encode_var(&default_var, NULL, NULL);
++      epson1355_write_reg(b0, index);
++      epson1355_write_reg(b1, index + 1);
++      epson1355_write_reg(b2, index + 2);
+ }
+-struct e1355_par {
+-      u32 xres;
+-      u32 yres;
++/* ------------------------------------------------------------------------- */
+-      int bpp;
+-      int mem_bpp;
++static void set_lut(u8 index, u8 r, u8 g, u8 b)
++{
++      epson1355_write_reg(index, REG_LUT_ADDR);
++      epson1355_write_reg(r, REG_LUT_DATA);
++      epson1355_write_reg(g, REG_LUT_DATA);
++      epson1355_write_reg(b, REG_LUT_DATA);
++}
+-      u32 panel_xres;
+-      u32 panel_yres;
+-      
+-      int panel_width;
+-      int panel_ymul;
+-};
+-static int e1355_encode_fix(struct fb_fix_screeninfo *fix,
+-                          const void *raw_par,
+-                          struct fb_info_gen *info)
+-{
+-      const struct e1355_par *par = raw_par;
+-      
+-      memset(fix, 0, sizeof *fix);
+-      
+-      fix->type= FB_TYPE_PACKED_PIXELS;
++/**
++ *    epson1355fb_setcolreg - sets a color register.
++ *      @regno: Which register in the CLUT we are programming 
++ *      @red: The red value which can be up to 16 bits wide 
++ *    @green: The green value which can be up to 16 bits wide 
++ *    @blue:  The blue value which can be up to 16 bits wide.
++ *    @transp: If supported the alpha value which can be up to 16 bits wide.
++ *      @info: frame buffer info structure
++ * 
++ *    Returns negative errno on error, or zero on success.
++ */
++static int epson1355fb_setcolreg(unsigned regno, unsigned r, unsigned g,
++                               unsigned b, unsigned transp,
++                               struct fb_info *info)
++{
++      if (info->var.grayscale)
++              r = g = b = (19595 * r + 38470 * g + 7471 * b) >> 16;
++
++      switch (info->fix.visual) {
++      case FB_VISUAL_TRUECOLOR:
++              if (regno >= 16)
++                      return -EINVAL;
+-      if (!par)
+-              BUG();
++              ((u32 *) info->pseudo_palette)[regno] =
++                  (r & 0xf800) | (g & 0xfc00) >> 5 | (b & 0xf800) >> 11;
+-      if (par->bpp == 1) {
+-              fix->visual = FB_VISUAL_MONO10;
+-      } else if (par->bpp <= 8) {
+-              fix->visual = FB_VISUAL_PSEUDOCOLOR;
+-      } else {
+-              fix->visual = FB_VISUAL_TRUECOLOR;
+-      }
++              break;
++      case FB_VISUAL_PSEUDOCOLOR:
++              if (regno >= 256)
++                      return -EINVAL;
+-      return 0;
+-}
++              set_lut(regno, r >> 8, g >> 8, b >> 8);
+-static int e1355_set_bpp(struct e1355_par *par, int bpp)
+-{
+-      int code;
+-      u8 disp;
+-      u16 bytes_per_line;
+-
+-      switch(bpp) {
+-      case 1:
+-              code = 0; break;
+-      case 2:
+-              code = 1; break;
+-      case 4:
+-              code = 2; break;
+-      case 8:
+-              code = 3; break;
+-      case 16:
+-              code = 5; break;
++              break;
+       default:
+-              return -EINVAL; break;
++              return -ENOSYS;
+       }
+-
+-      disp = e1355_read_reg(E1355_DISPLAY);
+-      disp &= ~0x1c;
+-      disp |= code << 2;
+-      e1355_write_reg(disp, E1355_DISPLAY);
+-      
+-      bytes_per_line = (par->xres * bpp) >> 3;
+-      
+-      e1355_write_reg16(bytes_per_line, 0x16);
+-
+-      par->bpp = bpp;
+-
+       return 0;
+ }
+-              
+-static int e1355_decode_var(const struct fb_var_screeninfo *var,
+-                          void *raw_par,
+-                          struct fb_info_gen *info)
++
++/* ------------------------------------------------------------------------- */
++
++/**
++ *      epson1355fb_pan_display - Pans the display.
++ *      @var: frame buffer variable screen structure
++ *      @info: frame buffer structure that represents a single frame buffer
++ *
++ *    Pan (or wrap, depending on the `vmode' field) the display using the
++ *    `xoffset' and `yoffset' fields of the `var' structure.
++ *    If the values don't fit, return -EINVAL.
++ *
++ *      Returns negative errno on error, or zero on success.
++ */
++static int epson1355fb_pan_display(struct fb_var_screeninfo *var,
++                                 struct fb_info *info)
+ {
+-      struct e1355_par *par = raw_par;
+-      int ret;
++      u32 start;
+-      if (!par)
+-              BUG();
++      if (var->xoffset != 0)  /* not yet ... */
++              return -EINVAL;
+-      /*
+-       * Don't allow setting any of these yet: xres and yres don't
+-       * make sense for LCD panels; xres_virtual and yres_virtual
+-       * should be supported fine by our hardware though.
+-       */
+-      if (var->xres != par->xres ||
+-          var->yres != par->yres ||
+-          var->xres != var->xres_virtual ||
+-          var->yres != var->yres_virtual ||
+-          var->xoffset != 0 ||
+-          var->yoffset != 0)
++      if (var->yoffset + info->var.yres > info->var.yres_virtual)
+               return -EINVAL;
+-      if(var->bits_per_pixel != par->bpp) {
+-              ret = e1355_set_bpp(par, var->bits_per_pixel);
++      start = (info->fix.line_length >> 1) * var->yoffset;
+-              if (ret)
+-                      goto out_err;
+-      }
+-              
+-      return 0;
++      epson1355_write_reg20(start, REG_SCRN1_DISP_START_ADDR0);
+- out_err:
+-      return ret;
++      return 0;
+ }
+-static void dump_panel_data(void)
++/* ------------------------------------------------------------------------- */
++
++static void lcd_enable(int enable)
+ {
+-      u8 panel = e1355_read_reg(E1355_PANEL);
+-      int width[2][4] = { { 4, 8, 16, -1 }, { 9, 12, 16, -1 } };
++      u8 mode = epson1355_read_reg(REG_DISPLAY_MODE);
+-      printk("%s %s %s panel, width %d bits\n",
+-             panel & 2 ? "dual" : "single",
+-             panel & 4 ? "color" : "mono",
+-             panel & 1 ? "TFT" : "passive",
+-             width[panel&1][(panel>>4)&3]);
++      if (enable)
++              mode |= 1;
++      else
++              mode &= ~1;
+-      printk("resolution %d x %d\n",
+-             (e1355_read_reg(0x04) + 1) * 8,
+-             ((e1355_read_reg16(0x08) + 1) * (1 + ((panel & 3) == 2))));
++      epson1355_write_reg(mode, REG_DISPLAY_MODE);
+ }
+-static int e1355_bpp_to_var(int bpp, struct fb_var_screeninfo *var)
++#if defined(CONFIG_ARCH_CEIVA)
++static void backlight_enable(int enable)
+ {
+-      switch(bpp) {
+-      case 1:
+-      case 2:
+-      case 4:
+-      case 8:
+-              var->bits_per_pixel = bpp;
+-              var->red.offset = var->green.offset = var->blue.offset = 0;
+-              var->red.length = var->green.length = var->blue.length = bpp;
++      /* ### this should be protected by a spinlock ... */
++      u8 pddr = clps_readb(PDDR);
++      if (enable)
++              pddr |= (1 << 5);
++      else
++              pddr &= ~(1 << 5);
++      clps_writeb(pddr, PDDR);
++}
++#else
++static void backlight_enable(int enable)
++{
++}
++#endif
++
++
++/**
++ *      epson1355fb_blank - blanks the display.
++ *      @blank_mode: the blank mode we want. 
++ *      @info: frame buffer structure that represents a single frame buffer
++ *
++ *      Blank the screen if blank_mode != 0, else unblank. Return 0 if
++ *      blanking succeeded, != 0 if un-/blanking failed due to e.g. a 
++ *      video mode which doesn't support it. Implements VESA suspend
++ *      and powerdown modes on hardware that supports disabling hsync/vsync:
++ *      blank_mode == 2: suspend vsync
++ *      blank_mode == 3: suspend hsync
++ *      blank_mode == 4: powerdown
++ *
++ *      Returns negative errno on error, or zero on success.
++ *
++ */
++static int epson1355fb_blank(int blank_mode, struct fb_info *info)
++{
++      switch (blank_mode) {
++      case VESA_NO_BLANKING:
++              lcd_enable(1);
++              backlight_enable(1);
+               break;
+-      case 16:
+-              var->bits_per_pixel = 16;
+-              var->red.offset = 11;
+-              var->red.length = 5;
+-              var->green.offset = 5;
+-              var->green.length = 6;
+-              var->blue.offset = 0;
+-              var->blue.length = 5;
++      case VESA_VSYNC_SUSPEND:
++      case VESA_HSYNC_SUSPEND:
++              backlight_enable(0);
+               break;
++      case VESA_POWERDOWN:
++              backlight_enable(0);
++              lcd_enable(0);
++              break;
++      default:
++              return -EINVAL;
+       }
+-
+       return 0;
+ }
+-static int e1355_encode_var(struct fb_var_screeninfo *var, const void *raw_par,
+-                          struct fb_info_gen *info)
++/* ------------------------------------------------------------------------- */
++
++/*
++ * We can't use the cfb generic routines, as we have to limit
++ * ourselves to 16-bit or 8-bit loads and stores to this 16-bit
++ * chip.
++ */
++
++static inline void epson1355fb_fb_writel(unsigned long v, unsigned long *a)
+ {
+-      u8 panel, display;
+-      u32 xres, xres_virtual, yres;
+-      static int width[2][4] = { { 4, 8, 16, -1 }, { 9, 12, 16, -1 } };
+-      static int bpp_tab[8] = { 1, 2, 4, 8, 15, 16 };
+-      int bpp, hw_bpp;
+-      int is_color, is_dual, is_tft;
+-      int lcd_enabled, crt_enabled;
++      u16 *p = (u16 *) a;
++      u16 l = v & 0xffff;
++      u16 h = v >> 16;
+-      panel = e1355_read_reg(E1355_PANEL);
+-      display = e1355_read_reg(E1355_DISPLAY);
++      fb_writew(l, p);
++      fb_writew(h, p + 1);
++}
+-      is_color = (panel & 0x04) != 0;
+-      is_dual  = (panel & 0x02) != 0;
+-      is_tft   = (panel & 0x01) != 0;
++static inline unsigned long epson1355fb_fb_readl(const unsigned long *a)
++{
++      const u16 *p = (u16 *) a;
++      u16 l = fb_readw(p);
++      u16 h = fb_readw(p + 1);
+-      bpp = bpp_tab[(display>>2)&7]; 
+-      e1355_bpp_to_var(bpp, var);
++      return (h << 16) | l;
++}
+-      crt_enabled = (display & 0x02) != 0;
+-      lcd_enabled = (display & 0x02) != 0;
++#define FB_READL epson1355fb_fb_readl
++#define FB_WRITEL epson1355fb_fb_writel
+-      hw_bpp = width[is_tft][(panel>>4)&3];
++/* ------------------------------------------------------------------------- */
+-      xres = e1355_read_reg(0x04) + 1;
+-      yres = e1355_read_reg16(0x08) + 1;
+-      
+-      xres *= 8;
+-      /* talk about weird hardware .. */
+-      yres *= (is_dual && !crt_enabled) ? 2 : 1;
+-
+-      xres_virtual = e1355_read_reg16(0x16);
+-      /* it's in 2-byte words initially */
+-      xres_virtual *= 16;
+-      xres_virtual /= var->bits_per_pixel;
++static inline unsigned long copy_from_user16(void *to, const void *from,
++                                           unsigned long n)
++{
++      u16 *dst = (u16 *) to;
++      u16 *src = (u16 *) from;
+-      var->xres = xres;
+-      var->yres = yres;
+-      var->xres_virtual = xres_virtual;
+-      var->yres_virtual = yres;
++      if (!access_ok(VERIFY_READ, from, n))
++              return n;
+-      var->xoffset = var->yoffset = 0;
++      while (n > 1) {
++              u16 v;
++              if (__get_user(v, src))
++                      return n;
+-      var->grayscale = !is_color;
+-      
+-      return 0;
+-}
++              fb_writew(v, dst);
+-#define is_dual(panel) (((panel)&3)==2)
++              src++, dst++;
++              n -= 2;
++      }
+-static void get_panel_data(struct e1355_par *par)
+-{
+-      u8 panel;
+-      int width[2][4] = { { 4, 8, 16, -1 }, { 9, 12, 16, -1 } };
++      if (n) {
++              u8 v;
+-      panel = e1355_read_reg(E1355_PANEL);
++              if (__get_user(v, ((u8 *) src)))
++                      return n;
+-      par->panel_width = width[panel&1][(panel>>4)&3];
+-      par->panel_xres = (e1355_read_reg(0x04) + 1) * 8;
+-      par->panel_ymul = is_dual(panel) ? 2 : 1;
+-      par->panel_yres = ((e1355_read_reg16(0x08) + 1)
+-                         * par->panel_ymul);
++              fb_writeb(v, dst);
++      }
++      return 0;
+ }
+-static void e1355_get_par(void *raw_par, struct fb_info_gen *info)
++static inline unsigned long copy_to_user16(void *to, const void *from,
++                                         unsigned long n)
+ {
+-      struct e1355_par *par = raw_par;
++      u16 *dst = (u16 *) to;
++      u16 *src = (u16 *) from;
+-      get_panel_data(par);
+-}
++      if (!access_ok(VERIFY_WRITE, to, n))
++              return n;
+-static void e1355_set_par(const void *par, struct fb_info_gen *info)
+-{
+-}
++      while (n > 1) {
++              u16 v = fb_readw(src);
+-static int e1355_getcolreg(unsigned regno, unsigned *red, unsigned *green,
+-                         unsigned *blue, unsigned *transp,
+-                         struct fb_info *info)
+-{
+-      u8 r, g, b;
++              if (__put_user(v, dst))
++                      return n;
+-      e1355_write_reg(regno, E1355_LUT_INDEX);
+-      r = e1355_read_reg(E1355_LUT_DATA);
+-      g = e1355_read_reg(E1355_LUT_DATA);
+-      b = e1355_read_reg(E1355_LUT_DATA);
++              src++, dst++;
++              n -= 2;
++      }
+-      *red = r << 8;
+-      *green = g << 8;
+-      *blue = b << 8;
++      if (n) {
++              u8 v = fb_readb(src);
++              if (__put_user(v, ((u8 *) dst)))
++                      return n;
++      }
+       return 0;
+ }
+-static int e1355fb_setcolreg(unsigned regno, unsigned red, unsigned green,
+-                           unsigned blue, unsigned transp,
+-                           struct fb_info *info)
+-{
+-      u8 r = (red >> 8) & 0xf0;
+-      u8 g = (green>>8) & 0xf0;
+-      u8 b = (blue>> 8) & 0xf0;
+-
+-      e1355_write_reg(regno, E1355_LUT_INDEX);
+-      e1355_write_reg(r, E1355_LUT_DATA);
+-      e1355_write_reg(g, E1355_LUT_DATA);
+-      e1355_write_reg(b, E1355_LUT_DATA);
+-      
+-      return 0;
+-}
+-static int e1355_pan_display(const struct fb_var_screeninfo *var,
+-                           struct fb_info_gen *info)
++static ssize_t
++epson1355fb_read(struct file *file, char *buf, size_t count, loff_t * ppos)
+ {
+-      BUG();
+-      
+-      return -EINVAL;
++      unsigned long p = *ppos;
++
++      /* from fbmem.c except for our own copy_*_user */
++      if (p >= info.fix.smem_len)
++              return 0;
++      if (count >= info.fix.smem_len)
++              count = info.fix.smem_len;
++      if (count + p > info.fix.smem_len)
++              count = info.fix.smem_len - p;
++
++      if (count) {
++              char *base_addr;
++
++              base_addr = info.screen_base;
++              count -= copy_to_user16(buf, base_addr + p, count);
++              if (!count)
++                      return -EFAULT;
++              *ppos += count;
++      }
++      return count;
+ }
+-/*
+- * The AERO_HACKS parts disable/enable the backlight on the Compaq Aero 8000.
+- * I'm not sure they aren't dangerous to the hardware, so be warned.
+- */
+-#undef AERO_HACKS
++static ssize_t
++epson1355fb_write(struct file *file, const char *buf,
++                size_t count, loff_t * ppos)
++{
++      unsigned long p = *ppos;
++      int err;
++
++      /* from fbmem.c except for our own copy_*_user */
++      if (p > info.fix.smem_len)
++              return -ENOSPC;
++      if (count >= info.fix.smem_len)
++              count = info.fix.smem_len;
++      err = 0;
++      if (count + p > info.fix.smem_len) {
++              count = info.fix.smem_len - p;
++              err = -ENOSPC;
++      }
+-static int e1355_blank(int blank_mode, struct fb_info_gen *info)
+-{
+-      u8 disp;
++      if (count) {
++              char *base_addr;
+-      switch (blank_mode) {
+-      case VESA_NO_BLANKING:
+-              disp = e1355_read_reg(E1355_DISPLAY);
+-              disp |= 1;
+-              e1355_write_reg(disp, E1355_DISPLAY);
+-              
+-#ifdef AERO_HACKS
+-              e1355_write_reg(0x6, 0x20);
+-#endif
+-              break;
++              base_addr = info.screen_base;
++              count -= copy_from_user16(base_addr + p, buf, count);
++              *ppos += count;
++              err = -EFAULT;
++      }
++      if (count)
++              return count;
++      return err;
++}
++
++/* ------------------------------------------------------------------------- */
++
++static struct fb_ops epson1355fb_fbops = {
++      .owner          = THIS_MODULE,
++      .fb_setcolreg   = epson1355fb_setcolreg,
++      .fb_pan_display = epson1355fb_pan_display,
++      .fb_blank       = epson1355fb_blank,
++      .fb_fillrect    = cfb_fillrect,
++      .fb_copyarea    = cfb_copyarea,
++      .fb_imageblit   = cfb_imageblit,
++      .fb_read        = epson1355fb_read,
++      .fb_write       = epson1355fb_write,
++      .fb_cursor      = soft_cursor,
++};
+-      case VESA_VSYNC_SUSPEND:
+-      case VESA_HSYNC_SUSPEND:
+-      case VESA_POWERDOWN:
+-              disp = e1355_read_reg(E1355_DISPLAY);
+-              disp &= ~1;
+-              e1355_write_reg(disp, E1355_DISPLAY);
++/* ------------------------------------------------------------------------- */
+-#ifdef AERO_HACKS
+-              e1355_write_reg(0x0, 0x20);
+-#endif
+-              break;
++static __init unsigned int get_fb_size(struct fb_info *info)
++{
++      unsigned int size = 2 * 1024 * 1024;
++      char *p = info->screen_base;
+-      default:
+-              return -EINVAL;
+-      }
++      /* the 512k framebuffer is aliased at start + 0x80000 * n */
++      fb_writeb(1, p);
++      fb_writeb(0, p + 0x80000);
++      if (!fb_readb(p))
++              size = 512 * 1024;
+-      return 0;
++      fb_writeb(0, p);
++
++      return size;
+ }
+-static struct display_switch e1355_dispsw;
++static int epson1355_width_tab[2][4] __initdata =
++    { {4, 8, 16, -1}, {9, 12, 16, -1} };
++static int epson1355_bpp_tab[8] __initdata = { 1, 2, 4, 8, 15, 16 };
+-static void e1355_set_disp(const void *unused, struct display *disp,
+-                         struct fb_info_gen *info)
++static void __init fetch_hw_state(struct fb_info *info)
+ {
+-      struct display_switch *d;
++      struct fb_var_screeninfo *var = &info->var;
++      struct fb_fix_screeninfo *fix = &info->fix;
++      u8 panel, display;
++      u16 offset;
++      u32 xres, yres;
++      u32 xres_virtual, yres_virtual;
++      int bpp, lcd_bpp;
++      int is_color, is_dual, is_tft;
++      int lcd_enabled, crt_enabled;
++
++      fix->type = FB_TYPE_PACKED_PIXELS;
++
++      display = epson1355_read_reg(REG_DISPLAY_MODE);
++      bpp = epson1355_bpp_tab[(display >> 2) & 7];
+-      disp->dispsw = &e1355_dispsw;
+-      
+-      switch(disp->var.bits_per_pixel) {
+-#ifdef FBCON_HAS_MFB
+-      case 1:
+-              d = &fbcon_mfb; break;
+-#endif               
+-#ifdef FBCON_HAS_CFB8
++      switch (bpp) {
+       case 8:
+-              d = &fbcon_cfb8; break;
+-#endif
++              fix->visual = FB_VISUAL_PSEUDOCOLOR;
++              var->bits_per_pixel = 8;
++              var->red.offset = var->green.offset = var->blue.offset = 0;
++              var->red.length = var->green.length = var->blue.length = 8;
++              break;
++      case 16:
++              /* 5-6-5 RGB */
++              fix->visual = FB_VISUAL_TRUECOLOR;
++              var->bits_per_pixel = 16;
++              var->red.offset = 11;
++              var->red.length = 5;
++              var->green.offset = 5;
++              var->green.length = 6;
++              var->blue.offset = 0;
++              var->blue.length = 5;
++              break;
+       default:
+-              BUG(); break;
++              BUG();
+       }
+-      memcpy(&e1355_dispsw, d, sizeof *d);
++      if (fix->visual == FB_VISUAL_TRUECOLOR) {
++              info->pseudo_palette = &pseudo_palette;
++              fb_alloc_cmap(&(info->cmap), 16, 0);
++      } else
++              fb_alloc_cmap(&(info->cmap), 1 << bpp, 0);
++
++      panel = epson1355_read_reg(REG_PANEL_TYPE);
++      is_color = (panel & 0x04) != 0;
++      is_dual = (panel & 0x02) != 0;
++      is_tft = (panel & 0x01) != 0;
++      crt_enabled = (display & 0x02) != 0;
++      lcd_enabled = (display & 0x01) != 0;
++      lcd_bpp = epson1355_width_tab[is_tft][(panel >> 4) & 3];
++
++      xres = (epson1355_read_reg(REG_HORZ_DISP_WIDTH) + 1) * 8;
++      yres = (epson1355_read_reg16(REG_VERT_DISP_HEIGHT0) + 1) *
++          ((is_dual && !crt_enabled) ? 2 : 1);
++      offset = epson1355_read_reg16(REG_MEM_ADDR_OFFSET0) & 0x7ff;
++      xres_virtual = offset * 16 / bpp;
++      yres_virtual = fix->smem_len / (offset * 2);
++
++      var->xres = xres;
++      var->yres = yres;
++      var->xres_virtual = xres_virtual;
++      var->yres_virtual = yres_virtual;
++      var->xoffset = var->yoffset = 0;
++
++      fix->line_length = offset * 2;
++
++      fix->xpanstep = 0;      /* no pan yet */
++      fix->ypanstep = 1;
++      fix->ywrapstep = 0;
++      fix->accel = FB_ACCEL_NONE;
++
++      var->grayscale = !is_color;
+-      /* reading is terribly slow for us */
+-#if 0 /* XXX: need to work out why this doesn't work */
+-      e1355_dispsw.bmove = fbcon_redraw_bmove;
++#ifdef DEBUG
++      printk(KERN_INFO
++             "epson1355fb: xres=%d, yres=%d, "
++             "is_color=%d, is_dual=%d, is_tft=%d\n",
++             xres, yres, is_color, is_dual, is_tft);
++      printk(KERN_INFO
++             "epson1355fb: bpp=%d, lcd_bpp=%d, "
++             "crt_enabled=%d, lcd_enabled=%d\n",
++             bpp, lcd_bpp, crt_enabled, lcd_enabled);
+ #endif
+ }
+-/* ------------ Interfaces to hardware functions ------------ */
++static void clearfb16(struct fb_info *info)
++{
++      u16 *dst = (u16 *) info->screen_base;
++      unsigned long n = info->fix.smem_len;
+-struct fbgen_hwswitch e1355_switch = {
+-      .detect =       e1355_detect,
+-      .encode_fix =   e1355_encode_fix,
+-      .decode_var =   e1355_decode_var,
+-      .encode_var =   e1355_encode_var,
+-      .get_par =      e1355_get_par,
+-      .set_par =      e1355_set_par,
+-      .getcolreg =    e1355_getcolreg,
+-      .pan_display =  e1355_pan_display,
+-      .blank =        e1355_blank,
+-      .set_disp =     e1355_set_disp,
+-};
++      while (n > 1) {
++              fb_writew(0, dst);
++              dst++, n -= 2;
++      }
++      if (n)
++              fb_writeb(0, dst);
++}
+-/* ------------ Hardware Independent Functions ------------ */
++static void epson1355fb_deinit(void);
++int __init epson1355fb_init(void)
++{
++      u8 revision;
++      int rc = 0;
+-static struct fb_ops e1355fb_ops = {
+-      .owner =        THIS_MODULE,
+-      .fb_get_fix =   fbgen_get_fix,
+-      .fb_get_var =   fbgen_get_var,
+-      .fb_set_var =   fbgen_set_var,
+-      .fb_get_cmap =  fbgen_get_cmap,
+-      .fb_set_cmap =  gen_set_cmap,
+-      .fb_setcolreg = e1355fb_setcolreg,
+-      .fb_pan_display =fbgen_pan_display,
+-      .fb_blank =     fbgen_blank,
+-};
++      if (!request_mem_region
++          (EPSON1355FB_REGS_PHYS, EPSON1355FB_REGS_LEN,
++           "S1D13505 registers")) {
++              printk(KERN_ERR "epson1355fb: unable to reserve "
++                     "registers at 0x%0x\n", EPSON1355FB_REGS_PHYS);
++              rc = -EBUSY;
++              goto bail;
++      }
+-static struct e1355fb_info fb_info;
++      if (!request_mem_region(EPSON1355FB_FB_PHYS, EPSON1355FB_FB_LEN,
++                              "S1D13505 framebuffer")) {
++              printk(KERN_ERR "epson1355fb: unable to reserve "
++                     "framebuffer at 0x%0x\n", EPSON1355FB_FB_PHYS);
++              rc = -EBUSY;
++              goto bail;
++      }
++
++      par.reg_addr = (unsigned long)
++          ioremap(EPSON1355FB_REGS_PHYS, EPSON1355FB_REGS_LEN);
++      if (!par.reg_addr) {
++              printk(KERN_ERR "epson1355fb: unable to map registers\n");
++              rc = -ENOMEM;
++              goto bail;
++      }
++
++      info.screen_base =
++          ioremap(EPSON1355FB_FB_PHYS, EPSON1355FB_FB_LEN);
++      if (!info.screen_base) {
++              printk(KERN_ERR
++                     "epson1355fb: unable to map framebuffer\n");
++              rc = -ENOMEM;
++              goto bail;
++      }
++
++      revision = epson1355_read_reg(REG_REVISION_CODE);
++      if ((revision >> 2) != 3) {
++              printk(KERN_INFO "epson1355fb: epson1355 not found\n");
++              rc = -ENODEV;
++              goto bail;
++      }
++
++      info.fix.mmio_start = EPSON1355FB_REGS_PHYS;
++      info.fix.mmio_len = EPSON1355FB_REGS_LEN;
++      info.fix.smem_start = EPSON1355FB_FB_PHYS;
++      info.fix.smem_len = get_fb_size(&info);
++
++      printk(KERN_INFO
++             "epson1355fb: regs mapped at 0x%lx, fb %d KiB mapped at 0x%p\n",
++             par.reg_addr, info.fix.smem_len / 1024, info.screen_base);
++
++      strcpy(info.fix.id, "S1D13505");
++      info.par = &par;
++      info.node = NODEV;
++      info.fbops = &epson1355fb_fbops;
++      info.flags = FBINFO_FLAG_DEFAULT;
++
++      /* we expect the boot loader to have initialized the chip
++         with appropriate parameters from which we can determinte
++         the flavor of lcd panel attached */
++      fetch_hw_state(&info);
++
++      /* turn this puppy on ... */
++      clearfb16(&info);
++      backlight_enable(1);
++      lcd_enable(1);
++
++      if (register_framebuffer(&info) < 0) {
++              rc = -EINVAL;
++              goto bail;
++      }
++
++      printk(KERN_INFO "fb%d: %s frame buffer device\n",
++             minor(info.node), info.fix.id);
+-int __init e1355fb_setup(char *str)
+-{
+       return 0;
++
++      bail:
++      epson1355fb_deinit();
++      return rc;
+ }
+-int __init e1355fb_init(void)
++static void epson1355fb_deinit(void)
+ {
+-      fb_info.gen.fbhw = &e1355_switch;
+-      fb_info.gen.fbhw->detect();
+-      strcpy(fb_info.gen.info.modename, "SED1355");
+-      fb_info.gen.info.changevar = NULL;
+-      fb_info.gen.info.fbops = &e1355fb_ops;
+-      fb_info.gen.info.screen_base = (void *)E1355_FB_BASE;
+-      fb_info.gen.currcon = -1;
+-      fb_info.gen.info.disp = &disp;
+-      fb_info.gen.parsize = sizeof(struct e1355_par);
+-      fb_info.gen.info.switch_con = &fbgen_switch;
+-      fb_info.gen.info.updatevar = &fbgen_update_var;
+-      fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT;
+-      /* This should give a reasonable default video mode */
+-      fbgen_get_var(&disp.var, -1, &fb_info.gen.info);
+-      fbgen_do_set_var(&disp.var, 1, &fb_info.gen);
+-      fbgen_set_disp(-1, &fb_info.gen);
+-      if (disp.var.bits_per_pixel > 1) 
+-              do_install_cmap(0, &fb_info.gen);
+-      if (register_framebuffer(&fb_info.gen.info) < 0)
+-              return -EINVAL;
+-      printk(KERN_INFO "fb%d: %s frame buffer device\n", fb_info.gen.info.node,
+-             fb_info.gen.info.modename);
++      fb_dealloc_cmap(&info.cmap);
+-      return 0;
++      if (info.screen_base)
++              iounmap(info.screen_base);
++      if (par.reg_addr)
++              iounmap((void *) par.reg_addr);
++
++      release_mem_region(EPSON1355FB_FB_PHYS, EPSON1355FB_FB_LEN);
++      release_mem_region(EPSON1355FB_REGS_PHYS, EPSON1355FB_REGS_LEN);
+ }
++static void __exit epson1355fb_cleanup(void)
++{
++      backlight_enable(0);
++      lcd_enable(0);
+-    /*
+-     *  Cleanup
+-     */
+-
+-void e1355fb_cleanup(struct fb_info *info)
+-{
+-      /*
+-       *  If your driver supports multiple boards, you should unregister and
+-       *  clean up all instances.
+-       */
+-      
+-      unregister_framebuffer(info);
+-      /* ... */
++      unregister_framebuffer(&info);
++      epson1355fb_deinit();
+ }
++/* ------------------------------------------------------------------------- */
++
++#ifdef MODULE
++module_init(epson1355fb_init);
++#endif
++module_exit(epson1355fb_cleanup);
++
++MODULE_AUTHOR("Christopher Hoover <ch@hpl.hp.com>");
++MODULE_DESCRIPTION("Framebuffer driver for Epson S1D13505");
+ MODULE_LICENSE("GPL");
+--- linux-2.6.0-test1/drivers/video/fbmem.c    2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/video/fbmem.c   2003-07-19 17:04:55.000000000 -0700
+@@ -25,7 +25,6 @@
+ #include <linux/mman.h>
+ #include <linux/tty.h>
+ #include <linux/init.h>
+-#include <linux/linux_logo.h>
+ #include <linux/proc_fs.h>
+ #ifdef CONFIG_KMOD
+ #include <linux/kmod.h>
+@@ -102,13 +101,13 @@ extern int hgafb_setup(char*);
+ extern int matroxfb_init(void);
+ extern int matroxfb_setup(char*);
+ extern int hpfb_init(void);
+-extern int control_init(void);
+-extern int control_setup(char*);
+-extern int platinum_init(void);
+-extern int platinum_setup(char*);
++extern int controlfb_init(void);
++extern int controlfb_setup(char*);
++extern int platinumfb_init(void);
++extern int platinumfb_setup(char*);
+ extern int valkyriefb_init(void);
+ extern int valkyriefb_setup(char*);
+-extern int chips_init(void);
++extern int chipsfb_init(void);
+ extern int g364fb_init(void);
+ extern int sa1100fb_init(void);
+ extern int fm2fb_init(void);
+@@ -135,8 +134,7 @@ extern int tx3912fb_init(void);
+ extern int tx3912fb_setup(char*);
+ extern int radeonfb_init(void);
+ extern int radeonfb_setup(char*);
+-extern int e1355fb_init(void);
+-extern int e1355fb_setup(char*);
++extern int epson1355fb_init(void);
+ extern int pvr2fb_init(void);
+ extern int pvr2fb_setup(char*);
+ extern int sstfb_init(void);
+@@ -218,16 +216,16 @@ static struct {
+       { "radeonfb", radeonfb_init, radeonfb_setup },
+ #endif
+ #ifdef CONFIG_FB_CONTROL
+-      { "controlfb", control_init, control_setup },
++      { "controlfb", controlfb_init, controlfb_setup },
+ #endif
+ #ifdef CONFIG_FB_PLATINUM
+-      { "platinumfb", platinum_init, platinum_setup },
++      { "platinumfb", platinumfb_init, platinumfb_setup },
+ #endif
+ #ifdef CONFIG_FB_VALKYRIE
+       { "valkyriefb", valkyriefb_init, valkyriefb_setup },
+ #endif
+ #ifdef CONFIG_FB_CT65550
+-      { "chipsfb", chips_init, NULL },
++      { "chipsfb", chipsfb_init, NULL },
+ #endif
+ #ifdef CONFIG_FB_IMSTT
+       { "imsttfb", imsttfb_init, imsttfb_setup },
+@@ -342,8 +340,8 @@ static struct {
+ #ifdef CONFIG_FB_TX3912
+       { "tx3912fb", tx3912fb_init, tx3912fb_setup },
+ #endif
+-#ifdef CONFIG_FB_E1355
+-      { "e1355fb", e1355fb_init, e1355fb_setup },
++#ifdef CONFIG_FB_EPSON1355
++      { "s1d1355fb", epson1355fb_init, NULL },
+ #endif
+ #ifdef CONFIG_FB_PVR2
+       { "pvr2fb", pvr2fb_init, pvr2fb_setup },
+@@ -409,20 +407,20 @@ void sys_outbuf(u8 *src, u8 *dst, unsign
+       memcpy(dst, src, size);
+ }     
+-void move_buf_aligned(struct fb_info *info, u8 *dst, u8 *src, u32 d_pitch, 
+-                      u32 s_pitch, u32 height)
++void move_buf_aligned(struct fb_info *info, struct fb_pixmap *buf, u8 *dst, u8 *src,
++                      u32 d_pitch, u32 s_pitch, u32 height)
+ {
+       int i;
+       for (i = height; i--; ) {
+-              info->pixmap.outbuf(src, dst, s_pitch);
++              buf->outbuf(src, dst, s_pitch);
+               src += s_pitch;
+               dst += d_pitch;
+       }
+ }
+-void move_buf_unaligned(struct fb_info *info, u8 *dst, u8 *src, u32 d_pitch, 
+-                      u32 height, u32 mask, u32 shift_high, u32 shift_low,
++void move_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf, u8 *dst, u8 *src, 
++                      u32 d_pitch, u32 height, u32 mask, u32 shift_high, u32 shift_low,
+                       u32 mod, u32 idx)
+ {
+       int i, j;
+@@ -430,21 +428,21 @@ void move_buf_unaligned(struct fb_info *
+       for (i = height; i--; ) {
+               for (j = 0; j < idx; j++) {
+-                      tmp = info->pixmap.inbuf(dst+j);
++                      tmp = buf->inbuf(dst+j);
+                       tmp &= mask;
+                       tmp |= *src >> shift_low;
+-                      info->pixmap.outbuf(&tmp, dst+j, 1);
++                      buf->outbuf(&tmp, dst+j, 1);
+                       tmp = *src << shift_high;
+-                      info->pixmap.outbuf(&tmp, dst+j+1, 1);
++                      buf->outbuf(&tmp, dst+j+1, 1);
+                       src++;
+               }
+-              tmp = info->pixmap.inbuf(dst+idx);
++              tmp = buf->inbuf(dst+idx);
+               tmp &= mask;
+               tmp |= *src >> shift_low;
+-              info->pixmap.outbuf(&tmp, dst+idx, 1);
++              buf->outbuf(&tmp, dst+idx, 1);
+               if (shift_high < mod) {
+                       tmp = *src << shift_high;
+-                      info->pixmap.outbuf(&tmp, dst+idx+1, 1);
++                      buf->outbuf(&tmp, dst+idx+1, 1);
+               }       
+               src++;
+               dst += d_pitch;
+@@ -455,26 +453,29 @@ void move_buf_unaligned(struct fb_info *
+  * we need to lock this section since fb_cursor
+  * may use fb_imageblit()
+  */
+-u32 fb_get_buffer_offset(struct fb_info *info, u32 size)
++char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size)
+ {
+-      u32 align = info->pixmap.buf_align - 1;
++      u32 align = buf->buf_align - 1;
+       u32 offset, count = 1000;
++      char *addr = buf->addr;
+-      spin_lock(&info->pixmap.lock);
+-      offset = info->pixmap.offset + align;
+-      offset &= ~align;
+-      if (offset + size > info->pixmap.size) {
+-              while (atomic_read(&info->pixmap.count) && count--);
+-              if (info->fbops->fb_sync && 
+-                  info->pixmap.flags & FB_PIXMAP_SYNC)
+-                      info->fbops->fb_sync(info);
+-              offset = 0;
++      spin_lock(&buf->lock);
++      if (!(buf->flags & FB_PIXMAP_IO)) { 
++              offset = buf->offset + align;
++              offset &= ~align;
++              if (offset + size > buf->size) {
++                      while (atomic_read(&buf->count) && count--);
++                      if (info->fbops->fb_sync && (buf->flags & FB_PIXMAP_SYNC))
++                              info->fbops->fb_sync(info);
++                      offset = 0;
++              }
++              buf->offset = offset + size;
++              addr += offset; 
+       }
+-      info->pixmap.offset = offset + size;
+-      atomic_inc(&info->pixmap.count);        
++      atomic_inc(&buf->count);
+       smp_mb__after_atomic_inc();
+-      spin_unlock(&info->pixmap.lock);
+-      return offset;
++      spin_unlock(&buf->lock);
++      return addr;
+ }
+ #ifdef CONFIG_LOGO
+@@ -656,7 +657,7 @@ int fb_prepare_logo(struct fb_info *info
+       }
+       /* Return if no suitable logo was found */
+-      fb_logo.logo = fb_find_logo(info->var.bits_per_pixel);
++      fb_logo.logo = find_logo(info->var.bits_per_pixel);
+       
+       if (!fb_logo.logo || fb_logo.logo->height > info->var.yres) {
+               fb_logo.logo = NULL;
+@@ -726,8 +727,6 @@ int fb_show_logo(struct fb_info *info)
+            x <= info->var.xres-fb_logo.logo->width; x += (fb_logo.logo->width + 8)) {
+               image.dx = x;
+               info->fbops->fb_imageblit(info, &image);
+-              //atomic_dec(&info->pixmap.count);
+-              //smp_mb__after_atomic_dec();
+       }
+       
+       if (palette != NULL)
+@@ -1238,6 +1237,22 @@ register_framebuffer(struct fb_info *fb_
+               fb_info->pixmap.inbuf = sys_inbuf;
+       spin_lock_init(&fb_info->pixmap.lock);
++      if (fb_info->sprite.addr == NULL) {
++              fb_info->sprite.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);
++              if (fb_info->sprite.addr) {
++                      fb_info->sprite.size = FBPIXMAPSIZE;
++                      fb_info->sprite.buf_align = 1;
++                      fb_info->sprite.scan_align = 1;
++                      fb_info->sprite.flags = FB_PIXMAP_IO;
++              }
++      }       
++      fb_info->sprite.offset = 0;
++      if (fb_info->sprite.outbuf == NULL)
++              fb_info->sprite.outbuf = sys_outbuf;
++      if (fb_info->sprite.inbuf == NULL)
++              fb_info->sprite.inbuf = sys_inbuf;
++      spin_lock_init(&fb_info->sprite.lock);
++
+       registered_fb[i] = fb_info;
+       devfs_mk_cdev(MKDEV(FB_MAJOR, i),
+--- linux-2.6.0-test1/drivers/video/g364fb.c   2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/video/g364fb.c  2003-07-19 17:04:55.000000000 -0700
+@@ -127,20 +127,55 @@ static struct fb_ops g364fb_ops = {
+ int g364fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
+ {
++
++      /* Turn the cursor off before we start changing it. */
++      *(unsigned int *) CTLA_REG |= CURS_TOGGLE;
++
++      if (cursor->set & FB_CUR_SETHOT)
++              info->cursor.hot = cursor->hot;
+       
+-      switch (cursor->enable) {
+-      case CM_ERASE:
+-              *(unsigned int *) CTLA_REG |= CURS_TOGGLE;
+-              break;
++      if (cursor->set & FB_CUR_SETPOS) {
++              unsigned int tmp;
++              
++              info->cursor.image.dx = cursor->image.dx;
++              info->cursor.image.dy = cursor->image.dy;
++
++              tmp = cursor->image.dy - info->var.yoffset;
++              tmp |= (cursor->image.dx - info->var.xoffset) << 12;    
++              
++              *(unsigned int *) CURS_POS_REG = tmp;
++      }
+-      case CM_MOVE:
+-      case CM_DRAW:
++      if (cursor->set & FB_CUR_SETSIZE) {
++              info->cursor.image.height = cursor->image.height;
++              info->cursor.image.width = cursor->image.width;
++      
++              /* set the whole cursor to transparent */
++              for (i = 0; i < 512; i++)
++                      *(unsigned short *) (CURS_PAT_REG + i * 8) = 0;
++      }       
++
++      if (cursor->set & FB_CUR_SETCMAP) {
++              volatile unsigned int *curs_pal_ptr =
++                              (volatile unsigned int *) CURS_PAL_REG;
++
++              /* setup cursor */
++              curs_pal_ptr[0] |= 0x00ffffff;
++              curs_pal_ptr[2] |= 0x00ffffff;
++              curs_pal_ptr[4] |= 0x00ffffff;
++      }       
++      
++      if (cursor->set & FB_CUR_SETSHAPE) {
++              /*
++               * switch the last two lines to cursor palette 3
++               * we assume here, that FONTSIZE_X is 8
++               */
++              *(unsigned short *) (CURS_PAT_REG + 14 * 64) = 0xffff;
++              *(unsigned short *) (CURS_PAT_REG + 15 * 64) = 0xffff;
++      }       
++      
++      if (info->cursor.enable)
+               *(unsigned int *) CTLA_REG &= ~CURS_TOGGLE;
+-              *(unsigned int *) CURS_POS_REG =
+-                  ((x * fontwidth(p)) << 12) | ((y * fontheight(p)) -
+-                                                info->var.yoffset);
+-              break;
+-      }
+       return 0;
+ }
+@@ -196,10 +231,6 @@ static int g364fb_setcolreg(u_int regno,
+  */
+ int __init g364fb_init(void)
+ {
+-      volatile unsigned int *pal_ptr =
+-          (volatile unsigned int *) CLR_PAL_REG;
+-      volatile unsigned int *curs_pal_ptr =
+-          (volatile unsigned int *) CURS_PAL_REG;
+       int mem, i, j;
+       /* TBD: G364 detection */
+@@ -212,23 +243,6 @@ int __init g364fb_init(void)
+           (*((volatile unsigned int *) VDISPLAY_REG) & 0x00ffffff) / 2;
+       *(volatile unsigned int *) CTLA_REG |= ENABLE_VTG;
+-      /* setup cursor */
+-      curs_pal_ptr[0] |= 0x00ffffff;
+-      curs_pal_ptr[2] |= 0x00ffffff;
+-      curs_pal_ptr[4] |= 0x00ffffff;
+-
+-      /*
+-       * first set the whole cursor to transparent
+-       */
+-      for (i = 0; i < 512; i++)
+-              *(unsigned short *) (CURS_PAT_REG + i * 8) = 0;
+-
+-      /*
+-       * switch the last two lines to cursor palette 3
+-       * we assume here, that FONTSIZE_X is 8
+-       */
+-      *(unsigned short *) (CURS_PAT_REG + 14 * 64) = 0xffff;
+-      *(unsigned short *) (CURS_PAT_REG + 15 * 64) = 0xffff;
+       fb_var.xres_virtual = fbvar.xres;
+       fb_fix.line_length = (xres / 8) * fb_var.bits_per_pixel;
+       fb_fix.smem_start = 0x40000000; /* physical address */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/video/i2c.c     2003-07-19 17:04:55.000000000 -0700
+@@ -0,0 +1,333 @@
++/*
++ *   Generic i2c interface for the framebuffer layer 
++ *
++ *   (c) 2003 "Crazy" James Simmons <jsimmons@infradead.org>
++ *    Based on the ALSA i2c interface 
++ *            Gerd Knorr <kraxel@cs.tu-berlin.de>
++ *            Jaroslav Kysela <perex@suse.cz>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ */
++
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/string.h>
++#include <linux/errno.h>
++#include <linux/fb.h>
++#include "i2c.h"
++
++MODULE_AUTHOR("James Simmons <jsimmons@infradead.org>");
++MODULE_DESCRIPTION("Generic i2c interface for the Framebuffer layer");
++MODULE_LICENSE("GPL");
++
++static int fb_i2c_bit_sendbytes(fb_i2c_device_t *device, unsigned char *bytes, int count);
++static int fb_i2c_bit_readbytes(fb_i2c_device_t *device, unsigned char *bytes, int count);
++static int fb_i2c_bit_probeaddr(fb_i2c_bus_t *bus, unsigned short addr);
++
++static fb_i2c_ops_t fb_i2c_bit_ops = {
++      .sendbytes = fb_i2c_bit_sendbytes,
++      .readbytes = fb_i2c_bit_readbytes,
++      .probeaddr = fb_i2c_bit_probeaddr,
++};
++
++static int fb_i2c_bus_free(fb_i2c_bus_t *bus)
++{
++      fb_i2c_bus_t *slave;
++      fb_i2c_device_t *device;
++
++      fb_assert(bus != NULL, return -EINVAL);
++      while (!list_empty(&bus->devices)) {
++              device = fb_i2c_device(bus->devices.next);
++              fb_i2c_device_free(device);
++      }
++      if (bus->master)
++              list_del(&bus->buses);
++      else {
++              while (!list_empty(&bus->buses)) {
++                      slave = fb_i2c_slave_bus(bus->buses.next);
++                      fb_device_free(bus->card, slave);
++              }
++      }
++      if (bus->private_free)
++              bus->private_free(bus);
++      fb_magic_kfree(bus);
++      return 0;
++}
++
++static int fb_i2c_bus_dev_free(fb_device_t *device)
++{
++      fb_i2c_bus_t *bus = fb_magic_cast(fb_i2c_bus_t, device->device_data, return -ENXIO);
++      return fb_i2c_bus_free(bus);
++}
++
++int fb_i2c_bus_create(fb_card_t *card, const char *name, fb_i2c_bus_t *master, fb_i2c_bus_t **ri2c)
++{
++      static fb_device_ops_t ops = {
++              .dev_free =     fb_i2c_bus_dev_free,
++      };
++      fb_i2c_bus_t *bus;
++      int err;
++      
++      *ri2c = NULL;
++      bus = (fb_i2c_bus_t *)fb_magic_kcalloc(fb_i2c_bus_t, 0, GFP_KERNEL);
++      if (bus == NULL)
++              return -ENOMEM;
++      spin_lock_init(&bus->lock);
++      INIT_LIST_HEAD(&bus->devices);
++      INIT_LIST_HEAD(&bus->buses);
++      bus->card = card;
++      bus->ops = &fb_i2c_bit_ops;
++      if (master) {
++              list_add_tail(&bus->buses, &master->buses);
++              bus->master = master;
++      }
++      strlcpy(bus->name, name, sizeof(bus->name));
++      if ((err = fb_device_new(card, SNDRV_DEV_LOWLEVEL, bus, &ops)) < 0) {
++              fb_i2c_bus_free(bus);
++              return err;
++      }
++      *ri2c = bus;
++      return 0;
++}
++
++int fb_i2c_device_create(fb_i2c_bus_t *bus, const char *name, unsigned char addr, fb_i2c_device_t **rdevice)
++{
++      fb_i2c_device_t *device;
++
++      *rdevice = NULL;
++      fb_assert(bus != NULL, return -EINVAL);
++      device = (fb_i2c_device_t *)fb_magic_kcalloc(fb_i2c_device_t, 0, GFP_KERNEL);
++      if (device == NULL)
++              return -ENOMEM;
++      device->addr = addr;
++      strlcpy(device->name, name, sizeof(device->name));
++      list_add_tail(&device->list, &bus->devices);
++      device->bus = bus;
++      *rdevice = device;
++      return 0;
++}
++
++int fb_i2c_device_free(fb_i2c_device_t *device)
++{
++      if (device->bus)
++              list_del(&device->list);
++      if (device->private_free)
++              device->private_free(device);
++      fb_magic_kfree(device);
++      return 0;
++}
++
++int fb_i2c_sendbytes(fb_i2c_device_t *device, unsigned char *bytes, int count)
++{
++      return device->bus->ops->sendbytes(device, bytes, count);
++}
++
++
++int fb_i2c_readbytes(fb_i2c_device_t *device, unsigned char *bytes, int count)
++{
++      return device->bus->ops->readbytes(device, bytes, count);
++}
++
++int fb_i2c_probeaddr(fb_i2c_bus_t *bus, unsigned short addr)
++{
++      return bus->ops->probeaddr(bus, addr);
++}
++
++/*
++ *  bit-operations
++ */
++
++static inline void fb_i2c_bit_hw_start(fb_i2c_bus_t *bus)
++{
++      if (bus->hw_ops.bit->start)
++              bus->hw_ops.bit->start(bus);
++}
++
++static inline void fb_i2c_bit_hw_stop(fb_i2c_bus_t *bus)
++{
++      if (bus->hw_ops.bit->stop)
++              bus->hw_ops.bit->stop(bus);
++}
++
++static void fb_i2c_bit_direction(fb_i2c_bus_t *bus, int clock, int data)
++{
++      if (bus->hw_ops.bit->direction)
++              bus->hw_ops.bit->direction(bus, clock, data);
++}
++
++static void fb_i2c_bit_set(fb_i2c_bus_t *bus, int clock, int data)
++{
++      bus->hw_ops.bit->setlines(bus, clock, data);
++}
++
++#if 0
++static int fb_i2c_bit_clock(fb_i2c_bus_t *bus)
++{
++      if (bus->hw_ops.bit->getclock)
++              return bus->hw_ops.bit->getclock(bus);
++      return -ENXIO;
++}
++#endif
++
++static int fb_i2c_bit_data(fb_i2c_bus_t *bus, int ack)
++{
++      return bus->hw_ops.bit->getdata(bus, ack);
++}
++
++static void fb_i2c_bit_start(fb_i2c_bus_t *bus)
++{
++      fb_i2c_bit_hw_start(bus);
++      fb_i2c_bit_direction(bus, 1, 1);        /* SCL - wr, SDA - wr */
++      fb_i2c_bit_set(bus, 1, 1);
++      fb_i2c_bit_set(bus, 1, 0);
++      fb_i2c_bit_set(bus, 0, 0);
++}
++
++static void fb_i2c_bit_stop(fb_i2c_bus_t *bus)
++{
++      fb_i2c_bit_set(bus, 0, 0);
++      fb_i2c_bit_set(bus, 1, 0);
++      fb_i2c_bit_set(bus, 1, 1);
++      fb_i2c_bit_hw_stop(bus);
++}
++
++static void fb_i2c_bit_send(fb_i2c_bus_t *bus, int data)
++{
++      fb_i2c_bit_set(bus, 0, data);
++      fb_i2c_bit_set(bus, 1, data);
++      fb_i2c_bit_set(bus, 0, data);
++}
++
++static int fb_i2c_bit_ack(fb_i2c_bus_t *bus)
++{
++      int ack;
++
++      fb_i2c_bit_set(bus, 0, 1);
++      fb_i2c_bit_set(bus, 1, 1);
++      fb_i2c_bit_direction(bus, 1, 0);        /* SCL - wr, SDA - rd */
++      ack = fb_i2c_bit_data(bus, 1);
++      fb_i2c_bit_direction(bus, 1, 1);        /* SCL - wr, SDA - wr */
++      fb_i2c_bit_set(bus, 0, 1);
++      return ack ? -EIO : 0;
++}
++
++static int fb_i2c_bit_sendbyte(fb_i2c_bus_t *bus, unsigned char data)
++{
++      int i, err;
++
++      for (i = 7; i >= 0; i--)
++              fb_i2c_bit_send(bus, !!(data & (1 << i)));
++      if ((err = fb_i2c_bit_ack(bus)) < 0)
++              return err;
++      return 0;
++}
++
++static int fb_i2c_bit_readbyte(fb_i2c_bus_t *bus, int last)
++{
++      int i;
++      unsigned char data = 0;
++
++      fb_i2c_bit_set(bus, 0, 1);
++      fb_i2c_bit_direction(bus, 1, 0);        /* SCL - wr, SDA - rd */
++      for (i = 7; i >= 0; i--) {
++              fb_i2c_bit_set(bus, 1, 1);
++              if (fb_i2c_bit_data(bus, 0))
++                      data |= (1 << i);
++              fb_i2c_bit_set(bus, 0, 1);
++      }
++      fb_i2c_bit_direction(bus, 1, 1);        /* SCL - wr, SDA - wr */
++      fb_i2c_bit_send(bus, !!last);
++      return data;
++}
++
++static int fb_i2c_bit_sendbytes(fb_i2c_device_t *device, unsigned char *bytes, int count)
++{
++      fb_i2c_bus_t *bus = device->bus;
++      int err, res = 0;
++
++      if (device->flags & FB_I2C_DEVICE_ADDRTEN)
++              return -EIO;            /* not yet implemented */
++      fb_i2c_bit_start(bus);
++      if ((err = fb_i2c_bit_sendbyte(bus, device->addr << 1)) < 0) {
++              fb_i2c_bit_hw_stop(bus);
++              return err;
++      }
++      while (count-- > 0) {
++              if ((err = fb_i2c_bit_sendbyte(bus, *bytes++)) < 0) {
++                      fb_i2c_bit_hw_stop(bus);
++                      return err;
++              }
++              res++;
++      }
++      fb_i2c_bit_stop(bus);
++      return res;
++}
++
++static int fb_i2c_bit_readbytes(fb_i2c_device_t *device, unsigned char *bytes, int count)
++{
++      fb_i2c_bus_t *bus = device->bus;
++      int err, res = 0;
++
++      if (device->flags & FB_I2C_DEVICE_ADDRTEN)
++              return -EIO;            /* not yet implemented */
++      fb_i2c_bit_start(bus);
++      if ((err = fb_i2c_bit_sendbyte(bus, (device->addr << 1) | 1)) < 0) {
++              fb_i2c_bit_hw_stop(bus);
++              return err;
++      }
++      while (count-- > 0) {
++              if ((err = fb_i2c_bit_readbyte(bus, count == 0)) < 0) {
++                      fb_i2c_bit_hw_stop(bus);
++                      return err;
++              }
++              *bytes++ = (unsigned char)err;
++              res++;
++      }
++      fb_i2c_bit_stop(bus);
++      return res;
++}
++
++static int fb_i2c_bit_probeaddr(fb_i2c_bus_t *bus, unsigned short addr)
++{
++      int err;
++
++      if (addr & 0x8000)      /* 10-bit address */
++              return -EIO;    /* not yet implemented */
++      if (addr & 0x7f80)      /* invalid address */
++              return -EINVAL;
++      fb_i2c_bit_start(bus);
++      err = fb_i2c_bit_sendbyte(bus, addr << 1);
++      fb_i2c_bit_stop(bus);
++      return err;
++}
++
++EXPORT_SYMBOL(fb_i2c_bus_create);
++EXPORT_SYMBOL(fb_i2c_device_create);
++EXPORT_SYMBOL(fb_i2c_device_free);
++EXPORT_SYMBOL(fb_i2c_sendbytes);
++EXPORT_SYMBOL(fb_i2c_readbytes);
++EXPORT_SYMBOL(fb_i2c_probeaddr);
++
++static int __init alsa_i2c_init(void)
++{
++      return 0;
++}
++
++static void __exit alsa_i2c_exit(void)
++{
++}
++
++module_init(alsa_i2c_init)
++module_exit(alsa_i2c_exit)
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/drivers/video/i2c.h     2003-07-19 17:04:55.000000000 -0700
+@@ -0,0 +1,102 @@
++#ifndef __FB_I2C_H
++#define __FB_I2C_H
++
++/*
++ *
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ *
++ *
++ */
++
++typedef struct _fb_i2c_device fb_i2c_device_t;
++typedef struct _fb_i2c_bus fb_i2c_bus_t;
++
++#define FB_I2C_DEVICE_ADDRTEN (1<<0)  /* 10-bit I2C address */
++
++struct _fb_i2c_device {
++      struct list_head list;
++      fb_i2c_bus_t *bus;      /* I2C bus */
++      char name[32];          /* some useful device name */
++      unsigned short flags;   /* device flags */
++      unsigned short addr;    /* device address (might be 10-bit) */
++      unsigned long private_value;
++      void *private_data;
++      void (*private_free)(fb_i2c_device_t *device);
++};
++
++#define fb_i2c_device(n) list_entry(n, fb_i2c_device_t, list)
++
++typedef struct _fb_i2c_bit_ops {
++      void (*start)(fb_i2c_bus_t *bus);       /* transfer start */
++      void (*stop)(fb_i2c_bus_t *bus);        /* transfer stop */
++      void (*direction)(fb_i2c_bus_t *bus, int clock, int data);  /* set line direction (0 = write, 1 = read) */
++      void (*setlines)(fb_i2c_bus_t *bus, int clock, int data);
++      int (*getclock)(fb_i2c_bus_t *bus);
++      int (*getdata)(fb_i2c_bus_t *bus, int ack);
++} fb_i2c_bit_ops_t;
++
++typedef struct _fb_i2c_ops {
++      int (*sendbytes)(fb_i2c_device_t *device, unsigned char *bytes, int count);
++      int (*readbytes)(fb_i2c_device_t *device, unsigned char *bytes, int count);
++      int (*probeaddr)(fb_i2c_bus_t *bus, unsigned short addr);
++} fb_i2c_ops_t;
++
++struct _fb_i2c_bus {
++      fb_card_t *card;        /* card which I2C belongs to */
++      char name[32];          /* some useful label */
++
++      spinlock_t lock;
++
++      fb_i2c_bus_t *master;   /* master bus when SCK/SCL is shared */
++      struct list_head buses; /* master: slave buses sharing SCK/SCL, slave: link list */
++
++      struct list_head devices; /* attached devices to this bus */
++
++      union {
++              fb_i2c_bit_ops_t *bit;
++              void *ops;
++      } hw_ops;               /* lowlevel operations */
++      fb_i2c_ops_t *ops;      /* midlevel operations */
++
++      unsigned long private_value;
++      void *private_data;
++      void (*private_free)(fb_i2c_bus_t *bus);
++};
++
++#define fb_i2c_slave_bus(n) list_entry(n, fb_i2c_bus_t, buses)
++
++int fb_i2c_bus_create(fb_card_t *card, const char *name, fb_i2c_bus_t *master, fb_i2c_bus_t **ri2c);
++int fb_i2c_device_create(fb_i2c_bus_t *bus, const char *name, unsigned char addr, fb_i2c_device_t **rdevice);
++int fb_i2c_device_free(fb_i2c_device_t *device);
++
++static inline void fb_i2c_lock(fb_i2c_bus_t *bus) {
++      if (bus->master)
++              spin_lock(&bus->master->lock);
++      else
++              spin_lock(&bus->lock);
++}
++static inline void fb_i2c_unlock(fb_i2c_bus_t *bus) {
++      if (bus->master)
++              spin_unlock(&bus->master->lock);
++      else
++              spin_unlock(&bus->lock);
++}
++
++int fb_i2c_sendbytes(fb_i2c_device_t *device, unsigned char *bytes, int count);
++int fb_i2c_readbytes(fb_i2c_device_t *device, unsigned char *bytes, int count);
++int fb_i2c_probeaddr(fb_i2c_bus_t *bus, unsigned short addr);
++
++#endif /* __FB_I2C_H */
+--- linux-2.6.0-test1/drivers/video/Kconfig    2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/video/Kconfig   2003-07-19 17:04:55.000000000 -0700
+@@ -423,35 +423,15 @@ config FB_PVR2_DEBUG
+         messages. Most people will want to say N here. If unsure, you will
+         also want to say N.
+-config FB_E1355
++config FB_EPSON1355
+       bool "Epson 1355 framebuffer support"
+-      depends on FB && SUPERH
++      depends on FB && (SUPERH || ARCH_CEIVA)
+       help
+         Build in support for the SED1355 Epson Research Embedded RAMDAC
+         LCD/CRT Controller (since redesignated as the S1D13505) as a
+         framebuffer.  Product specs at
+         <http://www.erd.epson.com/vdc/html/products.htm>.
+-config E1355_REG_BASE
+-      hex "Register Base Address"
+-      depends on FB_E1355
+-      default "a8000000"
+-      help
+-        Epson SED1355/S1D13505 LCD/CRT controller register base address.
+-        See the manuals at
+-        <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
+-        discussion.
+-
+-config E1355_FB_BASE
+-      hex "Framebuffer Base Address"
+-      depends on FB_E1355
+-      default "a8200000"
+-      help
+-        Epson SED1355/S1D13505 LCD/CRT controller memory base address.  See
+-        the manuals at
+-        <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
+-        discussion.
+-
+ config FB_RIVA
+       tristate "nVidia Riva support"
+       depends on FB && PCI
+@@ -725,23 +705,43 @@ config FB_SIS
+       tristate "SIS acceleration"
+       depends on FB && PCI
+       help
+-        This is the frame buffer device driver for the SiS 630 and 640 Super
+-        Socket 7 UMA cards.  Specs available at <http://www.sis.com.tw/>.
++        This is the frame buffer device driver for SiS VGA chipsets. It
++        supports the SiS 300, 540, 630, 730, 315, 550, 650, M650, 651,
++        740 and possibly (because untested) the Xabre (SiS330).
++
++        Specs available at <http://www.sis.com.tw/>.
++
++        See <http://www.winischhofer.net/linuxsisvga.shtml> for
++        documentation and updates.
++
++        The driver is also available as a module ( = code which can be
++        inserted and removed from the running kernel whenever you want). The
++        module will be called sisfb. If you want to compile it as a
++        module, say M here and read Documentation/modules.txt.
+ config FB_SIS_300
+-      bool "SIS 630/540/730 support"
++      bool "SIS 300/630/540/730 support"
+       depends on FB_SIS
+       help
+-        This is the frame buffer device driver for the SiS 630 and related
+-        Super Socket 7 UMA cards.  Specs available at
+-        <http://www.sis.com.tw/>.
++        This is the frame buffer device driver for the SiS 300, 540, 630
++        and 730 VGA controllers.
++
++        Specs available at <http://www.sis.com.tw/>.
++
++        See <http://www.winischhofer.net/linuxsisvga.shtml> for
++        documentation and updates.
+ config FB_SIS_315
+-      bool "SIS 315H/315 support"
++      bool "SIS 315/550/65x/740/330 support"
+       depends on FB_SIS
+       help
+-        This is the frame buffer device driver for the SiS 315 graphics
+-        card.  Specs available at <http://www.sis.com.tw/>.
++        This is the frame buffer device driver for the SiS 315, 550, 65x
++        (650, 651, M650), 740 and Xabre (330) VGA controllers.
++
++        Specs available at <http://www.sis.com.tw/>.
++
++        See <http://www.winischhofer.net/linuxsisvga.shtml> for
++        documentation and updates.
+ config FB_NEOMAGIC
+       tristate "NeoMagic display support"
+--- linux-2.6.0-test1/drivers/video/logo/logo.c        2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/video/logo/logo.c       2003-07-19 17:04:55.000000000 -0700
+@@ -32,8 +32,7 @@ extern const struct linux_logo logo_supe
+ extern const struct linux_logo logo_superh_vga16;
+ extern const struct linux_logo logo_superh_clut224;
+-
+-const struct linux_logo *fb_find_logo(int depth)
++const struct linux_logo *find_logo(int depth)
+ {
+       const struct linux_logo *logo = 0;
+@@ -66,7 +65,7 @@ const struct linux_logo *fb_find_logo(in
+ #endif
+ #ifdef CONFIG_LOGO_DEC_CLUT224
+               /* DEC Linux logo on MIPS/MIPS64 */
+-              if (mips_machgroup == MACH_GROUP_SGI)
++              if (mips_machgroup == MACH_GROUP_DEC)
+                       logo = &logo_dec_clut224;
+ #endif
+ #ifdef CONFIG_LOGO_MAC_CLUT224
+--- linux-2.6.0-test1/drivers/video/macfb.c    2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/video/macfb.c   2003-07-19 17:04:55.000000000 -0700
+@@ -233,11 +233,11 @@ static int dafb_setpalette (unsigned int
+               
+               /* Loop until we get to the register we want */
+               for (i = 0; i < regno; i++) {
+-                      nubus_writeb(info->cmap[i].red >> 8, &dafb_cmap_regs->lut);
++                      nubus_writeb(info->cmap.red[i] >> 8, &dafb_cmap_regs->lut);
+                       nop();
+-                      nubus_writeb(info->cmap[i].green >> 8, &dafb_cmap_regs->lut);
++                      nubus_writeb(info->cmap.green[i] >> 8, &dafb_cmap_regs->lut);
+                       nop();
+-                      nubus_writeb(info->cmap[i].blue >> 8, &dafb_cmap_regs->lut);
++                      nubus_writeb(info->cmap.blue[i] >> 8, &dafb_cmap_regs->lut);
+                       nop();
+               }
+       }
+@@ -528,10 +528,10 @@ static int macfb_setcolreg(unsigned regn
+        *  != 0 for invalid regno.
+        */
+       
+-      if (regno >= info->cmap.len)
++      if (regno >= fb_info->cmap.len)
+               return 1;
+-      switch (info->var.bits_per_pixel) {
++      switch (fb_info->var.bits_per_pixel) {
+       case 1:
+               /* We shouldn't get here */
+               break;
+@@ -539,21 +539,21 @@ static int macfb_setcolreg(unsigned regn
+       case 4:
+       case 8:
+               if (macfb_setpalette)
+-                      macfb_setpalette(regno, red, green, blue, info);
++                      macfb_setpalette(regno, red, green, blue, fb_info);
+               else
+                       return 1;
+               break;
+       case 16:
+-              if (info->var.red.offset == 10) {
++              if (fb_info->var.red.offset == 10) {
+                       /* 1:5:5:5 */
+-                      ((u32*) (info->pseudo_palette))[regno] =
++                      ((u32*) (fb_info->pseudo_palette))[regno] =
+                                       ((red   & 0xf800) >>  1) |
+                                       ((green & 0xf800) >>  6) |
+                                       ((blue  & 0xf800) >> 11) |
+                                       ((transp != 0) << 15);
+               } else {
+                       /* 0:5:6:5 */
+-                      ((u32*) (info->pseudo_palette))[regno] =
++                      ((u32*) (fb_info->pseudo_palette))[regno] =
+                                       ((red   & 0xf800)      ) |
+                                       ((green & 0xfc00) >>  5) |
+                                       ((blue  & 0xf800) >> 11);
+@@ -565,19 +565,19 @@ static int macfb_setcolreg(unsigned regn
+               red   >>= 8;
+               green >>= 8;
+               blue  >>= 8;
+-              ((u32 *)(info->pseudo_palette))[regno] =
+-                      (red   << info->var.red.offset)   |
+-                      (green << info->var.green.offset) |
+-                      (blue  << info->var.blue.offset);
++              ((u32 *)(fb_info->pseudo_palette))[regno] =
++                      (red   << fb_info->var.red.offset)   |
++                      (green << fb_info->var.green.offset) |
++                      (blue  << fb_info->var.blue.offset);
+               break;
+       case 32:
+               red   >>= 8;
+               green >>= 8;
+               blue  >>= 8;
+-              ((u32 *)(info->pseudo_palette))[regno] =
+-                      (red   << info->var.red.offset)   |
+-                      (green << info->var.green.offset) |
+-                      (blue  << info->var.blue.offset);
++              ((u32 *)(fb_info->pseudo_palette))[regno] =
++                      (red   << fb_info->var.red.offset)   |
++                      (green << fb_info->var.green.offset) |
++                      (blue  << fb_info->var.blue.offset);
+               break;
+     }
+     return 0;
+--- linux-2.6.0-test1/drivers/video/Makefile   2003-06-14 12:17:58.000000000 -0700
++++ 25/drivers/video/Makefile  2003-07-19 17:03:50.000000000 -0700
+@@ -69,7 +69,7 @@ obj-$(CONFIG_FB_SA1100)           += sa1
+ obj-$(CONFIG_FB_VIRTUAL)          += vfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o 
+ obj-$(CONFIG_FB_HIT)              += hitfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
+ obj-$(CONFIG_FB_E1355)            += epson1355fb.o
+-obj-$(CONFIG_FB_PVR2)             += pvr2fb.o
++obj-$(CONFIG_FB_PVR2)             += pvr2fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
+ obj-$(CONFIG_FB_VOODOO1)          += sstfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
+ obj-$(CONFIG_FB_FFB)               += ffb.o sbuslib.o cfbimgblt.o cfbcopyarea.o
+--- linux-2.6.0-test1/drivers/video/neofb.c    2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/video/neofb.c   2003-07-19 17:04:55.000000000 -0700
+@@ -81,9 +81,10 @@ extern int tosh_smm(SMMRegisters *regs);
+ #include <asm/mtrr.h>
+ #endif
++#include <video/vga.h>
+ #include <video/neomagic.h>
+-#define NEOFB_VERSION "0.4.1"
++#define NEOFB_VERSION "0.4.2"
+ /* --------------------------------------------------------------------- */
+@@ -370,37 +371,55 @@ static int vgaHWInit(const struct fb_var
+ static void vgaHWLock(void)
+ {
+       /* Protect CRTC[0-7] */
+-      VGAwCR(0x11, VGArCR(0x11) | 0x80);
++      vga_wcrt(NULL, 0x11, vga_rcrt(NULL, 0x11) | 0x80);
+ }
+ static void vgaHWUnlock(void)
+ {
+       /* Unprotect CRTC[0-7] */
+-      VGAwCR(0x11, VGArCR(0x11) & ~0x80);
++      vga_wcrt(NULL, 0x11, vga_rcrt(NULL, 0x11) & ~0x80);
+ }
+ static void neoLock(void)
+ {
+-      VGAwGR(0x09, 0x00);
++      vga_wgfx(NULL, 0x09, 0x00);
+       vgaHWLock();
+ }
+ static void neoUnlock(void)
+ {
+       vgaHWUnlock();
+-      VGAwGR(0x09, 0x26);
++      vga_wgfx(NULL, 0x09, 0x26);
+ }
+ /*
+- * vgaHWSeqReset
+- *      perform a sequencer reset.
++ * VGA Palette management
+  */
+-void vgaHWSeqReset(int start)
++static int paletteEnabled = 0;
++
++inline void VGAenablePalette(void)
++{
++      vga_r(NULL, VGA_IS1_RC);
++      vga_w(NULL, VGA_ATT_W, 0x00);
++      paletteEnabled = 1;
++}
++
++inline void VGAdisablePalette(void)
+ {
+-      if (start)
+-              VGAwSEQ(0x00, 0x01);    /* Synchronous Reset */
++      vga_r(NULL, VGA_IS1_RC);
++      vga_w(NULL, VGA_ATT_W, 0x20);
++      paletteEnabled = 0;
++}
++
++inline void VGAwATTR(u8 index, u8 value)
++{
++      if (paletteEnabled)
++              index &= ~0x20;
+       else
+-              VGAwSEQ(0x00, 0x03);    /* End Reset */
++              index |= 0x20;
++
++      vga_r(NULL, VGA_IS1_RC);
++      vga_wattr(NULL, index, value);
+ }
+ void vgaHWProtect(int on)
+@@ -411,21 +430,18 @@ void vgaHWProtect(int on)
+               /*
+                * Turn off screen and disable sequencer.
+                */
+-              tmp = VGArSEQ(0x01);
+-
+-              vgaHWSeqReset(1);       /* start synchronous reset */
+-              VGAwSEQ(0x01, tmp | 0x20);      /* disable the display */
++              tmp = vga_rseq(NULL, 0x01);
++              vga_wseq(NULL, 0x00, 0x01);             /* Synchronous Reset */
++              vga_wseq(NULL, 0x01, tmp | 0x20);       /* disable the display */
+               VGAenablePalette();
+       } else {
+               /*
+                * Reenable sequencer, then turn on screen.
+                */
+-
+-              tmp = VGArSEQ(0x01);
+-
+-              VGAwSEQ(0x01, tmp & ~0x20);     /* reenable display */
+-              vgaHWSeqReset(0);       /* clear synchronousreset */
++              tmp = vga_rseq(NULL, 0x01);
++              vga_wseq(NULL, 0x01, tmp & ~0x20);      /* reenable display */
++              vga_wseq(NULL, 0x00, 0x03);             /* clear synchronousreset */
+               VGAdisablePalette();
+       }
+@@ -436,19 +452,19 @@ static void vgaHWRestore(const struct fb
+ {
+       int i;
+-      VGAwMISC(par->MiscOutReg);
++      vga_w(NULL, VGA_MIS_W, par->MiscOutReg);
+       for (i = 1; i < 5; i++)
+-              VGAwSEQ(i, par->Sequencer[i]);
++              vga_wseq(NULL, i, par->Sequencer[i]);
+       /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 or CRTC[17] */
+-      VGAwCR(17, par->CRTC[17] & ~0x80);
++      vga_wcrt(NULL, 17, par->CRTC[17] & ~0x80);
+       for (i = 0; i < 25; i++)
+-              VGAwCR(i, par->CRTC[i]);
++              vga_wcrt(NULL, i, par->CRTC[i]);
+       for (i = 0; i < 9; i++)
+-              VGAwGR(i, par->Graphics[i]);
++              vga_wgfx(NULL, i, par->Graphics[i]);
+       VGAenablePalette();
+@@ -981,13 +997,13 @@ static int neofb_set_par(struct fb_info 
+       }
+       /* alread unlocked above */
+-      /* BOGUS  VGAwGR (0x09, 0x26); */
++      /* BOGUS  vga_wgfx(NULL, 0x09, 0x26); */
+       /* don't know what this is, but it's 0 from bootup anyway */
+-      VGAwGR(0x15, 0x00);
++      vga_wgfx(NULL, 0x15, 0x00);
+       /* was set to 0x01 by my bios in text and vesa modes */
+-      VGAwGR(0x0A, par->GeneralLockReg);
++      vga_wgfx(NULL, 0x0A, par->GeneralLockReg);
+       /*
+        * The color mode needs to be set before calling vgaHWRestore
+@@ -996,7 +1012,7 @@ static int neofb_set_par(struct fb_info 
+        * NOTE: Make sure we don't change bits make sure we don't change
+        * any reserved bits.
+        */
+-      temp = VGArGR(0x90);
++      temp = vga_rgfx(NULL, 0x90);
+       switch (info->fix.accel) {
+       case FB_ACCEL_NEOMAGIC_NM2070:
+               temp &= 0xF0;   /* Save bits 7:4 */
+@@ -1015,7 +1031,7 @@ static int neofb_set_par(struct fb_info 
+               break;
+       }
+-      VGAwGR(0x90, temp);
++      vga_wgfx(NULL, 0x90, temp);
+       /*
+        * In some rare cases a lockup might occur if we don't delay
+@@ -1027,9 +1043,9 @@ static int neofb_set_par(struct fb_info 
+        * Disable horizontal and vertical graphics and text expansions so
+        * that vgaHWRestore works properly.
+        */
+-      temp = VGArGR(0x25);
++      temp = vga_rgfx(NULL, 0x25);
+       temp &= 0x39;
+-      VGAwGR(0x25, temp);
++      vga_wgfx(NULL, 0x25, temp);
+       /*
+        * Sleep for 200ms to make sure that the two operations above have
+@@ -1041,19 +1057,18 @@ static int neofb_set_par(struct fb_info 
+        * This function handles restoring the generic VGA registers.  */
+       vgaHWRestore(info, par);
+-
+-      VGAwGR(0x0E, par->ExtCRTDispAddr);
+-      VGAwGR(0x0F, par->ExtCRTOffset);
+-      temp = VGArGR(0x10);
++      vga_wgfx(NULL, 0x0E, par->ExtCRTDispAddr);
++      vga_wgfx(NULL, 0x0F, par->ExtCRTOffset);
++      temp = vga_rgfx(NULL, 0x10);
+       temp &= 0x0F;           /* Save bits 3:0 */
+       temp |= (par->SysIfaceCntl1 & ~0x0F);   /* VESA Bios sets bit 1! */
+-      VGAwGR(0x10, temp);
++      vga_wgfx(NULL, 0x10, temp);
+-      VGAwGR(0x11, par->SysIfaceCntl2);
+-      VGAwGR(0x15, 0 /*par->SingleAddrPage */ );
+-      VGAwGR(0x16, 0 /*par->DualAddrPage */ );
++      vga_wgfx(NULL, 0x11, par->SysIfaceCntl2);
++      vga_wgfx(NULL, 0x15, 0 /*par->SingleAddrPage */ );
++      vga_wgfx(NULL, 0x16, 0 /*par->DualAddrPage */ );
+-      temp = VGArGR(0x20);
++      temp = vga_rgfx(NULL, 0x20);
+       switch (info->fix.accel) {
+       case FB_ACCEL_NEOMAGIC_NM2070:
+               temp &= 0xFC;   /* Save bits 7:2 */
+@@ -1074,73 +1089,72 @@ static int neofb_set_par(struct fb_info 
+               temp |= (par->PanelDispCntlReg1 & ~0x98);
+               break;
+       }
+-      VGAwGR(0x20, temp);
++      vga_wgfx(NULL, 0x20, temp);
+-      temp = VGArGR(0x25);
++      temp = vga_rgfx(NULL, 0x25);
+       temp &= 0x38;           /* Save bits 5:3 */
+       temp |= (par->PanelDispCntlReg2 & ~0x38);
+-      VGAwGR(0x25, temp);
++      vga_wgfx(NULL, 0x25, temp);
+       if (info->fix.accel != FB_ACCEL_NEOMAGIC_NM2070) {
+-              temp = VGArGR(0x30);
++              temp = vga_rgfx(NULL, 0x30);
+               temp &= 0xEF;   /* Save bits 7:5 and bits 3:0 */
+               temp |= (par->PanelDispCntlReg3 & ~0xEF);
+-              VGAwGR(0x30, temp);
++              vga_wgfx(NULL, 0x30, temp);
+       }
+-      VGAwGR(0x28, par->PanelVertCenterReg1);
+-      VGAwGR(0x29, par->PanelVertCenterReg2);
+-      VGAwGR(0x2a, par->PanelVertCenterReg3);
++      vga_wgfx(NULL, 0x28, par->PanelVertCenterReg1);
++      vga_wgfx(NULL, 0x29, par->PanelVertCenterReg2);
++      vga_wgfx(NULL, 0x2a, par->PanelVertCenterReg3);
+       if (info->fix.accel != FB_ACCEL_NEOMAGIC_NM2070) {
+-              VGAwGR(0x32, par->PanelVertCenterReg4);
+-              VGAwGR(0x33, par->PanelHorizCenterReg1);
+-              VGAwGR(0x34, par->PanelHorizCenterReg2);
+-              VGAwGR(0x35, par->PanelHorizCenterReg3);
++              vga_wgfx(NULL, 0x32, par->PanelVertCenterReg4);
++              vga_wgfx(NULL, 0x33, par->PanelHorizCenterReg1);
++              vga_wgfx(NULL, 0x34, par->PanelHorizCenterReg2);
++              vga_wgfx(NULL, 0x35, par->PanelHorizCenterReg3);
+       }
+       if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2160)
+-              VGAwGR(0x36, par->PanelHorizCenterReg4);
++              vga_wgfx(NULL, 0x36, par->PanelHorizCenterReg4);
+       if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 ||
+           info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 ||
+           info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 ||
+           info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) {
+-              VGAwGR(0x36, par->PanelHorizCenterReg4);
+-              VGAwGR(0x37, par->PanelVertCenterReg5);
+-              VGAwGR(0x38, par->PanelHorizCenterReg5);
++              vga_wgfx(NULL, 0x36, par->PanelHorizCenterReg4);
++              vga_wgfx(NULL, 0x37, par->PanelVertCenterReg5);
++              vga_wgfx(NULL, 0x38, par->PanelHorizCenterReg5);
+               clock_hi = 1;
+       }
+       /* Program VCLK3 if needed. */
+-      if (par->ProgramVCLK && ((VGArGR(0x9B) != par->VCLK3NumeratorLow)
+-                               || (VGArGR(0x9F) != par->VCLK3Denominator)
+-                               || (clock_hi && ((VGArGR(0x8F) & ~0x0f)
+-                                                != (par->
+-                                                    VCLK3NumeratorHigh &
++      if (par->ProgramVCLK && ((vga_rgfx(NULL, 0x9B) != par->VCLK3NumeratorLow)
++                               || (vga_rgfx(NULL, 0x9F) != par->VCLK3Denominator)
++                               || (clock_hi && ((vga_rgfx(NULL, 0x8F) & ~0x0f)
++                                                != (par->VCLK3NumeratorHigh &
+                                                     ~0x0F))))) {
+-              VGAwGR(0x9B, par->VCLK3NumeratorLow);
++              vga_wgfx(NULL, 0x9B, par->VCLK3NumeratorLow);
+               if (clock_hi) {
+-                      temp = VGArGR(0x8F);
++                      temp = vga_rgfx(NULL, 0x8F);
+                       temp &= 0x0F;   /* Save bits 3:0 */
+                       temp |= (par->VCLK3NumeratorHigh & ~0x0F);
+-                      VGAwGR(0x8F, temp);
++                      vga_wgfx(NULL, 0x8F, temp);
+               }
+-              VGAwGR(0x9F, par->VCLK3Denominator);
++              vga_wgfx(NULL, 0x9F, par->VCLK3Denominator);
+       }
+       if (par->biosMode)
+-              VGAwCR(0x23, par->biosMode);
++              vga_wcrt(NULL, 0x23, par->biosMode);
+-      VGAwGR(0x93, 0xc0);     /* Gives 5x faster framebuffer writes !!! */
++      vga_wgfx(NULL, 0x93, 0xc0);     /* Gives 5x faster framebuffer writes !!! */
+       /* Program vertical extension register */
+       if (info->fix.accel == FB_ACCEL_NEOMAGIC_NM2200 ||
+           info->fix.accel == FB_ACCEL_NEOMAGIC_NM2230 ||
+           info->fix.accel == FB_ACCEL_NEOMAGIC_NM2360 ||
+           info->fix.accel == FB_ACCEL_NEOMAGIC_NM2380) {
+-              VGAwCR(0x70, par->VerticalExt);
++              vga_wcrt(NULL, 0x70, par->VerticalExt);
+       }
+       vgaHWProtect(0);        /* Turn on screen */
+@@ -1180,16 +1194,16 @@ static void neofb_update_start(struct fb
+       /*
+        * These are the generic starting address registers.
+        */
+-      VGAwCR(0x0C, (Base & 0x00FF00) >> 8);
+-      VGAwCR(0x0D, (Base & 0x00FF));
++      vga_wcrt(NULL, 0x0C, (Base & 0x00FF00) >> 8);
++      vga_wcrt(NULL, 0x0D, (Base & 0x00FF));
+       /*
+        * Make sure we don't clobber some other bits that might already
+        * have been set. NOTE: NM2200 has a writable bit 3, but it shouldn't
+        * be needed.
+        */
+-      oldExtCRTDispAddr = VGArGR(0x0E);
+-      VGAwGR(0x0E, (((Base >> 16) & 0x0f) | (oldExtCRTDispAddr & 0xf0)));
++      oldExtCRTDispAddr = vga_rgfx(NULL, 0x0E);
++      vga_wgfx(NULL, 0x0E, (((Base >> 16) & 0x0f) | (oldExtCRTDispAddr & 0xf0)));
+       neoLock();
+ }
+@@ -1353,7 +1367,7 @@ neo2200_fillrect(struct fb_info *info, c
+       }
+       par->neo2200->dstStart =
+-          dst * ((info->var.bits_per_pixel + 7) / 8);
++          dst * ((info->var.bits_per_pixel + 7) >> 3);
+       par->neo2200->xyExt =
+           (rect->height << 16) | (rect->width & 0xffff);
+ }
+@@ -1361,26 +1375,22 @@ neo2200_fillrect(struct fb_info *info, c
+ static void
+ neo2200_copyarea(struct fb_info *info, const struct fb_copyarea *area)
+ {
+-      struct neofb_par *par = (struct neofb_par *) info->par;
+       u32 sx = area->sx, sy = area->sy, dx = area->dx, dy = area->dy;
++      struct neofb_par *par = (struct neofb_par *) info->par;
+       u_long src, dst, bltCntl;
+-
++      
+       bltCntl = NEO_BC3_FIFO_EN | NEO_BC3_SKIP_MAPPING | 0x0C0000;
+-      if (sy < dy) {
++      if ((dy > sy) || ((dy == sy) && (dx > sx))) {   
++              /* Start with the lower right corner */
+               sy += (area->height - 1);
+               dy += (area->height - 1);
+-
+-              bltCntl |= NEO_BC0_DST_Y_DEC | NEO_BC0_SRC_Y_DEC;
+-      }
+-
+-      if (area->sx < area->dx) {
+               sx += (area->width - 1);
+-              dx += (area->width - 1);
+-
+-              bltCntl |= NEO_BC0_X_DEC;
+-      }
+-
++              dx += (area->width - 1);        
++              
++              bltCntl |= NEO_BC0_X_DEC | NEO_BC0_DST_Y_DEC | NEO_BC0_SRC_Y_DEC;
++      }               
++                              
+       src = sx * (info->var.bits_per_pixel >> 3) + sy*info->fix.line_length;
+       dst = dx * (info->var.bits_per_pixel >> 3) + dy*info->fix.line_length;
+@@ -1725,16 +1735,16 @@ static int __devinit neo_init_hw(struct 
+       printk(KERN_DEBUG "--- Neo extended register dump ---\n");
+       for (w = 0; w < 0x85; w++)
+               printk(KERN_DEBUG "CR %p: %p\n", (void *) w,
+-                     (void *) VGArCR(w));
++                     (void *) vga_rcrt(NULL, w);
+       for (w = 0; w < 0xC7; w++)
+               printk(KERN_DEBUG "GR %p: %p\n", (void *) w,
+-                     (void *) VGArGR(w));
++                     (void *) vga_rgfx(NULL, w));
+ #endif
+       /* Determine the panel type */
+-      VGAwGR(0x09, 0x26);
+-      type = VGArGR(0x21);
+-      display = VGArGR(0x20);
++      vga_wgfx(NULL, 0x09, 0x26);
++      type = vga_rgfx(NULL, 0x21);
++      display = vga_rgfx(NULL, 0x20);
+       if (!par->internal_display && !par->external_display) {
+               par->internal_display = display & 2 || !(display & 3) ? 1 : 0;
+               par->external_display = display & 1;
+@@ -1744,8 +1754,8 @@ static int __devinit neo_init_hw(struct 
+       }
+       /* Determine panel width -- used in NeoValidMode. */
+-      w = VGArGR(0x20);
+-      VGAwGR(0x09, 0x00);
++      w = vga_rgfx(NULL, 0x20);
++      vga_wgfx(NULL, 0x09, 0x00);
+       switch ((w & 0x18) >> 3) {
+       case 0x00:
+               par->NeoPanelWidth = 640;
+--- linux-2.6.0-test1/drivers/video/platinumfb.c       2003-06-14 12:18:07.000000000 -0700
++++ 25/drivers/video/platinumfb.c      2003-07-19 17:04:55.000000000 -0700
+@@ -104,8 +104,8 @@ static int platinum_var_to_par(const str
+  * Interface used by the world
+  */
+-int platinum_init(void);
+-int platinum_setup(char*);
++int platinumfb_init(void);
++int platinumfb_setup(char*);
+ static struct fb_ops platinumfb_ops = {
+       .owner =        THIS_MODULE,
+@@ -399,7 +399,7 @@ try_again:
+       /* Apply default var */
+       p->info.var = var;
+       var.activate = FB_ACTIVATE_NOW;
+-      rc = fb_set_var(&var, &p->info);
++      rc = fb_set_var(&p->info, &var);
+       if (rc && (default_vmode != VMODE_640_480_60 || default_cmode != CMODE_8))
+               goto try_again;
+@@ -413,7 +413,7 @@ try_again:
+       return 1;
+ }
+-int __init platinum_init(void)
++int __init platinumfb_init(void)
+ {
+       struct device_node *dp;
+@@ -597,7 +597,7 @@ static int platinum_par_to_var(struct fb
+ /* 
+  * Parse user speficied options (`video=platinumfb:')
+  */
+-int __init platinum_setup(char *options)
++int __init platinumfb_setup(char *options)
+ {
+       char *this_opt;
+--- linux-2.6.0-test1/drivers/video/pvr2fb.c   2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/video/pvr2fb.c  2003-07-19 17:03:50.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Dreamcast.
+  *
+  * Copyright (c) 2001 M. R. Brown <mrbrown@0xd6.org>
+- * Copyright (c) 2001 Paul Mundt  <lethal@chaoticdreams.org>
++ * Copyright (c) 2001, 2002, 2003 Paul Mundt <lethal@linux-sh.org>
+  *
+  * This file is part of the LinuxDC project (linuxdc.sourceforge.net).
+  *
+@@ -12,14 +12,15 @@
+ /*
+  * This driver is mostly based on the excellent amifb and vfb sources.  It uses
+- * an odd scheme for converting hardware values to/from framebuffer values, here are
+- * some hacked-up formulas:
++ * an odd scheme for converting hardware values to/from framebuffer values,
++ * here are some hacked-up formulas:
+  *
+- *  The Dreamcast has screen offsets from each side of its four borders and the start
+- *  offsets of the display window.  I used these values to calculate 'pseudo' values
+- *  (think of them as placeholders) for the fb video mode, so that when it came time
+- *  to convert these values back into their hardware values, I could just add mode-
+- *  specific offsets to get the correct mode settings:
++ *  The Dreamcast has screen offsets from each side of its four borders and
++ *  the start offsets of the display window.  I used these values to calculate
++ *  'pseudo' values (think of them as placeholders) for the fb video mode, so
++ *  that when it came time to convert these values back into their hardware
++ *  values, I could just add mode- specific offsets to get the correct mode
++ *  settings:
+  *
+  *      left_margin = diwstart_h - borderstart_h;
+  *      right_margin = borderstop_h - (diwstart_h + xres);
+@@ -29,9 +30,9 @@
+  *      hsync_len = borderstart_h + (hsync_total - borderstop_h);
+  *      vsync_len = borderstart_v + (vsync_total - borderstop_v);
+  *
+- *  Then, when it's time to convert back to hardware settings, the only constants
+- *  are the borderstart_* offsets, all other values are derived from the fb video
+- *  mode:
++ *  Then, when it's time to convert back to hardware settings, the only
++ *  constants are the borderstart_* offsets, all other values are derived from
++ *  the fb video mode:
+  *  
+  *      // PAL
+  *      borderstart_h = 116;
+@@ -57,7 +58,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/fb.h>
+ #include <linux/init.h>
+-#include <linux/console.h>
+ #ifdef CONFIG_SH_DREAMCAST
+ #include <asm/io.h>
+@@ -66,14 +66,9 @@
+ #endif
+ #ifdef CONFIG_MTRR
+-  #include <asm/mtrr.h>
++#include <asm/mtrr.h>
+ #endif
+-#include <video/fbcon.h>
+-#include <video/fbcon-cfb16.h>
+-#include <video/fbcon-cfb24.h>
+-#include <video/fbcon-cfb32.h>
+-
+ #ifdef CONFIG_FB_PVR2_DEBUG
+ #  define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
+ #else
+@@ -124,16 +119,6 @@ static struct pvr2_params outputs[] __in
+  */
+ static struct pvr2fb_par {
+-
+-      int xres;
+-      int yres;
+-      int vxres;
+-      int vyres;
+-      int xoffset;
+-      int yoffset;
+-      u_short bpp;
+-
+-      u_long pixclock;
+       u_short hsync_total;    /* Clocks/line */
+       u_short vsync_total;    /* Lines/field */
+       u_short borderstart_h;
+@@ -144,53 +129,49 @@ static struct pvr2fb_par {
+       u_short diwstart_v;     /* Vertical offset of the display field, for
+                                  interlaced modes, this is the long field */
+       u_long disp_start;      /* Address of image within VRAM */
+-
+-      u_long next_line;       /* Modulo for next line */
+-
+       u_char is_interlaced;   /* Is the display interlaced? */
+       u_char is_doublescan;   /* Are scanlines output twice? (doublescan) */
+       u_char is_lowres;       /* Is horizontal pixel-doubling enabled? */
++} *currentpar;
+-      u_long bordercolor;     /* RGB888 format border color */
+-
+-      u_long vmode;
+-      
+-} currentpar;
+-
+-static int currbpp;
+-static struct display disp;
+-static struct fb_info fb_info;
++static struct fb_info *fb_info;
+ static int pvr2fb_inverse = 0;
+-static struct { u_short red, green, blue, alpha; } palette[256];
+-static union {
+-#ifdef FBCON_HAS_CFB16
+-      u16 cfb16[16];
+-#endif
+-#ifdef FBCON_HAS_CFB24
+-      u32 cfb24[16];
+-#endif
+-#ifdef FBCON_HAS_CFB32
+-      u32 cfb32[16];
+-#endif
+-} fbcon_cmap;
++static struct fb_fix_screeninfo pvr2_fix __initdata = {
++      .id =           "NEC PowerVR2",
++      .type =         FB_TYPE_PACKED_PIXELS,
++      .visual =       FB_VISUAL_TRUECOLOR,
++      .ypanstep =     1,
++      .ywrapstep =    1,
++      .accel =        FB_ACCEL_NONE,
++};
+-static char pvr2fb_name[16] = "NEC PowerVR2";
++static struct fb_var_screeninfo pvr2_var __initdata = {
++      .xres =         640,
++      .yres =         480,
++      .xres_virtual = 640,
++      .yres_virtual = 480,
++      .bits_per_pixel =16,
++      .red =          { 11, 5, 0 },
++      .green =        {  5, 6, 0 },
++      .blue =         {  0, 5, 0 },
++      .activate =     FB_ACTIVATE_NOW,
++      .height =       -1,
++      .width =        -1,
++      .vmode =        FB_VMODE_NONINTERLACED,
++};
+ #define VIDEOMEMSIZE (8*1024*1024)
+ static u_long videomemory = 0xa5000000, videomemorysize = VIDEOMEMSIZE;
+ static int cable_type = -1;
+ static int video_output = -1;
+-#ifdef CONFIG_MTRR
+-static int enable_mtrr = 1;
+-static int mtrr_handle;
+-#endif
++static int nopan = 0;
++static int nowrap = 1;
+ /*
+  * We do all updating, blanking, etc. during the vertical retrace period
+  */
+-
+ static u_short do_vmode_full = 0;     /* Change the video mode */
+ static u_short do_vmode_pan = 0;      /* Update the video mode */
+ static short do_blank = 0;            /* (Un)Blank the screen */
+@@ -201,50 +182,15 @@ static u_short is_blanked = 0;           /* Is th
+ int pvr2fb_setup(char*);
+-static int pvr2fb_get_fix(struct fb_fix_screeninfo *fix, int con,
+-                            struct fb_info *info);
+-static int pvr2fb_get_var(struct fb_var_screeninfo *var, int con,
+-                            struct fb_info *info);
+-static int pvr2fb_set_var(struct fb_var_screeninfo *var, int con,
+-                            struct fb_info *info);
+-static int pvr2fb_pan_display(struct fb_var_screeninfo *var, int con,
+-                                struct fb_info *info);
+-static int pvr2fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                             struct fb_info *info);
+-static int pvr2fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                             struct fb_info *info);
+ static int pvr2fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+                             u_int transp, struct fb_info *info);
+ static int pvr2fb_blank(int blank, struct fb_info *info);
+-
+-      /*
+-       * Interface to the low level console driver
+-       */
+-
+-static int pvr2fbcon_switch(int con, struct fb_info *info);
+-static int pvr2fbcon_updatevar(int con, struct fb_info *info);
+-
+-      /*
+-       * Internal/hardware-specific routines
+-       */
+-
+ static u_long get_line_length(int xres_virtual, int bpp);
+ static void set_color_bitfields(struct fb_var_screeninfo *var);
+-static int pvr2_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
+-                            u_int *transp, struct fb_info *info);
+-
+-static int pvr2_encode_fix(struct fb_fix_screeninfo *fix,
+-                             struct pvr2fb_par *par);
+-static int pvr2_decode_var(struct fb_var_screeninfo *var,
+-                          struct pvr2fb_par *par);
+-static int pvr2_encode_var(struct fb_var_screeninfo *var,
+-                          struct pvr2fb_par *par);
+-static void pvr2_get_par(struct pvr2fb_par *par);
+-static void pvr2_set_var(struct fb_var_screeninfo *var);
+-static void pvr2_pan_var(struct fb_var_screeninfo *var);
+-static int pvr2_update_par(void);
+-static void pvr2_update_display(void);
+-static void pvr2_init_display(void);
++static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info);
++static int pvr2fb_set_par(struct fb_info *info);
++static void pvr2_update_display(struct fb_info *info);
++static void pvr2_init_display(struct fb_info *info);
+ static void pvr2_do_blank(void);
+ static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id, struct pt_regs *fp);
+ static int pvr2_init_cable(void);
+@@ -252,19 +198,18 @@ static int pvr2_get_param(const struct p
+                             int val, int size);
+ static struct fb_ops pvr2fb_ops = {
+-      .owner =        THIS_MODULE,
+-      .fb_get_fix =   pvr2fb_get_fix,
+-      .fb_get_var =   pvr2fb_get_var,
+-      .fb_set_var =   pvr2fb_set_var,
+-      .fb_get_cmap =  pvr2fb_get_cmap,
+-      .fb_set_cmap =  pvr2fb_set_cmap,
+-      .fb_setcolreg = pvr2fb_setcolreg,
+-      .fb_pan_display = pvr2fb_pan_display,
+-      .fb_blank =     pvr2fb_blank,
++      .owner          = THIS_MODULE,
++      .fb_setcolreg   = pvr2fb_setcolreg,
++      .fb_blank       = pvr2fb_blank,
++      .fb_check_var   = pvr2fb_check_var,
++      .fb_set_par     = pvr2fb_set_par,
++      .fb_fillrect    = cfb_fillrect,
++      .fb_copyarea    = cfb_copyarea,
++      .fb_imageblit   = cfb_imageblit,
++      .fb_cursor      = soft_cursor,
+ };
+ static struct fb_videomode pvr2_modedb[] __initdata = {
+-
+     /*
+      * Broadcast video modes (PAL and NTSC).  I'm unfamiliar with
+      * PAL-M and PAL-N, but from what I've read both modes parallel PAL and
+@@ -275,21 +220,16 @@ static struct fb_videomode pvr2_modedb[]
+       /* 640x480 @ 60Hz interlaced (NTSC) */
+       "ntsc_640x480i", 60, 640, 480, TV_CLK, 38, 33, 0, 18, 146, 26,
+       FB_SYNC_BROADCAST, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+-    },
+-
+-    {
++    }, {
+       /* 640x240 @ 60Hz (NTSC) */
+       /* XXX: Broken! Don't use... */
+       "ntsc_640x240", 60, 640, 240, TV_CLK, 38, 33, 0, 0, 146, 22,
+       FB_SYNC_BROADCAST, FB_VMODE_YWRAP
+-    },
+-
+-    {
++    }, {
+       /* 640x480 @ 60hz (VGA) */
+       "vga_640x480", 60, 640, 480, VGA_CLK, 38, 33, 0, 18, 146, 26,
+       0, FB_VMODE_YWRAP
+-    },
+-
++    }, 
+ };
+ #define NUM_TOTAL_MODES  ARRAY_SIZE(pvr2_modedb)
+@@ -301,222 +241,10 @@ static struct fb_videomode pvr2_modedb[]
+ static int defmode = DEFMODE_NTSC;
+ static char *mode_option __initdata = NULL;
+-/* Get the fixed part of the display */
+-
+-static int pvr2fb_get_fix(struct fb_fix_screeninfo *fix, int con,
+-                            struct fb_info *info)
+-{
+-      struct pvr2fb_par par;
+-
+-      if (con == -1)
+-              pvr2_get_par(&par);
+-      else {
+-              int err;
+-
+-              if ((err = pvr2_decode_var(&fb_display[con].var, &par)))
+-                      return err;
+-      }
+-      return pvr2_encode_fix(fix, &par);
+-}
+-
+-/* Get the user-defined part of the display */
+-
+-static int pvr2fb_get_var(struct fb_var_screeninfo *var, int con,
+-                            struct fb_info *info)
+-{
+-      int err = 0;
+-
+-      if (con == -1) {
+-              struct pvr2fb_par par;
+-
+-              pvr2_get_par(&par);
+-              err = pvr2_encode_var(var, &par);
+-      } else
+-              *var = fb_display[con].var;
+-      
+-      return err;
+-}
+-
+-/* Set the user-defined part of the display */
+-
+-static int pvr2fb_set_var(struct fb_var_screeninfo *var, int con,
+-                            struct fb_info *info)
+-{
+-      int err, activate = var->activate;
+-      int oldxres, oldyres, oldvxres, oldvyres, oldbpp;
+-      struct pvr2fb_par par;
+-
+-      struct display *display;
+-      if (con >= 0)
+-              display = &fb_display[con];
+-      else
+-              display = &disp;        /* used during initialization */
+-
+-      /*
+-       * FB_VMODE_CONUPDATE and FB_VMODE_SMOOTH_XPAN are equal!
+-       * as FB_VMODE_SMOOTH_XPAN is only used internally
+-       */
+-
+-      if (var->vmode & FB_VMODE_CONUPDATE) {
+-              var->vmode |= FB_VMODE_YWRAP;
+-              var->xoffset = display->var.xoffset;
+-              var->yoffset = display->var.yoffset;
+-      }
+-      if ((err = pvr2_decode_var(var, &par)))
+-              return err;
+-      pvr2_encode_var(var, &par);
+-
+-      /* Do memory check and bitfield set here?? */
+-
+-      if ((activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
+-              oldxres = display->var.xres;
+-              oldyres = display->var.yres;
+-              oldvxres = display->var.xres_virtual;
+-              oldvyres = display->var.yres_virtual;
+-              oldbpp = display->var.bits_per_pixel;
+-              display->var = *var;
+-              if (oldxres != var->xres || oldyres != var->yres ||
+-                  oldvxres != var->xres_virtual || oldvyres != var->yres_virtual ||
+-                  oldbpp != var->bits_per_pixel) {
+-                      struct fb_fix_screeninfo fix;
+-
+-                      pvr2_encode_fix(&fix, &par);
+-                      display->scrollmode = SCROLL_YREDRAW;
+-                      display->visual = fix.visual;
+-                      display->type = fix.type;
+-                      display->type_aux = fix.type_aux;
+-                      display->ypanstep = fix.ypanstep;
+-                      display->ywrapstep = fix.ywrapstep;
+-                      display->line_length = fix.line_length;
+-                      display->can_soft_blank = 1;
+-                      display->inverse = pvr2fb_inverse;
+-                      switch (var->bits_per_pixel) {
+-#ifdef FBCON_HAS_CFB16
+-                          case 16:
+-                              display->dispsw = &fbcon_cfb16;
+-                              display->dispsw_data = fbcon_cmap.cfb16;
+-                              break;
+-#endif
+-#ifdef FBCON_HAS_CFB24
+-                          case 24:
+-                              display->dispsw = &fbcon_cfb24;
+-                              display->dispsw_data = fbcon_cmap.cfb24;
+-                              break;
+-#endif
+-#ifdef FBCON_HAS_CFB32
+-                          case 32:
+-                              display->dispsw = &fbcon_cfb32;
+-                              display->dispsw_data = fbcon_cmap.cfb32;
+-                              break;
+-#endif
+-                          default:
+-                              display->dispsw = &fbcon_dummy;
+-                              break;
+-                      }
+-                      if (fb_info.changevar)
+-                              (*fb_info.changevar)(con);
+-              }
+-              if (oldbpp != var->bits_per_pixel) {
+-                      if ((err = fb_alloc_cmap(&display->cmap, 0, 0)))
+-                              return err;
+-                      do_install_cmap(con, info);
+-              }
+-              if (con == info->currcon)
+-                      pvr2_set_var(&display->var);
+-      }
+-
+-      return 0;
+-}
+-
+-/*
+- * Pan or wrap the display.
+- * This call looks only at xoffset, yoffset and the FB_VMODE_YRAP flag
+- */
+-
+-static int pvr2fb_pan_display(struct fb_var_screeninfo *var, int con,
+-                                struct fb_info *info)
+-{
+-      if (var->vmode & FB_VMODE_YWRAP) {
+-              if (var->yoffset<0 || var->yoffset >=
+-                  fb_display[con].var.yres_virtual || var->xoffset)
+-                      return -EINVAL;
+-       } else {
+-              if (var->xoffset+fb_display[con].var.xres >
+-                  fb_display[con].var.xres_virtual ||
+-                  var->yoffset+fb_display[con].var.yres >
+-                  fb_display[con].var.yres_virtual)
+-                  return -EINVAL;
+-      }
+-      if (con == info->currcon)
+-              pvr2_pan_var(var);
+-      fb_display[con].var.xoffset = var->xoffset;
+-      fb_display[con].var.yoffset = var->yoffset;
+-      if (var->vmode & FB_VMODE_YWRAP)
+-              fb_display[con].var.vmode |= FB_VMODE_YWRAP;
+-      else
+-              fb_display[con].var.vmode &= ~FB_VMODE_YWRAP;
+-                      
+-      return 0;
+-}
+-
+-/* Get the colormap */
+-
+-static int pvr2fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                             struct fb_info *info)
+-{
+-      if (con == info->currcon) /* current console? */
+-              return fb_get_cmap(cmap, kspc, pvr2_getcolreg, info);
+-      else if (fb_display[con].cmap.len) /* non default colormap? */
+-              fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
+-      else
+-              fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel),
+-                           cmap, kspc ? 0 : 2);
+-      return 0;
+-}
+-
+-/* Set the colormap */
+-
+-static int pvr2fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                           struct fb_info *info)
+-{
+-      int err;
+-
+-      if (!fb_display[con].cmap.len) {        /* no colormap allocated? */
+-              if ((err = fb_alloc_cmap(&fb_display[con].cmap,
+-                                       1<<fb_display[con].var.bits_per_pixel,
+-                                       0)))
+-                       return err;
+-      }
+-      if (con == info->currcon)                     /* current console? */
+-              return fb_set_cmap(cmap, kspc, info);
+-      else
+-              fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+-
+-      return 0;
+-}
+-
+-static int pvr2fbcon_switch(int con, struct fb_info *info)
+-{
+-      /* Do we have to save the colormap? */
+-      if (fb_display[info->currcon].cmap.len)
+-              fb_get_cmap(&fb_display[info->currcon].cmap, 1, pvr2_getcolreg, info);
+-
+-      info->currcon = con;
+-      pvr2_set_var(&fb_display[con].var);
+-      /* Install new colormap */
+-      do_install_cmap(con, info);
+-      return 0;
+-}
+-
+-static int pvr2fbcon_updatevar(int con, struct fb_info *info)
+-{
+-      pvr2_pan_var(&fb_display[con].var);
+-      return 0;
+-}
+-
+ static int pvr2fb_blank(int blank, struct fb_info *info)
+ {
+       do_blank = blank ? blank : -1;
++      return 0;
+ }
+ static inline u_long get_line_length(int xres_virtual, int bpp)
+@@ -548,52 +276,29 @@ static void set_color_bitfields(struct f
+       }
+ }
+-static int pvr2_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
+-                            u_int *transp, struct fb_info *info)
+-{
+-      if (regno > 255)
+-          return 1;
+-      
+-      *red = palette[regno].red;
+-      *green = palette[regno].green;
+-      *blue = palette[regno].blue;
+-      *transp = 0;
+-      return 0;
+-}
+-      
+ static int pvr2fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+                             u_int transp, struct fb_info *info)
+ {
+       if (regno > 255)
+               return 1;
+-      palette[regno].red = red;
+-      palette[regno].green = green;
+-      palette[regno].blue = blue;
+-
+       if (regno < 16) {
+-              switch (currbpp) {
+-#ifdef FBCON_HAS_CFB16
++              switch (info->var.bits_per_pixel) {
+                   case 16: /* RGB 565 */
+-                      fbcon_cmap.cfb16[regno] = (red & 0xf800) |
+-                                                ((green & 0xfc00) >> 5) |
++                      ((u16*)(info->pseudo_palette))[regno] = (red & 0xf800) |
++                                              ((green & 0xfc00) >> 5) |
+                                                 ((blue & 0xf800) >> 11);
+                       break;
+-#endif
+-#ifdef FBCON_HAS_CFB24
+                   case 24: /* RGB 888 */
+                       red >>= 8; green >>= 8; blue >>= 8;
+-                      fbcon_cmap.cfb24[regno] = (red << 16) | (green << 8) | blue;
++                      ((u32*)(info->pseudo_palette))[regno] = (red << 16) | (green << 8) | blue;
+                       break;
+-#endif
+-#ifdef FBCON_HAS_CFB32
+                   case 32: /* ARGB 8888 */
+                       red >>= 8; green >>= 8; blue >>= 8;
+-                      fbcon_cmap.cfb32[regno] = (red << 16) | (green << 8) | blue;
++                      ((u32*)(info->pseudo_palette))[regno] = (transp << 24) |(red << 16) | (green << 8) | blue;
+                       break;
+-#endif
+                   default:
+-                      DPRINTK("Invalid bit depth %d?!?\n", currbpp);
++                      DPRINTK("Invalid bit depth %d?!?\n", info->var.bits_per_pixel);
+                       return 1;
+               }
+       }
+@@ -601,85 +306,33 @@ static int pvr2fb_setcolreg(u_int regno,
+       return 0;
+ }
+-
+-static int pvr2_encode_fix(struct fb_fix_screeninfo *fix,
+-                             struct pvr2fb_par *par)
+-{
+-      memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+-      strcpy(fix->id, pvr2fb_name);
+-      fix->smem_start = videomemory;
+-      fix->smem_len = videomemorysize;
+-      fix->type = FB_TYPE_PACKED_PIXELS;
+-      fix->type_aux = 0;
+-      fix->visual = FB_VISUAL_TRUECOLOR;
+-
+-      if (par->vmode & FB_VMODE_YWRAP) {
+-              fix->ywrapstep = 1;
+-              fix->xpanstep = fix->ypanstep = 0;
+-      } else {
+-              fix->ywrapstep = 0;
+-              fix->xpanstep = 1;
+-              fix->ypanstep = 1;
+-      }
+-      fix->line_length = par->next_line;
+-
+-      return 0;
+-}
+-
+-/*
+- * Create a hardware video mode using the framebuffer values.  If a value needs
+- * to be clipped or constrained it's done here.  This routine needs a bit more
+- * work to make sure we're doing the right tests at the right time.
+- */
+-static int pvr2_decode_var(struct fb_var_screeninfo *var,
+-                             struct pvr2fb_par *par)
++static int pvr2fb_set_par(struct fb_info *info)
+ {
++      struct pvr2fb_par *par = (struct pvr2fb_par *)info->par;
++      struct fb_var_screeninfo *var = &info->var;
+       u_long line_length;
+       u_short vtotal;
+-      if (var->pixclock != TV_CLK && var->pixclock != VGA_CLK) {
+-              DPRINTK("Invalid pixclock value %d\n", var->pixclock);
+-              return -EINVAL;
+-      }
+-      par->pixclock = var->pixclock;
+-      
+-      if ((par->xres = var->xres) < 320)
+-              par->xres = 320;
+-      if ((par->yres = var->yres) < 240)
+-              par->yres = 240;
+-      if ((par->vxres = var->xres_virtual) < par->xres)
+-              par->vxres = par->xres;
+-      if ((par->vyres = var->yres_virtual) < par->yres)
+-              par->vyres = par->yres;
+-
+-      if ((par->bpp = var->bits_per_pixel) <= 16)
+-              par->bpp = 16;
+-      else if ((par->bpp = var->bits_per_pixel) <= 24)
+-              par->bpp = 24;
+-      else if ((par->bpp = var->bits_per_pixel) <= 32)
+-              par->bpp = 32;
+-
+-      currbpp = par->bpp;
+-
+       /*
+        * XXX: It's possible that a user could use a VGA box, change the cable
+-       * type in hardware (i.e. switch from VGA<->composite), then change modes
+-       * (i.e. switching to another VT).  If that happens we should automagically
+-       * change the output format to cope, but currently I don't have a VGA box
+-       * to make sure this works properly.
++       * type in hardware (i.e. switch from VGA<->composite), then change
++       * modes (i.e. switching to another VT).  If that happens we should
++       * automagically change the output format to cope, but currently I
++       * don't have a VGA box to make sure this works properly.
+        */
+       cable_type = pvr2_init_cable();
+       if (cable_type == CT_VGA && video_output != VO_VGA)
+               video_output = VO_VGA;
+-      par->vmode = var->vmode & FB_VMODE_MASK;
+-      if (par->vmode & FB_VMODE_INTERLACED && video_output != VO_VGA)
++      var->vmode &= FB_VMODE_MASK;
++      if (var->vmode & FB_VMODE_INTERLACED && video_output != VO_VGA)
+               par->is_interlaced = 1;
+       /* 
+        * XXX: Need to be more creative with this (i.e. allow doublecan for
+        * PAL/NTSC output).
+        */
+-      par->is_doublescan = (par->yres < 480 && video_output == VO_VGA);
++      if (var->vmode & FB_VMODE_DOUBLE && video_output == VO_VGA)
++              par->is_doublescan = 1;
+       
+       par->hsync_total = var->left_margin + var->xres + var->right_margin +
+                          var->hsync_len;
+@@ -691,22 +344,12 @@ static int pvr2_decode_var(struct fb_var
+               if (par->is_interlaced)
+                       vtotal /= 2;
+               if (vtotal > (PAL_VTOTAL + NTSC_VTOTAL)/2) {
+-                      /* PAL video output */
+-                      /* XXX: Should be using a range here ... ? */
+-                      if (par->hsync_total != PAL_HTOTAL) {
+-                              DPRINTK("invalid hsync total for PAL\n");
+-                              return -EINVAL;
+-                      }
+                       /* XXX: Check for start values here... */
+                       /* XXX: Check hardware for PAL-compatibility */
+                       par->borderstart_h = 116;
+                       par->borderstart_v = 44;
+               } else {
+                       /* NTSC video output */
+-                      if (par->hsync_total != NTSC_HTOTAL) {
+-                              DPRINTK("invalid hsync total for NTSC\n");
+-                              return -EINVAL;
+-                      }
+                       par->borderstart_h = 126;
+                       par->borderstart_v = 18;
+               }
+@@ -714,155 +357,123 @@ static int pvr2_decode_var(struct fb_var
+               /* VGA mode */
+               /* XXX: What else needs to be checked? */
+               /* 
+-               * XXX: We have a little freedom in VGA modes, what ranges should
+-               * be here (i.e. hsync/vsync totals, etc.)?
++               * XXX: We have a little freedom in VGA modes, what ranges
++               * should be here (i.e. hsync/vsync totals, etc.)?
+                */
+               par->borderstart_h = 126;
+               par->borderstart_v = 40;
+       }
+       /* Calculate the remainding offsets */
+-      par->borderstop_h = par->borderstart_h + par->hsync_total -
+-                          var->hsync_len;
+-      par->borderstop_v = par->borderstart_v + par->vsync_total -
+-                          var->vsync_len;
+       par->diwstart_h = par->borderstart_h + var->left_margin;
+       par->diwstart_v = par->borderstart_v + var->upper_margin;
++      par->borderstop_h = par->diwstart_h + var->xres + 
++                          var->right_margin;    
++      par->borderstop_v = par->diwstart_v + var->yres +
++                          var->lower_margin;
++
+       if (!par->is_interlaced)
+               par->borderstop_v /= 2;
+-
+-      if (par->xres < 640)
++      if (info->var.xres < 640)
+               par->is_lowres = 1;
+-      /* XXX: Needs testing. */
+-      if (!((par->vmode ^ var->vmode) & FB_VMODE_YWRAP)) {
+-              par->xoffset = var->xoffset;
+-              par->yoffset = var->yoffset;
+-              if (par->vmode & FB_VMODE_YWRAP) {
+-                      if (par->xoffset || par->yoffset < 0 || par->yoffset >=
+-                          par->vyres)
+-                              par->xoffset = par->yoffset = 0;
+-              } else {
+-                      if (par->xoffset < 0 || par->xoffset > par->vxres-par->xres ||
+-                          par->yoffset < 0 || par->yoffset > par->vyres-par->yres)
+-                              par->xoffset = par->yoffset = 0;
+-              }
+-      } else
+-              par->xoffset = par->yoffset = 0;
+-
+-      /* Check memory sizes */
+       line_length = get_line_length(var->xres_virtual, var->bits_per_pixel);
+-      if (line_length * var->yres_virtual > videomemorysize)
+-              return -ENOMEM;
+-      par->disp_start = videomemory + (get_line_length(par->vxres, par->bpp) *
+-                        par->yoffset) * get_line_length(par->xoffset, par->bpp);
+-      par->next_line = line_length;
+-      
++      par->disp_start = videomemory + (line_length * var->yoffset) * line_length;
++      info->fix.line_length = line_length;
+       return 0;
+ }
+-static int pvr2_encode_var(struct fb_var_screeninfo *var,
+-                             struct pvr2fb_par *par)
++static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+ {
+-      memset(var, 0, sizeof(struct fb_var_screeninfo));
++      u_short vtotal, hsync_total;
++      u_long line_length;
+-      var->xres = par->xres;
+-      var->yres = par->yres;
+-      var->xres_virtual = par->vxres;
+-      var->yres_virtual = par->vyres;
+-      var->xoffset = par->xoffset;
+-      var->yoffset = par->yoffset;
++      if (var->pixclock != TV_CLK || var->pixclock != VGA_CLK) {
++              DPRINTK("Invalid pixclock value %d\n", var->pixclock);
++              return -EINVAL;
++      }
+-      var->bits_per_pixel = par->bpp;
+-      set_color_bitfields(var);
++      if (var->xres < 320)
++              var->xres = 320;
++      if (var->yres < 240)
++              var->yres = 240;
++      if (var->xres_virtual < var->xres)
++              var->xres_virtual = var->xres;
++      if (var->yres_virtual < var->yres)
++              var->yres_virtual = var->yres;
++
++      if (var->bits_per_pixel <= 16)
++              var->bits_per_pixel = 16;
++      else if (var->bits_per_pixel <= 24)
++              var->bits_per_pixel = 24;
++      else if (var->bits_per_pixel <= 32)
++              var->bits_per_pixel = 32;
+-      var->activate = FB_ACTIVATE_NOW;
+-      var->height = -1;
+-      var->width = -1;
++      set_color_bitfields(var);
+-      var->pixclock = par->pixclock;
++      if (var->vmode & FB_VMODE_YWRAP) {
++              if (var->xoffset || var->yoffset < 0 || 
++                  var->yoffset >= var->yres_virtual) {
++                      var->xoffset = var->yoffset = 0;
++              } else {
++                      if (var->xoffset > var->xres_virtual - var->xres ||
++                          var->yoffset > var->yres_virtual - var->yres || 
++                          var->xoffset < 0 || var->yoffset < 0)
++                              var->xoffset = var->yoffset = 0;
++              }
++      } else {
++              var->xoffset = var->yoffset = 0;
++      }
+-      if (par->is_doublescan)
++      /* 
++       * XXX: Need to be more creative with this (i.e. allow doublecan for
++       * PAL/NTSC output).
++       */
++      if (var->yres < 480 && video_output == VO_VGA)
+               var->vmode = FB_VMODE_DOUBLE;
+-      if (par->is_interlaced)
+-              var->vmode |= FB_VMODE_INTERLACED;
+-      else
+-              var->vmode |= FB_VMODE_NONINTERLACED;
+-
+-      var->right_margin = par->borderstop_h - (par->diwstart_h + par->xres);
+-      var->left_margin = par->diwstart_h - par->borderstart_h;
+-      var->hsync_len = par->borderstart_h + (par->hsync_total - par->borderstop_h);
+-      var->upper_margin = par->diwstart_v - par->borderstart_v;
+-      var->lower_margin = par->borderstop_v - (par->diwstart_v + par->yres);
+-      var->vsync_len = par->borderstart_v + (par->vsync_total - par->borderstop_v);
+       if (video_output != VO_VGA)
+-              var->sync = FB_SYNC_BROADCAST;
+-
+-      if (par->vmode & FB_VMODE_YWRAP)
+-              var->vmode |= FB_VMODE_YWRAP;
+-      
+-      return 0;
+-}
+-
+-static void pvr2_get_par(struct pvr2fb_par *par)
+-{
+-      *par = currentpar;
+-}
+-
+-/* Setup the new videomode in hardware */
+-
+-static void pvr2_set_var(struct fb_var_screeninfo *var)
+-{
+-      do_vmode_pan = 0;
+-      do_vmode_full = 0;
+-      pvr2_decode_var(var, &currentpar);
+-
+-      do_vmode_full = 1;
+-}
+-
+-/* 
+- * Pan or wrap the display
+- * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag in `var'.
+- */
+-static void pvr2_pan_var(struct fb_var_screeninfo *var)
+-{
+-      struct pvr2fb_par *par = &currentpar;
++              var->sync = FB_SYNC_BROADCAST | FB_VMODE_INTERLACED;
+-      par->xoffset = var->xoffset;
+-      par->yoffset = var->yoffset;
+-      if (var->vmode & FB_VMODE_YWRAP)
+-              par->vmode |= FB_VMODE_YWRAP;
+-      else
+-              par->vmode &= ~FB_VMODE_YWRAP;
+-
+-      do_vmode_pan = 0;
+-      pvr2_update_par();
+-      do_vmode_pan = 1;
+-}
+-
+-static int pvr2_update_par(void)
+-{
+-      struct pvr2fb_par *par = &currentpar;
+-      u_long move;
+-
+-      move = get_line_length(par->xoffset, par->bpp);
+-      if (par->yoffset) {
+-              par->disp_start += (par->next_line * par->yoffset) + move;
+-      } else
+-              par->disp_start += move;
++      hsync_total = var->left_margin + var->xres + var->right_margin +
++                    var->hsync_len;
++      vtotal = var->upper_margin + var->yres + var->lower_margin +
++               var->vsync_len;
++      if (var->sync & FB_SYNC_BROADCAST) {
++              if (var->vmode & FB_VMODE_INTERLACED)
++                      vtotal /= 2;
++              if (vtotal > (PAL_VTOTAL + NTSC_VTOTAL)/2) {
++                      /* PAL video output */
++                      /* XXX: Should be using a range here ... ? */
++                      if (hsync_total != PAL_HTOTAL) {
++                              DPRINTK("invalid hsync total for PAL\n");
++                              return -EINVAL;
++                      }
++              } else {
++                      /* NTSC video output */
++                      if (hsync_total != NTSC_HTOTAL) {
++                              DPRINTK("invalid hsync total for NTSC\n");
++                              return -EINVAL;
++                      }
++              }
++      }
++      /* Check memory sizes */
++      line_length = get_line_length(var->xres_virtual, var->bits_per_pixel);
++      if (line_length * var->yres_virtual > videomemorysize)
++              return -ENOMEM;
+       return 0;
+ }
+-static void pvr2_update_display(void)
++static void pvr2_update_display(struct fb_info *info)
+ {
+-      struct pvr2fb_par *par = &currentpar;
++      struct pvr2fb_par *par = (struct pvr2fb_par *) info->par;
++      struct fb_var_screeninfo *var = &info->var;
+       /* Update the start address of the display image */
+       ctrl_outl(par->disp_start, DISP_DIWADDRL);
+       ctrl_outl(par->disp_start +
+-                get_line_length(par->xoffset + par->xres, par->bpp),
++                get_line_length(var->xoffset+var->xres, var->bits_per_pixel),
+                 DISP_DIWADDRS);
+ }
+@@ -872,11 +483,12 @@ static void pvr2_update_display(void)
+  * registers are still undocumented.
+  */
+-static void pvr2_init_display(void)
++static void pvr2_init_display(struct fb_info *info)
+ {
+-      struct pvr2fb_par *par = &currentpar;
++      struct pvr2fb_par *par = (struct pvr2fb_par *) info->par;
++      struct fb_var_screeninfo *var = &info->var;
+       u_short diw_height, diw_width, diw_modulo = 1;
+-      u_short bytesperpixel = par->bpp / 8;
++      u_short bytesperpixel = var->bits_per_pixel >> 3;
+       /* hsync and vsync totals */
+       ctrl_outl((par->vsync_total << 16) | par->hsync_total, DISP_SYNCSIZE);
+@@ -885,16 +497,16 @@ static void pvr2_init_display(void)
+       /* since we're "panning" within vram, we need to offset things based
+        * on the offset from the virtual x start to our real gfx. */
+       if (video_output != VO_VGA && par->is_interlaced)
+-              diw_modulo += par->next_line / 4;
+-      diw_height = (par->is_interlaced ? par->yres / 2 : par->yres);
+-      diw_width = get_line_length(par->xres, par->bpp) / 4;
++              diw_modulo += info->fix.line_length / 4;
++      diw_height = (par->is_interlaced ? var->yres / 2 : var->yres);
++      diw_width = get_line_length(var->xres, var->bits_per_pixel) / 4;
+       ctrl_outl((diw_modulo << 20) | (--diw_height << 10) | --diw_width,
+                 DISP_DIWSIZE);
+       /* display address, long and short fields */
+       ctrl_outl(par->disp_start, DISP_DIWADDRL);
+       ctrl_outl(par->disp_start +
+-                get_line_length(par->xoffset + par->xres, par->bpp),
++                get_line_length(var->xoffset+var->xres, var->bits_per_pixel),
+                 DISP_DIWADDRS);
+       /* border horizontal, border vertical, border color */
+@@ -919,7 +531,6 @@ static void pvr2_init_display(void)
+       /* video enable, color sync, interlace, 
+        * hsync and vsync polarity (currently unused) */
+       ctrl_outl(0x100 | ((par->is_interlaced /*|4*/) << 4), DISP_SYNCCONF);
+-
+ }
+ /* Simulate blanking by making the border cover the entire screen */
+@@ -941,23 +552,20 @@ static void pvr2_do_blank(void)
+ static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id, struct pt_regs *fp)
+ {
+-      if (do_vmode_pan || do_vmode_full)
+-              pvr2_update_display();
++      struct fb_info *info = dev_id;
++      if (do_vmode_pan || do_vmode_full)
++              pvr2_update_display(info);
+       if (do_vmode_full)
+-              pvr2_init_display();
+-
++              pvr2_init_display(info);
+       if (do_vmode_pan)
+               do_vmode_pan = 0;
+-
++      if (do_vmode_full)
++              do_vmode_full = 0;
+       if (do_blank) {
+               pvr2_do_blank();
+               do_blank = 0;
+       }
+-
+-      if (do_vmode_full) {
+-              do_vmode_full = 0;
+-      }
+       return IRQ_HANDLED;
+ }
+@@ -991,94 +599,120 @@ static int pvr2_init_cable(void)
+ int __init pvr2fb_init(void)
+ {
+-      struct fb_var_screeninfo var;
+       u_long modememused;
++      int err = -EINVAL;
+-      if (!MACH_DREAMCAST)
++      if (!mach_is_dreamcast())
+               return -ENXIO;
++      fb_info = kmalloc(sizeof(struct fb_info) + sizeof(struct pvr2fb_par) +
++                        sizeof(u32) * 16, GFP_KERNEL);
++      
++      if (!fb_info) {
++              printk(KERN_ERR "Failed to allocate memory for fb_info\n");
++              return -ENOMEM;
++      }
++
++      memset(fb_info, 0, sizeof(fb_info) + sizeof(struct pvr2fb_par) + sizeof(u32) * 16);
++
++      currentpar = (struct pvr2fb_par *)(fb_info + 1);
++
+       /* Make a guess at the monitor based on the attached cable */
+       if (pvr2_init_cable() == CT_VGA) {
+-              fb_info.monspecs.hfmin = 30000;
+-              fb_info.monspecs.hfmax = 70000;
+-              fb_info.monspecs.vfmin = 60;
+-              fb_info.monspecs.vfmax = 60;
+-      }
+-      else { /* Not VGA, using a TV (taken from acornfb) */
+-              fb_info.monspecs.hfmin = 15469;
+-              fb_info.monspecs.hfmax = 15781;
+-              fb_info.monspecs.vfmin = 49;
+-              fb_info.monspecs.vfmax = 51;
++              fb_info->monspecs.hfmin = 30000;
++              fb_info->monspecs.hfmax = 70000;
++              fb_info->monspecs.vfmin = 60;
++              fb_info->monspecs.vfmax = 60;
++      } else {
++              /* Not VGA, using a TV (taken from acornfb) */
++              fb_info->monspecs.hfmin = 15469;
++              fb_info->monspecs.hfmax = 15781;
++              fb_info->monspecs.vfmin = 49;
++              fb_info->monspecs.vfmax = 51;
+       }
+-      /* XXX: This needs to pull default video output via BIOS or other means */
++      /*
++       * XXX: This needs to pull default video output via BIOS or other means
++       */
+       if (video_output < 0) {
+-              if (cable_type == CT_VGA)
++              if (cable_type == CT_VGA) {
+                       video_output = VO_VGA;
+-              else
++              } else {
+                       video_output = VO_NTSC;
++              }
+       }
+       
+-      strcpy(fb_info.modename, pvr2fb_name);
+-      fb_info.changevar = NULL;
+-      fb_info.fbops = &pvr2fb_ops;
+-      fb_info.screen_base = (char *) videomemory;
+-      fb_info.disp = &disp;
+-      fb_info.currcon = -1;
+-      fb_info.switch_con = &pvr2fbcon_switch;
+-      fb_info.updatevar = &pvr2fbcon_updatevar;
+-      fb_info.flags = FBINFO_FLAG_DEFAULT;
+-      memset(&var, 0, sizeof(var));
++      pvr2_fix.smem_start = videomemory;
++      pvr2_fix.smem_len = videomemorysize;
++
++      fb_info->screen_base = ioremap_nocache(pvr2_fix.smem_start,
++                                             pvr2_fix.smem_len);
++      
++      if (!fb_info->screen_base) {
++              printk("Failed to remap MMIO space\n");
++              err = -ENXIO;
++              goto out_err;
++      }
++
++      memset_io((unsigned long)fb_info->screen_base, 0, pvr2_fix.smem_len);
++
++      pvr2_fix.ypanstep       = nopan  ? 0 : 1;
++      pvr2_fix.ywrapstep      = nowrap ? 0 : 1;
++
++      fb_info->fbops          = &pvr2fb_ops;
++      fb_info->fix            = pvr2_fix;
++      fb_info->par            = currentpar;
++      fb_info->pseudo_palette = (void *)(fb_info->par + 1);
++      fb_info->flags          = FBINFO_FLAG_DEFAULT;
+       if (video_output == VO_VGA)
+               defmode = DEFMODE_VGA;
+-      if (!fb_find_mode(&var, &fb_info, mode_option, pvr2_modedb,
+-                        NUM_TOTAL_MODES, &pvr2_modedb[defmode], 16)) {
+-              return -EINVAL;
+-      }
++      if (!mode_option)
++              mode_option = "640x480@60";
+-      if (request_irq(HW_EVENT_VSYNC, pvr2fb_interrupt, 0,
+-                      "pvr2 VBL handler", &currentpar)) {
+-              DPRINTK("couldn't register VBL int\n");
+-              return -EBUSY;
+-      }
++      if (!fb_find_mode(&fb_info->var, fb_info, mode_option, pvr2_modedb,
++                        NUM_TOTAL_MODES, &pvr2_modedb[defmode], 16))
++              fb_info->var = pvr2_var;
+-#ifdef CONFIG_MTRR
+-      if (enable_mtrr) {
+-              mtrr_handle = mtrr_add(videomemory, videomemorysize, MTRR_TYPE_WRCOMB, 1);
+-              printk("pvr2fb: MTRR turned on\n");
++      if (request_irq(HW_EVENT_VSYNC, pvr2fb_interrupt, 0,
++                      "pvr2 VBL handler", fb_info)) {
++              err = -EBUSY;
++              goto out_err;
+       }
+-#endif
+-      pvr2fb_set_var(&var, -1, &fb_info);
++      if (register_framebuffer(fb_info) < 0)
++              goto reg_failed;
+-      if (register_framebuffer(&fb_info) < 0)
+-              return -EINVAL;
++      modememused = get_line_length(fb_info->var.xres_virtual,
++                                    fb_info->var.bits_per_pixel);
++      modememused *= fb_info->var.yres_virtual;
+-      modememused = get_line_length(var.xres_virtual, var.bits_per_pixel);
+-      modememused *= var.yres_virtual;
+       printk("fb%d: %s frame buffer device, using %ldk/%ldk of video memory\n",
+-             fb_info.node, fb_info.modename, modememused>>10,
++             fb_info->node, fb_info->fix.id, modememused>>10,
+              videomemorysize>>10);
+       printk("fb%d: Mode %dx%d-%d pitch = %ld cable: %s video output: %s\n", 
+-             fb_info.node, var.xres, var.yres, var.bits_per_pixel, 
+-             get_line_length(var.xres, var.bits_per_pixel),
++             fb_info->node, fb_info->var.xres, fb_info->var.yres,
++             fb_info->var.bits_per_pixel, 
++             get_line_length(fb_info->var.xres, fb_info->var.bits_per_pixel),
+              (char *)pvr2_get_param(cables, NULL, cable_type, 3),
+              (char *)pvr2_get_param(outputs, NULL, video_output, 3));
+       return 0;
++
++reg_failed:
++      free_irq(HW_EVENT_VSYNC, 0);
++out_err:
++      kfree(fb_info);
++
++      return err;
+ }
+ static void __exit pvr2fb_exit(void)
+ {
+-#ifdef CONFIG_MTRR
+-      if (enable_mtrr) {
+-              mtrr_del(mtrr_handle, videomemory, videomemorysize);
+-              printk("pvr2fb: MTRR turned off\n");
+-      }
+-#endif
+-      unregister_framebuffer(&fb_info);
++      unregister_framebuffer(fb_info);
++      free_irq(HW_EVENT_VSYNC, 0);
++      kfree(fb_info);
+ }
+ static int __init pvr2_get_param(const struct pvr2_params *p, const char *s,
+@@ -1102,7 +736,6 @@ static int __init pvr2_get_param(const s
+  * Parse command arguments.  Supported arguments are:
+  *    inverse                             Use inverse color maps
+  *    nomtrr                              Disable MTRR usage
+- *    font:<fontname>                     Specify console font
+  *    cable:composite|rgb|vga             Override the video cable type
+  *    output:NTSC|PAL|VGA                 Override the video output format
+  *
+@@ -1117,8 +750,6 @@ int __init pvr2fb_setup(char *options)
+       char cable_arg[80];
+       char output_arg[80];
+-      fb_info.fontname[0] = '\0';
+-
+       if (!options || !*options)
+               return 0;
+@@ -1128,23 +759,21 @@ int __init pvr2fb_setup(char *options)
+               if (!strcmp(this_opt, "inverse")) {
+                       pvr2fb_inverse = 1;
+                       fb_invert_cmaps();
+-              } else if (!strncmp(this_opt, "font:", 5))
+-                      strcpy(fb_info.fontname, this_opt + 5);
+-              else if (!strncmp(this_opt, "cable:", 6))
++              } else if (!strncmp(this_opt, "cable:", 6)) {
+                       strcpy(cable_arg, this_opt + 6);
+-              else if (!strncmp(this_opt, "output:", 7))
++              } else if (!strncmp(this_opt, "output:", 7)) {
+                       strcpy(output_arg, this_opt + 7);
+-#ifdef CONFIG_MTRR
+-              else if (!strncmp(this_opt, "nomtrr", 6))
+-                      enable_mtrr = 0;
+-#endif
+-              else
++              } else if (!strncmp(this_opt, "nopan", 5)) {
++                      nopan = 1;
++              } else if (!strncmp(this_opt, "nowrap", 6)) {
++                      nowrap = 1;
++              } else {
+                       mode_option = this_opt;
++              }
+       }
+       if (*cable_arg)
+               cable_type = pvr2_get_param(cables, cable_arg, 0, 3);
+-
+       if (*output_arg)
+               video_output = pvr2_get_param(outputs, output_arg, 0, 3);
+--- linux-2.6.0-test1/drivers/video/sis/300vtbl.h      2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/video/sis/300vtbl.h     2003-07-19 17:04:55.000000000 -0700
+@@ -1,7 +1,30 @@
+-
+-
+-/* Register settings for SiS 300 series */
+-
++/* $XFree86$ */
++/*
++ * Register settings for SiS 300 series
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ typedef struct _SiS300_StStruct
+ {
+@@ -39,470 +62,109 @@ static const SiS300_StStruct  SiS300_SMo
+       {0xff,     0,   0,   0,   0,   0,   0,   0}
+ };
+-typedef struct _SiS300_StandTableStruct
+-{
+-      UCHAR CRT_COLS;
+-      UCHAR ROWS;
+-      UCHAR CHAR_HEIGHT;
+-      USHORT CRT_LEN;
+-      UCHAR SR[4];
+-      UCHAR MISC;
+-      UCHAR CRTC[0x19];
+-      UCHAR ATTR[0x14];
+-      UCHAR GRC[9];
+-} SiS300_StandTableStruct;
+-
+-static const SiS300_StandTableStruct  SiS300_StandTable[] =
+-{
+- {0x28,0x18,0x08,0x0800,                      /* 0x00 */
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x28,0x18,0x08,0x0800,                      /* 0x01 */
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x08,0x1000,                      /* 0x02 */
+-  {0x01,0x03,0x00,0x02},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x08,0x1000,                      /* 0x03 */
+-  {0x01,0x03,0x00,0x02},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x28,0x18,0x08,0x4000,                      /* 0x04 */
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
+-   0xff},
+-  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x03,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
+-   0xff} },
+- {0x28,0x18,0x08,0x4000,                      /* 0x05 */
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
+-   0xff},
+-  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x03,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
+-   0xff} },
+- {0x50,0x18,0x08,0x4000,                      /* 0x06 */
+-  {0x01,0x01,0x00,0x06},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xc2,
+-   0xff},
+-  {0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+-   0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+-   0x01,0x00,0x01,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,
+-   0xff} },
+- {0x50,0x18,0x0e,0x1000,                      /* 0x07 */
+-  {0x00,0x03,0x00,0x03},
+-  0xa6,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x0d,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+-   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+-   0x0e,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
+-   0xff} },
+-/* MDA_DAC*/
+- {0x00,0x00,0x00,0x0000,                      /* 0x08 */
+-  {0x00,0x00,0x00,0x15},
+-  0x15,
+-  {0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15,0x15,0x15,0x3f,0x3f,
+-   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x00,0x00,
+-   0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15},
+-  {0x15,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x3f} },
+-/* CGA_DAC*/
+- {0x00,0x10,0x04,0x0114,                      /* 0x09 */
+-  {0x11,0x09,0x15,0x00},
+-  0x10,
+-  {0x04,0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,
+-   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x2a,0x3a,
+-   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x10,
+-   0x04},
+-  {0x14,0x01,0x11,0x09,0x15,0x00,0x10,0x04,
+-   0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,0x2e,
+-   0x3e,0x2b,0x3b,0x2f},
+-  {0x3f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
+-   0x3f} },
+-/* EGA_DAC*/
+- {0x00,0x10,0x04,0x0114,                      /* 0x0a */
+-  {0x11,0x05,0x15,0x20},
+-  0x30,
+-  {0x24,0x34,0x21,0x31,0x25,0x35,0x08,0x18,
+-   0x0c,0x1c,0x09,0x19,0x0d,0x1d,0x28,0x38,
+-   0x2c,0x3c,0x29,0x39,0x2d,0x3d,0x02,0x12,
+-   0x06},
+-  {0x16,0x03,0x13,0x07,0x17,0x22,0x32,0x26,
+-   0x36,0x23,0x33,0x27,0x37,0x0a,0x1a,0x0e,
+-   0x1e,0x0b,0x1b,0x0f},
+-  {0x1f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
+-   0x3f} },
+-/* VGA_DAC*/
+- {0x00,0x10,0x04,0x0114,                      /* 0x0b */
+-  {0x11,0x09,0x15,0x2a},
+-  0x3a,
+-  {0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x05,
+-   0x08,0x0b,0x0e,0x11,0x14,0x18,0x1c,0x20,
+-   0x24,0x28,0x2d,0x32,0x38,0x3f,0x00,0x10,
+-   0x1f},
+-  {0x2f,0x3f,0x1f,0x27,0x2f,0x37,0x3f,0x2d,
+-   0x31,0x36,0x3a,0x3f,0x00,0x07,0x0e,0x15,
+-   0x1c,0x0e,0x11,0x15},
+-  {0x18,0x1c,0x14,0x16,0x18,0x1a,0x1c,0x00,
+-   0x04} },
+- {0x08,0x0c,0x10,0x0a08,                      /* 0x0c */
+-  {0x0c,0x0e,0x10,0x0b},
+-  0x0c,
+-  {0x0d,0x0f,0x10,0x10,0x01,0x08,0x00,0x00,
+-   0x00,0x00,0x01,0x00,0x02,0x02,0x01,0x00,
+-   0x04,0x04,0x01,0x00,0x05,0x02,0x05,0x00,
+-   0x06},
+-  {0x01,0x06,0x05,0x06,0x00,0x08,0x01,0x08,
+-   0x00,0x07,0x02,0x07,0x06,0x07,0x00,0x00,
+-   0x00,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00} },
+- {0x28,0x18,0x08,0x2000,                      /* 0x0d */
+-  {0x09,0x0f,0x00,0x06},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0x80,0xbf,0x1f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff} },
+- {0x50,0x18,0x08,0x4000,                      /* 0x0e */
+-  {0x01,0x0f,0x00,0x06},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff} },
+- {0x00,0x00,0x00,0x0000,                      /* 0x0f */      /* TW: Standtable for VGA modes */
+-  {0x01,0x0f,0x00,0x0e},
+-  0x23,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+-   0x01,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
+-   0xff} },
+- {0x4a,0x36,0x00,0x00c0,                      /* 0x10 */
+-  {0x00,0x00,0x00,0x00},
+-  0x00,
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x3a,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00,0x00,0x1a,0x00,0x57,0x39,0x00,0xc0,
+-   0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00} },
+- {0x50,0x18,0x0e,0x8000,                      /* 0x11 */
+-  {0x01,0x0f,0x00,0x06},
+-  0xa2,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x0f,0x63,0xba,0xe3,
+-   0xff},
+-  {0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,
+-   0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,
+-   0x0b,0x00,0x05,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,
+-   0xff} },
+- {0x50,0x18,0x0e,0x8000,                      /* 0x12 */
+-  {0x01,0x0f,0x00,0x06},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x0f,0x63,0xba,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff} },
+- {0x28,0x18,0x0e,0x0800,                      /* 0x13 */
+-  {0x09,0x03,0x00,0x02},
+-  0xa3,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x28,0x18,0x0e,0x0800,                      /* 0x14 */
+-  {0x09,0x03,0x00,0x02},
+-  0xa3,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x0e,0x1000,                      /* 0x15 */
+-  {0x01,0x03,0x00,0x02},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x0e,0x1000,                      /* 0x16 */
+-  {0x01,0x03,0x00,0x02},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x28,0x18,0x10,0x0800,                      /* 0x17 */
+-  {0x08,0x03,0x00,0x02},
+-  0x67,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x0c,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x10,0x1000,                      /* 0x18 */
+-  {0x00,0x03,0x00,0x02},
+-  0x67,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x0c,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff} },
+- {0x50,0x18,0x10,0x1000,                      /* 0x19 */
+-  {0x00,0x03,0x00,0x02},
+-  0x66,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x0f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+-   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+-   0x0e,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
+-   0xff} },
+- {0x50,0x1d,0x10,0xa000,                      /* 0x1a */
+-  {0x01,0x0f,0x00,0x06},
+-  0xe3,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xea,0x8c,0xdf,0x28,0x00,0xe7,0x04,0xc3,
+-   0xff},
+-  {0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,
+-   0xff} },
+- {0x50,0x1d,0x10,0xa000,                      /* 0x1b */
+-  {0x01,0x0f,0x00,0x06},
+-  0xe3,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xea,0x8c,0xdf,0x28,0x00,0xe7,0x04,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff} },
+- {0x28,0x18,0x08,0x2000,                      /* 0x1c */
+-  {0x01,0x0f,0x00,0x0e},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0xbf,0x1f,
+-   0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x40,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+-   0x41,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
+-   0xff} }
+-};
+-
+ typedef struct _SiS300_ExtStruct
+ {
+-      UCHAR Ext_ModeID;
++      UCHAR  Ext_ModeID;
+       USHORT Ext_ModeFlag;
+       USHORT Ext_ModeInfo;
+-      USHORT Ext_Point;
+       USHORT Ext_VESAID;
+-      UCHAR Ext_VESAMEMSize;
+-      UCHAR Ext_RESINFO;
+-      UCHAR VB_ExtTVFlickerIndex;
+-      UCHAR VB_ExtTVEdgeIndex;
+-      UCHAR VB_ExtTVYFilterIndex;
+-      UCHAR REFindex;
++      UCHAR  Ext_RESINFO;
++      UCHAR  VB_ExtTVFlickerIndex;
++      UCHAR  VB_ExtTVEdgeIndex;
++      UCHAR  VB_ExtTVYFilterIndex;
++      UCHAR  REFindex;
+ } SiS300_ExtStruct;
+ static const SiS300_ExtStruct  SiS300_EModeIDTable[] =
+ {
+-      {0x6a,0x2212,0x47,0x3563,0x0102,0x08,0x07,0x00,0x00,0x00,0x00},  /* 800x600x? */
+-      {0x2e,0x0a1b,0x36,0x3539,0x0101,0x08,0x06,0x00,0x00,0x00,0x08},
+-      {0x2f,0x021b,0x35,0x3532,0x0100,0x08,0x05,0x00,0x00,0x00,0x10},  /* 640x400x8 */
+-      {0x30,0x2a1b,0x47,0x3563,0x0103,0x08,0x07,0x00,0x00,0x00,0x00},
+-      {0x31,0x0a1b,0xad,0x3630,0x0000,0x08,0x0c,0x00,0x00,0x00,0x11},  /* 720x480x8 */
+-      {0x32,0x2a1b,0xae,0x3637,0x0000,0x08,0x0d,0x00,0x00,0x00,0x12},  /* 720x576x8 */
+-      {0x33,0x0a1d,0xad,0x3630,0x0000,0x08,0x0c,0x00,0x00,0x00,0x11},  /* 720x480x16 */
+-      {0x34,0x2a1d,0xae,0x3637,0x0000,0x08,0x0d,0x00,0x00,0x00,0x12},  /* 720x576x16 */
+-      {0x35,0x0a1f,0xad,0x3630,0x0000,0x08,0x0c,0x00,0x00,0x00,0x11},  /* 720x480x32 */
+-      {0x36,0x2a1f,0xae,0x3637,0x0000,0x08,0x0d,0x00,0x00,0x00,0x12},  /* 720x576x32 */
+-      {0x37,0x0212,0x58,0x358d,0x0104,0x08,0x08,0x00,0x00,0x00,0x13},  /* 1024x768x? */
+-      {0x38,0x0a1b,0x58,0x358d,0x0105,0x08,0x08,0x00,0x00,0x00,0x13},  /* 1024x768x8 */
+-      {0x3a,0x0e3b,0x69,0x35be,0x0107,0x08,0x09,0x00,0x00,0x00,0x1a},  /* 1280x1024x8 */
+-      {0x3c,0x063b,0x7a,0x35d4,0x0130,0x08,0x0a,0x00,0x00,0x00,0x1e},
+-      {0x3d,0x067d,0x7a,0x35d4,0x0131,0x08,0x0a,0x00,0x00,0x00,0x1e},
+-      {0x40,0x921c,0x00,0x3516,0x010d,0x08,0x00,0x00,0x00,0x00,0x23},
+-      {0x41,0x921d,0x00,0x3516,0x010e,0x08,0x00,0x00,0x00,0x00,0x23},
+-      {0x43,0x0a1c,0x36,0x3539,0x0110,0x08,0x06,0x00,0x00,0x00,0x08},
+-      {0x44,0x0a1d,0x36,0x3539,0x0111,0x08,0x06,0x00,0x00,0x00,0x08},
+-      {0x46,0x2a1c,0x47,0x3563,0x0113,0x08,0x07,0x00,0x00,0x00,0x00},  /* 800x600 */
+-      {0x47,0x2a1d,0x47,0x3563,0x0114,0x08,0x07,0x00,0x00,0x00,0x00},  /* 800x600 */
+-      {0x49,0x0a3c,0x58,0x358d,0x0116,0x08,0x08,0x00,0x00,0x00,0x13},
+-      {0x4a,0x0a3d,0x58,0x358d,0x0117,0x08,0x08,0x00,0x00,0x00,0x13},
+-      {0x4c,0x0e7c,0x69,0x35be,0x0119,0x08,0x09,0x00,0x00,0x00,0x1a},
+-      {0x4d,0x0e7d,0x69,0x35be,0x011a,0x08,0x09,0x00,0x00,0x00,0x1a},
+-      {0x50,0x921b,0x01,0x351d,0x0132,0x08,0x01,0x00,0x00,0x00,0x24},
+-      {0x51,0xb21b,0x13,0x3524,0x0133,0x08,0x03,0x00,0x00,0x00,0x25},  /* 400x300 */
+-      {0x52,0x921b,0x24,0x352b,0x0134,0x08,0x04,0x00,0x00,0x00,0x26},
+-      {0x56,0x921d,0x01,0x351d,0x0135,0x08,0x01,0x00,0x00,0x00,0x24},
+-      {0x57,0xb21d,0x13,0x3524,0x0136,0x08,0x03,0x00,0x00,0x00,0x25},  /* 400x300 */
+-      {0x58,0x921d,0x24,0x352b,0x0137,0x08,0x04,0x00,0x00,0x00,0x26},  
+-      {0x59,0x921b,0x00,0x3516,0x0138,0x08,0x00,0x00,0x00,0x00,0x23}, 
+-      {0x5c,0x921f,0x24,0x352b,0x0000,0x08,0x04,0x00,0x00,0x00,0x26},  /* TW: inserted 512x384x32 */
+-      {0x5d,0x021d,0x35,0x3532,0x0139,0x08,0x05,0x00,0x00,0x00,0x10},  /* 640x400x16 */
+-      {0x5e,0x021f,0x35,0x3532,0x0000,0x08,0x05,0x00,0x00,0x00,0x10},  /* TW: inserted 640x400x32 */
+-      {0x62,0x0a3f,0x36,0x3539,0x013a,0x08,0x06,0x00,0x00,0x00,0x08},
+-      {0x63,0x2a3f,0x47,0x3563,0x013b,0x08,0x07,0x00,0x00,0x00,0x00},  /* 800x600 */
+-      {0x64,0x0a7f,0x58,0x358d,0x013c,0x08,0x08,0x00,0x00,0x00,0x13},
+-      {0x65,0x0eff,0x69,0x35be,0x013d,0x08,0x09,0x00,0x00,0x00,0x1a},
+-      {0x66,0x06ff,0x7a,0x35d4,0x013e,0x08,0x0a,0x00,0x00,0x00,0x1e},
+-      {0x68,0x067b,0x8b,0x35ef,0x013f,0x08,0x0b,0x00,0x00,0x00,0x27},
+-      {0x69,0x06fd,0x8b,0x35ef,0x0140,0x08,0x0b,0x00,0x00,0x00,0x27},
+-      {0x6b,0x07ff,0x8b,0x35ef,0x0000,0x10,0x0b,0x00,0x00,0x00,0x27},
+-      {0x6c,0x067b,0x9c,0x35f6,0x0000,0x08,0x11,0x00,0x00,0x00,0x28},  /* TW: 2048x1536x8 - not in BIOS! */
+-      {0x6d,0x06fd,0x9c,0x35f6,0x0000,0x10,0x11,0x00,0x00,0x00,0x28},  /* TW: 2048x1536x16 - not in BIOS! */
+-      {0x6e,0x0a3b,0x6f,0x35b2,0x0000,0x08,0x0e,0x00,0x00,0x00,0x29},  /* 1280x960x8 */
+-      {0x6f,0x0a7d,0x6f,0x35b2,0x0000,0x08,0x0e,0x00,0x00,0x00,0x29},  /* 1280x960x16 */
+-      /* TW: 16:9 modes copied from 310/325 series - not in ANY BIOS */
+-      {0x70,0x2a1b,0x40,0x3b52,0x0000,0x08,0x12,0x00,0x00,0x07,0x2d},    /* 800x480x8 */
+-      {0x71,0x0a1b,0x51,0x3b63,0x0000,0x08,0x13,0x00,0x00,0x00,0x30},    /* 1024x576x8 */
+-      {0x74,0x0a1d,0x51,0x3b63,0x0000,0x08,0x13,0x00,0x00,0x00,0x30},    /* 1024x576x16 */
+-      {0x75,0x0e3d,0x62,0x3b74,0x0000,0x08,0x14,0x00,0x00,0x00,0x33},    /* 1280x720x16 */
+-      {0x76,0x2a1f,0x40,0x3b52,0x0000,0x08,0x12,0x00,0x00,0x07,0x2d},    /* 800x480x32 */
+-      {0x77,0x0a3f,0x51,0x3b63,0x0000,0x08,0x13,0x00,0x00,0x00,0x30},    /* 1024x576x32 */
+-      {0x78,0x0eff,0x62,0x3b74,0x0000,0x08,0x14,0x00,0x00,0x00,0x33},    /* 1280x720x32 */
+-      {0x79,0x0e3b,0x62,0x3b74,0x0000,0x08,0x14,0x00,0x00,0x00,0x33},    /* 1280x720x8 */
+-      {0x7a,0x2a1d,0x40,0x3b52,0x0000,0x08,0x12,0x00,0x00,0x07,0x2d},    /* 800x480x16 */
+-      /* TW: End of new 16:9 modes */
+-      {0x7b,0x0aff,0x6f,0x35b2,0x0000,0x08,0x0e,0x00,0x00,0x00,0x29},    /* 1280x960x32 */
+-      {0x20,0x0a1b,0x54,0x0000,0x0000,0x08,0x0f,0x00,0x00,0x00,0x2b},    /* 1024x600 */
+-      {0x21,0x0a3d,0x54,0x0000,0x0000,0x08,0x0f,0x00,0x00,0x00,0x2b},
+-      {0x22,0x0a7f,0x54,0x0000,0x0000,0x08,0x0f,0x00,0x00,0x00,0x2b},
+-      {0x23,0x0a1b,0xc5,0x0000,0x0000,0x08,0x10,0x00,0x00,0x00,0x2c},    /* 1152x768 */
+-      {0x24,0x0a3d,0xc5,0x431d,0x0000,0x08,0x10,0x00,0x00,0x00,0x2c},
+-      {0x25,0x0a7f,0xc5,0x431d,0x0000,0x08,0x10,0x00,0x00,0x00,0x2c},
+-      {0x29,0x0e1b,0xc5,0x0000,0x0000,0x08,0x15,0x00,0x00,0x00,0x36},    /* TW: NEW 1152x864 - not in BIOS */
+-      {0x2a,0x0e3d,0xc5,0x0000,0x0000,0x08,0x15,0x00,0x00,0x00,0x36},
+-      {0x2b,0x0e7f,0xc5,0x0000,0x0000,0x08,0x15,0x00,0x00,0x00,0x36},
+-      {0x39,0x2a1b,0xd6,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x38},    /* TW: NEW 848x480 - not in BIOS */
+-      {0x3b,0x2a3d,0xd6,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x38},
+-      {0x3e,0x2a7f,0xd6,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x38},
+-      {0x3f,0x2a1b,0xd7,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x3a},    /* TW: NEW 856x480 - not in BIOS */
+-      {0x42,0x2a3d,0xd7,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x3a},
+-      {0x45,0x2a7f,0xd7,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x3a},
+-      {0x48,0x223b,0xe8,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x3c},    /* TW: NEW 1360x768 - not in BIOS */
+-      {0x4b,0x227d,0xe8,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x3c},
+-      {0x4e,0x22ff,0xe8,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x3c},
+-      {0xff,0x0000,0x00,0x0000,0xffff,0x00,0x00,0x00,0x00,0x00,0x00}
++      {0x6a,0x2212,0x0407,0x0102,SIS_RI_800x600,  0x00,0x00,0x00,0x00},  /* 800x600x? */
++      {0x2e,0x0a1b,0x0306,0x0101,SIS_RI_640x480,  0x00,0x00,0x00,0x08},
++      {0x2f,0x021b,0x0305,0x0100,SIS_RI_640x400,  0x00,0x00,0x00,0x10},  /* 640x400x8 */
++      {0x30,0x2a1b,0x0407,0x0103,SIS_RI_800x600,  0x00,0x00,0x00,0x00},
++      {0x31,0x0a1b,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x00,0x11},  /* 720x480x8 */
++      {0x32,0x2a1b,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x00,0x12},  /* 720x576x8 */
++      {0x33,0x0a1d,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x00,0x11},  /* 720x480x16 */
++      {0x34,0x2a1d,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x00,0x12},  /* 720x576x16 */
++      {0x35,0x0a1f,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x00,0x11},  /* 720x480x32 */
++      {0x36,0x2a1f,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x00,0x12},  /* 720x576x32 */
++      {0x37,0x0212,0x0508,0x0104,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},  /* 1024x768x? */
++      {0x38,0x0a1b,0x0508,0x0105,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},  /* 1024x768x8 */
++      {0x3a,0x0e3b,0x0609,0x0107,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},  /* 1280x1024x8 */
++      {0x3c,0x063b,0x070a,0x0130,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
++      {0x3d,0x067d,0x070a,0x0131,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
++      {0x40,0x921c,0x0000,0x010d,SIS_RI_320x200,  0x00,0x00,0x00,0x23},  /* 320x200x15 */
++      {0x41,0x921d,0x0000,0x010e,SIS_RI_320x200,  0x00,0x00,0x00,0x23},  /* 320x200x16 */
++      {0x43,0x0a1c,0x0306,0x0110,SIS_RI_640x480,  0x00,0x00,0x00,0x08},
++      {0x44,0x0a1d,0x0306,0x0111,SIS_RI_640x480,  0x00,0x00,0x00,0x08},
++      {0x46,0x2a1c,0x0407,0x0113,SIS_RI_800x600,  0x00,0x00,0x00,0x00},  /* 800x600x15 */
++      {0x47,0x2a1d,0x0407,0x0114,SIS_RI_800x600,  0x00,0x00,0x00,0x00},  /* 800x600x16 */
++      {0x49,0x0a3c,0x0508,0x0116,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
++      {0x4a,0x0a3d,0x0508,0x0117,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
++      {0x4c,0x0e7c,0x0609,0x0119,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
++      {0x4d,0x0e7d,0x0609,0x011a,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
++      {0x50,0x921b,0x0001,0x0132,SIS_RI_320x240,  0x00,0x00,0x00,0x24},  /* 320x240x8  */
++      {0x51,0xb21b,0x0103,0x0133,SIS_RI_400x300,  0x00,0x00,0x00,0x25},  /* 400x300x8  */
++      {0x52,0x921b,0x0204,0x0134,SIS_RI_512x384,  0x00,0x00,0x00,0x26},  /* 512x384x8  */
++      {0x56,0x921d,0x0001,0x0135,SIS_RI_320x240,  0x00,0x00,0x00,0x24},  /* 320x240x16 */
++      {0x57,0xb21d,0x0103,0x0136,SIS_RI_400x300,  0x00,0x00,0x00,0x25},  /* 400x300x16 */
++      {0x58,0x921d,0x0204,0x0137,SIS_RI_512x384,  0x00,0x00,0x00,0x26},  /* 512x384x16 */
++      {0x59,0x921b,0x0000,0x0138,SIS_RI_320x200,  0x00,0x00,0x00,0x23},  /* 320x200x8  */
++      {0x5c,0x921f,0x0204,0x0000,SIS_RI_512x384,  0x00,0x00,0x00,0x26},  /* 512x384x32 */
++      {0x5d,0x021d,0x0305,0x0139,SIS_RI_640x400,  0x00,0x00,0x00,0x10},  /* 640x400x16 */
++      {0x5e,0x021f,0x0305,0x0000,SIS_RI_640x400,  0x00,0x00,0x00,0x10},  /* 640x400x32 */
++      {0x62,0x0a3f,0x0306,0x013a,SIS_RI_640x480,  0x00,0x00,0x00,0x08},
++      {0x63,0x2a3f,0x0407,0x013b,SIS_RI_800x600,  0x00,0x00,0x00,0x00},  /* 800x600x32 */
++      {0x64,0x0a7f,0x0508,0x013c,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
++      {0x65,0x0eff,0x0609,0x013d,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
++      {0x66,0x06ff,0x070a,0x013e,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
++      {0x68,0x067b,0x080b,0x013f,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
++      {0x69,0x06fd,0x080b,0x0140,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
++      {0x6b,0x07ff,0x080b,0x0000,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
++      {0x6c,0x067b,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x28},  /* 2048x1536x8 - not in BIOS! */
++      {0x6d,0x06fd,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x28},  /* 2048x1536x16 - not in BIOS! */
++      {0x70,0x2a1b,0x0400,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x2d},  /* 800x480x8 */
++      {0x71,0x0a1b,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30},  /* 1024x576x8 */
++      {0x74,0x0a1d,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30},  /* 1024x576x16 */
++      {0x75,0x0e3d,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33},  /* 1280x720x16 */
++      {0x76,0x2a1f,0x0400,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x2d},  /* 800x480x32 */
++      {0x77,0x0a3f,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30},  /* 1024x576x32 */
++      {0x78,0x0eff,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33},  /* 1280x720x32 */
++      {0x79,0x0e3b,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33},  /* 1280x720x8 */
++      {0x7a,0x2a1d,0x0400,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x2d},  /* 800x480x16 */
++      {0x7c,0x0a3b,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29},  /* 1280x960x8 */
++      {0x7d,0x0a7d,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29},  /* 1280x960x16 */
++      {0x7e,0x0aff,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29},  /* 1280x960x32 */
++      {0x20,0x0a1b,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b},  /* 1024x600 */
++      {0x21,0x0a3d,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b},
++      {0x22,0x0a7f,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b},
++      {0x23,0x0a1b,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c},  /* 1152x768 */
++      {0x24,0x0a3d,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c},
++      {0x25,0x0a7f,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c},
++      {0x29,0x0e1b,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36},  /* 1152x864 */
++      {0x2a,0x0e3d,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36},
++      {0x2b,0x0e7f,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36},
++      {0x39,0x2a1b,0x0d06,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x38},  /* 848x480 */
++      {0x3b,0x2a3d,0x0d06,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x38},
++      {0x3e,0x2a7f,0x0d06,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x38},
++      {0x3f,0x2a1b,0x0d07,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x3a},  /* 856x480 */
++      {0x42,0x2a3d,0x0d07,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x3a},
++      {0x45,0x2a7f,0x0d07,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x3a},
++      {0x48,0x223b,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c},  /* 1360x768 */
++      {0x4b,0x227d,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c},
++      {0x4e,0x22ff,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c},
++      {0x4f,0x921f,0x0000,0x0000,SIS_RI_320x200,  0x00,0x00,0x00,0x23},  /* 320x200x32 */
++      {0x53,0x921f,0x0001,0x0000,SIS_RI_320x240,  0x00,0x00,0x00,0x24},  /* 320x240x32 */
++      {0x54,0xb21f,0x0103,0x0000,SIS_RI_400x300,  0x00,0x00,0x00,0x25},  /* 400x300x32 */
++      {0x55,0x2e3b,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d},  /* 1280x768   */
++      {0x5a,0x2e7d,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d},
++      {0x5b,0x2eff,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d},
++      {0x5f,0x2a1b,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x3e},  /* 768x576x8 */
++      {0x60,0x2a1d,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x3e},  /* 768x576x16 */
++      {0x61,0x2a1f,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x3e},  /* 768x576x32 */
++      {0x67,0x2e3b,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f},  /* 1360x1024x8 (BARCO) */
++      {0x6f,0x2e7d,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f},  /* 1360x1024x16 (BARCO) */
++      {0x72,0x2eff,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f},  /* 1360x1024x32 (BARCO) */
++      {0xff,0x0000,0x0000,0xffff,0x00,            0x00,0x00,0x00,0x00}
+ };
+ typedef struct _SiS300_Ext2Struct
+@@ -514,76 +176,77 @@ typedef struct _SiS300_Ext2Struct
+       UCHAR  ModeID;
+       USHORT XRes;
+       USHORT YRes;
+-      USHORT ROM_OFFSET;
+ } SiS300_Ext2Struct;
+ static const SiS300_Ext2Struct  SiS300_RefIndex[] =
+ { /* TW: Don't ever insert anything here, table is indexed */
+-      {0x085f,0x0d,0x03,0x05,0x6a, 800, 600,0x3563}, /* 00 */
+-      {0x0467,0x0e,0x44,0x05,0x6a, 800, 600,0x3568}, /* 01 */
+-      {0x0067,0x0f,0x07,0x48,0x6a, 800, 600,0x356d}, /* 02 - CRT1CRTC was 0x4f */
+-      {0x0067,0x10,0x06,0x8b,0x6a, 800, 600,0x3572}, /* 03 */
+-      {0x0147,0x11,0x08,0x00,0x6a, 800, 600,0x3577}, /* 04 */
+-      {0x0147,0x12,0x0c,0x00,0x6a, 800, 600,0x357c}, /* 05 */
+-      {0x0047,0x11,0x4e,0x00,0x6a, 800, 600,0x3581}, /* 06 - CRT1CRTC was 0x51 */
+-      {0x0047,0x11,0x13,0x00,0x6a, 800, 600,0x3586}, /* 07 */
+-      {0xc85f,0x05,0x00,0x04,0x2e, 640, 480,0x3539}, /* 08 */
+-      {0xc067,0x06,0x02,0x04,0x2e, 640, 480,0x353e}, /* 09 */
+-      {0xc067,0x07,0x02,0x47,0x2e, 640, 480,0x3543}, /* 0a */
+-      {0xc067,0x08,0x03,0x8a,0x2e, 640, 480,0x3548}, /* 0b */
+-      {0xc047,0x09,0x05,0x00,0x2e, 640, 480,0x354d}, /* 0c */
+-      {0xc047,0x0a,0x08,0x00,0x2e, 640, 480,0x3552}, /* 0d */
+-      {0xc047,0x0b,0x0a,0x00,0x2e, 640, 480,0x3557}, /* 0e */
+-      {0xc047,0x0c,0x10,0x00,0x2e, 640, 480,0x355c}, /* 0f */
+-      {0x487f,0x04,0x00,0x00,0x2f, 640, 400,0x3532}, /* 10 */
+-      {0xc00f,0x31,0x01,0x06,0x31, 720, 480,0x3630}, /* 11 */
+-      {0x000f,0x32,0x03,0x06,0x32, 720, 576,0x3637}, /* 12 */
+-      {0x0187,0x15,0x05,0x00,0x37,1024, 768,0x358d}, /* 13 */
+-        {0xc877,0x16,0x09,0x06,0x37,1024, 768,0x3592}, /* 14 */
+-      {0xc067,0x17,0x0b,0x49,0x37,1024, 768,0x3597}, /* 15 - CRT1CRTC was 0x97 */
+-      {0x0267,0x18,0x0d,0x00,0x37,1024, 768,0x359c}, /* 16 */
+-      {0x0047,0x19,0x11,0x8c,0x37,1024, 768,0x35a1}, /* 17 - CRT1CRTC was 0x59 */
+-      {0x0047,0x1a,0x52,0x00,0x37,1024, 768,0x35a6}, /* 18 */
+-      {0x0007,0x1b,0x16,0x00,0x37,1024, 768,0x35ab}, /* 19 - CRT1CRTC was 0x5b */
+-      {0x0387,0x1c,0x4d,0x00,0x3a,1280,1024,0x35be}, /* 1a - CRT1CRTC was 0x5c */
+-      {0x0077,0x1d,0x14,0x07,0x3a,1280,1024,0x35c3}, /* 1b */
+-      {0x0047,0x1e,0x17,0x00,0x3a,1280,1024,0x35c8}, /* 1c */
+-      {0x0007,0x1f,0x98,0x00,0x3a,1280,1024,0x35cd}, /* 1d */
+-      {0x0007,0x20,0x59,0x00,0x3c,1600,1200,0x35d4}, /* 1e - CRT1CRTC was 0x60 */
+-      {0x0007,0x21,0x5a,0x00,0x3c,1600,1200,0x35d9}, /* 1f */
+-      {0x0007,0x22,0x1b,0x00,0x3c,1600,1200,0x35de}, /* 20 */
+-      {0x0007,0x23,0x1d,0x00,0x3c,1600,1200,0x35e3}, /* 21 - CRT1CRTC was 0x63 */
+-      {0x0007,0x24,0x1e,0x00,0x3c,1600,1200,0x35e8}, /* 22 */
+-      {0x407f,0x00,0x00,0x00,0x40, 320, 200,0x3516}, /* 23 */
+-      {0xc07f,0x01,0x00,0x04,0x50, 320, 240,0x351d}, /* 24 */
+-      {0x0077,0x02,0x04,0x05,0x51, 400, 300,0x3524}, /* 25 */
+-      {0xc877,0x03,0x09,0x06,0x52, 512, 384,0x352b}, /* 26 */  /* was c077 */
+-      {0x8207,0x25,0x1f,0x00,0x68,1920,1440,0x35ef}, /* 27 */
+-      {0x0007,0x26,0x20,0x00,0x6c,2048,1536,0x35f6}, /* 28 */
+-      {0x0067,0x27,0x14,0x08,0x6e,1280, 960,0x35b7}, /* 29 - TW: 1280x960-60 */
+-      {0x0027,0x45,0x3c,0x08,0x6e,1280, 960,0x35b7}, /* 2a - TW: 1280x960-85 */
+-      {0xc077,0x33,0x09,0x06,0x20,1024, 600,0x0000}, /* 2b */
+-      {0xc077,0x34,0x0b,0x06,0x23,1152, 768,0x0000}, /* 2c */ /* VCLK 0x09 */
+-      {0x0057,0x35,0x27,0x08,0x70, 800, 480,0x3b52}, /* 2d - TW: 16:9 modes */
+-      {0x0047,0x36,0x37,0x08,0x70, 800, 480,0x3b57}, /* 2e */
+-      {0x0047,0x37,0x08,0x08,0x70, 800, 480,0x3b5c}, /* 2f */
+-      {0x0057,0x38,0x09,0x09,0x71,1024, 576,0x3b63}, /* 30 */
+-      {0x0047,0x39,0x38,0x09,0x71,1024, 576,0x3b68}, /* 31 */
+-      {0x0047,0x3a,0x11,0x09,0x71,1024, 576,0x3b6d}, /* 32 */
+-      {0x0057,0x3b,0x39,0x0a,0x75,1280, 720,0x3b74}, /* 33 */
+-      {0x0047,0x3c,0x3a,0x0a,0x75,1280, 720,0x3b79}, /* 34 */
+-      {0x0007,0x3d,0x3b,0x0a,0x75,1280, 720,0x3b7e}, /* 35 - TW: END of 16:9 modes */
+-      {0x0047,0x3e,0x34,0x06,0x29,1152, 864,0x0000}, /* 36 TW: 1152x864-75Hz - Non-BIOS, new */
+-      {0x0047,0x44,0x3a,0x06,0x29,1152, 864,0x0000}, /* 37 TW: 1152x864-85Hz - Non-BIOS, new */
+-      {0x00c7,0x3f,0x28,0x00,0x39, 848, 480,0x0000}, /* 38 TW: 848x480-38Hzi - Non-BIOS, new */
+-      {0xc047,0x40,0x3d,0x00,0x39, 848, 480,0x0000}, /* 39 TW: 848x480-60Hz  - Non-BIOS, new */
+-      {0x00c7,0x41,0x28,0x00,0x3f, 856, 480,0x0000}, /* 3a TW: 856x480-38Hzi - Non-BIOS, new */
+-      {0xc047,0x42,0x28,0x00,0x3f, 856, 480,0x0000}, /* 3b TW: 856x480-60Hz  - Non-BIOS, new */
+-      {0x0047,0x43,0x3e,0x00,0x48,1360, 768,0x0000}, /* 3c TW: 1360x768-60Hz - Non-BIOS, new */
+-      {0xffff,0,0,0,0,0,0,0}
++      {0x085f,0x0d,0x03,0x05,0x6a, 800, 600}, /* 00 */
++      {0x0467,0x0e,0x44,0x05,0x6a, 800, 600}, /* 01 */
++      {0x0067,0x0f,0x07,0x48,0x6a, 800, 600}, /* 02 - CRT1CRTC was 0x4f */
++      {0x0067,0x10,0x06,0x8b,0x6a, 800, 600}, /* 03 */
++      {0x0147,0x11,0x08,0x00,0x6a, 800, 600}, /* 04 */
++      {0x0147,0x12,0x0c,0x00,0x6a, 800, 600}, /* 05 */
++      {0x0047,0x11,0x4e,0x00,0x6a, 800, 600}, /* 06 - CRT1CRTC was 0x51 */
++      {0x0047,0x11,0x13,0x00,0x6a, 800, 600}, /* 07 */
++      {0xc85f,0x05,0x00,0x04,0x2e, 640, 480}, /* 08 */
++      {0xc067,0x06,0x02,0x04,0x2e, 640, 480}, /* 09 */
++      {0xc067,0x07,0x02,0x47,0x2e, 640, 480}, /* 0a */
++      {0xc067,0x08,0x03,0x8a,0x2e, 640, 480}, /* 0b */
++      {0xc047,0x09,0x05,0x00,0x2e, 640, 480}, /* 0c */
++      {0xc047,0x0a,0x08,0x00,0x2e, 640, 480}, /* 0d */
++      {0xc047,0x0b,0x0a,0x00,0x2e, 640, 480}, /* 0e */
++      {0xc047,0x0c,0x10,0x00,0x2e, 640, 480}, /* 0f */
++      {0x487f,0x04,0x00,0x00,0x2f, 640, 400}, /* 10 */
++      {0xc00f,0x31,0x01,0x06,0x31, 720, 480}, /* 11 */
++      {0x000f,0x32,0x03,0x06,0x32, 720, 576}, /* 12 */
++      {0x0187,0x15,0x05,0x00,0x37,1024, 768}, /* 13 */
++        {0xc877,0x16,0x09,0x06,0x37,1024, 768}, /* 14 */
++      {0xc067,0x17,0x0b,0x49,0x37,1024, 768}, /* 15 - CRT1CRTC was 0x97 */
++      {0x0267,0x18,0x0d,0x00,0x37,1024, 768}, /* 16 */
++      {0x0047,0x19,0x11,0x8c,0x37,1024, 768}, /* 17 - CRT1CRTC was 0x59 */
++      {0x0047,0x1a,0x52,0x00,0x37,1024, 768}, /* 18 */
++      {0x0007,0x1b,0x16,0x00,0x37,1024, 768}, /* 19 - CRT1CRTC was 0x5b */
++      {0x0387,0x1c,0x4d,0x00,0x3a,1280,1024}, /* 1a - CRT1CRTC was 0x5c */
++      {0x0077,0x1d,0x14,0x07,0x3a,1280,1024}, /* 1b */
++      {0x0047,0x1e,0x17,0x00,0x3a,1280,1024}, /* 1c */
++      {0x0007,0x1f,0x98,0x00,0x3a,1280,1024}, /* 1d */
++      {0x0007,0x20,0x59,0x00,0x3c,1600,1200}, /* 1e - CRT1CRTC was 0x60 */
++      {0x0007,0x21,0x5a,0x00,0x3c,1600,1200}, /* 1f */
++      {0x0007,0x22,0x1b,0x00,0x3c,1600,1200}, /* 20 */
++      {0x0007,0x23,0x1d,0x00,0x3c,1600,1200}, /* 21 - CRT1CRTC was 0x63 */
++      {0x0007,0x24,0x1e,0x00,0x3c,1600,1200}, /* 22 */
++      {0x407f,0x00,0x00,0x00,0x40, 320, 200}, /* 23 */
++      {0xc07f,0x01,0x00,0x04,0x50, 320, 240}, /* 24 */
++      {0x0077,0x02,0x04,0x05,0x51, 400, 300}, /* 25 */
++      {0xc877,0x03,0x09,0x06,0x52, 512, 384}, /* 26 */  /* was c077 */
++      {0x8207,0x25,0x1f,0x00,0x68,1920,1440}, /* 27 */
++      {0x0007,0x26,0x20,0x00,0x6c,2048,1536}, /* 28 */
++      {0x0067,0x27,0x14,0x08,0x6e,1280, 960}, /* 29 - TW: 1280x960-60 */
++      {0x0027,0x45,0x3c,0x08,0x6e,1280, 960}, /* 2a - TW: 1280x960-85 */
++      {0xc077,0x33,0x09,0x06,0x20,1024, 600}, /* 2b */
++      {0xc077,0x34,0x0b,0x06,0x23,1152, 768}, /* 2c */        /* VCLK 0x09 */
++      {0x0057,0x35,0x27,0x08,0x70, 800, 480}, /* 2d */
++      {0x0047,0x36,0x37,0x08,0x70, 800, 480}, /* 2e */
++      {0x0047,0x37,0x08,0x08,0x70, 800, 480}, /* 2f */
++      {0x0057,0x38,0x09,0x09,0x71,1024, 576}, /* 30 */
++      {0x0047,0x39,0x38,0x09,0x71,1024, 576}, /* 31 */
++      {0x0047,0x3a,0x11,0x09,0x71,1024, 576}, /* 32 */
++      {0x0057,0x3b,0x39,0x0a,0x75,1280, 720}, /* 33 */
++      {0x0047,0x3c,0x3a,0x0a,0x75,1280, 720}, /* 34 */
++      {0x0007,0x3d,0x3b,0x0a,0x75,1280, 720}, /* 35 */
++      {0x0047,0x3e,0x34,0x06,0x29,1152, 864}, /* 36 1152x864-75Hz */
++      {0x0047,0x44,0x3a,0x06,0x29,1152, 864}, /* 37 1152x864-85Hz */
++      {0x00c7,0x3f,0x28,0x00,0x39, 848, 480}, /* 38 848x480-38Hzi */
++      {0xc047,0x40,0x3d,0x00,0x39, 848, 480}, /* 39 848x480-60Hz  */
++      {0x00c7,0x41,0x28,0x00,0x3f, 856, 480}, /* 3a 856x480-38Hzi */
++      {0xc047,0x42,0x28,0x00,0x3f, 856, 480}, /* 3b 856x480-60Hz  */
++      {0x0047,0x43,0x3e,0x00,0x48,1360, 768}, /* 3c 1360x768-60Hz */
++      {0x0077,0x46,0x3f,0x08,0x55,1280, 768}, /* 3d 1280x768-60Hz */
++      {0x000f,0x47,0x03,0x06,0x5f, 768, 576}, /* 3e 768x576 */
++      {0x0027,0x48,0x13,0x08,0x67,1360,1024}, /* 3f 1360x1024-59Hz (BARCO1366 only) */
++      {0xffff,   0,   0,   0,   0,   0,   0}
+ };
+-/*add for 300 oem util*/
+ typedef struct _SiS_VBModeIDTableStruct
+ {
+       UCHAR  ModeID;
+@@ -649,9 +312,8 @@ static const SiS_VBModeIDTableStruct  Si
+       {0x6e,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+       {0x6f,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+       {0x7b,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+-      {0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00}  /* TW: added! */
++      {0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
+ };
+-/*end*/
+ typedef struct _SiS300_CRT1TableStruct
+ {
+@@ -660,15 +322,32 @@ typedef struct _SiS300_CRT1TableStruct
+ static const SiS300_CRT1TableStruct  SiS300_CRT1Table[] =
+ {
+- {{0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,    /* 0x00 */
+-  0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x00,
++#if 1
++ {{0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,    /* 0x00 - 320x200 */
++  0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x00,     /* HRE [4],[15] is invalid - but correcting it does not work */
++  0x00}},
++#endif
++#if 0
++ {{0x2d,0x27,0x27,0x91,0x2c,0x92,0xbf,0x1f,    /* 0x00 - corrected 320x200-72 - does not work */
++  0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x04,
+   0x00}},
+- {{0x2d,0x27,0x28,0x90,0x2c,0x80,0x0b,0x3e,
+-  0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x00,
++#endif
++ {{0x2d,0x27,0x28,0x90,0x2c,0x80,0x0b,0x3e,    /* 0x01 */
++  0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x00,     /* HRE [4],[15] is invalid - but correcting it does not work */
+   0x00}},
+- {{0x3d,0x31,0x31,0x81,0x37,0x1f,0x72,0xf0,
++#if 0
++ {{0x2d,0x27,0x27,0x91,0x2c,0x92,0x0b,0x3e,    /* 0x01 - corrected 320x240-60 - does not work */
++  0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x04,
++  0x00}},
++#endif
++ {{0x3d,0x31,0x31,0x81,0x37,0x1f,0x72,0xf0,    /* 0x02 */
++  0x58,0x8c,0x57,0x57,0x73,0x20,0x00,0x05,
++  0x01}},
++#if 0
++ {{0x3d,0x31,0x31,0x81,0x37,0x1f,0x72,0xf0,    /* 0x02 - corrected 400x300-60 */
+   0x58,0x8c,0x57,0x57,0x73,0x20,0x00,0x05,
+   0x01}},
++#endif  
+  {{0x4f,0x3f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+   0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x01,
+   0x01}},
+@@ -683,7 +362,7 @@ static const SiS300_CRT1TableStruct  SiS
+  {{0x5f,0x4f,0x4f,0x83,0x55,0x81,0x0b,0x3e,    /* 0x05 - corrected 640x480-60 */
+   0xe9,0x8b,0xdf,0xe8,0x0c,0x00,0x00,0x05,
+   0x00}},
+- #if 0  
++#if 0  
+  {{0x63,0x4f,0x50,0x86,0x56,0x9b,0x06,0x3e,    /* 0x06 */
+   0xe8,0x8b,0xdf,0xe7,0xff,0x10,0x00,0x01,
+   0x00}},
+@@ -841,15 +520,10 @@ static const SiS300_CRT1TableStruct  SiS
+  {{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x1e,0xf1,  /* 0x33 - 1024x600 */
+   0xae,0x85,0x57,0x57,0x1f,0x30,0x00,0x02,
+   0x01}},
+-#if 0
+- {{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x24,0xf5,  /* 0x34 - 1152x768 */
+-  0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x02,
+-  0x01}},
+-#endif
+- {{0xa3,0x8f,0x8f,0x97,0x96,0x97,0x24,0xf5,  /* 0x34 - 1152x768 - TW: corrected */
++ {{0xa3,0x8f,0x8f,0x97,0x96,0x97,0x24,0xf5,  /* 0x34 - 1152x768 - corrected */
+   0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x02,
+   0x01}},
+- {{0x7f,0x63,0x63,0x83,0x6c,0x1c,0x72,0xba,  /* 0x35 - NEW 16:9 modes, not in BIOS ------ */
++ {{0x7f,0x63,0x63,0x83,0x6c,0x1c,0x72,0xba,  /* 0x35 */
+    0x27,0x8b,0xdf,0xdf,0x73,0x00,0x00,0x06,
+    0x01}}, /* 0x35 */
+  {{0x7f,0x63,0x63,0x83,0x69,0x13,0x6f,0xba,
+@@ -864,7 +538,7 @@ static const SiS300_CRT1TableStruct  SiS
+  {{0x9f,0x7f,0x7f,0x83,0x85,0x91,0x1e,0xf1,
+    0xad,0x81,0x3f,0x3f,0x1f,0x30,0x00,0x02,
+    0x01}}, /* 0x39 */
+- {{0xa7,0x7f,0x7f,0x88,0x89,0x95,0x26,0xf1,           /* TW: 95 was 15 - illegal HBE! */
++ {{0xa7,0x7f,0x7f,0x88,0x89,0x95,0x26,0xf1,  /* 95 was 15 - illegal HBE! */
+    0xb1,0x85,0x3f,0x3f,0x27,0x30,0x00,0x02,
+    0x01}}, /* 0x3a */
+  {{0xce,0x9f,0x9f,0x92,0xa9,0x17,0x28,0xc4,
+@@ -875,36 +549,40 @@ static const SiS300_CRT1TableStruct  SiS
+    0x01}}, /* 0x3c */
+  {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0x2e,0xd4,
+    0x7d,0x81,0xcf,0xcf,0x2f,0x21,0x00,0x07,
+-   0x01}}, /* 0x3d */                      /* TW: End of 16:9 modes --------------- */
+- {{0xc3,0x8f,0x8f,0x87,0x9b,0x0b,0x82,0xef,  /* TW: New, 1152x864-75 (not in any BIOS)   */
++   0x01}}, /* 0x3d */
++ {{0xc3,0x8f,0x8f,0x87,0x9b,0x0b,0x82,0xef,  /* 1152x864-75 */
+    0x60,0x83,0x5f,0x5f,0x83,0x10,0x00,0x07,
+    0x01}},  /* 0x3e */
+- {{0x86,0x69,0x69,0x8A,0x74,0x06,0x8C,0x15,  /* TW: New, 848x480-38i, not in BIOS */
++ {{0x86,0x69,0x69,0x8A,0x74,0x06,0x8C,0x15,  /* 848x480-38i */
+    0x4F,0x83,0xEF,0xEF,0x8D,0x30,0x00,0x02,
+    0x00}}, /* 0x3f */
+-#if 0
+- {{0x81,0x69,0x69,0x85,0x70,0x00,0x0F,0x3E,  /* TW: New, 848x480-60, not in BIOS - incorrect for Philips panel */
+-   0xEB,0x8E,0xDF,0xDF,0x10,0x00,0x00,0x02,
+-   0x00}}, /* 0x40 */
+-#endif
+- {{0x83,0x69,0x69,0x87,0x6f,0x1d,0x03,0x3E,  /* TW: New, 848x480-60, not in BIOS */
++ {{0x83,0x69,0x69,0x87,0x6f,0x1d,0x03,0x3E,  /* 848x480-60  */
+    0xE5,0x8d,0xDF,0xe4,0x04,0x00,0x00,0x06,
+    0x00}}, /* 0x40 */
+- {{0x86,0x6A,0x6A,0x8A,0x74,0x06,0x8C,0x15,  /* TW: New, 856x480-38i, not in BIOS */
++ {{0x86,0x6A,0x6A,0x8A,0x74,0x06,0x8C,0x15,  /* 856x480-38i */
+    0x4F,0x83,0xEF,0xEF,0x8D,0x30,0x00,0x02,
+    0x00}}, /* 0x41 */
+- {{0x81,0x6A,0x6A,0x85,0x70,0x00,0x0F,0x3E,  /* TW: New, 856x480-60, not in BIOS */
++ {{0x81,0x6A,0x6A,0x85,0x70,0x00,0x0F,0x3E,  /* 856x480-60  */
+    0xEB,0x8E,0xDF,0xDF,0x10,0x00,0x00,0x02,
+    0x00}}, /* 0x42 */
+- {{0xdd,0xa9,0xa9,0x81,0xb4,0x97,0x26,0xfd,  /* TW: New, 1360x768-60, not in BIOS */
++ {{0xdd,0xa9,0xa9,0x81,0xb4,0x97,0x26,0xfd,  /* 1360x768-60 */
+    0x01,0x8d,0xff,0x00,0x27,0x10,0x00,0x03,
+    0x01}}, /* 0x43 */
+- {{0xd9,0x8f,0x8f,0x9d,0xba,0x0a,0x8a,0xff,  /* TW: New, 1152x864-84 (not in any BIOS)   */
++ {{0xd9,0x8f,0x8f,0x9d,0xba,0x0a,0x8a,0xff,  /* 1152x864-84 */
+    0x60,0x8b,0x5f,0x5f,0x8b,0x10,0x00,0x03,
+-   0x01}}, /* 0x44 */   
+- {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0xf1,0xff,  /* TW: New, 1280x960-85 (not in any BIOS)   */
++   0x01}}, /* 0x44 */
++ {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0xf1,0xff,  /* 1280x960-85 */
+    0xc0,0x83,0xbf,0xbf,0xf2,0x10,0x00,0x07,
+-   0x01}}  /* 0x45 */
++   0x01}}, /* 0x45 */
++ {{0xce,0x9f,0x9f,0x92,0xa9,0x17,0x20,0xf5,  /* 1280x768-60 */
++   0x03,0x88,0xff,0xff,0x21,0x10,0x00,0x07,
++   0x01}},  /* 0x46 */
++ {{0x7b,0x5f,0x63,0x9f,0x6a,0x93,0x6f,0xf0,  /* 768x576 */
++   0x58,0x8a,0x3f,0x57,0x70,0x20,0x00,0x05,
++   0x01}},  /* 0x47 */
++ {{0xce,0xa9,0xa9,0x92,0xb1,0x07,0x28,0x52,  /* 1360x1024 (Barco iQ Pro R300) */
++   0x02,0x8e,0xff,0x00,0x29,0x0d,0x00,0x03,
++   0x00}}   /* 0x48 */
+ };
+ typedef struct _SiS300_MCLKDataStruct
+@@ -913,8 +591,8 @@ typedef struct _SiS300_MCLKDataStruct
+       USHORT CLOCK;
+ } SiS300_MCLKDataStruct;
+-static const SiS300_MCLKDataStruct  SiS300_MCLKData_630[] =   /* 630 */
+-{ /* TW: at 0x54 in BIOS */
++static const SiS300_MCLKDataStruct  SiS300_MCLKData_630[] =
++{
+       { 0x5a,0x64,0x80, 66},
+       { 0xb3,0x45,0x80, 83},
+       { 0x37,0x61,0x80,100},
+@@ -925,8 +603,8 @@ static const SiS300_MCLKDataStruct  SiS3
+       { 0x37,0x61,0x80,100}
+ };
+-static const SiS300_MCLKDataStruct  SiS300_MCLKData_300[] =  /* 300 */
+-{ /* TW: at 0x54 in BIOS */
++static const SiS300_MCLKDataStruct  SiS300_MCLKData_300[] =
++{
+       { 0x68,0x43,0x80,125},
+       { 0x68,0x43,0x80,125},
+       { 0x68,0x43,0x80,125},
+@@ -937,6 +615,7 @@ static const SiS300_MCLKDataStruct  SiS3
+       { 0x37,0x61,0x80,100}
+ };
++#ifdef LINUXBIOS
+ typedef struct _SiS300_ECLKDataStruct
+ {
+       UCHAR SR2E,SR2F,SR30;
+@@ -954,6 +633,7 @@ static const SiS300_ECLKDataStruct  SiS3
+       { 0x54,0x43,0x80,100},
+       { 0x54,0x43,0x80,100}
+ };
++#endif
+ typedef struct _SiS300_VCLKDataStruct
+ {
+@@ -964,71 +644,77 @@ typedef struct _SiS300_VCLKDataStruct
+ static const SiS300_VCLKDataStruct  SiS300_VCLKData[] =
+ {
+       { 0x1b,0xe1, 25}, /* 0x00 */
+-      { 0x4e,0xe4, 28},
++      { 0x4e,0xe4, 28}, /* 0x01 */
+       { 0x57,0xe4, 32}, /* 0x02 */
+-      { 0xc3,0xc8, 36},
++      { 0xc3,0xc8, 36}, /* 0x03 */
+       { 0x42,0xc3, 40}, /* 0x04 */
+-      { 0x5d,0xc4, 45},
++      { 0x5d,0xc4, 45}, /* 0x05 */
+       { 0x52,0x65, 50}, /* 0x06 */
+-      { 0x53,0x65, 50},
++      { 0x53,0x65, 50}, /* 0x07 */
+       { 0x6d,0x66, 56}, /* 0x08 */
+-      { 0x5a,0x64, 65},
++      { 0x5a,0x64, 65}, /* 0x09 */
+       { 0x46,0x44, 68}, /* 0x0a */
+-      { 0x3e,0x43, 75},
+-      { 0x6d,0x46, 76}, /* 0x0c: 800x600 | LVDS_2(CH), MITAC(CH);  - 730, A901(301B): 0xb1,0x46, 76 */
+-      { 0x41,0x43, 79},
++      { 0x3e,0x43, 75}, /* 0x0b */
++      { 0x6d,0x46, 76}, /* 0x0c */  /* 800x600 | LVDS_2(CH), MITAC(CH);  - 730, A901(301B): 0xb1,0x46, 76 */
++      { 0x41,0x43, 79}, /* 0x0d */
+       { 0x31,0x42, 79}, /* 0x0e */
+-      { 0x46,0x25, 85},
++      { 0x46,0x25, 85}, /* 0x0f */
+       { 0x78,0x29, 87}, /* 0x10 */
+-      { 0x62,0x44, 95},
++      { 0x62,0x44, 95}, /* 0x11 */
+       { 0x2b,0x22,105}, /* 0x12 */
+-      { 0x49,0x24,106},
++      { 0x49,0x24,106}, /* 0x13 */
+       { 0xc3,0x28,108}, /* 0x14 */
+-      { 0x3c,0x23,109},
++      { 0x3c,0x23,109}, /* 0x15 */
+       { 0xf7,0x2c,132}, /* 0x16 */
+-      { 0xd4,0x28,136},
++      { 0xd4,0x28,136}, /* 0x17 */
+       { 0x41,0x05,158}, /* 0x18 */
+-      { 0x43,0x05,162},
++      { 0x43,0x05,162}, /* 0x19 */
+       { 0xe1,0x0f,175}, /* 0x1a */
+       { 0xfc,0x12,189}, /* 0x1b */
+       { 0xde,0x26,194}, /* 0x1c */
+-      { 0x54,0x05,203},
++      { 0x54,0x05,203}, /* 0x1d */
+       { 0x3f,0x03,230}, /* 0x1e */
+-      { 0x30,0x02,234},
++      { 0x30,0x02,234}, /* 0x1f */
+       { 0x24,0x01,266}, /* 0x20 */
+-      { 0x52,0x2a, 54}, /* 301 TV */
+-      { 0x52,0x6a, 27}, /* 301 TV */
+-      { 0x62,0x24, 70}, /* 301 TV */
+-      { 0x62,0x64, 70}, /* 301 TV */
+-      { 0xa8,0x4c, 30}, /* 301 TV */
+-      { 0x20,0x26, 33}, /* 301 TV */
+-      { 0x31,0xc2, 39},
+-      { 0xbf,0xc8, 35}, /* 0x28 - 856x480 */
+-      { 0x60,0x36, 30}, /* 0x29  CH/UNTSC TEXT | LVDS_2(CH) - 730, A901(301B), Mitac(CH): 0xe0, 0xb6, 30 */
+-      { 0x40,0x4a, 28},
+-      { 0x9f,0x46, 44},
+-      { 0x97,0x2c, 26},
+-      { 0x44,0xe4, 25},
+-      { 0x7e,0x32, 47},
+-      { 0x8a,0x24, 31}, /* 0x2f  CH/PAL TEXT | LVDS_2(CH), Mitac(CH) -  730, A901(301B): 0x57, 0xe4, 31 */
+-      { 0x97,0x2c, 26},
+-      { 0xce,0x3c, 39},
+-      { 0x52,0x4a, 36}, /* 0x32  CH/PAL 800x600 5/6 */
+-      { 0x34,0x61, 95},
+-      { 0x78,0x27,108},
+-      { 0xce,0x25,189}, /* 0x35 */
+-      { 0x45,0x6b, 21}, /* 0x36 */  /* TW: Added from Mitac */
+-      { 0x52,0xe2, 49}, /* 0x37 - added for 16:9 modes (not in any BIOS) */
+-      { 0x2b,0x61, 78}, /* 0x38 - added for 16:9 modes (not in any BIOS) */
+-      { 0x70,0x44,108}, /* 0x39 - added for 16:9 modes (not in any BIOS) */
+-      { 0x54,0x42,135}, /* 0x3a - added for 16:9 modes (not in any BIOS) */
+-      { 0x41,0x22,157}, /* 0x3b - added for 16:9 modes (not in any BIOS) */
+-      { 0x52,0x07,149}, /* 0x3c - added for 1280x960-85 (not in any BIOS)*/
+-      { 0x62,0xc6, 34}, /* 0x3d - added for 848x480-60 (not in any BIOS) */
+-      { 0x30,0x23, 88}, /* 0x3e - added for 1360x768-60 (not in any BIOS)*/
+-      { 0x3f,0x64, 46}, /* 0x3f - added for 640x480-100 (not in any BIOS)*/
+-      { 0x72,0x2a, 76}, /* 0x40 - test for SiS730 */
+-      { 0x15,0x21, 79}, /* 0x41 - test for SiS730 */
++      { 0x52,0x2a, 54}, /* 0x21 */  /* 301 TV */
++      { 0x52,0x6a, 27}, /* 0x22 */  /* 301 TV */
++      { 0x62,0x24, 70}, /* 0x23 */  /* 301 TV */
++      { 0x62,0x64, 70}, /* 0x24 */  /* 301 TV */
++      { 0xa8,0x4c, 30}, /* 0x25 */  /* 301 TV */
++      { 0x20,0x26, 33}, /* 0x26 */  /* 301 TV */
++      { 0x31,0xc2, 39}, /* 0x27 */
++      { 0xbf,0xc8, 35}, /* 0x28 */  /* 856x480 */
++      { 0x60,0x36, 30}, /* 0x29 */  /* CH/UNTSC TEXT | LVDS_2(CH) - 730, A901(301B), Mitac(CH): 0xe0, 0xb6, 30 */
++      { 0x40,0x4a, 28}, /* 0x2a */
++      { 0x9f,0x46, 44}, /* 0x2b */
++      { 0x97,0x2c, 26}, /* 0x2c */
++      { 0x44,0xe4, 25}, /* 0x2d */
++      { 0x7e,0x32, 47}, /* 0x2e */
++      { 0x8a,0x24, 31}, /* 0x2f */  /* CH/PAL TEXT | LVDS_2(CH), Mitac(CH) -  730, A901(301B): 0x57, 0xe4, 31 */
++      { 0x97,0x2c, 26}, /* 0x30 */
++      { 0xce,0x3c, 39}, /* 0x31 */
++      { 0x52,0x4a, 36}, /* 0x32 */  /* CH/PAL 800x600 5/6 */
++      { 0x34,0x61, 95}, /* 0x33 */
++      { 0x78,0x27,108}, /* 0x34 */  /* Replacement for index 0x14 for 630 (?) */
++      { 0xce,0x25,189}, /* 0x35 */  /* Replacement for index 0x1b for 730 (and 540?) */
++      { 0x45,0x6b, 21}, /* 0x36 */
++      { 0x52,0xe2, 49}, /* 0x37 */  /* 16:9 modes  */
++      { 0x2b,0x61, 78}, /* 0x38 */  /* 16:9 modes  */
++      { 0x70,0x44,108}, /* 0x39 */  /* 16:9 modes  */
++      { 0x54,0x42,135}, /* 0x3a */  /* 16:9 modes  */
++      { 0x41,0x22,157}, /* 0x3b */  /* 16:9 modes  */
++      { 0x52,0x07,149}, /* 0x3c */  /* 1280x960-85 */
++      { 0x62,0xc6, 34}, /* 0x3d */  /* 848x480-60  */
++      { 0x30,0x23, 88}, /* 0x3e */  /* 1360x768-60 */
++#if 0
++      { 0x3f,0x64, 46}, /* 0x3f */  /* 640x480-100 */
++#endif
++        { 0x70,0x29, 81}, /* 0x3f */  /* 1280x768-60 */
++      { 0x72,0x2a, 76}, /* 0x40 */  /* test for SiS730 */
++      { 0x15,0x21, 79}, /* 0x41 */  /* test for SiS730 */
++      { 0xa1,0x42,108}, /* 0x42 */  /* 1280x960 LCD */
++      { 0x37,0x61,100}, /* 0x43 */  /* 1280x960 LCD */
++      { 0xe3,0x9a,106}, /* 0x44 */  /* 1360x1024 - special for Barco iQ R300 */
+       { 0xff,0x00,  0}   
+ };
+@@ -1089,66 +775,10 @@ static const SiS300_VCLKDataStruct  SiS3
+ static const UCHAR  SiS300_ScreenOffset[] =
+ {
+       0x14,0x19,0x20,0x28,0x32,0x40,0x50,
+-        0x64,0x78,0x80,0x2d,0x35,0x48,0x35,  /* 0x35 for 848 and 856 */
+-      0x55,0xff                            /* 0x55 for 1360 */        
++        0x64,0x78,0x80,0x2d,0x35,0x48,0x35,
++      0x55,0x30,0xff
+ };
+-typedef struct _SiS300_StResInfoStruct
+-{
+-      USHORT HTotal;
+-      USHORT VTotal;
+-} SiS300_StResInfoStruct;
+-
+-static const SiS300_StResInfoStruct  SiS300_StResInfo[] =
+-{
+-      { 640,400},
+-      { 640,350},
+-      { 720,400},
+-      { 720,350},
+-      { 640,480}
+-};
+-
+-typedef struct _SiS300_ModeResInfoStruct
+-{
+-      USHORT HTotal;
+-      USHORT VTotal;
+-      UCHAR  XChar;
+-      UCHAR  YChar;
+-} SiS300_ModeResInfoStruct;
+-
+-static const SiS300_ModeResInfoStruct  SiS300_ModeResInfo[] =
+-{
+-      {  320, 200, 8, 8},  /* 0x00 */
+-      {  320, 240, 8, 8},  /* 0x01 */
+-      {  320, 400, 8, 8},  /* 0x02 */
+-      {  400, 300, 8, 8},  /* 0x03 */
+-      {  512, 384, 8, 8},  /* 0x04 */
+-      {  640, 400, 8,16},  /* 0x05 */
+-      {  640, 480, 8,16},  /* 0x06 */
+-      {  800, 600, 8,16},  /* 0x07 */
+-      { 1024, 768, 8,16},  /* 0x08 */
+-      { 1280,1024, 8,16},  /* 0x09 */
+-      { 1600,1200, 8,16},  /* 0x0a */
+-      { 1920,1440, 8,16},  /* 0x0b */
+-      {  720, 480, 8,16},  /* 0x0c */
+-      {  720, 576, 8,16},  /* 0x0d */
+-      { 1280, 960, 8,16},  /* 0x0e */
+-      { 1024, 600, 8,16},  /* 0x0f */
+-      { 1152, 768, 8,16},  /* 0x10 */
+-      { 2048,1536, 8,16},  /* 0x11 - TW: Not in BIOS! */
+-      {  800, 480, 8,16},  /* 0x12 - TW: New, not in any BIOS */
+-      { 1024, 576, 8,16},  /* 0x13 - TW: New, not in any BIOS */
+-      { 1280, 720, 8,16},  /* 0x14 - TW: New, not in any BIOS */
+-      { 1152, 864, 8,16},  /* 0x15 - TW: New, not in any BIOS */
+-      {  848, 480, 8,16},  /* 0x16 - TW: New, not in any BIOS */
+-      {  856, 480, 8,16},  /* 0x17 - TW: New, not in any BIOS */
+-      { 1360, 768, 8,16}   /* 0x18 - TW: New, not in any BIOS */
+-};
+-
+-static const UCHAR SiS300_OutputSelect = 0x40;
+-
+-static const UCHAR SiS300_SoftSetting  = 0x30;
+-
+ #ifndef LINUX_XF86
+ static UCHAR SiS300_SR07 = 0x10;
+ #endif
+@@ -1183,7 +813,7 @@ static UCHAR SiS300_CRT2Data_4_10 = 0x80
+ static const USHORT SiS300_RGBSenseData = 0xd1;
+ static const USHORT SiS300_VideoSenseData = 0xb3;
+ static const USHORT SiS300_YCSenseData = 0xb9;
+-static const USHORT SiS300_RGBSenseData2 = 0x0190;     /*301b*/
++static const USHORT SiS300_RGBSenseData2 = 0x0190;
+ static const USHORT SiS300_VideoSenseData2 = 0x0174;
+ static const USHORT SiS300_YCSenseData2 = 0x016b;
+@@ -1192,15 +822,6 @@ static const UCHAR SiS300_CR40[5][4];
+ static UCHAR SiS300_CR49[2];
+ #endif
+-static const UCHAR SiS300_NTSCPhase[]  = {0x21,0xed,0xba,0x08};  /* TW: Was {0x21,0xed,0x8a,0x08}; */
+-static const UCHAR SiS300_PALPhase[]   = {0x2a,0x05,0xe3,0x00};  /* TW: Was {0x2a,0x05,0xd3,0x00};  */
+-static const UCHAR SiS300_PALMPhase[]  = {0x21,0xE4,0x2E,0x9B};  /* palmn */
+-static const UCHAR SiS300_PALNPhase[]  = {0x21,0xF4,0x3E,0xBA};
+-static const UCHAR SiS300_NTSCPhase2[] = {0x21,0xF0,0x7B,0xD6};  /* 301b */
+-static const UCHAR SiS300_PALPhase2[]  = {0x2a,0x09,0x86,0xe9};  /* 301b */
+-static const UCHAR SiS300_PALMPhase2[] = {0x21,0xE6,0xEF,0xA4}; /* TW: palm 301b*/
+-static const UCHAR SiS300_PALNPhase2[] = {0x21,0xF6,0x94,0x46}; /* TW: paln 301b*/
+-
+ typedef struct _SiS300_PanelDelayTblStruct
+ {
+       UCHAR timer[2];
+@@ -1208,7 +829,7 @@ typedef struct _SiS300_PanelDelayTblStru
+ static const SiS300_PanelDelayTblStruct  SiS300_PanelDelayTbl[] =
+ {
+-      {{0x05,0xaa}}, /* TW: From 2.04.5a */
++      {{0x05,0xaa}},
+       {{0x05,0x14}},
+       {{0x05,0x36}},
+       {{0x05,0x14}},
+@@ -1355,309 +976,6 @@ static const SiS300_LCDDataStruct  SiS30
+       {    1,   1,1688,1066,1688,1066}
+ };
+-static const SiS300_LCDDataStruct  SiS300_LCD1280x960Data[] =
+-{
+-      {    9,   2, 800, 500,1800,1000},
+-      {    9,   2, 800, 500,1800,1000},
+-      {    4,   1, 900, 500,1800,1000},
+-      {    4,   1, 900, 500,1800,1000},
+-      {    9,   2, 800, 500,1800,1000},
+-      {   30,  11,1056, 625,1800,1000},
+-      {    5,   3,1350, 800,1800,1000},
+-      {    1,   1,1576,1050,1576,1050},
+-      {    1,   1,1800,1000,1800,1000}
+-};
+-
+-static const SiS300_LCDDataStruct  SiS300_ExtLCD1400x1050Data[] =  /* TW: New */
+-{
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS300_LCDDataStruct  SiS300_ExtLCD1600x1200Data[] =  /* TW: New */
+-{
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS300_LCDDataStruct  SiS300_StLCD1400x1050Data[] =  /* TW: New */
+-{
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS300_LCDDataStruct  SiS300_StLCD1600x1200Data[] =  /* TW: New */
+-{
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS300_LCDDataStruct  SiS300_NoScaleData1400x1050[] =  /* TW: New */
+-{
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS300_LCDDataStruct  SiS300_NoScaleData1600x1200[] =  /* TW: New */
+-{
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0},
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-
+-typedef struct _SiS300_TVDataStruct
+-{
+-      USHORT RVBHCMAX;
+-      USHORT RVBHCFACT;
+-      USHORT VGAHT;
+-      USHORT VGAVT;
+-      USHORT TVHDE;
+-      USHORT TVVDE;
+-      USHORT RVBHRS;
+-      UCHAR FlickerMode;
+-      USHORT HALFRVBHRS;
+-      UCHAR RY1COE;
+-      UCHAR RY2COE;
+-      UCHAR RY3COE;
+-      UCHAR RY4COE;
+-} SiS300_TVDataStruct;
+-
+-static const SiS300_TVDataStruct  SiS300_StPALData[] =
+-{
+-      {    1,   1, 864, 525,1270, 400, 100,   0, 760,0xf4,0xff,0x1c,0x22},
+-      {    1,   1, 864, 525,1270, 350, 100,   0, 760,0xf4,0xff,0x1c,0x22},
+-      {    1,   1, 864, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
+-      {    1,   1, 864, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
+-      {    1,   1, 864, 525,1270, 480,  50,   0, 760,0xf4,0xff,0x1c,0x22},
+-      {    1,   1, 864, 525,1270, 600,  50,   0,   0,0xf4,0xff,0x1c,0x22}
+-};
+-
+-static const SiS300_TVDataStruct  SiS300_ExtPALData[] =
+-{
+-      {   27,  10, 848, 448,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
+-      {  108,  35, 848, 398,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
+-      {   12,   5, 954, 448,1270, 530,  50,   0,  50,0xf1,0x04,0x1f,0x18},
+-      {    9,   4, 960, 463,1644, 438,  50,   0,  50,0xf4,0x0b,0x1c,0x0a},
+-      {    9,   4, 848, 528,1270, 530,   0,   0,  50,0xf5,0xfb,0x1b,0x2a},
+-      {   36,  25,1060, 648,1316, 530, 438,   0, 438,0xeb,0x05,0x25,0x16},
+-      {    3,   2,1080, 619,1270, 540, 438,   0, 438,0xf3,0x00,0x1d,0x20},
+-      {    1,   1,1170, 821,1270, 520, 686,   0, 686,0xF3,0x00,0x1D,0x20}
+-
+-};
+-
+-static const SiS300_TVDataStruct  SiS300_StNTSCData[] =
+-{
+-      {    1,   1, 858, 525,1270, 400,  50,   0, 760,0xf1,0x04,0x1f,0x18},
+-      {    1,   1, 858, 525,1270, 350,  50,   0, 640,0xf1,0x04,0x1f,0x18},
+-      {    1,   1, 858, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
+-      {    1,   1, 858, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
+-      {    1,   1, 858, 525,1270, 480,   0,   0, 760,0xf1,0x04,0x1f,0x18}
+-};
+-
+-static const SiS300_TVDataStruct  SiS300_ExtNTSCData[] =
+-{
+-      {  143,  65, 858, 443,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
+-      {   88,  35, 858, 393,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
+-      {  143,  70, 924, 443,1270, 440,  92,   0,  92,0xf1,0x04,0x1f,0x18},
+-      {  143,  70, 924, 393,1270, 440,  92,   0,  92,0xf4,0x0b,0x1c,0x0a},
+-      {  143,  76, 836, 523,1270, 440, 224,   0,   0,0xf1,0x05,0x1f,0x16},
+-      {  143, 120,1056, 643,1270, 440,   0, 128,   0,0xf4,0x10,0x1c,0x00},
+-      {  143,  76, 836, 523,1270, 440,   0, 128,   0,0xee,0x0c,0x22,0x08},
+-      {   65,  64,1056, 791,1270, 480, 638,   0,   0,0xf1,0x04,0x1f,0x18}
+-};
+-
+-#if 0
+-static const SiS300_TVDataStruct  SiS300_St1HiTVData[]=
+-{
+-  
+-};
+-#endif
+-
+-static const SiS300_TVDataStruct  SiS300_St2HiTVData[]=
+-{
+- {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    1,   1, 0x37c,0x233,0x2b2,0x2bc,          0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    1,   1, 0x3e8,0x233,0x311,0x2bc,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   2, 0x348,0x233,0x670,0x3c0,0x08d,128, 0, 0x00,0x00,0x00,0x00},
+- {    8,   5, 0x41a,0x2ab,0x670,0x3c0,0x17c,128, 0, 0x00,0x00,0x00,0x00}
+-};
+-
+-static const SiS300_TVDataStruct  SiS300_ExtHiTVData[]=
+-{
+- {    6,   1, 0x348,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x348,0x1e3,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   1, 0x348,0x233,0x670,0x3c0,0x166,128, 0, 0x00,0x00,0x00,0x00},
+- {   16,   5, 0x41a,0x2ab,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},
+- {   25,  12, 0x4ec,0x353,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   4, 0x627,0x464,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00},
+- {    4,   1, 0x41a,0x233,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},
+- {    5,   2, 0x578,0x293,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    8,   5, 0x6d6,0x323,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00}
+-};
+-
+-static const UCHAR SiS300_NTSCTiming[] =
+-{
+-      0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
+-      0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
+-      0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x1b,
+-      0x0c,0x50,0x00,0x97,0x00,0xda,0x4a,0x17,  /* (in 2.06.50) */
+-/*    0x0c,0x50,0x00,0x99,0x00,0xec,0x4a,0x17,     (in 2.04.5a) */
+-      0x7d,0x05,0x4b,0x00,0x00,0xe2,0x00,0x02,  /* (in 2.06.50) */
+-/*    0x88,0x00,0x4b,0x00,0x00,0xe2,0x00,0x02,     (in 2.04.5a) */
+-      0x03,0x0a,0x65,0x9d,0x08,0x92,0x8f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x50,
+-      0x00,0x40,0x44,0x00,0xdb,0x02,0x3b,0x00
+-};
+-
+-static const UCHAR SiS300_PALTiming[] =
+-{
+-      0x19,0x52,0x35,0x6e,0x04,0x38,0x3d,0x70,
+-      0x94,0x49,0x01,0x12,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0x45,0x2b,
+-        0x70,0x50,0x00,0x9b,0x00,0xd9,0x5d,0x17,  /* (in 2.06.50) */
+-/*    0x70,0x50,0x00,0x97,0x00,0xd7,0x5d,0x17,     (in 2.04.5a) */
+-      0x7d,0x05,0x45,0x00,0x00,0xe8,0x00,0x02,  /* (in 2.06.50) */
+-/*    0x88,0x00,0x45,0x00,0x00,0xe8,0x00,0x02,     (in 2.04.5a) */
+-      0x0d,0x00,0x68,0xb0,0x0b,0x92,0x8f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x63,
+-      0x00,0x40,0x3e,0x00,0xe1,0x02,0x28,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVExtTiming[] =    /* TW: New */
+-{
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
+-      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-      0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
+-      0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
+-      0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
+-      0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVSt1Timing[] =           /* TW: New */
+-{
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
+-      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-      0x65,0x90,0x7b,0xa8,0x03,0xf0,0x87,0x03,
+-      0x11,0x15,0x11,0xcf,0x10,0x11,0xcf,0x10,
+-      0x35,0x35,0x3b,0x69,0x1d,0x92,0x0f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x86,
+-      0xaf,0x5d,0x0e,0x00,0xfc,0xff,0x2d,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVSt2Timing[] =   /* TW: New */
+-{
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
+-      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-      0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
+-      0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
+-      0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
+-      0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVTextTiming[] =          /* TW: New */
+-{
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
+-      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-      0x65,0x90,0xe7,0xbc,0x03,0x0c,0x97,0x03,
+-      0x14,0x78,0x14,0x08,0x20,0x14,0x08,0x20,
+-      0xc8,0xc8,0x3b,0xd2,0x26,0x92,0x0f,0x40,
+-        0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x96,
+-      0x72,0x5c,0x11,0x00,0xfc,0xff,0x32,0x00
+-};
+-
+-static const UCHAR SiS300_HiTVGroup3Data[] =          /* TW: New */
+-{
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x5f,
+-      0x05,0x21,0xb2,0xb2,0x55,0x77,0x2a,0xa6,
+-      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-      0x8c,0x6e,0x60,0x2e,0x58,0x48,0x72,0x44,
+-      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-      0x4f,0x7f,0x03,0xa8,0x7d,0x20,0x1a,0xa9,
+-      0x14,0x05,0x03,0x7e,0x64,0x31,0x14,0x75,
+-      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+-static const UCHAR SiS300_HiTVGroup3Simu[] =          /* TW: New */
+-{
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x95,
+-      0xdb,0x20,0xb8,0xb8,0x55,0x47,0x2a,0xa6,
+-      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-      0x8c,0x6e,0x60,0x15,0x26,0xd3,0xe4,0x11,
+-      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-      0x67,0x36,0x01,0x47,0x0e,0x10,0xbe,0xb4,
+-      0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
+-      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+-static const UCHAR SiS300_HiTVGroup3Text[] =          /* TW: New */
+-{
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0xa7,
+-      0xf5,0x20,0xce,0xce,0x55,0x47,0x2a,0xa6,
+-      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-      0x8c,0x6e,0x60,0x18,0x2c,0x0c,0x20,0x22,
+-      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-      0x93,0x3c,0x01,0x50,0x2f,0x10,0xf4,0xca,
+-      0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
+-      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+ typedef struct _SiS300_LVDSDataStruct
+ {
+       USHORT VGAHT;
+@@ -1666,366 +984,14 @@ typedef struct _SiS300_LVDSDataStruct
+       USHORT LCDVT;
+ } SiS300_LVDSDataStruct;
+-static const SiS300_LVDSDataStruct  SiS300_LVDS320x480Data_1[] =
+-{
+-      {848, 433,400, 525},
+-      {848, 389,400, 525},
+-      {848, 433,400, 525},
+-      {848, 389,400, 525},
+-      {848, 518,400, 525},
+-      {1056,628,400, 525},
+-      {400, 525,400, 525},
+-      {800, 449,1000, 644},
+-      {800, 525,1000, 635}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS800x600Data_1[] =
+-{
+-      {848, 433,1060, 629},
+-      {848, 389,1060, 629},
+-      {848, 433,1060, 629},
+-      {848, 389,1060, 629},
+-      {848, 518,1060, 629},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {800, 449,1000, 644},
+-      {800, 525,1000, 635}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS800x600Data_2[] =
+-{
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {800, 449,1000, 644},
+-      {800, 525,1000, 635}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1024x768Data_1[] =
+-{
+-      {840, 438,1344, 806},
+-      {840, 409,1344, 806},
+-      {840, 438,1344, 806},
+-      {840, 409,1344, 806},
+-      {840, 518,1344, 806},
+-      {1050, 638,1344, 806},
+-      {1344, 806,1344, 806},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1024x768Data_2[] =
+-{
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x1024Data_1[]=  
+-{     
+-      {1048, 442,1688,1066},
+-      {1048, 392,1688,1066},
+-      {1048, 442,1688,1066},
+-      {1048, 392,1688,1066},
+-      {1048, 522,1688,1066},
+-      {1208, 642,1688,1066},
+-      {1432, 810,1688,1066},
+-      {1688,1066,1688,1066}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x1024Data_2[]=  
+-{     
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1400x1050Data_1[] =   
+-{
+-        {928, 416, 1688, 1066},
+-      {928, 366, 1688, 1066},
+-      {928, 416, 1688, 1066},
+-      {928, 366, 1688, 1066},
+-      {928, 496, 1688, 1066},
+-      {1088, 616, 1688, 1066},
+-      {1312, 784, 1688, 1066},
+-      {1568, 1040, 1688, 1066},
+-      {1688, 1066, 1688, 1066}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1400x1050Data_2[] =  
+-{
+-        {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1600x1200Data_1[]=  
+-{
+-        {1088, 450, 2048,1250},
+-      {1088, 400, 2048,1250},
+-      {1088, 450, 2048,1250},
+-      {1088, 400, 2048,1250},
+-      {1088, 530, 2048,1250},
+-      {1248, 650, 2048,1250},
+-      {1472, 818, 2048,1250},
+-      {1728,1066, 2048,1250},
+-      {1848,1066, 2048,1250},
+-      {2048,1250, 2048,1250}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1600x1200Data_2[]= 
+-{
+-        {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x768Data_1[]= 
+-{     
+-      { 768, 438, 1408, 806},
+-      { 768, 388, 1408, 806},
+-      { 768, 438, 1408, 806},
+-      { 768, 388, 1408, 806},
+-      { 768, 518, 1408, 806},
+-      { 928, 638, 1408, 806},
+-      {1152, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x768Data_2[]=  
+-{     
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1024x600Data_1[] =
+-{
+-      {840, 604,1344, 800},
+-      {840, 560,1344, 800},
+-      {840, 604,1344, 800},
+-      {840, 560,1344, 800},
+-      {840, 689,1344, 800},
+-      {1050, 800,1344, 800},
+-      {1344, 800,1344, 800},
+-      {800, 449,1280, 789},
+-      {800, 525,1280, 785}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1024x600Data_2[] =
+-{
+-      {1344, 800,1344, 800},
+-      {1344, 800,1344, 800},
+-      {1344, 800,1344, 800},
+-      {1344, 800,1344, 800},
+-      {1344, 800,1344, 800},
+-      {1344, 800,1344, 800},
+-      {1344, 800,1344, 800},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1152x768Data_1[] =
+-{
+-      {840, 438,1344, 806},
+-      {840, 409,1344, 806},
+-      {840, 438,1344, 806},
+-      {840, 409,1344, 806},
+-      {840, 518,1344, 806},
+-      {1050, 638,1344, 806},
+-      {1344, 806,1344, 806},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1152x768Data_2[] =
+-{
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-/* TW: pass 1:1 data */
+-static const SiS300_LVDSDataStruct  SiS300_LVDSXXXxXXXData_1[]=  
+-{
+-        { 800, 449,  800, 449},
+-      { 800, 449,  800, 449},
+-      { 900, 449,  900, 449},
+-      { 900, 449,  900, 449},
+-      { 800, 525,  800, 525},  /*  640x480   */
+-      {1056, 628, 1056, 628},  /*  800x600   */
+-      {1344, 806, 1344, 806},  /* 1024x768   */
+-      {1344,1066, 1344,1066},  /* 1280x1024  */  /* INSERTED ! */
+-      {1688, 806, 1688, 806},  /* 1280x768 ! */
+-      /* No other panels ! */
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS640x480Data_1[] =
+-{
+-      {800, 449, 800, 449},
+-      {800, 449, 800, 449},
+-      {800, 449, 800, 449},
+-      {800, 449, 800, 449},
+-      {800, 525, 800, 525},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x960Data_1[] =   /* TW: New */
+-{
+-      {840, 438,1344, 806},
+-      {840, 409,1344, 806},
+-      {840, 438,1344, 806},
+-      {840, 409,1344, 806},
+-      {840, 518,1344, 806},
+-      {1050, 638,1344, 806},
+-      {1344, 806,1344, 806},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LVDS1280x960Data_2[] =   /* TW: New */
+-{
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LCDA1400x1050Data_1[] =   /* TW: New */
+-{     /* TW: Might be temporary (invalid) data */
+-        {928, 416, 1688, 1066},
+-      {928, 366, 1688, 1066},
+-      {1008, 416, 1688, 1066},
+-      {1008, 366, 1688, 1066},
+-      {1200, 530, 1688, 1066},
+-      {1088, 616, 1688, 1066},
+-      {1312, 784, 1688, 1066},
+-      {1568, 1040, 1688, 1066},
+-      {1688, 1066, 1688, 1066}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LCDA1400x1050Data_2[] =   /* TW: New */
+-{     /* TW: Temporary data. Not valid */
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LCDA1600x1200Data_1[] =   /* TW: New */
+-{     /* TW: Temporary data. Not valid */
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {800, 449,1280, 801},
+-      {800, 525,1280, 813}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_LCDA1600x1200Data_2[] =   /* TW: New */
+-{     /* TW: Temporary data. Not valid */
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0}
+-};
+-
+-
+-/* TW: New: */
+-static const SiS300_LVDSDataStruct  SiS300_CHTVUNTSCData[] =
+-{
+-      {840, 600, 840, 600},
+-      {840, 600, 840, 600},
+-      {840, 600, 840, 600},
+-      {840, 600, 840, 600},
+-      {784, 600, 784, 600},
+-      {1064, 750,1064, 750}
+-};
+-
+-static const SiS300_LVDSDataStruct  SiS300_CHTVONTSCData[] =
+-{
+-      {840, 525, 840, 525},
+-      {840, 525, 840, 525},
+-      {840, 525, 840, 525},
+-      {840, 525, 840, 525},
+-      {784, 525, 784, 525},
+-      {1040, 700,1040, 700}
+-};
+-
+ static const SiS300_LVDSDataStruct  SiS300_CHTVUPALData[] =
+ {
+       {1008, 625,1008, 625},
+       {1008, 625,1008, 625},
+       {1008, 625,1008, 625},
+       {1008, 625,1008, 625},
+-      {840, 750, 840, 750},
+-      {936, 836, 936, 836}
++      { 840, 750, 840, 750},
++      { 936, 836, 936, 836}
+ };
+ static const SiS300_LVDSDataStruct  SiS300_CHTVOPALData[] =
+@@ -2034,8 +1000,8 @@ static const SiS300_LVDSDataStruct  SiS3
+       {1008, 625,1008, 625},
+       {1008, 625,1008, 625},
+       {1008, 625,1008, 625},
+-      {840, 625, 840, 625},
+-      {960, 750, 960, 750}
++      { 840, 625, 840, 625},
++      { 960, 750, 960, 750}
+ };
+ static const SiS300_LVDSDataStruct  SiS300_CHTVSOPALData[] =
+@@ -2044,12 +1010,10 @@ static const SiS300_LVDSDataStruct  SiS3
+       {1008, 625,1008, 625},
+       {1008, 625,1008, 625},
+       {1008, 625,1008, 625},
+-      {840, 500, 840, 500},
+-      {944, 625, 944, 625}
++      { 840, 500, 840, 500},
++      { 944, 625, 944, 625}
+ };
+-/* TW: new end */
+-
+ typedef struct _SiS300_LVDSDesStruct
+ {
+       USHORT LCDHDES;
+@@ -2058,57 +1022,90 @@ typedef struct _SiS300_LVDSDesStruct
+ static const SiS300_LVDSDesStruct  SiS300_PanelType00_1[] =
+ {
++      { 1059, 626 },   /* 2.08 */
++      { 1059, 624 },
++      { 1059, 626 },
++      { 1059, 624 },
++      { 1059, 624 },
++      {    0, 627 },
++      {    0, 627 },
++      {    0,   0 },
++      {    0,   0 }
++#if 0
+       {0, 626},
+       {0, 624},
+       {0, 626},
+       {0, 624},
+       {0, 624},
+-      { 0, 627},
+-      { 0, 627},
+-      { 0,   0},
+-      { 0,   0}
++      {0, 627},
++      {0, 627},
++      {0,   0},
++      {0,   0}
++#endif
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType01_1[] =
+ {
++      {   0,   0 },  /* 2.08 */
++      {   0,   0 },
++      {   0,   0 },
++      {   0,   0 },
++      {   0,   0 },
++      {   0,   0 },
++      {   0,   0 },
++      {   0,   0 },
++      {   0,   0 }
++#if 0
+       {1343, 798},
+       {1343, 794},
+       {1343, 798},
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
++#endif
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType02_1[] =
+ {
++      { 1059, 626 },  /* 2.08 */
++      { 1059, 624 },
++      { 1059, 626 },
++      { 1059, 624 },
++      { 1059, 624 },
++      {    0, 627 },
++      {    0, 627 },
++      {    0,   0 },
++      {    0,   0 }
++#if 0
+       {0, 626},
+       {0, 624},
+       {0, 626},
+       {0, 624},
+       {0, 624},
+-      { 0, 627},
+-      { 0, 627},
+-      { 0,   0},
+-      { 0,   0}
++      {0, 627},
++      {0, 627},
++      {0,   0},
++      {0,   0}
++#endif
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType03_1[] =
+ {
+-      { 8, 436},
+-      { 8, 440},
+-      { 8, 436},
+-      { 8, 440},
+-      { 8, 512},
++      {   8, 436},
++      {   8, 440},
++      {   8, 436},
++      {   8, 440},
++      {   8, 512},
+       {1343, 798},
+       {1343, 794},
+       {1343, 798},
+       {1343, 794}
+ };
+-static const SiS300_LVDSDesStruct  SiS300_PanelType04_1[] =
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_1[] =   /* 1280x1024 */
+ {
+       {1343, 798},
+       {1343, 794},
+@@ -2116,9 +1113,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType05_1[] =
+@@ -2129,9 +1126,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType06_1[] =
+@@ -2142,9 +1139,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType07_1[] =
+@@ -2155,9 +1152,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType08_1[] =
+@@ -2167,10 +1164,10 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1059, 626},
+       {1059, 624},
+       {1059, 624},
+-      { 0, 627},
+-      { 0, 627},
+-      { 0,   0},
+-      { 0,   0}
++      {   0, 627},
++      {   0, 627},
++      {   0,   0},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType09_1[] =
+@@ -2181,9 +1178,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0a_1[] =
+@@ -2193,23 +1190,23 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1059, 626},
+       {1059, 624},
+       {1059, 624},
+-      { 0, 627},
+-      { 0, 627},
+-      { 0,   0},
+-      { 0,   0}
++      {   0, 627},
++      {   0, 627},
++      {   0,   0},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0b_1[] =
+ {
+-      {1343, 0},
+-      {1343, 0},
+-      {1343, 0},
+-      {1343, 0},
+-      {1343, 0},   /* 640x480 - BIOS 1343, 0 */
+-      {1343, 0},
+-      { 0, 799},
+-      { 0, 0},
+-      { 0, 0}
++      {1343,   0},
++      {1343,   0},
++      {1343,   0},
++      {1343,   0},
++      {1343,   0},
++      {1343,   0},
++      {   0, 799},
++      {   0,   0},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0c_1[] =
+@@ -2220,9 +1217,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0d_1[] =
+@@ -2233,9 +1230,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0e_1[] =
+@@ -2244,11 +1241,11 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343, 798},
+       {1343, 794},
+-      {1343,   0},  /* 640x480 */
+-      {1343,   0},  /* 800x600 */
+-      { 0, 805},    /* 1024x768 */
+-      { 0, 794},    /* 1280x1024 */
+-      { 0,   0}     /* 1280x960 - not applicable */
++      {1343,   0},    /* 640x480 */
++      {1343,   0},    /* 800x600 */
++      {   0, 805},    /* 1024x768 */
++      {   0, 794},    /* 1280x1024 */
++      {   0,   0}     /* 1280x960 - not applicable */
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType0f_1[] =
+@@ -2259,9 +1256,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1343, 794},
+       {1343,   0},
+       {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType00_2[] =
+@@ -2271,10 +1268,10 @@ static const SiS300_LVDSDesStruct  SiS30
+       {976, 527},
+       {976, 502},
+       {976, 567},
+-      { 0, 627},
+-      { 0, 627},
+-      { 0,   0},
+-      { 0,   0}
++      {  0, 627},
++      {  0, 627},
++      {  0,   0},
++      {  0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType01_2[] =
+@@ -2285,9 +1282,9 @@ static const SiS300_LVDSDesStruct  SiS30
+       {1152, 597},
+       {1152, 662},
+       {1232, 722},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      {   0, 805},
++      {   0, 794},
++      {   0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType02_2[] =
+@@ -2297,10 +1294,10 @@ static const SiS300_LVDSDesStruct  SiS30
+       {976, 527},
+       {976, 502},
+       {976, 567},
+-      { 0, 627},
+-      { 0, 627},
+-      { 0,   0},
+-      { 0,   0}
++      {  0, 627},
++      {  0, 627},
++      {  0,   0},
++      {  0,   0}
+ };
+ static const SiS300_LVDSDesStruct  SiS300_PanelType03_2[] =
+@@ -2472,156 +1469,57 @@ static const SiS300_LVDSDesStruct  SiS30
+       {   0,   0}
+ };
+-static const SiS300_LVDSDesStruct  SiS300_PanelTypeNS_1[]= 
++/* Custom data for Barco iQ R200/300/400 (BIOS 2.00.07) */
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_1a[] =  /* 1280x1024 (1366x1024) */
+ {
+-      { 8,   0},
+-      { 8,   0},
+-      { 8,   0},
+-      { 8,   0},
+-      { 8,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0, 806},
+-      { 0, 0 }
+-};
+-
+-static const SiS300_LVDSDesStruct  SiS300_PanelTypeNS_2[] = 
+-{
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1076_1[] =   /* TW: New */
+-{
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1076_2[] =   /* TW: New */
+-{
+-      { 1152, 622 },
+-      { 1152, 597 },
+-      { 1152, 622 },
+-      { 1152, 597 },
+-      { 1152, 622 },
+-      { 1232, 722 },
+-      {    0, 0   },
+-      {    0, 794 },
+-      {    0, 0   }
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1210_1[] =   /* TW: New */
+-{
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1210_2[] =   /* TW: New */
+-{
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1296_1[] =   /* TW: New */
+-{
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS300_LVDSDesStruct SiS300_PanelType1296_2[] =   /* TW: New */
+-{
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-
+-/* TW: New */
+-static const SiS300_LVDSDesStruct  SiS300_CHTVUNTSCDesData[] =
+-{
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0}
+-};
+-
+-static const SiS300_LVDSDesStruct  SiS300_CHTVONTSCDesData[] =
+-{
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0}
+-};
+-
+-static const SiS300_LVDSDesStruct  SiS300_CHTVUPALDesData[] =
+-{
+-      {256,   0},
+-      {256,   0},
+-      {256,   0},
+-      {256,   0},
+-      {  0,   0},
+-      {  0,   0}
++      {1330, 798},  /* 320x200 */
++      {1330, 794},
++      {1330, 798},
++      {1330, 794},
++      {1330,   0},  /* 640x480 / 320x240  */
++      {1343,   0},  /* 800x600 / 400x300  */
++      {   0, 805},  /* 1024x768 / 512x384 */
++      {1688,1066},  /* 1280x1024          */
++      {   0,   0}   /* 1360x1024          */
+ };
+-static const SiS300_LVDSDesStruct  SiS300_CHTVOPALDesData[] =
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_2a[] =
+ {
+-      {256,   0},
+-      {256,   0},
+-      {256,   0},
+-      {256,   0},
+-      {  0,   0},
+-      {  0,   0}
++      {1152, 622},
++      {1152, 597},
++      {1152, 622},
++      {1152, 597},
++      {1152, 662},
++      {1232, 722},
++      {   0, 805},
++      {1688,1066},
++      {   0,   0}
++};
++
++/* Custom data for Barco iQ G200/300/400 (BIOS 2.00.07) */
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_1b[] =  /* 1024x768 */
++{
++      {1330, 798},  /* 320x200 */
++      {1330, 794},
++      {1330, 798},
++      {1330, 794},
++      {1330,   0},  /* 640x480 / 320x240  */
++      {1343,   0},  /* 800x600 / 400x300  */
++      {   0, 805}   /* 1024x768 / 512x384 */
++};
++
++static const SiS300_LVDSDesStruct  SiS300_PanelType04_2b[] =
++{
++      {1152, 622},
++      {1152, 597},
++      {1152, 622},
++      {1152, 597},
++      {1152, 662},
++      {1232, 722},
++      {   0, 805}
+ };
+-/* TW: New end */
+-/* TW: New for SiS300+301LV */
++
+ typedef struct _SiS300_Part2PortTblStruct
+ {
+       UCHAR CR[12];
+@@ -2726,6 +1624,28 @@ static const SiS300_LVDSCRT1DataStruct  
+         0x01 }}
+ };
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT1800x600_1_H[] =
++{
++      {{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
++        0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
++        0x00 }},
++      {{0x30,0x27,0x94,0x2c,0x92,0x83,0x1f,
++        0x5e,0x83,0x5d,0x79,0x10,0x00,0x04,
++        0x00 }},
++      {{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
++        0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
++        0x00 }},
++      {{0x30,0x27,0x94,0x2c,0x92,0x83,0x1f,
++        0x5e,0x83,0x5d,0x79,0x10,0x00,0x04,
++        0x00 }},
++      {{0x30,0x27,0x94,0x2c,0x92,0x04,0x3e,
++        0xe0,0x85,0xdf,0xfb,0x10,0x00,0x04,
++        0x00 }},
++      {{0x3d,0x31,0x81,0x37,0x1f,0x72,0xf0,
++        0x58,0x8c,0x57,0x73,0x20,0x00,0x05,
++        0x01 }}
++};
++
+ static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_1[] =
+ { 
+       {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+@@ -2751,55 +1671,31 @@ static const SiS300_LVDSCRT1DataStruct  
+         0x01}}
+ };
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_1[] =
+-{
+-      {{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-        0x00 }},
+-      {{0x63,0x4f,0x87,0x54,0x9f,0x82,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-        0x00 }},
+-      {{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-        0x00 }},
+-      {{0x63,0x4f,0x87,0x54,0x9f,0x82,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-        0x00 }},
+-      {{0x63,0x4f,0x87,0x54,0x9f,0x04,0x3e,
+-        0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
+-        0x00 }},
+-      {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
+-        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
+-        0x01 }},
+-      {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-        0x01 }}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT1800x600_1_H[] =
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_1_H[] =
+ {
+-      {{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
+-        0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
+-        0x00 }},
+-      {{0x30,0x27,0x94,0x2c,0x92,0x83,0x1f,
+-        0x5e,0x83,0x5d,0x79,0x10,0x00,0x04,
+-        0x00 }},
+-      {{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
+-        0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
+-        0x00 }},
+-      {{0x30,0x27,0x94,0x2c,0x92,0x83,0x1f,
+-        0x5e,0x83,0x5d,0x79,0x10,0x00,0x04,
+-        0x00 }},
+-      {{0x30,0x27,0x94,0x2c,0x92,0x04,0x3e,
+-        0xe0,0x85,0xdf,0xfb,0x10,0x00,0x04,
++      {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+         0x00 }},
+-      {{0x3d,0x31,0x81,0x37,0x1f,0x72,0xf0,
+-        0x58,0x8c,0x57,0x73,0x20,0x00,0x05,
++      {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++        0x60,0x87,0x5D,0x83,0x10,0x00,0x44,
++        0x00}},
++      {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++        0x00}},
++      {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++        0x60,0x87,0x5D,0x83,0x10,0x00,0x44,
++        0x00}},
++      {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
++        0xE2,0x89,0xdf,0x05,0x00,0x00,0x44,
++        0x00}},
++      {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
++        0x5A,0x8F,0x57,0x7D,0x20,0x00,0x55,
++        0x01}},
++      {{0x4f,0x3F,0x93,0x45,0x0D,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+         0x01 }}
+-};
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_1_H[] =
+-{
++#if 0
+       {{0x37,0x27,0x9B,0x2b,0x94,0xc4,0x1f,
+         0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+         0x00 }},
+@@ -2821,6 +1717,32 @@ static const SiS300_LVDSCRT1DataStruct  
+       {{0x4f,0x3F,0x93,0x45,0x0D,0x24,0xf5,
+         0x02,0x88,0xFf,0x25,0x10,0x00,0x01,
+         0x01 }}
++#endif
++};
++
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_1[] =
++{
++      {{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++        0x00 }},
++      {{0x63,0x4f,0x87,0x54,0x9f,0x82,0x1f,
++        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
++        0x00 }},
++      {{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++        0x00 }},
++      {{0x63,0x4f,0x87,0x54,0x9f,0x82,0x1f,
++        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
++        0x00 }},
++      {{0x63,0x4f,0x87,0x54,0x9f,0x04,0x3e,
++        0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
++        0x00 }},
++      {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
++        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
++        0x01 }},
++      {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++        0x01 }}
+ };
+ static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_1_H[] =
+@@ -2870,32 +1792,29 @@ static const SiS300_LVDSCRT1DataStruct  
+         0x01 }}
+ };
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_2[] =
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT1800x600_2_H[] =
+ {
+-      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++      {{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
++        0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
+         0x00 }},
+-      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++      {{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
++        0xdb,0x8f,0x5d,0x73,0x20,0x00,0x05,
+         0x00 }},
+-      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++      {{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
++        0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
+         0x00 }},
+-      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++      {{0x3d,0x27,0x81,0x3a,0x1a,0x72,0x3e,
++        0xdb,0x8f,0x5d,0x73,0x20,0x00,0x05,
+         0x00 }},
+-      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
++      {{0x3d,0x27,0x81,0x32,0x1a,0x72,0xba,
++        0x1c,0x80,0xdf,0x73,0x00,0x00,0x05,
+         0x00 }},
+-      {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-        0x01 }},
+-      {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++      {{0x3d,0x31,0x81,0x37,0x1f,0x72,0xf0,
++        0x58,0x8c,0x57,0x73,0x20,0x00,0x05,
+         0x01 }}
+ };
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_2[] =
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_2[] =
+ {
+       {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+         0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+@@ -2920,28 +1839,6 @@ static const SiS300_LVDSCRT1DataStruct  
+         0x01 }}
+ };
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT1800x600_2_H[] =
+-{
+-      {{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
+-        0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
+-        0x00 }},
+-      {{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
+-        0xdb,0x8f,0x5d,0x73,0x20,0x00,0x05,
+-        0x00 }},
+-      {{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
+-        0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
+-        0x00 }},
+-      {{0x3d,0x27,0x81,0x3a,0x1a,0x72,0x3e,
+-        0xdb,0x8f,0x5d,0x73,0x20,0x00,0x05,
+-        0x00 }},
+-      {{0x3d,0x27,0x81,0x32,0x1a,0x72,0xba,
+-        0x1c,0x80,0xdf,0x73,0x00,0x00,0x05,
+-        0x00 }},
+-      {{0x3d,0x31,0x81,0x37,0x1f,0x72,0xf0,
+-        0x58,0x8c,0x57,0x73,0x20,0x00,0x05,
+-        0x01 }}
+-};
+-
+ static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x768_2_H[] =
+ {
+       {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+@@ -2967,6 +1864,31 @@ static const SiS300_LVDSCRT1DataStruct  
+         0x01 }}
+ };
++static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_2[] =
++{
++      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++        0x00 }},
++      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++        0x00 }},
++      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++        0x00 }},
++      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++        0x00 }},
++      {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
++        0x00 }},
++      {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
++        0xae,0x84,0x57,0x25,0x30,0x00,0x02,
++        0x01 }},
++      {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++        0x01 }}
++};
++
+ static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11280x1024_2_H[] =
+ {
+       {{0x4f,0x27,0x93,0x39,0x81,0x24,0xbb,
+@@ -2992,207 +1914,6 @@ static const SiS300_LVDSCRT1DataStruct  
+         0x01}}
+ };
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x600_1[] =
+-{
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+-        0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+-        0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+-        0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+-        0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xaf,0xba,
+-        0x3b,0x82,0xdf,0xb0,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x7e,0x63,0x82,0x68,0x15,0x1e,0xf1,
+-        0xae,0x85,0x57,0x1f,0x30,0x00,0x26,
+-        0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x1e,0xf1,
+-        0xae,0x85,0x57,0x1f,0x30,0x00,0x02,
+-        0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x600_1_H[] =
+-{
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-          0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+-        0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+-        0x00}},
+-        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+-        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+-        0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-        0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x600_2[] =
+-{
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-          0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-        0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-        0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11024x600_2_H[] =
+-{
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+-        0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-        0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11152x768_1[] =
+-{
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x04,0x3e,
+-        0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
+-        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
+-        0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-        0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11152x768_1_H[] =
+-{
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+-        0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+-        0x00}},
+-        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+-        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+-        0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-        0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11152x768_2[] =
+-{
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-        0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-        0x01}}
+-};
+-
+-static const SiS300_LVDSCRT1DataStruct  SiS300_LVDSCRT11152x768_2_H[] =
+-{
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+-        0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-        0x01}}
+-};
+-
+-/* TW: New */
+ static const SiS300_LVDSCRT1DataStruct  SiS300_CHTVCRT1UNTSC[] =
+ {
+       {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
+@@ -3302,9 +2023,7 @@ static const SiS300_LVDSCRT1DataStruct  
+         0x90,0x8c,0x57,0xed,0x20,0x00,0x05,
+         0x01 }}
+ };
+-/* TW: New end */
+-/* TW: New */
+ typedef struct _SiS300_CHTVRegDataStruct
+ {
+       UCHAR Reg[16];
+@@ -3361,9 +2080,7 @@ static const SiS300_CHTVRegDataStruct Si
+       {{0x60,0x30,0x00,0x10,0x00,0,0,0,0,0,0,0,0,0,0,0}}, /* TW: Mode 13: 640x480 PAL 5/4 */
+       {{0x81,0x50,0x00,0x1b,0x00,0,0,0,0,0,0,0,0,0,0,0}}  /* TW: Mode 19: 800x600 PAL 1/1 */
+ };
+-/* TW: New end */
+-/* TW: New */
+ static const UCHAR SiS300_CHTVVCLKUNTSC[]  = {0x29,0x29,0x29,0x29,0x2a,0x2e};
+ static const UCHAR SiS300_CHTVVCLKONTSC[]  = {0x2c,0x2c,0x2c,0x2c,0x2d,0x2b};
+@@ -3375,6 +2092,5 @@ static const UCHAR SiS300_CHTVVCLKUPAL[]
+ static const UCHAR SiS300_CHTVVCLKOPAL[]   = {0x2f,0x2f,0x2f,0x2f,0x30,0x32};
+ static const UCHAR SiS300_CHTVVCLKSOPAL[]  = {0x2f,0x2f,0x2f,0x2f,0x36,0x29};
+-/* TW: New end */
+--- linux-2.6.0-test1/drivers/video/sis/310vtbl.h      2003-06-14 12:18:23.000000000 -0700
++++ 25/drivers/video/sis/310vtbl.h     2003-07-19 17:04:55.000000000 -0700
+@@ -1,7 +1,30 @@
+-
+-
+-/* Register settings for SiS 310/325/330 series */
+-
++/* $XFree86$ */
++/*
++ * Register settings for SiS 315/330 series
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ typedef struct _SiS310_StStruct
+ {
+@@ -39,466 +62,12 @@ static const SiS310_StStruct SiS310_SMod
+       {0xff,0x0000,0x00,0x00,0x00,0x00,0x00,0x00}
+ };
+-typedef struct _SiS310_StandTableStruct
+-{
+-      UCHAR CRT_COLS;
+-      UCHAR ROWS;
+-      UCHAR CHAR_HEIGHT;
+-      USHORT CRT_LEN;
+-      UCHAR SR[4];
+-      UCHAR MISC;
+-      UCHAR CRTC[0x19];
+-      UCHAR ATTR[0x14];
+-      UCHAR GRC[9];
+-} SiS310_StandTableStruct;
+-
+-static const SiS310_StandTableStruct SiS310_StandTable[]=
+-{
+-/* 0x00: MD_0_200 */
+- {
+-  0x28,0x18,0x08,0x0800,
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x01: MD_1_200 */
+- {
+-  0x28,0x18,0x08,0x0800,
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x02: MD_2_200 */
+- {
+-  0x50,0x18,0x08,0x1000,
+-  {0x01,0x03,0x00,0x02},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x03: MD_3_200 - mode 0x03 - 0 */
+- {
+-  0x50,0x18,0x08,0x1000,
+-  {0x01,0x03,0x00,0x02},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x04: MD_4 */
+- {
+-  0x28,0x18,0x08,0x4000,
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
+-   0xff},
+-  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x03,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
+-   0xff}
+- },
+-/* 0x05: MD_5 */
+- {
+-  0x28,0x18,0x08,0x4000,
+-  {0x09,0x03,0x00,0x02},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
+-   0xff},
+-  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x03,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
+-   0xff}
+- },
+-/* 0x06: MD_6 */
+- {
+-  0x50,0x18,0x08,0x4000,
+-  {0x01,0x01,0x00,0x06},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xc2,
+-   0xff},
+-  {0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+-   0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
+-   0x01,0x00,0x01,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,
+-   0xff}
+- },
+-/* 0x07: MD_7 */
+- {
+-  0x50,0x18,0x0e,0x1000,
+-  {0x00,0x03,0x00,0x03},
+-  0xa6,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x0d,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+-   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+-   0x0e,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
+-   0xff}
+- },
+-/* 0x08: MDA_DAC */
+- {
+-  0x00,0x00,0x00,0x0000,
+-  {0x00,0x00,0x00,0x15},
+-  0x15,
+-  {0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15,0x15,0x15,0x3f,0x3f,
+-   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x00,0x00,
+-   0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
+-   0x15,0x15,0x15,0x15},
+-  {0x15,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x3f}
+- },
+-/* 0x09: CGA_DAC */
+- {
+-  0x00,0x10,0x04,0x0114,
+-  {0x11,0x09,0x15,0x00},
+-  0x10,
+-  {0x04,0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,
+-   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x2a,0x3a,
+-   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x10,
+-   0x04},
+-  {0x14,0x01,0x11,0x09,0x15,0x00,0x10,0x04,
+-   0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,0x2e,
+-   0x3e,0x2b,0x3b,0x2f},
+-  {0x3f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
+-   0x3f}
+- },
+-/* 0x0a: EGA_DAC */
+- {
+-  0x00,0x10,0x04,0x0114,
+-  {0x11,0x05,0x15,0x20},
+-  0x30,
+-  {0x24,0x34,0x21,0x31,0x25,0x35,0x08,0x18,
+-   0x0c,0x1c,0x09,0x19,0x0d,0x1d,0x28,0x38,
+-   0x2c,0x3c,0x29,0x39,0x2d,0x3d,0x02,0x12,
+-   0x06},
+-  {0x16,0x03,0x13,0x07,0x17,0x22,0x32,0x26,
+-   0x36,0x23,0x33,0x27,0x37,0x0a,0x1a,0x0e,
+-   0x1e,0x0b,0x1b,0x0f},
+-  {0x1f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
+-   0x3f}
+- },
+-/* 0x0b: VGA_DAC */
+- {
+-  0x00,0x10,0x04,0x0114,
+-  {0x11,0x09,0x15,0x2a},
+-  0x3a,
+-  {0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x05,
+-   0x08,0x0b,0x0e,0x11,0x14,0x18,0x1c,0x20,
+-   0x24,0x28,0x2d,0x32,0x38,0x3f,0x00,0x10,
+-   0x1f},
+-  {0x2f,0x3f,0x1f,0x27,0x2f,0x37,0x3f,0x2d,
+-   0x31,0x36,0x3a,0x3f,0x00,0x07,0x0e,0x15,
+-   0x1c,0x0e,0x11,0x15},
+-  {0x18,0x1c,0x14,0x16,0x18,0x1a,0x1c,0x00,
+-   0x04}
+- },
+-/* 0x0c */ 
+- {
+-  0x08,0x0c,0x10,0x0a08,
+-  {0x0c,0x0e,0x10,0x0b},
+-  0x0c,
+-  {0x0d,0x0f,0x10,0x10,0x01,0x08,0x00,0x00,
+-   0x00,0x00,0x01,0x00,0x02,0x02,0x01,0x00,
+-   0x04,0x04,0x01,0x00,0x05,0x02,0x05,0x00,
+-   0x06},
+-  {0x01,0x06,0x05,0x06,0x00,0x08,0x01,0x08,
+-   0x00,0x07,0x02,0x07,0x06,0x07,0x00,0x00,
+-   0x00,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00}
+- },
+-/* 0x0d: MD_D */
+- {
+-  0x28,0x18,0x08,0x2000,
+-  {0x09,0x0f,0x00,0x06},
+-  0x63,
+-  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x0e: MD_E */
+- {
+-  0x50,0x18,0x08,0x4000,
+-  {0x01,0x0f,0x00,0x06},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x0f: ExtVGATable - modes > 0x13 */
+- {
+-  0x00,0x00,0x00,0x0000,
+-  {0x01,0x0f,0x00,0x0e},
+-  0x23,
+-  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+-   0x01,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x10: ROM_SAVEPTR */
+- {
+-  0x9f,0x3b,0x00,0x00c0,
+-  {0x00,0x00,0x00,0x00},
+-  0x00,
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x3f,
+-   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00,0x00,0x1a,0x00,0xac,0x3e,0x00,0xc0,
+-   0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00,0x00,0x00,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x00}
+- },
+-/* 0x11: MD_F */
+- {
+-  0x50,0x18,0x0e,0x8000,
+-  {0x01,0x0f,0x00,0x06},
+-  0xa2,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x82,0x84,0x5d,0x28,0x0f,0x63,0xba,0xe3,
+-   0xff},
+-  {0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,
+-   0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,
+-   0x0b,0x00,0x05,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,
+-   0xff}
+- },
+-/* 0x12: MD_10 */
+- {
+-  0x50,0x18,0x0e,0x8000,
+-  {0x01,0x0f,0x00,0x06},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x82,0x84,0x5d,0x28,0x0f,0x63,0xba,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x13: MD_0_350 */
+- {
+-  0x28,0x18,0x0e,0x0800,
+-  {0x09,0x03,0x00,0x02},
+-  0xa3,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xb1,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x14: MD_1_350 */
+- {
+-  0x28,0x18,0x0e,0x0800,
+-  {0x09,0x03,0x00,0x02},
+-  0xa3,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x15: MD_2_350 */
+- {
+-  0x50,0x18,0x0e,0x1000,
+-  {0x01,0x03,0x00,0x02},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x16: MD_3_350 - mode 0x03 - 1 */
+- {
+-  0x50,0x18,0x0e,0x1000,
+-  {0x01,0x03,0x00,0x02},
+-  0xa3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
+-   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x08,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x17: MD_0_1_400 */
+- {
+-  0x28,0x18,0x10,0x0800,
+-  {0x08,0x03,0x00,0x02},
+-  0x67,
+-  {0x2d,0x27,0x28,0x90,0x2b,0xb1,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x0c,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x18: MD_2_3_400 - mode 0x03 - 2 */
+- {
+-  0x50,0x18,0x10,0x1000,
+-  {0x00,0x03,0x00,0x02},
+-  0x67,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x0c,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
+-   0xff}
+- },
+-/* 0x19: MD_7_400 */
+- {
+-  0x50,0x18,0x10,0x1000,
+-  {0x00,0x03,0x00,0x02},
+-  0x66,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x0f,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
+-   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+-   0x0e,0x00,0x0f,0x08},
+-  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
+-   0xff}
+- },
+-/* 0x1a: MD_11 */
+- {
+-  0x50,0x1d,0x10,0xa000,
+-  {0x01,0x0f,0x00,0x06},
+-  0xe3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xc3,
+-   0xff},
+-  {0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,
+-   0xff}
+- },
+-/* 0x1b: ExtEGATable - Modes <= 0x02 */
+- {
+-  0x50,0x1d,0x10,0xa000,
+-  {0x01,0x0f,0x00,0x06},
+-  0xe3,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
+-   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xe3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
+-   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+-   0x01,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
+-   0xff}
+- },
+-/* 0x1c: MD_13 */
+- {
+-  0x28,0x18,0x08,0x2000,
+-  {0x01,0x0f,0x00,0x0e},
+-  0x63,
+-  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+-   0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,
+-   0x9c,0x8e,0x8f,0x28,0x40,0x96,0xb9,0xa3,
+-   0xff},
+-  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
+-   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+-   0x41,0x00,0x0f,0x00},
+-  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
+-   0xff}
+- }
+-};
+-
+ typedef struct _SiS310_ExtStruct
+ {
+       UCHAR Ext_ModeID;
+       USHORT Ext_ModeFlag;
+       USHORT Ext_ModeInfo;
+-      USHORT Ext_Point;    /* TW: Address of table entry in (older) BIOS image */
+       USHORT Ext_VESAID;
+-      UCHAR Ext_VESAMEMSize;
+       UCHAR Ext_RESINFO;
+       UCHAR VB_ExtTVFlickerIndex;
+       UCHAR VB_ExtTVEdgeIndex;
+@@ -506,93 +75,93 @@ typedef struct _SiS310_ExtStruct
+       UCHAR REFindex;
+ } SiS310_ExtStruct;
+-/* TW: Checked with 650/LVDS and 650/301LVx 1.10.6s */
+ static const SiS310_ExtStruct  SiS310_EModeIDTable[]=
+ {
+-      {0x6a,0x2212,0x0407,0x3a81,0x0102,0x08,0x07,0x00,0x00,0x07,0x00},          /* 800x600x? */
+-      {0x2e,0x0a1b,0x0306,0x3a57,0x0101,0x08,0x06,0x00,0x00,0x05,0x08},          /* 640x480x8 */
+-/*    {0x2e,0x021b,0x0306,0x3a57,0x0101,0x08,0x06,0x00,0x00,0x05,0x08},    */    /* 640x480x8 - 650/LVDS BIOS (no CRt2Mode) */
+-      {0x2f,0x0a1b,0x0305,0x3a50,0x0100,0x08,0x05,0x00,0x00,0x05,0x10},          /* 640x400x8 */
+-/*    {0x2f,0x021b,0x0305,0x3a50,0x0100,0x08,0x05,0x00,0x00,0x05,0x10},    */    /* 640x400x8 - 650/LVDS BIOS (no CRt2Mode) */
+-      {0x30,0x2a1b,0x0407,0x3a81,0x0103,0x08,0x07,0x00,0x00,0x07,0x00},          /* 800x600x8 */
+-/*    {0x30,0x221b,0x0407,0x3a81,0x0103,0x08,0x07,0x00,0x00,0x07,0x00},    */    /* 800x600x8 - 650/LVDS BIOS (no CRt2Mode) */
+-/*      {0x31,0x0a1b,0x030d,0x3b85,0x0000,0x08,0x0d,0x00,0x00,0x06,0x11},    */    /* 720x480x8 */
+-        {0x31,0x0a1b,0x0a0d,0x3b85,0x0000,0x08,0x0d,0x00,0x00,0x06,0x11},          /* 720x480x8 BIOS (301/LVDS) */
+-      {0x32,0x0a1b,0x0a0e,0x3b8c,0x0000,0x08,0x0e,0x00,0x00,0x06,0x12},          /* 720x576x8 */
+-      {0x33,0x0a1d,0x0a0d,0x3b85,0x0000,0x08,0x0d,0x00,0x00,0x06,0x11},          /* 720x480x16 */
+-      {0x34,0x2a1d,0x0a0e,0x3b8c,0x0000,0x08,0x0e,0x00,0x00,0x06,0x12},          /* 720x576x16 */
+-      {0x35,0x0a1f,0x0a0d,0x3b85,0x0000,0x08,0x0d,0x00,0x00,0x06,0x11},          /* 720x480x32 */
+-      {0x36,0x2a1f,0x0a0e,0x3b8c,0x0000,0x08,0x0e,0x00,0x00,0x06,0x12},          /* 720x576x32 */
+-      {0x37,0x0212,0x0508,0x3aab,0x0104,0x08,0x08,0x00,0x00,0x08,0x13},          /* 1024x768x? */
+-      {0x38,0x0a1b,0x0508,0x3aab,0x0105,0x08,0x08,0x00,0x00,0x08,0x13},          /* 1024x768x8 */
+-      {0x3a,0x0e3b,0x0609,0x3adc,0x0107,0x08,0x09,0x00,0x00,0x00,0x1a},          /* 1280x1024x8 */
+-      {0x3c,0x0e3b,0x070a,0x3af2,0x0130,0x08,0x0a,0x00,0x00,0x00,0x1e},          /* 1600x1200x8 */
+-      {0x3d,0x0e7d,0x070a,0x3af2,0x0131,0x08,0x0a,0x00,0x00,0x00,0x1e},          /* 1600x1200x16 - 650/301LVx - no CRT2Mode? */
+-      {0x40,0x9a1c,0x0000,0x3a34,0x010d,0x08,0x00,0x00,0x00,0x04,0x25},
+-      {0x41,0x9a1d,0x0000,0x3a34,0x010e,0x08,0x00,0x00,0x00,0x04,0x25},
+-      {0x43,0x0a1c,0x0306,0x3a57,0x0110,0x08,0x06,0x00,0x00,0x05,0x08},
+-      {0x44,0x0a1d,0x0306,0x3a57,0x0111,0x08,0x06,0x00,0x00,0x05,0x08},          /* 640x480x16 */
+-      {0x46,0x2a1c,0x0407,0x3a81,0x0113,0x08,0x07,0x00,0x00,0x07,0x00},
+-      {0x47,0x2a1d,0x0407,0x3a81,0x0114,0x08,0x07,0x00,0x00,0x07,0x00},          /* 800x600x16 */
+-      {0x49,0x0a3c,0x0508,0x3aab,0x0116,0x08,0x08,0x00,0x00,0x00,0x13},
+-      {0x4a,0x0a3d,0x0508,0x3aab,0x0117,0x08,0x08,0x00,0x00,0x08,0x13},          /* 1024x768x16 */
+-      {0x4c,0x0e7c,0x0609,0x3adc,0x0119,0x08,0x09,0x00,0x00,0x00,0x1a},
+-      {0x4d,0x0e7d,0x0609,0x3adc,0x011a,0x08,0x09,0x00,0x00,0x00,0x1a},          /* 1280x1024x16 */
+-      {0x50,0x9a1b,0x0001,0x3a3b,0x0132,0x08,0x01,0x00,0x00,0x04,0x26},          /* 320x240 */
+-      {0x51,0xba1b,0x0103,0x3a42,0x0133,0x08,0x03,0x00,0x00,0x07,0x27},
+-      {0x52,0xba1b,0x0204,0x3a49,0x0134,0x08,0x04,0x00,0x00,0x00,0x28},          /* 650/301 BIOS */
+-      {0x56,0x9a1d,0x0001,0x3a3b,0x0135,0x08,0x01,0x00,0x00,0x04,0x26},
+-      {0x57,0xba1d,0x0103,0x3a42,0x0136,0x08,0x03,0x00,0x00,0x07,0x27},
+-      {0x58,0xba1d,0x0204,0x3a49,0x0137,0x08,0x04,0x00,0x00,0x00,0x28},          /* BIOS (301+LVDS) */
+-      {0x59,0x9a1b,0x0000,0x3a34,0x0138,0x08,0x00,0x00,0x00,0x04,0x25},          /* 320x200 */
+-      {0x5A,0x021b,0x0014,0x3b83,0x0138,0x08,0x01,0x00,0x00,0x04,0x3f},          /* 320x480x8 fstn add new mode*/
+-      {0x5B,0x0a1d,0x0014,0x3b83,0x0135,0x08,0x01,0x00,0x00,0x04,0x3f},          /* 320x480x16 fstn add new mode*/
+-      {0x5c,0xba1f,0x0204,0x3a49,0x0000,0x08,0x04,0x00,0x00,0x00,0x28},          /* TW: inserted 512x384x32 */
+-      {0x5d,0x0a1d,0x0305,0x3a50,0x0139,0x08,0x05,0x00,0x00,0x07,0x10},
+-      {0x5e,0x0a1f,0x0305,0x3a50,0x0000,0x08,0x05,0x00,0x00,0x07,0x10},          /* TW: Inserted 640x400x32 */
+-      {0x62,0x0a3f,0x0306,0x3a57,0x013a,0x08,0x06,0x00,0x00,0x05,0x08},          /* 640x480x32 */
+-      {0x63,0x2a3f,0x0407,0x3a81,0x013b,0x08,0x07,0x00,0x00,0x07,0x00},          /* 800x600x32 */
+-      {0x64,0x0a7f,0x0508,0x3aab,0x013c,0x08,0x08,0x00,0x00,0x08,0x13},          /* 1024x768x32 */
+-      {0x65,0x0eff,0x0609,0x3adc,0x013d,0x08,0x09,0x00,0x00,0x00,0x1a},          /* 1280x1024x32 */
+-      {0x66,0x0eff,0x070a,0x3af2,0x013e,0x08,0x0a,0x00,0x00,0x00,0x1e},          /* 1600x1200x32 */
+-      {0x68,0x067b,0x080b,0x3b17,0x013f,0x08,0x0b,0x00,0x00,0x00,0x29},          /* 1920x1440x8 */
+-      {0x69,0x06fd,0x080b,0x3b17,0x0140,0x08,0x0b,0x00,0x00,0x00,0x29},          /* 1920x1440x16 */
+-      {0x6b,0x07ff,0x080b,0x3b17,0x0141,0x10,0x0b,0x00,0x00,0x00,0x29},          /* 1920x1440x32 */
+-      {0x6c,0x067b,0x090c,0x3b37,0x0000,0x08,0x0c,0x00,0x00,0x00,0x2f},          /* 2048x1536x8 */
+-      {0x6d,0x06fd,0x090c,0x3b37,0x0000,0x10,0x0c,0x00,0x00,0x00,0x2f},          /* 2048x1536x16 */
+-      {0x6e,0x07ff,0x090c,0x3b37,0x0000,0x10,0x0c,0x00,0x00,0x00,0x2f},          /* 2048x1536x32 */
+-      {0x70,0x2a1b,0x0410,0x3b52,0x0000,0x08,0x10,0x00,0x00,0x07,0x34},          /* 800x480x8 */
+-      {0x71,0x0a1b,0x0511,0x3b63,0x0000,0x08,0x11,0x00,0x00,0x00,0x37},          /* 1024x576x8 */
+-      {0x74,0x0a1d,0x0511,0x3b63,0x0000,0x08,0x11,0x00,0x00,0x00,0x37},          /* 1024x576x16 */
+-      {0x75,0x0a3d,0x0612,0x3b74,0x0000,0x08,0x12,0x00,0x00,0x00,0x3a},          /* 1280x720x16 */
+-      {0x76,0x2a1f,0x0410,0x3b52,0x0000,0x08,0x10,0x00,0x00,0x07,0x34},          /* 800x480x32 */
+-      {0x77,0x0a1f,0x0511,0x3b63,0x0000,0x08,0x11,0x00,0x00,0x00,0x37},          /* 1024x576x32 */
+-      {0x78,0x0a3f,0x0612,0x3b74,0x0000,0x08,0x12,0x00,0x00,0x00,0x3a},          /* 1280x720x32 */
+-      {0x79,0x0a3b,0x0612,0x3b74,0x0000,0x08,0x12,0x00,0x00,0x00,0x3a},          /* 1280x720x8 */
+-      {0x7a,0x2a1d,0x0410,0x3b52,0x0000,0x08,0x10,0x00,0x00,0x07,0x34},          /* 800x480x16 */
+-      {0x7c,0x0e3b,0x060f,0x3ad0,0x0000,0x08,0x0f,0x00,0x00,0x00,0x3d},          /* 1280x960x8 - TW */
+-      {0x7d,0x0e7d,0x060f,0x3ad0,0x0000,0x08,0x0f,0x00,0x00,0x00,0x3d},          /* 1280x960x16 - TW */
+-      {0x7e,0x0eff,0x060f,0x3ad0,0x0000,0x08,0x0f,0x00,0x00,0x00,0x3d},          /* 1280x960x32 - TW */
+-        /* TW: 650/LVDS BIOS new modes */
+-      {0x23,0x0e3b,0x0614,0x36f7,0x0000,0x08,0x14,0x00,0x00,0x00,0x40},          /* 1280x768x8 */
+-      {0x24,0x0e7d,0x0614,0x36f7,0x0000,0x08,0x14,0x00,0x00,0x00,0x40},          /* 1280x768x16 */
+-      {0x25,0x0eff,0x0614,0x36f7,0x0000,0x08,0x14,0x00,0x00,0x00,0x40},          /* 1280x768x32 */
+-      {0x26,0x0e3b,0x0c15,0x36fe,0x0000,0x08,0x15,0x00,0x00,0x00,0x41},          /* 1400x1050x8 */
+-      {0x27,0x0e7d,0x0c15,0x36fe,0x0000,0x08,0x15,0x00,0x00,0x00,0x41},          /* 1400x1050x16 */
+-      {0x28,0x0eff,0x0c15,0x36fe,0x0000,0x08,0x15,0x00,0x00,0x00,0x41},          /* 1400x1050x32*/
+-      {0x29,0x0e1b,0x0d16,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x43},    /* TW: NEW 1152x864 - not in BIOS */
+-      {0x2a,0x0e3d,0x0d16,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x43},
+-      {0x2b,0x0e7f,0x0d16,0x0000,0x0000,0x08,0x16,0x00,0x00,0x00,0x43},
+-      {0x39,0x2a1b,0x0b17,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x45},    /* TW: NEW 848x480 - not in BIOS */
+-      {0x3b,0x2a3d,0x0b17,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x45},
+-      {0x3e,0x2a7f,0x0b17,0x0000,0x0000,0x08,0x17,0x00,0x00,0x00,0x45},
+-      {0x3f,0x2a1b,0x0b13,0x0000,0x0000,0x08,0x13,0x00,0x00,0x00,0x47},    /* TW: NEW 856x480 - not in BIOS */
+-      {0x42,0x2a3d,0x0b13,0x0000,0x0000,0x08,0x13,0x00,0x00,0x00,0x47},
+-      {0x45,0x2a7f,0x0b13,0x0000,0x0000,0x08,0x13,0x00,0x00,0x00,0x47},
+-      {0x48,0x2a1b,0x0e18,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x49},    /* TW: NEW 1360x768 - not in BIOS */
+-      {0x4b,0x2a3d,0x0e18,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x49},
+-      {0x4e,0x2a7f,0x0e18,0x0000,0x0000,0x08,0x18,0x00,0x00,0x00,0x49},
+-      {0xff,0x0000,0x0000,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00}
++      {0x6a,0x2212,0x0407,0x0102,SIS_RI_800x600,  0x00,0x00,0x07,0x00}, /* 800x600x? */
++      {0x2e,0x0a1b,0x0306,0x0101,SIS_RI_640x480,  0x00,0x00,0x05,0x08}, /* 640x480x8 */
++        {0x2f,0x0a1b,0x0305,0x0100,SIS_RI_640x400,  0x00,0x00,0x05,0x10}, /* 640x400x8 */
++      {0x30,0x2a1b,0x0407,0x0103,SIS_RI_800x600,  0x00,0x00,0x07,0x00}, /* 800x600x8 */
++        {0x31,0x0a1b,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x06,0x11}, /* 720x480x8 */
++      {0x32,0x0a1b,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x06,0x12}, /* 720x576x8 */
++      {0x33,0x0a1d,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x06,0x11}, /* 720x480x16 */
++      {0x34,0x2a1d,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x06,0x12}, /* 720x576x16 */
++      {0x35,0x0a1f,0x0a0d,0x0000,SIS_RI_720x480,  0x00,0x00,0x06,0x11}, /* 720x480x32 */
++      {0x36,0x2a1f,0x0a0e,0x0000,SIS_RI_720x576,  0x00,0x00,0x06,0x12}, /* 720x576x32 */
++      {0x37,0x0212,0x0508,0x0104,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x? */
++      {0x38,0x0a1b,0x0508,0x0105,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x8 */
++      {0x3a,0x0e3b,0x0609,0x0107,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x8 */
++      {0x3c,0x0e3b,0x070a,0x0130,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x8 */
++      {0x3d,0x0e7d,0x070a,0x0131,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x16 */
++      {0x40,0x9a1c,0x0000,0x010d,SIS_RI_320x200,  0x00,0x00,0x04,0x25}, /* 320x200x15 */
++      {0x41,0x9a1d,0x0000,0x010e,SIS_RI_320x200,  0x00,0x00,0x04,0x25}, /* 320x200x16 */
++      {0x43,0x0a1c,0x0306,0x0110,SIS_RI_640x480,  0x00,0x00,0x05,0x08},
++      {0x44,0x0a1d,0x0306,0x0111,SIS_RI_640x480,  0x00,0x00,0x05,0x08}, /* 640x480x16 */
++      {0x46,0x2a1c,0x0407,0x0113,SIS_RI_800x600,  0x00,0x00,0x07,0x00},
++      {0x47,0x2a1d,0x0407,0x0114,SIS_RI_800x600,  0x00,0x00,0x07,0x00}, /* 800x600x16 */
++      {0x49,0x0a3c,0x0508,0x0116,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
++      {0x4a,0x0a3d,0x0508,0x0117,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x16 */
++      {0x4c,0x0e7c,0x0609,0x0119,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
++      {0x4d,0x0e7d,0x0609,0x011a,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x16 */
++      {0x50,0x9a1b,0x0001,0x0132,SIS_RI_320x240,  0x00,0x00,0x04,0x26}, /* 320x240x8  */
++      {0x51,0xba1b,0x0103,0x0133,SIS_RI_400x300,  0x00,0x00,0x07,0x27}, /* 400x300x8  */
++      {0x52,0xba1b,0x0204,0x0134,SIS_RI_512x384,  0x00,0x00,0x00,0x28}, /* 512x384x8  */
++      {0x56,0x9a1d,0x0001,0x0135,SIS_RI_320x240,  0x00,0x00,0x04,0x26}, /* 320x240x16 */
++      {0x57,0xba1d,0x0103,0x0136,SIS_RI_400x300,  0x00,0x00,0x07,0x27}, /* 400x300x16 */
++      {0x58,0xba1d,0x0204,0x0137,SIS_RI_512x384,  0x00,0x00,0x00,0x28}, /* 512x384x16 */
++      {0x59,0x9a1b,0x0000,0x0138,SIS_RI_320x200,  0x00,0x00,0x04,0x25}, /* 320x200x8  */
++      {0x5a,0x021b,0x0014,0x0138,SIS_RI_320x240,  0x00,0x00,0x04,0x3f}, /* 320x240x8  fstn */
++      {0x5b,0x0a1d,0x0014,0x0135,SIS_RI_320x240,  0x00,0x00,0x04,0x3f}, /* 320x240x16 fstn */
++      {0x5c,0xba1f,0x0204,0x0000,SIS_RI_512x384,  0x00,0x00,0x00,0x28}, /* 512x384x32 */
++      {0x5d,0x0a1d,0x0305,0x0139,SIS_RI_640x400,  0x00,0x00,0x07,0x10},
++      {0x5e,0x0a1f,0x0305,0x0000,SIS_RI_640x400,  0x00,0x00,0x07,0x10}, /* 640x400x32 */
++      {0x62,0x0a3f,0x0306,0x013a,SIS_RI_640x480,  0x00,0x00,0x05,0x08}, /* 640x480x32 */
++      {0x63,0x2a3f,0x0407,0x013b,SIS_RI_800x600,  0x00,0x00,0x07,0x00}, /* 800x600x32 */
++      {0x64,0x0a7f,0x0508,0x013c,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x32 */
++      {0x65,0x0eff,0x0609,0x013d,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x32 */
++      {0x66,0x0eff,0x070a,0x013e,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x32 */
++      {0x68,0x067b,0x080b,0x013f,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x8 */
++      {0x69,0x06fd,0x080b,0x0140,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x16 */
++      {0x6b,0x07ff,0x080b,0x0141,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x32 */
++      {0x6c,0x067b,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x8 */
++      {0x6d,0x06fd,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x16 */
++      {0x6e,0x07ff,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x32 */
++      {0x70,0x2a1b,0x0410,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x34}, /* 800x480x8 */
++      {0x71,0x0a1b,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x8 */
++      {0x74,0x0a1d,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x16 */
++      {0x75,0x0a3d,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x16 */
++      {0x76,0x2a1f,0x0410,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x34}, /* 800x480x32 */
++      {0x77,0x0a1f,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x32 */
++      {0x78,0x0a3f,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x32 */
++      {0x79,0x0a3b,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x8 */
++      {0x7a,0x2a1d,0x0410,0x0000,SIS_RI_800x480,  0x00,0x00,0x07,0x34}, /* 800x480x16 */
++      {0x7c,0x0e3b,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x8 */
++      {0x7d,0x0e7d,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x16 */
++      {0x7e,0x0eff,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x32 */
++      {0x23,0x0e3b,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x8 */
++      {0x24,0x0e7d,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x16 */
++      {0x25,0x0eff,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x32 */
++      {0x26,0x0e3b,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x8 */
++      {0x27,0x0e7d,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x16 */
++      {0x28,0x0eff,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x32*/
++      {0x29,0x0e1b,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43}, /* 1152x864 */
++      {0x2a,0x0e3d,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43},
++      {0x2b,0x0e7f,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43},
++      {0x39,0x2a1b,0x0b17,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x45}, /* 848x480 */
++      {0x3b,0x2a3d,0x0b17,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x45},
++      {0x3e,0x2a7f,0x0b17,0x0000,SIS_RI_848x480,  0x00,0x00,0x00,0x45},
++      {0x3f,0x2a1b,0x0b13,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x47}, /* 856x480 */
++      {0x42,0x2a3d,0x0b13,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x47},
++      {0x45,0x2a7f,0x0b13,0x0000,SIS_RI_856x480,  0x00,0x00,0x00,0x47},
++      {0x48,0x2a1b,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49}, /* 1360x768 */
++      {0x4b,0x2a3d,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49},
++      {0x4e,0x2a7f,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49},
++      {0x4f,0x9a1f,0x0000,0x0000,SIS_RI_320x200,  0x00,0x00,0x04,0x25}, /* 320x200x32 */
++      {0x53,0x9a1f,0x0001,0x0000,SIS_RI_320x240,  0x00,0x00,0x04,0x26}, /* 320x240x32 */
++      {0x54,0xba1f,0x0103,0x0000,SIS_RI_400x300,  0x00,0x00,0x07,0x27}, /* 400x300x32 */
++      {0x5f,0x2a1b,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x4a}, /* 768x576x8 */
++      {0x60,0x2a1d,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x4a}, /* 768x576x16 */
++      {0x61,0x2a1f,0x0f0e,0x0000,SIS_RI_768x576,  0x00,0x00,0x00,0x4a}, /* 768x576x32 */
++      {0xff,0x0000,0x0000,0x0000,0x00,            0x00,0x00,0x00,0x00}
+ };
+ typedef struct _SiS310_Ext2Struct
+@@ -604,89 +173,87 @@ typedef struct _SiS310_Ext2Struct
+       UCHAR  ModeID;
+       USHORT XRes;
+       USHORT YRes;
+-      USHORT ROM_OFFSET;
+ } SiS310_Ext2Struct;
+ static const SiS310_Ext2Struct SiS310_RefIndex[]=
+ {
+-/*    {0x005f,0x0d,0x03,0x05,0x6a, 800, 600,0x3a81},    0x0 - TW: Patch for Chrontel 7019  */
+-      {0x085f,0x0d,0x03,0x05,0x6a, 800, 600,0x3a81}, /* 0x0 */
+-      {0x0467,0x0e,0x04,0x05,0x6a, 800, 600,0x3a86}, /* 0x1 */
+-      {0x0067,0x0f,0x08,0x48,0x6a, 800, 600,0x3a8b}, /* 0x2 */
+-      {0x0067,0x10,0x07,0x8b,0x6a, 800, 600,0x3a90}, /* 0x3 */
+-      {0x0147,0x11,0x0a,0x00,0x6a, 800, 600,0x3a95}, /* 0x4 */
+-      {0x0147,0x12,0x0d,0x00,0x6a, 800, 600,0x3a9a}, /* 0x5 - 4147 TW: Test sync change */
+-      {0x0047,0x13,0x13,0x00,0x6a, 800, 600,0x3a9f}, /* 0x6 - 4047 */
+-      {0x0047,0x14,0x1c,0x00,0x6a, 800, 600,0x3aa4}, /* 0x7 - 4047 */
+-/*    {0xc05f,0x05,0x00,0x04,0x2e, 640, 480,0x3a57},    0x8 - TW: Patch for Chrontel 7019  */
+-      {0xc85f,0x05,0x00,0x04,0x2e, 640, 480,0x3a57}, /* 0x8 */
+-      {0xc067,0x06,0x02,0x04,0x2e, 640, 480,0x3a5c}, /* 0x9 */
+-      {0xc067,0x07,0x02,0x47,0x2e, 640, 480,0x3a61}, /* 0xa */
+-      {0xc067,0x08,0x03,0x8a,0x2e, 640, 480,0x3a66}, /* 0xb */
+-      {0xc047,0x09,0x05,0x00,0x2e, 640, 480,0x3a6b}, /* 0xc - 4047 */
+-      {0xc047,0x0a,0x09,0x00,0x2e, 640, 480,0x3a70}, /* 0xd - 4047 */
+-      {0xc047,0x0b,0x0e,0x00,0x2e, 640, 480,0x3a75}, /* 0xe - 4047 */
+-      {0xc047,0x0c,0x15,0x00,0x2e, 640, 480,0x3a7a}, /* 0xf */
+-      {0x407f,0x04,0x00,0x00,0x2f, 640, 400,0x3a50}, /* 0x10 */
+-      {0xc00f,0x3c,0x01,0x06,0x31, 720, 480,0x3b85}, /* 0x11 */
+-      {0x000f,0x3d,0x03,0x06,0x32, 720, 576,0x3b8c}, /* 0x12 */
+-      {0x0187,0x15,0x06,0x00,0x37,1024, 768,0x3aab}, /* 0x13 */
+-      {0xc877,0x16,0x0b,0x06,0x37,1024, 768,0x3ab0}, /* 0x14 */
+-      {0xc067,0x17,0x0f,0x49,0x37,1024, 768,0x3ab5}, /* 0x15 */
+-      {0x0267,0x18,0x11,0x00,0x37,1024, 768,0x3aba}, /* 0x16 */
+-      {0x0047,0x19,0x16,0x8c,0x37,1024, 768,0x3abf}, /* 0x17 */
+-      {0x0047,0x1a,0x1b,0x00,0x37,1024, 768,0x3ac4}, /* 0x18 - 4047 */
+-      {0x0007,0x1b,0x1f,0x00,0x37,1024, 768,0x3ac9}, /* 0x19 - 4047 */
+-      {0x0387,0x1c,0x11,0x00,0x3a,1280,1024,0x3adc}, /* 0x1a */
+-      {0x0077,0x1d,0x19,0x07,0x3a,1280,1024,0x3ae1}, /* 0x1b */
+-      {0x0047,0x1e,0x1e,0x00,0x3a,1280,1024,0x3ae6}, /* 0x1c */
+-      {0x0007,0x1f,0x20,0x00,0x3a,1280,1024,0x3aeb}, /* 0x1d */
+-      {0x0027,0x20,0x21,0x09,0x3c,1600,1200,0x3af2}, /* 0x1e */
+-      {0x0007,0x21,0x22,0x00,0x3c,1600,1200,0x3af7}, /* 0x1f */
+-      {0x0007,0x22,0x23,0x00,0x3c,1600,1200,0x3afc}, /* 0x20 */
+-      {0x0007,0x23,0x25,0x00,0x3c,1600,1200,0x3b01}, /* 0x21 */
+-      {0x0007,0x24,0x26,0x00,0x3c,1600,1200,0x3b06}, /* 0x22 */
+-      {0x0007,0x25,0x2c,0x00,0x3c,1600,1200,0x3b0b}, /* 0x23 */
+-      {0x0007,0x26,0x34,0x00,0x3c,1600,1200,0x3b10}, /* 0x24 */
+-      {0x407f,0x00,0x00,0x00,0x40, 320, 200,0x3a34}, /* 0x25 */
+-      {0xc07f,0x01,0x00,0x04,0x50, 320, 240,0x3a3b}, /* 0x26 */
+-      {0x007f,0x02,0x04,0x05,0x51, 400, 300,0x3a42}, /* 0x27 */
+-      {0xc077,0x03,0x0b,0x06,0x52, 512, 384,0x3a49}, /* 0x28 */
+-      {0x8007,0x27,0x27,0x00,0x68,1920,1440,0x3b17}, /* 0x29 */
+-      {0x4007,0x28,0x29,0x00,0x68,1920,1440,0x3b1c}, /* 0x2a */
+-      {0x4007,0x29,0x2e,0x00,0x68,1920,1440,0x3b21}, /* 0x2b */
+-      {0x4007,0x2a,0x30,0x00,0x68,1920,1440,0x3b26}, /* 0x2c */
+-      {0x4007,0x2b,0x35,0x00,0x68,1920,1440,0x3b2b}, /* 0x2d */
+-      {0x4005,0x2c,0x39,0x00,0x68,1920,1440,0x3b30}, /* 0x2e */
+-      {0x4007,0x2d,0x2b,0x00,0x6c,2048,1536,0x3b37}, /* 0x2f */
+-      {0x4007,0x2e,0x31,0x00,0x6c,2048,1536,0x3b3c}, /* 0x30 */
+-      {0x4007,0x2f,0x33,0x00,0x6c,2048,1536,0x3b41}, /* 0x31 */
+-      {0x4007,0x30,0x37,0x00,0x6c,2048,1536,0x3b46}, /* 0x32 */
+-      {0x4005,0x31,0x38,0x00,0x6c,2048,1536,0x3b4b}, /* 0x33 */
+-      {0x0057,0x32,0x40,0x08,0x70, 800, 480,0x3b52}, /* 0x34 */
+-      {0x0047,0x33,0x07,0x08,0x70, 800, 480,0x3b57}, /* 0x35 */
+-      {0x0047,0x34,0x0a,0x08,0x70, 800, 480,0x3b5c}, /* 0x36 */
+-      {0x0057,0x35,0x0b,0x09,0x71,1024, 576,0x3b63}, /* 0x37 */
+-      {0x0047,0x36,0x11,0x09,0x71,1024, 576,0x3b68}, /* 0x38 */
+-      {0x0047,0x37,0x16,0x09,0x71,1024, 576,0x3b6d}, /* 0x39 */
+-      {0x0057,0x38,0x19,0x0a,0x75,1280, 720,0x3b74}, /* 0x3a */
+-      {0x0047,0x39,0x1e,0x0a,0x75,1280, 720,0x3b79}, /* 0x3b */
+-      {0x0007,0x3a,0x20,0x0a,0x75,1280, 720,0x3b7e}, /* 0x3c */
+-      {0x0067,0x3b,0x19,0x08,0x7c,1280, 960,0x3ad0}, /* 0x3d */
+-      {0x0027,0x4c,0x59,0x08,0x7c,1280, 960,0x3ad0}, /* 0x3e */
+-      {0xc07f,0x01,0x00,0x06,0x5a, 320, 480,0x3b83}, /* 0x3f */    /* FSTN mode */
+-        {0x0077,0x42,0x12,0x08,0x23,1280, 768,0x0000}, /* 0x40 */  
+-      {0x0067,0x43,0x4d,0x08,0x26,1400,1050,0x0000}, /* 0x41 */  
+-      {0x0007,0x4b,0x5a,0x08,0x26,1400,1050,0x0000}, /* 0x42 */    /* TW: new, not in any BIOS */
+-      {0x0047,0x44,0x19,0x00,0x29,1152, 864,0x0000}, /* 0x43 TW: Non-BIOS, new */
+-      {0x0047,0x4a,0x1e,0x00,0x29,1152, 864,0x0000}, /* 0x44 TW: Non-BIOS, new */
+-      {0x00c7,0x45,0x57,0x00,0x39, 848, 480,0x0000}, /* 0x45 TW: 848x480-38Hzi - Non-BIOS, new */
+-      {0xc047,0x46,0x55,0x00,0x39, 848, 480,0x0000}, /* 0x46 TW: 848x480-60Hz  - Non-BIOS, new */
+-      {0x00c7,0x47,0x57,0x00,0x3f, 856, 480,0x0000}, /* 0x47 TW: 856x480-38Hzi - Non-BIOS, new */
+-      {0xc047,0x48,0x57,0x00,0x3f, 856, 480,0x0000}, /* 0x48 TW: 856x480-60Hz  - Non-BIOS, new */
+-      {0x0047,0x49,0x58,0x00,0x48,1360, 768,0x0000}, /* 0x49 TW: 1360x768-60Hz - Non-BIOS, new */
+-      {0xffff,0x00,0x00,0x00,0x00,   0,   0,0x0000}
+-}; 
++      {0x085f,0x0d,0x03,0x05,0x6a, 800, 600}, /* 0x0 */
++      {0x0467,0x0e,0x04,0x05,0x6a, 800, 600}, /* 0x1 */
++      {0x0067,0x0f,0x08,0x48,0x6a, 800, 600}, /* 0x2 */
++      {0x0067,0x10,0x07,0x8b,0x6a, 800, 600}, /* 0x3 */
++      {0x0147,0x11,0x0a,0x00,0x6a, 800, 600}, /* 0x4 */
++      {0x0147,0x12,0x0d,0x00,0x6a, 800, 600}, /* 0x5 - TW: Test sync change */
++      {0x0047,0x13,0x13,0x00,0x6a, 800, 600}, /* 0x6 */
++      {0x0047,0x14,0x1c,0x00,0x6a, 800, 600}, /* 0x7 */
++      {0xc85f,0x05,0x00,0x04,0x2e, 640, 480}, /* 0x8 */
++      {0xc067,0x06,0x02,0x04,0x2e, 640, 480}, /* 0x9 */
++      {0xc067,0x07,0x02,0x47,0x2e, 640, 480}, /* 0xa */
++      {0xc067,0x08,0x03,0x8a,0x2e, 640, 480}, /* 0xb */
++      {0xc047,0x09,0x05,0x00,0x2e, 640, 480}, /* 0xc */
++      {0xc047,0x0a,0x09,0x00,0x2e, 640, 480}, /* 0xd */
++      {0xc047,0x0b,0x0e,0x00,0x2e, 640, 480}, /* 0xe */
++      {0xc047,0x0c,0x15,0x00,0x2e, 640, 480}, /* 0xf */
++      {0x407f,0x04,0x00,0x00,0x2f, 640, 400}, /* 0x10 */
++      {0xc00f,0x3c,0x01,0x06,0x31, 720, 480}, /* 0x11 */
++      {0x000f,0x3d,0x03,0x06,0x32, 720, 576}, /* 0x12 */
++      {0x0187,0x15,0x06,0x00,0x37,1024, 768}, /* 0x13 */
++      {0xc877,0x16,0x0b,0x06,0x37,1024, 768}, /* 0x14 */
++      {0xc067,0x17,0x0f,0x49,0x37,1024, 768}, /* 0x15 */
++      {0x0267,0x18,0x11,0x00,0x37,1024, 768}, /* 0x16 */
++      {0x0047,0x19,0x16,0x8c,0x37,1024, 768}, /* 0x17 */
++      {0x0047,0x1a,0x1b,0x00,0x37,1024, 768}, /* 0x18 */
++      {0x0007,0x1b,0x1f,0x00,0x37,1024, 768}, /* 0x19 */
++      {0x0387,0x1c,0x11,0x00,0x3a,1280,1024}, /* 0x1a */
++      {0x0077,0x1d,0x19,0x07,0x3a,1280,1024}, /* 0x1b */
++      {0x0047,0x1e,0x1e,0x00,0x3a,1280,1024}, /* 0x1c */
++      {0x0007,0x1f,0x20,0x00,0x3a,1280,1024}, /* 0x1d */
++      {0x0867,0x20,0x21,0x09,0x3c,1600,1200}, /* 0x1e */
++      {0x0007,0x21,0x22,0x00,0x3c,1600,1200}, /* 0x1f */
++      {0x0007,0x22,0x23,0x00,0x3c,1600,1200}, /* 0x20 */
++      {0x0007,0x23,0x25,0x00,0x3c,1600,1200}, /* 0x21 */
++      {0x0007,0x24,0x26,0x00,0x3c,1600,1200}, /* 0x22 */
++      {0x0007,0x25,0x2c,0x00,0x3c,1600,1200}, /* 0x23 */
++      {0x0007,0x26,0x34,0x00,0x3c,1600,1200}, /* 0x24 */
++      {0x407f,0x00,0x00,0x00,0x40, 320, 200}, /* 0x25 */
++      {0xc07f,0x01,0x00,0x04,0x50, 320, 240}, /* 0x26 */
++      {0x007f,0x02,0x04,0x05,0x51, 400, 300}, /* 0x27 */
++      {0xc077,0x03,0x0b,0x06,0x52, 512, 384}, /* 0x28 */
++      {0x8007,0x27,0x27,0x00,0x68,1920,1440}, /* 0x29 */
++      {0x4007,0x28,0x29,0x00,0x68,1920,1440}, /* 0x2a */
++      {0x4007,0x29,0x2e,0x00,0x68,1920,1440}, /* 0x2b */
++      {0x4007,0x2a,0x30,0x00,0x68,1920,1440}, /* 0x2c */
++      {0x4007,0x2b,0x35,0x00,0x68,1920,1440}, /* 0x2d */
++      {0x4005,0x2c,0x39,0x00,0x68,1920,1440}, /* 0x2e */
++      {0x4007,0x2d,0x2b,0x00,0x6c,2048,1536}, /* 0x2f */
++      {0x4007,0x2e,0x31,0x00,0x6c,2048,1536}, /* 0x30 */
++      {0x4007,0x2f,0x33,0x00,0x6c,2048,1536}, /* 0x31 */
++      {0x4007,0x30,0x37,0x00,0x6c,2048,1536}, /* 0x32 */
++      {0x4005,0x31,0x38,0x00,0x6c,2048,1536}, /* 0x33 */
++      {0x0057,0x32,0x40,0x08,0x70, 800, 480}, /* 0x34 */
++      {0x0047,0x33,0x07,0x08,0x70, 800, 480}, /* 0x35 */
++      {0x0047,0x34,0x0a,0x08,0x70, 800, 480}, /* 0x36 */
++      {0x0057,0x35,0x0b,0x09,0x71,1024, 576}, /* 0x37 */
++      {0x0047,0x36,0x11,0x09,0x71,1024, 576}, /* 0x38 */
++      {0x0047,0x37,0x16,0x09,0x71,1024, 576}, /* 0x39 */
++      {0x0057,0x38,0x19,0x0a,0x75,1280, 720}, /* 0x3a */
++      {0x0047,0x39,0x1e,0x0a,0x75,1280, 720}, /* 0x3b */
++      {0x0007,0x3a,0x20,0x0a,0x75,1280, 720}, /* 0x3c */
++      {0x0067,0x3b,0x19,0x08,0x7c,1280, 960}, /* 0x3d */
++      {0x0027,0x4c,0x59,0x08,0x7c,1280, 960}, /* 0x3e */
++      {0xc07f,0x4e,0x00,0x06,0x5a, 320, 240}, /* 0x3f */    /* FSTN 320x240 */
++        {0x0077,0x42,0x5b,0x08,0x23,1280, 768}, /* 0x40 */    /* TW: 0x5b was 0x12 */
++      {0x0067,0x43,0x4d,0x08,0x26,1400,1050}, /* 0x41 */
++      {0x0007,0x4b,0x5a,0x08,0x26,1400,1050}, /* 0x42 TW: not in any BIOS */
++      {0x0047,0x44,0x19,0x00,0x29,1152, 864}, /* 0x43 TW: Non-BIOS, new */
++      {0x0047,0x4a,0x1e,0x00,0x29,1152, 864}, /* 0x44 TW: Non-BIOS, new */
++      {0x00c7,0x45,0x57,0x00,0x39, 848, 480}, /* 0x45 TW: 848x480-38Hzi - Non-BIOS, new */
++      {0xc047,0x46,0x55,0x00,0x39, 848, 480}, /* 0x46 TW: 848x480-60Hz  - Non-BIOS, new */
++      {0x00c7,0x47,0x57,0x00,0x3f, 856, 480}, /* 0x47 TW: 856x480-38Hzi - Non-BIOS, new */
++      {0xc047,0x48,0x57,0x00,0x3f, 856, 480}, /* 0x48 TW: 856x480-60Hz  - Non-BIOS, new */
++      {0x0047,0x49,0x58,0x00,0x48,1360, 768}, /* 0x49 TW: 1360x768-60Hz - Non-BIOS, new */
++      {0x000f,0x4d,0x03,0x06,0x5f, 768, 576}, /* 0x4a TW: 768x576 */
++      {0xffff,0x00,0x00,0x00,0x00,   0,   0}
++};
+ typedef struct _SiS310_CRT1TableStruct
+ {
+@@ -710,7 +277,7 @@ static const SiS310_CRT1TableStruct SiS3
+  {{0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
+    0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x05,
+    0x00}}, /* 0x4 */
+-#if 0   
++#if 0
+  {{0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
+    0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x05,
+    0x00}}, /* 0x5 */
+@@ -940,19 +507,25 @@ static const SiS310_CRT1TableStruct SiS3
+    0x00}},  /* 0x4b */ 
+  {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0xf1,0xff, /* TW: New, 1280x960-85, not in any BIOS */
+    0xc0,0x83,0xbf,0xbf,0xf2,0x10,0x00,0x07,
+-   0x01}}   /* 0x4c */
++   0x01}},  /* 0x4c */
++ {{0x7b,0x5f,0x63,0x9f,0x6a,0x93,0x6f,0xf0, /* 768x576 */
++   0x58,0x8a,0x3f,0x57,0x70,0x20,0x00,0x05,
++   0x01}},  /* 0x4d */
++ {{0x2d,0x27,0x28,0x90,0x2c,0x80,0x0b,0x3e, /* FSTN 320x480, TEMP - possibly invalid */
++   0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}   /* 0x4e */
+ };
+-
+ typedef struct _SiS310_MCLKDataStruct
+ {
+       UCHAR SR28,SR29,SR2A;
+       USHORT CLOCK;
+ } SiS310_MCLKDataStruct;
++#ifdef LINUXBIOS
+ static const SiS310_MCLKDataStruct SiS310_MCLKData_0_315[] =
+ {
+-      { 0x3b,0x22,0x01,143},   /* TW: Was { 0x5c,0x23,0x01,166}, */
++      { 0x3b,0x22,0x01,143},
+       { 0x5c,0x23,0x01,166},
+       { 0x5c,0x23,0x01,166},
+       { 0x5c,0x23,0x01,166},
+@@ -962,7 +535,7 @@ static const SiS310_MCLKDataStruct SiS31
+       { 0x5c,0x23,0x01,166}
+ };
+-static const SiS310_MCLKDataStruct SiS310_MCLKData_0_650[] =  /* @ 0x54 */
++static const SiS310_MCLKDataStruct SiS310_MCLKData_0_650[] =
+ {
+       { 0x5a,0x64,0x82, 66},
+       { 0xb3,0x45,0x82, 83},
+@@ -973,8 +546,22 @@ static const SiS310_MCLKDataStruct SiS31
+       { 0x37,0x22,0x82,133},
+       { 0x37,0x22,0x82,133}
+ };
++#endif
++
++static const SiS310_MCLKDataStruct SiS310_MCLKData_0_330[] =
++{
++      { 0x5c,0x23,0x01,166},
++      { 0x5c,0x23,0x01,166},
++      { 0x7c,0x08,0x01,200},
++      { 0x79,0x06,0x01,250},
++      { 0x7c,0x08,0x01,200},
++      { 0x7c,0x08,0x01,200},
++      { 0x7c,0x08,0x01,200},
++      { 0x79,0x06,0x01,250}
++};
+-static const SiS310_MCLKDataStruct SiS310_MCLKData_0_330[] =   /* @ 0x54 */
++#ifdef LINUXBIOS
++static const SiS310_MCLKDataStruct SiS310_MCLKData_0_660[] =  /* TODO */
+ {
+       { 0x5c,0x23,0x01,166},
+       { 0x5c,0x23,0x01,166},
+@@ -985,8 +572,9 @@ static const SiS310_MCLKDataStruct SiS31
+       { 0x7c,0x08,0x01,200},
+       { 0x79,0x06,0x01,250}
+ };
++#endif
+-static const SiS310_MCLKDataStruct SiS310_MCLKData_1[] =      /* @ 0x155 */
++static const SiS310_MCLKDataStruct SiS310_MCLKData_1[] =
+ {
+         { 0x29,0x21,0x82,150},
+       { 0x5c,0x23,0x82,166},
+@@ -998,6 +586,7 @@ static const SiS310_MCLKDataStruct SiS31
+       { 0x37,0x22,0x82,133}
+ };
++#ifdef LINUXBIOS
+ typedef struct _SiS310_ECLKDataStruct
+ {
+       UCHAR SR2E,SR2F,SR30;
+@@ -1011,6 +600,7 @@ static const SiS310_ECLKDataStruct SiS31
+       { 0x5c,0x23,0x01,166},
+       { 0x5c,0x23,0x01,166}
+ };
++#endif
+ typedef struct _SiS310_VCLKDataStruct
+ {
+@@ -1020,22 +610,22 @@ typedef struct _SiS310_VCLKDataStruct
+ static const SiS310_VCLKDataStruct SiS310_VCLKData[]=
+ {
+-      { 0x1b,0xe1, 25}, /* 0x0 */   /* 650/LVDS BIOS: @ 0x5647 */
+-      { 0x4e,0xe4, 28}, /* 0x1 */
+-      { 0x57,0xe4, 31}, /* 0x2 */
+-      { 0xc3,0xc8, 36}, /* 0x3 */
+-      { 0x42,0xe2, 40}, /* 0x4 */
+-      { 0xfe,0xcd, 43}, /* 0x5 */
+-      { 0x5d,0xc4, 44}, /* 0x6 */
+-      { 0x52,0xe2, 49}, /* 0x7 */
+-      { 0x53,0xe2, 50}, /* 0x8 */
+-      { 0x74,0x67, 52}, /* 0x9 */
+-      { 0x6d,0x66, 56}, /* 0xa */
+-      { 0x5a,0x64, 65}, /* 0xb */   /* TW: was 6c c3 - WRONG */
+-      { 0x46,0x44, 67}, /* 0xc */
+-      { 0xb1,0x46, 68}, /* 0xd */
+-      { 0xd3,0x4a, 72}, /* 0xe */
+-      { 0x29,0x61, 75}, /* 0xf */
++      { 0x1b,0xe1, 25}, /* 0x00 */
++      { 0x4e,0xe4, 28}, /* 0x01 */
++      { 0x57,0xe4, 31}, /* 0x02 */
++      { 0xc3,0xc8, 36}, /* 0x03 */
++      { 0x42,0xe2, 40}, /* 0x04 */
++      { 0xfe,0xcd, 43}, /* 0x05 */
++      { 0x5d,0xc4, 44}, /* 0x06 */
++      { 0x52,0xe2, 49}, /* 0x07 */
++      { 0x53,0xe2, 50}, /* 0x08 */
++      { 0x74,0x67, 52}, /* 0x09 */
++      { 0x6d,0x66, 56}, /* 0x0a */
++      { 0x5a,0x64, 65}, /* 0x0b */  /* TW: was 6c c3 - WRONG */
++      { 0x46,0x44, 67}, /* 0x0c */
++      { 0xb1,0x46, 68}, /* 0x0d */
++      { 0xd3,0x4a, 72}, /* 0x0e */
++      { 0x29,0x61, 75}, /* 0x0f */
+       { 0x6e,0x46, 76}, /* 0x10 */
+       { 0x2b,0x61, 78}, /* 0x11 */
+       { 0x31,0x42, 79}, /* 0x12 */
+@@ -1045,7 +635,7 @@ static const SiS310_VCLKDataStruct SiS31
+       { 0x62,0x44, 94}, /* 0x16 */
+       { 0x2b,0x41,104}, /* 0x17 */
+       { 0x3a,0x23,105}, /* 0x18 */
+-      { 0x70,0x44,108}, /* 0x19 */
++      { 0x70,0x44,108}, /* 0x19 */  /* 1400x1050 LCD */
+       { 0x3c,0x23,109}, /* 0x1a */
+       { 0x5e,0x43,113}, /* 0x1b */
+       { 0xbc,0x44,116}, /* 0x1c */
+@@ -1078,12 +668,12 @@ static const SiS310_VCLKDataStruct SiS31
+       { 0xea,0x08,340}, /* 0x37 */
+       { 0xe8,0x07,376}, /* 0x38 */
+       { 0xde,0x06,389}, /* 0x39 */
+-      { 0x52,0x2a, 54}, /* 0x3a */
+-      { 0x52,0x6a, 27}, /* 0x3b */
+-      { 0x62,0x24, 70}, /* 0x3c */
+-      { 0x62,0x64, 70}, /* 0x3d */
+-      { 0xa8,0x4c, 30}, /* 0x3e */
+-      { 0x20,0x26, 33}, /* 0x3f */
++      { 0x52,0x2a, 54}, /* 0x3a */  /* 301 TV */
++      { 0x52,0x6a, 27}, /* 0x3b */  /* 301 TV */
++      { 0x62,0x24, 70}, /* 0x3c */  /* 301 TV */
++      { 0x62,0x64, 70}, /* 0x3d */  /* 301 TV */
++      { 0xa8,0x4c, 30}, /* 0x3e */  /* 301 TV */
++      { 0x20,0x26, 33}, /* 0x3f */  /* 301 TV */
+       { 0x31,0xc2, 39}, /* 0x40 */
+       { 0x60,0x36, 30}, /* 0x41 */  /* Chrontel */
+       { 0x40,0x4a, 28}, /* 0x42 */  /* Chrontel */
+@@ -1096,7 +686,7 @@ static const SiS310_VCLKDataStruct SiS31
+       { 0xce,0x3c, 39}, /* 0x49 */
+       { 0x52,0x4a, 36}, /* 0x4a */  /* Chrontel */
+       { 0x34,0x61, 95}, /* 0x4b */
+-      { 0x78,0x27,108}, /* 0x4c - was 102 */  /* TW: Last entry in 650/301 BIOS */
++      { 0x78,0x27,108}, /* 0x4c - was 102 */
+       { 0x66,0x43,123}, /* 0x4d */  /* Modes 0x26-0x28 (1400x1050) */
+       { 0x41,0x4e, 21}, /* 0x4e */
+       { 0xa1,0x4a, 29}, /* 0x4f */  /* Chrontel */
+@@ -1110,7 +700,8 @@ static const SiS310_VCLKDataStruct SiS31
+       { 0xbf,0xc8, 35}, /* 0x57 - added for 856x480-38i,60 (not in any BIOS) */
+       { 0x30,0x23, 88}, /* 0x58 - added for 1360x768-62 (is 60Hz!) (not in any BIOS) */
+       { 0x52,0x07,149}, /* 0x59 - added for 1280x960-85 (Not in any BIOS) */
+-      { 0x56,0x07,156}  /* 0x5a - added for 1400x1050-75 */
++      { 0x56,0x07,156}, /* 0x5a - added for 1400x1050-75 */
++      { 0x70,0x29, 81}  /* 0x5b */  /* 1280x768 LCD */
+ };
+ typedef struct _SiS310_VBVCLKDataStruct
+@@ -1121,22 +712,22 @@ typedef struct _SiS310_VBVCLKDataStruct
+ static const SiS310_VBVCLKDataStruct SiS310_VBVCLKData[]=
+ {
+-      { 0x1b,0xe1, 25}, /* 0x0 */   /* 650/LVDS BIOS: @ 0x579c */
+-      { 0x4e,0xe4, 28}, /* 0x1 */
+-      { 0x57,0xe4, 31}, /* 0x2 */
+-      { 0xc3,0xc8, 36}, /* 0x3 */
+-      { 0x42,0x47, 40}, /* 0x4 */
+-      { 0xfe,0xcd, 43}, /* 0x5 */
+-      { 0x5d,0xc4, 44}, /* 0x6 */
+-      { 0x52,0x47, 49}, /* 0x7 */
+-      { 0x53,0x47, 50}, /* 0x8 */
+-      { 0x74,0x67, 52}, /* 0x9 */
+-      { 0x6d,0x66, 56}, /* 0xa */
+-      { 0x35,0x62, 65}, /* 0xb */  /* Was 0x5a,0x64 - 650/LVDS+301 bios: 35,62  */
+-      { 0x46,0x44, 67}, /* 0xc */
+-      { 0xb1,0x46, 68}, /* 0xd */
+-      { 0xd3,0x4a, 72}, /* 0xe */
+-      { 0x29,0x61, 75}, /* 0xf */
++      { 0x1b,0xe1, 25}, /* 0x00 */
++      { 0x4e,0xe4, 28}, /* 0x01 */
++      { 0x57,0xe4, 31}, /* 0x02 */
++      { 0xc3,0xc8, 36}, /* 0x03 */
++      { 0x42,0x47, 40}, /* 0x04 */
++      { 0xfe,0xcd, 43}, /* 0x05 */
++      { 0x5d,0xc4, 44}, /* 0x06 */
++      { 0x52,0x47, 49}, /* 0x07 */
++      { 0x53,0x47, 50}, /* 0x08 */
++      { 0x74,0x67, 52}, /* 0x09 */
++      { 0x6d,0x66, 56}, /* 0x0a */
++      { 0x35,0x62, 65}, /* 0x0b */  /* Was 0x5a,0x64 - 650/LVDS+301 bios: 35,62  */
++      { 0x46,0x44, 67}, /* 0x0c */
++      { 0xb1,0x46, 68}, /* 0x0d */
++      { 0xd3,0x4a, 72}, /* 0x0e */
++      { 0x29,0x61, 75}, /* 0x0f */
+       { 0x6d,0x46, 75}, /* 0x10 */
+       { 0x41,0x43, 78}, /* 0x11 */
+       { 0x31,0x42, 79}, /* 0x12 */
+@@ -1146,7 +737,7 @@ static const SiS310_VBVCLKDataStruct SiS
+       { 0x62,0x44, 94}, /* 0x16 */
+       { 0x2b,0x22,104}, /* 0x17 */
+       { 0x49,0x24,105}, /* 0x18 */
+-      { 0xf8,0x2f,108}, /* 0x19 */
++      { 0xf8,0x2f,108}, /* 0x19 */  /* 1400x1050 LCD */
+       { 0x3c,0x23,109}, /* 0x1a */
+       { 0x5e,0x43,113}, /* 0x1b */
+       { 0xbc,0x44,116}, /* 0x1c */
+@@ -1179,19 +770,19 @@ static const SiS310_VBVCLKDataStruct SiS
+       { 0xea,0x08,340}, /* 0x37 */
+       { 0xe8,0x07,376}, /* 0x38 */
+       { 0xde,0x06,389}, /* 0x39 */
+-      { 0x52,0x2a, 54}, /* 0x3a */
+-      { 0x52,0x6a, 27}, /* 0x3b */
+-      { 0x62,0x24, 70}, /* 0x3c */
+-      { 0x62,0x64, 70}, /* 0x3d */
+-      { 0xa8,0x4c, 30}, /* 0x3e */
+-      { 0x20,0x26, 33}, /* 0x3f */
++      { 0x52,0x2a, 54}, /* 0x3a */  /* 301 TV */
++      { 0x52,0x6a, 27}, /* 0x3b */  /* 301 TV */
++      { 0x62,0x24, 70}, /* 0x3c */  /* 301 TV */
++      { 0x62,0x64, 70}, /* 0x3d */  /* 301 TV */
++      { 0xa8,0x4c, 30}, /* 0x3e */  /* 301 TV */
++      { 0x20,0x26, 33}, /* 0x3f */  /* 301 TV */
+       { 0x31,0xc2, 39}, /* 0x40 */
+-      { 0x2e,0x48, 25}, /* 0x41 */
+-      { 0x24,0x46, 25}, /* 0x42 */
+-      { 0x26,0x64, 28}, /* 0x43 */
+-      { 0x37,0x64, 40}, /* 0x44 */
+-      { 0xa1,0x42,108}, /* 0x45 */
+-      { 0x37,0x61,100}, /* 0x46 */
++      { 0x2e,0x48, 25}, /* 0x41 */  /* Replacement for LCD on 315 for index 0 */
++      { 0x24,0x46, 25}, /* 0x42 */  /* Replacement for LCD on 315 for modes 0x01, 0x03, 0x0f, 0x10, 0x12 */
++      { 0x26,0x64, 28}, /* 0x43 */  /* Replacement for LCD on 315 for index 1 */
++      { 0x37,0x64, 40}, /* 0x44 */  /* Replacement for LCD on 315 for index 4 */
++      { 0xa1,0x42,108}, /* 0x45 */  /* 1280x960 LCD */
++      { 0x37,0x61,100}, /* 0x46 */  /* 1280x960 LCD */
+       { 0x78,0x27,108}, /* 0x47 */
+       { 0x97,0x2c, 26}, /* 0x48 */  /* UNUSED - Entries from here new, not in any BIOS */
+       { 0xce,0x3c, 39}, /* 0x49 */  /* UNUSED */
+@@ -1211,72 +802,17 @@ static const SiS310_VBVCLKDataStruct SiS
+       { 0xbf,0xc8, 35}, /* 0x57 */  /* 856x480-38i,60  */
+       { 0x30,0x23, 88}, /* 0x58 */  /* 1360x768-62 (is 60Hz!) TEMP, UNUSED */
+       { 0x52,0x07,149}, /* 0x59 */  /* 1280x960-85  - UNUSED */
+-      { 0x56,0x07,156}  /* 0x5a */  /* 1400x1050-75 - UNUSED */
++      { 0x56,0x07,156}, /* 0x5a */  /* 1400x1050-75 - UNUSED */
++      { 0x70,0x29, 81}  /* 0x5b */  /* 1280x768 LCD */
+ };
+ static const UCHAR SiS310_ScreenOffset[] = 
+ {
+         0x14,0x19,0x20,0x28,0x32,0x40,0x50,0x64,
+-      0x78,0x80,0x2d,0x35,0x57,0x48,0x55,
++      0x78,0x80,0x2d,0x35,0x57,0x48,0x55,0x30,
+       0xff
+-};      /* TW: Added 1400x1050, 1152x864, 848/856x480, 1360x768 */
+-
+-typedef struct _SiS310_StResInfoStruct
+-{
+-      USHORT HTotal;
+-      USHORT VTotal;
+-} SiS310_StResInfoStruct;
+-
+-static const SiS310_StResInfoStruct SiS310_StResInfo[]=
+-{
+-      { 640,400},
+-      { 640,350},
+-      { 720,400},
+-      { 720,350},
+-      { 640,480}
+-};
+-
+-typedef struct _SiS310_ModeResInfoStruct
+-{
+-      USHORT HTotal;
+-      USHORT VTotal;
+-      UCHAR  XChar;
+-      UCHAR  YChar;
+-} SiS310_ModeResInfoStruct;
+-
+-static const SiS310_ModeResInfoStruct SiS310_ModeResInfo[] =
+-{
+-      {  320, 200, 8, 8},   /* 0x00 */
+-      {  320, 240, 8, 8},   /* 0x01 */
+-      {  320, 400, 8, 8},   /* 0x02 */
+-      {  400, 300, 8, 8},   /* 0x03 */
+-      {  512, 384, 8, 8},   /* 0x04 */
+-      {  640, 400, 8,16},   /* 0x05 */
+-      {  640, 480, 8,16},   /* 0x06 */
+-      {  800, 600, 8,16},   /* 0x07 */
+-      { 1024, 768, 8,16},   /* 0x08 */
+-      { 1280,1024, 8,16},   /* 0x09 */
+-      { 1600,1200, 8,16},   /* 0x0a */
+-      { 1920,1440, 8,16},   /* 0x0b */
+-      { 2048,1536, 8,16},   /* 0x0c */
+-      {  720, 480, 8,16},   /* 0x0d */
+-      {  720, 576, 8,16},   /* 0x0e */
+-      { 1280, 960, 8,16},   /* 0x0f */
+-      {  800, 480, 8,16},   /* 0x10 */
+-      { 1024, 576, 8,16},   /* 0x11 */
+-      { 1280, 720, 8,16},   /* 0x12 */
+-      {  856, 480, 8,16},   /* 0x13 - TW: New, not in any BIOS */
+-      { 1280, 768, 8,16},   /* 0x14 20; TW: New */
+-      { 1400,1050, 8,16},   /* 0x15 21; TW: New */
+-      { 1152, 864, 8,16},   /* 0x16 - TW: New, not in any BIOS */
+-      {  848, 480, 8,16},   /* 0x17 - TW: New, not in any BIOS */
+-      { 1360, 768, 8,16}    /* 0x18 - TW: New, not in any BIOS */
+ };
+-static const UCHAR SiS310_OutputSelect = 0x40;
+-
+-static const UCHAR SiS310_SoftSetting  = 0x30;   /* TW: RAM setting */
+-
+ static const UCHAR SiS310_SR15[8][4]={
+       {0x00,0x04,0x60,0x60},
+       {0x0f,0x0f,0x0f,0x0f},
+@@ -1322,16 +858,6 @@ static const USHORT SiS310_VideoSenseDat
+ static const USHORT SiS310_YCSenseData2    = 0x016b;
+ #endif
+-static const UCHAR SiS310_NTSCPhase[]    = {0x21,0xed,0xba,0x08};  /* TW: Was {0x21,0xed,0x8a,0x08}; */
+-static const UCHAR SiS310_PALPhase[]     = {0x2a,0x05,0xe3,0x00};  /* TW: Was {0x2a,0x05,0xd3,0x00}; */
+-static const UCHAR SiS310_PALMPhase[]    = {0x21,0xE4,0x2E,0x9B};  /* TW: palm*/
+-static const UCHAR SiS310_PALNPhase[]    = {0x21,0xF4,0x3E,0xBA};  /* TW: paln*/
+-static const UCHAR SiS310_NTSCPhase2[]   = {0x21,0xF0,0x7B,0xD6};
+-static const UCHAR SiS310_PALPhase2[]    = {0x2a,0x09,0x86,0xe9};
+-static const UCHAR SiS310_PALMPhase2[]   = {0x21,0xE6,0xEF,0xA4};  /* TW: palm 301b*/
+-static const UCHAR SiS310_PALNPhase2[]   = {0x21,0xF6,0x94,0x46};  /* TW: paln 301b*/
+-static const UCHAR SiS310_SpecialPhase[] = {0x1e,0x8c,0x5c,0x7a};
+-
+ typedef struct _SiS310_LCDDataStruct
+ {
+       USHORT RVBHCMAX;
+@@ -1353,25 +879,6 @@ static const SiS310_LCDDataStruct  SiS31
+       {    1,   1,1344, 806,1344, 806}
+ };
+-#if 0   /* Seems out-dated, all BIOSes since 03/27/2002 have the other version */
+-static const SiS310_LCDDataStruct  SiS310_ExtLCD1024x768Data[] = 
+-{
+-      {   12,   5, 896, 512,1344, 806},
+-      {   12,   5, 896, 510,1344, 806},
+-      {   32,  15,1008, 505,1344, 806},
+-      {   32,  15,1008, 514,1344, 806},
+-      {   12,   5, 896, 500,1344, 806},
+-      {   42,  25,1024, 625,1344, 806},
+-      {    1,   1,1344, 806,1344, 806},
+-      {   12,   5, 896, 500,1344, 806},
+-      {   42,  25,1024, 625,1344, 806},
+-      {    1,   1,1344, 806,1344, 806},
+-      {   12,   5, 896, 500,1344, 806},
+-      {   42,  25,1024, 625,1344, 806},
+-      {    1,   1,1344, 806,1344, 806}
+-};
+-#endif
+-
+ static const SiS310_LCDDataStruct  SiS310_ExtLCD1024x768Data[] =   
+ {
+       {   42,  25,1536, 419,1344, 806},
+@@ -1463,272 +970,14 @@ static const SiS310_LCDDataStruct  SiS31
+       {    1,   1,1688,1066,1688,1066}
+ };
+-static const SiS310_LCDDataStruct  SiS310_LCD1280x960Data[] =
+-{
+-      {    9,   2, 800, 500,1800,1000},
+-      {    9,   2, 800, 500,1800,1000},
+-      {    4,   1, 900, 500,1800,1000},
+-      {    4,   1, 900, 500,1800,1000},
+-      {    9,   2, 800, 500,1800,1000},
+-      {   30,  11,1056, 625,1800,1000},
+-      {    5,   3,1350, 800,1800,1000},
+-      {    1,   1,1576,1050,1576,1050},
+-      {    1,   1,1800,1000,1800,1000}
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_StLCD1400x1050Data[] = 
+-{  /* TW: New from 1.11.6s */
+-      { 211,  100, 2100,  408, 1688, 1066 },
+-      { 211,   64, 1536,  358, 1688, 1066 },
+-      { 211,  100, 2100,  408, 1688, 1066 },
+-      { 211,   64, 1536,  358, 1688, 1066 },
+-      { 211,   48,  840,  488, 1688, 1066 },
+-      { 211,   72, 1008,  609, 1688, 1066 },
+-      { 211,  128, 1400,  776, 1688, 1066 },
+-      { 211,  205, 1680, 1041, 1688, 1066 },
+-      {   1,    1, 1688, 1066, 1688, 1066 }
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_ExtLCD1400x1050Data[] = 
+-{  /* TW: New from 1.11.6s */
+-      { 211,  100, 2100,  408, 1688, 1066 },
+-      { 211,   64, 1536,  358, 1688, 1066 },
+-      { 211,  100, 2100,  408, 1688, 1066 },
+-      { 211,   64, 1536,  358, 1688, 1066 },
+-      { 211,   48,  840,  488, 1688, 1066 },
+-      { 211,   72, 1008,  609, 1688, 1066 },
+-      { 211,  128, 1400,  776, 1688, 1066 },
+-      { 211,  205, 1680, 1041, 1688, 1066 },
+-      {   1,    1, 1688, 1066, 1688, 1066 }
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_NoScaleData1400x1050[] = 
+-{  /* TW: To be checked (BIOS uses 1280x1024 data, one line too short) */
+-      { 1, 1, 1688, 1066, 1688, 1066 },
+-      { 1, 1, 1688, 1066, 1688, 1066 },
+-      { 1, 1, 1688, 1066, 1688, 1066 },
+-      { 1, 1, 1688, 1066, 1688, 1066 },
+-      { 1, 1, 1688, 1066, 1688, 1066 },
+-      { 1, 1, 1688, 1066, 1688, 1066 },
+-      { 1, 1, 1688, 1066, 1688, 1066 },
+-      { 1, 1, 1688, 1066, 1688, 1066 },
+-      { 1, 1, 1688, 1066, 1688, 1066 }
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_StLCD1600x1200Data[] = 
+-{  /* TODO */
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_ExtLCD1600x1200Data[] = 
+-{  /* TODO */
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-static const SiS310_LCDDataStruct  SiS310_NoScaleData1600x1200[] = 
+-{  /* TODO */
+-      {    0,   0,   0,   0,   0,   0}
+-};
+-
+-typedef struct _SiS310_TVDataStruct
+-{
+-      USHORT RVBHCMAX;
+-      USHORT RVBHCFACT;
+-      USHORT VGAHT;
+-      USHORT VGAVT;
+-      USHORT TVHDE;
+-      USHORT TVVDE;
+-      USHORT RVBHRS;
+-      UCHAR FlickerMode;
+-      USHORT HALFRVBHRS;
+-      UCHAR RY1COE;
+-      UCHAR RY2COE;
+-      UCHAR RY3COE;
+-      UCHAR RY4COE;
+-} SiS310_TVDataStruct;
+-
+-static const SiS310_TVDataStruct  SiS310_StPALData[]=
+-{
+- {    1,   1, 864, 525,1270, 400, 100,   0, 760,0xf4,0xff,0x1c,0x22},
+- {    1,   1, 864, 525,1270, 350, 100,   0, 760,0xf4,0xff,0x1c,0x22},
+- {    1,   1, 864, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
+- {    1,   1, 864, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
+- {    1,   1, 864, 525,1270, 480,  50,   0, 760,0xf4,0xff,0x1c,0x22},
+- {    1,   1, 864, 525,1270, 600,  50,   0,   0,0xf4,0xff,0x1c,0x22}
+-};
+-
+-static const SiS310_TVDataStruct  SiS310_ExtPALData[] =   
+-{
+- {   27,  10, 848, 448,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
+- {  108,  35, 848, 398,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
+- {   12,   5, 954, 448,1270, 530,  50,   0,  50,0xf1,0x04,0x1f,0x18},
+- {    9,   4, 960, 463,1644, 438,  50,   0,  50,0xf4,0x0b,0x1c,0x0a},
+- {    9,   4, 848, 528,1270, 530,   0,   0,  50,0xf5,0xfb,0x1b,0x2a},  /* 640x480 */
+- {   36,  25,1060, 648,1316, 530, 438,   0, 438,0xeb,0x05,0x25,0x16},  /* 800x600 */
+- {    3,   2,1080, 619,1270, 540, 438,   0, 438,0xf3,0x00,0x1d,0x20},  /* 720x480/576 */
+- {    1,   1,1170, 821,1270, 520, 686,   0, 686,0xF3,0x00,0x1D,0x20}   /* 1024x768 */
+-};
+-
+-static const SiS310_TVDataStruct  SiS310_StNTSCData[]=
+-{
+- {    1,   1, 858, 525,1270, 400,  50,   0, 760,0xf1,0x04,0x1f,0x18},
+- {    1,   1, 858, 525,1270, 350,  50,   0, 640,0xf1,0x04,0x1f,0x18},
+- {    1,   1, 858, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
+- {    1,   1, 858, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
+- {    1,   1, 858, 525,1270, 480,   0,   0, 760,0xf1,0x04,0x1f,0x18}
+-};
+-
+-static const SiS310_TVDataStruct  SiS310_ExtNTSCData[]=
+-{
+- {  143,  65, 858, 443,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
+- {   88,  35, 858, 393,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
+- {  143,  70, 924, 443,1270, 440,  92,   0,  92,0xf1,0x04,0x1f,0x18},
+- {  143,  70, 924, 393,1270, 440,  92,   0,  92,0xf4,0x0b,0x1c,0x0a},
+- {  143,  76, 836, 523,1270, 440, 224,   0,   0,0xf1,0x05,0x1f,0x16},  /* 640x480 */
+- {  143, 120,1056, 643,1270, 440,   0, 128,   0,0xf4,0x10,0x1c,0x00},  /* 800x600  */
+- {    2,   1, 858, 503,1270, 480,   0, 128,   0,0xee,0x0c,0x22,0x08},  /* 720x480/576 */
+- {   65,  64,1056, 791,1270, 480, 638,   0,   0,0xEE,0x0C,0x22,0x08}   /* 1024x768 */
+-};
+-
+-#if 0
+-static const SiS310_TVDataStruct  SiS310_St1HiTVData[]=
+-{
+-  
+-};
+-#endif
+-
+-static const SiS310_TVDataStruct  SiS310_St2HiTVData[]=
+-{
+- {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    1,   1, 0x37c,0x233,0x2b2,0x2bc,          0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    1,   1, 0x3e8,0x233,0x311,0x2bc,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   2, 0x348,0x233,0x670,0x3c0,0x08d,128, 0, 0x00,0x00,0x00,0x00},
+- {    8,   5, 0x41a,0x2ab,0x670,0x3c0,0x17c,128, 0, 0x00,0x00,0x00,0x00}
+-};
+-
+-static const SiS310_TVDataStruct  SiS310_ExtHiTVData[]=
+-{
+- {    6,   1, 0x348,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x348,0x1e3,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   1, 0x348,0x233,0x670,0x3c0,0x166,128, 0, 0x00,0x00,0x00,0x00},
+- {   16,   5, 0x41a,0x2ab,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},
+- {   25,  12, 0x4ec,0x353,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    5,   4, 0x627,0x464,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00},
+- {    4,   1, 0x41a,0x233,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},
+- {    5,   2, 0x578,0x293,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
+- {    8,   5, 0x6d6,0x323,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00}
+-};
+-
+-static const UCHAR SiS310_NTSCTiming[] = { 
+-      0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
+-      0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
+-      0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x1b,
+-      0x0c,0x50,0x00,0x97,0x00,0xda,0x4a,0x17,
+-      0x7d,0x05,0x4b,0x00,0x00,0xe2,0x00,0x02,
+-      0x03,0x0a,0x65,0x9d,0x08,0x92,0x8f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x50,
+-      0x00,0x40,0x44,0x00,0xdb,0x02,0x3b,0x00
+-};
+-
+-static const UCHAR SiS310_PALTiming[] = {  
+-      0x19,0x52,0x35,0x6e,0x04,0x38,0x3d,0x70,
+-      0x94,0x49,0x01,0x12,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0x45,0x2b,
+-      0x70,0x50,0x00,0x9b,0x00,0xd9,0x5d,0x17,
+-      0x7d,0x05,0x45,0x00,0x00,0xe8,0x00,0x02,
+-      0x0d,0x00,0x68,0xb0,0x0b,0x92,0x8f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x63,
+-      0x00,0x40,0x3e,0x00,0xe1,0x02,0x28,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVExtTiming[] = {  
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
+-      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-      0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
+-      0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
+-      0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
+-      0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVSt1Timing[] = {  
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
+-      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-      0x65,0x90,0x7b,0xa8,0x03,0xf0,0x87,0x03,
+-      0x11,0x15,0x11,0xcf,0x10,0x11,0xcf,0x10,
+-      0x35,0x35,0x3b,0x69,0x1d,0x92,0x0f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x86,
+-      0xaf,0x5d,0x0e,0x00,0xfc,0xff,0x2d,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVSt2Timing[] = {  
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
+-      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-      0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
+-      0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
+-      0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
+-      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
+-      0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVTextTiming[] = {  
+-        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
+-      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
+-      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
+-      0x65,0x90,0xe7,0xbc,0x03,0x0c,0x97,0x03,
+-      0x14,0x78,0x14,0x08,0x20,0x14,0x08,0x20,
+-      0xc8,0xc8,0x3b,0xd2,0x26,0x92,0x0f,0x40,
+-        0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x96,
+-      0x72,0x5c,0x11,0x00,0xfc,0xff,0x32,0x00
+-};
+-
+-static const UCHAR SiS310_HiTVGroup3Data[] = {  
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x5f,
+-      0x05,0x21,0xb2,0xb2,0x55,0x77,0x2a,0xa6,
+-      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-      0x8c,0x6e,0x60,0x2e,0x58,0x48,0x72,0x44,
+-      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-      0x4f,0x7f,0x03,0xa8,0x7d,0x20,0x1a,0xa9,
+-      0x14,0x05,0x03,0x7e,0x64,0x31,0x14,0x75,
+-      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+-static const UCHAR SiS310_HiTVGroup3Simu[] = {  
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x95,
+-      0xdb,0x20,0xb8,0xb8,0x55,0x47,0x2a,0xa6,
+-      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-      0x8c,0x6e,0x60,0x15,0x26,0xd3,0xe4,0x11,
+-      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-      0x67,0x36,0x01,0x47,0x0e,0x10,0xbe,0xb4,
+-      0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
+-      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+-static const UCHAR SiS310_HiTVGroup3Text[] = {  
+-        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0xa7,
+-      0xf5,0x20,0xce,0xce,0x55,0x47,0x2a,0xa6,
+-      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
+-      0x8c,0x6e,0x60,0x18,0x2c,0x0c,0x20,0x22,
+-      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
+-      0x93,0x3c,0x01,0x50,0x2f,0x10,0xf4,0xca,
+-      0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
+-      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
+-};
+-
+ typedef struct _SiS310_PanelDelayTblStruct
+ {
+       UCHAR timer[2];
+ } SiS310_PanelDelayTblStruct;
+-static const SiS310_PanelDelayTblStruct SiS310_PanelDelayTbl[]=  
++static const SiS310_PanelDelayTblStruct SiS310_PanelDelayTbl[]=
+ {
+-        {{0x10,0x40}},                /* TW: from 650/301LVx 1.10.6s BIOS */
++        {{0x10,0x40}},
+       {{0x10,0x40}},
+       {{0x10,0x40}},
+       {{0x10,0x40}},
+@@ -1744,24 +993,6 @@ static const SiS310_PanelDelayTblStruct 
+       {{0x10,0x40}},
+       {{0x10,0x40}},
+       {{0x10,0x40}}
+-#if 0
+-      {{0x28,0xc8}},          /* TW: from 650/301LV BIOS */
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}},
+-      {{0x28,0xc8}}
+-#endif
+ };
+ static const SiS310_PanelDelayTblStruct SiS310_PanelDelayTblLVDS[]=
+@@ -1792,363 +1023,7 @@ typedef struct _SiS310_LVDSDataStruct
+       USHORT LCDVT;
+ } SiS310_LVDSDataStruct;
+-static const SiS310_LVDSDataStruct  SiS310_LVDS320x480Data_1[]=
+-{
+-      { 848, 433, 400, 525},
+-      { 848, 389, 400, 525},
+-      { 848, 433, 400, 525},
+-      { 848, 389, 400, 525},
+-      { 848, 518, 400, 525},
+-      {1056, 628, 400, 525},
+-      { 400, 525, 400, 525},
+-      { 800, 449,1000, 644},
+-      { 800, 525,1000, 635}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS800x600Data_1[]= 
+-{
+-      { 848, 433,1060, 629},
+-      { 848, 389,1060, 629},
+-      { 848, 433,1060, 629},
+-      { 848, 389,1060, 629},
+-      { 848, 518,1060, 629},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      { 800, 449,1000, 644},
+-      { 800, 525,1000, 635}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS800x600Data_2[]=  
+-{
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      { 800, 449,1000, 644},
+-      { 800, 525,1000, 635}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1024x768Data_1[]=  
+-{
+-      { 840, 438,1344, 806},
+-      { 840, 409,1344, 806},
+-      { 840, 438,1344, 806},
+-      { 840, 409,1344, 806},
+-      { 840, 518,1344, 806},   /* 640x480 */
+-      {1050, 638,1344, 806},   /* 800x600 */
+-      {1344, 806,1344, 806},   /* 1024x768 */
+-      { 800, 449,1280, 801},
+-      { 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1024x768Data_2[]= 
+-{
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      { 800, 449,1280, 801},
+-      { 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x1024Data_1[]=  
+-{     
+-      {1048, 442,1688,1066},
+-      {1048, 392,1688,1066},
+-      {1048, 442,1688,1066},
+-      {1048, 392,1688,1066},
+-      {1048, 522,1688,1066},
+-      {1208, 642,1688,1066},
+-      {1432, 810,1688,1066},
+-      {1688,1066,1688,1066}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x1024Data_2[]=  
+-{     
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066},
+-      {1688,1066,1688,1066}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1400x1050Data_1[]=  
+-{
+-        { 928, 416, 1688,1066},
+-      { 928, 366, 1688,1066},
+-      { 928, 416, 1688,1066},
+-      { 928, 366, 1688,1066},
+-      { 928, 496, 1688,1066},
+-      {1088, 616, 1688,1066},
+-      {1312, 784, 1688,1066},
+-      {1568,1040, 1688,1066},
+-      {1688,1066, 1688,1066}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1400x1050Data_2[]= 
+-{
+-        {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-      {1688,1066, 1688,1066},
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1600x1200Data_1[]=  
+-{
+-        {1088, 450, 2048,1250},
+-      {1088, 400, 2048,1250},
+-      {1088, 450, 2048,1250},
+-      {1088, 400, 2048,1250},
+-      {1088, 530, 2048,1250},
+-      {1248, 650, 2048,1250},
+-      {1472, 818, 2048,1250},
+-      {1728,1066, 2048,1250},
+-      {1848,1066, 2048,1250},
+-      {2048,1250, 2048,1250}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1600x1200Data_2[]= 
+-{
+-        {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250},
+-      {2048,1250, 2048,1250}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x768Data_1[]= 
+-{     
+-      { 768, 438, 1408, 806},
+-      { 768, 388, 1408, 806},
+-      { 768, 438, 1408, 806},
+-      { 768, 388, 1408, 806},
+-      { 768, 518, 1408, 806},
+-      { 928, 638, 1408, 806},
+-      {1152, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x768Data_2[]=  
+-{     
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806},
+-      {1408, 806, 1408, 806}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1024x600Data_1[]=
+-{
+-      { 840, 604, 1344, 800},
+-      { 840, 560, 1344, 800},
+-      { 840, 604, 1344, 800},
+-      { 840, 560, 1344, 800},
+-      { 840, 689, 1344, 800},
+-      {1050, 800, 1344, 800},
+-      {1344, 800, 1344, 800},
+-      { 800, 449, 1280, 801},
+-      { 800, 525, 1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1024x600Data_2[]=
+-{
+-      {1344, 800, 1344, 800},
+-      {1344, 800, 1344, 800},
+-      {1344, 800, 1344, 800},
+-      {1344, 800, 1344, 800},
+-      {1344, 800, 1344, 800},
+-      {1344, 800, 1344, 800},
+-      {1344, 800, 1344, 800},
+-      { 800, 449, 1280, 801},
+-      { 800, 525, 1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1152x768Data_1[]=
+-{
+-      { 840, 438, 1344, 806},
+-      { 840, 409, 1344, 806},
+-      { 840, 438, 1344, 806},
+-      { 840, 409, 1344, 806},
+-      { 840, 518, 1344, 806},
+-      {1050, 638, 1344, 806},
+-      {1344, 806, 1344, 806},
+-      { 800, 449, 1280, 801},
+-      { 800, 525, 1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1152x768Data_2[]=
+-{
+-      {1344, 806, 1344, 806},
+-      {1344, 806, 1344, 806},
+-      {1344, 806, 1344, 806},
+-      {1344, 806, 1344, 806},
+-      {1344, 806, 1344, 806},
+-      {1344, 806, 1344, 806},
+-      {1344, 806, 1344, 806},
+-      { 800, 449, 1280, 801},
+-      { 800, 525, 1280, 813}
+-};
+-
+-/* TW: Pass 1:1 data */
+-static const SiS310_LVDSDataStruct  SiS310_LVDSXXXxXXXData_1[]=  
+-{
+-        { 800, 449,  800, 449},
+-      { 800, 449,  800, 449},
+-      { 900, 449,  900, 449},
+-      { 900, 449,  900, 449},
+-      { 800, 525,  800, 525},  /*  640x480   */
+-      {1056, 628, 1056, 628},  /*  800x600   */
+-      {1344, 806, 1344, 806},  /* 1024x768   */
+-      {1344,1066, 1344,1066},  /* 1280x1024  */  /* INSERTED ! */
+-      {1688, 806, 1688, 806},  /* 1280x768 ! */
+-      /* No other panels ! */
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS640x480Data_1[]=  
+-{
+-      { 800, 449, 800, 449},
+-      { 800, 449, 800, 449},
+-      { 800, 449, 800, 449},
+-      { 800, 449, 800, 449},
+-      { 800, 525, 800, 525},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628},
+-      {1056, 628,1056, 628}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x960Data_1[]=   
+-{
+-      { 840, 438,1344, 806},
+-      { 840, 409,1344, 806},
+-      { 840, 438,1344, 806},
+-      { 840, 409,1344, 806},
+-      { 840, 518,1344, 806},
+-      {1050, 638,1344, 806},
+-      {1344, 806,1344, 806},
+-      { 800, 449,1280, 801},
+-      { 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LVDS1280x960Data_2[]=  
+-{
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      { 800, 449,1280, 801},
+-      { 800, 525,1280, 813}
+-};
+-
+-/* LCDA */
+-
+-static const SiS310_LVDSDataStruct  SiS310_LCDA1400x1050Data_1[]=   
+-{     /* TW: Might be temporary (invalid) data */
+-        { 928, 416, 1688,1066},
+-      { 928, 366, 1688,1066},
+-      {1008, 416, 1688,1066},
+-      {1008, 366, 1688,1066},
+-      {1200, 530, 1688,1066},
+-      {1088, 616, 1688,1066},
+-      {1312, 784, 1688,1066},
+-      {1568,1040, 1688,1066},
+-      {1688,1066, 1688,1066}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LCDA1400x1050Data_2[]=   
+-{     /* TW: Temporary data. Not valid */
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      { 800, 449,1280, 801},
+-      { 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LCDA1600x1200Data_1[]=  
+-{     /* TW: Temporary data. Not valid */
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      {1344, 806,1344, 806},
+-      { 800, 449,1280, 801},
+-      { 800, 525,1280, 813}
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_LCDA1600x1200Data_2[]=  
+-{     /* TW: Temporary data. Not valid */
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0},
+-      {0, 0, 0, 0}
+-};
+-
+-/* Chrontel TV */
+-
+-static const SiS310_LVDSDataStruct  SiS310_CHTVUNTSCData[]=   
+-{
+-      { 840, 600, 840, 600},
+-      { 840, 600, 840, 600},
+-      { 840, 600, 840, 600},
+-      { 840, 600, 840, 600},
+-      { 784, 600, 784, 600},
+-      {1064, 750,1064, 750},
+-        {1160, 945,1160, 945}           /* TW: For Ch7019 1024 */
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_CHTVONTSCData[]=   
+-{
+-      { 840, 525, 840, 525},
+-      { 840, 525, 840, 525},
+-      { 840, 525, 840, 525},
+-      { 840, 525, 840, 525},
+-      { 784, 525, 784, 525},
+-      {1040, 700,1040, 700},
+-        {1160, 840,1160, 840}                 /* TW: For Ch7019 1024 */
+-};
+-
+-static const SiS310_LVDSDataStruct  SiS310_CHTVUPALData[]=   
++static const SiS310_LVDSDataStruct  SiS310_CHTVUPALData[]=
+ {
+       {1008, 625,1008, 625},
+       {1008, 625,1008, 625},
+@@ -2156,7 +1031,7 @@ static const SiS310_LVDSDataStruct  SiS3
+       {1008, 625,1008, 625},
+       { 840, 625, 840, 625},
+       { 960, 750, 960, 750},
+-      {1400,1000,1400,1000}           /*  TW: For Ch7019 1024 */
++      {1400,1000,1400,1000}
+ };
+ static const SiS310_LVDSDataStruct  SiS310_CHTVOPALData[]= 
+@@ -2167,7 +1042,7 @@ static const SiS310_LVDSDataStruct  SiS3
+       {1008, 625,1008, 625},
+       { 840, 625, 840, 625},
+       { 944, 625, 944, 625},
+-        {1400, 875,1400, 875}         /*  TW: For Ch7019 1024 */
++        {1400, 875,1400, 875}
+ };
+ static const SiS310_LVDSDataStruct  SiS310_CHTVUPALMData[]=  
+@@ -2178,7 +1053,7 @@ static const SiS310_LVDSDataStruct  SiS3
+       { 840, 600, 840, 600},
+       { 784, 600, 784, 600},
+       {1064, 750,1064, 750},
+-        {1160, 945,1160, 945}           /* TW: For Ch7019 1024 */
++        {1160, 945,1160, 945}
+ };
+ static const SiS310_LVDSDataStruct  SiS310_CHTVOPALMData[]=  
+@@ -2189,7 +1064,7 @@ static const SiS310_LVDSDataStruct  SiS3
+       { 840, 525, 840, 525},
+       { 784, 525, 784, 525},
+       {1040, 700,1040, 700},
+-        {1160, 840,1160, 840}                 /* TW: For Ch7019 1024 */
++        {1160, 840,1160, 840}
+ };
+ static const SiS310_LVDSDataStruct  SiS310_CHTVUPALNData[]=  
+@@ -2200,7 +1075,7 @@ static const SiS310_LVDSDataStruct  SiS3
+       {1008, 625,1008, 625},
+       { 840, 625, 840, 625},
+       { 960, 750, 960, 750},
+-      {1400,1000,1400,1000}           /*  TW: For Ch7019 1024 */
++      {1400,1000,1400,1000}
+ };
+ static const SiS310_LVDSDataStruct  SiS310_CHTVOPALNData[]= 
+@@ -2211,7 +1086,7 @@ static const SiS310_LVDSDataStruct  SiS3
+       {1008, 625,1008, 625},
+       { 840, 625, 840, 625},
+       { 944, 625, 944, 625},
+-        {1400, 875,1400, 875}         /*  TW: For Ch7019 1024 */
++        {1400, 875,1400, 875}
+ };
+ static const SiS310_LVDSDataStruct  SiS310_CHTVSOPALData[]=   /* TW: (super overscan - no effect on 7019) */
+@@ -2231,7 +1106,7 @@ typedef struct _SiS310_LVDSDesStruct
+       USHORT LCDVDES;
+ } SiS310_LVDSDesStruct;
+-static const SiS310_LVDSDesStruct  SiS310_PanelType00_1[]=  
++static const SiS310_LVDSDesStruct  SiS310_PanelType00_1[]=  /* 800x600 */
+ {
+       { 0, 0},
+       { 0, 0},
+@@ -2244,7 +1119,7 @@ static const SiS310_LVDSDesStruct  SiS31
+       { 0, 0}
+ };
+-static const SiS310_LVDSDesStruct  SiS310_PanelType01_1[]=   
++static const SiS310_LVDSDesStruct  SiS310_PanelType01_1[]=  /* 1024x768 */
+ {
+       { 0, 0},
+       { 0, 0},
+@@ -2257,7 +1132,7 @@ static const SiS310_LVDSDesStruct  SiS31
+       { 0, 0}
+ };
+-static const SiS310_LVDSDesStruct  SiS310_PanelType02_1[]=  
++static const SiS310_LVDSDesStruct  SiS310_PanelType02_1[]=  /* 1280x1024 */
+ {
+       { 0, 0},
+       { 0, 0},
+@@ -2382,33 +1257,31 @@ static const SiS310_LVDSDesStruct  SiS31
+       { 0, 0}
+ };
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0b_1[]= 
+-{
+-      {1343, 798},
+-      {1343, 794},
+-      {1343, 798},
+-      {1343, 794},
+-      {1343,   0},
+-      {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0c_1[]=  
++static const SiS310_LVDSDesStruct  SiS310_PanelType0b_1[]=  /* 640x480_2 */
+ {
+-      {1343, 798},
+-      {1343, 794},
+-      {1343, 798},
+-      {1343, 794},
+-      {1343,   0},
+-      {1343,   0},
+-      { 0, 805},
+-      { 0, 794},
+-      { 0,   0}
++      { 0, 524},
++      { 0, 524},
++      { 0, 524},
++      { 0, 524},
++      { 0, 524},
++      { 0, 524},
++      { 8, 524},
++      { 0, 524}
++};
++
++static const SiS310_LVDSDesStruct  SiS310_PanelType0c_1[]=  /* 640x480_3 */
++{
++      { 0, 524},
++      { 0, 524},
++      { 0, 524},
++      { 0, 524},
++      { 0, 524},
++      { 0, 524},
++      { 8, 524},
++      { 0, 524}
+ };
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0d_1[]= 
++static const SiS310_LVDSDesStruct  SiS310_PanelType0d_1[]=
+ {
+       {1343, 798},
+       {1343, 794},
+@@ -2604,7 +1477,7 @@ static const SiS310_LVDSDesStruct  SiS31
+       {   0,   0}
+ };
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0b_2[]=  
++static const SiS310_LVDSDesStruct  SiS310_PanelType0b_2[]=  /* 640x480_2 */
+ {
+       {1152, 622},
+       {1152, 597},
+@@ -2617,7 +1490,7 @@ static const SiS310_LVDSDesStruct  SiS31
+       { 0,   0}
+ };
+-static const SiS310_LVDSDesStruct  SiS310_PanelType0c_2[]= 
++static const SiS310_LVDSDesStruct  SiS310_PanelType0c_2[]=  /* 640x480_3 */
+ {
+       {1152, 622},
+       {1152, 597},
+@@ -2669,184 +1542,6 @@ static const SiS310_LVDSDesStruct  SiS31
+       { 0,   0}
+ };
+-static const SiS310_LVDSDesStruct  SiS310_PanelTypeNS_1[]= 
+-{
+-      { 8,   0},
+-      { 8,   0},
+-      { 8,   0},
+-      { 8,   0},
+-      { 8,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0, 806},
+-      { 0, 0 }
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_PanelTypeNS_2[] = 
+-{
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1076_1[]=  
+-{  /* 1024x768 - Checked (1.10.6s) */
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1076_2[]=  
+-{  /* 1024x768 - Checked (1.10.6s) */
+-      { 1184, 622 },
+-      { 1184, 597 },
+-      { 1184, 622 },
+-      { 1184, 597 },
+-      { 1152, 622 },
+-      { 1232, 722 },
+-      {    0, 0   },
+-      {    0, 794 },
+-      {    0, 0   }
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1210_1[]=  
+-{  /* 1280x1024 - Checked (1.10.6s) */
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1210_2[]=  
+-{  /* 1280x1024 - Checked (1.10.6s) */
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1296_1[]=  
+-{  /* 1400x1050 - Checked (1.10.6s) */
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1296_2[]=  
+-{  /* 1400x1050 - Checked (1.10.6s) - looks heavily invalid */
+-      { 808 , 740},
+-      { 0   , 715},
+-      { 632 , 740},
+-      { 632 , 715},
+-      { 1307, 780},
+-      { 1387,1157},
+-      { 1499, 924},
+-      { 1627,1052},
+-      { 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1600_1[]= 
+-{  /* 1600x1200 - Checked (1.10.6s) */
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct SiS310_PanelType1600_2[]= 
+-{  /* 1600x1200 - Checked (1.10.6s) - looks heavily invalid, not copied */
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0},
+-      { 0 , 0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_CHTVUNTSCDesData[]=
+-{
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_CHTVONTSCDesData[]=
+-{
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_CHTVUPALDesData[]=
+-{
+-      {256,   0},
+-      {256,   0},
+-      {256,   0},
+-      {256,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0}
+-};
+-
+-static const SiS310_LVDSDesStruct  SiS310_CHTVOPALDesData[]=
+-{
+-      {256,   0},
+-      {256,   0},
+-      {256,   0},
+-      {256,   0},
+-      { 0,   0},
+-      { 0,   0},
+-      { 0,   0}
+-};
+-
+ typedef struct _SiS310_Part2PortTblStruct
+ {
+       UCHAR CR[12];
+@@ -2866,16 +1561,15 @@ static const SiS310_Part2PortTblStruct S
+ };
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1280x1024_1[] =
+-{     /* TW: Temporary data, invalid */
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+- {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}
++{     /* TW: BIOS data invalid, last row taken from _3 */
++ {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
++ {{0x2C,0x12,0x38,0x55,0x2F,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
++ {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
++ {{0x2C,0x12,0x38,0x55,0x2F,0xC1,0x35,0xB1,0x47,0xE9,0x71,0x33}},
++ {{0x2D,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
++ {{0x29,0x12,0xB5,0xD2,0xAC,0xE9,0x35,0xD9,0x47,0x11,0x99,0x33}},
++ {{0x36,0x13,0x02,0x25,0xFF,0x03,0x45,0x09,0x07,0xF9,0x00,0x24}},
++ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}
+ };
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1400x1050_1[] =
+@@ -2912,7 +1606,8 @@ static const SiS310_Part2PortTblStruct S
+  {{0x2c,0x12,0x38,0x55,0x2f,0xc1,0x35,0xb1,0x47,0xe9,0x71,0x33}},
+  {{0x2d,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xc1,0x49,0x33}},
+  {{0x29,0x12,0xb5,0xd2,0xac,0xe9,0x35,0xd9,0x47,0x11,0x99,0x33}},
+- {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
++ {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},  /* old  */
++/* 0x36,0x13,0x02,0x25,0xff,0x03,0x45,0x09,0x07,0xf9,0x00,0x24        new? */
+  {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+  {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+ };
+@@ -2959,6 +1654,7 @@ static const SiS310_Part2PortTblStruct S
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1024x768_3[] =
+ {     /* TW: Data from 650/301LVx 1.10.6s */
++#if 0
+  {{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+  {{0x2c,0x13,0x9a,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+  {{0x25,0x13,0xc9,0x24,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+@@ -2968,56 +1664,55 @@ static const SiS310_Part2PortTblStruct S
+  {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+  {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+  {{0x25,0x13,0xc9,0x25,0xff,0xf9,0x45,0x09,0x07,0xf9,0x09,0x24}}
+-#if 0 /* TW: Data from 650/301LV */
+- {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x2c,0x12,0x9a,0xae,0x88,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+- {{0x38,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x38,0x18,0x16,0x00,0x00,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+-#endif
++#endif        /* Data from my 301LV */
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},   /* @@@@@ TEST */
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
++ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}
+ };
+ /*   1     2    4    5    6   1c   1d   1f   20   21   23   25   */
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1280x1024_3[] =
+-{     /* TW: Temporary data, invalid */
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
++{
++ {{0x31,0x1B,0xC4,0xDA,0xB0,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
++ {{0x34,0x1B,0x9F,0xC0,0x80,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
++ {{0x3E,0x1B,0xCF,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
++ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
++ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
++ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
++ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
++ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}
+ };
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1400x1050_3[] =
+ {     
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
+ };
+ static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1600x1200_3[] =
+ {     /* TW: Temporary data, invalid */
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+-  {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
++ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
+ };
+ typedef struct _SiS310_LCDACRT1DataStruct
+@@ -3054,7 +1749,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11024x768_1[]=
+-{  /* TW: Checked (1.10.6s) */
++{
+  {{0x73,0x4f,0x4f,0x97,0x55,0x86,0xc4,0x1f,
+    0x92,0x89,0x8f,0x8f,0xb5,0x30,0x00,0x05,
+    0x00}},
+@@ -3079,7 +1774,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11280x1024_1[]=
+-{  /* Checked (1.10.6s) */
++{
+  {{0x7e,0x4f,0x4f,0x82,0x58,0x06,0xb8,0x1f,
+    0x90,0x84,0x8f,0x8f,0xb9,0x30,0x00,0x06,
+    0x00}},
+@@ -3107,7 +1802,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11400x1050_1[]=
+-{    /* Checked (1.10.6s) */
++{
+  {{0x6f,0x4f,0x4f,0x93,0x54,0x82,0x9e,0x1f,
+    0x93,0x86,0x8f,0x8f,0x9f,0x30,0x00,0x05,
+    0x00}},
+@@ -3200,7 +1895,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11024x768_1_H[]=
+-{  /* TW: Checked (1.10.6s) */
++{
+  {{0x4b,0x27,0x27,0x8f,0x2b,0x03,0xc4,0x1f,
+    0x92,0x89,0x8f,0x8f,0xb5,0x30,0x00,0x44,
+    0x00}},
+@@ -3225,7 +1920,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11280x1024_1_H[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0x56,0x27,0x27,0x9a,0x30,0x1e,0xb8,0x1f,
+    0x90,0x84,0x8f,0x8f,0xb9,0x30,0x00,0x05,
+    0x00}},
+@@ -3250,7 +1945,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11400x1050_1_H[]=
+-{   /* Checked (1.10.6s) */
++{
+   {{0x47,0x27,0x27,0x8b,0x2c,0x1a,0x9e,0x1f,
+     0x93,0x86,0x8f,0x8f,0x9f,0x30,0x00,0x05,
+     0x00}},
+@@ -3343,7 +2038,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11024x768_2[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+    0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x06,
+    0x00}},
+@@ -3368,7 +2063,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11280x1024_2[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+    0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x06,
+    0x00}},
+@@ -3393,7 +2088,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11400x1050_2[]=
+-{    /* Checked (1.10.6s) */
++{
+  {{0xce,0x4f,0x4f,0x92,0x8c,0x1a,0x28,0x9a,
+    0xdb,0x8f,0x8f,0x8f,0x29,0x21,0x00,0x03,
+    0x00}},
+@@ -3486,7 +2181,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11024x768_2_H[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0x4f,0x27,0x27,0x93,0x39,0x01,0x24,0xbb,
+    0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x01,
+    0x00 }},
+@@ -3511,7 +2206,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11280x1024_2_H[]=
+-{   /* Checked (1.10.6s) */
++{
+  {{0x4f,0x27,0x27,0x93,0x39,0x81,0x24,0xbb,
+    0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x01,
+    0x00 }},
+@@ -3536,7 +2231,7 @@ static const SiS310_LCDACRT1DataStruct  
+ };
+ static const SiS310_LCDACRT1DataStruct  SiS310_LCDACRT11400x1050_2_H[]=
+-{  /* Checked (1.10.6s) */
++{
+  {{0xa6,0x27,0x27,0x8a,0x64,0x92,0x28,0x9a,
+    0xdb,0x8f,0x8f,0x8f,0x29,0x21,0x00,0x06,
+    0x00}},
+@@ -3605,32 +2300,7 @@ typedef struct _SiS310_LVDSCRT1DataStruc
+       UCHAR CR[15];
+ } SiS310_LVDSCRT1DataStruct;
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1320x480_1[] =
+-{
+- {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
+-   0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
+-   0x00 }},
+- {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
+-   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+-   0x00 }},
+- {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
+-   0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-   0x00 }},
+- {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
+-   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+-   0x00 }},
+- {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
+-   0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
+-   0x00 }},
+- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+-   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+-   0x01 }},
+- {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
+-   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+-   0x00 }}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1800x600_1[] =   
++static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1800x600_1[] =
+ {
+  {{0x6b,0x4f,0x8f,0x55,0x85,0xaa,0x1f,
+    0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
+@@ -3924,63 +2594,7 @@ static const SiS310_LVDSCRT1DataStruct  
+    0x01}}
+ };
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1XXXxXXX_1[] =  
+-{
+- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+-   0x00}},
+- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+-   0x00}},
+- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+-   0x00}},
+- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+-   0x00}},
+- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+-   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x05,
+-   0x00}},
+- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+-   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+-   0x01}},
+- {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-   0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-   0x01}},
+- {{0xce,0x9f,0x92,0xa8,0x14,0x28,0x5a,
+-   0x00,0x84,0xff,0x29,0x09,0x00,0x07,
+-   0x01}},
+- {{0xce,0x9f,0x92,0xa9,0x17,0x24,0xf5,
+-   0x02,0x88,0xff,0x25,0x10,0x00,0x07,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT1XXXxXXX_1_H[] = 
+-{
+- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+-   0x00}},
+- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+-   0x00}},
+- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+-   0x00}},
+- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+-   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+-   0x00}},
+- {{0x38,0x27,0x9c,0x2c,0x80,0x0b,0x3e,
+-   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+-   0x00}},
+- {{0x4d,0x31,0x91,0x3b,0x03,0x72,0xf0,
+-   0x58,0x8c,0x57,0x73,0x20,0x00,0x01,
+-   0x01}},
+- {{0x63,0x3f,0x87,0x4a,0x92,0x24,0xf5,
+-   0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11400x1050_1[] =  
++static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11400x1050_1[] =
+ {
+   {{0x6f,0x4f,0x93,0x54,0x82,0x9e,0x1f,
+     0x8f,0x81,0x8f,0x9f,0x30,0x00,0x05,
+@@ -4220,332 +2834,8 @@ static const SiS310_LVDSCRT1DataStruct  
+ #endif   
+ };
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11280x768_1[] =  
+-{     
+- {{0x5b,0x4f,0x9f,0x55,0x19,0xb4,0x1f,
+-   0x9c,0x8e,0x8f,0xb5,0x10,0x00,0x01,
+-   0x00}},
+- {{0x5b,0x4f,0x9f,0x55,0x19,0x82,0x1f,
+-   0x6a,0x8c,0x5d,0x83,0x30,0x00,0x01,
+-   0x00}},
+- {{0x5b,0x4f,0x9f,0x55,0x19,0xb4,0x1f,
+-   0x9c,0x8e,0x8f,0xb5,0x10,0x00,0x01,
+-   0x00}},
+- {{0x5b,0x4f,0x9f,0x55,0x19,0x82,0x1f,
+-   0x6a,0x8c,0x5d,0x83,0x30,0x00,0x01,
+-   0x00}},
+- {{0x5b,0x4f,0x9f,0x55,0x19,0x04,0x3e,
+-   0xec,0x8e,0xdf,0x05,0x20,0x00,0x01,
+-   0x00}},
+- {{0x6f,0x63,0x93,0x69,0x8d,0x7c,0xf0,
+-   0x64,0x86,0x57,0x7d,0x20,0x00,0x05,
+-   0x01}},
+- {{0x8b,0x7f,0x8f,0x85,0x09,0x24,0xf5,
+-   0x0c,0x8e,0xff,0x25,0x30,0x00,0x02,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa5,0x89,0x24,0xf5,
+-   0x0c,0x8e,0xff,0x25,0x30,0x00,0x06,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa5,0x89,0x24,0xf5,
+-   0x0c,0x8e,0xff,0x25,0x30,0x00,0x06,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11280x768_1_H[] = 
+-{
+- {{0x47,0x27,0x8b,0x2c,0x1a,0x9e,0x1f,
+-   0x93,0x86,0x8f,0x9f,0x30,0x00,0x05,
+-   0x00}},
+- {{0x47,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
+-   0x60,0x84,0x5d,0x6d,0x10,0x00,0x05,
+-   0x00}},
+- {{0x47,0x27,0x8b,0x30,0x1e,0x9e,0x1f,
+-   0x92,0x86,0x8f,0x9f,0x30,0x00,0x05,
+-   0x00}},
+- {{0x47,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
+-   0x60,0x84,0x5d,0x6d,0x10,0x00,0x05,
+-   0x00}},
+- {{0x47,0x27,0x8b,0x2c,0x1a,0xee,0x1f,
+-   0xe2,0x86,0xdf,0xef,0x10,0x00,0x05,
+-   0x00}},
+- {{0x51,0x31,0x95,0x36,0x04,0x66,0xf0,
+-   0x5a,0x8e,0x57,0x67,0x20,0x00,0x01,
+-   0x01}},
+- {{0x5f,0x3f,0x83,0x44,0x92,0x0e,0xf5,
+-   0x02,0x86,0xff,0x0f,0x10,0x00,0x01,
+-   0x01}},
+- {{0x6f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
+-   0x02,0x86,0xff,0x0f,0x09,0x00,0x05,
+-   0x01}},
+- {{0x6f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
+-   0x02,0x86,0xff,0x0f,0x09,0x00,0x05,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11280x768_2[] = 
++static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11600x1200_1[] =
+ {
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
+-   0x54,0x86,0xdb,0xda,0x00,0x00,0x02,
+-   0x00}},
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
+-   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x02,
+-   0x00}},
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
+-   0x54,0x86,0xdb,0xda,0x00,0x00,0x02,
+-   0x00}},
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
+-   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x02,
+-   0x00}},
+- {{0xab,0x60,0x9f,0x80,0x04,0x24,0xb3,
+-   0x7c,0x8e,0x03,0x02,0x10,0x00,0x02,
+-   0x01}},
+- {{0xab,0x63,0x8f,0x8a,0x8e,0x24,0xf1,
+-   0xb6,0x88,0x57,0x25,0x10,0x00,0x02,
+-   0x01}},
+- {{0xab,0x7f,0x8f,0x98,0x9c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x02,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11280x768_2_H[] =
+-{
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
+-   0x54,0x86,0xdb,0xda,0x00,0x00,0x01,
+-   0x00}},
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
+-   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x01,
+-   0x00}},
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
+-   0x54,0x86,0xdb,0xda,0x00,0x00,0x01,
+-   0x00}},
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
+-   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x01,
+-   0x00}},
+- {{0x83,0x38,0x97,0x58,0x9c,0x24,0xb3,
+-   0x7c,0x8e,0x03,0x02,0x10,0x00,0x01,
+-   0x01}},
+- {{0x79,0x31,0x9d,0x58,0x9c,0x24,0xf1,
+-   0xb6,0x88,0x57,0x25,0x10,0x00,0x01,
+-   0x01}},
+- {{0x6b,0x3f,0x8f,0x58,0x9c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x01,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
+-   0x01}},
+- {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
+-   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
+-   0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11024x600_1[] =
+-{
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+-        0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+-        0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+-        0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+-        0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xaf,0xba,
+-        0x3b,0x82,0xdf,0xb0,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x7e,0x63,0x82,0x68,0x15,0x1e,0xf1,
+-        0xae,0x85,0x57,0x1f,0x30,0x00,0x26,
+-        0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x1e,0xf1,
+-        0xae,0x85,0x57,0x1f,0x30,0x00,0x02,
+-        0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11024x600_1_H[] =
+-{
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-          0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+-        0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+-        0x00}},
+-        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+-        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+-        0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-        0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11024x600_2[] =
+-{
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-          0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-        0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-        0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11024x600_2_H[] =
+-{
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+-        0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-        0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11152x768_1[] =
+-{
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+-        0x00}},
+-        {{0x64,0x4f,0x88,0x54,0x9f,0x04,0x3e,
+-        0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
+-        0x00}},
+-        {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
+-        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
+-        0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-        0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11152x768_1_H[] =
+-{
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+-        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+-        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+-        0x00}},
+-        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+-        0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+-        0x00}},
+-        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+-        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+-        0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-        0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11152x768_2[] =
+-{
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+-        0x00}},
+-        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+-        0x01}},
+-        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+-        0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11152x768_2_H[] =
+-{
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+-        0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+-        0x00}},
+-        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+-        0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+-        0x01}},
+-        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+-        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+-        0x01}}
+-};
+-
+-static const SiS310_LVDSCRT1DataStruct  SiS310_LVDSCRT11600x1200_1[] =  
+-{    
+  {{0x83,0x4f,0x87,0x51,0x09,0xc0,0x1f,
+    0x90,0x84,0x8f,0xc1,0x30,0x00,0x06,
+    0x00}},
+@@ -4701,7 +2991,7 @@ static const SiS310_LVDSCRT1DataStruct  
+       {{0x80,0x63,0x84,0x6d,0x0f,0xec,0xf0,
+         0x7a,0x8f,0x57,0xed,0x20,0x00,0x06,
+         0x01 }},
+-      {{0x8c,0x7f,0x90,0x86,0x09,0xaf,0xf5,  /* TW: 1024x768 */
++      {{0x8c,0x7f,0x90,0x86,0x09,0xaf,0xf5,
+         0x36,0x88,0xff,0xb0,0x10,0x00,0x02,
+         0x01}}
+ };
+@@ -4726,7 +3016,7 @@ static const SiS310_LVDSCRT1DataStruct  
+       {{0x7d,0x63,0x81,0x68,0x0e,0xba,0xf0,
+         0x78,0x8a,0x57,0xbb,0x20,0x00,0x06,
+         0x01 }},
+-      {{0x8c,0x7f,0x90,0x82,0x06,0x46,0xf5,   /* TW: 1024x768 */
++      {{0x8c,0x7f,0x90,0x82,0x06,0x46,0xf5,
+         0x15,0x88,0xff,0x47,0x70,0x00,0x02,
+         0x01 }}
+ };
+@@ -4751,7 +3041,7 @@ static const SiS310_LVDSCRT1DataStruct  
+       {{0x73,0x63,0x97,0x69,0x8b,0xec,0xf0,
+         0x90,0x8c,0x57,0xed,0x20,0x00,0x05,
+         0x01 }},
+-      {{0xaa,0x7f,0x8e,0x8e,0x96,0xe6,0xf5,   /* TW: 1024x768 */
++      {{0xaa,0x7f,0x8e,0x8e,0x96,0xe6,0xf5,
+         0x50,0x88,0xff,0xe7,0x10,0x00,0x02,
+         0x01}}
+ };
+@@ -4776,7 +3066,7 @@ static const SiS310_LVDSCRT1DataStruct  
+       {{0x71,0x63,0x95,0x69,0x8c,0x6f,0xf0,
+         0x5a,0x8b,0x57,0x70,0x20,0x00,0x05,
+         0x01 }},
+-      {{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,   /* TW:  1024x768 */
++      {{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,
+         0x28,0x88,0xff,0x6a,0x10,0x00,0x02,
+         0x01 }}
+ };
+@@ -4801,12 +3091,11 @@ static const SiS310_LVDSCRT1DataStruct  
+       {{0x71,0x63,0x95,0x69,0x8c,0x6f,0xf0,
+         0x5a,0x8b,0x57,0x70,0x20,0x00,0x05,
+         0x01 }},
+-      {{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,   /* TW:  1024x768 */
++      {{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,
+         0x28,0x88,0xff,0x6a,0x10,0x00,0x02,
+         0x01 }}
+ };
+-/* TW: Data for Chrontel 7019  */
+ typedef struct _SiS310_CHTVRegDataStruct
+ {
+       UCHAR Reg[16];
+--- linux-2.6.0-test1/drivers/video/sis/init301.c      2003-07-13 21:44:34.000000000 -0700
++++ 25/drivers/video/sis/init301.c     2003-07-19 17:04:55.000000000 -0700
+@@ -1,27 +1,11 @@
+ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.3 2002/22/04 01:16:16 dawes Exp $ */
+ /*
+- * Mode switching code (CRT2 section) for SiS 300/540/630/730/315/550/650/740/330
+- * (Universal module for Linux kernel framebuffer, XFree86 4.x)
++ * Mode switching code (CRT2 section) for SiS 300/540/630/730/315/550/650/740/330/660
++ * (Universal module for Linux kernel framebuffer and XFree86 4.x)
+  *
+  * Assembler-To-C translation
+  * Copyright 2002, 2003 by Thomas Winischhofer <thomas@winischhofer.net>
+- * Minor parts Copyright SiS, Inc.
+- *
+- * Based on BIOS
+- *     1.10.07, 1.10a for 650/CH7019
+- *     1.11.21a for 740/CH7019
+- *     1.11.05 for 650/LVDS (w/o Chrontel)
+- *     1.07.1b, 1.10.6s, 1.11.6w, 1.11.7w, 1.11.8r for 650/301(B/LV), 650/302LV
+- *     2.04.50 (I) and 2.04.5c (II) for 630/301(B)
+- *     2.02.3b, 2.03.02, 2.04.2c, 2.04.5c, 2.07a and 2.08.b3 for 630/LVDS/LVDS+CH7005
+- *     2.04.5c, 2.04.6c for 730+LVDS+CH7005
+- *     1.09b for 315/301(B)
+- *     1.16.51 for 300+301LV (ECS A907)
+- *     1.01.03 for 330 (Xabre 400)
+- *
+- * Known bugs:
+- *   1024x768 panel, expanding (CR37=1): Mode 640x480 does not work on SOME panels
+- *       therefore, we always do the scaling ourselves for now.
++ * Formerly based on non-functional code-fragements by SiS, Inc.
+  *
+  * Permission to use, copy, modify, distribute, and sell this software and its
+  * documentation for any purpose is hereby granted without fee, provided that
+@@ -73,8 +57,8 @@
+ #define SiS_I2CDELAYSHORT  150
+ BOOLEAN
+-SiS_SetCRT2Group301(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+-                    PSIS_HW_DEVICE_INFO HwDeviceExtension)
++SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
++                 PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+    USHORT ModeIdIndex;
+    USHORT RefreshRateTableIndex;
+@@ -85,9 +69,9 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+       SiS_SearchModeID(SiS_Pr,ROMAddr,&ModeNo,&ModeIdIndex);
+    } else {
+       ModeIdIndex = 0;
+-   }      
++   }
+-   /* TW: Used for shifting CR33 */
++   /* Used for shifting CR33 */
+    SiS_Pr->SiS_SelectCRT2Rate = 4;
+    SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
+@@ -110,8 +94,6 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+       return(TRUE);
+    }
+-   if(SiS_Pr->UseCustomMode) return(FALSE);
+-   
+    SiS_GetCRT2Data(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                    HwDeviceExtension);
+@@ -153,9 +135,9 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+                  SiS_SetGroup5(SiS_Pr,HwDeviceExtension, BaseAddr,ROMAddr,
+                        ModeNo,ModeIdIndex);
+-         /* TW: For 301BDH (Panel link initialization): */
++         /* For 301BDH (Panel link initialization): */
+          if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+-            if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {   
++            if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+                if(!((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo = 0x10)))) {
+                   if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+                      SiS_ModCRT1CRTC(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+@@ -176,10 +158,10 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+                             RefreshRateTableIndex,HwDeviceExtension);
+          }
+       }
+-        if(SiS_Pr->SiS_IF_DEF_FSTN == 0) {
+-         SiS_SetCRT2ECLK(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-                         RefreshRateTableIndex,HwDeviceExtension);
+-      }
++
++        SiS_SetCRT2ECLK(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
++                      RefreshRateTableIndex,HwDeviceExtension);
++
+       if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+          if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+             if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+@@ -199,74 +181,64 @@ SiS_SetCRT2Group301(SiS_Private *SiS_Pr,
+    }
+ #ifdef SIS300
+-   if ( (HwDeviceExtension->jChipType == SIS_540) ||
+-        (HwDeviceExtension->jChipType == SIS_630) ||
+-        (HwDeviceExtension->jChipType == SIS_730) ||
+-        (HwDeviceExtension->jChipType == SIS_300) )
+-    {
+-      if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+-         if(SiS_Pr->SiS_UseOEM) {
+-            if((SiS_Pr->SiS_UseROM) && ROMAddr && (SiS_Pr->SiS_UseOEM == -1)) {
+-               if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
+-                  SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+-               }
+-            } else {
+-                       SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+-            }
+-         }
+-      }
+-    }
+-#endif
+-
+-#ifdef SIS315H
+-   if ( (HwDeviceExtension->jChipType == SIS_315H)  ||
+-        (HwDeviceExtension->jChipType == SIS_315)   ||
+-      (HwDeviceExtension->jChipType == SIS_315PRO)||
+-        (HwDeviceExtension->jChipType == SIS_550)   ||
+-        (HwDeviceExtension->jChipType == SIS_740)   ||
+-        (HwDeviceExtension->jChipType == SIS_650)   ||
+-      (HwDeviceExtension->jChipType == SIS_330) )
+-   {
+-        if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+-         SiS_FinalizeLCD(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex, HwDeviceExtension);
+-#if 0      /* Instead of FinalizeLCD(), older BIOSes (A92x) used OEMLCD() */
+-         SiS_OEMLCD(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+-#endif
+-           if(SiS_Pr->SiS_UseOEM) {
+-              SiS_OEM310Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+-           }
+-           SiS_CRT2AutoThreshold(SiS_Pr,BaseAddr);
+-        }
+-   }
+-#endif
+-
+    if(HwDeviceExtension->jChipType < SIS_315H) {
++      if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
++       if(SiS_Pr->SiS_UseOEM) {
++          if((SiS_Pr->SiS_UseROM) && ROMAddr && (SiS_Pr->SiS_UseOEM == -1)) {
++             if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
++                SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
++                                  RefreshRateTableIndex);
++             }
++          } else {
++                     SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
++                               RefreshRateTableIndex);
++          }
++       }
++       if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
++            if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
++             (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++             SetOEMLCDData2(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,
++                            ModeIdIndex,RefreshRateTableIndex);
++          }
++            if(HwDeviceExtension->jChipType == SIS_730) {
++               SiS_DisplayOn(SiS_Pr);
++          }
++         }
++      }
+       if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+           if(HwDeviceExtension->jChipType != SIS_730) {
+              SiS_DisplayOn(SiS_Pr);
+         }
+       }
+    }
++#endif
+-   if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-         if(HwDeviceExtension->jChipType == SIS_730) {
+-            SiS_DisplayOn(SiS_Pr);
+-       }
++#ifdef SIS315H
++   if(HwDeviceExtension->jChipType >= SIS_315H) {
++      if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
++       SiS_FinalizeLCD(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex, HwDeviceExtension);
++         if(SiS_Pr->SiS_UseOEM) {
++            SiS_OEM310Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++         }
++         SiS_CRT2AutoThreshold(SiS_Pr,BaseAddr);
+       }
++   }
++#endif
++
++   if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+       SiS_EnableBridge(SiS_Pr,HwDeviceExtension,BaseAddr);
+    }
+    SiS_DisplayOn(SiS_Pr);
+    if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-           /* TW: Disable LCD panel when using TV */
+-           SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x11,0x0C);
+-      } else {
+-           /* TW: Disable TV when using LCD */
+-           SiS_SetCH70xxANDOR(SiS_Pr,0x010E,0xF8);
+-      }
++      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++       /* Disable LCD panel when using TV */
++       SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x11,0x0C);
++      } else {
++       /* Disable TV when using LCD */
++       SiS_SetCH70xxANDOR(SiS_Pr,0x010E,0xF8);
++      }
+    }
+    if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+@@ -283,7 +255,7 @@ SiS_LowModeStuff(SiS_Private *SiS_Pr, US
+     USHORT temp,temp1,temp2;
+     if((ModeNo != 0x03) && (ModeNo != 0x10) && (ModeNo != 0x12))
+-         return(1);
++       return(1);
+     temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x11);
+     SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x11,0x80);
+     temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x00);
+@@ -304,7 +276,7 @@ SiS_LowModeStuff(SiS_Private *SiS_Pr, US
+     }
+ }
+-/* TW: Set Part1 registers */
++/* Set Part1 registers */
+ void
+ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+               USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+@@ -313,25 +285,29 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+   USHORT  temp=0, tempax=0, tempbx=0, tempcx=0;
+   USHORT  pushbx=0, CRT1Index=0;
+ #ifdef SIS315H
+-  USHORT  pushcx=0, tempbl=0;
++  USHORT  tempbl=0;
+ #endif
+   USHORT  modeflag, resinfo=0;
+-  if(ModeNo<=0x13) {
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++  if(ModeNo <= 0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+   } else {
++     if(SiS_Pr->UseCustomMode) {
++      modeflag = SiS_Pr->CModeFlag;
++     } else {
+       CRT1Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+       resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+       modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     }
+   }
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-
+-         SiS_SetCRT2Sync(SiS_Pr,BaseAddr,ROMAddr,ModeNo,
+-                           RefreshRateTableIndex,HwDeviceExtension);
+ #ifdef SIS315H
+-         SiS_SetGroup1_LCDA(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+-                            HwDeviceExtension,RefreshRateTableIndex);
++     SiS_SetCRT2Sync(SiS_Pr,BaseAddr,ROMAddr,ModeNo,
++                     RefreshRateTableIndex,HwDeviceExtension);
++
++     SiS_SetGroup1_LCDA(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
++                        HwDeviceExtension,RefreshRateTableIndex);
+ #endif
+   } else {
+@@ -367,13 +343,13 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+ #ifdef SIS300   /* ------------- 300 series --------------*/
+               temp = (SiS_Pr->SiS_VGAHT - 1) & 0x0FF;                         /* BTVGA2HT 0x08,0x09 */
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp);                   /* TW: CRT2 Horizontal Total */
++              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp);                   /* CRT2 Horizontal Total */
+               temp = (((SiS_Pr->SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
+-              SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0f,temp);          /* TW: CRT2 Horizontal Total Overflow [7:4] */
++              SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0f,temp);          /* CRT2 Horizontal Total Overflow [7:4] */
+               temp = (SiS_Pr->SiS_VGAHDE + 12) & 0x0FF;                       /* BTVGA2HDEE 0x0A,0x0C */
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);                   /* TW: CRT2 Horizontal Display Enable End */
++              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);                   /* CRT2 Horizontal Display Enable End */
+               pushbx = SiS_Pr->SiS_VGAHDE + 12;                               /* bx  BTVGA@HRS 0x0B,0x0C */
+               tempcx = (SiS_Pr->SiS_VGAHT - SiS_Pr->SiS_VGAHDE) >> 2;
+@@ -382,108 +358,129 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+               tempcx += tempbx;
+               if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-                              if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC){
+-                              /* CRT1Index &= 0x3F; - Not any longer */
+-                              tempbx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
+-                              tempbx |= ((SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14] & 0xC0) << 2);
+-                              tempbx = (tempbx - 1) << 3;
+-                              tempcx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
+-                              tempcx &= 0x1F;
+-                              temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
+-                              temp = (temp & 0x04) << (6-2);
+-                              tempcx = (tempcx | temp);
+-                              tempcx--;
+-                              tempcx <<= 3;
+-                              }
+-
+-                      if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)){
+-                              if(!(SiS_Pr->SiS_VBInfo & SetPALTV)){
+-                                              tempbx = 1040;
+-                                              tempcx = 1042;
+-                                      }
+-                      }
++
++                 if(SiS_Pr->UseCustomMode) {
++                    tempbx = SiS_Pr->CHSyncStart + 12;
++                    tempcx = SiS_Pr->CHSyncEnd + 12;
++                 }
++
++                         if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
++                    unsigned char cr4, cr14, cr5, cr15;
++                    if(SiS_Pr->UseCustomMode) {
++                       cr4  = SiS_Pr->CCRT1CRTC[4];
++                       cr14 = SiS_Pr->CCRT1CRTC[14];
++                       cr5  = SiS_Pr->CCRT1CRTC[5];
++                       cr15 = SiS_Pr->CCRT1CRTC[15];
++                    } else {
++                       cr4  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
++                       cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
++                       cr5  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
++                       cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
++                    }
++                    tempbx = ((cr4 | ((cr14 & 0xC0) << 2)) - 1) << 3;
++                    tempcx = (((cr5 & 0x1F) | ((cr15 & 0x04) << (6-2))) - 1) << 3;
++                         }
++
++                 if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == SIS_RI_1024x768)){
++                    if(!(SiS_Pr->SiS_VBInfo & SetPALTV)){
++                               tempbx = 1040;
++                               tempcx = 1042;
++                            }
++                 }
+               }
+               temp = tempbx & 0x00FF;
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);                   /* TW: CRT2 Horizontal Retrace Start */
++              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);                   /* CRT2 Horizontal Retrace Start */
+ #endif /* SIS300 */
+       } else {
+-#ifdef SIS315H  /* ----------------- 310/325/330 series ------------- */
++#ifdef SIS315H  /* ------------------- 315/330 series --------------- */
+               tempcx = SiS_Pr->SiS_VGAHT;                                    /* BTVGA2HT 0x08,0x09 */
+-              pushcx = tempcx;
+               if(modeflag & HalfDCLK) {
+-#ifndef NEWCH701x             
+-                  if((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_IF_DEF_CH70xx == 0)) {
+-#endif                    
++                  if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+                         tempax = SiS_Pr->SiS_VGAHDE >> 1;
+                         tempcx = SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE + tempax;
+                         if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+                             tempcx = SiS_Pr->SiS_HT - tempax;
+                         }
+-#ifndef NEWCH701x                                       
+                   } else {
+                         tempcx >>= 1;
+                   }
+-#endif                    
+               }
+               tempcx--;
+               temp = tempcx & 0xff;
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp);                  /* TW: CRT2 Horizontal Total */
++              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp);                  /* CRT2 Horizontal Total */
+               temp = ((tempcx & 0xff00) >> 8) << 4;
+-              SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0F,temp);         /* TW: CRT2 Horizontal Total Overflow [7:4] */
++              SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0F,temp);         /* CRT2 Horizontal Total Overflow [7:4] */
+-              tempcx = pushcx;                                               /* BTVGA2HDEE 0x0A,0x0C */
++              tempcx = SiS_Pr->SiS_VGAHT;                                    /* BTVGA2HDEE 0x0A,0x0C */
+               tempbx = SiS_Pr->SiS_VGAHDE;
+               tempcx -= tempbx;
+               tempcx >>= 2;
+               if(modeflag & HalfDCLK) {
+-                  tempbx >>= 1;
+-                  tempcx >>= 1;
++                 tempbx >>= 1;
++                 tempcx >>= 1;
+               }
+               tempbx += 16;
+               temp = tempbx & 0xff;
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);                  /* TW: CRT2 Horizontal Display Enable End */
++              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);                  /* CRT2 Horizontal Display Enable End */
+               pushbx = tempbx;
+               tempcx >>= 1;
+               tempbx += tempcx;
+               tempcx += tempbx;
+-              if(SiS_Pr->SiS_IF_DEF_LVDS==0) {
++              if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++
++                 if(SiS_Pr->UseCustomMode) {
++                    tempbx = SiS_Pr->CHSyncStart + 16;
++                    tempcx = SiS_Pr->CHSyncEnd + 16;
++                    tempax = SiS_Pr->SiS_VGAHT;
++                    if(modeflag & HalfDCLK) tempax >>= 1;
++                    tempax--;
++                    if(tempcx > tempax)  tempcx = tempax;
++                 }
++
+                  if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+-                      tempbx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
+-                      tempbx |= ((SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14] & 0xC0) << 2);
+-                      tempbx = (tempbx - 3) << 3;                     /*(VGAHRS-3)*8 */
+-                      tempcx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
+-                              tempcx &= 0x1F;
+-                      temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
+-                      temp = (temp & 0x04) << (5-2);                  /* VGAHRE D[5] */
+-                      tempcx = (tempcx | temp);                       /* (VGAHRE-3)*8 */
+-                      tempcx -= 3;
+-                      tempcx <<= 3;
+-                      tempcx &= 0x00FF;
+-                      tempcx |= (tempbx & 0xFF00);
+-                      tempbx += 16;
+-                      tempcx += 16;
+-                      tempax = SiS_Pr->SiS_VGAHT;
+-                      if(modeflag & HalfDCLK)  tempax >>= 1;
+-                      tempax--;
+-                      if(tempcx > tempax)  tempcx = tempax;
++                    unsigned char cr4, cr14, cr5, cr15;
++                    if(SiS_Pr->UseCustomMode) {
++                       cr4  = SiS_Pr->CCRT1CRTC[4];
++                       cr14 = SiS_Pr->CCRT1CRTC[14];
++                       cr5  = SiS_Pr->CCRT1CRTC[5];
++                       cr15 = SiS_Pr->CCRT1CRTC[15];
++                    } else {
++                       cr4  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
++                       cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
++                       cr5  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
++                       cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
++                    }
++                      tempbx = ((cr4 | ((cr14 & 0xC0) << 2)) - 3) << 3;               /* (VGAHRS-3)*8 */
++                      tempcx = (((cr5 & 0x1f) | ((cr15 & 0x04) << (5-2))) - 3) << 3;  /* (VGAHRE-3)*8 */
++                    tempcx &= 0x00FF;
++                    tempcx |= (tempbx & 0xFF00);
++                      tempbx += 16;
++                      tempcx += 16;
++                    tempax = SiS_Pr->SiS_VGAHT;
++                    if(modeflag & HalfDCLK) tempax >>= 1;
++                    tempax--;
++                    if(tempcx > tempax)  tempcx = tempax;
+                  }
+-                 if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)){
+-                    if(!(SiS_Pr->SiS_VBInfo & SetPALTV)){
+-                               tempbx = 1040;
+-                               tempcx = 1042;
+-                            }
++                 if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++                    if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++                       if(resinfo == SIS_RI_1024x768) {
++                                  tempbx = 1040;
++                                  tempcx = 1042;
++                               }
++                    }
+                  }
+-                 /* TW: Makes no sense, but is in 650/302LV 1.10.6s */
+-                 if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == 0x08)){
++#if 0
++                 /* Makes no sense, but is in 650/30xLV 1.10.6s */
++                 if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == SIS_RI_1024x768)){
+                     if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
+                        if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+                                   tempbx = 1040;
+@@ -491,25 +488,26 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+                                }
+                     }
+                  }
++#endif
+                 }
+               temp = tempbx & 0xff;
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);                 /* TW: CRT2 Horizontal Retrace Start */
++              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);                 /* CRT2 Horizontal Retrace Start */
+ #endif  /* SIS315H */
+-      }  /* 310/325/330 series */
++      }  /* 315/330 series */
+-      /* TW: The following is done for all bridge/chip types/series */
++      /* The following is done for all bridge/chip types/series */
+       tempax = tempbx & 0xFF00;
+       tempbx = pushbx;
+       tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
+       tempax |= (tempbx & 0xFF00);
+       temp = (tempax & 0xFF00) >> 8;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0C,temp);                        /* TW: Overflow */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0C,temp);                        /* Overflow */
+       temp = tempcx & 0x00FF;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0D,temp);                        /* TW: CRT2 Horizontal Retrace End */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0D,temp);                        /* CRT2 Horizontal Retrace End */
+       /* 2. Vertical setup */
+@@ -517,30 +515,30 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+       temp = tempcx & 0x00FF;
+         if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-           if(HwDeviceExtension->jChipType < SIS_315H) {
+-                if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-                     if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
+-                         temp--;
+-                     }
+-                  }
+-           } else {
+-                    temp--;
+-             }
++         if(HwDeviceExtension->jChipType < SIS_315H) {
++            if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
++               if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
++                  temp--;
++               }
++              }
++         } else {
++            temp--;
++           }
+         } else if(HwDeviceExtension->jChipType >= SIS_315H) {
+-          /* TW: 650/30xLV 1.10.6s */
+-          temp--;
++         /* 650/30xLV 1.10.6s */
++         temp--;
+       }
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0E,temp);                        /* TW: CRT2 Vertical Total */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0E,temp);                        /* CRT2 Vertical Total */
+       tempbx = SiS_Pr->SiS_VGAVDE - 1;
+       temp = tempbx & 0x00FF;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0F,temp);                        /* TW: CRT2 Vertical Display Enable End */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0F,temp);                        /* CRT2 Vertical Display Enable End */
+       temp = ((tempbx & 0xFF00) << 3) >> 8;
+       temp |= ((tempcx & 0xFF00) >> 8);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x12,temp);                        /* TW: Overflow (and HWCursor Test Mode) */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x12,temp);                        /* Overflow (and HWCursor Test Mode) */
+-      /* TW: 650/LVDS (1.10.07), 650/30xLV (1.10.6s) */
++      /* 650/LVDS (1.10.07), 650/30xLV (1.10.6s) */
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+            tempbx++;
+          tempax = tempbx;
+@@ -553,29 +551,44 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+          tempcx += tempbx;
+          tempcx++;
+       } else {
+-         /* TW: 300 series, LVDS/301B: */
++         /* 300 series, LVDS/301B: */
+          tempbx = (SiS_Pr->SiS_VGAVT + SiS_Pr->SiS_VGAVDE) >> 1;                 /*  BTVGA2VRS     0x10,0x11   */
+          tempcx = ((SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) >> 4) + tempbx + 1;  /*  BTVGA2VRE     0x11        */
+       }
+       if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-         if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC){
+-                      tempbx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[8];
+-                      temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
+-                      if(temp & 0x04) tempbx |= 0x0100;
+-                      if(temp & 0x80) tempbx |= 0x0200;
+-                      temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
+-                      if(temp & 0x08) tempbx |= 0x0400;
+-                      temp = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[9];
+-                      tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
++
++         if(SiS_Pr->UseCustomMode) {
++            tempbx = SiS_Pr->CVSyncStart;
++            tempcx = (tempcx & 0xFF00) | (SiS_Pr->CVSyncEnd & 0x00FF);
++         }
++
++         if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
++            unsigned char cr8, cr7, cr13, cr9;
++            if(SiS_Pr->UseCustomMode) {
++               cr8  = SiS_Pr->CCRT1CRTC[8];
++               cr7  = SiS_Pr->CCRT1CRTC[7];
++               cr13 = SiS_Pr->CCRT1CRTC[13];
++               cr9  = SiS_Pr->CCRT1CRTC[9];
++            } else {
++               cr8  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[8];
++               cr7  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
++               cr13 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
++               cr9  = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[9];
++            }
++                    tempbx = cr8;
++                    if(cr7 & 0x04)  tempbx |= 0x0100;
++                    if(cr7 & 0x80)  tempbx |= 0x0200;
++                    if(cr13 & 0x08) tempbx |= 0x0400;
++                    tempcx = (tempcx & 0xFF00) | (cr9 & 0x00FF);
+          }
+       }
+       temp = tempbx & 0x00FF;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);           /* TW: CRT2 Vertical Retrace Start */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);           /* CRT2 Vertical Retrace Start */
+       temp = ((tempbx & 0xFF00) >> 8) << 4;
+       temp |= (tempcx & 0x000F);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x11,temp);           /* TW: CRT2 Vert. Retrace End; Overflow; "Enable CRTC Check" */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x11,temp);           /* CRT2 Vert. Retrace End; Overflow; "Enable CRTC Check" */
+       /* 3. Panel compensation delay */
+@@ -590,18 +603,18 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+                  temp = 0x10;
+                  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  temp = 0x2c;
+                  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+-                 if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)  temp = 0x24;
+               }
+               if(SiS_Pr->SiS_VBType & VB_SIS301) {
+                  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+               }
+               if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)     temp = 0x24;
++              if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom)       temp = 0x2c;
+               if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)            temp = 0x08;
+               if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+                          if(SiS_Pr->SiS_VBInfo & SetInSlaveMode)      temp = 0x2c;
+                          else                                         temp = 0x20;
+               }
+-              if((ROMAddr) && (SiS_Pr->SiS_UseROM) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
++              if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+                   if(ROMAddr[0x220] & 0x80) {
+                       if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV-SetCRT2ToHiVisionTV))
+                               temp = ROMAddr[0x221];
+@@ -636,19 +649,20 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+               }
+          }
+-         SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x03C,temp);         /* TW: Panel Link Delay Compensation; (Software Command Reset; Power Saving) */
++         SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x03C,temp);         /* Panel Link Delay Compensation; (Software Command Reset; Power Saving) */
+ #endif  /* SIS300 */
+       } else {
+-#ifdef SIS315H   /* ----------- 310/325/330 series ---------------*/
++#ifdef SIS315H   /* --------------- 315/330 series ---------------*/
+          if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+                 temp = 0x10;
+                 if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  temp = 0x2c;
+               if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+               if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)  temp = 0x24;
++              if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom)    temp = 0x2c;
+               if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+                  temp = 0x08;
+                  if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+@@ -664,7 +678,7 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+                     }
+                  }
+               }
+-              if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
++              if((SiS_Pr->SiS_VBType & VB_SIS301B302B) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
+                  tempbl = 0x00;
+                  if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+                     if(HwDeviceExtension->jChipType < SIS_330) {
+@@ -689,8 +703,16 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+                     if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempbl = 0x0F;
+                  }
+               }
++              
++              if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) {
++                 temp = 0x08;
++                 tempbl = 0;
++                 if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
++                    if(ROMAddr[0x13c] & 0x80) tempbl = 0xf0;
++                 }
++              }
+          }
+-         SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,tempbl,temp);         /* TW: Panel Link Delay Compensation */
++         SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,tempbl,temp);         /* Panel Link Delay Compensation */
+          tempax = 0;
+          if (modeflag & DoubleScanMode) tempax |= 0x80;
+@@ -705,14 +727,13 @@ SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT
+      if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-        /* TW: For 301BDH, we set up the Panel Link */
+-        if( (SiS_Pr->SiS_VBType & VB_NoLCD) &&
+-          (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) ) {
++        /* For 301BDH with LCD, we set up the Panel Link */
++        if( (SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) ) {
+           SiS_SetGroup1_LVDS(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+                              HwDeviceExtension,RefreshRateTableIndex);
+-        } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {                             
++        } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+           SiS_SetGroup1_301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+                             HwDeviceExtension,RefreshRateTableIndex);
+@@ -749,23 +770,27 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   USHORT  push1,push2;
+   USHORT  tempax,tempbx,tempcx,temp;
+   USHORT  resinfo,modeflag;
++  unsigned char p1_7, p1_8;
+   if(ModeNo <= 0x13) {
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-      resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   } else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++      resinfo = 0;
++     } else {
+       modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+       resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     }
+   }
+-  /* TW: The following is only done if bridge is in slave mode: */
++  /* The following is only done if bridge is in slave mode: */
+   tempax = 0xFFFF;
+   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV))  tempax = SiS_GetVGAHT2(SiS_Pr);
+-  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-      modeflag |= Charx8Dot;
+-  }
++  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)  modeflag |= Charx8Dot;
+   if(modeflag & Charx8Dot) tempcx = 0x08;
+   else                     tempcx = 0x09;
+@@ -777,8 +802,7 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   tempax = (tempax / tempcx) - 5;
+   tempbx = tempax & 0x00FF;
+-  temp = 0xFF;                                                  /* set MAX HT */
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,temp);
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0xff);                 /* set MAX HT */
+   tempax = SiS_Pr->SiS_VGAHDE;                                        /* 0x04 Horizontal Display End */
+   if(modeflag & HalfDCLK) tempax >>= 1;
+@@ -789,13 +813,13 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   temp = (tempbx & 0xFF00) >> 8;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-        if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {        
+-          temp += 2;
+-        }
+-  }   
++     if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
++        temp += 2;
++     }
++  }
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+      if(SiS_Pr->SiS_HiVision == 3) {
+-              if(resinfo == 7) temp -= 2;
++        if(resinfo == SIS_RI_800x600) temp -= 2;
+      }
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x05,temp);                 /* 0x05 Horizontal Display Start */
+@@ -804,140 +828,133 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+      (SiS_Pr->SiS_HiVision == 3)) {
+-    temp = (tempbx & 0x00FF) - 1;
+-    if(!(modeflag & HalfDCLK)) {
+-      temp -= 6;
+-      if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-        temp -= 2;
+-        if(ModeNo > 0x13) temp -= 10;
+-      }
+-    }
++     temp = (tempbx & 0x00FF) - 1;
++     if(!(modeflag & HalfDCLK)) {
++        temp -= 6;
++        if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++           temp -= 2;
++           if(ModeNo > 0x13) temp -= 10;
++        }
++     }
+   } else {
+-    tempcx = tempbx & 0x00FF;
+-    tempbx = (tempbx & 0xFF00) >> 8;
+-    tempcx = (tempcx + tempbx) >> 1;
+-    temp = (tempcx & 0x00FF) + 2;
+-    if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV){
+-       temp--;
+-       if(!(modeflag & HalfDCLK)){
+-          if((modeflag & Charx8Dot)){
+-             temp += 4;
+-             if(SiS_Pr->SiS_VGAHDE >= 800) temp -= 6;
+-             if(HwDeviceExtension->jChipType >= SIS_315H) {
+-              if(SiS_Pr->SiS_VGAHDE == 800) temp += 2;
+-             }
+-          }
+-       }
+-    } else {
+-       if(!(modeflag & HalfDCLK)) {
+-          temp -= 4;
+-          if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
+-             if(SiS_Pr->SiS_VGAHDE >= 800) {
+-                temp -= 7;
+-              if(HwDeviceExtension->jChipType < SIS_315H) {
+-                 /* 650/301LV(x) does not do this, 630/301B, 300/301LV do */
+-                   if(SiS_Pr->SiS_ModeType == ModeEGA) {
+-                      if(SiS_Pr->SiS_VGAVDE == 1024) {
+-                         temp += 15;
+-                         if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) 
+-                          temp += 7;
+-                      }
+-                   }
+-              }
+-                if(SiS_Pr->SiS_VGAHDE >= 1280) {
+-                   if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
+-                      if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) temp += 28;
+-                   }
+-                }
+-             }
+-          }
+-       }
+-    }
++     tempcx = tempbx & 0x00FF;
++     tempbx = (tempbx & 0xFF00) >> 8;
++     tempcx = (tempcx + tempbx) >> 1;
++     temp = (tempcx & 0x00FF) + 2;
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        temp--;
++        if(!(modeflag & HalfDCLK)) {
++           if((modeflag & Charx8Dot)) {
++              temp += 4;
++              if(SiS_Pr->SiS_VGAHDE >= 800) temp -= 6;
++              if(HwDeviceExtension->jChipType >= SIS_315H) {
++               if(SiS_Pr->SiS_VGAHDE == 800) temp += 2;
++              }
++           }
++        }
++     } else {
++        if(!(modeflag & HalfDCLK)) {
++           temp -= 4;
++           if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
++              if(SiS_Pr->SiS_VGAHDE >= 800) {
++                 temp -= 7;
++               if(HwDeviceExtension->jChipType < SIS_315H) {
++                  /* 650/301LV(x) does not do this, 630/301B, 300/301LV do */
++                    if(SiS_Pr->SiS_ModeType == ModeEGA) {
++                       if(SiS_Pr->SiS_VGAVDE == 1024) {
++                          temp += 15;
++                          if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)
++                           temp += 7;
++                       }
++                    }
++               }
++                 if(SiS_Pr->SiS_VGAHDE >= 1280) {
++                    if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) temp += 28;
++                 }
++              }
++           }
++        }
++     }
+   }
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,temp);                       /* 0x07 Horizontal Retrace Start */
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x00);                 /* 0x08 Horizontal Retrace End   */
++  p1_7 = temp;
++  p1_8 = 0x00;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+      if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-            if(ModeNo <= 0x01) {
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x2a);
+-              if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x61);
+-              } else {
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x41);
+-              }
+-          } else if(SiS_Pr->SiS_ModeType == ModeText) {
+-              if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x54);
+-              } else {
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x55);
+-              }
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x00);
+-          } else if(ModeNo <= 0x13) {
+-              if(modeflag & HalfDCLK) {
+-                  if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x30);
+-                      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x03);
+-                  } else {
+-                      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x2f);
+-                      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x02);
+-                  }
+-              } else {
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x5b);
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x03);
+-              }
+-          } else if( ((HwDeviceExtension->jChipType >= SIS_315H) && (ModeNo == 0x50)) ||
+-                     ((HwDeviceExtension->jChipType < SIS_315H) && (resinfo == 0 || resinfo == 1)) ) {
+-              if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x30);
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x03);
+-              } else {
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0x2f);
+-                  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,0x03);
+-              }
+-          }
+-
++        if(ModeNo <= 0x01) {
++         p1_7 = 0x2a;
++         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) p1_8 = 0x61;
++         else                                 p1_8 = 0x41;
++      } else if(SiS_Pr->SiS_ModeType == ModeText) {
++         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) p1_7 = 0x54;
++         else                                 p1_7 = 0x55;
++         p1_8 = 0x00;
++      } else if(ModeNo <= 0x13) {
++         if(modeflag & HalfDCLK) {
++            if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++               p1_7 = 0x30;
++               p1_8 = 0x03;
++            } else {
++               p1_7 = 0x2f;
++               p1_8 = 0x02;
++            }
++         } else {
++            p1_7 = 0x5b;
++            p1_8 = 0x03;
++         }
++      } else if( ((HwDeviceExtension->jChipType >= SIS_315H) &&
++                  ((ModeNo == 0x50) || (ModeNo = 0x56) || (ModeNo = 0x53))) ||
++                 ((HwDeviceExtension->jChipType < SIS_315H) &&
++                  (resinfo == SIS_RI_320x200 || resinfo == SIS_RI_320x240)) ) {
++         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++            p1_7 = 0x30,
++            p1_8 = 0x03;
++         } else {
++            p1_7 = 0x2f;
++            p1_8 = 0x03;
++         }
++        }
+      }
+   }
++
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+      if(SiS_Pr->SiS_HiVision & 0x03) {
+-        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0xb2);
++      p1_7 = 0xb2;
+       if(SiS_Pr->SiS_HiVision & 0x02) {
+-         SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,0xab);
++         p1_7 = 0xab;
+       }
+      }
+   }
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,p1_7);                       /* 0x07 Horizontal Retrace Start */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,p1_8);                       /* 0x08 Horizontal Retrace End   */
++
++
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x03);                       /* 0x18 SR08 (FIFO Threshold?)   */
+   SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x19,0xF0);
+-  tempbx = SiS_Pr->SiS_VGAVT;
+-  push1 = tempbx;
+-
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x09,0xFF);                       /* 0x09 Set Max VT    */
+   tempcx = 0x121;
+   tempbx = SiS_Pr->SiS_VGAVDE;                                /* 0x0E Vertical Display End */
+-  if(tempbx == 357) tempbx = 350;
+-  if(tempbx == 360) tempbx = 350;
+-  if(tempbx == 375) tempbx = 350;
+-  if(tempbx == 405) tempbx = 400;
+-  if(tempbx == 420) tempbx = 400;
+-  if(tempbx == 525) tempbx = 480;
++  if     (tempbx == 357) tempbx = 350;
++  else if(tempbx == 360) tempbx = 350;
++  else if(tempbx == 375) tempbx = 350;
++  else if(tempbx == 405) tempbx = 400;
++  else if(tempbx == 420) tempbx = 400;
++  else if(tempbx == 525) tempbx = 480;
+   push2 = tempbx;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-                      if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+-                      if(tempbx == 350) tempbx += 5;
+-                      if(tempbx == 480) tempbx += 5;
+-                      }
+-      }
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++              if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
++           if     (tempbx == 350) tempbx += 5;
++           else if(tempbx == 480) tempbx += 5;
++              }
++     }
+   }
+-  tempbx--;
+-  temp = tempbx & 0x00FF;
+-  tempbx--;
++  tempbx -= 2;
+   temp = tempbx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);                       /* 0x10 vertical Blank Start */
+@@ -945,126 +962,91 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   tempbx--;
+   temp = tempbx & 0x00FF;
+ #if 0
+-  /* TW: Missing code from 630/301B 2.04.5a and 650/302LV 1.10.6s (calles int 2f) */
++  /* Missing code from 630/301B 2.04.5a and 650/302LV 1.10.6s (calles int 2f) */
+   if(xxx()) {
+       if(temp == 0xdf) temp = 0xda;
+   }
+ #endif
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0E,temp);
+-  if(tempbx & 0x0100) {
+-      tempcx |= 0x0002;
+-      if(SiS_Pr->SiS_VBType & VB_SIS301) tempcx |= 0x000a;
+-  }
++  if(tempbx & 0x0100)  tempcx |= 0x0002;
+   tempax = 0x000B;
+   if(modeflag & DoubleScanMode) tempax |= 0x8000;
+-  if(tempbx & 0x0200) {
+-      tempcx |= 0x0040;
+-      if(SiS_Pr->SiS_VBType & VB_SIS301) tempax |= 0x2000;
+-  }
+-
+-  if(SiS_Pr->SiS_VBType & VB_SIS301) {
+-        if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-            if(SiS_Pr->SiS_VGAVDE == 480) {
+-                   tempax = (tempax & 0x00ff) | 0x2000;
+-                   if(modeflag & DoubleScanMode)  tempax |= 0x8000;
+-            }
+-      }
+-  }
++  if(tempbx & 0x0200)  tempcx |= 0x0040;
+   temp = (tempax & 0xFF00) >> 8;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);
+-  if(tempbx & 0x0400) tempcx |= 0x0600;
++  if(tempbx & 0x0400)  tempcx |= 0x0600;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x11,0x00);                       /* 0x11 Vertical Blank End */
+-  tempax = push1;
+-  tempax -= tempbx;
+-  tempax >>= 2;
+-  push1 = tempax;
++  tempax = (SiS_Pr->SiS_VGAVT - tempbx) >> 2;
+-  if(HwDeviceExtension->jChipType >= SIS_315H) {
+-        /* TW: 650/30xLV 1.10.6s */
+-        if(ModeNo > 0x13) {
+-          if(resinfo != 0x09) {  /* 1280x1024 */
+-              tempax <<= 1;
+-              tempbx += tempax;
+-          }
+-      } else {
+-          if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
+-              tempax <<= 1;
+-              tempbx += tempax;
+-          }
+-      }
+-  } else if((resinfo != 0x09) || (SiS_Pr->SiS_VBType & VB_SIS301)) {
+-      tempax <<= 1;
+-      tempbx += tempax;
++  if((ModeNo > 0x13) || (HwDeviceExtension->jChipType < SIS_315H)) {
++     if(resinfo != SIS_RI_1280x1024) {
++      tempbx += (tempax << 1);
++     }
++  } else if(HwDeviceExtension->jChipType >= SIS_315H) {
++     if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
++      tempbx += (tempax << 1);
++     }
+   }
+-  if( (SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+-      (SiS_Pr->SiS_HiVision == 3) ) {
+-      tempbx -= 10;
++  if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
++     (SiS_Pr->SiS_HiVision == 3)) {
++     tempbx -= 10;
+   } else {
+-      if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-                 if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-             if(!(SiS_Pr->SiS_HiVision & 0x03)) {
+-                    tempbx += 40;
+-                  if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                     if(SiS_Pr->SiS_VGAHDE == 800) tempbx += 10;
+-                  }
+-                     }
+-         }
+-      }
++     if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++        if(SiS_Pr->SiS_VBInfo & SetPALTV) {
++         if(!(SiS_Pr->SiS_HiVision & 0x03)) {
++              tempbx += 40;
++            if(HwDeviceExtension->jChipType >= SIS_315H) {
++               if(SiS_Pr->SiS_VGAHDE == 800) tempbx += 10;
++            }
++                 }
++      }
++     }
+   }
+-  tempax = push1;
+   tempax >>= 2;
+   tempax++;
+   tempax += tempbx;
+   push1 = tempax;
+   if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-      if(tempbx <= 513)  {
+-                      if(tempax >= 513) tempbx = 513;
+-      }
++     if(tempbx <= 513)  {
++      if(tempax >= 513) tempbx = 513;
++     }
+   }
+   temp = tempbx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0C,temp);                       /* 0x0C Vertical Retrace Start */
+-  if(!(SiS_Pr->SiS_VBType & VB_SIS301)) {
+-      tempbx--;
+-      temp = tempbx & 0x00FF;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);
+-
+-      if(tempbx & 0x0100) tempcx |= 0x0008;
++  tempbx--;
++  temp = tempbx & 0x00FF;
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);
+-      if(tempbx & 0x0200) {
+-         SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x0B,0x20);
+-      }
++  if(tempbx & 0x0100) tempcx |= 0x0008;
+-      tempbx++;
++  if(tempbx & 0x0200) {
++     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x0B,0x20);
+   }
++  tempbx++;
++
+   if(tempbx & 0x0100) tempcx |= 0x0004;
+   if(tempbx & 0x0200) tempcx |= 0x0080;
+   if(tempbx & 0x0400) {
+-        if(SiS_Pr->SiS_VBType & VB_SIS301) tempcx |= 0x0800;
+-      else                               tempcx |= 0x0C00;
++     if(SiS_Pr->SiS_VBType & VB_SIS301) tempcx |= 0x0800;
++     else                               tempcx |= 0x0C00;
+   }
+   tempbx = push1;
+-  temp = tempbx & 0x00FF;
+-  temp &= 0x0F;
++  temp = tempbx & 0x000F;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0D,temp);                       /* 0x0D vertical Retrace End */
+   if(tempbx & 0x0010) tempcx |= 0x2000;
+   temp = tempcx & 0x00FF;
+-  if(SiS_Pr->SiS_VBType & VB_SIS301) {
+-      if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-            if(SiS_Pr->SiS_VGAVDE == 480)  temp = 0xa3;
+-      }
+-  }
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp);               /* 0x0A CR07 */
+   temp = (tempcx & 0xFF00) >> 8;
+@@ -1074,8 +1056,8 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   temp = (tempax & 0xFF00) >> 8;
+   temp = (temp >> 1) & 0x09;
+   if(!(SiS_Pr->SiS_VBType & VB_SIS301)) {
+-       /* Only use 8 dot clock */
+-       temp |= 0x01;
++     /* Only use 8 dot clock */
++     temp |= 0x01;
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp);               /* 0x16 SR01 */
+@@ -1084,16 +1066,15 @@ SiS_SetGroup1_301(SiS_Private *SiS_Pr, U
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x12,0x00);               /* 0x12 CR17 */
+   if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+-       if(IS_SIS650) {
+-           /* TW: 650/30xLV 1.10.6s */
+-           if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
+-             temp = 0x80;
+-         }
+-       } else temp = 0x80;
+-  } else  temp = 0x00;
++     if(IS_SIS650) {
++        /* 650/30xLV 1.10.6s */
++        if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
++         temp = 0x80;
++      }
++     } else temp = 0x80;
++  } else temp = 0x00;
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp);                       /* 0x1A SR0E */
+-  return;
+ }
+ void
+@@ -1108,40 +1089,52 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+ #endif
+   ULONG  tempeax=0, tempebx, tempecx, tempvcfact=0;
++  /* This is not supported on LVDS */
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
++  if(SiS_Pr->UseCustomMode) return;
++
+   if(ModeNo <= 0x13) {
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-      resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   } else {
+-      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+-      resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+   }
+-  /* TW: Set up Panel Link */
++  /* Set up Panel Link */
+   /* 1. Horizontal setup */
+   tempax = SiS_Pr->SiS_LCDHDES;
+-  if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) &&
+-      (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ) {
+-      tempax -= 8;
++  if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
++     if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) &&
++         (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ) {
++         tempax -= 8;
++     }
+   }
+   tempcx = SiS_Pr->SiS_HT;                                      /* Horiz. Total */
+   tempbx = SiS_Pr->SiS_HDE;                               /* Horiz. Display End */
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++     SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
++     tempbx >>= 1;
++  }
++
+   if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
+      if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-        if((!SiS_Pr->SiS_IF_DEF_DSTN) && (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)) {
+-         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempbx =  800;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempbx = 1024;  /* TW */
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  tempbx = 1024;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)  tempbx = 1152;  /* TW */
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)  tempbx = 1280;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx = 1280; 
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempbx = 1400; 
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempbx = 1600; 
++        if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
++         tempbx = SiS_Pr->PanelXRes;
++      } else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++         tempbx = SiS_Pr->PanelXRes;
++         if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
++            tempbx = 800;
++            if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
++               tempbx = 1024;
++            }
++         }
+         }
+      }
+   }
+@@ -1154,13 +1147,17 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   if(tempax >= SiS_Pr->SiS_HT) tempax -= SiS_Pr->SiS_HT;
+   push2 = tempax;
+-  
+-  if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) { 
+-     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-        if((!SiS_Pr->SiS_IF_DEF_DSTN) && (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)) {
+-         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempcx = 0x0028;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempcx = 0x0018;
+-         else if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
++
++  if((!SiS_Pr->SiS_IF_DEF_FSTN) &&
++     (!SiS_Pr->SiS_IF_DEF_DSTN) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
++     if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
++        if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++           if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++            if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempcx = 0x0028;
++            else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempcx = 0x0018;
++            else if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
+                   (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) ) {
+                  if(HwDeviceExtension->jChipType < SIS_315H) {
+                     if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+@@ -1174,11 +1171,12 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+                  } else {
+                     tempcx = 0x0018;
+                  }
++            }
++            else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)  tempcx = 0x0028;
++            else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0030;
++            else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0030;
++            else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0040;
+          }
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)  tempcx = 0x0028;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0030;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0030;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0040;
+         }
+      }
+   }
+@@ -1188,14 +1186,17 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   tempax = tempcx >> 3;                          /* BPLHRS */
+   temp = tempax & 0x00FF;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,temp);                /* Part1_14h; TW: Panel Link Horizontal Retrace Start  */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,temp);                /* Part1_14h; Panel Link Horizontal Retrace Start  */
+   if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+      temp = (tempax & 0x00FF) + 2;
+   } else {
+      temp = (tempax & 0x00FF) + 10;
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-        if(!SiS_Pr->SiS_IF_DEF_DSTN) {
++        if((!SiS_Pr->SiS_IF_DEF_DSTN) &&
++         (!SiS_Pr->SiS_IF_DEF_FSTN) &&
++         (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
++         (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
+            if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+             temp += 6;
+               if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
+@@ -1219,47 +1220,57 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   temp &= 0x1F;
+   temp |= ((tempcx & 0x0007) << 5);
+-  if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0x20;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,temp);        /* Part1_15h; TW: Panel Link Horizontal Retrace End/Skew */
++#if 0
++  if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0x20;       /* WRONG? BIOS loads cl, not ah */
++#endif  
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,temp);        /* Part1_15h; Panel Link Horizontal Retrace End/Skew */
+   tempbx = push2;
+   tempcx = push1;                                /* lcdhdes  */
+   temp = (tempcx & 0x0007);                      /* BPLHDESKEW  */
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp);        /* Part1_1Ah; TW: Panel Link Vertical Retrace Start (2:0) */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp);        /* Part1_1Ah; Panel Link Vertical Retrace Start (2:0) */
+   tempcx >>= 3;                                  /* BPLHDES */
+   temp = (tempcx & 0x00FF);
+-  if(ModeNo == 0x5b) temp--;                     
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp);        /* Part1_16h; TW: Panel Link Horizontal Display Enable Start  */
++#if 0 /* Not 550 FSTN */
++  if(HwDeviceExtension->jChipType >= SIS_315H) {
++     if(ModeNo == 0x5b) temp--; */
++  }
++#endif
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp);        /* Part1_16h; Panel Link Horizontal Display Enable Start  */
+-  if(HwDeviceExtension->jChipType < SIS_315H) {  
++  if((HwDeviceExtension->jChipType < SIS_315H) ||
++     (SiS_Pr->SiS_IF_DEF_FSTN) ||
++     (SiS_Pr->SiS_IF_DEF_DSTN)) {
+      if(tempbx & 0x07) tempbx += 8;              
+   }
+   tempbx >>= 3;                                  /* BPLHDEE  */
+   temp = tempbx & 0x00FF;
+-  if(ModeNo == 0x5b) temp--;                   
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,temp);        /* Part1_17h; TW: Panel Link Horizontal Display Enable End  */
+-
++#if 0 /* Not 550 FSTN */
++  if(HwDeviceExtension->jChipType >= SIS_315H) {
++     if(ModeNo == 0x5b) temp--;
++  }
++#endif
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,temp);        /* Part1_17h; Panel Link Horizontal Display Enable End  */
++
+   /* 2. Vertical setup */
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+      tempcx = SiS_Pr->SiS_VGAVT;
+      tempbx = SiS_Pr->SiS_VGAVDE;
+-     if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-        if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+-         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)       tempbx =  600;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) tempbx =  600;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempbx =  768;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) tempbx =  768;
+-         else                                                         tempbx = 1024;
+-        }
++     if((SiS_Pr->SiS_CustomT != CUT_BARCO1366) && (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
++        if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
++           if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++            tempbx = SiS_Pr->PanelYRes;
++           }
++      }
+      }
+      tempcx -= tempbx;
+   } else {
+-     tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE;          /* VGAVT-VGAVDE  */
++     tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE;           /* VGAVT-VGAVDE  */
+   }
+@@ -1268,18 +1279,20 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   tempax = SiS_Pr->SiS_VGAVDE;
+-  if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
+-     if( (SiS_Pr->SiS_IF_DEF_TRUMPION == 0)   && 
+-         (!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
+-         (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) ) {
+-        if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempax =  600;
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempax =  600;  
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  tempax =  768;
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)  tempax =  768;  
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)  tempax =  768;  
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempax = 1024; 
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempax = 1050; 
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempax = 1200; 
++  if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++     if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++        if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++           tempax = 600;
++         if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
++            tempax = 768;
++         }
++      }
++     } else if( (SiS_Pr->SiS_IF_DEF_TRUMPION == 0)   &&
++                (!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
++                ((SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) ||
++               (SiS_Pr->SiS_IF_DEF_FSTN) ||
++               (SiS_Pr->SiS_IF_DEF_DSTN)) ) {
++      tempax = SiS_Pr->PanelYRes;
+      }
+   }
+@@ -1290,11 +1303,24 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   tempcx >>= 1;
+-  if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)) {
+-     if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
+-        if(!SiS_Pr->SiS_IF_DEF_DSTN) {
+-         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)        tempcx = 0x0001;
+-         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)  tempcx = 0x0001;
++  if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
++     (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
++      tempcx = 0x0017;
++     } else if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
++        if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
++         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)         tempcx = 0x0003;
++         else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
++                 (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)) tempcx = 0x0003;
++           else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)  tempcx = 0x0001;
++           else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)  tempcx = 0x0001;
++         else                                                           tempcx = 0x0057;
++        } else  {
++         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)         tempcx = 0x0001;
++         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)   tempcx = 0x0001;
+          else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
+                  (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)) {
+                  if(HwDeviceExtension->jChipType < SIS_315H) {
+@@ -1304,7 +1330,7 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+                           tempcx = 0x0003;
+ #endif
+                     } else {
+-                          tempcx = 0x0002;   /* TW: A901; sometimes 0x0003; */
++                          tempcx = 0x0002;   /* A901; sometimes 0x0003; */
+                     }
+                  } else tempcx = 0x0003;
+            }
+@@ -1319,26 +1345,32 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   tempbx += tempcx;                           /* BPLVRS  */
+-  if(HwDeviceExtension->jChipType < SIS_315H) {
+-      tempbx++;
++  if((HwDeviceExtension->jChipType < SIS_315H) ||
++     (SiS_Pr->SiS_IF_DEF_FSTN) ||
++     (SiS_Pr->SiS_IF_DEF_DSTN)) {
++     tempbx++;
+   }
+   if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
+   temp = tempbx & 0x00FF;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp);                /* Part1_18h; TW: Panel Link Vertical Retrace Start  */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp);                /* Part1_18h; Panel Link Vertical Retrace Start  */
+   tempcx >>= 3;
+-  if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
++  if((!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
++     (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+         if( (HwDeviceExtension->jChipType < SIS_315H) &&
+             (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) )     tempcx = 0x0001;
++      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2)  tempcx = 0x0002;
++      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3)  tempcx = 0x0002;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)    tempcx = 0x0003;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)   tempcx = 0x0005;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)   tempcx = 0x0005;
+       else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)   tempcx = 0x0011;
+-        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)  tempcx = 0x0005;        
++        else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)  tempcx = 0x0005;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)  tempcx = 0x0002;
+         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)  tempcx = 0x0011;
+         else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)  {
+@@ -1360,26 +1392,36 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   tempcx = tempcx + tempbx + 1;                  /* BPLVRE  */
+   temp = tempcx & 0x000F;
+-  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xf0,temp); /* Part1_19h; TW: Panel Link Vertical Retrace End (3:0); Misc.  */
++  if(SiS_Pr->SiS_IF_DEF_FSTN ||
++     SiS_Pr->SiS_IF_DEF_DSTN ||
++     (SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
++     (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++     temp |= 0x30;
++  }
++  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xf0,temp); /* Part1_19h; Panel Link Vertical Retrace End (3:0); Misc.  */
+   temp = ((tempbx & 0x0700) >> 8) << 3;          /* BPLDESKEW =0 */
+-  if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE)  temp |= 0x40;
+-  if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA)    temp |= 0x40;
++  if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
++     if(SiS_Pr->SiS_HDE != 640) {
++        if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE)   temp |= 0x40;
++     }
++  } else if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE)  temp |= 0x40;
++  if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA)           temp |= 0x40;
+   if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+-      if(HwDeviceExtension->jChipType >= SIS_315H) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
+-            temp |= 0x80;
+-         }
+-      } else {
+-       if( (HwDeviceExtension->jChipType == SIS_630) ||
+-           (HwDeviceExtension->jChipType == SIS_730) ) {
+-          if(HwDeviceExtension->jChipRevision >= 0x30) {
+-             temp |= 0x80;
+-          }
+-       }
+-      }
++     if(HwDeviceExtension->jChipType >= SIS_315H) {
++        if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
++           temp |= 0x80;
++        }
++     } else {
++      if( (HwDeviceExtension->jChipType == SIS_630) ||
++          (HwDeviceExtension->jChipType == SIS_730) ) {
++         if(HwDeviceExtension->jChipRevision >= 0x30) {
++            temp |= 0x80;
++         }
++      }
++     }
+   }
+-  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,0x87,temp);  /* Part1_1Ah; TW: Panel Link Control Signal (7:3); Vertical Retrace Start (2:0) */
++  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,0x87,temp);  /* Part1_1Ah; Panel Link Control Signal (7:3); Vertical Retrace Start (2:0) */
+   if (HwDeviceExtension->jChipType < SIS_315H) {
+@@ -1396,19 +1438,19 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+       }
+       temp = (USHORT)(tempebx & 0x00FF);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,temp);      /* Part1_1Eh; TW: Panel Link Vertical Scaling Factor */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,temp);      /* Part1_1Eh; Panel Link Vertical Scaling Factor */
+ #endif /* SIS300 */
+   } else {
+-#ifdef SIS315H  /* 310/325 series */
++#ifdef SIS315H  /* 315 series */
+-#ifdef NEWCH701x
+-        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x03);
+-#else
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,0x23);
+-#endif        
++        if(HwDeviceExtension->jChipType == SIS_740) {
++           SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x03);
++        } else {
++         SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,0x23);
++      }
+       tempeax = SiS_Pr->SiS_VGAVDE << 18;
+       temp = (USHORT)(tempeax % (ULONG)SiS_Pr->SiS_VDE);
+@@ -1417,12 +1459,13 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+       tempebx = tempeax;                         /* BPLVCFACT  */
+         tempvcfact = tempeax;
+       temp = (USHORT)(tempebx & 0x00FF);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,temp);      /* Part1_37h; TW: Panel Link Vertical Scaling Factor */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,temp);      /* Part1_37h; Panel Link Vertical Scaling Factor */
+       temp = (USHORT)((tempebx & 0x00FF00) >> 8);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,temp);      /* Part1_36h; TW: Panel Link Vertical Scaling Factor */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,temp);      /* Part1_36h; Panel Link Vertical Scaling Factor */
+       temp = (USHORT)((tempebx & 0x00030000) >> 16);
++      temp &= 0x03;
+       if(SiS_Pr->SiS_VDE == SiS_Pr->SiS_VGAVDE) temp |= 0x04;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,temp);      /* Part1_35h; TW: Panel Link Vertical Scaling Factor */
++      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,temp);      /* Part1_35h; Panel Link Vertical Scaling Factor */
+ #endif /* SIS315H */
+@@ -1434,47 +1477,50 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+   push1 = temp;                                          
+   if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-      if(!SiS_Pr->SiS_IF_DEF_DSTN){
++      if(!SiS_Pr->SiS_IF_DEF_FSTN && !SiS_Pr->SiS_IF_DEF_DSTN) {
+               if(HwDeviceExtension->jChipType < SIS_315H) {
+                       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+-                                      if(resinfo == 15) tempcx++;
++                                      if(resinfo == SIS_RI_1024x600) tempcx++;
+                               if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-                                      if(resinfo == 7) tempcx++;
++                                      if(resinfo == SIS_RI_800x600) tempcx++;
+                               }
+                       } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-                                      if(resinfo == 7) tempcx++;
+-                              if(resinfo == 8) tempcx++; /* TW: Doesnt make sense anyway... */
+-                      } else  if(resinfo == 8) tempcx++;
++                                      if(resinfo == SIS_RI_800x600)  tempcx++;
++                              if(resinfo == SIS_RI_1024x768) tempcx++; /* Doesnt make sense anyway... */
++                      } else  if(resinfo == SIS_RI_1024x768) tempcx++;
+               } else {
+                       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-                                      if(resinfo == 7) tempcx++;
++                                      if(resinfo == SIS_RI_800x600)  tempcx++;
+                       }
+               }
+       }
+   }
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+-     tempcx = SiS_Pr->SiS_VGAVDE;
+-     tempbx = SiS_Pr->SiS_VGAVDE - 1;
++     if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
++        tempcx = SiS_Pr->SiS_VGAVDE;
++        tempbx = SiS_Pr->SiS_VGAVDE - 1;
++     }
+   }
+   temp = ((tempbx & 0x0700) >> 8) << 3;
+   temp |= ((tempcx & 0x0700) >> 8);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1D,temp);       /* Part1_1Dh; TW: Vertical Display Overflow; Control Signal */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1D,temp);       /* Part1_1Dh; Vertical Display Overflow; Control Signal */
+   temp = tempbx & 0x00FF;
+-  if(SiS_Pr->SiS_IF_DEF_FSTN) temp++;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1C,temp);       /* Part1_1Ch; TW: Panel Link Vertical Display Enable End  */
++  /* if(SiS_Pr->SiS_IF_DEF_FSTN) temp++;  */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1C,temp);       /* Part1_1Ch; Panel Link Vertical Display Enable End  */
+   temp = tempcx & 0x00FF;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1B,temp);       /* Part1_1Bh; TW: Panel Link Vertical Display Enable Start  */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1B,temp);       /* Part1_1Bh; Panel Link Vertical Display Enable Start  */
+   /* 3. Additional horizontal setup (scaling, etc) */
+   tempecx = SiS_Pr->SiS_VGAHDE;
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-     if(modeflag & HalfDCLK)
+-        tempecx >>= 1;
++     if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
++        if(modeflag & HalfDCLK) tempecx >>= 1;
++     }
+   }
+   tempebx = SiS_Pr->SiS_HDE;
+   if(tempecx == tempebx) tempeax = 0xFFFF;
+@@ -1484,134 +1530,162 @@ SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,U
+      temp = (USHORT)(tempeax % tempebx);
+      tempeax = tempeax / tempebx;
+      if(HwDeviceExtension->jChipType >= SIS_315H) {
+-         if(temp) tempeax++;
++        if(temp) tempeax++;
+      }
+   }
+   tempecx = tempeax;
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      tempeax = SiS_Pr->SiS_VGAHDE;
+-      if(modeflag & HalfDCLK) tempeax >>= 1;
+-      tempeax <<= 16;
+-      tempeax = (tempeax / tempecx) - 1;
++     tempeax = SiS_Pr->SiS_VGAHDE;
++     if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
++        if(modeflag & HalfDCLK) tempeax >>= 1;
++     }
++     tempeax <<= 16;
++     tempeax = (tempeax / tempecx) - 1;
+   } else {
+-      tempeax = ((SiS_Pr->SiS_VGAHT << 16) / tempecx) - 1;
++     tempeax = ((SiS_Pr->SiS_VGAHT << 16) / tempecx) - 1;
+   }
+   tempecx <<= 16;
+   tempecx |= (tempeax & 0xFFFF);
+   temp = (USHORT)(tempecx & 0x00FF);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1F,temp);        /* Part1_1Fh; TW: Panel Link DDA Operational Number in each horiz. line */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1F,temp);        /* Part1_1Fh; Panel Link DDA Operational Number in each horiz. line */
+   tempbx = SiS_Pr->SiS_VDE;
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      tempeax = (SiS_Pr->SiS_VGAVDE << 18) / tempvcfact;
+-      tempbx = (USHORT)(tempeax & 0x0FFFF);
++     tempeax = (SiS_Pr->SiS_VGAVDE << 18) / tempvcfact;
++     tempbx = (USHORT)(tempeax & 0x0FFFF);
+   } else {
+-      tempax = SiS_Pr->SiS_VGAVDE << 6;
+-      tempbx = push1;
+-      tempbx &= 0x3f;
+-      if(tempbx == 0) tempbx = 64;
+-      tempax = tempax / tempbx;
+-      tempbx = tempax;
++     tempeax = SiS_Pr->SiS_VGAVDE << 6;
++     tempbx = push1 & 0x3f;
++     if(tempbx == 0) tempbx = 64;
++     tempeax /= tempbx;
++     tempbx = (USHORT)(tempeax & 0x0FFFF);
+   }
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempbx--;
+-  if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA)                 tempbx = 1;
++  if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) {
++     if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) tempbx = 1;
++     else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)  tempbx = 1;
++  }
+   temp = ((tempbx & 0xFF00) >> 8) << 3;
+   temp |= (USHORT)((tempecx & 0x0700) >> 8);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x20,temp);       /* Part1_20h; TW: Overflow register */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x20,temp);       /* Part1_20h; Overflow register */
+   temp = tempbx & 0x00FF;
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x21,temp);       /* Part1_21h; TW: Panel Link Vertical Accumulator Register */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x21,temp);       /* Part1_21h; Panel Link Vertical Accumulator Register */
+   tempecx >>= 16;                               /* BPLHCFACT  */
+-  if(HwDeviceExtension->jChipType < SIS_315H) {
+-      if(modeflag & HalfDCLK) tempecx >>= 1;
++  if((HwDeviceExtension->jChipType < SIS_315H) || (SiS_Pr->SiS_IF_DEF_FSTN) || (SiS_Pr->SiS_IF_DEF_DSTN)) {
++     if(modeflag & HalfDCLK) tempecx >>= 1;
+   }
+   temp = (USHORT)((tempecx & 0xFF00) >> 8);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x22,temp);       /* Part1_22h; TW: Panel Link Horizontal Scaling Factor High */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x22,temp);       /* Part1_22h; Panel Link Horizontal Scaling Factor High */
+   temp = (USHORT)(tempecx & 0x00FF);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x23,temp);         /* Part1_22h; TW: Panel Link Horizontal Scaling Factor Low */
++  SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x23,temp);         /* Part1_22h; Panel Link Horizontal Scaling Factor Low */
+   /* 630/301B and 630/LVDS do something for 640x480 panels here */
+ #ifdef SIS315H
+-  /* TW: DSTN/FSTN initialisation - hardcoded for 320x480 panel */
+-  if(SiS_Pr->SiS_IF_DEF_DSTN) {
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,0x01);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x25,0x00);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x26,0x00);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x27,0x00);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x28,0x87);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x29,0x5A);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2A,0x4B);
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x007,0x03);
+-      tempbx = SiS_Pr->SiS_HDE + 64;                          /*Blps = lcdhdee(lcdhdes+HDE) + 64*/
+-      temp = tempbx & 0x00FF;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x38,temp);
+-      temp=((tempbx & 0xFF00) >> 8) << 3;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,~0x078,temp);
+-      tempbx += 32;                                           /*Blpe=lBlps+32*/
+-      temp = tempbx & 0x00FF;
+-      if(SiS_Pr->SiS_IF_DEF_FSTN)  temp=0;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x39,temp);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3A,0x00);           /*Bflml=0*/
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x007,0x00);
+-      tempbx = SiS_Pr->SiS_VDE / 2;
+-      temp = tempbx & 0x00FF;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3B,temp);
+-      temp = ((tempbx & 0xFF00) >> 8) << 3;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x038,temp);
+-      tempeax = SiS_Pr->SiS_HDE << 2;                         /* BDxFIFOSTOP = (HDE*4)/128 */
+-      tempebx = 128;
+-      temp = (USHORT)(tempeax % tempebx);
+-      tempeax = tempeax / tempebx;
+-      if(temp != 0)  tempeax++;
+-      temp = (USHORT)(tempeax & 0x003F);
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x45,~0x0FF,temp);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3F,0x00);           /* BDxWadrst0 */
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3E,0x00);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3D,0x10);
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x040,0x00);
+-      tempax = SiS_Pr->SiS_HDE >> 4;                          /* BDxWadroff = HDE*4/8/8 */
+-      pushcx = tempax;
+-      temp = tempax & 0x00FF;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x43,temp);
+-      temp = ((tempax & 0xFF00) >> 8) << 3;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x0F8,temp);
+-      tempax = SiS_Pr->SiS_VDE;                             /*BDxWadrst1 = BDxWadrst0 + BDxWadroff * VDE */
+-      tempeax = (tempax * pushcx);
+-      tempebx = 0x00100000 + tempeax;
+-      temp = (USHORT)tempebx & 0x000000FF;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x42,temp);
+-      temp = (USHORT)((tempebx & 0x0000FF00)>>8);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x41,temp);
+-      temp = (USHORT)((tempebx & 0x00FF0000)>>16);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x40,temp);
+-      temp = (USHORT)(((tempebx & 0x01000000)>>24) << 7);
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x080,temp);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x03);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0x50);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x04,0x00);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x01);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x13,0x00);
+-      SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);        /* Unlock */
+-      SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1e,0x62);
+-      if(SiS_Pr->SiS_IF_DEF_FSTN){
+-              SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2b,0x1b);
+-              SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2c,0xe3);
+-              SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1e,0x62);
+-              SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2e,0x04);
+-              SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2f,0x42);
+-              SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,0x01);
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2b,0x02);
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2c,0x00);
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x00);
+-      }
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0f,0x30);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1e,0x7d);
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2e,0xe0);
++  if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x25,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x26,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x27,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x28,0x87);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x29,0x5A);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2A,0x4B);
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x007,0x03);
++     tempax = SiS_Pr->SiS_HDE;                                /* Blps = lcdhdee(lcdhdes+HDE) + 64 */
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
++     tempax += 64;
++     temp = tempax & 0x00FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x38,temp);
++     temp = ((tempax & 0xFF00) >> 8) << 3;
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,~0x078,temp);
++     tempax += 32;                                            /* Blpe=lBlps+32 */
++     temp = tempax & 0x00FF;
++     if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x39,temp);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3A,0x00);            /* Bflml=0 */
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x007,0x00);
++
++     tempax = SiS_Pr->SiS_VDE;
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
++     tempax >>= 1;
++     temp = tempax & 0x00FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3B,temp);
++     temp = ((tempax & 0xFF00) >> 8) << 3;
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x038,temp);
++
++     tempeax = SiS_Pr->SiS_HDE;
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempeax >>= 1;
++     tempeax <<= 2;                                           /* BDxFIFOSTOP = (HDE*4)/128 */
++     tempebx = 128;
++     temp = (USHORT)(tempeax % tempebx);
++     tempeax = tempeax / tempebx;
++     if(temp) tempeax++;
++     temp = (USHORT)(tempeax & 0x003F);
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x45,~0x0FF,temp);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3F,0x00);            /* BDxWadrst0 */
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3E,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3D,0x10);
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x040,0x00);
++
++     tempax = SiS_Pr->SiS_HDE;
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
++     tempax >>= 4;                                            /* BDxWadroff = HDE*4/8/8 */
++     pushcx = tempax;
++     temp = tempax & 0x00FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x43,temp);
++     temp = ((tempax & 0xFF00) >> 8) << 3;
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x0F8,temp);
++
++     tempax = SiS_Pr->SiS_VDE;                                /* BDxWadrst1 = BDxWadrst0 + BDxWadroff * VDE */
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++        SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
++     tempeax = (tempax * pushcx);
++     tempebx = 0x00100000 + tempeax;
++     temp = (USHORT)tempebx & 0x000000FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x42,temp);
++     temp = (USHORT)((tempebx & 0x0000FF00) >> 8);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x41,temp);
++     temp = (USHORT)((tempebx & 0x00FF0000) >> 16);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x40,temp);
++     temp = (USHORT)(((tempebx & 0x01000000) >> 24) << 7);
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x080,temp);
++
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x03);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0x50);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x04,0x00);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x01);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x19,0x38);
++
++     if(SiS_Pr->SiS_IF_DEF_FSTN) {
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2b,0x02);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2c,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,0x0c);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x38,0x80);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x39,0xA0);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3a,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3b,0xf0);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3c,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3d,0x10);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3e,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3f,0x00);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x40,0x10);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x41,0x25);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x42,0x80);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x43,0x14);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x44,0x03);
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x45,0x0a);
++     }
+   }
+ #endif  /* SIS315H */
+@@ -1629,7 +1703,7 @@ SiS_CRT2AutoThreshold(SiS_Private *SiS_P
+ #ifdef SIS315H
+-/* TW: For LVDS / 302B/30xLV - LCDA (this must only be called on 310/325 series!) */
++/* For LVDS / 302B/30xLV - LCDA (this must only be called on 315 series!) */
+ void
+ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, USHORT  BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                    PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex)
+@@ -1638,6 +1712,10 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   USHORT push1,push2,tempax,tempbx,tempcx,temp;
+   ULONG tempeax=0,tempebx,tempecx,tempvcfact;
++  /* This is not supported with LCDA */
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
++  if(SiS_Pr->UseCustomMode) return;
++
+   if(IS_SIS330) {
+      SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);                   /* Xabre 1.01.03 */
+   } else if(IS_SIS740) {
+@@ -1645,7 +1723,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+         SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x04);        /* 740/LVDS */
+       SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x03);
+      } else {
+-        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);                        /* 740/301LV 1.10.1i */
++        SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);                        /* 740/301LV, 301BDH */
+      }
+   } else {
+      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {                                       /* 650/LVDS */
+@@ -1669,10 +1747,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   tempcx = SiS_Pr->SiS_HT;
+   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-        if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)       tempbx = 1024;
+-      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempbx = 1400;
+-      else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempbx = 1600;
+-      else                                                          tempbx = 1280;
++        tempbx = SiS_Pr->PanelXRes;
+   }
+   tempcx -= tempbx;                                           /* HT-HDE  */
+   push1 = tempax;
+@@ -1684,7 +1759,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   tempcx >>= 2;
+-  /* TW: 650/30xLV 1.10.6s, 740/LVDS */
++  /* 650/30xLV 1.10.6s, 740/LVDS */
+   if( ((SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) ||
+       ((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ) {
+      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+@@ -1748,13 +1823,10 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   tempbx = SiS_Pr->SiS_LCDVDES;                                       /* VGAVDES  */
+   push1 = tempbx;                                                     
+   if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)        tempax = 768;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)   tempax = 768;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)  tempax = 1024;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)  tempax = 1050;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)  tempax = 1200;
+-    else                                                           tempax = 960;
+-  } else tempax = SiS_Pr->SiS_VGAVDE;  /* Trumpion */
++     tempax = SiS_Pr->PanelYRes;
++  } else {
++     tempax = SiS_Pr->SiS_VGAVDE;
++  }
+   tempbx += tempax;
+   tempax = SiS_Pr->SiS_VT;                                            /* VT  */
+@@ -1764,7 +1836,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+  
+   tempcx >>= 2;       
+-  /* TW: 650/30xLV 1.10.6s, 740/LVDS */
++  /* 650/30xLV 1.10.6s, 740/LVDS */
+   if( ((SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) ||
+       ((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ) {
+      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+@@ -1806,7 +1878,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,temp);
+   } else {
+-     /* TW: 650/30xLV 1.10.6s, Xabre */
++     /* 650/30xLV 1.10.6s, Xabre */
+      temp |= 0xC0;
+      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,temp);             /* Part1_19h  */
+   }
+@@ -1823,7 +1895,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+      }
+   } else {
+      if(IS_SIS650) {
+-        /* TW: 650/30xLV 1.10.6s */
++        /* 650/30xLV 1.10.6s */
+         if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+            if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) temp |= 0x80;
+         }
+@@ -1839,7 +1911,7 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-      if(resinfo == 7) tempcx++;
++      if(resinfo == SIS_RI_800x600) tempcx++;
+     }
+   }
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+@@ -1925,15 +1997,15 @@ SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, 
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x23,temp);
+ #if 0
+-  /* TW: Missing code (calles int 2f) (650/302LV 1.10.6s; 1.10.7w doesn't do this) */
++  /* Missing code (calles int 2f) (650/302LV 1.10.6s; 1.10.7w doesn't do this) */
+   if(xxx()) {
+       SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0e,0xda);
+   }
+ #endif
+-  /* TW: Only for LVDS and 301LV/302LV */
++  /* Only for LVDS and 301LV/302LV */
+   if((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (SiS_Pr->SiS_VBInfo & VB_SIS301LV302LV)){
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1e,0x20);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1e,0x20);
+   }
+   return;
+@@ -1951,10 +2023,10 @@ void SiS_SetCRT2Offset(SiS_Private *SiS_
+   offset = SiS_GetOffset(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                          HwDeviceExtension);
+-#if 0
+-  if(SiS_Pr->LCDResInfo == 13) offset >>= 1;
+-  if(SiS_Pr->LCDResInfo == 12) offset >>= 1;
+-#endif                         
++
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++     SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) offset >>= 1;
++
+   temp = (UCHAR)(offset & 0xFF);
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,temp);
+   temp = (UCHAR)((offset & 0xFF00) >> 8);
+@@ -1976,13 +2048,7 @@ SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR
+   } else {
+      infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
+      modeinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
+-  
+-     if(HwDeviceExtension->jChipType < SIS_315H ) {
+-      index = (modeinfo >> 4) & 0xFF;
+-     } else {
+-      index = (modeinfo >> 8) & 0xFF;
+-     }
+-
++     index = (modeinfo >> 8) & 0xFF;
+      temp = SiS_Pr->SiS_ScreenOffset[index];
+   }
+   
+@@ -1992,9 +2058,8 @@ SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR
+   temp *= colordepth;
+-  /* TW: For 1400x1050 and 856x480 */
+-  if( ( ((ModeNo >= 0x26) && (ModeNo <= 0x28)) || 
+-        ModeNo == 0x3f || 
++  if( ( ((ModeNo >= 0x26) && (ModeNo <= 0x28)) ||
++        ModeNo == 0x3f ||
+       ModeNo == 0x42 || 
+       ModeNo == 0x45 ) ||
+       (SiS_Pr->UseCustomMode && (SiS_Pr->CHDisplay % 16)) ) {
+@@ -2012,7 +2077,8 @@ SiS_GetColorDepth(SiS_Private *SiS_Pr, U
+   SHORT  index;
+   USHORT modeflag;
+-  if(SiS_Pr->UseCustomMode) {
++  /* Do NOT check UseCustomMode, will skrew up FIFO */
++  if(ModeNo == 0xfe) {
+      modeflag = SiS_Pr->CModeFlag;
+   } else {
+      if(ModeNo <= 0x13)
+@@ -2035,7 +2101,11 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+   flag = 0;
+   tempbl = 0xC0;
+-  infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
++  if(SiS_Pr->UseCustomMode) {
++     infoflag = SiS_Pr->CInfoFlag;
++  } else {
++     infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
++  }
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {                                  /* LVDS */
+@@ -2044,12 +2114,19 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+     } else if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_LCDInfo & LCDSync)) {
+        tempah = SiS_Pr->SiS_LCDInfo;
+     } else tempah = infoflag >> 8;
+-    
++
+     tempah &= 0xC0;
+-    
++
+     tempah |= 0x20;
+     if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
++    if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++       if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
++          (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++        tempah |= 0xc0;
++       }
++    }
++
+     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+        if(HwDeviceExtension->jChipType >= SIS_315H) {
+           tempah >>= 3;
+@@ -2079,9 +2156,11 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+             tempah |= 0x20;
+             if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
++#if 0
+             if (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+-              /* TW: BIOS does something here @@@ */
++              /* BIOS does something here @@@ */
+             }
++#endif
+           tempah &= 0x3f;
+           tempah |= tempbl;
+@@ -2089,16 +2168,11 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+          } else {                                                     /* 630 - 301 */
+-            if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-               tempah = SiS_Pr->SiS_LCDInfo;
+-             if(SiS_Pr->SiS_LCDInfo & DontExpandLCDShift) { /* ! */
+-                flag = 1;
+-             }
+-            }
+-            if(flag != 1) tempah = infoflag >> 8;
++            tempah = infoflag >> 8;
+             tempah &= 0xC0;
+-            tempah |= 0x30;
+-            SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x3F,tempah);
++            tempah |= 0x20;
++          if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
++            SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
+          }
+@@ -2106,9 +2180,9 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+       } else {
+-#ifdef SIS315H  /* ----- 310/325 series ---- */
++#ifdef SIS315H  /* ------- 315 series ------ */
+-         if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {                  /* 310/325 - 30xLV */
++         if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {                  /* 315 - 30xLV */
+             tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
+             tempah &= 0xC0;
+@@ -2116,24 +2190,33 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+             if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
+             SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
+-         } else {                                                     /* 310/325 - 301, 301B */
++         } else {                                                     /* 315 - 301, 301B */
+             tempah = infoflag >> 8;
+             tempah &= 0xC0;
+-          if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-             if(SiS_Pr->SiS_LCDInfo & LCDSync) {
+-                tempah = SiS_Pr->SiS_LCDInfo;
+-                tempah &= 0xC0;
++          if(!SiS_Pr->UseCustomMode) {
++             if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++                if(SiS_Pr->SiS_LCDInfo & LCDSync) {
++                   tempah = SiS_Pr->SiS_LCDInfo;
++                   tempah &= 0xC0;
++                }
+              }
+           }
+           
+             tempah |= 0x20;
+             if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
++          
+ #if 0
+             if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+-              /* TW: BIOS does something here @@@ */
++              /* BIOS does something here @@@ */
+             }
+-#endif            
++#endif
++
++          if(SiS_Pr->SiS_VBType & VB_NoLCD) {                 /* TEST, imitate BIOS bug */
++             if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++                tempah |= 0xc0;
++             }
++          }
+             SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
+          } 
+@@ -2143,7 +2226,7 @@ SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USH
+    }
+ }
+-/* TW: Set CRT2 FIFO on 300/630/730 */
++/* Set CRT2 FIFO on 300/630/730 */
+ #ifdef SIS300
+ void
+ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+@@ -2197,7 +2280,7 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+   if(!SiS_Pr->CRT1UsesCustomMode) {
+   
+-     CRT1ModeNo = SiS_Pr->SiS_CRT1Mode;                                 /* get CRT1 ModeNo */
++     CRT1ModeNo = SiS_Pr->SiS_CRT1Mode;                                       /* get CRT1 ModeNo */
+      SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT1ModeNo,&modeidindex);
+      SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
+      SiS_Pr->SiS_SelectCRT2Rate = 0;
+@@ -2205,20 +2288,32 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+                                               modeidindex,HwDeviceExtension);
+      if(CRT1ModeNo >= 0x13) {
+-       index = SiS_Pr->SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
+-       index &= 0x3F;
+-       VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;                      /* Get VCLK */
+-       data2 = SiS_Pr->SiS_ModeType - 2;
++        index = SiS_Pr->SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
++        index &= 0x3F;
++        VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;                             /* Get VCLK */
++
++      colorth = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT1ModeNo,modeidindex);     /* Get colordepth */
++        colorth >>= 1;
++        if(!colorth) colorth++;
+      }
+-     
++
+   } else {
+   
+      CRT1ModeNo = 0xfe;
+-     VCLK = SiS_Pr->CSRClock;                                         /* Get VCLK */
+-     data2 = (SiS_Pr->CModeFlag & ModeInfoFlag) - 2;
+-  
+-  }                   
+-     
++     VCLK = SiS_Pr->CSRClock_CRT1;                                            /* Get VCLK */
++     data2 = (SiS_Pr->CModeFlag_CRT1 & ModeInfoFlag) - 2;
++     switch(data2) {                                                          /* Get color depth */
++        case 0 : colorth = 1; break;
++        case 1 : colorth = 1; break;
++        case 2 : colorth = 2; break;
++        case 3 : colorth = 2; break;
++        case 4 : colorth = 3; break;
++        case 5 : colorth = 4; break;
++        default: colorth = 2;
++     }
++
++  }
++
+   if(CRT1ModeNo >= 0x13) {
+     if(HwDeviceExtension->jChipType == SIS_300) {
+        index = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A);
+@@ -2227,22 +2322,8 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+     }
+     index &= 0x07;
+     MCLK = SiS_Pr->SiS_MCLKData_0[index].CLOCK;                               /* Get MCLK */
+-    
+-#ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "FIFO2: CRT1Mode 0x%x VCLK %d MCLK %d modetype-2 = %d\n",
+-      CRT1ModeNo, VCLK, MCLK, data2);
+-#endif  
+-  
+-    switch(data2) {                                                   /* Get color depth */
+-      case 0 :        colorth = 1; break;
+-      case 1 :        colorth = 1; break;
+-      case 2 :        colorth = 2; break;
+-      case 3 :        colorth = 2; break;
+-      case 4 :        colorth = 3; break;
+-      case 5 :        colorth = 4; break;
+-      default:  colorth = 2; break;
+-    }
+-    data2 = (colorth * VCLK) / MCLK;  
++
++    data2 = (colorth * VCLK) / MCLK;
+     temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+     temp = ((temp & 0x00FF) >> 6) << 1;
+@@ -2252,22 +2333,12 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+     data2 = temp - data2;
+     
+-#ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "FIFO2: data2 (step1) = %d\n",
+-      data2);
+-#endif    
+-
+     if((28 * 16) % data2) {
+               data2 = (28 * 16) / data2;
+               data2++;
+     } else {
+               data2 = (28 * 16) / data2;
+     }
+-    
+-#ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "FIFO2: data2 (step2) = %d\n",
+-      data2);
+-#endif
+     if(HwDeviceExtension->jChipType == SIS_300) {
+@@ -2313,10 +2384,6 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+        temp &= 0x0F;   
+        tempal |= temp;
+-#ifdef TWDEBUG
+-       xf86DrvMsg(0, X_INFO, "FIFO2: Latencyfactorindex = 0x%x\n", tempal);
+-#endif
+-      
+        tempbx = tempal;   /* BIOS BUG (2.04.5d, 2.04.6a use ah here, which is unset!) */
+        tempbx = 0;        /* -- do it like the BIOS anyway... */
+        tempax = tempbx;
+@@ -2341,7 +2408,7 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+        SiS_SetReg4(0xcf8,0x800000A0);
+        eax = SiS_GetReg3(0xcfc);
+ #else
+-       /* TW: We use pci functions X offers. We use tag 0, because
++       /* We use pci functions X offers. We use tag 0, because
+         * we want to read/write to the host bridge (which is always
+         * 00:00.0 on 630, 730 and 540), not the VGA device.
+         */
+@@ -2368,43 +2435,41 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+        if(!(temp & 0x80)) data += 5;
+     }
+     
+-#ifdef TWDEBUG    
+-    xf86DrvMsg(0, X_INFO, "FIFO2: latencyfactor (CRT1) = %d\n", data);
+-#endif
+-
+     data += data2;                            /* CRT1 Request Period */
+     
+-#ifdef TWDEBUG    
+-    xf86DrvMsg(0, X_INFO, "FIFO2: CRT1 request period = %d\n", data);
+-#endif
+-
+-    CRT2ModeNo = ModeNo;
+     SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+     SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
+-    SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&modeidindex);    
+-    refreshratetableindex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
+-                                               modeidindex,HwDeviceExtension);
++    if(!SiS_Pr->UseCustomMode) {
++
++       CRT2ModeNo = ModeNo;
++       SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&modeidindex);
++
++       refreshratetableindex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
++                                                  modeidindex,HwDeviceExtension);
++
++       index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,modeidindex,
++                               refreshratetableindex,HwDeviceExtension);
++       VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;                              /* Get VCLK  */
++
++       if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++          if((ROMAddr) && SiS_Pr->SiS_UseROM) {
++           if(ROMAddr[0x220] & 0x01) {
++                VCLK = ROMAddr[0x229] | (ROMAddr[0x22a] << 8);
++           }
++          }
++       }
++
++    } else {
++
++       CRT2ModeNo = 0xfe;
++       VCLK = SiS_Pr->CSRClock;                                                       /* Get VCLK */
+-    index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,modeidindex,
+-                            refreshratetableindex,HwDeviceExtension);
+-    VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;                                 /* Get VCLK  */
+-    
+-    data2 = SiS_Pr->SiS_ModeType - 2;
+-    switch(data2) {                                                   /* Get color depth */
+-      case 0 :        colorth = 1; break;
+-      case 1 :        colorth = 1; break;
+-      case 2 :        colorth = 2; break;
+-      case 3 :        colorth = 2; break;
+-      case 4 :        colorth = 3; break;
+-      case 5 :        colorth = 4; break;
+-      default:  colorth = 2; break;
+     }
+-    
+-#ifdef TWDEBUG    
+-    xf86DrvMsg(0, X_INFO, "FIFO2: CRT2Mode 0x%x VCLK %d MCLK %d modetype-2 = %d, colorth %d\n",
+-      CRT2ModeNo, VCLK, MCLK, data2, colorth);
+-#endif
++
++    colorth = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT2ModeNo,modeidindex);       /* Get colordepth */
++    colorth >>= 1;
++    if(!colorth) colorth++;
+     data = data * VCLK * colorth;
+     if(data % (MCLK << 4)) {
+@@ -2414,10 +2479,6 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+               data = data / (MCLK << 4);
+     }
+     
+-#ifdef TWDEBUG    
+-    xf86DrvMsg(0, X_INFO, "FIFO2: data (unclipped) = 0x%x\n", data);
+-#endif    
+-    
+     if(data <= 6) data = 6;
+     if(data > 0x14) data = 0x14;
+@@ -2456,13 +2517,13 @@ SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,
+ }
+ #endif
+-/* TW: Set FIFO on 310/325/330 series */
++/* Set FIFO on 315/330 series */
+ #ifdef SIS315H
+ void
+ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+                     PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+-
++#if 0   /* This code is obsolete */
+   UCHAR CombCode[]  = { 1, 1, 1, 4, 3, 1, 3, 4,
+                         4, 1, 4, 4, 5, 1, 5, 4};
+   UCHAR CRT2ThLow[] = { 39, 63, 55, 79, 78,102, 90,114,
+@@ -2474,11 +2535,13 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+   USHORT ModeIdIndex;
+   USHORT RefreshRateTableIndex;
+   USHORT SelectRate_backup;
+-  
++
+   SelectRate_backup = SiS_Pr->SiS_SelectCRT2Rate;
+-  
++#endif
++
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x01,0x3B);
++#if 0
+   if(!SiS_Pr->CRT1UsesCustomMode) {
+   
+      CRT1ModeNo = SiS_Pr->SiS_CRT1Mode;                                 /* get CRT1 ModeNo */
+@@ -2489,28 +2552,27 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+      /* Get REFIndex for crt1 refreshrate */
+      RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT1ModeNo,
+-                                             ModeIdIndex,HwDeviceExtension);
++                                                ModeIdIndex,HwDeviceExtension);
++     index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
++     tempax = SiS_Pr->SiS_VCLKData[index].CLOCK;                      /* Get VCLK */
+-     index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT1ModeNo,ModeIdIndex,
+-                          RefreshRateTableIndex,HwDeviceExtension);
+-     tempax = SiS_Pr->SiS_VCLKData[index].CLOCK;                        /* Get VCLK */
+-     
+      tempbx = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT1ModeNo,ModeIdIndex); /* Get colordepth */
+      tempbx >>= 1;
+-     if(!tempbx) tempbx++; 
+-     
++     if(!tempbx) tempbx++;
++
+   } else {
+-  
+-     tempax = SiS_Pr->CSRClock;                                               /* Get VCLK */
+-     tempbx = (SiS_Pr->CModeFlag & ModeInfoFlag) - 2;
++
++     CRT1ModeNo = 0xfe;
++     tempax = SiS_Pr->CSRClock_CRT1;                                  /* Get VCLK */
++     tempbx = (SiS_Pr->CModeFlag_CRT1 & ModeInfoFlag) - 2;
+      switch(tempbx) {                                                 /* Get color depth */
+-       case 0 :       tempbx = 1; break;
+-       case 1 :       tempbx = 1; break;
+-       case 2 :       tempbx = 2; break;
+-       case 3 :       tempbx = 2; break;
+-       case 4 :       tempbx = 3; break;
+-       case 5 :       tempbx = 4; break;
+-       default:       tempbx = 2; break;
++       case 0 : tempbx = 1; break;
++       case 1 : tempbx = 1; break;
++       case 2 : tempbx = 2; break;
++       case 3 : tempbx = 2; break;
++       case 4 : tempbx = 3; break;
++       case 5 : tempbx = 4; break;
++       default: tempbx = 2;
+      }
+   
+   }
+@@ -2523,13 +2585,6 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+   tempbx = tempax;
+-#if 0 /* TW: BIOS code is skrewed */
+-  if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x02) {
+-      tempax = 16;
+-  } else {
+-      tempax = 8;
+-  }
+-#endif
+   tempax = 16;
+   tempax -= tempbx;
+@@ -2556,24 +2611,33 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+   tempcx +=  temp3;                                      /* CRT1 Request Period */
+-  CRT2ModeNo = ModeNo;                                                 /* get CRT2 ModeNo */
+-  SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&ModeIdIndex);           /* Get ModeID Table */
+-
+   SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+   SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
+-  RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
+-                                           ModeIdIndex,HwDeviceExtension);
++  if(!SiS_Pr->UseCustomMode) {
++
++     CRT2ModeNo = ModeNo;                                                 /* get CRT2 ModeNo */
++     SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&ModeIdIndex);
++
++     RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
++                                                ModeIdIndex,HwDeviceExtension);
++
++     index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex,
++                             RefreshRateTableIndex,HwDeviceExtension);
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
++        tempax = SiS_Pr->SiS_VCLKData[index].CLOCK;                       /* Get VCLK  */
++     } else {
++        tempax = SiS_Pr->SiS_VBVCLKData[index].CLOCK;
++     }
+-  index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex,
+-                          RefreshRateTableIndex,HwDeviceExtension);
+-  if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-     tempax = SiS_Pr->SiS_VCLKData[index].CLOCK;                       /* Get VCLK  */
+   } else {
+-     tempax = SiS_Pr->SiS_VBVCLKData[index].CLOCK;                     /* Get VCLK  */
++
++     CRT2ModeNo = 0xfe;                                                         /* Get VCLK  */
++     tempax = SiS_Pr->CSRClock;
++
+   }
+-  tempbx = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex);   /* Get colordepth */
++  tempbx = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex);            /* Get colordepth */
+   tempbx >>= 1;
+   if(!tempbx) tempbx++;
+@@ -2590,12 +2654,16 @@ SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr,
+   if (tempax > 0x37)  tempax = 0x37;
+-  /* TW: 650/LVDS (1.10.07, 1.10.00), 650/301LV, 740, 330 overrule calculated value; 315 does not */
++  /* 650/LVDS, 650/301LV, 740, 330 overrule calculated value; 315 does not */
+   if(HwDeviceExtension->jChipType >= SIS_650) {
+       tempax = 0x04;
+   }
+-  
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,~0x3F,tempax);
++#else
++
++  SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,~0x3F,0x04);
++
++#endif
+ }
+ USHORT
+@@ -2611,9 +2679,10 @@ SiS_GetMCLK(SiS_Private *SiS_Pr, UCHAR *
+     return(SiS_Pr->SiS_MCLKData_0[index].CLOCK);
+   }
+ }
++
+ #endif
+-/* TW: Checked against 650/LVDS 1.10.07 BIOS */
++/* Checked against 650/LVDS 1.10.07 BIOS */
+ void
+ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                    USHORT RefreshRateTableIndex,
+@@ -2623,6 +2692,13 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, 
+   USHORT PanelIndex,ResIndex;
+   const  SiS_LVDSDesStruct *PanelDesPtr = NULL;
++  if((SiS_Pr->UseCustomMode) ||
++     (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom)) {
++     SiS_Pr->SiS_LCDHDES = 0;
++     SiS_Pr->SiS_LCDVDES = 0;
++     return;
++  }
++
+   if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ) {
+ #ifdef SIS315H  
+@@ -2689,11 +2765,11 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, 
+       case 52: PanelDesPtr = SiS_Pr->SiS_CHTVUPALDesData;    break;
+       case 53: PanelDesPtr = SiS_Pr->SiS_CHTVOPALDesData;    break;
+       default:
+-              if(HwDeviceExtension->jChipType < SIS_315H)
+-                 PanelDesPtr = SiS_Pr->SiS_PanelType0e_1;
+-              else
+-                 PanelDesPtr = SiS_Pr->SiS_PanelType01_1;
+-              break;
++               if(HwDeviceExtension->jChipType < SIS_315H)
++                  PanelDesPtr = SiS_Pr->SiS_PanelType0e_1;
++               else
++                  PanelDesPtr = SiS_Pr->SiS_PanelType01_1;
++               break;
+      }
+   }
+   SiS_Pr->SiS_LCDHDES = (PanelDesPtr+ResIndex)->LCDHDES;
+@@ -2710,7 +2786,7 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, 
+      } else {
+         if(!(SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+            if( (HwDeviceExtension->jChipType < SIS_315H) || 
+-             (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) ) {  
++             (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) ) {
+               if(SiS_Pr->SiS_LCDResInfo >= SiS_Pr->SiS_Panel1024x768){
+                  if(ModeNo <= 0x13) {
+                   modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+@@ -2737,7 +2813,7 @@ SiS_GetLVDSDesData(SiS_Private *SiS_Pr, 
+         }
+      }
+   }
+-  return;
++
+ }
+ void
+@@ -2757,11 +2833,11 @@ SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, U
+   tempbx = 0;
+   if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-     if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+         tempbx = 50;
+         if((SiS_Pr->SiS_VBInfo & SetPALTV) && (!SiS_Pr->SiS_CHPALM)) tempbx += 2;
+         if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+-        /* TW: Nothing special needed for SOverscan    */
++        /* Nothing special needed for SOverscan    */
+         /*     PALM uses NTSC data, PALN uses PAL data */
+      }
+   }
+@@ -2773,7 +2849,7 @@ SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, U
+         if(modeflag & HalfDCLK) tempbx++;
+      }
+   }
+-  /* TW: 630/LVDS and 650/LVDS (1.10.07) BIOS */
++  /* 630/LVDS and 650/LVDS (1.10.07) BIOS */
+   if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+      if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480)  {
+         tempal = 0x07;
+@@ -2833,14 +2909,13 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+      }
+   }
+   
+-  /* TW: BIOS does not do this (neither 301 nor LVDS) */
++  /* BIOS does not do this (neither 301 nor LVDS) */
+   /*     (But it's harmless; see SetCRT2Offset) */
+   SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0x00);   /* fix write part1 index 0  BTDRAM bit Bug */
+-  /* TW: Removed 301B302B301LV302LV check here to match 650/LVDS BIOS */
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-      /* TW:   1. for LVDS/302B/302LV **LCDA** */
++      /*   1. for LVDS/302B/302LV **LCDA** */
+       SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xAF,0x40); /* FUNCTION CONTROL */
+       SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2E,0xF7);
+@@ -2855,23 +2930,23 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+ #ifdef SIS300    /* ---- 300 series ---- */
+-      /* For 301BDH: */
++      /* For 301BDH: (with LCD via LVDS) */
+       if(SiS_Pr->SiS_VBType & VB_NoLCD) {
+-        temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32);
+-        temp &= 0xef;
+-        temp |= 0x02;
+-        if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) || (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
+-           temp |= 0x10;
+-           temp &= 0xfd;
+-        }
+-        SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
++       temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32);
++       temp &= 0xef;
++       temp |= 0x02;
++       if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) || (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
++          temp |= 0x10;
++          temp &= 0xfd;
++       }
++       SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
+       }
+       if(ModeNo > 0x13) {
+-        tempcl -= ModeVGA;
+-        if((tempcl > 0) || (tempcl == 0)) {      /* TW: tempcl is USHORT -> always true! */
+-           tempah = ((0x10 >> tempcl) | 0x80);
+-        }
++         tempcl -= ModeVGA;
++         if((tempcl > 0) || (tempcl == 0)) {      /* tempcl is USHORT -> always true! */
++            tempah = ((0x10 >> tempcl) | 0x80);
++         }
+       } else tempah = 0x80;
+       if(SiS_Pr->SiS_VBInfo & SetInSlaveMode)  tempah ^= 0xA0;
+@@ -2880,7 +2955,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+     } else {
+-#ifdef SIS315H    /* ---- 310/325/330 series ---- */
++#ifdef SIS315H    /* ------- 315/330 series ------ */
+       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+          if(SiS_Pr->SiS_VBInfo & CRT2DisplayFlag) {
+@@ -2889,12 +2964,12 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+       }
+       if(ModeNo > 0x13) {
+-        tempcl -= ModeVGA;
+-        if((tempcl > 0) || (tempcl == 0)) {  /* TW: tempcl is USHORT -> always true! */
+-           tempah = (0x08 >> tempcl);
+-           if (tempah == 0) tempah = 1;
+-           tempah |= 0x40;
+-        }
++         tempcl -= ModeVGA;
++         if((tempcl > 0) || (tempcl == 0)) {  /* tempcl is USHORT -> always true! */
++            tempah = (0x08 >> tempcl);
++            if (tempah == 0) tempah = 1;
++            tempah |= 0x40;
++         }
+       } else tempah = 0x40;
+       if(SiS_Pr->SiS_VBInfo & SetInSlaveMode)  tempah ^= 0x50;
+@@ -2921,7 +2996,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+     if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-      /* TW:   2. for 301 (301B, 302B 301LV, 302LV non-LCDA) */
++      /*   2. for 301 (301B, 302B 301LV, 302LV non-LCDA) */
+       tempah = 0x01;
+       if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+@@ -2938,7 +3013,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+       if(HwDeviceExtension->jChipType < SIS_315H) {
+-              /* --- 300 series --- */
++              /* ---- 300 series ---- */
+                       tempah = (tempah << 5) & 0xFF;
+                       SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x01,tempah);
+@@ -2946,7 +3021,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+       } else {
+-              /* --- 310 series --- */
++              /* ---- 315 series ---- */
+                       SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2E,0xF8,tempah);
+@@ -2956,9 +3031,9 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+                       tempah |= 0x10;
+       }
+-      /* TW: 630/301 BIOS */
+       if((HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301)) {
+-              if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++              if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++                 (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)) {
+                       tempah |= 0x80;
+               }
+       } else {
+@@ -2996,28 +3071,31 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+                     }
+          }
+       }
+-      /* TW: For 302LV dual-channel */
++
++      /* For 302LV dual-channel */
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+-          if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-              if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04)
+-                  tempah |= 0x40;
+-          }
++         if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++            if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04)
++               tempah |= 0x40;
++         }
+       }
+       if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+-         (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)) {
+-              tempah |= 0x80;
++         (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)  ||
++         ((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) &&
++          (SiS_Pr->CP_MaxX >= 1280) && (SiS_Pr->CP_MaxY >= 960))) {
++         tempah |= 0x80;
+       }
+       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0C,tempah);
+     } else {
+-      /* TW: 3. for LVDS */
++      /* 3. for LVDS */
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+-         /* TW: Inserted this entire section (BIOS 650/LVDS); added ModeType check
++         /* Inserted this entire section (BIOS 650/LVDS); added ModeType check
+           *     (LVDS can only be slave in 8bpp modes)
+           */
+          tempah = 0x80;
+@@ -3043,7 +3121,7 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+       } else {
+-         /* TW: (added ModeType check) */
++         /* (added ModeType check) */
+          tempah = 0;
+          if( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) && (SiS_Pr->SiS_ModeType > ModeVGA) ) {
+                         tempah |= 0x02;
+@@ -3060,50 +3138,69 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+   }
+-  /* TW: Inserted the entire following section */
++  /* Inserted the entire following section */
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+ #ifdef SIS315H
++
++         unsigned char bridgerev = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x01);;
++
++       /* The following is nearly unpreditable and varies from machine
++        * to machine. Especially the 301DH seems to be a real trouble
++        * maker. Some BIOSes simply set the registers (like in the
++        * NoLCD-if-statements here), some set them according to the
++        * LCDA stuff. It is very likely that some machines are not
++        * treated correctly in the following, very case-orientated
++        * code. What do I do then...?
++        */
++
++       /* 740 variants match for 30xB, 301B-DH, 30xLV */
++
+          if(!(IS_SIS740)) {
+             tempah = 0x04;                                               /* For all bridges */
+             tempbl = 0xfb;
+             if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+                tempah = 0x00;
+-             if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))
++             if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+                 tempbl = 0xff;
++             }
+             }
+             SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);   
+        }
+-       
+-       if(IS_SIS740) {                                                
++
++       /* The following two are responsible for eventually wrong colors
++        * in TV output. The DH (VB_NoLCD) conditions are unknown; the
++        * b0 was found in some 651 machine (Pim); the b1 version in a
++        * 650 box (Jake). What is the criteria?
++        */
++
++       if(IS_SIS740) {
+           tempah = 0x30;
+           tempbl = 0xcf;
+           if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+              tempah = 0x00;
+           }
+-          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);    
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
++       } else if(SiS_Pr->SiS_VBType & VB_SIS301) {
++          /* Fixes "TV-blue-bug" on 315+301 */
++          SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2c,0xCF);          /* For 301   */
++       } else if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xCF,0x30);   /* For 30xLV */
++       } else if((SiS_Pr->SiS_VBType & VB_NoLCD) && (bridgerev == 0xb0)) {
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xCF,0x30);   /* For 30xB-DH rev b0 (or "DH on 651"?) */
+        } else {
+-          /* TW: This in order to fix "TV-blue-bug" on 315+301 */
+-            if(SiS_Pr->SiS_VBType & VB_SIS301) {
+-             SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2c,0xCF);             /* For 301   */
+-          } else {
+-             if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-                SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xCF,0x30);   /* For 30xLV */
+-             } else {
+-                tempah = 0x30;                                           /* For 301B  */
+-                tempbl = 0xcf;
+-                if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+-                   tempah = 0x00;
+-                   if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+-                      tempbl = 0xff;
+-                   }
+-                }
+-                SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);    
++          tempah = 0x30;                                           /* For 30xB (and 301BDH rev b1) */
++          tempbl = 0xcf;
++          if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
++             tempah = 0x00;
++             if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
++                tempbl = 0xff;
+              }
+           }
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
+        }
+        if(IS_SIS740) {
+@@ -3111,25 +3208,25 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+           tempbl = 0x3f;
+           if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+              tempah = 0x00;
+-          } 
+-          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);     
++          }
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);
++       } else if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,0xc0);      /* For 30xLV */
++       } else if((SiS_Pr->SiS_VBType & VB_NoLCD) && (bridgerev == 0xb0)) {
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,0xc0);      /* For 30xB-DH rev b0 (or "DH on 651"? */
+        } else {
+-          if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {                 /* For 30xLV */
+-             SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,0xc0);
+-          } else {                                                    /* For 301, 301B */ 
+-              tempah = 0xc0;
+-              tempbl = 0x3f;
+-              if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+-                 tempah = 0x00;
+-                 if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+-                    tempbl = 0xff;
+-                 }
+-              }
+-              SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);     
++          tempah = 0xc0;                                              /* For 301, 301B (and 301BDH rev b1) */
++          tempbl = 0x3f;
++          if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
++             tempah = 0x00;
++             if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
++                tempbl = 0xff;
++             }
+           }
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);
+        }
+-       if(IS_SIS740) {                                                
++       if(IS_SIS740) {
+           tempah = 0x80;
+           tempbl = 0x7f;
+           if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+@@ -3141,8 +3238,9 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+             tempbl = 0x7f;
+             if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+                tempbl = 0xff;
+-             if(!(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)))
++             if(!(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))) {
+                 tempah |= 0x80;
++             }
+             }
+             SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x23,tempbl,tempah);
+        }
+@@ -3174,16 +3272,32 @@ SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr,
+           tempbl = 0xfb;
+             if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+                tempah = 0x00;
+-             if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))
++             if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+                 tempbl = 0xff;
++             }
+             }
+           SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
+-          if(SiS_Pr->SiS_VBInfo & DisableCRT2Display)
++          if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+              SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x00);
++          }
+           SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xcf,0x30);
++       } else if(HwDeviceExtension->jChipType == SIS_550) {
++
++#if 0
++          tempah = 0x00;
++          tempbl = 0xfb;
++          if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
++             tempah = 0x00;
++             tempbl = 0xfb;
++          }
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
++#endif
++          SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
++
++          SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xcf,0x30);
+        }
+       }
+@@ -3209,10 +3323,9 @@ SiS_GetCRT2Data(SiS_Private *SiS_Pr, UCH
+                             HwDeviceExtension);
+         } else {
+-         if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
+-             (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+-             
+-            /* TW: Need LVDS Data for LCD on 301BDH */
++         if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
++
++            /* Need LVDS Data for LCD on 301B-DH */
+             SiS_GetCRT2DataLVDS(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                                 HwDeviceExtension);
+                                 
+@@ -3282,18 +3395,16 @@ SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr,
+    } else {
+-      /* TW: 301BDH needs LVDS Data */
+-      if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
+-          (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
++      /* 301BDH needs LVDS Data */
++      if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+             SiS_Pr->SiS_IF_DEF_LVDS = 1;
+       }
+       SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+                      &CRT2Index,&ResIndex,HwDeviceExtension);
+-      /* TW: 301BDH needs LVDS Data */
+-      if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
+-          (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
++      /* 301BDH needs LVDS Data */
++      if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+               SiS_Pr->SiS_IF_DEF_LVDS = 0;
+       }
+@@ -3321,11 +3432,16 @@ SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr,
+       case 20:  LVDSData = SiS_Pr->SiS_LVDS1280x768Data_2;   break;
+       case 21:  LVDSData = SiS_Pr->SiS_LVDS1600x1200Data_1;  break;
+       case 22:  LVDSData = SiS_Pr->SiS_LVDS1600x1200Data_2;  break;
++      case 30:  LVDSData = SiS_Pr->SiS_LVDS640x480Data_2;    break;
++      case 80:  LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_1;  break;
++      case 81:  LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_2;  break;
++      case 82:  LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_1;  break;
++      case 83:  LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_2;  break;
+       case 90:  LVDSData = SiS_Pr->SiS_CHTVUPALMData;        break;
+               case 91:  LVDSData = SiS_Pr->SiS_CHTVOPALMData;        break;
+               case 92:  LVDSData = SiS_Pr->SiS_CHTVUPALNData;        break;
+               case 93:  LVDSData = SiS_Pr->SiS_CHTVOPALNData;        break;
+-      case 99:  LVDSData = SiS_Pr->SiS_CHTVSOPALData;        break;  /* TW: Super Overscan */
++      case 99:  LVDSData = SiS_Pr->SiS_CHTVSOPALData;        break;  /* Super Overscan */
+       default:  LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1;   break;
+      }
+    }
+@@ -3337,67 +3453,36 @@ SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr,
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-    if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)){
+-         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768){
+-           SiS_Pr->SiS_HDE = 1024;
+-           SiS_Pr->SiS_VDE =  768;
+-         } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024){
+-           SiS_Pr->SiS_HDE = 1280;
+-           SiS_Pr->SiS_VDE = 1024;
+-       } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050){
+-           SiS_Pr->SiS_HDE = 1400;
+-           SiS_Pr->SiS_VDE = 1050;
+-       } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200){
+-           SiS_Pr->SiS_HDE = 1600;
+-           SiS_Pr->SiS_VDE = 1200;
+-         } else {
+-         SiS_Pr->SiS_HDE = 1280;
+-         SiS_Pr->SiS_VDE =  960;
+-       }
+-    }
++     if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
++        SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
++        SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
++     }
+   } else {
+-    if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
+-      if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
+-        if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+-          if((!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) || (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+-            if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-              SiS_Pr->SiS_HDE =  800;
+-              SiS_Pr->SiS_VDE =  600;
+-          } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+-            SiS_Pr->SiS_HDE = 1024;
+-              SiS_Pr->SiS_VDE =  600;  
+-            } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-              SiS_Pr->SiS_HDE = 1024;
+-              SiS_Pr->SiS_VDE =  768;
+-          } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+-            SiS_Pr->SiS_HDE = 1152;
+-            SiS_Pr->SiS_VDE =  768;   
+-          } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x864) {
+-            SiS_Pr->SiS_HDE = 1152;
+-            SiS_Pr->SiS_VDE =  864;  
+-          } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+-            SiS_Pr->SiS_HDE = 1280;
+-            SiS_Pr->SiS_VDE =  768;        
+-            } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-              SiS_Pr->SiS_HDE = 1280;
+-              SiS_Pr->SiS_VDE = 1024;
+-          } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-            SiS_Pr->SiS_HDE = 1400;
+-              SiS_Pr->SiS_VDE = 1050;
+-          } else {
+-            SiS_Pr->SiS_HDE = 1600;
+-            SiS_Pr->SiS_VDE = 1200;
+-          }
+-            if(SiS_Pr->SiS_IF_DEF_FSTN) {
+-              SiS_Pr->SiS_HDE = 320;
+-              SiS_Pr->SiS_VDE = 480;
+-            }
+-          }
++     if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
++        if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
++           if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
++              if((!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) || (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
++               SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
++                 SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
++
++               if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++                  if(ResIndex < 0x08) {
++                     SiS_Pr->SiS_HDE = 1280;
++                       SiS_Pr->SiS_VDE = 1024;
++                  }
++               }
++#if 0
++                 if(SiS_Pr->SiS_IF_DEF_FSTN) {
++                    SiS_Pr->SiS_HDE = 320;
++                    SiS_Pr->SiS_VDE = 480;
++                 }
++#endif                 
++              }
++           }
+         }
+-      }
+-    }
++     }
+   }
+ }
+@@ -3413,11 +3498,16 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+   const SiS_TVDataStruct  *TVPtr  = NULL;
+   if(ModeNo <= 0x13) {
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-      resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   } else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++      resinfo = 0;
++     } else {
+       modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+       resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     }
+   }
+   
+   SiS_Pr->SiS_NewFlickerMode = 0;
+@@ -3429,20 +3519,29 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+   SiS_GetCRT2ResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+-  /* TW: For VGA2 ("RAMDAC2") */
+-
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC){
+-     SiS_GetRAMDAC2DATA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                        HwDeviceExtension);
+-     return;
+-  }
+-  /* TW: For TV */
++     if(SiS_Pr->UseCustomMode) {
+-  if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        SiS_Pr->SiS_RVBHCMAX  = 1;
++        SiS_Pr->SiS_RVBHCFACT = 1;
++        SiS_Pr->SiS_VGAHT     = SiS_Pr->CHTotal;
++        SiS_Pr->SiS_VGAVT     = SiS_Pr->CVTotal;
++        SiS_Pr->SiS_HT        = SiS_Pr->CHTotal;
++        SiS_Pr->SiS_VT        = SiS_Pr->CVTotal;
++      SiS_Pr->SiS_HDE       = SiS_Pr->SiS_VGAHDE;
++        SiS_Pr->SiS_VDE       = SiS_Pr->SiS_VGAVDE;
+-    SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                   &CRT2Index,&ResIndex,HwDeviceExtension);
++     } else {
++
++        SiS_GetRAMDAC2DATA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
++                           HwDeviceExtension);
++     }
++
++  } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++
++    SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
++                   &CRT2Index,&ResIndex,HwDeviceExtension);
+     switch (CRT2Index) {
+       case  2:  TVPtr = SiS_Pr->SiS_ExtHiTVData;   break;
+@@ -3452,7 +3551,7 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+       case  4:  TVPtr = SiS_Pr->SiS_ExtNTSCData;   break;
+       case  8:  TVPtr = SiS_Pr->SiS_StPALData;     break;
+       case  9:  TVPtr = SiS_Pr->SiS_StNTSCData;    break;
+-      default:  TVPtr = SiS_Pr->SiS_StPALData;     break;  /* TW: Just to avoid a crash */
++      default:  TVPtr = SiS_Pr->SiS_StPALData;     break;  /* Just to avoid a crash */
+     }
+     SiS_Pr->SiS_RVBHCMAX  = (TVPtr+ResIndex)->RVBHCMAX;
+@@ -3464,18 +3563,16 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+     SiS_Pr->SiS_RVBHRS    = (TVPtr+ResIndex)->RVBHRS;
+     SiS_Pr->SiS_NewFlickerMode = (TVPtr+ResIndex)->FlickerMode;
+     if(modeflag & HalfDCLK) {
+-      SiS_Pr->SiS_RVBHRS    = (TVPtr+ResIndex)->HALFRVBHRS;
++      SiS_Pr->SiS_RVBHRS     = (TVPtr+ResIndex)->HALFRVBHRS;
+     }
+     if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {  
+     
+        if(SiS_Pr->SiS_HiVision != 3) {
+-       
+-                if(resinfo == 0x08) SiS_Pr->SiS_NewFlickerMode = 0x40;
+-                if(resinfo == 0x09) SiS_Pr->SiS_NewFlickerMode = 0x40;
+-        if(resinfo == 0x12) SiS_Pr->SiS_NewFlickerMode = 0x40;
+-        
+-       } 
++                if(resinfo == SIS_RI_1024x768)  SiS_Pr->SiS_NewFlickerMode = 0x40;
++                if(resinfo == SIS_RI_1280x1024) SiS_Pr->SiS_NewFlickerMode = 0x40;
++        if(resinfo == SIS_RI_1280x720)  SiS_Pr->SiS_NewFlickerMode = 0x40;
++       }
+        
+        switch(SiS_Pr->SiS_HiVision) {
+        case 2:
+@@ -3504,119 +3601,127 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr, 
+     } else {
+-      SiS_Pr->SiS_RY1COE = (TVPtr+ResIndex)->RY1COE;
+-      SiS_Pr->SiS_RY2COE = (TVPtr+ResIndex)->RY2COE;
+-      SiS_Pr->SiS_RY3COE = (TVPtr+ResIndex)->RY3COE;
+-      SiS_Pr->SiS_RY4COE = (TVPtr+ResIndex)->RY4COE;
+-
+-      if(modeflag & HalfDCLK) {
+-         SiS_Pr->SiS_RY1COE = 0x00;
+-         SiS_Pr->SiS_RY2COE = 0xf4;
+-         SiS_Pr->SiS_RY3COE = 0x10;
+-         SiS_Pr->SiS_RY4COE = 0x38;
+-      }
+-
+-      if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-        SiS_Pr->SiS_HT = NTSCHT;
+-      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {  
+-         if((ModeNo == 0x4a) || (ModeNo == 0x38)) SiS_Pr->SiS_HT = NTSC2HT;
+-      }  
+-        SiS_Pr->SiS_VT = NTSCVT;
+-      } else {
+-        SiS_Pr->SiS_HT = PALHT;
+-        SiS_Pr->SiS_VT = PALVT;
+-      }
++       SiS_Pr->SiS_RY1COE = (TVPtr+ResIndex)->RY1COE;
++       SiS_Pr->SiS_RY2COE = (TVPtr+ResIndex)->RY2COE;
++       SiS_Pr->SiS_RY3COE = (TVPtr+ResIndex)->RY3COE;
++       SiS_Pr->SiS_RY4COE = (TVPtr+ResIndex)->RY4COE;
++
++       if(modeflag & HalfDCLK) {
++          SiS_Pr->SiS_RY1COE = 0x00;
++          SiS_Pr->SiS_RY2COE = 0xf4;
++          SiS_Pr->SiS_RY3COE = 0x10;
++          SiS_Pr->SiS_RY4COE = 0x38;
++       }
++
++       if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++          SiS_Pr->SiS_HT = NTSCHT;
++        if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++           if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) SiS_Pr->SiS_HT = NTSC2HT;
++        }
++          SiS_Pr->SiS_VT = NTSCVT;
++       } else {
++          SiS_Pr->SiS_HT = PALHT;
++          SiS_Pr->SiS_VT = PALVT;
++       }
+     }
+-    return;
+-  }
++  } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++
++     if(SiS_Pr->UseCustomMode) {
+-  /* TW: For LCD */
++        SiS_Pr->SiS_RVBHCMAX  = 1;
++        SiS_Pr->SiS_RVBHCFACT = 1;
++        SiS_Pr->SiS_VGAHT     = SiS_Pr->CHTotal;
++        SiS_Pr->SiS_VGAVT     = SiS_Pr->CVTotal;
++        SiS_Pr->SiS_HT        = SiS_Pr->CHTotal;
++        SiS_Pr->SiS_VT        = SiS_Pr->CVTotal;
++      SiS_Pr->SiS_HDE       = SiS_Pr->SiS_VGAHDE;
++        SiS_Pr->SiS_VDE       = SiS_Pr->SiS_VGAVDE;
+-  if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++     } else {
+-    SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                   &CRT2Index,&ResIndex,HwDeviceExtension);
++        SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
++                      &CRT2Index,&ResIndex,HwDeviceExtension);
++
++        switch(CRT2Index) {
++         case  0: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data;        break; /* VESA Timing */
++         case  1: LCDPtr = SiS_Pr->SiS_ExtLCD1280x1024Data;       break; /* VESA Timing */
++         case  5: LCDPtr = SiS_Pr->SiS_StLCD1024x768Data;         break; /* Obviously unused */
++         case  6: LCDPtr = SiS_Pr->SiS_StLCD1280x1024Data;        break; /* Obviously unused */
++         case 10: LCDPtr = SiS_Pr->SiS_St2LCD1024x768Data;        break; /* Non-VESA Timing */
++         case 11: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data;       break; /* Non-VESA Timing */
++         case 13: LCDPtr = SiS_Pr->SiS_NoScaleData1024x768;       break; /* Non-expanding */
++         case 14: LCDPtr = SiS_Pr->SiS_NoScaleData1280x1024;      break; /* Non-expanding */
++         case 15: LCDPtr = SiS_Pr->SiS_LCD1280x960Data;           break; /* 1280x960 */
++         case 20: LCDPtr = SiS_Pr->SiS_ExtLCD1400x1050Data;       break; /* VESA Timing */
++         case 21: LCDPtr = SiS_Pr->SiS_NoScaleData1400x1050;      break; /* Non-expanding (let panel scale) */
++         case 22: LCDPtr = SiS_Pr->SiS_StLCD1400x1050Data;        break; /* Non-VESA Timing (let panel scale) */
++         case 23: LCDPtr = SiS_Pr->SiS_ExtLCD1600x1200Data;       break; /* VESA Timing */
++         case 24: LCDPtr = SiS_Pr->SiS_NoScaleData1600x1200;      break; /* Non-expanding */
++         case 25: LCDPtr = SiS_Pr->SiS_StLCD1600x1200Data;        break; /* Non-VESA Timing */
++         case 26: LCDPtr = SiS_Pr->SiS_ExtLCD1280x768Data;        break; /* VESA Timing */
++         case 27: LCDPtr = SiS_Pr->SiS_NoScaleData1280x768;       break; /* Non-expanding */
++         case 28: LCDPtr = SiS_Pr->SiS_StLCD1280x768Data;         break; /* Non-VESA Timing */
++         case 29: LCDPtr = SiS_Pr->SiS_NoScaleData;             break; /* Generic no-scale data */
++         default: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data;      break; /* Just to avoid a crash */
++        }
++
++        SiS_Pr->SiS_RVBHCMAX  = (LCDPtr+ResIndex)->RVBHCMAX;
++        SiS_Pr->SiS_RVBHCFACT = (LCDPtr+ResIndex)->RVBHCFACT;
++        SiS_Pr->SiS_VGAHT     = (LCDPtr+ResIndex)->VGAHT;
++        SiS_Pr->SiS_VGAVT     = (LCDPtr+ResIndex)->VGAVT;
++        SiS_Pr->SiS_HT        = (LCDPtr+ResIndex)->LCDHT;
++        SiS_Pr->SiS_VT        = (LCDPtr+ResIndex)->LCDVT;
+-    switch (CRT2Index) {
+-      case  0: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data;        break; /* VESA Timing */
+-      case  1: LCDPtr = SiS_Pr->SiS_ExtLCD1280x1024Data;       break; /* VESA Timing */
+-      case  5: LCDPtr = SiS_Pr->SiS_StLCD1024x768Data;         break; /* Obviously unused */
+-      case  6: LCDPtr = SiS_Pr->SiS_StLCD1280x1024Data;        break; /* Obviously unused */
+-      case 10: LCDPtr = SiS_Pr->SiS_St2LCD1024x768Data;        break; /* Non-VESA Timing */
+-      case 11: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data;       break; /* Non-VESA Timing */
+-      case 13: LCDPtr = SiS_Pr->SiS_NoScaleData1024x768;       break; /* Non-expanding */
+-      case 14: LCDPtr = SiS_Pr->SiS_NoScaleData1280x1024;      break; /* Non-expanding */
+-      case 15: LCDPtr = SiS_Pr->SiS_LCD1280x960Data;           break; /* 1280x960 */
+-      case 20: LCDPtr = SiS_Pr->SiS_ExtLCD1400x1050Data;       break; /* VESA Timing */
+-      case 21: LCDPtr = SiS_Pr->SiS_NoScaleData1400x1050;      break; /* Non-expanding (let panel scale) */
+-      case 22: LCDPtr = SiS_Pr->SiS_StLCD1400x1050Data;              break; /* Non-VESA Timing (let panel scale) */
+-      case 23: LCDPtr = SiS_Pr->SiS_ExtLCD1600x1200Data;       break; /* VESA Timing */
+-      case 24: LCDPtr = SiS_Pr->SiS_NoScaleData1600x1200;      break; /* Non-expanding */
+-      case 25: LCDPtr = SiS_Pr->SiS_StLCD1600x1200Data;              break; /* Non-VESA Timing */
+-      default: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data;              break; /* Just to avoid a crash */
+-    }
+-
+-    SiS_Pr->SiS_RVBHCMAX  = (LCDPtr+ResIndex)->RVBHCMAX;
+-    SiS_Pr->SiS_RVBHCFACT = (LCDPtr+ResIndex)->RVBHCFACT;
+-    SiS_Pr->SiS_VGAHT     = (LCDPtr+ResIndex)->VGAHT;
+-    SiS_Pr->SiS_VGAVT     = (LCDPtr+ResIndex)->VGAVT;
+-    SiS_Pr->SiS_HT        = (LCDPtr+ResIndex)->LCDHT;
+-    SiS_Pr->SiS_VT        = (LCDPtr+ResIndex)->LCDVT;
+-    
+ #ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO,
+-      "GetCRT2Data: Index %d ResIndex %d\n", CRT2Index, ResIndex);
+-#endif    
++        xf86DrvMsg(0, X_INFO,
++          "GetCRT2Data: Index %d ResIndex %d\n", CRT2Index, ResIndex);
++#endif
+-    tempax = 1024;
+-    if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
+-      if(HwDeviceExtension->jChipType < SIS_315H) {
+-         if     (SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
+-         else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
+-         else                               tempbx = 768;
+-      } else {      
+-         tempbx = 768; 
+-      }
+-    } else {
+-      if     (SiS_Pr->SiS_VGAVDE == 357) tempbx = 527;
+-      else if(SiS_Pr->SiS_VGAVDE == 420) tempbx = 620;
+-      else if(SiS_Pr->SiS_VGAVDE == 525) tempbx = 775;
+-      else if(SiS_Pr->SiS_VGAVDE == 600) tempbx = 775;
+-      else if(SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
+-      else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
+-      else                               tempbx = 768;
+-    }
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-      tempax = 1280;
+-      if     (SiS_Pr->SiS_VGAVDE == 360) tempbx = 768;
+-      else if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 800;
+-      else if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 864;
+-      else                               tempbx = 1024;
+-    }
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+-      tempax = 1280;
+-      if     (SiS_Pr->SiS_VGAVDE == 350)  tempbx = 700;
+-      else if(SiS_Pr->SiS_VGAVDE == 400)  tempbx = 800;
+-      else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960;
+-      else                                tempbx = 960;
+-    }
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-      tempax = 1400;
+-      tempbx = 1050;
+-    }
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+-      tempax = 1600;
+-      tempbx = 1200;
+-    }
+-    if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-       tempax = SiS_Pr->SiS_VGAHDE;
+-       tempbx = SiS_Pr->SiS_VGAVDE;
+-    }
+-    SiS_Pr->SiS_HDE = tempax;
+-    SiS_Pr->SiS_VDE = tempbx;
+-    return;
++      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++           tempax = 1024;
++           if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
++              if(HwDeviceExtension->jChipType < SIS_315H) {
++                 if     (SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
++                 else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
++                 else                               tempbx = 768;
++              } else {
++                 tempbx = 768;
++              }
++           } else {
++              if     (SiS_Pr->SiS_VGAVDE == 357) tempbx = 527;
++              else if(SiS_Pr->SiS_VGAVDE == 420) tempbx = 620;
++              else if(SiS_Pr->SiS_VGAVDE == 525) tempbx = 775;
++              else if(SiS_Pr->SiS_VGAVDE == 600) tempbx = 775;
++              else if(SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
++              else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
++              else                               tempbx = 768;
++           }
++      } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++           tempax = 1280;
++           if     (SiS_Pr->SiS_VGAVDE == 360) tempbx = 768;
++           else if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 800;
++           else if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 864;
++           else                               tempbx = 1024;
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
++           tempax = 1280;
++           if     (SiS_Pr->SiS_VGAVDE == 350)  tempbx = 700;
++           else if(SiS_Pr->SiS_VGAVDE == 400)  tempbx = 800;
++           else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960;
++           else                                tempbx = 960;
++        } else {
++         tempax = SiS_Pr->PanelXRes;
++           tempbx = SiS_Pr->PanelYRes;
++      }
++        if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
++           tempax = SiS_Pr->SiS_VGAHDE;
++           tempbx = SiS_Pr->SiS_VGAVDE;
++        }
++        SiS_Pr->SiS_HDE = tempax;
++        SiS_Pr->SiS_VDE = tempbx;
++        return;
++     }
+   }
+ }
+@@ -3626,9 +3731,9 @@ SiS_GetResInfo(SiS_Private *SiS_Pr, UCHA
+   USHORT resindex;
+   if(ModeNo <= 0x13)
+-      resindex=SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     resindex=SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   else
+-      resindex=SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     resindex=SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+   return(resindex);
+ }
+@@ -3639,41 +3744,46 @@ SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, 
+ {
+   USHORT xres,yres,modeflag=0,resindex;
++  if(SiS_Pr->UseCustomMode) {
++     SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = SiS_Pr->CHDisplay;
++     SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = SiS_Pr->CVDisplay;
++     return;
++  }
++
+   resindex = SiS_GetResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+   if(ModeNo <= 0x13) {
+-      xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
+-      yres = SiS_Pr->SiS_StResInfo[resindex].VTotal;
++     xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
++     yres = SiS_Pr->SiS_StResInfo[resindex].VTotal;
+   } else {
+-      xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
+-      yres = SiS_Pr->SiS_ModeResInfo[resindex].VTotal;
+-      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
++     yres = SiS_Pr->SiS_ModeResInfo[resindex].VTotal;
++     modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+   }
+-  if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1)) {
+-      if((ModeNo != 0x03) && (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+-          if(yres == 350) yres = 400;
+-      }
+-      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x3a) & 0x01) {
+-        if(ModeNo == 0x12) yres = 400;
+-      }
+-  }
++  if((!SiS_Pr->SiS_IF_DEF_DSTN) && (!SiS_Pr->SiS_IF_DEF_FSTN)) {
++
++     if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1)) {
++        if((ModeNo != 0x03) && (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
++           if(yres == 350) yres = 400;
++        }
++        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x3a) & 0x01) {
++         if(ModeNo == 0x12) yres = 400;
++        }
++     }
++
++     if(ModeNo > 0x13) {
++      if(modeflag & HalfDCLK)       xres *= 2;
++      if(modeflag & DoubleScanMode) yres *= 2;
++     }
+-  if(ModeNo > 0x13) {
+-      if(SiS_Pr->SiS_IF_DEF_FSTN == 1){
+-            xres *= 2;
+-            yres *= 2;
+-      } else {
+-          if(modeflag & HalfDCLK)       xres *= 2;
+-          if(modeflag & DoubleScanMode) yres *= 2;
+-      }
+   }
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+            if(xres == 720) xres = 640;
+       } else {
+-         if(SiS_Pr->SiS_VBType & VB_NoLCD) {           /* TW: 301BDH */
++         if(SiS_Pr->SiS_VBType & VB_NoLCD) {           /* 301BDH */
+               if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+                    if(xres == 720) xres = 640;
+               }
+@@ -3694,9 +3804,8 @@ SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, 
+                if(xres == 720) xres = 640;
+             }
+             if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-               if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++               if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+                   if(ModeNo <= 0x13) {
+-                     /* TW: This is wrong for 640x400 *graphics* mode */
+                              if(yres == 400) yres = 405;
+                   }
+                           if(yres == 350) yres = 360;
+@@ -3719,12 +3828,15 @@ SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, 
+   } else {
+       if(xres == 720) xres = 640;
+       if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+-            yres = 400;
+-            if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
+-            } else {
+-                if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
+-            }
++         yres = 400;
++         if(HwDeviceExtension->jChipType >= SIS_315H) {
++            if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
++         } else {
++            if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
++         }
++         if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) {
++            yres = 480;
++         }
+       }
+   }
+   SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = xres;
+@@ -3739,6 +3851,13 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+   USHORT tempbx=0,tempal=0;
+   USHORT Flag,resinfo=0;
++  if(ModeNo <= 0x13) {
++     tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
++  } else {
++     tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
++     resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++  }
++
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+       if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {                            /* LCD */
+@@ -3753,15 +3872,32 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+                       tempbx = 23;
+                       if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)         tempbx = 24;
+                       else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 25;
++#if 0
++              } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
++                      tempbx = 26;
++                      if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)         tempbx = 27;
++                      else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 28;
++#endif
+               } else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-                      tempbx = 13;
+-                      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx++;
++                      if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++                         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)       tempbx = 13;
++                         else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx = 14;
++                         else                                                          tempbx = 29;
++                      } else {
++                         tempbx = 29;
++                         if(ModeNo >= 0x13) {
++                            /* 1280x768 and 1280x960 have same CRT2CRTC,
++                             * so we change it here if 1280x960 is chosen
++                             */
++                            if(resinfo == SIS_RI_1280x960) tempal = 10;
++                         }
++                      }
+               } else {
+                          tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_Panel1024x768;
+                          if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+                       tempbx += 5;
+                         /* GetRevisionID();  */
+-                      /* TW: BIOS only adds 5 once */
++                      /* BIOS only adds 5 once */
+                       tempbx += 5;
+                          }
+               }
+@@ -3783,34 +3919,18 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+               
+       }
+-      if(ModeNo <= 0x13) {
+-                      tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+-      } else {
+-                      tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+-              resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+-        }
+-
+-      tempal &= 0x3F;
+-
+-              if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
+-           (SiS_Pr->SiS_VBInfo & (SetCRT2ToTV-SetCRT2ToHiVisionTV))) {
+-                      if(tempal == 0x06) tempal = 0x07;
+-        }
+-
+-      /* TW: 300/301LV BIOS */
+-      if((HwDeviceExtension->jChipType == SIS_300) &&
+-         (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
+-          if(ModeNo > 0x13) {
+-              if((resinfo == 0x0c) || (resinfo == 0x0d))  /* 720 (index diff. on 310/325!) */
+-                  tempal = 6;
+-          }
+-      }
++        tempal &= 0x3F;
+-      if(HwDeviceExtension->jChipType != SIS_300) {
+-           if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-              if((ModeNo == 0x31) || (ModeNo == 0x32)) tempal = 6;
++              if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) {
++         if(ModeNo > 0x13) {
++                    if(tempal == 6) tempal = 7;
++              if((resinfo == SIS_RI_720x480) ||
++               (resinfo == SIS_RI_720x576) ||
++               (resinfo == SIS_RI_768x576)) {
++               tempal = 6;
++            }
+          }
+-      }
++        }
+       *CRT2Index = tempbx;
+       *ResIndex = tempal;
+@@ -3820,25 +3940,22 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+       Flag = 1;
+       tempbx = 0;
+       if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-      
+-                      if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+-                      Flag = 0;
+-                      tempbx = 10;
+-                      if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+-                      if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-                              tempbx += 2;
+-                              if(SiS_Pr->SiS_CHSOverScan) tempbx = 99;
+-                              if(SiS_Pr->SiS_CHPALM) {
+-                                      tempbx = 90;
+-                                      if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+-                              } else if(SiS_Pr->SiS_CHPALN) {
+-                                      tempbx = 92;
+-                                      if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+-                              }
+-                              
+-                      }
+-                      }
+-              
++                 if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
++              Flag = 0;
++              tempbx = 10;
++            if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
++              if(SiS_Pr->SiS_VBInfo & SetPALTV) {
++               tempbx += 2;
++               if(SiS_Pr->SiS_CHSOverScan) tempbx = 99;
++               if(SiS_Pr->SiS_CHPALM) {
++                  tempbx = 90;
++                  if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
++               } else if(SiS_Pr->SiS_CHPALN) {
++                  tempbx = 92;
++                  if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
++               }
++              }
++           }
+       }
+       if(Flag) {
+@@ -3846,11 +3963,19 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+               if(SiS_Pr->SiS_LCDResInfo <= SiS_Pr->SiS_Panel1280x1024) {
+                  tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_PanelMinLVDS;
+                  if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx += 3;
++                 if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
++                    tempbx = 82;
++                    if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx++;
++                 }
+               } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+                  tempbx = 18;
+                  if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx++; 
+-              } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) { 
++              } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+                  tempbx = 6;
++              } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2) {
++                 tempbx = 30;
++              } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
++                 tempbx = 30;
+               } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+                  tempbx = 15;
+                  if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx += 2;
+@@ -3863,27 +3988,25 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+               } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+                  tempbx = 21;
+                  if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx++;
++              } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelBarco1366) {
++                 tempbx = 80;
++                 if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx++;
+               }
+-              
++
+               if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+                  tempbx = 7;
+               }
+               
+       }
+-      if(ModeNo <= 0x13)
+-                      tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+-      else {
+-                      tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+-              resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+-      }
+-
++#if 0
+       if(SiS_Pr->SiS_IF_DEF_FSTN){
+                       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480){
+                       tempbx = 14;
+                       tempal = 6;
+               }
+       }
++#endif        
+       if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+               if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) tempal = 7;
+@@ -3895,13 +4018,10 @@ SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHA
+       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+           if(ModeNo > 0x13) {
+-              if(HwDeviceExtension->jChipType < SIS_315H) {
+-                 if((resinfo == 0x0c) || (resinfo == 0x0d))  /* 720 */
+-                     tempal = 6;
+-              } else {
+-                 if((resinfo == 0x0d) || (resinfo == 0x0e))  /* 720 */
+-                     tempal = 6;
+-              }
++             if((resinfo == SIS_RI_720x480) ||
++                (resinfo == SIS_RI_720x576) ||
++                (resinfo == SIS_RI_768x576))
++                tempal = 6;
+           }
+       }
+@@ -3969,8 +4089,9 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, 
+   USHORT RefreshRateTableIndex,i,backup_i;
+   USHORT modeflag,index,temp,backupindex;
+-  if(SiS_Pr->UseCustomMode) return 0;
+-  
++  /* Do NOT check for UseCustomMode here, will skrew up FIFO */
++  if(ModeNo == 0xfe) return 0;
++
+   if(ModeNo <= 0x13)
+       modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+   else
+@@ -3984,7 +4105,7 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, 
+   if(ModeNo < 0x14) return(0xFFFF);
+- /* TW: CR33 holds refresh rate index for CRT1 [3:0] and CRT2 [7:4].
++ /* CR33 holds refresh rate index for CRT1 [3:0] and CRT2 [7:4].
+   *     On LVDS machines, CRT2 index is always 0 and will be
+   *     set to 0 by the following code; this causes the function
+   *     to take the first non-interlaced mode in SiS_Ext2Struct
+@@ -3998,40 +4119,38 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, 
+   if(index > 0) index--;
+   if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
++     if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+         if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))  index = 0;
+-      } else {
++     } else {
+         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-          if(SiS_Pr->SiS_VBType & VB_NoLCD)
+-                  index = 0;
+-          else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)
+-                  index = backupindex = 0;
++         if(SiS_Pr->SiS_VBType & VB_NoLCD)
++            index = 0;
++         else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)
++            index = backupindex = 0;
+       }
+-      }
+-  }
++     }
+-  if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+-      if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-                      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-                      index = 0;
+-                      }
+-      }
+-      if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+-                      if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-                      if(!(SiS_Pr->SiS_VBType & VB_NoLCD)) {
+-                         temp = LCDRefreshIndex[SiS_Pr->SiS_LCDResInfo];
+-                         if(index > temp) index = temp;
+-                      }
+-                      } else {
+-                      index = 0;
+-                      }
+-      }
++     if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
++        if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++           index = 0;
++        }
++     }
++     if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
++        if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++         if(!(SiS_Pr->SiS_VBType & VB_NoLCD)) {
++              temp = LCDRefreshIndex[SiS_Pr->SiS_LCDResInfo];
++              if(index > temp) index = temp;
++         }
++              } else {
++           index = 0;
++              }
++     }
+   }
+   RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
+   ModeNo = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].ModeID;
+-  /* TW: 650/LVDS 1.10.07, 650/30xLV 1.10.6s */
++  /* 650/LVDS 1.10.07, 650/30xLV 1.10.6s */
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+      if(!(SiS_Pr->SiS_VBInfo & DriverMode)) {
+         if( (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x105) ||
+@@ -4066,7 +4185,7 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, 
+       backup_i = i;
+       if (!(SiS_AdjustCRT2Rate(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+                                    RefreshRateTableIndex,&i,HwDeviceExtension))) {
+-              /* TW: This is for avoiding random data to be used; i is
++              /* This is for avoiding random data to be used; i is
+                *     in an undefined state if no matching CRT2 mode is
+                *     found.
+                */
+@@ -4085,196 +4204,199 @@ SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, 
+   USHORT tempax,tempbx,resinfo;
+   USHORT modeflag,infoflag;
+-  if (ModeNo <= 0x13)
++  if(ModeNo <= 0x13) {
+       modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-  else
++      resinfo = 0;
++  } else {
+       modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++        resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++  }
+-  resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+   tempbx = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
+   tempax = 0;
++
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++
+       if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+                       tempax |= SupportRAMDAC2;
+               if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                  tempax |= SupportTV;
+-                  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-                      if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                          if(resinfo == 0x0a) tempax |= SupportTV1024;
+-                      }
+-                  }
++                 tempax |= SupportTV;
++                 if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++                    if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                       if(resinfo == SIS_RI_1600x1200) tempax |= SupportTV1024;
++                    }
++                 }
+               }
+-      }
+-      if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
++      } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+                       tempax |= SupportLCD;
+               if(HwDeviceExtension->jChipType >= SIS_315H) {
+                    if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) {
+                     if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
+-                       if((resinfo == 6) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
++                       if((resinfo == SIS_RI_640x480) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+                           (*i) = 0;
+                             return(1);
+                        } else {
+                                   if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) {
+-                            if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
+-                              if((resinfo == 6) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+-                                  return(0);
+-                              } else {
+-                                  if((resinfo >= 9) && (resinfo != 0x14)) {
++                             if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
++                                if((resinfo == SIS_RI_640x480) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
++                                   return(0);
++                                } else {
++                                   if((resinfo >= SIS_RI_1280x1024) && (resinfo != SIS_RI_1280x768)) {
+                                               return(0);
+-                                  }
+-                              }
+-                            }
++                                   }
++                                }
++                             }
+                           }
+                        }
+                     }
+                          }
+               } else {
+                 if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+-                   if((resinfo != 0x0f) && ((resinfo == 4) || (resinfo >= 8))) return(0);
++                   if( (resinfo != SIS_RI_1024x600) &&
++                       ((resinfo == SIS_RI_512x384) || (resinfo >= SIS_RI_1024x768))) return(0);
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+-                   if((resinfo != 0x10) && (resinfo > 8)) return(0);
++                   if((resinfo != SIS_RI_1152x768) && (resinfo > SIS_RI_1024x768)) return(0);
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+-                   if((resinfo != 0x0e) && (resinfo > 8)) return(0);
++                   if((resinfo != SIS_RI_1280x960) && (resinfo > SIS_RI_1024x768)) return(0);
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-                   if(resinfo > 9) return(0);
++                   if(resinfo > SIS_RI_1280x1024) return(0);
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-                   if(resinfo > 8) return(0);
++                   if(resinfo > SIS_RI_1024x768) return(0);
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-                   if((resinfo == 4) || (resinfo > 7)) return(0);
++                   if((resinfo == SIS_RI_512x384) || (resinfo > SIS_RI_800x600)) return(0);
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+-                   if((resinfo == 4) || (resinfo == 3) || (resinfo > 6)) return(0);
++                   if((resinfo == SIS_RI_512x384) ||
++                      (resinfo == SIS_RI_400x300) ||
++                      (resinfo > SIS_RI_640x480)) return(0);
+                 }
+               }
+-      }
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) { 
++      } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+               if(SiS_Pr->SiS_HiVision == 3) {
+                       tempax |= SupportHiVisionTV2;
+                               if(SiS_Pr->SiS_VBInfo & SetInSlaveMode){
+-                              if(resinfo == 4) return(0);
+-                              if(resinfo == 3) return(0);
+-                              if(resinfo == 7) {
++                              if(resinfo == SIS_RI_512x384) return(0);
++                              if(resinfo == SIS_RI_400x300) return(0);
++                              if(resinfo == SIS_RI_800x600) {
+                                       if(SiS_Pr->SiS_SetFlag & TVSimuMode) return(0);
+                               }
+-                              if(resinfo > 7) return(0);
++                              if(resinfo > SIS_RI_800x600) return(0);
+                       }
+               } else {  
+                               tempax |= SupportHiVisionTV;
+                               if(SiS_Pr->SiS_VBInfo & SetInSlaveMode){
+-                              if(resinfo == 4) return(0);
+-                              if((resinfo == 3) || (resinfo == 7)) {
++                              if(resinfo == SIS_RI_512x384) return(0);
++                              if((resinfo == SIS_RI_400x300) || (resinfo == SIS_RI_800x600)) {
+                                       if(SiS_Pr->SiS_SetFlag & TVSimuMode) return(0);
+                               }
+-                              if(resinfo > 7) return(0);
++                              if(resinfo > SIS_RI_800x600) return(0);
+                       }
+               }
+-      } else {
+-                 if(SiS_Pr->SiS_VBInfo & (SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
++      } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
+               tempax |= SupportTV;
+               tempax |= SupportTV1024;
+               if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-                  if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-                      if((SiS_Pr->SiS_VBInfo & SetNotSimuMode) && (SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                           if(resinfo != 8) {
+-                               if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-                                   ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 4)) ) {
+-                                   tempax &= ~(SupportTV1024);
+-                                   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                                         if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                                           if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-                                               ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
+-                                               if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+-                                           }
+-                                       }
+-                                   } else {
+-                                       if( (resinfo != 3) ||
+-                                           (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-                                           (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+-                                           if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                                               if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                                                   if(resinfo == 3) return(0);
+-                                                   if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+-                                               }
+-                                           }
+-                                         } else return(0);
+-                                   }
+-                               }
+-                           }
+-                      } else {
+-                          tempax &= ~(SupportTV1024);
+-                          if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                              if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                                  if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-                                      ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
++                 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++                    if((SiS_Pr->SiS_VBInfo & SetNotSimuMode) && (SiS_Pr->SiS_VBInfo & SetPALTV)) {
++                       if(resinfo != SIS_RI_1024x768) {
++                          if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++                              ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_512x384)) ) {
++                             tempax &= ~(SupportTV1024);
++                             if(HwDeviceExtension->jChipType >= SIS_315H) {
++                                  if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                                   if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++                                       ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
+                                       if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+-                                  }
+-                              }
+-                          } else {
+-                              if( (resinfo != 3) ||
+-                                  (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-                                  (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+-                                   if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                                       if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                                           if(resinfo == 3) return(0);
+-                                           if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+-                                       }
+                                    }
+-                                } else return(0);
+-                            }
+-                      }
+-                  } else {  /* slavemode */
+-                      if(resinfo != 8) {
+-                          if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-                              ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 4) ) ) {
+-                               tempax &= ~(SupportTV1024);
+-                               if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                                   if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                                       if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-                                           ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
+-                                           if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode))  return(0);
+-                                       }
++                                }
++                             } else {
++                                if( (resinfo != SIS_RI_400x300) ||
++                                    (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++                                    (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
++                                   if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++                                      if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                                         if(resinfo == SIS_RI_400x300) return(0);
++                                         if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
++                                      }
+                                    }
+-                              } else {
+-                                  if( (resinfo != 3) ||
+-                                      (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-                                      (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+-                                       if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                                           if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                                               if(resinfo == 3) return(0);
+-                                               if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+-                                           }
+-                                       }
+-                                    } else return(0);
+-                              }
++                                  } else return(0);
++                             }
+                           }
+-                      }
+-                  }
+-              } else {   /* 301 */
+-                  tempax &= ~(SupportTV1024);
+-                  if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                      if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                          if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+-                              ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != 7)) ) {
+-                              if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+-                          }
+-                      }
+-                  } else {
+-                      if( (resinfo != 3) ||
+-                          (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-                          (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+-                          if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                              if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-                                  if(resinfo == 3) return(0);
+-                                  if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+-                              }
++                       }
++                    } else {
++                       tempax &= ~(SupportTV1024);
++                       if(HwDeviceExtension->jChipType >= SIS_315H) {
++                          if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                             if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++                                 ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
++                                if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
++                             }
+                           }
+-                        } else return(0);
+-                  }
+-              }
+-           }
+-      }
+-      
+-  } else {    /* TW: for LVDS  */
++                       } else {
++                          if( (resinfo != SIS_RI_400x300) ||
++                              (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++                              (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
++                             if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++                                if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                                   if(resinfo == SIS_RI_400x300) return(0);
++                                   if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
++                                }
++                             }
++                            } else return(0);
++                         }
++                    }
++                 } else {  /* slavemode */
++                    if(resinfo != SIS_RI_1024x768) {
++                       if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++                           ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_512x384) ) ) {
++                          tempax &= ~(SupportTV1024);
++                          if(HwDeviceExtension->jChipType >= SIS_315H) {
++                             if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                                if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++                                    ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
++                                   if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode))  return(0);
++                                }
++                             }
++                          } else {
++                             if( (resinfo != SIS_RI_400x300) ||
++                                 (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++                                 (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
++                                if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++                                   if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                                      if(resinfo == SIS_RI_400x300) return(0);
++                                      if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
++                                   }
++                                }
++                               } else return(0);
++                          }
++                       }
++                    }
++                 }
++              } else {   /* 301 */
++                 tempax &= ~(SupportTV1024);
++                 if(HwDeviceExtension->jChipType >= SIS_315H) {
++                    if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                       if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
++                           ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
++                          if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
++                       }
++                    }
++                 } else {
++                    if( (resinfo != SIS_RI_400x300) ||
++                        (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++                        (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
++                       if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++                          if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++                             if(resinfo == SIS_RI_400x300) return(0);
++                             if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
++                          }
++                       }
++                      } else return(0);
++                 }
++              }
++        }
++
++  } else {    /* for LVDS  */
+       if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+                       if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+@@ -4284,24 +4406,29 @@ SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, 
+       if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+                       tempax |= SupportLCD;
+               if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+-                   if((resinfo != 0x14) && (resinfo > 0x09)) return(0);
++                   if((resinfo != SIS_RI_1280x768) && (resinfo >= SIS_RI_1280x1024)) return(0);
+               } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+-                   if((resinfo != 0x0f) && (resinfo > 0x08)) return(0);
++                   if((resinfo != SIS_RI_1024x600) && (resinfo >= SIS_RI_1024x768))  return(0);
+               } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+-                   if((resinfo != 0x10) && (resinfo > 0x08)) return(0);
++                   if((resinfo != SIS_RI_1152x768) && (resinfo > SIS_RI_1024x768))   return(0);
+               } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-                   if((resinfo != 0x15) && (resinfo > 0x09)) return(0);
++                   if((resinfo != SIS_RI_1400x1050) && (resinfo > SIS_RI_1280x1024)) return(0);
++              } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
++                     if(resinfo > SIS_RI_1600x1200) return(0);
+               } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-                     if(resinfo > 0x09) return(0);
++                     if(resinfo > SIS_RI_1280x1024) return(0);
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-                   if(resinfo > 0x08) return(0);
++                   if(resinfo > SIS_RI_1024x768)  return(0);
+               } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600){
+-                   if(resinfo > 0x07) return(0);
+-                   if(resinfo == 0x04) return(0);
++                   if(resinfo > SIS_RI_800x600)   return(0);
++                   if(resinfo == SIS_RI_512x384)  return(0);
++              } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelBarco1366) {
++                     if((resinfo != SIS_RI_1360x1024) && (resinfo > SIS_RI_1280x1024)) return(0);
+               }
+       }
+   }
+-  /* TW: Look backwards in table for matching CRT2 mode */
++  
++  /* Look backwards in table for matching CRT2 mode */
+   for(; SiS_Pr->SiS_RefIndex[RefreshRateTableIndex+(*i)].ModeID == tempbx; (*i)--) {
+       infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
+       if(infoflag & tempax) {
+@@ -4309,7 +4436,7 @@ SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, 
+       }
+       if ((*i) == 0) break;
+   }
+-  /* TW: Look through the whole mode-section of the table from the beginning
++  /* Look through the whole mode-section of the table from the beginning
+    *     for a matching CRT2 mode if no mode was found yet.
+    */
+   for((*i) = 0; ; (*i)++) {
+@@ -4329,7 +4456,7 @@ SiS_SaveCRT2Info(SiS_Private *SiS_Pr, US
+ {
+   USHORT temp1,temp2;
+-  /* TW: We store CRT1 ModeNo in CR34 */
++  /* We store CRT1 ModeNo in CR34 */
+   SiS_SetReg1(SiS_Pr->SiS_P3d4,0x34,ModeNo);
+   temp1 = (SiS_Pr->SiS_VBInfo & SetInSlaveMode) >> 8;
+   temp2 = ~(SetInSlaveMode >> 8);
+@@ -4345,16 +4472,16 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+   USHORT modeflag, resinfo=0;
+   UCHAR  OutputSelect = *SiS_Pr->pSiS_OutputSelect;
+-  if(SiS_Pr->UseCustomMode) {
+-        modeflag = SiS_Pr->CModeFlag;
++  if(ModeNo <= 0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+   } else {
+-    if (ModeNo <= 0x13)
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-    else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++     } else {
+       modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+       resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+-    }
+-  }    
++     }
++  }
+   SiS_Pr->SiS_SetFlag = 0;
+@@ -4364,22 +4491,24 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+   if(SiS_BridgeIsOn(SiS_Pr,BaseAddr,HwDeviceExtension) == 0) {  
+       temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ #if 0 
+-      /* SiS_HiVision is only used on 310/325/330+30xLV */
++      /* SiS_HiVision is only used on 315/330+30xLV */
+       if(SiS_Pr->SiS_VBType & (VB_SIS301LV302LV)) {
+-         if(SiS_Pr->SiS_HiVision & 0x03) {    /* TW: New from 650/30xLV 1.10.6s */
++         if(SiS_Pr->SiS_HiVision & 0x03) {    /* New from 650/30xLV 1.10.6s */
+             temp &= (SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode);   /* 0x83 */
+             temp |= SetCRT2ToHiVisionTV;                                      /* 0x80 */
+          }
+-         if(SiS_Pr->SiS_HiVision & 0x04) {    /* TW: New from 650/30xLV 1.10.6s */
++         if(SiS_Pr->SiS_HiVision & 0x04) {    /* New from 650/30xLV 1.10.6s */
+             temp &= (SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode);   /* 0x83 */
+             temp |= SetCRT2ToSVIDEO;                                          /* 0x08 */
+          }
+       }
+-#endif        
++#endif
++#if 0
+       if(SiS_Pr->SiS_IF_DEF_FSTN) {   /* fstn must set CR30=0x21 */
+                       temp = (SetCRT2ToLCD | SetSimuScanMode);
+                       SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,temp);
+       }
++#endif        
+       tempbx |= temp;
+       tempax = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) << 8;
+         tempax &= (LoadDACFlag | DriverMode | SetDispDevSwitch | SetNotSimuMode | SetPALTV);
+@@ -4519,7 +4648,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+                       tempbx |= SetSimuScanMode;
+       }
+-      /* TW: LVDS (LCD/TV) and 301BDH (LCD) can only be slave in 8bpp modes */
++      /* LVDS (LCD/TV) and 301BDH (LCD) can only be slave in 8bpp modes */
+       if(SiS_Pr->SiS_ModeType <= ModeVGA) {
+          if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
+              ((tempbx & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD)) ) {
+@@ -4527,12 +4656,12 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+          }
+       }
+       
+-      if(!(tempbx & SetSimuScanMode)){
++      if(!(tempbx & SetSimuScanMode)) {
+                   if(tempbx & SwitchToCRT2) {
+               if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {
+                    if( (HwDeviceExtension->jChipType >= SIS_315H) &&
+                        (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
+-                       if(resinfo != 0x0a)
++                       if(resinfo != SIS_RI_1600x1200)
+                               tempbx |= SetSimuScanMode;
+                    } else {
+                             tempbx |= SetSimuScanMode;
+@@ -4555,7 +4684,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+                   if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {
+                       if( (HwDeviceExtension->jChipType >= SIS_315H) &&
+                           (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
+-                           if(resinfo != 0x0a) {  /* TW: 650/301 BIOS */
++                           if(resinfo != SIS_RI_1600x1200) {  /* 650/301 BIOS */
+                                 tempbx |= SetInSlaveMode;
+                                 if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+                                            if(tempbx & SetCRT2ToTV) {
+@@ -4563,7 +4692,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+                                            SiS_Pr->SiS_SetFlag |= TVSimuMode;
+                                            }
+                                   }
+-                           }                      /* TW: 650/301 BIOS */
++                           }                      /* 650/301 BIOS */
+                       } else {
+                           tempbx |= SetInSlaveMode;
+                           if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+@@ -4621,7 +4750,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+               if(ROMAddr && SiS_Pr->SiS_UseROM) {
+                   OutputSelect = ROMAddr[0xf3];
+-                  if(HwDeviceExtension->jChipType == SIS_330) {
++                  if(HwDeviceExtension->jChipType >= SIS_330) {
+                       OutputSelect = ROMAddr[0x11b];
+                   }
+                 }
+@@ -4652,7 +4781,7 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+   SiS_Pr->SiS_VBInfo = tempbx;
+   if(HwDeviceExtension->jChipType == SIS_630) {
+-       SiS_WhatIsThis(SiS_Pr, SiS_Pr->SiS_VBInfo);
++       SiS_SetChrontelGPIO(SiS_Pr, SiS_Pr->SiS_VBInfo);
+   }
+ #ifdef TWDEBUG
+@@ -4666,61 +4795,35 @@ SiS_GetVBInfo(SiS_Private *SiS_Pr, USHOR
+ #endif
+ #endif
+-#if 0  /* TW: Incomplete! (But does not seem to be required) */
+-  if(HwDeviceExtension->jChipType < SIS_315H) {
+-     /* TW: From A901/630+301B BIOS */
+-     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80)
+-     }
+-     if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80)
+-           if( [si] == 3) ModeIdIndex = 0x3f2b;
+-       }
+-     }
+-     SiS_SetRegAND(SiS_Pr->SiS_P3d4, 0x31, 0xF7);
+-     if(ModeNo == 0x13) bp+4 = 0x03;
+-  } else {
+-     /* From 650/30xLV BIOS: */
+-     SiS_SetRegAND(SiS_Pr->SiS_P3d4, 0x31, 0xF7);
+-     if(ModeNo == 0x13) bp+4 = 0x03;
+-     else bp+4 = ModeNo;
+-  }
+-#endif
+-
+-  /* TW: 630/301B and 650/301 (not 301LV!) BIOSes do more here, but this seems for DOS mode */
+-
+ }
++/* Setup general purpose IO for Chrontel communication */
+ void
+-SiS_WhatIsThis(SiS_Private *SiS_Pr, USHORT myvbinfo)
++SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo)
+ {
+-   unsigned long eax, temp;
+-   unsigned short temp1;
++   unsigned long  acpibase;
++   unsigned short temp;
+    if(!(SiS_Pr->SiS_ChSW)) return;
+ #ifndef LINUX_XF86
+-   SiS_SetReg4(0xcf8,0x80000874);
+-   eax = SiS_GetReg3(0xcfc);
++   SiS_SetReg4(0xcf8,0x80000874);                /* get ACPI base */
++   acpibase = SiS_GetReg3(0xcfc);
+ #else
+-   eax = pciReadLong(0x00000800, 0x74);
++   acpibase = pciReadLong(0x00000800, 0x74);
+ #endif
+-   eax &= 0xFFFF;
+-   temp = eax;
+-   eax += 0x3c;
+-   temp1 = SiS_GetReg4((USHORT)eax);
+-   temp1 &= 0xFEFF;
+-   SiS_SetReg5((USHORT)eax, temp1);
+-   temp1 = SiS_GetReg4((USHORT)eax);
+-   eax = temp;
+-   eax += 0x3a;
+-   temp1 = SiS_GetReg4((USHORT)eax);
+-   temp1 &= 0xFEFF;
++   acpibase &= 0xFFFF;
++   temp = SiS_GetReg4((USHORT)(acpibase + 0x3c));  /* ACPI register 0x3c: GP Event 1 I/O mode select */
++   temp &= 0xFEFF;
++   SiS_SetReg5((USHORT)(acpibase + 0x3c), temp);
++   temp = SiS_GetReg4((USHORT)(acpibase + 0x3c));
++   temp = SiS_GetReg4((USHORT)(acpibase + 0x3a));  /* ACPI register 0x3a: GP Pin Level (low/high) */
++   temp &= 0xFEFF;
+    if(!(myvbinfo & SetCRT2ToTV)) {
+-      temp1 |= 0x0100;
++      temp |= 0x0100;
+    }
+-   SiS_SetReg5((USHORT)eax, temp1);
+-   temp1 = SiS_GetReg4((USHORT)eax);
++   SiS_SetReg5((USHORT)(acpibase + 0x3a), temp);
++   temp = SiS_GetReg4((USHORT)(acpibase + 0x3a));
+ }
+ void
+@@ -4731,14 +4834,14 @@ SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, 
+   USHORT temp1=0,modeflag=0,tempcx=0;
+   USHORT StandTableIndex,CRT1Index;
+ #ifdef SIS315H   
+-  USHORT ResInfo,DisplayType,temp=0;
++  USHORT ResIndex,DisplayType,temp=0;
+   const  SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
+ #endif
+   SiS_Pr->SiS_RVBHCMAX  = 1;
+   SiS_Pr->SiS_RVBHCFACT = 1;
+-  if(ModeNo <= 0x13){
++  if(ModeNo <= 0x13) {
+       modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+       StandTableIndex = SiS_GetModePtr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+@@ -4752,7 +4855,7 @@ SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, 
+ #ifdef SIS315H     
+       temp = SiS_GetLVDSCRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-                      RefreshRateTableIndex,&ResInfo,&DisplayType);
++                      RefreshRateTableIndex,&ResIndex,&DisplayType);
+       if(temp == 0)  return;
+@@ -4795,16 +4898,16 @@ SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, 
+               case 99: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1OPAL;                break;
+               default: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1;          break;
+       }
+-      tempax = (LVDSCRT1Ptr+ResInfo)->CR[0];
+-      tempax |= (LVDSCRT1Ptr+ResInfo)->CR[14] << 8;
++      tempax = (LVDSCRT1Ptr+ResIndex)->CR[0];
++      tempax |= (LVDSCRT1Ptr+ResIndex)->CR[14] << 8;
+       tempax &= 0x03FF;
+-      tempbx = (LVDSCRT1Ptr+ResInfo)->CR[6];
+-      tempcx = (LVDSCRT1Ptr+ResInfo)->CR[13] << 8;
++      tempbx = (LVDSCRT1Ptr+ResIndex)->CR[6];
++      tempcx = (LVDSCRT1Ptr+ResIndex)->CR[13] << 8;
+       tempcx &= 0x0100;
+       tempcx <<= 2;
+       tempbx |= tempcx;
+-      temp1  = (LVDSCRT1Ptr+ResInfo)->CR[7];
+-#endif        
++      temp1  = (LVDSCRT1Ptr+ResIndex)->CR[7];
++#endif
+     } else {
+@@ -4840,11 +4943,12 @@ SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, 
+   if(modeflag & Charx8Dot) tempax *= 8;
+   else                     tempax *= 9;
+-  /* TW: From 650/30xLV 1.10.6s */
++  /* From 650/30xLV 1.10.6s */
+   if(modeflag & HalfDCLK)  tempax <<= 1;
+-  SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
+   tempbx++;
++
++  SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
+   SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = tempbx;
+ }
+@@ -4852,18 +4956,18 @@ void
+ SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+ {
+   if(HwDeviceExtension->jChipType >= SIS_315H)
+-      SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2f,0x01);
++     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2f,0x01);
+   else
+-      SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24,0x01);
++     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24,0x01);
+ }
+ void
+ SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+ {
+   if(HwDeviceExtension->jChipType >= SIS_315H)
+-      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2F,0xFE);
++     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2F,0xFE);
+   else
+-      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x24,0xFE);
++     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x24,0xFE);
+ }
+ void
+@@ -4872,7 +4976,6 @@ SiS_EnableCRT2(SiS_Private *SiS_Pr)
+   SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
+ }
+-/* Checked against all BIOSes */
+ void
+ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+ {
+@@ -4882,9 +4985,9 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+   USHORT temp=0;
+   UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
+-  if (SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++  if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* ===== TW: For 30xB/LV ===== */
++      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* ===== For 30xB/LV ===== */
+         if(HwDeviceExtension->jChipType < SIS_315H) {
+@@ -4940,9 +5043,9 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+         } else {
+-#ifdef SIS315H           /* 310/325 series */
++#ifdef SIS315H           /* 315 series */
+-           if(IS_SIS650740) {         /* 650, 740 */
++           if(IS_SIS550650740660) {           /* 550, 650, 740, 660 */
+ #if 0
+             if(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00) != 1) return;  /* From 1.10.7w */
+@@ -4966,22 +5069,35 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+                SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
+                  pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
+-               
++
+                if(IS_SIS740) {
+                   SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
+                }
+                SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+-               
+-               if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-                  tempah = 0xef;
+-                  if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-                     tempah = 0xf7;
+-                    }
+-                  SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
++
++               if(!(IS_SIS740)) {
++                  if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++                     tempah = 0xef;
++                     if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++                        tempah = 0xf7;
++                       }
++                     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
++                  }
+                }
+-              }
++              } else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
++               if(HwDeviceExtension->jChipType == SIS_650) {
++                  if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++                     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,0xef);
++                  }
++                  if((!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
++                     (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
++                     SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
++                  }
++                  SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 3);
++               }
++            }
+               if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
+                tempah = 0x3f;
+@@ -5046,8 +5162,8 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+             if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-               SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,~0x10);    /* 1.10.8r */
+-               
++               SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,~0x10);               /* 1.10.8r, 8m */
++
+                tempah = 0x3f;
+                if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+                   tempah = 0x7f;
+@@ -5057,9 +5173,9 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+                }
+                SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,tempah);
+-               if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) {   /* 1.10.8r */
++               if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) {   /* 1.10.8r, 8m */
+                   SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
+-               }                                                              /* 1.10.8r */
++               }                                                              /* 1.10.8r, 8m */
+                if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+                   SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf);
+@@ -5075,81 +5191,33 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+                SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
+-            }
+-
+-#if 0
+-          } else if(IS_SIS740) {      /* 740 */
+-        
+-           if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {   /* 30xLV */
+-           
+-              if( (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+-                  (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
+-                    SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
+-              }
+-              
+-              SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
++            } else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
++               if(HwDeviceExtension->jChipType == SIS_650) {
++                  if((SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
++                     (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)))) {
++                     if((!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
++                        (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)))) {
++                        SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2);
++                        SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
++                        SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4);
++                     }
++                  }
++               }
++            } else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
++               if(HwDeviceExtension->jChipType == SIS_650) {
++                  if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++                     tempah = 0xef;
++                     if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++                        if(modenum > 0x13) {
++                           tempah = 0xf7;
++                        }
++                       }
++                     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
++                  }
++               }
++            }
+-                pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
+-              
+-              SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
+-
+-              SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+-              
+-              if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-                 SiS_DisplayOff(SiS_Pr);
+-                 SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+-                 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+-                 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1E,0xDF);
+-              } else {
+-                 SiS_DisplayOff(SiS_Pr);
+-                 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+-                 SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+-                 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+-                 temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
+-                   SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
+-                 SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+-                 SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
+-              }
+-              
+-              SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,0x3F);
+-              SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,0xEF);  /* (from 650) */
+-              
+-              SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
+-              
+-              if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-                 SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf);
+-              }
+-              
+-              if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-                 if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-                    if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) {
+-                       if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-                          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
+-                         }
+-                      }
+-                 }
+-              }
+-              SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
+-           
+-           } else {   /* (301,) 301B */
+-        
+-              if(SiS_Is301B(SiS_Pr,BaseAddr)) {
+-                 SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,0x3F);
+-              }
+-           
+-              SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);
+-              SiS_DisplayOff(SiS_Pr);
+-              SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+-              SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+-
+-              temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
+-                SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
+-              SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+-              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
+-              
+-           }
+-#endif          
+-        } else {                      /* 315, 330 - all bridge types */
++        } else {                      /* 315, 330 - all bridge types */
+            if(SiS_Is301B(SiS_Pr,BaseAddr)) {
+               tempah = 0x3f;
+@@ -5193,13 +5261,13 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+       }
+-      } else {     /* ============ TW: For 301 ================ */
++      } else {     /* ============ For 301 ================ */
+         if(HwDeviceExtension->jChipType < SIS_315H) {
+-            if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+-                SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x0B);
+-              SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 1);
+-          }
++            if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
++            SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
++            SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
++         }
+       }
+         SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);           /* disable VB */
+@@ -5218,18 +5286,23 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+           SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
+       } else {
+             SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);            /* disable CRT2 */
++          if( (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ||
++              (!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) ) {
++              SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
++              SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
++          }
+       }
+       }
+-  } else {     /* ============ TW: For LVDS =============*/
++  } else {     /* ============ For LVDS =============*/
+     if(HwDeviceExtension->jChipType < SIS_315H) {
+ #ifdef SIS300 /* 300 series */
+       if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+-          SiS_SetCH700x(SiS_Pr,0x090E);
++         SiS_SetCH700x(SiS_Pr,0x090E);
+       }
+       if(HwDeviceExtension->jChipType == SIS_730) {
+@@ -5245,17 +5318,17 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+             if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
+   
+-                if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
++               if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+-                     SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
++                    SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+-                   if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06) & 0x1c)) {
+-                       SiS_DisplayOff(SiS_Pr);
+-                   }
++                  if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06) & 0x1c)) {
++                      SiS_DisplayOff(SiS_Pr);
++                  }
+-                   SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
+-                   SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+-                  }
++                  SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
++                  SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
++                 }
+               }
+          }
+       }
+@@ -5279,29 +5352,40 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+     } else {
+-#ifdef SIS315H        /* 310/325 series */
++#ifdef SIS315H        /* 315 series */
+       if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+-              temp = SiS_GetCH701x(SiS_Pr,0x61);
+-              if(temp < 1) {
+-                 SiS_SetCH701x(SiS_Pr,0xac76);
+-                 SiS_SetCH701x(SiS_Pr,0x0066);
+-              }
+-              
+-              if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++
++              if(HwDeviceExtension->jChipType == SIS_740) {
++                 temp = SiS_GetCH701x(SiS_Pr,0x61);
++                 if(temp < 1) {
++                    SiS_SetCH701x(SiS_Pr,0xac76);
++                    SiS_SetCH701x(SiS_Pr,0x0066);
++                 }
++
++                 if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+                       SiS_SetCH701x(SiS_Pr,0x3e49);
+-              } else if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr))  {
++                 } else if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr))  {
+                       SiS_SetCH701x(SiS_Pr,0x3e49);
++                 }
+               }
+-              
++
+               if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+                       SiS_Chrontel701xBLOff(SiS_Pr);
+-                      SiS_Chrontel701xOff(SiS_Pr);
++                      SiS_Chrontel701xOff(SiS_Pr,HwDeviceExtension);
+               } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+                       SiS_Chrontel701xBLOff(SiS_Pr);
+-                      SiS_Chrontel701xOff(SiS_Pr);
++                      SiS_Chrontel701xOff(SiS_Pr,HwDeviceExtension);
+               }
+-              
++
++              if(HwDeviceExtension->jChipType != SIS_740) {
++                 if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++                      SiS_SetCH701x(SiS_Pr,0x0149);
++                 } else if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr))  {
++                      SiS_SetCH701x(SiS_Pr,0x0149);
++                 }
++              }
++
+       }
+       if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+@@ -5325,6 +5409,10 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+               SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+       }
++      if(HwDeviceExtension->jChipType == SIS_740) {
++         SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
++      }
++
+       SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+       if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+@@ -5337,15 +5425,27 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+       if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+               if(SiS_CRT2IsLCD(SiS_Pr, BaseAddr,HwDeviceExtension)) {
+-                      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
++                 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
++                 if(HwDeviceExtension->jChipType == SIS_550) {
++                    SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xbf);
++                    SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xef);
++                 }
++              }
++      } else {
++         if(HwDeviceExtension->jChipType == SIS_740) {
++              if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++                 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
+               }
+-      } else if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-              SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
++         } else {
++              if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++                 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
++              }
++         }
+       }
+       if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+               if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-                      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xff);
++                      /* SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xff); */
+               } else {
+                       SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
+               }
+@@ -5353,7 +5453,10 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+       SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
+-      if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
++      if(HwDeviceExtension->jChipType == SIS_550) {
++              SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
++              SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
++      } else if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+       } else if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+@@ -5361,7 +5464,7 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+       }
+-#if 0  /* TW: BIOS code makes no sense */
++#if 0  /* BIOS code makes no sense */
+        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+            if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+               if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+@@ -5387,7 +5490,6 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, P
+ }
+-/* TW: Checked against all BIOSes */
+ void
+ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+ {
+@@ -5400,7 +5502,7 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* TW: ====== For 301B et al  ====== */
++    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {   /* ====== For 301B et al  ====== */
+       if(HwDeviceExtension->jChipType < SIS_315H) {
+@@ -5497,9 +5599,9 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+       } else {
+-#ifdef SIS315H    /* 310/325 series */
++#ifdef SIS315H    /* 315 series */
+-       if(IS_SIS650740) {             /* 650 */
++       if(IS_SIS550650740660) {               /* 550, 650, 740, 660 */
+ #if 0
+           if(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00) != 1) return;    /* From 1.10.7w */
+@@ -5541,7 +5643,32 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+                 delaylong = TRUE;
+              }
+-          }
++          } else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
++             if(HwDeviceExtension->jChipType == SIS_650) {
++                if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++                   SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,0x10);
++                }
++                if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
++                    (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
++                   SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
++                   SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 0);
++                }
++             }
++          } else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
++
++               if(HwDeviceExtension->jChipType == SIS_650) {
++                  if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++                     tempah = 0x10;
++                     if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04) {
++                        tempah = 0x18;
++                        if((SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) {
++                           tempah = 0x08;
++                        }
++                     }
++                     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah);
++                  }
++               }
++            }
+           if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+                temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
+@@ -5595,11 +5722,24 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);    /* All this from 1.10.7u */
+              SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
+              SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
+-             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);  
+-             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);  
+-             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x00);  
+-             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); 
+-             SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); 
++
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x12);
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0xd0);
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x6b);
++             if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) == 0x02) {
++                SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x0d);
++                SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x70);
++                SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x40);
++                if(((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) != 0x03)) {
++                   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);
++                   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);
++                   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x33);  /* 00 */
++                }
++             }
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++             if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) != 0x03) {
++                SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
++             }
+              
+              SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+           
+@@ -5610,127 +5750,44 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+              if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+                 if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+                     ((SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ) {
+-                  SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
+-                  if(delaylong) {
++                   SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
++                   if(delaylong) {
+                       SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
+-                  }
+-                    SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+-                  SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
+-               }
+-            }
++                   }
++                     SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
++                   SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
++                }
++             }
+-            SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
+-            SiS_DisplayOn(SiS_Pr);
+-            SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff);
++             SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
++             SiS_DisplayOn(SiS_Pr);
++             SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff);
+-            if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++             if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+                 SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+-            }
++             }
+ #if 0
+-              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+-            SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
+-            SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
+-            SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);   /* 1.10.8r: 0x0d */
+-            SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);   /* 1.10.8r: 0x70 */
+-            SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x00);   /* 1.10.8r: 0x40 */
+-            SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); 
+-            SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); 
++               SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
++             SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
++             SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);   /* 1.10.8r: 0x0d */
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);   /* 1.10.8r: 0x70 */
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x00);   /* 1.10.8r: 0x40 */
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++             SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
+ #endif              
++          } if(SiS_Pr->SiS_VBType & VB_NoLCD) {
++             if(HwDeviceExtension->jChipType == SIS_650) {
++                if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++                   if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
++                       (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
++                      SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
++                      SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
++                   }
++                }
++             }
++          }
+-        }
+-
+-#if 0
+-         } else if(IS_SIS740) {               /* 740 */
+-       
+-         if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {  /* 30xLV */
+-         
+-            SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
+-            SiS_DisplayOff(SiS_Pr);
+-            pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
+-            SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
+-            
+-            if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+-                (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+-                   if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
+-                    SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
+-                    SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+-                 }
+-            }
+-            
+-            if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-               temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
+-               if(SiS_BridgeInSlave(SiS_Pr)) {
+-                    tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+-                    if(!(tempah & SetCRT2ToRAMDAC))  temp |= 0x20;
+-                 }
+-                 SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
+-
+-               SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);      
+-               SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+-            }
+-            
+-            if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-               SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+-            }
+-            
+-            SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
+-            SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
+-            SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0x10);  /* (taken from 650 1.10.8r) */
+-            SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
+-            
+-            if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-               if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+-                   (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+-                  SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
+-                  if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x40) {
+-                     SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+-                  }
+-                  SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
+-                  SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
+-                  SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+-               }
+-              }
+-            
+-            SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
+-            SiS_DisplayOn(SiS_Pr);
+-            SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff);
+-            
+-            if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+-            }
+-         
+-         } else {     /* (301), 301B */
+-       
+-            if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-               temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
+-               if(SiS_BridgeInSlave(SiS_Pr)) {
+-                    tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+-                    if(!(tempah & SetCRT2ToRAMDAC))  temp |= 0x20;
+-                 }
+-                 SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
+-
+-               SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);                   /* enable CRT2 */
+-
+-               temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
+-                 if(!(temp & 0x80))
+-                    SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
+-              }
+-
+-            SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
+-
+-            if(SiS_Is301B(SiS_Pr,BaseAddr)) { 
+-               SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
+-               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+-            } else {
+-               SiS_VBLongWait(SiS_Pr);
+-                 SiS_DisplayOn(SiS_Pr);
+-               SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7F);
+-                 SiS_VBLongWait(SiS_Pr);
+-            }
+-            
+-         }
+-#endif
+-        
+        } else {                       /* 315, 330 */
+          if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+@@ -5782,11 +5839,11 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+       }
+-    } else {  /* ============  TW: For 301 ================ */
++    } else {  /* ============  For 301 ================ */
+        if(HwDeviceExtension->jChipType < SIS_315H) {
+             if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+-                SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x0B);
++                SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
+               SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 0);
+           }
+        }
+@@ -5818,13 +5875,13 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+        if(HwDeviceExtension->jChipType < SIS_315H) {
+             if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+               SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 1);
+-                SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF0,0x03);
++                SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
+           }
+        }
+     }
+-  } else {   /* =================== TW: For LVDS ================== */
++  } else {   /* =================== For LVDS ================== */
+     if(HwDeviceExtension->jChipType < SIS_315H) {
+@@ -5875,7 +5932,7 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+     } else {
+-#ifdef SIS315H    /* 310/325 series */
++#ifdef SIS315H    /* 315 series */
+ #if 0  /* BIOS code makes no sense */
+        if(SiS_IsVAMode()) {
+@@ -5902,36 +5959,41 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+         SiS_Chrontel701xBLOff(SiS_Pr);
+        }
+-       SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
+-       
+-#ifdef NEWCH701x
+-       if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+-           if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension,BaseAddr)) {
++       if(HwDeviceExtension->jChipType != SIS_550) {
++          SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
++       }
++
++       if(HwDeviceExtension->jChipType == SIS_740) {
++          if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
++             if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension,BaseAddr)) {
+               SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+-         }
++           }
++        }
+        }
+-#endif       
+        temp1 = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
+-       if (!(temp1 & 0x80))
++       if(!(temp1 & 0x80))
+            SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
+        if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+            if(temp) {
+-             SiS_Chrontel701xBLOn(SiS_Pr);
++             SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+          }
+        }
+        if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+            if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+               SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
++              if(HwDeviceExtension->jChipType == SIS_550) {
++                 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x40);
++                 SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x10);
++              }
++         }
++       } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++           if(HwDeviceExtension->jChipType != SIS_740) {
++              SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+          }
+-       } 
+-#ifndef NEWCH701x       
+-         else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-           SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+        }
+-#endif       
+        if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+            SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+@@ -5954,10 +6016,10 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PS
+        if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+                       if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+                       if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-                              SiS_Chrontel701xBLOn(SiS_Pr);
++                              SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+                               SiS_ChrontelDoSomething4(SiS_Pr,HwDeviceExtension, BaseAddr);
+                       } else if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr))  {
+-                                      SiS_Chrontel701xBLOn(SiS_Pr);
++                                      SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+                                       SiS_ChrontelDoSomething4(SiS_Pr,HwDeviceExtension, BaseAddr);
+                       }
+                       }
+@@ -5983,7 +6045,7 @@ SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS
+ {
+   USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
+-  /* TW: Switch on LCD backlight on SiS30xLV */
++  /* Switch on LCD backlight on SiS30xLV */
+   if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+       (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+     if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
+@@ -6001,7 +6063,7 @@ SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSI
+ {
+   USHORT  BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
+-  /* TW: Switch off LCD backlight on SiS30xLV */
++  /* Switch off LCD backlight on SiS30xLV */
+   if( (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+       (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
+        SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
+@@ -6023,12 +6085,14 @@ SiS_CR36BIOSWord23b(SiS_Private *SiS_Pr,
+   UCHAR *ROMAddr;
+   if((ROMAddr = (UCHAR *)HwDeviceExtension->pjVirtualRomBase) && SiS_Pr->SiS_UseROM) {
+-     temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
+-     temp >>= 4;
+-     temp = 1 << temp;
+-     temp1 = (ROMAddr[0x23c] << 8) | ROMAddr[0x23b];
+-     if(temp1 & temp) return(1);
+-     else return(0);
++     if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
++        temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
++        temp >>= 4;
++        temp = 1 << temp;
++        temp1 = (ROMAddr[0x23c] << 8) | ROMAddr[0x23b];
++        if(temp1 & temp) return(1);
++        else return(0);
++     } else return(0);
+   } else {
+      return(0);
+   }
+@@ -6041,12 +6105,14 @@ SiS_CR36BIOSWord23d(SiS_Private *SiS_Pr,
+   UCHAR *ROMAddr;
+   if((ROMAddr = (UCHAR *)HwDeviceExtension->pjVirtualRomBase) && SiS_Pr->SiS_UseROM) {
+-     temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
+-     temp >>= 4;
+-     temp = 1 << temp;
+-     temp1 = (ROMAddr[0x23e] << 8) | ROMAddr[0x23d];
+-     if(temp1 & temp) return(1);
+-     else return(0);
++     if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
++        temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
++        temp >>= 4;
++        temp = 1 << temp;
++        temp1 = (ROMAddr[0x23e] << 8) | ROMAddr[0x23d];
++        if(temp1 & temp) return(1);
++        else return(0);
++     } else return(0);
+   } else {
+      return(0);
+   }
+@@ -6143,7 +6209,7 @@ SiS_SetPanelDelay(SiS_Private *SiS_Pr, U
+ #ifdef SIS315H
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {                      /* 310/325 series, LVDS */
++      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {                      /* 315 series, LVDS */
+           if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+               PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+@@ -6171,7 +6237,7 @@ SiS_SetPanelDelay(SiS_Private *SiS_Pr, U
+             SiS_ShortDelay(SiS_Pr,Delay);
+         }
+-      } else {                                                        /* 310/325 series, 301(B) */
++      } else {                                                        /* 315 series, 301(B) */
+           PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+         DelayIndex = PanelID >> 4;
+@@ -6271,14 +6337,7 @@ SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_H
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+      if((flag & EnableDualEdge) && (flag & SetToLCDA))   return(1);
+-#if 0 /* Not done in 650/30xLV 1.10.6s, but in 650/301LV */
+-     else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-       if(flag) return(1);
+-       else     return(0);                             
+-     }
+-#endif
+-     else
+-       return(0);
++     else return(0);
+   } else
+ #endif
+      return(0);
+@@ -6325,7 +6384,9 @@ SiS_IsNotM650or651(SiS_Private *SiS_Pr, 
+   if(HwDeviceExtension->jChipType == SIS_650) {
+      flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f);
+      flag &= 0xF0;
+-     if((flag == 0xb0) || (flag == 0x90)) return 0;
++     /* Check for revision != A0 only */
++     if((flag == 0xe0) || (flag == 0xc0) ||
++        (flag == 0xb0) || (flag == 0x90)) return 0;
+      else return 1;
+   } else
+ #endif
+@@ -6443,7 +6504,7 @@ SiS_BridgeIsEnable(SiS_Private *SiS_Pr, 
+       if((flag == 0x80) || (flag == 0x20)) return 0;
+       else                               return 1;
+     } else {
+-      /* 310/325 series (650/30xLV 1.10.6s) */
++      /* 315 series (650/30xLV 1.10.6s) */
+       flag &= 0x50;
+       if((flag == 0x40) || (flag == 0x10)) return 0;
+       else                                 return 1;
+@@ -6493,8 +6554,8 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+ {
+   USHORT temp,modeflag,resinfo=0;
+   const unsigned char SiS300SeriesLCDRes[] =
+-         { 0, 1, 2, 3, 7, 4, 5, 8,
+-         0, 0, 0, 0, 0, 0, 0, 0 };
++         { 0,  1,  2,  3,  7,  4,  5,  8,
++         0,  0, 10,  0,  0,  0,  0, 15 };
+   SiS_Pr->SiS_LCDResInfo = 0;
+   SiS_Pr->SiS_LCDTypeInfo = 0;
+@@ -6517,11 +6578,13 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+   temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
++#if 0
+   /* FSTN: Fake CR36 (TypeInfo 2, ResInfo SiS_Panel320x480) */
+   if(SiS_Pr->SiS_IF_DEF_FSTN) {
+       temp = 0x20 | SiS_Pr->SiS_Panel320x480;
+       SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,temp);
+   }
++#endif
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+       SiS_Pr->SiS_LCDTypeInfo = temp >> 4;
+@@ -6530,14 +6593,16 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+   }
+   temp &= 0x0f;
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+-      /* TW: Translate 300 series LCDRes to 310/325 series for unified usage */
++      /* Translate 300 series LCDRes to 315 series for unified usage */
+       temp = SiS300SeriesLCDRes[temp];
+   }
+   SiS_Pr->SiS_LCDResInfo = temp;
++#if 0
+   if(SiS_Pr->SiS_IF_DEF_FSTN){
+               SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel320x480;
+   }
++#endif
+   if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+       if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMin301)
+@@ -6547,75 +6612,109 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+               SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMinLVDS;
+   }
+-  if(SiS_Pr->SiS_LCDResInfo > SiS_Pr->SiS_PanelMax)
++  if((!SiS_Pr->CP_HaveCustomData) || (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_PanelCustom)) {
++     if(SiS_Pr->SiS_LCDResInfo > SiS_Pr->SiS_PanelMax)
+       SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel1024x768;
++  }
++
++  if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++     SiS_Pr->SiS_LCDResInfo = Panel_Barco1366;
++  }
++
++  switch(SiS_Pr->SiS_LCDResInfo) {
++     case Panel_800x600:   SiS_Pr->PanelXRes =  800; SiS_Pr->PanelYRes =  600; break;
++     case Panel_1024x768:  SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes =  768; break;
++     case Panel_1280x1024: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 1024; break;
++     case Panel_640x480_3:
++     case Panel_640x480_2:
++     case Panel_640x480:   SiS_Pr->PanelXRes =  640; SiS_Pr->PanelYRes =  480; break;
++     case Panel_1024x600:  SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes =  600; break;
++     case Panel_1152x864:  SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes =  864; break;
++     case Panel_1280x960:  SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes =  960; break;
++     case Panel_1152x768:  SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes =  768; break;
++     case Panel_1400x1050: SiS_Pr->PanelXRes = 1400; SiS_Pr->PanelYRes = 1050; break;
++     case Panel_1280x768:  SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes =  768; break;
++     case Panel_1600x1200: SiS_Pr->PanelXRes = 1600; SiS_Pr->PanelYRes = 1200; break;
++     case Panel_320x480:   SiS_Pr->PanelXRes =  320; SiS_Pr->PanelYRes =  480; break;
++     case Panel_Custom:    SiS_Pr->PanelXRes = SiS_Pr->CP_MaxX;
++                         SiS_Pr->PanelYRes = SiS_Pr->CP_MaxY;
++                         break;
++     case Panel_Barco1366: SiS_Pr->PanelXRes = 1360; SiS_Pr->PanelYRes = 1024; break;
++     default:            SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes =  768; break;
++  }
+   temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
++#if 0
+   if(SiS_Pr->SiS_IF_DEF_FSTN){
+-        /* TW: Fake LVDS bridge for FSTN */
++        /* Fake LVDS bridge for FSTN */
+               temp = 0x04;
+               SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,temp);
+   }
++#endif
+   SiS_Pr->SiS_LCDInfo = temp;
+   
+   if(!(SiS_Pr->UsePanelScaler))        SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
+   else if(SiS_Pr->UsePanelScaler == 1) SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+-  /* TW: Inserted entire 315-block from 650/LVDS/30xLV BIOSes */
++  if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++        /* For non-standard LCD resolution, we let the panel scale */
++        if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) {
++           SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++         if(ModeNo == 0x7c || ModeNo == 0x7d || ModeNo == 0x7e) {
++            /* Bridge does not scale to 1280x960 */
++              SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++         } else if(ModeNo == 0x2f || ModeNo == 0x5d || ModeNo == 0x5e) {
++            if(!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
++               /* Bridge does not scale to 640x400 */
++               SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++            }
++         }
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
++           /* TEMP - no idea about the timing and zoom factors */
++           SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
++         if(ModeNo == 0x3a || ModeNo == 0x4d || ModeNo == 0x65) {
++            /* Bridge does not scale to 1280x1024 */
++            SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++         }
++      } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
++         /* TEMP - no idea about the timing and zoom factors */
++         SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
++      }
++     }
++  }
++
++
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+ #ifdef SIS315H
+-     if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-           if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-               if(ModeNo == 0x3a || ModeNo == 0x4d || ModeNo == 0x65) {
+-                   /* Bridge does not scale to 1280x1024 */
+-                   SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+-               }
+-           }
+-           if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-               if(ModeNo == 0x7c || ModeNo == 0x7d || ModeNo == 0x7e) {
+-                   /* TW: Bridge does not scale to 1280x960 */
+-                   SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+-               }
+-               if(ModeNo == 0x2f || ModeNo == 0x5d || ModeNo == 0x5e) {
+-                   /* TW: Bridge does not scale to 640x400 */
+-                   SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+-               }
+-           }
+-           if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-               if(ModeNo == 0x2f || ModeNo == 0x5d || ModeNo == 0x5e) {
+-                   /* TW: Most panels can't scale to 640x400 */
+-                   SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
+-               }
+-           }
+-       }
+-     }
+      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x01) {
+-         SiS_Pr->SiS_LCDInfo &= 0xFFEF;    
+-       SiS_Pr->SiS_LCDInfo |= LCDPass11;
++        SiS_Pr->SiS_LCDInfo &= 0xFFEF;
++      SiS_Pr->SiS_LCDInfo |= LCDPass11;
+      }
+ #endif
+   } else {
+ #ifdef SIS300
+      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+         if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+-           if(!(ROMAddr[0x235] & 0x02)) {
+-            SiS_Pr->SiS_LCDInfo &= 0xEF;
++         if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
++              if(!(ROMAddr[0x235] & 0x02)) {
++               SiS_Pr->SiS_LCDInfo &= 0xEF;
++            }
+          }
+         }
+-     } else {
+-        if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-         if((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10))) {
+-               SiS_Pr->SiS_LCDInfo &= 0xEF;
+-         }
++     } else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++      if((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10))) {
++           SiS_Pr->SiS_LCDInfo &= 0xEF;
+       }
+      }
+ #endif
+   }
+-  
+-  /* TW: With Trumpion, always Expanding */
+-  if(SiS_Pr->SiS_IF_DEF_TRUMPION != 0){
+-       SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
++
++  /* Trumpion: Assume non-expanding */
++  if(SiS_Pr->SiS_IF_DEF_TRUMPION != 0) {
++     SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
+   }
+   if(!((HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_SetFlag & SetDOSMode))) {
+@@ -6624,7 +6723,7 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+          if(ModeNo > 0x13) {
+             if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+-                 if((resinfo == 7) || (resinfo == 3)) {
++                 if((resinfo == SIS_RI_800x600) || (resinfo == SIS_RI_400x300)) {
+                     SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+                }
+               }
+@@ -6644,9 +6743,9 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+                                             (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480))) {
+                  if(ModeNo > 0x13) {
+                     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-                       if(resinfo == 4) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;     /* 512x384  */
++                       if(resinfo == SIS_RI_512x384) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+                     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+-                       if(resinfo == 3) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;     /* 400x300  */
++                       if(resinfo == SIS_RI_400x300) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+                     }
+                  }
+             } else SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+@@ -6665,19 +6764,21 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+   }
+ #ifdef SIS315H
+-  /* TW: 650/30xLV 1.10.6s */
++  /* 650/30xLV 1.10.6s */
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-    if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) {
+-      /* Enable 302B/302LV dual link mode */
+-      /* (302B is a theory - not in any BIOS */
+-      temp = 0x00;
+-      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) temp = 0x04;
+-      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x04;
+-      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) temp = 0x04;
+-      SiS_SetReg1(SiS_Pr->SiS_P3d4,0x39,temp);
+-    } else if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-      SiS_SetReg1(SiS_Pr->SiS_P3d4,0x39,0x00);
+-    }
++     if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
++        SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x39,~0x04);
++        if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) {
++           /* Enable 302B/302LV dual link mode.
++            * (302B is a theory - not in any BIOS)
++          */
++           if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
++              (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++              (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
++            SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04);
++         }
++      }
++     }
+   }
+ #endif
+@@ -6697,19 +6798,6 @@ SiS_GetLCDResInfo(SiS_Private *SiS_Pr, U
+ }
+ void
+-SiS_PresetScratchregister(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+-{
+-  return;
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,0x21);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x31,0x41);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x32,0x28);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x33,0x22);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x35,0x43);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,0x01);  */
+-  /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,0x00);  */
+-}
+-
+-void
+ SiS_LongWait(SiS_Private *SiS_Pr)
+ {
+   USHORT i;
+@@ -6803,7 +6891,7 @@ SiS_WaitRetrace1(SiS_Private *SiS_Pr, PS
+ #endif
+   } else {
+ #ifdef SIS300
+-#if 0  /* TW: Not done in A901 BIOS */
++#if 0  /* Not done in A901 BIOS */
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
+      }
+@@ -6898,7 +6986,51 @@ void SiS_SetRegOR(USHORT Port,USHORT Ind
+ /* ========================================================= */
+-/* TW: Set 301 TV Encoder (and some LCD relevant) registers */
++static void
++SiS_SetTVSpecial(SiS_Private *SiS_Pr, USHORT ModeNo)
++{
++  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
++           if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1c,0xa7);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1d,0x07);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1e,0xf2);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1f,0x6e);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x20,0x17);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,0x8b);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x22,0x73);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,0x53);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,0x13);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x25,0x40);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x26,0x34);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,0xf4);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x28,0x63);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x29,0xbb);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2a,0xcc);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2b,0x7a);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2c,0x58);   /* 48 */
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2d,0xe4);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2e,0x73);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,0xda);   /* de */
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0x13);
++            if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38)) & 0x40) {
++               SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x14);
++            } else {
++               SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x15);
++            }
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1b);
++            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,0x72);
++           }
++        } else {
++         SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x21);
++         SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x5a);
++      }
++     }
++  }
++}
++
++/* Set 301 TV Encoder (and some LCD relevant) registers */
+ void
+ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr, USHORT ModeNo,
+               USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
+@@ -6911,67 +7043,46 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+ #ifdef SIS315H   
+   const       SiS_Part2PortTblStruct *CRT2Part2Ptr = NULL;
+   USHORT      resindex, CRT2Index;
+-#endif  
++#endif
+   USHORT      modeflag, resinfo, crt2crtc;
+-  ULONG       longtemp, tempeax, tempebx, temp2, tempecx;
++  ULONG       longtemp, tempeax;
++#ifdef SIS300
+   const UCHAR atable[] = {
+                  0xc3,0x9e,0xc3,0x9e,0x02,0x02,0x02,
+                0xab,0x87,0xab,0x9e,0xe7,0x02,0x02
+   };
++#endif  
+ #ifdef SIS315H   
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-     /* TW: 650/30xLV 1.10.6s: (Is at end of SetGroup2!) */
++     /* 650/30xLV 1.10.6s: (Is at end of SetGroup2!) */
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+          SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xfc,0x03);
+-         temp = 1;
+-         if(ModeNo <= 0x13) temp = 3;
++         temp = 0x01;
++         if(ModeNo <= 0x13) temp = 0x03;
+          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0b,temp);
+       }
+      }
+-     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-       if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-           if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
+-               SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1c,0xa7);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1d,0x07);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1e,0xf2);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1f,0x6e);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x20,0x17);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,0x8b);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x22,0x73);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,0x53);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,0x13);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x25,0x40);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x26,0x34);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,0xf4);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x28,0x63);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x29,0xbb);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2a,0xcc);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2b,0x7a);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2c,0x58);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2d,0xe4);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2e,0x73);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,0xda);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0x13);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,0x72);
+-           }
+-         }
+-       }
+-     }
++     SiS_SetTVSpecial(SiS_Pr, ModeNo);
+      return;
+   }
+-#endif  
++#endif
+-  if(ModeNo<=0x13) {
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
+-      resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+-      crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
++  if(ModeNo <= 0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++     crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+   } else {
+-      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++      resinfo = 0;
++      crt2crtc = 0;
++     } else {
++        modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+       resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+       crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
++     }
+   }
+   tempcx = SiS_Pr->SiS_VBInfo;
+@@ -6984,9 +7095,9 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   temp |= ((tempbx & 0x00FF) >> 3);
+   temp ^= 0x0C;
+-  /* TW: From 1.10.7w (no vb check there; don't care - this only disables SVIDEO and CVBS signal) */
++  /* From 1.10.7w (no vb check there; don't care - this only disables SVIDEO and CVBS signal) */
+   if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-      temp |= 0x0c;
++     temp |= 0x0c;
+   }
+   PhasePoint  = SiS_Pr->SiS_PALPhase;
+@@ -6994,44 +7105,44 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {          
+   
+-    temp ^= 0x01;
+-    if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-      TimingPoint = SiS_Pr->SiS_HiTVSt2Timing;
+-      if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-        if(modeflag & Charx8Dot) TimingPoint = SiS_Pr->SiS_HiTVSt1Timing;
+-        else TimingPoint = SiS_Pr->SiS_HiTVTextTiming;
+-      }
+-    } else TimingPoint = SiS_Pr->SiS_HiTVExtTiming;
+-    
+-    if(SiS_Pr->SiS_HiVision & 0x03) temp &= 0xfe;
+-    
++     temp ^= 0x01;
++     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++        TimingPoint = SiS_Pr->SiS_HiTVSt2Timing;
++        if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++           if(modeflag & Charx8Dot) TimingPoint = SiS_Pr->SiS_HiTVSt1Timing;
++           else TimingPoint = SiS_Pr->SiS_HiTVTextTiming;
++        }
++     } else TimingPoint = SiS_Pr->SiS_HiTVExtTiming;
++
++     if(SiS_Pr->SiS_HiVision & 0x03) temp &= 0xfe;
++
+   } else {
+-  
+-    if(SiS_Pr->SiS_VBInfo & SetPALTV){
+-      TimingPoint = SiS_Pr->SiS_PALTiming;
+-      PhasePoint  = SiS_Pr->SiS_PALPhase;
++     if(SiS_Pr->SiS_VBInfo & SetPALTV){
+-      if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+-          ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-          (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+-         PhasePoint = SiS_Pr->SiS_PALPhase2;
+-      }
++        TimingPoint = SiS_Pr->SiS_PALTiming;
++        PhasePoint  = SiS_Pr->SiS_PALPhase;
+-    } else {
++        if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
++            ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++            (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
++           PhasePoint = SiS_Pr->SiS_PALPhase2;
++        }
++
++     } else {
+         temp |= 0x10;
+-      TimingPoint = SiS_Pr->SiS_NTSCTiming;
+-      PhasePoint  = SiS_Pr->SiS_NTSCPhase;
++        TimingPoint = SiS_Pr->SiS_NTSCTiming;
++        PhasePoint  = SiS_Pr->SiS_NTSCPhase;
+         if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+           ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+             (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+-              PhasePoint = SiS_Pr->SiS_NTSCPhase2;
++           PhasePoint = SiS_Pr->SiS_NTSCPhase2;
+         }
+-    }
+-    
++     }
++
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,temp);
+@@ -7044,36 +7155,35 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+      temp = 0x38;
+   }
+   if(temp) {
+-    if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+-          temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,temp);
+-          if(temp1 & EnablePALM) {    /* 0x40 */
+-                      PhasePoint = SiS_Pr->SiS_PALMPhase;
+-              if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+-                  ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-                    (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+-                 PhasePoint = SiS_Pr->SiS_PALMPhase2;
+-              }
+-        }
+-          if(temp1 & EnablePALN) {    /* 0x80 */
+-                      PhasePoint = SiS_Pr->SiS_PALNPhase;
+-              if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+-                  ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+-                    (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+-                 PhasePoint = SiS_Pr->SiS_PALNPhase2;
+-              }
+-        }
+-      }
+-    }
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
++           temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,temp);
++           if(temp1 & EnablePALM) {   /* 0x40 */
++              PhasePoint = SiS_Pr->SiS_PALMPhase;
++            if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
++                ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++                  (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
++               PhasePoint = SiS_Pr->SiS_PALMPhase2;
++            }
++         }
++           if(temp1 & EnablePALN) {   /* 0x80 */
++              PhasePoint = SiS_Pr->SiS_PALNPhase;
++            if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
++                ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
++                  (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
++               PhasePoint = SiS_Pr->SiS_PALNPhase2;
++            }
++         }
++        }
++     }
+   }
+ #ifdef SIS315H
+-  /* TW: 650/301LV BIOS */
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {  
+         if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+            if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-              if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
++              if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
+                PhasePoint = SiS_Pr->SiS_SpecialPhase;
+             }
+            }
+@@ -7094,12 +7204,12 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   }
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(!(SiS_Pr->SiS_ModeType & 0x07))
++     if(HwDeviceExtension->jChipType >= SIS_315H) {
++        if(!(SiS_Pr->SiS_ModeType & 0x07))
++           SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
++     } else {
+         SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
+-    } else {
+-      SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
+-    }
++     }
+   }
+   SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x0A,SiS_Pr->SiS_NewFlickerMode);
+@@ -7110,11 +7220,11 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x38,SiS_Pr->SiS_RY4COE);
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+-      if(SiS_Pr->SiS_HiVision == 3) tempax = 950;
+-      else tempax = 440;
++     if(SiS_Pr->SiS_HiVision == 3) tempax = 950;
++     else tempax = 440;
+   } else {
+-    if(SiS_Pr->SiS_VBInfo & SetPALTV) tempax = 520;
+-    else tempax = 440;
++     if(SiS_Pr->SiS_VBInfo & SetPALTV) tempax = 520;
++     else tempax = 440;
+   }
+   if( ( ( (!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) || (SiS_Pr->SiS_HiVision == 3) ) && (SiS_Pr->SiS_VDE <= tempax) ) ||
+@@ -7134,18 +7244,18 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,temp);
+      if( (SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) &&
+-        (SiS_Pr->SiS_HiVision != 3) &&
+-        (SiS_Pr->SiS_VGAHDE >= 1024) ) {
++         (SiS_Pr->SiS_HiVision != 3) &&
++         (SiS_Pr->SiS_VGAHDE >= 1024) ) {
+         if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x19);
+            SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x52);
+         } else {
+            if(HwDeviceExtension->jChipType >= SIS_315H) {
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x17);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1d);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x17);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1d);
+          } else {
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x0b);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x11);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x0b);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x11);
+          }
+         }
+      }
+@@ -7154,7 +7264,7 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   tempcx = SiS_Pr->SiS_HT;
+-  /* TW: 650/30xLV 1.10.6s */
++  /* 650/30xLV 1.10.6s */
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+       if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
+                  tempcx >>= 1;
+@@ -7181,7 +7291,7 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   tempcx += 7;
+   if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+      (SiS_Pr->SiS_HiVision == 3)) {
+-       tempcx -= 4;
++     tempcx -= 4;
+   }
+   temp = (tempcx & 0x00FF) << 4;
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x22,0x0F,temp);
+@@ -7201,8 +7311,8 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   tempbx += 8;
+   if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+      (SiS_Pr->SiS_HiVision == 3)) {
+-    tempbx -= 4;
+-    tempcx = tempbx;
++     tempbx -= 4;
++     tempcx = tempbx;
+   }
+   temp = (tempbx & 0x00FF) << 4;
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x29,0x0F,temp);
+@@ -7231,8 +7341,8 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   tempcx -= 11;
+   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
+-    tempax = SiS_GetVGAHT2(SiS_Pr) - 1;
+-    tempcx = tempax;
++     tempax = SiS_GetVGAHT2(SiS_Pr) - 1;
++     tempcx = tempax;
+   }
+   temp = tempcx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2E,temp);
+@@ -7242,38 +7352,38 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 746;
+   if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 853;
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempbx >>= 1;
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempbx >>= 1;
+   } else {
+-      if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
+-         tempbx >>= 1;
+-         if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-            if(ModeNo <= 0x13) {
+-               if(crt2crtc == 1) {
+-                  tempbx++;
+-                 }
+-            }
+-         } else {
+-              if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-               if(crt2crtc == 4)   /* TW: BIOS calls GetRatePtrCRT2 here - does not make sense */
+-                    if(SiS_Pr->SiS_ModeType <= 3) tempbx++;
+-            }
++     if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
++      tempbx >>= 1;
++      if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++         if(ModeNo <= 0x13) {
++            if(crt2crtc == 1) {
++               tempbx++;
++              }
+          }
+-        }
++      } else {
++           if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++            if(crt2crtc == 4)   /* BIOS calls GetRatePtrCRT2 here - does not make sense */
++                 if(SiS_Pr->SiS_ModeType <= 3) tempbx++;
++         }
++      }
++     }
+   }
+   tempbx -= 2;
+   temp = tempbx & 0x00FF;
+   if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+      (SiS_Pr->SiS_HiVision == 3)) {
+-    if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-      if(ModeNo == 0x2f) temp++;
+-    }
++     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++        if(ModeNo == 0x2f) temp++;
++     }
+   }
+-  /* TW: From 1.10.7w - doesn't make sense */
++  /* From 1.10.7w - doesn't make sense */
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+      if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+         if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+          if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {   /* SetFlag?? */
+-             if(ModeNo == 0x03) temp++;
++            if(ModeNo == 0x03) temp++;
+          }
+       }
+      }
+@@ -7285,15 +7395,15 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   tempax |= (tempbx & 0xFF00);
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+      if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
+-        if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART)) {          /* TW: New from 630/301B (II) BIOS */
++        if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART)) {          /* New from 630/301B (II) BIOS */
+            tempax |= 0x1000;
+            if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO))  tempax |= 0x2000;
+         }
+      }
+   } else {
+      /* TODO Check this with other BIOSes */
+-     if((!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) && 
+-        (SiS_Pr->SiS_HiVision == 3)) {
++     if((!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV))
++         /* && (SiS_Pr->SiS_HiVision == 3) */ ) {
+       tempax |= 0x1000;
+         if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO))  tempax |= 0x2000;
+      }
+@@ -7301,12 +7411,12 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   temp = (tempax & 0xFF00) >> 8;
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,temp);
+-  /* TW: 650/30xLV 1.10.6s */
++  /* 650/30xLV 1.10.6s */
+   if(HwDeviceExtension->jChipType > SIS_315H) {
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+         if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+             (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) ) {
+-            SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x10,0x60);
++           SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x10,0x60);
+         }
+      }
+   }
+@@ -7322,79 +7432,70 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+      }
+   }
+-  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {     
+-    tempbx = SiS_Pr->SiS_VDE;
+-    if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
+-         tempbx >>= 1;
+-    }
+-    tempbx -= 3;
+-    tempbx &= 0x03ff;
+-    temp = ((tempbx & 0xFF00) >> 8) << 5;
+-    temp |= 0x18;
+-    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x46,temp);
+-    temp = tempbx & 0x00FF;
+-    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x47,temp);     /* tv gatingno */
+-    if(HwDeviceExtension->jChipType >= SIS_315H) {    /* TW: 650/30xLV 1.10.6s */
+-       if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-          tempax = 0;
+-          if(SiS_Pr->SiS_HiVision & 0x03) {
+-           tempax = 0x3000;
+-           if(SiS_Pr->SiS_HiVision & 0x01) tempax = 0x5000;
+-        }
+-        temp = (tempax & 0xFF00) >> 8;
+-          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4d,temp);
+-       }
+-    }
++  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++     tempbx = SiS_Pr->SiS_VDE;
++     if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
++        tempbx >>= 1;
++     }
++     tempbx -= 3;
++     tempbx &= 0x03ff;
++     temp = ((tempbx & 0xFF00) >> 8) << 5;
++     temp |= 0x18;
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x46,temp);
++     temp = tempbx & 0x00FF;
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x47,temp);    /* tv gatingno */
++     if(HwDeviceExtension->jChipType >= SIS_315H) {
++        if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++           tempax = 0;
++           if(SiS_Pr->SiS_HiVision & 0x03) {
++            tempax = 0x3000;
++            if(SiS_Pr->SiS_HiVision & 0x01) tempax = 0x5000;
++         }
++         temp = (tempax & 0xFF00) >> 8;
++           SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4d,temp);
++        }
++     }
+   }
+   tempbx &= 0x00FF;
+   if(!(modeflag & HalfDCLK)) {
+-    tempcx = SiS_Pr->SiS_VGAHDE;
+-    if(tempcx >= SiS_Pr->SiS_HDE) {
+-      tempbx |= 0x2000;
+-      tempax &= 0x00FF;
+-    }
++     if(SiS_Pr->SiS_VGAHDE >= SiS_Pr->SiS_HDE) {
++        tempbx |= 0x2000;
++        tempax &= 0x00FF;
++     }
+   }
+   tempcx = 0x0101;
+-/*if(SiS_Pr->SiS_VBInfo & (SetPALTV | SetCRT2ToTV)) {  */ /*301b- TW: BIOS BUG? */
++/*if(SiS_Pr->SiS_VBInfo & (SetPALTV | SetCRT2ToTV)) {  */ /* BIOS BUG? */
+   if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) {
+-    if(!(SiS_Pr->SiS_HiVision & 0x03)) {
+-      if(SiS_Pr->SiS_VGAHDE >= 1024) {
+-        if((!(modeflag & HalfDCLK)) || (HwDeviceExtension->jChipType < SIS_315H)) {   /* TW: This check not in 630/301B */
+-          tempcx = 0x1920;
+-          if(SiS_Pr->SiS_VGAHDE >= 1280) {
+-            tempcx = 0x1420;
+-            tempbx &= 0xDFFF;
+-          }
++     if(!(SiS_Pr->SiS_HiVision & 0x03)) {
++        if(SiS_Pr->SiS_VGAHDE >= 1024) {
++           if((!(modeflag & HalfDCLK)) || (HwDeviceExtension->jChipType < SIS_315H)) {
++              tempcx = 0x1920;
++              if(SiS_Pr->SiS_VGAHDE >= 1280) {
++                 tempcx = 0x1420;
++                 tempbx &= 0xDFFF;
++              }
++           }
+         }
+-      }
+-    }
++     }
+   }
+   if(!(tempbx & 0x2000)) {
+-    if(modeflag & HalfDCLK) {
+-         tempcx = (tempcx & 0xFF00) | (((tempcx & 0x00FF) << 1) & 0xff);
+-    }
+-    push1 = tempbx;
+-    tempeax = SiS_Pr->SiS_VGAHDE;
+-    tempebx = (tempcx & 0xFF00) >> 8;
+-    longtemp = tempeax * tempebx;
+-    tempecx = tempcx & 0x00FF;
+-    longtemp /= tempecx;
+-    longtemp <<= 0x0d;
+-    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++     if(modeflag & HalfDCLK) {
++        tempcx = (tempcx & 0xFF00) | ((tempcx << 1) & 0x00FF);
++     }
++     longtemp = (SiS_Pr->SiS_VGAHDE * ((tempcx & 0xFF00) >> 8)) / (tempcx & 0x00FF);
++     longtemp <<= 13;
++     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+       longtemp <<= 3;
+-    }
+-    tempecx = SiS_Pr->SiS_HDE;
+-    temp2 = longtemp % tempecx;
+-    tempeax = longtemp / tempecx;
+-    if(temp2 != 0) tempeax++;
+-    tempax = (USHORT)tempeax;
+-    tempbx = push1;
+-    tempcx = (tempcx & 0xff00) | (((tempax & 0xFF00) >> 8) >> 5);
+-    tempbx |= (tempax & 0x1F00);
+-    tempax = ((tempax & 0x00FF) << 8) | (tempax & 0x00FF);
++     }
++     tempeax = longtemp / SiS_Pr->SiS_HDE;
++     if(longtemp % SiS_Pr->SiS_HDE) tempeax++;
++     tempax = (USHORT)tempeax;
++     tempcx = (tempcx & 0xFF00) | ((tempax & 0xFF00) >> (8 + 5));
++     tempbx |= (tempax & 0x1F00);
++     tempax = ((tempax & 0x00FF) << 8) | (tempax & 0x00FF);
+   }
+   temp = (tempax & 0xFF00) >> 8;
+@@ -7403,33 +7504,32 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x45,0xC0,temp);
+   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-       temp = tempcx & 0x00FF;
+-       if(tempbx & 0x2000) temp = 0;
+-       temp |= 0x18;
+-       SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xE0,temp);
+-       if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-             tempbx = 0x0382;  
+-             tempcx = 0x007e;  
+-       } else {
+-             tempbx = 0x0369;  
+-             tempcx = 0x0061;  
+-       }
+-       temp = (tempbx & 0x00FF) ;
+-       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4B,temp);
+-       temp = (tempcx & 0x00FF) ;
+-       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4C,temp);
+-       tempbx &= 0x03FF;
+-       temp = (tempcx & 0xFF00) >> 8;
+-       temp = (temp & 0x0003) << 2;
+-       temp |= (tempbx >> 8);
+-       if(HwDeviceExtension->jChipType < SIS_315H) {
+-          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4D,temp);
+-       } else {
+-          SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4D,0xF0,temp);
+-       }
++     temp = tempcx & 0x00FF;
++     if(tempbx & 0x2000) temp = 0;
++     temp |= 0x18;
++     SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xE0,temp);
++
++     if(SiS_Pr->SiS_VBInfo & SetPALTV) {
++        tempbx = 0x0382;
++        tempcx = 0x007e;
++     } else {
++        tempbx = 0x0369;
++        tempcx = 0x0061;
++     }
++     temp = (tempbx & 0x00FF) ;
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4B,temp);
++     temp = (tempcx & 0x00FF) ;
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4C,temp);
++     temp = (tempcx & 0x0300) >> (8 - 2);
++     temp |= ((tempbx >> 8) & 0x03);
++     if(HwDeviceExtension->jChipType < SIS_315H) {
++        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4D,temp);
++     } else {
++        SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4D,0xF0,temp);
++     }
+-       temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x43);
+-       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,(USHORT)(temp - 3));
++     temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x43);
++     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,(USHORT)(temp - 3));
+   }
+   temp = 0;
+@@ -7440,23 +7540,33 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+      temp = 0x38;
+   }
+   if(temp) {
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-          if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+-               if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM) {  /* 0x40 */
+-                     SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xEF);
+-                     temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x01);
+-                     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp - 1);
+-               }
+-          }
+-      }
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
++           if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM) {  /* 0x40 */
++              SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xEF);
++              temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x01);
++              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp - 1);
++           }
++        }
++     }
++  }
++
++  if(HwDeviceExtension->jChipType >= SIS_315H) {
++     if((SiS_Pr->SiS_VBType & VB_SIS301B302B) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
++        if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++           SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,0x00);
++        }
++     }
+   }
++#if 0  /* Old: Why HiVision? */
+   if( (SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+       (!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) ) {
+-    if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,0x00);
+-    }
++     if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
++        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,0x00);
++     }
+   }
++#endif
+   if(HwDeviceExtension->jChipType < SIS_315H) {
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+@@ -7465,74 +7575,43 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+       return;
+      }
+   } else {
+-     /* TW: !!! The following is a duplicate, done for LCDA as well (see above) */
++     /* !!! The following is a duplicate, done for LCDA as well (see above) */
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {    
+-         if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-           if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-             if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
+-               SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1c,0xa7);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1d,0x07);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1e,0xf2);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1f,0x6e);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x20,0x17);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,0x8b);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x22,0x73);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,0x53);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,0x13);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x25,0x40);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x26,0x34);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,0xf4);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x28,0x63);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x29,0xbb);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2a,0xcc);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2b,0x7a);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2c,0x58);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2d,0xe4);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2e,0x73);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,0xda);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0x13);
+-             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,0x72);
+-           }
+-           }
+-         }
+-       }
+-       return;
++        SiS_SetTVSpecial(SiS_Pr, ModeNo);
++        return;
+      }
+   }
+-  /* TW: From here: Part2 LCD setup */
++  /* From here: Part2 LCD setup */
+   tempbx = SiS_Pr->SiS_HDE;
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      /* TW: 650/30xLV 1.10.6s */
+-      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1;
++     /* 650/30xLV 1.10.6s */
++     if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1;
+   }
+   tempbx--;                                   /* RHACTE=HDE-1 */
+   temp = tempbx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2C,temp);
+-  temp = (tempbx & 0xFF00) >> 8;
+-  temp <<= 4;
++  temp = (tempbx & 0xFF00) >> 4;
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2B,0x0F,temp);
+   temp = 0x01;
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-    if(SiS_Pr->SiS_ModeType == ModeEGA) {
+-      if(SiS_Pr->SiS_VGAHDE >= 1024) {
+-        temp = 0x02;
+-      if(HwDeviceExtension->jChipType >= SIS_315H) {
+-           if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
+-             temp = 0x01;
++     if(SiS_Pr->SiS_ModeType == ModeEGA) {
++        if(SiS_Pr->SiS_VGAHDE >= 1024) {
++           temp = 0x02;
++         if(HwDeviceExtension->jChipType >= SIS_315H) {
++              if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
++                 temp = 0x01;
++            }
+          }
+-      }
+-      }
+-    }
++        }
++     }
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,temp);
+-  tempbx = SiS_Pr->SiS_VDE;                   /* RTVACTEO=(VDE-1)&0xFF */
+-  push1 = tempbx;
+-
++  tempbx = SiS_Pr->SiS_VDE;                   /* RTVACTEO = VDE - 1 */
++  /* push1 = tempbx; */
+   tempbx--;
+   temp = tempbx & 0x00FF;
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x03,temp);
+@@ -7540,10 +7619,9 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x0C,0xF8,temp);
+   tempcx = SiS_Pr->SiS_VT;
+-  push2 = tempcx;
+-
++  /* push2 = tempcx; */
+   tempcx--;
+-  temp = tempcx & 0x00FF;                      /* RVTVT=VT-1 */
++  temp = tempcx & 0x00FF;                      /* RVTVT = VT - 1 */
+   SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x19,temp);
+   temp = (tempcx & 0xFF00) >> 8;
+@@ -7551,30 +7629,26 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   
+   /* Enable dithering; newer versions only do this for 32bpp mode */
+   if((HwDeviceExtension->jChipType == SIS_300) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
+-    if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) temp |= 0x10;
++     if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) temp |= 0x10;
+   } else if(HwDeviceExtension->jChipType < SIS_315H) {
+-    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) temp |= 0x10;
+-    else {
+-      if(SiS_Pr->SiS_LCDInfo & LCDSync)       /* TW: 630/301 BIOS checks this */
+-         temp |= 0x10;
+-    }
++     temp |= 0x10;
+   } else {
+-      if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-         /* TW: 650/30xLV 1.10.6s */
+-         if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+-            if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {  /* 32bpp mode? */
+-                     temp |= 0x10;
+-          }
+-         }
+-      } else {
+-         temp |= 0x10;
+-      }
++     if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++        /* 650/30xLV 1.10.6s */
++        if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
++           if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {  /* 32bpp mode? */
++              temp |= 0x10;
++         }
++        }
++     } else {
++        temp |= 0x10;
++     }
+   }
+   /* 630/301 does not do all this */
+   if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+      if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
+-        /* TW: 650/30xLV 1.10.6s */
++        /* 650/30xLV 1.10.6s */
+         temp |= (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37) >> 6);
+       temp |= 0x08;                                           /* From 1.10.7w */
+       if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) temp |= 0x04;  /* From 1.10.7w */
+@@ -7595,17 +7669,15 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+   SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x17,0xFB);
+   SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x18,0xDF);
+-  /* 1280x960, 1280x1024 and 1600x1200 data invalid/missing in tables, use old calculation */
+-  if((HwDeviceExtension->jChipType >= SIS_315H)             && 
+-     (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)                &&  
+-     (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) &&
+-     (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) &&
+-     (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960)) {
++  /* much data invalid/missing in tables, use old calculation in such case */
++  if((HwDeviceExtension->jChipType >= SIS_315H)         &&
++     (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)            &&
++     ((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)  ||
++      (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++      (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)) ) {
+      
+-#ifdef SIS315H                                                        /* ------------- 310/325/330 series ------------ */
++#ifdef SIS315H                                                        /* ------------- 315/330 series ------------ */
+-      /* TW: Inserted this entire section from 650/301LV(x) BIOS */
+-      
+       /* Using this on the 301B with an auto-expanding 1024 panel (CR37=1) results
+        * in a black bar in modes < 1024; if the panel is non-expanding, the bridge
+        * scales all modes to 1024. All modes in both variants (exp/non-exp) work.
+@@ -7664,7 +7736,6 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+       }
+      }
+-     /* TW: 650/30xLV 1.10.6s: */
+      /* !!! This is a duplicate, done for LCDA as well - see above */
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+@@ -7683,15 +7754,12 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+        * the bridge scales all modes to 1024.
+        * !!! Malfunction at 640x480 and 640x400 when panel is auto-expanding - black screen !!!
+        */
+-  
++
++    /* cx = VT - 1 */
++
+     tempcx++;
+-    
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)       tempbx =  768;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx = 1024;
+-    else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempbx = 1200;
+-    else if(SiS_Pr->SiS_VDE != 1024)                            tempbx =  960;
+-    else                                                        tempbx = 1024;
+-    
++
++    tempbx = SiS_Pr->PanelYRes;
+ #if 0  /* old */
+     tempbx = 768;
+     if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1024x768) {
+@@ -7706,36 +7774,40 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+       }
+     }
+ #endif
+-    
++
+     if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+-      tempbx = SiS_Pr->SiS_VDE - 1;
+-      tempcx--;
++       tempbx = SiS_Pr->SiS_VDE - 1;
++       tempcx--;
+     }
+-    
++
+     tempax = 1;
+     if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+-      if(tempbx != SiS_Pr->SiS_VDE) {
+-        tempax = tempbx;
+-/*    if(SiS_Pr->SiS_VGAVDE == 525) tempax += 60;   in 650/301B BIOS */
+-        if(tempax < SiS_Pr->SiS_VDE) {
+-          tempax = 0;
+-          tempcx = 0;
+-        } else {
+-          tempax -= SiS_Pr->SiS_VDE;
+-        }
+-        tempax >>= 1;
+-      }
+-      tempcx -= tempax; /* lcdvdes */
+-      tempbx -= tempax; /* lcdvdee */
+-    } else {
+-      tempax >>= 1;
+-      tempcx -= tempax; /* lcdvdes */
+-      tempbx -= tempax; /* lcdvdee */
++       if(tempbx != SiS_Pr->SiS_VDE) {
++          tempax = tempbx;
++          if(tempax < SiS_Pr->SiS_VDE) {
++             tempax = 0;
++             tempcx = 0;
++          } else {
++             tempax -= SiS_Pr->SiS_VDE;
++          }
++          tempax >>= 1;
++       }
++       tempcx -= tempax; /* lcdvdes */
++       tempbx -= tempax; /* lcdvdee */
+     }
+-    
++#if 0  /* meaningless: 1 / 2 = 0... */
++    else {
++       tempax >>= 1;
++       tempcx -= tempax; /* lcdvdes */
++       tempbx -= tempax; /* lcdvdee */
++    }
++#endif
++
++    /* Non-expanding: lcdvdees = tempcx = VT-1; lcdvdee = tempbx = VDE-1 */
++
+ #ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "lcdvds 0x%x lcdvde 0x%x\n", tempcx, tempbx);
+-#endif    
++    xf86DrvMsg(0, X_INFO, "lcdvdes 0x%x lcdvdee 0x%x\n", tempcx, tempbx);
++#endif
+     temp = tempcx & 0x00FF;                                   /* RVEQ1EQ=lcdvdes */
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,temp);
+@@ -7746,140 +7818,183 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHOR
+     temp |= ((tempcx & 0xFF00) >> 8);
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,temp);
+-    tempbx = push2;
+-    tempax = push1;
+-    tempcx = tempbx;
+-    tempcx -= tempax;
+-    tempcx >>= 4;
++    tempbx = SiS_Pr->SiS_VT;    /* push2; */
++    tempax = SiS_Pr->SiS_VDE;   /* push1; */
++    tempcx = (tempbx - tempax) >> 4;
+     tempbx += tempax;
+     tempbx >>= 1;
+     if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)  tempbx -= 10;
+-    
++
++    /* non-expanding: lcdvrs = tempbx = ((VT + VDE) / 2) - 10 */
++
++    if(SiS_Pr->UseCustomMode) {
++       tempbx = SiS_Pr->CVSyncStart;
++    }
++
+ #ifdef TWDEBUG
+     xf86DrvMsg(0, X_INFO, "lcdvrs 0x%x\n", tempbx);
+ #endif
+-    temp = tempbx & 0x00FF;                                   /* RTVACTEE=lcdvrs */
++    temp = tempbx & 0x00FF;                                   /* RTVACTEE = lcdvrs */
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,temp);
+     temp = ((tempbx & 0xFF00) >> 8) << 4;
+     tempbx += (tempcx + 1);
+     temp |= (tempbx & 0x000F);
++
++    if(SiS_Pr->UseCustomMode) {
++       temp &= 0xf0;
++       temp |= (SiS_Pr->CVSyncEnd & 0x0f);
++    }
++
++#ifdef TWDEBUG
++    xf86DrvMsg(0, X_INFO, "lcdvre[3:0] 0x%x\n", (temp & 0x0f));
++#endif
++
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp);
+-    /* TW: Code from 630/301B (I+II) BIOS */
++    /* Code from 630/301B (I+II) BIOS */
+-    if( ( ( (HwDeviceExtension->jChipType == SIS_630) ||
+-            (HwDeviceExtension->jChipType == SIS_730) ) &&
+-          (HwDeviceExtension->jChipRevision > 2) )  &&
+-        (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) &&
+-        (!(SiS_Pr->SiS_SetFlag & LCDVESATiming))  &&
+-        (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
+-            if(ModeNo == 0x13) {
+-              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,0xB9);
+-              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,0xCC);
+-              SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xA6);
+-            } else {
+-              if((crt2crtc & 0x3F) == 4) {
++    if(!SiS_Pr->UseCustomMode) {
++       if( ( ( (HwDeviceExtension->jChipType == SIS_630) ||
++               (HwDeviceExtension->jChipType == SIS_730) ) &&
++             (HwDeviceExtension->jChipRevision > 2) )  &&
++           (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) &&
++           (!(SiS_Pr->SiS_SetFlag & LCDVESATiming))  &&
++           (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
++          if(ModeNo == 0x13) {
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,0xB9);
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,0xCC);
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xA6);
++          } else {
++             if((crt2crtc & 0x3F) == 4) {
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x2B);
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x13);
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,0xE5);
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,0x08);
+                 SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xE2);
+-              }
+-            }
++             }
++          }
++       }
+     }
+-    /* TW: Inserted missing code from 630/301B BIOS;
++    /* Inserted missing code from 630/301B BIOS;
+      *     Strangely, this is done in all 650 BIOSes as
+      *     well (although LCDTypeInfo is not used there
+      *     in the same way as on 300 series)
+      */
++#ifdef SIS300
++    if(HwDeviceExtension->jChipType < SIS_315H) {
++       if(!SiS_Pr->UseCustomMode) {
++          if(SiS_Pr->SiS_LCDTypeInfo == 0x0c) {
++             crt2crtc &= 0x1f;
++             tempcx = 0;
++             if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
++                if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++                   tempcx += 7;
++                }
++             }
++             tempcx += crt2crtc;
++             if(crt2crtc >= 4) {
++                SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xff);
++             }
+-    if(SiS_Pr->SiS_LCDTypeInfo == 0x0c) {
+-         crt2crtc &= 0x1f;
+-         tempcx = 0;
+-         if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
+-           if (SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-              tempcx += 7;
+-           }
+-         }
+-         tempcx += crt2crtc;
+-         if (crt2crtc >= 4) {
+-           SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xff);
+-         }
+-
+-         if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
+-           if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-             if(crt2crtc == 4) {
+-                SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x28);
++             if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
++                if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++                   if(crt2crtc == 4) {
++                      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x28);
++                   }
++                }
+              }
+-           }
+-         }
+-         SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x18);
+-         SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,atable[tempcx]);
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x18);
++             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,atable[tempcx]);
++          }
++       }
+     }
++#endif
+-    tempcx = (SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE) >> 2;     /* (HT-HDE)>>2     */
++    tempcx = (SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE) >> 2;     /* (HT - HDE) >> 2 */
+     tempbx = SiS_Pr->SiS_HDE + 7;                       /* lcdhdee         */
+     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-         tempbx += 2;
++       tempbx += 2;
+     }
+     push1 = tempbx;
++
+ #ifdef TWDEBUG
+-    xf86DrvMsg(0, X_INFO, "lcdhde 0x%x\n", tempbx);
+-#endif    
+-    temp = tempbx & 0x00FF;                                     /* RHEQPLE=lcdhdee */
++    xf86DrvMsg(0, X_INFO, "lcdhdee 0x%x\n", tempbx);
++#endif
++
++    temp = tempbx & 0x00FF;                                     /* RHEQPLE = lcdhdee */
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,temp);
+     temp = (tempbx & 0xFF00) >> 8;
+     SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0xF0,temp);
+     temp = 7;
+     if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-         temp += 2;
++       temp += 2;
+     }
+-    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1F,temp);       /* RHBLKE=lcdhdes[7:0] */
++    SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1F,temp);       /* RHBLKE = lcdhdes[7:0] */
+     SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x20,0x0F);     /* lcdhdes [11:8] */
+     tempbx += tempcx;
+     push2 = tempbx;
++
++    if(SiS_Pr->UseCustomMode) {
++       tempbx = SiS_Pr->CHSyncStart + 7;
++       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++          tempbx += 2;
++       }
++    }
++
+ #ifdef TWDEBUG
+     xf86DrvMsg(0, X_INFO, "lcdhrs 0x%x\n", tempbx);
+ #endif
+-    temp = tempbx & 0x00FF;                                     /* RHBURSTS=lcdhrs */
+-    if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-       if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) { 
+-          if(SiS_Pr->SiS_HDE == 1280) temp = 0x47;
++
++    temp = tempbx & 0x00FF;                                     /* RHBURSTS = lcdhrs */
++    if(!SiS_Pr->UseCustomMode) {
++       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++          if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
++             if(SiS_Pr->SiS_HDE == 1280) temp = 0x47;
++          }
+        }
+     }
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1C,temp);
+-    temp = ((tempbx & 0xFF00) >> 8) << 4;
++    temp = (tempbx & 0x0F00) >> 4;
+     SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1D,0x0F,temp);
+     tempbx = push2;
+     tempcx <<= 1;
+     tempbx += tempcx;
++
++    if(SiS_Pr->UseCustomMode) {
++       tempbx = SiS_Pr->CHSyncEnd + 7;
++       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++          tempbx += 2;
++       }
++    }
++
+ #ifdef TWDEBUG
+     xf86DrvMsg(0, X_INFO, "lcdhre 0x%x\n", tempbx);
+-#endif    
+-    temp = tempbx & 0x00FF;                                     /* RHSYEXP2S=lcdhre */
++#endif
++
++    temp = tempbx & 0x00FF;                                     /* RHSYEXP2S = lcdhre */
+     SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,temp);
+     if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+-      if(SiS_Pr->SiS_VGAVDE == 525) {
+-        if(SiS_Pr->SiS_ModeType <= ModeVGA)
+-         temp=0xC6;
+-        else
+-                 temp=0xC3;
+-        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
+-        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0xB3);
+-      } else if(SiS_Pr->SiS_VGAVDE == 420) {
+-        if(SiS_Pr->SiS_ModeType <= ModeVGA)
+-         temp=0x4F;
+-        else
+-                 temp=0x4D;   
+-        SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
+-      }
++       if(SiS_Pr->SiS_VGAVDE == 525) {
++          if(SiS_Pr->SiS_ModeType <= ModeVGA)
++           temp=0xC6;
++          else
++                   temp=0xC3;
++          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
++          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0xB3);
++       } else if(SiS_Pr->SiS_VGAVDE == 420) {
++          if(SiS_Pr->SiS_ModeType <= ModeVGA)
++           temp=0x4F;
++          else
++                   temp=0x4D;
++          SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
++       }
+     }
+     SiS_Set300Part2Regs(SiS_Pr, HwDeviceExtension, ModeIdIndex,
+                         RefreshRateTableIndex, BaseAddr, ModeNo);
+@@ -7898,7 +8013,7 @@ SiS_GetVGAHT2(SiS_Private *SiS_Pr)
+   return((USHORT) tempax);
+ }
+-/* TW: New from 300/301LV BIOS 1.16.51 for ECS A907. Seems highly preliminary. */
++/* New from 300/301LV BIOS 1.16.51 for ECS A907. Seems highly preliminary. */
+ void
+ SiS_Set300Part2Regs(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                       USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
+@@ -7910,18 +8025,19 @@ SiS_Set300Part2Regs(SiS_Private *SiS_Pr,
+   if(HwDeviceExtension->jChipType != SIS_300) return;
+   if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) return;
++  if(SiS_Pr->UseCustomMode) return;
+-  if(ModeNo<=0x13) {
+-      crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
++  if(ModeNo <= 0x13) {
++     crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+   } else {
+-      crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
++     crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+   }
+   resindex = crt2crtc & 0x3F;
+   if(SiS_Pr->SiS_SetFlag & LCDVESATiming) CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
+   else                                    CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_2;
+-  /* TW: The BIOS code (1.16.51) is obviously a fragment! */
++  /* The BIOS code (1.16.51) is obviously a fragment! */
+   if(ModeNo > 0x13) {
+      CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
+      resindex = 4;
+@@ -7942,7 +8058,6 @@ SiS_Set300Part2Regs(SiS_Private *SiS_Pr,
+   SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0f,(CRT2Part2Ptr+resindex)->CR[11]);
+ }
+-/* TW: Set 301 Macrovision(tm) registers */
+ void
+ SiS_SetGroup3(SiS_Private *SiS_Pr, USHORT  BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+               USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+@@ -7954,24 +8069,35 @@ SiS_SetGroup3(SiS_Private *SiS_Pr, USHOR
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) return;
+-  if(ModeNo<=0x13)
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-  else
++  if(ModeNo<=0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++  } else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++     } else {
+       modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     }
++  }
++#ifndef SIS_CP
+   SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x00,0x00);
++#endif  
++
++#ifdef SIS_CP
++  SIS_CP_INIT301_CP
++#endif
+   if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-    SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
+-    SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
++     SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
++     SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
+   } else {
+-    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF5);
+-      SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xB7);
+-    } else {
+-      SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF6);
+-      SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xBf);
+-    }
++     if(HwDeviceExtension->jChipType >= SIS_315H) {
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF5);
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xB7);
++     } else {
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF6);
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xBf);
++     }
+   }
+   temp = 0;
+@@ -7982,38 +8108,41 @@ SiS_SetGroup3(SiS_Private *SiS_Pr, USHOR
+      temp = 0x38;
+   }
+   if(temp) {
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-          if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+-              if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM){  /* 0x40 */
+-                  SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
+-                  SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
+-                  SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x3D,0xA8);
+-              }
+-          }
+-      }
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++        if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
++           if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM){  /* 0x40 */
++              SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
++              SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
++              SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x3D,0xA8);
++           }
++        }
++     }
+   }
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+-    tempdi = SiS_Pr->SiS_HiTVGroup3Data;
+-    if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+-      tempdi = SiS_Pr->SiS_HiTVGroup3Simu;
+-      if(!(modeflag & Charx8Dot)) {
+-        tempdi = SiS_Pr->SiS_HiTVGroup3Text;
+-      }
+-    }
+-    if(SiS_Pr->SiS_HiVision & 0x03) {
+-       tempdi = SiS_HiTVGroup3_1;
+-       if(SiS_Pr->SiS_HiVision & 0x02) tempdi = SiS_HiTVGroup3_2;
+-    }
+-    for(i=0; i<=0x3E; i++){
+-       SiS_SetReg1(SiS_Pr->SiS_Part3Port,i,tempdi[i]);
+-    }
++     tempdi = SiS_Pr->SiS_HiTVGroup3Data;
++     if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
++        tempdi = SiS_Pr->SiS_HiTVGroup3Simu;
++        if(!(modeflag & Charx8Dot)) {
++           tempdi = SiS_Pr->SiS_HiTVGroup3Text;
++        }
++     }
++     if(SiS_Pr->SiS_HiVision & 0x03) {
++        tempdi = SiS_HiTVGroup3_1;
++        if(SiS_Pr->SiS_HiVision & 0x02) tempdi = SiS_HiTVGroup3_2;
++     }
++     for(i=0; i<=0x3E; i++){
++        SiS_SetReg1(SiS_Pr->SiS_Part3Port,i,tempdi[i]);
++     }
+   }
+-  return;
++#ifdef SIS_CP
++  SIS_CP_INIT301_CP2
++#endif
++
+ }
+-/* TW: Set 301 VGA2 registers */
++/* Set 301 VGA2 registers */
+ void
+ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT  BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+               USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
+@@ -8022,17 +8151,20 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+   USHORT tempax,tempcx,tempbx,modeflag,temp,temp2,resinfo;
+   ULONG tempebx,tempeax,templong;
+-
+-  if(ModeNo<=0x13) {
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+-      resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
++  if(ModeNo <= 0x13) {
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+   } else {
++     if(SiS_Pr->UseCustomMode) {
++        modeflag = SiS_Pr->CModeFlag;
++      resinfo = 0;
++     } else {
+       modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+       resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
++     }
+   }
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      /* TW: From 650/302LV 1.10.6s (not for 300/301LV - no LCDA on this combination) */
+      if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+         if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+            SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x24,0x0e);
+@@ -8049,10 +8181,10 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+         if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-         /* TW: From 650/301LV (any, incl. 1.10.6s, 1.10.7w) */
+-         /* TW: This is a duplicate; done at the end, too */
++         /* From 650/301LV (any, incl. 1.10.6s, 1.10.7w) */
++         /* This is a duplicate; done at the end, too */
+          if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
+-              SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
++            SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
+          }
+          SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+          SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+@@ -8090,39 +8222,33 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+   tempbx = SiS_Pr->SiS_VGAHDE;
+   if(modeflag & HalfDCLK)  tempbx >>= 1;
+-  /* TW: New for 650/301LV and 630/301B */
+   temp = 0xA0;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+-       temp = 0;
+-       if(tempbx > 800) {
+-          temp = 0xA0;
+-          if(tempbx != 1024) {
+-             temp = 0xC0;
+-             if(tempbx != 1280) temp = 0;
+-        }
+-       }
+-  } else
+-    if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-      if(tempbx <= 800) {
+-         temp = 0x80;
+-       if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-            temp = 0;
+-            if(tempbx > 800) temp = 0x60;
+-         }
+-      }
++     temp = 0;
++     if(tempbx > 800) {
++        temp = 0xA0;
++        if(tempbx != 1024) {
++           temp = 0xC0;
++           if(tempbx != 1280) temp = 0;
++      }
++     }
++  } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
++     if(tempbx <= 800) {
++        temp = 0x80;
++     }
+   } else {
+-      temp = 0x80;
+-      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-            temp = 0;
+-            if(tempbx > 800) temp = 0x60;
+-      }
++     temp = 0x80;
++     if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
++        temp = 0;
++        if(tempbx > 800) temp = 0x60;
++     }
+   }
+   if(SiS_Pr->SiS_HiVision & 0x03) {
+         temp = 0;
+       if(SiS_Pr->SiS_VGAHDE == 1024) temp = 0x20;
+   }
+   if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) temp = 0;
++     if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) temp = 0;
+   }
+   if(SiS_Pr->SiS_VBType & VB_SIS301) {
+@@ -8144,10 +8270,10 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+   tempeax = SiS_Pr->SiS_VGAVDE;
+   tempcx |= 0x4000;
+-  if(tempeax <= tempebx){
+-    tempcx ^= 0x4000;
++  if(tempeax <= tempebx) {
++     tempcx ^= 0x4000;
+   } else {
+-    tempeax -= tempebx;
++     tempeax -= tempebx;
+   }
+   templong = (tempeax * 256 * 1024) % tempebx;
+@@ -8173,64 +8299,64 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+          tempax = SiS_Pr->SiS_VGAHDE;
+          if(modeflag & HalfDCLK) tempax >>= 1;
+          if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) || (SiS_Pr->SiS_HiVision & 0x03)) {
+-           if(HwDeviceExtension->jChipType >= SIS_315H) {
+-               if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempax >>= 1;
+-               else if(tempax > 800) tempax -= 800;
+-           } else {
+-                 if(tempax > 800) tempax -= 800;
+-             }
++          if(HwDeviceExtension->jChipType >= SIS_315H) {
++             if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempax >>= 1;
++             else if(tempax > 800) tempax -= 800;
++          } else {
++               if(tempax > 800) tempax -= 800;
++            }
+          }
+ /*       if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV | SetPALTV)) && (!(SiS_Pr->SiS_HiVision & 0x03))) {  */
+        if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
+-           if(tempax > 800) {
+-            tempbx = 8;
+-              if(tempax == 1024)
+-              tempax *= 25;
+-              else
+-              tempax *= 20;
+-
+-            temp = tempax % 32;
+-            tempax /= 32;
+-            tempax--;
+-            if (temp!=0) tempax++;
+-           }
++            if(tempax > 800) {
++             tempbx = 8;
++               if(tempax == 1024)
++                tempax *= 25;
++               else
++                tempax *= 20;
++
++             temp = tempax % 32;
++             tempax /= 32;
++             tempax--;
++             if (temp!=0) tempax++;
++            }
+          }
+        tempax--;
+          temp = (tempax & 0xFF00) >> 8;
+          temp &= 0x03;
+-       if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {         /* From 1.10.7w */
+-              if(ModeNo > 0x13) {                     /* From 1.10.7w */
+-                      if(resinfo == 8) tempax = 0x1f; /* From 1.10.7w */
+-              }                                       /* From 1.10.7w */
+-       }                                              /* From 1.10.7w */
++       if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {                 /* From 1.10.7w */
++          if(ModeNo > 0x13) {                                 /* From 1.10.7w */
++             if(resinfo == SIS_RI_1024x768) tempax = 0x1f;    /* From 1.10.7w */
++          }                                                   /* From 1.10.7w */
++       }                                                      /* From 1.10.7w */
+        SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1D,tempax & 0x00FF);
+        temp <<= 4;
+        temp |= tempbx;
+        SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1E,temp);
+        if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-          if(IS_SIS650740) {
+-              temp = 0x0026;  /* 1.10.7w; 1.10.8r; needs corresponding code in Dis/EnableBridge! */
++          if(IS_SIS550650740660) {
++             temp = 0x0026;  /* 1.10.7w; 1.10.8r; needs corresponding code in Dis/EnableBridge! */
+           } else {
+-              temp = 0x0036;
++             temp = 0x0036;
+           }
+        } else {
+-           temp = 0x0036;
++          temp = 0x0036;
+        }
+          if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) &&
+                                      (!(SiS_Pr->SiS_HiVision & 0x03))) {
+-              temp |= 0x01;
+-              if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+-                if(!(SiS_Pr->SiS_SetFlag & TVSimuMode))
+-                        temp &= 0xFE;
+-              }
++          temp |= 0x01;
++          if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
++             if(!(SiS_Pr->SiS_SetFlag & TVSimuMode))
++                temp &= 0xFE;
++          }
+          }
+          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0,temp);
+        tempbx = SiS_Pr->SiS_HT;
+        if(HwDeviceExtension->jChipType >= SIS_315H) {
+-              if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1;
++          if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1;
+        }
+          tempbx >>= 1;
+        tempbx -= 2;
+@@ -8238,7 +8364,7 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+          SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0xC0,temp);
+          temp = tempbx & 0x00FF;
+          SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x22,temp);
+-       
++
+          if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+           if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+                SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x24,0x0e);
+@@ -8246,24 +8372,24 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHOR
+        }
+        if(HwDeviceExtension->jChipType >= SIS_315H) {
+-           /* TW: 650/LV BIOS does this for all bridge types - assumingly wrong */
+-           /* 315, 330, 650+301B BIOS don't do this at all */
+-             /* TW: This is a duplicate; done for LCDA as well (see above) */
+-           if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-              if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
+-                 SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
+-              }
+-              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+-              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+-              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
+-           }
++          /* 650/LV BIOS does this for all bridge types - assumingly wrong */
++          /* 315, 330, 650+301B BIOS don't do this at all */
++            /* This is a duplicate; done for LCDA as well (see above) */
++          if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++             if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) {
++                SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
++             }
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++          }
+          } else if(HwDeviceExtension->jChipType == SIS_300) {
+-           /* TW: 300/301LV BIOS does this for all bridge types - assumingly wrong */
+-           if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+-              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+-              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+-              SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
+-           }
++          /* 300/301LV BIOS does this for all bridge types - assumingly wrong */
++          if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
++             SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++          }
+        }
+   }  /* 301B */
+@@ -8278,21 +8404,26 @@ SiS_SetCRT2VCLK(SiS_Private *SiS_Pr, USH
+                  USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+   USHORT vclkindex;
+-  USHORT tempah;
++  USHORT temp, reg1, reg2;
+-  vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                              HwDeviceExtension);
++  if(SiS_Pr->UseCustomMode) {
++     reg1 = SiS_Pr->CSR2B;
++     reg2 = SiS_Pr->CSR2C;
++  } else {
++     vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
++                                 HwDeviceExtension);
++     reg1 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
++     reg2 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
++  }
+   if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-     tempah = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
+-     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,tempah);
+-     tempah = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
+-     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,tempah);
++     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,reg1);
++     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,reg2);
+      if(HwDeviceExtension->jChipType >= SIS_315H) {
+       if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+            if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+             if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+-                 if((ModeNo == 0x4a) || (ModeNo == 0x38)) {
++                 if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
+                   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0a,0x57);
+                   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0b,0x46);
+                   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1f,0xf6);
+@@ -8303,15 +8434,13 @@ SiS_SetCRT2VCLK(SiS_Private *SiS_Pr, USH
+      }
+   } else {    
+      SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,0x01);
+-     tempah = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
+-     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,tempah);
+-     tempah = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
+-     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,tempah);
++     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,reg2);
++     SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,reg1);
+   }
+   SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x12,0x00);
+-  tempah = 0x08;
+-  if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) tempah |= 0x20;
+-  SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x12,tempah);
++  temp = 0x08;
++  if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) temp |= 0x20;
++  SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x12,temp);
+ }
+ USHORT
+@@ -8319,23 +8448,24 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+                 USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+   USHORT tempbx;
+-  const USHORT LCDXlat0VCLK[4]    = {VCLK40, VCLK40, VCLK40, VCLK40};
+-  const USHORT LVDSXlat1VCLK[4]   = {VCLK40, VCLK40, VCLK40, VCLK40};
++  const USHORT LCDXlat0VCLK[4]    = {VCLK40,       VCLK40,       VCLK40,       VCLK40};
++  const USHORT LVDSXlat1VCLK[4]   = {VCLK40,       VCLK40,       VCLK40,       VCLK40};
++  const USHORT LVDSXlat4VCLK[4]   = {VCLK28,       VCLK28,       VCLK28,       VCLK28};
+ #ifdef SIS300
+-  const USHORT LCDXlat1VCLK300[4] = {VCLK65,   VCLK65,   VCLK65,   VCLK65};
+-  const USHORT LCDXlat2VCLK300[4] = {VCLK108_2,VCLK108_2,VCLK108_2,VCLK108_2};
+-  const USHORT LVDSXlat2VCLK300[4]= {VCLK65,   VCLK65,   VCLK65,   VCLK65};
+-  const USHORT LVDSXlat3VCLK300[4]= {VCLK65,   VCLK65,   VCLK65,   VCLK65};
++  const USHORT LCDXlat1VCLK300[4] = {VCLK65_300,   VCLK65_300,   VCLK65_300,   VCLK65_300};
++  const USHORT LCDXlat2VCLK300[4] = {VCLK108_2_300,VCLK108_2_300,VCLK108_2_300,VCLK108_2_300};
++  const USHORT LVDSXlat2VCLK300[4]= {VCLK65_300,   VCLK65_300,   VCLK65_300,   VCLK65_300};
++  const USHORT LVDSXlat3VCLK300[4]= {VCLK65_300,   VCLK65_300,   VCLK65_300,   VCLK65_300};
+ #endif
+ #ifdef SIS315H
+-  const USHORT LCDXlat1VCLK310[4] = {VCLK65+2,   VCLK65+2,   VCLK65+2,   VCLK65+2};
+-  const USHORT LCDXlat2VCLK310[4] = {VCLK108_2+5,VCLK108_2+5,VCLK108_2+5,VCLK108_2+5};
+-  const USHORT LVDSXlat2VCLK310[4]= {VCLK65+2,   VCLK65+2,   VCLK65+2,   VCLK65+2};
+-  const USHORT LVDSXlat3VCLK310[4]= {VCLK108_2+5,VCLK108_2+5,VCLK108_2+5,VCLK108_2+5};
++  const USHORT LCDXlat1VCLK310[4] = {VCLK65_315,   VCLK65_315,   VCLK65_315,   VCLK65_315};
++  const USHORT LCDXlat2VCLK310[4] = {VCLK108_2_315,VCLK108_2_315,VCLK108_2_315,VCLK108_2_315};
++  const USHORT LVDSXlat2VCLK310[4]= {VCLK65_315,   VCLK65_315,   VCLK65_315,   VCLK65_315};
++  const USHORT LVDSXlat3VCLK310[4]= {VCLK108_2_315,VCLK108_2_315,VCLK108_2_315,VCLK108_2_315};
+ #endif
+   USHORT CRT2Index,VCLKIndex=0;
+   USHORT modeflag,resinfo;
+-  const UCHAR *CHTVVCLKPtr=NULL;
++  const UCHAR  *CHTVVCLKPtr = NULL;
+   const USHORT *LCDXlatVCLK1 = NULL;
+   const USHORT *LCDXlatVCLK2 = NULL;
+   const USHORT *LVDSXlatVCLK2 = NULL;
+@@ -8372,33 +8502,40 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+      if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+         CRT2Index >>= 6;
+-        if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)){      /*  LCD */
++        if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {      /*  LCD */
+             if(HwDeviceExtension->jChipType < SIS_315H) {
+-             if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600)
++             if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+                       VCLKIndex = LCDXlat0VCLK[CRT2Index];
+-             else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)
++             } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+                       VCLKIndex = LCDXlatVCLK1[CRT2Index];
+-             else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)
++             } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+                       VCLKIndex = LCDXlatVCLK1[CRT2Index];
+-             else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)
++             } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+                       VCLKIndex = LCDXlatVCLK1[CRT2Index];
+-             else
++             } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
++                      VCLKIndex = VCLK81_300; /* guessed */
++             } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
++                      VCLKIndex = VCLK108_3_300;
++                      if(resinfo == SIS_RI_1280x1024) VCLKIndex = VCLK100_300;
++             } else {
+                       VCLKIndex = LCDXlatVCLK2[CRT2Index];
++             }
+           } else {
+-               /* TW: 330, 650/301LV BIOS does not check expanding, 315 does  */
+-             if( (HwDeviceExtension->jChipType > SIS_315PRO) ||
++             if( (SiS_Pr->SiS_VBType & VB_SIS301LV302LV) ||
+                  (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
+                         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-                   VCLKIndex = 0x19;
++                   VCLKIndex = VCLK108_2_315;
++                } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
++                   VCLKIndex = VCLK81_315;    /* guessed */
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-                   VCLKIndex = 0x19;
++                   VCLKIndex = VCLK108_2_315;
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+-                   VCLKIndex = 0x21;
++                   VCLKIndex = VCLK162_315;
++                } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
++                   VCLKIndex = VCLK108_3_315;
++                   if(resinfo == SIS_RI_1280x1024) VCLKIndex = VCLK100_315;
+                 } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+                    VCLKIndex = LCDXlatVCLK1[CRT2Index];
+-                  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+-                   VCLKIndex = 0x45;  /* TW: in VBVCLK table */
+-                   if(resinfo == 0x09) VCLKIndex++;
+                 } else {
+                    VCLKIndex = LCDXlatVCLK2[CRT2Index];
+                         }
+@@ -8408,12 +8545,18 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+                  if(ModeNo > 0x13) {
+                       VCLKIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+                  }
+-                 if(ModeNo <= 0x13) {  /* TW: 315 BIOS */
+-                    if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x42;
++                 if(ModeNo <= 0x13) {
++                    if(HwDeviceExtension->jChipType <= SIS_315PRO) {
++                       if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x42;
++                    } else {
++                       if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x00;
++                    }
++                 }
++                 if(HwDeviceExtension->jChipType <= SIS_315PRO) {
++                    if(VCLKIndex == 0) VCLKIndex = 0x41;
++                    if(VCLKIndex == 1) VCLKIndex = 0x43;
++                    if(VCLKIndex == 4) VCLKIndex = 0x44;
+                  }
+-                 if(VCLKIndex == 0) VCLKIndex = 0x41;
+-                 if(VCLKIndex == 1) VCLKIndex = 0x43;
+-                 if(VCLKIndex == 4) VCLKIndex = 0x44;
+              }
+           }
+         } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {                 /*  TV */
+@@ -8429,9 +8572,11 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+                               if(SiS_Pr->SiS_SetFlag & RPLLDIV2XO)  VCLKIndex = TVVCLKDIV2;
+                       else                                  VCLKIndex = TVVCLK;
+               }
+-              if(HwDeviceExtension->jChipType >= SIS_315H) {
+-                              VCLKIndex += 25;
+-              }
++              if(HwDeviceExtension->jChipType < SIS_315H) {
++                              VCLKIndex += TVCLKBASE_300;
++              } else {
++                      VCLKIndex += TVCLKBASE_315;
++              }
+         } else {                                              /* RAMDAC2 */
+               VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02));
+               VCLKIndex = ((VCLKIndex >> 2) & 0x03);
+@@ -8441,7 +8586,11 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+                               VCLKIndex &= 0x3f;
+                               if( (HwDeviceExtension->jChipType == SIS_630) &&
+                                   (HwDeviceExtension->jChipRevision >= 0x30)) {
+-                                   if(VCLKIndex == 0x14) VCLKIndex = 0x2e;
++                                   /* This is certainly wrong: It replaces clock
++                                    * 108 by 47...
++                                    */
++                                   /* if(VCLKIndex == 0x14) VCLKIndex = 0x2e; */
++                                   if(VCLKIndex == 0x14) VCLKIndex = 0x34;
+                               }
+                       }
+               }
+@@ -8505,6 +8654,10 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+               if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) ||
+                  (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480))
+                       VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
++              else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480   ||
++                      SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
++                      SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3)
++                      VCLKIndex = LVDSXlat4VCLK[VCLKIndex];
+               else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)
+                       VCLKIndex = LVDSXlatVCLK2[VCLKIndex];
+               else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)
+@@ -8513,6 +8666,11 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+                         VCLKIndex = LVDSXlatVCLK2[VCLKIndex];                 
+               else    VCLKIndex = LVDSXlatVCLK3[VCLKIndex];
++              if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++                 /* Special Timing: Barco iQ Pro R300/400 */
++                 VCLKIndex = 0x44;
++              }
++
+          } else {
+               VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02));
+@@ -8556,11 +8714,11 @@ SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCH
+ #ifdef TWDEBUG
+   xf86DrvMsg(0, X_INFO, "VCLKIndex %d (0x%x)\n", VCLKIndex, VCLKIndex);
+ #endif
+-  return (VCLKIndex);
++  return(VCLKIndex);
+ }
+-/* TW: Set 301 Palette address port registers */
+-/* TW: Checked against 650/301LV BIOS */
++/* Set 301 Palette address port registers */
++/* Checked against 650/301LV BIOS */
+ void
+ SiS_SetGroup5(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
+               UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
+@@ -8568,7 +8726,7 @@ SiS_SetGroup5(SiS_Private *SiS_Pr, PSIS_
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)  return;
+-  if(SiS_Pr->SiS_ModeType == ModeVGA){
++  if(SiS_Pr->SiS_ModeType == ModeVGA) {
+      if(!(SiS_Pr->SiS_VBInfo & (SetInSlaveMode | LoadDACFlag))){
+         SiS_EnableCRT2(SiS_Pr);
+         SiS_LoadDAC(SiS_Pr,HwDeviceExtension,ROMAddr,ModeNo,ModeIdIndex);
+@@ -8581,17 +8739,21 @@ SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCH
+                 USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+   USHORT temp,tempah,i,modeflag,j;
+-  USHORT ResInfo,DisplayType;
++  USHORT ResIndex,DisplayType;
+   const SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr=NULL;
+   if(ModeNo <= 0x13) {
+-      modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++     modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+   } else {
+-      modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++     modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+   }
++  if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
++     (SiS_Pr->SiS_CustomT == CUT_BARCO1024))
++     return;
++
+   temp = SiS_GetLVDSCRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+-                            &ResInfo,&DisplayType);
++                            &ResIndex,&DisplayType);
+   if(temp == 0) return;
+@@ -8639,47 +8801,53 @@ SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCH
+     case 41: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x768_1_H;        break;
+     case 42: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x768_2;          break;
+     case 43: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x768_2_H;        break;
++    case 50: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_1;           break;
++    case 51: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_1_H;         break;
++    case 52: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_2;           break;
++    case 53: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_2_H;         break;
++    case 54: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_3;           break;
++    case 55: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1640x480_3_H;         break;
+     case 99: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1SOPAL;               break;
+     default: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1;          break;
+   }
+   SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);                        /*unlock cr0-7  */
+-  tempah = (LVDSCRT1Ptr+ResInfo)->CR[0];
++  tempah = (LVDSCRT1Ptr + ResIndex)->CR[0];
+   SiS_SetReg1(SiS_Pr->SiS_P3d4,0x00,tempah);
+   for(i=0x02,j=1;i<=0x05;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+   }
+   for(i=0x06,j=5;i<=0x07;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+   }
+   for(i=0x10,j=7;i<=0x11;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+   }
+   for(i=0x15,j=9;i<=0x16;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+   }
+   for(i=0x0A,j=11;i<=0x0C;i++,j++){
+-    tempah = (LVDSCRT1Ptr+ResInfo)->CR[j];
++    tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
+     SiS_SetReg1(SiS_Pr->SiS_P3c4,i,tempah);
+   }
+-  tempah = (LVDSCRT1Ptr+ResInfo)->CR[14];
++  tempah = (LVDSCRT1Ptr + ResIndex)->CR[14];
+   tempah &= 0xE0;
+-  SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0x1f,tempah);     
++  SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0x1f,tempah);
+-  tempah = (LVDSCRT1Ptr+ResInfo)->CR[14];
++  tempah = (LVDSCRT1Ptr + ResIndex)->CR[14];
+   tempah &= 0x01;
+   tempah <<= 5;
+   if(modeflag & DoubleScanMode)  tempah |= 0x080;
+   SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,~0x020,tempah);
+-  /* TW: 650/LVDS BIOS - doesn't make sense */
++  /* 650/LVDS BIOS - doesn't make sense */
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+      if(modeflag & HalfDCLK)
+         SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);
+@@ -8688,7 +8856,7 @@ SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCH
+ BOOLEAN
+ SiS_GetLVDSCRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+-                 USHORT RefreshRateTableIndex,USHORT *ResInfo,
++                 USHORT RefreshRateTableIndex,USHORT *ResIndex,
+                  USHORT *DisplayType)
+  {
+   USHORT tempbx,modeflag=0;
+@@ -8757,19 +8925,33 @@ SiS_GetLVDSCRT1Ptr(SiS_Private *SiS_Pr, 
+            tempbx = 40;
+          if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+          if(modeflag & HalfDCLK) tempbx++;
++        } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
++           tempbx = 54;
++         if(modeflag & HalfDCLK) tempbx++;
++      } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2) {
++           tempbx = 52;
++         if(modeflag & HalfDCLK) tempbx++;
++      } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
++           tempbx = 50;
++         if(modeflag & HalfDCLK) tempbx++;
+         }
++
+      }
+      if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+         tempbx = 12;
+       if(modeflag & HalfDCLK) tempbx++;
+      }
+   }
+-  if(SiS_Pr->SiS_IF_DEF_FSTN){
++
++#if 0
++  if(SiS_Pr->SiS_IF_DEF_FSTN) {
+      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480){
+         tempbx = 22;
+      }
+   }
+-  *ResInfo = CRT2CRTC & 0x3F;
++#endif
++
++  *ResIndex = CRT2CRTC & 0x3F;
+   *DisplayType = tempbx;
+   return 1;
+ }
+@@ -8778,54 +8960,54 @@ void
+ SiS_SetCRT2ECLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex,
+            USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+-  USHORT tempah,tempal,pushax;
+-  USHORT vclkindex=0;
+-    
++  USHORT clkbase, vclkindex=0;
++  UCHAR  sr2b, sr2c;
++
+   if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) || (SiS_Pr->SiS_IF_DEF_TRUMPION == 1)) {
+       SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
+-        tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+-      tempal &= 0x3F;
+-      if(tempal == 2) RefreshRateTableIndex--;
++        if((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK & 0x3f) == 2) {
++         RefreshRateTableIndex--;
++      }
+       vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-                               RefreshRateTableIndex,HwDeviceExtension);
++                                    RefreshRateTableIndex,HwDeviceExtension);
+       SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+   } else {
+         vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-                               RefreshRateTableIndex,HwDeviceExtension);
++                                    RefreshRateTableIndex,HwDeviceExtension);
+   }
+-  
+-  tempal = 0x02B;
++
++  sr2b = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
++  sr2c = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
++
++  if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
++     if((ROMAddr) && SiS_Pr->SiS_UseROM) {
++      if(ROMAddr[0x220] & 0x01) {
++           sr2b = ROMAddr[0x227];
++         sr2c = ROMAddr[0x228];
++      }
++     }
++  }
++
++  clkbase = 0x02B;
+   if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+      if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+-      tempal += 3;
++      clkbase += 3;
+      }
+   }
++
+   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+-  pushax = tempal;
+   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x20);
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
+-  tempal++;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x10);
+-  tempal = pushax;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
+-  tempal++;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x00);
+-  tempal = pushax;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
+-  tempal++;
+-  tempah = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
+-  SiS_SetReg1(SiS_Pr->SiS_P3c4,tempal,tempah);
+-  return;
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
++  SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+ }
+-#if 0  /* TW: Not used */
++#if 0  /* Not used */
+ void
+ SiS_SetDefCRT2ExtRegs(SiS_Private *SiS_Pr, USHORT BaseAddr)
+ {
+@@ -8844,7 +9026,7 @@ SiS_SetDefCRT2ExtRegs(SiS_Private *SiS_P
+ }
+ #endif
+-/* TW: Start of Chrontel 70xx functions ---------------------- */
++/* Start of Chrontel 70xx functions ---------------------- */
+ /* Set-up the Chrontel Registers */
+ void
+@@ -8890,44 +9072,44 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+ #ifdef SIS300
+-  
+-     /* Chrontel 7005 - I assume that it does not come with a 310/325 series chip */
+-     /* TW: We don't support modes >800x600 */
++     /* Chrontel 7005 - I assume that it does not come with a 315 series chip */
++
++     /* We don't support modes >800x600 */
+      if (resindex > 5) return;
+      if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+-      SiS_SetCH700x(SiS_Pr,0x4304);   /* TW: 0x40=76uA (PAL); 0x03=15bit non-multi RGB*/
+-      SiS_SetCH700x(SiS_Pr,0x6909);   /* TW: Black level for PAL (105)*/
++      SiS_SetCH700x(SiS_Pr,0x4304);   /* 0x40=76uA (PAL); 0x03=15bit non-multi RGB*/
++      SiS_SetCH700x(SiS_Pr,0x6909);   /* Black level for PAL (105)*/
+      } else {
+-      SiS_SetCH700x(SiS_Pr,0x0304);   /* TW: upper nibble=71uA (NTSC), 0x03=15bit non-multi RGB*/
+-      SiS_SetCH700x(SiS_Pr,0x7109);   /* TW: Black level for NTSC (113)*/
++      SiS_SetCH700x(SiS_Pr,0x0304);   /* upper nibble=71uA (NTSC), 0x03=15bit non-multi RGB*/
++      SiS_SetCH700x(SiS_Pr,0x7109);   /* Black level for NTSC (113)*/
+      }
+      temp = CHTVRegData[resindex].Reg[0];
+-     tempbx=((temp&0x00FF)<<8)|0x00;  /* TW: Mode register */
++     tempbx=((temp&0x00FF)<<8)|0x00;  /* Mode register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+      temp = CHTVRegData[resindex].Reg[1];
+-     tempbx=((temp&0x00FF)<<8)|0x07;  /* TW: Start active video register */
++     tempbx=((temp&0x00FF)<<8)|0x07;  /* Start active video register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+      temp = CHTVRegData[resindex].Reg[2];
+-     tempbx=((temp&0x00FF)<<8)|0x08;  /* TW: Position overflow register */
++     tempbx=((temp&0x00FF)<<8)|0x08;  /* Position overflow register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+      temp = CHTVRegData[resindex].Reg[3];
+-     tempbx=((temp&0x00FF)<<8)|0x0A;  /* TW: Horiz Position register */
++     tempbx=((temp&0x00FF)<<8)|0x0A;  /* Horiz Position register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+      temp = CHTVRegData[resindex].Reg[4];
+-     tempbx=((temp&0x00FF)<<8)|0x0B;  /* TW: Vertical Position register */
++     tempbx=((temp&0x00FF)<<8)|0x0B;  /* Vertical Position register */
+      SiS_SetCH700x(SiS_Pr,tempbx);
+-     /* TW: Set minimum flicker filter for Luma channel (SR1-0=00),
++     /* Set minimum flicker filter for Luma channel (SR1-0=00),
+                 minimum text enhancement (S3-2=10),
+               maximum flicker filter for Chroma channel (S5-4=10)
+               =00101000=0x28 (When reading, S1-0->S3-2, and S3-2->S1-0!)
+       */
+      SiS_SetCH700x(SiS_Pr,0x2801);
+-     /* TW: Set video bandwidth
++     /* Set video bandwidth
+             High bandwith Luma composite video filter(S0=1)
+             low bandwith Luma S-video filter (S2-1=00)
+           disable peak filter in S-video channel (S3=0)
+@@ -8936,22 +9118,24 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+      */
+      SiS_SetCH700x(SiS_Pr,0xb103);       /* old: 3103 */
+-     /* TW: Register 0x3D does not exist in non-macrovision register map
++     /* Register 0x3D does not exist in non-macrovision register map
+             (Maybe this is a macrovision register?)
+       */
+-     /* SiS_SetCH70xx(SiS_Pr,0x003D); */
++#ifndef SIS_CP
++     SiS_SetCH70xx(SiS_Pr,0x003D);
++#endif     
+-     /* TW: Register 0x10 only contains 1 writable bit (S0) for sensing,
++     /* Register 0x10 only contains 1 writable bit (S0) for sensing,
+             all other bits a read-only. Macrovision?
+       */
+      SiS_SetCH70xxANDOR(SiS_Pr,0x0010,0x1F);
+-     /* TW: Register 0x11 only contains 3 writable bits (S0-S2) for
++     /* Register 0x11 only contains 3 writable bits (S0-S2) for
+             contrast enhancement (set to 010 -> gain 1 Yout = 17/16*(Yin-30) )
+       */
+      SiS_SetCH70xxANDOR(SiS_Pr,0x0211,0xF8);
+-     /* TW: Clear DSEN
++     /* Clear DSEN
+       */
+      SiS_SetCH70xxANDOR(SiS_Pr,0x001C,0xEF);
+@@ -8994,7 +9178,7 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+          }
+        }
+      } else {                         /* ---- PAL ---- */
+-           /* TW: We don't play around with FSCI in PAL mode */
++           /* We don't play around with FSCI in PAL mode */
+          if (resindex == 0x04) {
+            SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF);    /* loop filter off */
+            SiS_SetCH70xxANDOR(SiS_Pr,0x0121,0xFE);      /* ACIV on */
+@@ -9012,7 +9196,7 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+ #ifdef SIS315H
+-     /* TW: We don't support modes >1024x768 */
++     /* We don't support modes >1024x768 */
+      if (resindex > 6) return;
+      temp = CHTVRegData[resindex].Reg[0];
+@@ -9082,26 +9266,29 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHA
+ #endif        /* 315 */
+   }
++
++#ifdef SIS_CP
++  SIS_CP_INIT301_CP3
++#endif
++
+ }
+-/* TW: Chrontel 701x functions ================================= */
++/* Chrontel 701x functions ================================= */
+ void
+-SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr)
++SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+-#ifndef NEWCH701x
+   USHORT temp;
+-#endif  
+-  /* TW: Enable Chrontel 7019 LCD panel backlight */
++  /* Enable Chrontel 7019 LCD panel backlight */
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+-#ifdef NEWCH701x
++     if(HwDeviceExtension->jChipType == SIS_740) {
+         SiS_SetCH701x(SiS_Pr,0x6566);
+-#else  
++     } else {
+         temp = SiS_GetCH701x(SiS_Pr,0x66);
+         temp |= 0x20;
+       SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
+-#endif        
++     }
+   }
+ }
+@@ -9110,7 +9297,7 @@ SiS_Chrontel701xBLOff(SiS_Private *SiS_P
+ {
+   USHORT temp;
+-  /* TW: Disable Chrontel 7019 LCD panel backlight */
++  /* Disable Chrontel 7019 LCD panel backlight */
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+         temp = SiS_GetCH701x(SiS_Pr,0x66);
+         temp &= 0xDF;
+@@ -9118,47 +9305,54 @@ SiS_Chrontel701xBLOff(SiS_Private *SiS_P
+   }
+ }
+-#ifdef SIS315H  /* -------- 310/325 series only --------- */
++#ifdef SIS315H  /* ----------- 315 series only ---------- */
+ void
+ SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+ {
+-#ifdef NEWCH701x  
+-  UCHAR regtable[]  = { 0x1c, 0x5f, 0x64, 0x6f, 0x70, 0x71,
+-                        0x72, 0x73, 0x74, 0x76, 0x78, 0x7d, 0x66 };
+-  UCHAR table1024[] = { 0x60, 0x02, 0x00, 0x07, 0x40, 0xed,
+-                        0xa3, 0xc8, 0xc7, 0xac, 0xe0, 0x02, 0x44 }; 
+-  UCHAR table1280[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
+-                      0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02, 0x44 };                     
+-  UCHAR table1400[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,         
+-                        0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02, 0x44 }; 
+-  UCHAR table1600[] = { 0x60, 0x04, 0x11, 0x00, 0x40, 0xe3,
+-                      0xad, 0xde, 0xf6, 0xac, 0x60, 0x1a, 0x44 };
+-#else
+-  UCHAR regtable[]  = { 0x1c, 0x5f, 0x64, 0x6f, 0x70, 0x71,
+-                        0x72, 0x73, 0x74, 0x76, 0x78, 0x7d };
+-  UCHAR table1024[] = { 0x60, 0x02, 0x00, 0x07, 0x40, 0xed,
+-                        0xa3, 0xc8, 0xc7, 0xac, 0x60, 0x02 }; 
+-  UCHAR table1280[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
+-                      0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02 };                   
+-  UCHAR table1400[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xef,   
+-                        0xad, 0xdb, 0xf6, 0xac, 0x60, 0x02 }; 
+-  UCHAR table1600[] = { 0x60, 0x04, 0x11, 0x00, 0x40, 0xe3,
+-                      0xad, 0xde, 0xf6, 0xac, 0x60, 0x1a };
+-#endif                        
++  UCHAR regtable[]      = { 0x1c, 0x5f, 0x64, 0x6f, 0x70, 0x71,
++                            0x72, 0x73, 0x74, 0x76, 0x78, 0x7d, 0x66 };
++  UCHAR table1024_740[] = { 0x60, 0x02, 0x00, 0x07, 0x40, 0xed,
++                            0xa3, 0xc8, 0xc7, 0xac, 0xe0, 0x02, 0x44 };
++  UCHAR table1280_740[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
++                          0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02, 0x44 };
++  UCHAR table1400_740[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
++                            0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02, 0x44 };
++  UCHAR table1600_740[] = { 0x60, 0x04, 0x11, 0x00, 0x40, 0xe3,
++                          0xad, 0xde, 0xf6, 0xac, 0x60, 0x1a, 0x44 };
++  UCHAR table1024_650[] = { 0x60, 0x02, 0x00, 0x07, 0x40, 0xed,
++                            0xa3, 0xc8, 0xc7, 0xac, 0x60, 0x02 };
++  UCHAR table1280_650[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xe3,
++                          0xad, 0xdb, 0xf6, 0xac, 0xe0, 0x02 };
++  UCHAR table1400_650[] = { 0x60, 0x03, 0x11, 0x00, 0x40, 0xef,
++                            0xad, 0xdb, 0xf6, 0xac, 0x60, 0x02 };
++  UCHAR table1600_650[] = { 0x60, 0x04, 0x11, 0x00, 0x40, 0xe3,
++                          0xad, 0xde, 0xf6, 0xac, 0x60, 0x1a };
+   UCHAR *tableptr = NULL;
+   USHORT tempbh;
+   int i;
+-  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-     tableptr = table1024;
+-  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+-     tableptr = table1280;
+-  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+-     tableptr = table1400;
+-  } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+-     tableptr = table1600;
+-  } else return;
++  if(HwDeviceExtension->jChipType == SIS_740) {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++        tableptr = table1024_740;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++        tableptr = table1280_740;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
++        tableptr = table1400_740;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
++        tableptr = table1600_740;
++     } else return;
++  } else {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++        tableptr = table1024_650;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
++        tableptr = table1280_650;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
++        tableptr = table1400_650;
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
++        tableptr = table1600_650;
++     } else return;
++  }
+   tempbh = SiS_GetCH701x(SiS_Pr,0x74);
+   if((tempbh == 0xf6) || (tempbh == 0xc7)) {
+@@ -9172,54 +9366,64 @@ SiS_SetCH701xForLCD(SiS_Private *SiS_Pr,
+         if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) return;
+      }
+   }
+-#ifdef NEWCH701x     /* New from 740/LVDS: */    
+-  for(i=0; i<0x0d; i++) {     
+-#else
+-  for(i=0; i<0x0c; i++) {
+-#endif  
++
++  if(HwDeviceExtension->jChipType == SIS_740) {
++     tempbh = 0x0d;
++  } else {
++     tempbh = 0x0c;
++  }
++  for(i = 0; i < tempbh; i++) {
+      SiS_SetCH701x(SiS_Pr,(tableptr[i] << 8) | regtable[i]);
+   }
+-  SiS_ChrontelPowerSequencing(SiS_Pr);
++  SiS_ChrontelPowerSequencing(SiS_Pr,HwDeviceExtension);
+   tempbh = SiS_GetCH701x(SiS_Pr,0x1e);
+   tempbh |= 0xc0;
+   SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x1e);
+-  
+-#ifdef NEWCH701x     /* 740/LVDS: */
+-  tempbh = SiS_GetCH701x(SiS_Pr,0x1c);
+-  tempbh &= 0xfb;
+-  SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x1c);
+-  SiS_SetReg1(SiS_Pr->SiS_Part1Port, 0x2d, 0x03);
+-  tempbh = SiS_GetCH701x(SiS_Pr,0x64);
+-  tempbh |= 0x40;
+-  SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x64);
+-  tempbh = SiS_GetCH701x(SiS_Pr,0x03);
+-  tempbh &= 0x3f;
+-  SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x03);
+-#endif  /* End 740/LVDS */
++
++  if(HwDeviceExtension->jChipType == SIS_740) {
++     tempbh = SiS_GetCH701x(SiS_Pr,0x1c);
++     tempbh &= 0xfb;
++     SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x1c);
++     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x03);
++     tempbh = SiS_GetCH701x(SiS_Pr,0x64);
++     tempbh |= 0x40;
++     SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x64);
++     tempbh = SiS_GetCH701x(SiS_Pr,0x03);
++     tempbh &= 0x3f;
++     SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x03);
++  }
+ }
+ void
+-SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr)
+-{
+-  UCHAR regtable[]  = { 0x67, 0x68, 0x69, 0x6a, 0x6b };
+-#ifdef NEWCH701x  
+-  UCHAR table1024[] = { 0x01, 0x02, 0x01, 0x01, 0x01 };
+-  UCHAR table1400[] = { 0x01, 0x6e, 0x01, 0x01, 0x01 };
+-#else
+-  UCHAR table1024[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
+-  UCHAR table1400[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
+-#endif  
++SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
++{
++  UCHAR regtable[]      = { 0x67, 0x68, 0x69, 0x6a, 0x6b };
++  UCHAR table1024_740[] = { 0x01, 0x02, 0x01, 0x01, 0x01 };
++  UCHAR table1400_740[] = { 0x01, 0x6e, 0x01, 0x01, 0x01 };
++  UCHAR table1024_650[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
++  UCHAR table1400_650[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
+   UCHAR *tableptr = NULL;
+   int i;
+   /* Set up Power up/down timing */
+-  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-     tableptr = table1024;
+-  } else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+-            (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+-          (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
+-     tableptr = table1400;
+-  } else return;
++
++  if(HwDeviceExtension->jChipType == SIS_740) {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++        tableptr = table1024_740;
++     } else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++               (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
++             (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
++        tableptr = table1400_740;
++     } else return;
++  } else {
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
++        tableptr = table1024_650;
++     } else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
++               (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
++             (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
++        tableptr = table1400_650;
++     } else return;
++  }
+   
+   for(i=0; i<5; i++) {
+      SiS_SetCH701x(SiS_Pr,(tableptr[i] << 8) | regtable[i]);
+@@ -9232,66 +9436,72 @@ SiS_Chrontel701xOn(SiS_Private *SiS_Pr, 
+   USHORT temp;
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+-#ifdef NEWCH701x
+-     temp = SiS_GetCH701x(SiS_Pr,0x1c);
+-     temp |= 0x04;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
+-#endif 
++     if(HwDeviceExtension->jChipType == SIS_740) {
++        temp = SiS_GetCH701x(SiS_Pr,0x1c);
++        temp |= 0x04;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
++     }
+      if(SiS_IsYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+         temp = SiS_GetCH701x(SiS_Pr,0x01);
+       temp &= 0x3f;
+-      temp |= 0x80;   /* TW: Enable YPrPb (HDTV) */
++      temp |= 0x80;   /* Enable YPrPb (HDTV) */
+       SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x01);
+      }
+      if(SiS_IsChScart(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+         temp = SiS_GetCH701x(SiS_Pr,0x01);
+       temp &= 0x3f;
+-      temp |= 0xc0;   /* TW: Enable SCART + CVBS */
++      temp |= 0xc0;   /* Enable SCART + CVBS */
+       SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x01);
+      }
+-#ifdef NEWCH701x
+-     SiS_ChrontelDoSomething5(SiS_Pr);
+-     SiS_SetCH701x(SiS_Pr,0x2049);                    /* TW: Enable TV path */
+-#else      
+-     SiS_SetCH701x(SiS_Pr,0x2049);                    /* TW: Enable TV path */
+-     temp = SiS_GetCH701x(SiS_Pr,0x49);
+-     if(SiS_IsYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-        temp = SiS_GetCH701x(SiS_Pr,0x73);
+-      temp |= 0x60;
+-      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x73);
++     if(HwDeviceExtension->jChipType == SIS_740) {
++        SiS_ChrontelDoSomething5(SiS_Pr);
++        SiS_SetCH701x(SiS_Pr,0x2049);                         /* Enable TV path */
++     } else {
++        SiS_SetCH701x(SiS_Pr,0x2049);                         /* Enable TV path */
++        temp = SiS_GetCH701x(SiS_Pr,0x49);
++        if(SiS_IsYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++           temp = SiS_GetCH701x(SiS_Pr,0x73);
++         temp |= 0x60;
++         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x73);
++        }
++        temp = SiS_GetCH701x(SiS_Pr,0x47);
++        temp &= 0x7f;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
++        SiS_LongDelay(SiS_Pr,2);
++        temp = SiS_GetCH701x(SiS_Pr,0x47);
++        temp |= 0x80;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+      }
+-     temp = SiS_GetCH701x(SiS_Pr,0x47);
+-     temp &= 0x7f;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+-     SiS_LongDelay(SiS_Pr,2);
+-     temp = SiS_GetCH701x(SiS_Pr,0x47);
+-     temp |= 0x80;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+-#endif     
+   }
+ }
+ void
+-SiS_Chrontel701xOff(SiS_Private *SiS_Pr)
++SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+   USHORT temp;
++  /* Complete power down of LVDS */
+   if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
++     if(HwDeviceExtension->jChipType == SIS_740) {
++        SiS_LongDelay(SiS_Pr,1);
++      SiS_GenericDelay(SiS_Pr,0x16ff);
++      SiS_SetCH701x(SiS_Pr,0xac76);
++      SiS_SetCH701x(SiS_Pr,0x0066);
++     } else {
+         SiS_LongDelay(SiS_Pr,2);
+-      /* TW: Complete power down of LVDS */
+       temp = SiS_GetCH701x(SiS_Pr,0x76);
+       temp &= 0xfc;
+       SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
+       SiS_SetCH701x(SiS_Pr,0x0066);
++     }
+   }
+ }
+-#ifdef NEWCH701x
+ void
+ SiS_ChrontelDoSomething5(SiS_Private *SiS_Pr)
+ {
+      unsigned char temp, temp1;
+-     
++
+      temp1 = SiS_GetCH701x(SiS_Pr,0x49);
+      SiS_SetCH701x(SiS_Pr,0x3e49);
+      temp = SiS_GetCH701x(SiS_Pr,0x47);
+@@ -9303,130 +9513,134 @@ SiS_ChrontelDoSomething5(SiS_Private *Si
+      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+      SiS_SetCH701x(SiS_Pr,(temp1 << 8) | 0x49);
+ }
+-#endif
+ void
+ SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+ {
+-#ifdef NEWCH701x
+      USHORT temp;
+-     
+-     /* 740/LVDS: */
+-     temp = SiS_GetCH701x(SiS_Pr,0x4a);
+-     temp &= 0x01;
+-     if(!(temp)) {
+-     
+-        if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-         temp = SiS_GetCH701x(SiS_Pr,0x49);
+-         SiS_SetCH701x(SiS_Pr,0x3e49);
+-      }
+-      /* TW: Reset Chrontel 7019 datapath */
++
++     if(HwDeviceExtension->jChipType == SIS_740) {
++        temp = SiS_GetCH701x(SiS_Pr,0x4a);
++        temp &= 0x01;
++        if(!(temp)) {
++
++           if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++            temp = SiS_GetCH701x(SiS_Pr,0x49);
++            SiS_SetCH701x(SiS_Pr,0x3e49);
++         }
++         /* Reset Chrontel 7019 datapath */
++           SiS_SetCH701x(SiS_Pr,0x1048);
++           SiS_LongDelay(SiS_Pr,1);
++           SiS_SetCH701x(SiS_Pr,0x1848);
++
++         if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++            SiS_ChrontelDoSomething5(SiS_Pr);
++            SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x49);
++         }
++
++        } else {
++
++           temp = SiS_GetCH701x(SiS_Pr,0x5c);
++         temp &= 0xef;
++         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
++         temp = SiS_GetCH701x(SiS_Pr,0x5c);
++         temp |= 0x10;
++         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
++         temp = SiS_GetCH701x(SiS_Pr,0x5c);
++         temp &= 0xef;
++         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
++         temp = SiS_GetCH701x(SiS_Pr,0x61);
++         if(!temp) {
++            SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
++         }
++        }
++     } else { /* 650 */
++        /* Reset Chrontel 7019 datapath */
+         SiS_SetCH701x(SiS_Pr,0x1048);
+         SiS_LongDelay(SiS_Pr,1);
+         SiS_SetCH701x(SiS_Pr,0x1848);
+-      
+-      if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-         SiS_ChrontelDoSomething5(SiS_Pr);
+-         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x49);
+-      }    
+-     } else {
+-     
+-        temp = SiS_GetCH701x(SiS_Pr,0x5c);
+-      temp &= 0xef;
+-      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
+-      temp = SiS_GetCH701x(SiS_Pr,0x5c);
+-      temp |= 0x10;
+-      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
+-      temp = SiS_GetCH701x(SiS_Pr,0x5c);
+-      temp &= 0xef;
+-      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
+-      temp = SiS_GetCH701x(SiS_Pr,0x61);
+-      if(!temp) {
+-         SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
+-      }
+-     }
+-#else /* pre 740/LVDS code */     
+-     /* TW: Reset Chrontel 7019 datapath */
+-     SiS_SetCH701x(SiS_Pr,0x1048);
+-     SiS_LongDelay(SiS_Pr,1);
+-     SiS_SetCH701x(SiS_Pr,0x1848);
+-#endif     
++     }
+ }
+ void
+ SiS_ChrontelDoSomething4(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+ {
+-#ifdef NEWCH701x
+-     if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+-        SiS_ChrontelDoSomething5(SiS_Pr);
+-     }
+-#else
+      USHORT temp;
+-     SiS_SetCH701x(SiS_Pr,0xaf76);  /* Power up LVDS block */
+-     temp = SiS_GetCH701x(SiS_Pr,0x49);
+-     temp &= 1;
+-     if(temp != 1) {  /* TV block powered? (0 = yes, 1 = no) */
+-      temp = SiS_GetCH701x(SiS_Pr,0x47);
+-      temp &= 0x70;
+-      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);  /* enable VSYNC */
+-      SiS_LongDelay(SiS_Pr,3);
+-      temp = SiS_GetCH701x(SiS_Pr,0x47);
+-      temp |= 0x80;
+-      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);  /* disable VSYNC */
++     if(HwDeviceExtension->jChipType == SIS_740) {
++
++        if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++           SiS_ChrontelDoSomething5(SiS_Pr);
++        }
++
++     } else {
++
++        SiS_SetCH701x(SiS_Pr,0xaf76);  /* Power up LVDS block */
++        temp = SiS_GetCH701x(SiS_Pr,0x49);
++        temp &= 1;
++        if(temp != 1) {  /* TV block powered? (0 = yes, 1 = no) */
++         temp = SiS_GetCH701x(SiS_Pr,0x47);
++         temp &= 0x70;
++         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);  /* enable VSYNC */
++         SiS_LongDelay(SiS_Pr,3);
++         temp = SiS_GetCH701x(SiS_Pr,0x47);
++         temp |= 0x80;
++         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);  /* disable VSYNC */
++        }
++
+      }
+-#endif     
+ }
+ void
+ SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                          USHORT BaseAddr)
+ {
+-#ifdef NEWCH701x
+-     USHORT temp;
+-     
+-     temp = SiS_GetCH701x(SiS_Pr,0x61);
+-     if(temp < 1) {
+-          temp++;
+-        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
+-     }
+-     SiS_SetCH701x(SiS_Pr,0x4566);
+-     SiS_SetCH701x(SiS_Pr,0xaf76);
+-     SiS_LongDelay(SiS_Pr,1);
+-     SiS_GenericDelay(SiS_Pr,0x16ff);
+-
+-#else
+      USHORT temp,temp1;
+-     
+-     temp1 = 0;
+-     temp = SiS_GetCH701x(SiS_Pr,0x61);
+-     if(temp < 2) {
+-          temp++;
+-        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
+-        temp1 = 1;
+-     }
+-     SiS_SetCH701x(SiS_Pr,0xac76);
+-     temp = SiS_GetCH701x(SiS_Pr,0x66);
+-     temp |= 0x5f;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
+-     if(ModeNo > 0x13) {
+-         if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+-          SiS_GenericDelay(SiS_Pr,0x3ff);
+-       } else {
+-          SiS_GenericDelay(SiS_Pr,0x2ff);
+-       }
+-     } else {
+-         if(!temp1)
+-          SiS_GenericDelay(SiS_Pr,0x2ff);
++
++     if(HwDeviceExtension->jChipType == SIS_740) {
++
++        temp = SiS_GetCH701x(SiS_Pr,0x61);
++        if(temp < 1) {
++           temp++;
++         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
++        }
++        SiS_SetCH701x(SiS_Pr,0x4566);
++        SiS_SetCH701x(SiS_Pr,0xaf76);
++        SiS_LongDelay(SiS_Pr,1);
++        SiS_GenericDelay(SiS_Pr,0x16ff);
++
++     } else {  /* 650 */
++
++        temp1 = 0;
++        temp = SiS_GetCH701x(SiS_Pr,0x61);
++        if(temp < 2) {
++           temp++;
++         SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
++         temp1 = 1;
++        }
++        SiS_SetCH701x(SiS_Pr,0xac76);
++        temp = SiS_GetCH701x(SiS_Pr,0x66);
++        temp |= 0x5f;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
++        if(ModeNo > 0x13) {
++           if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
++            SiS_GenericDelay(SiS_Pr,0x3ff);
++         } else {
++            SiS_GenericDelay(SiS_Pr,0x2ff);
++         }
++        } else {
++           if(!temp1)
++            SiS_GenericDelay(SiS_Pr,0x2ff);
++        }
++        temp = SiS_GetCH701x(SiS_Pr,0x76);
++        temp |= 0x03;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
++        temp = SiS_GetCH701x(SiS_Pr,0x66);
++        temp &= 0x7f;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
++        SiS_LongDelay(SiS_Pr,1);
++
+      }
+-     temp = SiS_GetCH701x(SiS_Pr,0x76);
+-     temp |= 0x03;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
+-     temp = SiS_GetCH701x(SiS_Pr,0x66);
+-     temp &= 0x7f;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
+-     SiS_LongDelay(SiS_Pr,1);
+-#endif     
+ }
+ void
+@@ -9443,9 +9657,9 @@ SiS_ChrontelDoSomething2(SiS_Private *Si
+        temp &= 0x04;
+        if(temp == 0x04) break;
+        
+-#ifdef NEWCH701x
+-       SiS_SetCH701x(SiS_Pr,0xac76);    /* 740/LVDS */
+-#endif       
++       if(HwDeviceExtension->jChipType == SIS_740) {
++          SiS_SetCH701x(SiS_Pr,0xac76);
++       }
+        SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
+@@ -9463,11 +9677,11 @@ SiS_ChrontelDoSomething2(SiS_Private *Si
+        temp = SiS_GetCH701x(SiS_Pr,0x76);
+        temp |= 0x04;
+        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
+-#ifdef NEWCH701x
+-       SiS_SetCH701x(SiS_Pr,0xe078);
+-#else       
+-       SiS_SetCH701x(SiS_Pr,0x6078);
+-#endif       
++       if(HwDeviceExtension->jChipType == SIS_740) {
++          SiS_SetCH701x(SiS_Pr,0xe078);
++       } else {
++          SiS_SetCH701x(SiS_Pr,0x6078);
++       }
+        SiS_LongDelay(SiS_Pr,2);
+     } while(0);
+@@ -9485,51 +9699,52 @@ SiS_ChrontelDoSomething1(SiS_Private *Si
+      temp &= 0xbf;    /* Set datapath 2 to LVDS */
+      SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x03);
+      
+-#ifdef NEWCH701x   /* 740/LVDS: */
++     if(HwDeviceExtension->jChipType == SIS_740) {
++
++        temp = SiS_GetCH701x(SiS_Pr,0x1c);
++        temp &= 0xfb;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
++
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x03);
++
++        temp = SiS_GetCH701x(SiS_Pr,0x64);
++        temp |= 0x40;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x64);
++
++        temp = SiS_GetCH701x(SiS_Pr,0x03);
++        temp &= 0x3f;
++        SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x03);
++
++        temp = SiS_GetCH701x(SiS_Pr,0x66);
++        if(temp != 0x45) {
++           SiS_ChrontelResetDB(SiS_Pr,HwDeviceExtension,BaseAddr);
++           SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
++         temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
++           SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
++        }
++
++     } else { /* 650 */
+-     temp = SiS_GetCH701x(SiS_Pr,0x1c);
+-     temp &= 0xfb;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
+-     
+-     SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x03);
+-     
+-     temp = SiS_GetCH701x(SiS_Pr,0x64);
+-     temp |= 0x40;
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x64);
+-     
+-     temp = SiS_GetCH701x(SiS_Pr,0x03);
+-     temp &= 0x3f;    
+-     SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x03);
+-     
+-     temp = SiS_GetCH701x(SiS_Pr,0x66);
+-     if(temp != 0x45) {
+         SiS_ChrontelResetDB(SiS_Pr,HwDeviceExtension,BaseAddr);
+-        SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
+-      temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
+-        SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
+-     }     
+-#else  /* pre-740/LVDS: */     
++        SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
+-     SiS_ChrontelResetDB(SiS_Pr);
++        temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
++        SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
+-     SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
++        SiS_SetCH701x(SiS_Pr,0xaf76);
+-     temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
+-     SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
++     }
+-     SiS_SetCH701x(SiS_Pr,0xaf76);
+-     
+-#endif  /* End of pre-740/LVDS */
+ }
+-#endif  /* 310/325 series --------------------------------- */
++#endif  /* 315 series ------------------------------------ */
+-/* TW: End of Chrontel 701x functions ==================================== */
++/* End of Chrontel 701x functions ==================================== */
+-/* TW: Generic Read/write routines for Chrontel ========================== */
++/* Generic Read/write routines for Chrontel ========================== */
+-/* TW: The Chrontel is connected to the 630/730 via
++/* The Chrontel is connected to the 630/730 via
+  * the 630/730's DDC/I2C port.
+  *
+  * On 630(S)T chipset, the index changed from 0x11 to 0x0a,
+@@ -9539,13 +9754,13 @@ SiS_ChrontelDoSomething1(SiS_Private *Si
+ void
+ SiS_SetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx)
+ {
+-   if (SiS_Pr->SiS_IF_DEF_CH70xx == 1)
++   if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
+       SiS_SetCH700x(SiS_Pr,tempbx);
+    else
+       SiS_SetCH701x(SiS_Pr,tempbx);
+ }
+-/* TW: Write to Chrontel 700x */
++/* Write to Chrontel 700x */
+ /* Parameter is [Data (S15-S8) | Register no (S7-S0)] */
+ void
+ SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempbx)
+@@ -9553,100 +9768,100 @@ SiS_SetCH700x(SiS_Private *SiS_Pr, USHOR
+   USHORT tempah,temp,i;
+   if(!(SiS_Pr->SiS_ChrontelInit)) {
+-     SiS_Pr->SiS_DDC_Index = 0x11;               /* TW: Bit 0 = SC;  Bit 1 = SD */
++     SiS_Pr->SiS_DDC_Index = 0x11;               /* Bit 0 = SC;  Bit 1 = SD */
+      SiS_Pr->SiS_DDC_Data  = 0x02;                 /* Bitmask in IndexReg for Data */
+      SiS_Pr->SiS_DDC_Clk   = 0x01;                 /* Bitmask in IndexReg for Clk */
+      SiS_Pr->SiS_DDC_DataShift = 0x00;
+-     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;          /* TW: DAB (Device Address Byte) */
++     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;          /* DAB (Device Address Byte) */
+   }
+-  for(i=0;i<10;i++) { /* TW: Do only 10 attempts to write */
++  for(i=0;i<10;i++) { /* Do only 10 attempts to write */
+     /* SiS_SetSwitchDDC2(SiS_Pr); */
+-    if(SiS_SetStart(SiS_Pr)) continue;                /* TW: Set start condition */
++    if(SiS_SetStart(SiS_Pr)) continue;                /* Set start condition */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: Write DAB (S0=0=write) */
+-    if(temp) continue;                                /* TW:    (ERROR: no ack) */
+-    tempah = tempbx & 0x00FF;                 /* TW: Write RAB */
+-    tempah |= 0x80;                             /* TW: (set bit 7, see datasheet) */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* Write DAB (S0=0=write) */
++    if(temp) continue;                                /*    (ERROR: no ack) */
++    tempah = tempbx & 0x00FF;                 /* Write RAB */
++    tempah |= 0x80;                             /* (set bit 7, see datasheet) */
+     temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-    if(temp) continue;                                /* TW:    (ERROR: no ack) */
++    if(temp) continue;                                /*    (ERROR: no ack) */
+     tempah = (tempbx & 0xFF00) >> 8;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: Write data */
+-    if(temp) continue;                                /* TW:    (ERROR: no ack) */
+-    if(SiS_SetStop(SiS_Pr)) continue;         /* TW: Set stop condition */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* Write data */
++    if(temp) continue;                                /*    (ERROR: no ack) */
++    if(SiS_SetStop(SiS_Pr)) continue;         /* Set stop condition */
+     SiS_Pr->SiS_ChrontelInit = 1;
+     return;
+   }
+-  /* TW: For 630ST */
++  /* For 630ST */
+   if(!(SiS_Pr->SiS_ChrontelInit)) {
+-     SiS_Pr->SiS_DDC_Index = 0x0a;            /* TW: Bit 7 = SC;  Bit 6 = SD */
++     SiS_Pr->SiS_DDC_Index = 0x0a;            /* Bit 7 = SC;  Bit 6 = SD */
+      SiS_Pr->SiS_DDC_Data  = 0x80;              /* Bitmask in IndexReg for Data */
+      SiS_Pr->SiS_DDC_Clk   = 0x40;              /* Bitmask in IndexReg for Clk */
+      SiS_Pr->SiS_DDC_DataShift = 0x00;
+-     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;       /* TW: DAB (Device Address Byte) */
++     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;       /* DAB (Device Address Byte) */
+-     for(i=0;i<10;i++) {      /* TW: Do only 10 attempts to write */
++     for(i=0;i<10;i++) {      /* Do only 10 attempts to write */
+        /* SiS_SetSwitchDDC2(SiS_Pr); */
+-       if (SiS_SetStart(SiS_Pr)) continue;    /* TW: Set start condition */
++       if (SiS_SetStart(SiS_Pr)) continue;    /* Set start condition */
+        tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);       /* TW: Write DAB (S0=0=write) */
+-       if(temp) continue;                     /* TW:    (ERROR: no ack) */
+-       tempah = tempbx & 0x00FF;              /* TW: Write RAB */
+-       tempah |= 0x80;                          /* TW: (set bit 7, see datasheet) */
++       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);       /* Write DAB (S0=0=write) */
++       if(temp) continue;                     /*    (ERROR: no ack) */
++       tempah = tempbx & 0x00FF;              /* Write RAB */
++       tempah |= 0x80;                          /* (set bit 7, see datasheet) */
+        temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-       if(temp) continue;                     /* TW:    (ERROR: no ack) */
++       if(temp) continue;                     /*    (ERROR: no ack) */
+        tempah = (tempbx & 0xFF00) >> 8;
+-       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);       /* TW: Write data */
+-       if(temp) continue;                     /* TW:    (ERROR: no ack) */
+-       if(SiS_SetStop(SiS_Pr)) continue;      /* TW: Set stop condition */
++       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);       /* Write data */
++       if(temp) continue;                     /*    (ERROR: no ack) */
++       if(SiS_SetStop(SiS_Pr)) continue;      /* Set stop condition */
+        SiS_Pr->SiS_ChrontelInit = 1;
+        return;
+     }
+   }
+ }
+-/* TW: Write to Chrontel 701x */
++/* Write to Chrontel 701x */
+ /* Parameter is [Data (S15-S8) | Register no (S7-S0)] */
+ void
+ SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempbx)
+ {
+   USHORT tempah,temp,i;
+-  SiS_Pr->SiS_DDC_Index = 0x11;                       /* TW: Bit 0 = SC;  Bit 1 = SD */
++  SiS_Pr->SiS_DDC_Index = 0x11;                       /* Bit 0 = SC;  Bit 1 = SD */
+   SiS_Pr->SiS_DDC_Data  = 0x08;                 /* Bitmask in IndexReg for Data */
+   SiS_Pr->SiS_DDC_Clk   = 0x04;                 /* Bitmask in IndexReg for Clk */
+   SiS_Pr->SiS_DDC_DataShift = 0x00;
+-  SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;                  /* TW: DAB (Device Address Byte) */
++  SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;                  /* DAB (Device Address Byte) */
+-  for(i=0;i<10;i++) { /* TW: Do only 10 attempts to write */
+-    if (SiS_SetStart(SiS_Pr)) continue;               /* TW: Set start condition */
++  for(i=0;i<10;i++) { /* Do only 10 attempts to write */
++    if (SiS_SetStart(SiS_Pr)) continue;               /* Set start condition */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: Write DAB (S0=0=write) */
+-    if(temp) continue;                                /* TW:    (ERROR: no ack) */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* Write DAB (S0=0=write) */
++    if(temp) continue;                                /*    (ERROR: no ack) */
+     tempah = tempbx & 0x00FF;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: Write RAB */
+-    if(temp) continue;                                /* TW:    (ERROR: no ack) */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* Write RAB */
++    if(temp) continue;                                /*    (ERROR: no ack) */
+     tempah = (tempbx & 0xFF00) >> 8;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: Write data */
+-    if(temp) continue;                                /* TW:    (ERROR: no ack) */
+-    if(SiS_SetStop(SiS_Pr)) continue;         /* TW: Set stop condition */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* Write data */
++    if(temp) continue;                                /*    (ERROR: no ack) */
++    if(SiS_SetStop(SiS_Pr)) continue;         /* Set stop condition */
+     return;
+   }
+ }
+-/* TW: Read from Chrontel 70xx */
++/* Read from Chrontel 70xx */
+ /* Parameter is [Register no (S7-S0)] */
+ USHORT
+ SiS_GetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx)
+ {
+-   if (SiS_Pr->SiS_IF_DEF_CH70xx == 1)
++   if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
+       return(SiS_GetCH700x(SiS_Pr,tempbx));
+    else
+       return(SiS_GetCH701x(SiS_Pr,tempbx));
+ }
+-/* TW: Read from Chrontel 700x */
++/* Read from Chrontel 700x */
+ /* Parameter is [Register no (S7-S0)] */
+ USHORT
+ SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempbx)
+@@ -9654,57 +9869,57 @@ SiS_GetCH700x(SiS_Private *SiS_Pr, USHOR
+   USHORT tempah,temp,i;
+   if(!(SiS_Pr->SiS_ChrontelInit)) {
+-     SiS_Pr->SiS_DDC_Index = 0x11;            /* TW: Bit 0 = SC;  Bit 1 = SD */
++     SiS_Pr->SiS_DDC_Index = 0x11;            /* Bit 0 = SC;  Bit 1 = SD */
+      SiS_Pr->SiS_DDC_Data  = 0x02;              /* Bitmask in IndexReg for Data */
+      SiS_Pr->SiS_DDC_Clk   = 0x01;              /* Bitmask in IndexReg for Clk */
+      SiS_Pr->SiS_DDC_DataShift = 0x00;
+-     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;               /* TW: DAB */
++     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;               /* DAB */
+   }
+   SiS_Pr->SiS_DDC_ReadAddr = tempbx;
+-  for(i=0;i<20;i++) { /* TW: Do only 20 attempts to read */
++  for(i=0;i<20;i++) { /* Do only 20 attempts to read */
+     /* SiS_SetSwitchDDC2(SiS_Pr); */
+-    if(SiS_SetStart(SiS_Pr)) continue;                /* TW: Set start condition */
++    if(SiS_SetStart(SiS_Pr)) continue;                /* Set start condition */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: Write DAB (S0=0=write) */
+-    if(temp) continue;                                /* TW:        (ERROR: no ack) */
+-    tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80; /* TW: Write RAB | 0x80 */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* Write DAB (S0=0=write) */
++    if(temp) continue;                                /*        (ERROR: no ack) */
++    tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80; /* Write RAB | 0x80 */
+     temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-    if(temp) continue;                                /* TW:        (ERROR: no ack) */
+-    if (SiS_SetStart(SiS_Pr)) continue;               /* TW: Re-start */
++    if(temp) continue;                                /*        (ERROR: no ack) */
++    if (SiS_SetStart(SiS_Pr)) continue;               /* Re-start */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01; /* DAB | 0x01 = Read */
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: DAB (S0=1=read) */
+-    if(temp) continue;                                /* TW:        (ERROR: no ack) */
+-    tempah = SiS_ReadDDC2Data(SiS_Pr,tempah); /* TW: Read byte */
+-    if (SiS_SetStop(SiS_Pr)) continue;                /* TW: Stop condition */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* DAB (S0=1=read) */
++    if(temp) continue;                                /*        (ERROR: no ack) */
++    tempah = SiS_ReadDDC2Data(SiS_Pr,tempah); /* Read byte */
++    if (SiS_SetStop(SiS_Pr)) continue;                /* Stop condition */
+     SiS_Pr->SiS_ChrontelInit = 1;
+     return(tempah);
+   }
+-  /* TW: For 630ST */
++  /* For 630ST */
+   if(!SiS_Pr->SiS_ChrontelInit) {
+-     SiS_Pr->SiS_DDC_Index = 0x0a;            /* TW: Bit 0 = SC;  Bit 1 = SD */
++     SiS_Pr->SiS_DDC_Index = 0x0a;            /* Bit 0 = SC;  Bit 1 = SD */
+      SiS_Pr->SiS_DDC_Data  = 0x80;              /* Bitmask in IndexReg for Data */
+      SiS_Pr->SiS_DDC_Clk   = 0x40;              /* Bitmask in IndexReg for Clk */
+      SiS_Pr->SiS_DDC_DataShift = 0x00;
+-     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;       /* TW: DAB (Device Address Byte) */
++     SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;       /* DAB (Device Address Byte) */
+-     for(i=0;i<20;i++) {      /* TW: Do only 20 attempts to read */
++     for(i=0;i<20;i++) {      /* Do only 20 attempts to read */
+        /* SiS_SetSwitchDDC2(SiS_Pr); */
+-       if(SiS_SetStart(SiS_Pr)) continue;             /* TW: Set start condition */
++       if(SiS_SetStart(SiS_Pr)) continue;             /* Set start condition */
+        tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);               /* TW: Write DAB (S0=0=write) */
+-       if(temp) continue;                             /* TW:        (ERROR: no ack) */
+-       tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80;      /* TW: Write RAB | 0x80 */
++       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);               /* Write DAB (S0=0=write) */
++       if(temp) continue;                             /*        (ERROR: no ack) */
++       tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80;      /* Write RAB | 0x80 */
+        temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-       if(temp) continue;                             /* TW:        (ERROR: no ack) */
+-       if (SiS_SetStart(SiS_Pr)) continue;            /* TW: Re-start */
++       if(temp) continue;                             /*        (ERROR: no ack) */
++       if (SiS_SetStart(SiS_Pr)) continue;            /* Re-start */
+        tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01;    /* DAB | 0x01 = Read */
+-       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);               /* TW: DAB (S0=1=read) */
+-       if(temp) continue;                             /* TW:        (ERROR: no ack) */
+-       tempah = SiS_ReadDDC2Data(SiS_Pr,tempah);      /* TW: Read byte */
+-       if (SiS_SetStop(SiS_Pr)) continue;             /* TW: Stop condition */
++       temp = SiS_WriteDDC2Data(SiS_Pr,tempah);               /* DAB (S0=1=read) */
++       if(temp) continue;                             /*        (ERROR: no ack) */
++       tempah = SiS_ReadDDC2Data(SiS_Pr,tempah);      /* Read byte */
++       if (SiS_SetStop(SiS_Pr)) continue;             /* Stop condition */
+        SiS_Pr->SiS_ChrontelInit = 1;
+        return(tempah);
+      }
+@@ -9712,52 +9927,51 @@ SiS_GetCH700x(SiS_Private *SiS_Pr, USHOR
+   return(0xFFFF);
+ }
+-/* TW: Read from Chrontel 701x */
++/* Read from Chrontel 701x */
+ /* Parameter is [Register no (S7-S0)] */
+ USHORT
+ SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempbx)
+ {
+   USHORT tempah,temp,i;
+-  SiS_Pr->SiS_DDC_Index = 0x11;                       /* TW: Bit 0 = SC;  Bit 1 = SD */
++  SiS_Pr->SiS_DDC_Index = 0x11;                       /* Bit 0 = SC;  Bit 1 = SD */
+   SiS_Pr->SiS_DDC_Data  = 0x08;                 /* Bitmask in IndexReg for Data */
+   SiS_Pr->SiS_DDC_Clk   = 0x04;                 /* Bitmask in IndexReg for Clk */
+   SiS_Pr->SiS_DDC_DataShift = 0x00;
+-  SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;          /* TW: DAB */
++  SiS_Pr->SiS_DDC_DeviceAddr = 0xEA;          /* DAB */
+   SiS_Pr->SiS_DDC_ReadAddr = tempbx;
+-   for(i=0;i<20;i++) {        /* TW: Do only 20 attempts to read */
+-    if(SiS_SetStart(SiS_Pr)) continue;                /* TW: Set start condition */
++   for(i=0;i<20;i++) {        /* Do only 20 attempts to read */
++    if(SiS_SetStart(SiS_Pr)) continue;                /* Set start condition */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: Write DAB (S0=0=write) */
+-    if(temp) continue;                                /* TW:        (ERROR: no ack) */
+-    tempah = SiS_Pr->SiS_DDC_ReadAddr;                /* TW: Write RAB */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* Write DAB (S0=0=write) */
++    if(temp) continue;                                /*        (ERROR: no ack) */
++    tempah = SiS_Pr->SiS_DDC_ReadAddr;                /* Write RAB */
+     temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+-    if(temp) continue;                                /* TW:        (ERROR: no ack) */
+-    if (SiS_SetStart(SiS_Pr)) continue;               /* TW: Re-start */
++    if(temp) continue;                                /*        (ERROR: no ack) */
++    if (SiS_SetStart(SiS_Pr)) continue;               /* Re-start */
+     tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01; /* DAB | 0x01 = Read */
+-    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* TW: DAB (S0=1=read) */
+-    if(temp) continue;                                /* TW:        (ERROR: no ack) */
+-    tempah = SiS_ReadDDC2Data(SiS_Pr,tempah); /* TW: Read byte */
+-    SiS_SetStop(SiS_Pr);                      /* TW: Stop condition */
++    temp = SiS_WriteDDC2Data(SiS_Pr,tempah);  /* DAB (S0=1=read) */
++    if(temp) continue;                                /*        (ERROR: no ack) */
++    tempah = SiS_ReadDDC2Data(SiS_Pr,tempah); /* Read byte */
++    SiS_SetStop(SiS_Pr);                      /* Stop condition */
+     return(tempah);
+    }
+   return 0xFFFF;
+ }
+-#ifdef LINUX_XF86
+-/* TW: Our own DDC functions */
++/* Our own DDC functions */
+ USHORT
+-SiS_InitDDCRegs(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT adaptnum, USHORT DDCdatatype,
+-              BOOLEAN checkcr32)
++SiS_InitDDCRegs(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++                USHORT adaptnum, USHORT DDCdatatype, BOOLEAN checkcr32)
+ {
+      unsigned char ddcdtype[] = { 0xa0, 0xa0, 0xa0, 0xa2, 0xa6 };
+      unsigned char flag, cr32;
+      USHORT        temp = 0, myadaptnum = adaptnum;
+      if(adaptnum != 0) {
+-        if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_302B))) return 0xFFFF;
+-      if((pSiS->VBFlags & VB_30xBDH) && (adaptnum == 1)) return 0xFFFF;
++        if(!(VBFlags & (VB_301|VB_301B|VB_302B))) return 0xFFFF;
++      if((VBFlags & VB_30xBDH) && (adaptnum == 1)) return 0xFFFF;
+      }        
+      
+      /* adapternum for SiS bridges: 0 = CRT1, 1 = LCD, 2 = VGA2 */
+@@ -9771,8 +9985,9 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+      flag = 0xff;
+      cr32 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x32);
+-  
+-     if(pSiS->VBFlags & VB_SISBRIDGE) {
++
++#if 0
++     if(VBFlags & VB_SISBRIDGE) {
+       if(myadaptnum == 0) {
+          if(!(cr32 & 0x20)) {
+             myadaptnum = 2;
+@@ -9785,18 +10000,19 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+          }
+         }
+      }
++#endif
+-     if(pSiS->VGAEngine == SIS_300_VGA) {             /* 300 series */
++     if(VGAEngine == SIS_300_VGA) {           /* 300 series */
+       
+         if(myadaptnum != 0) {
+          flag = 0;
+-         if(pSiS->VBFlags & VB_SISBRIDGE) {
++         if(VBFlags & VB_SISBRIDGE) {
+             SiS_Pr->SiS_DDC_Port = SiS_Pr->SiS_Part4Port;
+               SiS_Pr->SiS_DDC_Index = 0x0f;
+          }
+         }
+-      if(!(pSiS->VBFlags & VB_301)) {
++      if(!(VBFlags & VB_301)) {
+          if((cr32 & 0x80) && (checkcr32)) {
+               if(myadaptnum >= 1) {
+                if(!(cr32 & 0x08)) {
+@@ -9810,11 +10026,11 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+       temp = 4 - (myadaptnum * 2);
+       if(flag) temp = 0;
+-     } else {                                         /* 310/325/330 series */
++     } else {                                         /* 315/330 series */
+       /* here we simplify: 0 = CRT1, 1 = CRT2 (VGA, LCD) */
+       
+-      if(pSiS->VBFlags & VB_SISBRIDGE) {
++      if(VBFlags & VB_SISBRIDGE) {
+          if(myadaptnum == 2) {
+             myadaptnum = 1;
+            }
+@@ -9822,7 +10038,7 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+         if(myadaptnum == 1) {
+          flag = 0;
+-         if(pSiS->VBFlags & VB_SISBRIDGE) {
++         if(VBFlags & VB_SISBRIDGE) {
+             SiS_Pr->SiS_DDC_Port = SiS_Pr->SiS_Part4Port;
+               SiS_Pr->SiS_DDC_Index = 0x0f;
+          }
+@@ -9840,7 +10056,7 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+         temp = myadaptnum;
+         if(myadaptnum == 1) {
+            temp = 0;
+-         if(pSiS->VBFlags & VB_LVDS) flag = 0xff;
++         if(VBFlags & VB_LVDS) flag = 0xff;
+         }
+       if(flag) temp = 0;
+@@ -9852,7 +10068,7 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, SIS
+ #ifdef TWDEBUG
+     xf86DrvMsg(0, X_INFO, "DDC Port %x Index %x Shift %d\n",
+               SiS_Pr->SiS_DDC_Port, SiS_Pr->SiS_DDC_Index, temp);
+-#endif         
++#endif
+     
+     return 0;
+ }
+@@ -9862,15 +10078,9 @@ SiS_WriteDABDDC(SiS_Private *SiS_Pr)
+ {
+    if(SiS_SetStart(SiS_Pr)) return 0xFFFF;
+    if(SiS_WriteDDC2Data(SiS_Pr, SiS_Pr->SiS_DDC_DeviceAddr)) {
+-#ifdef TWDEBUG
+-        xf86DrvMsg(0, X_INFO, "WriteDAB 1 failed\n");
+-#endif         
+       return 0xFFFF;
+    }
+    if(SiS_WriteDDC2Data(SiS_Pr, SiS_Pr->SiS_DDC_SecAddr)) {
+-#ifdef TWDEBUG
+-        xf86DrvMsg(0, X_INFO, "WriteDAB 2 failed\n");
+-#endif         
+       return 0xFFFF;
+    }
+    return(0);
+@@ -9881,9 +10091,6 @@ SiS_PrepareReadDDC(SiS_Private *SiS_Pr)
+ {
+    if(SiS_SetStart(SiS_Pr)) return 0xFFFF;
+    if(SiS_WriteDDC2Data(SiS_Pr, (SiS_Pr->SiS_DDC_DeviceAddr | 0x01))) {
+-#ifdef TWDEBUG
+-        xf86DrvMsg(0, X_INFO, "PrepareReadDDC 1 failed\n");
+-#endif         
+       return 0xFFFF;
+    }
+    return(0);
+@@ -9921,9 +10128,6 @@ SiS_DoProbeDDC(SiS_Private *SiS_Pr)
+     SiS_SetSwitchDDC2(SiS_Pr);
+     if(SiS_PrepareDDC(SiS_Pr)) {
+          SiS_SetStop(SiS_Pr);
+-#ifdef TWDEBUG
+-       xf86DrvMsg(0, X_INFO, "DoProbeDDC 1 failed at PrepareDDC\n");
+-#endif         
+          return(0xFFFF);
+     }
+     mask = 0xf0;
+@@ -9972,7 +10176,7 @@ SiS_ProbeDDC(SiS_Private *SiS_Pr)
+ }
+ USHORT
+-SiS_ReadDDC(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT DDCdatatype, unsigned char *buffer)
++SiS_ReadDDC(SiS_Private *SiS_Pr, USHORT DDCdatatype, unsigned char *buffer)
+ {
+    USHORT flag, length, i;
+    unsigned char chksum,gotcha;
+@@ -10004,28 +10208,7 @@ SiS_ReadDDC(SiS_Private *SiS_Pr, SISPtr 
+    return(flag);
+ }
+-USHORT
+-SiS_ReadLCDDDC(SiS_Private *SiS_Pr, USHORT length, unsigned char *buffer)
+-{
+-   USHORT i=0, flag=0;
+-
+-   length--;
+-   
+-   SiS_SetSwitchDDC2(SiS_Pr);
+-   if(!(SiS_PrepareDDC(SiS_Pr))) {
+-      for(i=0; i<length; i++) {
+-         buffer[i] = (unsigned char)SiS_ReadDDC2Data(SiS_Pr, 0);
+-         SiS_SendACK(SiS_Pr, 0);
+-      }
+-      buffer[i] = (unsigned char)SiS_ReadDDC2Data(SiS_Pr, 0);
+-      SiS_SendACK(SiS_Pr, 1);
+-   } else flag = 0xFFFF;
+-   
+-   SiS_SetStop(SiS_Pr);
+-   return(0);
+-}
+-
+-/* TW: Our private DDC function
++/* Our private DDC functions
+    It complies somewhat with the corresponding VESA function
+    in arguments and return values.
+@@ -10036,7 +10219,7 @@ SiS_ReadLCDDDC(SiS_Private *SiS_Pr, USHO
+    Arguments:
+        adaptnum: 0=CRT1, 1=LCD, 2=VGA2
+-                 CRT2 DDC is only supported on SiS301, 301B (non-DH version), 302B.
++                 CRT2 DDC is only supported on SiS301, 301B, 302B.
+        DDCdatatype: 0=Probe, 1=EDID, 2=EDID+VDIF, 3=EDID V2 (P&D), 4=EDID V2 (FPDI-2)
+        buffer: ptr to 256 data bytes which will be filled with read data.
+@@ -10046,43 +10229,48 @@ SiS_ReadLCDDDC(SiS_Private *SiS_Pr, USHO
+  */
+ USHORT
+-SiS_HandleDDC(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT adaptnum,
+-              USHORT DDCdatatype, unsigned char *buffer)
++SiS_HandleDDC(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++              USHORT adaptnum, USHORT DDCdatatype, unsigned char *buffer)
+ {
+    if(adaptnum > 2) return 0xFFFF;
+    if(DDCdatatype > 4) return 0xFFFF;
+-   if((!(pSiS->VBFlags & VB_VIDEOBRIDGE)) && (adaptnum > 0)) return 0xFFFF;
+-   if(SiS_InitDDCRegs(SiS_Pr, pSiS, adaptnum, DDCdatatype, TRUE) == 0xFFFF) return 0xFFFF;
++   if((!(VBFlags & VB_VIDEOBRIDGE)) && (adaptnum > 0)) return 0xFFFF;
++   if(SiS_InitDDCRegs(SiS_Pr, VBFlags, VGAEngine, adaptnum, DDCdatatype, TRUE) == 0xFFFF) return 0xFFFF;
+    if(DDCdatatype == 0) {
+        return(SiS_ProbeDDC(SiS_Pr));
+    } else {
+-       return(SiS_ReadDDC(SiS_Pr, pSiS, DDCdatatype, buffer));
++       return(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer));
+    }
+ }
++#ifdef LINUX_XF86
+ /* Sense the LCD parameters (CR36, CR37) via DDC */
+ /* SiS30x(B) only */
+ USHORT
+ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
+ {
+-   USHORT DDCdatatype, paneltype, flag, xres, yres;
++   USHORT DDCdatatype, paneltype, flag, xres=0, yres=0;
+    USHORT index, myindex, lumsize, numcodes;
+    unsigned char cr37=0, seekcode;
+    BOOLEAN checkexpand = FALSE;
+    int retry, i;
+    unsigned char buffer[256];
+-   
++
++   for(i=0; i<7; i++) SiS_Pr->CP_DataValid[i] = FALSE;
++   SiS_Pr->CP_HaveCustomData = FALSE;
++   SiS_Pr->CP_MaxX = SiS_Pr->CP_MaxY = SiS_Pr->CP_MaxClock = 0;
++
+    if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_302B))) return 0;
+    if(pSiS->VBFlags & VB_30xBDH) return 0;
+   
+-   if(SiS_InitDDCRegs(SiS_Pr, pSiS, 1, 0, FALSE) == 0xFFFF) return 0;
++   if(SiS_InitDDCRegs(SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, 1, 0, FALSE) == 0xFFFF) return 0;
+    
+    SiS_Pr->SiS_DDC_SecAddr = 0x00;
+    
+    /* Probe supported DA's */
+    flag = SiS_ProbeDDC(SiS_Pr);
+ #ifdef TWDEBUG   
+-   xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO, 
++   xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
+       "CRT2 DDC capabilities 0x%x\n", flag);
+ #endif        
+    if(flag & 0x10) {
+@@ -10099,7 +10287,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+    /* Read the entire EDID */
+    retry = 2;
+    do {
+-      if(SiS_ReadDDC(SiS_Pr, pSiS, DDCdatatype, buffer)) {
++      if(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer)) {
+          xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO, 
+               "CRT2: DDC read failed (attempt %d), %s\n", 
+               (3-retry), (retry == 1) ? "giving up" : "retrying");
+@@ -10132,7 +10320,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+       }
+       
+       if((buffer[0x18] & 0x18) != 0x08) {
+-         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED, 
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
+               "CRT2: Attached display is not of RGB but of %s type (0x%02x)\n", 
+               ((buffer[0x18] & 0x18) == 0x00) ? "monochrome/greyscale" :
+                 ( ((buffer[0x18] & 0x18) == 0x10) ? "non-RGB multicolor" : 
+@@ -10140,103 +10328,226 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+               buffer[0x18]);
+        return 0;
+       }
+-      
+-      /* Now analyze the first Detailed Timing Block and hope
+-       * that the preferred timing mode is stored there.
+-       */     
+-      xres = buffer[0x38] | ((buffer[0x3a] & 0xf0) << 4);
+-      yres = buffer[0x3b] | ((buffer[0x3d] & 0xf0) << 4);
++
++      /* Now analyze the first Detailed Timing Block and see
++       * if the preferred timing mode is stored there. If so,
++       * check if this is a standard panel for which we already
++       * know the timing.
++       */
++
++      paneltype = Panel_Custom;
+       checkexpand = FALSE;
+-      switch(xres) {
+-         case 800:
+-           if(yres == 600) {
+-              paneltype = Panel310_800x600;
+-              checkexpand = TRUE;
+-           }
+-           break;
+-         case 1024:
+-           if(yres == 768) {
+-              paneltype = Panel310_1024x768;
+-              checkexpand = FALSE;    /* expand causes error at 640x480, should otherwise be TRUE; */
+-           }
+-           break;
+-       case 1280:
+-           if(yres == 960) {
+-              if(pSiS->VGAEngine == SIS_300_VGA) {
+-                 paneltype = Panel300_1280x960;
+-              } else {
+-                 paneltype = Panel310_1280x960; 
+-              }
+-           } else if(yres == 1024) {
+-              paneltype = Panel310_1280x1024;  
+-              checkexpand = TRUE;
+-           } else if(pSiS->VGAEngine == SIS_315_VGA) {
++
++      if(buffer[0x18] & 0x02) {
++
++         xres = buffer[0x38] | ((buffer[0x3a] & 0xf0) << 4);
++         yres = buffer[0x3b] | ((buffer[0x3d] & 0xf0) << 4);
++
++       SiS_Pr->CP_PreferredX = xres;
++       SiS_Pr->CP_PreferredY = yres;
++
++         switch(xres) {
++            case 800:
++              if(yres == 600) {
++                 paneltype = Panel_800x600;
++                 checkexpand = TRUE;
++              }
++              break;
++            case 1024:
+               if(yres == 768) {
+-                 paneltype = Panel310_1280x768;       /* Panel size 1280x768 not supported yet */
+-                 checkexpand = TRUE;  
+-              }       
+-           }
+-           break;
+-       case 1400:
+-           if(pSiS->VGAEngine == SIS_315_VGA) {
+-              if(yres == 1050) {
+-                 paneltype = Panel310_1400x1050;
+-                 checkexpand = TRUE; 
+-              } 
+-           }
+-                   break;
+-       case 1600:
+-           if(pSiS->VGAEngine == SIS_315_VGA) {
+-              if(yres == 1200) {
+-                 paneltype = Panel310_1600x1200;
++                 paneltype = Panel_1024x768;
++                 checkexpand = TRUE;
++              }
++              break;
++          case 1280:
++              if(yres == 1024) {
++                 paneltype = Panel_1280x1024;
+                  checkexpand = TRUE;
+-              } 
+-           }
+-                   break;
++              } else if(yres == 960) {
++                 if(pSiS->VGAEngine == SIS_300_VGA) {
++                    paneltype = Panel300_1280x960;
++                 } else {
++                    paneltype = Panel310_1280x960;
++                 }
++              } else if(yres == 768) {
++                 paneltype = Panel_1280x768;
++                 checkexpand = FALSE;
++                 cr37 |= 0x10;
++              }
++              break;
++          case 1400:
++              if(pSiS->VGAEngine == SIS_315_VGA) {
++                 if(yres == 1050) {
++                    paneltype = Panel310_1400x1050;
++                    checkexpand = TRUE;
++                 }
++              }
++                      break;
++#if 0     /* Treat this as custom, as we have no valid timing data yet */
++          case 1600:
++              if(pSiS->VGAEngine == SIS_315_VGA) {
++                 if(yres == 1200) {
++                    paneltype = Panel310_1600x1200;
++                    checkexpand = TRUE;
++                 }
++              }
++                      break;
++#endif
++         }
++
++       if(paneltype != Panel_Custom) {
++          if((buffer[0x47] & 0x18) == 0x18) {
++             cr37 |= ((((buffer[0x47] & 0x06) ^ 0x06) << 5) | 0x20);
++          } else {
++             /* What now? There is no digital separate output timing... */
++             xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
++                 "CRT2: Unable to retrieve Sync polarity information\n");
++          }
++       }
++
+       }
+-      if(buffer[0x18] & 0x02) {
+-         /* If the preferred timing mode is stored in the first
+-        * detailed timing block, we now can extract the sync
+-        * polarisation information as well. This only works
+-        * if the Flags indicate a digital separate output.
+-        */
+-        if((buffer[0x47] & 0x18) == 0x18) {
+-           cr37 |= ((((buffer[0x47] & 0x06) ^ 0x06) << 5) | 0x20);
+-        } else {
+-           /* What now? There is no digital separate output timing... */
+-           xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING, 
+-              "CRT2: Unable to retrieve Sync polarity information\n");
+-        }
+-        
+-      } else {
+-         /* If the preferred timing mode is *not* stored in the first
+-        * detailed timing block, we need to guess the resolution
+-        * from the supported Established Timings and assume the
+-        * default sync polarity
+-        */
++      /* If we still don't know what panel this is, we take it
++       * as a custom panel and derive the timing data from the
++       * detailed timing blocks
++       */
++      if(paneltype == Panel_Custom) {
++
++         BOOLEAN havesync = FALSE;
++       int i, temp, base = 0x36;
++       unsigned long estpack;
++       unsigned short estx[] = {
++              720, 720, 640, 640, 640, 640, 800, 800,
++              800, 800, 832,1024,1024,1024,1024,1280,
++              1152
++       };
++       unsigned short esty[] = {
++              400, 400, 480, 480, 480, 480, 600, 600,
++              600, 600, 624, 768, 768, 768, 768,1024,
++              870
++       };
++
+        paneltype = 0;
+-       if(buffer[0x24] & 0x01) {      
+-              paneltype = Panel310_1280x1024;
+-              checkexpand = TRUE;
+-              cr37 |= 0x20;
+-       } else if(buffer[0x24] & 0x0e) {
+-              paneltype = Panel310_1024x768;
+-              cr37 |= 0xe0;
+-              checkexpand = FALSE;            /* Bug at 640x480 */
+-       } else if(buffer[0x23] & 0x01) {
+-              paneltype = Panel310_800x600;
+-              cr37 |= 0xe0;
+-              checkexpand = TRUE;
+-         }
++
++       /* Find the maximum resolution */
++
++       /* 1. From Established timings */
++       estpack = (buffer[0x23] << 9) | (buffer[0x24] << 1) | ((buffer[0x25] >> 7) & 0x01);
++       for(i=16; i>=0; i--) {
++           if(estpack & (1 << i)) {
++              if(estx[16 - i] > SiS_Pr->CP_MaxX) SiS_Pr->CP_MaxX = estx[16 - i];
++              if(esty[16 - i] > SiS_Pr->CP_MaxY) SiS_Pr->CP_MaxY = esty[16 - i];
++           }
++       }
++
++       /* 2. From Standard Timings */
++       for(i=0x26; i < 0x36; i+=2) {
++          if((buffer[i] != 0x01) && (buffer[i+1] != 0x01)) {
++             temp = (buffer[i] + 31) * 8;
++             if(temp > SiS_Pr->CP_MaxX) SiS_Pr->CP_MaxX = temp;
++             switch((buffer[i+1] & 0xc0) >> 6) {
++             case 0x03: temp = temp * 9 / 16; break;
++             case 0x02: temp = temp * 4 / 5;  break;
++             case 0x01: temp = temp * 3 / 4;  break;
++             }
++             if(temp > SiS_Pr->CP_MaxY) SiS_Pr->CP_MaxY = temp;
++          }
++       }
++
++       /* Now extract the Detailed Timings and convert them into modes */
++
++         for(i = 0; i < 4; i++, base += 18) {
++
++          /* Is this a detailed timing block or a monitor descriptor? */
++          if(buffer[base] || buffer[base+1] || buffer[base+2]) {
++
++                     xres = buffer[base+2] | ((buffer[base+4] & 0xf0) << 4);
++               yres = buffer[base+5] | ((buffer[base+7] & 0xf0) << 4);
++
++             SiS_Pr->CP_HDisplay[i] = xres;
++             SiS_Pr->CP_HSyncStart[i] = xres + (buffer[base+8] | ((buffer[base+11] & 0xc0) << 2));
++               SiS_Pr->CP_HSyncEnd[i]   = SiS_Pr->CP_HSyncStart[i] + (buffer[base+9] | ((buffer[base+11] & 0x30) << 4));
++             SiS_Pr->CP_HTotal[i] = xres + (buffer[base+3] | ((buffer[base+4] & 0x0f) << 8));
++             SiS_Pr->CP_HBlankStart[i] = xres + 1;
++             SiS_Pr->CP_HBlankEnd[i] = SiS_Pr->CP_HTotal[i];
++
++             SiS_Pr->CP_VDisplay[i] = yres;
++               SiS_Pr->CP_VSyncStart[i] = yres + (((buffer[base+10] & 0xf0) >> 4) | ((buffer[base+11] & 0x0c) << 2));
++               SiS_Pr->CP_VSyncEnd[i] = SiS_Pr->CP_VSyncStart[i] + ((buffer[base+10] & 0x0f) | ((buffer[base+11] & 0x03) << 4));
++             SiS_Pr->CP_VTotal[i] = yres + (buffer[base+6] | ((buffer[base+7] & 0x0f) << 8));
++             SiS_Pr->CP_VBlankStart[i] = yres + 1;
++             SiS_Pr->CP_VBlankEnd[i] = SiS_Pr->CP_VTotal[i];
++
++             SiS_Pr->CP_Clock[i] = (buffer[base] | (buffer[base+1] << 8)) * 10;
++
++             SiS_Pr->CP_DataValid[i] = TRUE;
++
++             /* Sort out invalid timings, interlace and too high clocks */
++             if((SiS_Pr->CP_HDisplay[i] > SiS_Pr->CP_HSyncStart[i])  ||
++                (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HSyncEnd[i])   ||
++                (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HTotal[i])     ||
++                (SiS_Pr->CP_HSyncStart[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
++                (SiS_Pr->CP_HSyncStart[i] > SiS_Pr->CP_HTotal[i])    ||
++                (SiS_Pr->CP_HSyncEnd[i] > SiS_Pr->CP_HTotal[i])      ||
++                (SiS_Pr->CP_VDisplay[i] > SiS_Pr->CP_VSyncStart[i])  ||
++                (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VSyncEnd[i])   ||
++                (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VTotal[i])     ||
++                (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i])  ||
++                (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i])    ||
++                (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i])      ||
++                (SiS_Pr->CP_Clock[i] > 108000)                       ||
++                (buffer[base+17] & 0x80)) {
++
++                SiS_Pr->CP_DataValid[i] = FALSE;
++
++             } else {
++
++                paneltype = Panel_Custom;
++
++                SiS_Pr->CP_HaveCustomData = TRUE;
++
++                if(xres > SiS_Pr->CP_MaxX) SiS_Pr->CP_MaxX = xres;
++                if(yres > SiS_Pr->CP_MaxY) SiS_Pr->CP_MaxY = yres;
++                if(SiS_Pr->CP_Clock[i] > SiS_Pr->CP_MaxClock) SiS_Pr->CP_MaxClock = SiS_Pr->CP_Clock[i];
++
++                SiS_Pr->CP_Vendor = buffer[9] | (buffer[8] << 8);
++                SiS_Pr->CP_Product = buffer[10] | (buffer[11] << 8);
++
++                /* We must assume the panel can scale, since we have
++                 * no scaling data
++                 */
++                checkexpand = FALSE;
++                cr37 |= 0x10;
++
++                /* Extract the sync polarisation information. This only works
++                 * if the Flags indicate a digital separate output.
++                 */
++                if((buffer[base+17] & 0x18) == 0x18) {
++                   SiS_Pr->CP_HSync_P[i] = (buffer[base+17] & 0x02) ? TRUE : FALSE;
++                   SiS_Pr->CP_VSync_P[i] = (buffer[base+17] & 0x04) ? TRUE : FALSE;
++                   SiS_Pr->CP_SyncValid[i] = TRUE;
++                   if(!havesync) {
++                      cr37 |= ((((buffer[base+17] & 0x06) ^ 0x06) << 5) | 0x20);
++                      havesync = TRUE;
++                   }
++                } else {
++                   SiS_Pr->CP_SyncValid[i] = FALSE;
++                }
++             }
++            }
++       }
++       if(!havesync) {
++          xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
++                 "CRT2: Unable to retrieve Sync polarity information\n");
++       }
+       }
+-      
+-      if(checkexpand) {
+-         /* If any of the Established low-res modes is supported, the 
++
++      if(paneltype && checkexpand) {
++         /* If any of the Established low-res modes is supported, the
+         * panel can scale automatically. For 800x600 panels, we only 
+         * check the even lower ones.
+         */
+-       if(paneltype == Panel310_800x600) {
++       if(paneltype == Panel_800x600) {
+           if(buffer[0x23] & 0xfc) cr37 |= 0x10;
+        } else {
+             if(buffer[0x23])      cr37 |= 0x10;
+@@ -10262,20 +10573,31 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+               buffer[0x41]);
+        return 0;
+       }
+-   
+-      xres = buffer[0x76] | (buffer[0x77] << 8);
+-      yres = buffer[0x78] | (buffer[0x79] << 8);
++
++      paneltype = Panel_Custom;
++      SiS_Pr->CP_MaxX = xres = buffer[0x76] | (buffer[0x77] << 8);
++      SiS_Pr->CP_MaxY = yres = buffer[0x78] | (buffer[0x79] << 8);
+       switch(xres) {
+          case 800:
+            if(yres == 600) {
+-              paneltype = Panel310_800x600;
++              paneltype = Panel_800x600;
+               checkexpand = TRUE;
+            }
+            break;
+          case 1024:
+            if(yres == 768) {
+-              paneltype = Panel310_1024x768;
+-              checkexpand = FALSE;                    /* Bug at 640x480; we do the scaling ourselves */
++              paneltype = Panel_1024x768;
++              checkexpand = TRUE;
++           }
++           break;
++       case 1152:
++           if(yres == 768) {
++              if(pSiS->VGAEngine == SIS_300_VGA) {
++                 paneltype = Panel300_1152x768;
++              } else {
++                 paneltype = Panel310_1152x768;
++              }
++              checkexpand = TRUE;
+            }
+            break;
+        case 1280:
+@@ -10286,45 +10608,46 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+                  paneltype = Panel300_1280x960;
+               }
+            } else if(yres == 1024) {
+-              paneltype = Panel310_1280x1024;  
++              paneltype = Panel_1280x1024;
+               checkexpand = TRUE;
+-           } else if(pSiS->VGAEngine == SIS_315_VGA) {
+-              if(yres == 768) {
+-                 paneltype = Panel310_1280x768;       /* Panel size 1280x768 not supported yet */
+-                 checkexpand = TRUE;
+-              }
+-           } 
++           } else if(yres == 768) {
++              paneltype = Panel_1280x768;
++              checkexpand = FALSE;
++              cr37 |= 0x10;
++           }
+            break;
+        case 1400:
+            if(pSiS->VGAEngine == SIS_315_VGA) {
+               if(yres == 1050) {
+                  paneltype = Panel310_1400x1050;
+                  checkexpand = TRUE;
+-              } 
++              }
+            }
+                    break;
++#if 0    /* Treat this one as custom since we have no timing data yet */
+        case 1600:
+            if(pSiS->VGAEngine == SIS_315_VGA) {
+               if(yres == 1200) {
+                  paneltype = Panel310_1600x1200;
+                  checkexpand = TRUE;
+-              } 
++              }
+            }
+                    break;
++#endif
+       }
+-                 
++
+       /* Determine if RGB18 or RGB24 */
+       if(index) {
+          if((buffer[index] == 0x20) || (buffer[index] == 0x34)) {
+           cr37 |= 0x01;
+        }
+       }
+-      
++
+       if(checkexpand) {
+          /* TODO - for now, we let the panel scale */
+        cr37 |= 0x10;
+       }
+-     
++
+       /* Now seek 4-Byte Timing codes and extract sync pol info */
+       index = 0x80;
+       if(buffer[0x7e] & 0x20) {                           /* skip Luminance Table (if provided) */
+@@ -10346,28 +10669,117 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SIS
+        if(buffer[myindex] == seekcode) {
+           cr37 |= ((((buffer[myindex + 1] & 0x0c) ^ 0x0c) << 4) | 0x20);
+        } else {
+-          xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING, 
+-              "CRT2: Unable to retrieve Sync polarity information\n");    
++          xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
++              "CRT2: Unable to retrieve Sync polarity information\n");
+        }
+       } else {
+-         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING, 
+-              "CRT2: Unable to retrieve Sync polarity information\n");
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
++           "CRT2: Unable to retrieve Sync polarity information\n");
++      }
++
++      /* Now seek the detailed timing descriptions for custom panels */
++      if(paneltype == Panel_Custom) {
++         index += (numcodes * 4);
++       numcodes = buffer[0x7f] & 0x07;
++       for(i=0; i<numcodes; i++) {
++          xres = buffer[index+2] | ((buffer[index+4] & 0xf0) << 4);
++            yres = buffer[index+5] | ((buffer[index+7] & 0xf0) << 4);
++
++          SiS_Pr->CP_HDisplay[i] = xres;
++          SiS_Pr->CP_HSyncStart[i] = xres + (buffer[index+8] | ((buffer[index+11] & 0xc0) << 2));
++            SiS_Pr->CP_HSyncEnd[i] = SiS_Pr->CP_HSyncStart[i] + (buffer[index+9] | ((buffer[index+11] & 0x30) << 4));
++          SiS_Pr->CP_HTotal[i] = xres + (buffer[index+3] | ((buffer[index+4] & 0x0f) << 8));
++          SiS_Pr->CP_HBlankStart[i] = xres + 1;
++          SiS_Pr->CP_HBlankEnd[i] = SiS_Pr->CP_HTotal[i];
++
++          SiS_Pr->CP_VDisplay[i] = yres;
++            SiS_Pr->CP_VSyncStart[i] = yres + (((buffer[index+10] & 0xf0) >> 4) | ((buffer[index+11] & 0x0c) << 2));
++            SiS_Pr->CP_VSyncEnd[i] = SiS_Pr->CP_VSyncStart[i] + ((buffer[index+10] & 0x0f) | ((buffer[index+11] & 0x03) << 4));
++          SiS_Pr->CP_VTotal[i] = yres + (buffer[index+6] | ((buffer[index+7] & 0x0f) << 8));
++          SiS_Pr->CP_VBlankStart[i] = yres + 1;
++          SiS_Pr->CP_VBlankEnd[i] = SiS_Pr->CP_VTotal[i];
++
++          SiS_Pr->CP_Clock[i] = (buffer[index] | (buffer[index+1] << 8)) * 10;
++
++          SiS_Pr->CP_DataValid[i] = TRUE;
++
++          if((SiS_Pr->CP_HDisplay[i] > SiS_Pr->CP_HSyncStart[i])  ||
++             (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HSyncEnd[i])   ||
++             (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HTotal[i])     ||
++             (SiS_Pr->CP_HSyncStart[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
++             (SiS_Pr->CP_HSyncStart[i] > SiS_Pr->CP_HTotal[i])    ||
++             (SiS_Pr->CP_HSyncEnd[i] > SiS_Pr->CP_HTotal[i])      ||
++             (SiS_Pr->CP_VDisplay[i] > SiS_Pr->CP_VSyncStart[i])  ||
++             (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VSyncEnd[i])   ||
++             (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VTotal[i])     ||
++             (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i])  ||
++             (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i])    ||
++             (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i])      ||
++             (SiS_Pr->CP_Clock[i] > 108000)                       ||
++             (buffer[index + 17] & 0x80)) {
++
++             SiS_Pr->CP_DataValid[i] = FALSE;
++
++          } else {
++
++             SiS_Pr->CP_HaveCustomData = TRUE;
++
++             if(SiS_Pr->CP_Clock[i] > SiS_Pr->CP_MaxClock) SiS_Pr->CP_MaxClock = SiS_Pr->CP_Clock[i];
++
++             SiS_Pr->CP_HSync_P[i] = (buffer[index + 17] & 0x02) ? TRUE : FALSE;
++             SiS_Pr->CP_VSync_P[i] = (buffer[index + 17] & 0x04) ? TRUE : FALSE;
++             SiS_Pr->CP_SyncValid[i] = TRUE;
++
++             SiS_Pr->CP_Vendor = buffer[2] | (buffer[1] << 8);
++             SiS_Pr->CP_Product = buffer[3] | (buffer[4] << 8);
++
++             /* We must assume the panel can scale, since we have
++              * no scaling data
++              */
++             cr37 |= 0x10;
++
++          }
++       }
++
+       }
+       break;
+-     
++
+    }
+-   
++
+    /* 1280x960 panels are always RGB24, unable to scale and use
+     * high active sync polarity
+     */
+    if(pSiS->VGAEngine == SIS_315_VGA) {
+-      if(paneltype == Panel310_1280x960) cr37 &= 0x0e; 
++      if(paneltype == Panel310_1280x960) cr37 &= 0x0e;
+    } else {
+-      if(paneltype == Panel300_1280x960) cr37 &= 0x0e; 
++      if(paneltype == Panel300_1280x960) cr37 &= 0x0e;
+    }
+-   
++
++   for(i = 0; i < 7; i++) {
++      if(SiS_Pr->CP_DataValid[i]) {
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
++            "Non-standard LCD timing data no. %d:\n", i);
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
++          "   HDisplay %d HSync %d HSyncEnd %d HTotal %d\n",
++          SiS_Pr->CP_HDisplay[i], SiS_Pr->CP_HSyncStart[i],
++          SiS_Pr->CP_HSyncEnd[i], SiS_Pr->CP_HTotal[i]);
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
++            "   VDisplay %d VSync %d VSyncEnd %d VTotal %d\n",
++            SiS_Pr->CP_VDisplay[i], SiS_Pr->CP_VSyncStart[i],
++          SiS_Pr->CP_VSyncEnd[i], SiS_Pr->CP_VTotal[i]);
++         xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
++          "   Pixel clock: %3.3fMhz\n", (float)SiS_Pr->CP_Clock[i] / 1000);
++       xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
++          "   To use this, add \"%dx%d\" to the list of Modes in the Display section\n",
++          SiS_Pr->CP_HDisplay[i],
++          SiS_Pr->CP_VDisplay[i]);
++      }
++   }
++
+    if(paneltype) {
++       if(!SiS_Pr->CP_PreferredX) SiS_Pr->CP_PreferredX = SiS_Pr->CP_MaxX;
++       if(!SiS_Pr->CP_PreferredY) SiS_Pr->CP_PreferredY = SiS_Pr->CP_MaxY;
+        cr37 &= 0xf1;
+        cr37 |= 0x02;    /* SiS301 */
+        SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x36,0xf0,paneltype);
+@@ -10392,7 +10804,7 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SI
+    if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_302B))) return 0;
+ /* if(pSiS->VBFlags & VB_30xBDH) return 0;  */
+    
+-   if(SiS_InitDDCRegs(SiS_Pr, pSiS, 2, 0, FALSE) == 0xFFFF) return 0;
++   if(SiS_InitDDCRegs(SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, 2, 0, FALSE) == 0xFFFF) return 0;
+    
+    SiS_Pr->SiS_DDC_SecAddr = 0x00;
+    
+@@ -10416,7 +10828,7 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SI
+    /* Read the entire EDID */
+    retry = 2;
+    do {
+-      if(SiS_ReadDDC(SiS_Pr, pSiS, DDCdatatype, buffer)) {
++      if(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer)) {
+          xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO, 
+               "CRT2: DDC read failed (attempt %d), %s\n", 
+               (3-retry), (retry == 1) ? "giving up" : "retrying");
+@@ -10435,6 +10847,8 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SI
+               "CRT2: Attached display expects digital input\n");
+                 return 0;     
+       }
++      SiS_Pr->CP_Vendor = buffer[9] | (buffer[8] << 8);
++      SiS_Pr->CP_Product = buffer[10] | (buffer[11] << 8);
+       foundcrt = TRUE;
+       break;
+    case 3:
+@@ -10448,198 +10862,19 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SI
+               buffer[0x41]);
+         return 0;
+       }
++      SiS_Pr->CP_Vendor = buffer[2] | (buffer[1] << 8);
++      SiS_Pr->CP_Product = buffer[3] | (buffer[4] << 8);
+       foundcrt = TRUE;
+-      break;    
++      break;
+    }
+-   
++
+    if(foundcrt) {
+        SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x32,0x10);
+    }
+    return(0);
+ }
+-#if 0
+-   /* ----- */
+-USHORT
+-SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
+-{
+-   USHORT DDCdatatype, paneltype, flag;
+-   unsigned char cr36=0, cr37=0;
+-   unsigned char tempal, tempah, tempbl, tempbh;
+-   USHORT tempax, tempbx, tempcx, push1, push2, push3;
+-   unsigned char addresstable[] = { 0x00, 0x22, 0x30, 0x40 };
+-   int i;
+-   unsigned char buffer[256];
+-   
+-   if(pSiS->VGAEngine != SIS_315_VGA) return 0xFFFF;
+-   if(!(pSiS->VBFlags & (VB_301B|VB_302B))) return 0xFFFF;
+-   
+-   if(SiS_InitDDCRegs(SiS_Pr, pSiS, 1, 0, FALSE) == 0xFFFF) return 0xFFFF;   
+-   
+-   flag = SiS_ProbeDDC(SiS_Pr);
+-   if(flag & 0x02) {
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;      /* EDID V1 */
+-      DDCdatatype = 1;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x3a;
+-   } else if(flag & 0x08) {
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa2;      /* EDID V2 (P&D-D Monitor) */
+-      DDCdatatype = 3;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x76;
+-   } else if(flag & 0x10) {
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa6;      /* EDID V2 (FP) */
+-      DDCdatatype = 4;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x76;
+-   } else return 0xFFFF;
+-   
+-   
+-   SiS_ReadLCDDDC(SiS_Pr, 4, buffer);
+-   tempbl = buffer[0];  /* 3a - 76 */
+-   tempbh = buffer[1];  /* 3b - 77 */
+-   
+-   if(SiS_Pr->SiS_DDC_DeviceAddr == 0xa0) {
+-   
+-      /* Read and analyze EDID V1 (res) */
+-   
+-      tempah = 0x02;                          /* 1024x768 by default */
+-      tempbl &= 0xf0;
+-      if(tempbl != 0x40) {                    
+-         tempah = 0x03;                               /* 1280x1024 by default */
+-       if(tempbl == 0x50) {
+-          if(!tempbh) {
+-             tempbh = buffer[3] & 0xf0;
+-             if(tempbh == 0x30) {
+-                 SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
+-                         SiS_Pr->SiS_DDC_SecAddr = 0x23;
+-                 SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-                 tempbl = buffer[0];  /* 0x23 */
+-                 tempbh = buffer[1];  /* 0x24 */
+-                 if(tempbl) cr37 |= 0x10;
+-                 tempah = 0x0a;               /* 1280x768 */
+-             }
+-             if(tempbh == 0x40) {
+-                 SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
+-                         SiS_Pr->SiS_DDC_SecAddr = 0x23;
+-                 SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-                 tempbl = buffer[0];  /* 0x23 */
+-                 tempbh = buffer[1];  /* 0x24 */
+-                 if(tempbl) cr37 |= 0x10;
+-                 tempah = 0x03;               /* 1280x1024 */
+-             }
+-             tempbh = 0x00;
+-          }
+-       }
+-       if(tempbh == 0x00) goto cr36ready;
+-       tempah = 0x07;                         /* 1280x960 */
+-       if(tempbh == 0xc0) goto cr36ready;
+-      }
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x18;         /* feature support */
+-      SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-      tempbl = buffer[0];
+-      tempbh = buffer[1];
+-      if(tempbl & 0x02) goto cr36ready;
+-      SiS_Pr->SiS_DDC_DeviceAddr = 0xa0;
+-      SiS_Pr->SiS_DDC_SecAddr = 0x23;         /* Established Timings */
+-      SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-      tempbl = buffer[0];
+-      tempbh = buffer[1];
+-      tempah = 0x03;
+-      if(!(tempbh & 0x01)) tempah = 0x02;
+-      if(!tempbl) cr37 |= 0x10;
+-      
+-  } else {
+-  
+-      /* Read and analyze EDID V2 (res) */
+-      
+-      tempah = 0x02;
+-      tempbx = tempbl | (tempbh << 8);
+-      if(tempbx != 1024) tempah = 0x03;
+-      
+-  }     
+-
+-cr36ready:
+-  cr36 = tempah;      
+-  
+-  if(SiS_Pr->SiS_DDC_DeviceAddr == 0xa0) {
+-  
+-     /* Read and analyze EDID V1 (pol) */
+-  
+-     SiS_Pr->SiS_DDC_SecAddr = 0x47;
+-     SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-     tempah = buffer[0];
+-     tempah &= 0x06;
+-     tempah ^= 0x06;
+-     tempah <<= 5;
+-     tempah |= 0x20;
+-     cr37 &= 0x1f;
+-     cr37 |= tempah;
+-     if((cr36 & 0x07) == 0x07) cr37 &= 0x0e;
+-     
+-  } else {
+-  
+-     /* Read and analyze EDID V2 (depth, pol) */
+-  
+-     push1 = tempah;
+-     SiS_Pr->SiS_DDC_SecAddr = 0x45;
+-     SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-     tempah = 0x01;
+-     if((buffer[0] != 0x20) && (buffer[0] != 0x34)) {   /* RGB18 or 24? */
+-        tempah = 0x00;
+-     }
+-     cr37 &= 0xfe;
+-     cr37 |= tempah;
+-     
+-     SiS_Pr->SiS_DDC_SecAddr = 0x7e;
+-     SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-     tempax = (USHORT)(buffer[0] | (buffer[1] << 8));
+-     push2 = tempax;
+-     tempax &= 0x0003;
+-     tempax *= 0x1b;
+-     push3 = tempax;
+-     tempax = (USHORT)buffer[0];
+-     tempax &= 0x001c;
+-     tempax >>= 2;
+-     tempax *= 8;
+-     tempbx = push3;
+-     tempbx += tempax;
+-     if(buffer[0] & 0x20) {           /* Luminance table provided? */
+-        SiS_Pr->SiS_DDC_SecAddr = 0x80;
+-      SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-      tempax = buffer[0] | (buffer[1] << 8);
+-      tempax &= 0x1f;
+-      if(buffer[0] & 0x70) tempax <<= 1;
+-      tempax++;       
+-      tempbx += tempax;               /* yes -> skip it */
+-     }
+-     tempcx = push2;
+-     tempax = push1 << 8;
+-     tempbx = (tempbx & 0xff00) | (((tempbx & 0x00ff) + 0x80) & 0x00ff);
+-     if(tempcx & 0xf800) {
+-        tempal = addresstable[((tempax & 0xff00) >> 8)];
+-      tempcx &= 0xf8ff;
+-      tempcx >>= 11;
+-      for(i=0; i<tempcx; i++) {
+-         SiS_Pr->SiS_DDC_SecAddr = (tempbx & 0x00ff);
+-         SiS_ReadLCDDDC(SiS_Pr, 2, buffer);
+-         tempbx += 0x04;
+-         if(buffer[0] == tempal) break;
+-      }
+-      tempah = buffer[1];
+-      tempah &= 0x0c;
+-      tempah ^= 0x0c;
+-      tempah <<= 4;
+-      tempah |= 0x20;
+-        cr37 &= 0x1f;
+-        cr37 |= tempah;
+-      if((cr36 & 0x07) == 0x07) cr37 &= 0x0e;
+-     }
+-  }
+-  xf86DrvMsg(0, X_INFO, "DDC: cr36 = 0x%02x, cr37 = 0x%02x\n", cr36, cr37);
+-  return 0;
+-}
+-#endif
+-
+-/* TW: Generic I2C functions (compliant to i2c library) */
++/* Generic I2C functions (compliant to i2c library) */
+ #if 0
+ USHORT
+@@ -10684,7 +10919,7 @@ SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, 
+   SiS_SetCH70xx(SiS_Pr,tempbl);
+ }
+-/* TW: Generic I2C functions for Chrontel --------- */
++/* Generic I2C functions for Chrontel --------- */
+ void
+ SiS_SetSwitchDDC2(SiS_Private *SiS_Pr)
+@@ -10698,37 +10933,37 @@ SiS_SetSwitchDDC2(SiS_Private *SiS_Pr)
+   SiS_WaitRetraceDDC(SiS_Pr);
+ }
+-/* TW: Set I2C start condition */
+-/* TW: This is done by a SD high-to-low transition while SC is high */
++/* Set I2C start condition */
++/* This is done by a SD high-to-low transition while SC is high */
+ USHORT
+ SiS_SetStart(SiS_Private *SiS_Pr)
+ {
+-  if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF;                              /* TW: (SC->low)  */
++  if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF;                              /* (SC->low)  */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);             /* TW: SD->high */
+-  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;                             /* TW: SC->high */
++                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);             /* SD->high */
++  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;                             /* SC->high */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,0x00);                             /* TW: SD->low = start condition */
+-  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;                             /* TW: (SC->low) */
++                  ~SiS_Pr->SiS_DDC_Data,0x00);                             /* SD->low = start condition */
++  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;                             /* (SC->low) */
+   return 0;
+ }
+-/* TW: Set I2C stop condition */
+-/* TW: This is done by a SD low-to-high transition while SC is high */
++/* Set I2C stop condition */
++/* This is done by a SD low-to-high transition while SC is high */
+ USHORT
+ SiS_SetStop(SiS_Private *SiS_Pr)
+ {
+-  if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF;                              /* TW: (SC->low) */
++  if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF;                              /* (SC->low) */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,0x00);                           /* TW: SD->low   */
+-  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;                             /* TW: SC->high  */
++                  ~SiS_Pr->SiS_DDC_Data,0x00);                           /* SD->low   */
++  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;                             /* SC->high  */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);           /* TW: SD->high = stop condition */
+-  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;                             /* TW: (SC->high) */
++                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);           /* SD->high = stop condition */
++  if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF;                             /* (SC->high) */
+   return 0;
+ }
+-/* TW: Write 8 bits of data */
++/* Write 8 bits of data */
+ USHORT
+ SiS_WriteDDC2Data(SiS_Private *SiS_Pr, USHORT tempax)
+ {
+@@ -10736,18 +10971,18 @@ SiS_WriteDDC2Data(SiS_Private *SiS_Pr, U
+   flag=0x80;
+   for(i=0;i<8;i++) {
+-    SiS_SetSCLKLow(SiS_Pr);                                                 /* TW: SC->low */
++    SiS_SetSCLKLow(SiS_Pr);                                                 /* SC->low */
+     if(tempax & flag) {
+       SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                      ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);            /* TW: Write bit (1) to SD */
++                      ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);            /* Write bit (1) to SD */
+     } else {
+       SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                      ~SiS_Pr->SiS_DDC_Data,0x00);                            /* TW: Write bit (0) to SD */
++                      ~SiS_Pr->SiS_DDC_Data,0x00);                            /* Write bit (0) to SD */
+     }
+-    SiS_SetSCLKHigh(SiS_Pr);                                                /* TW: SC->high */
++    SiS_SetSCLKHigh(SiS_Pr);                                                /* SC->high */
+     flag >>= 1;
+   }
+-  temp = SiS_CheckACK(SiS_Pr);                                                      /* TW: Check acknowledge */
++  temp = SiS_CheckACK(SiS_Pr);                                                      /* Check acknowledge */
+   return(temp);
+ }
+@@ -10808,27 +11043,27 @@ SiS_DDC2Delay(SiS_Private *SiS_Pr, USHOR
+   }
+ }
+-/* TW: Check I2C acknowledge */
++/* Check I2C acknowledge */
+ /* Returns 0 if ack ok, non-0 if ack not ok */
+ USHORT
+ SiS_CheckACK(SiS_Private *SiS_Pr)
+ {
+   USHORT tempah;
+-  SiS_SetSCLKLow(SiS_Pr);                                        /* TW: (SC->low) */
++  SiS_SetSCLKLow(SiS_Pr);                                        /* (SC->low) */
+   SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+-                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);     /* TW: (SD->high) */
+-  SiS_SetSCLKHigh(SiS_Pr);                                       /* TW: SC->high = clock impulse for ack */
+-  tempah = SiS_GetReg1(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);/* TW: Read SD */
+-  SiS_SetSCLKLow(SiS_Pr);                                        /* TW: SC->low = end of clock impulse */
+-  if(tempah & SiS_Pr->SiS_DDC_Data) return(1);                           /* TW: Ack OK if bit = 0 */
++                  ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);     /* (SD->high) */
++  SiS_SetSCLKHigh(SiS_Pr);                                       /* SC->high = clock impulse for ack */
++  tempah = SiS_GetReg1(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);/* Read SD */
++  SiS_SetSCLKLow(SiS_Pr);                                        /* SC->low = end of clock impulse */
++  if(tempah & SiS_Pr->SiS_DDC_Data) return(1);                           /* Ack OK if bit = 0 */
+   else return(0);
+ }
+-/* TW: End of I2C functions ----------------------- */
++/* End of I2C functions ----------------------- */
+-/* =============== SiS 310/325/330 O.E.M. ================= */
++/* =============== SiS 315/330 O.E.M. ================= */
+ #ifdef SIS315H
+@@ -10838,11 +11073,11 @@ GetRAMDACromptr(SiS_Private *SiS_Pr, PSI
+   USHORT romptr;
+   if(HwDeviceExtension->jChipType < SIS_330) {
+-     romptr = ROMAddr[0x128] | (ROMAddr[0x129] << 8);  
++     romptr = ROMAddr[0x128] | (ROMAddr[0x129] << 8);
+      if(SiS_Pr->SiS_VBType & VB_SIS301B302B)
+         romptr = ROMAddr[0x12a] | (ROMAddr[0x12b] << 8);
+   } else {
+-     romptr = ROMAddr[0x1a8] | (ROMAddr[0x1a9] << 8);  
++     romptr = ROMAddr[0x1a8] | (ROMAddr[0x1a9] << 8);
+      if(SiS_Pr->SiS_VBType & VB_SIS301B302B)
+         romptr = ROMAddr[0x1aa] | (ROMAddr[0x1ab] << 8);
+   }
+@@ -10855,11 +11090,11 @@ GetLCDromptr(SiS_Private *SiS_Pr, PSIS_H
+   USHORT romptr;
+   if(HwDeviceExtension->jChipType < SIS_330) {
+-     romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8);  
++     romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8);
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
+         romptr = ROMAddr[0x122] | (ROMAddr[0x123] << 8);
+   } else {
+-     romptr = ROMAddr[0x1a0] | (ROMAddr[0x1a1] << 8);  
++     romptr = ROMAddr[0x1a0] | (ROMAddr[0x1a1] << 8);
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
+         romptr = ROMAddr[0x1a2] | (ROMAddr[0x1a3] << 8);
+   }
+@@ -10884,10 +11119,22 @@ GetTVromptr(SiS_Private *SiS_Pr, PSIS_HW
+ }
+ static USHORT
+-GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr)
++GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+ {
+   USHORT index;
+-  
++
++  if((IS_SIS650) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
++     if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
++        if((index = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0)) {
++         index >>= 4;
++         index *= 3;
++         if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
++           else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) index++;
++           return index;
++      }
++     }
++  }
++
+   index = SiS_Pr->SiS_LCDResInfo & 0x0F;
+   if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)      index -= 5;
+   else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) index -= 6;
+@@ -10895,7 +11142,6 @@ GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr)
+   index *= 3;
+   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
+   else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) index++;
+-
+   return index;
+ }
+@@ -10946,7 +11192,7 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+              UCHAR *ROMAddr, USHORT ModeNo)
+ {
+   USHORT delay,index,myindex,temp,romptr=0;
+-  
++
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {                  /* VGA */
+      
+      if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+@@ -10971,8 +11217,10 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+      }
+   
+   } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {              /* LCD */
++
++     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
+   
+-     index = GetLCDPtrIndexBIOS(SiS_Pr);
++     index = GetLCDPtrIndexBIOS(SiS_Pr, HwDeviceExtension, BaseAddr);
+      myindex = GetLCDPtrIndex(SiS_Pr);
+      
+      if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {       /* 650+30xLV */
+@@ -10980,7 +11228,7 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+           if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ #if 0      /* Always use the second pointer on 650; some BIOSes */
+              /* still carry old 301 data at the first location    */  
+-           romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8); 
++           romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8);
+            if(SiS_Pr->SiS_VBType & VB_SIS302LV) 
+ #endif                
+               romptr = ROMAddr[0x122] | (ROMAddr[0x123] << 8);
+@@ -10994,13 +11242,13 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+ #endif                
+         }
+        } else {
+-          delay = SiS310_LCDDelayCompensation_651301LV[myindex];     
++          delay = SiS310_LCDDelayCompensation_651301LV[myindex];
+         if(SiS_Pr->SiS_VBType & VB_SIS302LV)
+-           delay = SiS310_LCDDelayCompensation_651302LV[myindex];  
++           delay = SiS310_LCDDelayCompensation_651302LV[myindex];
+        }
+      } else {
+         if((ROMAddr) && SiS_Pr->SiS_UseROM &&                                 /* 315, 330, 740, 650+301B */
+-         (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)) { 
++         (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)) {
+            romptr = GetLCDromptr(SiS_Pr, HwDeviceExtension, ROMAddr);
+          if(!romptr) return;
+          delay = ROMAddr[(romptr + index)];
+@@ -11008,7 +11256,7 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+            delay = SiS310_LCDDelayCompensation_301[myindex];
+            if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ #if 0               /* This data is (like the one in the BIOS) wrong. */         
+-            if(IS_SIS650740) {  /* V */
++            if(IS_SIS550650740660) {
+                delay = SiS310_LCDDelayCompensation_650301B[myindex];
+             } else {
+ #endif              
+@@ -11088,14 +11336,16 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_H
+   } else {
+      if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
+         temp = (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) >> 4;
+-        if(temp == 8) {
++        if(temp == 8) {               /* 1400x1050 BIOS */
+          delay &= 0x0f;
+          delay |= 0xb0;
+         } else if(temp == 6) {
+            delay &= 0x0f;
+          delay |= 0xc0;
++        } else if(temp > 7) { /* 1280x1024 BIOS */
++         delay = 0x35;
+         }
+-        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2D,delay);  /* index 2D D[3:0] */
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2D,delay);
+      } else {
+         SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
+      }
+@@ -11118,7 +11368,7 @@ SetAntiFlicker(SiS_Private *SiS_Pr, PSIS
+   if(ROMAddr && SiS_Pr->SiS_UseROM) {
+      romptr = ROMAddr[0x112] | (ROMAddr[0x113] << 8);
+-     if(HwDeviceExtension->jChipType == SIS_330) {
++     if(HwDeviceExtension->jChipType >= SIS_330) {
+         romptr = ROMAddr[0x192] | (ROMAddr[0x193] << 8);
+      }
+   }
+@@ -11150,7 +11400,7 @@ SetEdgeEnhance(SiS_Private *SiS_Pr, PSIS
+   if(ROMAddr && SiS_Pr->SiS_UseROM) {
+      romptr = ROMAddr[0x124] | (ROMAddr[0x125] << 8);
+-     if(HwDeviceExtension->jChipType == SIS_330) {
++     if(HwDeviceExtension->jChipType >= SIS_330) {
+         romptr = ROMAddr[0x1a4] | (ROMAddr[0x1a5] << 8);
+      }
+   }
+@@ -11198,7 +11448,7 @@ SetYFilter(SiS_Private *SiS_Pr, PSIS_HW_
+   if(ROMAddr && SiS_Pr->SiS_UseROM) {
+       OutputSelect = ROMAddr[0xf3];
+-      if(HwDeviceExtension->jChipType == SIS_330) {
++      if(HwDeviceExtension->jChipType >= SIS_330) {
+           OutputSelect = ROMAddr[0x11b];
+       }
+   }
+@@ -11262,17 +11512,17 @@ SetPhaseIncr(SiS_Private *SiS_Pr, PSIS_H
+    */
+   if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+      romptr = ROMAddr[0x116] | (ROMAddr[0x117] << 8);
+-     if(HwDeviceExtension->jChipType == SIS_330) {
++     if(HwDeviceExtension->jChipType >= SIS_330) {
+         romptr = ROMAddr[0x196] | (ROMAddr[0x197] << 8);
+      }
+      if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+         romptr = ROMAddr[0x11c] | (ROMAddr[0x11d] << 8);
+-      if(HwDeviceExtension->jChipType == SIS_330) {
++      if(HwDeviceExtension->jChipType >= SIS_330) {
+          romptr = ROMAddr[0x19c] | (ROMAddr[0x19d] << 8);
+       }
+       if((SiS_Pr->SiS_VBInfo & SetInSlaveMode) && (!(SiS_Pr->SiS_SetFlag & TVSimuMode))) {
+          romptr = ROMAddr[0x116] | (ROMAddr[0x117] << 8);
+-         if(HwDeviceExtension->jChipType == SIS_330) {
++         if(HwDeviceExtension->jChipType >= SIS_330) {
+               romptr = ROMAddr[0x196] | (ROMAddr[0x197] << 8);
+            }
+       }
+@@ -11296,19 +11546,19 @@ SetPhaseIncr(SiS_Private *SiS_Pr, PSIS_H
+      }
+   }
+-  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {    /* TW: 650/301LV: (VB_SIS301LV | VB_SIS302LV)) */
++  if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {    /* 650/301LV: (VB_SIS301LV | VB_SIS302LV)) */
+      if((!(SiS_Pr->SiS_VBInfo & SetPALTV)) && (ModeNo > 0x13)) {
+-        if(resinfo == 6) {
++        if(resinfo == SIS_RI_640x480) {
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x21);
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0xf0);
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xf5);
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x34,0x7f);
+-      } else if (resinfo == 7) {
++      } else if (resinfo == SIS_RI_800x600) {
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x21);
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0xf0);
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xf5);
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x34,0x7f);
+-      } else if (resinfo == 8) {
++      } else if (resinfo == SIS_RI_1024x768) {
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x1e);
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0x8b);
+             SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xfb);
+@@ -11323,7 +11573,9 @@ SiS_OEM310Setting(SiS_Private *SiS_Pr, P
+                   UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+ {
+    SetDelayComp(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
+-   /* TW: The TV functions are not for LVDS */
++
++   if(SiS_Pr->UseCustomMode) return;
++
+    if( (SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) ) {
+        SetAntiFlicker(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+        SetPhaseIncr(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+@@ -11335,7 +11587,7 @@ SiS_OEM310Setting(SiS_Private *SiS_Pr, P
+ }
+ /* FinalizeLCD
+- * This finalizes some Part1 registers for the very panel used.
++ * This finalizes some CRT2 registers for the very panel used.
+  * If we have a backup if these registers, we use it; otherwise
+  * we set the register according to most BIOSes. However, this
+  * function looks quite different in every BIOS, so you better
+@@ -11350,6 +11602,9 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+   if(!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) return;
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
++  if(SiS_Pr->UseCustomMode) return;
++
+   if(ModeNo <= 0x13) {
+       resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+       modeflag =  SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+@@ -11358,20 +11613,31 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+       modeflag =  SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+   }
++  if((SiS_GetReg1(SiS_Pr->SiS_P3d4, 0x5f) & 0xf0)) {
++     SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x03);
++  }
++
+   if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+         SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+       SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
++     } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {   /* For all panels? */
++        SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01);
+      }
+      tempch = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+      tempch &= 0xf0;
+      tempch >>= 4;
+      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
++        if(tempch == 0x03) {
++         SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);
++         SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x25);
++         SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1c,0x00);
++         SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
++      }
+       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+          SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1f,0x76);
+-      }
+-      if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {       
++      } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+          if((SiS_Pr->Backup == TRUE) && (SiS_Pr->Backup_Mode == ModeNo)) {
+             SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,SiS_Pr->Backup_14);
+             SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,SiS_Pr->Backup_15);
+@@ -11387,14 +11653,14 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,0x90);
+              if(ModeNo <= 0x13) {
+                 SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x11);
+-                if((resinfo == 0) && (resinfo == 2)) return;
++                if((resinfo == 0) || (resinfo == 2)) return;
+                 SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x18);
+-                if((resinfo == 1) && (resinfo == 3)) return;
++                if((resinfo == 1) || (resinfo == 3)) return;
+              }
+              SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);
+-             if((ModeNo > 0x13) && (resinfo == 8)) {
++             if((ModeNo > 0x13) && (resinfo == SIS_RI_1024x768)) {
+                 SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);  /* 1.10.7u */
+-#if 0        
++#if 0
+                 tempbx = 806;  /* 0x326 */                     /* other older BIOSes */
+                 tempbx--;
+                 temp = tempbx & 0xff;
+@@ -11449,7 +11715,7 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+       tempbl = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x04);
+       tempbx = (tempbh << 8) | tempbl;
+       if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+-         if((resinfo == 8) || (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD))) {
++         if((resinfo == SIS_RI_1024x768) || (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD))) {
+             if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
+               tempbx = 770;
+             } else {
+@@ -11477,67 +11743,56 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USH
+   }
+ }
+-#if 0
+-/* TW: New and checked from 650/301LV BIOS */
+-/* This might clash with newer "FinalizeLCD()" function */
++#endif
++
++
++/*  =================  SiS 300 O.E.M. ================== */
++
++#ifdef SIS300
++
+ void
+-SiS_OEMLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+-                  UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
++SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
++              UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefTabIndex)
+ {
+-   USHORT tempbx,tempah,tempbl,tempbh,tempcl;
+-
+-   if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) return;
++  USHORT crt2crtc=0, modeflag, myindex=0;
++  UCHAR  temp;
++  int i;
+-   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+-      SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
+-      tempbh = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x1a);
+-      tempbh &= 0x38;
+-      tempbh >>= 3;
+-      tempbl = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x18);
+-      tempbx = (tempbh << 8) | tempbl;
+-      if(SiS_Pr->SiS_LCDTypeInfo == 1)  tempbx -= 0x12;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,tempbx & 0x00ff);
+-      tempah = (tempbx & 0xff00) >> 8;
+-      tempah &= 0x07;
+-      tempah <<= 3;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1a,0xc7,tempah);
+-      tempah = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x19);
+-      tempah &= 0x0f;
+-      if(SiS_Pr->SiS_LCDTypeInfo == 1)  tempah -= 2;
+-      tempah &= 0x0f;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,tempah);
+-      tempah = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x14);
+-      if(SiS_Pr->SiS_LCDTypeInfo == 1)  tempah++;
+-      tempah -= 8;
+-      SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,tempah);
+-   } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-      tempcl = tempbh = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x01);
+-      tempbh &= 0x70;
+-      tempbh >>= 4;
+-      tempbl = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x04);
+-      tempbx = (tempbh << 8) | tempbl;
+-      if(SiS_Pr->SiS_LCDTypeInfo == 1)  {
+-           tempbx -= 0x1e;
+-         tempcl &= 0x0f;
+-         tempcl -= 4;
+-         tempcl &= 0x0f;
+-      }
+-      tempbl = tempbx & 0x00ff;
+-      tempbh = (tempbx >> 8) & 0x00ff;
+-      SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,tempbl);
+-      tempbh <<= 4;
+-      tempbh |= tempcl;
+-      SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,tempbh);
+-   }
+-}
+-#endif
++  if(ModeNo <= 0x13) {
++        modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
++      crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
++  } else {
++        modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
++      crt2crtc = SiS_Pr->SiS_RefIndex[RefTabIndex].Ext_CRT2CRTC;
++  }
+-#endif
++  crt2crtc &= 0x3f;
++  if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
++     SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xdf);
++  }
+-/*  =================  SiS 300 O.E.M. ================== */
++  if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++     if(modeflag & HalfDCLK) myindex = 1;
+-#ifdef SIS300
++     if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
++        for(i=0; i<7; i++) {
++           if(barco_p1[myindex][crt2crtc][i][0]) {
++            SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,
++                            barco_p1[myindex][crt2crtc][i][0],
++                            barco_p1[myindex][crt2crtc][i][2],
++                            barco_p1[myindex][crt2crtc][i][1]);
++         }
++        }
++     }
++     temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
++     if(temp & 0x80) {
++        temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x18);
++        temp++;
++        SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp);
++     }
++  }
++}
+ #if 0   /* Not used */
+ static USHORT
+@@ -11582,7 +11837,7 @@ GetOEMLCDPtr(SiS_Private *SiS_Pr, PSIS_H
+   if(HwDeviceExtension->jChipType == SIS_300) {
+-    tempbx = SiS_Pr->SiS_LCDResInfo - 2;
++    tempbx = (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) - 2;
+     if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx += 4;
+     if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+        if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 3;
+@@ -11636,24 +11891,29 @@ SetOEMLCDDelay(SiS_Private *SiS_Pr, PSIS
+ {
+   USHORT index,temp,romptr=0;
++  if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
++
+   if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+      if(!(ROMAddr[0x237] & 0x01)) return;
+      if(!(ROMAddr[0x237] & 0x02)) return;
+      romptr = ROMAddr[0x24b] | (ROMAddr[0x24c] << 8);
+   }
+-  /* TW: The Panel Compensation Delay should be set according to tables
+-   *     here. Unfortunately, various BIOS versions don't case about
+-   *     a uniform way using eg. ROM byte 0x220, but use different
+-   *     hard coded delays (0x04, 0x20, 0x18) in SetGroup1().
+-   *     Thus we don't set this if the user select a custom pdc or if
+-   *     we otherwise detected a valid pdc.
++  /* The Panel Compensation Delay should be set according to tables
++   * here. Unfortunately, various BIOS versions don't case about
++   * a uniform way using eg. ROM byte 0x220, but use different
++   * hard coded delays (0x04, 0x20, 0x18) in SetGroup1().
++   * Thus we don't set this if the user select a custom pdc or if
++   * we otherwise detected a valid pdc.
+    */
+   if(HwDeviceExtension->pdc) return;
+   temp = GetOEMLCDPtr(SiS_Pr,HwDeviceExtension, ROMAddr, 0);
+-  index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex;
++  if(SiS_Pr->UseCustomMode)
++     index = 0;
++  else
++     index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex;
+   if(HwDeviceExtension->jChipType != SIS_300) {
+       if(romptr) {
+@@ -11700,9 +11960,9 @@ SetOEMLCDDelay(SiS_Private *SiS_Pr, PSIS
+ static void
+ SetOEMLCDData(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+-               UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
++              UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+ {
+-#if 0  /* TW: Unfinished; VData table missing */
++#if 0  /* Unfinished; Data table missing */
+   USHORT index,temp;
+   if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+@@ -11899,25 +12159,29 @@ SetOEMYFilter(SiS_Private *SiS_Pr, PSIS_
+ void
+ SiS_OEM300Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+-                USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo)
++                USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
++                USHORT RefTableIndex)
+ {
+-  USHORT ModeIdIndex;
++  USHORT OEMModeIdIndex=0;
+-  ModeIdIndex = SiS_SearchVBModeID(SiS_Pr,ROMAddr,&ModeNo);
+-  if(!(ModeIdIndex)) return;
++  if(!SiS_Pr->UseCustomMode) {
++     OEMModeIdIndex = SiS_SearchVBModeID(SiS_Pr,ROMAddr,&ModeNo);
++     if(!(OEMModeIdIndex)) return;
++  }
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+-       SetOEMLCDDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++       SetOEMLCDDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+        if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-            SetOEMLCDData(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++            SetOEMLCDData(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+        }
+   }
++  if(SiS_Pr->UseCustomMode) return;
+   if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+-       SetOEMTVDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++       SetOEMTVDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+        if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+-                      SetOEMAntiFlicker(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+-              SetOEMPhaseIncr(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+-                      SetOEMYFilter(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
++                      SetOEMAntiFlicker(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
++              SetOEMPhaseIncr(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
++                      SetOEMYFilter(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+        }
+   }
+ }
+--- linux-2.6.0-test1/drivers/video/sis/init301.h      2003-06-14 12:18:21.000000000 -0700
++++ 25/drivers/video/sis/init301.h     2003-07-19 17:04:55.000000000 -0700
+@@ -1,20 +1,39 @@
+-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h,v 1.4 2000/12/02 01:16:17 dawes Exp $ */
++/* $XFree86$ */
++/*
++ * Data and prototypes for init301.c
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ */
++
+ #ifndef  _INIT301_
+ #define  _INIT301_
+ #include "osdef.h"
++
+ #include "initdef.h"
+ #include "vgatypes.h"
+ #include "vstruct.h"
+-#ifdef TC
+-#include <stdio.h>
+-#include <string.h>
+-#include <conio.h>
+-#include <dos.h>
+-#include <stdlib.h>
+-#endif
+-
+ #ifdef LINUX_XF86
+ #include "xf86.h"
+ #include "xf86Pci.h"
+@@ -24,6 +43,9 @@
+ #endif
+ #ifdef LINUX_KERNEL
++#ifdef SIS_CP
++#undef SIS_CP
++#endif
+ #include <linux/config.h>
+ #include <linux/version.h>
+ #include <asm/io.h>
+@@ -35,24 +57,60 @@
+ #endif
+ #endif
+-#ifdef WIN2000
+-#include <stdio.h>
+-#include <string.h>
+-#include <miniport.h>
+-#include "dderror.h"
+-#include "devioctl.h"
+-#include "miniport.h"
+-#include "ntddvdeo.h"
+-#include "video.h"
+-#include "sisv.h"
+-#endif
++const UCHAR SiS_HiVisionTable[3][64] = {
++  {
++    0x17, 0x1d, 0x03, 0x09, 0x05, 0x06, 0x0c, 0x0c,
++    0x94, 0x49, 0x01, 0x0a, 0x06, 0x0d, 0x04, 0x0a,
++    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x1b,
++    0x0c, 0x50, 0x00, 0x97, 0x00, 0xd4, 0x4a, 0x17,
++    0x7d, 0x05, 0x4b, 0x00, 0x00, 0xe2, 0x00, 0x02,
++    0x03, 0x0a, 0x65, 0x9d, 0x08, 0x92, 0x8f, 0x40,
++    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x53,
++    0x00, 0x40, 0x44, 0x00, 0xdb, 0x02, 0x3b, 0x00
++  },
++  {
++    0x1d, 0x1d, 0x06, 0x09, 0x0b, 0x0c, 0x0c, 0x0c,
++    0x98, 0x0a, 0x01, 0x0d, 0x06, 0x0d, 0x04, 0x0a,
++    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f,
++    0x0c, 0x50, 0xb2, 0x2e, 0x16, 0xb5, 0xf4, 0x03,
++    0x7d, 0x11, 0x7d, 0xea, 0x30, 0x36, 0x18, 0x96,
++    0x21, 0x0a, 0x58, 0xee, 0x42, 0x92, 0x0f, 0x40,
++    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x04, 0xf3,
++    0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00
++  },
++  {
++    0x13, 0x1d, 0xe8, 0x09, 0x09, 0xed, 0x0c, 0x0c,
++    0x98, 0x0a, 0x01, 0x0c, 0x06, 0x0d, 0x04, 0x0a,
++    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f,
++    0xed, 0x50, 0x70, 0x9f, 0x16, 0x59, 0x2b, 0x13,
++    0x27, 0x0b, 0x27, 0xfc, 0x30, 0x27, 0x1c, 0xb0,
++    0x4b, 0x4b, 0x6f, 0x2f, 0x63, 0x92, 0x0f, 0x40,
++    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x2a,
++    0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00
++  }
++};
+-#if 0
+-extern   const USHORT   SiS_MDA_DAC[];
+-extern   const USHORT   SiS_CGA_DAC[];
+-extern   const USHORT   SiS_EGA_DAC[];
+-extern   const USHORT   SiS_VGA_DAC[];
+-#endif
++const UCHAR SiS_HiTVGroup3_1[] = {
++    0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x13,
++    0xb1, 0x41, 0x62, 0x62, 0xff, 0xf4, 0x45, 0xa6,
++    0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
++    0xac, 0xda, 0x60, 0xfe, 0x6a, 0x9a, 0x06, 0x10,
++    0xd1, 0x04, 0x18, 0x0a, 0xff, 0x80, 0x00, 0x80,
++    0x3b, 0x77, 0x00, 0xef, 0xe0, 0x10, 0xb0, 0xe0,
++    0x10, 0x4f, 0x0f, 0x0f, 0x05, 0x0f, 0x08, 0x6e,
++    0x1a, 0x1f, 0x25, 0x2a, 0x4c, 0xaa, 0x01
++};
++
++const UCHAR SiS_HiTVGroup3_2[] = {
++    0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x7a,
++    0x54, 0x41, 0xe7, 0xe7, 0xff, 0xf4, 0x45, 0xa6,
++    0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
++    0xac, 0x6a, 0x60, 0x2b, 0x52, 0xcd, 0x61, 0x10,
++    0x51, 0x04, 0x18, 0x0a, 0x1f, 0x80, 0x00, 0x80,
++    0xff, 0xa4, 0x04, 0x2b, 0x94, 0x21, 0x72, 0x94,
++    0x26, 0x05, 0x01, 0x0f, 0xed, 0x0f, 0x0a, 0x64,
++    0x18, 0x1d, 0x23, 0x28, 0x4c, 0xaa, 0x01
++};
+ extern   BOOLEAN  SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *RomAddr, USHORT *);
+@@ -129,7 +187,6 @@ void     SiS_GetVBInfo(SiS_Private *SiS_
+ BOOLEAN  SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO);
+ BOOLEAN  SiS_BridgeIsEnable(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO);
+ BOOLEAN  SiS_BridgeInSlave(SiS_Private *SiS_Pr);
+-void     SiS_PresetScratchregister(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetTVSystem(SiS_Private *SiS_Pr);
+ void     SiS_LongWait(SiS_Private *SiS_Pr);
+ USHORT   SiS_GetQueueConfig(SiS_Private *SiS_Pr);
+@@ -149,7 +206,7 @@ void     SiS_GetLVDSDesPtrA(SiS_Private 
+                             USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex);
+ #endif                            
+ void     SiS_SetTPData(SiS_Private *SiS_Pr);
+-void     SiS_WhatIsThis(SiS_Private *SiS_Pr, USHORT myvbinfo);
++void     SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo);
+ void     SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                          USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+@@ -178,20 +235,18 @@ USHORT   SiS_SetSCLKHigh(SiS_Private *Si
+ USHORT   SiS_ReadDDC2Data(SiS_Private *SiS_Pr, USHORT tempax);
+ USHORT   SiS_WriteDDC2Data(SiS_Private *SiS_Pr, USHORT tempax);
+ USHORT   SiS_CheckACK(SiS_Private *SiS_Pr);
+-USHORT   SiS_ReadLCDDDC(SiS_Private *SiS_Pr, USHORT length, unsigned char *buffer);
+-#ifdef LINUX_XF86
+-USHORT   SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS);
+-USHORT   SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS);
+-#endif
++
+ #ifdef SIS315H
+ void     SiS_OEM310Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+                            UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+ void     SiS_OEMLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+-                    UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
++                    UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex);
+ #endif
+ #ifdef SIS300
+ void     SiS_OEM300Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+-                           UCHAR *ROMAddr,USHORT ModeNo);
++                           UCHAR *ROMAddr,USHORT ModeNo, USHORT ModeIdIndex, USHORT RefTabindex);
++void     SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
++                      UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,USHORT RefTableIndex);
+ #endif
+ BOOLEAN  SiS_LowModeStuff(SiS_Private *SiS_Pr, USHORT ModeNo,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+@@ -200,8 +255,8 @@ BOOLEAN  SiS_GetLCDResInfo(SiS_Private *
+ /* void    SiS_CHACRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                         USHORT RefreshRateTableIndex); */
+-BOOLEAN  SiS_SetCRT2Group301(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+-                             PSIS_HW_DEVICE_INFO HwDeviceExtension);
++BOOLEAN  SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
++                          PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetGroup1(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                        PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex);
+ void     SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+@@ -237,19 +292,19 @@ void     SiS_VBWait(SiS_Private *SiS_Pr)
+ void     SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+-void     SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr);
++void     SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr);
+ #ifdef SIS315H
+ void     SiS_Chrontel701xOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                             USHORT BaseAddr);
+-void     SiS_Chrontel701xOff(SiS_Private *SiS_Pr);
++void     SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ void     SiS_ChrontelDoSomething4(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ void     SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ void     SiS_ChrontelDoSomething2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ void     SiS_ChrontelDoSomething1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ BOOLEAN  SiS_WeHaveBacklightCtrl(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+-void     SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr);
++void     SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr,  PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+ #ifdef NEWCH701x
+ void     SiS_ChrontelDoSomething5(SiS_Private *SiS_Pr);
+@@ -289,73 +344,21 @@ extern   void     SiS_LoadDAC(SiS_Privat
+ extern   UCHAR    SiS_Get310DRAMType(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ #endif
+-#ifdef LINUX_XF86
+ /* DDC functions */
+-USHORT   SiS_InitDDCRegs(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT adaptnum, USHORT DDCdatatype, BOOLEAN checkcr32);
++USHORT   SiS_InitDDCRegs(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++                         USHORT adaptnum, USHORT DDCdatatype, BOOLEAN checkcr32);
+ USHORT   SiS_WriteDABDDC(SiS_Private *SiS_Pr);
+ USHORT   SiS_PrepareReadDDC(SiS_Private *SiS_Pr);
+ USHORT   SiS_PrepareDDC(SiS_Private *SiS_Pr);
+ void     SiS_SendACK(SiS_Private *SiS_Pr, USHORT yesno);
+ USHORT   SiS_DoProbeDDC(SiS_Private *SiS_Pr);
+ USHORT   SiS_ProbeDDC(SiS_Private *SiS_Pr);
+-USHORT   SiS_ReadDDC(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT DDCdatatype, unsigned char *buffer);
+-USHORT   SiS_HandleDDC(SiS_Private *SiS_Pr, SISPtr pSiS, USHORT adaptnum,
+-                       USHORT DDCdatatype, unsigned char *buffer);
++USHORT   SiS_ReadDDC(SiS_Private *SiS_Pr, USHORT DDCdatatype, unsigned char *buffer);
++USHORT   SiS_HandleDDC(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++                     USHORT adaptnum, USHORT DDCdatatype, unsigned char *buffer);
++#ifdef LINUX_XF86
++USHORT   SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS);
++USHORT   SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS);
+ #endif
+-const UCHAR SiS_HiVisionTable[3][64] = {
+-  { 
+-    0x17, 0x1d, 0x03, 0x09, 0x05, 0x06, 0x0c, 0x0c,
+-    0x94, 0x49, 0x01, 0x0a, 0x06, 0x0d, 0x04, 0x0a,
+-    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x1b,
+-    0x0c, 0x50, 0x00, 0x97, 0x00, 0xd4, 0x4a, 0x17,
+-    0x7d, 0x05, 0x4b, 0x00, 0x00, 0xe2, 0x00, 0x02,
+-    0x03, 0x0a, 0x65, 0x9d, 0x08, 0x92, 0x8f, 0x40,
+-    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x53,
+-    0x00, 0x40, 0x44, 0x00, 0xdb, 0x02, 0x3b, 0x00
+-  },
+-  { 
+-    0x1d, 0x1d, 0x06, 0x09, 0x0b, 0x0c, 0x0c, 0x0c,
+-    0x98, 0x0a, 0x01, 0x0d, 0x06, 0x0d, 0x04, 0x0a,
+-    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f,
+-    0x0c, 0x50, 0xb2, 0x2e, 0x16, 0xb5, 0xf4, 0x03,
+-    0x7d, 0x11, 0x7d, 0xea, 0x30, 0x36, 0x18, 0x96,
+-    0x21, 0x0a, 0x58, 0xee, 0x42, 0x92, 0x0f, 0x40,
+-    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x04, 0xf3,
+-    0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00
+-  },
+-  { 
+-    0x13, 0x1d, 0xe8, 0x09, 0x09, 0xed, 0x0c, 0x0c, 
+-    0x98, 0x0a, 0x01, 0x0c, 0x06, 0x0d, 0x04, 0x0a, 
+-    0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f, 
+-    0xed, 0x50, 0x70, 0x9f, 0x16, 0x59, 0x2b, 0x13, 
+-    0x27, 0x0b, 0x27, 0xfc, 0x30, 0x27, 0x1c, 0xb0, 
+-    0x4b, 0x4b, 0x6f, 0x2f, 0x63, 0x92, 0x0f, 0x40, 
+-    0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x2a, 
+-    0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00 
+-  }
+-};
+-
+-const UCHAR SiS_HiTVGroup3_1[] = {
+-    0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x13,
+-    0xb1, 0x41, 0x62, 0x62, 0xff, 0xf4, 0x45, 0xa6,
+-    0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
+-    0xac, 0xda, 0x60, 0xfe, 0x6a, 0x9a, 0x06, 0x10,
+-    0xd1, 0x04, 0x18, 0x0a, 0xff, 0x80, 0x00, 0x80,
+-    0x3b, 0x77, 0x00, 0xef, 0xe0, 0x10, 0xb0, 0xe0,
+-    0x10, 0x4f, 0x0f, 0x0f, 0x05, 0x0f, 0x08, 0x6e,
+-    0x1a, 0x1f, 0x25, 0x2a, 0x4c, 0xaa, 0x01
+-};
+-
+-const UCHAR SiS_HiTVGroup3_2[] = {
+-    0x00, 0x14, 0x15, 0x25, 0x55, 0x15, 0x0b, 0x7a,
+-    0x54, 0x41, 0xe7, 0xe7, 0xff, 0xf4, 0x45, 0xa6,
+-    0x25, 0x2f, 0x67, 0xf6, 0xbf, 0xff, 0x8e, 0x20,
+-    0xac, 0x6a, 0x60, 0x2b, 0x52, 0xcd, 0x61, 0x10,
+-    0x51, 0x04, 0x18, 0x0a, 0x1f, 0x80, 0x00, 0x80,
+-    0xff, 0xa4, 0x04, 0x2b, 0x94, 0x21, 0x72, 0x94,
+-    0x26, 0x05, 0x01, 0x0f, 0xed, 0x0f, 0x0a, 0x64,
+-    0x18, 0x1d, 0x23, 0x28, 0x4c, 0xaa, 0x01
+-};
+-
+ #endif
+--- linux-2.6.0-test1/drivers/video/sis/init.c 2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/video/sis/init.c        2003-07-19 17:04:55.000000000 -0700
+@@ -1,24 +1,11 @@
+ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.c,v 1.3 2002/24/04 01:16:16 dawes Exp $ */
+ /*
+- * Mode switching code (CRT1 section) for SiS 300/540/630/730/315/550/650/740/330
++ * Mode switching code (CRT1 section) for SiS 300/540/630/730/315/550/650/740/330/660
+  * (Universal module for Linux kernel framebuffer and XFree86 4.x)
+  *
+  * Assembler-To-C translation
+- * Copyright 2002 by Thomas Winischhofer <thomas@winischhofer.net>
+- * Minor parts Copyright SiS, Inc.
+- *
+- * Based on BIOS
+- *     1.10.07, 1.10a for 650/CH7019
+- *     1.11.21a for 740/CH7019
+- *     1.11.05 for 650/LVDS (w/o Chrontel)
+- *     1.07.1b, 1.11.6s, 1.11.6w, 1.11.7w, 1.11.8r for 650/301(B/LV)
+- *     2.04.50 (I) and 2.04.5c (II) for 630/301(B)
+- *     2.06.50 for 630/301B (dual VGA)
+- *     2.02.3b, 2.03.02, 2.04.5c, 2.07a and 2.08.b3 for 630/LVDS/LVDS+CH7005
+- *     2.04.5c, 2.04.6c for 730+LVDS+CH7005
+- *     1.09b for 315/301(B)
+- *     1.16.51 for 300+301LV (ECS A907)
+- *     1.01.03 for 330 (Xabre 400)
++ * Copyright 2002, 2003 by Thomas Winischhofer <thomas@winischhofer.net>
++ * Formerly based on non-functional code-fragements by SiS, Inc.
+  *
+  * Permission to use, copy, modify, distribute, and sell this software and its
+  * documentation for any purpose is hereby granted without fee, provided that
+@@ -61,12 +48,12 @@
+ #ifdef LINUX_XF86
+ BOOLEAN SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                        ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+-DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn);
+-#ifdef SISDUALHEAD /* TW: For dual head */
++DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfordvi);
++#ifdef SISDUALHEAD
+ BOOLEAN SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                        ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+ BOOLEAN SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+-                       ScrnInfoPtr pScrn, DisplayModePtr mode);
++                       ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+ #endif /* dual head */
+ #endif /* linux_xf86 */
+@@ -90,49 +77,199 @@ BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, 
+ static ULONG GetDRAMSize(SiS_Private *SiS_Pr,
+                          PSIS_HW_DEVICE_INFO HwDeviceExtension);
+-static void DelaySeconds(int seconds);
+-void SiS_DebugCode(SiS_Private *SiS_Pr, UCHAR code);
+-
+ static void
+-DelaySeconds(int seconds)
++InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
+-  int i;
+-#ifdef WIN2000
+-  int j;
+-#endif
+-
+-  for (i=0;i<seconds;i++) {
+-#ifdef TC
+-    delay(1000);
+-#endif
+-
+-#ifdef WIN2000
+-    for (j=0;j<20000;j++)
+-      VideoPortStallExecution(50);
+-#endif
+-
+-#ifdef WINCE_HEADER
+-#endif
+-
+-#ifdef LINUX_KERNEL
+-#endif
+-  }
+-}
+-
+-void
+-SiS_DebugCode(SiS_Private *SiS_Pr, UCHAR code)
+-{
+-  OutPortByte(0x80, code);
+-  DelaySeconds(0x3);
++   SiS_Pr->SiS_StResInfo     = SiS_StResInfo;
++   SiS_Pr->SiS_ModeResInfo   = SiS_ModeResInfo;
++   SiS_Pr->SiS_StandTable    = SiS_StandTable;
++   if(HwDeviceExtension->jChipType < SIS_315H) {
++      SiS_StandTable[0x04].CRTC[4] = 0x2b;
++      SiS_StandTable[0x05].CRTC[4] = 0x2b;
++      SiS_StandTable[0x06].CRTC[4] = 0x54;
++      SiS_StandTable[0x06].CRTC[5] = 0x80;
++      SiS_StandTable[0x0d].CRTC[4] = 0x2b;
++      SiS_StandTable[0x0e].CRTC[4] = 0x54;
++      SiS_StandTable[0x0e].CRTC[5] = 0x80;
++      SiS_StandTable[0x11].CRTC[4] = 0x54;
++      SiS_StandTable[0x11].CRTC[5] = 0x80;
++      SiS_StandTable[0x11].CRTC[16] = 0x83;
++      SiS_StandTable[0x11].CRTC[17] = 0x85;
++      SiS_StandTable[0x12].CRTC[4] = 0x54;
++      SiS_StandTable[0x12].CRTC[5] = 0x80;
++      SiS_StandTable[0x12].CRTC[16] = 0x83;
++      SiS_StandTable[0x12].CRTC[17] = 0x85;
++      SiS_StandTable[0x13].CRTC[5] = 0xa0;
++      SiS_StandTable[0x17].CRTC[5] = 0xa0;
++      SiS_StandTable[0x1a].CRTC[4] = 0x54;
++      SiS_StandTable[0x1a].CRTC[5] = 0x80;
++      SiS_StandTable[0x1a].CRTC[16] = 0xea;
++      SiS_StandTable[0x1a].CRTC[17] = 0x8c;
++      SiS_StandTable[0x1b].CRTC[4] = 0x54;
++      SiS_StandTable[0x1b].CRTC[5] = 0x80;
++      SiS_StandTable[0x1b].CRTC[16] = 0xea;
++      SiS_StandTable[0x1b].CRTC[17] = 0x8c;
++      SiS_StandTable[0x1c].CRTC[4] = 0x54;
++      SiS_StandTable[0x1c].CRTC[5] = 0x80;
++   } else {
++      SiS_StandTable[0x04].CRTC[4] = 0x2c;
++      SiS_StandTable[0x05].CRTC[4] = 0x2c;
++      SiS_StandTable[0x06].CRTC[4] = 0x55;
++      SiS_StandTable[0x06].CRTC[5] = 0x81;
++      SiS_StandTable[0x0d].CRTC[4] = 0x2c;
++      SiS_StandTable[0x0e].CRTC[4] = 0x55;
++      SiS_StandTable[0x0e].CRTC[5] = 0x81;
++      SiS_StandTable[0x11].CRTC[4] = 0x55;
++      SiS_StandTable[0x11].CRTC[5] = 0x81;
++      SiS_StandTable[0x11].CRTC[16] = 0x82;
++      SiS_StandTable[0x11].CRTC[17] = 0x84;
++      SiS_StandTable[0x12].CRTC[4] = 0x55;
++      SiS_StandTable[0x12].CRTC[5] = 0x81;
++      SiS_StandTable[0x12].CRTC[16] = 0x82;
++      SiS_StandTable[0x12].CRTC[17] = 0x84;
++      SiS_StandTable[0x13].CRTC[5] = 0xb1;
++      SiS_StandTable[0x17].CRTC[5] = 0xb1;
++      SiS_StandTable[0x1a].CRTC[4] = 0x55;
++      SiS_StandTable[0x1a].CRTC[5] = 0x81;
++      SiS_StandTable[0x1a].CRTC[16] = 0xe9;
++      SiS_StandTable[0x1a].CRTC[17] = 0x8b;
++      SiS_StandTable[0x1b].CRTC[4] = 0x55;
++      SiS_StandTable[0x1b].CRTC[5] = 0x81;
++      SiS_StandTable[0x1b].CRTC[16] = 0xe9;
++      SiS_StandTable[0x1b].CRTC[17] = 0x8b;
++      SiS_StandTable[0x1c].CRTC[4] = 0x55;
++      SiS_StandTable[0x1c].CRTC[5] = 0x81;
++   }
++
++   SiS_Pr->SiS_NTSCPhase    = SiS_NTSCPhase;
++   SiS_Pr->SiS_PALPhase     = SiS_PALPhase;
++   SiS_Pr->SiS_NTSCPhase2   = SiS_NTSCPhase2;
++   SiS_Pr->SiS_PALPhase2    = SiS_PALPhase2;
++   SiS_Pr->SiS_PALMPhase    = SiS_PALMPhase;
++   SiS_Pr->SiS_PALNPhase    = SiS_PALNPhase;
++   SiS_Pr->SiS_PALMPhase2   = SiS_PALMPhase2;
++   SiS_Pr->SiS_PALNPhase2   = SiS_PALNPhase2;
++   SiS_Pr->SiS_SpecialPhase = SiS_SpecialPhase;
++
++   SiS_Pr->SiS_NTSCTiming     = SiS_NTSCTiming;
++   SiS_Pr->SiS_PALTiming      = SiS_PALTiming;
++   SiS_Pr->SiS_HiTVSt1Timing  = SiS_HiTVSt1Timing;
++   SiS_Pr->SiS_HiTVSt2Timing  = SiS_HiTVSt2Timing;
++   SiS_Pr->SiS_HiTVTextTiming = SiS_HiTVTextTiming;
++   SiS_Pr->SiS_HiTVExtTiming  = SiS_HiTVExtTiming;
++   SiS_Pr->SiS_HiTVGroup3Data = SiS_HiTVGroup3Data;
++   SiS_Pr->SiS_HiTVGroup3Simu = SiS_HiTVGroup3Simu;
++   SiS_Pr->SiS_HiTVGroup3Text = SiS_HiTVGroup3Text;
++
++   SiS_Pr->SiS_StPALData   = SiS_StPALData;
++   SiS_Pr->SiS_ExtPALData  = SiS_ExtPALData;
++   SiS_Pr->SiS_StNTSCData  = SiS_StNTSCData;
++   SiS_Pr->SiS_ExtNTSCData = SiS_ExtNTSCData;
++/* SiS_Pr->SiS_St1HiTVData = SiS_St1HiTVData;  */
++   SiS_Pr->SiS_St2HiTVData = SiS_St2HiTVData;
++   SiS_Pr->SiS_ExtHiTVData = SiS_ExtHiTVData;
++
++   SiS_Pr->pSiS_OutputSelect = &SiS_OutputSelect;
++   SiS_Pr->pSiS_SoftSetting  = &SiS_SoftSetting;
++
++   SiS_Pr->SiS_LCD1280x960Data      = SiS_LCD1280x960Data;
++   SiS_Pr->SiS_ExtLCD1400x1050Data  = SiS_ExtLCD1400x1050Data;
++   SiS_Pr->SiS_ExtLCD1600x1200Data  = SiS_ExtLCD1600x1200Data;
++   SiS_Pr->SiS_StLCD1400x1050Data   = SiS_StLCD1400x1050Data;
++   SiS_Pr->SiS_StLCD1600x1200Data   = SiS_StLCD1600x1200Data;
++   SiS_Pr->SiS_NoScaleData1400x1050 = SiS_NoScaleData1400x1050;
++   SiS_Pr->SiS_NoScaleData1600x1200 = SiS_NoScaleData1600x1200;
++   SiS_Pr->SiS_ExtLCD1280x768Data   = SiS_ExtLCD1280x768Data;
++   SiS_Pr->SiS_StLCD1280x768Data    = SiS_StLCD1280x768Data;
++   SiS_Pr->SiS_NoScaleData1280x768  = SiS_NoScaleData1280x768;
++   SiS_Pr->SiS_NoScaleData          = SiS_NoScaleData;
++
++   SiS_Pr->SiS_LVDS320x480Data_1   = SiS_LVDS320x480Data_1;
++   SiS_Pr->SiS_LVDS800x600Data_1   = SiS_LVDS800x600Data_1;
++   SiS_Pr->SiS_LVDS800x600Data_2   = SiS_LVDS800x600Data_2;
++   SiS_Pr->SiS_LVDS1024x768Data_1  = SiS_LVDS1024x768Data_1;
++   SiS_Pr->SiS_LVDS1024x768Data_2  = SiS_LVDS1024x768Data_2;
++   SiS_Pr->SiS_LVDS1280x1024Data_1 = SiS_LVDS1280x1024Data_1;
++   SiS_Pr->SiS_LVDS1280x1024Data_2 = SiS_LVDS1280x1024Data_2;
++   SiS_Pr->SiS_LVDS1400x1050Data_1 = SiS_LVDS1400x1050Data_1;
++   SiS_Pr->SiS_LVDS1400x1050Data_2 = SiS_LVDS1400x1050Data_2;
++   SiS_Pr->SiS_LVDS1600x1200Data_1 = SiS_LVDS1600x1200Data_1;
++   SiS_Pr->SiS_LVDS1600x1200Data_2 = SiS_LVDS1600x1200Data_2;
++   SiS_Pr->SiS_LVDS1280x768Data_1  = SiS_LVDS1280x768Data_1;
++   SiS_Pr->SiS_LVDS1280x768Data_2  = SiS_LVDS1280x768Data_2;
++   SiS_Pr->SiS_LVDS1024x600Data_1  = SiS_LVDS1024x600Data_1;
++   SiS_Pr->SiS_LVDS1024x600Data_2  = SiS_LVDS1024x600Data_2;
++   SiS_Pr->SiS_LVDS1152x768Data_1  = SiS_LVDS1152x768Data_1;
++   SiS_Pr->SiS_LVDS1152x768Data_2  = SiS_LVDS1152x768Data_2;
++   SiS_Pr->SiS_LVDSXXXxXXXData_1   = SiS_LVDSXXXxXXXData_1;
++   SiS_Pr->SiS_LVDS1280x960Data_1  = SiS_LVDS1280x960Data_1;
++   SiS_Pr->SiS_LVDS1280x960Data_2  = SiS_LVDS1280x960Data_2;
++   SiS_Pr->SiS_LVDS640x480Data_1   = SiS_LVDS640x480Data_1;
++   SiS_Pr->SiS_LVDS1280x960Data_1  = SiS_LVDS1280x1024Data_1;
++   SiS_Pr->SiS_LVDS1280x960Data_2  = SiS_LVDS1280x1024Data_2;
++   SiS_Pr->SiS_LVDS640x480Data_1   = SiS_LVDS640x480Data_1;
++   SiS_Pr->SiS_LVDS640x480Data_2   = SiS_LVDS640x480Data_2;
++
++   SiS_Pr->SiS_LVDSBARCO1366Data_1 = SiS_LVDSBARCO1366Data_1;
++   SiS_Pr->SiS_LVDSBARCO1366Data_2 = SiS_LVDSBARCO1366Data_2;
++   SiS_Pr->SiS_LVDSBARCO1024Data_1 = SiS_LVDSBARCO1024Data_1;
++   SiS_Pr->SiS_LVDSBARCO1024Data_2 = SiS_LVDSBARCO1024Data_2;
++
++   SiS_Pr->SiS_LCDA1400x1050Data_1 = SiS_LCDA1400x1050Data_1;
++   SiS_Pr->SiS_LCDA1400x1050Data_2 = SiS_LCDA1400x1050Data_2;
++   SiS_Pr->SiS_LCDA1600x1200Data_1 = SiS_LCDA1600x1200Data_1;
++   SiS_Pr->SiS_LCDA1600x1200Data_2 = SiS_LCDA1600x1200Data_2;
++   SiS_Pr->SiS_CHTVUNTSCData = SiS_CHTVUNTSCData;
++   SiS_Pr->SiS_CHTVONTSCData = SiS_CHTVONTSCData;
++
++   SiS_Pr->LVDS1024x768Des_1  = SiS_PanelType1076_1;
++   SiS_Pr->LVDS1280x1024Des_1 = SiS_PanelType1210_1;
++   SiS_Pr->LVDS1400x1050Des_1 = SiS_PanelType1296_1;
++   SiS_Pr->LVDS1600x1200Des_1 = SiS_PanelType1600_1;
++   SiS_Pr->LVDS1024x768Des_2  = SiS_PanelType1076_2;
++   SiS_Pr->LVDS1280x1024Des_2 = SiS_PanelType1210_2;
++   SiS_Pr->LVDS1400x1050Des_2 = SiS_PanelType1296_2;
++   SiS_Pr->LVDS1600x1200Des_2 = SiS_PanelType1600_2;
++
++   SiS_Pr->SiS_PanelTypeNS_1 = SiS_PanelTypeNS_1;
++   SiS_Pr->SiS_PanelTypeNS_2 = SiS_PanelTypeNS_2;
++
++   SiS_Pr->SiS_CHTVUNTSCDesData = SiS_CHTVUNTSCDesData;
++   SiS_Pr->SiS_CHTVONTSCDesData = SiS_CHTVONTSCDesData;
++   SiS_Pr->SiS_CHTVUPALDesData  = SiS_CHTVUPALDesData;
++   SiS_Pr->SiS_CHTVOPALDesData  = SiS_CHTVOPALDesData;
++
++   SiS_Pr->SiS_LVDSCRT11280x768_1    = SiS_LVDSCRT11280x768_1;
++   SiS_Pr->SiS_LVDSCRT11024x600_1    = SiS_LVDSCRT11024x600_1;
++   SiS_Pr->SiS_LVDSCRT11152x768_1    = SiS_LVDSCRT11152x768_1;
++   SiS_Pr->SiS_LVDSCRT11280x768_1_H  = SiS_LVDSCRT11280x768_1_H;
++   SiS_Pr->SiS_LVDSCRT11024x600_1_H  = SiS_LVDSCRT11024x600_1_H;
++   SiS_Pr->SiS_LVDSCRT11152x768_1_H  = SiS_LVDSCRT11152x768_1_H;
++   SiS_Pr->SiS_LVDSCRT11280x768_2    = SiS_LVDSCRT11280x768_2;
++   SiS_Pr->SiS_LVDSCRT11024x600_2    = SiS_LVDSCRT11024x600_2;
++   SiS_Pr->SiS_LVDSCRT11152x768_2    = SiS_LVDSCRT11152x768_2;
++   SiS_Pr->SiS_LVDSCRT11280x768_2_H  = SiS_LVDSCRT11280x768_2_H;
++   SiS_Pr->SiS_LVDSCRT11024x600_2_H  = SiS_LVDSCRT11024x600_2_H;
++   SiS_Pr->SiS_LVDSCRT11152x768_2_H  = SiS_LVDSCRT11152x768_2_H;
++   SiS_Pr->SiS_LVDSCRT1320x480_1     = SiS_LVDSCRT1320x480_1;
++   SiS_Pr->SiS_LVDSCRT1XXXxXXX_1     = SiS_LVDSCRT1XXXxXXX_1;
++   SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H   = SiS_LVDSCRT1XXXxXXX_1_H;
++   SiS_Pr->SiS_LVDSCRT1640x480_1     = SiS_LVDSCRT1640x480_1;
++   SiS_Pr->SiS_LVDSCRT1640x480_1_H   = SiS_LVDSCRT1640x480_1_H;
++   SiS_Pr->SiS_LVDSCRT1640x480_2     = SiS_LVDSCRT1640x480_2;
++   SiS_Pr->SiS_LVDSCRT1640x480_2_H   = SiS_LVDSCRT1640x480_2_H;
++   SiS_Pr->SiS_LVDSCRT1640x480_3     = SiS_LVDSCRT1640x480_3;
++   SiS_Pr->SiS_LVDSCRT1640x480_3_H   = SiS_LVDSCRT1640x480_3_H;
+ }
+ #ifdef SIS300
+ static void
+ InitTo300Pointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
++   InitCommonPointer(SiS_Pr, HwDeviceExtension);
++
+    SiS_Pr->SiS_SModeIDTable  = (SiS_StStruct *)SiS300_SModeIDTable;
+    SiS_Pr->SiS_VBModeIDTable = (SiS_VBModeStruct *)SiS300_VBModeIDTable;
+-   SiS_Pr->SiS_StandTable    = (SiS_StandTableStruct *)SiS300_StandTable;
+    SiS_Pr->SiS_EModeIDTable  = (SiS_ExtStruct *)SiS300_EModeIDTable;
+    SiS_Pr->SiS_RefIndex      = (SiS_Ext2Struct *)SiS300_RefIndex;
+    SiS_Pr->SiS_CRT1Table     = (SiS_CRT1TableStruct *)SiS300_CRT1Table;
+@@ -141,15 +278,12 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    } else {
+       SiS_Pr->SiS_MCLKData_0    = (SiS_MCLKDataStruct *)SiS300_MCLKData_630; /* 630, 730 */
+    }
++#ifdef LINUXBIOS
+    SiS_Pr->SiS_ECLKData      = (SiS_ECLKDataStruct *)SiS300_ECLKData;
++#endif
+    SiS_Pr->SiS_VCLKData      = (SiS_VCLKDataStruct *)SiS300_VCLKData;
+    SiS_Pr->SiS_VBVCLKData    = (SiS_VBVCLKDataStruct *)SiS300_VCLKData;
+    SiS_Pr->SiS_ScreenOffset  = SiS300_ScreenOffset;
+-   SiS_Pr->SiS_StResInfo     = (SiS_StResInfoStruct *)SiS300_StResInfo;
+-   SiS_Pr->SiS_ModeResInfo   = (SiS_ModeResInfoStruct *)SiS300_ModeResInfo;
+-
+-   SiS_Pr->pSiS_OutputSelect = &SiS300_OutputSelect;
+-   SiS_Pr->pSiS_SoftSetting  = &SiS300_SoftSetting;
+    SiS_Pr->SiS_SR15  = SiS300_SR15;
+@@ -178,15 +312,6 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->pSiS_YCSenseData2    = &SiS300_YCSenseData2;
+ #endif
+-   SiS_Pr->SiS_NTSCPhase  = SiS300_NTSCPhase;
+-   SiS_Pr->SiS_PALPhase   = SiS300_PALPhase;
+-   SiS_Pr->SiS_NTSCPhase2 = SiS300_NTSCPhase2;
+-   SiS_Pr->SiS_PALPhase2  = SiS300_PALPhase2;
+-   SiS_Pr->SiS_PALMPhase  = SiS300_PALMPhase;
+-   SiS_Pr->SiS_PALNPhase  = SiS300_PALNPhase;
+-   SiS_Pr->SiS_PALMPhase2 = SiS300_PALMPhase2;
+-   SiS_Pr->SiS_PALNPhase2 = SiS300_PALNPhase2;
+-
+    SiS_Pr->SiS_StLCD1024x768Data    = (SiS_LCDDataStruct *)SiS300_StLCD1024x768Data;
+    SiS_Pr->SiS_ExtLCD1024x768Data   = (SiS_LCDDataStruct *)SiS300_ExtLCD1024x768Data;
+    SiS_Pr->SiS_St2LCD1024x768Data   = (SiS_LCDDataStruct *)SiS300_St2LCD1024x768Data;
+@@ -195,68 +320,18 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_St2LCD1280x1024Data  = (SiS_LCDDataStruct *)SiS300_St2LCD1280x1024Data;
+    SiS_Pr->SiS_NoScaleData1024x768  = (SiS_LCDDataStruct *)SiS300_NoScaleData1024x768;
+    SiS_Pr->SiS_NoScaleData1280x1024 = (SiS_LCDDataStruct *)SiS300_NoScaleData1280x1024;
+-   SiS_Pr->SiS_LCD1280x960Data      = (SiS_LCDDataStruct *)SiS300_LCD1280x960Data;
+-   SiS_Pr->SiS_ExtLCD1400x1050Data  = (SiS_LCDDataStruct *)SiS300_ExtLCD1400x1050Data;
+-   SiS_Pr->SiS_ExtLCD1600x1200Data  = (SiS_LCDDataStruct *)SiS300_ExtLCD1600x1200Data;
+-   SiS_Pr->SiS_StLCD1400x1050Data   = (SiS_LCDDataStruct *)SiS300_StLCD1400x1050Data;
+-   SiS_Pr->SiS_StLCD1600x1200Data   = (SiS_LCDDataStruct *)SiS300_StLCD1600x1200Data;
+-   SiS_Pr->SiS_NoScaleData1400x1050 = (SiS_LCDDataStruct *)SiS300_NoScaleData1400x1050;
+-   SiS_Pr->SiS_NoScaleData1600x1200 = (SiS_LCDDataStruct *)SiS300_NoScaleData1600x1200;
+-
+-   SiS_Pr->SiS_StPALData   = (SiS_TVDataStruct *)SiS300_StPALData;
+-   SiS_Pr->SiS_ExtPALData  = (SiS_TVDataStruct *)SiS300_ExtPALData;
+-   SiS_Pr->SiS_StNTSCData  = (SiS_TVDataStruct *)SiS300_StNTSCData;
+-   SiS_Pr->SiS_ExtNTSCData = (SiS_TVDataStruct *)SiS300_ExtNTSCData;
+-/* SiS_Pr->SiS_St1HiTVData = (SiS_TVDataStruct *)SiS300_St1HiTVData;  */
+-   SiS_Pr->SiS_St2HiTVData = (SiS_TVDataStruct *)SiS300_St2HiTVData;
+-   SiS_Pr->SiS_ExtHiTVData = (SiS_TVDataStruct *)SiS300_ExtHiTVData;
+-
+-   SiS_Pr->SiS_NTSCTiming     = SiS300_NTSCTiming;
+-   SiS_Pr->SiS_PALTiming      = SiS300_PALTiming;
+-   SiS_Pr->SiS_HiTVSt1Timing  = SiS300_HiTVSt1Timing;
+-   SiS_Pr->SiS_HiTVSt2Timing  = SiS300_HiTVSt2Timing;
+-   SiS_Pr->SiS_HiTVTextTiming = SiS300_HiTVTextTiming;
+-   SiS_Pr->SiS_HiTVGroup3Data = SiS300_HiTVGroup3Data;
+-   SiS_Pr->SiS_HiTVGroup3Simu = SiS300_HiTVGroup3Simu;
+-   SiS_Pr->SiS_HiTVGroup3Text = SiS300_HiTVGroup3Text;
+    SiS_Pr->SiS_PanelDelayTbl     = (SiS_PanelDelayTblStruct *)SiS300_PanelDelayTbl;
+    SiS_Pr->SiS_PanelDelayTblLVDS = (SiS_PanelDelayTblStruct *)SiS300_PanelDelayTblLVDS;
+-   SiS_Pr->SiS_LVDS800x600Data_1   = (SiS_LVDSDataStruct *)SiS300_LVDS800x600Data_1;
+-   SiS_Pr->SiS_LVDS800x600Data_2   = (SiS_LVDSDataStruct *)SiS300_LVDS800x600Data_2;
+-   SiS_Pr->SiS_LVDS1024x768Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1024x768Data_1;
+-   SiS_Pr->SiS_LVDS1024x768Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1024x768Data_2;
+-   SiS_Pr->SiS_LVDS1280x1024Data_1 = (SiS_LVDSDataStruct *)SiS300_LVDS1280x1024Data_1;
+-   SiS_Pr->SiS_LVDS1280x1024Data_2 = (SiS_LVDSDataStruct *)SiS300_LVDS1280x1024Data_2;
+-   SiS_Pr->SiS_LVDS1280x960Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1280x1024Data_1;
+-   SiS_Pr->SiS_LVDS1280x960Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1280x1024Data_2;
+-   SiS_Pr->SiS_LVDS1400x1050Data_1 = (SiS_LVDSDataStruct *)SiS300_LVDS1400x1050Data_1;
+-   SiS_Pr->SiS_LVDS1400x1050Data_2 = (SiS_LVDSDataStruct *)SiS300_LVDS1400x1050Data_2;
+-   SiS_Pr->SiS_LVDS1600x1200Data_1 = (SiS_LVDSDataStruct *)SiS300_LVDS1600x1200Data_1;
+-   SiS_Pr->SiS_LVDS1600x1200Data_2 = (SiS_LVDSDataStruct *)SiS300_LVDS1600x1200Data_2;
+-   SiS_Pr->SiS_LVDS1280x768Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1280x768Data_1;
+-   SiS_Pr->SiS_LVDS1280x768Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1280x768Data_2;
+-   SiS_Pr->SiS_LVDS1024x600Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1024x600Data_1;
+-   SiS_Pr->SiS_LVDS1024x600Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1024x600Data_2;
+-   SiS_Pr->SiS_LVDS1152x768Data_1  = (SiS_LVDSDataStruct *)SiS300_LVDS1152x768Data_1;
+-   SiS_Pr->SiS_LVDS1152x768Data_2  = (SiS_LVDSDataStruct *)SiS300_LVDS1152x768Data_2;
+-   SiS_Pr->SiS_LVDSXXXxXXXData_1   = (SiS_LVDSDataStruct *)SiS300_LVDSXXXxXXXData_1;
+-   SiS_Pr->SiS_LVDS320x480Data_1   = (SiS_LVDSDataStruct *)SiS300_LVDS320x480Data_1;
+-   SiS_Pr->SiS_LVDS640x480Data_1   = (SiS_LVDSDataStruct *)SiS300_LVDS640x480Data_1;
+-   SiS_Pr->SiS_LCDA1400x1050Data_1 = (SiS_LVDSDataStruct *)SiS300_LCDA1400x1050Data_1;
+-   SiS_Pr->SiS_LCDA1400x1050Data_2 = (SiS_LVDSDataStruct *)SiS300_LCDA1400x1050Data_2;
+-   SiS_Pr->SiS_LCDA1600x1200Data_1 = (SiS_LVDSDataStruct *)SiS300_LCDA1600x1200Data_1;
+-   SiS_Pr->SiS_LCDA1600x1200Data_2 = (SiS_LVDSDataStruct *)SiS300_LCDA1600x1200Data_2;
+-   SiS_Pr->SiS_CHTVUNTSCData = (SiS_LVDSDataStruct *)SiS300_CHTVUNTSCData;
+-   SiS_Pr->SiS_CHTVONTSCData = (SiS_LVDSDataStruct *)SiS300_CHTVONTSCData;
+    SiS_Pr->SiS_CHTVUPALData  = (SiS_LVDSDataStruct *)SiS300_CHTVUPALData;
+    SiS_Pr->SiS_CHTVOPALData  = (SiS_LVDSDataStruct *)SiS300_CHTVOPALData;
+-   SiS_Pr->SiS_CHTVUPALMData = (SiS_LVDSDataStruct *)SiS300_CHTVUNTSCData; /* not supported on 300 series */
+-   SiS_Pr->SiS_CHTVOPALMData = (SiS_LVDSDataStruct *)SiS300_CHTVONTSCData; /* not supported on 300 series */
++   SiS_Pr->SiS_CHTVUPALMData = SiS_CHTVUNTSCData;                        /* not supported on 300 series */
++   SiS_Pr->SiS_CHTVOPALMData = SiS_CHTVONTSCData;                        /* not supported on 300 series */
+    SiS_Pr->SiS_CHTVUPALNData = (SiS_LVDSDataStruct *)SiS300_CHTVUPALData;  /* not supported on 300 series */
+    SiS_Pr->SiS_CHTVOPALNData = (SiS_LVDSDataStruct *)SiS300_CHTVOPALData;  /* not supported on 300 series */
+    SiS_Pr->SiS_CHTVSOPALData = (SiS_LVDSDataStruct *)SiS300_CHTVSOPALData;
++
+    SiS_Pr->SiS_PanelType00_1 = (SiS_LVDSDesStruct *)SiS300_PanelType00_1;
+    SiS_Pr->SiS_PanelType01_1 = (SiS_LVDSDesStruct *)SiS300_PanelType01_1;
+    SiS_Pr->SiS_PanelType02_1 = (SiS_LVDSDesStruct *)SiS300_PanelType02_1;
+@@ -289,32 +364,28 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_PanelType0d_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0d_2;
+    SiS_Pr->SiS_PanelType0e_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0e_2;
+    SiS_Pr->SiS_PanelType0f_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0f_2;
+-   SiS_Pr->SiS_PanelTypeNS_1 = (SiS_LVDSDesStruct *)SiS300_PanelTypeNS_1;
+-   SiS_Pr->SiS_PanelTypeNS_2 = (SiS_LVDSDesStruct *)SiS300_PanelTypeNS_2;
+-   SiS_Pr->SiS_CHTVUNTSCDesData = (SiS_LVDSDesStruct *)SiS300_CHTVUNTSCDesData;
+-   SiS_Pr->SiS_CHTVONTSCDesData = (SiS_LVDSDesStruct *)SiS300_CHTVONTSCDesData;
+-   SiS_Pr->SiS_CHTVUPALDesData  = (SiS_LVDSDesStruct *)SiS300_CHTVUPALDesData;
+-   SiS_Pr->SiS_CHTVOPALDesData  = (SiS_LVDSDesStruct *)SiS300_CHTVOPALDesData;
++
++   if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
++      SiS_Pr->SiS_PanelType04_1 = (SiS_LVDSDesStruct *)SiS300_PanelType04_1a;
++      SiS_Pr->SiS_PanelType04_2 = (SiS_LVDSDesStruct *)SiS300_PanelType04_2a;
++   }
++   if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
++      SiS_Pr->SiS_PanelType04_1 = (SiS_LVDSDesStruct *)SiS300_PanelType04_1b;
++      SiS_Pr->SiS_PanelType04_2 = (SiS_LVDSDesStruct *)SiS300_PanelType04_2b;
++   }
++
+    SiS_Pr->SiS_LVDSCRT1800x600_1     = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_1;
+    SiS_Pr->SiS_LVDSCRT11024x768_1    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_1;
+    SiS_Pr->SiS_LVDSCRT11280x1024_1   = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_1;
+-   SiS_Pr->SiS_LVDSCRT11024x600_1    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x600_1;
+-   SiS_Pr->SiS_LVDSCRT11152x768_1    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11152x768_1;
+    SiS_Pr->SiS_LVDSCRT1800x600_1_H   = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_1_H;
+    SiS_Pr->SiS_LVDSCRT11024x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_1_H;
+    SiS_Pr->SiS_LVDSCRT11280x1024_1_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_1_H;
+-   SiS_Pr->SiS_LVDSCRT11024x600_1_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x600_1_H;
+-   SiS_Pr->SiS_LVDSCRT11152x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11152x768_1_H;
+    SiS_Pr->SiS_LVDSCRT1800x600_2     = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_2;
+    SiS_Pr->SiS_LVDSCRT11024x768_2    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_2;
+    SiS_Pr->SiS_LVDSCRT11280x1024_2   = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_2;
+-   SiS_Pr->SiS_LVDSCRT11024x600_2    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x600_2;
+-   SiS_Pr->SiS_LVDSCRT11152x768_2    = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11152x768_2;
+    SiS_Pr->SiS_LVDSCRT1800x600_2_H   = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_2_H;
+    SiS_Pr->SiS_LVDSCRT11024x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_2_H;
+    SiS_Pr->SiS_LVDSCRT11280x1024_2_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_2_H;
+-   SiS_Pr->SiS_LVDSCRT11024x600_2_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x600_2_H;
+-   SiS_Pr->SiS_LVDSCRT11152x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11152x768_2_H;
+    SiS_Pr->SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1UNTSC;
+    SiS_Pr->SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1ONTSC;
+    SiS_Pr->SiS_CHTVCRT1UPAL  = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1UPAL;
+@@ -339,7 +410,6 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CHTVVCLKOPALN = SiS300_CHTVVCLKOPAL;   /* not supported on 300 series */
+    SiS_Pr->SiS_CHTVVCLKSOPAL = SiS300_CHTVVCLKSOPAL;
+-   /* TW: New from 300/301LV BIOS */
+    SiS_Pr->SiS_CRT2Part2_1024x768_1  = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1024x768_1;
+    SiS_Pr->SiS_CRT2Part2_1280x1024_1 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1280x1024_1;
+    SiS_Pr->SiS_CRT2Part2_1400x1050_1 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1400x1050_1;
+@@ -353,7 +423,7 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CRT2Part2_1400x1050_3 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1400x1050_3;
+    SiS_Pr->SiS_CRT2Part2_1600x1200_3 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1600x1200_3;
+-   /* TW: LCDResInfo will on 300 series be translated to 310/325 series definitions */
++   /* TW: LCDResInfo will on 300 series be translated to 315 series definitions */
+    SiS_Pr->SiS_Panel320x480   = Panel_320x480;
+    SiS_Pr->SiS_Panel640x480   = Panel_640x480;
+    SiS_Pr->SiS_Panel800x600   = Panel_800x600;
+@@ -362,13 +432,17 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_Panel1280x960  = Panel_1280x960;
+    SiS_Pr->SiS_Panel1024x600  = Panel_1024x600;
+    SiS_Pr->SiS_Panel1152x768  = Panel_1152x768;
+-   SiS_Pr->SiS_Panel1600x1200 = 16;           /* TW: Something illegal */
+-   SiS_Pr->SiS_Panel1400x1050 = 16;           /* TW: Something illegal */
+-   SiS_Pr->SiS_Panel1152x864  = 16;                   /* TW: Something illegal */
+-   SiS_Pr->SiS_Panel1280x768  = 16;                   /* TW: Something illegal */
++   SiS_Pr->SiS_Panel1280x768  = Panel_1280x768;
++   SiS_Pr->SiS_Panel1600x1200 = 255;                  /* TW: Something illegal */
++   SiS_Pr->SiS_Panel1400x1050 = 255;                  /* TW: Something illegal */
++   SiS_Pr->SiS_Panel640x480_2 = 255;                  /* TW: Something illegal */
++   SiS_Pr->SiS_Panel640x480_3 = 255;                  /* TW: Something illegal */
++   SiS_Pr->SiS_Panel1152x864  = 255;                  /* TW: Something illegal */
+    SiS_Pr->SiS_PanelMax       = Panel_320x480;     /* TW: highest value */
+    SiS_Pr->SiS_PanelMinLVDS   = Panel_800x600;     /* TW: Lowest value LVDS */
+    SiS_Pr->SiS_PanelMin301    = Panel_1024x768;    /* TW: lowest value 301 */
++   SiS_Pr->SiS_PanelCustom    = Panel_Custom;
++   SiS_Pr->SiS_PanelBarco1366 = Panel_Barco1366;
+ }
+ #endif
+@@ -376,29 +450,33 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PS
+ static void
+ InitTo310Pointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+ {
++   InitCommonPointer(SiS_Pr, HwDeviceExtension);
++
+    SiS_Pr->SiS_SModeIDTable  = (SiS_StStruct *)SiS310_SModeIDTable;
+-   SiS_Pr->SiS_StandTable    = (SiS_StandTableStruct *)SiS310_StandTable;
+    SiS_Pr->SiS_EModeIDTable  = (SiS_ExtStruct *)SiS310_EModeIDTable;
+    SiS_Pr->SiS_RefIndex      = (SiS_Ext2Struct *)SiS310_RefIndex;
+    SiS_Pr->SiS_CRT1Table     = (SiS_CRT1TableStruct *)SiS310_CRT1Table;
+    /* TW: MCLK is different */
+-   if(HwDeviceExtension->jChipType == SIS_330) {
++#ifdef LINUXBIOS
++   if(HwDeviceExtension->jChipType == SIS_660) {
++      SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_660;  /* 660 */
++   } else if(HwDeviceExtension->jChipType == SIS_330) {
++#endif
+       SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_330;  /* 330 */
++#ifdef LINUXBIOS
+    } else if(HwDeviceExtension->jChipType > SIS_315PRO) {
+       SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_650;  /* 550, 650, 740 */
+    } else {
+       SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_315;  /* 315 */
+    }
++#endif
+    SiS_Pr->SiS_MCLKData_1    = (SiS_MCLKDataStruct *)SiS310_MCLKData_1;
++#ifdef LINUXBIOS
+    SiS_Pr->SiS_ECLKData      = (SiS_ECLKDataStruct *)SiS310_ECLKData;
++#endif
+    SiS_Pr->SiS_VCLKData      = (SiS_VCLKDataStruct *)SiS310_VCLKData;
+    SiS_Pr->SiS_VBVCLKData    = (SiS_VBVCLKDataStruct *)SiS310_VBVCLKData;
+    SiS_Pr->SiS_ScreenOffset  = SiS310_ScreenOffset;
+-   SiS_Pr->SiS_StResInfo     = (SiS_StResInfoStruct *)SiS310_StResInfo;
+-   SiS_Pr->SiS_ModeResInfo   = (SiS_ModeResInfoStruct *)SiS310_ModeResInfo;
+-
+-   SiS_Pr->pSiS_OutputSelect = &SiS310_OutputSelect;
+-   SiS_Pr->pSiS_SoftSetting  = &SiS310_SoftSetting;
+    SiS_Pr->SiS_SR15  = SiS310_SR15;
+@@ -427,16 +505,6 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->pSiS_YCSenseData2    = &SiS310_YCSenseData2;
+ #endif
+-   SiS_Pr->SiS_NTSCPhase    = SiS310_NTSCPhase;
+-   SiS_Pr->SiS_PALPhase     = SiS310_PALPhase;
+-   SiS_Pr->SiS_NTSCPhase2   = SiS310_NTSCPhase2;
+-   SiS_Pr->SiS_PALPhase2    = SiS310_PALPhase2;
+-   SiS_Pr->SiS_PALMPhase    = SiS310_PALMPhase;
+-   SiS_Pr->SiS_PALNPhase    = SiS310_PALNPhase;
+-   SiS_Pr->SiS_PALMPhase2   = SiS310_PALMPhase2;
+-   SiS_Pr->SiS_PALNPhase2   = SiS310_PALNPhase2;
+-   SiS_Pr->SiS_SpecialPhase = SiS310_SpecialPhase;
+-
+    SiS_Pr->SiS_StLCD1024x768Data    = (SiS_LCDDataStruct *)SiS310_StLCD1024x768Data;
+    SiS_Pr->SiS_ExtLCD1024x768Data   = (SiS_LCDDataStruct *)SiS310_ExtLCD1024x768Data;
+    SiS_Pr->SiS_St2LCD1024x768Data   = (SiS_LCDDataStruct *)SiS310_St2LCD1024x768Data;
+@@ -445,62 +513,10 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_St2LCD1280x1024Data  = (SiS_LCDDataStruct *)SiS310_St2LCD1280x1024Data;
+    SiS_Pr->SiS_NoScaleData1024x768  = (SiS_LCDDataStruct *)SiS310_NoScaleData1024x768;
+    SiS_Pr->SiS_NoScaleData1280x1024 = (SiS_LCDDataStruct *)SiS310_NoScaleData1280x1024;
+-   SiS_Pr->SiS_LCD1280x960Data      = (SiS_LCDDataStruct *)SiS310_LCD1280x960Data;
+-   SiS_Pr->SiS_ExtLCD1400x1050Data  = (SiS_LCDDataStruct *)SiS310_ExtLCD1400x1050Data;
+-   SiS_Pr->SiS_ExtLCD1600x1200Data  = (SiS_LCDDataStruct *)SiS310_ExtLCD1600x1200Data;
+-   SiS_Pr->SiS_StLCD1400x1050Data   = (SiS_LCDDataStruct *)SiS310_StLCD1400x1050Data;
+-   SiS_Pr->SiS_StLCD1600x1200Data   = (SiS_LCDDataStruct *)SiS310_StLCD1600x1200Data;
+-   SiS_Pr->SiS_NoScaleData1400x1050 = (SiS_LCDDataStruct *)SiS310_NoScaleData1400x1050;
+-   SiS_Pr->SiS_NoScaleData1600x1200 = (SiS_LCDDataStruct *)SiS310_NoScaleData1600x1200;
+-
+-   SiS_Pr->SiS_StPALData   = (SiS_TVDataStruct *)SiS310_StPALData;
+-   SiS_Pr->SiS_ExtPALData  = (SiS_TVDataStruct *)SiS310_ExtPALData;
+-   SiS_Pr->SiS_StNTSCData  = (SiS_TVDataStruct *)SiS310_StNTSCData;
+-   SiS_Pr->SiS_ExtNTSCData = (SiS_TVDataStruct *)SiS310_ExtNTSCData;
+-/* SiS_Pr->SiS_St1HiTVData = (SiS_TVDataStruct *)SiS310_St1HiTVData;  */
+-   SiS_Pr->SiS_St2HiTVData = (SiS_TVDataStruct *)SiS310_St2HiTVData;
+-   SiS_Pr->SiS_ExtHiTVData = (SiS_TVDataStruct *)SiS310_ExtHiTVData;
+-
+-   SiS_Pr->SiS_NTSCTiming     = SiS310_NTSCTiming;
+-   SiS_Pr->SiS_PALTiming      = SiS310_PALTiming;
+-   SiS_Pr->SiS_HiTVSt1Timing  = SiS310_HiTVSt1Timing;
+-   SiS_Pr->SiS_HiTVSt2Timing  = SiS310_HiTVSt2Timing;
+-   SiS_Pr->SiS_HiTVTextTiming = SiS310_HiTVTextTiming;
+-   SiS_Pr->SiS_HiTVExtTiming  = SiS310_HiTVExtTiming;
+-   SiS_Pr->SiS_HiTVGroup3Data = SiS310_HiTVGroup3Data;
+-   SiS_Pr->SiS_HiTVGroup3Simu = SiS310_HiTVGroup3Simu;
+-   SiS_Pr->SiS_HiTVGroup3Text = SiS310_HiTVGroup3Text;
+-   SiS_Pr->SiS_PanelDelayTbl = (SiS_PanelDelayTblStruct *)SiS310_PanelDelayTbl;
++   SiS_Pr->SiS_PanelDelayTbl     = (SiS_PanelDelayTblStruct *)SiS310_PanelDelayTbl;
+    SiS_Pr->SiS_PanelDelayTblLVDS = (SiS_PanelDelayTblStruct *)SiS310_PanelDelayTblLVDS;
+-   SiS_Pr->SiS_LVDS800x600Data_1   = (SiS_LVDSDataStruct *)SiS310_LVDS800x600Data_1;
+-   SiS_Pr->SiS_LVDS800x600Data_2   = (SiS_LVDSDataStruct *)SiS310_LVDS800x600Data_2;
+-   SiS_Pr->SiS_LVDS1024x768Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1024x768Data_1;
+-   SiS_Pr->SiS_LVDS1024x768Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1024x768Data_2;
+-   SiS_Pr->SiS_LVDS1280x1024Data_1 = (SiS_LVDSDataStruct *)SiS310_LVDS1280x1024Data_1;
+-   SiS_Pr->SiS_LVDS1280x1024Data_2 = (SiS_LVDSDataStruct *)SiS310_LVDS1280x1024Data_2;
+-   SiS_Pr->SiS_LVDS1280x960Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1280x960Data_1;
+-   SiS_Pr->SiS_LVDS1280x960Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1280x960Data_2;
+-   SiS_Pr->SiS_LVDS1400x1050Data_1 = (SiS_LVDSDataStruct *)SiS310_LVDS1400x1050Data_1;
+-   SiS_Pr->SiS_LVDS1400x1050Data_2 = (SiS_LVDSDataStruct *)SiS310_LVDS1400x1050Data_2;
+-   SiS_Pr->SiS_LVDS1600x1200Data_1 = (SiS_LVDSDataStruct *)SiS310_LVDS1600x1200Data_1;
+-   SiS_Pr->SiS_LVDS1600x1200Data_2 = (SiS_LVDSDataStruct *)SiS310_LVDS1600x1200Data_2;
+-   SiS_Pr->SiS_LVDS1280x768Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1280x768Data_1;
+-   SiS_Pr->SiS_LVDS1280x768Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1280x768Data_2;
+-   SiS_Pr->SiS_LVDS1024x600Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1024x600Data_1;
+-   SiS_Pr->SiS_LVDS1024x600Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1024x600Data_2;
+-   SiS_Pr->SiS_LVDS1152x768Data_1  = (SiS_LVDSDataStruct *)SiS310_LVDS1152x768Data_1;
+-   SiS_Pr->SiS_LVDS1152x768Data_2  = (SiS_LVDSDataStruct *)SiS310_LVDS1152x768Data_2;
+-   SiS_Pr->SiS_LVDSXXXxXXXData_1   = (SiS_LVDSDataStruct *)SiS310_LVDSXXXxXXXData_1;
+-   SiS_Pr->SiS_LVDS320x480Data_1   = (SiS_LVDSDataStruct *)SiS310_LVDS320x480Data_1;
+-   SiS_Pr->SiS_LVDS640x480Data_1   = (SiS_LVDSDataStruct *)SiS310_LVDS640x480Data_1;
+-   SiS_Pr->SiS_LCDA1400x1050Data_1  = (SiS_LVDSDataStruct *)SiS310_LCDA1400x1050Data_1;
+-   SiS_Pr->SiS_LCDA1400x1050Data_2  = (SiS_LVDSDataStruct *)SiS310_LCDA1400x1050Data_2;
+-   SiS_Pr->SiS_LCDA1600x1200Data_1  = (SiS_LVDSDataStruct *)SiS310_LCDA1600x1200Data_1;
+-   SiS_Pr->SiS_LCDA1600x1200Data_2  = (SiS_LVDSDataStruct *)SiS310_LCDA1600x1200Data_2;
+-   SiS_Pr->SiS_CHTVUNTSCData = (SiS_LVDSDataStruct *)SiS310_CHTVUNTSCData;
+-   SiS_Pr->SiS_CHTVONTSCData = (SiS_LVDSDataStruct *)SiS310_CHTVONTSCData;
+    SiS_Pr->SiS_CHTVUPALData  = (SiS_LVDSDataStruct *)SiS310_CHTVUPALData;
+    SiS_Pr->SiS_CHTVOPALData  = (SiS_LVDSDataStruct *)SiS310_CHTVOPALData;
+    SiS_Pr->SiS_CHTVUPALMData = (SiS_LVDSDataStruct *)SiS310_CHTVUPALMData;
+@@ -508,6 +524,7 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CHTVUPALNData = (SiS_LVDSDataStruct *)SiS310_CHTVUPALNData;
+    SiS_Pr->SiS_CHTVOPALNData = (SiS_LVDSDataStruct *)SiS310_CHTVOPALNData;
+    SiS_Pr->SiS_CHTVSOPALData = (SiS_LVDSDataStruct *)SiS310_CHTVSOPALData;
++
+    SiS_Pr->SiS_PanelType00_1 = (SiS_LVDSDesStruct *)SiS310_PanelType00_1;
+    SiS_Pr->SiS_PanelType01_1 = (SiS_LVDSDesStruct *)SiS310_PanelType01_1;
+    SiS_Pr->SiS_PanelType02_1 = (SiS_LVDSDesStruct *)SiS310_PanelType02_1;
+@@ -540,19 +557,7 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_PanelType0d_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0d_2;
+    SiS_Pr->SiS_PanelType0e_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0e_2;
+    SiS_Pr->SiS_PanelType0f_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0f_2;
+-   SiS_Pr->SiS_PanelTypeNS_1 = (SiS_LVDSDesStruct *)SiS310_PanelTypeNS_1;
+-   SiS_Pr->SiS_PanelTypeNS_2 = (SiS_LVDSDesStruct *)SiS310_PanelTypeNS_2;
+-
+-   SiS_Pr->LVDS1024x768Des_1  = (SiS_LVDSDesStruct *)SiS310_PanelType1076_1;
+-   SiS_Pr->LVDS1280x1024Des_1 = (SiS_LVDSDesStruct *)SiS310_PanelType1210_1;
+-   SiS_Pr->LVDS1400x1050Des_1 = (SiS_LVDSDesStruct *)SiS310_PanelType1296_1 ;
+-   SiS_Pr->LVDS1600x1200Des_1 = (SiS_LVDSDesStruct *)SiS310_PanelType1600_1 ;
+-   SiS_Pr->LVDS1024x768Des_2  = (SiS_LVDSDesStruct *)SiS310_PanelType1076_2;
+-   SiS_Pr->LVDS1280x1024Des_2 = (SiS_LVDSDesStruct *)SiS310_PanelType1210_2;
+-   SiS_Pr->LVDS1400x1050Des_2 = (SiS_LVDSDesStruct *)SiS310_PanelType1296_2;
+-   SiS_Pr->LVDS1600x1200Des_2 = (SiS_LVDSDesStruct *)SiS310_PanelType1600_2 ;
+-   /* TW: New from 650/301LV BIOS */
+    SiS_Pr->SiS_CRT2Part2_1024x768_1  = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_1;
+    SiS_Pr->SiS_CRT2Part2_1280x1024_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_1;
+    SiS_Pr->SiS_CRT2Part2_1400x1050_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_1;
+@@ -566,51 +571,32 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CRT2Part2_1400x1050_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_3;
+    SiS_Pr->SiS_CRT2Part2_1600x1200_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_3;
+-   SiS_Pr->SiS_CHTVUNTSCDesData = (SiS_LVDSDesStruct *)SiS310_CHTVUNTSCDesData;
+-   SiS_Pr->SiS_CHTVONTSCDesData = (SiS_LVDSDesStruct *)SiS310_CHTVONTSCDesData;
+-   SiS_Pr->SiS_CHTVUPALDesData  = (SiS_LVDSDesStruct *)SiS310_CHTVUPALDesData;
+-   SiS_Pr->SiS_CHTVOPALDesData  = (SiS_LVDSDesStruct *)SiS310_CHTVOPALDesData;
+-
+    SiS_Pr->SiS_LVDSCRT1800x600_1     = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1;
+    SiS_Pr->SiS_LVDSCRT11024x768_1    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1;
+    SiS_Pr->SiS_LVDSCRT11280x1024_1   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1;
+    SiS_Pr->SiS_LVDSCRT11400x1050_1   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1;
+-   SiS_Pr->SiS_LVDSCRT11280x768_1    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x768_1;
+-   SiS_Pr->SiS_LVDSCRT11024x600_1    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x600_1;
+-   SiS_Pr->SiS_LVDSCRT11152x768_1    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11152x768_1;
+    SiS_Pr->SiS_LVDSCRT11600x1200_1   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1;
+    SiS_Pr->SiS_LVDSCRT1800x600_1_H   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1_H;
+    SiS_Pr->SiS_LVDSCRT11024x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1_H;
+    SiS_Pr->SiS_LVDSCRT11280x1024_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1_H;
+    SiS_Pr->SiS_LVDSCRT11400x1050_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1_H;
+-   SiS_Pr->SiS_LVDSCRT11280x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x768_1_H;
+-   SiS_Pr->SiS_LVDSCRT11024x600_1_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x600_1_H;
+-   SiS_Pr->SiS_LVDSCRT11152x768_1_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11152x768_1_H;
+    SiS_Pr->SiS_LVDSCRT11600x1200_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1_H;
+    SiS_Pr->SiS_LVDSCRT1800x600_2     = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2;
+    SiS_Pr->SiS_LVDSCRT11024x768_2    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2;
+    SiS_Pr->SiS_LVDSCRT11280x1024_2   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2;
+    SiS_Pr->SiS_LVDSCRT11400x1050_2   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2;
+-   SiS_Pr->SiS_LVDSCRT11280x768_2    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x768_2;
+-   SiS_Pr->SiS_LVDSCRT11024x600_2    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x600_2;
+-   SiS_Pr->SiS_LVDSCRT11152x768_2    = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11152x768_2;
+    SiS_Pr->SiS_LVDSCRT11600x1200_2   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2;
+    SiS_Pr->SiS_LVDSCRT1800x600_2_H   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2_H;
+    SiS_Pr->SiS_LVDSCRT11024x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2_H;
+    SiS_Pr->SiS_LVDSCRT11280x1024_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2_H;
+    SiS_Pr->SiS_LVDSCRT11400x1050_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2_H;
+-   SiS_Pr->SiS_LVDSCRT11280x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x768_2_H;
+-   SiS_Pr->SiS_LVDSCRT11024x600_2_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x600_2_H;
+-   SiS_Pr->SiS_LVDSCRT11152x768_2_H  = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11152x768_2_H;
+    SiS_Pr->SiS_LVDSCRT11600x1200_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2_H;
+-   SiS_Pr->SiS_LVDSCRT1XXXxXXX_1     = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1XXXxXXX_1;
+-   SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H   = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1XXXxXXX_1_H;
+-   SiS_Pr->SiS_LVDSCRT1320x480_1     = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1320x480_1;
+-   SiS_Pr->SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UNTSC;
+-   SiS_Pr->SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1ONTSC;
+-   SiS_Pr->SiS_CHTVCRT1UPAL  = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UPAL;
+-   SiS_Pr->SiS_CHTVCRT1OPAL  = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1OPAL;
+-   SiS_Pr->SiS_CHTVCRT1SOPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1SOPAL;
++   SiS_Pr->SiS_CHTVCRT1UNTSC         = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UNTSC;
++   SiS_Pr->SiS_CHTVCRT1ONTSC         = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1ONTSC;
++   SiS_Pr->SiS_CHTVCRT1UPAL          = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UPAL;
++   SiS_Pr->SiS_CHTVCRT1OPAL          = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1OPAL;
++   SiS_Pr->SiS_CHTVCRT1SOPAL         = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1SOPAL;
++
+    SiS_Pr->SiS_CHTVReg_UNTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UNTSC;
+    SiS_Pr->SiS_CHTVReg_ONTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_ONTSC;
+    SiS_Pr->SiS_CHTVReg_UPAL  = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPAL;
+@@ -620,6 +606,7 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_CHTVReg_UPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPALN;
+    SiS_Pr->SiS_CHTVReg_OPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPALN;
+    SiS_Pr->SiS_CHTVReg_SOPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_SOPAL;
++
+    SiS_Pr->SiS_LCDACRT1800x600_1     = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_1;
+    SiS_Pr->SiS_LCDACRT11024x768_1    = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_1;
+    SiS_Pr->SiS_LCDACRT11280x1024_1   = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_1;
+@@ -640,6 +627,7 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_LCDACRT11280x1024_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_2_H;
+    SiS_Pr->SiS_LCDACRT11400x1050_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_2_H;
+    SiS_Pr->SiS_LCDACRT11600x1200_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_2_H;
++
+    SiS_Pr->SiS_CHTVVCLKUNTSC = SiS310_CHTVVCLKUNTSC;
+    SiS_Pr->SiS_CHTVVCLKONTSC = SiS310_CHTVVCLKONTSC;
+    SiS_Pr->SiS_CHTVVCLKUPAL  = SiS310_CHTVVCLKUPAL;
+@@ -662,9 +650,13 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PS
+    SiS_Pr->SiS_Panel1152x864  = Panel_1152x864;
+    SiS_Pr->SiS_Panel1280x768  = Panel_1280x768;
+    SiS_Pr->SiS_Panel1024x600  = Panel_1024x600;
++   SiS_Pr->SiS_Panel640x480_2 = Panel_640x480_2;
++   SiS_Pr->SiS_Panel640x480_3 = Panel_640x480_3;
+    SiS_Pr->SiS_PanelMax       = Panel_320x480;    /* TW: highest value */
+    SiS_Pr->SiS_PanelMinLVDS   = Panel_800x600;    /* TW: lowest value LVDS/LCDA */
+    SiS_Pr->SiS_PanelMin301    = Panel_1024x768;   /* TW: lowest value 301 */
++   SiS_Pr->SiS_PanelCustom    = Panel_Custom;
++   SiS_Pr->SiS_PanelBarco1366 = 255;
+ }
+ #endif
+@@ -727,7 +719,8 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330))
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660))
+      InitTo310Pointer(SiS_Pr, HwDeviceExtension);
+ #endif
+@@ -896,7 +889,8 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330)) {
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660)) {
+       for(i=0x12; i<=0x1B; i++) SiS_SetReg1(SiS_Pr->SiS_P3c4,i,0);
+       for(i=0x79; i<=0x7C; i++) SiS_SetReg1(SiS_Pr->SiS_P3d4,i,0);
+    }
+@@ -953,14 +947,15 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+    if((HwDeviceExtension->jChipType == SIS_315H)   ||
+       (HwDeviceExtension->jChipType == SIS_315)    ||
+       (HwDeviceExtension->jChipType == SIS_315PRO) ||
+-      (HwDeviceExtension->jChipType == SIS_330) ) {
++      (HwDeviceExtension->jChipType == SIS_330)) {
+               if((*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) == 0) {
+               temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A) & 0x03;
+         }
+    }
+    if((HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_650)) {
++      (HwDeviceExtension->jChipType == SIS_650) ||
++      (HwDeviceExtension->jChipType == SIS_660)) {
+         if((*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) == 0) {
+               temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x07;
+         }
+@@ -977,7 +972,7 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+    if((HwDeviceExtension->jChipType != SIS_540) &&
+       (HwDeviceExtension->jChipType != SIS_630) &&
+       (HwDeviceExtension->jChipType != SIS_730)){
+-      for(i=0x15;i<0x1C;i++) {
++      for(i=0x15; i<0x1C; i++) {
+                   SiS_SetReg1(SiS_Pr->SiS_P3c4,i,SiS_Pr->SiS_SR15[i-0x15][SiS_Pr->SiS_RAMType]);
+       }
+    }
+@@ -1023,7 +1018,8 @@ SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEV
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330))
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660))
+       SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2E,0x08);    /* use VB */
+ #endif
+@@ -1180,7 +1176,8 @@ SiS_Set_LVDS_TRUMPION(SiS_Private *SiS_P
+ #ifdef SIS315H
+   if((HwDeviceExtension->jChipType == SIS_650) ||
+      (HwDeviceExtension->jChipType == SIS_740) ||
+-     (HwDeviceExtension->jChipType == SIS_330)) {
++     (HwDeviceExtension->jChipType == SIS_330) ||
++     (HwDeviceExtension->jChipType == SIS_660)) {
+ #if 0 /* TW: This is not required */
+         /* TW: Read POWER_ON_TRAP and copy to CR37 */
+       temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1A);
+@@ -1299,7 +1296,7 @@ SiS_ChkBUSWidth_300(SiS_Private *SiS_Pr,
+ #endif
+ /* ===============  SiS 300 dram sizing end    =============== */
+-/* ============  SiS 310/325 dram sizing begin  ============== */
++/* ============  SiS 315 dram sizing begin  ============== */
+ #ifdef SIS315H
+ /* TW: Moved Get310DRAMType further down */
+@@ -1893,8 +1890,7 @@ SiS_Get310DRAMType(SiS_Private *SiS_Pr, 
+    if(*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) {
+      data = *SiS_Pr->pSiS_SoftSetting & 0x03;
+    } else {
+-     if((HwDeviceExtension->jChipType > SIS_315PRO) &&
+-        (HwDeviceExtension->jChipType < SIS_330)) {
++     if(IS_SIS550650740660) {
+         data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x07;
+      } else { /* TW: 315, 330 */
+         data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3a) & 0x03;
+@@ -1934,13 +1930,17 @@ void SiSRegInit(SiS_Private *SiS_Pr, USH
+    SiS_Pr->SiS_P3c7 = BaseAddr + 0x17;
+    SiS_Pr->SiS_P3c8 = BaseAddr + 0x18;
+    SiS_Pr->SiS_P3c9 = BaseAddr + 0x19;
+-   SiS_Pr->SiS_P3da = BaseAddr + 0x2A;
+-   SiS_Pr->SiS_Part1Port = BaseAddr + SIS_CRT2_PORT_04;   /* Digital video interface registers (LCD) */
+-   SiS_Pr->SiS_Part2Port = BaseAddr + SIS_CRT2_PORT_10;   /* 301 TV Encoder registers */
+-   SiS_Pr->SiS_Part3Port = BaseAddr + SIS_CRT2_PORT_12;   /* 301 Macrovision registers */
+-   SiS_Pr->SiS_Part4Port = BaseAddr + SIS_CRT2_PORT_14;   /* 301 VGA2 (and LCD) registers */
+-   SiS_Pr->SiS_Part5Port = BaseAddr + SIS_CRT2_PORT_14+2; /* 301 palette address port registers */
+-   SiS_Pr->SiS_DDC_Port = BaseAddr + 0x14;                /* DDC Port ( = P3C4, SR11/0A) */
++   SiS_Pr->SiS_P3cb = BaseAddr + 0x1b;
++   SiS_Pr->SiS_P3cd = BaseAddr + 0x1d;
++   SiS_Pr->SiS_P3da = BaseAddr + 0x2a;
++   SiS_Pr->SiS_Part1Port = BaseAddr + SIS_CRT2_PORT_04;     /* Digital video interface registers (LCD) */
++   SiS_Pr->SiS_Part2Port = BaseAddr + SIS_CRT2_PORT_10;     /* 301 TV Encoder registers */
++   SiS_Pr->SiS_Part3Port = BaseAddr + SIS_CRT2_PORT_12;     /* 301 Macrovision registers */
++   SiS_Pr->SiS_Part4Port = BaseAddr + SIS_CRT2_PORT_14;     /* 301 VGA2 (and LCD) registers */
++   SiS_Pr->SiS_Part5Port = BaseAddr + SIS_CRT2_PORT_14 + 2; /* 301 palette address port registers */
++   SiS_Pr->SiS_DDC_Port = BaseAddr + 0x14;                  /* DDC Port ( = P3C4, SR11/0A) */
++   SiS_Pr->SiS_VidCapt = BaseAddr + SIS_VIDEO_CAPTURE;
++   SiS_Pr->SiS_VidPlay = BaseAddr + SIS_VIDEO_PLAYBACK;
+ }
+ void
+@@ -1965,7 +1965,8 @@ SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330)) {
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660)) {
+       /* TW: This seems to be done the same way on these chipsets */
+       SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1);
+       SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1E,0xFF,0x5A);
+@@ -1987,10 +1988,14 @@ SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_
+    SiS_Pr->SiS_ChrontelInit = 0;
+-   if((ModeNo == 0x5a) || (ModeNo == 0x5b)) {
+-      SiS_Pr->SiS_IF_DEF_DSTN = 1;   /* for 550 dstn */
+-      SiS_Pr->SiS_IF_DEF_FSTN = 1;   /* for fstn */
++#if 0
++   if(HwDeviceExtension->jChipType >= SIS_315H) {
++      if((ModeNo == 0x5a) || (ModeNo == 0x5b)) {
++       SiS_Pr->SiS_IF_DEF_DSTN = 1;   /* for 550 dstn */
++       SiS_Pr->SiS_IF_DEF_FSTN = 1;   /* for fstn */
++      }
+    }
++#endif
+ #ifdef SIS300
+    if((HwDeviceExtension->jChipType == SIS_540) ||
+@@ -2015,11 +2020,14 @@ SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_
+    if((HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330))
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660))
+     {
+-        /* TW: CR37 is different on 310/325 series */
++        /* TW: CR37 is different on 315 series */
++#if 0
+         if(SiS_Pr->SiS_IF_DEF_FSTN)                       /* fstn: set CR37=0x04 */
+              SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,0x04);      /* (fake LVDS bridge) */
++#endif
+       temp=SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
+               temp = (temp & 0x0E) >> 1;
+@@ -2044,7 +2052,8 @@ SiSInitPtr(SiS_Private *SiS_Pr, PSIS_HW_
+       (HwDeviceExtension->jChipType == SIS_550) ||
+       (HwDeviceExtension->jChipType == SIS_650) ||
+       (HwDeviceExtension->jChipType == SIS_740) ||
+-      (HwDeviceExtension->jChipType == SIS_330))
++      (HwDeviceExtension->jChipType == SIS_330) ||
++      (HwDeviceExtension->jChipType == SIS_660))
+      InitTo310Pointer(SiS_Pr, HwDeviceExtension);
+ #endif
+@@ -2073,14 +2082,21 @@ SiSDetermineROMUsage(SiS_Private *SiS_Pr
+             SiS_Pr->SiS_UseROM = TRUE;
+        else SiS_Pr->SiS_UseROM = FALSE;
+      } else if(HwDeviceExtension->jChipType < SIS_315H) {
++#if 0
+         /* TW: Rest of 300 series: We don't use the ROM image if
+        *     the BIOS version < 2.0.0 as such old BIOSes don't
+        *     have the needed data at the expected locations.
+        */
+         if(ROMAddr[0x06] < '2')  SiS_Pr->SiS_UseROM = FALSE;
+       else                     SiS_Pr->SiS_UseROM = TRUE;
++#else
++      /* Sony's VAIO BIOS 1.09 follows the standard, so perhaps
++       * the others do as well
++       */
++      SiS_Pr->SiS_UseROM = TRUE;
++#endif
+      } else {
+-        /* TW: 310/325/330 series stick to the standard */
++        /* TW: 315/330 series stick to the standard */
+       SiS_Pr->SiS_UseROM = TRUE;
+      }
+    } else SiS_Pr->SiS_UseROM = FALSE;
+@@ -2104,24 +2120,27 @@ SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS
+    SiS_Pr->UseCustomMode = FALSE;
+    if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
+-   
+-         xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting custom mode %dx%d\n", 
+-              SiS_Pr->CHDisplay, SiS_Pr->CVDisplay);
+-              
++
++         xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting custom mode %dx%d\n",
++              SiS_Pr->CHDisplay,
++              (mode->Flags & V_INTERLACE ? SiS_Pr->CVDisplay * 2 :
++                 (mode->Flags & V_DBLSCAN ? SiS_Pr->CVDisplay / 2 :
++                    SiS_Pr->CVDisplay)));
++
+        return(SiSSetMode(SiS_Pr, HwDeviceExtension, pScrn, ModeNo, TRUE));
+-   
++
+    }
+-   
+-   ModeNo = SiS_CalcModeIndex(pScrn, mode);
++
++   ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->HaveCustomModes);
+    if(!ModeNo) return FALSE;
+-   xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting mode 0x%x\n", ModeNo);
++   xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo);
+    return(SiSSetMode(SiS_Pr, HwDeviceExtension, pScrn, ModeNo, TRUE));   
+ }
+ #ifdef SISDUALHEAD
+-/* TW: Set CRT1 mode (used for dual head) */
++/* TW: Set CRT1 mode (used for dual head and MergedFB) */
+ BOOLEAN
+ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,
+                DisplayModePtr mode, BOOLEAN IsCustom)
+@@ -2134,31 +2153,37 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+    SISEntPtr pSiSEnt = pSiS->entityPrivate;
+    unsigned char backupreg=0;
+    BOOLEAN backupcustom;
+-
+    UShort  ModeNo=0;
+    
+    SiS_Pr->UseCustomMode = FALSE;
+-   
++
+    if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
+-   
++
++         USHORT temptemp = SiS_Pr->CVDisplay;
++
++         if(SiS_Pr->CModeFlag & DoubleScanMode)     temptemp >>= 1;
++         else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
++
+          xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-              "Setting custom mode %dx%d in CRT1\n", 
+-              SiS_Pr->CHDisplay, SiS_Pr->CVDisplay);
++              "Setting custom mode %dx%d on CRT1\n",
++              SiS_Pr->CHDisplay, temptemp);
+        ModeNo = 0xfe;
+-       
++
+    } else {
+-         ModeNo = SiS_CalcModeIndex(pScrn, mode);
++         ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->HaveCustomModes);
+          if(!ModeNo) return FALSE;
+          xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-              "Setting mode 0x%x on CRT1\n", ModeNo);
++              "Setting standard mode 0x%x on CRT1\n", ModeNo);
+    }
+    SiSInitPtr(SiS_Pr, HwDeviceExtension);
+    SiSRegInit(SiS_Pr, BaseAddr);
++   SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
++
+    SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+    SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+@@ -2167,7 +2192,7 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+    SiSDetermineROMUsage(SiS_Pr, HwDeviceExtension, ROMAddr);
+-   /* TW: We don't clear the buffer under X */
++   /* We don't clear the buffer under X */
+    SiS_Pr->SiS_flag_clearbuffer = 0;
+    /* 1.Openkey */
+@@ -2175,8 +2200,8 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+    SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
++   /* 2.Get ModeID Table  */
+    if(!SiS_Pr->UseCustomMode) {
+-      /* 2.Get ModeID Table  */
+       temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&ModeNo,&ModeIdIndex);
+       if(temp == 0)  return(0);
+    } else {
+@@ -2201,53 +2226,65 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+    SiS_GetLCDResInfo(SiS_Pr, ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++         if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+             if(ModeNo != 0x10)  SiS_Pr->SiS_SetFlag |= SetDOSMode;
++         } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
++            SiS_Pr->SiS_SetFlag |= SetDOSMode;
+          }
+       }
+-      /* TW: New from 650/LV 1.10.6x */
+       if(IS_SIS650) {
+-          if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-            SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
+-            SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
+-        }
++         if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++          SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
++          if(IS_SIS651) SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x20);
++          SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
++       }
+       }
+    }
+-   /* TW: Set mode on CRT1 */
++   /* Set mode on CRT1 */
+    SiS_SetCRT1Group(SiS_Pr, ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex,BaseAddr);
+-   pSiSEnt->CRT1ModeNo = ModeNo;
+-   pSiSEnt->CRT1DMode = mode;
+-
+-   /* TW: SetPitch: Adapt to virtual size & position */
++   /* SetPitch: Adapt to virtual size & position */
+    SiS_SetPitchCRT1(SiS_Pr, pScrn, BaseAddr);
++   if(pSiS->DualHeadMode) {
++      pSiSEnt->CRT1ModeNo = ModeNo;
++      pSiSEnt->CRT1DMode = mode;
++   }
++
++   if(SiS_Pr->UseCustomMode) {
++      SiS_Pr->CRT1UsesCustomMode = TRUE;
++      SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
++      SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
++   } else {
++      SiS_Pr->CRT1UsesCustomMode = FALSE;
++   }
++
+    /* We have to reset CRT2 if changing mode on CRT1 */
+-   if(pSiSEnt->CRT2ModeNo != -1) {
+-        xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-                              "(Re-)Setting mode 0x%x on CRT2\n",
+-                              pSiSEnt->CRT2ModeNo);
+-      backupcustom = SiS_Pr->UseCustomMode;
+-      if(SiS_Pr->UseCustomMode) {
+-         SiS_Pr->CRT1UsesCustomMode = TRUE;
+-      } else {
+-         SiS_Pr->CRT1UsesCustomMode = FALSE;
+-      }
+-      SiSBIOSSetModeCRT2(SiS_Pr, HwDeviceExtension, pSiSEnt->pScrn_1,
+-                              pSiSEnt->CRT2DMode);
+-      SiS_Pr->UseCustomMode = backupcustom;
+-      SiS_Pr->CRT1UsesCustomMode = FALSE;
++   if(pSiS->DualHeadMode) {
++      if(pSiSEnt->CRT2ModeNo != -1) {
++         xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
++                              "(Re-)Setting mode for CRT2\n");
++       backupcustom = SiS_Pr->UseCustomMode;
++       SiSBIOSSetModeCRT2(SiS_Pr, HwDeviceExtension, pSiSEnt->pScrn_1,
++                          pSiSEnt->CRT2DMode, pSiSEnt->CRT2IsCustom);
++       SiS_Pr->UseCustomMode = backupcustom;
++      }
+    }
+-   
++
++   /* Warning: From here, the custom mode entries in SiS_Pr are
++    * possibly overwritten
++    */
++
+    SiS_HandleCRT1(SiS_Pr);
++   SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
++
+    SiS_DisplayOn(SiS_Pr);
+    SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+-   /* TW: New from 650/LV 1.10.6x and 1.10.7w, 630/301B 2.06.50 */
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+        SiS_SetReg1(SiS_Pr->SiS_P3d4,0x38,backupreg);
+@@ -2266,7 +2303,7 @@ SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, 
+ /* TW: Set CRT2 mode (used for dual head) */
+ BOOLEAN
+ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,
+-               DisplayModePtr mode)
++               DisplayModePtr mode, BOOLEAN IsCustom)
+ {
+    ULONG   temp;
+    USHORT  ModeIdIndex;
+@@ -2276,16 +2313,52 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+    SISPtr  pSiS     = SISPTR(pScrn);
+    SISEntPtr pSiSEnt = pSiS->entityPrivate;
+    unsigned char tempr1, tempr2, backupreg=0;
+-   
++
+    SiS_Pr->UseCustomMode = FALSE;
+-   
+-   ModeNo = SiS_CalcModeIndex(pScrn, mode);
+-   if(!ModeNo) return FALSE;
++
++   /* Remember: Custom modes for CRT2 are ONLY supported
++    *                 -) on 315/330 series,
++    *           -) on the 301 and 30xB, and
++    *           -) if CRT2 is LCD or VGA
++    */
++
++   if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
++
++       ModeNo = 0xfe;
++
++   } else {
++
++         BOOLEAN havecustommodes = pSiS->HaveCustomModes;
++
++#ifdef SISMERGED
++       if(pSiS->MergedFB) havecustommodes = pSiS->HaveCustomModes2;
++#endif
++
++         ModeNo = SiS_CalcModeIndex(pScrn, mode, havecustommodes);
++         if(!ModeNo) return FALSE;
++
++   }
++
++   /* Save mode info so we can set it from within SetMode for CRT1 */
++   if(pSiS->DualHeadMode) {
++      pSiSEnt->CRT2ModeNo = ModeNo;
++      pSiSEnt->CRT2DMode = mode;
++      pSiSEnt->CRT2IsCustom = IsCustom;
++
++      /* We can't set CRT2 mode before CRT1 mode is set */
++      if(pSiSEnt->CRT1ModeNo == -1) {
++       xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
++              "Setting CRT2 mode delayed until after setting CRT1 mode\n");
++       return TRUE;
++      }
++   }
+    SiSInitPtr(SiS_Pr, HwDeviceExtension);
+    SiSRegInit(SiS_Pr, BaseAddr);
++   SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
++
+    SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+    SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+@@ -2294,22 +2367,26 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+    SiSDetermineROMUsage(SiS_Pr, HwDeviceExtension, ROMAddr);
+-   /* TW: We don't clear the buffer under X */
++   /* We don't clear the buffer under X */
+    SiS_Pr->SiS_flag_clearbuffer=0;
+-   /* TW: Save ModeNo so we can set it from within SetMode for CRT1 */
+-   pSiSEnt->CRT2ModeNo = ModeNo;
+-   pSiSEnt->CRT2DMode = mode;
+-
+-   /* TW: We can't set CRT2 mode before CRT1 mode is set */
+-   if(pSiSEnt->CRT1ModeNo == -1) {
+-      xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-              "Setting CRT2 mode delayed until after setting CRT1 mode\n");
+-      return TRUE;
+-   }
++   if(SiS_Pr->UseCustomMode) {
++
++      USHORT temptemp = SiS_Pr->CVDisplay;
++
++      if(SiS_Pr->CModeFlag & DoubleScanMode)     temptemp >>= 1;
++      else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
++
++      xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
++        "Setting custom mode %dx%d on CRT2\n",
++        SiS_Pr->CHDisplay, temptemp);
++
++   } else {
+-   xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+-              "Setting mode 0x%x on CRT2\n", ModeNo);
++      xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
++        "Setting standard mode 0x%x on CRT2\n", ModeNo);
++
++   }
+    /* 1.Openkey */
+    SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+@@ -2317,10 +2394,14 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+    SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
+    /* 2.Get ModeID */
+-   temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&ModeNo,&ModeIdIndex);
+-   if(temp == 0)  return(0);
++   if(!SiS_Pr->UseCustomMode) {
++      temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&ModeNo,&ModeIdIndex);
++      if(temp == 0)  return(0);
++   } else {
++      ModeIdIndex = 0;
++   }
+-   /* TW: Determine VBType (301,301B,301LV,302B,302LV) */
++   /* Determine VBType (301,301B,301LV,302B,302LV) */
+    SiS_GetVBType(SiS_Pr, BaseAddr,HwDeviceExtension);
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+@@ -2343,15 +2424,22 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+       }
+    }
+-   /* TW: Get VB information (connectors, connected devices) */
+-   SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
++   /* Get VB information (connectors, connected devices) */
++   if(!SiS_Pr->UseCustomMode) {
++      SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
++   } else {
++      /* If this is a custom mode, we don't check the modeflag for CRT2Mode */
++      SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,0);
++   }
+    SiS_SetHiVision(SiS_Pr, BaseAddr,HwDeviceExtension);
+    SiS_GetLCDResInfo(SiS_Pr, ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++         if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+             if(ModeNo != 0x10)  SiS_Pr->SiS_SetFlag |= SetDOSMode;
++         } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
++            SiS_Pr->SiS_SetFlag |= SetDOSMode;
+          }
+       }
+    }
+@@ -2364,17 +2452,19 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+      case VB_CHIP_302:
+      case VB_CHIP_302B:
+      case VB_CHIP_302LV:
+-        SiS_SetCRT2Group301(SiS_Pr, BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
++        SiS_SetCRT2Group(SiS_Pr, BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+         break;
+      case VB_CHIP_UNKNOWN:
+-        if (SiS_Pr->SiS_IF_DEF_LVDS     == 1 ||
+-          SiS_Pr->SiS_IF_DEF_CH70xx   != 0 ||
+-          SiS_Pr->SiS_IF_DEF_TRUMPION != 0) {
+-              SiS_SetCRT2Group301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
++        if(SiS_Pr->SiS_IF_DEF_LVDS     == 1 ||
++         SiS_Pr->SiS_IF_DEF_CH70xx   != 0 ||
++         SiS_Pr->SiS_IF_DEF_TRUMPION != 0) {
++           SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+       }
+         break;
+    }
++   SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
++
+    SiS_DisplayOn(SiS_Pr);
+    SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+@@ -2386,7 +2476,6 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+       }
+    }
+-   /* TW: New from 650/LV 1.10.6x and 1.10.7w, 630 2.06.50 */
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+@@ -2412,7 +2501,7 @@ SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, 
+       }
+    }
+-   /* TW: SetPitch: Adapt to virtual size & position */
++   /* SetPitch: Adapt to virtual size & position */
+    SiS_SetPitchCRT2(SiS_Pr, pScrn, BaseAddr);
+    return TRUE;
+@@ -2448,6 +2537,8 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+    SiSRegInit(SiS_Pr, BaseAddr);
++   SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
++
+ #ifdef LINUX_XF86
+    if(pScrn) SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+    else
+@@ -2458,7 +2549,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+ #ifdef TWDEBUG
+    xf86DrvMsg(0, X_INFO, "VGAInfo 0x%02x\n", SiS_Pr->SiS_VGAINFO);
+ #endif
+-#endif                 
++#endif
+    SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+@@ -2472,7 +2563,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+    }      
+ #ifdef LINUX_XF86
+-   /* TW: We never clear the buffer in X */
++   /* We never clear the buffer in X */
+    ModeNo |= 0x8000;
+ #endif
+@@ -2501,10 +2592,10 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+       
+    }
+     
+-   /* TW: Determine VBType (301,301B,301LV,302B,302LV) */
++   /* Determine VBType (301,301B,301LV,302B,302LV) */
+    SiS_GetVBType(SiS_Pr,BaseAddr,HwDeviceExtension);
+-   /* TW: Init/restore some VB registers */
++   /* Init/restore some VB registers */
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+        if(HwDeviceExtension->jChipType >= SIS_315H) {
+          SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
+@@ -2525,8 +2616,12 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+        }
+    }
+    
+-   /* TW: Get VB information (connectors, connected devices) */
+-   SiS_GetVBInfo(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
++   /* Get VB information (connectors, connected devices) */
++   if(SiS_Pr->UseCustomMode) {
++      SiS_GetVBInfo(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,0);
++   } else {
++      SiS_GetVBInfo(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
++   }
+    SiS_SetHiVision(SiS_Pr,BaseAddr,HwDeviceExtension);
+    SiS_GetLCDResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+@@ -2535,22 +2630,32 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+    if(!temp) return(0);
+    if(HwDeviceExtension->jChipType >= SIS_315H) {
+-      if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+-         if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++      if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08)  {
++         if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+             if(ModeNo != 0x10)  SiS_Pr->SiS_SetFlag |= SetDOSMode;
++         } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
++            SiS_Pr->SiS_SetFlag |= SetDOSMode;
+          }
+       }
+-      /* TW: New from 650/LV 1.10.6x; not in any BIOS for other chipsets */
+       if(IS_SIS650) {
+-          if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+-            SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
+-            SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
+-        }
++         if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
++          SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
++          if(IS_SIS651) SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x20);
++          SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
++       }
+       }
+    }
+-   /* TW: Set mode on CRT1 */
++   if(SiS_Pr->UseCustomMode) {
++      SiS_Pr->CRT1UsesCustomMode = TRUE;
++      SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
++      SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
++   } else {
++      SiS_Pr->CRT1UsesCustomMode = FALSE;
++   }
++
++   /* Set mode on CRT1 */
+    if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
+       SiS_SetCRT1Group(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex,BaseAddr);
+    } else {
+@@ -2559,7 +2664,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+      }
+    }
+-   /* TW: Set mode on CRT2 */
++   /* Set mode on CRT2 */
+    if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2 | SetCRT2ToLCDA)) {
+      switch (HwDeviceExtension->ujVBChipID) {
+      case VB_CHIP_301:
+@@ -2568,18 +2673,20 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+      case VB_CHIP_302:
+      case VB_CHIP_302B:
+      case VB_CHIP_302LV:
+-        SiS_SetCRT2Group301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
++        SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+         break;
+      case VB_CHIP_UNKNOWN:
+       if(SiS_Pr->SiS_IF_DEF_LVDS     == 1 ||
+          SiS_Pr->SiS_IF_DEF_CH70xx   != 0 ||
+          SiS_Pr->SiS_IF_DEF_TRUMPION != 0)
+-              SiS_SetCRT2Group301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
++           SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+         break;
+      }
+    }
+    
+    SiS_HandleCRT1(SiS_Pr);
++
++   SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
+    
+    SiS_DisplayOn(SiS_Pr);
+    SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+@@ -2592,7 +2699,6 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+       }
+    }
+-   /* TW: New from 650/LV 1.10.6x and 1.10.7w */
+    if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+       if(HwDeviceExtension->jChipType >= SIS_315H) {
+        if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+@@ -2627,7 +2733,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+ #ifdef LINUX_XF86
+    if(pScrn) {
+-      /* TW: SetPitch: Adapt to virtual size & position */
++      /* SetPitch: Adapt to virtual size & position */
+       if((ModeNo > 0x13) && (dosetpitch)) {
+          SiS_SetPitch(SiS_Pr, pScrn, BaseAddr);
+       }
+@@ -2637,7 +2743,7 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+    }
+ #endif
+-#ifndef LINUX_XF86  /* TW: We never lock registers in XF86 */
++#ifndef LINUX_XF86  /* We never lock registers in XF86 */
+    if(KeepLockReg == 0xA1) SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+    else SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x00);
+ #endif
+@@ -2646,10 +2752,15 @@ SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_
+ }
+ void
+-SiS_SetEnableDstn(SiS_Private *SiS_Pr)        /* TW: Called from sis_main.c */
++SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable)
++{
++   SiS_Pr->SiS_IF_DEF_DSTN = enable ? 1 : 0;
++}
++
++void
++SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable)
+ {
+-   /* For 550 dstn */
+-   SiS_Pr->SiS_IF_DEF_DSTN = 1;
++   SiS_Pr->SiS_IF_DEF_FSTN = enable ? 1 : 0;
+ }
+ void
+@@ -2663,13 +2774,73 @@ SiS_HandleCRT1(SiS_Private *SiS_Pr)
+   SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x63,0xbf);
+ #if 0
+-  if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15) & 0x01))
+-     SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x63,0x40);
++  if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15) & 0x01)) {
++     if((SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15) & 0x0a) ||
++        (SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x01)) {
++        SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x63,0x40);
++     }
+   }
+ #endif
+ }
+ void
++SiS_GetSysFlags(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
++{
++   unsigned char cr5f, temp1, temp2;
++
++   /* You should use the macros, not these flags directly */
++
++   SiS_Pr->SiS_SysFlags = 0;
++   if(HwDeviceExtension->jChipType == SIS_650) {
++      cr5f = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f) & 0xf0;
++      SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x5c,0x07);
++      temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
++      SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x5c,0xf8);
++      temp2 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
++      if((!temp1) || (temp2)) {
++         switch(cr5f) {
++          case 0x80:
++          case 0x90:
++          case 0xc0:
++             SiS_Pr->SiS_SysFlags |= SF_IsM650;  break;
++          case 0xa0:
++          case 0xb0:
++          case 0xe0:
++             SiS_Pr->SiS_SysFlags |= SF_Is651;   break;
++       }
++      } else {
++         switch(cr5f) {
++          case 0x90:
++             temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
++             switch(temp1) {
++                case 0x00: SiS_Pr->SiS_SysFlags |= SF_IsM652; break;
++                case 0x40: SiS_Pr->SiS_SysFlags |= SF_IsM653; break;
++                default:   SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
++             }
++             break;
++          case 0xb0:
++             SiS_Pr->SiS_SysFlags |= SF_Is652;  break;
++          default:
++             SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
++       }
++      }
++   }
++}
++
++void
++SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
++{
++   if((IS_SIS651) || (IS_SISM650)) {
++      SiS_SetReg1(SiS_Pr->SiS_VidCapt, 0x3f, 0x00);   /* Fiddle with capture regs */
++      SiS_SetReg1(SiS_Pr->SiS_VidCapt, 0x00, 0x00);
++      SiS_SetReg1(SiS_Pr->SiS_VidPlay, 0x00, 0x86);   /* (BIOS does NOT unlock) */
++      SiS_SetRegAND(SiS_Pr->SiS_VidPlay, 0x30, 0xfe); /* Fiddle with video regs */
++      SiS_SetRegAND(SiS_Pr->SiS_VidPlay, 0x3f, 0xef);
++   }
++   /* !!! This does not support modes < 0x13 !!! */
++}
++
++void
+ SiS_SetCRT1Group(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                  USHORT ModeNo,USHORT ModeIdIndex,USHORT BaseAddr)
+ {
+@@ -2683,6 +2854,9 @@ SiS_SetCRT1Group(SiS_Private *SiS_Pr, UC
+     }
+   }
++  /* 550, 651 */
++  SiS_WhatTheHellIsThis(SiS_Pr,HwDeviceExtension,BaseAddr);
++
+   SiS_SetSeqRegs(SiS_Pr,ROMAddr,StandTableIndex);
+   SiS_SetMiscRegs(SiS_Pr,ROMAddr,StandTableIndex);
+   SiS_SetCRTCRegs(SiS_Pr,ROMAddr,HwDeviceExtension,StandTableIndex);
+@@ -2759,15 +2933,20 @@ void
+ SiS_SetPitch(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr)
+ {
+    SISPtr pSiS = SISPTR(pScrn);
++   BOOLEAN isslavemode = FALSE;
++
++   if( (pSiS->VBFlags & VB_VIDEOBRIDGE) &&
++       ( ((pSiS->VGAEngine == SIS_300_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0xa0) == 0x20) ||
++         ((pSiS->VGAEngine == SIS_315_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x50) == 0x10) ) ) {
++      isslavemode = TRUE;
++   }
+-   /* TW: We need to set pitch for CRT1 if bridge is in SlaveMode, too */
+-   if( (pSiS->VBFlags & DISPTYPE_DISP1) ||
+-       ( (pSiS->VBFlags & VB_VIDEOBRIDGE) &&
+-         ( ((pSiS->VGAEngine == SIS_300_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0xa0) == 0x20) ||
+-           ((pSiS->VGAEngine == SIS_315_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x50) == 0x10) ) ) ) {
++   /* We need to set pitch for CRT1 if bridge is in slave mode, too */
++   if( (pSiS->VBFlags & DISPTYPE_DISP1) || (isslavemode) ) {
+       SiS_SetPitchCRT1(SiS_Pr, pScrn, BaseAddr);
+    }
+-   if (pSiS->VBFlags & DISPTYPE_DISP2) {
++   /* We must not set the pitch for CRT2 if bridge is in slave mode */
++   if( (pSiS->VBFlags & DISPTYPE_DISP2) && (!isslavemode) ) {
+       SiS_SetPitchCRT2(SiS_Pr, pScrn, BaseAddr);
+    }
+ }
+@@ -2790,7 +2969,7 @@ SiS_SetPitchCRT2(SiS_Private *SiS_Pr, Sc
+     SISPtr pSiS = SISPTR(pScrn);
+     ULong  HDisplay,temp;
+-    HDisplay = pSiS->scrnPitch / 8;
++    HDisplay = pSiS->scrnPitch2 / 8;
+     /* Unlock CRT2 */
+     if (pSiS->VGAEngine == SIS_315_VGA)
+@@ -2880,7 +3059,6 @@ SiS_SearchModeID(SiS_Private *SiS_Pr, UC
+    return TRUE;
+ }
+-/* For SiS 300 oem util: Search VBModeID */
+ BOOLEAN
+ SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo)
+ {
+@@ -2946,6 +3124,81 @@ SiS_GetModePtr(SiS_Private *SiS_Pr, UCHA
+    return index;
+ }
++static void
++SiS_WhatIsThis1a(SiS_Private *SiS_Pr, USHORT somevalue)
++{
++   USHORT temp, tempbl, tempbh;
++
++   tempbl = tempbh = somevalue;
++   temp = SiS_GetReg2(SiS_Pr->SiS_P3cb);
++   temp &= 0xf0;
++   tempbl >>= 4;
++   temp |= tempbl;
++   SiS_SetReg3(SiS_Pr->SiS_P3cb, temp);
++   temp = SiS_GetReg2(SiS_Pr->SiS_P3cd);
++   temp &= 0xf0;
++   tempbh &= 0x0f;
++   temp |= tempbh;
++   SiS_SetReg3(SiS_Pr->SiS_P3cd, temp);
++}
++
++static void
++SiS_WhatIsThis1b(SiS_Private *SiS_Pr, USHORT somevalue)
++{
++   USHORT temp, tempbl, tempbh;
++
++   tempbl = tempbh = somevalue;
++   temp = SiS_GetReg2(SiS_Pr->SiS_P3cb);
++   temp &= 0x0f;
++   tempbl &= 0xf0;
++   temp |= tempbl;
++   SiS_SetReg3(SiS_Pr->SiS_P3cb, temp);
++   temp = SiS_GetReg2(SiS_Pr->SiS_P3cd);
++   temp &= 0x0f;
++   tempbh <<= 4;
++   temp |= tempbh;
++   SiS_SetReg3(SiS_Pr->SiS_P3cd, temp);
++}
++
++static void
++SiS_WhatIsThis2b(SiS_Private *SiS_Pr, USHORT somevalue)
++{
++   SiS_WhatIsThis1a(SiS_Pr, somevalue);
++   SiS_WhatIsThis1b(SiS_Pr, somevalue);
++}
++
++static void
++SiS_WhatIsThis1(SiS_Private *SiS_Pr)
++{
++   SiS_WhatIsThis2b(SiS_Pr, 0);
++}
++
++static void
++SiS_WhatIsThis2a(SiS_Private *SiS_Pr, USHORT somevalue)
++{
++   USHORT temp = somevalue >> 8;
++
++   temp &= 0x07;
++   temp |= (temp << 4);
++   SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1d,temp);
++   SiS_WhatIsThis2b(SiS_Pr, somevalue);
++}
++
++static void
++SiS_WhatIsThis2(SiS_Private *SiS_Pr)
++{
++   SiS_WhatIsThis2a(SiS_Pr, 0);
++}
++
++void
++SiS_WhatTheHellIsThis(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
++{
++   if(IS_SIS65x) {
++      SiS_WhatIsThis1(SiS_Pr);
++      SiS_WhatIsThis2(SiS_Pr);
++   }
++}
++
+ void
+ SiS_SetSeqRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex)
+ {
+@@ -3027,7 +3280,7 @@ SiS_SetCRTCRegs(SiS_Private *SiS_Pr, UCH
+       (HwDeviceExtension->jChipRevision >= 0x30) ) {             /* for 630S0 */
+     if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+       if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
+-        SiS_SetReg1(SiS_Pr->SiS_P3d4,0x18,0xFE);
++         SiS_SetReg1(SiS_Pr->SiS_P3d4,0x18,0xFE);
+       }
+     }
+   }
+@@ -3065,7 +3318,7 @@ SiS_SetATTRegs(SiS_Private *SiS_Pr, UCHA
+       }
+       if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+          if(HwDeviceExtension->jChipType >= SIS_315H) {
+-          if(IS_SIS650740 || IS_SIS550) {  
++          if(IS_SIS550650740660) {
+              /* 315, 330 don't do this */
+              if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { 
+                 if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
+@@ -3148,7 +3401,7 @@ SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCH
+   USHORT tempah,i,modeflag,j;
+ #ifdef SIS315H
+   USHORT temp;
+-  USHORT ResInfo,DisplayType;
++  USHORT ResIndex,DisplayType;
+   const SiS_LCDACRT1DataStruct *LCDACRT1Ptr = NULL;
+ #endif
+@@ -3171,7 +3424,7 @@ SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCH
+      /* LCDA */
+      temp = SiS_GetLCDACRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+-                       RefreshRateTableIndex,&ResInfo,&DisplayType);
++                       RefreshRateTableIndex,&ResIndex,&DisplayType);
+      switch(DisplayType) {
+       case Panel_800x600       : LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT1800x600_1;      break;
+@@ -3197,30 +3450,30 @@ SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCH
+       default:                   LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11024x768_1;     break;
+      }
+-     tempah = (LCDACRT1Ptr+ResInfo)->CR[0];
++     tempah = (LCDACRT1Ptr+ResIndex)->CR[0];
+      SiS_SetReg1(SiS_Pr->SiS_P3d4,0x00,tempah);
+      for(i=0x01,j=1;i<=0x07;i++,j++){
+-       tempah = (LCDACRT1Ptr+ResInfo)->CR[j];
++       tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+        SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+      }
+      for(i=0x10,j=8;i<=0x12;i++,j++){
+-       tempah = (LCDACRT1Ptr+ResInfo)->CR[j];
++       tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+        SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+      }
+      for(i=0x15,j=11;i<=0x16;i++,j++){
+-       tempah =(LCDACRT1Ptr+ResInfo)->CR[j];
++       tempah =(LCDACRT1Ptr+ResIndex)->CR[j];
+        SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
+      }
+      for(i=0x0A,j=13;i<=0x0C;i++,j++){
+-       tempah = (LCDACRT1Ptr+ResInfo)->CR[j];
++       tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+        SiS_SetReg1(SiS_Pr->SiS_P3c4,i,tempah);
+      }
+-     tempah = (LCDACRT1Ptr+ResInfo)->CR[16];
++     tempah = (LCDACRT1Ptr+ResIndex)->CR[16];
+      tempah &= 0x0E0;
+      SiS_SetReg1(SiS_Pr->SiS_P3c4,0x0E,tempah);
+-     tempah = (LCDACRT1Ptr+ResInfo)->CR[16];
++     tempah = (LCDACRT1Ptr+ResIndex)->CR[16];
+      tempah &= 0x01;
+      tempah <<= 5;
+      if(modeflag & DoubleScanMode)  tempah |= 0x080;
+@@ -3301,7 +3554,7 @@ SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCH
+ BOOLEAN
+ SiS_GetLCDACRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+-                 USHORT RefreshRateTableIndex,USHORT *ResInfo,
++                 USHORT RefreshRateTableIndex,USHORT *ResIndex,
+                  USHORT *DisplayType)
+  {
+   USHORT tempbx=0,modeflag=0;
+@@ -3320,7 +3573,7 @@ SiS_GetLCDACRT1Ptr(SiS_Private *SiS_Pr, 
+   if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 32;
+   if(modeflag & HalfDCLK)                 tempbx += 16;
+-  *ResInfo = CRT2CRTC & 0x3F;
++  *ResIndex = CRT2CRTC & 0x3F;
+   *DisplayType = tempbx;
+   return 1;
+@@ -3490,11 +3743,11 @@ SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr,
+   data2 = 0;
+   if(ModeNo > 0x13) {
+-    if(SiS_Pr->SiS_ModeType > 0x02) {
+-       data2 |= 0x02;
+-       data3 = (SiS_Pr->SiS_ModeType - ModeVGA) << 2;
+-       data2 |= data3;
+-    }
++     if(SiS_Pr->SiS_ModeType > 0x02) {
++        data2 |= 0x02;
++        data3 = (SiS_Pr->SiS_ModeType - ModeVGA) << 2;
++        data2 |= data3;
++     }
+   }
+ #ifdef TWDEBUG
+   xf86DrvMsg(0, X_INFO, "Debug: Mode infoflag = %x, Chiptype %d\n", 
+@@ -3517,7 +3770,8 @@ SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr,
+   if(HwDeviceExtension->jChipType != SIS_300) {
+      data = 0x0000;
+      if(infoflag & InterlaceMode) {
+-        if(xres == 1024) data = 0x0035;
++        if(xres <= 800)  data = 0x0020;
++        else if(xres <= 1024) data = 0x0035;
+         else data = 0x0048;
+      }
+      data2 = data & 0x00FF;
+@@ -3549,6 +3803,7 @@ SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr,
+      } else {
+         SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x0F,0xB7);
+      }
++     /* 651 BIOS does something for mode 0x12 here */
+   }
+   if(HwDeviceExtension->jChipType != SIS_300) {
+@@ -3679,7 +3934,7 @@ SiS_SetVCLKState(SiS_Private *SiS_Pr, UC
+     if(VCLK >= 150) data2 |= 0x08;            /* VCLK > 150 */
+     SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x32,0xF7,data2);
+-  } else {                                            /* 310/325 series */
++  } else {                                            /* 315 series */
+     data = 0;
+     if(VCLK >= 166) data |= 0x0c;             /* TW: Was 200; is 166 in 650, 315 and 330 BIOSes */
+@@ -3688,12 +3943,6 @@ SiS_SetVCLKState(SiS_Private *SiS_Pr, UC
+     if(VCLK >= 166) {                         /* TW: Was 200, is 166 in 650, 315 and 330 BIOSes */
+        SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1f,0xe7);
+     }
+-#if 0 /* Not done in 315 and 650/301LV/LVDS BIOSes: */
+-    data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1F);                /* DAC pedestal */
+-    data &= 0xE7;
+-    if(VCLK<200) data |= 0x10;
+-    SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1F,data);          /* DAC pedestal */
+-#endif
+   }
+   data2 = 0x03;
+@@ -3918,7 +4167,8 @@ GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW
+   } else if((HwDeviceExtension->jChipType == SIS_550) ||
+             (HwDeviceExtension->jChipType == SIS_740) ||
+-            (HwDeviceExtension->jChipType == SIS_650)) {
++            (HwDeviceExtension->jChipType == SIS_650) ||
++          (HwDeviceExtension->jChipType == SIS_660)) {
+       counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x3F;
+               counter++;
+@@ -4728,7 +4978,7 @@ SiS_GetSenseStatus(SiS_Private *SiS_Pr, 
+           SiS_Pr->SiS_SetFlag = 0x00;
+           SiS_Pr->SiS_ModeType = ModeVGA;
+           SiS_Pr->SiS_VBInfo = SetCRT2ToRAMDAC |LoadDACFlag |SetInSlaveMode;
+-          SiS_SetCRT2Group301(SiS_Pr, BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
++          SiS_SetCRT2Group(SiS_Pr, BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
+           for(i=0;i<20;i++) {
+             SiS_LongWait(SiS_Pr);
+           }
+@@ -4766,7 +5016,7 @@ SiS_GetSenseStatus(SiS_Private *SiS_Pr, 
+ #ifdef SIS315H
+          if(HwDeviceExtension->jChipType >= SIS_315H) {
+               OutputSelect = ROMAddr[0xf3];
+-              if(HwDeviceExtension->jChipType == SIS_330) {
++              if(HwDeviceExtension->jChipType >= SIS_330) {
+                    OutputSelect = ROMAddr[0x11b];
+               }
+          }
+@@ -4814,7 +5064,7 @@ SiS_GetSenseStatus(SiS_Private *SiS_Pr, 
+       SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,P2reg0);
+       if(!(P2reg0 & 0x20)) {
+         SiS_Pr->SiS_VBInfo = DisableCRT2Display;
+-        SiS_SetCRT2Group301(SiS_Pr,BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
++        SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension);
+       }
+     }
+   }
+@@ -4884,111 +5134,6 @@ SiS_SenseCHTV(SiS_Private *SiS_Pr)
+ }
+ #endif /* LINUXBIOS */
+-/*  ================ for TC only =================  */
+-
+-#ifdef TC
+-
+-int
+-INT1AReturnCode(union REGS regs)
+-{
+-  if (regs.x.cflag)
+-  {
+-    /*printf("Error to find pci device!\n"); */
+-    return 1;
+-  }
+-
+-  switch(regs.h.ah)
+-  {
+-    case 0: return 0;
+-            break;
+-    case 0x81: printf("Function not support\n");
+-               break;
+-    case 0x83: printf("bad vendor id\n");
+-               break;
+-    case 0x86: printf("device not found\n");
+-               break;
+-    case 0x87: printf("bad register number\n");
+-               break;
+-    case 0x88: printf("set failed\n");
+-               break;
+-    case 0x89: printf("buffer too small");
+-               break;
+-  }
+-  return 1;
+-}
+-
+-unsigned
+-FindPCIIOBase(unsigned index,unsigned deviceid)
+-{
+-  union REGS regs;
+-
+-  regs.h.ah = 0xb1;  /*PCI_FUNCTION_ID */
+-  regs.h.al = 0x02;  /*FIND_PCI_DEVICE */
+-  regs.x.cx = deviceid;
+-  regs.x.dx = 0x1039;
+-  regs.x.si = index;  /* find n-th device */
+-
+-  int86(0x1A, &regs, &regs);
+-
+-  if (INT1AReturnCode(regs)!=0)
+-    return 0;
+-
+-  /* regs.h.bh *//* bus number */
+-  /* regs.h.bl *//* device number */
+-  regs.h.ah = 0xb1;  /*PCI_FUNCTION_ID */
+-  regs.h.al = 0x09;  /*READ_CONFIG_WORD */
+-  regs.x.cx = deviceid;
+-  regs.x.dx = 0x1039;
+-  regs.x.di = 0x18;  /* register number */
+-  int86(0x1A, &regs, &regs);
+-
+-  if (INT1AReturnCode(regs)!=0)
+-    return 0;
+-  return regs.x.cx;
+-}
+-
+-
+-void
+-main(int argc, char *argv[])
+-{
+-  SIS_HW_DEVICE_INFO  HwDeviceExtension;
+-  USHORT temp;
+-  USHORT ModeNo;
+-
+-  /*HwDeviceExtension.pjVirtualRomBase =(PUCHAR) MK_FP(0xC000,0); */
+-  /*HwDeviceExtension.pjVideoMemoryAddress = (PUCHAR)MK_FP(0xA000,0);*/
+-
+-#ifdef SIS300  
+-  HwDeviceExtension.ulIOAddress = (FindPCIIOBase(0,0x6300)&0xFF80) + 0x30;
+-  HwDeviceExtension.jChipType = SIS_630;
+-#endif
+-
+-#ifdef SIS315H  
+-//  HwDeviceExtension.ulIOAddress = (FindPCIIOBase(0,0x5315)&0xFF80) + 0x30;
+-//  HwDeviceExtension.jChipType = SIS_550;
+-  HwDeviceExtension.ulIOAddress = (FindPCIIOBase(0,0x325)&0xFF80) + 0x30;
+-  HwDeviceExtension.jChipType = SIS_315H;
+-#endif
+-
+-  HwDeviceExtension.ujVBChipID = VB_CHIP_301;
+-  strcpy(HwDeviceExtension.szVBIOSVer,"0.84");
+-  HwDeviceExtension.bSkipDramSizing = FALSE;
+-  HwDeviceExtension.ulVideoMemorySize = 0;
+-  if(argc==2) {
+-    ModeNo=atoi(argv[1]);
+-  }
+-  else {
+-    ModeNo=0x2e;
+-    /*ModeNo=0x37; */ /* 1024x768x 4bpp */
+-    /*ModeNo=0x38; *//* 1024x768x 8bpp */
+-    /*ModeNo=0x4A; *//* 1024x768x 16bpp */
+-    /*ModeNo=0x47;*/ /* 800x600x 16bpp */
+-  }
+- /* SiSInit(SiS_Pr, &HwDeviceExtension);*/
+-  SiSSetMode(SiS_Pr, &HwDeviceExtension, ModeNo);
+-}
+-#endif /* TC END */
+-
+ /* ================ XFREE86 ================= */
+ /* Helper functions */
+@@ -5000,44 +5145,78 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+    SISPtr pSiS = SISPTR(pScrn);
+    int    out_n, out_dn, out_div, out_sbit, out_scale;
+    int    depth = pSiS->CurrentLayout.bitsPerPixel;
+-   
+-#ifdef SISDUALHEAD
+-   if( ((!pSiS->DualHeadMode) && (VBFlags & DISPTYPE_DISP2)) ||
+-       ((pSiS->DualHeadMode) && (!pSiS->SecondHead)) ) return 0;
+-#else      
+-   if(VBFlags & DISPTYPE_DISP2) return 0; 
+-#endif   
++   unsigned int vclk[5];
++
++#define Midx         0
++#define Nidx         1
++#define VLDidx       2
++#define Pidx         3
++#define PSNidx       4
++
++   pSiS->SiS_Pr->CModeFlag = 0;
+    
+    pSiS->SiS_Pr->CDClock = mode->Clock;
+-   
++
+    pSiS->SiS_Pr->CHDisplay = mode->HDisplay;
+    pSiS->SiS_Pr->CHSyncStart = mode->HSyncStart;
+    pSiS->SiS_Pr->CHSyncEnd = mode->HSyncEnd;
+    pSiS->SiS_Pr->CHTotal = mode->HTotal;
+-   pSiS->SiS_Pr->CHBlankStart = pSiS->SiS_Pr->CHDisplay;
+-   pSiS->SiS_Pr->CHBlankEnd = pSiS->SiS_Pr->CHTotal;
+-   
++
+    pSiS->SiS_Pr->CVDisplay = mode->VDisplay;
+    pSiS->SiS_Pr->CVSyncStart = mode->VSyncStart;
+    pSiS->SiS_Pr->CVSyncEnd = mode->VSyncEnd;
+    pSiS->SiS_Pr->CVTotal = mode->VTotal;
++
++   pSiS->SiS_Pr->CFlags = mode->Flags;
++
++   if(pSiS->SiS_Pr->CFlags & V_INTERLACE) {
++         pSiS->SiS_Pr->CVDisplay >>= 1;
++       pSiS->SiS_Pr->CVSyncStart >>= 1;
++       pSiS->SiS_Pr->CVSyncEnd >>= 1;
++       pSiS->SiS_Pr->CVTotal >>= 1;
++   }
++   if(pSiS->SiS_Pr->CFlags & V_DBLSCAN) {
++         /* pSiS->SiS_Pr->CDClock <<= 1; */
++       pSiS->SiS_Pr->CVDisplay <<= 1;
++       pSiS->SiS_Pr->CVSyncStart <<= 1;
++       pSiS->SiS_Pr->CVSyncEnd <<= 1;
++       pSiS->SiS_Pr->CVTotal <<= 1;
++   }
++
++   pSiS->SiS_Pr->CHBlankStart = pSiS->SiS_Pr->CHDisplay;
++   pSiS->SiS_Pr->CHBlankEnd = pSiS->SiS_Pr->CHTotal;
+    pSiS->SiS_Pr->CVBlankStart = pSiS->SiS_Pr->CVSyncStart - 1;
+    pSiS->SiS_Pr->CVBlankEnd = pSiS->SiS_Pr->CVTotal;
+-   
+-   pSiS->SiS_Pr->CFlags = mode->Flags;
+-   SiS_compute_vclk(pSiS->SiS_Pr->CDClock, &out_n, &out_dn, &out_div, &out_sbit, &out_scale);
+-   
++   if(SiS_compute_vclk(pSiS->SiS_Pr->CDClock, &out_n, &out_dn, &out_div, &out_sbit, &out_scale)) {
++      pSiS->SiS_Pr->CSR2B = (out_div == 2) ? 0x80 : 0x00;
++      pSiS->SiS_Pr->CSR2B |= ((out_n - 1) & 0x7f);
++      pSiS->SiS_Pr->CSR2C = (out_dn - 1) & 0x1f;
++      pSiS->SiS_Pr->CSR2C |= (((out_scale - 1) & 3) << 5);
++      pSiS->SiS_Pr->CSR2C |= ((out_sbit & 0x01) << 7);
++#ifdef TWDEBUG
++      xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock %d: n %d dn %d div %d sb %d sc %d\n",
++              pSiS->SiS_Pr->CDClock, out_n, out_dn, out_div, out_sbit, out_scale);
++#endif
++   } else {
++      SiSCalcClock(pScrn, pSiS->SiS_Pr->CDClock, 2, vclk);
++      pSiS->SiS_Pr->CSR2B = (vclk[VLDidx] == 2) ? 0x80 : 0x00;
++      pSiS->SiS_Pr->CSR2B |= (vclk[Midx] - 1) & 0x7f;
++      pSiS->SiS_Pr->CSR2C = (vclk[Nidx] - 1) & 0x1f;
++      if(vclk[Pidx] <= 4) {
++         /* postscale 1,2,3,4 */
++         pSiS->SiS_Pr->CSR2C |= ((vclk[Pidx] - 1) & 3) << 5;
++      } else {
++         /* postscale 6,8 */
++         pSiS->SiS_Pr->CSR2C |= (((vclk[Pidx] / 2) - 1) & 3) << 5;
++       pSiS->SiS_Pr->CSR2C |= 0x80;
++      }
+ #ifdef TWDEBUG
+-   xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock %d: n %d dn %d div %d sb %d sc %d\n",
+-              pSiS->SiS_Pr->CDClock, out_n, out_dn, out_div, out_sbit, out_scale);
+-#endif        
+-
+-   pSiS->SiS_Pr->CSR2B = (out_div == 2) ? 0x80 : 0x00;
+-   pSiS->SiS_Pr->CSR2B |= ((out_n - 1) & 0x7f);
+-   pSiS->SiS_Pr->CSR2C = (out_dn - 1) & 0x1f;
+-   pSiS->SiS_Pr->CSR2C |= (((out_scale - 1) & 3) << 5);
+-   pSiS->SiS_Pr->CSR2C |= ((out_sbit & 0x01) << 7);
++      xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock %d: n %d dn %d div %d sc %d\n",
++              pSiS->SiS_Pr->CDClock, vclk[Midx], vclk[Nidx], vclk[VLDidx], vclk[Pidx]);
++#endif
++   }
++
+    pSiS->SiS_Pr->CSRClock = (pSiS->SiS_Pr->CDClock / 1000) + 1;
+    pSiS->SiS_Pr->CCRT1CRTC[0]  =  ((pSiS->SiS_Pr->CHTotal >> 3) - 5) & 0xff;
+@@ -5045,9 +5224,9 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+    pSiS->SiS_Pr->CCRT1CRTC[2]  =  (pSiS->SiS_Pr->CHBlankStart >> 3) - 1;
+    pSiS->SiS_Pr->CCRT1CRTC[3]  =  (((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1) & 0x1F) | 0x80;
+    pSiS->SiS_Pr->CCRT1CRTC[4]  =  (pSiS->SiS_Pr->CHSyncStart >> 3) + 3;
+-   pSiS->SiS_Pr->CCRT1CRTC[5]  =  ((((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1) & 0x20) << 2) | 
++   pSiS->SiS_Pr->CCRT1CRTC[5]  =  ((((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1) & 0x20) << 2) |
+                                         (((pSiS->SiS_Pr->CHSyncEnd >> 3) + 3) & 0x1F);
+-   
++
+    pSiS->SiS_Pr->CCRT1CRTC[6]  =  (pSiS->SiS_Pr->CVTotal - 2) & 0xFF;
+    pSiS->SiS_Pr->CCRT1CRTC[7]  =  (((pSiS->SiS_Pr->CVTotal - 2) & 0x100) >> 8)
+                               | (((pSiS->SiS_Pr->CVDisplay - 1) & 0x100) >> 7)
+@@ -5057,50 +5236,50 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+                               | (((pSiS->SiS_Pr->CVTotal - 2) & 0x200)   >> 4)
+                               | (((pSiS->SiS_Pr->CVDisplay - 1) & 0x200) >> 3)
+                               | ((pSiS->SiS_Pr->CVSyncStart & 0x200) >> 2);
+-    
++
+    pSiS->SiS_Pr->CCRT1CRTC[16] = ((((pSiS->SiS_Pr->CVBlankStart - 1) & 0x200) >> 4) >> 5);    /* cr9 */
+-    
+-#if 0    
++
++#if 0
+    if (mode->VScan >= 32)
+       regp->CRTC[9] |= 0x1F;
+    else if (mode->VScan > 1)
+       regp->CRTC[9] |= mode->VScan - 1;
+-#endif        
++#endif
+-   pSiS->SiS_Pr->CCRT1CRTC[8] =  (pSiS->SiS_Pr->CVSyncStart - 1) & 0xFF;      /* cr10 */
+-   pSiS->SiS_Pr->CCRT1CRTC[9] =  ((pSiS->SiS_Pr->CVSyncEnd - 1) & 0x0F) | 0x80;       /* cr11 */
+-   pSiS->SiS_Pr->CCRT1CRTC[10] = (pSiS->SiS_Pr->CVDisplay - 1) & 0xFF;                /* cr12 */
+-   pSiS->SiS_Pr->CCRT1CRTC[11] = (pSiS->SiS_Pr->CVBlankStart - 1) & 0xFF;     /* cr15 */
+-   pSiS->SiS_Pr->CCRT1CRTC[12] = (pSiS->SiS_Pr->CVBlankEnd - 1) & 0xFF;               /* cr16 */
+-   
+-   pSiS->SiS_Pr->CCRT1CRTC[13] = 
++   pSiS->SiS_Pr->CCRT1CRTC[8] =  (pSiS->SiS_Pr->CVSyncStart     ) & 0xFF;             /* cr10 */
++   pSiS->SiS_Pr->CCRT1CRTC[9] =  ((pSiS->SiS_Pr->CVSyncEnd      ) & 0x0F) | 0x80;     /* cr11 */
++   pSiS->SiS_Pr->CCRT1CRTC[10] = (pSiS->SiS_Pr->CVDisplay    - 1) & 0xFF;             /* cr12 */
++   pSiS->SiS_Pr->CCRT1CRTC[11] = (pSiS->SiS_Pr->CVBlankStart - 1) & 0xFF;             /* cr15 */
++   pSiS->SiS_Pr->CCRT1CRTC[12] = (pSiS->SiS_Pr->CVBlankEnd   - 1) & 0xFF;             /* cr16 */
++
++   pSiS->SiS_Pr->CCRT1CRTC[13] =
+                         GETBITSTR((pSiS->SiS_Pr->CVTotal     -2), 10:10, 0:0) |
+                         GETBITSTR((pSiS->SiS_Pr->CVDisplay   -1), 10:10, 1:1) |
+                         GETBITSTR((pSiS->SiS_Pr->CVBlankStart-1), 10:10, 2:2) |
+                         GETBITSTR((pSiS->SiS_Pr->CVSyncStart   ), 10:10, 3:3) |
+                         GETBITSTR((pSiS->SiS_Pr->CVBlankEnd  -1),   8:8, 4:4) |
+-                        GETBITSTR((pSiS->SiS_Pr->CVSyncEnd   -1),   4:4, 5:5) ;  
++                        GETBITSTR((pSiS->SiS_Pr->CVSyncEnd     ),   4:4, 5:5) ;
+-   pSiS->SiS_Pr->CCRT1CRTC[14] = 
++   pSiS->SiS_Pr->CCRT1CRTC[14] =
+                         GETBITSTR((pSiS->SiS_Pr->CHTotal      >> 3) - 5, 9:8, 1:0) |
+                         GETBITSTR((pSiS->SiS_Pr->CHDisplay    >> 3) - 1, 9:8, 3:2) |
+                         GETBITSTR((pSiS->SiS_Pr->CHBlankStart >> 3) - 1, 9:8, 5:4) |
+                         GETBITSTR((pSiS->SiS_Pr->CHSyncStart  >> 3) + 3, 9:8, 7:6) ;
+-        
++
+    pSiS->SiS_Pr->CCRT1CRTC[15] =
+                         GETBITSTR((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1, 7:6, 1:0) |
+-                        GETBITSTR((pSiS->SiS_Pr->CHSyncEnd  >> 3) + 3, 5:5, 2:2) ; 
+-                      
++                        GETBITSTR((pSiS->SiS_Pr->CHSyncEnd  >> 3) + 3, 5:5, 2:2) ;
++
+    switch(depth) {
+-   case 8:                    
+-              pSiS->SiS_Pr->CModeFlag = 0x223b;
++   case 8:
++              pSiS->SiS_Pr->CModeFlag |= 0x223b;
+       break;
+-   case 16:                   
+-              pSiS->SiS_Pr->CModeFlag = 0x227d;
++   case 16:
++              pSiS->SiS_Pr->CModeFlag |= 0x227d;
+       break;
+-   case 32:                   
+-              pSiS->SiS_Pr->CModeFlag = 0x22ff;
++   case 32:
++              pSiS->SiS_Pr->CModeFlag |= 0x22ff;
+       break;          
+    default: 
+       return 0;       
+@@ -5114,9 +5293,9 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+       pSiS->SiS_Pr->CModeFlag |= LineCompareOff;
+    if(pSiS->SiS_Pr->CFlags & V_CLKDIV2)
+         pSiS->SiS_Pr->CModeFlag |= HalfDCLK;
+-   
++
+    pSiS->SiS_Pr->CInfoFlag = 0x0007;
+-   if(pSiS->SiS_Pr->CFlags & V_NHSYNC) 
++   if(pSiS->SiS_Pr->CFlags & V_NHSYNC)
+       pSiS->SiS_Pr->CInfoFlag |= 0x4000;
+    if(pSiS->SiS_Pr->CFlags & V_NVSYNC) 
+       pSiS->SiS_Pr->CInfoFlag |= 0x8000;
+@@ -5152,13 +5331,13 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pSc
+       pSiS->SiS_Pr->CSR2B,
+       pSiS->SiS_Pr->CSR2C,
+       pSiS->SiS_Pr->CSRClock);
+-#endif        
++#endif
+    return 1;
+ }
+ /* TW: Build a list of supported modes */
+ DisplayModePtr
+-SiSBuildBuiltInModeList(ScrnInfoPtr pScrn)
++SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfordvi)
+ {
+    SISPtr         pSiS = SISPTR(pScrn);
+    unsigned short VRE, VBE, VRS, VBS, VDE, VT;
+@@ -5166,11 +5345,16 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+    unsigned char  sr_data, cr_data, cr_data2, cr_data3;
+    unsigned char  sr2b, sr2c;
+    float          num, denum, postscalar, divider;
+-   int            A, B, C, D, E, F, temp, i, j, index, vclkindex;
+-   DisplayModePtr new = NULL, current = NULL, first = NULL, backup = NULL;
++   int            A, B, C, D, E, F, temp, i, j, k, l, index, vclkindex;
++   DisplayModePtr new = NULL, current = NULL, first = NULL;
++   BOOLEAN        done = FALSE;
++#if 0
++   DisplayModePtr backup = NULL;
++#endif
+    pSiS->backupmodelist = NULL;
+-   
++   pSiS->AddedPlasmaModes = FALSE;
++
+    /* Initialize our pointers */
+    if(pSiS->VGAEngine == SIS_300_VGA) {
+ #ifdef SIS300
+@@ -5194,15 +5378,20 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+       if(pSiS->VGAEngine == SIS_300_VGA) index &= 0x3F;
+ #endif      
+-      if(((pSiS->SiS_Pr->SiS_RefIndex[i].XRes < 512) && (!pSiS->DSTN)) ||
+-               ((pSiS->DSTN) &&
+-        (pSiS->SiS_Pr->SiS_RefIndex[i].XRes < 512) &&
+-        (pSiS->SiS_Pr->SiS_RefIndex[i].XRes != 320) &&
+-        (pSiS->SiS_Pr->SiS_RefIndex[i].YRes != 480)))  {
++      /* 0x5a (320x240) is a pure FTSN mode, not DSTN! */
++      if((!pSiS->FSTN) &&
++       (pSiS->SiS_Pr->SiS_RefIndex[i].ModeID == 0x5a))  {
+            i++;
+                  continue;
+       }
+-      
++      if((pSiS->FSTN) &&
++         (pSiS->SiS_Pr->SiS_RefIndex[i].XRes == 320) &&
++       (pSiS->SiS_Pr->SiS_RefIndex[i].YRes == 240) &&
++       (pSiS->SiS_Pr->SiS_RefIndex[i].ModeID != 0x5a)) {
++         i++;
++         continue;
++      }
++
+       if(!(new = xalloc(sizeof(DisplayModeRec)))) return first;
+       memset(new, 0, sizeof(DisplayModeRec));
+       if(!(new->name = xalloc(10))) {
+@@ -5216,13 +5405,13 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+       }
+       current = new;
+-      
++
+       sprintf(current->name, "%dx%d", pSiS->SiS_Pr->SiS_RefIndex[i].XRes,
+                                       pSiS->SiS_Pr->SiS_RefIndex[i].YRes);
+       current->status = MODE_OK;
+-      current->type = M_T_DEFAULT; 
++      current->type = M_T_DEFAULT;
+       vclkindex = pSiS->SiS_Pr->SiS_RefIndex[i].Ext_CRTVCLK;
+       if(pSiS->VGAEngine == SIS_300_VGA) vclkindex &= 0x3F;
+@@ -5235,7 +5424,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+               ( (((sr2c >> 5) & 0x03) == 0x02) ? 6.0 : 8.0) : (((sr2c >> 5) & 0x03) + 1.0);
+       num = (sr2b & 0x7f) + 1.0;
+       denum = (sr2c & 0x1f) + 1.0;
+-      
++
+ #ifdef TWDEBUG
+       xf86DrvMsg(0, X_INFO, "------------\n");
+       xf86DrvMsg(0, X_INFO, "sr2b: %x sr2c %x div %f ps %f num %f denum %f\n",
+@@ -5303,10 +5492,29 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+       D = B - F - C;
+-      current->HDisplay   = (E * 8);
+-      current->HSyncStart = (E * 8) + (F * 8);
+-      current->HSyncEnd   = (E * 8) + (F * 8) + (C * 8);
+-      current->HTotal     = (E * 8) + (F * 8) + (C * 8) + (D * 8);
++      if((pSiS->SiS_Pr->SiS_RefIndex[i].XRes == 320) &&
++       ((pSiS->SiS_Pr->SiS_RefIndex[i].YRes == 200) ||
++        (pSiS->SiS_Pr->SiS_RefIndex[i].YRes == 240))) {
++
++       /* Terrible hack, but correct CRTC data for
++        * these modes only produces a black screen...
++        * (HRE is 0, leading into a too large C and
++        * a negative D. The CRT controller does not
++        * seem to like correcting HRE to 50
++        */
++       current->HDisplay   = 320;
++         current->HSyncStart = 328;
++         current->HSyncEnd   = 376;
++         current->HTotal     = 400;
++
++      } else {
++
++         current->HDisplay   = (E * 8);
++         current->HSyncStart = (E * 8) + (F * 8);
++         current->HSyncEnd   = (E * 8) + (F * 8) + (C * 8);
++         current->HTotal     = (E * 8) + (F * 8) + (C * 8) + (D * 8);
++
++      }
+ #ifdef TWDEBUG
+       xf86DrvMsg(0, X_INFO,
+@@ -5430,7 +5638,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+        current->VSyncStart <<= 1;
+        current->VSyncEnd <<= 1;
+        current->VTotal <<= 1;
+-       current->VTotal |= 1; 
++       current->VTotal |= 1;
+       }
+       if(current->Flags & V_DBLSCAN) {
+          current->Clock >>= 1;
+@@ -5440,6 +5648,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+        current->VTotal >>= 1;
+       }
++#if 0
+       if((backup = xalloc(sizeof(DisplayModeRec)))) {
+          if(!pSiS->backupmodelist) pSiS->backupmodelist = backup;
+        else {
+@@ -5458,6 +5667,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+        backup->Flags = current->Flags;
+        backup->Clock = current->Clock;
+       }
++#endif
+ #ifdef TWDEBUG
+       xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+@@ -5470,6 +5680,187 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScr
+       i++;
+    }
++   /* Add non-standard LCD modes for panel's detailed timings */
++
++   if(!includelcdmodes) return first;
++
++   xf86DrvMsg(0, X_INFO, "Checking database for vendor %x, product %x\n",
++      pSiS->SiS_Pr->CP_Vendor, pSiS->SiS_Pr->CP_Product);
++
++   i = 0;
++   while((!done) && (SiS_PlasmaTable[i].vendor) && (pSiS->SiS_Pr->CP_Vendor)) {
++
++     if(SiS_PlasmaTable[i].vendor == pSiS->SiS_Pr->CP_Vendor) {
++
++        for(j=0; j<SiS_PlasmaTable[i].productnum; j++) {
++
++          if(SiS_PlasmaTable[i].product[j] == pSiS->SiS_Pr->CP_Product) {
++
++             xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
++                "Identified %s panel, adding specific modes\n",
++                SiS_PlasmaTable[i].plasmaname);
++
++             for(k=0; k<SiS_PlasmaTable[i].modenum; k++) {
++
++                if(isfordvi) {
++                   if(!(SiS_PlasmaTable[i].plasmamodes[k] & 0x80)) continue;
++                } else {
++                   if(!(SiS_PlasmaTable[i].plasmamodes[k] & 0x40)) continue;
++                }
++
++                if(!(new = xalloc(sizeof(DisplayModeRec)))) return first;
++
++                  memset(new, 0, sizeof(DisplayModeRec));
++                  if(!(new->name = xalloc(10))) {
++                           xfree(new);
++                   return first;
++                  }
++                  if(!first) first = new;
++                  if(current) {
++                     current->next = new;
++                   new->prev = current;
++                  }
++
++                  current = new;
++
++                pSiS->AddedPlasmaModes = TRUE;
++
++                l = SiS_PlasmaTable[i].plasmamodes[k] & 0x3f;
++
++                sprintf(current->name, "%dx%d", SiS_PlasmaMode[l].HDisplay,
++                                                  SiS_PlasmaMode[l].VDisplay);
++
++                  current->status = MODE_OK;
++
++                  current->type = M_T_BUILTIN;
++
++                current->Clock = SiS_PlasmaMode[l].clock;
++                current->SynthClock = current->Clock;
++
++                  current->HDisplay   = SiS_PlasmaMode[l].HDisplay;
++                  current->HSyncStart = current->HDisplay + SiS_PlasmaMode[l].HFrontPorch;
++                  current->HSyncEnd   = current->HSyncStart + SiS_PlasmaMode[l].HSyncWidth;
++                  current->HTotal     = SiS_PlasmaMode[l].HTotal;
++
++                current->VDisplay   = SiS_PlasmaMode[l].VDisplay;
++                  current->VSyncStart = current->VDisplay + SiS_PlasmaMode[l].VFrontPorch;
++                  current->VSyncEnd   = current->VSyncStart + SiS_PlasmaMode[l].VSyncWidth;
++                  current->VTotal     = SiS_PlasmaMode[l].VTotal;
++
++                  current->CrtcHDisplay = current->HDisplay;
++                  current->CrtcHBlankStart = current->HSyncStart;
++                  current->CrtcHSyncStart = current->HSyncStart;
++                  current->CrtcHSyncEnd = current->HSyncEnd;
++                  current->CrtcHBlankEnd = current->HSyncEnd;
++                  current->CrtcHTotal = current->HTotal;
++
++                  current->CrtcVDisplay = current->VDisplay;
++                  current->CrtcVBlankStart = current->VSyncStart;
++                  current->CrtcVSyncStart = current->VSyncStart;
++                  current->CrtcVSyncEnd = current->VSyncEnd;
++                  current->CrtcVBlankEnd = current->VSyncEnd;
++                  current->CrtcVTotal = current->VTotal;
++
++                  if(SiS_PlasmaMode[l].SyncFlags & SIS_PL_HSYNCP)
++                     current->Flags |= V_PHSYNC;
++                  else
++                     current->Flags |= V_NHSYNC;
++
++                  if(SiS_PlasmaMode[l].SyncFlags & SIS_PL_VSYNCP)
++                     current->Flags |= V_PVSYNC;
++                  else
++                     current->Flags |= V_NVSYNC;
++
++                if(current->HDisplay > pSiS->LCDwidth)
++                   pSiS->LCDwidth = pSiS->SiS_Pr->CP_MaxX = current->HDisplay;
++                if(current->VDisplay > pSiS->LCDheight)
++                   pSiS->LCDheight = pSiS->SiS_Pr->CP_MaxY = current->VDisplay;
++
++               }
++             done = TRUE;
++             break;
++          }
++      }
++     }
++
++     i++;
++
++   }
++
++   if(pSiS->SiS_Pr->CP_HaveCustomData) {
++
++      for(i=0; i<7; i++) {
++
++         if(pSiS->SiS_Pr->CP_DataValid[i]) {
++
++            if(!(new = xalloc(sizeof(DisplayModeRec)))) return first;
++
++            memset(new, 0, sizeof(DisplayModeRec));
++            if(!(new->name = xalloc(10))) {
++                      xfree(new);
++              return first;
++            }
++            if(!first) first = new;
++            if(current) {
++               current->next = new;
++             new->prev = current;
++            }
++
++            current = new;
++
++            sprintf(current->name, "%dx%d", pSiS->SiS_Pr->CP_HDisplay[i],
++                                            pSiS->SiS_Pr->CP_VDisplay[i]);
++
++            current->status = MODE_OK;
++
++            current->type = M_T_BUILTIN;
++
++            current->Clock = pSiS->SiS_Pr->CP_Clock[i];
++            current->SynthClock = current->Clock;
++
++            current->HDisplay   = pSiS->SiS_Pr->CP_HDisplay[i];
++            current->HSyncStart = pSiS->SiS_Pr->CP_HSyncStart[i];
++            current->HSyncEnd   = pSiS->SiS_Pr->CP_HSyncEnd[i];
++            current->HTotal     = pSiS->SiS_Pr->CP_HTotal[i];
++
++            current->VDisplay   = pSiS->SiS_Pr->CP_VDisplay[i];
++            current->VSyncStart = pSiS->SiS_Pr->CP_VSyncStart[i];
++            current->VSyncEnd   = pSiS->SiS_Pr->CP_VSyncEnd[i];
++            current->VTotal     = pSiS->SiS_Pr->CP_VTotal[i];
++
++            current->CrtcHDisplay = current->HDisplay;
++            current->CrtcHBlankStart = pSiS->SiS_Pr->CP_HBlankStart[i];
++            current->CrtcHSyncStart = current->HSyncStart;
++            current->CrtcHSyncEnd = current->HSyncEnd;
++            current->CrtcHBlankEnd = pSiS->SiS_Pr->CP_HBlankEnd[i];
++            current->CrtcHTotal = current->HTotal;
++
++            current->CrtcVDisplay = current->VDisplay;
++            current->CrtcVBlankStart = pSiS->SiS_Pr->CP_VBlankStart[i];
++            current->CrtcVSyncStart = current->VSyncStart;
++            current->CrtcVSyncEnd = current->VSyncEnd;
++            current->CrtcVBlankEnd = pSiS->SiS_Pr->CP_VBlankEnd[i];
++            current->CrtcVTotal = current->VTotal;
++
++          if(pSiS->SiS_Pr->CP_SyncValid[i]) {
++               if(pSiS->SiS_Pr->CP_HSync_P[i])
++                  current->Flags |= V_PHSYNC;
++               else
++                  current->Flags |= V_NHSYNC;
++
++               if(pSiS->SiS_Pr->CP_VSync_P[i])
++                  current->Flags |= V_PVSYNC;
++               else
++                  current->Flags |= V_NVSYNC;
++          } else {
++             /* No sync data? Use positive sync... */
++             current->Flags |= V_PHSYNC;
++             current->Flags |= V_PVSYNC;
++          }
++         }
++      }
++   }
++
+    return first;
+ }
+@@ -5486,25 +5877,25 @@ sisfb_mode_rate_to_dclock(SiS_Private *S
+     UCHAR  *ROMAddr  = HwDeviceExtension->pjVirtualRomBase;
+     ULONG  temp = 0;
+     int    Clock;
+-    
++
+     if(HwDeviceExtension->jChipType < SIS_315H) {
+ #ifdef SIS300
+        InitTo300Pointer(SiS_Pr, HwDeviceExtension);
+ #else
+-       return 65;
++       return 65 * 1000 * 1000;
+ #endif
+     } else {
+ #ifdef SIS315H
+        InitTo310Pointer(SiS_Pr, HwDeviceExtension);
+ #else
+-       return 65;
++       return 65 * 1000 * 1000;
+ #endif
+     }
+-    
++
+     temp = SiS_SearchModeID(SiS_Pr, ROMAddr, &ModeNo, &ModeIdIndex);
+     if(!temp) {
+       printk(KERN_ERR "Could not find mode %x\n", ModeNo);
+-      return 65;
++      return 65 * 1000 * 1000;
+     }
+     
+     RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
+@@ -5518,6 +5909,56 @@ sisfb_mode_rate_to_dclock(SiS_Private *S
+     return(Clock);
+ }
++BOOLEAN
++sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
++                     unsigned char modeno, int *htotal, int *vtotal, unsigned char rateindex)
++{
++    USHORT ModeNo = modeno;
++    USHORT ModeIdIndex = 0, CRT1Index = 0;
++    USHORT RefreshRateTableIndex = 0;
++    UCHAR  *ROMAddr  = HwDeviceExtension->pjVirtualRomBase;
++    ULONG  temp = 0;
++    unsigned char  sr_data, cr_data, cr_data2;
++
++    if(HwDeviceExtension->jChipType < SIS_315H) {
++#ifdef SIS300
++       InitTo300Pointer(SiS_Pr, HwDeviceExtension);
++#else
++       return FALSE;
++#endif
++    } else {
++#ifdef SIS315H
++       InitTo310Pointer(SiS_Pr, HwDeviceExtension);
++#else
++       return FALSE;
++#endif
++    }
++
++    temp = SiS_SearchModeID(SiS_Pr, ROMAddr, &ModeNo, &ModeIdIndex);
++    if(!temp) return FALSE;
++
++    RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
++    RefreshRateTableIndex += (rateindex - 1);
++    CRT1Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
++
++    sr_data = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
++    cr_data = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[0];
++    *htotal = (((cr_data & 0xff) | ((unsigned short) (sr_data & 0x03) << 8)) + 5) * 8;
++
++    sr_data = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
++    cr_data = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[6];
++    cr_data2 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
++    *vtotal = ((cr_data & 0xFF) |
++               ((unsigned short)(cr_data2 & 0x01) <<  8) |
++             ((unsigned short)(cr_data2 & 0x20) <<  4) |
++             ((unsigned short)(sr_data  & 0x01) << 10)) + 2;
++
++    if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag & InterlaceMode)
++       *vtotal *= 2;
++
++    return TRUE;
++}
++
+ int
+ sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                        unsigned char modeno, unsigned char rateindex,
+@@ -5606,17 +6047,32 @@ sisfb_mode_rate_to_ddata(SiS_Private *Si
+     C = (temp > 0) ? temp : (temp + 64);
+     D = B - F - C;
+-    
+-    *left_margin = D * 8;
+-    *right_margin = F * 8;
+-    *hsync_len = C * 8;
++
++    if((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].XRes == 320) &&
++       ((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].YRes == 200) ||
++      (SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].YRes == 240))) {
++
++       /* Terrible hack, but the correct CRTC data for
++        * these modes only produces a black screen...
++        */
++       *left_margin = (400 - 376);
++       *right_margin = (328 - 320);
++       *hsync_len = (376 - 328);
++
++    } else {
++
++       *left_margin = D * 8;
++       *right_margin = F * 8;
++       *hsync_len = C * 8;
++
++    }
+     sr_data = SiS_Pr->SiS_CRT1Table[index].CR[13];
+     cr_data = SiS_Pr->SiS_CRT1Table[index].CR[6];
+-    
++
+     cr_data2 = SiS_Pr->SiS_CRT1Table[index].CR[7];
+-    
++
+     /* Vertical total */
+     VT = (cr_data & 0xFF) |
+          ((unsigned short) (cr_data2 & 0x01) << 8) |
+@@ -5699,19 +6155,19 @@ sisfb_mode_rate_to_ddata(SiS_Private *Si
+         j++;
+       }
+     }       
+-       
+-#if 0  /* That's bullshit, only the resolution needs to be shifted */    
++
+     if((*vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
++#if 0  /* Do this? */
+        *upper_margin <<= 1;
+        *lower_margin <<= 1;
+        *vsync_len <<= 1;
++#endif
+     } else if((*vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+        *upper_margin >>= 1;
+        *lower_margin >>= 1;
+        *vsync_len >>= 1;
+-    }  
+-#endif
+-          
++    }
++
+     return 1;       
+ }                       
+--- linux-2.6.0-test1/drivers/video/sis/initdef.h      2003-06-14 12:18:24.000000000 -0700
++++ 25/drivers/video/sis/initdef.h     2003-07-19 17:04:55.000000000 -0700
+@@ -1,5 +1,29 @@
+ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h,v 1.4 2000/12/02 01:16:17 dawes Exp $ */
+-
++/*
++ * Global definitions for init.c and init301.c
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ */
+ #ifndef _INITDEF_
+ #define _INITDEF_
+@@ -22,12 +46,18 @@
+ #define VB_SIS301B302B          (VB_SIS301B|VB_SIS302B)
+ #define VB_SIS301LV302LV        (VB_SIS301LV|VB_SIS302LV)
+-#define IS_SIS650740            ((HwDeviceExtension->jChipType >= SIS_650) && (HwDeviceExtension->jChipType < SIS_330))
+-
+ #define IS_SIS650             (HwDeviceExtension->jChipType == SIS_650)
+ #define IS_SIS740             (HwDeviceExtension->jChipType == SIS_740)
+ #define IS_SIS330             (HwDeviceExtension->jChipType == SIS_330)
+ #define IS_SIS550             (HwDeviceExtension->jChipType == SIS_550)
++#define IS_SIS651             (SiS_Pr->SiS_SysFlags & (SF_Is651 | SF_Is652))
++#define IS_SISM650            (SiS_Pr->SiS_SysFlags & (SF_IsM650 | SF_IsM652 | SF_IsM653))
++#define IS_SIS65x               (IS_SIS651 || IS_SISM650)
++#define IS_SIS660             (HwDeviceExtension->jChipType == SIS_660)
++#define IS_SIS650660            (IS_SIS650 || IS_SIS660)
++#define IS_SIS650740            ((HwDeviceExtension->jChipType >= SIS_650) && (HwDeviceExtension->jChipType < SIS_330))
++#define IS_SIS650740660         (IS_SIS650 || IS_SIS660 || IS_SIS740)
++#define IS_SIS550650740660      (IS_SIS550 || IS_SIS650 || IS_SIS660 || IS_SIS740)
+ #define CRT1Len                 17
+ #define LVDSCRT1Len             15
+@@ -63,7 +93,7 @@
+ #define SupportTV               0x0008
+ #define SupportHiVisionTV       0x0010
+ #define SupportLCD              0x0020
+-#define SupportRAMDAC2          0x0040  
++#define SupportRAMDAC2          0x0040
+ #define NoSupportTV             0x0070
+ #define NoSupportHiVisionTV     0x0060
+ #define NoSupportLCD            0x0058
+@@ -105,6 +135,24 @@
+ #define HotKeySwitch            0x8000  /* TW: ? */
+ #define SetCRT2ToLCDA           0x8000
++/* SetFlag */
++#define ProgrammingCRT2         0x01
++#define TVSimuMode              0x02
++#define RPLLDIV2XO              0x04
++#define LCDVESATiming           0x08
++#define EnableLVDSDDA           0x10
++#define SetDispDevSwitchFlag    0x20
++#define CheckWinDos             0x40
++#define SetDOSMode              0x80
++
++/* SysFlags */
++#define SF_Is651                0x0001
++#define SF_IsM650               0x0002
++#define SF_Is652              0x0004
++#define SF_IsM652             0x0008
++#define SF_IsM653             0x0010
++#define SF_Is660              0x8000
++
+ #define PanelRGB18Bit           0x0100
+ #define PanelRGB24Bit           0x0000
+@@ -112,7 +160,7 @@
+ #define TVOverScanShift         4
+ #define ClearBufferFlag         0x20
+-/* CR32 (Newer 630, and 310/325 series)
++/* CR32 (Newer 630, and 315 series)
+    [0]   VB connected with CVBS
+    [1]   VB connected with SVHS
+@@ -134,7 +182,7 @@
+           011   LVDS + Tumpion Zurac
+           100   LVDS + Chrontel 7005
+           110   Chrontel 7005
+-        310/325 series
++        315 series
+           001   SiS30x (never seen)
+           010   LVDS
+           011   LVDS + Chrontel 7019
+@@ -163,14 +211,15 @@
+ #define LCDSyncBit            0x00e0
+ #define LCDSyncShift               6
+-/* CR38 (310/325 series) */
++/* CR38 (315 series) */
+ #define EnableDualEdge                0x01   
+ #define SetToLCDA             0x02   /* LCD channel A (302B/LV and 650+LVDS only) */
+ #define EnableSiSHiVision       0x04   /* HiVision (HDTV) on SiS bridge */
+ #define EnableLVDSScart         0x04   /* Scart on Ch7019 (unofficial definition - TW) */
+ #define EnableLVDSHiVision      0x08   /* YPbPr color format (480i HDTV); only on 650/Ch7019 systems */
+-#define SiSHiVision1            0x10   /* See SetHiVision() */
+-#define SiSHiVision2            0x20
++#define EnableHiVision750       0x08   /* Enable 750P HiVision mode (30xLV only) */
++#define EnableHiVision525       0x10   /* Enable 525P HiVision mode (30xLV only) */
++#define SiSHiVision2            0x20   /* ? - |  --- mask 0x38 combinations have different meaning! */
+ #define EnablePALM              0x40   /* 1 = Set PALM */
+ #define EnablePALN              0x80   /* 1 = Set PALN */
+@@ -184,7 +233,7 @@
+ #define Enable302LV_DualLink    0x04   /* 30xNEW (302LV) only; set by mode switching function */
+-/* CR79 (310/325 series only)
++/* CR79 (315 series only)
+    [3-0] Notify driver
+          0001 Mode Switch event (set by BIOS)
+        0010 Epansion On/Off event
+@@ -202,16 +251,6 @@
+    [7]   TV UnderScan/OverScan (set by BIOS)
+ */
+-/* SetFlag */
+-#define ProgrammingCRT2         0x01
+-#define TVSimuMode              0x02
+-#define RPLLDIV2XO              0x04
+-#define LCDVESATiming           0x08
+-#define EnableLVDSDDA           0x10
+-#define SetDispDevSwitchFlag    0x20
+-#define CheckWinDos             0x40
+-#define SetDOSMode              0x80
+-
+ /* LCDResInfo */
+ #define Panel300_800x600        0x01  /* CR36 */
+ #define Panel300_1024x768       0x02
+@@ -220,7 +259,10 @@
+ #define Panel300_640x480        0x05
+ #define Panel300_1024x600       0x06
+ #define Panel300_1152x768       0x07
+-#define Panel300_320x480        0x08  /* fstn - TW: This is fake, can be any */
++#define Panel300_1280x768       0x0a
++#define Panel300_320x480        0x0e  /* fstn - TW: This is fake, can be any */
++#define Panel300_Custom               0x0f
++#define Panel300_Barco1366      0x10
+ #define Panel310_800x600        0x01
+ #define Panel310_1024x768       0x02
+@@ -231,9 +273,12 @@
+ #define Panel310_1280x960       0x07
+ #define Panel310_1152x768       0x08  /* LVDS only */
+ #define Panel310_1400x1050      0x09
+-#define Panel310_1280x768       0x0a    /* LVDS only */
++#define Panel310_1280x768       0x0a
+ #define Panel310_1600x1200      0x0b
+-#define Panel310_320x480        0x0c    /* fstn - TW: This is fake, can be any */
++#define Panel310_640x480_2      0x0c
++#define Panel310_640x480_3      0x0d
++#define Panel310_320x480        0x0e    /* fstn - TW: This is fake, can be any */
++#define Panel310_Custom               0x0f
+ #define Panel_800x600           0x01  /* Unified values */
+ #define Panel_1024x768          0x02
+@@ -246,7 +291,42 @@
+ #define Panel_1400x1050         0x09
+ #define Panel_1280x768          0x0a    /* LVDS only */
+ #define Panel_1600x1200         0x0b
+-#define Panel_320x480           0x0c    /* fstn - TW: This is fake, can be any */
++#define Panel_640x480_2               0x0c
++#define Panel_640x480_3               0x0d
++#define Panel_320x480           0x0e    /* fstn - TW: This is fake, can be any */
++#define Panel_Custom          0x0f
++#define Panel_Barco1366         0x10
++
++/* Index in ModeResInfo table */
++#define SIS_RI_320x200 0
++#define SIS_RI_320x240 1
++#define SIS_RI_320x400 2
++#define SIS_RI_400x300 3
++#define SIS_RI_512x384 4
++#define SIS_RI_640x400 5
++#define SIS_RI_640x480 6
++#define SIS_RI_800x600 7
++#define SIS_RI_1024x768 8
++#define SIS_RI_1280x1024 9
++#define SIS_RI_1600x1200 10
++#define SIS_RI_1920x1440 11
++#define SIS_RI_2048x1536 12
++#define SIS_RI_720x480 13
++#define SIS_RI_720x576 14
++#define SIS_RI_1280x960 15
++#define SIS_RI_800x480 16
++#define SIS_RI_1024x576 17
++#define SIS_RI_1280x720 18
++#define SIS_RI_856x480 19
++#define SIS_RI_1280x768 20
++#define SIS_RI_1400x1050 21
++#define SIS_RI_1152x864 22
++#define SIS_RI_848x480 23
++#define SIS_RI_1360x768 24
++#define SIS_RI_1024x600 25
++#define SIS_RI_1152x768 26
++#define SIS_RI_768x576 27
++#define SIS_RI_1360x1024 28
+ #define ExtChipType             0x0e
+ #define ExtChip301              0x02
+@@ -278,15 +358,32 @@
+ #define VCLKStartFreq           25
+ #define SoftDramType            0x80
+-#define VCLK40                  0x04   /* Index in VCLKData array */
+-#define VCLK65                  0x09   /* Index in VCLKData array */
+-#define VCLK108_2               0x14   /* Index in VCLKData array */
+-#define TVVCLKDIV2              0x21   /* Indices in (VB)VCLKData arrays */
+-#define TVVCLK                  0x22
+-#define HiTVVCLKDIV2            0x23
+-#define HiTVVCLK                0x24
+-#define HiTVSimuVCLK            0x25
+-#define HiTVTextVCLK            0x26
++/* Indices in (VB)VCLKData tables */
++
++#define VCLK28                  0x00   /* Index in VCLKData table (300 and 315) */
++#define VCLK40                  0x04   /* Index in VCLKData table (300 and 315) */
++#define VCLK65_300              0x09   /* Index in VCLKData table (300) */
++#define VCLK108_2_300           0x14   /* Index in VCLKData table (300) */
++#define VCLK81_300            0x3f   /* Index in VCLKData table (300) */
++#define VCLK108_3_300           0x42   /* Index in VCLKData table (300) */
++#define VCLK100_300             0x43   /* Index in VCLKData table (300) */
++#define VCLK65_315              0x0b   /* Index in (VB)VCLKData table (315) */
++#define VCLK108_2_315           0x19   /* Index in (VB)VCLKData table (315) */
++#define VCLK81_315            0x5b   /* Index in (VB)VCLKData table (315) */
++#define VCLK162_315             0x21   /* Index in (VB)VCLKData table (315) */
++#define VCLK108_3_315           0x45   /* Index in VBVCLKData table (315) */
++#define VCLK100_315             0x46   /* Index in VBVCLKData table (315) */
++
++#define TVCLKBASE_300         0x21   /* Indices on TV clocks in VCLKData table (300) */
++#define TVCLKBASE_315         0x3a   /* Indices on TV clocks in (VB)VCLKData table (315) */
++#define TVVCLKDIV2              0x00   /* Index relative to TVCLKBASE */
++#define TVVCLK                  0x01   /* Index relative to TVCLKBASE */
++#define HiTVVCLKDIV2            0x02   /* Index relative to TVCLKBASE */
++#define HiTVVCLK                0x03   /* Index relative to TVCLKBASE */
++#define HiTVSimuVCLK            0x04   /* Index relative to TVCLKBASE */
++#define HiTVTextVCLK            0x05   /* Index relative to TVCLKBASE */
++
++/* ------------------------------ */
+ #define LoadDACFlag             0x1000
+ #define AfterLockCRT2           0x4000
+@@ -306,6 +403,8 @@
+ #define HotPlugFunction         0x08
+ #define StStructSize            0x06
++#define SIS_VIDEO_CAPTURE       0x00 - 0x30
++#define SIS_VIDEO_PLAYBACK      0x02 - 0x30
+ #define SIS_CRT2_PORT_04        0x04 - 0x30
+ #define SIS_CRT2_PORT_10        0x10 - 0x30
+ #define SIS_CRT2_PORT_12        0x12 - 0x30
+@@ -393,7 +492,7 @@
+ /*
+   =============================================================
+-                      for 310/325 series
++                        for 315 series
+   =============================================================
+ */
+ #define SoftDRAMType        0x80
+--- linux-2.6.0-test1/drivers/video/sis/init.h 2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/video/sis/init.h        2003-07-19 17:04:55.000000000 -0700
+@@ -1,19 +1,39 @@
++/* $XFree86$ */
++/*
++ * Data and prototypes for init.c
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ */
++
+ #ifndef _INIT_
+ #define _INIT_
+ #include "osdef.h"
++
+ #include "initdef.h"
+ #include "vgatypes.h"
+ #include "vstruct.h"
+-#ifdef TC
+-#include <stdio.h>
+-#include <string.h>
+-#include <conio.h>
+-#include <dos.h>
+-#include <stdlib.h>
+-#endif
+-
+ #ifdef LINUX_XF86
+ #include "xf86.h"
+ #include "xf86Pci.h"
+@@ -24,6 +44,9 @@
+ #endif
+ #ifdef LINUX_KERNEL
++#ifdef SIS_CP
++#undef SIS_CP
++#endif
+ #include <linux/config.h>
+ #include <linux/version.h>
+ #include <linux/types.h>
+@@ -36,19 +59,6 @@
+ #endif
+ #endif
+-#ifdef WIN2000
+-#include <stdio.h>
+-#include <string.h>
+-#include <miniport.h>
+-#include "dderror.h"
+-#include "devioctl.h"
+-#include "miniport.h"
+-#include "ntddvdeo.h"
+-#include "video.h"
+-#include "sisv.h"
+-#include "tools.h"
+-#endif
+-
+ const USHORT SiS_DRAMType[17][5]={
+       {0x0C,0x0A,0x02,0x40,0x39},
+       {0x0D,0x0A,0x01,0x40,0x48},
+@@ -144,6 +154,2175 @@ const USHORT SiS_VGA_DAC[] =
+       0x0B,0x0C,0x0D,0x0F,0x10
+ };
++static const SiS_StResInfoStruct SiS_StResInfo[]=
++{
++      { 640,400},
++      { 640,350},
++      { 720,400},
++      { 720,350},
++      { 640,480}
++};
++
++static const SiS_ModeResInfoStruct SiS_ModeResInfo[] =
++{
++      {  320, 200, 8, 8},   /* 0x00 */
++      {  320, 240, 8, 8},   /* 0x01 */
++      {  320, 400, 8, 8},   /* 0x02 */
++      {  400, 300, 8, 8},   /* 0x03 */
++      {  512, 384, 8, 8},   /* 0x04 */
++      {  640, 400, 8,16},   /* 0x05 */
++      {  640, 480, 8,16},   /* 0x06 */
++      {  800, 600, 8,16},   /* 0x07 */
++      { 1024, 768, 8,16},   /* 0x08 */
++      { 1280,1024, 8,16},   /* 0x09 */
++      { 1600,1200, 8,16},   /* 0x0a */
++      { 1920,1440, 8,16},   /* 0x0b */
++      { 2048,1536, 8,16},   /* 0x0c */
++      {  720, 480, 8,16},   /* 0x0d */
++      {  720, 576, 8,16},   /* 0x0e */
++      { 1280, 960, 8,16},   /* 0x0f */
++      {  800, 480, 8,16},   /* 0x10 */
++      { 1024, 576, 8,16},   /* 0x11 */
++      { 1280, 720, 8,16},   /* 0x12 */
++      {  856, 480, 8,16},   /* 0x13 */
++      { 1280, 768, 8,16},   /* 0x14 */
++      { 1400,1050, 8,16},   /* 0x15 */
++      { 1152, 864, 8,16},   /* 0x16 */
++      {  848, 480, 8,16},   /* 0x17 */
++      { 1360, 768, 8,16},   /* 0x18 */
++      { 1024, 600, 8,16},   /* 0x19 */
++      { 1152, 768, 8,16},   /* 0x1a */
++      {  768, 576, 8,16},   /* 0x1b */
++      { 1360,1024, 8,16}    /* 0x1c */
++};
++
++static SiS_StandTableStruct SiS_StandTable[]=
++{
++/* 0x00: MD_0_200 */
++ {
++  0x28,0x18,0x08,0x0800,
++  {0x09,0x03,0x00,0x02},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x01: MD_1_200 */
++ {
++  0x28,0x18,0x08,0x0800,
++  {0x09,0x03,0x00,0x02},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x02: MD_2_200 */
++ {
++  0x50,0x18,0x08,0x1000,
++  {0x01,0x03,0x00,0x02},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x03: MD_3_200 - mode 0x03 - 0 */
++ {
++  0x50,0x18,0x08,0x1000,
++  {0x01,0x03,0x00,0x02},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0xc7,0x06,0x07,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x04: MD_4 */
++ {
++  0x28,0x18,0x08,0x4000,
++  {0x09,0x03,0x00,0x02},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,   /* 0x2c is 2b for 300 */
++   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
++   0xff},
++  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x01,0x00,0x03,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
++   0xff}
++ },
++/* 0x05: MD_5 */
++ {
++  0x28,0x18,0x08,0x4000,
++  {0x09,0x03,0x00,0x02},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,   /* 0x2c is 2b for 300 */
++   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xa2,
++   0xff},
++  {0x00,0x13,0x15,0x17,0x02,0x04,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x01,0x00,0x03,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x30,0x0f,0x00,
++   0xff}
++ },
++/* 0x06: MD_6 */
++ {
++  0x50,0x18,0x08,0x4000,
++  {0x01,0x01,0x00,0x06},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,   /* 55,81 is 54,80 for 300 */
++   0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xc2,
++   0xff},
++  {0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
++   0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,
++   0x01,0x00,0x01,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,
++   0xff}
++ },
++/* 0x07: MD_7 */
++ {
++  0x50,0x18,0x0e,0x1000,
++  {0x00,0x03,0x00,0x03},
++  0xa6,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x28,0x0d,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
++   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
++   0x0e,0x00,0x0f,0x08},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
++   0xff}
++ },
++/* 0x08: MDA_DAC */
++ {
++  0x00,0x00,0x00,0x0000,
++  {0x00,0x00,0x00,0x15},
++  0x15,
++  {0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
++   0x15,0x15,0x15,0x15,0x15,0x15,0x3f,0x3f,
++   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x00,0x00,
++   0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x15,
++   0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
++   0x15,0x15,0x15,0x15},
++  {0x15,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
++   0x3f}
++ },
++/* 0x09: CGA_DAC */
++ {
++  0x00,0x10,0x04,0x0114,
++  {0x11,0x09,0x15,0x00},
++  0x10,
++  {0x04,0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,
++   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x2a,0x3a,
++   0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x10,
++   0x04},
++  {0x14,0x01,0x11,0x09,0x15,0x00,0x10,0x04,
++   0x14,0x01,0x11,0x09,0x15,0x2a,0x3a,0x2e,
++   0x3e,0x2b,0x3b,0x2f},
++  {0x3f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
++   0x3f}
++ },
++/* 0x0a: EGA_DAC */
++ {
++  0x00,0x10,0x04,0x0114,
++  {0x11,0x05,0x15,0x20},
++  0x30,
++  {0x24,0x34,0x21,0x31,0x25,0x35,0x08,0x18,
++   0x0c,0x1c,0x09,0x19,0x0d,0x1d,0x28,0x38,
++   0x2c,0x3c,0x29,0x39,0x2d,0x3d,0x02,0x12,
++   0x06},
++  {0x16,0x03,0x13,0x07,0x17,0x22,0x32,0x26,
++   0x36,0x23,0x33,0x27,0x37,0x0a,0x1a,0x0e,
++   0x1e,0x0b,0x1b,0x0f},
++  {0x1f,0x2a,0x3a,0x2e,0x3e,0x2b,0x3b,0x2f,
++   0x3f}
++ },
++/* 0x0b: VGA_DAC */
++ {
++  0x00,0x10,0x04,0x0114,
++  {0x11,0x09,0x15,0x2a},
++  0x3a,
++  {0x2e,0x3e,0x2b,0x3b,0x2f,0x3f,0x00,0x05,
++   0x08,0x0b,0x0e,0x11,0x14,0x18,0x1c,0x20,
++   0x24,0x28,0x2d,0x32,0x38,0x3f,0x00,0x10,
++   0x1f},
++  {0x2f,0x3f,0x1f,0x27,0x2f,0x37,0x3f,0x2d,
++   0x31,0x36,0x3a,0x3f,0x00,0x07,0x0e,0x15,
++   0x1c,0x0e,0x11,0x15},
++  {0x18,0x1c,0x14,0x16,0x18,0x1a,0x1c,0x00,
++   0x04}
++ },
++/* 0x0c */
++ {
++  0x08,0x0c,0x10,0x0a08,
++  {0x0c,0x0e,0x10,0x0b},
++  0x0c,
++  {0x0d,0x0f,0x10,0x10,0x01,0x08,0x00,0x00,
++   0x00,0x00,0x01,0x00,0x02,0x02,0x01,0x00,
++   0x04,0x04,0x01,0x00,0x05,0x02,0x05,0x00,
++   0x06},
++  {0x01,0x06,0x05,0x06,0x00,0x08,0x01,0x08,
++   0x00,0x07,0x02,0x07,0x06,0x07,0x00,0x00,
++   0x00,0x00,0x00,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x00}
++ },
++/* 0x0d: MD_D */
++ {
++  0x28,0x18,0x08,0x2000,
++  {0x09,0x0f,0x00,0x06},
++  0x63,
++  {0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,     /* 2c is 2b for 300 */
++   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x00,0x96,0xb9,0xe3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
++   0xff}
++ },
++/* 0x0e: MD_E */
++ {
++  0x50,0x18,0x08,0x4000,
++  {0x01,0x0f,0x00,0x06},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,     /* 55,81 is 54,80 for 300 */
++   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x00,0x96,0xb9,0xe3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
++   0xff}
++ },
++/* 0x0f: ExtVGATable - modes > 0x13 */
++ {
++  0x00,0x00,0x00,0x0000,
++  {0x01,0x0f,0x00,0x0e},
++  0x23,
++  {0x5f,0x4f,0x50,0x82,0x54,0x80,0x0b,0x3e,
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0xea,0x8c,0xdf,0x28,0x40,0xe7,0x04,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
++   0x01,0x00,0x00,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
++   0xff}
++ },
++/* 0x10: ROM_SAVEPTR - totally different for 300 */
++ {
++  0x9f,0x3b,0x00,0x00c0,
++  {0x00,0x00,0x00,0x00},
++  0x00,
++  {0x00,0x00,0x00,0x00,0x00,0x00,0xbb,0x3f,
++   0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x00,0x00,0x1a,0x00,0xac,0x3e,0x00,0xc0,
++   0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x00,0x00,0x00,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x00}
++ },
++/* 0x11: MD_F */
++ {
++  0x50,0x18,0x0e,0x8000,
++  {0x01,0x0f,0x00,0x06},
++  0xa2,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,    /* 55,81 is 54,80 on 300 */
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x82,0x84,0x5d,0x28,0x0f,0x63,0xba,0xe3,    /* 82,84 is 83,85 on 300 */
++   0xff},
++  {0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,
++   0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,
++   0x0b,0x00,0x05,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,
++   0xff}
++ },
++/* 0x12: MD_10 */
++ {
++  0x50,0x18,0x0e,0x8000,
++  {0x01,0x0f,0x00,0x06},
++  0xa3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,    /* 55,81 is 54,80 on 300 */
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x82,0x84,0x5d,0x28,0x0f,0x63,0xba,0xe3,    /* 82,84 is 83,85 on 300 */
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
++   0xff}
++ },
++/* 0x13: MD_0_350 */
++ {
++  0x28,0x18,0x0e,0x0800,
++  {0x09,0x03,0x00,0x02},
++  0xa3,
++  {0x2d,0x27,0x28,0x90,0x2b,0xb1,0xbf,0x1f,    /* b1 is a0 on 300 */
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x14: MD_1_350 */
++ {
++  0x28,0x18,0x0e,0x0800,
++  {0x09,0x03,0x00,0x02},
++  0xa3,
++  {0x2d,0x27,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x14,0x1f,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x15: MD_2_350 */
++ {
++  0x50,0x18,0x0e,0x1000,
++  {0x01,0x03,0x00,0x02},
++  0xa3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x16: MD_3_350 - mode 0x03 - 1 */
++ {
++  0x50,0x18,0x0e,0x1000,
++  {0x01,0x03,0x00,0x02},
++  0xa3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4d,0x0b,0x0c,0x00,0x00,0x00,0x00,
++   0x83,0x85,0x5d,0x28,0x1f,0x63,0xba,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x08,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x17: MD_0_1_400 */
++ {
++  0x28,0x18,0x10,0x0800,
++  {0x08,0x03,0x00,0x02},
++  0x67,
++  {0x2d,0x27,0x28,0x90,0x2b,0xb1,0xbf,0x1f,    /* b1 is a0 on 300 */
++   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x14,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x0c,0x00,0x0f,0x08},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x18: MD_2_3_400 - mode 0x03 - 2 */
++ {
++  0x50,0x18,0x10,0x1000,
++  {0x00,0x03,0x00,0x02},
++  0x67,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x1f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x0c,0x00,0x0f,0x08},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,
++   0xff}
++ },
++/* 0x19: MD_7_400 */
++ {
++  0x50,0x18,0x10,0x1000,
++  {0x00,0x03,0x00,0x02},
++  0x66,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,
++   0x00,0x4f,0x0d,0x0e,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x0f,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
++   0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
++   0x0e,0x00,0x0f,0x08},
++  {0x00,0x00,0x00,0x00,0x00,0x10,0x0a,0x00,
++   0xff}
++ },
++/* 0x1a: MD_11 */
++ {
++  0x50,0x1d,0x10,0xa000,
++  {0x01,0x0f,0x00,0x06},
++  0xe3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,    /* 55,81 is 54,80 on 300 */
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xc3,    /* e9,8b is ea,8c on 300 */
++   0xff},
++  {0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
++   0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,
++   0xff}
++ },
++/* 0x1b: ExtEGATable - Modes <= 0x02 */
++ {
++  0x50,0x1d,0x10,0xa000,
++  {0x01,0x0f,0x00,0x06},
++  0xe3,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,    /* 55,81 is 54,80 on 300 */
++   0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
++   0xe9,0x8b,0xdf,0x28,0x00,0xe7,0x04,0xe3,    /* e9,8b is ea,8c on 300 */
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,
++   0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
++   0x01,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0f,
++   0xff}
++ },
++/* 0x1c: MD_13 */
++ {
++  0x28,0x18,0x08,0x2000,
++  {0x01,0x0f,0x00,0x0e},
++  0x63,
++  {0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,    /* 55,81 is 54,80 on 300 */
++   0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,
++   0x9c,0x8e,0x8f,0x28,0x40,0x96,0xb9,0xa3,
++   0xff},
++  {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
++   0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
++   0x41,0x00,0x0f,0x00},
++  {0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0f,
++   0xff}
++ }
++};
++
++static const UCHAR SiS_NTSCTiming[] = {
++      0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
++      0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
++      0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x1b,
++      0x0c,0x50,0x00,0x97,0x00,0xda,0x4a,0x17,
++      0x7d,0x05,0x4b,0x00,0x00,0xe2,0x00,0x02,
++      0x03,0x0a,0x65,0x9d,0x08,0x92,0x8f,0x40,
++      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x50,
++      0x00,0x40,0x44,0x00,0xdb,0x02,0x3b,0x00
++};
++
++static const UCHAR SiS_PALTiming[] = {
++      0x19,0x52,0x35,0x6e,0x04,0x38,0x3d,0x70,
++      0x94,0x49,0x01,0x12,0x06,0x3e,0x35,0x6d,
++      0x06,0x14,0x3e,0x35,0x6d,0x00,0x45,0x2b,
++      0x70,0x50,0x00,0x9b,0x00,0xd9,0x5d,0x17,
++      0x7d,0x05,0x45,0x00,0x00,0xe8,0x00,0x02,
++      0x0d,0x00,0x68,0xb0,0x0b,0x92,0x8f,0x40,
++      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x63,
++      0x00,0x40,0x3e,0x00,0xe1,0x02,0x28,0x00
++};
++
++static const UCHAR SiS_HiTVExtTiming[] = {
++        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
++      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
++      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
++      0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
++      0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
++      0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
++      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
++      0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
++};
++
++static const UCHAR SiS_HiTVSt1Timing[] = {
++        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
++      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
++      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
++      0x65,0x90,0x7b,0xa8,0x03,0xf0,0x87,0x03,
++      0x11,0x15,0x11,0xcf,0x10,0x11,0xcf,0x10,
++      0x35,0x35,0x3b,0x69,0x1d,0x92,0x0f,0x40,
++      0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x86,
++      0xaf,0x5d,0x0e,0x00,0xfc,0xff,0x2d,0x00
++};
++
++static const UCHAR SiS_HiTVSt2Timing[] = {
++        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x64,
++      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
++      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
++      0x64,0x90,0x33,0x8c,0x18,0x36,0x3e,0x13,
++      0x2a,0xde,0x2a,0x44,0x40,0x2a,0x44,0x40,
++      0x8e,0x8e,0x82,0x07,0x0b,0x92,0x0f,0x40,
++      0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x3d,
++      0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
++};
++
++static const UCHAR SiS_HiTVTextTiming[] = {
++        0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
++      0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
++      0x06,0x14,0x3e,0x35,0x6d,0x00,0xc5,0x3f,
++      0x65,0x90,0xe7,0xbc,0x03,0x0c,0x97,0x03,
++      0x14,0x78,0x14,0x08,0x20,0x14,0x08,0x20,
++      0xc8,0xc8,0x3b,0xd2,0x26,0x92,0x0f,0x40,
++        0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x96,
++      0x72,0x5c,0x11,0x00,0xfc,0xff,0x32,0x00
++};
++
++static const UCHAR SiS_HiTVGroup3Data[] = {
++        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x5f,
++      0x05,0x21,0xb2,0xb2,0x55,0x77,0x2a,0xa6,
++      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
++      0x8c,0x6e,0x60,0x2e,0x58,0x48,0x72,0x44,
++      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
++      0x4f,0x7f,0x03,0xa8,0x7d,0x20,0x1a,0xa9,
++      0x14,0x05,0x03,0x7e,0x64,0x31,0x14,0x75,
++      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
++};
++
++static const UCHAR SiS_HiTVGroup3Simu[] = {
++        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x95,
++      0xdb,0x20,0xb8,0xb8,0x55,0x47,0x2a,0xa6,
++      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
++      0x8c,0x6e,0x60,0x15,0x26,0xd3,0xe4,0x11,
++      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
++      0x67,0x36,0x01,0x47,0x0e,0x10,0xbe,0xb4,
++      0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
++      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
++};
++
++static const UCHAR SiS_HiTVGroup3Text[] = {
++        0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0xa7,
++      0xf5,0x20,0xce,0xce,0x55,0x47,0x2a,0xa6,
++      0x25,0x2f,0x47,0xfa,0xc8,0xff,0x8e,0x20,
++      0x8c,0x6e,0x60,0x18,0x2c,0x0c,0x20,0x22,
++      0x56,0x36,0x4f,0x6e,0x3f,0x80,0x00,0x80,
++      0x93,0x3c,0x01,0x50,0x2f,0x10,0xf4,0xca,
++      0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
++      0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
++};
++
++static const UCHAR SiS_NTSCPhase[]    = {0x21,0xed,0xba,0x08};  /* Was {0x21,0xed,0x8a,0x08}; */
++static const UCHAR SiS_PALPhase[]     = {0x2a,0x05,0xe3,0x00};  /* Was {0x2a,0x05,0xd3,0x00};  */
++static const UCHAR SiS_PALMPhase[]    = {0x21,0xE4,0x2E,0x9B};
++static const UCHAR SiS_PALNPhase[]    = {0x21,0xF4,0x3E,0xBA};
++static const UCHAR SiS_NTSCPhase2[]   = {0x21,0xF0,0x7B,0xD6};
++static const UCHAR SiS_PALPhase2[]    = {0x2a,0x09,0x86,0xe9};
++static const UCHAR SiS_PALMPhase2[]   = {0x21,0xE6,0xEF,0xA4};
++static const UCHAR SiS_PALNPhase2[]   = {0x21,0xF6,0x94,0x46};
++static const UCHAR SiS_SpecialPhase[] = {0x1e,0x8c,0x5c,0x7a};
++
++static const SiS_TVDataStruct  SiS_StPALData[]=
++{
++ {    1,   1, 864, 525,1270, 400, 100,   0, 760,0xf4,0xff,0x1c,0x22},
++ {    1,   1, 864, 525,1270, 350, 100,   0, 760,0xf4,0xff,0x1c,0x22},
++ {    1,   1, 864, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
++ {    1,   1, 864, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
++ {    1,   1, 864, 525,1270, 480,  50,   0, 760,0xf4,0xff,0x1c,0x22},
++ {    1,   1, 864, 525,1270, 600,  50,   0,   0,0xf4,0xff,0x1c,0x22}
++};
++
++static const SiS_TVDataStruct  SiS_ExtPALData[] =
++{
++ {   27,  10, 848, 448,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},  /* 640x400, 320x200 */
++ {  108,  35, 848, 398,1270, 530,  50,   0,  50,0xf4,0xff,0x1c,0x22},
++ {   12,   5, 954, 448,1270, 530,  50,   0,  50,0xf1,0x04,0x1f,0x18},
++ {    9,   4, 960, 463,1644, 438,  50,   0,  50,0xf4,0x0b,0x1c,0x0a},
++ {    9,   4, 848, 528,1270, 530,   0,   0,  50,0xf5,0xfb,0x1b,0x2a},  /* 640x480, 320x240 */
++ {   36,  25,1060, 648,1316, 530, 438,   0, 438,0xeb,0x05,0x25,0x16},  /* 800x600, 400x300 */
++ {    3,   2,1080, 619,1270, 540, 438,   0, 438,0xf3,0x00,0x1d,0x20},  /* 720x576 */
++ {    1,   1,1170, 821,1270, 520, 686,   0, 686,0xF3,0x00,0x1D,0x20}   /* 1024x768 */
++};
++
++static const SiS_TVDataStruct  SiS_StNTSCData[]=
++{
++ {    1,   1, 858, 525,1270, 400,  50,   0, 760,0xf1,0x04,0x1f,0x18},
++ {    1,   1, 858, 525,1270, 350,  50,   0, 640,0xf1,0x04,0x1f,0x18},
++ {    1,   1, 858, 525,1270, 400,   0,   0, 720,0xf1,0x04,0x1f,0x18},
++ {    1,   1, 858, 525,1270, 350,   0,   0, 720,0xf4,0x0b,0x1c,0x0a},
++ {    1,   1, 858, 525,1270, 480,   0,   0, 760,0xf1,0x04,0x1f,0x18}
++};
++
++static const SiS_TVDataStruct  SiS_ExtNTSCData[]=
++{
++ {  143,  65, 858, 443,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},    /* 640x400, 320x200 */
++ {   88,  35, 858, 393,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
++ {  143,  70, 924, 443,1270, 440,  92,   0,  92,0xf1,0x04,0x1f,0x18},
++ {  143,  70, 924, 393,1270, 440,  92,   0,  92,0xf4,0x0b,0x1c,0x0a},
++ {  143,  76, 836, 523,1270, 440, 224,   0,   0,0xf1,0x05,0x1f,0x16},    /* 640x480, 320x240 */
++ {  143, 120,1056, 643,1270, 440,   0, 128,   0,0xf4,0x10,0x1c,0x00},    /* 800x600, 400x300  */
++ {  143,  76, 836, 523,1270, 440,   0, 128,   0,0xee,0x0c,0x22,0x08},    /* 720x480 - BETTER (from 300 series) */
++/*{   2,   1, 858, 503,1270, 480,   0, 128,   0,0xee,0x0c,0x22,0x08},*/  /* 720x480  (old, from 650) */
++ {    1,   1,1100, 811,1412, 440,   0, 128,   0,0xee,0x0c,0x22,0x08}     /* 1024x768 CORRECTED */
++/*{  65,  64,1056, 791,1270, 480, 638,   0,   0,0xEE,0x0C,0x22,0x08} */  /* 1024x768 */
++#if 0  /* 300 series was: */
++ {  143,  65, 858, 443,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
++ {   88,  35, 858, 393,1270, 440, 171,   0, 171,0xf1,0x04,0x1f,0x18},
++ {  143,  70, 924, 443,1270, 440,  92,   0,  92,0xf1,0x04,0x1f,0x18},
++ {  143,  70, 924, 393,1270, 440,  92,   0,  92,0xf4,0x0b,0x1c,0x0a},
++ {  143,  76, 836, 523,1270, 440, 224,   0,   0,0xf1,0x05,0x1f,0x16},
++ {  143, 120,1056, 643,1270, 440,   0, 128,   0,0xf4,0x10,0x1c,0x00},
++ {  143,  76, 836, 523,1270, 440,   0, 128,   0,0xee,0x0c,0x22,0x08},
++ {   65,  64,1056, 791,1270, 480, 638,   0,   0,0xf1,0x04,0x1f,0x18}
++#endif
++};
++
++
++static const SiS_TVDataStruct  SiS_St2HiTVData[]=
++{
++ {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
++ {    1,   1, 0x37c,0x233,0x2b2,0x2bc,          0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    3,   1, 0x348,0x1e3,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},
++ {    1,   1, 0x3e8,0x233,0x311,0x2bc,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    5,   2, 0x348,0x233,0x670,0x3c0,0x08d,128, 0, 0x00,0x00,0x00,0x00},
++ {    8,   5, 0x41a,0x2ab,0x670,0x3c0,0x17c,128, 0, 0x00,0x00,0x00,0x00}
++};
++
++static const SiS_TVDataStruct  SiS_ExtHiTVData[]=
++{
++ {    6,   1, 0x348,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    3,   1, 0x348,0x1e3,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    3,   1, 0x3c0,0x233,0x660,0x3c0,    0,  0, 0, 0x00,0x00,0x00,0x00},
++ {    5,   1, 0x348,0x233,0x670,0x3c0,0x166,128, 0, 0x00,0x00,0x00,0x00},  /* 640x480   */
++ {   16,   5, 0x41a,0x2ab,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},  /* 800x600   */
++ {   25,  12, 0x4ec,0x353,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},  /* 1024x768  */
++ {    5,   4, 0x627,0x464,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00},  /* 1280x1024 */
++ {    4,   1, 0x41a,0x233,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00},  /* 800x480   */
++ {    5,   2, 0x578,0x293,0x670,0x3c0,0x032,  0, 0, 0x00,0x00,0x00,0x00},  /* 1024x576  */
++ {    8,   5, 0x6d6,0x323,0x670,0x3c0,0x128,  0, 0, 0x00,0x00,0x00,0x00}   /* 1280x720  */
++};
++
++static const UCHAR SiS_OutputSelect = 0x40;
++
++static const UCHAR SiS_SoftSetting  = 0x30;   /* RAM setting */
++
++static const SiS_LCDDataStruct  SiS_LCD1280x960Data[] =
++{
++      {    9,   2, 800, 500,1800,1000},
++      {    9,   2, 800, 500,1800,1000},
++      {    4,   1, 900, 500,1800,1000},
++      {    4,   1, 900, 500,1800,1000},
++      {    9,   2, 800, 500,1800,1000},
++      {   30,  11,1056, 625,1800,1000},
++      {    5,   3,1350, 800,1800,1000},
++      {    1,   1,1576,1050,1576,1050},
++      {    1,   1,1800,1000,1800,1000}
++};
++
++static const SiS_LCDDataStruct  SiS_StLCD1280x768Data[] =
++{
++      { 211,  100, 2100,  408, 1688,  802 }, /* These values are *wrong* */
++      { 211,   64, 1536,  358, 1688,  802 }, /* (which is why they aren't used yet) */
++      { 211,  100, 2100,  408, 1688,  802 },
++      { 211,   64, 1536,  358, 1688,  802 },
++      { 211,   48,  840,  488, 1688,  802 },
++      { 211,   72, 1008,  609, 1688,  802 },
++      { 211,  128, 1400,  776, 1688,  802 },
++      { 211,  205, 1680, 1041, 1688,  802 },
++      { 1,      1, 1688,  802, 1688,  802 }  /* That's the only one that *might* be correct */
++};
++
++static const SiS_LCDDataStruct  SiS_ExtLCD1280x768Data[] =
++{
++      { 211,  100, 2100,  408, 1688,  802 }, /* These values are *wrong* */
++      { 211,   64, 1536,  358, 1688,  802 }, /* (which is why they aren't used yet) */
++      { 211,  100, 2100,  408, 1688,  802 },
++      { 211,   64, 1536,  358, 1688,  802 },
++      { 211,   48,  840,  488, 1688,  802 },
++      { 211,   72, 1008,  609, 1688,  802 },
++      { 211,  128, 1400,  776, 1688,  802 },
++      { 211,  205, 1680, 1041, 1688,  802 },
++      { 1,      1, 1688,  802, 1688,  802 }  /* That's the only one that *might* be correct */
++};
++
++static const SiS_LCDDataStruct  SiS_NoScaleData1280x768[] =
++{  /* All values guessed */
++        { 1, 1, 1688,  802, 1688,  802},
++      { 1, 1, 1688,  802, 1688,  802},
++      { 1, 1, 1688,  802, 1688,  802},
++      { 1, 1, 1688,  802, 1688,  802},
++      { 1, 1, 1688,  802, 1688,  802},
++      { 1, 1, 1688,  802, 1688,  802},
++      { 1, 1, 1688,  802, 1688,  802},
++      { 1, 1, 1688,  802, 1688,  802},
++      { 1, 1, 1688,  802, 1688,  802}
++};
++
++static const SiS_LCDDataStruct  SiS_StLCD1400x1050Data[] =
++{
++      { 211,  100, 2100,  408, 1688, 1066 },
++      { 211,   64, 1536,  358, 1688, 1066 },
++      { 211,  100, 2100,  408, 1688, 1066 },
++      { 211,   64, 1536,  358, 1688, 1066 },
++      { 211,   48,  840,  488, 1688, 1066 },
++      { 211,   72, 1008,  609, 1688, 1066 },
++      { 211,  128, 1400,  776, 1688, 1066 },
++      { 211,  205, 1680, 1041, 1688, 1066 },
++      {   1,    1, 1688, 1066, 1688, 1066 }
++};
++
++static const SiS_LCDDataStruct  SiS_ExtLCD1400x1050Data[] =
++{
++      { 211,  100, 2100,  408, 1688, 1066 },
++      { 211,   64, 1536,  358, 1688, 1066 },
++      { 211,  100, 2100,  408, 1688, 1066 },
++      { 211,   64, 1536,  358, 1688, 1066 },
++      { 211,   48,  840,  488, 1688, 1066 },
++      { 211,   72, 1008,  609, 1688, 1066 },
++      { 211,  128, 1400,  776, 1688, 1066 },
++      { 211,  205, 1680, 1041, 1688, 1066 },
++      {   1,    1, 1688, 1066, 1688, 1066 }
++};
++
++static const SiS_LCDDataStruct  SiS_NoScaleData1400x1050[] =
++{
++      { 1, 1, 1688, 1066, 1688, 1066 },
++      { 1, 1, 1688, 1066, 1688, 1066 },
++      { 1, 1, 1688, 1066, 1688, 1066 },
++      { 1, 1, 1688, 1066, 1688, 1066 },
++      { 1, 1, 1688, 1066, 1688, 1066 },
++      { 1, 1, 1688, 1066, 1688, 1066 },
++      { 1, 1, 1688, 1066, 1688, 1066 },
++      { 1, 1, 1688, 1066, 1688, 1066 },
++      { 1, 1, 1688, 1066, 1688, 1066 }
++};
++
++static const SiS_LCDDataStruct  SiS_StLCD1600x1200Data[] =
++{  /* TODO */
++      {    0,   0,   0,   0,   0,   0}
++};
++
++static const SiS_LCDDataStruct  SiS_ExtLCD1600x1200Data[] =
++{  /* TODO */
++      {    0,   0,   0,   0,   0,   0}
++};
++
++static const SiS_LCDDataStruct  SiS_NoScaleData1600x1200[] =
++{  /* TODO - values guessed */
++        {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250},
++      {1,  1, 2048, 1250, 2048, 1250}
++};
++
++static const SiS_LCDDataStruct  SiS_NoScaleData[] =
++{
++      { 1, 1, 800, 449, 800, 449 },
++      { 1, 1, 800, 449, 800, 449 },
++      { 1, 1, 900, 449, 900, 449 },
++      { 1, 1, 900, 449, 900, 449 },
++      { 1, 1, 800, 525, 800, 525 },
++      { 1, 1,1056, 628,1056, 628 },
++      { 1, 1,1344, 806,1344, 806 },
++      { 1, 1,1688,1066,1688,1066 },
++        { 1, 1,1688, 802,1688, 802 },  /* 1280x768: 802 was 806 in both cases */
++        { 1, 1,2048,1250,2048,1250 },  /* 1600x1200 (guessed) */
++      { 1, 1,1800,1000,1800,1000 }   /* 1280x960 */
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS320x480Data_1[]=
++{
++      { 848, 433, 400, 525},
++      { 848, 389, 400, 525},
++      { 848, 433, 400, 525},
++      { 848, 389, 400, 525},
++      { 848, 518, 400, 525},
++      {1056, 628, 400, 525},
++      { 400, 525, 400, 525},
++      { 800, 449,1000, 644},
++      { 800, 525,1000, 635}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS800x600Data_1[]=
++{
++      { 848, 433,1060, 629},
++      { 848, 389,1060, 629},
++      { 848, 433,1060, 629},
++      { 848, 389,1060, 629},
++      { 848, 518,1060, 629},
++      {1056, 628,1056, 628},
++      {1056, 628,1056, 628},
++      { 800, 449,1000, 644},
++      { 800, 525,1000, 635}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS800x600Data_2[]=
++{
++      {1056, 628,1056, 628},
++      {1056, 628,1056, 628},
++      {1056, 628,1056, 628},
++      {1056, 628,1056, 628},
++      {1056, 628,1056, 628},
++      {1056, 628,1056, 628},
++      {1056, 628,1056, 628},
++      { 800, 449,1000, 644},
++      { 800, 525,1000, 635}
++};
++
++
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x1024Data_1[]=
++{
++      {1048, 442,1688,1066},
++      {1048, 392,1688,1066},
++      {1048, 442,1688,1066},
++      {1048, 392,1688,1066},
++      {1048, 522,1688,1066},
++      {1208, 642,1688,1066},
++      {1432, 810,1688,1066},
++      {1688,1066,1688,1066}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x1024Data_2[]=
++{
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1024x768Data_1[]=
++{
++      { 840, 438,1344, 806},
++      { 840, 409,1344, 806},
++      { 840, 438,1344, 806},
++      { 840, 409,1344, 806},
++      { 840, 518,1344, 806},   /* 640x480 */
++      {1050, 638,1344, 806},   /* 800x600 */
++      {1344, 806,1344, 806},   /* 1024x768 */
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1024x768Data_2[]=
++{
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++/* Custom data for Barco iQ R300 */
++static const SiS_LVDSDataStruct  SiS_LVDSBARCO1366Data_1[]=
++{
++      { 832, 438,1331, 806},
++      { 832, 388,1331, 806},
++      { 832, 438,1331, 806},
++      { 832, 388,1331, 806},
++      { 832, 518,1331, 806},
++      {1050, 638,1344, 806},
++      {1344, 806,1344, 806},
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066}   /* 1360x1024 */
++};
++
++/* Custom data for Barco iQ R300 */
++static const SiS_LVDSDataStruct  SiS_LVDSBARCO1366Data_2[]=
++{
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1688,1066,1688,1066},
++      {1688,1066,1688,1066}   /* 1360x1024 */
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDSBARCO1024Data_1[]=
++{
++      { 832, 438,1331, 806},
++      { 832, 409,1331, 806},
++      { 832, 438,1331, 806},
++      { 832, 409,1331, 806},
++      { 832, 518,1331, 806},   /* 640x480 */
++      {1050, 638,1344, 806},   /* 800x600 */
++      {1344, 806,1344, 806},   /* 1024x768 */
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDSBARCO1024Data_2[]=
++{
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1400x1050Data_1[]=
++{
++        { 928, 416, 1688,1066},
++      { 928, 366, 1688,1066},
++      { 928, 416, 1688,1066},
++      { 928, 366, 1688,1066},
++      { 928, 496, 1688,1066},
++      {1088, 616, 1688,1066},
++      {1312, 784, 1688,1066},
++      {1568,1040, 1688,1066},
++      {1688,1066, 1688,1066}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1400x1050Data_2[]=
++{
++        {1688,1066, 1688,1066},
++      {1688,1066, 1688,1066},
++      {1688,1066, 1688,1066},
++      {1688,1066, 1688,1066},
++      {1688,1066, 1688,1066},
++      {1688,1066, 1688,1066},
++      {1688,1066, 1688,1066},
++      {1688,1066, 1688,1066},
++      {1688,1066, 1688,1066},
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1600x1200Data_1[]=
++{
++        {1088, 450, 2048,1250},
++      {1088, 400, 2048,1250},
++      {1088, 450, 2048,1250},
++      {1088, 400, 2048,1250},
++      {1088, 530, 2048,1250},
++      {1248, 650, 2048,1250},
++      {1472, 818, 2048,1250},
++      {1728,1066, 2048,1250},
++      {1848,1066, 2048,1250},
++      {2048,1250, 2048,1250}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1600x1200Data_2[]=
++{
++        {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250},
++      {2048,1250, 2048,1250}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x768Data_1[]=
++{
++      { 768, 438, 1408, 806},
++      { 768, 388, 1408, 806},
++      { 768, 438, 1408, 806},
++      { 768, 388, 1408, 806},
++      { 768, 518, 1408, 806},
++      { 928, 638, 1408, 806},
++      {1152, 806, 1408, 806},
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x768Data_2[]=
++{
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806},
++      {1408, 806, 1408, 806}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1024x600Data_1[] =
++{
++      {840, 604,1344, 800},
++      {840, 560,1344, 800},
++      {840, 604,1344, 800},
++      {840, 560,1344, 800},
++      {840, 689,1344, 800},
++      {1050, 800,1344, 800},
++      {1344, 800,1344, 800},
++      {800, 449,1280, 789},
++      {800, 525,1280, 785}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1024x600Data_2[] =
++{
++      {1344, 800,1344, 800},
++      {1344, 800,1344, 800},
++      {1344, 800,1344, 800},
++      {1344, 800,1344, 800},
++      {1344, 800,1344, 800},
++      {1344, 800,1344, 800},
++      {1344, 800,1344, 800},
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1152x768Data_1[] =
++{
++      { 840, 438,1344, 806},
++      { 840, 409,1344, 806},
++      { 840, 438,1344, 806},
++      { 840, 409,1344, 806},
++      { 840, 518,1344, 806},
++      {1050, 638,1344, 806},
++      {1344, 806,1344, 806},
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1152x768Data_2[] =
++{
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++/* TW: Pass 1:1 data */
++static const SiS_LVDSDataStruct  SiS_LVDSXXXxXXXData_1[]=
++{
++        { 800, 449,  800, 449},
++      { 800, 449,  800, 449},
++      { 900, 449,  900, 449},
++      { 900, 449,  900, 449},
++      { 800, 525,  800, 525},  /*  640x480   */
++      {1056, 628, 1056, 628},  /*  800x600   */
++      {1344, 806, 1344, 806},  /* 1024x768   */
++      {1344,1066, 1344,1066},  /* 1280x1024  */  /* INSERTED ! */
++      {1688, 806, 1688, 806},  /* 1280x768   */
++      /* No other panels ! */
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS640x480Data_1[]=
++{
++      { 800, 445, 800, 525},   /* 800, 449, 800, 449 */
++      { 800, 395, 800, 525},
++      { 800, 445, 800, 525},
++      { 800, 395, 800, 525},
++      { 800, 525, 800, 525},
++      { 800, 525, 800, 525},   /* pseudo */
++      { 800, 525, 800, 525}    /* pseudo */
++};
++
++/* FSTN 320x240 */
++static const SiS_LVDSDataStruct  SiS_LVDS640x480Data_2[]=
++{
++      { 800, 445, 800, 525},
++      { 800, 395, 800, 525},
++      { 800, 445, 800, 525},
++      { 800, 395, 800, 525},
++      { 800, 525, 800, 525},
++        { 800, 525, 800, 525},   /* pseudo */
++      { 800, 525, 800, 525}    /* pseudo */
++};
++
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x960Data_1[]=
++{
++      { 840, 438,1344, 806},
++      { 840, 409,1344, 806},
++      { 840, 438,1344, 806},
++      { 840, 409,1344, 806},
++      { 840, 518,1344, 806},
++      {1050, 638,1344, 806},
++      {1344, 806,1344, 806},
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LVDS1280x960Data_2[]=
++{
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++/* LCDA */
++
++static const SiS_LVDSDataStruct  SiS_LCDA1400x1050Data_1[]=
++{     /* TW: Might be temporary (invalid) data */
++        { 928, 416, 1688,1066},
++      { 928, 366, 1688,1066},
++      {1008, 416, 1688,1066},
++      {1008, 366, 1688,1066},
++      {1200, 530, 1688,1066},
++      {1088, 616, 1688,1066},
++      {1312, 784, 1688,1066},
++      {1568,1040, 1688,1066},
++      {1688,1066, 1688,1066}
++};
++
++static const SiS_LVDSDataStruct  SiS_LCDA1400x1050Data_2[]=
++{     /* TW: Temporary data. Not valid */
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LCDA1600x1200Data_1[]=
++{     /* TW: Temporary data. Not valid */
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      {1344, 806,1344, 806},
++      { 800, 449,1280, 801},
++      { 800, 525,1280, 813}
++};
++
++static const SiS_LVDSDataStruct  SiS_LCDA1600x1200Data_2[]=
++{     /* TW: Temporary data. Not valid */
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0},
++      {0, 0, 0, 0}
++};
++
++static const SiS_LVDSDataStruct  SiS_CHTVUNTSCData[]=
++{
++      { 840, 600, 840, 600},
++      { 840, 600, 840, 600},
++      { 840, 600, 840, 600},
++      { 840, 600, 840, 600},
++      { 784, 600, 784, 600},
++      {1064, 750,1064, 750},
++        {1160, 945,1160, 945}
++};
++
++static const SiS_LVDSDataStruct  SiS_CHTVONTSCData[]=
++{
++      { 840, 525, 840, 525},
++      { 840, 525, 840, 525},
++      { 840, 525, 840, 525},
++      { 840, 525, 840, 525},
++      { 784, 525, 784, 525},
++      {1040, 700,1040, 700},
++        {1160, 840,1160, 840}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1076_1[]=
++{  /* 1024x768 */
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1076_2[]=
++{  /* 1024x768 */
++      { 1184, 622 },
++      { 1184, 597 },
++      { 1184, 622 },
++      { 1184, 597 },
++      { 1152, 622 },
++      { 1232, 722 },
++      {    0, 0   },
++      {    0, 794 },
++      {    0, 0   }
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1210_1[]=
++{  /* 1280x1024 */
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1210_2[]=
++{  /* 1280x1024 */
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1296_1[]=
++{  /* 1400x1050 */
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1296_2[]=
++{  /* 1400x1050 - looks heavily invalid */
++      { 808 , 740},
++      { 0   , 715},
++      { 632 , 740},
++      { 632 , 715},
++      { 1307, 780},
++      { 1387,1157},
++      { 1499, 924},
++      { 1627,1052},
++      { 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1600_1[]=
++{  /* 1600x1200 */
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0}
++};
++
++static const SiS_LVDSDesStruct SiS_PanelType1600_2[]=
++{  /* 1600x1200 - BIOS looks heavily invalid, not copied */
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0}
++};
++
++static const SiS_LVDSDesStruct  SiS_PanelTypeNS_1[]=
++{
++      { 8,   0},
++      { 8,   0},
++      { 8,   0},
++      { 8,   0},
++      { 8,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0, 806},
++      { 0, 0 }
++};
++
++static const SiS_LVDSDesStruct  SiS_PanelTypeNS_2[] =
++{
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0},
++      { 0 , 0}
++};
++
++static const SiS_LVDSDesStruct  SiS_CHTVUNTSCDesData[]=
++{
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0}
++};
++
++static const SiS_LVDSDesStruct  SiS_CHTVONTSCDesData[]=
++{
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0}
++};
++
++static const SiS_LVDSDesStruct  SiS_CHTVUPALDesData[]=
++{
++      {256,   0},
++      {256,   0},
++      {256,   0},
++      {256,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0}
++};
++
++static const SiS_LVDSDesStruct  SiS_CHTVOPALDesData[]=
++{
++      {256,   0},
++      {256,   0},
++      {256,   0},
++      {256,   0},
++      { 0,   0},
++      { 0,   0},
++      { 0,   0}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1320x480_1[] =
++{
++ {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
++   0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
++   0x00 }},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00 }},
++ {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
++   0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++   0x00 }},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00 }},
++ {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
++   0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
++   0x00 }},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01 }},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00 }}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11024x600_1[] =
++{
++        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
++        0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
++        0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
++        0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
++        0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
++        0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
++        0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
++        0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
++        0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0xaf,0xba,
++        0x3b,0x82,0xdf,0xb0,0x00,0x00,0x01,
++        0x00}},
++        {{0x7e,0x63,0x82,0x68,0x15,0x1e,0xf1,
++        0xae,0x85,0x57,0x1f,0x30,0x00,0x26,
++        0x01}},
++        {{0xa3,0x7f,0x87,0x86,0x97,0x1e,0xf1,
++        0xae,0x85,0x57,0x1f,0x30,0x00,0x02,
++        0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11024x600_1_H[] =
++{
++        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++        0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
++          0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++        0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
++        0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
++        0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
++        0x00}},
++        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
++        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
++        0x01}},
++        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++        0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11024x600_2[] =
++{
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++          0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
++        0xae,0x84,0x57,0x25,0x30,0x00,0x02,
++        0x01}},
++        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++        0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11024x600_2_H[] =
++{
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
++        0xae,0x84,0x57,0x25,0x30,0x00,0x01,
++        0x01}},
++        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++        0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11152x768_1[] =
++{
++        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++        0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
++        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
++        0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++        0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
++        0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
++        0x00}},
++        {{0x64,0x4f,0x88,0x54,0x9f,0x04,0x3e,
++        0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
++        0x00}},
++        {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
++        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
++        0x01}},
++        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++        0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11152x768_1_H[] =
++{
++        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++        0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
++        0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
++        0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
++        0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
++        0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
++        0x00}},
++        {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
++        0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
++        0x00}},
++        {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
++        0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
++        0x01}},
++        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++        0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11152x768_2[] =
++{
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
++        0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
++        0x00}},
++        {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
++        0xae,0x84,0x57,0x25,0x30,0x00,0x02,
++        0x01}},
++        {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++        0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11152x768_2_H[] =
++{
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
++        0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
++        0x00}},
++        {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
++        0xae,0x84,0x57,0x25,0x30,0x00,0x01,
++        0x01}},
++        {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
++        0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++        0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11280x768_1[] =
++{
++ {{0x5b,0x4f,0x9f,0x55,0x19,0xb4,0x1f,
++   0x9c,0x8e,0x8f,0xb5,0x10,0x00,0x01,
++   0x00}},
++ {{0x5b,0x4f,0x9f,0x55,0x19,0x82,0x1f,
++   0x6a,0x8c,0x5d,0x83,0x30,0x00,0x01,
++   0x00}},
++ {{0x5b,0x4f,0x9f,0x55,0x19,0xb4,0x1f,
++   0x9c,0x8e,0x8f,0xb5,0x10,0x00,0x01,
++   0x00}},
++ {{0x5b,0x4f,0x9f,0x55,0x19,0x82,0x1f,
++   0x6a,0x8c,0x5d,0x83,0x30,0x00,0x01,
++   0x00}},
++ {{0x5b,0x4f,0x9f,0x55,0x19,0x04,0x3e,
++   0xec,0x8e,0xdf,0x05,0x20,0x00,0x01,
++   0x00}},
++ {{0x6f,0x63,0x93,0x69,0x8d,0x7c,0xf0,
++   0x64,0x86,0x57,0x7d,0x20,0x00,0x05,
++   0x01}},
++ {{0x8b,0x7f,0x8f,0x85,0x09,0x24,0xf5,
++   0x0c,0x8e,0xff,0x25,0x30,0x00,0x02,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa5,0x89,0x24,0xf5,
++   0x0c,0x8e,0xff,0x25,0x30,0x00,0x06,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa5,0x89,0x24,0xf5,
++   0x0c,0x8e,0xff,0x25,0x30,0x00,0x06,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11280x768_1_H[] =
++{
++ {{0x47,0x27,0x8b,0x2c,0x1a,0x9e,0x1f,
++   0x93,0x86,0x8f,0x9f,0x30,0x00,0x05,
++   0x00}},
++ {{0x47,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
++   0x60,0x84,0x5d,0x6d,0x10,0x00,0x05,
++   0x00}},
++ {{0x47,0x27,0x8b,0x30,0x1e,0x9e,0x1f,
++   0x92,0x86,0x8f,0x9f,0x30,0x00,0x05,
++   0x00}},
++ {{0x47,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
++   0x60,0x84,0x5d,0x6d,0x10,0x00,0x05,
++   0x00}},
++ {{0x47,0x27,0x8b,0x2c,0x1a,0xee,0x1f,
++   0xe2,0x86,0xdf,0xef,0x10,0x00,0x05,
++   0x00}},
++ {{0x51,0x31,0x95,0x36,0x04,0x66,0xf0,
++   0x5a,0x8e,0x57,0x67,0x20,0x00,0x01,
++   0x01}},
++ {{0x5f,0x3f,0x83,0x44,0x92,0x0e,0xf5,
++   0x02,0x86,0xff,0x0f,0x10,0x00,0x01,
++   0x01}},
++ {{0x6f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
++   0x02,0x86,0xff,0x0f,0x09,0x00,0x05,
++   0x01}},
++ {{0x6f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
++   0x02,0x86,0xff,0x0f,0x09,0x00,0x05,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11280x768_2[] =
++{
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
++   0x54,0x86,0xdb,0xda,0x00,0x00,0x02,
++   0x00}},
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
++   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x02,
++   0x00}},
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
++   0x54,0x86,0xdb,0xda,0x00,0x00,0x02,
++   0x00}},
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xbb,
++   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x02,
++   0x00}},
++ {{0xab,0x60,0x9f,0x80,0x04,0x24,0xb3,
++   0x7c,0x8e,0x03,0x02,0x10,0x00,0x02,
++   0x01}},
++ {{0xab,0x63,0x8f,0x8a,0x8e,0x24,0xf1,
++   0xb6,0x88,0x57,0x25,0x10,0x00,0x02,
++   0x01}},
++ {{0xab,0x7f,0x8f,0x98,0x9c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x02,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT11280x768_2_H[] =
++{
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
++   0x54,0x86,0xdb,0xda,0x00,0x00,0x01,
++   0x00}},
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
++   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x01,
++   0x00}},
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
++   0x54,0x86,0xdb,0xda,0x00,0x00,0x01,
++   0x00}},
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xbb,
++   0x3b,0x8d,0xc2,0xc1,0x00,0x00,0x01,
++   0x00}},
++ {{0x83,0x38,0x97,0x58,0x9c,0x24,0xb3,
++   0x7c,0x8e,0x03,0x02,0x10,0x00,0x01,
++   0x01}},
++ {{0x79,0x31,0x9d,0x58,0x9c,0x24,0xf1,
++   0xb6,0x88,0x57,0x25,0x10,0x00,0x01,
++   0x01}},
++ {{0x6b,0x3f,0x8f,0x58,0x9c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x01,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
++   0x01}},
++ {{0xab,0x9f,0x8f,0xa8,0x8c,0x24,0xf5,
++   0x0a,0x8c,0xff,0x25,0x30,0x00,0x06,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1XXXxXXX_1[] =
++{
++ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
++   0x02,0x88,0xff,0x25,0x10,0x00,0x02,
++   0x01}},
++ {{0xce,0x9f,0x92,0xa8,0x14,0x28,0x5a,
++   0x00,0x84,0xff,0x29,0x09,0x00,0x07,
++   0x01}},
++ {{0xce,0x9f,0x92,0xa9,0x17,0x24,0xf5,
++   0x02,0x88,0xff,0x25,0x10,0x00,0x07,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1XXXxXXX_1_H[] =
++{
++ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
++   0x00}},
++ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
++   0x00}},
++ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
++   0x00}},
++ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
++   0x00}},
++ {{0x38,0x27,0x9c,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}},
++ {{0x4d,0x31,0x91,0x3b,0x03,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x01,
++   0x01}},
++ {{0x63,0x3f,0x87,0x4a,0x92,0x24,0xf5,
++   0x02,0x88,0xff,0x25,0x10,0x00,0x01,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_1[] =
++{
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_1_H[] =
++{
++ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x00,0x00,0x00,
++   0x00}},
++ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x83,0x85,0x63,0xba,0x00,0x00,0x00,
++   0x00}},
++ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x9c,0x8e,0x96,0xb9,0x00,0x00,0x00,
++   0x00}},
++ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
++   0x83,0x85,0x63,0xba,0x00,0x00,0x00,
++   0x00}},
++ {{0x2d,0x28,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_2[] =
++{
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_2_H[] =
++{
++ {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
++   0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
++   0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
++   0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_3[] =
++{
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
++   0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++static const SiS_LVDSCRT1DataStruct  SiS_LVDSCRT1640x480_3_H[] =
++{
++ {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
++   0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
++   0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
++   0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
++   0x00}},
++ {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
++   0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
++   0x00}},
++ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
++   0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
++   0x01}},
++ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
++   0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
++   0x00}}
++};
++
++#define SIS_PL_HSYNCP 0x01
++#define SIS_PL_HSYNCN 0x02
++#define SIS_PL_VSYNCP 0x04
++#define SIS_PL_VSYNCN 0x08
++#define SIS_PL_DVI    0x80
++
++typedef struct _SiS_PlasmaModes
++{
++  const char *name;
++  ULONG  clock;
++  USHORT HDisplay, HTotal, HFrontPorch, HSyncWidth;
++  USHORT VDisplay, VTotal, VFrontPorch, VSyncWidth;
++  UCHAR  SyncFlags;
++} SiS_PlasmaModes;
++
++
++typedef struct _SiS_PlasmaTables
++{
++   USHORT vendor;
++   UCHAR  productnum;
++   USHORT product[5];
++   const char *plasmaname;
++   UCHAR  modenum;
++   UCHAR  plasmamodes[20];  /* | 0x80 = DVI-capable, | 0x40 = analog */
++} SiS_PlasmaTables;
++
++static const SiS_PlasmaModes SiS_PlasmaMode[] = {
++   {  "640x400",              /* 00: IBM 400@70 */
++      25175,
++       640,  800, 17,  64,
++       400,  449, 13,   2,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCN },
++   {  "640x480",              /* 01: VESA 480@72 */
++      31500,
++       640,  832, 24,  40,
++       480,  520,  9,   3,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCN },
++   {  "800x600",              /* 02: VESA 600@72 */
++      50000,
++       800, 1040, 56, 120,
++       600,  666, 37,   6,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "864x480",              /* 03: Cereb wide 1 */
++      42526,
++       864, 1134, 22,  86,
++       480,  500,  1,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCN },
++   {  "848x480",              /* 04: VESA wide (NEC1) */
++      33750,
++       848, 1088, 16, 112,
++       480,  517,  6,   8,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1024x576",             /* 05: VESA wide (NEC2) */
++      47250,
++      1024, 1320, 16, 144,
++       576,  596,  2,   4,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1280x720",             /* 06: VESA wide (NEC3) */
++      76500,
++      1280, 1696, 48, 176,
++       720,  750,  4,   8,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1360x765",             /* 07: VESA wide (NEC4) */
++      85500,
++      1360, 1792, 64, 176,
++       765,  795,  4,   8,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1024x600",             /* 08: CEREB wide 2 */
++      51200,
++      1024, 1352, 51, 164,
++       600,  628,  1,   4,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCP },
++   {  "1024x768",             /* 09: VESA 768@75 */
++      78750,
++      1024, 1312,  16, 96,
++       768,  800,   1,  3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1152x864",             /* 10: VESA 1152x864@75 */
++      108000,
++      1152, 1600, 64, 128,
++       864,  900,  1,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1280x1024",            /* 11: VESA 1024@60 */
++      108000,
++      1280, 1688, 48, 112,
++      1024, 1066,  1,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1280x768",             /* 12: W_XGA */
++      81000,
++      1280, 1688, 48, 112,
++       768,  802,  3,   6,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCN },
++   {  "1280x768",             /* 13: I/O Data W_XGA@56Hz */
++      76064,
++      1280, 1688, 48, 112,
++       768,  802,  2,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1376x768",             /* 14: I/O Wide XGA */
++      87340,
++      1376, 1808, 32, 128,
++       768,  806,  3,   6,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCP },
++   {  "1280x960",             /* 15: VESA 960@60 */
++      108000,
++      1280, 1800, 96, 112,
++       960, 1000,  1,   3,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "1400x1050",            /* 16: VESA 1050@60Hz */
++      108000,
++      1400, 1688, 48, 112,
++      1050, 1066,  1,   3,
++      SIS_PL_HSYNCN | SIS_PL_VSYNCN },
++   {  "1360x768",             /* 17: VESA wide (NEC4/2) */
++      85500,
++      1360, 1792, 64, 112,
++       765,  795,  3,   6,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP },
++   {  "800x600",              /* 18: VESA 600@56 */
++      36000,
++       800, 1024, 24,   2,
++       600,  625,  1,   2,
++      SIS_PL_HSYNCP | SIS_PL_VSYNCP }
++};
++
++static const SiS_PlasmaTables SiS_PlasmaTable[] = {
++#if 0  /* Product IDs missing */
++   { 0x38a3, 4,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42VP4/42VP4D/42VP4G/42VP4DG",
++     14,   /* All DVI, except 0, 7, 13; 3, 15, 16 unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,12|0xc0,
++      13|0x40,14|0xc0,15|0xc0,16|0xc0, 0     , 0     , 0     , 0     , 0     , 0 }
++   },
++   { 0x38a3, 3,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42PD1/50PD1/50PD2",
++     5,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0, 0     , 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42PD3",
++     10,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 7|0x40, 8|0xc0, 9|0xc0,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 2,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42VM3/61XM1",
++     11,  /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 8|0xc0, 9|0xc0,11|0xc0,
++      17|0xc0, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 2,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42MP1/42MP2",
++     6,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 50MP1",
++     10,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++#endif
++   { 0x38a3, 4,
++     { 0xa482, 0xa483, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 42MP3/42MP4/50MP2/61MP1",
++     11,   /* All DVI except 0, 7, 13, 17 */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0,
++      17|0x40, 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++#if 0  /* Product IDs missing */
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 3300W",
++     3,
++     { 0|0x40, 1|0xc0,18|0xc0, 0     , 0     , 0     , 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 4200W",
++     4,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 0     , 0     , 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 4210W",
++     6,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x38a3, 1,
++     { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "NEC PlasmaSync 5000W",
++     7,   /* DVI entirely unknown */
++     { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,11|0xc0, 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++#endif
++   { 0x412f, 1,
++     { 0x000c, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "Pioneer 503CMX",
++     6,   /* DVI unknown */
++     { 1|0xc0, 2|0xc0, 9|0xc0,11|0xc0,12|0xc0,15|0xc0, 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x34a9, 1,
++     { 0xa00e, 0x0000, 0x0000, 0x0000, 0x0000 },
++     "Panasonic TH-42",
++     5,   /* No DVI output */
++     { 1|0x40, 2|0x40, 4|0x40, 9|0x40,15|0x40, 0     , 0     , 0     , 0     , 0     ,
++       0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0     , 0       }
++   },
++   { 0x0000 }
++};
++
+ void     SiS_SetReg1(USHORT, USHORT, USHORT);
+ void     SiS_SetReg2(SiS_Private *, USHORT, USHORT, USHORT);
+ void     SiS_SetReg3(USHORT, USHORT);
+@@ -158,6 +2337,7 @@ void     SiS_SetMemoryClock(SiS_Private 
+ void     SiS_SetDRAMModeRegister(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ BOOLEAN  SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo);
+ void     SiS_IsLowResolution(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
++void     SiS_GetSysFlags(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ #ifdef SIS300
+ void     SiS_SetDRAMSize_300(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+@@ -192,12 +2372,15 @@ void     SiS_VerifyMclk(SiS_Private *SiS
+ void     SiS_HandleCRT1(SiS_Private *SiS_Pr);
+ void     SiS_Handle301B_1400x1050(SiS_Private *SiS_Pr, USHORT ModeNo);
+-void     SiS_SetEnableDstn(SiS_Private *SiS_Pr);
++void     SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable);
++void     SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable);
+ void     SiS_Delay15us(SiS_Private *SiS_Pr);
+ BOOLEAN  SiS_SearchModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo,USHORT *ModeIdIndex);
+ BOOLEAN  SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                              USHORT ModeNo,USHORT ModeIdIndex);
+ UCHAR    SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex);
++void     SiS_WhatTheHellIsThis(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
++void     SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ void     SiS_SetSeqRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex);
+ void     SiS_SetMiscRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex);
+ void     SiS_SetCRTCRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+@@ -267,19 +2450,19 @@ void            SiS_SetPitchCRT1(SiS_Private *S
+ void          SiS_SetPitchCRT2(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr);
+ extern int      SiS_compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div,
+                                   int *out_sbit, int *out_scale);
++extern void   SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk);
++
+ extern unsigned char SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value);
+ extern unsigned char SiS_GetSetModeID(ScrnInfoPtr pScrn, unsigned char id);
+-extern USHORT              SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode);
++extern USHORT              SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN hcm);
+ #endif
+ extern USHORT    SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+                        USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ extern USHORT    SiS_GetColorDepth(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+ extern void      SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+-extern BOOLEAN   SiS_SetCRT2Group301(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+-                                     PSIS_HW_DEVICE_INFO HwDeviceExtension);
+-extern void      SiS_PresetScratchregister(SiS_Private *SiS_Pr, USHORT SiS_P3d4,
+-                                           PSIS_HW_DEVICE_INFO HwDeviceExtension);
++extern BOOLEAN   SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
++                                  PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ extern void      SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
+ extern void      SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
+ extern BOOLEAN   SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr);
+@@ -321,10 +2504,12 @@ int    sisfb_mode_rate_to_dclock(SiS_Pri
+                             unsigned char modeno, unsigned char rateindex);
+ int    sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+                        unsigned char modeno, unsigned char rateindex,
+-                       ULONG *left_margin, ULONG *right_margin, 
++                       ULONG *left_margin, ULONG *right_margin,
+                        ULONG *upper_margin, ULONG *lower_margin,
+                        ULONG *hsync_len, ULONG *vsync_len,
+                        ULONG *sync, ULONG *vmode);
++BOOLEAN sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
++                     unsigned char modeno, int *htotal, int *vtotal, unsigned char rateindex);
+ #endif
+ #endif
+--- linux-2.6.0-test1/drivers/video/sis/oem300.h       2003-06-14 12:18:05.000000000 -0700
++++ 25/drivers/video/sis/oem300.h      2003-07-19 17:04:55.000000000 -0700
+@@ -1,5 +1,30 @@
+-
+-/* OEM Data for 300 series */
++/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/oem300.h.c,v 1.0 2001/11/30 12:12:01 eich Exp $ */
++/*
++ * OEM Data for 300 series
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ const UCHAR SiS300_OEMTVDelay301[8][4] =
+ {
+@@ -680,325 +705,147 @@ const UCHAR SiS300_Filter2[10][9][7] =
+     }
+ };
+-const UCHAR SiS300_LCDHData[24][11][5] = {
++/* Custom data for Barco iQ Pro R300 */
++const UCHAR barco_p1[2][9][7][3] = {
+     {
+-        {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x65,0xef,0x83,0x5c,0x00},
+-      {0x65,0xef,0x83,0x5c,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-        {0x4e,0x18,0x90,0x38,0x00},
+-      {0x4e,0x18,0x90,0x38,0x00},
+-      {0x8e,0x18,0x28,0x78,0x00},
+-      {0x8e,0x18,0x28,0x78,0x00},
+-      {0x8e,0x18,0x28,0x78,0x00},
+-      {0x4e,0x18,0x90,0x38,0x00},
+-      {0x4e,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9a,0x56,0x00},
+-        {0x67,0x11,0x9a,0x56,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-        {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x65,0xef,0x83,0x5c,0x00},
+-      {0x65,0xef,0x83,0x5c,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4e,0x18,0x90,0x38,0x00},
+-      {0x4e,0x18,0x90,0x38,0x00},
+-      {0x8e,0x18,0x28,0x78,0x00},
+-      {0x8e,0x18,0x28,0x78,0x00},
+-      {0x8e,0x18,0x28,0x78,0x00},
+-      {0x4e,0x18,0x90,0x38,0x00},
+-      {0x4e,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9a,0x56,0x00},
+-      {0x67,0x11,0x9a,0x56,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x67,0x91,0x84,0x5e,0x00},
+-      {0x65,0xef,0x83,0x5c,0x00},
+-      {0x65,0xef,0x83,0x5c,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00},
+-      {0x8a,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-        {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x67,0x91,0x84,0x5E,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x65,0xEF,0x83,0x5C,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
+-    },
+-    {
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x8E,0x18,0x28,0x78,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x4E,0x18,0x90,0x38,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x67,0x11,0x9A,0x56,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00},
+-      {0x8A,0x14,0x00,0x80,0x00}
++      {  { 0x16, 0xcf, 0x00 },
++         { 0x18, 0x00, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x26, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x19, 0x00 }
++      },
++      {
++         { 0x16, 0xcf, 0x00 },
++         { 0x18, 0x00, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x1e, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x16, 0x00 }
++      },
++      {
++         { 0x16, 0xcf, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x26, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x19, 0x00 },
++         {    0,    0,    0 }
++      },
++      {
++         {    0,    0,    0 }
++      },
++      {
++         { 0x16, 0xcf, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x26, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x1e, 0x00 },
++         {    0,    0,    0 }
++      },
++      {
++         { 0x16, 0xd1, 0x00 },
++         { 0x18, 0x00, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x11, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x26, 0x00 }
++      },
++      {
++         { 0x16, 0xd1, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x26, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x30, 0x00 },
++         {    0,    0,    0 }
++      },
++      {
++         { 0x16, 0x00, 0x00 },
++         { 0x17, 0xa0, 0x00 },
++         { 0x1a, 0xa0, 0x00 },
++         { 0x1b, 0x2a, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         {    0,    0,    0 }
++      },
++      {
++         { 0x16, 0x00, 0x00 },
++         { 0x17, 0xaa, 0x00 },
++         { 0x1a, 0xa0, 0x00 },
++         { 0x1b, 0x2a, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         {    0,    0,    0 }
++      }
++    },
++    {
++      {
++         { 0x16, 0xcf, 0x00 },
++         { 0x18, 0x00, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x26, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x19, 0x00 }
++      },
++      {
++         {    0,    0,    0 }
++      },
++      {
++         { 0x16, 0xcf, 0x00 },
++         { 0x18, 0x00, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x26, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x19, 0x00 },
++      },
++      {
++         {    0,    0,    0 }
++      },
++      {
++         { 0x16, 0xcf, 0x00 },
++         { 0x18, 0x00, 0x00 },
++         { 0x1a, 0xe7, 0x00 },
++         { 0x1b, 0x26, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x1e, 0x00 }
++      },
++      {
++         { 0x16, 0xd1, 0x00 },
++         { 0x18, 0x00, 0x00 },
++         { 0x1a, 0xe6, 0x00 },
++         { 0x1b, 0x11, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x26, 0x00 }
++      },
++      {
++         { 0x18, 0x00, 0x00 },
++         { 0x1a, 0xe0, 0x00 },
++         { 0x1b, 0x26, 0x00 },
++         { 0x1c, 0xff, 0x00 },
++         { 0x1d, 0x1c, 0x00 },
++         { 0x1e, 0x30, 0x00 },
++         {    0,    0,    0 }
++      },
++      {
++         {    0,    0,    0 }
++      },
++      {
++         {    0,    0,    0 }
++      }
+     }
+ };
+-#if 0
+-const UCHAR SiS300_LCDVData[24][11][6] = {
+-    {
+-        {
+-    },
+-};
+-#endif
++
++
++
++
++
+--- linux-2.6.0-test1/drivers/video/sis/oem310.h       2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/video/sis/oem310.h      2003-07-19 17:04:55.000000000 -0700
+@@ -1,5 +1,30 @@
+-
+-/* OEM Data for 310/325/330 series */
++/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/oem300.h.c,v 1.0 2001/11/30 12:12:01 eich Exp $ */
++/*
++ * OEM Data for 315/330 series
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ const UCHAR SiS310_LCDDelayCompensation_301[] =               /* 301 */
+ {
+@@ -100,7 +125,7 @@ const UCHAR SiS310_LCDDelayCompensation_
+ const UCHAR SiS310_LCDDelayCompensation_651301LV[] =    /* M650/651 301LV */
+ {
+-                 0x33,0x33,0x33,    /*   800x600 (guessed) */
++                 0x33,0x33,0x33,    /*   800x600 (guessed) - new: PanelType, not PanelRes ! */
+                0x33,0x33,0x33,    /*  1024x768 */
+                0x33,0x33,0x33,    /* 1280x1024 */
+                0x33,0x33,0x33,    /*   640x480 (unknown) */
+--- linux-2.6.0-test1/drivers/video/sis/osdef.h        2003-06-14 12:17:56.000000000 -0700
++++ 25/drivers/video/sis/osdef.h       2003-07-19 17:04:55.000000000 -0700
+@@ -1,79 +1,43 @@
+-/* #define WINCE_HEADER */
+-/* #define WIN2000 */
+-/* #define TC */
++
++/* OS depending defines */
++
++/* The choices are: */
++
+ #define LINUX_KERNEL     /* Kernel framebuffer */
+ /* #define LINUX_XF86 */   /* XFree86 */
+ /**********************************************************************/
+-#ifdef LINUX_KERNEL
+-      #include <linux/config.h>
+-      #include <linux/version.h>
+-      #ifdef CONFIG_FB_SIS_300
+-              #define SIS300
+-      #endif
+-
+-      #ifdef CONFIG_FB_SIS_315
+-              #define SIS315H
+-      #endif
+-      #if 1
+-              #define SISFBACCEL      /* Include 2D acceleration */
+-      #endif
+-      #if 1
+-              #define SISFB_PAN       /* Include Y-Panning code */
+-      #endif
+-#else
+-/*    #define SIS300*/
+-      #define SIS315H
+-#endif
+-#ifdef LINUX_XF86
+-      #define SIS300
+-      /* #define SIS315H */ /* TW: done above */
+-#endif
++#ifdef LINUX_KERNEL  /* -------------------------- */
++#include <linux/config.h>
++#include <linux/version.h>
+-/**********************************************************************/
+-#ifdef TC
+-#endif
+-#ifdef WIN2000
+-#endif
+-#ifdef WINCE_HEADER
+-#endif
+-#ifdef LINUX_XF86
++#ifdef CONFIG_FB_SIS_300
++#define SIS300
+ #endif
+-#ifdef LINUX_KERNEL
+-#endif
+-/**********************************************************************/
+-#ifdef TC
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize);
+-#endif
+-#ifdef WIN2000
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) MemFill((PVOID) MemoryAddress,(ULONG) MemorySize,(UCHAR) value);
++
++#ifdef CONFIG_FB_SIS_315
++#define SIS315H
+ #endif
+-#ifdef WINCE_HEADER
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize);
++
++#if 1
++#define SISFBACCEL    /* Include 2D acceleration */
+ #endif
+-#ifdef LINUX_XF86
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
++
+ #endif
+-#ifdef LINUX_KERNEL
+-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
++
++#ifdef LINUX_XF86 /* ----------------------------- */
++#define SIS300
++#define SIS315H
+ #endif
+-/**********************************************************************/
+ /**********************************************************************/
+-
+-#ifdef TC
+-#define SiS_MemoryCopy(Destination,Soruce,Length) memmove(Destination, Soruce, Length);
+-#endif
+-#ifdef WIN2000
+-#define SiS_MemoryCopy(Destination,Soruce,Length)  /*VideoPortMoveMemory((PUCHAR)Destination , Soruce,length);*/
+-#endif
+-#ifdef WINCE_HEADER
+-#define SiS_MemoryCopy(Destination,Soruce,Length) memmove(Destination, Soruce, Length);
+-#endif
+ #ifdef LINUX_XF86
++#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
+ #define SiS_MemoryCopy(Destination,Soruce,Length) memcpy(Destination,Soruce,Length)
+ #endif
++
+ #ifdef LINUX_KERNEL
++#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
+ #define SiS_MemoryCopy(Destination,Soruce,Length) memcpy(Destination,Soruce,Length)
+ #endif
+@@ -104,19 +68,6 @@
+ #endif /* InPortLong */
+ /**********************************************************************/
+-/*  TC                                                                */
+-/**********************************************************************/
+-
+-#ifdef TC
+-#define OutPortByte(p,v) outp((unsigned short)(p),(unsigned char)(v))
+-#define OutPortWord(p,v) outp((unsigned short)(p),(unsigned short)(v))
+-#define OutPortLong(p,v) outp((unsigned short)(p),(unsigned long)(v))
+-#define InPortByte(p)    inp((unsigned short)(p))
+-#define InPortWord(p)    inp((unsigned short)(p))
+-#define InPortLong(p)    ((inp((unsigned short)(p+2))<<16) | inp((unsigned short)(p)))
+-#endif
+-
+-/**********************************************************************/
+ /*  LINUX XF86                                                        */
+ /**********************************************************************/
+@@ -142,29 +93,4 @@
+ #define InPortLong(p)    inl((u16)(p))
+ #endif
+-/**********************************************************************/
+-/*  WIN 2000                                                          */
+-/**********************************************************************/
+-
+-#ifdef WIN2000
+-#define OutPortByte(p,v) VideoPortWritePortUchar ((PUCHAR) (p), (UCHAR) (v))
+-#define OutPortWord(p,v) VideoPortWritePortUshort((PUSHORT) (p), (USHORT) (v))
+-#define OutPortLong(p,v) VideoPortWritePortUlong ((PULONG) (p), (ULONG) (v))
+-#define InPortByte(p)    VideoPortReadPortUchar  ((PUCHAR) (p))
+-#define InPortWord(p)    VideoPortReadPortUshort ((PUSHORT) (p))
+-#define InPortLong(p)    VideoPortReadPortUlong  ((PULONG) (p))
+-#endif
+-
+-/**********************************************************************/
+-/*  WIN CE                                                            */
+-/**********************************************************************/
+-
+-#ifdef WINCE_HEADER
+-#define OutPortByte(p,v) WRITE_PORT_UCHAR ((PUCHAR) (p), (UCHAR) (v))
+-#define OutPortWord(p,v) WRITE_PORT_USHORT((PUSHORT) (p), (USHORT) (v))
+-#define OutPortLong(p,v) WRITE_PORT_ULONG ((PULONG) (p), (ULONG) (v))
+-#define InPortByte(p)    READ_PORT_UCHAR  ((PUCHAR) (p))
+-#define InPortWord(p)    READ_PORT_USHORT ((PUSHORT) (p))
+-#define InPortLong(p)    READ_PORT_ULONG  ((PULONG) (p))
+-#endif
+--- linux-2.6.0-test1/drivers/video/sis/sis_accel.c    2003-06-14 12:18:52.000000000 -0700
++++ 25/drivers/video/sis/sis_accel.c   2003-07-19 17:04:55.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * SiS 300/630/730/540/315/550/650/740 frame buffer driver
++ * SiS 300/630/730/540/315/550/650/740/330/660 frame buffer driver
+  * for Linux kernels 2.4.x and 2.5.x
+  *
+  * 2D acceleration part
+@@ -211,7 +211,7 @@ SiS300SubsequentSolidFillRect(int x, int
+       SiS300DoCMD
+ }
+-/* 310/325 series ------------------------------------------------ */
++/* 315 series ---------------------------------------------------- */
+ static void
+ SiS310SetupForScreenToScreenCopy(int xdir, int ydir, int rop,
+@@ -230,7 +230,7 @@ SiS310SetupForScreenToScreenCopy(int xdi
+               /* SiSSetupCMDFlag(BITBLT | SRCVIDEO) */
+       }
+       SiS310SetupCMDFlag(ivideo.SiS310_AccelDepth)
+-      /* TW: The 310/325 series is smart enough to know the direction */
++      /* TW: The 315 series is smart enough to know the direction */
+ }
+ static void
+@@ -328,11 +328,13 @@ void sisfb_syncaccel(void)
+     }
+ }
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,34)  /* --- KERNEL 2.5.34 and later --- */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)  /* --------------- 2.5 --------------- */
+ int fbcon_sis_sync(struct fb_info *info)
+ {
+-   if(!sisfb_accel) return 0;
++   if(!ivideo.accel)
++      return 0;
++   
+    CRITFLAGS
+    if(sisvga_engine == SIS_300_VGA) {
+       SiS300Sync();
+@@ -352,7 +354,7 @@ void fbcon_sis_fillrect(struct fb_info *
+    if(!rect->width || !rect->height)
+       return;
+-   if(!sisfb_accel) {
++   if(!ivideo.accel) {
+       cfb_fillrect(info, rect);
+       return;
+    }
+@@ -388,7 +390,7 @@ void fbcon_sis_copyarea(struct fb_info *
+    CRITFLAGS
+    TWDEBUG("Inside sis_copyarea");
+-   if(!sisfb_accel) {
++   if(!ivideo.accel) {
+       cfb_copyarea(info, area);
+       return;
+    }
+@@ -418,7 +420,7 @@ void fbcon_sis_copyarea(struct fb_info *
+ #endif
+-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,33)  /* ------ KERNEL <2.5.34 ------ */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)  /* -------------- 2.4 --------------- */
+ void fbcon_sis_bmove(struct display *p, int srcy, int srcx,
+                           int dsty, int dstx, int height, int width)
+@@ -591,38 +593,38 @@ void fbcon_sis_revc(struct display *p, i
+ #ifdef FBCON_HAS_CFB8
+ struct display_switch fbcon_sis8 = {
+-      setup:                  fbcon_cfb8_setup,
+-      bmove:                  fbcon_sis_bmove,
+-      clear:                  fbcon_sis_clear8,
+-      putc:                   fbcon_cfb8_putc,
+-      putcs:                  fbcon_cfb8_putcs,
+-      revc:                   fbcon_cfb8_revc,
+-      clear_margins:          fbcon_cfb8_clear_margins,
+-      fontwidthmask:          FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
++      .setup                  = fbcon_cfb8_setup,
++      .bmove                  = fbcon_sis_bmove,
++      .clear                  = fbcon_sis_clear8,
++      .putc                   = fbcon_cfb8_putc,
++      .putcs                  = fbcon_cfb8_putcs,
++      .revc                   = fbcon_cfb8_revc,
++      .clear_margins          = fbcon_cfb8_clear_margins,
++      .fontwidthmask          = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+ };
+ #endif
+ #ifdef FBCON_HAS_CFB16
+ struct display_switch fbcon_sis16 = {
+-      setup:                  fbcon_cfb16_setup,
+-      bmove:                  fbcon_sis_bmove,
+-      clear:                  fbcon_sis_clear16,
+-      putc:                   fbcon_cfb16_putc,
+-      putcs:                  fbcon_cfb16_putcs,
+-      revc:                   fbcon_sis_revc,
+-      clear_margins:          fbcon_cfb16_clear_margins,
+-      fontwidthmask:          FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
++      .setup                  = fbcon_cfb16_setup,
++      .bmove                  = fbcon_sis_bmove,
++      .clear                  = fbcon_sis_clear16,
++      .putc                   = fbcon_cfb16_putc,
++      .putcs                  = fbcon_cfb16_putcs,
++      .revc                   = fbcon_sis_revc,
++      .clear_margins          = fbcon_cfb16_clear_margins,
++      .fontwidthmask          = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+ };
+ #endif
+ #ifdef FBCON_HAS_CFB32
+ struct display_switch fbcon_sis32 = {
+-      setup:                  fbcon_cfb32_setup,
+-      bmove:                  fbcon_sis_bmove,
+-      clear:                  fbcon_sis_clear32,
+-      putc:                   fbcon_cfb32_putc,
+-      putcs:                  fbcon_cfb32_putcs,
+-      revc:                   fbcon_sis_revc,
+-      clear_margins:          fbcon_cfb32_clear_margins,
+-      fontwidthmask:          FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
++      .setup                  = fbcon_cfb32_setup,
++      .bmove                  = fbcon_sis_bmove,
++      .clear                  = fbcon_sis_clear32,
++      .putc                   = fbcon_cfb32_putc,
++      .putcs                  = fbcon_cfb32_putcs,
++      .revc                   = fbcon_sis_revc,
++      .clear_margins          = fbcon_cfb32_clear_margins,
++      .fontwidthmask          = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
+ };
+ #endif
+--- linux-2.6.0-test1/drivers/video/sis/sis_accel.h    2003-06-14 12:18:08.000000000 -0700
++++ 25/drivers/video/sis/sis_accel.h   2003-07-19 17:04:55.000000000 -0700
+@@ -47,7 +47,7 @@
+ #define TRAPAZOID_FILL          0x00000005  /* Fill trapezoid */
+ #define TRANSPARENT_BITBLT      0x00000006  /* Transparent Blit */
+-/* Additional engine commands for 310/325 */
++/* Additional engine commands for 315 */
+ #define ALPHA_BLEND           0x00000007  /* Alpha blend ? */
+ #define A3D_FUNCTION          0x00000008  /* 3D command ? */
+ #define       CLEAR_Z_BUFFER          0x00000009  /* ? */
+@@ -90,11 +90,11 @@
+ #define NO_RESET_COUNTER        0x00400000
+ #define NO_LAST_PIXEL           0x00200000
+-/* Subfunctions for Color/Enhanced Color Expansion (310/325 only) */
++/* Subfunctions for Color/Enhanced Color Expansion (315 only) */
+ #define COLOR_TO_MONO         0x00100000
+ #define AA_TEXT                       0x00200000
+-/* Some general registers for 310/325 series */
++/* Some general registers for 315 series */
+ #define SRC_ADDR              0x8200
+ #define SRC_PITCH             0x8204
+ #define AGP_BASE              0x8206 /* color-depth dependent value */
+@@ -326,7 +326,7 @@ int     CmdQueLen;
+-/* ----------- SiS 310/325 series --------------- */
++/* -------------- SiS 315 series --------------- */
+ /* Q_STATUS:
+    bit 31 = 1: All engines idle and all queues empty
+@@ -342,7 +342,7 @@ int     CmdQueLen;
+    bits 7:0:   2D counter 1
+    Where is the command queue length (current amount of commands the queue
+-   can accept) on the 310/325 series? (The current implementation is taken
++   can accept) on the 315 series? (The current implementation is taken
+    from 300 series and certainly wrong...)
+ */
+--- linux-2.6.0-test1/drivers/video/sis/sis_main.c     2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/video/sis/sis_main.c    2003-07-19 17:04:55.000000000 -0700
+@@ -1,25 +1,18 @@
+ /*
+- * SiS 300/630/730/540/315/550/650/740 frame buffer device
++ * SiS 300/630/730/540/315/550/650/740/330/660 frame buffer device
+  * for Linux kernels 2.4.x and 2.5.x
+  *
+- * Partly based on the VBE 2.0 compliant graphic boards framebuffer driver,
+- * which is (c) 1998 Gerd Knorr <kraxel@goldbach.in-berlin.de>
++ * (C) 1999 Silicon Integrated Systems, Inc.
++ * (C) 2001-2003 Thomas Winischhofer, Vienna, Austria.
+  *
+  * Authors:           SiS (www.sis.com.tw)
+- *            (Various others)
+- *            Thomas Winischhofer <thomas@winischhofer.net>:
+- *                    - SiS Xabre (330) support
+- *                    - many fixes and enhancements for all chipset series,
+- *                    - extended bridge handling, TV output for Chrontel 7005
+- *                      - 650/LVDS support (for LCD panels up to 1600x1200)
+- *                      - 650/740/Chrontel 7019 support
+- *                      - 30xB/30xLV LCD, TV and VGA2 support
+- *                    - memory queue handling enhancements,
+- *                      - 2D acceleration and y-panning,
+- *                      - portation to 2.5 API
+- *                    - etc.
+- *                    (see http://www.winischhofer.net/
+- *                    for more information and updates)
++ *            Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ * See http://www.winischhofer.net/ for more information and updates
++ *
++ * Originally based on the VBE 2.0 compliant graphic boards framebuffer driver,
++ * which is (c) 1998 Gerd Knorr <kraxel@goldbach.in-berlin.de>
++ *
+  */
+ #include <linux/config.h>
+@@ -43,6 +36,7 @@
+ #include <linux/fs.h>
+ #include <linux/agp_backend.h>
+ #include <linux/types.h>
++#include <asm/uaccess.h>
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ #include <linux/spinlock.h>
+@@ -79,6 +73,12 @@
+ #endif
+ #endif
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69)
++#error "This version of sisfb requires at least 2.5.69"
++#endif
++#endif
++
+ /* -------------------- Macro definitions ---------------------------- */
+ #undef SISFBDEBUG     /* TW: no debugging */
+@@ -178,9 +178,12 @@ BOOLEAN sisfb_query_north_bridge_space(P
+               case SIS_650:
+                       nbridge_id = PCI_DEVICE_ID_SI_650;
+                       break;
+-              case SIS_740:                   
++              case SIS_740:
+                       nbridge_id = PCI_DEVICE_ID_SI_740;
+                       break;
++              case SIS_660:
++                      nbridge_id = PCI_DEVICE_ID_SI_660;
++                      break;
+               default:
+                       nbridge_id = 0;
+                       break;
+@@ -207,64 +210,288 @@ BOOLEAN sisfb_query_north_bridge_space(P
+ /* ------------------ Internal helper routines ----------------- */
+-static void sisfb_search_mode(const char *name)
++static BOOLEAN sisfb_verify_rate(struct sisfb_monitor *monitor, int mode_idx, int rate_idx, int rate)
+ {
+-      int i = 0, j = 0;
++      int htotal, vtotal;
++      unsigned int dclock, hsync;
+-      if(name == NULL) {
+-         printk(KERN_ERR "sisfb: Internal error, using default mode.\n");
+-         sisfb_mode_idx = DEFAULT_MODE;
+-         return;
++      if(!monitor->datavalid) return TRUE;
++
++      if(mode_idx < 0) return FALSE;
++
++      if(rate < (monitor->vmin - 1)) return FALSE;
++      if(rate > (monitor->vmax + 1)) return FALSE;
++
++      if(sisfb_gettotalfrommode(&SiS_Pr, &sishw_ext, sisbios_mode[mode_idx].mode_no,
++                                &htotal, &vtotal, rate_idx)) {
++              dclock = (htotal * vtotal * rate) / 1000;
++              if(dclock > (monitor->dclockmax + 1000)) return FALSE;
++              hsync = dclock / htotal;
++              if(hsync < (monitor->hmin - 1)) return FALSE;
++              if(hsync > (monitor->hmax + 1)) return FALSE;
++        } else {
++              return FALSE;
+       }
+-              
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)               
+-        if (!strcmp(name, sisbios_mode[MODE_INDEX_NONE].name)) {
+-         printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n");
+-         sisfb_mode_idx = DEFAULT_MODE;
+-         return;
++      return TRUE;
++};
++
++static BOOLEAN sisfb_interpret_edid(struct sisfb_monitor *monitor, unsigned char *buffer)
++{
++      int i, j, xres, yres, refresh, index;
++      u32 emodes;
++
++      if(buffer[0] != 0x00 || buffer[1] != 0xff ||
++         buffer[2] != 0xff || buffer[3] != 0xff ||
++         buffer[4] != 0xff || buffer[5] != 0xff ||
++         buffer[6] != 0xff || buffer[7] != 0x00) {
++         printk(KERN_INFO "sisfb: Bad EDID header\n");
++         return FALSE;
+       }
+-#endif                
+-      while(sisbios_mode[i].mode_no != 0) {
+-              if (!strcmp(name, sisbios_mode[i].name)) {
+-                      sisfb_mode_idx = i;
+-                      j = 1;
+-                      break;
+-              }
+-              i++;
++      if(buffer[0x12] != 0x01) {
++         printk(KERN_INFO "sisfb: EDID version %d not supported\n",
++              buffer[0x12]);
++         return FALSE;
++      }
++
++      monitor->feature = buffer[0x18];
++
++      if(!buffer[0x14] & 0x80) {
++         if(!(buffer[0x14] & 0x08)) {
++            printk(KERN_INFO "sisfb: WARNING: Monitor does not support separate syncs\n");
++         }
++      }
++
++      if(buffer[0x13] >= 0x01) {
++         /* EDID V1 rev 1 and 2: Search for monitor descriptor
++          * to extract ranges
++          */
++          j = 0x36;
++          for(i=0; i<4; i++) {
++             if(buffer[j]     == 0x00 && buffer[j + 1] == 0x00 &&
++                buffer[j + 2] == 0x00 && buffer[j + 3] == 0xfd &&
++                buffer[j + 4] == 0x00) {
++                monitor->hmin = buffer[j + 7];
++                monitor->hmax = buffer[j + 8];
++                monitor->vmin = buffer[j + 5];
++                monitor->vmax = buffer[j + 6];
++                monitor->dclockmax = buffer[j + 9] * 10 * 1000;
++                monitor->datavalid = TRUE;
++                break;
++             }
++             j += 18;
++          }
++      }
++
++      if(!monitor->datavalid) {
++         /* Otherwise: Get a range from the list of supported
++          * Estabished Timings. This is not entirely accurate,
++          * because fixed frequency monitors are not supported
++          * that way.
++          */
++         monitor->hmin = 65535; monitor->hmax = 0;
++         monitor->vmin = 65535; monitor->vmax = 0;
++         monitor->dclockmax = 0;
++         emodes = buffer[0x23] | (buffer[0x24] << 8) | (buffer[0x25] << 16);
++         for(i = 0; i < 13; i++) {
++            if(emodes & sisfb_ddcsmodes[i].mask) {
++               if(monitor->hmin > sisfb_ddcsmodes[i].h) monitor->hmin = sisfb_ddcsmodes[i].h;
++               if(monitor->hmax < sisfb_ddcsmodes[i].h) monitor->hmax = sisfb_ddcsmodes[i].h + 1;
++               if(monitor->vmin > sisfb_ddcsmodes[i].v) monitor->vmin = sisfb_ddcsmodes[i].v;
++               if(monitor->vmax < sisfb_ddcsmodes[i].v) monitor->vmax = sisfb_ddcsmodes[i].v;
++               if(monitor->dclockmax < sisfb_ddcsmodes[i].d) monitor->dclockmax = sisfb_ddcsmodes[i].d;
++            }
++         }
++         index = 0x26;
++         for(i = 0; i < 8; i++) {
++            xres = (buffer[index] + 31) * 8;
++            switch(buffer[index + 1] & 0xc0) {
++               case 0xc0: yres = (xres * 9) / 16; break;
++               case 0x80: yres = (xres * 4) /  5; break;
++               case 0x40: yres = (xres * 3) /  4; break;
++               default:   yres = xres;            break;
++            }
++            refresh = (buffer[index + 1] & 0x3f) + 60;
++            if((xres >= 640) && (yres >= 480)) {
++                 for(j = 0; j < 8; j++) {
++                  if((xres == sisfb_ddcfmodes[j].x) &&
++                     (yres == sisfb_ddcfmodes[j].y) &&
++                     (refresh == sisfb_ddcfmodes[j].v)) {
++                    if(monitor->hmin > sisfb_ddcfmodes[j].h) monitor->hmin = sisfb_ddcfmodes[j].h;
++                    if(monitor->hmax < sisfb_ddcfmodes[j].h) monitor->hmax = sisfb_ddcfmodes[j].h + 1;
++                    if(monitor->vmin > sisfb_ddcsmodes[j].v) monitor->vmin = sisfb_ddcsmodes[j].v;
++                    if(monitor->vmax < sisfb_ddcsmodes[j].v) monitor->vmax = sisfb_ddcsmodes[j].v;
++                    if(monitor->dclockmax < sisfb_ddcsmodes[j].d) monitor->dclockmax = sisfb_ddcsmodes[i].d;
++                  }
++               }
++            }
++            index += 2;
++           }
++         if((monitor->hmin <= monitor->hmax) && (monitor->vmin <= monitor->vmax)) {
++            monitor->datavalid = TRUE;
++         }
++      }
++
++      return(monitor->datavalid);
++}
++
++static void sisfb_handle_ddc(struct sisfb_monitor *monitor, int crtno)
++{
++      USHORT        temp, i, realcrtno = crtno;
++      unsigned char buffer[256];
++
++      monitor->datavalid = FALSE;
++
++      if(crtno) {
++                 if(ivideo.vbflags & CRT2_LCD)      realcrtno = 1;
++                 else if(ivideo.vbflags & CRT2_VGA) realcrtno = 2;
++                 else return;
++      }
++
++      if((sisfb_crt1off) && (!crtno)) return;
++
++      temp = SiS_HandleDDC(&SiS_Pr, ivideo.vbflags, sisvga_engine, realcrtno, 0, &buffer[0]);
++      if((!temp) || (temp == 0xffff)) {
++                 printk(KERN_INFO "sisfb: CRT%d DDC probing failed\n", crtno + 1);
++         return;
++      } else {
++                 printk(KERN_INFO "sisfb: CRT%d DDC supported\n", crtno + 1);
++                 printk(KERN_INFO "sisfb: CRT%d DDC level: %s%s%s%s\n",
++              crtno + 1,
++              (temp & 0x1a) ? "" : "[none of the supported]",
++              (temp & 0x02) ? "2 " : "",
++              (temp & 0x08) ? "D&P" : "",
++              (temp & 0x10) ? "FPDI-2" : "");
++                 if(temp & 0x02) {
++            i = 3;  /* Number of retrys */
++            do {
++               temp = SiS_HandleDDC(&SiS_Pr, ivideo.vbflags, sisvga_engine,
++                                   realcrtno, 1, &buffer[0]);
++            } while((temp) && i--);
++              if(!temp) {
++               if(sisfb_interpret_edid(monitor, &buffer[0])) {
++                  printk(KERN_INFO "sisfb: Monitor range H %d-%dKHz, V %d-%dHz, Max. dotclock %dMHz\n",
++                      monitor->hmin, monitor->hmax, monitor->vmin, monitor->vmax,
++                      monitor->dclockmax / 1000);
++               } else {
++                  printk(KERN_INFO "sisfb: CRT%d DDC EDID corrupt\n", crtno + 1);
++               }
++            } else {
++               printk(KERN_INFO "sisfb: CRT%d DDC reading failed\n", crtno + 1);
++            }
++         } else {
++            printk(KERN_INFO "sisfb: VESA D&P and FPDI-2 not supported yet\n");
++         }
+       }
+-      if(!j) printk(KERN_INFO "sisfb: Invalid mode '%s'\n", name);
+ }
+-static void sisfb_search_vesamode(unsigned int vesamode)
++static void sisfb_search_vesamode(unsigned int vesamode, BOOLEAN quiet)
+ {
+       int i = 0, j = 0;
+       if(vesamode == 0) {
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)        
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+               sisfb_mode_idx = MODE_INDEX_NONE;
+ #else
+-              printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n");
++              if(!quiet)
++                 printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n");
+               sisfb_mode_idx = DEFAULT_MODE;
+-#endif                
++#endif
+               return;
+       }
+       vesamode &= 0x1dff;  /* Clean VESA mode number from other flags */
++      while(sisbios_mode[i++].mode_no != 0) {
++              if( (sisbios_mode[i-1].vesa_mode_no_1 == vesamode) ||
++                  (sisbios_mode[i-1].vesa_mode_no_2 == vesamode) ) {
++                  if(sisfb_fstn) {
++                     if(sisbios_mode[i-1].mode_no == 0x50 ||
++                        sisbios_mode[i-1].mode_no == 0x56 ||
++                        sisbios_mode[i-1].mode_no == 0x53) continue;
++                  } else {
++                     if(sisbios_mode[i-1].mode_no == 0x5a ||
++                        sisbios_mode[i-1].mode_no == 0x5b) continue;
++                  }
++                  sisfb_mode_idx = i - 1;
++                  j = 1;
++                  break;
++              }
++      }
++      if((!j) && !quiet) printk(KERN_ERR "sisfb: Invalid VESA mode 0x%x'\n", vesamode);
++}
++
++static void sisfb_search_mode(char *name, BOOLEAN quiet)
++{
++      int i = 0;
++      unsigned int j = 0, xres = 0, yres = 0, depth = 0, rate = 0;
++      char strbuf[16], strbuf1[20];
++      char *nameptr = name;
++
++      if(name == NULL) {
++         if(!quiet)
++            printk(KERN_ERR "sisfb: Internal error, using default mode.\n");
++         sisfb_mode_idx = DEFAULT_MODE;
++         return;
++      }
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++        if (!strcmp(name, sisbios_mode[MODE_INDEX_NONE].name)) {
++         if(!quiet)
++            printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n");
++         sisfb_mode_idx = DEFAULT_MODE;
++         return;
++      }
++#endif
++      if(strlen(name) <= 19) {
++         strcpy(strbuf1, name);
++         for(i=0; i<strlen(strbuf1); i++) {
++            if(strbuf1[i] < '0' || strbuf1[i] > '9') strbuf1[i] = ' ';
++         }
++
++         /* This does some fuzzy mode naming detection */
++         if(sscanf(strbuf1, "%u %u %u %u", &xres, &yres, &depth, &rate) == 4) {
++            if((rate <= 32) || (depth > 32)) {
++               j = rate; rate = depth; depth = j;
++            }
++            sprintf(strbuf, "%ux%ux%u", xres, yres, depth);
++            nameptr = strbuf;
++            ivideo.refresh_rate = sisfb_parm_rate = rate;
++         } else if(sscanf(strbuf1, "%u %u %u", &xres, &yres, &depth) == 3) {
++            sprintf(strbuf, "%ux%ux%u", xres, yres, depth);
++            nameptr = strbuf;
++         } else {
++            xres = 0;
++            if((sscanf(strbuf1, "%u %u", &xres, &yres) == 2) && (xres != 0)) {
++               sprintf(strbuf, "%ux%ux8", xres, yres);
++               nameptr = strbuf;
++            } else {
++               sisfb_search_vesamode(simple_strtoul(name, NULL, 0), quiet);
++               return;
++            }
++         }
++      }
++
++      i = 0; j = 0;
+       while(sisbios_mode[i].mode_no != 0) {
+-              if( (sisbios_mode[i].vesa_mode_no_1 == vesamode) ||
+-                  (sisbios_mode[i].vesa_mode_no_2 == vesamode) ) {
+-                      sisfb_mode_idx = i;
+-                      j = 1;
+-                      break;
++              if(!strcmp(nameptr, sisbios_mode[i++].name)) {
++                 if(sisfb_fstn) {
++                    if(sisbios_mode[i-1].mode_no == 0x50 ||
++                       sisbios_mode[i-1].mode_no == 0x56 ||
++                       sisbios_mode[i-1].mode_no == 0x53) continue;
++                 } else {
++                    if(sisbios_mode[i-1].mode_no == 0x5a ||
++                       sisbios_mode[i-1].mode_no == 0x5b) continue;
++                 }
++                 sisfb_mode_idx = i - 1;
++                 j = 1;
++                 break;
+               }
+-              i++;
+       }
+-      if(!j) printk(KERN_INFO "sisfb: Invalid VESA mode 0x%x'\n", vesamode);
++      if((!j) && !quiet) printk(KERN_ERR "sisfb: Invalid mode '%s'\n", nameptr);
+ }
+-static int sisfb_validate_mode(int myindex)
++static int sisfb_validate_mode(int myindex, unsigned long vbflags)
+ {
+    u16 xres, yres;
+@@ -283,8 +510,8 @@ static int sisfb_validate_mode(int myind
+    }
+ #endif
+-   switch (ivideo.disp_state & DISPTYPE_DISP2) {
+-     case DISPTYPE_LCD:
++   switch (vbflags & VB_DISPTYPE_DISP2) {
++     case CRT2_LCD:
+       switch (sishw_ext.ulCRT2LCDType) {
+       case LCD_640x480:
+               xres =  640; yres =  480;  break;
+@@ -306,24 +533,49 @@ static int sisfb_validate_mode(int myind
+               xres = 1400; yres = 1050;  break;               
+       case LCD_1600x1200:
+               xres = 1600; yres = 1200;  break;
+-      case LCD_320x480:                               /* TW: FSTN */
++      case LCD_320x480:                               /* FSTN (old) */
+               xres =  320; yres =  480;  break;
++      case LCD_640x480_2:                             /* FSTN (new) */
++      case LCD_640x480_3:
++              xres =  640; yres =  480;  break;
+       default:
+               xres =    0; yres =    0;  break;
+       }
++      if(SiS_Pr.SiS_CustomT == CUT_BARCO1366) {
++              xres = 1360; yres = 1024;
++      }
+       if(sisbios_mode[myindex].xres > xres) {
+               return(-1);
+       }
+         if(sisbios_mode[myindex].yres > yres) {
+               return(-1);
+       }
+-      if((sishw_ext.usExternalChip == 0x01) ||   /* LVDS */
+-           (sishw_ext.usExternalChip == 0x05) ||   /* LVDS+Chrontel */
+-         (sishw_ext.Is301BDH)) {                 /* 301B-DH */
++      if(vbflags & (VB_LVDS | VB_30xBDH)) {
+          switch (sisbios_mode[myindex].xres) {
++              case 320:
++                      if((sisbios_mode[myindex].yres != 200) &&
++                         (sisbios_mode[myindex].yres != 240))
++                              return(-1);
++                      if((sisbios_mode[myindex].yres == 240) ||
++                         (sisbios_mode[myindex].yres == 480)) {
++                              if(!sisfb_fstn) {
++                                 if(sisbios_mode[myindex].mode_no == 0x5a ||
++                                    sisbios_mode[myindex].mode_no == 0x5b)
++                                      return(-1);
++                              } else {
++                                 if(sisbios_mode[myindex].mode_no == 0x50 ||
++                                    sisbios_mode[myindex].mode_no == 0x56 ||
++                                    sisbios_mode[myindex].mode_no == 0x53)
++                                      return(-1);
++                              }
++                      }
++                      break;
++              case 400:
++                      if(sisbios_mode[myindex].yres != 300) return(-1);
++                      break;
+               case 512:
+-                      if(sisbios_mode[myindex].yres != 512) return -1;
+-                      if(sishw_ext.ulCRT2LCDType == LCD_1024x600) return -1;
++                      if(sisbios_mode[myindex].yres != 384) return(-1);
++                      if(sishw_ext.ulCRT2LCDType == LCD_1024x600) return(-1);
+                       break;
+               case 640:
+                       if((sisbios_mode[myindex].yres != 400) &&
+@@ -331,115 +583,130 @@ static int sisfb_validate_mode(int myind
+                               return -1;
+                       break;
+               case 800:
+-                      if(sisbios_mode[myindex].yres != 600) return -1;
++                      if(sisbios_mode[myindex].yres != 600) return(-1);
+                       break;
+               case 1024:
+                       if((sisbios_mode[myindex].yres != 600) &&
+                          (sisbios_mode[myindex].yres != 768))
+-                              return -1;
++                              return(-1);
+                       if((sisbios_mode[myindex].yres == 600) &&
+                          (sishw_ext.ulCRT2LCDType != LCD_1024x600))
+-                              return -1;
++                              return(-1);
+                       break;
+               case 1152:
+-                      if((sisbios_mode[myindex].yres) != 768) return -1;
+-                      if(sishw_ext.ulCRT2LCDType != LCD_1152x768) return -1;
++                      if((sisbios_mode[myindex].yres) != 768) return(-1);
++                      if(sishw_ext.ulCRT2LCDType != LCD_1152x768) return(-1);
+                       break;
+               case 1280:
+                       if((sisbios_mode[myindex].yres != 768) &&
+                          (sisbios_mode[myindex].yres != 1024))
+-                              return -1;
++                              return(-1);
+                       if((sisbios_mode[myindex].yres == 768) &&
+                          (sishw_ext.ulCRT2LCDType != LCD_1280x768))
+-                              return -1;                              
++                              return(-1);
++                      break;
++              case 1360:
++                      if(SiS_Pr.SiS_CustomT != CUT_BARCO1366) return(-1);
++                      if(sisbios_mode[myindex].yres != 1024) return(-1);
+                       break;
+               case 1400:
+-                      if(sisbios_mode[myindex].yres != 1050) return -1;
++                      if(sisbios_mode[myindex].yres != 1050) return(-1);
+                       break;
+               case 1600:
+-                      if(sisbios_mode[myindex].yres != 1200) return -1;
++                      if(sisbios_mode[myindex].yres != 1200) return(-1);
+                       break;
+               default:
+-                      return -1;              
++                      return(-1);
+          }
+       } else {
+          switch (sisbios_mode[myindex].xres) {
++              case 320:
++                      if((sisbios_mode[myindex].yres != 200) &&
++                         (sisbios_mode[myindex].yres != 240))
++                              return -1;
++                      break;
++              case 400:
++                      if(sisbios_mode[myindex].yres != 300) return(-1);
++                      break;
+               case 512:
+-                      if(sisbios_mode[myindex].yres != 512) return -1;
++                      if(sisbios_mode[myindex].yres != 384) return(-1);
+                       break;
+               case 640:
+                       if((sisbios_mode[myindex].yres != 400) &&
+                          (sisbios_mode[myindex].yres != 480))
+-                              return -1;
++                              return(-1);
+                       break;
+               case 800:
+-                      if(sisbios_mode[myindex].yres != 600) return -1;
++                      if(sisbios_mode[myindex].yres != 600) return(-1);
+                       break;
+               case 1024:
+-                      if(sisbios_mode[myindex].yres != 768) return -1;
++                      if(sisbios_mode[myindex].yres != 768) return(-1);
+                       break;
+               case 1280:
+                       if((sisbios_mode[myindex].yres != 960) &&
++                         (sisbios_mode[myindex].yres != 768) &&
+                          (sisbios_mode[myindex].yres != 1024))
+-                              return -1;
+-                      if(sisbios_mode[myindex].yres == 960) {
+-                          if(sishw_ext.ulCRT2LCDType == LCD_1400x1050) 
+-                              return -1;
++                              return(-1);
++                      if((sisbios_mode[myindex].yres == 768) ||
++                         (sisbios_mode[myindex].yres == 960)) {
++                              if(sishw_ext.ulCRT2LCDType == LCD_1400x1050)
++                                      return(-1);
++                      }
++                      if(sisbios_mode[myindex].yres == 768) {
++                              if(sishw_ext.ulCRT2LCDType == LCD_1280x960)
++                                      return(-1);
+                       }
+                       break;
+               case 1400:
+-                      if(sisbios_mode[myindex].yres != 1050) return -1;
++                      if(sisbios_mode[myindex].yres != 1050) return(-1);
+                       break;
+               case 1600:
+-                      if(sisbios_mode[myindex].yres != 1200) return -1;
++                      if(sisbios_mode[myindex].yres != 1200) return(-1);
+                       break;
+               default:
+-                      return -1;              
++                      return(-1);
+          }
+       }
+       break;
+-     case DISPTYPE_TV:
++     case CRT2_TV:
+       switch (sisbios_mode[myindex].xres) {
+       case 512:
++              if(vbflags & VB_CHRONTEL) return(-1);
++              if((vbflags & VB_SISBRIDGE) && (vbflags & TV_NTSC))
++                      return(-1);
++              /* fall through */
+       case 640:
+       case 800:
+               break;
+       case 720:
+-              if (ivideo.TV_type == TVMODE_NTSC) {
++              if(vbflags & VB_CHRONTEL) return -1;
++              if(vbflags & TV_NTSC) {
+                       if (sisbios_mode[myindex].yres != 480) {
+                               return(-1);
+                       }
+-              } else if (ivideo.TV_type == TVMODE_PAL) {
++              } else if(vbflags & TV_PAL) {
+                       if (sisbios_mode[myindex].yres != 576) {
+                               return(-1);
+                       }
+               }
+-              /* TW: LVDS/CHRONTEL does not support 720 */
+-              if (ivideo.hasVB == HASVB_LVDS_CHRONTEL ||
+-                                      ivideo.hasVB == HASVB_CHRONTEL) {
+-                              return(-1);
+-              }
+               break;
+       case 1024:
+-              if (ivideo.TV_type == TVMODE_NTSC) {
+-                      if(sisbios_mode[myindex].bpp == 32) {
+-                             return(-1);
+-                      }
+-              }
+-              /* TW: LVDS/CHRONTEL only supports < 800 (1024 on 650/Ch7019)*/
+-              if (ivideo.hasVB == HASVB_LVDS_CHRONTEL ||
+-                                      ivideo.hasVB == HASVB_CHRONTEL) {
+-                  if(ivideo.chip < SIS_315H) {
++              if(vbflags & VB_301) return(-1);
++              if(vbflags & VB_CHRONTEL) {
++                      if(ivideo.chip < SIS_315H) {
+                               return(-1);
+-                  }
++                      }
+               }
+               break;
+       default:
+               return(-1);
+       }
+       break;
+-     case DISPTYPE_CRT2:      
+-        if(sisbios_mode[myindex].xres > 1280) return -1;
++     case CRT2_VGA:   
++        if(sisbios_mode[myindex].xres > 1600) return(-1);
++      if(!(vbflags & (VB_301B|VB_302B))) {
++         if(sisbios_mode[myindex].xres > 1400) return(-1);
++      }
+       break;  
+      }
+      return(myindex);
+@@ -456,12 +723,17 @@ static void sisfb_search_crt2type(const 
+               if (!strcmp(name, sis_crt2type[i].name)) {
+                       sisfb_crt2type = sis_crt2type[i].type_no;
+                       sisfb_tvplug = sis_crt2type[i].tvplug_no;
++                      sisfb_dstn = (sis_crt2type[i].flags & FL_550_DSTN) ? 1 : 0;
++                      sisfb_fstn = (sis_crt2type[i].flags & FL_550_FSTN) ? 1 : 0;
+                       break;
+               }
+               i++;
+       }
+       if(sisfb_crt2type < 0)
+-              printk(KERN_INFO "sisfb: Invalid CRT2 type: %s\n", name);
++              printk(KERN_ERR "sisfb: Invalid CRT2 type: %s\n", name);
++        if(ivideo.chip != SIS_550) {
++         sisfb_dstn = sisfb_fstn = 0;
++      }
+ }
+ static void sisfb_search_queuemode(const char *name)
+@@ -479,16 +751,16 @@ static void sisfb_search_queuemode(const
+               i++;
+       }
+       if (sisfb_queuemode < 0)
+-              printk(KERN_INFO "sisfb: Invalid queuemode type: %s\n", name);
++              printk(KERN_ERR "sisfb: Invalid queuemode type: %s\n", name);
+ }
+-static u8 sisfb_search_refresh_rate(unsigned int rate)
++static u8 sisfb_search_refresh_rate(unsigned int rate, int mode_idx)
+ {
+       u16 xres, yres;
+       int i = 0;
+-      xres = sisbios_mode[sisfb_mode_idx].xres;
+-      yres = sisbios_mode[sisfb_mode_idx].yres;
++      xres = sisbios_mode[mode_idx].xres;
++      yres = sisbios_mode[mode_idx].yres;
+       sisfb_rate_idx = 0;
+       while ((sisfb_vrate[i].idx != 0) && (sisfb_vrate[i].xres <= xres)) {
+@@ -537,7 +809,7 @@ static void sisfb_search_tvstd(const cha
+       while (sis_tvtype[i].type_no != -1) {
+               if (!strcmp(name, sis_tvtype[i].name)) {
+-                      sisfb_tvmode = sis_tvtype[i].type_no;
++                      ivideo.vbflags |= sis_tvtype[i].type_no;
+                       break;
+               }
+               i++;
+@@ -546,13 +818,13 @@ static void sisfb_search_tvstd(const cha
+ static BOOLEAN sisfb_bridgeisslave(void)
+ {
+-   unsigned char usScratchP1_00;
++   unsigned char P1_00;
+-   if(ivideo.hasVB == HASVB_NONE) return FALSE;
++   if(!(ivideo.vbflags & VB_VIDEOBRIDGE)) return FALSE;
+-   inSISIDXREG(SISPART1,0x00,usScratchP1_00);
+-   if( ((sisvga_engine == SIS_300_VGA) && (usScratchP1_00 & 0xa0) == 0x20) ||
+-       ((sisvga_engine == SIS_315_VGA) && (usScratchP1_00 & 0x50) == 0x10) ) {
++   inSISIDXREG(SISPART1,0x00,P1_00);
++   if( ((sisvga_engine == SIS_300_VGA) && (P1_00 & 0xa0) == 0x20) ||
++       ((sisvga_engine == SIS_315_VGA) && (P1_00 & 0x50) == 0x10) ) {
+          return TRUE;
+    } else {
+            return FALSE;
+@@ -597,7 +869,7 @@ static BOOLEAN sisfbcheckvretracecrt2(vo
+ static BOOLEAN sisfb_CheckVBRetrace(void) 
+ {
+-   if(ivideo.disp_state & DISPTYPE_DISP2) {
++   if(ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
+       if(sisfb_bridgeisslave()) {
+          return(sisfbcheckvretracecrt1());
+       } else {
+@@ -607,60 +879,195 @@ static BOOLEAN sisfb_CheckVBRetrace(void
+    return(sisfbcheckvretracecrt1());
+ }
++static int sisfb_myblank(int blank)
++{
++   u8 sr01, sr11, sr1f, cr63=0, p2_0, p1_13;
++   BOOLEAN backlight = TRUE;
++
++   switch(blank) {
++   case 0:    /* on */
++      sr01  = 0x00;
++      sr11  = 0x00;
++      sr1f  = 0x00;
++      cr63  = 0x00;
++      p2_0  = 0x20;
++      p1_13 = 0x00;
++      backlight = TRUE;
++      break;
++   case 1:    /* blank */
++      sr01  = 0x20;
++      sr11  = 0x00;
++      sr1f  = 0x00;
++      cr63  = 0x00;
++      p2_0  = 0x20;
++      p1_13 = 0x00;
++      backlight = TRUE;
++      break;
++   case 2:    /* no vsync */
++      sr01  = 0x20;
++      sr11  = 0x08;
++      sr1f  = 0x80;
++      cr63  = 0x40;
++      p2_0  = 0x40;
++      p1_13 = 0x80;
++      backlight = FALSE;
++      break;
++   case 3:    /* no hsync */
++      sr01  = 0x20;
++      sr11  = 0x08;
++      sr1f  = 0x40;
++      cr63  = 0x40;
++      p2_0  = 0x80;
++      p1_13 = 0x40;
++      backlight = FALSE;
++      break;
++   case 4:    /* off */
++      sr01  = 0x20;
++      sr11  = 0x08;
++      sr1f  = 0xc0;
++      cr63  = 0x40;
++      p2_0  = 0xc0;
++      p1_13 = 0xc0;
++      backlight = FALSE;
++      break;
++   default:
++      return 1;
++   }
++
++   if(ivideo.currentvbflags & VB_DISPTYPE_CRT1) {
++
++      setSISIDXREG(SISSR, 0x01, ~0x20, sr01);
++
++      if( (!sisfb_thismonitor.datavalid) ||
++          ((sisfb_thismonitor.datavalid) &&
++           (sisfb_thismonitor.feature & 0xe0))) {
++
++       if(sisvga_engine == SIS_315_VGA) {
++          setSISIDXREG(SISCR, 0x63, 0xbf, cr63);
++       }
++
++       setSISIDXREG(SISSR, 0x1f, 0x3f, sr1f);
++      }
++
++   }
++
++   if(ivideo.currentvbflags & CRT2_LCD) {
++
++      if(ivideo.vbflags & (VB_301LV|VB_302LV)) {
++       if(backlight) {
++          SiS_SiS30xBLOn(&SiS_Pr, &sishw_ext);
++       } else {
++          SiS_SiS30xBLOff(&SiS_Pr, &sishw_ext);
++       }
++      } else if(sisvga_engine == SIS_315_VGA) {
++       if(ivideo.vbflags & VB_CHRONTEL) {
++          if(backlight) {
++             SiS_Chrontel701xBLOn(&SiS_Pr,&sishw_ext);
++          } else {
++             SiS_Chrontel701xBLOff(&SiS_Pr);
++          }
++       }
++      }
++
++      if(((sisvga_engine == SIS_300_VGA) &&
++          (ivideo.vbflags & (VB_301|VB_30xBDH|VB_LVDS))) ||
++         ((sisvga_engine == SIS_315_VGA) &&
++          ((ivideo.vbflags & (VB_LVDS | VB_CHRONTEL)) == VB_LVDS))) {
++          setSISIDXREG(SISSR, 0x11, ~0x0c, sr11);
++      }
++
++      if(sisvga_engine == SIS_300_VGA) {
++         if((ivideo.vbflags & (VB_301B|VB_302B)) &&
++            (!(ivideo.vbflags & VB_30xBDH))) {
++          setSISIDXREG(SISPART1, 0x13, 0x3f, p1_13);
++       }
++      } else if(sisvga_engine == SIS_315_VGA) {
++         if((ivideo.vbflags & (VB_301B|VB_302B)) &&
++            (!(ivideo.vbflags & VB_30xBDH))) {
++          setSISIDXREG(SISPART2, 0x00, 0x1f, p2_0);
++       }
++      }
++
++   } else if(ivideo.currentvbflags & CRT2_VGA) {
++
++      if(ivideo.vbflags & (VB_301B|VB_302B)) {
++         setSISIDXREG(SISPART2, 0x00, 0x1f, p2_0);
++      }
++
++   }
++
++   return(0);
++}
++
+ /* ----------- FBDev related routines for all series ----------- */
++static void sisfb_set_vparms(void)
++{
++   switch(ivideo.video_bpp) {
++   case 8:
++              ivideo.DstColor = 0x0000;
++      ivideo.SiS310_AccelDepth = 0x00000000;
++      ivideo.video_cmap_len = 256;
++              break;
++   case 16:
++              ivideo.DstColor = 0x8000;
++              ivideo.SiS310_AccelDepth = 0x00010000;
++      ivideo.video_cmap_len = 16;
++              break;
++   case 32:
++              ivideo.DstColor = 0xC000;
++      ivideo.SiS310_AccelDepth = 0x00020000;
++      ivideo.video_cmap_len = 16;
++              break;
++   default:
++      ivideo.video_cmap_len = 16;
++      printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo.video_bpp);
++      ivideo.accel = 0;
++      break;
++   }
++}
++
+ static int sisfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
+                     struct fb_info *info)
+ {
+-      unsigned int htotal =
+-              var->left_margin + var->xres + var->right_margin +
+-              var->hsync_len;
+-      unsigned int vtotal = 0; 
++      unsigned int htotal = 0, vtotal = 0; 
+       double drate = 0, hrate = 0;
+       int found_mode = 0;
+       int old_mode;
+-      unsigned char reg;
++      u32 pixclock;
+-      TWDEBUG("Inside do_set_var");
+-      
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)        
+-      inSISIDXREG(SISCR,0x34,reg);
+-      if(reg & 0x80) {
+-         printk(KERN_INFO "sisfb: Cannot change display mode, X server is active\n");
+-         return -EBUSY;
+-      }
+-#endif        
++      htotal = var->left_margin + var->xres + var->right_margin + var->hsync_len;
++
++      vtotal = var->upper_margin + var->lower_margin + var->vsync_len;
++
++      pixclock = var->pixclock;
+       if((var->vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED) {
+-              vtotal = var->upper_margin + var->yres + var->lower_margin +
+-                       var->vsync_len;
++              vtotal += var->yres;
+               vtotal <<= 1;
+       } else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+-              vtotal = var->upper_margin + var->yres + var->lower_margin +
+-                       var->vsync_len;
++              vtotal += var->yres;
+               vtotal <<= 2;
+       } else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+-              vtotal = var->upper_margin + (var->yres/2) + var->lower_margin +
+-                       var->vsync_len; 
+-      } else  vtotal = var->upper_margin + var->yres + var->lower_margin +
+-                       var->vsync_len;
++              vtotal += var->yres;
++              vtotal <<= 1;
++      } else  vtotal += var->yres;
+       if(!(htotal) || !(vtotal)) {
+               DPRINTK("sisfb: Invalid 'var' information\n");
+               return -EINVAL;
+       }
+-      if(var->pixclock && htotal && vtotal) {
+-         drate = 1E12 / var->pixclock;
++      if(pixclock && htotal && vtotal) {
++         drate = 1E12 / pixclock;
+          hrate = drate / htotal;
+          ivideo.refresh_rate = (unsigned int) (hrate / vtotal * 2 + 0.5);
+       } else ivideo.refresh_rate = 60;
+-      /* TW: Calculation wrong for 1024x600 - force it to 60Hz */
+-      if((var->xres == 1024) && (var->yres == 600)) ivideo.refresh_rate = 60;
+-
++#if 0
+       printk(KERN_DEBUG "sisfb: Change mode to %dx%dx%d-%dHz\n",
+               var->xres,var->yres,var->bits_per_pixel,ivideo.refresh_rate);
++#endif                
+       old_mode = sisfb_mode_idx;
+       sisfb_mode_idx = 0;
+@@ -678,7 +1085,7 @@ static int sisfb_do_set_var(struct fb_va
+       }
+       if(found_mode)
+-              sisfb_mode_idx = sisfb_validate_mode(sisfb_mode_idx);
++              sisfb_mode_idx = sisfb_validate_mode(sisfb_mode_idx, ivideo.currentvbflags);
+       else
+               sisfb_mode_idx = -1;
+@@ -689,12 +1096,21 @@ static int sisfb_do_set_var(struct fb_va
+               return -EINVAL;
+       }
+-      if(sisfb_search_refresh_rate(ivideo.refresh_rate) == 0) {
++      if(sisfb_search_refresh_rate(ivideo.refresh_rate, sisfb_mode_idx) == 0) {
+               sisfb_rate_idx = sisbios_mode[sisfb_mode_idx].rate_idx;
+               ivideo.refresh_rate = 60;
+       }
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++      if(sisfb_thismonitor.datavalid) {
++         if(!sisfb_verify_rate(&sisfb_thismonitor, sisfb_mode_idx,
++                               sisfb_rate_idx, ivideo.refresh_rate)) {
++            printk(KERN_INFO "sisfb: WARNING: Refresh rate exceeds monitor specs!\n");
++         }
++      }
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+       if(((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) && isactive) {
+ #else
+       if(isactive) {
+@@ -707,15 +1123,7 @@ static int sisfb_do_set_var(struct fb_va
+               }
+               outSISIDXREG(SISSR, IND_SIS_PASSWORD, SIS_PASSWORD);
+-
+-              sisfb_post_setmode();
+-
+-              DPRINTK("sisfb: Set new mode: %dx%dx%d-%d \n",
+-                      sisbios_mode[sisfb_mode_idx].xres,
+-                      sisbios_mode[sisfb_mode_idx].yres,
+-                      sisbios_mode[sisfb_mode_idx].bpp,
+-                      ivideo.refresh_rate);
+-
++              
+               ivideo.video_bpp = sisbios_mode[sisfb_mode_idx].bpp;
+               ivideo.video_vwidth = ivideo.video_width = sisbios_mode[sisfb_mode_idx].xres;
+               ivideo.video_vheight = ivideo.video_height = sisbios_mode[sisfb_mode_idx].yres;
+@@ -725,54 +1133,39 @@ static int sisfb_do_set_var(struct fb_va
+               if(sisfb_accel) {
+                  ivideo.accel = (var->accel_flags & FB_ACCELF_TEXT) ? -1 : 0;
+               }
+-              switch(ivideo.video_bpp) {
+-              case 8:
+-                      ivideo.DstColor = 0x0000;
+-                      ivideo.SiS310_AccelDepth = 0x00000000;
+-                      ivideo.video_cmap_len = 256;
+-                      break;
+-              case 16:
+-                      ivideo.DstColor = 0x8000;
+-                      ivideo.SiS310_AccelDepth = 0x00010000;
+-                      ivideo.video_cmap_len = 16;
+-                      break;
+-              case 32:
+-                      ivideo.DstColor = 0xC000;
+-                      ivideo.SiS310_AccelDepth = 0x00020000;
+-                      ivideo.video_cmap_len = 16;
+-                      break;
+-              default:
+-                      ivideo.video_cmap_len = 16;
+-                      printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo.video_bpp);
+-                      ivideo.accel = 0;
+-                      break;
+-              }
++
++              sisfb_set_vparms();
++              
++              ivideo.current_width = ivideo.video_width;
++              ivideo.current_height = ivideo.video_height;
++              ivideo.current_bpp = ivideo.video_bpp;
++              ivideo.current_htotal = htotal;
++              ivideo.current_vtotal = vtotal;
++              ivideo.current_pixclock = var->pixclock;
++              ivideo.current_refresh_rate = ivideo.refresh_rate;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++                sisfb_lastrates[sisfb_mode_no] = ivideo.refresh_rate;
++#endif
++              
++              sisfb_post_setmode();
+       }
+-      TWDEBUG("End of do_set_var");
+       return 0;
+ }
+-#ifdef SISFB_PAN
+ static int sisfb_pan_var(struct fb_var_screeninfo *var)
+ {
+       unsigned int base;
+-      TWDEBUG("Inside pan_var");
+-      
+       if (var->xoffset > (var->xres_virtual - var->xres)) {
+-              printk(KERN_INFO "Pan: xo: %d xv %d xr %d\n",
+-                      var->xoffset, var->xres_virtual, var->xres);
+               return -EINVAL;
+       }
+       if(var->yoffset > (var->yres_virtual - var->yres)) {
+-              printk(KERN_INFO "Pan: yo: %d yv %d yr %d\n",
+-                      var->yoffset, var->yres_virtual, var->yres);
+               return -EINVAL;
+-      }
+-
+-        base = var->yoffset * var->xres_virtual + var->xoffset;
+-
++      }       
++              
++      base = var->yoffset * var->xres_virtual + var->xoffset;
++              
+         /* calculate base bpp dep. */
+         switch(var->bits_per_pixel) {
+         case 16:
+@@ -794,7 +1187,7 @@ static int sisfb_pan_var(struct fb_var_s
+       if(sisvga_engine == SIS_315_VGA) {
+               setSISIDXREG(SISSR, 0x37, 0xFE, (base >> 24) & 0x01);
+       }
+-        if(ivideo.disp_state & DISPTYPE_DISP2) {
++        if(ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
+               orSISIDXREG(SISPART1, sisfb_CRT2_write_enable, 0x01);
+               outSISIDXREG(SISPART1, 0x06, (base & 0xFF));
+               outSISIDXREG(SISPART1, 0x05, ((base >> 8) & 0xFF));
+@@ -803,10 +1196,8 @@ static int sisfb_pan_var(struct fb_var_s
+                       setSISIDXREG(SISPART1, 0x02, 0x7F, ((base >> 24) & 0x01) << 7);
+               }
+         }
+-      TWDEBUG("End of pan_var");
+       return 0;
+ }
+-#endif
+ static void sisfb_bpp_to_var(struct fb_var_screeninfo *var)
+ {
+@@ -843,22 +1234,24 @@ static void sisfb_bpp_to_var(struct fb_v
+ void sis_dispinfo(struct ap_data *rec)
+ {
+-      rec->minfo.bpp    = ivideo.video_bpp;
+-      rec->minfo.xres   = ivideo.video_width;
+-      rec->minfo.yres   = ivideo.video_height;
+-      rec->minfo.v_xres = ivideo.video_vwidth;
+-      rec->minfo.v_yres = ivideo.video_vheight;
+-      rec->minfo.org_x  = ivideo.org_x;
+-      rec->minfo.org_y  = ivideo.org_y;
+-      rec->minfo.vrate  = ivideo.refresh_rate;
+-      rec->iobase       = ivideo.vga_base - 0x30;
+-      rec->mem_size     = ivideo.video_size;
+-      rec->disp_state   = ivideo.disp_state; 
+-      rec->version      = (VER_MAJOR << 24) | (VER_MINOR << 16) | VER_LEVEL; 
+-      rec->hasVB        = ivideo.hasVB; 
+-      rec->TV_type      = ivideo.TV_type; 
+-      rec->TV_plug      = ivideo.TV_plug; 
+-      rec->chip         = ivideo.chip;
++      rec->minfo.bpp      = ivideo.video_bpp;
++      rec->minfo.xres     = ivideo.video_width;
++      rec->minfo.yres     = ivideo.video_height;
++      rec->minfo.v_xres   = ivideo.video_vwidth;
++      rec->minfo.v_yres   = ivideo.video_vheight;
++      rec->minfo.org_x    = ivideo.org_x;
++      rec->minfo.org_y    = ivideo.org_y;
++      rec->minfo.vrate    = ivideo.refresh_rate;
++      rec->iobase         = ivideo.vga_base - 0x30;
++      rec->mem_size       = ivideo.video_size;
++      rec->disp_state     = ivideo.disp_state; 
++      rec->version        = (VER_MAJOR << 24) | (VER_MINOR << 16) | VER_LEVEL; 
++      rec->hasVB          = ivideo.hasVB;
++      rec->TV_type        = ivideo.TV_type; 
++      rec->TV_plug        = ivideo.TV_plug; 
++      rec->chip           = ivideo.chip;
++      rec->vbflags        = ivideo.vbflags;
++      rec->currentvbflags = ivideo.currentvbflags;
+ }
+ /* ------------ FBDev related routines for 2.4 series ----------- */
+@@ -873,7 +1266,6 @@ static void sisfb_crtc_to_var(struct fb_
+       int A, B, C, D, E, F, temp;
+       double hrate, drate;
+-      TWDEBUG("Inside crtc_to_var");
+       inSISIDXREG(SISSR, IND_SIS_COLOR_MODE, sr_data);
+       if (sr_data & SIS_INTERLACED_MODE)
+@@ -921,6 +1313,8 @@ static void sisfb_crtc_to_var(struct fb_
+       inSISIDXREG(SISCR, 0x09, cr_data3);
++      if(cr_data3 & 0x80) var->vmode = FB_VMODE_DOUBLE;
++
+       VBS = (cr_data & 0xff) | ((u16) (cr_data2 & 0x08) << 5) |
+             ((u16) (cr_data3 & 0x20) << 4) | ((u16) (sr_data & 0x04) << 8);
+@@ -939,26 +1333,22 @@ static void sisfb_crtc_to_var(struct fb_
+       D = B - F - C;
+         var->yres = E;
+-#ifndef SISFB_PAN
+-      var->yres_virtual = E;
+-#endif
+-      /* TW: We have to report the physical dimension to the console! */
++      var->upper_margin = D;
++      var->lower_margin = F;
++      var->vsync_len = C;
++
+       if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+               var->yres <<= 1;
+-#ifndef SISFB_PAN
+-              var->yres_virtual <<= 1;
+-#endif
++              var->upper_margin <<= 1;
++              var->lower_margin <<= 1;
++              var->vsync_len <<= 1;
+       } else if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+               var->yres >>= 1;
+-#ifndef SISFB_PAN
+-              var->yres_virtual >>= 1;
+-#endif
++              var->upper_margin >>= 1;
++              var->lower_margin >>= 1;
++              var->vsync_len >>= 1;
+       }
+-      var->upper_margin = D;
+-      var->lower_margin = F;
+-      var->vsync_len = C;
+-
+       inSISIDXREG(SISSR, 0x0b, sr_data);
+       inSISIDXREG(SISCR, 0x00, cr_data);
+@@ -999,10 +1389,20 @@ static void sisfb_crtc_to_var(struct fb_
+       D = B - F - C;
+       var->xres = var->xres_virtual = E * 8;
+-      var->left_margin = D * 8;
+-      var->right_margin = F * 8;
+-      var->hsync_len = C * 8;
++      if((var->xres == 320) &&
++         (var->yres == 200 || var->yres == 240)) {
++              /* Terrible hack, but the correct CRTC data for
++               * these modes only produces a black screen...
++               */
++                      var->left_margin = (400 - 376);
++                      var->right_margin = (328 - 320);
++                      var->hsync_len = (376 - 328);
++      } else {
++              var->left_margin = D * 8;
++              var->right_margin = F * 8;
++              var->hsync_len = C * 8;
++      }
+       var->activate = FB_ACTIVATE_NOW;
+       var->sync = 0;
+@@ -1022,21 +1422,21 @@ static void sisfb_crtc_to_var(struct fb_
+       VT <<= 1;
+       HT = (HT + 5) * 8;
++      if ((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
++              VT <<= 1;
++      }
+       hrate = (double) ivideo.refresh_rate * (double) VT / 2;
+       drate = hrate * HT;
+       var->pixclock = (u32) (1E12 / drate);
+-#ifdef SISFB_PAN
+       if(sisfb_ypan) {
+           var->yres_virtual = ivideo.heapstart / (var->xres * (var->bits_per_pixel >> 3));
+           if(var->yres_virtual <= var->yres) {
+               var->yres_virtual = var->yres;
+           }
+       } else
+-#endif
+-         var->yres_virtual = var->yres;
++          var->yres_virtual = var->yres;
+-        TWDEBUG("end of crtc_to_var");
+ }
+ static int sis_getcolreg(unsigned regno, unsigned *red, unsigned *green, unsigned *blue,
+@@ -1069,7 +1469,7 @@ static int sisfb_setcolreg(unsigned regn
+               outSISREG(SISDACD, (red >> 10));
+               outSISREG(SISDACD, (green >> 10));
+               outSISREG(SISDACD, (blue >> 10));
+-              if (ivideo.disp_state & DISPTYPE_DISP2) {
++              if (ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
+                       outSISREG(SISDAC2A, regno);
+                       outSISREG(SISDAC2D, (red >> 8));
+                       outSISREG(SISDAC2D, (green >> 8));
+@@ -1118,7 +1518,7 @@ static void sisfb_set_disp(int con, stru
+       display->ywrapstep = fix.ywrapstep;
+       display->line_length = fix.line_length;
+       display->next_line = fix.line_length;
+-      display->can_soft_blank = 0;
++      display->can_soft_blank = 1;
+       display->inverse = sisfb_inverse;
+       display->var = *var;
+@@ -1162,17 +1562,12 @@ static void sisfb_set_disp(int con, stru
+       display->dispsw = &sisfb_sw;
+       restore_flags(flags);
+-#ifdef SISFB_PAN
+-        if((ivideo.accel) && (sisfb_ypan)) {
+-          /* display->scrollmode = SCROLL_YPAN; - not defined */
++        if(sisfb_ypan) {
++          /* display->scrollmode = 0;  */
+       } else {
+           display->scrollmode = SCROLL_YREDRAW;
+           sisfb_sw.bmove = fbcon_redraw_bmove;
+       }
+-#else
+-      display->scrollmode = SCROLL_YREDRAW;
+-      sisfb_sw.bmove = fbcon_redraw_bmove;
+-#endif
+ }
+ static void sisfb_do_install_cmap(int con, struct fb_info *info)
+@@ -1191,17 +1586,16 @@ static void sisfb_do_install_cmap(int co
+ static int sisfb_get_var(struct fb_var_screeninfo *var, int con,
+                        struct fb_info *info)
+ {
+-      TWDEBUG("inside get_var");
+       if(con == -1)
+               memcpy(var, &default_var, sizeof(struct fb_var_screeninfo));
+       else
+               *var = fb_display[con].var;
+-      /* For FSTN, DSTN */
+-      if (var->xres == 320 && var->yres == 480)
++      if(sisfb_fstn) {
++         if (var->xres == 320 && var->yres == 480)
+               var->yres = 240;
+-              
+-      TWDEBUG("end of get_var");
++        }
++
+       return 0;
+ }
+@@ -1211,8 +1605,6 @@ static int sisfb_set_var(struct fb_var_s
+       int err;
+       unsigned int cols, rows;
+-      TWDEBUG("inside set_var");
+-
+       fb_display[con].var.activate = FB_ACTIVATE_NOW;
+         if(sisfb_do_set_var(var, con == currcon, info)) {
+               sisfb_crtc_to_var(var);
+@@ -1233,16 +1625,17 @@ static int sisfb_set_var(struct fb_var_s
+       cols = sisbios_mode[sisfb_mode_idx].cols;
+       rows = sisbios_mode[sisfb_mode_idx].rows;
+-      vc_resize_con(rows, cols, fb_display[con].conp->vc_num);
++#if 0
++      /* Why was this called here? */
++      vc_resize_con(rows, cols, fb_display[con].conp->vc_num); 
++#endif        
+-      TWDEBUG("end of set_var");
+       return 0;
+ }
+ static int sisfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+                         struct fb_info *info)
+ {
+-      TWDEBUG("inside get_cmap");
+         if (con == currcon)
+               return fb_get_cmap(cmap, kspc, sis_getcolreg, info);
+@@ -1251,7 +1644,6 @@ static int sisfb_get_cmap(struct fb_cmap
+       else
+               fb_copy_cmap(fb_default_cmap(ivideo.video_cmap_len), cmap, kspc ? 0 : 2);
+-      TWDEBUG("end of get_cmap");
+       return 0;
+ }
+@@ -1260,7 +1652,6 @@ static int sisfb_set_cmap(struct fb_cmap
+ {
+       int err;
+-      TWDEBUG("inside set_cmap");
+       if (!fb_display[con].cmap.len) {
+               err = fb_alloc_cmap(&fb_display[con].cmap, ivideo.video_cmap_len, 0);
+               if (err)
+@@ -1272,17 +1663,15 @@ static int sisfb_set_cmap(struct fb_cmap
+       else
+               fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+-      TWDEBUG("end of set_cmap");
++
+       return 0;
+ }
+-#ifdef SISFB_PAN
+ static int sisfb_pan_display(struct fb_var_screeninfo *var, int con,
+                            struct fb_info* info)
+ {
+       int err;
+-      
+-      TWDEBUG("inside pan_display");
++
+       if (var->vmode & FB_VMODE_YWRAP) {
+               if (var->yoffset < 0 || var->yoffset >= fb_display[con].var.yres_virtual || var->xoffset)
+                       return -EINVAL;
+@@ -1303,10 +1692,8 @@ static int sisfb_pan_display(struct fb_v
+       else
+               fb_display[con].var.vmode &= ~FB_VMODE_YWRAP;
+-      TWDEBUG("end of pan_display");
+       return 0;
+ }
+-#endif
+ static int sisfb_mmap(struct fb_info *info, struct file *file,
+                     struct vm_area_struct *vma)
+@@ -1316,7 +1703,6 @@ static int sisfb_mmap(struct fb_info *in
+       unsigned long off;
+       u32 len, mmio_off;
+-      TWDEBUG("inside mmap");
+       if(vma->vm_pgoff > (~0UL >> PAGE_SHIFT))  return -EINVAL;
+       off = vma->vm_pgoff << PAGE_SHIFT;
+@@ -1355,7 +1741,6 @@ static int sisfb_mmap(struct fb_info *in
+                               vma->vm_page_prot))
+               return -EAGAIN;
+-        TWDEBUG("end of mmap");
+       return 0;
+ }
+@@ -1368,7 +1753,6 @@ static void sis_get_glyph(struct fb_info
+       u8 *gbuf = gly->gmask;
+       int size;
+-      TWDEBUG("Inside get_glyph");
+       gly->fontheight = fontheight(p);
+       gly->fontwidth = fontwidth(p);
+       widthb = (fontwidth(p) + 7) / 8;
+@@ -1382,16 +1766,11 @@ static void sis_get_glyph(struct fb_info
+       size = fontheight(p) * widthb;
+       memcpy(gbuf, cdat, size);
+       gly->ngmask = size;
+-      TWDEBUG("End of get_glyph");
+ }
+ static int sisfb_update_var(int con, struct fb_info *info)
+ {
+-#ifdef SISFB_PAN
+         return(sisfb_pan_var(&fb_display[con].var));
+-#else
+-      return 0;
+-#endif        
+ }
+ static int sisfb_switch(int con, struct fb_info *info)
+@@ -1428,157 +1807,37 @@ static int sisfb_switch(int con, struct 
+ static void sisfb_blank(int blank, struct fb_info *info)
+ {
+-      u8 reg;
++      sisfb_myblank(blank);
++}
++#endif
+-      inSISIDXREG(SISCR, 0x17, reg);
++/* ------------ FBDev related routines for 2.5 series ----------- */
+-      if(blank > 0)
+-              reg &= 0x7f;
+-      else
+-              reg |= 0x80;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-        outSISIDXREG(SISCR, 0x17, reg);               
+-      outSISIDXREG(SISSR, 0x00, 0x01);    /* Synchronous Reset */
+-      outSISIDXREG(SISSR, 0x00, 0x03);    /* End Reset */
+-      printk(KERN_DEBUG "sisfb_blank() called (%d)\n", blank);
++static int sisfb_open(struct fb_info *info, int user)
++{
++    return 0;
+ }
++static int sisfb_release(struct fb_info *info, int user)
++{
++    return 0;
++}
+-static int sisfb_ioctl(struct inode *inode, struct file *file,
+-                     unsigned int cmd, unsigned long arg, int con,
+-                     struct fb_info *info)
++static int sisfb_get_cmap_len(const struct fb_var_screeninfo *var)
+ {
+-      TWDEBUG("inside ioctl");
+-      switch (cmd) {
+-         case FBIO_ALLOC:
+-              if (!capable(CAP_SYS_RAWIO))
+-                      return -EPERM;
+-              sis_malloc((struct sis_memreq *) arg);
+-              break;
+-         case FBIO_FREE:
+-              if (!capable(CAP_SYS_RAWIO))
+-                      return -EPERM;
+-              sis_free(*(unsigned long *) arg);
++      int rc = 16;            
++
++      switch(var->bits_per_pixel) {
++      case 8:
++              rc = 256;       
+               break;
+-         case FBIOGET_GLYPH:
+-                sis_get_glyph(info,(SIS_GLYINFO *) arg);
+-              break;  
+-         case FBIOGET_HWCINFO:
+-              {
+-                      unsigned long *hwc_offset = (unsigned long *) arg;
+-
+-                      if (sisfb_caps & HW_CURSOR_CAP)
+-                              *hwc_offset = sisfb_hwcursor_vbase -
+-                                  (unsigned long) ivideo.video_vbase;
+-                      else
+-                              *hwc_offset = 0;
+-
+-                      break;
+-              }
+-         case FBIOPUT_MODEINFO:
+-              {
+-                      struct mode_info *x = (struct mode_info *)arg;
+-
+-                      ivideo.video_bpp        = x->bpp;
+-                      ivideo.video_width      = x->xres;
+-                      ivideo.video_height     = x->yres;
+-                      ivideo.video_vwidth     = x->v_xres;
+-                      ivideo.video_vheight    = x->v_yres;
+-                      ivideo.org_x            = x->org_x;
+-                      ivideo.org_y            = x->org_y;
+-                      ivideo.refresh_rate     = x->vrate;
+-                      ivideo.video_linelength = ivideo.video_vwidth * (ivideo.video_bpp >> 3);
+-                      switch(ivideo.video_bpp) {
+-                      case 8:
+-                              ivideo.DstColor = 0x0000;
+-                              ivideo.SiS310_AccelDepth = 0x00000000;
+-                              ivideo.video_cmap_len = 256;
+-                              break;
+-                      case 16:
+-                              ivideo.DstColor = 0x8000;
+-                              ivideo.SiS310_AccelDepth = 0x00010000;
+-                              ivideo.video_cmap_len = 16;
+-                              break;
+-                      case 32:
+-                              ivideo.DstColor = 0xC000;
+-                              ivideo.SiS310_AccelDepth = 0x00020000;
+-                              ivideo.video_cmap_len = 16;
+-                              break;
+-                      default:
+-                              ivideo.video_cmap_len = 16;
+-                              printk(KERN_ERR "sisfb: Unsupported depth %d", ivideo.video_bpp);
+-                              ivideo.accel = 0;
+-                              break;
+-                      }
+-
+-                      break;
+-              }
+-         case FBIOGET_DISPINFO:
+-              sis_dispinfo((struct ap_data *)arg);
+-              break;
+-         case SISFB_GET_INFO:  /* TW: New for communication with X driver */
+-              {
+-                      sisfb_info *x = (sisfb_info *)arg;
+-
+-                      x->sisfb_id = SISFB_ID;
+-                      x->sisfb_version = VER_MAJOR;
+-                      x->sisfb_revision = VER_MINOR;
+-                      x->sisfb_patchlevel = VER_LEVEL;
+-                      x->chip_id = ivideo.chip_id;
+-                      x->memory = ivideo.video_size / 1024;
+-                      x->heapstart = ivideo.heapstart / 1024;
+-                      x->fbvidmode = sisfb_mode_no;
+-                      x->sisfb_caps = sisfb_caps;
+-                      x->sisfb_tqlen = 512; /* yet unused */
+-                      x->sisfb_pcibus = ivideo.pcibus;
+-                      x->sisfb_pcislot = ivideo.pcislot;
+-                      x->sisfb_pcifunc = ivideo.pcifunc;
+-                      x->sisfb_lcdpdc = sisfb_detectedpdc;
+-                      x->sisfb_lcda = sisfb_detectedlcda;
+-                      break;
+-              }
+-         case SISFB_GET_VBRSTATUS:
+-              {
+-                      unsigned long *vbrstatus = (unsigned long *) arg;
+-                      if(sisfb_CheckVBRetrace()) *vbrstatus = 1;
+-                      else                       *vbrstatus = 0;
+-              }
+-         default:
+-              return -EINVAL;
+-      }
+-      TWDEBUG("end of ioctl");
+-      return 0;
+-
+-}
+-#endif
+-
+-/* ------------ FBDev related routines for 2.5 series ----------- */
+-
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-
+-static int sisfb_open(struct fb_info *info, int user)
+-{
+-    return 0;
+-}
+-
+-static int sisfb_release(struct fb_info *info, int user)
+-{
+-    return 0;
+-}
+-
+-static int sisfb_get_cmap_len(const struct fb_var_screeninfo *var)
+-{
+-      int rc = 16;            
+-
+-      switch(var->bits_per_pixel) {
+-      case 8:
+-              rc = 256;       
+-              break;
+-      case 16:
+-              rc = 16;        
+-              break;          
+-      case 32:
+-              rc = 16;
++      case 16:
++              rc = 16;        
++              break;          
++      case 32:
++              rc = 16;
+               break;  
+       }
+       return rc;
+@@ -1596,7 +1855,7 @@ static int sisfb_setcolreg(unsigned regn
+               outSISREG(SISDACD, (red >> 10));
+               outSISREG(SISDACD, (green >> 10));
+               outSISREG(SISDACD, (blue >> 10));
+-              if (ivideo.disp_state & DISPTYPE_DISP2) {
++              if (ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
+                       outSISREG(SISDAC2A, regno);
+                       outSISREG(SISDAC2D, (red >> 8));
+                       outSISREG(SISDAC2D, (green >> 8));
+@@ -1622,63 +1881,52 @@ static int sisfb_set_par(struct fb_info 
+ {
+       int err;
+-      TWDEBUG("inside set_par");
+         if((err = sisfb_do_set_var(&info->var, 1, info)))
+               return err;
+       sisfb_get_fix(&info->fix, info->currcon, info);
+-      TWDEBUG("end of set_par");
+       return 0;
+ }
+ static int sisfb_check_var(struct fb_var_screeninfo *var,
+                            struct fb_info *info)
+ {
+-      unsigned int htotal =
+-              var->left_margin + var->xres + var->right_margin +
+-              var->hsync_len;
+-      unsigned int vtotal = 0;
++      unsigned int htotal = 0, vtotal = 0, myrateindex = 0;
+       double drate = 0, hrate = 0;
+       int found_mode = 0;
+       int refresh_rate, search_idx;
++      BOOLEAN recalc_clock = FALSE;
++      u32 pixclock;
++
++      htotal = var->left_margin + var->xres + var->right_margin + var->hsync_len;
+-      TWDEBUG("Inside check_var");
++      vtotal = var->upper_margin + var->lower_margin + var->vsync_len;
++
++      pixclock = var->pixclock;
+       if((var->vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED) {
+-              vtotal = var->upper_margin + var->yres + var->lower_margin +
+-                       var->vsync_len;   
++              vtotal += var->yres;
+               vtotal <<= 1;
+       } else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+-              vtotal = var->upper_margin + var->yres + var->lower_margin +
+-                       var->vsync_len;   
++              vtotal += var->yres;
+               vtotal <<= 2;
+       } else if((var->vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+-              vtotal = var->upper_margin + (var->yres/2) + var->lower_margin +
+-                       var->vsync_len;   
+-      } else  vtotal = var->upper_margin + var->yres + var->lower_margin +
+-                       var->vsync_len;
++              vtotal += var->yres;
++              vtotal <<= 1;
++      } else  vtotal += var->yres;
+       if(!(htotal) || !(vtotal)) {
+               SISFAIL("sisfb: no valid timing data");
+       }
+-      if((var->pixclock) && (htotal)) {
+-         drate = 1E12 / var->pixclock;
+-         hrate = drate / htotal;
+-         refresh_rate = (unsigned int) (hrate / vtotal * 2 + 0.5);
+-      } else refresh_rate = 60;
+-
+-      /* TW: Calculation wrong for 1024x600 - force it to 60Hz */
+-      if((var->xres == 1024) && (var->yres == 600)) refresh_rate = 60;
+-
+       search_idx = 0;
+       while( (sisbios_mode[search_idx].mode_no != 0) &&
+              (sisbios_mode[search_idx].xres <= var->xres) ) {
+               if( (sisbios_mode[search_idx].xres == var->xres) &&
+                   (sisbios_mode[search_idx].yres == var->yres) &&
+                   (sisbios_mode[search_idx].bpp == var->bits_per_pixel)) {
+-                      if(sisfb_validate_mode(search_idx) > 0) {
++                      if(sisfb_validate_mode(search_idx, ivideo.currentvbflags) > 0) {
+                          found_mode = 1;
+                          break;
+                       }
+@@ -1687,38 +1935,95 @@ static int sisfb_check_var(struct fb_var
+       }
+       if(!found_mode) {
+-      
+-              printk(KERN_ERR "sisfb: %dx%dx%d is no valid mode\n", 
+-                      var->xres, var->yres, var->bits_per_pixel);
+-                      
++
+                 search_idx = 0;
+               while(sisbios_mode[search_idx].mode_no != 0) {
+-                     
+                  if( (var->xres <= sisbios_mode[search_idx].xres) &&
+-                     (var->yres <= sisbios_mode[search_idx].yres) && 
++                     (var->yres <= sisbios_mode[search_idx].yres) &&
+                      (var->bits_per_pixel == sisbios_mode[search_idx].bpp) ) {
+-                        if(sisfb_validate_mode(search_idx) > 0) {
++                        if(sisfb_validate_mode(search_idx, ivideo.currentvbflags) > 0) {
+                            found_mode = 1;
+                            break;
+                         }
+                  }
+                  search_idx++;
+-              }                       
++              }
+               if(found_mode) {
++                      printk(KERN_DEBUG "sisfb: Adapted from %dx%dx%d to %dx%dx%d\n",
++                              var->xres, var->yres, var->bits_per_pixel,
++                              sisbios_mode[search_idx].xres,
++                              sisbios_mode[search_idx].yres,
++                              var->bits_per_pixel);
+                       var->xres = sisbios_mode[search_idx].xres;
+                       var->yres = sisbios_mode[search_idx].yres;
+-                      printk(KERN_DEBUG "sisfb: Adapted to mode %dx%dx%d\n",
+-                              var->xres, var->yres, var->bits_per_pixel);
+-                 
++
++
+               } else {
+-                      printk(KERN_ERR "sisfb: Failed to find similar mode to %dx%dx%d\n", 
++                      printk(KERN_ERR "sisfb: Failed to find supported mode near %dx%dx%d\n",
+                               var->xres, var->yres, var->bits_per_pixel);
+                       return -EINVAL;
+               }
+       }
+-      /* TW: TODO: Check the refresh rate */          
+-      
++      if( ((ivideo.vbflags & VB_LVDS) ||                      /* Slave modes on LVDS and 301B-DH */
++           ((ivideo.vbflags & VB_30xBDH) && (ivideo.currentvbflags & CRT2_LCD))) &&
++          (var->bits_per_pixel == 8) ) {
++              refresh_rate = 60;
++              recalc_clock = TRUE;
++      } else if( (ivideo.current_htotal == htotal) &&         /* x=x & y=y & c=c -> assume depth change */
++                 (ivideo.current_vtotal == vtotal) &&
++                 (ivideo.current_pixclock == pixclock) ) {
++              drate = 1E12 / pixclock;
++              hrate = drate / htotal;
++              refresh_rate = (unsigned int) (hrate / vtotal * 2 + 0.5);
++      } else if( ( (ivideo.current_htotal != htotal) ||       /* x!=x | y!=y & c=c -> invalid pixclock */
++                   (ivideo.current_vtotal != vtotal) ) &&
++                 (ivideo.current_pixclock == var->pixclock) ) {
++              if(sisfb_lastrates[sisbios_mode[search_idx].mode_no]) {
++                      refresh_rate = sisfb_lastrates[sisbios_mode[search_idx].mode_no];
++              } else if(sisfb_parm_rate != -1) {
++                      refresh_rate = sisfb_parm_rate;
++              } else {
++                      refresh_rate = 60;
++              }
++              recalc_clock = TRUE;
++      } else if((pixclock) && (htotal) && (vtotal)) {
++              drate = 1E12 / pixclock;
++              hrate = drate / htotal;
++              refresh_rate = (unsigned int) (hrate / vtotal * 2 + 0.5);
++      } else if(ivideo.current_refresh_rate) {
++              refresh_rate = ivideo.current_refresh_rate;
++              recalc_clock = TRUE;
++      } else {
++              refresh_rate = 60;
++              recalc_clock = TRUE;
++      }
++
++      myrateindex = sisfb_search_refresh_rate(refresh_rate, search_idx);
++
++      /* Eventually recalculate timing and clock */
++      if(recalc_clock) {
++         if(!myrateindex) myrateindex = sisbios_mode[search_idx].rate_idx;
++         var->pixclock = (u32) (1E12 / sisfb_mode_rate_to_dclock(&SiS_Pr, &sishw_ext,
++                                              sisbios_mode[search_idx].mode_no, myrateindex));
++         sisfb_mode_rate_to_ddata(&SiS_Pr, &sishw_ext,
++                                      sisbios_mode[search_idx].mode_no, myrateindex,
++                                      &var->left_margin, &var->right_margin,
++                                      &var->upper_margin, &var->lower_margin,
++                                      &var->hsync_len, &var->vsync_len,
++                                      &var->sync, &var->vmode);
++         if((var->vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
++              var->pixclock <<= 1;
++         }
++      }
++
++      if(sisfb_thismonitor.datavalid) {
++         if(!sisfb_verify_rate(&sisfb_thismonitor, search_idx,
++                               myrateindex, refresh_rate)) {
++            printk(KERN_INFO "sisfb: WARNING: Refresh rate exceeds monitor specs!\n");
++         }
++      }
++
+       /* Adapt RGB settings */
+       sisfb_bpp_to_var(var);  
+       
+@@ -1731,18 +2036,20 @@ static int sisfb_check_var(struct fb_var
+       /* Horiz-panning not supported */
+       if(var->xres != var->xres_virtual)
+               var->xres_virtual = var->xres;
+-
+-      if(!sisfb_ypan) {
+-              if(var->yres != var->yres_virtual)
+-                      var->yres_virtual = var->yres;
+-      } else {
++      
++      if(sisfb_ypan) {
+          /* TW: Now patch yres_virtual if we use panning */
+          /* *** May I do this? *** */
+          var->yres_virtual = ivideo.heapstart / (var->xres * (var->bits_per_pixel >> 3));
+-          if(var->yres_virtual <= var->yres) {
++         if(var->yres_virtual <= var->yres) {
+               /* TW: Paranoia check */
+               var->yres_virtual = var->yres;
+-          }
++         }
++      } else {
++         if(var->yres != var->yres_virtual)
++              var->yres_virtual = var->yres;
++         var->xoffset = 0;
++         var->yoffset = 0;
+       }
+       
+       /* Truncate offsets to maximum if too high */
+@@ -1757,28 +2064,25 @@ static int sisfb_check_var(struct fb_var
+           var->green.msb_right =
+           var->blue.msb_right =
+           var->transp.offset = var->transp.length = var->transp.msb_right = 0;                
+-              
+-      TWDEBUG("end of check_var");
++
+       return 0;
+ }
+-#ifdef SISFB_PAN
+ static int sisfb_pan_display(struct fb_var_screeninfo *var,
+                            struct fb_info* info)
+ {
+       int err;
+-      
+-      TWDEBUG("inside pan_display");
+-      
++
+       if (var->xoffset > (var->xres_virtual - var->xres))
+               return -EINVAL;
+       if (var->yoffset > (var->yres_virtual - var->yres))
+               return -EINVAL;
+       if (var->vmode & FB_VMODE_YWRAP) {
+-              if (var->yoffset < 0
+-                  || var->yoffset >= info->var.yres_virtual
+-                  || var->xoffset) return -EINVAL;
++              if (var->yoffset < 0 ||
++                  var->yoffset >= info->var.yres_virtual ||
++                  var->xoffset)
++                      return -EINVAL;
+       } else {
+               if (var->xoffset + info->var.xres > info->var.xres_virtual ||
+                   var->yoffset + info->var.yres > info->var.yres_virtual)
+@@ -1794,10 +2098,8 @@ static int sisfb_pan_display(struct fb_v
+       else
+               info->var.vmode &= ~FB_VMODE_YWRAP;
+-      TWDEBUG("end of pan_display");
+       return 0;
+ }
+-#endif
+ static int sisfb_mmap(struct fb_info *info, struct file *file,
+                     struct vm_area_struct *vma)
+@@ -1806,7 +2108,6 @@ static int sisfb_mmap(struct fb_info *in
+       unsigned long off;
+       u32 len, mmio_off;
+-      TWDEBUG("inside mmap");
+       if(vma->vm_pgoff > (~0UL >> PAGE_SHIFT))  return -EINVAL;
+       off = vma->vm_pgoff << PAGE_SHIFT;
+@@ -1844,139 +2145,141 @@ static int sisfb_mmap(struct fb_info *in
+                               vma->vm_page_prot))
+               return -EAGAIN;
+-        TWDEBUG("end of mmap");
+       return 0;
+ }
+ static int sisfb_blank(int blank, struct fb_info *info)
+ {
+-      u8 reg;
++      return(sisfb_myblank(blank));
++}
+-      inSISIDXREG(SISCR, 0x17, reg);
++#endif
+-      if(blank > 0)
+-              reg &= 0x7f;
+-      else
+-              reg |= 0x80;
++/* ----------- FBDev related routines for all series ---------- */
+-        outSISIDXREG(SISCR, 0x17, reg);               
+-      outSISIDXREG(SISSR, 0x00, 0x01);    /* Synchronous Reset */
+-      outSISIDXREG(SISSR, 0x00, 0x03);    /* End Reset */
+-        return(0);
+-}
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ static int sisfb_ioctl(struct inode *inode, struct file *file,
+-                     unsigned int cmd, unsigned long arg, 
++                     unsigned int cmd, unsigned long arg,
+                      struct fb_info *info)
++#else
++static int sisfb_ioctl(struct inode *inode, struct file *file,
++                     unsigned int cmd, unsigned long arg, int con,
++                     struct fb_info *info)
++#endif
+ {
+-      TWDEBUG("inside ioctl");
++      struct sis_memreq sismemreq;
++      struct ap_data sisapdata;
++      unsigned long sismembase = 0;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++      SIS_GLYINFO sisglyinfo;
++#endif
++
+       switch (cmd) {
+          case FBIO_ALLOC:
+-              if (!capable(CAP_SYS_RAWIO))
++              if(!capable(CAP_SYS_RAWIO))
+                       return -EPERM;
+-              sis_malloc((struct sis_memreq *) arg);
++              if(copy_from_user(&sismemreq, (void *)arg, sizeof(sismemreq)))
++                      return -EFAULT;
++              sis_malloc(&sismemreq);
++              if(copy_to_user((void *)arg, &sismemreq, sizeof(sismemreq))) {
++                      sis_free(sismemreq.offset);
++                      return -EFAULT;
++              }
+               break;
+          case FBIO_FREE:
+-              if (!capable(CAP_SYS_RAWIO))
++              if(!capable(CAP_SYS_RAWIO))
+                       return -EPERM;
+-              sis_free(*(unsigned long *) arg);
++              if(get_user(sismembase, (unsigned long *) arg))
++                      return -EFAULT;
++              sis_free(sismembase);
+               break;
+-         case FBIOGET_HWCINFO:
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++         case FBIOGET_GLYPH:
++              if(copy_from_user(&sisglyinfo, (void *)arg, sizeof(sisglyinfo)))
++                      return -EFAULT;
++                sis_get_glyph(info, &sisglyinfo);
++              break;
++         case FBIOPUT_MODEINFO:
+               {
+-                      unsigned long *hwc_offset = (unsigned long *) arg;
++                      struct mode_info x;
+-                      if (sisfb_caps & HW_CURSOR_CAP)
+-                              *hwc_offset = sisfb_hwcursor_vbase -
+-                                  (unsigned long) ivideo.video_vbase;
+-                      else
+-                              *hwc_offset = 0;
++                      if(copy_from_user(&x, (void *)arg, sizeof(x)))
++                              return -EFAULT;
++                      ivideo.video_bpp        = x.bpp;
++                      ivideo.video_width      = x.xres;
++                      ivideo.video_height     = x.yres;
++                      ivideo.video_vwidth     = x.v_xres;
++                      ivideo.video_vheight    = x.v_yres;
++                      ivideo.org_x            = x.org_x;
++                      ivideo.org_y            = x.org_y;
++                      ivideo.refresh_rate     = x.vrate;
++                      ivideo.video_linelength = ivideo.video_vwidth * (ivideo.video_bpp >> 3);
++                      sisfb_set_vparms();
+                       break;
+               }
+-         case FBIOPUT_MODEINFO:
++#endif
++         case FBIOGET_HWCINFO:
+               {
+-                      struct mode_info *x = (struct mode_info *)arg;
++                      unsigned long myhwcoffset = 0;
+-                      ivideo.video_bpp        = x->bpp;
+-                      ivideo.video_width      = x->xres;
+-                      ivideo.video_height     = x->yres;
+-                      ivideo.video_vwidth     = x->v_xres;
+-                      ivideo.video_vheight    = x->v_yres;
+-                      ivideo.org_x            = x->org_x;
+-                      ivideo.org_y            = x->org_y;
+-                      ivideo.refresh_rate     = x->vrate;
+-                      ivideo.video_linelength = ivideo.video_vwidth * (ivideo.video_bpp >> 3);
+-                      switch(ivideo.video_bpp) {
+-                      case 8:
+-                              ivideo.DstColor = 0x0000;
+-                              ivideo.SiS310_AccelDepth = 0x00000000;
+-                              ivideo.video_cmap_len = 256;
+-                              break;
+-                      case 16:
+-                              ivideo.DstColor = 0x8000;
+-                              ivideo.SiS310_AccelDepth = 0x00010000;
+-                              ivideo.video_cmap_len = 16;
+-                              break;
+-                      case 32:
+-                              ivideo.DstColor = 0xC000;
+-                              ivideo.SiS310_AccelDepth = 0x00020000;
+-                              ivideo.video_cmap_len = 16;
+-                              break;
+-                      default:
+-                              ivideo.video_cmap_len = 16;
+-                              printk(KERN_ERR "sisfb: Unsupported accel depth %d", ivideo.video_bpp);
+-                              ivideo.accel = 0;
+-                              break;
+-                      }
++                      if(sisfb_caps & HW_CURSOR_CAP)
++                              myhwcoffset = sisfb_hwcursor_vbase -
++                                  (unsigned long) ivideo.video_vbase;
++
++                      return put_user(myhwcoffset, (unsigned long *)arg);
+                       break;
+               }
+          case FBIOGET_DISPINFO:
+-              sis_dispinfo((struct ap_data *)arg);
++              sis_dispinfo(&sisapdata);
++              if(copy_to_user((void *)arg, &sisapdata, sizeof(sisapdata)))
++                      return -EFAULT;
+               break;
+-         case SISFB_GET_INFO:  /* TW: New for communication with X driver */
++         case SISFB_GET_INFO:  /* New for communication with X driver */
+               {
+-                      sisfb_info *x = (sisfb_info *)arg;
++                      sisfb_info x;
+-                      x->sisfb_id = SISFB_ID;
+-                      x->sisfb_version = VER_MAJOR;
+-                      x->sisfb_revision = VER_MINOR;
+-                      x->sisfb_patchlevel = VER_LEVEL;
+-                      x->chip_id = ivideo.chip_id;
+-                      x->memory = ivideo.video_size / 1024;
+-                      x->heapstart = ivideo.heapstart / 1024;
+-                      x->fbvidmode = sisfb_mode_no;
+-                      x->sisfb_caps = sisfb_caps;
+-                      x->sisfb_tqlen = 512; /* yet unused */
+-                      x->sisfb_pcibus = ivideo.pcibus;
+-                      x->sisfb_pcislot = ivideo.pcislot;
+-                      x->sisfb_pcifunc = ivideo.pcifunc;
+-                      x->sisfb_lcdpdc = sisfb_detectedpdc;
+-                      x->sisfb_lcda = sisfb_detectedlcda;
++                      x.sisfb_id = SISFB_ID;
++                      x.sisfb_version = VER_MAJOR;
++                      x.sisfb_revision = VER_MINOR;
++                      x.sisfb_patchlevel = VER_LEVEL;
++                      x.chip_id = ivideo.chip_id;
++                      x.memory = ivideo.video_size / 1024;
++                      x.heapstart = ivideo.heapstart / 1024;
++                      x.fbvidmode = sisfb_mode_no;
++                      x.sisfb_caps = sisfb_caps;
++                      x.sisfb_tqlen = 512; /* yet unused */
++                      x.sisfb_pcibus = ivideo.pcibus;
++                      x.sisfb_pcislot = ivideo.pcislot;
++                      x.sisfb_pcifunc = ivideo.pcifunc;
++                      x.sisfb_lcdpdc = sisfb_detectedpdc;
++                      x.sisfb_lcda = sisfb_detectedlcda;
++                      x.sisfb_vbflags = ivideo.vbflags;
++                      x.sisfb_currentvbflags = ivideo.currentvbflags;
++                      if(copy_to_user((void *)arg, &x, sizeof(x)))
++                              return -EFAULT;
+                       break;
+               }
+          case SISFB_GET_VBRSTATUS:
+               {
+-                      unsigned long *vbrstatus = (unsigned long *) arg;
+-                      if(sisfb_CheckVBRetrace()) *vbrstatus = 1;
+-                      else                       *vbrstatus = 0;
++                      if(sisfb_CheckVBRetrace())
++                              return put_user(1UL, (unsigned long *) arg);
++                      else
++                              return put_user(0UL, (unsigned long *) arg);
++                      break;
+               }
+          default:
+               return -EINVAL;
+       }
+-      TWDEBUG("end of ioctl");
+       return 0;
+-
+ }
+-#endif
+-
+-/* ----------- FBDev related routines for all series ---------- */
+ static int sisfb_get_fix(struct fb_fix_screeninfo *fix, int con,
+                        struct fb_info *info)
+ {
+-      TWDEBUG("inside get_fix");
+       memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)        
+@@ -1987,45 +2290,47 @@ static int sisfb_get_fix(struct fb_fix_s
+       fix->smem_start = ivideo.video_base;
+-        /* TW */
+         if((!sisfb_mem) || (sisfb_mem > (ivideo.video_size/1024))) {
+-          if (ivideo.video_size > 0x1000000) {
+-              fix->smem_len = 0xc00000;
+-          } else if (ivideo.video_size > 0x800000)
+-              fix->smem_len = 0x800000;
+-          else
+-              fix->smem_len = 0x400000;
++          if(sisvga_engine == SIS_300_VGA) {
++             if(ivideo.video_size > 0x1000000) {
++                      fix->smem_len = 0xc00000;
++             } else if(ivideo.video_size > 0x800000)
++                      fix->smem_len = 0x800000;
++             else
++                      fix->smem_len = 0x400000;
++            } else {
++              fix->smem_len = ivideo.video_size - 0x100000;
++          }
+         } else
+               fix->smem_len = sisfb_mem * 1024;
+-      fix->type        = video_type;
++      fix->type        = FB_TYPE_PACKED_PIXELS;
+       fix->type_aux    = 0;
+       if(ivideo.video_bpp == 8)
+               fix->visual = FB_VISUAL_PSEUDOCOLOR;
+       else
+               fix->visual = FB_VISUAL_TRUECOLOR;
+       fix->xpanstep    = 0;
+-#ifdef SISFB_PAN
++
+         if(sisfb_ypan)         fix->ypanstep = 1;
+-#endif
++
+       fix->ywrapstep   = 0;
+       fix->line_length = ivideo.video_linelength;
+       fix->mmio_start  = ivideo.mmio_base;
+       fix->mmio_len    = sisfb_mmio_size;
+       if(sisvga_engine == SIS_300_VGA) 
+          fix->accel    = FB_ACCEL_SIS_GLAMOUR;
+-      else if(ivideo.chip == SIS_330)
++      else if((ivideo.chip == SIS_330) || (ivideo.chip == SIS_660))
+          fix->accel    = FB_ACCEL_SIS_XABRE;
+-      else 
++      else
+          fix->accel    = FB_ACCEL_SIS_GLAMOUR_2;
+-      
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)                
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+       fix->reserved[0] = ivideo.video_size & 0xFFFF;
+       fix->reserved[1] = (ivideo.video_size >> 16) & 0xFFFF;
+       fix->reserved[2] = sisfb_caps;
+-#endif        
++#endif
+-      TWDEBUG("end of get_fix");
+       return 0;
+ }
+@@ -2033,17 +2338,15 @@ static int sisfb_get_fix(struct fb_fix_s
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ static struct fb_ops sisfb_ops = {
+-      owner:          THIS_MODULE,
+-      fb_get_fix:     sisfb_get_fix,
+-      fb_get_var:     sisfb_get_var,
+-      fb_set_var:     sisfb_set_var,
+-      fb_get_cmap:    sisfb_get_cmap,
+-      fb_set_cmap:    sisfb_set_cmap,
+-#ifdef SISFB_PAN
+-        fb_pan_display:       sisfb_pan_display,
+-#endif
+-      fb_ioctl:       sisfb_ioctl,
+-      fb_mmap:        sisfb_mmap,
++      .owner          = THIS_MODULE,
++      .fb_get_fix     = sisfb_get_fix,
++      .fb_get_var     = sisfb_get_var,
++      .fb_set_var     = sisfb_set_var,
++      .fb_get_cmap    = sisfb_get_cmap,
++      .fb_set_cmap    = sisfb_set_cmap,
++        .fb_pan_display = sisfb_pan_display,
++      .fb_ioctl       = sisfb_ioctl,
++      .fb_mmap        = sisfb_mmap,
+ };
+ #endif
+@@ -2056,9 +2359,7 @@ static struct fb_ops sisfb_ops = {
+       .fb_check_var = sisfb_check_var,
+       .fb_set_par   = sisfb_set_par,
+       .fb_setcolreg = sisfb_setcolreg,
+-#ifdef SISFB_PAN
+         .fb_pan_display = sisfb_pan_display,
+-#endif        
+         .fb_blank     = sisfb_blank,
+       .fb_fillrect  = fbcon_sis_fillrect,
+       .fb_copyarea  = fbcon_sis_copyarea,
+@@ -2106,12 +2407,12 @@ static int sisfb_get_dram_size_300(void)
+       } else {                /* 540, 630, 730 */
+               pdev = pci_find_device(PCI_VENDOR_ID_SI, nbridge_id, pdev);
+-              if (pdev) {
++              if (pdev) { 
+                       pci_read_config_byte(pdev, IND_BRI_DRAM_STATUS, &pci_data);
+                       pci_data = (pci_data & BRI_DRAM_SIZE_MASK) >> 4;
+                       ivideo.video_size = (unsigned int)(1 << (pci_data+21));
+                       pdev_valid = 1;
+-
++      
+                       reg = SIS_DATA_BUS_64 << 6;
+                       switch (pci_data) {
+                          case BRI_DRAM_SIZE_2MB:
+@@ -2134,174 +2435,13 @@ static int sisfb_get_dram_size_300(void)
+                               break;
+                       }
+                       outSISIDXREG(SISSR, IND_SIS_DRAM_SIZE, reg);
+-              }
++              }   
+       
+               if (!pdev_valid)  return -1;
+       }
+       return 0;
+ }
+-static void sisfb_detect_VB_connect_300()
+-{
+-      u8 sr16, sr17, cr32, temp;
+-
+-      ivideo.TV_plug = ivideo.TV_type = 0;
+-
+-        switch(ivideo.hasVB) {
+-        case HASVB_LVDS_CHRONTEL:
+-        case HASVB_CHRONTEL:
+-           SiS_SenseCh();
+-           break;
+-        case HASVB_301:
+-        case HASVB_302:
+-           SiS_Sense30x();
+-           break;
+-      }
+-
+-      inSISIDXREG(SISSR, IND_SIS_SCRATCH_REG_17, sr17);
+-        inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR32, cr32);
+-
+-      if ((sr17 & 0x0F) && (ivideo.chip != SIS_300)) {
+-
+-              if ((sr17 & 0x01) && !sisfb_crt1off)
+-                      sisfb_crt1off = 0;
+-              else {
+-                      if (sr17 & 0x0E)
+-                              sisfb_crt1off = 1;
+-                      else
+-                              sisfb_crt1off = 0;
+-              }
+-
+-              if (sisfb_crt2type != -1)
+-                      /* TW: override detected CRT2 type */
+-                      ivideo.disp_state = sisfb_crt2type;
+-                else if (sr17 & 0x04)
+-                      ivideo.disp_state = DISPTYPE_TV;                        
+-              else if (sr17 & 0x02)
+-                      ivideo.disp_state = DISPTYPE_LCD;                       
+-              else if (sr17 & 0x08 )
+-                      ivideo.disp_state = DISPTYPE_CRT2;
+-              else
+-                      ivideo.disp_state = 0;
+-
+-              if(sisfb_tvplug != -1)
+-                      /* PR/TW: override detected TV type */
+-                      ivideo.TV_plug = sisfb_tvplug;
+-              else if (sr17 & 0x20)
+-                      ivideo.TV_plug = TVPLUG_SVIDEO;
+-              else if (sr17 & 0x10)
+-                      ivideo.TV_plug = TVPLUG_COMPOSITE;
+-
+-              inSISIDXREG(SISSR, IND_SIS_SCRATCH_REG_16, sr16);
+-              if (sr16 & 0x20)
+-                      ivideo.TV_type = TVMODE_PAL;
+-              else
+-                      ivideo.TV_type = TVMODE_NTSC;
+-
+-      } else {
+-
+-              if ((cr32 & SIS_CRT1) && !sisfb_crt1off)
+-                      sisfb_crt1off = 0;
+-              else {
+-                      if (cr32 & 0x5F)
+-                              sisfb_crt1off = 1;
+-                      else
+-                              sisfb_crt1off = 0;
+-              }
+-
+-              if (sisfb_crt2type != -1)
+-                      /* TW: override detected CRT2 type */
+-                      ivideo.disp_state = sisfb_crt2type;
+-              else if (cr32 & SIS_VB_TV)
+-                      ivideo.disp_state = DISPTYPE_TV;
+-              else if (cr32 & SIS_VB_LCD)
+-                      ivideo.disp_state = DISPTYPE_LCD;
+-              else if (cr32 & SIS_VB_CRT2)
+-                      ivideo.disp_state = DISPTYPE_CRT2;
+-              else
+-                      ivideo.disp_state = 0;
+-
+-              /* TW: Detect TV plug & type */
+-              if(sisfb_tvplug != -1)
+-                      /* PR/TW: override with option */
+-                      ivideo.TV_plug = sisfb_tvplug;
+-              else if (cr32 & SIS_VB_HIVISION) {
+-                      ivideo.TV_type = TVMODE_HIVISION;
+-                      ivideo.TV_plug = TVPLUG_SVIDEO;
+-              }
+-              else if (cr32 & SIS_VB_SVIDEO)
+-                      ivideo.TV_plug = TVPLUG_SVIDEO;
+-              else if (cr32 & SIS_VB_COMPOSITE)
+-                      ivideo.TV_plug = TVPLUG_COMPOSITE;
+-              else if (cr32 & SIS_VB_SCART)
+-                      ivideo.TV_plug = TVPLUG_SCART;
+-
+-              if (ivideo.TV_type == 0) {
+-                      inSISIDXREG(SISSR, IND_SIS_POWER_ON_TRAP, temp);
+-                      if (temp & 0x01)
+-                              ivideo.TV_type = TVMODE_PAL;
+-                      else
+-                              ivideo.TV_type = TVMODE_NTSC;
+-              }
+-
+-      }
+-
+-      /* TW: Copy forceCRT1 option to CRT1off if option is given */
+-      if (sisfb_forcecrt1 != -1) {
+-              if(sisfb_forcecrt1) sisfb_crt1off = 0;
+-              else                sisfb_crt1off = 1;
+-      }
+-}
+-
+-static void sisfb_get_VB_type_300(void)
+-{
+-      u8 reg;
+-
+-      if(ivideo.chip != SIS_300) {
+-              if(!sisfb_has_VB_300()) {
+-                      inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR37, reg);
+-                      switch ((reg & SIS_EXTERNAL_CHIP_MASK) >> 1) {
+-                         case SIS_EXTERNAL_CHIP_LVDS:
+-                              ivideo.hasVB = HASVB_LVDS;
+-                              break;
+-                         case SIS_EXTERNAL_CHIP_TRUMPION:
+-                              ivideo.hasVB = HASVB_TRUMPION;
+-                              break;
+-                         case SIS_EXTERNAL_CHIP_LVDS_CHRONTEL:
+-                              ivideo.hasVB = HASVB_LVDS_CHRONTEL;
+-                              break;
+-                         case SIS_EXTERNAL_CHIP_CHRONTEL:
+-                              ivideo.hasVB = HASVB_CHRONTEL;
+-                              break;
+-                         default:
+-                              break;
+-                      }
+-              }
+-      } else {
+-              sisfb_has_VB_300();
+-      }
+-}
+-
+-static int sisfb_has_VB_300(void)
+-{
+-      u8 vb_chipid;
+-
+-      inSISIDXREG(SISPART4, 0x00, vb_chipid);
+-      switch (vb_chipid) {
+-         case 0x01:
+-              ivideo.hasVB = HASVB_301;
+-              break;
+-         case 0x02:
+-              ivideo.hasVB = HASVB_302;
+-              break;
+-         default:
+-              ivideo.hasVB = HASVB_NONE;
+-              return FALSE;
+-      }
+-      return TRUE;
+-
+-}
+-
+ #endif  /* CONFIG_FB_SIS_300 */
+@@ -2314,14 +2454,18 @@ static int sisfb_get_dram_size_315(void)
+       u8  pci_data;
+       u8  reg = 0;
+-      if (ivideo.chip == SIS_550 || ivideo.chip == SIS_650 || ivideo.chip == SIS_740) {
++      if (ivideo.chip == SIS_550 ||
++          ivideo.chip == SIS_650 ||
++          ivideo.chip == SIS_740 ||
++          ivideo.chip == SIS_660) {
+ #ifdef LINUXBIOS
+               while ((pdev = pci_find_device(PCI_VENDOR_ID_SI, PCI_ANY_ID, pdev)) != NULL) {
+                       if ((pdev->device == PCI_DEVICE_ID_SI_550) ||
+-                           (pdev->device == PCI_DEVICE_ID_SI_650) ||
+-                           (pdev->device == PCI_DEVICE_ID_SI_740)) {
++                          (pdev->device == PCI_DEVICE_ID_SI_650) ||
++                           (pdev->device == PCI_DEVICE_ID_SI_740) ||
++                           (pdev->device == PCI_DEVICE_ID_SI_660)) {
+                               pci_read_config_byte(pdev, IND_BRI_DRAM_STATUS,
+                                                    &pci_data);
+                               pci_data = (pci_data & BRI_DRAM_SIZE_MASK) >> 4;
+@@ -2425,7 +2569,7 @@ static int sisfb_get_dram_size_315(void)
+ #endif
+               return 0;
+-      } else {        /* 315 */
++      } else {        /* 315, 330 */
+               inSISIDXREG(SISSR, IND_SIS_DRAM_SIZE, reg);
+               switch ((reg & SIS315_DRAM_SIZE_MASK) >> 4) {
+@@ -2470,7 +2614,7 @@ static int sisfb_get_dram_size_315(void)
+                     case SIS315_DUAL_CHANNEL_1_RANK:
+                          ivideo.video_size <<= 1;
+                          break;
+-                    case SIS315_ASYM_DDR:             /* TW: DDR asymentric */
++                    case SIS315_ASYM_DDR:             /* TW: DDR asymetric */
+                          ivideo.video_size += (ivideo.video_size/2);
+                          break;
+                  }
+@@ -2483,128 +2627,242 @@ static int sisfb_get_dram_size_315(void)
+       
+ }
+-static void sisfb_detect_VB_connect_315(void)
++#endif   /* CONFIG_FB_SIS_315 */
++
++
++/* -------------- video bridge detection --------------- */
++
++static void sisfb_detect_VB_connect()
+ {
+-      u8 cr32, temp=0;
++      u8 sr16, sr17, cr32, temp;
+-      ivideo.TV_plug = ivideo.TV_type = 0;
++      if(sisvga_engine == SIS_300_VGA) {
++      
++              inSISIDXREG(SISSR, IND_SIS_SCRATCH_REG_17, sr17); 
++            
++              if ((sr17 & 0x0F) && (ivideo.chip != SIS_300)) {
++      
++                      /* Old BIOSes store the detected CRT2 type in SR17
++                       * instead of CR32. However, since our detection
++                       * routines store their results to CR32, we now copy
++                       * the remaining bits (for LCD and VGA) to CR32 for
++                       * unified usage.
++                       * SR17[0] CRT1    [1] LCD     [2] TV    [3] VGA2
++                       *     [4] AVIDEO  [5] SVIDEO
++                       */
+-        switch(ivideo.hasVB) {
+-        case HASVB_LVDS_CHRONTEL:
+-        case HASVB_CHRONTEL:
+-           SiS_SenseCh();
+-           break;
+-        case HASVB_301:
+-        case HASVB_302:
+-           SiS_Sense30x();
+-           break;
+-      }
++#if 0
++                      if (sr17 & 0x01) orSISIDXREG(SISCR, 0x32, SIS_CRT1);
++                      else             andSISIDXREG(SISCR, 0x32, ~SIS_CRT1);
++
++                      if (sr17 & 0x02) orSISIDXREG(SISCR, 0x32, SIS_VB_LCD);
++                      else             andSISIDXREG(SISCR, 0x32, ~SIS_VB_LCD);
++
++                      /* no HiVision and no DVI connector here */
++                      andSISIDXREG(SISCR, 0x32, ~0xc0);
++#endif
++              
++                      /* PAL/NTSC is stored on SR16 on such machines */
++                      if (!(ivideo.vbflags & (TV_PAL | TV_NTSC))) {
++                              inSISIDXREG(SISSR, IND_SIS_SCRATCH_REG_16, sr16);
++                              if (sr16 & 0x20)
++                                      ivideo.vbflags |= TV_PAL;
++                              else
++                                      ivideo.vbflags |= TV_NTSC;
++                      }
++              } 
++              
++      }
++      
+       inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR32, cr32);
+-      if ((cr32 & SIS_CRT1) && !sisfb_crt1off)
++      if (cr32 & SIS_CRT1)
+               sisfb_crt1off = 0;
+       else {
+-              if (cr32 & 0x5F)   
++              if (cr32 & 0x5F)
+                       sisfb_crt1off = 1;
+               else
+                       sisfb_crt1off = 0;
+       }
+-      if (sisfb_crt2type != -1)
+-              /* TW: Override with option */
+-              ivideo.disp_state = sisfb_crt2type;
+-      else if (cr32 & SIS_VB_TV)
+-              ivideo.disp_state = DISPTYPE_TV;                
+-      else if (cr32 & SIS_VB_LCD)
+-              ivideo.disp_state = DISPTYPE_LCD;               
+-      else if (cr32 & SIS_VB_CRT2)
+-              ivideo.disp_state = DISPTYPE_CRT2;
+-      else
+-              ivideo.disp_state = 0;
++      ivideo.vbflags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA);
++      if (cr32 & SIS_VB_TV)
++              ivideo.vbflags |= CRT2_TV;
++      if (cr32 & SIS_VB_LCD)
++              ivideo.vbflags |= CRT2_LCD;
++      if (cr32 & SIS_VB_CRT2)
++              ivideo.vbflags |= CRT2_VGA;
++              
++      /* TW: Detect/set TV plug & type */
+       if(sisfb_tvplug != -1)
+-              /* PR/TW: Override with option */
+-              ivideo.TV_plug = sisfb_tvplug;
+-      else if (cr32 & SIS_VB_HIVISION) {
+-              ivideo.TV_type = TVMODE_HIVISION;
+-              ivideo.TV_plug = TVPLUG_SVIDEO;
+-      }
++              ivideo.vbflags |= sisfb_tvplug;
++      if (cr32 & SIS_VB_HIVISION) 
++              ivideo.vbflags |= (TV_HIVISION | TV_SVIDEO);
+       else if (cr32 & SIS_VB_SVIDEO)
+-              ivideo.TV_plug = TVPLUG_SVIDEO;
++              ivideo.vbflags |= TV_SVIDEO;
+       else if (cr32 & SIS_VB_COMPOSITE)
+-              ivideo.TV_plug = TVPLUG_COMPOSITE;
++              ivideo.vbflags |= TV_AVIDEO;
+       else if (cr32 & SIS_VB_SCART)
+-              ivideo.TV_plug = TVPLUG_SCART;
+-
+-      if(ivideo.TV_type == 0) {
+-          /* TW: PAL/NTSC changed for 650 */
+-          if((ivideo.chip <= SIS_315PRO) || (ivideo.chip >= SIS_330)) {
+-
+-                inSISIDXREG(SISCR, 0x38, temp);
+-              if(temp & 0x10)
+-                      ivideo.TV_type = TVMODE_PAL;
+-              else
+-                      ivideo.TV_type = TVMODE_NTSC;
++              ivideo.vbflags |= TV_SCART;
++              
++      if (!(ivideo.vbflags & (TV_PAL | TV_NTSC))) {
++              if(sisvga_engine == SIS_300_VGA) {
++                      inSISIDXREG(SISSR, IND_SIS_POWER_ON_TRAP, temp);
++                      if (temp & 0x01)
++                              ivideo.vbflags |= TV_PAL;
++                      else
++                              ivideo.vbflags |= TV_NTSC;
++              } else if((ivideo.chip <= SIS_315PRO) || (ivideo.chip == SIS_330)) {
+-          } else {
++                      inSISIDXREG(SISCR, 0x38, temp);
++                      if(temp & 0x10)
++                              ivideo.vbflags |= TV_PAL;
++                      else
++                              ivideo.vbflags |= TV_NTSC;
++              
++              } else {
+-              inSISIDXREG(SISCR, 0x79, temp);
+-              if(temp & 0x20)
+-                      ivideo.TV_type = TVMODE_PAL;
+-              else
+-                      ivideo.TV_type = TVMODE_NTSC;
+-          }
++                      inSISIDXREG(SISCR, 0x79, temp);
++                      if(temp & 0x20)
++                              ivideo.vbflags |= TV_PAL;
++                      else
++                              ivideo.vbflags |= TV_NTSC;
++              }
+       }
+       /* TW: Copy forceCRT1 option to CRT1off if option is given */
+       if (sisfb_forcecrt1 != -1) {
+-              if (sisfb_forcecrt1) sisfb_crt1off = 0;
+-              else                 sisfb_crt1off = 1;
++              if(sisfb_forcecrt1) sisfb_crt1off = 0;
++              else                sisfb_crt1off = 1;
+       }
+-}
+-
+-static void sisfb_get_VB_type_315(void)
+-{
+-      u8 reg;
+-      if (!sisfb_has_VB_315()) {
+-              inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR37, reg);
+-              switch ((reg & SIS_EXTERNAL_CHIP_MASK) >> 1) {
+-                 case SIS310_EXTERNAL_CHIP_LVDS:
+-                      ivideo.hasVB = HASVB_LVDS;
+-                      break;
+-                 case SIS310_EXTERNAL_CHIP_LVDS_CHRONTEL:
+-                      ivideo.hasVB = HASVB_LVDS_CHRONTEL;
+-                      break;
+-                 default:
+-                      break;
+-              }
+-      }
+ }
+-
+-static int sisfb_has_VB_315(void)
++static void sisfb_get_VB_type(void)
+ {
+       u8 vb_chipid;
++      u8 reg;
++      char stdstr[]    = "sisfb: Detected";
++      char bridgestr[] = "video bridge";
++      char lvdsstr[]   = "LVDS transmitter";
++      char chrstr[]    = "Chrontel TV encoder";
++      
++      ivideo.hasVB = HASVB_NONE;
++      sishw_ext.ujVBChipID = VB_CHIP_UNKNOWN;
++      sishw_ext.Is301BDH = FALSE;
++      sishw_ext.usExternalChip = 0;
+       inSISIDXREG(SISPART4, 0x00, vb_chipid);
+       switch (vb_chipid) {
+          case 0x01:
+               ivideo.hasVB = HASVB_301;
++              inSISIDXREG(SISPART4, 0x01, reg);
++              if(reg < 0xb0) { 
++                      ivideo.vbflags |= VB_301;
++                      sishw_ext.ujVBChipID = VB_CHIP_301;
++                      printk(KERN_INFO "%s SiS301 %s\n", stdstr, bridgestr);
++              } else if(reg < 0xd0) {
++                      ivideo.vbflags |= VB_301B;
++                      sishw_ext.ujVBChipID = VB_CHIP_301B;
++                      printk(KERN_INFO "%s SiS301B %s\n", stdstr, bridgestr);
++              } else if(reg < 0xe0) {
++                      ivideo.vbflags |= VB_301LV;
++                      sishw_ext.ujVBChipID = VB_CHIP_301LV;
++                      printk(KERN_INFO "%s SiS301LV %s\n", stdstr, bridgestr);
++              } else if(reg <= 0xe1) {
++                      ivideo.vbflags |= VB_302LV;
++                      sishw_ext.ujVBChipID = VB_CHIP_302LV;
++                      printk(KERN_INFO "%s SiS302LV %s\n", stdstr, bridgestr);
++              }
+               break;
+          case 0x02:
+               ivideo.hasVB = HASVB_302;
++              inSISIDXREG(SISPART4, 0x01, reg);
++              if(reg < 0xd0) {
++                      ivideo.vbflags |= VB_302B;
++                      sishw_ext.ujVBChipID = VB_CHIP_302B;
++                      printk(KERN_INFO "%s SiS302B %s\n", stdstr, bridgestr);
++              } else if(reg < 0xe0) {
++                      ivideo.vbflags |= VB_301LV;
++                      sishw_ext.ujVBChipID = VB_CHIP_301LV;
++                      printk(KERN_INFO "%s SiS301LV %s\n", stdstr, bridgestr);
++              } else if(reg <= 0xe1) {
++                      ivideo.vbflags |= VB_302LV;
++                      sishw_ext.ujVBChipID = VB_CHIP_302LV;
++                      printk(KERN_INFO "%s SiS302LV %s\n", stdstr, bridgestr);
++              }
+               break;
+-         default:
+-              ivideo.hasVB = HASVB_NONE;
+-              return FALSE;
+       }
+-      return TRUE;
++      
++      if(ivideo.vbflags & (VB_301B | VB_302B)) {
++              inSISIDXREG(SISPART4,0x23,reg);
++              if(!(reg & 0x02)) {
++                      sishw_ext.Is301BDH = TRUE;
++                      ivideo.vbflags |= VB_30xBDH;
++                      printk(KERN_INFO "This %s does not support LCD output\n", bridgestr);
++              }
++      }
++      
++      if((!(ivideo.vbflags & VB_VIDEOBRIDGE)) && (ivideo.chip != SIS_300)) {
++              inSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR37, reg);
++              reg &= SIS_EXTERNAL_CHIP_MASK;
++              reg >>= 1;
++              if(sisvga_engine == SIS_300_VGA) {
++                      switch (reg) {
++                         case SIS_EXTERNAL_CHIP_LVDS:
++                              ivideo.hasVB = HASVB_LVDS;
++                              ivideo.vbflags |= VB_LVDS;
++                              sishw_ext.usExternalChip = 0x01;
++                              printk(KERN_INFO "%s %s\n", stdstr, lvdsstr);
++                              break;
++                         case SIS_EXTERNAL_CHIP_TRUMPION:
++                              ivideo.hasVB = HASVB_TRUMPION;
++                              ivideo.vbflags |= VB_TRUMPION;
++                              sishw_ext.usExternalChip = 0x02;
++                              printk(KERN_INFO "%s Trumpion LCD scaler\n", stdstr);
++                              break;     
++                         case SIS_EXTERNAL_CHIP_CHRONTEL:
++                              ivideo.hasVB = HASVB_CHRONTEL;
++                              ivideo.vbflags |= VB_CHRONTEL;
++                              sishw_ext.usExternalChip = 0x04;
++                              printk(KERN_INFO "%s %s\n", stdstr, chrstr);
++                              break;
++                         case SIS_EXTERNAL_CHIP_LVDS_CHRONTEL:
++                              ivideo.hasVB = HASVB_LVDS_CHRONTEL;
++                              ivideo.vbflags |= (VB_LVDS | VB_CHRONTEL);
++                              sishw_ext.usExternalChip = 0x05;
++                              printk(KERN_INFO "%s %s and %s\n", stdstr, lvdsstr, chrstr);
++                              break;
++                      }
++              } else {
++                      switch (reg) {
++                         case SIS310_EXTERNAL_CHIP_LVDS:
++                              ivideo.hasVB = HASVB_LVDS;
++                              ivideo.vbflags |= VB_LVDS;
++                              sishw_ext.usExternalChip = 0x01;
++                              printk(KERN_INFO "%s %s\n", stdstr, lvdsstr);
++                              break;
++                         case SIS310_EXTERNAL_CHIP_LVDS_CHRONTEL:
++                              ivideo.hasVB = HASVB_LVDS_CHRONTEL;
++                              ivideo.vbflags |= (VB_LVDS | VB_CHRONTEL);
++                              sishw_ext.usExternalChip = 0x05;
++                              printk(KERN_INFO "%s %s and %s\n", stdstr, lvdsstr, chrstr);
++                              break;
++                      }
++              }
++      
++      }
++      
++      if(ivideo.vbflags & VB_SISBRIDGE) {
++              SiS_Sense30x();
++      } else if(ivideo.vbflags & VB_CHRONTEL) {
++              SiS_SenseCh();
++      }
++      
+ }
+-#endif   /* CONFIG_FB_SIS_315 */
+-
+ /* ------------------ Sensing routines ------------------ */
+ /* TW: Determine and detect attached devices on SiS30x */
+@@ -2621,34 +2879,39 @@ SISDoSense(int tempbl, int tempbh, int t
+     inSISIDXREG(SISPART4,0x03,temp);
+     temp ^= 0x0e;
+     temp &= tempch;
+-    return(temp);
++    return((temp == tempch));
+ }
+ void
+ SiS_Sense30x(void)
+ {
+-  u8 backupP4_0d;
++  u8 backupP4_0d,backupP2_00;
+   u8 testsvhs_tempbl, testsvhs_tempbh;
+   u8 testsvhs_tempcl, testsvhs_tempch;
+   u8 testcvbs_tempbl, testcvbs_tempbh;
+   u8 testcvbs_tempcl, testcvbs_tempch;
+   u8 testvga2_tempbl, testvga2_tempbh;
+   u8 testvga2_tempcl, testvga2_tempch;
+-  int myflag, result;
++  int myflag, result, haveresult, i, j;
++  char stdstr[] = "sisfb: Detected";
++  char tvstr[]  = "TV connected to";
+   inSISIDXREG(SISPART4,0x0d,backupP4_0d);
+   outSISIDXREG(SISPART4,0x0d,(backupP4_0d | 0x04));
++  inSISIDXREG(SISPART2,0x00,backupP2_00);
++  outSISIDXREG(SISPART2,0x00,(backupP2_00 | 0x1c));
++
+   if(sisvga_engine == SIS_300_VGA) {
+-      testvga2_tempbh = 0x00; testvga2_tempbl = 0xd1;
+-        testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9;
+-      testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3;
+-      if((sishw_ext.ujVBChipID != VB_CHIP_301) &&
+-         (sishw_ext.ujVBChipID != VB_CHIP_302) ) {
+-         testvga2_tempbh = 0x01; testvga2_tempbl = 0x90;
+-         testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b;
+-         testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74;
++      if(ivideo.vbflags & (VB_301B|VB_302B|VB_301LV|VB_302LV)) {
++              testvga2_tempbh = 0x01; testvga2_tempbl = 0x90;
++              testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b;
++              testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74;
++      } else {
++              testvga2_tempbh = 0x00; testvga2_tempbl = 0xd1;
++              testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9;
++              testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3;
+       }
+       inSISIDXREG(SISPART4,0x01,myflag);
+       if(myflag & 0x04) {
+@@ -2657,35 +2920,36 @@ SiS_Sense30x(void)
+          testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xee;
+       }
+       testvga2_tempch = 0x0e; testvga2_tempcl = 0x08;
+-      testsvhs_tempch = 0x06; testsvhs_tempcl = 0x04;
++      testsvhs_tempch = 0x04; testsvhs_tempcl = 0x04;
+       testcvbs_tempch = 0x08; testcvbs_tempcl = 0x04;
++      if(ivideo.vbflags & (VB_301LV|VB_302LV)) {
++              testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
++              testvga2_tempch = 0x00; testvga2_tempcl = 0x00;
++       }
+       if(ivideo.chip == SIS_300) {
+          inSISIDXREG(SISSR,0x3b,myflag);
+          if(!(myflag & 0x01)) {
+-            testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
+-            testvga2_tempch = 0x00; testvga2_tempcl = 0x00;
++              testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
++              testvga2_tempch = 0x00; testvga2_tempcl = 0x00;
+          }
+       }
+   } else {
+-      testvga2_tempbh = 0x00; testvga2_tempbl = 0xd1;
+-        testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9;
+-      testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3;
+-      if((sishw_ext.ujVBChipID != VB_CHIP_301) &&
+-         (sishw_ext.ujVBChipID != VB_CHIP_302)) {
+-            testvga2_tempbh = 0x01; testvga2_tempbl = 0x90;
+-            testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b;
+-            testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74;
+-            if(sishw_ext.ujVBChipID == VB_CHIP_301LV ||
+-               sishw_ext.ujVBChipID == VB_CHIP_302LV) {
+-               testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
+-               testsvhs_tempbh = 0x02; testsvhs_tempbl = 0x00;
+-               testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x00;
+-            }
++      if(ivideo.vbflags & (VB_301B|VB_302B)) {
++              testvga2_tempbh = 0x01; testvga2_tempbl = 0x90;
++              testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b;
++              testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74;
++      } else if(ivideo.vbflags & (VB_301LV|VB_302LV)) {
++              testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
++              testsvhs_tempbh = 0x02; testsvhs_tempbl = 0x00;
++              testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x00;
++      } else {
++              testvga2_tempbh = 0x00; testvga2_tempbl = 0xd1;
++              testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9;
++              testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3;
+       }
+-      if(sishw_ext.ujVBChipID != VB_CHIP_301LV &&
+-         sishw_ext.ujVBChipID != VB_CHIP_302LV) {
++      if(ivideo.vbflags & (VB_301|VB_301B|VB_302B)) {
+          inSISIDXREG(SISPART4,0x01,myflag);
+          if(myflag & 0x04) {
+             testvga2_tempbh = 0x00; testvga2_tempbl = 0xfd;
+@@ -2693,49 +2957,78 @@ SiS_Sense30x(void)
+             testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xee;
+          }
+       }
+-      if((sishw_ext.ujVBChipID == VB_CHIP_301LV) ||
+-         (sishw_ext.ujVBChipID == VB_CHIP_302LV) ) {
++      if(ivideo.vbflags & (VB_301LV|VB_302LV)) {
+          testvga2_tempbh = 0x00; testvga2_tempbl = 0x00;
+          testvga2_tempch = 0x00; testvga2_tempcl = 0x00;
+          testsvhs_tempch = 0x04; testsvhs_tempcl = 0x08;
+          testcvbs_tempch = 0x08; testcvbs_tempcl = 0x08;
+       } else {
+          testvga2_tempch = 0x0e; testvga2_tempcl = 0x08;
+-         testsvhs_tempch = 0x06; testsvhs_tempcl = 0x04;
++         testsvhs_tempch = 0x04; testsvhs_tempcl = 0x04;
+          testcvbs_tempch = 0x08; testcvbs_tempcl = 0x04;
+       }
+     } 
+     if(testvga2_tempch || testvga2_tempcl || testvga2_tempbh || testvga2_tempbl) {
+-        result = SISDoSense(testvga2_tempbl, testvga2_tempbh,
+-                            testvga2_tempcl, testvga2_tempch);
+-      if(result) {
+-              printk(KERN_INFO "sisfb: Detected secondary VGA connection\n");
+-              orSISIDXREG(SISCR, 0x32, 0x10);
+-      }
++       haveresult = 0;
++       for(j = 0; j < 10; j++) {
++          result = 0;
++          for(i = 0; i < 3; i++) {
++             if(SISDoSense(testvga2_tempbl, testvga2_tempbh,
++                           testvga2_tempcl, testvga2_tempch))
++              result++;
++          }
++        if((result == 0) || (result >= 2)) break;
++       }
++       if(result) {
++          printk(KERN_INFO "%s secondary VGA connection\n", stdstr);
++        orSISIDXREG(SISCR, 0x32, 0x10);
++       } else {
++        andSISIDXREG(SISCR, 0x32, ~0x10);
++       }
++    }
++
++    haveresult = 0;
++    for(j = 0; j < 10; j++) {
++       result = 0;
++       for(i = 0; i < 3; i++) {
++          if(SISDoSense(testsvhs_tempbl, testsvhs_tempbh,
++                        testsvhs_tempcl, testsvhs_tempch))
++              result++;
++       }
++       if((result == 0) || (result >= 2)) break;
+     }
+-    
+-    result = SISDoSense(testsvhs_tempbl, testsvhs_tempbh,
+-                        testsvhs_tempcl, testsvhs_tempch);
+     if(result) {
+-        printk(KERN_INFO "sisfb: Detected TV connected to SVHS output\n");
+-        /* TW: So we can be sure that there IS a SVHS output */
+-      ivideo.TV_plug = TVPLUG_SVIDEO;
++        printk(KERN_INFO "%s %s SVIDEO output\n", stdstr, tvstr);
++      ivideo.vbflags |= TV_SVIDEO;
+       orSISIDXREG(SISCR, 0x32, 0x02);
++      andSISIDXREG(SISCR, 0x32, ~0x05);
+     }
+     if(!result) {
+-        result = SISDoSense(testcvbs_tempbl, testcvbs_tempbh,
+-                          testcvbs_tempcl, testcvbs_tempch);
++
++      haveresult = 0;
++              for(j = 0; j < 10; j++) {
++           result = 0;
++           for(i = 0; i < 3; i++) {
++              if(SISDoSense(testcvbs_tempbl, testcvbs_tempbh,
++                          testcvbs_tempcl, testcvbs_tempch))
++              result++;
++           }
++           if((result == 0) || (result >= 2)) break;
++        }
+       if(result) {
+-          printk(KERN_INFO "sisfb: Detected TV connected to CVBS output\n");
+-          /* TW: So we can be sure that there IS a CVBS output */
+-          ivideo.TV_plug = TVPLUG_COMPOSITE;
++          printk(KERN_INFO "%s %s COMPOSITE output\n", stdstr, tvstr);
++          ivideo.vbflags |= TV_AVIDEO;
+           orSISIDXREG(SISCR, 0x32, 0x01);
++          andSISIDXREG(SISCR, 0x32, ~0x06);
++      } else {
++          andSISIDXREG(SISCR, 0x32, ~0x07);
+       }
+     }
+     SISDoSense(0, 0, 0, 0);
++    outSISIDXREG(SISPART2,0x00,backupP2_00);
+     outSISIDXREG(SISPART4,0x0d,backupP4_0d);
+ }
+@@ -2744,51 +3037,84 @@ void
+ SiS_SenseCh(void)
+ {
+-   u8 temp1;
+-#ifdef CONFIG_FB_SIS_315
+-   u8 temp2;
++   u8 temp1, temp2;
++#ifdef CONFIG_FB_SIS_300
++   unsigned char test[3];
++   int i;
+ #endif
++   char stdstr[] = "sisfb: Chrontel: Detected TV connected to";
+    if(ivideo.chip < SIS_315H) {
+ #ifdef CONFIG_FB_SIS_300
+-       SiS_Pr.SiS_IF_DEF_CH70xx = 1;          /* TW: Chrontel 7005 */
++       SiS_Pr.SiS_IF_DEF_CH70xx = 1;          /* Chrontel 700x */
++       SiS_SetChrontelGPIO(&SiS_Pr, 0x9c);    /* Set general purpose IO for Chrontel communication */
++       SiS_DDC2Delay(&SiS_Pr, 1000);
+        temp1 = SiS_GetCH700x(&SiS_Pr, 0x25);
+-       if ((temp1 >= 50) && (temp1 <= 100)) {
+-         /* TW: Read power status */
++       /* TW: See Chrontel TB31 for explanation */
++       temp2 = SiS_GetCH700x(&SiS_Pr, 0x0e);
++       if(((temp2 & 0x07) == 0x01) || (temp2 & 0x04)) {
++        SiS_SetCH700x(&SiS_Pr, 0x0b0e);
++        SiS_DDC2Delay(&SiS_Pr, 300);
++       }
++       temp2 = SiS_GetCH700x(&SiS_Pr, 0x25);
++       if(temp2 != temp1) temp1 = temp2;
++
++       if((temp1 >= 0x22) && (temp1 <= 0x50)) {
++         /* Read power status */
+          temp1 = SiS_GetCH700x(&SiS_Pr, 0x0e);
+          if((temp1 & 0x03) != 0x03) {
+-              /* TW: Power all outputs */
+-              SiS_SetCH70xxANDOR(&SiS_Pr, 0x030E,0xF8);
++              /* Power all outputs */
++              SiS_SetCH700x(&SiS_Pr, 0x0B0E);
++              SiS_DDC2Delay(&SiS_Pr, 300);
+          }
+-         /* TW: Sense connected TV devices */
+-         SiS_SetCH700x(&SiS_Pr, 0x0110);
+-         SiS_SetCH700x(&SiS_Pr, 0x0010);
+-         temp1 = SiS_GetCH700x(&SiS_Pr, 0x10);
+-         if(!(temp1 & 0x08)) {
+-              printk(KERN_INFO
+-                 "sisfb: Chrontel: Detected TV connected to SVHS output\n");
+-              /* TW: So we can be sure that there IS a SVHS output */
+-              ivideo.TV_plug = TVPLUG_SVIDEO;
++         /* Sense connected TV devices */
++         for(i = 0; i < 3; i++) {
++             SiS_SetCH700x(&SiS_Pr, 0x0110);
++             SiS_DDC2Delay(&SiS_Pr, 0x96);
++             SiS_SetCH700x(&SiS_Pr, 0x0010);
++             SiS_DDC2Delay(&SiS_Pr, 0x96);
++             temp1 = SiS_GetCH700x(&SiS_Pr, 0x10);
++             if(!(temp1 & 0x08))       test[i] = 0x02;
++             else if(!(temp1 & 0x02))  test[i] = 0x01;
++             else                      test[i] = 0;
++             SiS_DDC2Delay(&SiS_Pr, 0x96);
++         }
++
++         if(test[0] == test[1])      temp1 = test[0];
++         else if(test[0] == test[2]) temp1 = test[0];
++         else if(test[1] == test[2]) temp1 = test[1];
++         else {
++              printk(KERN_INFO
++                      "sisfb: TV detection unreliable - test results varied\n");
++              temp1 = test[2];
++         }
++         if(temp1 == 0x02) {
++              printk(KERN_INFO "%s SVIDEO output\n", stdstr);
++              ivideo.vbflags |= TV_SVIDEO;
+               orSISIDXREG(SISCR, 0x32, 0x02);
+-         } else if (!(temp1 & 0x02)) {
+-              printk(KERN_INFO
+-                 "sisfb: Chrontel: Detected TV connected to CVBS output\n");
+-              /* TW: So we can be sure that there IS a CVBS output */
+-              ivideo.TV_plug = TVPLUG_COMPOSITE;
++              andSISIDXREG(SISCR, 0x32, ~0x05);
++         } else if (temp1 == 0x01) {
++              printk(KERN_INFO "%s CVBS output\n", stdstr);
++              ivideo.vbflags |= TV_AVIDEO;
+               orSISIDXREG(SISCR, 0x32, 0x01);
++              andSISIDXREG(SISCR, 0x32, ~0x06);
+          } else {
+               SiS_SetCH70xxANDOR(&SiS_Pr, 0x010E,0xF8);
++              andSISIDXREG(SISCR, 0x32, ~0x07);
+          }
+        } else if(temp1 == 0) {
+         SiS_SetCH70xxANDOR(&SiS_Pr, 0x010E,0xF8);
++        andSISIDXREG(SISCR, 0x32, ~0x07);
+        }
++       /* Set general purpose IO for Chrontel communication */
++       SiS_SetChrontelGPIO(&SiS_Pr, 0x00);
+ #endif
+    } else {
+ #ifdef CONFIG_FB_SIS_315
+-      SiS_Pr.SiS_IF_DEF_CH70xx = 2;           /* TW: Chrontel 7019 */
++      SiS_Pr.SiS_IF_DEF_CH70xx = 2;           /* Chrontel 7019 */
+         temp1 = SiS_GetCH701x(&SiS_Pr, 0x49);
+       SiS_SetCH701x(&SiS_Pr, 0x2049);
+       SiS_DDC2Delay(&SiS_Pr, 0x96);
+@@ -2808,22 +3134,24 @@ SiS_SenseCh(void)
+       if( (temp1 & 0x01) && (temp1 & 0x02) ) temp1 = 0x04;
+       switch(temp1) {
+       case 0x01:
+-           printk(KERN_INFO
+-              "sisfb: Chrontel: Detected TV connected to CVBS output\n");
+-           ivideo.TV_plug = TVPLUG_COMPOSITE;
++           printk(KERN_INFO "%s CVBS output\n", stdstr);
++           ivideo.vbflags |= TV_AVIDEO;
+            orSISIDXREG(SISCR, 0x32, 0x01);
++           andSISIDXREG(SISCR, 0x32, ~0x06);
+              break;
+       case 0x02:
+-           printk(KERN_INFO
+-              "sisfb: Chrontel: Detected TV connected to SVHS output\n");
+-           ivideo.TV_plug = TVPLUG_SVIDEO;
++           printk(KERN_INFO "%s SVIDEO output\n", stdstr);
++           ivideo.vbflags |= TV_SVIDEO;
+            orSISIDXREG(SISCR, 0x32, 0x02);
++           andSISIDXREG(SISCR, 0x32, ~0x05);
+              break;
+       case 0x04:
+-           /* TW: This should not happen */
+-           printk(KERN_INFO
+-              "sisfb: Chrontel: Detected TV connected to SCART output\n");
++           printk(KERN_INFO "%s SCART output\n", stdstr);
++           orSISIDXREG(SISCR, 0x32, 0x04);
++           andSISIDXREG(SISCR, 0x32, ~0x03);          
+              break;
++      default:
++           andSISIDXREG(SISCR, 0x32, ~0x07);
+       }
+ #endif
+@@ -2860,14 +3188,20 @@ static int sisfb_heap_init(void)
+  *     in XF86Config-4.
+  *     The heap start can also be specified by parameter "mem" when starting the sisfb
+  *     driver. sisfb mem=1024 lets heap starts at 1MB, etc.
++ *     On the 315 series, the default is a 1MB heap since DRI is not supported
++ *     there.
+  */
+      if ((!sisfb_mem) || (sisfb_mem > (ivideo.video_size/1024))) {
+-        if (ivideo.video_size > 0x1000000) {
++        if(sisvga_engine == SIS_300_VGA) {
++           if (ivideo.video_size > 0x1000000) {
+               ivideo.heapstart = 0xc00000;
+-      } else if (ivideo.video_size > 0x800000) {
++         } else if (ivideo.video_size > 0x800000) {
+               ivideo.heapstart = 0x800000;
+-      } else {
++         } else {
+               ivideo.heapstart = 0x400000;
++         }
++      } else {
++         ivideo.heapstart = ivideo.video_size - 0x100000;
+       }
+      } else {
+            ivideo.heapstart = sisfb_mem * 1024;
+@@ -2883,7 +3217,7 @@ static int sisfb_heap_init(void)
+ #ifdef CONFIG_FB_SIS_315
+      if (sisvga_engine == SIS_315_VGA) {
+         /* TW: Now initialize the 310 series' command queue mode.
+-       * On 310/325, there are three queue modes available which
++       * On 315, there are three queue modes available which
+        * are chosen by setting bits 7:5 in SR26:
+        * 1. MMIO queue mode (bit 5, 0x20). The hardware will keep
+        *    track of the queue, the FIFO, command parsing and so
+@@ -3333,7 +3667,6 @@ void sis_malloc(struct sis_memreq *req)
+               req->offset = poh->offset;
+               req->size = poh->size;
+       }
+-
+ }
+ void sis_free(unsigned long base)
+@@ -3352,35 +3685,70 @@ void sis_free(unsigned long base)
+ static void sisfb_pre_setmode(void)
+ {
+-      u8 cr30 = 0, cr31 = 0;
++      u8 cr30 = 0, cr31 = 0, cr33 = 0;
++      
++      ivideo.currentvbflags &= (VB_VIDEOBRIDGE | VB_DISPTYPE_DISP2);
+       inSISIDXREG(SISCR, 0x31, cr31);
+       cr31 &= ~0x60;
++      cr31 |= 0x04;
++      
++      cr33 = sisfb_rate_idx & 0x0F;
+-      switch (ivideo.disp_state & DISPTYPE_DISP2) {
+-         case DISPTYPE_CRT2:
+-              cr30 = (SIS_VB_OUTPUT_CRT2 | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-              cr31 |= SIS_DRIVER_MODE;
+-              break;
+-         case DISPTYPE_LCD:
+-              cr30  = (SIS_VB_OUTPUT_LCD | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-              cr31 |= SIS_DRIVER_MODE;
+-              break;
+-         case DISPTYPE_TV:
+-              if (ivideo.TV_type == TVMODE_HIVISION)
++      SiS_SetEnableDstn(&SiS_Pr, FALSE);
++      SiS_SetEnableFstn(&SiS_Pr, FALSE);
++
++      switch (ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
++         case CRT2_TV:
++              ivideo.disp_state = DISPTYPE_TV;
++              if (ivideo.vbflags & TV_HIVISION) {
+                       cr30 = (SIS_VB_OUTPUT_HIVISION | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-              else if (ivideo.TV_plug == TVPLUG_SVIDEO)
++                      ivideo.currentvbflags |= (TV_HIVISION | TV_SVIDEO);
++                      ivideo.TV_type = TVMODE_HIVISION;
++                      ivideo.TV_plug = TVPLUG_SVIDEO;
++              } else if (ivideo.vbflags & TV_SVIDEO) {
+                       cr30 = (SIS_VB_OUTPUT_SVIDEO | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-              else if (ivideo.TV_plug == TVPLUG_COMPOSITE)
++                      ivideo.currentvbflags |= TV_SVIDEO;
++                      ivideo.TV_plug = TVPLUG_SVIDEO;
++              } else if (ivideo.vbflags & TV_AVIDEO) {
+                       cr30 = (SIS_VB_OUTPUT_COMPOSITE | SIS_SIMULTANEOUS_VIEW_ENABLE);
+-              else if (ivideo.TV_plug == TVPLUG_SCART)
++                      ivideo.currentvbflags |= TV_AVIDEO;
++                      ivideo.TV_plug = TVPLUG_COMPOSITE;
++              } else if (ivideo.vbflags & TV_SCART) {
+                       cr30 = (SIS_VB_OUTPUT_SCART | SIS_SIMULTANEOUS_VIEW_ENABLE);
++                      ivideo.currentvbflags |= TV_SCART;
++                      ivideo.TV_plug = TVPLUG_SCART;
++              }
+               cr31 |= SIS_DRIVER_MODE;
+-              if (sisfb_tvmode == 1 || ivideo.TV_type == TVMODE_PAL)
+-                      cr31 |= 0x01;
+-                else
+-                        cr31 &= ~0x01;
++              if(!(ivideo.vbflags & TV_HIVISION)) {
++                      if (ivideo.vbflags & TV_PAL) {
++                              cr31 |= 0x01;
++                              ivideo.currentvbflags |= TV_PAL;
++                              ivideo.TV_type = TVMODE_PAL;
++                      } else {
++                              cr31 &= ~0x01;
++                              ivideo.currentvbflags |= TV_NTSC;
++                              ivideo.TV_type = TVMODE_NTSC;
++                      }
++              }
++              break;
++         case CRT2_LCD:
++              ivideo.disp_state = DISPTYPE_LCD;
++              cr30  = (SIS_VB_OUTPUT_LCD | SIS_SIMULTANEOUS_VIEW_ENABLE);
++              cr31 |= SIS_DRIVER_MODE;
++              SiS_SetEnableDstn(&SiS_Pr, sisfb_dstn);
++              SiS_SetEnableFstn(&SiS_Pr, sisfb_fstn);
++              break;          
++         case CRT2_VGA:
++              ivideo.disp_state = DISPTYPE_CRT2;
++              cr30 = (SIS_VB_OUTPUT_CRT2 | SIS_SIMULTANEOUS_VIEW_ENABLE);
++              cr31 |= SIS_DRIVER_MODE;
++              if(sisfb_nocrt2rate) {
++                      cr33 |= (sisbios_mode[sisfb_mode_idx].rate_idx << 4);
++              } else {
++                      cr33 |= ((sisfb_rate_idx & 0x0F) << 4);
++              }
+               break;
+          default:     /* disable CRT2 */
+               cr30 = 0x00;
+@@ -3389,8 +3757,7 @@ static void sisfb_pre_setmode(void)
+       outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR30, cr30);
+       outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR31, cr31);
+-
+-        outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR33, (sisfb_rate_idx & 0x0F));
++      outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR33, cr33);
+       if(ivideo.accel) sisfb_syncaccel();
+@@ -3400,67 +3767,89 @@ static void sisfb_pre_setmode(void)
+ static void sisfb_post_setmode(void)
+ {
+       u8 reg;
++      BOOLEAN crt1isoff = FALSE;
++#ifdef CONFIG_FB_SIS_315
++      u8 reg1;
++#endif
++#ifdef CONFIG_FB_SIS_300
+       BOOLEAN doit = TRUE;
+-#if 0 /* TW: Wrong: Is not in MMIO space, but in RAM */
+-      /* Backup mode number to MMIO space */
+-      if(ivideo.mmio_vbase) {
+-        *(volatile u8 *)(((u8*)ivideo.mmio_vbase) + 0x449) = (unsigned char)sisfb_mode_no;
+-      }
+-#endif        
+-
+-      if (ivideo.video_bpp == 8) {
+-              /* TW: We can't switch off CRT1 on LVDS/Chrontel in 8bpp Modes */
+-              if ((ivideo.hasVB == HASVB_LVDS) || (ivideo.hasVB == HASVB_LVDS_CHRONTEL)) {
+-                      doit = FALSE;
+-              }
+-              /* TW: We can't switch off CRT1 on 301B-DH in 8bpp Modes if using LCD */
+-              if ( (sishw_ext.Is301BDH) && (ivideo.disp_state & DISPTYPE_LCD) ) {
+-                      doit = FALSE;
+-              }
+-      }
+-
++#endif
+       /* TW: We can't switch off CRT1 if bridge is in slave mode */
+-      if(ivideo.hasVB != HASVB_NONE) {
+-              inSISIDXREG(SISPART1, 0x00, reg);
++      if(ivideo.vbflags & VB_VIDEOBRIDGE) {
++#ifdef CONFIG_FB_SIS_300
+               if(sisvga_engine == SIS_300_VGA) {
++                      inSISIDXREG(SISPART1, 0x00, reg);
+                       if((reg & 0xa0) == 0x20) {
+                               doit = FALSE;
+                       }
+               }
+-              if(sisvga_engine == SIS_315_VGA) {
+-                      if((reg & 0x50) == 0x10) {
+-                              doit = FALSE;
+-                      }
+-              }
++#endif
+       } else sisfb_crt1off = 0;
+-      inSISIDXREG(SISCR, 0x17, reg);
+-      if((sisfb_crt1off) && (doit))
+-              reg &= ~0x80;
+-      else          
+-              reg |= 0x80;
+-      outSISIDXREG(SISCR, 0x17, reg);
++      if(sisvga_engine == SIS_300_VGA) {
+-        andSISIDXREG(SISSR, IND_SIS_RAMDAC_CONTROL, ~0x04);
++#ifdef CONFIG_FB_SIS_300
++         if((sisfb_crt1off) && (doit)) {
++              crt1isoff = TRUE;
++              reg = 0x00;
++         } else {
++              crt1isoff = FALSE;
++              reg = 0x80;
++         }
++         setSISIDXREG(SISCR, 0x17, 0x7f, reg);
++#endif
+-      if((ivideo.disp_state & DISPTYPE_TV) && (ivideo.hasVB == HASVB_301)) {
++      } else {
++
++#ifdef CONFIG_FB_SIS_315
++         if(sisfb_crt1off) {
++              crt1isoff = TRUE;
++              reg  = 0x40;
++              reg1 = 0xc0;
++         } else {
++              crt1isoff = FALSE;
++              reg  = 0x00;
++              reg1 = 0x00;
++
++         }
++         setSISIDXREG(SISCR, 0x63, ~0x40, reg);
++         setSISIDXREG(SISSR, 0x1f, ~0xc0, reg1);
++#endif
++
++      }
++
++      if(crt1isoff) {
++         ivideo.currentvbflags &= ~VB_DISPTYPE_CRT1;
++         ivideo.currentvbflags |= VB_SINGLE_MODE;
++         ivideo.disp_state |= DISPMODE_SINGLE;
++      } else {
++         ivideo.currentvbflags |= VB_DISPTYPE_CRT1;
++         ivideo.disp_state |= DISPTYPE_CRT1;
++         if(ivideo.currentvbflags & VB_DISPTYPE_CRT2) {
++              ivideo.currentvbflags |= VB_MIRROR_MODE;
++              ivideo.disp_state |= DISPMODE_MIRROR;
++         } else {
++              ivideo.currentvbflags |= VB_SINGLE_MODE;
++              ivideo.disp_state |= DISPMODE_SINGLE;
++         }
++      }
+-         inSISIDXREG(SISPART4, 0x01, reg);
++        andSISIDXREG(SISSR, IND_SIS_RAMDAC_CONTROL, ~0x04);
+-         if(reg < 0xB0) {             /* Set filter for SiS301 */
++      if((ivideo.currentvbflags & CRT2_TV) && (ivideo.vbflags & VB_301)) {  /* Set filter for SiS301 */
+               switch (ivideo.video_width) {
+                  case 320:
+-                      filter_tb = (ivideo.TV_type == TVMODE_NTSC) ? 4 : 12;
++                      filter_tb = (ivideo.vbflags & TV_NTSC) ? 4 : 12;
+                       break;
+                  case 640:
+-                      filter_tb = (ivideo.TV_type == TVMODE_NTSC) ? 5 : 13;
++                      filter_tb = (ivideo.vbflags & TV_NTSC) ? 5 : 13;
+                       break;
+                  case 720:
+-                      filter_tb = (ivideo.TV_type == TVMODE_NTSC) ? 6 : 14;
++                      filter_tb = (ivideo.vbflags & TV_NTSC) ? 6 : 14;
+                       break;
+                  case 800:
+-                      filter_tb = (ivideo.TV_type == TVMODE_NTSC) ? 7 : 15;
++                      filter_tb = (ivideo.vbflags & TV_NTSC) ? 7 : 15;
+                       break;
+                  default:
+                       filter = -1;
+@@ -3469,15 +3858,15 @@ static void sisfb_post_setmode(void)
+               orSISIDXREG(SISPART1, sisfb_CRT2_write_enable, 0x01);
+-              if(ivideo.TV_type == TVMODE_NTSC) {
++              if(ivideo.vbflags & TV_NTSC) {
+                       andSISIDXREG(SISPART2, 0x3a, 0x1f);
+-                      if (ivideo.TV_plug == TVPLUG_SVIDEO) {
++                      if (ivideo.vbflags & TV_SVIDEO) {
+                               andSISIDXREG(SISPART2, 0x30, 0xdf);
+-                      } else if (ivideo.TV_plug == TVPLUG_COMPOSITE) {
++                      } else if (ivideo.vbflags & TV_AVIDEO) {
+                               orSISIDXREG(SISPART2, 0x30, 0x20);
+@@ -3503,15 +3892,15 @@ static void sisfb_post_setmode(void)
+                               }
+                       }
+-              } else if(ivideo.TV_type == TVMODE_PAL) {
++              } else if(ivideo.vbflags & TV_PAL) {
+                       andSISIDXREG(SISPART2, 0x3A, 0x1F);
+-                      if (ivideo.TV_plug == TVPLUG_SVIDEO) {
++                      if (ivideo.vbflags & TV_SVIDEO) {
+                               andSISIDXREG(SISPART2, 0x30, 0xDF);
+-                      } else if (ivideo.TV_plug == TVPLUG_COMPOSITE) {
++                      } else if (ivideo.vbflags & TV_AVIDEO) {
+                               orSISIDXREG(SISPART2, 0x30, 0x20);
+@@ -3539,7 +3928,7 @@ static void sisfb_post_setmode(void)
+               }
+               if ((filter >= 0) && (filter <=7)) {
+-                      DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n", filter_tb, filter, 
++                      DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n", filter_tb, filter,
+                               sis_TV_filter[filter_tb].filter[filter][0],
+                               sis_TV_filter[filter_tb].filter[filter][1],
+                               sis_TV_filter[filter_tb].filter[filter][2],
+@@ -3550,8 +3939,6 @@ static void sisfb_post_setmode(void)
+                       outSISIDXREG(SISPART2, 0x37, (sis_TV_filter[filter_tb].filter[filter][2]));
+                       outSISIDXREG(SISPART2, 0x38, (sis_TV_filter[filter_tb].filter[filter][3]));
+               }
+-
+-           }
+         
+       }
+@@ -3578,24 +3965,22 @@ int sisfb_setup(char *options)
+               if (!*this_opt) continue;
+               if (!strncmp(this_opt, "mode:", 5)) {
+-                      sisfb_search_mode(this_opt + 5);
++                      sisfb_search_mode(this_opt + 5, FALSE);
+               } else if (!strncmp(this_opt, "vesa:", 5)) {
+-                      sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0));
++                      sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0), FALSE);
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)                        
+               } else if (!strcmp(this_opt, "inverse")) {
+                       sisfb_inverse = 1;
+                       /* fb_invert_cmaps(); */
+               } else if (!strncmp(this_opt, "font:", 5)) {
+                       strcpy(sis_fb_info.fontname, this_opt + 5);
+-#endif                        
+-              } else if (!strncmp(this_opt, "mode:", 5)) {
+-                      sisfb_search_mode(this_opt + 5);
+-              } else if (!strncmp(this_opt, "vesa:", 5)) {
+-                      sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0));
++#endif
+               } else if (!strncmp(this_opt, "vrate:", 6)) {
+                       ivideo.refresh_rate = simple_strtoul(this_opt + 6, NULL, 0);
++                      sisfb_parm_rate = ivideo.refresh_rate;
+               } else if (!strncmp(this_opt, "rate:", 5)) {
+                       ivideo.refresh_rate = simple_strtoul(this_opt + 5, NULL, 0);
++                      sisfb_parm_rate = ivideo.refresh_rate;
+               } else if (!strncmp(this_opt, "off", 3)) {
+                       sisfb_off = 1;
+               } else if (!strncmp(this_opt, "crt1off", 7)) {
+@@ -3612,10 +3997,6 @@ int sisfb_setup(char *options)
+                       sisfb_search_tvstd(this_opt + 7);
+                 } else if (!strncmp(this_opt, "mem:",4)) {
+                       sisfb_mem = simple_strtoul(this_opt + 4, NULL, 0);
+-                } else if (!strncmp(this_opt, "dstn", 4)) {
+-                      enable_dstn = 1;
+-                      /* TW: DSTN overrules forcecrt2type */
+-                      sisfb_crt2type = DISPTYPE_LCD;
+               } else if (!strncmp(this_opt, "queuemode:", 10)) {
+                       sisfb_search_queuemode(this_opt + 10);
+               } else if (!strncmp(this_opt, "pdc:", 4)) {
+@@ -3632,17 +4013,18 @@ int sisfb_setup(char *options)
+                       sisfb_userom = (int)simple_strtoul(this_opt + 7, NULL, 0);
+               } else if (!strncmp(this_opt, "useoem:", 7)) {
+                       sisfb_useoem = (int)simple_strtoul(this_opt + 7, NULL, 0);
++              } else if (!strncmp(this_opt, "nocrt2rate", 10)) {
++                      sisfb_nocrt2rate = 1;                   
++              } else if(this_opt[0] >= '0' && this_opt[0] <= '9') {
++                      sisfb_search_mode(this_opt, TRUE);
+               } else {
+                       printk(KERN_INFO "sisfb: Invalid option %s\n", this_opt);
+               }
+               /* TW: Acceleration only with MMIO mode */
+               if((sisfb_queuemode != -1) && (sisfb_queuemode != MMIO_CMD)) {
+-                      sisfb_ypan = 0;
+                       sisfb_accel = 0;
+               }
+-              /* TW: Panning only with acceleration */
+-              if(sisfb_accel == 0) sisfb_ypan = 0;
+       }
+       return 0;
+@@ -3661,14 +4043,14 @@ static char *sis_find_rom(void)
+         char *sis_sig_300[4] = {
+           "300", "540", "630", "730"
+         };
+-        char *sis_sig_310[7] = {
+-          "315", "315", "315", "5315", "6325", "6325", "Xabre"
++        char *sis_sig_310[8] = {
++          "315", "315", "315", "5315", "6325", "6325", "Xabre", "6330"
+         };
+       ushort sis_nums_300[4] = {
+         SIS_300, SIS_540, SIS_630, SIS_730
+       };
+-      unsigned short sis_nums_310[7] = {
+-        SIS_315PRO, SIS_315H, SIS_315, SIS_550, SIS_650, SIS_740, SIS_330
++      unsigned short sis_nums_310[8] = {
++        SIS_315PRO, SIS_315H, SIS_315, SIS_550, SIS_650, SIS_740, SIS_330, SIS_660
+       };
+         for(segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) {
+@@ -3705,7 +4087,7 @@ static char *sis_find_rom(void)
+                     }
+                 }
+               if(stage != 4) {
+-                   for(i = 0;(i < 7) && (stage != 4); i++) {
++                   for(i = 0;(i < 8) && (stage != 4); i++) {
+                       if(strncmp(sis_sig_310[i], rom, strlen(sis_sig_310[i])) == 0) {
+                         if(sis_nums_310[i] == ivideo.chip) {
+                              stage = 4;
+@@ -3735,7 +4117,7 @@ int __init sisfb_init(void)
+       int pdev_valid = 0;
+       u32 reg32;
+       u16 reg16;
+-      u8  reg, reg1;
++      u8  reg;
+       /* outb(0x77, 0x80); */  /* What is this? */
+@@ -3751,12 +4133,14 @@ int __init sisfb_init(void)
+       if (sisfb_off)
+               return -ENXIO;
+-      if (enable_dstn)
+-              SiS_SetEnableDstn(&SiS_Pr);
+-              
+       sisfb_registered = 0;
++      sisfb_thismonitor.datavalid = FALSE;
+       memset(&sis_fb_info, 0, sizeof(sis_fb_info));
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++        memset(&sisfb_lastrates[0], 0, 128);
++#endif
+       
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)        
+       memset(&sis_disp, 0, sizeof(sis_disp));
+@@ -3877,6 +4261,12 @@ int __init sisfb_init(void)
+               sisfb_hwcursor_size = HW_CURSOR_AREA_SIZE_315 * 2;
+               sisfb_CRT2_write_enable = IND_SIS_CRT2_WRITE_ENABLE_315;
+               break;
++         case PCI_DEVICE_ID_SI_660_VGA:
++              ivideo.chip = SIS_660;
++              sisvga_engine = SIS_315_VGA;
++              sisfb_hwcursor_size = HW_CURSOR_AREA_SIZE_315 * 2;
++              sisfb_CRT2_write_enable = IND_SIS_CRT2_WRITE_ENABLE_315;
++              break;
+ #endif
+            default:
+               return -ENODEV;
+@@ -3902,30 +4292,34 @@ int __init sisfb_init(void)
+       SiS_Pr.SiS_Backup70xx = 0xff;
+         SiS_Pr.SiS_CHOverScan = -1;
+         SiS_Pr.SiS_ChSW = FALSE;
++      SiS_Pr.SiS_CustomT = CUT_NONE;
+       SiS_Pr.SiS_UseLCDA = FALSE;
+       SiS_Pr.UsePanelScaler = -1;
+       SiSRegInit(&SiS_Pr, (USHORT)sishw_ext.ulIOAddress);
+ #ifdef CONFIG_FB_SIS_300
+-      /* TW: Find PCI systems for Chrontel/ISA bridge manipulation */
++      /* TW: Find PCI systems for Chrontel/GPIO communication setup */
+       if(ivideo.chip == SIS_630) {
+-        int i=0;
+-          do {
+-          if(mychswtable[i].subsysVendor == ivideo.subsysvendor &&
+-             mychswtable[i].subsysCard   == ivideo.subsysdevice) {
+-              SiS_Pr.SiS_ChSW = TRUE;
+-            }
+-            i++;
+-          } while(mychswtable[i].subsysVendor != 0);
++         int i=0;
++           do {
++            if(mychswtable[i].subsysVendor == ivideo.subsysvendor &&
++               mychswtable[i].subsysCard   == ivideo.subsysdevice) {
++               SiS_Pr.SiS_ChSW = TRUE;
++               printk(KERN_DEBUG "sisfb: Identified [%s %s] requiring Chrontel/GPIO setup\n",
++                      mychswtable[i].vendorName, mychswtable[i].cardName);
++               break;
++              }
++              i++;
++           } while(mychswtable[i].subsysVendor != 0);
+       }
+ #endif
+         outSISIDXREG(SISSR, IND_SIS_PASSWORD, SIS_PASSWORD);
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)                
+-#ifdef MODULE 
++#ifdef MODULE
+       inSISIDXREG(SISCR,0x34,reg);
+-      if(reg & 0x80) {
++      if((reg & 0x80) && (reg != 0xff)) {
+          if((sisbios_mode[sisfb_mode_idx].mode_no) != 0xFF) {
+             printk(KERN_INFO "sisfb: Cannot initialize display mode, X server is active\n");
+             return -EBUSY;
+@@ -3938,7 +4332,7 @@ int __init sisfb_init(void)
+ #ifdef CONFIG_FB_SIS_300
+       if (sisvga_engine == SIS_300_VGA) {
+-              outSISIDXREG(SISSR, 0x28, 0x37);
++              outSISIDXREG(SISSR, 0x28, 0x37);        /* Reset memory clock */
+                 outSISIDXREG(SISSR, 0x29, 0x61);
+@@ -3946,7 +4340,8 @@ int __init sisfb_init(void)
+       }
+ #endif
+ #ifdef CONFIG_FB_SIS_315
+-      if (ivideo.chip == SIS_550 || ivideo.chip == SIS_650 || ivideo.chip == SIS_740) {
++      if (ivideo.chip == SIS_550 || ivideo.chip == SIS_650 ||
++          ivideo.chip == SIS_740 || ivideo.chip == SIS_660) {
+               outSISIDXREG(SISSR, 0x28, 0x5a);
+                 outSISIDXREG(SISSR, 0x29, 0x64);
+@@ -3967,6 +4362,7 @@ int __init sisfb_init(void)
+                  case SIS_550:
+                  case SIS_650:
+                  case SIS_740:
++                 case SIS_660:
+                       sishw_ext.bIntegratedMMEnabled = TRUE;
+                       break;
+                  default:
+@@ -4006,13 +4402,45 @@ int __init sisfb_init(void)
+       sishw_ext.pQueryNorthBridgeSpace = &sisfb_query_north_bridge_space;
+       strcpy(sishw_ext.szVBIOSVer, "0.84");
+-      /* TW: Mode numbers for 1280x960 are different for 300 and 310/325 series */
++        /* Find systems for special custom timing */
++      if(sishw_ext.UseROM) {
++         int i=0,j;
++         unsigned char *biosver = sishw_ext.pjVirtualRomBase + 0x06;
++           unsigned char *biosdate = sishw_ext.pjVirtualRomBase + 0x2c;
++         BOOLEAN footprint;
++           do {
++            if( (mycustomttable[i].chipID == ivideo.chip) &&
++                (!strncmp(mycustomttable[i].biosversion, biosver, strlen(mycustomttable[i].biosversion))) &&
++                (!strncmp(mycustomttable[i].biosdate, biosdate, strlen(mycustomttable[i].biosdate))) ) {
++               footprint = TRUE;
++               for(j=0; j<5; j++) {
++                 if(mycustomttable[i].biosFootprintAddr[j]) {
++                    if(sishw_ext.pjVirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] !=
++                              mycustomttable[i].biosFootprintData[j])
++                       footprint = FALSE;
++                 }
++               }
++               if(footprint) {
++                  SiS_Pr.SiS_CustomT = mycustomttable[i].SpecialID;
++                  printk(KERN_DEBUG "sisfb: Identified [%s %s] for non-standard timing\n",
++                      mycustomttable[i].vendorName,
++                      mycustomttable[i].cardName);
++                  break;
++                 }
++            }
++              i++;
++           } while(mycustomttable[i].chipID);
++      }
++
++#ifdef CONFIG_FB_SIS_300
++      /* TW: Mode numbers for 1280x768 are different for 300 and 315 series */
+       if(sisvga_engine == SIS_300_VGA) {
+-              sisbios_mode[MODEINDEX_1280x960].mode_no = 0x6e;
+-              sisbios_mode[MODEINDEX_1280x960+1].mode_no = 0x6f;
+-              sisbios_mode[MODEINDEX_1280x960+2].mode_no = 0x7b;
+-              sisbios_mode[MODEINDEX_1280x960+3].mode_no = 0x7b;
++              sisbios_mode[MODEINDEX_1280x768].mode_no = 0x55;
++              sisbios_mode[MODEINDEX_1280x768+1].mode_no = 0x5a;
++              sisbios_mode[MODEINDEX_1280x768+2].mode_no = 0x5b;
++              sisbios_mode[MODEINDEX_1280x768+3].mode_no = 0x5b;
+       }
++#endif
+       sishw_ext.pSR = vmalloc(sizeof(SIS_DSReg) * SR_BUFFER_SIZE);
+       if (sishw_ext.pSR == NULL) {
+@@ -4167,121 +4595,54 @@ int __init sisfb_init(void)
+       }
+       ivideo.mtrr = (unsigned int) 0;
++      
++      ivideo.vbflags = 0;
+       if((sisfb_mode_idx < 0) || ((sisbios_mode[sisfb_mode_idx].mode_no) != 0xFF)) { 
+-
+-#ifdef CONFIG_FB_SIS_300
+-              if (sisvga_engine == SIS_300_VGA) {
+-                      sisfb_get_VB_type_300();
+-              }
+-#endif
+-
+-#ifdef CONFIG_FB_SIS_315
+-              if (sisvga_engine == SIS_315_VGA) {
+-                      sisfb_get_VB_type_315();
+-              }
+-#endif
+-
++      
+               sishw_ext.ujVBChipID = VB_CHIP_UNKNOWN;
+               sishw_ext.Is301BDH = FALSE;
+               sishw_ext.usExternalChip = 0;
+-
+-              switch (ivideo.hasVB) {
+-
+-              case HASVB_301:
+-                      inSISIDXREG(SISPART4, 0x01, reg);
+-                      if (reg >= 0xE0) {
+-                              sishw_ext.ujVBChipID = VB_CHIP_302LV;
+-                              printk(KERN_INFO "sisfb: SiS302LV bridge detected (revision 0x%02x)\n",reg);
+-                      } else if (reg >= 0xD0) {
+-                              sishw_ext.ujVBChipID = VB_CHIP_301LV;
+-                              printk(KERN_INFO "sisfb: SiS301LV bridge detected (revision 0x%02x)\n",reg);
+-                      } else if (reg >= 0xB0) {
+-                              sishw_ext.ujVBChipID = VB_CHIP_301B;
+-                              inSISIDXREG(SISPART4,0x23,reg1);
+-                              if(!(reg1 & 0x02)) sishw_ext.Is301BDH = TRUE;
+-                              printk(KERN_INFO "sisfb: SiS301B%s bridge detected (revision 0x%02x)\n",
+-                                      (sishw_ext.Is301BDH ? "-DH" : ""), reg);
+-                      } else {
+-                              sishw_ext.ujVBChipID = VB_CHIP_301;
+-                              printk(KERN_INFO "sisfb: SiS301 bridge detected\n");
+-                      }
+-                      break;
+-              case HASVB_302:
+-                      inSISIDXREG(SISPART4, 0x01, reg);
+-                      if (reg >= 0xE0) {
+-                              sishw_ext.ujVBChipID = VB_CHIP_302LV;
+-                              printk(KERN_INFO "sisfb: SiS302LV bridge detected (revision 0x%02x)\n",reg);
+-                      } else if (reg >= 0xD0) {
+-                              sishw_ext.ujVBChipID = VB_CHIP_301LV;
+-                              printk(KERN_INFO "sisfb: SiS302LV bridge detected (revision 0x%02x)\n",reg);
+-                      } else if (reg >= 0xB0) {
+-                              inSISIDXREG(SISPART4,0x23,reg1);
+-                              if(!(reg1 & 0x02)) sishw_ext.Is301BDH = TRUE;
+-                              sishw_ext.ujVBChipID = VB_CHIP_302B;
+-                              printk(KERN_INFO "sisfb: SiS302B%s bridge detected (revision 0x%02x)\n",
+-                                      (sishw_ext.Is301BDH ? "-DH" : ""), reg);
+-                      } else {
+-                              sishw_ext.ujVBChipID = VB_CHIP_302;
+-                              printk(KERN_INFO "sisfb: SiS302 bridge detected\n");
+-                      }
+-                      break;
+-              case HASVB_LVDS:
+-                      sishw_ext.usExternalChip = 0x1;
+-                      printk(KERN_INFO "sisfb: LVDS transmitter detected\n");
+-                      break;
+-              case HASVB_TRUMPION:
+-                      sishw_ext.usExternalChip = 0x2;
+-                      printk(KERN_INFO "sisfb: Trumpion Zurac LVDS scaler detected\n");
+-                      break;
+-              case HASVB_CHRONTEL:
+-                      sishw_ext.usExternalChip = 0x4;
+-                      printk(KERN_INFO "sisfb: Chrontel TV encoder detected\n");
+-                      break;
+-              case HASVB_LVDS_CHRONTEL:
+-                      sishw_ext.usExternalChip = 0x5;
+-                      printk(KERN_INFO "sisfb: LVDS transmitter and Chrontel TV encoder detected\n");
+-                      break;
+-              default:
+-                      printk(KERN_INFO "sisfb: No or unknown bridge type detected\n");
+-                      break;
+-              }
+-
+-              if (ivideo.hasVB != HASVB_NONE) {
+-#ifdef CONFIG_FB_SIS_300
+-                    if (sisvga_engine == SIS_300_VGA) {
+-                              sisfb_detect_VB_connect_300();
+-                      }
+-#endif
+-#ifdef CONFIG_FB_SIS_315
+-                    if (sisvga_engine == SIS_315_VGA) {
+-                              sisfb_detect_VB_connect_315();
+-                      }
+-#endif
++      
++              sisfb_get_VB_type();
++              
++              if(ivideo.vbflags & VB_VIDEOBRIDGE) {
++                      sisfb_detect_VB_connect();
+               }
+-
+-              if (ivideo.disp_state & DISPTYPE_DISP2) {
+-                      if (sisfb_crt1off)
+-                              ivideo.disp_state |= DISPMODE_SINGLE;
+-                      else
+-                              ivideo.disp_state |= (DISPMODE_MIRROR | DISPTYPE_CRT1);
+-              } else {
+-                      ivideo.disp_state = DISPMODE_SINGLE | DISPTYPE_CRT1;
++              
++              ivideo.currentvbflags = ivideo.vbflags & VB_VIDEOBRIDGE;
++              
++              if(ivideo.vbflags & VB_VIDEOBRIDGE) {
++                 if(sisfb_crt2type != -1) {
++                    if((sisfb_crt2type == CRT2_LCD) && (ivideo.vbflags & CRT2_LCD)) {
++                       ivideo.currentvbflags |= CRT2_LCD;
++                    } else if(sisfb_crt2type != CRT2_LCD) {
++                       ivideo.currentvbflags |= sisfb_crt2type;
++                    }
++                 } else {
++                    /* Chrontel 700x TV detection often unreliable, therefore use a
++                     * different default order on such machines
++                     */
++                    if((sisvga_engine == SIS_300_VGA) && (ivideo.vbflags & VB_CHRONTEL)) {
++                       if(ivideo.vbflags & CRT2_LCD)      ivideo.currentvbflags |= CRT2_LCD;
++                       else if(ivideo.vbflags & CRT2_TV)  ivideo.currentvbflags |= CRT2_TV;
++                       else if(ivideo.vbflags & CRT2_VGA) ivideo.currentvbflags |= CRT2_VGA;
++                    } else {
++                       if(ivideo.vbflags & CRT2_TV)       ivideo.currentvbflags |= CRT2_TV;
++                       else if(ivideo.vbflags & CRT2_LCD) ivideo.currentvbflags |= CRT2_LCD;
++                       else if(ivideo.vbflags & CRT2_VGA) ivideo.currentvbflags |= CRT2_VGA;
++                    }
++                 }
+               }
+-              if (ivideo.disp_state & DISPTYPE_LCD) {
+-                  if (!enable_dstn) {
+-                      inSISIDXREG(SISCR, IND_SIS_LCD_PANEL, reg);
+-                      reg &= 0x0f;
+-                      if (sisvga_engine == SIS_300_VGA) {
+-                          sishw_ext.ulCRT2LCDType = sis300paneltype[reg];
+-                      } else {
+-                          sishw_ext.ulCRT2LCDType = sis310paneltype[reg];
+-                      }
+-                  } else {
+-                      /* TW: FSTN/DSTN */
+-                      sishw_ext.ulCRT2LCDType = LCD_320x480;
+-                  }
++              if(ivideo.vbflags & CRT2_LCD) {
++                 inSISIDXREG(SISCR, IND_SIS_LCD_PANEL, reg);
++                 reg &= 0x0f;
++                 if(sisvga_engine == SIS_300_VGA) {
++                    sishw_ext.ulCRT2LCDType = sis300paneltype[reg];
++                 } else {
++                    sishw_ext.ulCRT2LCDType = sis310paneltype[reg];
++                 }
+               }
+               
+               sisfb_detectedpdc = 0;
+@@ -4289,9 +4650,7 @@ int __init sisfb_init(void)
+ #ifdef CONFIG_FB_SIS_300
+                 /* TW: Save the current PanelDelayCompensation if the LCD is currently used */
+               if(sisvga_engine == SIS_300_VGA) {
+-                if((sishw_ext.usExternalChip == 0x01) ||   /* LVDS */
+-                   (sishw_ext.usExternalChip == 0x05) ||   /* LVDS+Chrontel */
+-                   (sishw_ext.Is301BDH)) {                 /* 301B-DH */
++                if(ivideo.vbflags & (VB_LVDS | VB_30xBDH)) {
+                      int tmp;
+                      inSISIDXREG(SISCR,0x30,tmp);
+                      if(tmp & 0x20) {
+@@ -4320,54 +4679,57 @@ int __init sisfb_init(void)
+ #ifdef CONFIG_FB_SIS_315
+                 /* TW: Try to find about LCDA */
+               if(sisvga_engine == SIS_315_VGA) {
+-                if((sishw_ext.ujVBChipID == VB_CHIP_302B) ||
+-                   (sishw_ext.ujVBChipID == VB_CHIP_301LV) ||
+-                   (sishw_ext.ujVBChipID == VB_CHIP_302LV)) {
+-                     int tmp;
+-                     inSISIDXREG(SISCR,0x34,tmp);
+-                     if(tmp <= 0x13) {        
+-                        /* Currently on LCDA? (Some BIOSes leave CR38) */
+-                        inSISIDXREG(SISCR,0x38,tmp);
+-                        if((tmp & 0x03) == 0x03) {
+-                           SiS_Pr.SiS_UseLCDA = TRUE;
+-                        } else {
+-                           /* Currently on LCDA? (Some newer BIOSes set D0 in CR35) */
+-                           inSISIDXREG(SISCR,0x35,tmp);
+-                           if(tmp & 0x01) {
+-                              SiS_Pr.SiS_UseLCDA = TRUE;
+-                           } else {
+-                              /* Currently on LCD? If so, we can find out 
+-                                 by peeking the mode register 
+-                               */
+-                              inSISIDXREG(SISCR,0x30,tmp);
+-                              if(tmp & 0x20) {
+-                                 inSISIDXREG(SISPART1,0x13,tmp);
+-                                 if(tmp & 0x04) {
+-                                    SiS_Pr.SiS_UseLCDA = TRUE;
+-                                 }
+-                              }
+-                           }
+-                        }
+-                     } 
+-                     if(SiS_Pr.SiS_UseLCDA) {
+-                        sisfb_detectedlcda = 0x03;
+-                        printk(KERN_INFO
+-                               "sisfb: Bridge uses LCDA for low resolution and text modes\n");
+-                     }
++                 if(ivideo.vbflags & (VB_302B | VB_301LV | VB_302LV)) {
++                    int tmp;
++                    inSISIDXREG(SISCR,0x34,tmp);
++                    if((tmp <= 0x13) || (tmp == 0xff)) {
++                       /* Currently on LCDA? (Some BIOSes leave CR38) */
++                       inSISIDXREG(SISCR,0x38,tmp);
++                       if((tmp & 0x03) == 0x03)  SiS_Pr.SiS_UseLCDA = TRUE;
++                       else {
++                          /* Currently on LCDA? (Some newer BIOSes set D0 in CR35) */
++                          inSISIDXREG(SISCR,0x35,tmp);
++                          if(tmp & 0x01) SiS_Pr.SiS_UseLCDA = TRUE;
++                          else {
++                             /* Currently on LCD? If so, we can find out
++                              * by peeking the mode register
++                              */
++                             inSISIDXREG(SISCR,0x30,tmp);
++                             if(tmp & 0x20) {
++                                inSISIDXREG(SISPART1,0x13,tmp);
++                                if(tmp & 0x04) SiS_Pr.SiS_UseLCDA = TRUE;
++                             }
++                          }
++                       }
++                    }
++                    if(SiS_Pr.SiS_UseLCDA) {
++                       sisfb_detectedlcda = 0x03;
++                       printk(KERN_INFO
++                              "sisfb: Bridge uses LCDA for low resolution and text modes\n");
++                    }
+                 }
+               }
+ #endif
+ #endif
++              if (!sisfb_crt1off) {
++                      sisfb_handle_ddc(&sisfb_thismonitor, 0);
++              } else {
++                      if ((ivideo.vbflags & (VB_301|VB_301B|VB_302B)) &&
++                          (ivideo.vbflags & (CRT2_VGA | CRT2_LCD))) {
++                              sisfb_handle_ddc(&sisfb_thismonitor, 1);
++                      }
++              }
++
+               if (sisfb_mode_idx >= 0)
+-                      sisfb_mode_idx = sisfb_validate_mode(sisfb_mode_idx);
++                      sisfb_mode_idx = sisfb_validate_mode(sisfb_mode_idx, ivideo.currentvbflags);
+               if (sisfb_mode_idx < 0) {
+-                      switch (ivideo.disp_state & DISPTYPE_DISP2) {
+-                         case DISPTYPE_LCD:
++                      switch (ivideo.currentvbflags & VB_DISPTYPE_DISP2) {
++                         case CRT2_LCD:
+                               sisfb_mode_idx = DEFAULT_LCDMODE;
+                               break;
+-                         case DISPTYPE_TV:
++                         case CRT2_TV:
+                               sisfb_mode_idx = DEFAULT_TVMODE;
+                               break;
+                          default:
+@@ -4379,39 +4741,27 @@ int __init sisfb_init(void)
+               sisfb_mode_no = sisbios_mode[sisfb_mode_idx].mode_no;
+               if (ivideo.refresh_rate != 0)
+-                      sisfb_search_refresh_rate(ivideo.refresh_rate);
++                      sisfb_search_refresh_rate(ivideo.refresh_rate, sisfb_mode_idx);
+               if (sisfb_rate_idx == 0) {
+                       sisfb_rate_idx = sisbios_mode[sisfb_mode_idx].rate_idx;
+                       ivideo.refresh_rate = 60;
+               }
++              if (sisfb_thismonitor.datavalid) {
++                      if(!sisfb_verify_rate(&sisfb_thismonitor, sisfb_mode_idx,
++                                            sisfb_rate_idx, ivideo.refresh_rate)) {
++                              printk(KERN_INFO "sisfb: WARNING: Refresh rate exceeds monitor specs!\n");
++                      }
++              }
++
+               ivideo.video_bpp = sisbios_mode[sisfb_mode_idx].bpp;
+               ivideo.video_vwidth = ivideo.video_width = sisbios_mode[sisfb_mode_idx].xres;
+               ivideo.video_vheight = ivideo.video_height = sisbios_mode[sisfb_mode_idx].yres;
+               ivideo.org_x = ivideo.org_y = 0;
+               ivideo.video_linelength = ivideo.video_width * (ivideo.video_bpp >> 3);
+-              switch(ivideo.video_bpp) {
+-              case 8:
+-                      ivideo.DstColor = 0x0000;
+-                      ivideo.SiS310_AccelDepth = 0x00000000;
+-                      ivideo.video_cmap_len = 256;
+-                      break;
+-              case 16:
+-                      ivideo.DstColor = 0x8000;
+-                      ivideo.SiS310_AccelDepth = 0x00010000;
+-                      ivideo.video_cmap_len = 16;
+-                      break;
+-              case 32:
+-                      ivideo.DstColor = 0xC000;
+-                      ivideo.SiS310_AccelDepth = 0x00020000;
+-                      ivideo.video_cmap_len = 16;
+-                      break;
+-              default:
+-                      ivideo.video_cmap_len = 16;
+-                      printk(KERN_INFO "sisfb: Unsupported depth %d", ivideo.video_bpp);
+-                      break;
+-              }
++              
++              sisfb_set_vparms();
+               
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)        
+@@ -4424,23 +4774,45 @@ int __init sisfb_init(void)
+               sisfb_pre_setmode();
+               if (SiSSetMode(&SiS_Pr, &sishw_ext, sisfb_mode_no) == 0) {
+-                      printk(KERN_ERR "sisfb: Setting mode[0x%x] failed, using default mode\n", 
++                      printk(KERN_ERR "sisfb: Fatal error: Setting mode[0x%x] failed\n",
+                               sisfb_mode_no);
+-                      return -1;
++                      vfree(sishw_ext.pSR);
++                      vfree(sishw_ext.pCR);
++                      release_mem_region(ivideo.video_base, ivideo.video_size);
++                      release_mem_region(ivideo.mmio_base, sisfb_mmio_size);
++                      return -EINVAL;
+               }
+               outSISIDXREG(SISSR, IND_SIS_PASSWORD, SIS_PASSWORD);
+               sisfb_post_setmode();
++              
++              ivideo.accel = 0;
++              if(sisfb_accel) {
++                 ivideo.accel = -1;
++                 default_var.accel_flags |= FB_ACCELF_TEXT;
++                 sisfb_initaccel();
++              }
+               sisfb_crtc_to_var(&default_var);
+               
++              sis_fb_info.node = -1;
++              sis_fb_info.flags = FBINFO_FLAG_DEFAULT;
++              sis_fb_info.blank = &sisfb_blank;
++              sis_fb_info.fbops = &sisfb_ops;
++              sis_fb_info.switch_con = &sisfb_switch;
++              sis_fb_info.updatevar = &sisfb_update_var;
++              sis_fb_info.changevar = NULL;
++              sis_fb_info.disp = &sis_disp;
++                      
++              sisfb_set_disp(-1, &default_var, &sis_fb_info);
++              
+ #else         /* --------- For 2.5: Setup a somewhat sane default var ------------ */
+               printk(KERN_INFO "sisfb: Default mode is %dx%dx%d (%dHz)\n",
+                       ivideo.video_width, ivideo.video_height, ivideo.video_bpp,
+                       ivideo.refresh_rate);
+-                      
++
+               default_var.xres = default_var.xres_virtual = ivideo.video_width;
+               default_var.yres = default_var.yres_virtual = ivideo.video_height;
+               default_var.bits_per_pixel = ivideo.video_bpp;
+@@ -4457,50 +4829,26 @@ int __init sisfb_init(void)
+                        &default_var.upper_margin, &default_var.lower_margin,
+                        &default_var.hsync_len, &default_var.vsync_len,
+                        &default_var.sync, &default_var.vmode)) {
+-                       
+-                 if((default_var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+-                    default_var.yres <<= 1;
+-                    default_var.yres_virtual <<= 1;
+-                 } else if((default_var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+-                    default_var.pixclock >>= 1;
+-                    default_var.yres >>= 1;
+-                    default_var.yres_virtual >>= 1;
+-                 }
+-                 
++                      if((default_var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
++                              default_var.pixclock <<= 1;
++                      }
+               }
+-#ifdef SISFB_PAN
+-              if(sisfb_ypan) {
+-                      default_var.yres_virtual = 
+-                              ivideo.heapstart / (default_var.xres * (default_var.bits_per_pixel >> 3));
+-                      if(default_var.yres_virtual <= default_var.yres) {
+-                              default_var.yres_virtual = default_var.yres;
+-                      }
+-              } 
+-#endif
+               
+-#endif
+-
+               ivideo.accel = 0;
+               if(sisfb_accel) {
+                  ivideo.accel = -1;
+                  default_var.accel_flags |= FB_ACCELF_TEXT;
+                  sisfb_initaccel();
+               }
++              
++              if(sisfb_ypan) {
++                      default_var.yres_virtual = 
++                              ivideo.heapstart / (default_var.xres * (default_var.bits_per_pixel >> 3));
++                      if(default_var.yres_virtual <= default_var.yres) {
++                              default_var.yres_virtual = default_var.yres;
++                      }
++              } 
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)                /* ---- 2.4 series init ---- */
+-              sis_fb_info.node = -1;
+-              sis_fb_info.flags = FBINFO_FLAG_DEFAULT;
+-              sis_fb_info.blank = &sisfb_blank;
+-              sis_fb_info.fbops = &sisfb_ops;
+-              sis_fb_info.switch_con = &sisfb_switch;
+-              sis_fb_info.updatevar = &sisfb_update_var;
+-              sis_fb_info.changevar = NULL;
+-              sis_fb_info.disp = &sis_disp;
+-                      
+-              sisfb_set_disp(-1, &default_var, &sis_fb_info);
+-#endif
+-
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)               /* ---- 2.5 series init ---- */
+               sis_fb_info.flags = FBINFO_FLAG_DEFAULT;
+               sis_fb_info.var = default_var;
+               sis_fb_info.fix = sisfb_fix;
+@@ -4513,6 +4861,8 @@ int __init sisfb_init(void)
+               fb_alloc_cmap(&sis_fb_info.cmap, 256 , 0);
+ #endif
++              printk(KERN_INFO "sisfb: Initial vbflags 0x%lx\n", ivideo.vbflags);
++
+ #ifdef CONFIG_MTRR
+               ivideo.mtrr = mtrr_add((unsigned int) ivideo.video_base,
+                               (unsigned int) ivideo.video_size,
+@@ -4526,11 +4876,17 @@ int __init sisfb_init(void)
+               vc_resize_con(1, 1, 0);
+ #endif
+-              TWDEBUG("Before calling register_framebuffer");
+-              
+-              if(register_framebuffer(&sis_fb_info) < 0)
++              if(register_framebuffer(&sis_fb_info) < 0) {
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++                      vfree(sishw_ext.pSR);
++                      vfree(sishw_ext.pCR);
++                      release_mem_region(ivideo.video_base, ivideo.video_size);
++                      release_mem_region(ivideo.mmio_base, sisfb_mmio_size);
++#endif
++                      printk(KERN_ERR "sisfb: Fatal error: Failed to register framebuffer\n");
+                       return -EINVAL;
+-                      
++              }
++
+               sisfb_registered = 1;                   
+               printk(KERN_INFO "sisfb: Installed SISFB_GET_INFO ioctl (%x)\n", SISFB_GET_INFO);
+@@ -4547,9 +4903,11 @@ int __init sisfb_init(void)
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+               printk(KERN_INFO "fb%d: %s frame buffer device, Version %d.%d.%02d\n",
+-                      sis_fb_info.node, myid, VER_MAJOR, VER_MINOR, VER_LEVEL);                            
++                      sis_fb_info.node, myid, VER_MAJOR, VER_MINOR, VER_LEVEL);
+ #endif
++              printk(KERN_INFO "sisfb: (C) 2001-2003 Thomas Winischhofer. All rights reserved.\n");
++
+       }       /* TW: if mode = "none" */
+       return 0;
+ }
+@@ -4562,7 +4920,6 @@ static int          vesa = -1;
+ static unsigned int rate = 0;
+ static unsigned int crt1off = 1;
+ static unsigned int mem = 0;
+-static unsigned int dstn = 0;
+ static char         *forcecrt2type = NULL;
+ static int          forcecrt1 = -1;
+ static char         *queuemode = NULL;
+@@ -4575,25 +4932,31 @@ static int          inverse = 0;
+ static int          userom = 1;
+ static int          useoem = -1;
+ static char         *tvstandard = NULL;
++static int        nocrt2rate = 0;
+-MODULE_DESCRIPTION("SiS 300/540/630/730/315/550/650/740/330 framebuffer driver");
++MODULE_DESCRIPTION("SiS 300/540/630/730/315/550/650/740/330/660 framebuffer driver");
+ MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("SiS; Thomas Winischhofer <thomas@winischhofer.net>; Various others");
++MODULE_AUTHOR("Thomas Winischhofer <thomas@winischhofer.net>; SiS; Various others");
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ MODULE_PARM(mode, "s");
+ MODULE_PARM_DESC(mode,
+        "\nSelects the desired display mode in the format [X]x[Y]x[Depth], eg.\n"
+-         "800x600x16 (default: none if sisfb is a module; this leaves the\n"
+-       "console untouched and the driver will only do the video memory\n"
+-       "management for eg. DRM/DRI; 800x600x8 if sisfb is in the kernel)");
++         "1024x768x16. Other formats supported include XxY-Depth and\n"
++       "XxY-Depth@Rate. If the parameter is only one (decimal or hexadecimal)\n"
++       "number, it will be interpreted as a VESA mode number. (default: none if\n"
++       "sisfb is a module; this leaves the console untouched and the driver will\n"
++       "only do the video memory management for eg. DRM/DRI; 800x600x8 if sisfb\n"
++       "is in the kernel)");
+ #endif
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)        
+ MODULE_PARM(mode, "s");
+ MODULE_PARM_DESC(mode,
+-       "\nSelects the desired default display mode in the format [X]x[Y]x[Depth],\n"
+-         "eg. 1024x768x16 (default: 800x600x8)");
+-#endif         
++       "\nSelects the desired default display mode in the format XxYxDepth,\n"
++         "eg. 1024x768x16. Other formats supported include XxY-Depth and\n"
++       "XxY-Depth@Rate. If the parameter is only one (decimal or hexadecimal)\n"
++       "number, it will be interpreted as a VESA mode number. (default: 800x600x8)");
++#endif
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ MODULE_PARM(vesa, "i");
+@@ -4603,17 +4966,18 @@ MODULE_PARM_DESC(vesa,
+        "and the driver will only do the video memory management for eg. DRM/DRI;\n"
+        "0x0103 if sisfb is in the kernel)");
+ #endif
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)        
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ MODULE_PARM(vesa, "i");
+ MODULE_PARM_DESC(vesa,
+        "\nSelects the desired default display mode by VESA defined mode number, eg.\n"
+          "0x117 (default: 0x0103)");
+-#endif         
++#endif
+ MODULE_PARM(rate, "i");
+ MODULE_PARM_DESC(rate,
+       "\nSelects the desired vertical refresh rate for CRT1 (external VGA) in Hz.\n"
+-      "(default: 60)");
++        "If the mode is specified in the format XxY-Depth@Rate, this parameter\n"
++        "will be ignored (default: 60)");
+ MODULE_PARM(crt1off,   "i");
+ MODULE_PARM_DESC(crt1off,
+@@ -4624,14 +4988,9 @@ MODULE_PARM_DESC(filter,
+       "\nSelects TV flicker filter type (only for systems with a SiS301 video bridge).\n"
+         "(Possible values 0-7, default: [no filter])");
+-MODULE_PARM(dstn,   "i");
+-MODULE_PARM_DESC(dstn,
+-      "\nSelects DSTN/FSTN display mode for SiS550. This sets CRT2 type to LCD and\n"
+-        "overrides forcecrt2type setting. (1=ON, 0=OFF) (default: 0)");
+-
+ MODULE_PARM(queuemode,   "s");
+ MODULE_PARM_DESC(queuemode,
+-      "\nSelects the queue mode on 315/550/650/740/330. Possible choices are AGP, VRAM or\n"
++      "\nSelects the queue mode on 315/550/650/740/330/660. Possible choices are AGP, VRAM,\n"
+         "MMIO. AGP is only available if the kernel has AGP support. The queue mode is\n"
+         "important to programs using the 2D/3D accelerator of the SiS chip. The modes\n"
+         "require a totally different way of programming the engines. If any mode than\n"
+@@ -4673,56 +5032,61 @@ MODULE_PARM_DESC(pdc,
+ MODULE_PARM(noaccel, "i");
+ MODULE_PARM_DESC(noaccel,
+         "\nIf set to anything other than 0, 2D acceleration and y-panning will be\n"
+-      "disabled. (default: 0)");
++        "disabled. (default: 0)");
+ MODULE_PARM(noypan, "i");
+ MODULE_PARM_DESC(noypan,
+         "\nIf set to anything other than 0, y-panning will be disabled and scrolling\n"
+-      "will be performed by redrawing the screen. This required 2D acceleration, so\n"
+-      "if the option noaccel is set, y-panning will be disabled. (default: 0)");
++        "will be performed by redrawing the screen. This required 2D acceleration, so\n"
++        "if the option noaccel is set, y-panning will be disabled. (default: 0)");
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)        
+ MODULE_PARM(inverse, "i");
+ MODULE_PARM_DESC(inverse,
+         "\nSetting this to anything but 0 should invert the display colors, but this\n"
+-      "does not seem to work. (default: 0)");
++        "does not seem to work. (default: 0)");
+ #endif        
+ MODULE_PARM(userom, "i");
+ MODULE_PARM_DESC(userom,
+         "\nSetting this to 0 keeps sisfb from using the video BIOS data which is needed\n"
+-      "for some LCD and TV setup. (default: 1)");
++        "for some LCD and TV setup. (default: 1)");
+ MODULE_PARM(useoem, "i");
+ MODULE_PARM_DESC(useoem,
+         "\nSetting this to 0 keeps sisfb from using its internel OEM data for some LCD\n"
+-      "panels and TV connector types. (default: auto)");
++        "panels and TV connector types. (default: auto)");
+ MODULE_PARM(tvstandard, "s");
+ MODULE_PARM_DESC(tvstandard,
+       "\nThis allows overriding the BIOS default for the TV standard. Valid choices are\n"
+-      "pal and ntsc. (default: auto)");
++        "pal and ntsc. (default: auto)");
++MODULE_PARM(nocrt2rate, "i");
++MODULE_PARM_DESC(nocrt2rate,
++      "\nSetting this to 1 will force the driver to use the default refresh rate for\n"
++        "CRT2 if CRT2 type is VGA. (default: 0, use same rate as crt1)");
++      
+ int init_module(void)
+ {
+       int err;
+-      
++
++      ivideo.refresh_rate = sisfb_parm_rate = rate;
++
+       if(mode)
+-              sisfb_search_mode(mode);
++              sisfb_search_mode(mode, FALSE);
+       else if(vesa != -1)
+-              sisfb_search_vesamode(vesa);
+-      else  
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)        
++              sisfb_search_vesamode(vesa, FALSE);
++      else
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+               /* For 2.4, set mode=none if no mode is given  */
+               sisfb_mode_idx = MODE_INDEX_NONE;
+ #endif
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+-              /* For 2.5, we don't need this "mode=none" stuff anymore */     
++              /* For 2.5, we don't need this "mode=none" stuff anymore */
+               sisfb_mode_idx = DEFAULT_MODE;
+ #endif
+-      ivideo.refresh_rate = rate;
+-
+       if(forcecrt2type)
+               sisfb_search_crt2type(forcecrt2type);
+@@ -4745,9 +5109,6 @@ int init_module(void)
+       if(noypan == 1)       sisfb_ypan = 0;
+       else if(noypan == 0)  sisfb_ypan = 1;
+-
+-      /* TW: Panning only with acceleration */
+-      if(sisfb_accel == 0)  sisfb_ypan = 0;
+       
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+       if(inverse)           sisfb_inverse = 1;
+@@ -4759,17 +5120,11 @@ int init_module(void)
+       sisfb_useoem = useoem;
+-      enable_dstn = dstn;
+-
+-      /* TW: DSTN overrules forcecrt2type */
+-      if (enable_dstn)      sisfb_crt2type = DISPTYPE_LCD;
+-
+       if (queuemode)        sisfb_search_queuemode(queuemode);
+       
+       /* TW: If other queuemode than MMIO, disable 2D accel and ypan */
+       if((sisfb_queuemode != -1) && (sisfb_queuemode != MMIO_CMD)) {
+               sisfb_accel = 0;
+-              sisfb_ypan = 0;
+       }
+         if(pdc) {
+@@ -4777,6 +5132,8 @@ int init_module(void)
+               sisfb_pdc = pdc & 0x3c;
+          }
+       }
++      
++      sisfb_nocrt2rate = nocrt2rate;
+       if((err = sisfb_init()) < 0) return err;
+@@ -4788,7 +5145,7 @@ void cleanup_module(void)
+       /* TW: Release mem regions */
+       release_mem_region(ivideo.video_base, ivideo.video_size);
+       release_mem_region(ivideo.mmio_base, sisfb_mmio_size);
+-      
++
+ #ifdef CONFIG_MTRR
+       /* TW: Release MTRR region */
+       if(ivideo.mtrr) {
+@@ -4802,11 +5159,17 @@ void cleanup_module(void)
+       if(sisfb_registered) {
+               unregister_framebuffer(&sis_fb_info);
+       }
+-      
++
+       if(sishw_ext.pSR) vfree(sishw_ext.pSR);
+       if(sishw_ext.pCR) vfree(sishw_ext.pCR);
+       
+-      /* TODO: Restore the initial mode */
++      /* TODO: Restore the initial mode 
++       * This sounds easy but is as good as impossible
++       * on many machines with SiS chip and video bridge
++       * since text modes are always set up differently
++       * from machine to machine. Depends on the type
++       * of integration between chipset and bridge.
++       */
+       
+       printk(KERN_INFO "sisfb: Module unloaded\n");
+ }
+--- linux-2.6.0-test1/drivers/video/sis/sis_main.h     2003-06-14 12:18:04.000000000 -0700
++++ 25/drivers/video/sis/sis_main.h    2003-07-19 17:04:55.000000000 -0700
+@@ -1,8 +1,6 @@
+ #ifndef _SISFB_MAIN
+ #define _SISFB_MAIN
+-/* Comments and changes marked with "TW" by Thomas Winischhofer <thomas@winischhofer.net> */
+-
+ #include "vstruct.h"
+ /* ------------------- Constant Definitions ------------------------- */
+@@ -14,11 +12,11 @@
+ #define VER_MAJOR                 1
+ #define VER_MINOR                 6
+-#define VER_LEVEL                 1
++#define VER_LEVEL                 11
+ #include "sis.h"
+-/* TW: To be included in pci_ids.h */
++/* To be included in pci_ids.h */
+ #ifndef PCI_DEVICE_ID_SI_650_VGA
+ #define PCI_DEVICE_ID_SI_650_VGA  0x6325
+ #endif
+@@ -31,6 +29,12 @@
+ #ifndef PCI_DEVICE_ID_SI_330
+ #define PCI_DEVICE_ID_SI_330      0x0330
+ #endif
++#ifndef PCI_DEVICE_ID_SI_660
++#define PCI_DEVICE_ID_SI_660      0x0660
++#endif
++#ifndef PCI_DEVICE_ID_SI_660_VGA
++#define PCI_DEVICE_ID_SI_660_VGA  0x6330
++#endif
+ /* To be included in fb.h */
+ #ifndef FB_ACCEL_SIS_GLAMOUR_2
+@@ -59,7 +63,6 @@
+ #define COMMAND_QUEUE_THRESHOLD   0x1F
+ #endif
+-/* TW */
+ #define HW_CURSOR_AREA_SIZE_315   0x4000  /* 16K */
+ #define HW_CURSOR_AREA_SIZE_300   0x1000  /* 4K */
+@@ -283,45 +286,43 @@
+ /* Fbcon variables */
+ static struct fb_info sis_fb_info;
+-static int    video_type = FB_TYPE_PACKED_PIXELS;
+-
+ static struct fb_var_screeninfo default_var = {
+-      .xres           = 0,
+-      .yres           = 0,
+-      .xres_virtual   = 0,
+-      .yres_virtual   = 0,
+-      .xoffset        = 0,
+-      .yoffset        = 0,
+-      .bits_per_pixel = 0,
+-      .grayscale      = 0,
+-      .red            = {0, 8, 0},
+-      .green          = {0, 8, 0},
+-      .blue           = {0, 8, 0},
+-      .transp         = {0, 0, 0},
+-      .nonstd         = 0,
+-      .activate       = FB_ACTIVATE_NOW,
+-      .height         = -1,
+-      .width          = -1,
+-      .accel_flags    = 0,
+-      .pixclock       = 0,
+-      .left_margin    = 0,
+-      .right_margin   = 0,
+-      .upper_margin   = 0,
+-      .lower_margin   = 0,
+-      .hsync_len      = 0,
+-      .vsync_len      = 0,
+-      .sync           = 0,
+-      .vmode          = FB_VMODE_NONINTERLACED,
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)        
+-      .reserved       = {0, 0, 0, 0, 0, 0}
+-#endif        
++      .xres            = 0,
++      .yres            = 0,
++      .xres_virtual    = 0,
++      .yres_virtual    = 0,
++      .xoffset         = 0,
++      .yoffset         = 0,
++      .bits_per_pixel  = 0,
++      .grayscale       = 0,
++      .red             = {0, 8, 0},
++      .green           = {0, 8, 0},
++      .blue            = {0, 8, 0},
++      .transp          = {0, 0, 0},
++      .nonstd          = 0,
++      .activate        = FB_ACTIVATE_NOW,
++      .height          = -1,
++      .width           = -1,
++      .accel_flags     = 0,
++      .pixclock        = 0,
++      .left_margin     = 0,
++      .right_margin    = 0,
++      .upper_margin    = 0,
++      .lower_margin    = 0,
++      .hsync_len       = 0,
++      .vsync_len       = 0,
++      .sync            = 0,
++      .vmode           = FB_VMODE_NONINTERLACED,
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
++      .reserved        = {0, 0, 0, 0, 0, 0}
++#endif
+ };
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ static struct fb_fix_screeninfo sisfb_fix = {
+       .id             = "SiS",
+       .type           = FB_TYPE_PACKED_PIXELS,
+-      .xpanstep       = 1,
++      .xpanstep       = 0,
+       .ypanstep       = 1,
+ };
+ static char myid[20];
+@@ -347,26 +348,24 @@ static union {
+ } sis_fbcon_cmap;
+ static int sisfb_inverse = 0;
++static int currcon = 0;
+ #endif
+-/* display status */
++/* global flags */
+ static int sisfb_off = 0;
+ static int sisfb_crt1off = 0;
+ static int sisfb_forcecrt1 = -1;
+ static int sisvga_enabled = 0;
+ static int sisfb_userom = 1;
+ static int sisfb_useoem = -1;
+-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+-static int currcon = 0;
+-#endif
+-
+-/* global flags */
+-static int sisfb_registered;
+-static int sisfb_tvmode = 0;
++static int sisfb_parm_rate = -1;
++static int sisfb_registered = 0;
+ static int sisfb_mem = 0;
+ static int sisfb_pdc = 0;
+-static int enable_dstn = 0;
+ static int sisfb_ypan = -1;
++static int sisfb_nocrt2rate = 0;
++static int sisfb_dstn = 0;
++static int sisfb_fstn = 0;
+ VGA_ENGINE sisvga_engine = UNKNOWN_VGA;
+ int      sisfb_accel = -1;
+@@ -375,22 +374,22 @@ int         sisfb_accel = -1;
+ static int sisfb_hwcursor_size = 0;
+ static int sisfb_CRT2_write_enable = 0;
+-int sisfb_crt2type  = -1;     /* TW: CRT2 type (for overriding autodetection) */
+-int sisfb_tvplug    = -1;     /* PR: Tv plug type (for overriding autodetection) */
++int sisfb_crt2type  = -1;     /* CRT2 type (for overriding autodetection) */
++int sisfb_tvplug    = -1;     /* Tv plug type (for overriding autodetection) */
+-int sisfb_queuemode = -1;     /* TW: Use MMIO queue mode by default (310/325 series only) */
++int sisfb_queuemode = -1;     /* Use MMIO queue mode by default (315 series only) */
+ unsigned char sisfb_detectedpdc = 0;
+ unsigned char sisfb_detectedlcda = 0xff;
+-/* data for sis components */
++/* data for sis hardware ("par") */
+ struct video_info ivideo;
+-/* TW: For ioctl SISFB_GET_INFO */
++/* For ioctl SISFB_GET_INFO */
+ sisfb_info sisfbinfo;
+-/* TW: Hardware extension; contains data on hardware */
++/* Hardware extension; contains data on hardware */
+ HW_DEVICE_EXTENSION sishw_ext = {
+       NULL, NULL, FALSE, NULL, NULL,
+       0, 0, 0, 0, 0, 0, 0, 0, 0,
+@@ -399,10 +398,10 @@ HW_DEVICE_EXTENSION sishw_ext = {
+       0
+ };
+-/* TW: SiS private structure */
++/* SiS private structure */
+ SiS_Private  SiS_Pr;
+-/* card parameters */
++/* Card parameters */
+ static unsigned long sisfb_mmio_size = 0;
+ static u8            sisfb_caps = 0;
+@@ -412,7 +411,7 @@ typedef enum _SIS_CMDTYPE {
+       VM_CMD_QUEUE,
+ } SIS_CMDTYPE;
+-/* Supported SiS Chips list */
++/* List of supported chips */
+ static struct board {
+       u16 vendor, device;
+       const char *name;
+@@ -426,14 +425,15 @@ static struct board {
+       {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_550_VGA, "SIS 550 VGA"},
+       {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_650_VGA, "SIS 650/M650/651/740 VGA"},
+       {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_330,     "SIS 330"},
++      {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_660_VGA, "SIS 660 VGA"},
+       {0, 0, NULL}
+ };
+ #define MD_SIS300 1
+ #define MD_SIS315 2
+-/* mode table */
+-/* NOT const - will be patched for 1280x960 mode number chaos reasons */
++/* Mode table */
++/* NOT const - will be patched for 1280x768 mode number chaos reasons */
+ struct _sisbios_mode {
+       char name[15];
+       u8 mode_no;
+@@ -447,14 +447,33 @@ struct _sisbios_mode {
+       u16 rows;
+       u8  chipset;
+ } sisbios_mode[] = {
+-#define MODE_INDEX_NONE           0  /* TW: index for mode=none */
+-      {"none",         0xFF, 0x0000, 0x0000,    0,    0,  0, 0,   0,  0, MD_SIS300|MD_SIS315},  /* TW: for mode "none" */
+-      {"320x240x16",   0x56, 0x0000, 0x0000,  320,  240, 16, 1,  40, 15,           MD_SIS315},
+-      {"320x480x8",    0x5A, 0x0000, 0x0000,  320,  480,  8, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
+-      {"320x480x16",   0x5B, 0x0000, 0x0000,  320,  480, 16, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
+-      {"640x480x8",    0x2E, 0x0101, 0x0101,  640,  480,  8, 1,  80, 30, MD_SIS300|MD_SIS315},
++#define MODE_INDEX_NONE           0  /* index for mode=none */
++      {"none",         0xff, 0x0000, 0x0000,    0,    0,  0, 0,   0,  0, MD_SIS300|MD_SIS315},
++      {"320x200x8",    0x59, 0x0138, 0x0000,  320,  200,  8, 1,  40, 12, MD_SIS300|MD_SIS315},
++      {"320x200x16",   0x41, 0x010e, 0x0000,  320,  200, 16, 1,  40, 12, MD_SIS300|MD_SIS315},
++      {"320x200x24",   0x4f, 0x0000, 0x0000,  320,  200, 32, 1,  40, 12, MD_SIS300|MD_SIS315},  /* TW: That's for people who mix up color- and fb depth */
++      {"320x200x32",   0x4f, 0x0000, 0x0000,  320,  200, 32, 1,  40, 12, MD_SIS300|MD_SIS315},
++      {"320x240x8",    0x50, 0x0132, 0x0000,  320,  240,  8, 1,  40, 15, MD_SIS300|MD_SIS315},
++      {"320x240x16",   0x56, 0x0135, 0x0000,  320,  240, 16, 1,  40, 15, MD_SIS300|MD_SIS315},
++      {"320x240x24",   0x53, 0x0000, 0x0000,  320,  240, 32, 1,  40, 15, MD_SIS300|MD_SIS315},
++      {"320x240x32",   0x53, 0x0000, 0x0000,  320,  240, 32, 1,  40, 15, MD_SIS300|MD_SIS315},
++      {"320x240x8",    0x5a, 0x0132, 0x0000,  320,  480,  8, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
++      {"320x240x16",   0x5b, 0x0135, 0x0000,  320,  480, 16, 1,  40, 30,           MD_SIS315},  /* TW: FSTN */
++      {"400x300x8",    0x51, 0x0133, 0x0000,  400,  300,  8, 1,  50, 18, MD_SIS300|MD_SIS315},
++      {"400x300x16",   0x57, 0x0136, 0x0000,  400,  300, 16, 1,  50, 18, MD_SIS300|MD_SIS315},
++      {"400x300x24",   0x54, 0x0000, 0x0000,  400,  300, 32, 1,  50, 18, MD_SIS300|MD_SIS315},
++      {"400x300x32",   0x54, 0x0000, 0x0000,  400,  300, 32, 1,  50, 18, MD_SIS300|MD_SIS315},
++      {"512x384x8",    0x52, 0x0000, 0x0000,  512,  384,  8, 1,  64, 24, MD_SIS300|MD_SIS315},
++      {"512x384x16",   0x58, 0x0000, 0x0000,  512,  384, 16, 1,  64, 24, MD_SIS300|MD_SIS315},
++      {"512x384x24",   0x5c, 0x0000, 0x0000,  512,  384, 32, 1,  64, 24, MD_SIS300|MD_SIS315},
++      {"512x384x32",   0x5c, 0x0000, 0x0000,  512,  384, 32, 1,  64, 24, MD_SIS300|MD_SIS315},
++      {"640x400x8",    0x2f, 0x0000, 0x0000,  640,  400,  8, 1,  80, 25, MD_SIS300|MD_SIS315},
++      {"640x400x16",   0x5d, 0x0000, 0x0000,  640,  400, 16, 1,  80, 25, MD_SIS300|MD_SIS315},
++      {"640x400x24",   0x5e, 0x0000, 0x0000,  640,  400, 32, 1,  80, 25, MD_SIS300|MD_SIS315},
++      {"640x400x32",   0x5e, 0x0000, 0x0000,  640,  400, 32, 1,  80, 25, MD_SIS300|MD_SIS315},
++      {"640x480x8",    0x2e, 0x0101, 0x0101,  640,  480,  8, 1,  80, 30, MD_SIS300|MD_SIS315},
+       {"640x480x16",   0x44, 0x0111, 0x0111,  640,  480, 16, 1,  80, 30, MD_SIS300|MD_SIS315},
+-      {"640x480x24",   0x62, 0x013a, 0x0112,  640,  480, 32, 1,  80, 30, MD_SIS300|MD_SIS315},  /* TW: That's for people who mix up color- and fb depth */
++      {"640x480x24",   0x62, 0x013a, 0x0112,  640,  480, 32, 1,  80, 30, MD_SIS300|MD_SIS315},
+       {"640x480x32",   0x62, 0x013a, 0x0112,  640,  480, 32, 1,  80, 30, MD_SIS300|MD_SIS315},
+       {"720x480x8",    0x31, 0x0000, 0x0000,  720,  480,  8, 1,  90, 30, MD_SIS300|MD_SIS315},
+       {"720x480x16",   0x33, 0x0000, 0x0000,  720,  480, 16, 1,  90, 30, MD_SIS300|MD_SIS315},
+@@ -468,59 +487,79 @@ struct _sisbios_mode {
+       {"800x480x16",   0x7a, 0x0000, 0x0000,  800,  480, 16, 1, 100, 30, MD_SIS300|MD_SIS315},
+       {"800x480x24",   0x76, 0x0000, 0x0000,  800,  480, 32, 1, 100, 30, MD_SIS300|MD_SIS315},
+       {"800x480x32",   0x76, 0x0000, 0x0000,  800,  480, 32, 1, 100, 30, MD_SIS300|MD_SIS315},
+-#define DEFAULT_MODE              20 /* TW: index for 800x600x8 */
+-#define DEFAULT_LCDMODE           20 /* TW: index for 800x600x8 */
+-#define DEFAULT_TVMODE            20 /* TW: index for 800x600x8 */
++#define DEFAULT_MODE              39 /* index for 800x600x8 */
++#define DEFAULT_LCDMODE           39 /* index for 800x600x8 */
++#define DEFAULT_TVMODE            39 /* index for 800x600x8 */
+       {"800x600x8",    0x30, 0x0103, 0x0103,  800,  600,  8, 2, 100, 37, MD_SIS300|MD_SIS315},
+       {"800x600x16",   0x47, 0x0114, 0x0114,  800,  600, 16, 2, 100, 37, MD_SIS300|MD_SIS315},
+       {"800x600x24",   0x63, 0x013b, 0x0115,  800,  600, 32, 2, 100, 37, MD_SIS300|MD_SIS315},
+       {"800x600x32",   0x63, 0x013b, 0x0115,  800,  600, 32, 2, 100, 37, MD_SIS300|MD_SIS315},
++      {"848x480x8",    0x39, 0x0000, 0x0000,  848,  480,  8, 2, 106, 30, MD_SIS300|MD_SIS315},
++      {"848x480x16",   0x3b, 0x0000, 0x0000,  848,  480, 16, 2, 106, 30, MD_SIS300|MD_SIS315},
++      {"848x480x24",   0x3e, 0x0000, 0x0000,  848,  480, 32, 2, 106, 30, MD_SIS300|MD_SIS315},
++      {"848x480x32",   0x3e, 0x0000, 0x0000,  848,  480, 32, 2, 106, 30, MD_SIS300|MD_SIS315},
++      {"856x480x8",    0x3f, 0x0000, 0x0000,  856,  480,  8, 2, 107, 30, MD_SIS300|MD_SIS315},
++      {"856x480x16",   0x42, 0x0000, 0x0000,  856,  480, 16, 2, 107, 30, MD_SIS300|MD_SIS315},
++      {"856x480x24",   0x45, 0x0000, 0x0000,  856,  480, 32, 2, 107, 30, MD_SIS300|MD_SIS315},
++      {"856x480x32",   0x45, 0x0000, 0x0000,  856,  480, 32, 2, 107, 30, MD_SIS300|MD_SIS315},
+       {"1024x576x8",   0x71, 0x0000, 0x0000, 1024,  576,  8, 1, 128, 36, MD_SIS300|MD_SIS315},
+       {"1024x576x16",  0x74, 0x0000, 0x0000, 1024,  576, 16, 1, 128, 36, MD_SIS300|MD_SIS315},
+       {"1024x576x24",  0x77, 0x0000, 0x0000, 1024,  576, 32, 1, 128, 36, MD_SIS300|MD_SIS315},
+       {"1024x576x32",  0x77, 0x0000, 0x0000, 1024,  576, 32, 1, 128, 36, MD_SIS300|MD_SIS315},
+-      {"1024x600x8",   0x20, 0x0000, 0x0000, 1024,  600,  8, 1, 128, 37, MD_SIS300          },  /* TW: 300 series only */
++      {"1024x600x8",   0x20, 0x0000, 0x0000, 1024,  600,  8, 1, 128, 37, MD_SIS300          },
+       {"1024x600x16",  0x21, 0x0000, 0x0000, 1024,  600, 16, 1, 128, 37, MD_SIS300          },
+       {"1024x600x24",  0x22, 0x0000, 0x0000, 1024,  600, 32, 1, 128, 37, MD_SIS300          },
+       {"1024x600x32",  0x22, 0x0000, 0x0000, 1024,  600, 32, 1, 128, 37, MD_SIS300          },
+       {"1024x768x8",   0x38, 0x0105, 0x0105, 1024,  768,  8, 2, 128, 48, MD_SIS300|MD_SIS315},
+-      {"1024x768x16",  0x4A, 0x0117, 0x0117, 1024,  768, 16, 2, 128, 48, MD_SIS300|MD_SIS315},
++      {"1024x768x16",  0x4a, 0x0117, 0x0117, 1024,  768, 16, 2, 128, 48, MD_SIS300|MD_SIS315},
+       {"1024x768x24",  0x64, 0x013c, 0x0118, 1024,  768, 32, 2, 128, 48, MD_SIS300|MD_SIS315},
+       {"1024x768x32",  0x64, 0x013c, 0x0118, 1024,  768, 32, 2, 128, 48, MD_SIS300|MD_SIS315},
+-      {"1152x768x8",   0x23, 0x0000, 0x0000, 1152,  768,  8, 1, 144, 48, MD_SIS300          },  /* TW: 300 series only */
++      {"1152x768x8",   0x23, 0x0000, 0x0000, 1152,  768,  8, 1, 144, 48, MD_SIS300          },
+       {"1152x768x16",  0x24, 0x0000, 0x0000, 1152,  768, 16, 1, 144, 48, MD_SIS300          },
+       {"1152x768x24",  0x25, 0x0000, 0x0000, 1152,  768, 32, 1, 144, 48, MD_SIS300          },
+       {"1152x768x32",  0x25, 0x0000, 0x0000, 1152,  768, 32, 1, 144, 48, MD_SIS300          },
++      {"1152x864x8",   0x29, 0x0000, 0x0000, 1152,  864,  8, 1, 144, 54, MD_SIS300|MD_SIS315},
++      {"1152x864x16",  0x2a, 0x0000, 0x0000, 1152,  864, 16, 1, 144, 54, MD_SIS300|MD_SIS315},
++      {"1152x864x24",  0x2b, 0x0000, 0x0000, 1152,  864, 32, 1, 144, 54, MD_SIS300|MD_SIS315},
++      {"1152x864x32",  0x2b, 0x0000, 0x0000, 1152,  864, 32, 1, 144, 54, MD_SIS300|MD_SIS315},
+       {"1280x720x8",   0x79, 0x0000, 0x0000, 1280,  720,  8, 1, 160, 45, MD_SIS300|MD_SIS315},
+       {"1280x720x16",  0x75, 0x0000, 0x0000, 1280,  720, 16, 1, 160, 45, MD_SIS300|MD_SIS315},
+       {"1280x720x24",  0x78, 0x0000, 0x0000, 1280,  720, 32, 1, 160, 45, MD_SIS300|MD_SIS315},
+       {"1280x720x32",  0x78, 0x0000, 0x0000, 1280,  720, 32, 1, 160, 45, MD_SIS300|MD_SIS315},
+-      {"1280x768x8",   0x23, 0x0000, 0x0000, 1280,  768,  8, 1, 160, 48,           MD_SIS315},  /* TW: 310/325 series only */
+-      {"1280x768x16",  0x24, 0x0000, 0x0000, 1280,  768, 16, 1, 160, 48,           MD_SIS315},
+-      {"1280x768x24",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48,           MD_SIS315},
+-      {"1280x768x32",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48,           MD_SIS315},
+-#define MODEINDEX_1280x960 48
+-      {"1280x960x8",   0x7C, 0x0000, 0x0000, 1280,  960,  8, 1, 160, 60, MD_SIS300|MD_SIS315},  /* TW: Modenumbers being patched */
+-      {"1280x960x16",  0x7D, 0x0000, 0x0000, 1280,  960, 16, 1, 160, 60, MD_SIS300|MD_SIS315},
+-      {"1280x960x24",  0x7E, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
+-      {"1280x960x32",  0x7E, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
+-      {"1280x1024x8",  0x3A, 0x0107, 0x0107, 1280, 1024,  8, 2, 160, 64, MD_SIS300|MD_SIS315},
+-      {"1280x1024x16", 0x4D, 0x011a, 0x011a, 1280, 1024, 16, 2, 160, 64, MD_SIS300|MD_SIS315},
++#define MODEINDEX_1280x768 75
++      {"1280x768x8",   0x23, 0x0000, 0x0000, 1280,  768,  8, 1, 160, 48, MD_SIS300|MD_SIS315},
++      {"1280x768x16",  0x24, 0x0000, 0x0000, 1280,  768, 16, 1, 160, 48, MD_SIS300|MD_SIS315},
++      {"1280x768x24",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48, MD_SIS300|MD_SIS315},
++      {"1280x768x32",  0x25, 0x0000, 0x0000, 1280,  768, 32, 1, 160, 48, MD_SIS300|MD_SIS315},
++      {"1280x960x8",   0x7c, 0x0000, 0x0000, 1280,  960,  8, 1, 160, 60, MD_SIS300|MD_SIS315}, 
++      {"1280x960x16",  0x7d, 0x0000, 0x0000, 1280,  960, 16, 1, 160, 60, MD_SIS300|MD_SIS315},
++      {"1280x960x24",  0x7e, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
++      {"1280x960x32",  0x7e, 0x0000, 0x0000, 1280,  960, 32, 1, 160, 60, MD_SIS300|MD_SIS315},
++      {"1280x1024x8",  0x3a, 0x0107, 0x0107, 1280, 1024,  8, 2, 160, 64, MD_SIS300|MD_SIS315},
++      {"1280x1024x16", 0x4d, 0x011a, 0x011a, 1280, 1024, 16, 2, 160, 64, MD_SIS300|MD_SIS315},
+       {"1280x1024x24", 0x65, 0x013d, 0x011b, 1280, 1024, 32, 2, 160, 64, MD_SIS300|MD_SIS315},
+       {"1280x1024x32", 0x65, 0x013d, 0x011b, 1280, 1024, 32, 2, 160, 64, MD_SIS300|MD_SIS315},
+-      {"1400x1050x8",  0x26, 0x0000, 0x0000, 1400, 1050,  8, 1, 175, 65,           MD_SIS315},  /* TW: 310/325 series only */
++      {"1360x768x8",   0x48, 0x0000, 0x0000, 1360,  768,  8, 1, 170, 48, MD_SIS300|MD_SIS315},
++      {"1360x768x16",  0x4b, 0x0000, 0x0000, 1360,  768, 16, 1, 170, 48, MD_SIS300|MD_SIS315},
++      {"1360x768x24",  0x4e, 0x0000, 0x0000, 1360,  768, 32, 1, 170, 48, MD_SIS300|MD_SIS315},
++      {"1360x768x32",  0x4e, 0x0000, 0x0000, 1360,  768, 32, 1, 170, 48, MD_SIS300|MD_SIS315},
++      {"1360x1024x8",  0x67, 0x0000, 0x0000, 1360, 1024,  8, 1, 170, 64, MD_SIS300          },
++      {"1360x1024x16", 0x6f, 0x0000, 0x0000, 1360, 1024, 16, 1, 170, 64, MD_SIS300          },
++      {"1360x1024x24", 0x72, 0x0000, 0x0000, 1360, 1024, 32, 1, 170, 64, MD_SIS300          },
++      {"1360x1024x32", 0x72, 0x0000, 0x0000, 1360, 1024, 32, 1, 170, 64, MD_SIS300          },
++      {"1400x1050x8",  0x26, 0x0000, 0x0000, 1400, 1050,  8, 1, 175, 65,           MD_SIS315},
+       {"1400x1050x16", 0x27, 0x0000, 0x0000, 1400, 1050, 16, 1, 175, 65,           MD_SIS315},
+       {"1400x1050x24", 0x28, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65,           MD_SIS315},
+       {"1400x1050x32", 0x28, 0x0000, 0x0000, 1400, 1050, 32, 1, 175, 65,           MD_SIS315},
+-      {"1600x1200x8",  0x3C, 0x0130, 0x011c, 1600, 1200,  8, 1, 200, 75, MD_SIS300|MD_SIS315},
+-      {"1600x1200x16", 0x3D, 0x0131, 0x011e, 1600, 1200, 16, 1, 200, 75, MD_SIS300|MD_SIS315},
++      {"1600x1200x8",  0x3c, 0x0130, 0x011c, 1600, 1200,  8, 1, 200, 75, MD_SIS300|MD_SIS315},
++      {"1600x1200x16", 0x3d, 0x0131, 0x011e, 1600, 1200, 16, 1, 200, 75, MD_SIS300|MD_SIS315},
+       {"1600x1200x24", 0x66, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315},
+       {"1600x1200x32", 0x66, 0x013e, 0x011f, 1600, 1200, 32, 1, 200, 75, MD_SIS300|MD_SIS315},
+       {"1920x1440x8",  0x68, 0x013f, 0x0000, 1920, 1440,  8, 1, 240, 75, MD_SIS300|MD_SIS315},
+       {"1920x1440x16", 0x69, 0x0140, 0x0000, 1920, 1440, 16, 1, 240, 75, MD_SIS300|MD_SIS315},
+-      {"1920x1440x24", 0x6B, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
+-      {"1920x1440x32", 0x6B, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
+-      {"2048x1536x8",  0x6c, 0x0000, 0x0000, 2048, 1536,  8, 1, 256, 96,           MD_SIS315},  /* TW: 310/325 series only */
++      {"1920x1440x24", 0x6b, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
++      {"1920x1440x32", 0x6b, 0x0141, 0x0000, 1920, 1440, 32, 1, 240, 75, MD_SIS300|MD_SIS315},
++      {"2048x1536x8",  0x6c, 0x0000, 0x0000, 2048, 1536,  8, 1, 256, 96,           MD_SIS315},
+       {"2048x1536x16", 0x6d, 0x0000, 0x0000, 2048, 1536, 16, 1, 256, 96,           MD_SIS315},
+       {"2048x1536x24", 0x6e, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96,           MD_SIS315},
+       {"2048x1536x32", 0x6e, 0x0000, 0x0000, 2048, 1536, 32, 1, 256, 96,           MD_SIS315},
+@@ -538,37 +577,45 @@ u8  sisfb_rate_idx = 0;
+ /* TW: CR36 evaluation */
+ const USHORT sis300paneltype[] =
+-    { LCD_UNKNOWN,   LCD_800x600,  LCD_1024x768,  LCD_1280x1024,
+-      LCD_1280x960,  LCD_640x480,  LCD_1024x600,  LCD_1152x768,
+-      LCD_320x480,   LCD_1024x768, LCD_1024x768,  LCD_1024x768,
+-      LCD_1024x768,  LCD_1024x768, LCD_1024x768,  LCD_1024x768 };
++    { LCD_UNKNOWN,   LCD_800x600,   LCD_1024x768,  LCD_1280x1024,
++      LCD_1280x960,  LCD_640x480,   LCD_1024x600,  LCD_1152x768,
++      LCD_1024x768,   LCD_1024x768,  LCD_1024x768,  LCD_1024x768,
++      LCD_1024x768,  LCD_1024x768,  LCD_320x480,   LCD_1024x768 };
+ const USHORT sis310paneltype[] =
+-    { LCD_UNKNOWN,   LCD_800x600,  LCD_1024x768,  LCD_1280x1024,
+-      LCD_640x480,   LCD_1024x600, LCD_1152x864,  LCD_1280x960,
+-      LCD_1152x768,  LCD_1400x1050,LCD_1280x768,  LCD_1600x1200,
+-      LCD_320x480,   LCD_1024x768, LCD_1024x768,  LCD_1024x768 };
++    { LCD_UNKNOWN,   LCD_800x600,   LCD_1024x768,  LCD_1280x1024,
++      LCD_640x480,   LCD_1024x600,  LCD_1152x864,  LCD_1280x960,
++      LCD_1152x768,  LCD_1400x1050, LCD_1280x768,  LCD_1600x1200,
++      LCD_640x480_2, LCD_640x480_3, LCD_320x480,   LCD_1024x768 };
++
++#define FL_550_DSTN 0x01
++#define FL_550_FSTN 0x02
+ static const struct _sis_crt2type {
+       char name[10];
+       int type_no;
+       int tvplug_no;
++      unsigned short flags;
+ } sis_crt2type[] = {
+-      {"NONE",        0,              -1},
+-      {"LCD",         DISPTYPE_LCD,   -1},
+-      {"TV",          DISPTYPE_TV,    -1},
+-      {"VGA",         DISPTYPE_CRT2,  -1},
+-      {"SVIDEO",      DISPTYPE_TV,    TVPLUG_SVIDEO},
+-      {"COMPOSITE",   DISPTYPE_TV,    TVPLUG_COMPOSITE},
+-      {"SCART",       DISPTYPE_TV,    TVPLUG_SCART},
+-      {"none",        0,              -1},
+-      {"lcd",         DISPTYPE_LCD,   -1},
+-      {"tv",          DISPTYPE_TV,    -1},
+-      {"vga",         DISPTYPE_CRT2,  -1},
+-      {"svideo",      DISPTYPE_TV,    TVPLUG_SVIDEO},
+-      {"composite",   DISPTYPE_TV,    TVPLUG_COMPOSITE},
+-      {"scart",       DISPTYPE_TV,    TVPLUG_SCART},
+-      {"\0",          -1,             -1}
++      {"NONE",        0,              -1,        0},
++      {"LCD",         CRT2_LCD,       -1,        0},
++      {"TV",          CRT2_TV,        -1,        0},
++      {"VGA",         CRT2_VGA,       -1,        0},
++      {"SVIDEO",      CRT2_TV,        TV_SVIDEO, 0},
++      {"COMPOSITE",   CRT2_TV,        TV_AVIDEO, 0},
++      {"SCART",       CRT2_TV,        TV_SCART,  0},
++      {"none",        0,              -1,        0},
++      {"lcd",         CRT2_LCD,       -1,        0},
++      {"tv",          CRT2_TV,        -1,        0},
++      {"vga",         CRT2_VGA,       -1,        0},
++      {"svideo",      CRT2_TV,        TV_SVIDEO, 0},
++      {"composite",   CRT2_TV,        TV_AVIDEO, 0},
++      {"scart",       CRT2_TV,        TV_SCART,  0},
++      {"DSTN",        CRT2_LCD,       -1,        FL_550_DSTN},
++      {"dstn",        CRT2_LCD,       -1,        FL_550_DSTN},
++      {"FSTN",        CRT2_LCD,       -1,        FL_550_FSTN},
++      {"fstn",        CRT2_LCD,       -1,        FL_550_FSTN},
++      {"\0",          -1,             -1,        0}
+ };
+ /* Queue mode selection for 310 series */
+@@ -590,10 +637,10 @@ static const struct _sis_tvtype {
+       char name[6];
+       int type_no;
+ } sis_tvtype[] = {
+-      {"PAL",         1},
+-      {"NTSC",        2},
+-      {"pal",         1},
+-      {"ntsc",        2},
++      {"PAL",         TV_PAL},
++      {"NTSC",        TV_NTSC},
++      {"pal",         TV_PAL},
++      {"ntsc",        TV_NTSC},
+       {"\0",          -1}
+ };
+@@ -602,33 +649,102 @@ static const struct _sis_vrate {
+       u16 xres;
+       u16 yres;
+       u16 refresh;
++      BOOLEAN SiS730valid32bpp;
+ } sisfb_vrate[] = {
+-      {1,  640,  480, 60}, {2,  640,  480,  72}, {3, 640,   480,  75}, {4,  640, 480,  85},
+-      {5,  640,  480,100}, {6,  640,  480, 120}, {7, 640,   480, 160}, {8,  640, 480, 200},
+-      {1,  720,  480, 60},
+-      {1,  720,  576, 58},
+-      {1,  800,  480, 60}, {2,  800,  480,  75}, {3, 800,   480,  85},
+-      {1,  800,  600, 56}, {2,  800,  600,  60}, {3, 800,   600,  72}, {4,  800, 600,  75},
+-      {5,  800,  600, 85}, {6,  800,  600, 100}, {7, 800,   600, 120}, {8,  800, 600, 160},
+-      {1, 1024,  768, 43}, {2, 1024,  768,  60}, {3, 1024,  768,  70}, {4, 1024, 768,  75},
+-      {5, 1024,  768, 85}, {6, 1024,  768, 100}, {7, 1024,  768, 120},
+-      {1, 1024,  576, 60}, {2, 1024,  576,  75}, {3, 1024,  576,  85},
+-      {1, 1024,  600, 60},
+-      {1, 1152,  768, 60},
+-      {1, 1280,  720, 60}, {2, 1280,  720,  75}, {3, 1280,  720,  85},
+-      {1, 1280,  768, 60},
+-      {1, 1280, 1024, 43}, {2, 1280, 1024,  60}, {3, 1280, 1024,  75}, {4, 1280, 1024,  85},
+-      {1, 1280,  960, 70},
+-      {1, 1400, 1050, 60},
+-      {1, 1600, 1200, 60}, {2, 1600, 1200,  65}, {3, 1600, 1200,  70}, {4, 1600, 1200,  75},
+-      {5, 1600, 1200, 85}, {6, 1600, 1200, 100}, {7, 1600, 1200, 120},
+-      {1, 1920, 1440, 60}, {2, 1920, 1440,  65}, {3, 1920, 1440,  70}, {4, 1920, 1440,  75},
+-      {5, 1920, 1440, 85}, {6, 1920, 1440, 100},
+-      {1, 2048, 1536, 60}, {2, 2048, 1536,  65}, {3, 2048, 1536,  70}, {4, 2048, 1536,  75},
+-      {5, 2048, 1536, 85},
+-      {0, 0, 0, 0}
++      {1,  320,  200,  70,  TRUE},
++      {1,  320,  240,  60,  TRUE},
++      {1,  320,  480,  60,  TRUE},
++      {1,  400,  300,  60,  TRUE},
++      {1,  512,  384,  60,  TRUE},
++      {1,  640,  400,  72,  TRUE},
++      {1,  640,  480,  60,  TRUE}, {2,  640,  480,  72,  TRUE}, {3,  640,  480,  75,  TRUE},
++      {4,  640,  480,  85,  TRUE}, {5,  640,  480, 100,  TRUE}, {6,  640,  480, 120,  TRUE},
++      {7,  640,  480, 160,  TRUE}, {8,  640,  480, 200,  TRUE},
++      {1,  720,  480,  60,  TRUE},
++      {1,  720,  576,  58,  TRUE},
++      {1,  800,  480,  60,  TRUE}, {2,  800,  480,  75,  TRUE}, {3,  800,  480,  85,  TRUE},
++      {1,  800,  600,  56,  TRUE}, {2,  800,  600,  60,  TRUE}, {3,  800,  600,  72,  TRUE},
++      {4,  800,  600,  75,  TRUE}, {5,  800,  600,  85,  TRUE}, {6,  800,  600, 105,  TRUE},
++      {7,  800,  600, 120,  TRUE}, {8,  800,  600, 160,  TRUE},
++      {1,  848,  480,  39,  TRUE}, {2,  848,  480,  60,  TRUE},
++      {1,  856,  480,  39,  TRUE}, {2,  856,  480,  60,  TRUE},
++      {1, 1024,  576,  60,  TRUE}, {2, 1024,  576,  75,  TRUE}, {3, 1024,  576,  85,  TRUE},
++      {1, 1024,  600,  60,  TRUE},
++      {1, 1024,  768,  43,  TRUE}, {2, 1024,  768,  60,  TRUE}, {3, 1024,  768,  70, FALSE},
++      {4, 1024,  768,  75, FALSE}, {5, 1024,  768,  85,  TRUE}, {6, 1024,  768, 100,  TRUE},
++      {7, 1024,  768, 120,  TRUE},
++      {1, 1152,  768,  60,  TRUE},
++      {1, 1152,  864,  75,  TRUE}, {2, 1152,  864,  84,  TRUE},
++      {1, 1280,  720,  60,  TRUE}, {2, 1280,  720,  75,  TRUE}, {3, 1280,  720,  85,  TRUE},
++      {1, 1280,  768,  60,  TRUE},
++      {1, 1280,  960,  60,  TRUE}, {2, 1280,  960,  85,  TRUE},
++      {1, 1280, 1024,  43,  TRUE}, {2, 1280, 1024,  60,  TRUE}, {3, 1280, 1024,  75,  TRUE},
++      {4, 1280, 1024,  85,  TRUE},
++      {1, 1360,  768,  60,  TRUE},
++      {1, 1360, 1024,  59,  TRUE},
++      {1, 1400, 1050,  60,  TRUE}, {2, 1400, 1050,  75,  TRUE},
++      {1, 1600, 1200,  60,  TRUE}, {2, 1600, 1200,  65,  TRUE}, {3, 1600, 1200,  70,  TRUE},
++      {4, 1600, 1200,  75,  TRUE}, {5, 1600, 1200,  85,  TRUE}, {6, 1600, 1200, 100,  TRUE},
++      {7, 1600, 1200, 120,  TRUE},
++      {1, 1920, 1440,  60,  TRUE}, {2, 1920, 1440,  65,  TRUE}, {3, 1920, 1440,  70,  TRUE},
++      {4, 1920, 1440,  75,  TRUE}, {5, 1920, 1440,  85,  TRUE}, {6, 1920, 1440, 100,  TRUE},
++      {1, 2048, 1536,  60,  TRUE}, {2, 2048, 1536,  65,  TRUE}, {3, 2048, 1536,  70,  TRUE},
++      {4, 2048, 1536,  75,  TRUE}, {5, 2048, 1536,  85,  TRUE},
++      {0,    0,    0,   0, FALSE}
++};
++
++static struct sisfb_monitor {
++      u16 hmin;
++      u16 hmax;
++      u16 vmin;
++      u16 vmax;
++      u32 dclockmax;
++      u8  feature;
++      BOOLEAN datavalid;
++} sisfb_thismonitor;
++
++static const struct _sisfbddcsmodes {
++      u32 mask;
++      u16 h;
++      u16 v;
++      u32 d;
++} sisfb_ddcsmodes[] = {
++      { 0x10000, 67, 75, 108000},
++      { 0x08000, 48, 72,  50000},
++      { 0x04000, 46, 75,  49500},
++      { 0x01000, 35, 43,  44900},
++      { 0x00800, 48, 60,  65000},
++      { 0x00400, 56, 70,  75000},
++      { 0x00200, 60, 75,  78800},
++      { 0x00100, 80, 75, 135000},
++      { 0x00020, 31, 60,  25200},
++      { 0x00008, 38, 72,  31500},
++      { 0x00004, 37, 75,  31500},
++      { 0x00002, 35, 56,  36000},
++      { 0x00001, 38, 60,  40000}
++};
++
++static const struct _sisfbddcfmodes {
++      u16 x;
++      u16 y;
++      u16 v;
++      u16 h;
++      u32 d;
++} sisfb_ddcfmodes[] = {
++       { 1280, 1024, 85, 92, 157500},
++       { 1600, 1200, 60, 75, 162000},
++       { 1600, 1200, 65, 82, 175500},
++       { 1600, 1200, 70, 88, 189000},
++       { 1600, 1200, 75, 94, 202500},
++       { 1600, 1200, 85, 107,229500},
++       { 1920, 1440, 60, 90, 234000},
++       { 1920, 1440, 75, 113,297000}
+ };
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
++static u8 sisfb_lastrates[128];
++#endif
++
+ static const struct _chswtable {
+     int subsysVendor;
+     int subsysCard;
+@@ -636,9 +752,38 @@ static const struct _chswtable {
+     char *cardName;
+ } mychswtable[] = {
+         { 0x1631, 0x1002, "Mitachi", "0x1002" },
++      { 0x1071, 0x7521, "Mitac"  , "7521P"  },
+       { 0,      0,      ""       , ""       }
+ };
++static const struct _customttable {
++    unsigned short chipID;
++    char *biosversion;
++    char *biosdate;
++    unsigned short biosFootprintAddr[5];
++    unsigned char biosFootprintData[5];
++    char *vendorName;
++    char *cardName;
++    unsigned long SpecialID;
++    char *optionName;
++} mycustomttable[] = {
++        { SIS_630, "2.00.07", "09/27/2002-13:38:25",
++        { 0x220, 0x227, 0x228, 0x229, 0x22a },
++        {  0x01,  0xe3,  0x9a,  0x6a,  0x00 },
++        "Barco", "iQ R200L/300/400", CUT_BARCO1366, "BARCO1366"
++      },
++      { SIS_630, "2.00.07", "09/27/2002-13:38:25",
++        { 0x220, 0x227, 0x228, 0x229, 0x22a },
++        {  0x00,  0x5a,  0x64,  0x41,  0x00 },
++        "Barco", "iQ G200L/300/400/500", CUT_BARCO1024, "BARCO1024"
++      },
++      { 0, "", "",
++        { 0, 0, 0, 0 },
++        { 0, 0, 0, 0 },
++        "", "", CUT_NONE, ""
++      }
++};
++
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+ /* Offscreen layout */
+ typedef struct _SIS_GLYINFO {
+@@ -677,7 +822,6 @@ static unsigned long sisfb_heap_end;
+ static unsigned long sisfb_heap_size;
+ static SIS_HEAP      sisfb_heap;
+-// Eden Chen
+ static const struct _sis_TV_filter {
+       u8 filter[9][4];
+ } sis_TV_filter[] = {
+@@ -829,9 +973,8 @@ static const struct _sis_TV_filter {
+ static int           filter = -1;
+ static unsigned char filter_tb;
+-//~Eden Chen
+-/* ---------------------- Routine prototypes ------------------------- */
++/* ---------------------- Prototypes ------------------------- */
+ /* Interface used by the world */
+ #ifndef MODULE
+@@ -894,10 +1037,6 @@ extern void     fbcon_sis_fillrect(struc
+                                    const struct fb_fillrect *rect);
+ extern void     fbcon_sis_copyarea(struct fb_info *info, 
+                                    const struct fb_copyarea *area);
+-#if 0                            
+-extern void     cfb_imageblit(struct fb_info *info, 
+-                              const struct fb_image *image);
+-#endif                              
+ extern int      fbcon_sis_sync(struct fb_info *info);
+ static int      sisfb_ioctl(struct inode *inode, 
+                           struct file *file,
+@@ -912,7 +1051,7 @@ extern int      sisfb_mode_rate_to_ddata
+                        unsigned int *left_margin, unsigned int *right_margin, 
+                        unsigned int *upper_margin, unsigned int *lower_margin,
+                        unsigned int *hsync_len, unsigned int *vsync_len,
+-                       unsigned int *sync, unsigned int *vmode);                                                                    
++                       unsigned int *sync, unsigned int *vmode);
+ #endif
+                       
+ static int      sisfb_get_fix(struct fb_fix_screeninfo *fix, int con,
+@@ -923,9 +1062,9 @@ extern int      sisfb_initaccel(void);
+ extern void     sisfb_syncaccel(void);
+ /* Internal general routines */
+-static void     sisfb_search_mode(const char *name);
+-static int      sisfb_validate_mode(int modeindex);
+-static u8       sisfb_search_refresh_rate(unsigned int rate);
++static void     sisfb_search_mode(char *name, BOOLEAN quiet);
++static int      sisfb_validate_mode(int modeindex, unsigned long vbflags);
++static u8       sisfb_search_refresh_rate(unsigned int rate, int index);
+ static int      sisfb_setcolreg(unsigned regno, unsigned red, unsigned green,
+                       unsigned blue, unsigned transp,
+                       struct fb_info *fb_info);
+@@ -939,6 +1078,12 @@ static BOOLEAN  sisfb_CheckVBRetrace(voi
+ static BOOLEAN  sisfbcheckvretracecrt2(void);
+ static BOOLEAN  sisfbcheckvretracecrt1(void);
+ static BOOLEAN  sisfb_bridgeisslave(void);
++static void     sisfb_detect_VB_connect(void);
++static void     sisfb_get_VB_type(void);
++
++static void     sisfb_handle_ddc(struct sisfb_monitor *monitor, int crtno);
++static BOOLEAN  sisfb_interpret_edid(struct sisfb_monitor *monitor, unsigned char *buffer);
++
+ /* SiS-specific Export functions */
+ void            sis_dispinfo(struct ap_data *rec);
+@@ -952,15 +1097,9 @@ u32             sisfb_get_reg3(u16 port)
+ /* Chipset-dependent internal routines */
+ #ifdef CONFIG_FB_SIS_300
+ static int      sisfb_get_dram_size_300(void);
+-static void     sisfb_detect_VB_connect_300(void);
+-static void     sisfb_get_VB_type_300(void);
+-static int      sisfb_has_VB_300(void);
+ #endif
+ #ifdef CONFIG_FB_SIS_315
+ static int      sisfb_get_dram_size_315(void);
+-static void     sisfb_detect_VB_connect_315(void);
+-static void     sisfb_get_VB_type_315(void);
+-static int      sisfb_has_VB_315(void);
+ #endif
+ /* Internal heap routines */
+@@ -978,23 +1117,33 @@ BOOLEAN         sisfb_query_VGA_config_s
+ BOOLEAN         sisfb_query_north_bridge_space(PSIS_HW_DEVICE_INFO psishw_ext,
+                       unsigned long offset, unsigned long set, unsigned long *value);
+-
+ /* Routines from init.c/init301.c */
+ extern void   SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr);
+ extern BOOLEAN  SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+ extern BOOLEAN  SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo);
+-extern void     SiS_SetEnableDstn(SiS_Private *SiS_Pr);
++extern void     SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable);
++extern void     SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable);
+ extern void     SiS_LongWait(SiS_Private *SiS_Pr);
+-/* TW: Chrontel TV functions */
++extern BOOLEAN  sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
++                     unsigned char modeno, int *htotal, int *vtotal, unsigned char rateindex);
++
++/* Chrontel TV functions */
+ extern USHORT         SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempbx);
+ extern void   SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempbx);
+ extern USHORT         SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempbx);
+ extern void   SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempbx);
+ extern void     SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, USHORT tempax,USHORT tempbh);
+ extern void     SiS_DDC2Delay(SiS_Private *SiS_Pr, USHORT delaytime);
+-
+-/* TW: Sensing routines */
++extern void     SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo);
++extern USHORT   SiS_HandleDDC(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
++                            USHORT adaptnum, USHORT DDCdatatype, unsigned char *buffer);
++extern void SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
++extern void SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr);
++extern void SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
++extern void SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
++                            
++/* Sensing routines */
+ void            SiS_Sense30x(void);
+ int             SISDoSense(int tempbl, int tempbh, int tempcl, int tempch);
+ void            SiS_SenseCh(void);                    
+--- linux-2.6.0-test1/drivers/video/sis/vgatypes.h     2003-06-14 12:17:55.000000000 -0700
++++ 25/drivers/video/sis/vgatypes.h    2003-07-19 17:04:55.000000000 -0700
+@@ -1,3 +1,30 @@
++/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/vgatypes.h,v 1.0 2001/06/15 21:23:00 dawes Exp $ */
++/*
++ * General type definitions for universal mode switching modules
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ *
++ */
+ #ifndef _VGATYPES_
+ #define _VGATYPES_
+@@ -5,7 +32,7 @@
+ #include "xf86Pci.h"
+ #endif
+-#ifdef LINUX_KERNEL  /* TW: We don't want the X driver to depend on kernel source */
++#ifdef LINUX_KERNEL  /* We don't want the X driver to depend on kernel source */
+ #include <linux/ioctl.h>
+ #endif
+@@ -72,18 +99,15 @@ typedef void VOID;
+ typedef UCHAR BOOLEAN;
+ #endif
+-#ifndef WINCE_HEADER
+ #ifndef bool
+ typedef UCHAR bool;
+ #endif
+-#endif /*WINCE_HEADER*/
+ #ifndef VBIOS_VER_MAX_LENGTH
+ #define VBIOS_VER_MAX_LENGTH         4
+ #endif
+ #ifndef LINUX_KERNEL   /* For kernel, this is defined in sisfb.h */
+-#ifndef WIN2000
+ #ifndef SIS_CHIP_TYPE
+ typedef enum _SIS_CHIP_TYPE {
+     SIS_VGALegacy = 0,
+@@ -101,19 +125,18 @@ typedef enum _SIS_CHIP_TYPE {
+     SIS_550,
+     SIS_650,
+     SIS_740,
+-    SIS_330, 
++    SIS_330,
++    SIS_660,
+     MAX_SIS_CHIP
+ } SIS_CHIP_TYPE;
+ #endif
+ #endif
+-#endif
+-#ifndef WIN2000
+ #ifndef SIS_VB_CHIP_TYPE
+ typedef enum _SIS_VB_CHIP_TYPE {
+     VB_CHIP_Legacy = 0,
+     VB_CHIP_301,
+-    VB_CHIP_301B,      
++    VB_CHIP_301B,
+     VB_CHIP_301LV,
+     VB_CHIP_302,
+     VB_CHIP_302B,
+@@ -122,9 +145,7 @@ typedef enum _SIS_VB_CHIP_TYPE {
+     MAX_VB_CHIP
+ } SIS_VB_CHIP_TYPE;
+ #endif
+-#endif
+-#ifndef WIN2000
+ #ifndef SIS_LCD_TYPE
+ typedef enum _SIS_LCD_TYPE {
+     LCD_INVALID = 0,
+@@ -136,18 +157,19 @@ typedef enum _SIS_LCD_TYPE {
+     LCD_1600x1200,
+     LCD_1920x1440,
+     LCD_2048x1536,
+-    LCD_320x480,       /* TW: FSTN */
++    LCD_320x480,       /* FSTN, DSTN */
+     LCD_1400x1050,
+     LCD_1152x864,
+     LCD_1152x768,
+     LCD_1280x768,
+     LCD_1024x600,
++    LCD_640x480_2,     /* FSTN, DSTN */
++    LCD_640x480_3,     /* FSTN, DSTN */
++    LCD_CUSTOM,
+     LCD_UNKNOWN
+ } SIS_LCD_TYPE;
+ #endif
+-#endif
+-#ifndef WIN2000 /* mark by Paul, Move definition to sisv.h*/
+ #ifndef PSIS_DSReg
+ typedef struct _SIS_DSReg
+ {
+@@ -162,7 +184,6 @@ typedef struct _SIS_HW_DEVICE_INFO  SIS_
+ typedef BOOLEAN (*PSIS_QUERYSPACE)   (PSIS_HW_DEVICE_INFO, ULONG, ULONG, ULONG *);
+-
+ struct _SIS_HW_DEVICE_INFO
+ {
+     PVOID  pDevice;              /* The pointer to the physical device data structure
+@@ -173,7 +194,7 @@ struct _SIS_HW_DEVICE_INFO
+                                  /* Note:ROM image file is the file of VBIOS ROM */
+     BOOLEAN UseROM;            /* TW: Use the ROM image if provided */
+- 
++
+     UCHAR  *pjCustomizedROMImage;/* base virtual address of ROM image file. */
+                                  /* wincE:ROM image file is the file for OEM */
+                                  /*       customized table */
+@@ -195,7 +216,7 @@ struct _SIS_HW_DEVICE_INFO
+                                  /* defined in the data structure type */
+                                  /* "SIS_VB_CHIP_TYPE" */
+-    USHORT usExternalChip;       /* NO VB or other video bridge(not  */
++    USHORT usExternalChip;       /* NO VB or other video bridge (other than  */
+                                  /* SiS video bridge) */
+                                  /* if ujVBChipID = VB_CHIP_UNKNOWN, */
+                                  /* then bit0=1 : LVDS,bit1=1 : trumpion, */
+@@ -207,7 +228,7 @@ struct _SIS_HW_DEVICE_INFO
+                                  /*             011:Trumpion LVDS Scaling Chip */
+                                  /*             100:LVDS(LCD-out)+Chrontel 7005 */
+                                  /*             101:Single Chrontel 7005 */
+-                               /* TW: This has changed on 310/325 series! */
++                               /* TW: This has changed on 315 series! */
+     ULONG  ulCRT2LCDType;        /* defined in the data structure type */
+                                  /* "SIS_LCD_TYPE" */
+@@ -244,7 +265,6 @@ struct _SIS_HW_DEVICE_INFO
+ #endif
+ };
+ #endif
+-#endif 
+ /* TW: Addtional IOCTL for communication sisfb <> X driver        */
+@@ -288,8 +308,6 @@ struct _SISFB_INFO {
+ };
+ #endif
+-#ifndef WIN2000
+-#ifndef WINCE_HEADER
+ #ifndef BUS_DATA_TYPE
+ typedef enum _BUS_DATA_TYPE {
+     ConfigurationSpaceUndefined = -1,
+@@ -307,7 +325,6 @@ typedef enum _BUS_DATA_TYPE {
+     MaximumBusDataType
+ } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
+ #endif
+-#endif /* WINCE_HEADER */
+ #ifndef PCI_TYPE0_ADDRESSES
+ #define PCI_TYPE0_ADDRESSES             6
+@@ -317,7 +334,6 @@ typedef enum _BUS_DATA_TYPE {
+ #define PCI_TYPE1_ADDRESSES             2
+ #endif
+-#ifndef WINCE_HEADER
+ #ifndef PCI_COMMON_CONFIG
+ typedef struct _PCI_COMMON_CONFIG {
+     USHORT  VendorID;                   /* (ro)                 */
+@@ -355,7 +371,6 @@ typedef struct _PCI_COMMON_CONFIG {
+ } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+ #endif
+-#endif /* WINCE_HEADER */
+ #ifndef FIELD_OFFSET
+ #define FIELD_OFFSET(type, field)    ((LONG)&(((type *)0)->field))
+@@ -364,6 +379,6 @@ typedef struct _PCI_COMMON_CONFIG {
+ #ifndef PCI_COMMON_HDR_LENGTH
+ #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET (PCI_COMMON_CONFIG, DeviceSpecific))
+ #endif
+-#endif
+ #endif
++
+--- linux-2.6.0-test1/drivers/video/sis/vstruct.h      2003-06-14 12:18:25.000000000 -0700
++++ 25/drivers/video/sis/vstruct.h     2003-07-19 17:04:55.000000000 -0700
+@@ -1,3 +1,32 @@
++/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h,v 1.0 2001/06/15 21:23:00 dawes Exp $ */
++/*
++ * General structure definitions for universal mode switching modules
++ *
++ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
++ *
++ * Permission to use, copy, modify, distribute, and sell this software and its
++ * documentation for any purpose is hereby granted without fee, provided that
++ * the above copyright notice appear in all copies and that both that
++ * copyright notice and this permission notice appear in supporting
++ * documentation, and that the name of the copyright holder not be used in
++ * advertising or publicity pertaining to distribution of the software without
++ * specific, written prior permission.  The copyright holder makes no representations
++ * about the suitability of this software for any purpose.  It is provided
++ * "as is" without express or implied warranty.
++ *
++ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
++ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
++ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
++ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
++ * PERFORMANCE OF THIS SOFTWARE.
++ *
++ * Author:    Thomas Winischhofer <thomas@winischhofer.net>
++ *              ?
++ *
++ */
++ 
+ #ifdef _INIT_
+ #define EXTERN
+ #else
+@@ -58,7 +87,6 @@ typedef struct _SiS_LVDSCRT1DataStruct
+       UCHAR  CR[15];
+ } SiS_LVDSCRT1DataStruct;
+-/*add for LCDA*/
+ typedef struct _SiS_LCDACRT1DataStruct
+ {
+       UCHAR  CR[17];
+@@ -111,9 +139,7 @@ typedef struct _SiS_ExtStruct
+       UCHAR  Ext_ModeID;
+       USHORT Ext_ModeFlag;
+       USHORT Ext_ModeInfo;
+-      USHORT Ext_Point;
+       USHORT Ext_VESAID;
+-      UCHAR  Ext_VESAMEMSize;
+       UCHAR  Ext_RESINFO;
+       UCHAR  VB_ExtTVFlickerIndex;
+       UCHAR  VB_ExtTVEdgeIndex;
+@@ -130,7 +156,6 @@ typedef struct _SiS_Ext2Struct
+       UCHAR  ModeID;
+       USHORT XRes;
+       USHORT YRes;
+-      USHORT ROM_OFFSET;
+ } SiS_Ext2Struct;
+ typedef struct _SiS_Part2PortTblStruct
+@@ -183,6 +208,12 @@ typedef struct _SiS_ModeResInfoStruct
+ typedef UCHAR DRAM4Type[4];
++/* Defines for SiS_Customt */
++#define CUT_NONE       0
++#define CUT_FORCENONE  1
++#define CUT_BARCO1366  2
++#define CUT_BARCO1024  3
++
+ typedef struct _SiS_Private
+ {
+ #ifdef LINUX_KERNEL
+@@ -198,25 +229,34 @@ typedef struct _SiS_Private
+       USHORT SiS_P3c7;
+       USHORT SiS_P3c8;
+       USHORT SiS_P3c9;
++      USHORT SiS_P3cb;
++      USHORT SiS_P3cd;
+       USHORT SiS_P3da;
+       USHORT SiS_Part1Port;
+       USHORT SiS_Part2Port;
+       USHORT SiS_Part3Port;
+       USHORT SiS_Part4Port;
+       USHORT SiS_Part5Port;
++      USHORT SiS_VidCapt;
++      USHORT SiS_VidPlay;
+       USHORT SiS_IF_DEF_LVDS;
+       USHORT SiS_IF_DEF_TRUMPION;
+       USHORT SiS_IF_DEF_DSTN;
+       USHORT SiS_IF_DEF_FSTN;
+       USHORT SiS_IF_DEF_CH70xx;
+       USHORT SiS_IF_DEF_HiVision;
++      USHORT SiS_SysFlags;
+       UCHAR  SiS_VGAINFO;
++#ifndef LINUX_KERNEL
++        USHORT SiS_CP1, SiS_CP2, SiS_CP3, SiS_CP4;
++#endif
+       BOOLEAN SiS_UseROM;
+       int    SiS_CHOverScan;
+       BOOLEAN SiS_CHSOverScan;
+       BOOLEAN SiS_ChSW;
+       BOOLEAN SiS_UseLCDA;
+       int    SiS_UseOEM;
++      ULONG  SiS_CustomT;
+       USHORT SiS_Backup70xx;
+       USHORT SiS_CRT1Mode;
+       USHORT SiS_flag_clearbuffer;
+@@ -270,15 +310,18 @@ typedef struct _SiS_Private
+       USHORT SiS_Panel1280x768;
+       USHORT SiS_Panel1024x600;
+       USHORT SiS_Panel640x480;
++      USHORT SiS_Panel640x480_2;
++      USHORT SiS_Panel640x480_3;
+       USHORT SiS_Panel1152x864;
++      USHORT SiS_PanelCustom;
++      USHORT SiS_PanelBarco1366;
+       USHORT SiS_PanelMax;
+       USHORT SiS_PanelMinLVDS;
+       USHORT SiS_PanelMin301;
+       USHORT SiS_ChrontelInit;
+       
+-      /* Pointers: */
+       const SiS_StStruct          *SiS_SModeIDTable;
+-      const SiS_StandTableStruct  *SiS_StandTable;
++      SiS_StandTableStruct        *SiS_StandTable;
+       const SiS_ExtStruct         *SiS_EModeIDTable;
+       const SiS_Ext2Struct        *SiS_RefIndex;
+       const SiS_VBModeStruct      *SiS_VBModeIDTable;
+@@ -316,7 +359,7 @@ typedef struct _SiS_Private
+       const USHORT *pSiS_RGBSenseData;
+       const USHORT *pSiS_VideoSenseData;
+       const USHORT *pSiS_YCSenseData;
+-      const USHORT *pSiS_RGBSenseData2; /*301b*/
++      const USHORT *pSiS_RGBSenseData2;
+       const USHORT *pSiS_VideoSenseData2;
+       const USHORT *pSiS_YCSenseData2;
+ #endif
+@@ -340,15 +383,18 @@ typedef struct _SiS_Private
+       const SiS_LCDDataStruct  *SiS_LCD1280x960Data;
+       const SiS_LCDDataStruct  *SiS_NoScaleData1400x1050;
+       const SiS_LCDDataStruct  *SiS_NoScaleData1600x1200;
++      const SiS_LCDDataStruct  *SiS_NoScaleData1280x768;
+       const SiS_LCDDataStruct  *SiS_StLCD1400x1050Data;
+       const SiS_LCDDataStruct  *SiS_StLCD1600x1200Data;
++      const SiS_LCDDataStruct  *SiS_StLCD1280x768Data;
+       const SiS_LCDDataStruct  *SiS_ExtLCD1400x1050Data;
+       const SiS_LCDDataStruct  *SiS_ExtLCD1600x1200Data;
++      const SiS_LCDDataStruct  *SiS_ExtLCD1280x768Data;
++      const SiS_LCDDataStruct  *SiS_NoScaleData;
+       const SiS_TVDataStruct   *SiS_StPALData;
+       const SiS_TVDataStruct   *SiS_ExtPALData;
+       const SiS_TVDataStruct   *SiS_StNTSCData;
+       const SiS_TVDataStruct   *SiS_ExtNTSCData;
+-/*    const SiS_TVDataStruct   *SiS_St1HiTVData;  */
+       const SiS_TVDataStruct   *SiS_St2HiTVData;
+       const SiS_TVDataStruct   *SiS_ExtHiTVData;
+       const UCHAR *SiS_NTSCTiming;
+@@ -381,12 +427,17 @@ typedef struct _SiS_Private
+       const SiS_LVDSDataStruct  *SiS_LVDS1152x768Data_1;
+       const SiS_LVDSDataStruct  *SiS_LVDS1152x768Data_2;
+       const SiS_LVDSDataStruct  *SiS_LVDS640x480Data_1;
++      const SiS_LVDSDataStruct  *SiS_LVDS640x480Data_2;
+       const SiS_LVDSDataStruct  *SiS_LVDS320x480Data_1;
+       const SiS_LVDSDataStruct  *SiS_LCDA1400x1050Data_1;
+       const SiS_LVDSDataStruct  *SiS_LCDA1400x1050Data_2;
+       const SiS_LVDSDataStruct  *SiS_LCDA1600x1200Data_1;
+       const SiS_LVDSDataStruct  *SiS_LCDA1600x1200Data_2;
+       const SiS_LVDSDataStruct  *SiS_LVDSXXXxXXXData_1;
++      const SiS_LVDSDataStruct  *SiS_LVDSBARCO1366Data_1;
++      const SiS_LVDSDataStruct  *SiS_LVDSBARCO1366Data_2;
++      const SiS_LVDSDataStruct  *SiS_LVDSBARCO1024Data_1;
++      const SiS_LVDSDataStruct  *SiS_LVDSBARCO1024Data_2;
+       const SiS_LVDSDataStruct  *SiS_CHTVUNTSCData;
+       const SiS_LVDSDataStruct  *SiS_CHTVONTSCData;
+       const SiS_LVDSDataStruct  *SiS_CHTVUPALData;
+@@ -478,6 +529,12 @@ typedef struct _SiS_Private
+       const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT11600x1200_2_H;
+       const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1XXXxXXX_1;
+       const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1XXXxXXX_1_H;
++      const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_1;
++      const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_1_H;
++      const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_2;
++      const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_2_H;
++      const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_3;
++      const SiS_LVDSCRT1DataStruct  *SiS_LVDSCRT1640x480_3_H;
+       const SiS_LVDSCRT1DataStruct  *SiS_CHTVCRT1UNTSC;
+       const SiS_LVDSCRT1DataStruct  *SiS_CHTVCRT1ONTSC;
+       const SiS_LVDSCRT1DataStruct  *SiS_CHTVCRT1UPAL;
+@@ -507,7 +564,6 @@ typedef struct _SiS_Private
+       const SiS_LCDACRT1DataStruct  *SiS_LCDACRT11400x1050_2_H;
+       const SiS_LCDACRT1DataStruct  *SiS_LCDACRT11600x1200_2_H;
+-      /* TW: New for 650/301LV */
+       const SiS_Part2PortTblStruct *SiS_CRT2Part2_1024x768_1;
+       const SiS_Part2PortTblStruct *SiS_CRT2Part2_1280x1024_1;
+       const SiS_Part2PortTblStruct *SiS_CRT2Part2_1400x1050_1;
+@@ -539,6 +595,9 @@ typedef struct _SiS_Private
+       const UCHAR *SiS_CHTVVCLKUPALN;
+       const UCHAR *SiS_CHTVVCLKOPALN;
+       const UCHAR *SiS_CHTVVCLKSOPAL;
++
++      USHORT  PanelXRes;
++      USHORT  PanelYRes;
+       
+       BOOLEAN UseCustomMode;
+       BOOLEAN CRT1UsesCustomMode;
+@@ -560,8 +619,11 @@ typedef struct _SiS_Private
+       UCHAR   CSR2B;
+       UCHAR   CSR2C;
+       USHORT  CSRClock;
++      USHORT  CSRClock_CRT1;
+       USHORT  CModeFlag;
++      USHORT  CModeFlag_CRT1;
+       USHORT  CInfoFlag;
++
+       BOOLEAN SiS_CHPALM;
+       BOOLEAN SiS_CHPALN;
+       
+@@ -578,7 +640,21 @@ typedef struct _SiS_Private
+       UCHAR Backup_1c;
+       UCHAR Backup_1d;
+       
+-      int    UsePanelScaler;
++      int     UsePanelScaler;
++
++      USHORT  CP_Vendor, CP_Product;
++      BOOLEAN CP_HaveCustomData;
++      int     CP_PreferredX, CP_PreferredY;
++      int     CP_MaxX, CP_MaxY, CP_MaxClock;
++      int     CP_HDisplay[7], CP_VDisplay[7]; /* For Custom LCD panel dimensions */
++      int     CP_HTotal[7], CP_VTotal[7];
++      int     CP_HSyncStart[7], CP_VSyncStart[7];
++      int     CP_HSyncEnd[7], CP_VSyncEnd[7];
++      int     CP_HBlankStart[7], CP_VBlankStart[7];
++      int     CP_HBlankEnd[7], CP_VBlankEnd[7];
++      int     CP_Clock[7];
++      BOOLEAN CP_DataValid[7];
++      BOOLEAN CP_HSync_P[7], CP_VSync_P[7], CP_SyncValid[7];
+ } SiS_Private;
+ #endif
+--- linux-2.6.0-test1/drivers/video/skeletonfb.c       2003-06-14 12:17:59.000000000 -0700
++++ 25/drivers/video/skeletonfb.c      2003-07-19 17:04:55.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * linux/drivers/video/skeletonfb.c -- Skeleton for a frame buffer device
+  *
+- *  Modified to new api Jan 2001 by James Simmons (jsimmons@transvirtual.com)
++ *  Modified to new api Jan 2001 by James Simmons (jsimmons@infradead.org)
+  *
+  *  Created 28 Dec 1997 by Geert Uytterhoeven
+  *
+@@ -469,15 +469,71 @@ void xxxfb_imageblit(struct fb_info *p, 
+ int xxxfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
+ {
+ /*
+- *      @set:         Which fields we are altering in struct fb_cursor 
++ *      @set:          Which fields we are altering in struct fb_cursor 
+  *    @enable: Disable or enable the cursor 
+- *      @rop:         The bit operation we want to do. 
+- *      @mask:  This is the cursor mask bitmap. 
+- *      @dest:  A image of the area we are going to display the cursor.
+- *            Used internally by the driver.   
+- *      @hot: The hot spot. 
+- *    @image: The actual data for the cursor image.
++ *      @rop:          The bit operation we want to do. 
++ *      @hot:  The hot spot. 
++ *    @image:  The actual data for the cursor image.
++ *      @mask:   This is the cursor mask bitmap. 
+  */
++
++   /* Disable hardware cursor. We don't want to display the cursor 
++      while changing it. Note we use the enable and rop fields in
++      struct fb_cursor that is apart of struct fb_info. Not the 
++      cursor data passed in from userland. */ 
++
++   if (cursor->set & FB_CUR_SETHOT) {
++      info->cursor.hot = cursor->hot;
++      /* Set the hardware cursor's hot spot  */                       
++   }
++      
++   if (cursor->set & FB_CUR_SETPOS) {
++      info->cursor.image.dx = cursor->image.dx;
++      info->cursor.image.dy = cursor->image.dy;
++      /* Set the hardware cursor's position */
++   }
++
++   if (cursor->set & FB_CUR_SETSIZE) {
++      info->cursor.image.height = cursor->image.height;
++      info->cursor.image.width = cursor->image.width;
++      /* Set the hardware cursor's size */    
++   }
++  
++   if (cursor->set & FB_CUR_SETCMAP) {
++      if (cursor->image.depth == 1) {
++              info->cursor.image.fg_color = cursor->image.fg_color;
++              info->cursor.image.bg_color = cursor->image.bg_color;
++      } else {
++              if (cursor->image.cmap.len)
++                      fb_copy_cmap(&cursor->image.cmap, &info->cursor.image.cmap, 0);
++      }
++      info->curosr.image.depth = cursor->image.depth;
++
++      /* Set the hardware cursor's color map */
++   }
++
++   /* 
++    * Set the cursor shape. The two pieces needed to create
++    * the final image is mask and image.data. The mask is 
++    * combined with image.data according to the rop field.
++    */
++   if (cursor->set & FB_CUR_SETSHAPE) {
++      switch (info->cursor.rop) {
++      case ROP_XOR:
++              /* ... */
++              break;
++      case ROP_COPY:
++      default:
++              /* ... */
++              break;
++      }
++      /* ... */
++   }
++   
++   if (info->cursor.enable) {
++      /* Now we turn the hardware cursor on */
++   }
++   return 0;                                          
+ }
+ /**
+--- linux-2.6.0-test1/drivers/video/softcursor.c       2003-06-14 12:18:22.000000000 -0700
++++ 25/drivers/video/softcursor.c      2003-07-19 17:04:55.000000000 -0700
+@@ -21,9 +21,14 @@ int soft_cursor(struct fb_info *info, st
+ {
+       unsigned int scan_align = info->pixmap.scan_align - 1;
+       unsigned int buf_align = info->pixmap.buf_align - 1;
+-      unsigned int i, size, dsize, s_pitch, d_pitch;
+-      u8 *dst, src[64];
+-
++      u8 *dst = (u8 *) info->cursor.image.data;
++      unsigned int i, size, pitch;
++              
++      pitch = ((info->cursor.image.width + 7) >> 3) + scan_align;
++      pitch &= ~scan_align;
++      size = pitch * info->cursor.image.height + buf_align;
++      size &= ~buf_align;
++      
+       if (cursor->set & FB_CUR_SETSIZE) {
+               info->cursor.image.height = cursor->image.height;
+               info->cursor.image.width = cursor->image.width;
+@@ -48,34 +53,27 @@ int soft_cursor(struct fb_info *info, st
+               info->cursor.image.depth = cursor->image.depth;
+       }       
+-      s_pitch = (info->cursor.image.width + 7) >> 3;
+-      dsize = s_pitch * info->cursor.image.height;
+-      d_pitch = (s_pitch + scan_align) & ~scan_align;
+-      size = d_pitch * info->cursor.image.height + buf_align;
+-      size &= ~buf_align;
+-      dst = info->pixmap.addr + fb_get_buffer_offset(info, size);
+-
+-      if (info->cursor.enable) {
++      if (cursor->set & FB_CUR_SETSHAPE) {
+               switch (info->cursor.rop) {
+               case ROP_XOR:
+-                      for (i = 0; i < dsize; i++)
+-                              src[i] = cursor->image.data[i] ^ info->cursor.mask[i]; 
++                      for (i = 0; i < size; i++)
++                              dst[i] ^= info->cursor.mask[i]; 
+                       break;
+               case ROP_COPY:
+               default:
+-                      for (i = 0; i < dsize; i++)
+-                              src[i] = cursor->image.data[i] & info->cursor.mask[i];
++                      for (i = 0; i < size; i++)
++                              dst[i] &= info->cursor.mask[i];
+                       break;
+               }
+-      } else 
+-              memcpy(src, cursor->image.data, dsize);
+-      
+-      move_buf_aligned(info, dst, src, d_pitch, s_pitch, info->cursor.image.height);
+-      info->cursor.image.data = dst;
++      }
+       
+-      info->fbops->fb_imageblit(info, &info->cursor.image);
+-      atomic_dec(&info->pixmap.count);
+-      smp_mb__after_atomic_dec();
++      if (!info->cursor.enable) {
++              for (i = 0; i < size; i++)
++                      dst[i] ^= info->cursor.mask[i]; 
++      }
++              
++      if (info->cursor.image.data)
++              info->fbops->fb_imageblit(info, &info->cursor.image);
+       return 0;
+ }
+--- linux-2.6.0-test1/drivers/video/valkyriefb.c       2003-06-14 12:18:30.000000000 -0700
++++ 25/drivers/video/valkyriefb.c      2003-07-19 17:04:55.000000000 -0700
+@@ -51,7 +51,6 @@
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
+ #include <linux/fb.h>
+-#include <linux/selection.h>
+ #include <linux/init.h>
+ #include <linux/pci.h>
+ #include <linux/nvram.h>
+@@ -66,15 +65,9 @@
+ #endif
+ #include <asm/pgtable.h>
+-#include <video/fbcon.h>
+-#include <video/fbcon-cfb8.h>
+-#include <video/fbcon-cfb16.h>
+-#include <video/macmodes.h>
+-
++#include "macmodes.h"
+ #include "valkyriefb.h"
+-static int can_soft_blank = 1;
+-
+ #ifdef CONFIG_MAC
+ /* We don't yet have functions to read the PRAM... perhaps we can
+    adapt them from the PPC code? */
+@@ -84,27 +77,17 @@ static int default_cmode = CMODE_8;
+ static int default_vmode = VMODE_NVRAM;
+ static int default_cmode = CMODE_NVRAM;
+ #endif
+-static char fontname[40] __initdata = { 0 };
+-
+-static int switching = 0;
+ struct fb_par_valkyrie {
+       int     vmode, cmode;
+       int     xres, yres;
+       int     vxres, vyres;
+-      int     xoffset, yoffset;
++      struct valkyrie_regvals *init;
+ };
+ struct fb_info_valkyrie {
+-      struct fb_info                  info;
+-      struct fb_fix_screeninfo        fix;
+-      struct fb_var_screeninfo        var;
+-      struct display                  disp;
+-      struct fb_par_valkyrie          par;
+-      struct {
+-          __u8 red, green, blue;
+-      }                       palette[256];
+-      
++      struct fb_info          info;
++      struct fb_par_valkyrie  par;
+       struct cmap_regs        *cmap_regs;
+       unsigned long           cmap_regs_phys;
+       
+@@ -116,9 +99,8 @@ struct fb_info_valkyrie {
+       
+       int                     sense;
+       unsigned long           total_vram;
+-#ifdef FBCON_HAS_CFB16
+-      u16 fbcon_cfb16_cmap[16];
+-#endif
++
++      u32                     pseudo_palette[16];
+ };
+ /*
+@@ -127,10 +109,9 @@ struct fb_info_valkyrie {
+ int valkyriefb_init(void);
+ int valkyriefb_setup(char*);
+-static int valkyrie_set_var(struct fb_var_screeninfo *var, int con,
+-                       struct fb_info *info);
+-static int valkyrie_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                        struct fb_info *info);
++static int valkyriefb_check_var(struct fb_var_screeninfo *var,
++                              struct fb_info *info);
++static int valkyriefb_set_par(struct fb_info *info);
+ static int valkyriefb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+                            u_int transp, struct fb_info *info);
+ static int valkyriefb_blank(int blank_mode, struct fb_info *info);
+@@ -138,136 +119,69 @@ static int valkyriefb_blank(int blank_mo
+ static int read_valkyrie_sense(struct fb_info_valkyrie *p);
+ static inline int valkyrie_vram_reqd(int video_mode, int color_mode);
+ static void set_valkyrie_clock(unsigned char *params);
+-static void valkyrie_set_par(const struct fb_par_valkyrie *p, struct fb_info_valkyrie *info);
+ static inline int valkyrie_par_to_var(struct fb_par_valkyrie *par, struct fb_var_screeninfo *var);
+ static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
+       struct fb_par_valkyrie *par, const struct fb_info *fb_info);
+ static void valkyrie_init_info(struct fb_info *info, struct fb_info_valkyrie *p);
+-static void valkyrie_par_to_display(struct fb_par_valkyrie *par,
+-  struct display *disp, struct fb_fix_screeninfo *fix, struct fb_info_valkyrie *p);
+-static void valkyrie_init_display(struct display *disp);
+-static void valkyrie_par_to_fix(struct fb_par_valkyrie *par, struct fb_fix_screeninfo *fix,
+-      struct fb_info_valkyrie *p);
++static void valkyrie_par_to_fix(struct fb_par_valkyrie *par, struct fb_fix_screeninfo *fix);
+ static void valkyrie_init_fix(struct fb_fix_screeninfo *fix, struct fb_info_valkyrie *p);
+ static struct fb_ops valkyriefb_ops = {
+       .owner =        THIS_MODULE,
+-      .fb_set_var =   valkyrie_set_var,
+-      .fb_get_cmap =  valkyrie_get_cmap,
+-      .fb_set_cmap =  gen_set_cmap,
++      .fb_check_var = valkyriefb_check_var,
++      .fb_set_par =   valkyriefb_set_par,
+       .fb_setcolreg = valkyriefb_setcolreg,
+       .fb_blank =     valkyriefb_blank,
++      .fb_fillrect    = cfb_fillrect,
++      .fb_copyarea    = cfb_copyarea,
++      .fb_imageblit   = cfb_imageblit,
++      .fb_cursor      = soft_cursor,
+ };
+-static int valkyriefb_getcolreg(u_int regno, u_int *red, u_int *green,
+-                           u_int *blue, u_int *transp, struct fb_info *info);
+-
+-/* Sets everything according to var */
+-static int valkyrie_set_var(struct fb_var_screeninfo *var, int con,
+-                       struct fb_info *info)
++/* Sets the video mode according to info->var */
++static int valkyriefb_set_par(struct fb_info *info)
+ {
+       struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) info;
+-      struct display *disp;
+-      struct fb_par_valkyrie par;
+-      int depthchange, err;
++      volatile struct valkyrie_regs *valkyrie_regs = p->valkyrie_regs;
++      struct fb_par_valkyrie *par = info->par;
++      struct valkyrie_regvals *init;
++      int err;
+-      disp = (con >= 0) ? &fb_display[con] : &p->disp;
+-      if ((err = valkyrie_var_to_par(var, &par, info))) {
+-               /* printk (KERN_ERR "Error in valkyrie_set_var, calling valkyrie_var_to_par: %d.\n", err); */
++      if ((err = valkyrie_var_to_par(&info->var, par, info)))
+               return err;
+-      }
+-      
+-      if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW) {
+-              /* printk(KERN_ERR "Not activating, in valkyrie_set_var.\n"); */
+-              valkyrie_par_to_var(&par, var);
+-              return 0;
+-      }
+-      /*
+-       * I know, we want to use fb_display[con], but grab certain info
+-       * from p->var instead.
+-       */
+-#define DIRTY(x) (p->var.x != var->x)
+-      depthchange = DIRTY(bits_per_pixel);
+-      /* adding "&& !DIRTY(pixclock)" corrects vmode-switching problems */
+-      if(!DIRTY(xres) && !DIRTY(yres) && !DIRTY(xres_virtual) &&
+-         !DIRTY(yres_virtual) && !DIRTY(bits_per_pixel) && !DIRTY(pixclock)) {
+-              valkyrie_par_to_var(&par, var);
+-              p->var = disp->var = *var;
+-              return 0;
+-      }
++      valkyrie_par_to_fix(par, &info->fix);
+-      p->par = par;
+-      valkyrie_par_to_var(&par, var);
+-      p->var = *var;
+-      valkyrie_par_to_fix(&par, &p->fix, p);
+-      valkyrie_par_to_display(&par, disp, &p->fix, p);
+-      p->disp = *disp;
+-      
+-      if (info->changevar && !switching) {
+-              /* Don't want to do this if just switching consoles. */
+-              (*info->changevar)(con);
+-      }
+-      if (con == info->currcon)
+-              valkyrie_set_par(&par, p);
+-      if (depthchange)
+-              if ((err = fb_alloc_cmap(&disp->cmap, 0, 0)))
+-                      return err;
+-      if (depthchange || switching)
+-              do_install_cmap(con, info);
+-      return 0;
+-}
++      /* Reset the valkyrie */
++      out_8(&valkyrie_regs->status.r, 0);
++      udelay(100);
+-static int valkyrie_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+-                        struct fb_info *info)
+-{
+-      if (con == info->currcon)       {
+-              /* current console? */
+-              return fb_get_cmap(cmap, kspc, valkyriefb_getcolreg, info);
+-      }
+-      if (fb_display[con].cmap.len) { /* non default colormap? */
+-              fb_copy_cmap(&fb_display[con].cmap, cmap, kspc? 0: 2);
+-      }
+-      else {
+-              int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256;
+-              fb_copy_cmap(fb_default_cmap(size), cmap, kspc ? 0 : 2);
+-      }
+-      return 0;
+-}
++      /* Initialize display timing registers */
++      init = par->init;
++      out_8(&valkyrie_regs->mode.r, init->mode | 0x80);
++      out_8(&valkyrie_regs->depth.r, par->cmode + 3);
++      set_valkyrie_clock(init->clock_params);
++      udelay(100);
+-static int valkyriefb_switch(int con, struct fb_info *fb)
+-{
+-      struct fb_info_valkyrie *info = (struct fb_info_valkyrie *) fb;
+-      struct fb_par_valkyrie par;
++      /* Turn on display */
++      out_8(&valkyrie_regs->mode.r, init->mode);
+-      if (fb_display[fb->currcon].cmap.len)
+-              fb_get_cmap(&fb_display[fb->currcon].cmap, 1, valkyriefb_getcolreg,
+-                          fb);
+-      fb->currcon = con;
+-#if 1
+-      valkyrie_var_to_par(&fb_display[fb->currcon].var, &par, fb);
+-      valkyrie_set_par(&par, info);
+-      do_install_cmap(con, fb);
+-#else
+-      /* I see no reason not to do this.  Minus info->changevar(). */
+-      /* DOH.  This makes valkyrie_set_var compare, you guessed it, */
+-      /* fb_display[con].var (first param), and fb_display[con].var! */
+-      /* Perhaps I just fixed that... */
+-      switching = 1;
+-      valkyrie_set_var(&fb_display[con].var, con, info);
+-      switching = 0;
+-#endif
+       return 0;
+ }
+-static int valkyriefb_updatevar(int con, struct fb_info *info)
++static int
++valkyriefb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+ {
++      int err;
++      struct fb_par_valkyrie par;
++
++      if ((err = valkyrie_var_to_par(var, &par, info)))
++              return err;
++      valkyrie_par_to_var(&par, var);
+       return 0;
+ }
+-static int valkyriefb_blank(int blank_mode, struct fb_info *info)
+-{
+ /*
+  *  Blank the screen if blank_mode != 0, else unblank. If blank_mode == NULL
+  *  then the caller blanks by setting the CLUT (Color Look Up Table) to all
+@@ -278,48 +192,34 @@ static int valkyriefb_blank(int blank_mo
+  *    blank_mode == 3: suspend hsync
+  *    blank_mode == 4: powerdown
+  */
+-      struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) info;
+-      struct valkyrie_regvals *init;
+-      unsigned char vmode;
+-
+-      if (p->disp.can_soft_blank
+-       && ((vmode = p->par.vmode) > 0)
+-       && (vmode <= VMODE_MAX)
+-       && ((init = valkyrie_reg_init[vmode - 1]) != NULL)) {
+-              if (blank_mode)
+-                      --blank_mode;
+-              switch (blank_mode) {
+-              default:        /* unblank */
+-                      out_8(&p->valkyrie_regs->mode.r, init->mode);
+-                      break;
+-              case VESA_VSYNC_SUSPEND:
+-              case VESA_HSYNC_SUSPEND:
+-                      /*
+-                       * [kps] Value extracted from MacOS. I don't know
+-                       * whether this bit disables hsync or vsync, or
+-                       * whether the hardware can do the other as well.
+-                       */
+-                      out_8(&p->valkyrie_regs->mode.r, init->mode | 0x40);
+-                      break;
+-              case VESA_POWERDOWN:
+-                      out_8(&p->valkyrie_regs->mode.r, 0x66);
+-                      break;
+-              }
+-      }
+-      return 0;
+-}
+-
+-static int valkyriefb_getcolreg(u_int regno, u_int *red, u_int *green,
+-                           u_int *blue, u_int *transp, struct fb_info *info)
++static int valkyriefb_blank(int blank_mode, struct fb_info *info)
+ {
+       struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) info;
++      struct fb_par_valkyrie *par = info->par;
++      struct valkyrie_regvals *init = par->init;
+-      if (regno > 255)
++      if (init == NULL)
+               return 1;
+-      *red = (p->palette[regno].red<<8) | p->palette[regno].red;
+-      *green = (p->palette[regno].green<<8) | p->palette[regno].green;
+-      *blue = (p->palette[regno].blue<<8) | p->palette[regno].blue;
++      switch (blank_mode) {
++      case 0:                 /* unblank */
++              out_8(&p->valkyrie_regs->mode.r, init->mode);
++              break;
++      case 1:
++              return 1;       /* get caller to set CLUT to all black */
++      case VESA_VSYNC_SUSPEND+1:
++      case VESA_HSYNC_SUSPEND+1:
++              /*
++               * [kps] Value extracted from MacOS. I don't know
++               * whether this bit disables hsync or vsync, or
++               * whether the hardware can do the other as well.
++               */
++              out_8(&p->valkyrie_regs->mode.r, init->mode | 0x40);
++              break;
++      case VESA_POWERDOWN+1:
++              out_8(&p->valkyrie_regs->mode.r, 0x66);
++              break;
++      }
+       return 0;
+ }
+@@ -328,16 +228,13 @@ static int valkyriefb_setcolreg(u_int re
+ {
+       struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) info;
+       volatile struct cmap_regs *cmap_regs = p->cmap_regs;
+-
++      struct fb_par_valkyrie *par = info->par;
+       if (regno > 255)
+               return 1;
+       red >>= 8;
+       green >>= 8;
+       blue >>= 8;
+-      p->palette[regno].red = red;
+-      p->palette[regno].green = green;
+-      p->palette[regno].blue = blue;
+       /* tell clut which address to fill */
+       out_8(&p->cmap_regs->addr, regno);
+@@ -347,11 +244,9 @@ static int valkyriefb_setcolreg(u_int re
+       out_8(&cmap_regs->lut, green);
+       out_8(&cmap_regs->lut, blue);
+-      if (regno < 16) {
+-#ifdef FBCON_HAS_CFB16
+-              p->fbcon_cfb16_cmap[regno] = (regno << 10) | (regno << 5) | regno;
+-#endif
+-      }
++      if (regno < 16 && par->cmode == CMODE_16)
++              ((u32 *)info->pseudo_palette)[regno] =
++                      (regno << 10) | (regno << 5) | regno;
+       return 0;
+ }
+@@ -359,10 +254,11 @@ static int valkyriefb_setcolreg(u_int re
+ static int valkyrie_vram_reqd(int video_mode, int color_mode)
+ {
+       int pitch;
++      struct valkyrie_regvals *init = valkyrie_reg_init[video_mode-1];
+       
+-      if ((pitch = valkyrie_reg_init[video_mode-1]->pitch[color_mode]) == 0)
+-              pitch = 2 * valkyrie_reg_init[video_mode-1]->pitch[0];
+-      return valkyrie_reg_init[video_mode-1]->vres * pitch;
++      if ((pitch = init->pitch[color_mode]) == 0)
++              pitch = 2 * init->pitch[0];
++      return init->vres * pitch;
+ }
+ static void set_valkyrie_clock(unsigned char *params)
+@@ -380,14 +276,10 @@ static void set_valkyrie_clock(unsigned 
+ #endif
+ }
+-static void __init init_valkyrie(struct fb_info_valkyrie *p)
++static void __init valkyrie_choose_mode(struct fb_info_valkyrie *p)
+ {
+-      struct fb_par_valkyrie *par = &p->par;
+-      struct fb_var_screeninfo var;
+-      int j, k;
+-
+       p->sense = read_valkyrie_sense(p);
+-      printk(KERN_INFO "Monitor sense value = 0x%x, ", p->sense);
++      printk(KERN_INFO "Monitor sense value = 0x%x\n", p->sense);
+       /* Try to pick a video mode out of NVRAM if we have one. */
+ #ifndef CONFIG_MAC
+@@ -409,80 +301,22 @@ static void __init init_valkyrie(struct 
+ #endif
+       /*
+-       * Reduce the pixel size if we don't have enough VRAM or bandwitdh.
++       * Reduce the pixel size if we don't have enough VRAM or bandwidth.
+        */
+-      if (default_cmode < CMODE_8
+-       || default_cmode > CMODE_16
+-       || valkyrie_reg_init[default_vmode-1]->pitch[default_cmode] == 0
+-       || valkyrie_vram_reqd(default_vmode, default_cmode) > p->total_vram)
++      if (default_cmode < CMODE_8 || default_cmode > CMODE_16
++          || valkyrie_reg_init[default_vmode-1]->pitch[default_cmode] == 0
++          || valkyrie_vram_reqd(default_vmode, default_cmode) > p->total_vram)
+               default_cmode = CMODE_8;
+-      
+-      printk(KERN_INFO "using video mode %d and color mode %d.\n", default_vmode, default_cmode);
+-      mac_vmode_to_var(default_vmode, default_cmode, &var);
+-      if (valkyrie_var_to_par(&var, par, &p->info)) {
+-          printk(KERN_ERR "valkyriefb: can't set default video mode\n");
+-          return ;
+-      }
+-      
+-      valkyrie_init_fix(&p->fix, p);
+-      valkyrie_par_to_fix(&p->par, &p->fix, p);
+-      valkyrie_par_to_var(&p->par, &p->var);
+-      valkyrie_init_display(&p->disp);
+-      valkyrie_par_to_display(&p->par, &p->disp, &p->fix, p);
+-      valkyrie_init_info(&p->info, p);
+-
+-      /* Initialize colormap */
+-      for (j = 0; j < 16; j++) {
+-              k = color_table[j];
+-              p->palette[j].red = default_red[k];
+-              p->palette[j].green = default_grn[k];
+-              p->palette[j].blue = default_blu[k];
+-      }
+-      
+-      valkyrie_set_var (&var, -1, &p->info);
+-
+-      if (register_framebuffer(&p->info) < 0) {
+-              kfree(p);
+-              return;
+-      }
+-      
+-      printk(KERN_INFO "fb%d: valkyrie frame buffer device\n", p->info.node); 
+-}
+-
+-static void valkyrie_set_par(const struct fb_par_valkyrie *par,
+-                           struct fb_info_valkyrie *p)
+-{
+-      struct valkyrie_regvals *init;
+-      volatile struct valkyrie_regs *valkyrie_regs = p->valkyrie_regs;
+-      int vmode, cmode;
+-      
+-      vmode = par->vmode;
+-      cmode = par->cmode;
+-      
+-      if (vmode <= 0
+-       || vmode > VMODE_MAX
+-       || (init = valkyrie_reg_init[vmode - 1]) == NULL)
+-              panic("valkyrie: display mode %d not supported", vmode);
+-
+-      /* Reset the valkyrie */
+-      out_8(&valkyrie_regs->status.r, 0);
+-      udelay(100);
+-
+-      /* Initialize display timing registers */
+-      out_8(&valkyrie_regs->mode.r, init->mode | 0x80);
+-      out_8(&valkyrie_regs->depth.r, cmode + 3);
+-      set_valkyrie_clock(init->clock_params);
+-      udelay(100);
+-
+-      /* Turn on display */
+-      out_8(&valkyrie_regs->mode.r, init->mode);
++      printk(KERN_INFO "using video mode %d and color mode %d.\n",
++             default_vmode, default_cmode);
+ }
+ int __init valkyriefb_init(void)
+ {
+       struct fb_info_valkyrie *p;
+       unsigned long frame_buffer_phys, cmap_regs_phys, flags;
++      int err;
+ #ifdef CONFIG_MAC
+       if (!MACH_IS_MAC)
+@@ -503,10 +337,11 @@ int __init valkyriefb_init(void)
+       if (dp == 0)
+               return 0;
+-      if(dp->n_addrs != 1) {
+-              printk(KERN_ERR "expecting 1 address for valkyrie (got %d)", dp->n_addrs);
++      if (dp->n_addrs != 1) {
++              printk(KERN_ERR "expecting 1 address for valkyrie (got %d)\n",
++                     dp->n_addrs);
+               return 0;
+-      }       
++      }
+       frame_buffer_phys = dp->addrs[0].address;
+       cmap_regs_phys = dp->addrs[0].address+0x304000;
+@@ -515,7 +350,7 @@ int __init valkyriefb_init(void)
+       p = kmalloc(sizeof(*p), GFP_ATOMIC);
+       if (p == 0)
+-              return 0;
++              return -ENOMEM;
+       memset(p, 0, sizeof(*p));
+       /* Map in frame buffer and registers */
+@@ -524,14 +359,42 @@ int __init valkyriefb_init(void)
+               return 0;
+       }
+       p->total_vram = 0x100000;
+-      p->frame_buffer_phys  = frame_buffer_phys;
++      p->frame_buffer_phys = frame_buffer_phys;
+       p->frame_buffer = __ioremap(frame_buffer_phys, p->total_vram, flags);
+       p->cmap_regs_phys = cmap_regs_phys;
+       p->cmap_regs = ioremap(p->cmap_regs_phys, 0x1000);
+       p->valkyrie_regs_phys = cmap_regs_phys+0x6000;
+       p->valkyrie_regs = ioremap(p->valkyrie_regs_phys, 0x1000);
+-      init_valkyrie(p);
++      err = -ENOMEM;
++      if (p->frame_buffer == NULL || p->cmap_regs == NULL
++          || p->valkyrie_regs == NULL) {
++              printk(KERN_ERR "valkyriefb: couldn't map resources\n");
++              goto out_free;
++      }
++
++      valkyrie_choose_mode(p);
++      mac_vmode_to_var(default_vmode, default_cmode, &p->info.var);
++      valkyrie_init_info(&p->info, p);
++      valkyrie_init_fix(&p->info.fix, p);
++      if (valkyriefb_set_par(&p->info))
++              /* "can't happen" */
++              printk(KERN_ERR "valkyriefb: can't set default video mode\n");
++
++      if ((err = register_framebuffer(&p->info)) != 0)
++              goto out_free;
++
++      printk(KERN_INFO "fb%d: valkyrie frame buffer device\n", p->info.node);
+       return 0;
++
++ out_free:
++      if (p->frame_buffer)
++              iounmap(p->frame_buffer);
++      if (p->cmap_regs)
++              iounmap(p->cmap_regs);
++      if (p->valkyrie_regs)
++              iounmap(p->valkyrie_regs);
++      kfree(p);
++      return err;
+ }
+ /*
+@@ -541,22 +404,22 @@ static int read_valkyrie_sense(struct fb
+ {
+       int sense, in;
+-    out_8(&p->valkyrie_regs->msense.r, 0);   /* release all lines */
+-    __delay(20000);
+-    sense = ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x70) << 4;
+-    /* drive each sense line low in turn and collect the other 2 */
+-    out_8(&p->valkyrie_regs->msense.r, 4);   /* drive A low */
+-    __delay(20000);
+-    sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x30);
+-    out_8(&p->valkyrie_regs->msense.r, 2);   /* drive B low */
+-    __delay(20000);
+-    sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x40) >> 3;
++      out_8(&p->valkyrie_regs->msense.r, 0);   /* release all lines */
++      __delay(20000);
++      sense = ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x70) << 4;
++      /* drive each sense line low in turn and collect the other 2 */
++      out_8(&p->valkyrie_regs->msense.r, 4);   /* drive A low */
++      __delay(20000);
++      sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x30);
++      out_8(&p->valkyrie_regs->msense.r, 2);   /* drive B low */
++      __delay(20000);
++      sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x40) >> 3;
+       sense |= (in & 0x10) >> 2;
+-    out_8(&p->valkyrie_regs->msense.r, 1);   /* drive C low */
+-    __delay(20000);
+-    sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x60) >> 5;
++      out_8(&p->valkyrie_regs->msense.r, 1);   /* drive C low */
++      __delay(20000);
++      sense |= ((in = in_8(&p->valkyrie_regs->msense.r)) & 0x60) >> 5;
+-    out_8(&p->valkyrie_regs->msense.r, 7);
++      out_8(&p->valkyrie_regs->msense.r, 7);
+       return sense;
+ }
+@@ -565,8 +428,6 @@ static int read_valkyrie_sense(struct fb
+  * This routine takes a user-supplied var,
+  * and picks the best vmode/cmode from it.
+  */
+-static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
+-      struct fb_par_valkyrie *par, const struct fb_info *fb_info)
+ /* [bkn] I did a major overhaul of this function.
+  *
+@@ -589,55 +450,56 @@ static int valkyrie_var_to_par(struct fb
+  * good start...
+  */
++static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
++      struct fb_par_valkyrie *par, const struct fb_info *fb_info)
+ {
+-      int bpp = var->bits_per_pixel;
++      int vmode, cmode;
+       struct valkyrie_regvals *init;
+       struct fb_info_valkyrie *p = (struct fb_info_valkyrie *) fb_info;
+-
+-      if(mac_var_to_vmode(var, &par->vmode, &par->cmode) != 0) {
+-              printk(KERN_ERR "valkyrie_var_to_par: %dx%dx%d unsuccessful.\n",var->xres,var->yres,var->bits_per_pixel);
++      if (mac_var_to_vmode(var, &vmode, &cmode) != 0) {
++              printk(KERN_ERR "valkyriefb: can't do %dx%dx%d.\n",
++                     var->xres, var->yres, var->bits_per_pixel);
+               return -EINVAL;
+       }
+       /* Check if we know about the wanted video mode */
+-      if(!valkyrie_reg_init[par->vmode-1]) {
+-              printk(KERN_ERR "valkyrie_var_to_par: vmode %d not valid.\n", par->vmode);
++      if (vmode < 1 || vmode > VMODE_MAX || !valkyrie_reg_init[vmode-1]) {
++              printk(KERN_ERR "valkyriefb: vmode %d not valid.\n", vmode);
+               return -EINVAL;
+       }
+-
+-      par->xres = var->xres;
+-      par->yres = var->yres;
+-      par->xoffset = 0;
+-      par->yoffset = 0;
+-      par->vxres = par->xres;
+-      par->vyres = par->yres;
+       
+-      if (var->xres_virtual > var->xres || var->yres_virtual > var->yres
+-              || var->xoffset != 0 || var->yoffset != 0) {
++      if (cmode != CMODE_8 && cmode != CMODE_16) {
++              printk(KERN_ERR "valkyriefb: cmode %d not valid.\n", cmode);
+               return -EINVAL;
+       }
+-      if (bpp <= 8)
+-              par->cmode = CMODE_8;
+-      else if (bpp <= 16)
+-              par->cmode = CMODE_16;
+-      else {
+-              printk(KERN_ERR "valkyrie_var_to_par: cmode %d not supported.\n", par->cmode);
++      if (var->xres_virtual > var->xres || var->yres_virtual > var->yres
++          || var->xoffset != 0 || var->yoffset != 0) {
+               return -EINVAL;
+       }
+-      init = valkyrie_reg_init[par->vmode-1];
+-      if (init->pitch[par->cmode] == 0) {
+-              printk(KERN_ERR "valkyrie_var_to_par: vmode %d does not support cmode %d.\n", par->vmode, par->cmode);
++      init = valkyrie_reg_init[vmode-1];
++      if (init->pitch[cmode] == 0) {
++              printk(KERN_ERR "valkyriefb: vmode %d does not support "
++                     "cmode %d.\n", vmode, cmode);
+               return -EINVAL;
+       }
+-      if (valkyrie_vram_reqd(par->vmode, par->cmode) > p->total_vram) {
+-              printk(KERN_ERR "valkyrie_var_to_par: not enough ram for vmode %d, cmode %d.\n", par->vmode, par->cmode);
++      if (valkyrie_vram_reqd(vmode, cmode) > p->total_vram) {
++              printk(KERN_ERR "valkyriefb: not enough ram for vmode %d, "
++                     "cmode %d.\n", vmode, cmode);
+               return -EINVAL;
+       }
++      par->vmode = vmode;
++      par->cmode = cmode;
++      par->init = init;
++      par->xres = var->xres;
++      par->yres = var->yres;
++      par->vxres = par->xres;
++      par->vyres = par->yres;
++
+       return 0;
+ }
+@@ -653,7 +515,9 @@ static void valkyrie_init_fix(struct fb_
+       fix->mmio_start = p->valkyrie_regs_phys;
+       fix->mmio_len = sizeof(struct valkyrie_regs);
+       fix->type = FB_TYPE_PACKED_PIXELS;
+-      
++      fix->smem_start = p->frame_buffer_phys + 0x1000;
++      fix->smem_len = p->total_vram;
++
+       fix->type_aux = 0;
+       fix->ywrapstep = 0;
+       fix->ypanstep = 0;
+@@ -663,67 +527,23 @@ static void valkyrie_init_fix(struct fb_
+ /* Fix must already be inited above */
+ static void valkyrie_par_to_fix(struct fb_par_valkyrie *par,
+-      struct fb_fix_screeninfo *fix,
+-      struct fb_info_valkyrie *p)
++      struct fb_fix_screeninfo *fix)
+ {
+-      fix->smem_start = p->frame_buffer_phys + 0x1000;
+-#if 1
+       fix->smem_len = valkyrie_vram_reqd(par->vmode, par->cmode);
+-#else
+-      fix->smem_len = p->total_vram;
+-#endif
+       fix->visual = (par->cmode == CMODE_8) ?
+               FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
+       fix->line_length = par->vxres << par->cmode;
+               /* ywrapstep, xpanstep, ypanstep */
+ }
+-static void valkyrie_init_display(struct display *disp)
+-{
+-      memset(disp, 0, sizeof(*disp));
+-      disp->can_soft_blank = can_soft_blank;
+-      disp->scrollmode = SCROLL_YREDRAW;
+-}
+-
+-static void valkyrie_par_to_display(struct fb_par_valkyrie *par,
+-  struct display *disp, struct fb_fix_screeninfo *fix, struct fb_info_valkyrie *p)
+-{
+-      disp->var = p->var;
+-
+-      if(disp->scrollmode != SCROLL_YREDRAW) {
+-              printk(KERN_ERR "Scroll mode not YREDRAW in valkyrie_par_to_display\n");
+-              disp->scrollmode = SCROLL_YREDRAW;
+-      }
+-      switch (par->cmode) {
+-#ifdef FBCON_HAS_CFB8
+-                case CMODE_8:
+-                        disp->dispsw = &fbcon_cfb8;
+-                        break;
+-#endif
+-#ifdef FBCON_HAS_CFB16
+-                case CMODE_16:
+-                        disp->dispsw = &fbcon_cfb16;
+-                        disp->dispsw_data = p->fbcon_cfb16_cmap;
+-                        break;
+-#endif
+-                default:
+-                        disp->dispsw = &fbcon_dummy;
+-                        break;
+-        }
+-}
+-
+ static void __init valkyrie_init_info(struct fb_info *info, struct fb_info_valkyrie *p)
+ {
+-      strcpy(info->modename, p->fix.id);
+       info->fbops = &valkyriefb_ops;
+       info->screen_base = (char *) p->frame_buffer + 0x1000;
+-      info->disp = &p->disp;
+-      info->currcon = -1;
+-      strcpy(info->fontname, fontname);
+-      info->changevar = NULL;
+-      info->switch_con = &valkyriefb_switch;
+-      info->updatevar = &valkyriefb_updatevar;
+       info->flags = FBINFO_FLAG_DEFAULT;
++      info->pseudo_palette = p->pseudo_palette;
++      fb_alloc_cmap(&info->cmap, 256, 0);
++      info->par = &p->par;
+ }
+@@ -738,41 +558,23 @@ int __init valkyriefb_setup(char *option
+               return 0;
+       while ((this_opt = strsep(&options, ",")) != NULL) {
+-              if (!strncmp(this_opt, "font:", 5)) {
+-                      char *p;
+-                      int i;
+-
+-                      p = this_opt + 5;
+-                      for (i = 0; i < sizeof(fontname) - 1; i++)
+-                              if (!*p || *p == ' ' || *p == ',')
+-                                      break;
+-                      memcpy(fontname, this_opt + 5, i);
+-                      fontname[i] = 0;
+-              }
+-              else if (!strncmp(this_opt, "vmode:", 6)) {
++              if (!strncmp(this_opt, "vmode:", 6)) {
+                       int vmode = simple_strtoul(this_opt+6, NULL, 0);
+-              if (vmode > 0 && vmode <= VMODE_MAX)
++                      if (vmode > 0 && vmode <= VMODE_MAX)
+                               default_vmode = vmode;
+               }
+               else if (!strncmp(this_opt, "cmode:", 6)) {
+                       int depth = simple_strtoul(this_opt+6, NULL, 0);
+                       switch (depth) {
+-                       case 8:
+-                          default_cmode = CMODE_8;
+-                          break;
+-                       case 15:
+-                       case 16:
+-                          default_cmode = CMODE_16;
+-                          break;
++                      case 8:
++                              default_cmode = CMODE_8;
++                              break;
++                      case 15:
++                      case 16:
++                              default_cmode = CMODE_16;
++                              break;
+                       }
+               }
+-              /* XXX - remove these options once blanking has been tested */
+-              else if (!strncmp(this_opt, "noblank", 7)) {
+-                      can_soft_blank = 0;
+-              }
+-              else if (!strncmp(this_opt, "blank", 5)) {
+-                      can_soft_blank = 1;
+-              }
+       }
+       return 0;
+ }
+--- linux-2.6.0-test1/drivers/video/vesafb.c   2003-06-14 12:17:57.000000000 -0700
++++ 25/drivers/video/vesafb.c  2003-07-19 17:03:50.000000000 -0700
+@@ -51,7 +51,7 @@ static struct fb_info fb_info;
+ static u32 pseudo_palette[17];
+ static int             inverse   = 0;
+-static int             mtrr      = 0;
++static int             mtrr      = 1;
+ static int             pmi_setpal = 0;        /* pmi for palette changes ??? */
+ static int             ypan       = 0;  /* 0..nothing, 1..ypan, 2..ywrap */
+@@ -208,6 +208,8 @@ int __init vesafb_setup(char *options)
+                       pmi_setpal=1;
+               else if (! strcmp(this_opt, "mtrr"))
+                       mtrr=1;
++              else if (! strcmp(this_opt, "nomtrr"))
++                      mtrr=0;
+       }
+       return 0;
+ }
+@@ -231,6 +233,12 @@ int __init vesafb_init(void)
+       vesafb_fix.visual   = (vesafb_defined.bits_per_pixel == 8) ?
+               FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
++      /* limit framebuffer size to 16 MB.  Otherwise we'll eat tons of
++       * kernel address space for nothing if the gfx card has alot of
++       * memory (>= 128 MB isn't uncommon these days ...) */
++      if (vesafb_fix.smem_len > 16 * 1024 * 1024)
++              vesafb_fix.smem_len = 16 * 1024 * 1024;
++
+ #ifndef __i386__
+       screen_info.vesapm_seg = 0;
+ #endif
+--- linux-2.6.0-test1/fs/aio.c 2003-07-13 21:44:34.000000000 -0700
++++ 25/fs/aio.c        2003-07-19 17:07:03.000000000 -0700
+@@ -28,6 +28,8 @@
+ #include <linux/module.h>
+ #include <linux/highmem.h>
+ #include <linux/workqueue.h>
++#include <linux/writeback.h>
++#include <linux/pagemap.h>
+ #include <asm/kmap_types.h>
+ #include <asm/uaccess.h>
+@@ -39,6 +41,9 @@
+ #define dprintk(x...) do { ; } while (0)
+ #endif
++long aio_run = 0; /* for testing only */
++long aio_wakeups = 0; /* for testing only */
++
+ /*------ sysctl variables----*/
+ atomic_t aio_nr = ATOMIC_INIT(0);     /* current system wide number of aio requests */
+ unsigned aio_max_nr = 0x10000;        /* system wide maximum number of aio requests */
+@@ -48,6 +53,7 @@ static kmem_cache_t  *kiocb_cachep;
+ static kmem_cache_t   *kioctx_cachep;
+ static struct workqueue_struct *aio_wq;
++static struct workqueue_struct *aio_fput_wq;
+ /* Used for rare fput completion. */
+ static void aio_fput_routine(void *);
+@@ -75,6 +81,7 @@ static int __init aio_setup(void)
+               panic("unable to create kioctx cache");
+       aio_wq = create_workqueue("aio");
++      aio_fput_wq = create_workqueue("aio_fput");
+       pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
+@@ -281,6 +288,7 @@ static void aio_cancel_all(struct kioctx
+               struct kiocb *iocb = list_kiocb(pos);
+               list_del_init(&iocb->ki_list);
+               cancel = iocb->ki_cancel;
++              kiocbSetCancelled(iocb);
+               if (cancel) {
+                       iocb->ki_users++;
+                       spin_unlock_irq(&ctx->ctx_lock);
+@@ -341,6 +349,11 @@ void exit_aio(struct mm_struct *mm)
+               aio_cancel_all(ctx);
+               wait_for_all_aios(ctx);
++              /*
++               * this is an overkill, but ensures we don't leave
++               * the ctx on the aio_wq
++               */
++              flush_workqueue(aio_wq);
+               if (1 != atomic_read(&ctx->users))
+                       printk(KERN_DEBUG
+@@ -395,6 +408,7 @@ static struct kiocb *__aio_get_req(struc
+       req->ki_cancel = NULL;
+       req->ki_retry = NULL;
+       req->ki_user_obj = NULL;
++      INIT_LIST_HEAD(&req->ki_run_list);
+       /* Check if the completion queue has enough free space to
+        * accept an event from this io.
+@@ -494,7 +508,7 @@ static int __aio_put_req(struct kioctx *
+               spin_lock(&fput_lock);
+               list_add(&req->ki_list, &fput_head);
+               spin_unlock(&fput_lock);
+-              queue_work(aio_wq, &fput_work);
++              queue_work(aio_fput_wq, &fput_work);
+       } else
+               really_put_req(ctx, req);
+       return 1;
+@@ -536,65 +550,302 @@ struct kioctx *lookup_ioctx(unsigned lon
+       return ioctx;
+ }
++/*
++ * use_mm
++ *    Makes the calling kernel thread take on the specified
++ *    mm context.
++ *    Called by the retry thread execute retries within the
++ *    iocb issuer's mm context, so that copy_from/to_user
++ *    operations work seamlessly for aio.
++ *    (Note: this routine is intended to be called only
++ *    from a kernel thread context)
++ */
+ static void use_mm(struct mm_struct *mm)
+ {
+-      struct mm_struct *active_mm = current->active_mm;
++      struct mm_struct *active_mm;
++      struct task_struct *tsk = current;
++
++      task_lock(tsk);
++      active_mm = tsk->active_mm;
+       atomic_inc(&mm->mm_count);
+-      current->mm = mm;
+-      if (mm != active_mm) {
+-              current->active_mm = mm;
+-              activate_mm(active_mm, mm);
+-      }
++      tsk->mm = mm;
++      tsk->active_mm = mm;
++      activate_mm(active_mm, mm);
++      task_unlock(tsk);
++
+       mmdrop(active_mm);
+ }
+-static void unuse_mm(struct mm_struct *mm)
++/*
++ * unuse_mm
++ *    Reverses the effect of use_mm, i.e. releases the
++ *    specified mm context which was earlier taken on
++ *    by the calling kernel thread
++ *    (Note: this routine is intended to be called only
++ *    from a kernel thread context)
++ *
++ * Comments: Called with ctx->ctx_lock held. This nests
++ * task_lock instead ctx_lock.
++ */
++void unuse_mm(struct mm_struct *mm)
+ {
+-      current->mm = NULL;
++      struct task_struct *tsk = current;
++
++      task_lock(tsk);
++      tsk->mm = NULL;
+       /* active_mm is still 'mm' */
+-      enter_lazy_tlb(mm, current);
++      enter_lazy_tlb(mm, tsk);
++      task_unlock(tsk);
+ }
+-/* Run on kevent's context.  FIXME: needs to be per-cpu and warn if an
+- * operation blocks.
++/*
++ * Queue up a kiocb to be retried. Assumes that the kiocb
++ * has already been marked as kicked, and places it on
++ * the retry run list for the corresponding ioctx, if it
++ * isn't already queued. Returns 1 if it actually queued
++ * the kiocb (to tell the caller to activate the work
++ * queue to process it), or 0, if it found that it was
++ * already queued.
++ *
++ * Should be called with the spin lock iocb->ki_ctx->ctx_lock
++ * held
+  */
+-static void aio_kick_handler(void *data)
++static inline int __queue_kicked_iocb(struct kiocb *iocb)
+ {
+-      struct kioctx *ctx = data;
++      struct kioctx   *ctx = iocb->ki_ctx;
+-      use_mm(ctx->mm);
++      if (list_empty(&iocb->ki_run_list)) {
++              list_add_tail(&iocb->ki_run_list,
++                      &ctx->run_list);
++              iocb->ki_queued++;
++              return 1;
++      }
++      return 0;
++}
+-      spin_lock_irq(&ctx->ctx_lock);
+-      while (!list_empty(&ctx->run_list)) {
+-              struct kiocb *iocb;
+-              long ret;
++/* aio_run_iocb
++ *     This is the core aio execution routine. It is
++ *     invoked both for initial i/o submission and
++ *     subsequent retries via the aio_kick_handler.
++ *       Expects to be invoked with iocb->ki_ctx->lock
++ *       already held. The lock is released and reaquired
++ *       as needed during processing.
++ *
++ * Calls the iocb retry method (already setup for the
++ * iocb on initial submission) for operation specific
++ * handling, but takes care of most of common retry
++ * execution details for a given iocb. The retry method
++ * needs to be non-blocking as far as possible, to avoid
++ * holding up other iocbs waiting to be serviced by the
++ * retry kernel thread.
++ *
++ * The trickier parts in this code have to do with
++ * ensuring that only one retry instance is in progress
++ * for a given iocb at any time. Providing that guarantee
++ * simplifies the coding of individual aio operations as
++ * it avoids various potential races.
++ */
++static ssize_t aio_run_iocb(struct kiocb *iocb)
++{
++      struct kioctx   *ctx = iocb->ki_ctx;
++      ssize_t (*retry)(struct kiocb *);
++      ssize_t ret;
+-              iocb = list_entry(ctx->run_list.next, struct kiocb,
+-                                ki_run_list);
+-              list_del(&iocb->ki_run_list);
+-              iocb->ki_users ++;
+-              spin_unlock_irq(&ctx->ctx_lock);
++      if (iocb->ki_retried++ > 1024*1024) {
++              printk("Maximal retry count.  Bytes done %Zd\n",
++                      iocb->ki_nbytes - iocb->ki_left);
++              return -EAGAIN;
++      }
++
++      if (!(iocb->ki_retried & 0xff)) {
++              pr_debug("%ld retry: %d of %d (kick %ld, Q %ld run %ld, wake %ld)\n",
++                      iocb->ki_retried,
++                      iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes,
++                      iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups);
++      }
++
++      if (!(retry = iocb->ki_retry)) {
++              printk("aio_run_iocb: iocb->ki_retry = NULL\n");
++              return 0;
++      }
++
++      /*
++       * We don't want the next retry iteration for this
++       * operation to start until this one has returned and
++       * updated the iocb state. However, wait_queue functions
++       * can trigger a kick_iocb from interrupt context in the
++       * meantime, indicating that data is available for the next
++       * iteration. We want to remember that and enable the
++       * next retry iteration _after_ we are through with
++       * this one.
++       *
++       * So, in order to be able to register a "kick", but
++       * prevent it from being queued now, we clear the kick
++       * flag, but make the kick code *think* that the iocb is
++       * still on the run list until we are actually done.
++       * When we are done with this iteration, we check if
++       * the iocb was kicked in the meantime and if so, queue
++       * it up afresh.
++       */
++
++      kiocbClearKicked(iocb);
++
++      /*
++       * This is so that aio_complete knows it doesn't need to
++       * pull the iocb off the run list (We can't just call
++       * INIT_LIST_HEAD because we don't want a kick_iocb to
++       * queue this on the run list yet)
++       */
++      iocb->ki_run_list.next = iocb->ki_run_list.prev = NULL;
++      iocb->ki_retry = NULL;
++      spin_unlock_irq(&ctx->ctx_lock);
++
++      /* Quit retrying if the i/o has been cancelled */
++      if (kiocbIsCancelled(iocb)) {
++              ret = -EINTR;
++              aio_complete(iocb, ret, 0);
++              /* must not access the iocb after this */
++              goto out;
++      }
++
++      /*
++       * Now we are all set to call the retry method in async
++       * context. By setting this thread's io_wait context
++       * to point to the wait queue entry inside the currently
++       * running iocb for the duration of the retry, we ensure
++       * that async notification wakeups are queued by the
++       * operation instead of blocking waits, and when notified,
++       * cause the iocb to be kicked for continuation (through
++       * the aio_wake_function callback).
++       */
++      BUG_ON(current->io_wait != NULL);
++      current->io_wait = &iocb->ki_wait;
++      ret = retry(iocb);
++      current->io_wait = NULL;
+-              kiocbClearKicked(iocb);
+-              ret = iocb->ki_retry(iocb);
++      if (-EIOCBRETRY != ret) {
+               if (-EIOCBQUEUED != ret) {
++                      BUG_ON(!list_empty(&iocb->ki_wait.task_list));
+                       aio_complete(iocb, ret, 0);
+-                      iocb = NULL;
++                      /* must not access the iocb after this */
+               }
++      } else {
++              /*
++               * Issue an additional retry to avoid waiting forever if
++               * no waits were queued (e.g. in case of a short read).
++               */
++              if (list_empty(&iocb->ki_wait.task_list))
++                      kiocbSetKicked(iocb);
++      }
++out:
++      spin_lock_irq(&ctx->ctx_lock);
+-              spin_lock_irq(&ctx->ctx_lock);
+-              if (NULL != iocb)
+-                      __aio_put_req(ctx, iocb);
++      if (-EIOCBRETRY == ret) {
++              /*
++               * OK, now that we are done with this iteration
++               * and know that there is more left to go,
++               * this is where we let go so that a subsequent
++               * "kick" can start the next iteration
++               */
++              iocb->ki_retry = retry;
++              /* will make __queue_kicked_iocb succeed from here on */
++              INIT_LIST_HEAD(&iocb->ki_run_list);
++              /* we must queue the next iteration ourselves, if it
++               * has already been kicked */
++              if (kiocbIsKicked(iocb)) {
++                      __queue_kicked_iocb(iocb);
++              }
+       }
++      return ret;
++}
++
++/*
++ * __aio_run_iocbs:
++ *    Process all pending retries queued on the ioctx
++ *    run list.
++ * Assumes it is operating within the aio issuer's mm
++ * context. Expects to be called with ctx->ctx_lock held
++ */
++static void __aio_run_iocbs(struct kioctx *ctx)
++{
++      struct kiocb *iocb;
++      ssize_t ret;
++      int count = 0;
++
++      while (!list_empty(&ctx->run_list)) {
++              iocb = list_entry(ctx->run_list.next, struct kiocb,
++                      ki_run_list);
++              list_del(&iocb->ki_run_list);
++              ret = aio_run_iocb(iocb);
++              count++;
++      }
++      aio_run++;
++}
++
++/*
++ * aio_run_iocbs:
++ *    Process all pending retries queued on the ioctx
++ *    run list.
++ * Assumes it is operating within the aio issuer's mm
++ * context.
++ */
++static inline void aio_run_iocbs(struct kioctx *ctx)
++{
++      spin_lock_irq(&ctx->ctx_lock);
++      __aio_run_iocbs(ctx);
+       spin_unlock_irq(&ctx->ctx_lock);
++}
++/*
++ * aio_kick_handler:
++ *    Work queue handler triggered to process pending
++ *    retries on an ioctx. Takes on the aio issuer's
++ *    mm context before running the iocbs.
++ * Run on aiod's context.
++ */
++static void aio_kick_handler(void *data)
++{
++      struct kioctx *ctx = data;
++
++      use_mm(ctx->mm);
++      spin_lock_irq(&ctx->ctx_lock);
++      __aio_run_iocbs(ctx);
+       unuse_mm(ctx->mm);
++      spin_unlock_irq(&ctx->ctx_lock);
+ }
+-void kick_iocb(struct kiocb *iocb)
++
++/*
++ * Called by kick_iocb to queue the kiocb for retry
++ * and if required activate the aio work queue to process
++ * it
++ */
++void queue_kicked_iocb(struct kiocb *iocb)
+ {
+       struct kioctx   *ctx = iocb->ki_ctx;
++      unsigned long flags;
++      int run = 0;
++
++      WARN_ON((!list_empty(&iocb->ki_wait.task_list)));
++
++      spin_lock_irqsave(&ctx->ctx_lock, flags);
++      run = __queue_kicked_iocb(iocb);
++      spin_unlock_irqrestore(&ctx->ctx_lock, flags);
++      if (run) {
++              queue_work(aio_wq, &ctx->wq);
++              aio_wakeups++;
++      }
++}
++/*
++ * kick_iocb:
++ *    Called typically from a wait queue callback context
++ *    (aio_wake_function) to trigger a retry of the iocb.
++ *    The retry is usually executed by aio workqueue
++ *    threads (See aio_kick_handler).
++ */
++void kick_iocb(struct kiocb *iocb)
++{
+       /* sync iocbs are easy: they can only ever be executing from a 
+        * single context. */
+       if (is_sync_kiocb(iocb)) {
+@@ -603,12 +854,10 @@ void kick_iocb(struct kiocb *iocb)
+               return;
+       }
++      iocb->ki_kicked++;
++      /* If its already kicked we shouldn't queue it again */
+       if (!kiocbTryKick(iocb)) {
+-              unsigned long flags;
+-              spin_lock_irqsave(&ctx->ctx_lock, flags);
+-              list_add_tail(&iocb->ki_run_list, &ctx->run_list);
+-              spin_unlock_irqrestore(&ctx->ctx_lock, flags);
+-              schedule_work(&ctx->wq);
++              queue_kicked_iocb(iocb);
+       }
+ }
+@@ -661,6 +910,9 @@ int aio_complete(struct kiocb *iocb, lon
+        */
+       spin_lock_irqsave(&ctx->ctx_lock, flags);
++      if (iocb->ki_run_list.prev && !list_empty(&iocb->ki_run_list))
++              list_del_init(&iocb->ki_run_list);
++
+       ring = kmap_atomic(info->ring_pages[0], KM_IRQ1);
+       tail = info->tail;
+@@ -689,6 +941,11 @@ int aio_complete(struct kiocb *iocb, lon
+       pr_debug("added to ring %p at [%lu]\n", iocb, tail);
++      pr_debug("%ld retries: %d of %d (kicked %ld, Q %ld run %ld wake %ld)\n",
++              iocb->ki_retried,
++              iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes,
++              iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups);
++
+       /* everything turned out well, dispose of the aiocb. */
+       ret = __aio_put_req(ctx, iocb);
+@@ -803,6 +1060,7 @@ static int read_events(struct kioctx *ct
+       int                     i = 0;
+       struct io_event         ent;
+       struct timeout          to;
++      int                     event_loop = 0; /* testing only */
+       /* needed to zero any padding within an entry (there shouldn't be 
+        * any, but C is fun!
+@@ -852,7 +1110,6 @@ static int read_events(struct kioctx *ct
+               add_wait_queue_exclusive(&ctx->wait, &wait);
+               do {
+                       set_task_state(tsk, TASK_INTERRUPTIBLE);
+-
+                       ret = aio_read_evt(ctx, &ent);
+                       if (ret)
+                               break;
+@@ -862,6 +1119,7 @@ static int read_events(struct kioctx *ct
+                       if (to.timed_out)       /* Only check after read evt */
+                               break;
+                       schedule();
++                      event_loop++;
+                       if (signal_pending(tsk)) {
+                               ret = -EINTR;
+                               break;
+@@ -889,6 +1147,9 @@ static int read_events(struct kioctx *ct
+       if (timeout)
+               clear_timeout(&to);
+ out:
++      pr_debug("event loop executed %d times\n", event_loop);
++      pr_debug("aio_run %ld\n", aio_run);
++      pr_debug("aio_wakeups %ld\n", aio_wakeups);
+       return i ? i : ret;
+ }
+@@ -918,6 +1179,11 @@ static void io_destroy(struct kioctx *io
+       aio_cancel_all(ioctx);
+       wait_for_all_aios(ioctx);
++      /*
++       * this is an overkill, but ensures we don't leave
++       * the ctx on the aio_wq
++       */
++      flush_workqueue(aio_wq);
+       put_ioctx(ioctx);       /* once for the lookup */
+ }
+@@ -980,13 +1246,191 @@ asmlinkage long sys_io_destroy(aio_conte
+       return -EINVAL;
+ }
++/*
++ * Retry method for aio_read (also used for first time submit)
++ * Responsible for updating iocb state as retries progress
++ */
++static ssize_t aio_pread(struct kiocb *iocb)
++{
++      struct file *file = iocb->ki_filp;
++      ssize_t ret = 0;
++
++      ret = file->f_op->aio_read(iocb, iocb->ki_buf,
++              iocb->ki_left, iocb->ki_pos);
++
++      /*
++       * Can't just depend on iocb->ki_left to determine
++       * whether we are done. This may have been a short read.
++       */
++      if (ret > 0) {
++              iocb->ki_buf += ret;
++              iocb->ki_left -= ret;
++
++              ret = -EIOCBRETRY;
++      }
++
++      /* This means we must have transferred all that we could */
++      /* No need to retry anymore */
++      if ((ret == 0) || (iocb->ki_left == 0))
++              ret = iocb->ki_nbytes - iocb->ki_left;
++
++      return ret;
++}
++
++/*
++ * Retry method for aio_write (also used for first time submit)
++ * Responsible for updating iocb state as retries progress
++ */
++static ssize_t aio_pwrite(struct kiocb *iocb)
++{
++      struct file *file = iocb->ki_filp;
++      struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
++      struct inode *inode = mapping->host;
++      ssize_t ret = 0;
++
++      ret = file->f_op->aio_write(iocb, iocb->ki_buf,
++                              iocb->ki_left, iocb->ki_pos);
++
++      /*
++       * Even if iocb->ki_left = 0, we may need to wait
++       * for a balance_dirty_pages to complete
++       */
++      if (ret > 0) {
++              iocb->ki_buf += iocb->ki_buf ? ret : 0;
++              iocb->ki_left -= ret;
++
++              ret = -EIOCBRETRY;
++      }
++
++      /* This means we must have transferred all that we could */
++      /* No need to retry anymore unless we need to osync data */
++      if (ret == 0) {
++              ret = iocb->ki_nbytes - iocb->ki_left;
++              if (!iocb->ki_buf)
++                      return ret;
++
++              /* Set things up for potential O_SYNC */
++              if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++                      iocb->ki_buf = NULL;
++                      iocb->ki_pos -= ret; /* back up fpos */
++                      iocb->ki_left = ret; /* sync what we have written out */
++                      iocb->ki_nbytes = ret;
++                      ret = -EIOCBRETRY;
++              }
++      }
++
++      return ret;
++}
++
++static ssize_t aio_fdsync(struct kiocb *iocb)
++{
++      struct file *file = iocb->ki_filp;
++      ssize_t ret = -EINVAL;
++
++      if (file->f_op->aio_fsync)
++              ret = file->f_op->aio_fsync(iocb, 1);
++      return ret;
++}
++
++static ssize_t aio_fsync(struct kiocb *iocb)
++{
++      struct file *file = iocb->ki_filp;
++      ssize_t ret = -EINVAL;
++
++      if (file->f_op->aio_fsync)
++              ret = file->f_op->aio_fsync(iocb, 0);
++      return ret;
++}
++
++/*
++ * aio_setup_iocb:
++ *    Performs the initial checks and aio retry method
++ *    setup for the kiocb at the time of io submission.
++ */
++ssize_t aio_setup_iocb(struct kiocb *kiocb)
++{
++      struct file *file = kiocb->ki_filp;
++      ssize_t ret = 0;
++
++      switch (kiocb->ki_opcode) {
++      case IOCB_CMD_PREAD:
++              ret = -EBADF;
++              if (unlikely(!(file->f_mode & FMODE_READ)))
++                      break;
++              ret = -EFAULT;
++              if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
++                      kiocb->ki_left)))
++                      break;
++              ret = -EINVAL;
++              if (file->f_op->aio_read)
++                      kiocb->ki_retry = aio_pread;
++              break;
++      case IOCB_CMD_PWRITE:
++              ret = -EBADF;
++              if (unlikely(!(file->f_mode & FMODE_WRITE)))
++                      break;
++              ret = -EFAULT;
++              if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
++                      kiocb->ki_left)))
++                      break;
++              ret = -EINVAL;
++              if (file->f_op->aio_write)
++                      kiocb->ki_retry = aio_pwrite;
++              break;
++      case IOCB_CMD_FDSYNC:
++              ret = -EINVAL;
++              if (file->f_op->aio_fsync)
++                      kiocb->ki_retry = aio_fdsync;
++              break;
++      case IOCB_CMD_FSYNC:
++              ret = -EINVAL;
++              if (file->f_op->aio_fsync)
++                      kiocb->ki_retry = aio_fsync;
++              break;
++      default:
++              dprintk("EINVAL: io_submit: no operation provided\n");
++              ret = -EINVAL;
++      }
++
++      if (!kiocb->ki_retry)
++              return ret;
++
++      return 0;
++}
++
++/*
++ * aio_wake_function:
++ *    wait queue callback function for aio notification,
++ *    Simply triggers a retry of the operation via kick_iocb.
++ *
++ *    This callback is specified in the wait queue entry in
++ *    a kiocb (current->io_wait points to this wait queue
++ *    entry when an aio operation executes; it is used
++ *    instead of a synchronous wait when an i/o blocking
++ *    condition is encountered during aio).
++ *
++ * Note:
++ * This routine is executed with the wait queue lock held.
++ * Since kick_iocb acquires iocb->ctx->ctx_lock, it nests
++ * the ioctx lock inside the wait queue lock. This is safe
++ * because this callback isn't used for wait queues which
++ * are nested inside ioctx lock (i.e. ctx->wait)
++ */
++int aio_wake_function(wait_queue_t *wait, unsigned mode, int sync)
++{
++      struct kiocb *iocb = container_of(wait, struct kiocb, ki_wait);
++
++      list_del_init(&wait->task_list);
++      kick_iocb(iocb);
++      return 1;
++}
++
+ int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
+                        struct iocb *iocb)
+ {
+       struct kiocb *req;
+       struct file *file;
+       ssize_t ret;
+-      char *buf;
+       /* enforce forwards compatibility on users */
+       if (unlikely(iocb->aio_reserved1 || iocb->aio_reserved2 ||
+@@ -1027,51 +1471,31 @@ int io_submit_one(struct kioctx *ctx, st
+       req->ki_user_data = iocb->aio_data;
+       req->ki_pos = iocb->aio_offset;
+-      buf = (char *)(unsigned long)iocb->aio_buf;
++      req->ki_buf = (char *)(unsigned long)iocb->aio_buf;
++      req->ki_left = req->ki_nbytes = iocb->aio_nbytes;
++      req->ki_opcode = iocb->aio_lio_opcode;
++      init_waitqueue_func_entry(&req->ki_wait, aio_wake_function);
++      INIT_LIST_HEAD(&req->ki_wait.task_list);
++      req->ki_run_list.next = req->ki_run_list.prev = NULL;
++      req->ki_retry = NULL;
++      req->ki_retried = 0;
++      req->ki_kicked = 0;
++      req->ki_queued = 0;
++      aio_run = 0;
++      aio_wakeups = 0;
+-      switch (iocb->aio_lio_opcode) {
+-      case IOCB_CMD_PREAD:
+-              ret = -EBADF;
+-              if (unlikely(!(file->f_mode & FMODE_READ)))
+-                      goto out_put_req;
+-              ret = -EFAULT;
+-              if (unlikely(!access_ok(VERIFY_WRITE, buf, iocb->aio_nbytes)))
+-                      goto out_put_req;
+-              ret = -EINVAL;
+-              if (file->f_op->aio_read)
+-                      ret = file->f_op->aio_read(req, buf,
+-                                      iocb->aio_nbytes, req->ki_pos);
+-              break;
+-      case IOCB_CMD_PWRITE:
+-              ret = -EBADF;
+-              if (unlikely(!(file->f_mode & FMODE_WRITE)))
+-                      goto out_put_req;
+-              ret = -EFAULT;
+-              if (unlikely(!access_ok(VERIFY_READ, buf, iocb->aio_nbytes)))
+-                      goto out_put_req;
+-              ret = -EINVAL;
+-              if (file->f_op->aio_write)
+-                      ret = file->f_op->aio_write(req, buf,
+-                                      iocb->aio_nbytes, req->ki_pos);
+-              break;
+-      case IOCB_CMD_FDSYNC:
+-              ret = -EINVAL;
+-              if (file->f_op->aio_fsync)
+-                      ret = file->f_op->aio_fsync(req, 1);
+-              break;
+-      case IOCB_CMD_FSYNC:
+-              ret = -EINVAL;
+-              if (file->f_op->aio_fsync)
+-                      ret = file->f_op->aio_fsync(req, 0);
+-              break;
+-      default:
+-              dprintk("EINVAL: io_submit: no operation provided\n");
+-              ret = -EINVAL;
+-      }
++      ret = aio_setup_iocb(req);
++
++      if (ret)
++              goto out_put_req;
++
++      spin_lock_irq(&ctx->ctx_lock);
++      ret = aio_run_iocb(req);
++      spin_unlock_irq(&ctx->ctx_lock);
++
++      if (-EIOCBRETRY == ret)
++              queue_work(aio_wq, &ctx->wq);
+-      if (likely(-EIOCBQUEUED == ret))
+-              return 0;
+-      aio_complete(req, ret, 0);
+       return 0;
+ out_put_req:
+--- linux-2.6.0-test1/fs/binfmt_elf.c  2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/binfmt_elf.c 2003-07-19 17:03:50.000000000 -0700
+@@ -1158,7 +1158,7 @@ static int elf_dump_thread_status(long s
+       t->num_notes++;
+       sz += notesize(&t->notes[0]);
+-      if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, &t->fpu))) {
++      if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL, &t->fpu))) {
+               fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu), &(t->fpu));
+               t->num_notes++;
+               sz += notesize(&t->notes[1]);
+@@ -1286,7 +1286,7 @@ static int elf_core_dump(long signr, str
+       fill_note(notes +2, "CORE", NT_TASKSTRUCT, sizeof(*current), current);
+   
+       /* Try to dump the FPU. */
+-      if ((prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, fpu)))
++      if ((prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs, fpu)))
+               fill_note(notes +3, "CORE", NT_PRFPREG, sizeof(*fpu), fpu);
+       else
+               --numnote;
+--- linux-2.6.0-test1/fs/bio.c 2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/bio.c        2003-07-19 17:03:50.000000000 -0700
+@@ -18,7 +18,7 @@
+ #include <linux/mm.h>
+ #include <linux/swap.h>
+ #include <linux/bio.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/slab.h>
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+--- linux-2.6.0-test1/fs/buffer.c      2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/buffer.c     2003-07-19 17:06:53.000000000 -0700
+@@ -91,6 +91,7 @@ void wake_up_buffer(struct buffer_head *
+ {
+       wait_queue_head_t *wq = bh_waitq_head(bh);
++      smp_mb();
+       if (waitqueue_active(wq))
+               wake_up_all(wq);
+ }
+@@ -115,27 +116,50 @@ void unlock_buffer(struct buffer_head *b
+ }
+ /*
+- * Block until a buffer comes unlocked.  This doesn't stop it
++ * Wait until a buffer comes unlocked.  This doesn't stop it
+  * from becoming locked again - you have to lock it yourself
+  * if you want to preserve its state.
++ * If the wait queue parameter specifies an async i/o callback,
++ * then instead of blocking, we just queue up the callback
++ * on the wait queue for async notification when the buffer gets
++ * unlocked.
++ * A NULL wait queue parameter defaults to synchronous behaviour
+  */
+-void __wait_on_buffer(struct buffer_head * bh)
++int __wait_on_buffer_wq(struct buffer_head * bh, wait_queue_t *wait)
+ {
+       wait_queue_head_t *wqh = bh_waitq_head(bh);
+-      DEFINE_WAIT(wait);
++      DEFINE_WAIT(local_wait);
++
++      if (!wait)
++              wait = &local_wait;
+       if (atomic_read(&bh->b_count) == 0 &&
+                       (!bh->b_page || !PageLocked(bh->b_page)))
+               buffer_error();
+       do {
+-              prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
++              prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
+               if (buffer_locked(bh)) {
+                       blk_run_queues();
++                      if (!is_sync_wait(wait)) {
++                              /*
++                               * if we've queued an async wait queue
++                               * callback do not block; just tell the
++                               * caller to return and retry later when
++                               * the callback is notified
++                               */
++                              return -EIOCBRETRY;
++                      }
+                       io_schedule();
+               }
+       } while (buffer_locked(bh));
+-      finish_wait(wqh, &wait);
++      finish_wait(wqh, wait);
++      return 0;
++}
++
++void __wait_on_buffer(struct buffer_head * bh)
++{
++      __wait_on_buffer_wq(bh, NULL);
+ }
+ static void
+@@ -414,6 +438,9 @@ __find_get_block_slow(struct block_devic
+               bh = bh->b_this_page;
+       } while (bh != head);
+       buffer_error();
++      printk("block=%llu, b_blocknr=%llu\n",
++              (unsigned long long)block, (unsigned long long)bh->b_blocknr);
++      printk("b_state=0x%08lx, b_size=%u\n", bh->b_state, bh->b_size);
+ out_unlock:
+       spin_unlock(&bd_mapping->private_lock);
+       page_cache_release(page);
+@@ -1274,9 +1301,12 @@ void __bforget(struct buffer_head *bh)
+       __brelse(bh);
+ }
+-static struct buffer_head *__bread_slow(struct buffer_head *bh)
++static struct buffer_head *__bread_slow_wq(struct buffer_head *bh,
++              wait_queue_t *wait)
+ {
+-      lock_buffer(bh);
++      if (-EIOCBRETRY == lock_buffer_wq(bh, wait))
++              return ERR_PTR(-EIOCBRETRY);
++
+       if (buffer_uptodate(bh)) {
+               unlock_buffer(bh);
+               return bh;
+@@ -1286,7 +1316,8 @@ static struct buffer_head *__bread_slow(
+               get_bh(bh);
+               bh->b_end_io = end_buffer_io_sync;
+               submit_bh(READ, bh);
+-              wait_on_buffer(bh);
++              if (-EIOCBRETRY == wait_on_buffer_wq(bh, wait))
++                      return ERR_PTR(-EIOCBRETRY);
+               if (buffer_uptodate(bh))
+                       return bh;
+       }
+@@ -1294,6 +1325,11 @@ static struct buffer_head *__bread_slow(
+       return NULL;
+ }
++static inline struct buffer_head *__bread_slow(struct buffer_head *bh)
++{
++      return __bread_slow_wq(bh, NULL);
++}
++
+ /*
+  * Per-cpu buffer LRU implementation.  To reduce the cost of __find_get_block().
+  * The bhs[] array is sorted - newest buffer is at bhs[0].  Buffers have their
+@@ -1481,6 +1517,18 @@ __bread(struct block_device *bdev, secto
+ }
+ EXPORT_SYMBOL(__bread);
++struct buffer_head *
++__bread_wq(struct block_device *bdev, sector_t block, int size,
++      wait_queue_t *wait)
++{
++      struct buffer_head *bh = __getblk(bdev, block, size);
++
++      if (!buffer_uptodate(bh))
++              bh = __bread_slow_wq(bh, wait);
++      return bh;
++}
++EXPORT_SYMBOL(__bread_wq);
++
+ /*
+  * invalidate_bh_lrus() is called rarely - at unmount.  Because it is only for
+  * unmount it only needs to ensure that all buffers from the target device are
+@@ -1958,8 +2006,9 @@ static int __block_prepare_write(struct 
+       /*
+        * If we issued read requests - let them complete.
+        */
+-      while(wait_bh > wait) {
+-              wait_on_buffer(*--wait_bh);
++      while (wait_bh > wait) {
++              if ((err = wait_on_buffer_wq(*--wait_bh, current->io_wait)))
++                      return err;
+               if (!buffer_uptodate(*wait_bh))
+                       return -EIO;
+       }
+--- linux-2.6.0-test1/fs/cifs/CHANGES  2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/CHANGES 2003-07-19 17:03:50.000000000 -0700
+@@ -1,3 +1,12 @@
++Version 0.83
++------------
++Fix oops when mounting to long server names caused by inverted parms to kmalloc.
++Fix MultiuserMount (/proc/fs/cifs configuration setting) so that when enabled
++we will choose a cifs user session (smb uid) that better matches the local
++uid if a) the mount uid does not match the current uid and b) we have another
++session to the same server (ip address) for a different mount which
++matches the current local uid.
++
+ Version 0.82
+ ------------
+ Add support for mknod of block or character devices.  Fix oplock
+--- linux-2.6.0-test1/fs/cifs/cifsfs.c 2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/cifsfs.c        2003-07-19 17:03:50.000000000 -0700
+@@ -230,7 +230,7 @@ cifs_show_options(struct seq_file *s, st
+       if (cifs_sb) {
+               if (cifs_sb->tcon) {
+                       seq_printf(s, ",unc=%s", cifs_sb->tcon->treeName);
+-                      if (cifs_sb->tcon->ses->userName)
++                      if ((cifs_sb->tcon->ses) && (cifs_sb->tcon->ses->userName))
+                               seq_printf(s, ",username=%s",
+                                          cifs_sb->tcon->ses->userName);
+                       if(cifs_sb->tcon->ses->domainName)
+--- linux-2.6.0-test1/fs/cifs/cifsglob.h       2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/cifs/cifsglob.h      2003-07-19 17:03:50.000000000 -0700
+@@ -155,7 +155,8 @@ struct cifsSesInfo {
+       char *serverOS;         /* name of operating system underlying the server */
+       char *serverNOS;        /* name of network operating system that the server is running */
+       char *serverDomain;     /* security realm of server */
+-      int Suid;               /* needed for user level security */
++      int Suid;               /* remote smb uid  */
++      uid_t linux_uid;        /* local Linux uid */
+       int capabilities;
+       char serverName[SERVER_NAME_LEN_WITH_NULL * 2]; /* BB make bigger for tcp names - will ipv6 and sctp addresses fit here?? */
+       char userName[MAX_USERNAME_SIZE + 1];
+--- linux-2.6.0-test1/fs/cifs/connect.c        2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/connect.c       2003-07-19 17:03:50.000000000 -0700
+@@ -405,7 +405,7 @@ parse_mount_options(char *options, const
+                               return 1;       /* needs_arg; */
+                       }
+                       if ((temp_len = strnlen(value, 300)) < 300) {
+-                              vol->UNC = kmalloc(GFP_KERNEL, temp_len);
++                              vol->UNC = kmalloc(temp_len+1,GFP_KERNEL);
+                               strcpy(vol->UNC,value);
+                               if (strncmp(vol->UNC, "//", 2) == 0) {
+                                       vol->UNC[0] = '\\';
+@@ -482,7 +482,7 @@ parse_mount_options(char *options, const
+                       return 1;
+               }
+               if ((temp_len = strnlen(devname, 300)) < 300) {
+-                      vol->UNC = kmalloc(GFP_KERNEL, temp_len);
++                      vol->UNC = kmalloc(temp_len+1,GFP_KERNEL);
+                       strcpy(vol->UNC,devname);
+                       if (strncmp(vol->UNC, "//", 2) == 0) {
+                               vol->UNC[0] = '\\';
+@@ -860,7 +860,7 @@ cifs_mount(struct super_block *sb, struc
+               FreeXid(xid);
+               return -EINVAL;
+       }
+-      /* BB add support to use the multiuser_mount flag BB */
++
+       existingCifsSes =
+           find_tcp_session(sin_server.sin_addr.s_addr,
+                            volume_info.username, &srvTcp);
+@@ -926,6 +926,7 @@ cifs_mount(struct super_block *sb, struc
+                       if (volume_info.domainname)
+                               strncpy(pSesInfo->domainName,
+                                       volume_info.domainname,MAX_USERNAME_SIZE);
++                      pSesInfo->linux_uid = volume_info.linux_uid;
+                       rc = setup_session(xid,pSesInfo, cifs_sb->local_nls);
+                       if(!rc)
+--- linux-2.6.0-test1/fs/cifs/misc.c   2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/misc.c  2003-07-19 17:03:50.000000000 -0700
+@@ -190,6 +190,8 @@ header_assemble(struct smb_hdr *buffer, 
+ {
+       int i;
+       __u32 tmp;
++      struct list_head* temp_item;
++      struct cifsSesInfo * ses;
+       char *temp = (char *) buffer;
+       for (i = 0; i < MAX_CIFS_HDR_SIZE; i++) {
+@@ -225,7 +227,52 @@ header_assemble(struct smb_hdr *buffer, 
+                       if (treeCon->ses->capabilities & CAP_STATUS32) {
+                               buffer->Flags2 |= SMBFLG2_ERR_STATUS;
+                       }
++
+                       buffer->Uid = treeCon->ses->Suid;       /* always in LE format */
++                      if(multiuser_mount != 0) {
++              /* For the multiuser case, there are few obvious technically  */
++              /* possible mechanisms to match the local linux user (uid)    */
++              /* to a valid remote smb user (smb_uid):                      */
++              /*      1) Query Winbind (or other local pam/nss daemon       */
++              /*        for userid/password/logon_domain or credential      */
++              /*      2) Query Winbind for uid to sid to username mapping   */
++              /*         and see if we have a matching password for existing*/
++              /*         session for that user perhas getting password by   */
++              /*         adding a new pam_cifs module that stores passwords */
++              /*         so that the cifs vfs can get at that for all logged*/
++              /*         on users                                           */
++              /*      3) (Which is the mechanism we have chosen)            */
++              /*         Search through sessions to the same server for a   */
++              /*         a match on the uid that was passed in on mount     */
++              /*         with the current processes uid (or euid?) and use  */
++              /*         that smb uid.   If no existing smb session for     */
++              /*         that uid found, use the default smb session ie     */
++              /*         the smb session for the volume mounted which is    */
++              /*         the same as would be used if the multiuser mount   */
++              /*         flag were disabled.  */
++
++              /*  BB Add support for establishing new tCon and SMB Session  */
++              /*      with userid/password pairs found on the smb session   */ 
++              /*      for other target tcp/ip addresses               BB    */
++                              if(current->uid != treeCon->ses->linux_uid) {
++                                      cFYI(1,("Multiuser mode and UID did not match tcon uid "));
++                                      read_lock(&GlobalSMBSeslock);
++                                      list_for_each(temp_item, &GlobalSMBSessionList) {
++                                              ses = list_entry(temp_item, struct cifsSesInfo, cifsSessionList);
++                                              if(ses->linux_uid == current->uid) {
++                                                      if(ses->server == treeCon->ses->server) {
++                                                              cFYI(1,("found matching uid substitute right smb_uid"));  
++                                                              buffer->Uid = ses->Suid;
++                                                              break;
++                                                      } else {
++                                                              /* BB eventually call setup_session here */
++                                                              cFYI(1,("local UID found but smb sess with this server does not exist"));  
++                                                      }
++                                              }
++                                      }
++                                      read_unlock(&GlobalSMBSeslock);
++                              }
++                      }
+               }
+               if (treeCon->Flags & SMB_SHARE_IS_IN_DFS)
+                       buffer->Flags2 |= SMBFLG2_DFS;
+--- linux-2.6.0-test1/fs/cifs/TODO     2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/cifs/TODO    2003-07-19 17:03:50.000000000 -0700
+@@ -17,9 +17,12 @@ c) multi-user mounts - multiplexed sessi
+ d) Kerberos/SPNEGO session setup support - (started)
+-e) NTLMv2 authentication and MD5-HMAC signing SMB PDUs - (mostly implemented)
+-      signing necessary for some Windows 2003 servers in domain 
+-      mode.
++e) NTLMv2 authentication (mostly implemented)
++
++f) MD5-HMAC signing SMB PDUs when SPNEGO style SessionSetup 
++used (Kerberos or NTLMSSP). Signing alreadyimplemented for NTLM
++      and raw NTLMSSP already. This is important when enabling
++      extended security and mounting to Windows 2003 Servers
+ f) Directory entry caching relies on a 1 second timer, rather than 
+ using FindNotify or equivalent.  - (started)
+@@ -43,11 +46,9 @@ extra copy in/out of the socket buffers 
+ m) finish support for IPv6
+-n) send oplock break response when sent (oplock currently disabled in
+-/proc/fs/cifs)
+-
+-o) reduces the oplock breaks coming from windows).  Piggyback identical
+-file opens on top of each other by incrementing reference count rather
++o) Better optimize open (and pathbased setfilesize) to reduce the
++oplock breaks coming from windows srv.  Piggyback identical file
++opens on top of each other by incrementing reference count rather
+ than resending (helps reduce server resource utilization and avoid
+ spurious oplock breaks).
+--- linux-2.6.0-test1/fs/cifs/transport.c      2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/cifs/transport.c     2003-07-19 17:03:50.000000000 -0700
+@@ -45,6 +45,11 @@ AllocMidQEntry(struct smb_hdr *smb_buffe
+               cERROR(1, ("Null session passed in to AllocMidQEntry "));
+               return NULL;
+       }
++      if (ses->server == NULL) {
++              cERROR(1, ("Null TCP session in AllocMidQEntry"));
++              return NULL;
++      }
++      
+       temp = (struct mid_q_entry *) kmem_cache_alloc(cifs_mid_cachep,
+                                                      SLAB_KERNEL);
+       if (temp == NULL)
+@@ -65,7 +70,6 @@ AllocMidQEntry(struct smb_hdr *smb_buffe
+               /* Should we wake up tcp thread first? BB  */
+               timeout = wait_event_interruptible_timeout(ses->server->response_q,
+                       (ses->server->tcpStatus == CifsGood), timeout);
+-        cFYI(1,("timeout (after reconnection wait) %d",timeout));
+       }
+       if (ses->server->tcpStatus == CifsGood) {
+--- linux-2.6.0-test1/fs/compat_ioctl.c        2003-07-02 14:53:16.000000000 -0700
++++ 25/fs/compat_ioctl.c       2003-07-19 17:03:50.000000000 -0700
+@@ -52,7 +52,7 @@
+ #include <linux/raw.h>
+ #include <linux/smb_fs.h>
+ #include <linux/blkpg.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/elevator.h>
+ #include <linux/rtc.h>
+ #include <linux/pci.h>
+--- linux-2.6.0-test1/fs/devfs/base.c  2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/devfs/base.c 2003-07-19 17:03:50.000000000 -0700
+@@ -676,6 +676,7 @@
+ #include <linux/smp.h>
+ #include <linux/version.h>
+ #include <linux/rwsem.h>
++#include <linux/sched.h>
+ #include <asm/uaccess.h>
+ #include <asm/io.h>
+@@ -1325,8 +1326,20 @@ static void free_dentry (struct devfs_en
+ static int is_devfsd_or_child (struct fs_info *fs_info)
+ {
+-    if (current == fs_info->devfsd_task) return (TRUE);
+-    if (current->pgrp == fs_info->devfsd_pgrp) return (TRUE);
++    struct task_struct *p = current;
++
++    if (p == fs_info->devfsd_task) return (TRUE);
++    if (p->pgrp == fs_info->devfsd_pgrp) return (TRUE);
++    read_lock(&tasklist_lock);
++    for ( ; p != &init_task; p = p->real_parent)
++    {
++      if (p == fs_info->devfsd_task)
++      {
++          read_unlock (&tasklist_lock);
++          return (TRUE);
++      }
++    }
++    read_unlock (&tasklist_lock);
+     return (FALSE);
+ }   /*  End Function is_devfsd_or_child  */
+@@ -1432,12 +1445,6 @@ int devfs_mk_bdev(dev_t dev, umode_t mod
+       va_list args;
+       int error, n;
+-      if (!S_ISBLK(mode)) {
+-              printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
+-                              __FUNCTION__, mode, buf);
+-              return -EINVAL;
+-      }
+-
+       va_start(args, fmt);
+       n = vsnprintf(buf, 64, fmt, args);
+       if (n >= 64 || !buf[0]) {
+@@ -1445,6 +1452,12 @@ int devfs_mk_bdev(dev_t dev, umode_t mod
+                               __FUNCTION__);
+               return -EINVAL;
+       }
++      
++      if (!S_ISBLK(mode)) {
++              printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
++                              __FUNCTION__, mode, buf);
++              return -EINVAL;
++      }
+       de = _devfs_prepare_leaf(&dir, buf, mode);
+       if (!de) {
+@@ -1478,12 +1491,6 @@ int devfs_mk_cdev(dev_t dev, umode_t mod
+       va_list args;
+       int error, n;
+-      if (!S_ISCHR(mode)) {
+-              printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
+-                              __FUNCTION__, mode, buf);
+-              return -EINVAL;
+-      }
+-
+       va_start(args, fmt);
+       n = vsnprintf(buf, 64, fmt, args);
+       if (n >= 64 || !buf[0]) {
+@@ -1492,6 +1499,12 @@ int devfs_mk_cdev(dev_t dev, umode_t mod
+               return -EINVAL;
+       }
++      if (!S_ISCHR(mode)) {
++              printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
++                              __FUNCTION__, mode, buf);
++              return -EINVAL;
++      }
++
+       de = _devfs_prepare_leaf(&dir, buf, mode);
+       if (!de) {
+               printk(KERN_WARNING "%s: could not prepare leaf for %s\n",
+--- linux-2.6.0-test1/fs/exec.c        2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/exec.c       2003-07-19 17:07:16.000000000 -0700
+@@ -305,10 +305,10 @@ void put_dirty_page(struct task_struct *
+       if (!pte_chain)
+               goto out_sig;
+       spin_lock(&tsk->mm->page_table_lock);
+-      pmd = pmd_alloc(tsk->mm, pgd, address);
++      pmd = pmd_alloc_map(tsk->mm, pgd, address);
+       if (!pmd)
+               goto out;
+-      pte = pte_alloc_map(tsk->mm, pmd, address);
++      pte = pte_alloc_map(tsk->mm, pgd, &pmd, address);
+       if (!pte)
+               goto out;
+       if (!pte_none(*pte)) {
+@@ -320,6 +320,7 @@ void put_dirty_page(struct task_struct *
+       set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, prot))));
+       pte_chain = page_add_rmap(page, pte, pte_chain);
+       pte_unmap(pte);
++      pmd_unmap(pmd);
+       tsk->mm->rss++;
+       spin_unlock(&tsk->mm->page_table_lock);
+@@ -327,6 +328,8 @@ void put_dirty_page(struct task_struct *
+       pte_chain_free(pte_chain);
+       return;
+ out:
++      if (pmd)
++              pmd_unmap(pmd);
+       spin_unlock(&tsk->mm->page_table_lock);
+ out_sig:
+       __free_page(page);
+--- linux-2.6.0-test1/fs/ext2/inode.c  2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/ext2/inode.c 2003-07-19 17:06:55.000000000 -0700
+@@ -257,11 +257,12 @@ static int ext2_block_to_path(struct ino
+  *    or when it reads all @depth-1 indirect blocks successfully and finds
+  *    the whole chain, all way to the data (returns %NULL, *err == 0).
+  */
+-static Indirect *ext2_get_branch(struct inode *inode,
++static Indirect *ext2_get_branch_wq(struct inode *inode,
+                                int depth,
+                                int *offsets,
+                                Indirect chain[4],
+-                               int *err)
++                               int *err,
++                               wait_queue_t *wait)
+ {
+       struct super_block *sb = inode->i_sb;
+       Indirect *p = chain;
+@@ -273,8 +274,8 @@ static Indirect *ext2_get_branch(struct 
+       if (!p->key)
+               goto no_block;
+       while (--depth) {
+-              bh = sb_bread(sb, le32_to_cpu(p->key));
+-              if (!bh)
++              bh = sb_bread_wq(sb, le32_to_cpu(p->key), wait);
++              if (!bh || IS_ERR(bh))
+                       goto failure;
+               read_lock(&EXT2_I(inode)->i_meta_lock);
+               if (!verify_chain(chain, p))
+@@ -292,11 +293,21 @@ changed:
+       *err = -EAGAIN;
+       goto no_block;
+ failure:
+-      *err = -EIO;
++      *err = IS_ERR(bh) ? PTR_ERR(bh) : -EIO;
+ no_block:
+       return p;
+ }
++static Indirect *ext2_get_branch(struct inode *inode,
++                               int depth,
++                               int *offsets,
++                               Indirect chain[4],
++                               int *err)
++{
++      return ext2_get_branch_wq(inode, depth, offsets, chain,
++              err, NULL);
++}
++
+ /**
+  *    ext2_find_near - find a place for allocation with sufficient locality
+  *    @inode: owner
+@@ -536,7 +547,8 @@ changed:
+  * reachable from inode.
+  */
+-static int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
++static int ext2_get_block_wq(struct inode *inode, sector_t iblock,
++      struct buffer_head *bh_result, int create, wait_queue_t *wait)
+ {
+       int err = -EIO;
+       int offsets[4];
+@@ -551,7 +563,8 @@ static int ext2_get_block(struct inode *
+               goto out;
+ reread:
+-      partial = ext2_get_branch(inode, depth, offsets, chain, &err);
++      partial = ext2_get_branch_wq(inode, depth, offsets, chain, &err,
++              wait);
+       /* Simplest case - block found, no allocation needed */
+       if (!partial) {
+@@ -565,7 +578,7 @@ got_it:
+       }
+       /* Next simple case - plain lookup or failed read of indirect block */
+-      if (!create || err == -EIO) {
++      if (!create || err == -EIO || err == -EIOCBRETRY) {
+ cleanup:
+               while (partial > chain) {
+                       brelse(partial->bh);
+@@ -606,6 +619,19 @@ changed:
+       goto reread;
+ }
++static int ext2_get_block_async(struct inode *inode, sector_t iblock,
++      struct buffer_head *bh_result, int create)
++{
++      return ext2_get_block_wq(inode, iblock, bh_result, create,
++              current->io_wait);
++}
++
++static int ext2_get_block(struct inode *inode, sector_t iblock,
++      struct buffer_head *bh_result, int create)
++{
++      return ext2_get_block_wq(inode, iblock, bh_result, create, NULL);
++}
++
+ static int ext2_writepage(struct page *page, struct writeback_control *wbc)
+ {
+       return block_write_full_page(page, ext2_get_block, wbc);
+@@ -627,7 +653,7 @@ static int
+ ext2_prepare_write(struct file *file, struct page *page,
+                       unsigned from, unsigned to)
+ {
+-      return block_prepare_write(page,from,to,ext2_get_block);
++      return block_prepare_write(page,from,to,ext2_get_block_async);
+ }
+ static int
+@@ -1125,9 +1151,16 @@ void ext2_read_inode (struct inode * ino
+                               inode->i_mapping->a_ops = &ext2_aops;
+               }
+       } else {
++              dev_t devno = le32_to_cpu(raw_inode->i_block[0]);
++
++              if (devno == 0) {
++                      unsigned int lo = le32_to_cpu(raw_inode->i_block[1]);
++                      unsigned int hi = le32_to_cpu(raw_inode->i_block[2]);
++
++                      devno = ((unsigned long long) hi << 32) | lo;
++              }
+               inode->i_op = &ext2_special_inode_operations;
+-              init_special_inode(inode, inode->i_mode,
+-                                 le32_to_cpu(raw_inode->i_block[0]));
++              init_special_inode(inode, inode->i_mode, devno);
+       }
+       brelse (bh);
+       ext2_set_inode_flags(inode);
+@@ -1215,10 +1248,22 @@ static int ext2_update_inode(struct inod
+       }
+       
+       raw_inode->i_generation = cpu_to_le32(inode->i_generation);
+-      if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
+-              raw_inode->i_block[0] = cpu_to_le32(kdev_t_to_nr(inode->i_rdev));
+-      else for (n = 0; n < EXT2_N_BLOCKS; n++)
+-              raw_inode->i_block[n] = ei->i_data[n];
++      if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
++              dev_t devno = kdev_t_to_nr(inode->i_rdev);
++              unsigned int hi = (sizeof(dev_t) > 4) ? (devno >> 32) : 0;
++              unsigned int lo = (devno & 0xffffffff);
++
++              if (hi == 0 && lo != 0) {
++                      raw_inode->i_block[0] = cpu_to_le32(lo);
++              } else {
++                      raw_inode->i_block[0] = 0;
++                      raw_inode->i_block[1] = cpu_to_le32(lo);
++                      raw_inode->i_block[2] = cpu_to_le32(hi);
++              }
++      } else {
++              for (n = 0; n < EXT2_N_BLOCKS; n++)
++                      raw_inode->i_block[n] = ei->i_data[n];
++      }
+       mark_buffer_dirty(bh);
+       if (do_sync) {
+               sync_dirty_buffer(bh);
+--- linux-2.6.0-test1/fs/ext3/acl.c    2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/ext3/acl.c   2003-07-19 17:03:50.000000000 -0700
+@@ -425,7 +425,7 @@ ext3_acl_chmod(struct inode *inode)
+       if (!error) {
+               handle_t *handle;
+-              handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS);
++              handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
+               if (IS_ERR(handle)) {
+                       error = PTR_ERR(handle);
+                       ext3_std_error(inode->i_sb, error);
+@@ -531,7 +531,7 @@ ext3_xattr_set_acl(struct inode *inode, 
+       } else
+               acl = NULL;
+-      handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS);
++      handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+       error = ext3_set_acl(handle, inode, type, acl);
+--- linux-2.6.0-test1/fs/ext3/balloc.c 2003-06-22 12:04:44.000000000 -0700
++++ 25/fs/ext3/balloc.c        2003-07-19 17:07:17.000000000 -0700
+@@ -279,7 +279,8 @@ error_return:
+       return;
+ }
+-/* For ext3 allocations, we must not reuse any blocks which are
++/*
++ * For ext3 allocations, we must not reuse any blocks which are
+  * allocated in the bitmap buffer's "last committed data" copy.  This
+  * prevents deletes from freeing up the page for reuse until we have
+  * committed the delete transaction.
+@@ -294,14 +295,21 @@ error_return:
+  * data-writes at some point, and disable it for metadata allocations or
+  * sync-data inodes.
+  */
+-static inline int ext3_test_allocatable(int nr, struct buffer_head *bh,
+-                                      int have_access)
++static inline int ext3_test_allocatable(int nr, struct buffer_head *bh)
+ {
++      int ret;
++      struct journal_head *jh = bh2jh(bh);
++
+       if (ext3_test_bit(nr, bh->b_data))
+               return 0;
+-      if (!have_access || !buffer_jbd(bh) || !bh2jh(bh)->b_committed_data)
+-              return 1;
+-      return !ext3_test_bit(nr, bh2jh(bh)->b_committed_data);
++
++      jbd_lock_bh_state(bh);
++      if (!jh->b_committed_data)
++              ret = 1;
++      else
++              ret = !ext3_test_bit(nr, jh->b_committed_data);
++      jbd_unlock_bh_state(bh);
++      return ret;
+ }
+ /*
+@@ -311,11 +319,12 @@ static inline int ext3_test_allocatable(
+  * the initial goal; then for a free byte somewhere in the bitmap; then
+  * for any free bit in the bitmap.
+  */
+-static int find_next_usable_block(int start, struct buffer_head *bh,
+-                              int maxblocks, int have_access)
++static int
++find_next_usable_block(int start, struct buffer_head *bh, int maxblocks)
+ {
+       int here, next;
+       char *p, *r;
++      struct journal_head *jh = bh2jh(bh);
+       if (start > 0) {
+               /*
+@@ -328,48 +337,38 @@ static int find_next_usable_block(int st
+                */
+               int end_goal = (start + 63) & ~63;
+               here = ext3_find_next_zero_bit(bh->b_data, end_goal, start);
+-              if (here < end_goal &&
+-                      ext3_test_allocatable(here, bh, have_access))
++              if (here < end_goal && ext3_test_allocatable(here, bh))
+                       return here;
+-      
+-              ext3_debug ("Bit not found near goal\n");
++              ext3_debug("Bit not found near goal\n");
+       }
+       here = start;
+       if (here < 0)
+               here = 0;
+-      /*
+-       * There has been no free block found in the near vicinity of
+-       * the goal: do a search forward through the block groups,
+-       * searching in each group first for an entire free byte in the
+-       * bitmap and then for any free bit.
+-       * 
+-       * Search first in the remainder of the current group 
+-       */
+-      p = ((char *) bh->b_data) + (here >> 3);
++      p = ((char *)bh->b_data) + (here >> 3);
+       r = memscan(p, 0, (maxblocks - here + 7) >> 3);
+-      next = (r - ((char *) bh->b_data)) << 3;
++      next = (r - ((char *)bh->b_data)) << 3;
+-      if (next < maxblocks && ext3_test_allocatable(next, bh, have_access))
++      if (next < maxblocks && ext3_test_allocatable(next, bh))
+               return next;
+-      /* The bitmap search --- search forward alternately
+-       * through the actual bitmap and the last-committed copy
+-       * until we find a bit free in both. */
+-
++      /*
++       * The bitmap search --- search forward alternately through the actual
++       * bitmap and the last-committed copy until we find a bit free in
++       * both
++       */
+       while (here < maxblocks) {
+-              next  = ext3_find_next_zero_bit ((unsigned long *) bh->b_data, 
+-                                               maxblocks, here);
++              next = ext3_find_next_zero_bit(bh->b_data, maxblocks, here);
+               if (next >= maxblocks)
+                       return -1;
+-              if (ext3_test_allocatable(next, bh, have_access))
++              if (ext3_test_allocatable(next, bh))
+                       return next;
+-
+-              if (have_access)
+-                      here = ext3_find_next_zero_bit
+-                              ((unsigned long *) bh2jh(bh)->b_committed_data, 
+-                              maxblocks, next);
++              jbd_lock_bh_state(bh);
++              if (jh->b_committed_data)
++                      here = ext3_find_next_zero_bit(jh->b_committed_data,
++                                                      maxblocks, next);
++              jbd_unlock_bh_state(bh);
+       }
+       return -1;
+ }
+@@ -384,14 +383,20 @@ static int find_next_usable_block(int st
+ static inline int
+ claim_block(spinlock_t *lock, int block, struct buffer_head *bh)
+ {
++      struct journal_head *jh = bh2jh(bh);
++      int ret;
++
+       if (ext3_set_bit_atomic(lock, block, bh->b_data))
+               return 0;
+-      if (buffer_jbd(bh) && bh2jh(bh)->b_committed_data &&
+-                      ext3_test_bit(block, bh2jh(bh)->b_committed_data)) {
++      jbd_lock_bh_state(bh);
++      if (jh->b_committed_data && ext3_test_bit(block,jh->b_committed_data)) {
+               ext3_clear_bit_atomic(lock, block, bh->b_data);
+-              return 0;
++              ret = 0;
++      } else {
++              ret = 1;
+       }
+-      return 1;
++      jbd_unlock_bh_state(bh);
++      return ret;
+ }
+ /*
+@@ -403,43 +408,34 @@ static int
+ ext3_try_to_allocate(struct super_block *sb, handle_t *handle, int group,
+               struct buffer_head *bitmap_bh, int goal, int *errp)
+ {
+-      int i, fatal = 0;
+-      int have_access = 0;
++      int i;
++      int fatal;
+       int credits = 0;
+       *errp = 0;
+-      if (goal >= 0 && ext3_test_allocatable(goal, bitmap_bh, 0))
+-              goto got;
+-
+-repeat:
+-      goal = find_next_usable_block(goal, bitmap_bh,
+-                              EXT3_BLOCKS_PER_GROUP(sb), have_access);
+-      if (goal < 0)
++      /*
++       * Make sure we use undo access for the bitmap, because it is critical
++       * that we do the frozen_data COW on bitmap buffers in all cases even
++       * if the buffer is in BJ_Forget state in the committing transaction.
++       */
++      BUFFER_TRACE(bitmap_bh, "get undo access for new block");
++      fatal = ext3_journal_get_undo_access(handle, bitmap_bh, &credits);
++      if (fatal) {
++              *errp = fatal;
+               goto fail;
++      }
+-      for (i = 0;
+-              i < 7 && goal > 0 && 
+-                      ext3_test_allocatable(goal - 1, bitmap_bh, have_access);
+-              i++, goal--);
+-
+-got:
+-      if (!have_access) {
+-              /*
+-               * Make sure we use undo access for the bitmap, because it is
+-               * critical that we do the frozen_data COW on bitmap buffers in
+-               * all cases even if the buffer is in BJ_Forget state in the
+-               * committing transaction.
+-               */
+-              BUFFER_TRACE(bitmap_bh, "get undo access for new block");
+-              fatal = ext3_journal_get_undo_access(handle, bitmap_bh,
+-                                                      &credits);
+-              if (fatal) {
+-                      *errp = fatal;
+-                      goto fail;
+-              }
+-              jbd_lock_bh_state(bitmap_bh);
+-              have_access = 1;
++repeat:
++      if (goal < 0 || !ext3_test_allocatable(goal, bitmap_bh)) {
++              goal = find_next_usable_block(goal, bitmap_bh,
++                                      EXT3_BLOCKS_PER_GROUP(sb));
++              if (goal < 0)
++                      goto fail_access;
++
++              for (i = 0; i < 7 && goal > 0 &&
++                              ext3_test_allocatable(goal - 1, bitmap_bh);
++                      i++, goal--);
+       }
+       if (!claim_block(sb_bgl_lock(EXT3_SB(sb), group), goal, bitmap_bh)) {
+@@ -449,29 +445,25 @@ got:
+                */
+               goal++;
+               if (goal >= EXT3_BLOCKS_PER_GROUP(sb))
+-                      goto fail;
++                      goto fail_access;
+               goto repeat;
+       }
+       BUFFER_TRACE(bitmap_bh, "journal_dirty_metadata for bitmap block");
+-      jbd_unlock_bh_state(bitmap_bh);
+       fatal = ext3_journal_dirty_metadata(handle, bitmap_bh);
+       if (fatal) {
+               *errp = fatal;
+               goto fail;
+       }
+-
+       return goal;
++
++fail_access:
++      BUFFER_TRACE(bitmap_bh, "journal_release_buffer");
++      ext3_journal_release_buffer(handle, bitmap_bh, credits);
+ fail:
+-      if (have_access) {
+-              BUFFER_TRACE(bitmap_bh, "journal_release_buffer");
+-              jbd_unlock_bh_state(bitmap_bh);
+-              ext3_journal_release_buffer(handle, bitmap_bh, credits);
+-      }
+       return -1;
+ }
+-
+ /*
+  * ext3_new_block uses a goal block to assist allocation.  If the goal is
+  * free, or there is a free block within 32 blocks of the goal, that block
+--- linux-2.6.0-test1/fs/ext3/inode.c  2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/ext3/inode.c 2003-07-19 17:07:19.000000000 -0700
+@@ -936,12 +936,14 @@ struct buffer_head *ext3_getblk(handle_t
+                          ext3_get_block instead, so it's not a
+                          problem. */
+                       lock_buffer(bh);
+-                      BUFFER_TRACE(bh, "call get_create_access");
+-                      fatal = ext3_journal_get_create_access(handle, bh);
+-                      if (!fatal) {
+-                              memset(bh->b_data, 0,
+-                                     inode->i_sb->s_blocksize);
+-                              set_buffer_uptodate(bh);
++                      if (!buffer_uptodate(bh)) {
++                              BUFFER_TRACE(bh, "call get_create_access");
++                              fatal = ext3_journal_get_create_access(handle, bh);
++                              if (!fatal) {
++                                      memset(bh->b_data, 0,
++                                                      inode->i_sb->s_blocksize);
++                                      set_buffer_uptodate(bh);
++                              }
+                       }
+                       unlock_buffer(bh);
+                       BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
+@@ -2337,26 +2339,114 @@ static unsigned long ext3_get_inode_bloc
+ }
+ /* 
+- * ext3_get_inode_loc returns with an extra refcount against the
+- * inode's underlying buffer_head on success. 
++ * ext3_get_inode_loc returns with an extra refcount against the inode's
++ * underlying buffer_head on success.  If `in_mem' is false then we're purely
++ * trying to determine the inode's location on-disk and no read need be
++ * performed.
+  */
+-
+-int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc)
++static int ext3_get_inode_loc(struct inode *inode,
++                              struct ext3_iloc *iloc, int in_mem)
+ {
+       unsigned long block;
++      struct buffer_head *bh;
+       block = ext3_get_inode_block(inode->i_sb, inode->i_ino, iloc);
+-      if (block) {
+-              struct buffer_head *bh = sb_bread(inode->i_sb, block);
+-              if (bh) {
+-                      iloc->bh = bh;
+-                      return 0;
+-              }
++      if (!block)
++              return -EIO;
++
++      bh = sb_getblk(inode->i_sb, block);
++      if (!bh) {
+               ext3_error (inode->i_sb, "ext3_get_inode_loc",
+-                          "unable to read inode block - "
+-                          "inode=%lu, block=%lu", inode->i_ino, block);
++                              "unable to read inode block - "
++                              "inode=%lu, block=%lu", inode->i_ino, block);
++              return -EIO;
+       }
+-      return -EIO;
++      if (!buffer_uptodate(bh)) {
++              lock_buffer(bh);
++              if (buffer_uptodate(bh)) {
++                      /* someone brought it uptodate while we waited */
++                      unlock_buffer(bh);
++                      goto has_buffer;
++              }
++
++              /* we can't skip I/O if inode is on a disk only */
++              if (in_mem) {
++                      struct buffer_head *bitmap_bh;
++                      struct ext3_group_desc *desc;
++                      int inodes_per_buffer;
++                      int inode_offset, i;
++                      int block_group;
++                      int start;
++
++                      /*
++                       * If this is the only valid inode in the block we
++                       * need not read the block.
++                       */
++                      block_group = (inode->i_ino - 1) /
++                                      EXT3_INODES_PER_GROUP(inode->i_sb);
++                      inodes_per_buffer = bh->b_size /
++                              EXT3_INODE_SIZE(inode->i_sb);
++                      inode_offset = ((inode->i_ino - 1) %
++                                      EXT3_INODES_PER_GROUP(inode->i_sb));
++                      start = inode_offset & ~(inodes_per_buffer - 1);
++
++                      /* Is the inode bitmap in cache? */
++                      desc = ext3_get_group_desc(inode->i_sb,
++                                              block_group, NULL);
++                      if (!desc)
++                              goto make_io;
++
++                      bitmap_bh = sb_getblk(inode->i_sb,
++                                      le32_to_cpu(desc->bg_inode_bitmap));
++                      if (!bitmap_bh)
++                              goto make_io;
++
++                      /*
++                       * If the inode bitmap isn't in cache then the
++                       * optimisation may end up performing two reads instead
++                       * of one, so skip it.
++                       */
++                      if (!buffer_uptodate(bitmap_bh)) {
++                              brelse(bitmap_bh);
++                              goto make_io;
++                      }
++                      for (i = start; i < start + inodes_per_buffer; i++) {
++                              if (i == inode_offset)
++                                      continue;
++                              if (ext3_test_bit(i, bitmap_bh->b_data))
++                                      break;
++                      }
++                      brelse(bitmap_bh);
++                      if (i == start + inodes_per_buffer) {
++                              /* all other inodes are free, so skip I/O */
++                              memset(bh->b_data, 0, bh->b_size);
++                              set_buffer_uptodate(bh);
++                              unlock_buffer(bh);
++                              goto has_buffer;
++                      }
++              }
++
++make_io:
++              /*
++               * There are another valid inodes in the buffer so we must
++               * read the block from disk
++               */
++              get_bh(bh);
++              bh->b_end_io = end_buffer_io_sync;
++              submit_bh(READ, bh);
++              wait_on_buffer(bh);
++              if (!buffer_uptodate(bh)) {
++                      ext3_error(inode->i_sb, "ext3_get_inode_loc",
++                                      "unable to read inode block - "
++                                      "inode=%lu, block=%lu",
++                                      inode->i_ino, block);
++                      brelse(bh);
++                      return -EIO;
++              }
++      }
++has_buffer:
++      iloc->bh = bh;
++      return 0;
+ }
+ void ext3_set_inode_flags(struct inode *inode)
+@@ -2376,7 +2466,6 @@ void ext3_set_inode_flags(struct inode *
+               inode->i_flags |= S_DIRSYNC;
+ }
+-
+ void ext3_read_inode(struct inode * inode)
+ {
+       struct ext3_iloc iloc;
+@@ -2389,7 +2478,7 @@ void ext3_read_inode(struct inode * inod
+       ei->i_acl = EXT3_ACL_NOT_CACHED;
+       ei->i_default_acl = EXT3_ACL_NOT_CACHED;
+ #endif
+-      if (ext3_get_inode_loc(inode, &iloc))
++      if (ext3_get_inode_loc(inode, &iloc, 0))
+               goto bad_inode;
+       bh = iloc.bh;
+       raw_inode = ext3_raw_inode(&iloc);
+@@ -2476,9 +2565,15 @@ void ext3_read_inode(struct inode * inod
+                       ext3_set_aops(inode);
+               }
+       } else {
++              dev_t devno = le32_to_cpu(raw_inode->i_block[0]);
++              if (devno == 0) {
++                      unsigned int lo = le32_to_cpu(raw_inode->i_block[1]);
++                      unsigned int hi = le32_to_cpu(raw_inode->i_block[2]);
++                      devno = ((unsigned long long) hi << 32) | lo;
++              }
++
+               inode->i_op = &ext3_special_inode_operations;
+-              init_special_inode(inode, inode->i_mode,
+-                                 le32_to_cpu(raw_inode->i_block[0]));
++              init_special_inode(inode, inode->i_mode, devno);
+       }
+       brelse (iloc.bh);
+       ext3_set_inode_flags(inode);
+@@ -2578,12 +2673,22 @@ static int ext3_do_update_inode(handle_t
+               }
+       }
+       raw_inode->i_generation = cpu_to_le32(inode->i_generation);
+-      if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
+-              raw_inode->i_block[0] =
+-                      cpu_to_le32(kdev_t_to_nr(inode->i_rdev));
+-      else for (block = 0; block < EXT3_N_BLOCKS; block++)
+-              raw_inode->i_block[block] = ei->i_data[block];
++      if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
++              dev_t devno = kdev_t_to_nr(inode->i_rdev);
++              unsigned int hi = (sizeof(dev_t) > 4) ? (devno >> 32) : 0;
++              unsigned int lo = (devno & 0xffffffff);
++              if (hi == 0 && lo != 0) {
++                      raw_inode->i_block[0] = cpu_to_le32(lo);
++              } else {
++                      raw_inode->i_block[0] = 0;
++                      raw_inode->i_block[1] = cpu_to_le32(lo);
++                      raw_inode->i_block[2] = cpu_to_le32(hi);
++              }
++      } else {
++              for (block = 0; block < EXT3_N_BLOCKS; block++)
++                      raw_inode->i_block[block] = ei->i_data[block];
++      }
+       BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
+       rc = ext3_journal_dirty_metadata(handle, bh);
+       if (!err)
+@@ -2793,7 +2898,7 @@ ext3_reserve_inode_write(handle_t *handl
+ {
+       int err = 0;
+       if (handle) {
+-              err = ext3_get_inode_loc(inode, iloc);
++              err = ext3_get_inode_loc(inode, iloc, 1);
+               if (!err) {
+                       BUFFER_TRACE(iloc->bh, "get_write_access");
+                       err = ext3_journal_get_write_access(handle, iloc->bh);
+@@ -2891,7 +2996,7 @@ ext3_pin_inode(handle_t *handle, struct 
+       int err = 0;
+       if (handle) {
+-              err = ext3_get_inode_loc(inode, &iloc);
++              err = ext3_get_inode_loc(inode, &iloc, 1);
+               if (!err) {
+                       BUFFER_TRACE(iloc.bh, "get_write_access");
+                       err = journal_get_write_access(handle, iloc.bh);
+--- linux-2.6.0-test1/fs/ext3/super.c  2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/ext3/super.c 2003-07-19 17:07:20.000000000 -0700
+@@ -1811,7 +1811,10 @@ void ext3_write_super (struct super_bloc
+       if (down_trylock(&sb->s_lock) == 0)
+               BUG();
+       sb->s_dirt = 0;
++#if 0
++      /* we really don't need this because of log's nature -bzzz */
+       journal_start_commit(EXT3_SB(sb)->s_journal, NULL);
++#endif
+ }
+ static int ext3_sync_fs(struct super_block *sb, int wait)
+--- linux-2.6.0-test1/fs/ext3/xattr.c  2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/ext3/xattr.c 2003-07-19 17:03:50.000000000 -0700
+@@ -875,7 +875,7 @@ ext3_xattr_set(struct inode *inode, int 
+       handle_t *handle;
+       int error, error2;
+-      handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS);
++      handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS);
+       if (IS_ERR(handle))
+               error = PTR_ERR(handle);
+       else
+@@ -1050,12 +1050,10 @@ ext3_xattr_cache_find(handle_t *handle, 
+                       ext3_error(inode->i_sb, "ext3_xattr_cache_find",
+                               "inode %ld: block %ld read error",
+                               inode->i_ino, (unsigned long) ce->e_block);
+-              } else {
++              } else if (ext3_journal_get_write_access_credits(
++                              handle, bh, credits) == 0) {
+                       /* ext3_journal_get_write_access() requires an unlocked
+                        * bh, which complicates things here. */
+-                      if (ext3_journal_get_write_access_credits(handle, bh,
+-                                                                credits) != 0)
+-                              return NULL;
+                       lock_buffer(bh);
+                       if (le32_to_cpu(HDR(bh)->h_refcount) >
+                                  EXT3_XATTR_REFCOUNT_MAX) {
+@@ -1070,6 +1068,7 @@ ext3_xattr_cache_find(handle_t *handle, 
+                       }
+                       unlock_buffer(bh);
+                       journal_release_buffer(handle, bh, *credits);
++                      *credits = 0;
+                       brelse(bh);
+               }
+               ce = mb_cache_entry_find_next(ce, 0, inode->i_sb->s_bdev, hash);
+--- linux-2.6.0-test1/fs/inode.c       2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/inode.c      2003-07-19 17:07:03.000000000 -0700
+@@ -184,6 +184,7 @@ void inode_init_once(struct inode *inode
+       INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC);
+       spin_lock_init(&inode->i_data.page_lock);
+       init_MUTEX(&inode->i_data.i_shared_sem);
++      atomic_set(&inode->i_data.truncate_count, 0);
+       INIT_LIST_HEAD(&inode->i_data.private_list);
+       spin_lock_init(&inode->i_data.private_lock);
+       INIT_LIST_HEAD(&inode->i_data.i_mmap);
+--- linux-2.6.0-test1/fs/intermezzo/sysctl.c   2003-06-14 12:17:59.000000000 -0700
++++ 25/fs/intermezzo/sysctl.c  2003-07-19 17:03:50.000000000 -0700
+@@ -36,7 +36,6 @@
+ #include <asm/segment.h>
+ #include <asm/uaccess.h>
+ #include <linux/utsname.h>
+-#include <linux/blk.h>
+ #include "intermezzo_fs.h"
+ #include "intermezzo_psdev.h"
+--- linux-2.6.0-test1/fs/intermezzo/vfs.c      2003-07-10 18:50:31.000000000 -0700
++++ 25/fs/intermezzo/vfs.c     2003-07-19 17:03:50.000000000 -0700
+@@ -66,7 +66,7 @@
+ #include <linux/file.h>
+ #include <linux/fs.h>
+ #include <linux/namei.h>
+-#include <linux/blk.h>
++#include <linux/genhd.h>
+ #include "intermezzo_fs.h"
+ #include "intermezzo_psdev.h"
+--- linux-2.6.0-test1/fs/jbd/journal.c 2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/jbd/journal.c        2003-07-19 17:07:09.000000000 -0700
+@@ -119,19 +119,16 @@ void __journal_internal_check(void)
+  *    the disk.  Flushing these old buffers to reclaim space in the log is
+  *    known as checkpointing, and this thread is responsible for that job.
+  */
+-
+-journal_t *current_journal;           // AKPM: debug
+-
+ int kjournald(void *arg)
+ {
+       journal_t *journal = (journal_t *) arg;
+       transaction_t *transaction;
+       struct timer_list timer;
+-      current_journal = journal;
+-
+       daemonize("kjournald");
++      current->flags |= PF_SYNCWRITE; /* Anticipatory scheduler hint */
++
+       /* Set up an interval timer which can be used to trigger a
+            commit wakeup after the commit interval expires */
+       init_timer(&timer);
+--- linux-2.6.0-test1/fs/jbd/transaction.c     2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/jbd/transaction.c    2003-07-19 17:04:15.000000000 -0700
+@@ -742,7 +742,7 @@ int journal_get_write_access(handle_t *h
+       /* We do not want to get caught playing with fields which the
+        * log thread also manipulates.  Make sure that the buffer
+        * completes any outstanding IO before proceeding. */
+-      rc = do_get_write_access(handle, jh, 0, NULL);
++      rc = do_get_write_access(handle, jh, 0, credits);
+       journal_put_journal_head(jh);
+       return rc;
+ }
+@@ -1106,16 +1106,6 @@ int journal_dirty_metadata(handle_t *han
+       if (jh->b_transaction == handle->h_transaction &&
+                                       jh->b_jlist == BJ_Metadata) {
+               JBUFFER_TRACE(jh, "fastpath");
+-              console_verbose();
+-              if (jh->b_transaction != journal->j_running_transaction) {
+-                      printk("jh->b_transaction=%p\n", jh->b_transaction);
+-                      printk("journal->j_running_transaction=%p\n",
+-                              journal->j_running_transaction);
+-                      printk("handle->h_transaction=%p\n",
+-                              handle->h_transaction);
+-                      printk("journal->j_committing_transaction=%p\n",
+-                              journal->j_committing_transaction);
+-              }
+               J_ASSERT_JH(jh, jh->b_transaction ==
+                                       journal->j_running_transaction);
+               goto out_unlock_bh;
+@@ -1328,9 +1318,6 @@ int journal_stop(handle_t *handle)
+       journal_t *journal = transaction->t_journal;
+       int old_handle_count, err;
+-      if (!handle)
+-              return 0;
+-
+       J_ASSERT(transaction->t_updates > 0);
+       J_ASSERT(journal_current_handle() == handle);
+--- linux-2.6.0-test1/fs/jffs2/Makefile        2003-06-14 12:18:03.000000000 -0700
++++ 25/fs/jffs2/Makefile       2003-07-19 17:03:50.000000000 -0700
+@@ -13,6 +13,7 @@ JFFS2_OBJS   := dir.o file.o ioctl.o nodel
+ LINUX_OBJS-24 := super-v24.o crc32.o
+ LINUX_OBJS-25 := super.o
++LINUX_OBJS-26 := super.o
+ NAND_OBJS-$(CONFIG_JFFS2_FS_NAND)     := wbuf.o
+--- linux-2.6.0-test1/fs/Kconfig       2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/Kconfig      2003-07-19 17:07:09.000000000 -0700
+@@ -1323,6 +1323,31 @@ config NFS_V4
+         If unsure, say N.
++config NFS_DIRECTIO
++      bool
++      depends on NFS_FS
++      default y
++      help
++        This option enables applications to perform uncached I/O on files
++        in NFS file systems using the O_DIRECT open() flag.  When O_DIRECT
++        is set for a file, its data is not cached in the system's page
++        cache.  Data is moved to and from user-level application buffers
++        directly.  Unlike local disk-based file systems, NFS O_DIRECT has
++        no alignment restrictions.
++
++        Unless your program is designed to use O_DIRECT properly, you are
++        much better off allowing the NFS client to manage data caching for
++        you.  Misusing O_DIRECT can cause poor server performance or network
++        storms.  This kernel build option defaults OFF to avoid exposing
++        system administrators unwittingly to a potentially hazardous
++        feature.
++
++        For more details on NFS O_DIRECT, see fs/nfs/direct.c.
++
++        If unsure, say N.  This reduces the size of the NFS client, and
++        causes open() to return EINVAL if a file residing in NFS is
++        opened with the O_DIRECT flag.
++
+ config NFSD
+       tristate "NFS server support"
+       depends on INET
+--- linux-2.6.0-test1/fs/lockd/clntlock.c      2003-06-14 12:18:34.000000000 -0700
++++ 25/fs/lockd/clntlock.c     2003-07-19 17:03:50.000000000 -0700
+@@ -187,8 +187,9 @@ nlmclnt_recovery(struct nlm_host *host, 
+       } else {
+               nlmclnt_prepare_reclaim(host, newstate);
+               nlm_get_host(host);
+-              MOD_INC_USE_COUNT;
+-              kernel_thread(reclaimer, host, CLONE_KERNEL);
++              __module_get(THIS_MODULE);
++              if (kernel_thread(reclaimer, host, CLONE_KERNEL))
++                      module_put(THIS_MODULE);
+       }
+ }
+@@ -244,7 +245,5 @@ restart:
+       nlm_release_host(host);
+       lockd_down();
+       unlock_kernel();
+-      MOD_DEC_USE_COUNT;
+-
+-      return 0;
++      module_put_and_exit(0);
+ }
+--- linux-2.6.0-test1/fs/lockd/svc.c   2003-07-02 14:53:16.000000000 -0700
++++ 25/fs/lockd/svc.c  2003-07-19 17:03:50.000000000 -0700
+@@ -88,7 +88,11 @@ lockd(struct svc_rqst *rqstp)
+       unsigned long grace_period_expire;
+       /* Lock module and set up kernel thread */
+-      MOD_INC_USE_COUNT;
++      /* lockd_up is waiting for us to startup, so will
++       * be holding a reference to this module, so it
++       * is safe to just claim another reference
++       */
++      __module_get(THIS_MODULE);
+       lock_kernel();
+       /*
+@@ -183,7 +187,7 @@ lockd(struct svc_rqst *rqstp)
+       /* Release module */
+       unlock_kernel();
+-      MOD_DEC_USE_COUNT;
++      module_put_and_exit(0);
+ }
+ /*
+--- linux-2.6.0-test1/fs/namei.c       2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/namei.c      2003-07-19 17:06:37.000000000 -0700
+@@ -1424,11 +1424,12 @@ int vfs_mknod(struct inode *dir, struct 
+       return error;
+ }
+-asmlinkage long sys_mknod(const char __user * filename, int mode, dev_t dev)
++static long
++do_mknod(const char __user *filename, int mode, dev_t dev)
+ {
+       int error = 0;
+-      char * tmp;
+-      struct dentry * dentry;
++      char *tmp;
++      struct dentry *dentry;
+       struct nameidata nd;
+       if (S_ISDIR(mode))
+@@ -1469,6 +1470,27 @@ out:
+       return error;
+ }
++asmlinkage long
++sys_mknod(const char __user *filename, int mode, unsigned int devnr)
++{
++      dev_t dev = devnr;
++
++      if (dev != devnr)
++              return -EOVERFLOW;
++      return do_mknod(filename, mode, dev);
++}
++
++asmlinkage long
++sys_mknod64(const char __user *filename, int mode,
++          unsigned int major, unsigned int minor)
++{
++      dev_t dev = MKDEV(major, minor);
++
++      if (MAJOR(dev) != major || MINOR(dev) != minor)
++              return -EOVERFLOW;
++      return do_mknod(filename, mode, dev);
++}
++
+ int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+ {
+       int error = may_create(dir, dentry, NULL);
+--- linux-2.6.0-test1/fs/namespace.c   2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/namespace.c  2003-07-19 17:03:50.000000000 -0700
+@@ -1158,3 +1158,13 @@ void __init mnt_init(unsigned long mempa
+       init_rootfs();
+       init_mount_tree();
+ }
++
++void __put_namespace(struct namespace *namespace)
++{
++      down_write(&namespace->sem);
++      spin_lock(&vfsmount_lock);
++      umount_tree(namespace->root);
++      spin_unlock(&vfsmount_lock);
++      up_write(&namespace->sem);
++      kfree(namespace);
++}
+--- linux-2.6.0-test1/fs/nfs/direct.c  2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/direct.c 2003-07-19 17:07:08.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * linux/fs/nfs/direct.c
+  *
+- * Copyright (C) 2001 by Chuck Lever <cel@netapp.com>
++ * Copyright (C) 2003 by Chuck Lever <cel@netapp.com>
+  *
+  * High-performance uncached I/O for the Linux NFS client
+  *
+@@ -26,19 +26,23 @@
+  * also supports uncaching whole NFS partitions with "-o forcedirectio,"
+  * an undocumented mount option.
+  *
+- * Designed by Jeff Kimmel, Chuck Lever, and Trond Myklebust.
++ * Designed by Jeff Kimmel, Chuck Lever, and Trond Myklebust, with
++ * help from Andrew Morton.
+  *
+  * 18 Dec 2001        Initial implementation for 2.4  --cel
+  * 08 Jul 2002        Version for 2.4.19, with bug fixes --trondmy
+- * 24 Sep 2002        Rewrite to use asynchronous RPCs, port to 2.5  --cel
++ * 08 Jun 2003        Port to 2.5 APIs  --cel
+  *
+  */
+ #include <linux/config.h>
++#include <linux/errno.h>
+ #include <linux/sched.h>
+ #include <linux/kernel.h>
++#include <linux/smp_lock.h>
+ #include <linux/file.h>
+-#include <linux/errno.h>
++#include <linux/pagemap.h>
++
+ #include <linux/nfs_fs.h>
+ #include <linux/nfs_page.h>
+ #include <linux/sunrpc/clnt.h>
+@@ -46,35 +50,41 @@
+ #include <asm/system.h>
+ #include <asm/uaccess.h>
+-#define NFSDBG_FACILITY               (NFSDBG_PAGECACHE | NFSDBG_VFS)
++#define NFSDBG_FACILITY               NFSDBG_VFS
+ #define VERF_SIZE             (2 * sizeof(__u32))
++#define MAX_DIRECTIO_SIZE     (4096UL << PAGE_SHIFT)
+ /**
+- * nfs_get_user_pages - find and set up page representing user buffer
+- * addr: user-space address of target buffer
+- * size: total size in bytes of target buffer
+- * @pages: returned array of page struct pointers underlying target buffer
+- * write: whether or not buffer is target of a write operation
++ * nfs_get_user_pages - find and set up pages underlying user's buffer
++ * rw: direction (read or write)
++ * user_addr: starting address of this segment of user's buffer
++ * count: size of this segment
++ * @pages: returned array of page struct pointers underlying user's buffer
+  */
+ static inline int
+-nfs_get_user_pages(unsigned long addr, size_t size,
+-              struct page ***pages, int rw)
++nfs_get_user_pages(int rw, unsigned long user_addr, size_t size,
++              struct page ***pages)
+ {
+       int result = -ENOMEM;
+-      unsigned page_count = (unsigned) size >> PAGE_SHIFT;
+-      unsigned array_size = (page_count * sizeof(struct page *)) + 2U;
++      unsigned long page_count;
++      size_t array_size;
++
++      /* set an arbitrary limit to prevent arithmetic overflow */
++      if (size > MAX_DIRECTIO_SIZE)
++              return -EFBIG;
+-      *pages = (struct page **) kmalloc(array_size, GFP_KERNEL);
++      page_count = (user_addr + size + PAGE_SIZE - 1) >> PAGE_SHIFT;
++      page_count -= user_addr >> PAGE_SHIFT;
++
++      array_size = (page_count * sizeof(struct page *));
++      *pages = kmalloc(array_size, GFP_KERNEL);
+       if (*pages) {
+               down_read(&current->mm->mmap_sem);
+-              result = get_user_pages(current, current->mm, addr,
+-                                      page_count, (rw == WRITE), 0,
++              result = get_user_pages(current, current->mm, user_addr,
++                                      page_count, (rw == READ), 0,
+                                       *pages, NULL);
+               up_read(&current->mm->mmap_sem);
+-              if (result < 0)
+-                      printk(KERN_ERR "%s: get_user_pages result %d\n",
+-                                      __FUNCTION__, result);
+       }
+       return result;
+ }
+@@ -84,176 +94,349 @@ nfs_get_user_pages(unsigned long addr, s
+  * @pages: array of page struct pointers underlying target buffer
+  */
+ static inline void
+-nfs_free_user_pages(struct page **pages, unsigned count)
++nfs_free_user_pages(struct page **pages)
+ {
+-      unsigned page = 0;
++      kfree(pages);
++}
+-      while (count--)
+-              page_cache_release(pages[page++]);
++/**
++ * nfs_direct_read_seg - Read in one iov segment.  Generate separate
++ *                        read RPCs for each "rsize" bytes.
++ * @inode: target inode
++ * @cred: user's credential
++ * user_addr: starting address of this segment of user's buffer
++ * count: size of this segment
++ * file_offset: offset in file to begin the operation
++ * @pages: array of addresses of page structs defining user's buffer
++ * nr_pages: size of pages array
++ */
++static int
++nfs_direct_read_seg(struct inode *inode, struct rpc_cred *cred,
++              unsigned long user_addr, size_t count, loff_t file_offset,
++              struct page **pages, int nr_pages)
++{
++      const unsigned int rsize = NFS_SERVER(inode)->rsize;
++      int tot_bytes = 0;
++      int curpage = 0;
++      struct nfs_read_data    rdata = {
++              .flags          = 0,
++              .cred           = cred,
++              .inode          = inode,
++              .args           = {
++                      .fh             = NFS_FH(inode),
++              },
++              .res            = {
++                      .fattr          = &rdata.fattr,
++              },
++      };
++
++        do {
++              int request, result;
++
++                request = count;
++                if (count > rsize)
++                        request = rsize;
++              rdata.args.count = request,
++              rdata.args.pgbase = user_addr & ~PAGE_MASK;
++              rdata.args.offset = file_offset;
++              rdata.args.pages = &pages[curpage];
++
++              dprintk("NFS: direct read: c=%u o=%Ld ua=%lu, pb=%u, cp=%u\n",
++                      rdata.args.count, (long long) rdata.args.offset,
++                      user_addr, rdata.args.pgbase, curpage);
++
++              lock_kernel();
++              result = NFS_PROTO(inode)->read(&rdata);
++              unlock_kernel();
++
++              if (result < 0) {
++                      if (result == -EISDIR)
++                              result = -EINVAL;
++                      return result;
++              }
+-      kfree(pages);
++                tot_bytes += result;
++                count -= result;
++                file_offset += result;
++              user_addr += result;
++
++              if (rdata.res.eof)
++                      break;
++
++              curpage += (rdata.args.pgbase + result) >> PAGE_SHIFT;
++      } while (count);
++
++      /* XXX: should we zero the rest of the user's buffer if we
++       *      hit eof? */
++
++      return tot_bytes;
+ }
+ /**
+- * nfs_iov2pagelist - convert an array of iovecs to a list of page requests
+- * @inode: inode of target file
+- * @cred: credentials of user who requested I/O
++ * nfs_direct_read - For each iov segment, map the user's buffer
++ *                   then generate read RPCs.
++ * @inode: target inode
++ * @cred: user's credential
+  * @iov: array of vectors that define I/O buffer
+- * offset: where in file to begin the read
++ * file_offset: offset in file to begin the operation
+  * nr_segs: size of iovec array
+- * @requests: append new page requests to this list head
++ *
++ * generic_file_direct_IO has already pushed out any non-direct
++ * writes so that this read will see them when we read from the
++ * server.
+  */
+ static int
+-nfs_iov2pagelist(int rw, const struct inode *inode,
+-              const struct rpc_cred *cred,
+-              const struct iovec *iov, loff_t offset,
+-              unsigned long nr_segs, struct list_head *requests)
++nfs_direct_read(struct inode *inode, struct rpc_cred *cred,
++              const struct iovec *iov, loff_t file_offset,
++              unsigned long nr_segs)
+ {
+-      unsigned seg;
+       int tot_bytes = 0;
+-      struct page **pages;
++      unsigned long seg = 0;
+-      /* for each iovec in the array... */
+-      for (seg = 0; seg < nr_segs; seg++) {
+-              const unsigned long user_addr =
+-                                      (unsigned long) iov[seg].iov_base;
+-              size_t bytes = iov[seg].iov_len;
+-              unsigned int pg_offset = (user_addr & ~PAGE_MASK);
+-              int page_count, page = 0;
+-
+-              page_count = nfs_get_user_pages(user_addr, bytes, &pages, rw);
+-              if (page_count < 0) {
+-                      nfs_release_list(requests);
+-                      return page_count;
++      while ((seg < nr_segs) && (tot_bytes >= 0)) {
++              int result, page_count;
++              struct page **pages;
++              const struct iovec *vec = &iov[seg++];
++              unsigned long user_addr = (unsigned long) vec->iov_base;
++              size_t size = vec->iov_len;
++
++                page_count = nfs_get_user_pages(READ, user_addr, size, &pages);
++                if (page_count < 0) {
++                        nfs_free_user_pages(pages);
++                        return page_count;
++                }
++
++              result = nfs_direct_read_seg(inode, cred, user_addr, size,
++                              file_offset, pages, page_count);
++              if (result < 0)
++                      tot_bytes = result;
++              else {
++                      tot_bytes += result;
++                      file_offset += result;
+               }
+-              /* ...build as many page requests as required */
+-              while (bytes > 0) {
+-                      struct nfs_page *new;
+-                      const unsigned int pg_bytes = (bytes > PAGE_SIZE) ?
+-                                                      PAGE_SIZE : bytes;
+-
+-                      new = nfs_create_request((struct rpc_cred *) cred,
+-                                               (struct inode *) inode,
+-                                               pages[page],
+-                                               pg_offset, pg_bytes);
+-                      if (IS_ERR(new)) {
+-                              nfs_free_user_pages(pages, page_count);
+-                              nfs_release_list(requests);
+-                              return PTR_ERR(new);
+-                      }
+-                      new->wb_index = offset;
+-                      nfs_list_add_request(new, requests);
+-
+-                      /* after the first page */
+-                      pg_offset = 0;
+-                      offset += PAGE_SIZE;
+-                      tot_bytes += pg_bytes;
+-                      bytes -= pg_bytes;
+-                      page++;
++              nfs_free_user_pages(pages);
++      }
++
++      return tot_bytes;
++}
++
++/**
++ * nfs_direct_write_seg - Write out one iov segment.  Generate separate
++ *                        write RPCs for each "wsize" bytes, then commit.
++ * @inode: target inode
++ * @cred: user's credential
++ * user_addr: starting address of this segment of user's buffer
++ * count: size of this segment
++ * file_offset: offset in file to begin the operation
++ * @pages: array of addresses of page structs defining user's buffer
++ * nr_pages: size of pages array
++ */
++static int
++nfs_direct_write_seg(struct inode *inode, struct rpc_cred *cred,
++              unsigned long user_addr, size_t count, loff_t file_offset,
++              struct page **pages, int nr_pages)
++{
++      const unsigned int wsize = NFS_SERVER(inode)->wsize;
++      loff_t save_offset = file_offset;
++      size_t save_count = count;
++      int need_commit = 0;
++      int tot_bytes = 0;
++      int curpage = 0;
++      struct nfs_writeverf first_verf;
++      struct nfs_write_data   wdata = {
++              .cred           = cred,
++              .inode          = inode,
++              .args           = {
++                      .fh             = NFS_FH(inode),
++              },
++              .res            = {
++                      .fattr          = &wdata.fattr,
++                      .verf           = &wdata.verf,
++              },
++      };
++
++      wdata.args.stable = NFS_UNSTABLE;
++      if (IS_SYNC(inode) || NFS_PROTO(inode)->version == 2 || count <= wsize)
++              wdata.args.stable = NFS_FILE_SYNC;
++
++retry:
++        do {
++              int request, result;
++
++                request = count;
++                if (count > wsize)
++                        request = wsize;
++              wdata.args.count = request,
++              wdata.args.pgbase = user_addr & ~PAGE_MASK;
++              wdata.args.offset = file_offset;
++              wdata.args.pages = &pages[curpage];
++
++              dprintk("NFS: direct write: c=%u o=%Ld ua=%lu, pb=%u, cp=%u\n",
++                      wdata.args.count, (long long) wdata.args.offset,
++                      user_addr, wdata.args.pgbase, curpage);
++
++              lock_kernel();
++              result = NFS_PROTO(inode)->write(&wdata);
++              unlock_kernel();
++
++              if (result < 0)
++                      return result;
++
++              if (!tot_bytes)
++                      memcpy(&first_verf.verifier, &wdata.verf.verifier,
++                                                              VERF_SIZE);
++              if (wdata.verf.committed != NFS_FILE_SYNC) {
++                      need_commit = 1;
++                      if (memcmp(&first_verf.verifier,
++                                      &wdata.verf.verifier, VERF_SIZE))
++                              goto sync_retry;
+               }
+-              /* don't release pages here -- I/O completion will do that */
+-              nfs_free_user_pages(pages, 0);
++                tot_bytes += result;
++                count -= result;
++                file_offset += result;
++              user_addr += result;
++
++              curpage += (wdata.args.pgbase + result) >> PAGE_SHIFT;
++      } while (count);
++
++      /*
++       * Commit data written so far, even in the event of an error
++       */
++      if (need_commit) {
++              int result;
++
++              wdata.args.count = tot_bytes;
++              wdata.args.offset = save_offset;
++
++              lock_kernel();
++              result = NFS_PROTO(inode)->commit(&wdata);
++              unlock_kernel();
++
++              if (result < 0)
++                      goto sync_retry;
++              if (memcmp(&first_verf.verifier, &wdata.verf.verifier,
++                                                              VERF_SIZE))
++                      goto sync_retry;
+       }
+       return tot_bytes;
++
++sync_retry:
++      wdata.args.stable = NFS_FILE_SYNC;
++      file_offset = save_offset;
++      count = save_count;
++      goto retry;
+ }
+ /**
+- * do_nfs_direct_IO - Read or write data without caching
+- * @inode: inode of target file
+- * @cred: credentials of user who requested I/O
++ * nfs_direct_write - For each iov segment, map the user's buffer
++ *                    then generate write and commit RPCs.
++ * @inode: target inode
++ * @cred: user's credential
+  * @iov: array of vectors that define I/O buffer
+- * offset: where in file to begin the read
++ * file_offset: offset in file to begin the operation
+  * nr_segs: size of iovec array
+  *
+- * Break the passed-in iovec into a series of page-sized or smaller
+- * requests, where each page is mapped for direct user-land I/O.
+- *
+- * For each of these pages, create an NFS page request and
+- * append it to an automatic list of page requests.
+- *
+- * When all page requests have been queued, start the I/O on the
+- * whole list.  The underlying routines coalesce the pages on the
+- * list into a bunch of asynchronous "r/wsize" network requests.
+- *
+- * I/O completion automatically unmaps and releases the pages.
++ * Upon return, generic_file_direct_IO invalidates any cached pages
++ * that non-direct readers might access, so they will pick up these
++ * writes immediately.
+  */
+ static int
+-do_nfs_direct_IO(int rw, const struct inode *inode,
+-              const struct rpc_cred *cred, const struct iovec *iov,
+-              loff_t offset, unsigned long nr_segs)
++nfs_direct_write(struct inode *inode, struct rpc_cred *cred,
++              const struct iovec *iov, loff_t file_offset,
++              unsigned long nr_segs)
+ {
+-      LIST_HEAD(requests);
+-      int result, tot_bytes;
++      int tot_bytes = 0;
++      unsigned long seg = 0;
+-      result = nfs_iov2pagelist(rw, inode, cred, iov, offset, nr_segs,
+-                                                              &requests);
+-      if (result < 0)
+-              return result;
+-      tot_bytes = result;
++      while ((seg < nr_segs) && (tot_bytes >= 0)) {
++              int result, page_count;
++              struct page **pages;
++              const struct iovec *vec = &iov[seg++];
++              unsigned long user_addr = (unsigned long) vec->iov_base;
++              size_t size = vec->iov_len;
++
++                page_count = nfs_get_user_pages(WRITE, user_addr, size, &pages);
++                if (page_count < 0) {
++                        nfs_free_user_pages(pages);
++                        return page_count;
++                }
+-      switch (rw) {
+-      case READ:
+-              if (IS_SYNC(inode) || (NFS_SERVER(inode)->rsize < PAGE_SIZE)) {
+-                      result = nfs_direct_read_sync(inode, cred, iov, offset, nr_segs);
+-                      break;
++              result = nfs_direct_write_seg(inode, cred, user_addr, size,
++                              file_offset, pages, page_count);
++              if (result < 0)
++                      tot_bytes = result;
++              else {
++                      tot_bytes += result;
++                      file_offset += result;
+               }
+-              result = nfs_pagein_list(&requests, NFS_SERVER(inode)->rpages);
+-              nfs_wait_for_reads(&requests);
+-              break;
+-      case WRITE:
+-              if (IS_SYNC(inode) || (NFS_SERVER(inode)->wsize < PAGE_SIZE))
+-                      result = nfs_direct_write_sync(inode, cred, iov, offset, nr_segs);
+-              else
+-                      result = nfs_flush_list(&requests,
+-                                      NFS_SERVER(inode)->wpages, FLUSH_WAIT);
+-              /* invalidate cache so non-direct readers pick up changes */
+-              invalidate_inode_pages((struct inode *) inode);
+-              break;
+-      default:
+-              result = -EINVAL;
+-              break;
++              nfs_free_user_pages(pages);
+       }
+-      if (result < 0)
+-              return result;
+       return tot_bytes;
+ }
+ /**
+  * nfs_direct_IO - NFS address space operation for direct I/O
+  * rw: direction (read or write)
+- * @file: file struct of target file
++ * @iocb: target I/O control block
+  * @iov: array of vectors that define I/O buffer
+- * offset: offset in file to begin the operation
++ * file_offset: offset in file to begin the operation
+  * nr_segs: size of iovec array
+  *
++ * Usually a file system implements direct I/O by calling out to
++ * blockdev_direct_IO.  The NFS client doesn't have a backing block
++ * device, so we do everything by hand instead.
++ *
+  * The inode's i_sem is no longer held by the VFS layer before it calls
+  * this function to do a write.
+  */
+ int
+ nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
+-              loff_t offset, unsigned long nr_segs)
++              loff_t file_offset, unsigned long nr_segs)
+ {
+-      /* None of this works yet, so prevent it from compiling. */
+-#if 0
+-      int result;
++      int result = -EINVAL;
++      struct file *file = iocb->ki_filp;
+       struct dentry *dentry = file->f_dentry;
+-      const struct inode *inode = dentry->d_inode->i_mapping->host;
+-      const struct rpc_cred *cred = nfs_file_cred(file);
+-#endif
+-
+-      dfprintk(VFS, "NFS: direct_IO(%s) (%s/%s) off/no(%Lu/%lu)\n",
+-                              ((rw == READ) ? "READ" : "WRITE"),
+-                              dentry->d_parent->d_name.name,
+-                              dentry->d_name.name, offset, nr_segs);
++      struct inode *inode = dentry->d_inode;
++      struct rpc_cred *cred;
++
++      /*
++       * No support for async yet
++       */
++      if (!is_sync_kiocb(iocb))
++              goto out;
++
++      cred = get_rpccred(nfs_file_cred(file));
++      if (!cred)
++              cred = get_rpccred(NFS_I(inode)->mm_cred);
++
++      switch (rw) {
++      case READ:
++              dprintk("NFS: direct_IO(read) (%s) off/no(%Lu/%lu)\n",
++                              dentry->d_name.name, file_offset, nr_segs);
++
++              result = nfs_direct_read(inode, cred, iov,
++                                              file_offset, nr_segs);
++              break;
++      case WRITE:
++              dprintk("NFS: direct_IO(write) (%s) off/no(%Lu/%lu)\n",
++                              dentry->d_name.name, file_offset, nr_segs);
+-      result = do_nfs_direct_IO(rw, inode, cred, iov, offset, nr_segs);
++              result = nfs_direct_write(inode, cred, iov,
++                                              file_offset, nr_segs);
++              break;
++      default:
++              break;
++      }
+-      dfprintk(VFS, "NFS: direct_IO result = %d\n", result);
++      if (cred)
++              put_rpccred(cred);
++out:
++      dprintk("NFS: direct_IO result=%d\n", result);
+       return result;
+ }
+--- linux-2.6.0-test1/fs/nfsd/nfssvc.c 2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/nfsd/nfssvc.c        2003-07-19 17:03:50.000000000 -0700
+@@ -116,9 +116,12 @@ nfsd_svc(unsigned short port, int nrserv
+       nrservs -= (nfsd_serv->sv_nrthreads-1);
+       while (nrservs > 0) {
+               nrservs--;
++              __module_get(THIS_MODULE);
+               error = svc_create_thread(nfsd, nfsd_serv);
+-              if (error < 0)
++              if (error < 0) {
++                      module_put(THIS_MODULE);
+                       break;
++              }
+       }
+       victim = nfsd_list.next;
+       while (nrservs < 0 && victim != &nfsd_list) {
+@@ -175,7 +178,6 @@ nfsd(struct svc_rqst *rqstp)
+       sigset_t shutdown_mask, allowed_mask;
+       /* Lock module and set up kernel thread */
+-      MOD_INC_USE_COUNT;
+       lock_kernel();
+       daemonize("nfsd");
+       current->rlim[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
+@@ -281,7 +283,7 @@ out:
+       svc_exit_thread(rqstp);
+       /* Release module */
+-      MOD_DEC_USE_COUNT;
++      module_put_and_exit(0);
+ }
+ int
+--- linux-2.6.0-test1/fs/nfs/inode.c   2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/nfs/inode.c  2003-07-19 17:03:50.000000000 -0700
+@@ -151,15 +151,16 @@ void
+ nfs_put_super(struct super_block *sb)
+ {
+       struct nfs_server *server = NFS_SB(sb);
+-      struct rpc_clnt *rpc;
+ #ifdef CONFIG_NFS_V4
+       if (server->idmap != NULL)
+               nfs_idmap_delete(server);
+ #endif /* CONFIG_NFS_V4 */
+-      if ((rpc = server->client) != NULL)
+-              rpc_shutdown_client(rpc);
++      if (server->client != NULL)
++              rpc_shutdown_client(server->client);
++      if (server->client_sys != NULL)
++              rpc_shutdown_client(server->client_sys);
+       if (!(server->flags & NFS_MOUNT_NONLM))
+               lockd_down();   /* release rpc.lockd */
+@@ -226,27 +227,57 @@ nfs_block_size(unsigned long bsize, unsi
+ /*
+  * Obtain the root inode of the file system.
+  */
+-static struct inode *
+-nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh)
++static int
++nfs_get_root(struct inode **rooti, rpc_authflavor_t authflavor, struct super_block *sb, struct nfs_fh *rootfh)
+ {
+       struct nfs_server       *server = NFS_SB(sb);
+-      struct nfs_fattr        fattr;
+-      struct inode            *inode;
++      struct nfs_fattr        fattr = { };
+       int                     error;
+-      if ((error = server->rpc_ops->getroot(server, rootfh, &fattr)) < 0) {
++      error = server->rpc_ops->getroot(server, rootfh, &fattr);
++      if (error == -EACCES && authflavor > RPC_AUTH_MAXFLAVOR) {
++              /*
++               * Some authentication types (gss/krb5, most notably)
++               * are such that root won't be able to present a
++               * credential for GETATTR (ie, getroot()).
++               *
++               * We still want the mount to succeed.
++               * 
++               * So we fake the attr values and mark the inode as such.
++               * On the first succesful traversal, we fix everything.
++               * The auth type test isn't quite correct, but whatever.
++               */
++              dfprintk(VFS, "NFS: faking root inode\n");
++
++              fattr.fileid = 1;
++              fattr.nlink = 2;        /* minimum for a dir */
++              fattr.type = NFDIR;
++              fattr.mode = S_IFDIR|S_IRUGO|S_IXUGO;
++              fattr.size = 4096;
++              fattr.du.nfs3.used = 1;
++              fattr.valid = NFS_ATTR_FATTR|NFS_ATTR_FATTR_V3;
++      } else if (error < 0) {
+               printk(KERN_NOTICE "nfs_get_root: getattr error = %d\n", -error);
+-              return NULL;
++              *rooti = NULL;  /* superfluous ... but safe */
++              return error;
+       }
+-      inode = __nfs_fhget(sb, rootfh, &fattr);
+-      return inode;
++      *rooti = __nfs_fhget(sb, rootfh, &fattr);
++      if (error == -EACCES && authflavor > RPC_AUTH_MAXFLAVOR) {
++              if (*rooti) {
++                      NFS_FLAGS(*rooti) |= NFS_INO_FAKE_ROOT;
++                      NFS_CACHEINV((*rooti));
++                      error = 0;
++              }
++      }
++      return error;
+ }
+ /*
+  * Do NFS version-independent mount processing, and sanity checking
+  */
+-int nfs_sb_init(struct super_block *sb)
++static int
++nfs_sb_init(struct super_block *sb, rpc_authflavor_t authflavor)
+ {
+       struct nfs_server       *server;
+       struct inode            *root_inode = NULL;
+@@ -267,8 +298,7 @@ int nfs_sb_init(struct super_block *sb)
+       sb->s_op         = &nfs_sops;
+       /* Did getting the root inode fail? */
+-      root_inode = nfs_get_root(sb, &server->fh);
+-      if (!root_inode)
++      if (nfs_get_root(&root_inode, authflavor, sb, &server->fh) < 0)
+               goto out_no_root;
+       sb->s_root = d_alloc_root(root_inode);
+       if (!sb->s_root)
+@@ -346,19 +376,66 @@ out_no_root:
+ }
+ /*
++ * Create an RPC client handle.
++ */
++static struct rpc_clnt *
++nfs_create_client(struct nfs_server *server, const struct nfs_mount_data *data)
++{
++      struct rpc_timeout      timeparms;
++      struct rpc_xprt         *xprt = NULL;
++      struct rpc_clnt         *clnt = NULL;
++      int                     tcp   = (data->flags & NFS_MOUNT_TCP);
++
++      /* Initialize timeout values */
++      timeparms.to_initval = data->timeo * HZ / 10;
++      timeparms.to_retries = data->retrans;
++      timeparms.to_maxval  = tcp ? RPC_MAX_TCP_TIMEOUT : RPC_MAX_UDP_TIMEOUT;
++      timeparms.to_exponential = 1;
++
++      if (!timeparms.to_initval)
++              timeparms.to_initval = (tcp ? 600 : 11) * HZ / 10;
++      if (!timeparms.to_retries)
++              timeparms.to_retries = 5;
++
++      /* create transport and client */
++      xprt = xprt_create_proto(tcp ? IPPROTO_TCP : IPPROTO_UDP,
++                               &server->addr, &timeparms);
++      if (xprt == NULL) {
++              printk(KERN_WARNING "NFS: cannot create RPC transport.\n");
++              goto out_fail;
++      }
++      clnt = rpc_create_client(xprt, server->hostname, &nfs_program,
++                               server->rpc_ops->version, data->pseudoflavor);
++      if (clnt == NULL) {
++              printk(KERN_WARNING "NFS: cannot create RPC client.\n");
++              goto out_fail;
++      }
++
++      clnt->cl_intr     = (server->flags & NFS_MOUNT_INTR) ? 1 : 0;
++      clnt->cl_softrtry = (server->flags & NFS_MOUNT_SOFT) ? 1 : 0;
++      clnt->cl_droppriv = (server->flags & NFS_MOUNT_BROKEN_SUID) ? 1 : 0;
++      clnt->cl_chatty   = 1;
++
++      return clnt;
++
++out_fail:
++      if (xprt)
++              xprt_destroy(xprt);
++      return NULL;
++}
++
++/*
+  * The way this works is that the mount process passes a structure
+  * in the data argument which contains the server's IP address
+  * and the root file handle obtained from the server's mount
+  * daemon. We stash these away in the private superblock fields.
+  */
+-int nfs_fill_super(struct super_block *sb, struct nfs_mount_data *data, int silent)
++static int
++nfs_fill_super(struct super_block *sb, struct nfs_mount_data *data, int silent)
+ {
+       struct nfs_server       *server;
+-      struct rpc_xprt         *xprt = NULL;
+-      struct rpc_clnt         *clnt = NULL;
+-      struct rpc_timeout      timeparms;
+-      int                     tcp, err = -EIO;
+-      u32                     authflavor;
++      int                     err = -EIO;
++      rpc_authflavor_t        authflavor;
+       server           = NFS_SB(sb);
+       sb->s_blocksize_bits = 0;
+@@ -400,46 +477,20 @@ int nfs_fill_super(struct super_block *s
+               server->rpc_ops = &nfs_v2_clientops;
+       }
+-      /* Which protocol do we use? */
+-      tcp   = (data->flags & NFS_MOUNT_TCP);
+-
+-      /* Initialize timeout values */
+-      timeparms.to_initval = data->timeo * HZ / 10;
+-      timeparms.to_retries = data->retrans;
+-      timeparms.to_maxval  = tcp? RPC_MAX_TCP_TIMEOUT : RPC_MAX_UDP_TIMEOUT;
+-      timeparms.to_exponential = 1;
+-
+-      if (!timeparms.to_initval)
+-              timeparms.to_initval = (tcp ? 600 : 11) * HZ / 10;
+-      if (!timeparms.to_retries)
+-              timeparms.to_retries = 5;
+-
+-      /* Now create transport and client */
+-      xprt = xprt_create_proto(tcp? IPPROTO_TCP : IPPROTO_UDP,
+-                                              &server->addr, &timeparms);
+-      if (xprt == NULL) {
+-              printk(KERN_WARNING "NFS: cannot create RPC transport.\n");
+-              goto out_fail;
+-      }
+-
+-      if (data->flags & NFS_MOUNT_SECFLAVOUR)
+-              authflavor = data->pseudoflavor;
+-      else
+-              authflavor = RPC_AUTH_UNIX;
+-
+-      clnt = rpc_create_client(xprt, server->hostname, &nfs_program,
+-                               server->rpc_ops->version, authflavor);
+-      if (clnt == NULL) {
+-              printk(KERN_WARNING "NFS: cannot create RPC client.\n");
+-              xprt_destroy(xprt);
++      /* Fill in pseudoflavor for mount version < 5 */
++      if (!(data->flags & NFS_MOUNT_SECFLAVOUR))
++              data->pseudoflavor = RPC_AUTH_UNIX;
++      authflavor = data->pseudoflavor;        /* save for sb_init() */
++      /* XXX maybe we want to add a server->pseudoflavor field */
++
++      /* Create RPC client handles */
++      server->client = nfs_create_client(server, data);
++      if (server->client == NULL)
+               goto out_fail;
+-      }
+-
+-      clnt->cl_intr     = (server->flags & NFS_MOUNT_INTR) ? 1 : 0;
+-      clnt->cl_softrtry = (server->flags & NFS_MOUNT_SOFT) ? 1 : 0;
+-      clnt->cl_droppriv = (server->flags & NFS_MOUNT_BROKEN_SUID) ? 1 : 0;
+-      clnt->cl_chatty   = 1;
+-      server->client    = clnt;
++      data->pseudoflavor = RPC_AUTH_UNIX;     /* RFC 2623, sec 2.3.2 */
++      server->client_sys = nfs_create_client(server, data);
++      if (server->client_sys == NULL)
++              goto out_shutdown;
+       /* Fire up rpciod if not yet running */
+       if (rpciod_up() != 0) {
+@@ -447,7 +498,7 @@ int nfs_fill_super(struct super_block *s
+               goto out_shutdown;
+       }
+-      err = nfs_sb_init(sb);
++      err = nfs_sb_init(sb, authflavor);
+       if (err != 0)
+               goto out_noinit;
+@@ -466,7 +517,10 @@ int nfs_fill_super(struct super_block *s
+ out_noinit:
+       rpciod_down();
+ out_shutdown:
+-      rpc_shutdown_client(server->client);
++      if (server->client)
++              rpc_shutdown_client(server->client);
++      if (server->client_sys)
++              rpc_shutdown_client(server->client_sys);
+ out_fail:
+       if (server->hostname)
+               kfree(server->hostname);
+@@ -904,6 +958,11 @@ __nfs_revalidate_inode(struct nfs_server
+               goto out_nowait;
+       if (NFS_STALE(inode) && inode != inode->i_sb->s_root->d_inode)
+               goto out_nowait;
++      if (NFS_FAKE_ROOT(inode)) {
++              dfprintk(VFS, "NFS: not revalidating fake root\n");
++              status = 0;
++              goto out_nowait;
++      }
+       while (NFS_REVALIDATING(inode)) {
+               status = nfs_wait_on_inode(inode, NFS_INO_REVALIDATING);
+@@ -1007,6 +1066,13 @@ __nfs_refresh_inode(struct inode *inode,
+                       inode->i_sb->s_id, inode->i_ino,
+                       atomic_read(&inode->i_count), fattr->valid);
++      /* First successful call after mount, fill real data. */
++      if (NFS_FAKE_ROOT(inode)) {
++              dfprintk(VFS, "NFS: updating fake root\n");
++              nfsi->fileid = fattr->fileid;
++              NFS_FLAGS(inode) &= ~NFS_INO_FAKE_ROOT;
++      }
++
+       if (nfsi->fileid != fattr->fileid) {
+               printk(KERN_ERR "nfs_refresh_inode: inode number mismatch\n"
+                      "expected (%s/0x%Lx), got (%s/0x%Lx)\n",
+@@ -1229,6 +1295,8 @@ static struct super_block *nfs_get_sb(st
+                       root->size = NFS2_FHSIZE;
+                       memcpy(root->data, data->old_root.data, NFS2_FHSIZE);
+               }
++              if (data->version < 5)
++                      data->flags &= ~NFS_MOUNT_SECFLAVOUR;
+       }
+       if (root->size > sizeof(root->data)) {
+@@ -1373,7 +1441,7 @@ static int nfs4_fill_super(struct super_
+       if ((server->idmap = nfs_idmap_new(server)) == NULL)
+               printk(KERN_WARNING "NFS: couldn't start IDmap\n");
+-      err = nfs_sb_init(sb);
++      err = nfs_sb_init(sb, authflavour);
+       if (err == 0)
+               return 0;
+       rpciod_down();
+--- linux-2.6.0-test1/fs/nfs/nfs3proc.c        2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/nfs3proc.c       2003-07-19 17:07:07.000000000 -0700
+@@ -225,81 +225,74 @@ nfs3_proc_readlink(struct inode *inode, 
+ }
+ static int
+-nfs3_proc_read(struct inode *inode, struct rpc_cred *cred,
+-             struct nfs_fattr *fattr, int flags,
+-             unsigned int base, unsigned int count, struct page *page,
+-             int *eofp)
+-{
+-      u64                     offset = page_offset(page) + base;
+-      struct nfs_readargs     arg = {
+-              .fh             = NFS_FH(inode),
+-              .offset         = offset,
+-              .count          = count,
+-              .pgbase         = base,
+-              .pages          = &page
+-      };
+-      struct nfs_readres      res = {
+-              .fattr          = fattr,
+-              .count          = count,
+-      };
++nfs3_proc_read(struct nfs_read_data *rdata)
++{
++      int                     flags = rdata->flags;
++      struct inode *          inode = rdata->inode;
++      struct nfs_fattr *      fattr = rdata->res.fattr;
+       struct rpc_message      msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_READ],
+-              .rpc_argp       = &arg,
+-              .rpc_resp       = &res,
+-              .rpc_cred       = cred
++              .rpc_argp       = &rdata->args,
++              .rpc_resp       = &rdata->res,
++              .rpc_cred       = rdata->cred,
+       };
+       int                     status;
+-      dprintk("NFS call  read %d @ %Ld\n", count, (long long)offset);
++      dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
++                      (long long) rdata->args.offset);
+       fattr->valid = 0;
+       status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags);
+       if (status >= 0)
+               nfs_refresh_inode(inode, fattr);
+       dprintk("NFS reply read: %d\n", status);
+-      *eofp = res.eof;
+       return status;
+ }
+ static int
+-nfs3_proc_write(struct inode *inode, struct rpc_cred *cred,
+-              struct nfs_fattr *fattr, int flags,
+-              unsigned int base, unsigned int count,
+-              struct page *page, struct nfs_writeverf *verf)
++nfs3_proc_write(struct nfs_write_data *wdata)
+ {
+-      u64                     offset = page_offset(page) + base;
+-      struct nfs_writeargs    arg = {
+-              .fh             = NFS_FH(inode),
+-              .offset         = offset,
+-              .count          = count,
+-              .stable         = NFS_FILE_SYNC,
+-              .pgbase         = base,
+-              .pages          = &page
+-      };
+-      struct nfs_writeres     res = {
+-              .fattr          = fattr,
+-              .verf           = verf,
+-      };
++      int                     rpcflags = wdata->flags;
++      struct inode *          inode = wdata->inode;
++      struct nfs_fattr *      fattr = wdata->res.fattr;
+       struct rpc_message      msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_WRITE],
+-              .rpc_argp       = &arg,
+-              .rpc_resp       = &res,
+-              .rpc_cred       = cred
++              .rpc_argp       = &wdata->args,
++              .rpc_resp       = &wdata->res,
++              .rpc_cred       = wdata->cred,
+       };
+-      int                     status, rpcflags = 0;
++      int                     status;
+-      dprintk("NFS call  write %d @ %Ld\n", count, (long long)offset);
++      dprintk("NFS call  write %d @ %Ld\n", wdata->args.count,
++                      (long long) wdata->args.offset);
+       fattr->valid = 0;
+-      if (flags & NFS_RW_SWAP)
+-              rpcflags |= NFS_RPC_SWAPFLAGS;
+-      arg.stable = (flags & NFS_RW_SYNC) ? NFS_FILE_SYNC : NFS_UNSTABLE;
+-
+       status = rpc_call_sync(NFS_CLIENT(inode), &msg, rpcflags);
+-
+       if (status >= 0)
+               nfs3_write_refresh_inode(inode, fattr);
++      dprintk("NFS reply write: %d\n", status);
++      return status < 0? status : wdata->res.count;
++}
+-      dprintk("NFS reply read: %d\n", status);
+-      return status < 0? status : res.count;
++static int
++nfs3_proc_commit(struct nfs_write_data *cdata)
++{
++      struct inode *          inode = cdata->inode;
++      struct nfs_fattr *      fattr = cdata->res.fattr;
++      struct rpc_message      msg = {
++              .rpc_proc       = &nfs3_procedures[NFS3PROC_COMMIT],
++              .rpc_argp       = &cdata->args,
++              .rpc_resp       = &cdata->res,
++              .rpc_cred       = cdata->cred,
++      };
++      int                     status;
++
++      dprintk("NFS call  commit %d @ %Ld\n", cdata->args.count,
++                      (long long) cdata->args.offset);
++      fattr->valid = 0;
++      status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
++      if (status >= 0)
++              nfs3_write_refresh_inode(inode, fattr);
++      dprintk("NFS reply commit: %d\n", status);
++      return status;
+ }
+ /*
+@@ -681,7 +674,7 @@ nfs3_proc_fsinfo(struct nfs_server *serv
+       dprintk("NFS call  fsinfo\n");
+       info->fattr->valid = 0;
+-      status = rpc_call(server->client, NFS3PROC_FSINFO, fhandle, info, 0);
++      status = rpc_call(server->client_sys, NFS3PROC_FSINFO, fhandle, info, 0);
+       dprintk("NFS reply fsinfo: %d\n", status);
+       return status;
+ }
+@@ -862,6 +855,7 @@ struct nfs_rpc_ops nfs_v3_clientops = {
+       .readlink       = nfs3_proc_readlink,
+       .read           = nfs3_proc_read,
+       .write          = nfs3_proc_write,
++      .commit         = nfs3_proc_commit,
+       .create         = nfs3_proc_create,
+       .remove         = nfs3_proc_remove,
+       .unlink_setup   = nfs3_proc_unlink_setup,
+--- linux-2.6.0-test1/fs/nfs/nfs3xdr.c 2003-06-14 12:18:51.000000000 -0700
++++ 25/fs/nfs/nfs3xdr.c        2003-07-19 17:03:50.000000000 -0700
+@@ -124,8 +124,6 @@ xdr_decode_fhandle(u32 *p, struct nfs_fh
+ /*
+  * Encode/decode time.
+- * Since the VFS doesn't care for fractional times, we ignore the
+- * nanosecond field.
+  */
+ static inline u32 *
+ xdr_encode_time3(u32 *p, struct timespec *timep)
+--- linux-2.6.0-test1/fs/nfs/nfs4proc.c        2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/nfs4proc.c       2003-07-19 17:07:07.000000000 -0700
+@@ -1012,45 +1012,36 @@ nfs4_proc_readlink(struct inode *inode, 
+ }
+ static int
+-nfs4_proc_read(struct inode *inode, struct rpc_cred *cred,
+-             struct nfs_fattr *fattr, int flags,
+-             unsigned int base, unsigned int count,
+-             struct page *page, int *eofp)
++nfs4_proc_read(struct nfs_read_data *rdata)
+ {
++      int flags = rdata->flags;
++      struct inode *inode = rdata->inode;
++      struct nfs_fattr *fattr = rdata->res.fattr;
++      nfs4_stateid *stateid = &rdata->args.stateid;
+       struct nfs_server *server = NFS_SERVER(inode);
+       struct nfs4_shareowner  *sp;
+-      uint64_t offset = page_offset(page) + base;
+-      struct nfs_readargs arg = {
+-              .fh             = NFS_FH(inode),
+-              .offset         = offset,
+-              .count          = count,
+-              .pgbase         = base,
+-              .pages          = &page,
+-      };
+-      struct nfs_readres res = {
+-              .fattr          = fattr,
+-              .count          = count,
+-      };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_READ],
+-              .rpc_argp       = &arg,
+-              .rpc_resp       = &res,
+-              .rpc_cred       = cred,
++              .rpc_argp       = &rdata->args,
++              .rpc_resp       = &rdata->res,
++              .rpc_cred       = rdata->cred,
+       };
+       unsigned long timestamp = jiffies;
+       int status;
+-      dprintk("NFS call  read %d @ %Ld\n", count, (long long)offset);
++      dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
++                      (long long) rdata->args.offset);
++
+       /*
+-      * Try first to use O_RDONLY, then O_RDWR stateid.
+-      */
++       * Try first to use O_RDONLY, then O_RDWR stateid.
++       */
+       sp = nfs4_get_inode_share(inode, O_RDONLY);
+       if (!sp)
+               sp = nfs4_get_inode_share(inode, O_RDWR);
+       if (sp)
+-              memcpy(arg.stateid,sp->so_stateid, sizeof(nfs4_stateid));
++              memcpy(stateid, sp->so_stateid, sizeof(nfs4_stateid));
+       else
+-              memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid));
++              memcpy(stateid, zero_stateid, sizeof(nfs4_stateid));
+       fattr->valid = 0;
+       status = rpc_call_sync(server->client, &msg, flags);
+@@ -1061,56 +1052,82 @@ nfs4_proc_read(struct inode *inode, stru
+                       nfs_zap_caches(inode);
+       }
+       dprintk("NFS reply read: %d\n", status);
+-      *eofp = res.eof;
+       return status;
+ }
+ static int
+-nfs4_proc_write(struct inode *inode, struct rpc_cred *cred,
+-              struct nfs_fattr *fattr, int flags,
+-              unsigned int base, unsigned int count,
+-              struct page *page, struct nfs_writeverf *verf)
++nfs4_proc_write(struct nfs_write_data *wdata)
+ {
++      int rpcflags = wdata->flags;
++      struct inode *inode = wdata->inode;
++      struct nfs_fattr *fattr = wdata->res.fattr;
++      nfs4_stateid *stateid = &wdata->args.stateid;
+       struct nfs_server *server = NFS_SERVER(inode);
+-      struct nfs4_shareowner  *sp;
+-      uint64_t offset = page_offset(page) + base;
+-      struct nfs_writeargs arg = {
+-              .fh             = NFS_FH(inode),
+-              .offset         = offset,
+-              .count          = count,
+-              .stable         = (flags & NFS_RW_SYNC) ? NFS_FILE_SYNC : NFS_UNSTABLE,
+-              .pgbase         = base,
+-              .pages          = &page,
+-      };
+-      struct nfs_writeres res = {
+-              .fattr          = fattr,
+-              .count          = count,
+-              .verf           = verf,
+-      };
++      struct nfs4_shareowner *sp;
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_WRITE],
+-              .rpc_argp       = &arg,
+-              .rpc_resp       = &res,
+-              .rpc_cred       = cred,
++              .rpc_argp       = &wdata->args,
++              .rpc_resp       = &wdata->res,
++              .rpc_cred       = wdata->cred,
++      };
++      int status;
++
++      dprintk("NFS call  write %d @ %Ld\n", wdata->args.count,
++                      (long long) wdata->args.offset);
++
++      /*
++       * Try first to use O_WRONLY, then O_RDWR stateid.
++       */
++      sp = nfs4_get_inode_share(inode, O_WRONLY);
++      if (!sp)
++              sp = nfs4_get_inode_share(inode, O_RDWR);
++
++      if (sp)
++              memcpy(stateid, sp->so_stateid, sizeof(nfs4_stateid));
++      else
++              memcpy(stateid, zero_stateid, sizeof(nfs4_stateid));
++
++      fattr->valid = 0;
++      status = rpc_call_sync(server->client, &msg, rpcflags);
++      dprintk("NFS reply write: %d\n", status);
++      return status;
++}
++
++static int
++nfs4_proc_commit(struct nfs_write_data *cdata)
++{
++      struct inode *inode = cdata->inode;
++      struct nfs_fattr *fattr = cdata->res.fattr;
++      nfs4_stateid *stateid = &cdata->args.stateid;
++      struct nfs_server *server = NFS_SERVER(inode);
++      struct nfs4_shareowner *sp;
++      struct rpc_message msg = {
++              .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
++              .rpc_argp       = &cdata->args,
++              .rpc_resp       = &cdata->res,
++              .rpc_cred       = cdata->cred,
+       };
+-      int                     rpcflags = (flags & NFS_RW_SWAP) ? NFS_RPC_SWAPFLAGS : 0;
++      int status;
+-      dprintk("NFS call  write %d @ %Ld\n", count, (long long)offset);
++      dprintk("NFS call  commit %d @ %Ld\n", cdata->args.count,
++                      (long long) cdata->args.offset);
+       /*
+-      * Try first to use O_WRONLY, then O_RDWR stateid.
+-      */
++       * Try first to use O_WRONLY, then O_RDWR stateid.
++       */
+       sp = nfs4_get_inode_share(inode, O_WRONLY);
+       if (!sp)
+               sp = nfs4_get_inode_share(inode, O_RDWR);
+       if (sp)
+-              memcpy(arg.stateid,sp->so_stateid, sizeof(nfs4_stateid));
++              memcpy(stateid, sp->so_stateid, sizeof(nfs4_stateid));
+       else
+-              memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid));
++              memcpy(stateid, zero_stateid, sizeof(nfs4_stateid));
+       fattr->valid = 0;
+-      return rpc_call_sync(server->client, &msg, rpcflags);
++      status = rpc_call_sync(server->client, &msg, 0);
++      dprintk("NFS reply commit: %d\n", status);
++      return status;
+ }
+ /*
+@@ -1752,7 +1769,7 @@ struct nfs_rpc_ops       nfs_v4_clientops = {
+       .readlink       = nfs4_proc_readlink,
+       .read           = nfs4_proc_read,
+       .write          = nfs4_proc_write,
+-      .commit         = NULL,
++      .commit         = nfs4_proc_commit,
+       .create         = nfs4_proc_create,
+       .remove         = nfs4_proc_remove,
+       .unlink_setup   = nfs4_proc_unlink_setup,
+--- linux-2.6.0-test1/fs/nfs/pagelist.c        2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/pagelist.c       2003-07-19 17:07:05.000000000 -0700
+@@ -154,26 +154,6 @@ nfs_release_request(struct nfs_page *req
+ }
+ /**
+- * nfs_release_list - cleanly dispose of an unattached list of page requests
+- * @list: list of doomed page requests
+- */
+-void
+-nfs_release_list(struct list_head *list)
+-{
+-      while (!list_empty(list)) {
+-              struct nfs_page *req = nfs_list_entry(list);
+-
+-              nfs_list_remove_request(req);
+-
+-              page_cache_release(req->wb_page);
+-
+-              /* Release struct file or cached credential */
+-              nfs_clear_request(req);
+-              nfs_page_free(req);
+-      }
+-}
+-
+-/**
+  * nfs_list_add_request - Insert a request into a sorted list
+  * @req: request
+  * @head: head of list into which to insert the request.
+@@ -222,37 +202,6 @@ nfs_wait_on_request(struct nfs_page *req
+ }
+ /**
+- * nfs_wait_for_reads - wait for outstanding requests to complete
+- * @head: list of page requests to wait for
+- */
+-int
+-nfs_wait_for_reads(struct list_head *head)
+-{
+-      struct list_head *p = head->next;
+-      unsigned int res = 0;
+-
+-      while (p != head) {
+-              struct nfs_page *req = nfs_list_entry(p);
+-              int error;
+-
+-              if (!NFS_WBACK_BUSY(req))
+-                      continue;
+-
+-              req->wb_count++;
+-              error = nfs_wait_on_request(req);
+-              if (error < 0)
+-                      return error;
+-              nfs_list_remove_request(req);
+-              nfs_clear_request(req);
+-              nfs_page_free(req);
+-
+-              p = head->next;
+-              res++;
+-      }
+-      return res;
+-}
+-
+-/**
+  * nfs_coalesce_requests - Split coalesced requests out from a list.
+  * @head: source list
+  * @dst: destination list
+--- linux-2.6.0-test1/fs/nfs/proc.c    2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/proc.c   2003-07-19 17:07:07.000000000 -0700
+@@ -149,82 +149,62 @@ nfs_proc_readlink(struct inode *inode, s
+ }
+ static int
+-nfs_proc_read(struct inode *inode, struct rpc_cred *cred,
+-            struct nfs_fattr *fattr, int flags,
+-            unsigned int base, unsigned int count, struct page *page,
+-            int *eofp)
+-{
+-      u64                     offset = page_offset(page) + base;
+-      struct nfs_readargs     arg = {
+-              .fh             = NFS_FH(inode),
+-              .offset         = offset,
+-              .count          = count,
+-              .pgbase         = base,
+-              .pages          = &page
+-      };
+-      struct nfs_readres      res = {
+-              .fattr          = fattr,
+-              .count          = count
+-      };
++nfs_proc_read(struct nfs_read_data *rdata)
++{
++      int                     flags = rdata->flags;
++      struct inode *          inode = rdata->inode;
++      struct nfs_fattr *      fattr = rdata->res.fattr;
+       struct rpc_message      msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_READ],
+-              .rpc_argp       = &arg,
+-              .rpc_resp       = &res,
+-              .rpc_cred       = cred
++              .rpc_argp       = &rdata->args,
++              .rpc_resp       = &rdata->res,
++              .rpc_cred       = rdata->cred,
+       };
+       int                     status;
+-      dprintk("NFS call  read %d @ %Ld\n", count, (long long)offset);
++      dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
++                      (long long) rdata->args.offset);
+       fattr->valid = 0;
+       status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags);
+-
+-      if (status >= 0)
++      if (status >= 0) {
+               nfs_refresh_inode(inode, fattr);
++              /* NFSv2 reads don't return an eof flag, so we make
++               * up a value here.  XDR has already set eof to 0. */
++              if (status < rdata->args.count)
++                      rdata->res.eof = 1;
++      }
+       dprintk("NFS reply read: %d\n", status);
+-      *eofp = res.eof;
+       return status;
+ }
+ static int
+-nfs_proc_write(struct inode *inode, struct rpc_cred *cred,
+-             struct nfs_fattr *fattr, int how,
+-             unsigned int base, unsigned int count,
+-             struct page *page, struct nfs_writeverf *verf)
++nfs_proc_write(struct nfs_write_data *wdata)
+ {
+-      u64                     offset = page_offset(page) + base;
+-      struct nfs_writeargs    arg = {
+-              .fh             = NFS_FH(inode),
+-              .offset         = offset,
+-              .count          = count,
+-              .stable         = NFS_FILE_SYNC,
+-              .pgbase         = base,
+-              .pages          = &page
+-      };
+-      struct nfs_writeres     res = {
+-              .fattr          = fattr,
+-              .verf           = verf,
+-              .count          = count
+-      };
++      int                     flags = wdata->flags;
++      struct inode *          inode = wdata->inode;
++      struct nfs_fattr *      fattr = wdata->res.fattr;
+       struct rpc_message      msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_WRITE],
+-              .rpc_argp       = &arg,
+-              .rpc_resp       = &res,
+-              .rpc_cred       = cred
++              .rpc_argp       = &wdata->args,
++              .rpc_resp       = &wdata->res,
++              .rpc_cred       = wdata->cred
+       };
+-      int                     status, flags = 0;
++      int                     status;
+-      dprintk("NFS call  write %d @ %Ld\n", count, (long long)offset);
++      dprintk("NFS call  write %d @ %Ld\n", wdata->args.count,
++                      (long long) wdata->args.offset);
+       fattr->valid = 0;
+-      if (how & NFS_RW_SWAP)
+-              flags |= NFS_RPC_SWAPFLAGS;
+       status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags);
+-
+-      if (status >= 0)
++      if (status >= 0) {
+               nfs_write_refresh_inode(inode, fattr);
+-
++              /* NFSv2 writes don't return a byte count or write
++               * verifier, so we make up values here.  Note that
++               * v2 writes are always NFS_FILE_SYNC writes. */
++              wdata->res.count = wdata->args.count;
++              wdata->verf.committed = NFS_FILE_SYNC;
++      }
+       dprintk("NFS reply write: %d\n", status);
+-      verf->committed = NFS_FILE_SYNC;      /* NFSv2 always syncs data */
+-      return status < 0? status : count;
++      return status < 0? status : wdata->res.count;
+ }
+ static int
+--- linux-2.6.0-test1/fs/nfs/read.c    2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/nfs/read.c   2003-07-19 17:07:06.000000000 -0700
+@@ -69,19 +69,28 @@ void nfs_readdata_release(struct rpc_tas
+ static int
+ nfs_readpage_sync(struct file *file, struct inode *inode, struct page *page)
+ {
+-      struct rpc_cred *cred = NULL;
+-      struct nfs_fattr fattr;
+-      unsigned int    offset = 0;
+       unsigned int    rsize = NFS_SERVER(inode)->rsize;
+       unsigned int    count = PAGE_CACHE_SIZE;
+       int             result;
+-      int             flags = IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0;
+-      int             eof;
++      struct nfs_read_data    rdata = {
++              .flags          = (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0),
++              .cred           = NULL,
++              .inode          = inode,
++              .args           = {
++                      .fh             = NFS_FH(inode),
++                      .pages          = &page,
++                      .pgbase         = 0UL,
++                      .count          = rsize,
++              },
++              .res            = {
++                      .fattr          = &rdata.fattr,
++              }
++      };
+       dprintk("NFS: nfs_readpage_sync(%p)\n", page);
+       if (file)
+-              cred = nfs_file_cred(file);
++              rdata.cred = nfs_file_cred(file);
+       /*
+        * This works now because the socket layer never tries to DMA
+@@ -89,17 +98,19 @@ nfs_readpage_sync(struct file *file, str
+        */
+       do {
+               if (count < rsize)
+-                      rsize = count;
++                      rdata.args.count = count;
++              rdata.res.count = rdata.args.count;
++              rdata.args.offset = page_offset(page) + rdata.args.pgbase;
+               dprintk("NFS: nfs_proc_read(%s, (%s/%Ld), %Lu, %u)\n",
+                       NFS_SERVER(inode)->hostname,
+                       inode->i_sb->s_id,
+                       (long long)NFS_FILEID(inode),
+-                      (unsigned long long)offset, rsize);
++                      (unsigned long long)rdata.args.pgbase,
++                      rdata.args.count);
+               lock_kernel();
+-              result = NFS_PROTO(inode)->read(inode, cred, &fattr, flags,
+-                                              offset, rsize, page, &eof);
++              result = NFS_PROTO(inode)->read(&rdata);
+               unlock_kernel();
+               /*
+@@ -111,14 +122,15 @@ nfs_readpage_sync(struct file *file, str
+                               result = -EINVAL;
+                       goto io_error;
+               }
+-              count  -= result;
+-              offset += result;
+-              if (result < rsize)     /* NFSv2ism */
++              count -= result;
++              rdata.args.pgbase += result;
++
++              if (rdata.res.eof)
+                       break;
+       } while (count);
+       if (count)
+-              memclear_highpage_flush(page, offset, count);
++              memclear_highpage_flush(page, rdata.args.pgbase, count);
+       SetPageUptodate(page);
+       if (PageError(page))
+               ClearPageError(page);
+--- linux-2.6.0-test1/fs/nfs/write.c   2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/nfs/write.c  2003-07-19 17:07:07.000000000 -0700
+@@ -132,66 +132,73 @@ static int
+ nfs_writepage_sync(struct file *file, struct inode *inode, struct page *page,
+                  unsigned int offset, unsigned int count)
+ {
+-      struct rpc_cred *cred = NULL;
+-      loff_t          base;
+       unsigned int    wsize = NFS_SERVER(inode)->wsize;
+-      int             result, refresh = 0, written = 0, flags;
+-      u8              *buffer;
+-      struct nfs_fattr fattr;
+-      struct nfs_writeverf verf;
+-
++      int             result, written = 0;
++      int             swapfile = IS_SWAPFILE(inode);
++      struct nfs_write_data   wdata = {
++              .flags          = swapfile ? NFS_RPC_SWAPFLAGS : 0,
++              .cred           = NULL,
++              .inode          = inode,
++              .args           = {
++                      .fh             = NFS_FH(inode),
++                      .pages          = &page,
++                      .stable         = NFS_FILE_SYNC,
++                      .pgbase         = offset,
++                      .count          = wsize,
++              },
++              .res            = {
++                      .fattr          = &wdata.fattr,
++                      .verf           = &wdata.verf,
++              },
++      };
+       if (file)
+-              cred = get_rpccred(nfs_file_cred(file));
+-      if (!cred)
+-              cred = get_rpccred(NFS_I(inode)->mm_cred);
++              wdata.cred = get_rpccred(nfs_file_cred(file));
++      if (!wdata.cred)
++              wdata.cred = get_rpccred(NFS_I(inode)->mm_cred);
+       dprintk("NFS:      nfs_writepage_sync(%s/%Ld %d@%Ld)\n",
+               inode->i_sb->s_id,
+               (long long)NFS_FILEID(inode),
+               count, (long long)(page_offset(page) + offset));
+-      base = page_offset(page) + offset;
+-
+-      flags = ((IS_SWAPFILE(inode)) ? NFS_RW_SWAP : 0) | NFS_RW_SYNC;
+-
+       do {
+-              if (count < wsize && !IS_SWAPFILE(inode))
+-                      wsize = count;
++              if (count < wsize && !swapfile)
++                      wdata.args.count = count;
++              wdata.args.offset = page_offset(page) + wdata.args.pgbase;
+-              result = NFS_PROTO(inode)->write(inode, cred, &fattr, flags,
+-                                               offset, wsize, page, &verf);
++              result = NFS_PROTO(inode)->write(&wdata);
+               if (result < 0) {
+                       /* Must mark the page invalid after I/O error */
+                       ClearPageUptodate(page);
+                       goto io_error;
+               }
+-              if (result != wsize)
+-                      printk("NFS: short write, wsize=%u, result=%d\n",
+-                      wsize, result);
+-              refresh = 1;
+-              buffer  += wsize;
+-              base    += wsize;
+-              offset  += wsize;
+-              written += wsize;
+-              count   -= wsize;
++              if (result < wdata.args.count)
++                      printk(KERN_WARNING "NFS: short write, count=%u, result=%d\n",
++                                      wdata.args.count, result);
++
++              wdata.args.offset += result;
++              wdata.args.pgbase += result;
++              written += result;
++              count -= result;
++
+               /*
+                * If we've extended the file, update the inode
+                * now so we don't invalidate the cache.
+                */
+-              if (base > i_size_read(inode))
+-                      i_size_write(inode, base);
++              if (wdata.args.offset > i_size_read(inode))
++                      i_size_write(inode, wdata.args.offset);
+       } while (count);
+       if (PageError(page))
+               ClearPageError(page);
+ io_error:
+-      if (cred)
+-              put_rpccred(cred);
++      if (wdata.cred)
++              put_rpccred(wdata.cred);
+-      return written? written : result;
++      return written ? written : result;
+ }
+ static int
+--- linux-2.6.0-test1/fs/partitions/check.c    2003-06-22 12:04:44.000000000 -0700
++++ 25/fs/partitions/check.c   2003-07-19 17:03:50.000000000 -0700
+@@ -16,7 +16,6 @@
+ #include <linux/init.h>
+ #include <linux/module.h>
+ #include <linux/fs.h>
+-#include <linux/blk.h>
+ #include <linux/kmod.h>
+ #include <linux/ctype.h>
+ #include <linux/devfs_fs_kernel.h>
+@@ -348,6 +347,9 @@ void register_disk(struct gendisk *disk)
+               return;
+       }
++      /* always add handle for the whole disk */
++      devfs_add_partitioned(disk);
++
+       /* No such device (e.g., media were just removed) */
+       if (!get_capacity(disk))
+               return;
+@@ -356,7 +358,6 @@ void register_disk(struct gendisk *disk)
+       if (blkdev_get(bdev, FMODE_READ, 0, BDEV_RAW) < 0)
+               return;
+       state = check_partition(disk, bdev);
+-      devfs_add_partitioned(disk);
+       if (state) {
+               for (j = 1; j < state->limit; j++) {
+                       sector_t size = state->parts[j].size;
+--- linux-2.6.0-test1/fs/partitions/efi.h      2003-06-14 12:18:28.000000000 -0700
++++ 25/fs/partitions/efi.h     2003-07-19 17:03:50.000000000 -0700
+@@ -32,7 +32,6 @@
+ #include <linux/kernel.h>
+ #include <linux/major.h>
+ #include <linux/string.h>
+-#include <linux/blk.h>
+ #include <linux/efi.h>
+ #define MSDOS_MBR_SIGNATURE 0xaa55
+--- linux-2.6.0-test1/fs/partitions/nec98.c    2003-06-14 12:17:57.000000000 -0700
++++ 25/fs/partitions/nec98.c   2003-07-19 17:03:50.000000000 -0700
+@@ -8,7 +8,6 @@
+ #include <linux/fs.h>
+ #include <linux/genhd.h>
+ #include <linux/kernel.h>
+-#include <linux/blk.h>
+ #include <linux/hdreg.h>
+ #include "check.h"
+--- linux-2.6.0-test1/fs/proc/array.c  2003-06-26 22:07:25.000000000 -0700
++++ 25/fs/proc/array.c 2003-07-19 17:06:42.000000000 -0700
+@@ -300,7 +300,7 @@ int proc_pid_stat(struct task_struct *ta
+       task_lock(task);
+       mm = task->mm;
+       if(mm)
+-              atomic_inc(&mm->mm_users);
++              mm = mmgrab(mm);
+       if (task->tty) {
+               tty_pgrp = task->tty->pgrp;
+               tty_nr = task->tty->device;
+--- linux-2.6.0-test1/fs/proc/proc_misc.c      2003-07-10 18:50:32.000000000 -0700
++++ 25/fs/proc/proc_misc.c     2003-07-19 17:06:40.000000000 -0700
+@@ -274,6 +274,18 @@ static struct file_operations proc_cpuin
+       .release        = seq_release,
+ };
++extern struct seq_operations rcu_op;
++static int rcu_open(struct inode *inode, struct file *file)
++{
++      return seq_open(file, &rcu_op);
++}
++static struct file_operations proc_rcu_operations = {
++      .open           = rcu_open,
++      .read           = seq_read,
++      .llseek         = seq_lseek,
++      .release        = seq_release,
++};
++
+ extern struct seq_operations vmstat_op;
+ static int vmstat_open(struct inode *inode, struct file *file)
+ {
+@@ -388,10 +400,8 @@ static int kstat_read_proc(char *page, c
+               system += kstat_cpu(i).cpustat.system;
+               idle += kstat_cpu(i).cpustat.idle;
+               iowait += kstat_cpu(i).cpustat.iowait;
+-#if !defined(CONFIG_ARCH_S390)
+               for (j = 0 ; j < NR_IRQS ; j++)
+                       sum += kstat_cpu(i).irqs[j];
+-#endif
+       }
+       len = sprintf(page, "cpu  %u %u %u %u %u\n",
+@@ -412,7 +422,7 @@ static int kstat_read_proc(char *page, c
+       }
+       len += sprintf(page + len, "intr %u", sum);
+-#if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA)
++#if !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA)
+       for (i = 0 ; i < NR_IRQS ; i++)
+               len += sprintf(page + len, " %u", kstat_irqs(i));
+ #endif
+@@ -440,7 +450,6 @@ static int devices_read_proc(char *page,
+       return proc_calc_metrics(page, start, off, count, eof, len);
+ }
+-#if !defined(CONFIG_ARCH_S390)
+ extern int show_interrupts(struct seq_file *p, void *v);
+ static int interrupts_open(struct inode *inode, struct file *file)
+ {
+@@ -466,7 +475,6 @@ static struct file_operations proc_inter
+       .llseek         = seq_lseek,
+       .release        = single_release,
+ };
+-#endif
+ static int filesystems_read_proc(char *page, char **start, off_t off,
+                                int count, int *eof, void *data)
+@@ -536,7 +544,8 @@ static ssize_t read_profile(struct file 
+               buf++; p++; count--; read++;
+       }
+       pnt = (char *)prof_buffer + p - sizeof(unsigned int);
+-      copy_to_user(buf,(void *)pnt,count);
++      if (copy_to_user(buf,(void *)pnt,count))
++              return -EFAULT;
+       read += count;
+       *ppos += read;
+       return read;
+@@ -606,6 +615,36 @@ static void create_seq_entry(char *name,
+               entry->proc_fops = f;
+ }
++#ifdef CONFIG_LOCKMETER
++extern ssize_t get_lockmeter_info(char *, size_t, loff_t *);
++extern ssize_t put_lockmeter_info(const char *, size_t);
++extern int get_lockmeter_info_size(void);
++
++/*
++ * This function accesses lock metering information.
++ */
++static ssize_t read_lockmeter(struct file *file, char *buf,
++                            size_t count, loff_t *ppos)
++{
++      return get_lockmeter_info(buf, count, ppos);
++}
++
++/*
++ * Writing to /proc/lockmeter resets the counters
++ */
++static ssize_t write_lockmeter(struct file * file, const char * buf,
++                             size_t count, loff_t *ppos)
++{
++      return put_lockmeter_info(buf, count);
++}
++
++static struct file_operations proc_lockmeter_operations = {
++      NULL,           /* lseek */
++      read:           read_lockmeter,
++      write:          write_lockmeter,
++};
++#endif  /* CONFIG_LOCKMETER */
++
+ void __init proc_misc_init(void)
+ {
+       struct proc_dir_entry *entry;
+@@ -644,10 +683,9 @@ void __init proc_misc_init(void)
+       if (entry)
+               entry->proc_fops = &proc_kmsg_operations;
+       create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
++      create_seq_entry("rcu", 0, &proc_rcu_operations);
+       create_seq_entry("partitions", 0, &proc_partitions_operations);
+-#if !defined(CONFIG_ARCH_S390)
+       create_seq_entry("interrupts", 0, &proc_interrupts_operations);
+-#endif
+       create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations);
+       create_seq_entry("buddyinfo",S_IRUGO, &fragmentation_file_operations);
+       create_seq_entry("vmstat",S_IRUGO, &proc_vmstat_file_operations);
+@@ -673,6 +711,13 @@ void __init proc_misc_init(void)
+       if (entry)
+               entry->proc_fops = &proc_sysrq_trigger_operations;
+ #endif
++#ifdef CONFIG_LOCKMETER
++      entry = create_proc_entry("lockmeter", S_IWUSR | S_IRUGO, NULL);
++      if (entry) {
++              entry->proc_fops = &proc_lockmeter_operations;
++              entry->size = get_lockmeter_info_size();
++      }
++#endif
+ #ifdef CONFIG_PPC32
+       {
+               extern struct file_operations ppc_htab_operations;
+--- linux-2.6.0-test1/fs/stat.c        2003-07-13 21:44:35.000000000 -0700
++++ 25/fs/stat.c       2003-07-19 17:06:16.000000000 -0700
+@@ -123,6 +123,7 @@ static int cp_old_stat(struct kstat *sta
+       SET_OLDSTAT_UID(tmp, stat->uid);
+       SET_OLDSTAT_GID(tmp, stat->gid);
+       tmp.st_rdev = stat->rdev;
++      tmp.__pad_16bit = 0;  /* don't leak kernel stack data! */
+ #if BITS_PER_LONG == 32
+       if (stat->size > MAX_NON_LFS)
+               return -EOVERFLOW;
+--- linux-2.6.0-test1/fs/umsdos/ioctl.c        2003-06-14 12:17:57.000000000 -0700
++++ 25/fs/umsdos/ioctl.c       2003-07-19 17:03:50.000000000 -0700
+@@ -4,6 +4,10 @@
+  *  Written 1993 by Jacques Gelinas
+  *
+  *  Extended MS-DOS ioctl directory handling functions
++ *
++ *  Changes:
++ *  11/07/2003      Daniele Bellucci <bellucda@tiscali.it>
++ *                  - audit copy_to_user/put_user in umsdos_ioctl_fill.
+  */
+ #include <asm/uaccess.h>
+@@ -36,11 +40,12 @@ static int umsdos_ioctl_fill (
+       struct UMSDOS_DIR_ONCE *d = (struct UMSDOS_DIR_ONCE *) buf;
+       if (d->count == 0) {
+-              copy_to_user (d->ent->d_name, name, name_len);
+-              put_user ('\0', d->ent->d_name + name_len);
+-              put_user (name_len, &d->ent->d_reclen);
+-              put_user (ino, &d->ent->d_ino);
+-              put_user (offset, &d->ent->d_off);
++              if (copy_to_user (d->ent->d_name, name, name_len) ||
++                  put_user ('\0', d->ent->d_name + name_len) ||
++                  put_user (name_len, &d->ent->d_reclen) ||
++                  put_user (ino, &d->ent->d_ino) ||
++                  put_user (offset, &d->ent->d_off))
++                      return -EFAULT;
+               d->count = 1;
+               ret = 0;
+       }
+--- linux-2.6.0-test1/fs/vfat/namei.c  2003-07-10 18:50:32.000000000 -0700
++++ 25/fs/vfat/namei.c 2003-07-19 17:03:50.000000000 -0700
+@@ -375,7 +375,7 @@ shortname_info_to_lcase(struct shortname
+ }
+ static inline int to_shortname_char(struct nls_table *nls,
+-                                  char *buf, int buf_size, wchar_t *src,
++                                  unsigned char *buf, int buf_size, wchar_t *src,
+                                   struct shortname_info *info)
+ {
+       int len;
+--- linux-2.6.0-test1/include/acpi/acconfig.h  2003-06-22 12:04:44.000000000 -0700
++++ 25/include/acpi/acconfig.h 2003-07-19 17:03:50.000000000 -0700
+@@ -64,7 +64,7 @@
+ /* Version string */
+-#define ACPI_CA_VERSION                 0x20030619
++#define ACPI_CA_VERSION                 0x20030714
+ /* Maximum objects in the various object caches */
+--- linux-2.6.0-test1/include/acpi/platform/acenv.h    2003-06-14 12:18:03.000000000 -0700
++++ 25/include/acpi/platform/acenv.h   2003-07-19 17:03:50.000000000 -0700
+@@ -134,6 +134,9 @@
+ #elif defined(__FreeBSD__)
+ #include "acfreebsd.h"
++#elif defined(__NetBSD__)
++#include "acnetbsd.h"
++
+ #elif defined(MODESTO)
+ #include "acmodesto.h"
+@@ -187,13 +190,14 @@
+ #define DEBUGGER_SINGLE_THREADED    0
+ #define DEBUGGER_MULTI_THREADED     1
++#ifndef DEBUGGER_THREADING
+ #ifdef ACPI_APPLICATION
+ #define DEBUGGER_THREADING          DEBUGGER_SINGLE_THREADED
+ #else
+ #define DEBUGGER_THREADING          DEBUGGER_MULTI_THREADED
+ #endif
+-
++#endif /* !DEBUGGER_THREADING */
+ /******************************************************************************
+  *
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-alpha/lockmeter.h   2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,90 @@
++/*
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ *
++ *  Modified by Peter Rival (frival@zk3.dec.com)
++ */
++
++#ifndef _ALPHA_LOCKMETER_H
++#define _ALPHA_LOCKMETER_H
++
++#include <asm/hwrpb.h>
++#define CPU_CYCLE_FREQUENCY   hwrpb->cycle_freq
++
++#define get_cycles64()                get_cycles()
++
++#define THIS_CPU_NUMBER               smp_processor_id()
++
++#include <linux/version.h>
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
++#define local_irq_save(x) \
++      __save_and_cli(x)
++#define local_irq_restore(x) \
++      __restore_flags(x)
++#endif        /* Linux version 2.2.x */
++
++#define SPINLOCK_MAGIC_INIT /**/
++
++/*
++ * Macros to cache and retrieve an index value inside of a lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.
++ * We also assume that the hash table has less than 32767 entries.
++ * the high order bit is used for write locking a rw_lock
++ * Note: although these defines and macros are the same as what is being used
++ *       in include/asm-i386/lockmeter.h, they are present here to easily
++ *     allow an alternate Alpha implementation.
++ */
++/*
++ * instrumented spinlock structure -- never used to allocate storage
++ * only used in macros below to overlay a spinlock_t
++ */
++typedef struct inst_spinlock_s {
++      /* remember, Alpha is little endian */
++      unsigned short lock;
++      unsigned short index;
++} inst_spinlock_t;
++#define PUT_INDEX(lock_ptr,indexv)    ((inst_spinlock_t *)(lock_ptr))->index = indexv
++#define GET_INDEX(lock_ptr)           ((inst_spinlock_t *)(lock_ptr))->index
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++      volatile int lock;
++      unsigned short index;
++      unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv)        ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)               ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)   ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)                ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return true if rwlock is write locked
++ * (note that other lock attempts can cause the lock value to be negative)
++ */
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) (((inst_rwlock_t *)rwlock_ptr)->lock & 1)
++#define IABS(x) ((x) > 0 ? (x) : -(x))
++
++#define RWLOCK_READERS(rwlock_ptr)    rwlock_readers(rwlock_ptr)
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++      int tmp = (int) ((inst_rwlock_t *)rwlock_ptr)->lock;
++      /* readers subtract 2, so we have to:           */
++      /*      - andnot off a possible writer (bit 0)  */
++      /*      - get the absolute value                */
++      /*      - divide by 2 (right shift by one)      */
++      /* to find the number of readers                */
++      if (tmp == 0) return(0);
++      else return(IABS(tmp & ~1)>>1);
++}
++
++#endif /* _ALPHA_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-alpha/pgalloc.h      2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-alpha/pgalloc.h     2003-07-19 17:07:16.000000000 -0700
+@@ -24,9 +24,9 @@ pmd_populate_kernel(struct mm_struct *mm
+ }
+ static inline void
+-pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
++pgd_populate(struct mm_struct *mm, pgd_t *pgd, struct page *pmd)
+ {
+-      pgd_set(pgd, pmd);
++      pgd_set(pgd, page_address(pmd));
+ }
+ extern pgd_t *pgd_alloc(struct mm_struct *mm);
+@@ -37,19 +37,29 @@ pgd_free(pgd_t *pgd)
+       free_page((unsigned long)pgd);
+ }
+-static inline pmd_t *
++static inline struct page *
+ pmd_alloc_one(struct mm_struct *mm, unsigned long address)
+ {
+-      pmd_t *ret = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
+-      if (ret)
+-              clear_page(ret);
+-      return ret;
++      struct page *page = alloc_page(GFP_KERNEL|__GFP_REPEAT);
++      if (page)
++              clear_highpage(page);
++      return page;
++}
++
++static inline pmd_t *
++pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
++{
++      struct page *page = pmd_alloc_one(mm, addr);
++      if (page)
++              return page_address(page);
++      else
++              return NULL;
+ }
+ static inline void
+-pmd_free(pmd_t *pmd)
++pmd_free(struct page *pmd)
+ {
+-      free_page((unsigned long)pmd);
++      __free_page(pmd);
+ }
+ extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
+--- linux-2.6.0-test1/include/asm-alpha/pgtable.h      2003-06-14 12:18:06.000000000 -0700
++++ 25/include/asm-alpha/pgtable.h     2003-07-19 17:07:16.000000000 -0700
+@@ -229,9 +229,11 @@ pmd_page_kernel(pmd_t pmd)
+ #define pmd_page(pmd) (mem_map + ((pmd_val(pmd) & _PFN_MASK) >> 32))
+ #endif
+-extern inline unsigned long pgd_page(pgd_t pgd)
++extern inline unsigned long __pgd_page(pgd_t pgd)
+ { return PAGE_OFFSET + ((pgd_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT)); }
++#define pgd_page(pgd) virt_to_page(__pgd_page(pgd))
++
+ extern inline int pte_none(pte_t pte)         { return !pte_val(pte); }
+ extern inline int pte_present(pte_t pte)      { return pte_val(pte) & _PAGE_VALID; }
+ extern inline void pte_clear(pte_t *ptep)     { pte_val(*ptep) = 0; }
+@@ -280,9 +282,15 @@ extern inline pte_t pte_mkyoung(pte_t pt
+ /* Find an entry in the second-level page table.. */
+ extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
+ {
+-      return (pmd_t *) pgd_page(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1));
++      return (pmd_t *)__pgd_page(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1));
+ }
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
++
+ /* Find an entry in the third-level page table.. */
+ extern inline pte_t * pte_offset_kernel(pmd_t * dir, unsigned long address)
+ {
+--- linux-2.6.0-test1/include/asm-alpha/posix_types.h  2003-06-14 12:18:25.000000000 -0700
++++ 25/include/asm-alpha/posix_types.h 2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned int  __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned int  __kernel_ino_t;
+ typedef unsigned int  __kernel_mode_t;
+ typedef unsigned int  __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-alpha/smp.h  2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-alpha/smp.h 2003-07-19 17:04:07.000000000 -0700
+@@ -3,6 +3,7 @@
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/bitops.h>
+ #include <asm/pal.h>
+@@ -44,27 +45,12 @@ extern struct cpuinfo_alpha cpu_data[NR_
+ #define hard_smp_processor_id()       __hard_smp_processor_id()
+ #define smp_processor_id()    (current_thread_info()->cpu)
+-extern unsigned long cpu_present_mask;
+-extern volatile unsigned long cpu_online_map;
++extern cpumask_t cpu_present_mask;
++extern cpumask_t long cpu_online_map;
+ extern int smp_num_cpus;
+-#define cpu_possible(cpu)     (cpu_present_mask & (1UL << (cpu)))
+-#define cpu_online(cpu)               (cpu_online_map & (1UL << (cpu)))
+-
+-static inline int
+-num_online_cpus(void)
+-{
+-      return hweight64(cpu_online_map);
+-}
+-
+-extern inline int
+-any_online_cpu(unsigned int mask)
+-{
+-        if (mask & cpu_online_map)
+-                return __ffs(mask & cpu_online_map);
+-
+-        return -1;
+-}
++#define cpu_possible(cpu)     cpu_isset(cpu, cpu_present_mask)
++#define cpu_online(cpu)               cpu_isset(cpu, cpu_online_map)
+ extern int smp_call_function_on_cpu(void (*func) (void *info), void *info,int retry, int wait, unsigned long cpu);
+--- linux-2.6.0-test1/include/asm-alpha/spinlock.h     2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-alpha/spinlock.h    2003-07-19 17:06:40.000000000 -0700
+@@ -6,6 +6,10 @@
+ #include <linux/kernel.h>
+ #include <asm/current.h>
++#ifdef CONFIG_LOCKMETER
++#undef DEBUG_SPINLOCK
++#undef DEBUG_RWLOCK
++#endif
+ /*
+  * Simple spin lock operations.  There are two variants, one clears IRQ's
+@@ -95,9 +99,18 @@ static inline int _raw_spin_trylock(spin
+ typedef struct {
+       volatile int write_lock:1, read_counter:31;
++#ifdef CONFIG_LOCKMETER
++      /* required for LOCKMETER since all bits in lock are used */
++      /* need this storage for CPU and lock INDEX ............. */
++      unsigned magic;
++#endif
+ } /*__attribute__((aligned(32)))*/ rwlock_t;
++#ifdef CONFIG_LOCKMETER
++#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0 }
++#else
+ #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
++#endif
+ #define rwlock_init(x)        do { *(x) = RW_LOCK_UNLOCKED; } while(0)
+ #define rwlock_is_locked(x)   (*(volatile int *)(x) != 0)
+@@ -169,4 +182,41 @@ static inline void _raw_read_unlock(rwlo
+       : "m" (*lock) : "memory");
+ }
++#ifdef CONFIG_LOCKMETER
++static inline int _raw_write_trylock(rwlock_t *lock)
++{
++      long temp,result;
++
++      __asm__ __volatile__(
++      "       ldl_l %1,%0\n"
++      "       mov $31,%2\n"
++      "       bne %1,1f\n"
++      "       or $31,1,%2\n"
++      "       stl_c %2,%0\n"
++      "1:     mb\n"
++      : "=m" (*(volatile int *)lock), "=&r" (temp), "=&r" (result)
++      : "m" (*(volatile int *)lock)
++      );
++
++      return (result);
++}
++
++static inline int _raw_read_trylock(rwlock_t *lock)
++{
++      unsigned long temp,result;
++
++      __asm__ __volatile__(
++      "       ldl_l %1,%0\n"
++      "       mov $31,%2\n"
++      "       blbs %1,1f\n"
++      "       subl %1,2,%2\n"
++      "       stl_c %2,%0\n"
++      "1:     mb\n"
++      : "=m" (*(volatile int *)lock), "=&r" (temp), "=&r" (result)
++      : "m" (*(volatile int *)lock)
++      );
++      return (result);
++}
++#endif /* CONFIG_LOCKMETER */
++
+ #endif /* _ALPHA_SPINLOCK_H */
+--- linux-2.6.0-test1/include/asm-arm26/pgalloc.h      2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-arm26/pgalloc.h     2003-07-19 17:07:16.000000000 -0700
+@@ -55,7 +55,8 @@ pmd_populate_kernel(struct mm_struct *mm
+  * is thrown away. It just cant be zero. -IM
+  */
+-#define pmd_alloc_one(mm,addr)                ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,addr)                ((struct page *)2); BUG()
++#define pmd_alloc_one_kernel(mm,addr) ((pmd_t *)2); BUG()
+ #define pmd_free(pmd)                 do { } while (0)
+ #define pgd_populate(mm,pmd,pte)      BUG()
+--- linux-2.6.0-test1/include/asm-arm26/pgtable.h      2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-arm26/pgtable.h     2003-07-19 17:07:16.000000000 -0700
+@@ -99,7 +99,7 @@ extern struct page *empty_zero_page;
+  * on arm26 we have no 2nd level page table. we simulate this by removing the
+  * PMD.
+  *
+- * pgd_none is 0 to prevernt pmd_alloc() calling __pmd_alloc(). This causes it
++ * pgd_none is 0 to prevernt pmd_alloc_map() calling __pmd_alloc(). This causes it
+  * to return pmd_offset(pgd,addr) which is a pointer to the pgd (IOW, a no-op).
+  *
+  * however, to work this way, whilst we are allocating 32 pgds, containing 32
+@@ -134,7 +134,7 @@ extern struct page *empty_zero_page;
+ #define _PMD_PRESENT     (0x01)
+-/* These definitions allow us to optimise out stuff like pmd_alloc() */
++/* These definitions allow us to optimise out stuff like pmd_alloc_map() */
+ #define pgd_none(pgd)         (0) 
+ #define pgd_bad(pgd)          (0)
+ #define pgd_present(pgd)      (1)
+@@ -189,6 +189,12 @@ extern struct page *empty_zero_page;
+ #define pte_unmap(pte)                  do { } while (0)
+ #define pte_unmap_nested(pte)           do { } while (0)
++#define pmd_offset_kernel(pgd, addr)          pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)             pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)      pmd_offset(pgd, addr)
++#define pmd_unmap(pgd, addr)                  do { } while (0)
++#define pmd_unmap_nested(pgd, addr)           do { } while (0)
++
+ #define _PAGE_PRESENT   0x01
+ #define _PAGE_READONLY  0x02
+--- linux-2.6.0-test1/include/asm-arm26/posix_types.h  2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-arm26/posix_types.h 2003-07-19 17:06:39.000000000 -0700
+@@ -19,7 +19,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned short                __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long         __kernel_ino_t;
+ typedef unsigned short                __kernel_mode_t;
+ typedef unsigned short                __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-arm/pgalloc.h        2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-arm/pgalloc.h       2003-07-19 17:07:16.000000000 -0700
+@@ -16,7 +16,8 @@
+ /*
+  * Since we have only two-level page tables, these are trivial
+  */
+-#define pmd_alloc_one(mm,addr)                ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,addr)                ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm,addr) ({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(pmd)                 do { } while (0)
+ #define pgd_populate(mm,pmd,pte)      BUG()
+--- linux-2.6.0-test1/include/asm-arm/pgtable.h        2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-arm/pgtable.h       2003-07-19 17:07:16.000000000 -0700
+@@ -125,6 +125,11 @@ extern struct page *empty_zero_page;
+ /* Find an entry in the second-level page table.. */
+ #define pmd_offset(dir, addr) ((pmd_t *)(dir))
++#define pmd_offset_kernel(pgd, addr)          pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)             pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)      pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                do { } while (0)
++#define pmd_unmap_nested(pmd)                 do { } while (0)
+ /* Find an entry in the third-level page table.. */
+ #define __pte_index(addr)     (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+--- linux-2.6.0-test1/include/asm-arm/posix_types.h    2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-arm/posix_types.h   2003-07-19 17:06:39.000000000 -0700
+@@ -19,7 +19,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned short                __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long         __kernel_ino_t;
+ typedef unsigned short                __kernel_mode_t;
+ typedef unsigned short                __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-cris/pgalloc.h       2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-cris/pgalloc.h      2003-07-19 17:07:16.000000000 -0700
+@@ -57,7 +57,8 @@ extern inline void pte_free(struct page 
+  * the pgd will always be present..
+  */
+-#define pmd_alloc_one(mm, addr)    ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)         ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)  ({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(x)                do { } while (0)
+ #define __pmd_free_tlb(tlb,x)      do { } while (0)
+ #define pgd_populate(mm, pmd, pte) BUG()
+--- linux-2.6.0-test1/include/asm-cris/pgtable.h       2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-cris/pgtable.h      2003-07-19 17:07:16.000000000 -0700
+@@ -339,4 +339,10 @@ extern inline void update_mmu_cache(stru
+ typedef pte_t *pte_addr_t;
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
++
+ #endif /* _CRIS_PGTABLE_H */
+--- linux-2.6.0-test1/include/asm-cris/posix_types.h   2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-cris/posix_types.h  2003-07-19 17:06:39.000000000 -0700
+@@ -14,7 +14,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned short        __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned short        __kernel_mode_t;
+ typedef unsigned short        __kernel_nlink_t;
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/cpumask_array.h     2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,41 @@
++#ifndef __ASM_GENERIC_CPUMASK_ARRAY_H
++#define __ASM_GENERIC_CPUMASK_ARRAY_H
++
++#define CPU_ARRAY_SIZE                BITS_TO_LONGS(NR_CPUS)
++
++#define cpu_set(cpu, map)             set_bit(cpu, (map).mask)
++#define cpu_clear(cpu, map)           clear_bit(cpu, (map).mask)
++#define cpu_isset(cpu, map)           test_bit(cpu, (map).mask)
++#define cpu_test_and_set(cpu, map)    test_and_set_bit(cpu, (map).mask)
++
++#define cpus_and(dst,src1,src2)       bitmap_and((dst).mask,(src1).mask, (src2).mask, NR_CPUS)
++#define cpus_or(dst,src1,src2)        bitmap_or((dst).mask, (src1).mask, (src2).mask, NR_CPUS)
++#define cpus_clear(map)               bitmap_clear((map).mask, NR_CPUS)
++#define cpus_complement(map)  bitmap_complement((map).mask, NR_CPUS)
++#define cpus_equal(map1, map2)        bitmap_equal((map1).mask, (map2).mask, NR_CPUS)
++#define cpus_empty(map)               bitmap_empty(map.mask, NR_CPUS)
++#define cpus_weight(map)              bitmap_weight((map).mask, NR_CPUS)
++#define cpus_shift_right(d, s, n)     bitmap_shift_right((d).mask, (s).mask, n, NR_CPUS)
++#define cpus_shift_left(d, s, n)      bitmap_shift_left((d).mask, (s).mask, n, NR_CPUS)
++#define first_cpu(map)                find_first_bit((map).mask, NR_CPUS)
++#define next_cpu(cpu, map)    find_next_bit((map).mask, NR_CPUS, cpu)
++
++/* only ever use this for things that are _never_ used on large boxen */
++#define cpus_coerce(map)      ((map).mask[0])
++#define cpus_promote(map)     ({ cpumask_t __cpu_mask = CPU_MASK_NONE;\
++                                      __cpu_mask.mask[0] = map;       \
++                                      __cpu_mask;                     \
++                              })
++#define cpumask_of_cpu(cpu)   ({ cpumask_t __cpu_mask = CPU_MASK_NONE;\
++                                      cpu_set(cpu, __cpu_mask);       \
++                                      __cpu_mask;                     \
++                              })
++#define any_online_cpu(map)   find_first_bit((map).mask, NR_CPUS)
++
++/*
++ * um, these need to be usable as static initializers
++ */
++#define CPU_MASK_ALL  { {[0 ... CPU_ARRAY_SIZE-1] = ~0UL} }
++#define CPU_MASK_NONE { {[0 ... CPU_ARRAY_SIZE-1] =  0UL} }
++
++#endif /* __ASM_GENERIC_CPUMASK_ARRAY_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/cpumask_const_reference.h   2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,29 @@
++#ifndef __ASM_GENERIC_CPUMASK_CONST_REFERENCE_H
++#define __ASM_GENERIC_CPUMASK_CONST_REFERENCE_H
++
++struct cpumask_ref {
++      const cpumask_t *val;
++};
++
++typedef const struct cpumask_ref cpumask_const_t;
++
++#define mk_cpumask_const(map)         ((cpumask_const_t){ &(map) })
++#define cpu_isset_const(cpu, map)     cpu_isset(cpu, *(map).val)
++
++#define cpus_and_const(dst,src1,src2) cpus_and(dst,*(src1).val,*(src2).val)
++#define cpus_or_const(dst,src1,src2)  cpus_or(dst,*(src1).val,*(src2).val)
++
++#define cpus_equal_const(map1, map2)  cpus_equal(*(map1).val, *(map2).val)
++
++#define cpus_copy_const(map1, map2)   bitmap_copy((map1).mask, (map2).val->mask, NR_CPUS)
++
++#define cpus_empty_const(map)         cpus_empty(*(map).val)
++#define cpus_weight_const(map)                cpus_weight(*(map).val)
++#define first_cpu_const(map)          first_cpu(*(map).val)
++#define next_cpu_const(cpu, map)      next_cpu(cpu, *(map).val)
++
++/* only ever use this for things that are _never_ used on large boxen */
++#define cpus_coerce_const(map)                cpus_coerce(*(map).val)
++#define any_online_cpu_const(map)     any_online_cpu(*(map).val)
++
++#endif /* __ASM_GENERIC_CPUMASK_CONST_REFERENCE_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/cpumask_const_value.h       2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,21 @@
++#ifndef __ASM_GENERIC_CPUMASK_CONST_VALUE_H
++#define __ASM_GENERIC_CPUMASK_CONST_VALUE_H
++
++typedef const cpumask_t cpumask_const_t;
++
++#define mk_cpumask_const(map)         ((cpumask_const_t)(map))
++#define cpu_isset_const(cpu, map)     cpu_isset(cpu, map)
++#define cpus_and_const(dst,src1,src2) cpus_and(dst, src1, src2)
++#define cpus_or_const(dst,src1,src2)  cpus_or(dst, src1, src2)
++#define cpus_equal_const(map1, map2)  cpus_equal(map1, map2)
++#define cpus_empty_const(map)         cpus_empty(map)
++#define cpus_copy_const(map1, map2)   do { map1 = (cpumask_t)map2; } while (0)
++#define cpus_weight_const(map)                cpus_weight(map)
++#define first_cpu_const(map)          first_cpu(map)
++#define next_cpu_const(cpu, map)      next_cpu(cpu, map)
++
++/* only ever use this for things that are _never_ used on large boxen */
++#define cpus_coerce_const(map)                cpus_coerce(map)
++#define any_online_cpu_const(map)     any_online_cpu(map)
++
++#endif /* __ASM_GENERIC_CPUMASK_CONST_VALUE_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/cpumask_up.h        2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,60 @@
++#ifndef __ASM_GENERIC_CPUMASK_UP_H
++#define __ASM_GENERIC_CPUMASK_UP_H
++
++#define CPU_ARRAY_SIZE                BITS_TO_LONGS(NR_CPUS)
++
++#define cpus_coerce(map)      ((map).mask[0])
++
++#define cpu_set(cpu, map)             do { cpus_coerce(map) = 1UL; } while (0)
++#define cpu_clear(cpu, map)           do { cpus_coerce(map) = 0UL; } while (0)
++#define cpu_isset(cpu, map)           (cpus_coerce(map) != 0UL)
++#define cpu_test_and_set(cpu, map)    test_and_set_bit(0, (map).mask)
++
++#define cpus_and(dst, src1, src2)                                     \
++      do {                                                            \
++              if (cpus_coerce(src1) && cpus_coerce(src2))             \
++                      cpus_coerce(dst) = 1UL;                         \
++              else                                                    \
++                      cpus_coerce(dst) = 0UL;                         \
++      } while (0)
++
++#define cpus_or(dst, src1, src2)                                      \
++      do {                                                            \
++              if (cpus_coerce(src1) || cpus_coerce(src2))             \
++                      cpus_coerce(dst) = 1UL;                         \
++              else                                                    \
++                      cpus_coerce(dst) = 0UL;                         \
++      } while (0)
++
++#define cpus_clear(map)                       do { cpus_coerce(map) = 0UL; } while (0)
++
++#define cpus_complement(map)                                          \
++      do {                                                            \
++              cpus_coerce(map) = !cpus_coerce(map);                   \
++      } while (0)
++
++#define cpus_equal(map1, map2)                (cpus_coerce(map1) == cpus_coerce(map2))
++#define cpus_empty(map)                       (cpus_coerce(map) == 0UL)
++#define cpus_weight(map)              (cpus_coerce(map) ? 1UL : 0UL)
++#define cpus_shift_right(d, s, n)     do { cpus_coerce(d) = 0UL; } while (0)
++#define cpus_shift_left(d, s, n)      do { cpus_coerce(d) = 0UL; } while (0)
++#define first_cpu(map)                        (cpus_coerce(map) ? 0 : 1)
++#define next_cpu(cpu, map)            1
++
++/* only ever use this for things that are _never_ used on large boxen */
++#define cpus_promote(map)                                             \
++      ({                                                              \
++              cpumask_t __tmp__;                                      \
++              cpus_coerce(__tmp__) = map;                             \
++              __tmp__;                                                \
++      })
++#define cpumask_of_cpu(cpu)           cpus_promote(1)
++#define any_online_cpu(map)           (cpus_coerce(map) ? 0 : 1)
++
++/*
++ * um, these need to be usable as static initializers
++ */
++#define CPU_MASK_ALL  { {[0 ... CPU_ARRAY_SIZE-1] =  1UL} }
++#define CPU_MASK_NONE { {[0 ... CPU_ARRAY_SIZE-1] =  0UL} }
++
++#endif /* __ASM_GENERIC_CPUMASK_UP_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-generic/local.h     2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,118 @@
++#ifndef _ASM_GENERIC_LOCAL_H
++#define _ASM_GENERIC_LOCAL_H
++
++#include <linux/config.h>
++#include <linux/percpu.h>
++#include <asm/types.h>
++#include <asm/hardirq.h>
++
++/* An unsigned long type for operations which are atomic for a single
++ * CPU.  Usually used in combination with per-cpu variables. */
++
++#if BITS_PER_LONG == 32 && !defined(CONFIG_SPARC32)
++/* Implement in terms of atomics. */
++
++/* Don't use typedef: don't want them to be mixed with atomic_t's. */
++typedef struct
++{
++      atomic_t a;
++} local_t;
++
++#define LOCAL_INIT(i) { ATOMIC_INIT(i) }
++
++#define local_read(l) ((unsigned long)atomic_read(&(l)->a))
++#define local_set(l,i)        atomic_set((&(l)->a),(i))
++#define local_inc(l)  atomic_inc(&(l)->a)
++#define local_dec(l)  atomic_dec(&(l)->a)
++#define local_add(i,l)        atomic_add((i),(&(l)->a))
++#define local_sub(i,l)        atomic_sub((i),(&(l)->a))
++
++/* Non-atomic variants, ie. preemption disabled and won't be touched
++ * in interrupt, etc.  Some archs can optimize this case well. */
++#define __local_inc(l)                local_set((l), local_read(l) + 1)
++#define __local_dec(l)                local_set((l), local_read(l) - 1)
++#define __local_add(i,l)      local_set((l), local_read(l) + (i))
++#define __local_sub(i,l)      local_set((l), local_read(l) - (i))
++
++#else /* ... can't use atomics. */
++/* Implement in terms of three variables.
++   Another option would be to use local_irq_save/restore. */
++
++typedef struct
++{
++      /* 0 = in hardirq, 1 = in softirq, 2 = usermode. */
++      unsigned long v[3];
++} local_t;
++
++#define _LOCAL_VAR(l) ((l)->v[!in_interrupt() + !in_irq()])
++
++#define LOCAL_INIT(i) { { (i), 0, 0 } }
++
++static inline unsigned long local_read(local_t *l)
++{
++      return l->v[0] + l->v[1] + l->v[2];
++}
++
++static inline void local_set(local_t *l, unsigned long v)
++{
++      l->v[0] = v;
++      l->v[1] = l->v[2] = 0;
++}
++
++static inline void local_inc(local_t *l)
++{
++      preempt_disable();
++      _LOCAL_VAR(l)++;
++      preempt_enable();
++}
++
++static inline void local_dec(local_t *l)
++{
++      preempt_disable();
++      _LOCAL_VAR(l)--;
++      preempt_enable();
++}
++
++static inline void local_add(unsigned long v, local_t *l)
++{
++      preempt_disable();
++      _LOCAL_VAR(l) += v;
++      preempt_enable();
++}
++
++static inline void local_sub(unsigned long v, local_t *l)
++{
++      preempt_disable();
++      _LOCAL_VAR(l) -= v;
++      preempt_enable();
++}
++
++/* Non-atomic variants, ie. preemption disabled and won't be touched
++ * in interrupt, etc.  Some archs can optimize this case well. */
++#define __local_inc(l)                ((l)->v[0]++)
++#define __local_dec(l)                ((l)->v[0]--)
++#define __local_add(i,l)      ((l)->v[0] += (i))
++#define __local_sub(i,l)      ((l)->v[0] -= (i))
++
++#endif /* Non-atomic implementation */
++
++/* Use these for per-cpu local_t variables: on some archs they are
++ * much more efficient than these naive implementations.  Note they take
++ * a variable (eg. mystruct.foo), not an address.
++ */
++#define cpu_local_read(v)     local_read(&__get_cpu_var(v))
++#define cpu_local_set(v, i)   local_set(&__get_cpu_var(v), (i))
++#define cpu_local_inc(v)      local_inc(&__get_cpu_var(v))
++#define cpu_local_dec(v)      local_dec(&__get_cpu_var(v))
++#define cpu_local_add(i, v)   local_add((i), &__get_cpu_var(v))
++#define cpu_local_sub(i, v)   local_sub((i), &__get_cpu_var(v))
++
++/* Non-atomic increments, ie. preemption disabled and won't be touched
++ * in interrupt, etc.  Some archs can optimize this case well.
++ */
++#define __cpu_local_inc(v)    __local_inc(&__get_cpu_var(v))
++#define __cpu_local_dec(v)    __local_dec(&__get_cpu_var(v))
++#define __cpu_local_add(i, v) __local_add((i), &__get_cpu_var(v))
++#define __cpu_local_sub(i, v) __local_sub((i), &__get_cpu_var(v))
++
++#endif /* _ASM_GENERIC_LOCAL_H */
+--- linux-2.6.0-test1/include/asm-generic/percpu.h     2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-generic/percpu.h    2003-07-19 17:03:50.000000000 -0700
+@@ -9,33 +9,34 @@ extern unsigned long __per_cpu_offset[NR
+ /* Separate out the type, so (int[3], foo) works. */
+ #define DEFINE_PER_CPU(type, name) \
+-    __attribute__((__section__(".data.percpu"))) __typeof__(type) name##__per_cpu
++    __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name
+ /* var is in discarded region: offset to particular copy we want */
+-#define per_cpu(var, cpu) (*RELOC_HIDE(&var##__per_cpu, __per_cpu_offset[cpu]))
++#define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
+ #define __get_cpu_var(var) per_cpu(var, smp_processor_id())
+-static inline void percpu_modcopy(void *pcpudst, const void *src,
+-                                unsigned long size)
+-{
+-      unsigned int i;
+-      for (i = 0; i < NR_CPUS; i++)
+-              if (cpu_possible(i))
+-                      memcpy(pcpudst + __per_cpu_offset[i], src, size);
+-}
++/* A macro to avoid #include hell... */
++#define percpu_modcopy(pcpudst, src, size)                    \
++do {                                                          \
++      unsigned int __i;                                       \
++      for (__i = 0; __i < NR_CPUS; __i++)                     \
++              if (cpu_possible(__i))                          \
++                      memcpy((pcpudst)+__per_cpu_offset[__i], \
++                             (src), (size));                  \
++} while (0)
+ #else /* ! SMP */
+ #define DEFINE_PER_CPU(type, name) \
+-    __typeof__(type) name##__per_cpu
++    __typeof__(type) per_cpu__##name
+-#define per_cpu(var, cpu)                     ((void)cpu, var##__per_cpu)
+-#define __get_cpu_var(var)                    var##__per_cpu
++#define per_cpu(var, cpu)                     ((void)cpu, per_cpu__##var)
++#define __get_cpu_var(var)                    per_cpu__##var
+ #endif        /* SMP */
+-#define DECLARE_PER_CPU(type, name) extern __typeof__(type) name##__per_cpu
++#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
+-#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(var##__per_cpu)
+-#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(var##__per_cpu)
++#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
++#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
+ #endif /* _ASM_GENERIC_PERCPU_H_ */
+--- linux-2.6.0-test1/include/asm-generic/sections.h   2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-generic/sections.h  2003-07-19 17:03:50.000000000 -0700
+@@ -3,9 +3,10 @@
+ /* References to section boundaries */
+-extern char _text, _etext;
+-extern char _data, _edata;
+-extern char __bss_start;
+-extern char __init_begin, __init_end;
++extern char _text[], _stext[], _etext[];
++extern char _data[], _sdata[], _edata[];
++extern char __bss_start[];
++extern char __init_begin[], __init_end[];
++extern char _sinittext[], _einittext[];
+ #endif /* _ASM_GENERIC_SECTIONS_H_ */
+--- linux-2.6.0-test1/include/asm-h8300/pgtable.h      2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-h8300/pgtable.h     2003-07-19 17:07:16.000000000 -0700
+@@ -15,6 +15,11 @@ typedef pte_t *pte_addr_t;
+ #define pgd_clear(pgdp)
+ #define kern_addr_valid(addr) (1)
+ #define       pmd_offset(a, b)        ((void *)0)
++#define pmd_offset_kernel(a,b)                pmd_offset(a,b)
++#define pmd_offset_map(a,b)           pmd_offset(a,b)
++#define pmd_offset_map_nested(a,b)    pmd_offset(a,b)
++#define pmd_unmap(pmd)                        do { } while (0)
++#define pmd_unmap_nested(pmd)         do { } while (0)
+ #define PAGE_NONE             __pgprot(0)    /* these mean nothing to NO_MM */
+ #define PAGE_SHARED           __pgprot(0)    /* these mean nothing to NO_MM */
+--- linux-2.6.0-test1/include/asm-h8300/posix_types.h  2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-h8300/posix_types.h 2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned short        __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned short        __kernel_mode_t;
+ typedef unsigned short        __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-i386/atomic.h        2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-i386/atomic.h       2003-07-19 17:04:07.000000000 -0700
+@@ -193,7 +193,7 @@ __asm__ __volatile__(LOCK "andl %0,%1" \
+ #define atomic_set_mask(mask, addr) \
+ __asm__ __volatile__(LOCK "orl %0,%1" \
+-: : "r" (mask),"m" (*addr) : "memory")
++: : "r" (mask),"m" (*(addr)) : "memory")
+ /* Atomic operations are already serializing on x86 */
+ #define smp_mb__before_atomic_dec()   barrier()
+--- linux-2.6.0-test1/include/asm-i386/bitops.h        2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-i386/bitops.h       2003-07-19 17:04:07.000000000 -0700
+@@ -270,7 +270,7 @@ static __inline__ int variable_test_bit(
+  * Returns the bit-number of the first zero bit, not the number of the byte
+  * containing a bit.
+  */
+-static __inline__ int find_first_zero_bit(unsigned long * addr, unsigned size)
++static __inline__ int find_first_zero_bit(const unsigned long *addr, unsigned size)
+ {
+       int d0, d1, d2;
+       int res;
+@@ -302,7 +302,7 @@ static __inline__ int find_first_zero_bi
+  * Returns the bit-number of the first set bit, not the number of the byte
+  * containing a bit.
+  */
+-static __inline__ int find_first_bit(unsigned long * addr, unsigned size)
++static __inline__ int find_first_bit(const unsigned long *addr, unsigned size)
+ {
+       int d0, d1;
+       int res;
+@@ -328,7 +328,7 @@ static __inline__ int find_first_bit(uns
+  * @offset: The bitnumber to start searching at
+  * @size: The maximum size to search
+  */
+-static __inline__ int find_next_zero_bit(unsigned long * addr, int size, int offset)
++static __inline__ int find_next_zero_bit(const unsigned long *addr, int size, int offset)
+ {
+       unsigned long * p = ((unsigned long *) addr) + (offset >> 5);
+       int set = 0, bit = offset & 31, res;
+@@ -361,9 +361,9 @@ static __inline__ int find_next_zero_bit
+  * @offset: The bitnumber to start searching at
+  * @size: The maximum size to search
+  */
+-static __inline__ int find_next_bit(unsigned long *addr, int size, int offset)
++static __inline__ int find_next_bit(const unsigned long *addr, int size, int offset)
+ {
+-      unsigned long * p = addr + (offset >> 5);
++      const unsigned long *p = addr + (offset >> 5);
+       int set = 0, bit = offset & 31, res;
+       if (bit) {
+@@ -430,7 +430,7 @@ static __inline__ unsigned long __ffs(un
+  * unlikely to be set. It's guaranteed that at least one of the 140
+  * bits is cleared.
+  */
+-static inline int sched_find_first_bit(unsigned long *b)
++static inline int sched_find_first_bit(const unsigned long *b)
+ {
+       if (unlikely(b[0]))
+               return __ffs(b[0]);
+--- linux-2.6.0-test1/include/asm-i386/bugs.h  2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/bugs.h 2003-07-19 17:04:02.000000000 -0700
+@@ -1,11 +1,11 @@
+ /*
+  *  include/asm-i386/bugs.h
+  *
+- *  Copyright (C) 1994  Linus Torvalds
++ *  Copyright (C) 1994        Linus Torvalds
+  *
+  *  Cyrix stuff, June 1998 by:
+  *    - Rafael R. Reilova (moved everything from head.S),
+- *        <rreilova@ececs.uc.edu>
++ *      <rreilova@ececs.uc.edu>
+  *    - Channing Corn (tests & fixes),
+  *    - Andrew D. Balsa (code cleanup).
+  *
+@@ -25,7 +25,20 @@
+ #include <asm/processor.h>
+ #include <asm/i387.h>
+ #include <asm/msr.h>
+-
++#ifdef CONFIG_KGDB
++/*
++ * Provied the command line "gdb" initial break
++ */
++int __init kgdb_initial_break(char * str)
++{
++      if (*str == '\0'){
++              breakpoint();
++              return 1;
++      }
++      return 0;
++}
++__setup("gdb",kgdb_initial_break);
++#endif
+ static int __init no_halt(char *s)
+ {
+       boot_cpu_data.hlt_works_ok = 0;
+@@ -140,7 +153,7 @@ static void __init check_popad(void)
+         : "ecx", "edi" );
+       /* If this fails, it means that any user program may lock the CPU hard. Too bad. */
+       if (res != 12345678) printk( "Buggy.\n" );
+-                      else printk( "OK.\n" );
++                      else printk( "OK.\n" );
+ #endif
+ }
+--- linux-2.6.0-test1/include/asm-i386/genapic.h       2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-i386/genapic.h      2003-07-19 17:04:07.000000000 -0700
+@@ -1,13 +1,13 @@
+ #ifndef _ASM_GENAPIC_H
+ #define _ASM_GENAPIC_H 1
+-/* 
++/*
+  * Generic APIC driver interface.
+- *  
+- * An straight forward mapping of the APIC related parts of the 
++ *
++ * An straight forward mapping of the APIC related parts of the
+  * x86 subarchitecture interface to a dynamic object.
+- *    
+- * This is used by the "generic" x86 subarchitecture. 
++ *
++ * This is used by the "generic" x86 subarchitecture.
+  *
+  * Copyright 2003 Andi Kleen, SuSE Labs.
+  */
+@@ -22,23 +22,23 @@ struct genapic { 
+       int (*probe)(void); 
+       int (*apic_id_registered)(void);
+-      unsigned long (*target_cpus)(void); 
++      cpumask_t (*target_cpus)(void);
+       int int_delivery_mode;
+       int int_dest_mode; 
+       int apic_broadcast_id; 
+       int esr_disable;
+-      unsigned long (*check_apicid_used)(unsigned long bitmap, int apicid); 
++      unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid);
+       unsigned long (*check_apicid_present)(int apicid); 
+       int no_balance_irq;
+       void (*init_apic_ldr)(void);
+-      unsigned long (*ioapic_phys_id_map)(unsigned long map); 
++      physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map);
+       void (*clustered_apic_check)(void);
+       int (*multi_timer_check)(int apic, int irq);
+       int (*apicid_to_node)(int logical_apicid); 
+       int (*cpu_to_logical_apicid)(int cpu);
+       int (*cpu_present_to_apicid)(int mps_cpu);
+-      unsigned long (*apicid_to_cpu_present)(int phys_apicid); 
++      physid_mask_t (*apicid_to_cpu_present)(int phys_apicid);
+       int (*mpc_apic_id)(struct mpc_config_processor *m, 
+                          struct mpc_config_translation *t); 
+       void (*setup_portio_remap)(void); 
+@@ -59,11 +59,11 @@ struct genapic { 
+       int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
+       unsigned (*get_apic_id)(unsigned long x);
+-      unsigned long apic_id_mask; 
+-      unsigned int (*cpu_mask_to_apicid)(unsigned long cpumask);
++      unsigned long apic_id_mask;
++      unsigned int (*cpu_mask_to_apicid)(cpumask_const_t cpumask);
+       
+       /* ipi */
+-      void (*send_IPI_mask)(int mask, int vector);
++      void (*send_IPI_mask)(cpumask_t mask, int vector);
+       void (*send_IPI_allbutself)(int vector);
+       void (*send_IPI_all)(int vector);
+ }; 
+--- linux-2.6.0-test1/include/asm-i386/highmem.h       2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-i386/highmem.h      2003-07-19 17:07:16.000000000 -0700
+@@ -22,6 +22,7 @@
+ #include <linux/config.h>
+ #include <linux/interrupt.h>
++#include <linux/threads.h>
+ #include <asm/kmap_types.h>
+ #include <asm/tlbflush.h>
+@@ -39,7 +40,11 @@ extern void kmap_init(void);
+  * easily, subsequent pte tables have to be allocated in one physical
+  * chunk of RAM.
+  */
+-#define PKMAP_BASE (0xff800000UL)
++#if NR_CPUS <= 32
++#define PKMAP_BASE (0xff400000UL)
++#else
++#define PKMAP_BASE (0xfe800000UL)
++#endif
+ #ifdef CONFIG_X86_PAE
+ #define LAST_PKMAP 512
+ #else
+--- linux-2.6.0-test1/include/asm-i386/hw_irq.h        2003-06-14 12:18:51.000000000 -0700
++++ 25/include/asm-i386/hw_irq.h       2003-07-19 17:04:07.000000000 -0700
+@@ -16,6 +16,7 @@
+ #include <linux/profile.h>
+ #include <asm/atomic.h>
+ #include <asm/irq.h>
++#include <asm/sections.h>
+ /*
+  * Various low-level irq details needed by irq.c, process.c,
+@@ -30,41 +31,39 @@ extern int irq_vector[NR_IRQS];
+ extern void (*interrupt[NR_IRQS])(void);
+ #ifdef CONFIG_SMP
+-extern asmlinkage void reschedule_interrupt(void);
+-extern asmlinkage void invalidate_interrupt(void);
+-extern asmlinkage void call_function_interrupt(void);
++asmlinkage void reschedule_interrupt(void);
++asmlinkage void invalidate_interrupt(void);
++asmlinkage void call_function_interrupt(void);
+ #endif
+ #ifdef CONFIG_X86_LOCAL_APIC
+-extern asmlinkage void apic_timer_interrupt(void);
+-extern asmlinkage void error_interrupt(void);
+-extern asmlinkage void spurious_interrupt(void);
+-extern asmlinkage void thermal_interrupt(struct pt_regs);
++asmlinkage void apic_timer_interrupt(void);
++asmlinkage void error_interrupt(void);
++asmlinkage void spurious_interrupt(void);
++asmlinkage void thermal_interrupt(struct pt_regs);
+ #endif
+-extern void mask_irq(unsigned int irq);
+-extern void unmask_irq(unsigned int irq);
+-extern void disable_8259A_irq(unsigned int irq);
+-extern void enable_8259A_irq(unsigned int irq);
+-extern int i8259A_irq_pending(unsigned int irq);
+-extern void make_8259A_irq(unsigned int irq);
+-extern void init_8259A(int aeoi);
+-extern void FASTCALL(send_IPI_self(int vector));
+-extern void init_VISWS_APIC_irqs(void);
+-extern void setup_IO_APIC(void);
+-extern void disable_IO_APIC(void);
+-extern void print_IO_APIC(void);
+-extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
+-extern void send_IPI(int dest, int vector);
+-extern void setup_ioapic_dest(unsigned long mask);
++void mask_irq(unsigned int irq);
++void unmask_irq(unsigned int irq);
++void disable_8259A_irq(unsigned int irq);
++void enable_8259A_irq(unsigned int irq);
++int i8259A_irq_pending(unsigned int irq);
++void make_8259A_irq(unsigned int irq);
++void init_8259A(int aeoi);
++void FASTCALL(send_IPI_self(int vector));
++void init_VISWS_APIC_irqs(void);
++void setup_IO_APIC(void);
++void disable_IO_APIC(void);
++void print_IO_APIC(void);
++int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
++void send_IPI(int dest, int vector);
++void setup_ioapic_dest(cpumask_t mask);
+ extern unsigned long io_apic_irqs;
+ extern atomic_t irq_err_count;
+ extern atomic_t irq_mis_count;
+-extern char _stext, _etext;
+-
+ #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
+ /*
+@@ -95,7 +94,7 @@ static inline void x86_do_profile(struct
+       if (!((1<<smp_processor_id()) & prof_cpu_mask))
+               return;
+-      eip -= (unsigned long) &_stext;
++      eip -= (unsigned long)_stext;
+       eip >>= prof_shift;
+       /*
+        * Don't ignore out-of-bounds EIP values silently,
+@@ -107,7 +106,7 @@ static inline void x86_do_profile(struct
+       atomic_inc((atomic_t *)&prof_buffer[eip]);
+ }
+  
+-#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SMP)
++#if defined(CONFIG_X86_IO_APIC)
+ static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i)
+ {
+       if (IO_APIC_IRQ(i))
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-i386/kgdb.h 2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,59 @@
++#ifndef __KGDB
++#define __KGDB
++
++/*
++ * This file should not include ANY others.  This makes it usable
++ * most anywhere without the fear of include order or inclusion.
++ * Make it so!
++ *
++ * This file may be included all the time.  It is only active if 
++ * CONFIG_KGDB is defined, otherwise it stubs out all the macros
++ * and entry points.
++ */
++#if defined(CONFIG_KGDB) && !defined(__ASSEMBLY__)
++
++extern void breakpoint(void);
++#define INIT_KGDB_INTS kgdb_enable_ints()
++
++#ifndef BREAKPOINT
++#define BREAKPOINT   asm("   int $3")
++#endif
++/*
++ * GDB debug stub (or any debug stub) can point the 'linux_debug_hook'
++ * pointer to its routine and it will be entered as the first thing
++ * when a trap occurs.
++ *
++ * Return values are, at present, undefined.
++ *
++ * The debug hook routine does not necessarily return to its caller.
++ * It has the register image and thus may choose to resume execution
++ * anywhere it pleases. 
++ */
++struct pt_regs;
++
++extern int kgdb_handle_exception(int trapno,
++                               int signo, int err_code, struct pt_regs *regs);
++extern int in_kgdb(struct pt_regs *regs);
++
++#ifdef CONFIG_KGDB_TS
++void kgdb_tstamp(int line, char *source, int data0, int data1);
++/*
++ * This is the time stamp function.  The macro adds the source info and
++ * does a cast on the data to allow most any 32-bit value.
++ */
++
++#define kgdb_ts(data0,data1) kgdb_tstamp(__LINE__,__FILE__,(int)data0,(int)data1)
++#else
++#define kgdb_ts(data0,data1)
++#endif
++#else                         /* CONFIG_KGDB  && ! __ASSEMBLY__ ,stubs follow... */
++#ifndef BREAKPOINT
++#define BREAKPOINT
++#endif
++#define kgdb_ts(data0,data1)
++#define in_kgdb
++#define kgdb_handle_exception
++#define breakpoint
++#define INIT_KGDB_INTS
++#endif
++#endif                                /* __KGDB */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-i386/kgdb_local.h   2003-07-19 17:04:02.000000000 -0700
+@@ -0,0 +1,102 @@
++#ifndef __KGDB_LOCAL
++#define ___KGDB_LOCAL
++#include <linux/config.h>
++#include <linux/types.h>
++#include <linux/serial.h>
++#include <linux/serialP.h>
++#include <linux/spinlock.h>
++#include <asm/processor.h>
++#include <asm/msr.h>
++#include <asm/kgdb.h>
++
++#define PORT 0x3f8
++#ifdef CONFIG_KGDB_PORT
++#undef PORT
++#define PORT CONFIG_KGDB_PORT
++#endif
++#define IRQ 4
++#ifdef CONFIG_KGDB_IRQ
++#undef IRQ
++#define IRQ CONFIG_KGDB_IRQ
++#endif
++#define SB_CLOCK 1843200
++#define SB_BASE (SB_CLOCK/16)
++#define SB_BAUD9600 SB_BASE/9600
++#define SB_BAUD192  SB_BASE/19200
++#define SB_BAUD384  SB_BASE/38400
++#define SB_BAUD576  SB_BASE/57600
++#define SB_BAUD1152 SB_BASE/115200
++#ifdef CONFIG_KGDB_9600BAUD
++#define SB_BAUD SB_BAUD9600
++#endif
++#ifdef CONFIG_KGDB_19200BAUD
++#define SB_BAUD SB_BAUD192
++#endif
++#ifdef CONFIG_KGDB_38400BAUD
++#define SB_BAUD SB_BAUD384
++#endif
++#ifdef CONFIG_KGDB_57600BAUD
++#define SB_BAUD SB_BAUD576
++#endif
++#ifdef CONFIG_KGDB_115200BAUD
++#define SB_BAUD SB_BAUD1152
++#endif
++#ifndef SB_BAUD
++#define SB_BAUD SB_BAUD1152   /* Start with this if not given */
++#endif
++
++#ifndef CONFIG_X86_TSC
++#undef rdtsc
++#define rdtsc(a,b) if (a++ > 10000){a = 0; b++;}
++#undef rdtscll
++#define rdtscll(s) s++
++#endif
++
++#ifdef _raw_read_unlock               /* must use a name that is "define"ed, not an inline */
++#undef spin_lock
++#undef spin_trylock
++#undef spin_unlock
++#define spin_lock      _raw_spin_lock
++#define spin_trylock   _raw_spin_trylock
++#define spin_unlock    _raw_spin_unlock
++#else
++#endif
++#undef spin_unlock_wait
++#define spin_unlock_wait(x)  do { cpu_relax(); barrier();} \
++                                     while(spin_is_locked(x))
++
++#define SB_IER 1
++#define SB_MCR UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS
++
++#define FLAGS 0
++#define SB_STATE { \
++     magic: SSTATE_MAGIC, \
++     baud_base: SB_BASE,  \
++     port:      PORT,     \
++     irq:       IRQ,      \
++     flags:     FLAGS,    \
++     custom_divisor:SB_BAUD}
++#define SB_INFO  { \
++      magic: SERIAL_MAGIC, \
++      port:  PORT,0,FLAGS, \
++      state: &state,       \
++      tty:   (struct tty_struct *)&state, \
++      IER:   SB_IER,       \
++      MCR:   SB_MCR}
++extern void putDebugChar(int);
++/* RTAI support needs us to really stop/start interrupts */
++
++#define kgdb_sti() __asm__ __volatile__("sti": : :"memory")
++#define kgdb_cli() __asm__ __volatile__("cli": : :"memory")
++#define kgdb_local_save_flags(x) __asm__ __volatile__(\
++                                   "pushfl ; popl %0":"=g" (x): /* no input */)
++#define kgdb_local_irq_restore(x) __asm__ __volatile__(\
++                                   "pushl %0 ; popfl": \
++                                     /* no output */ :"g" (x):"memory", "cc")
++#define kgdb_local_irq_save(x) kgdb_local_save_flags(x); kgdb_cli()
++
++#ifdef CONFIG_SERIAL
++extern void shutdown_for_kgdb(struct async_struct *info);
++#endif
++#define INIT_KDEBUG putDebugChar("+");
++#endif                                /* __KGDB_LOCAL */
+--- linux-2.6.0-test1/include/asm-i386/kmap_types.h    2003-06-14 12:18:28.000000000 -0700
++++ 25/include/asm-i386/kmap_types.h   2003-07-19 17:07:16.000000000 -0700
+@@ -17,14 +17,16 @@ D(3)       KM_USER0,
+ D(4)  KM_USER1,
+ D(5)  KM_BIO_SRC_IRQ,
+ D(6)  KM_BIO_DST_IRQ,
+-D(7)  KM_PTE0,
+-D(8)  KM_PTE1,
+-D(9)  KM_PTE2,
+-D(10) KM_IRQ0,
+-D(11) KM_IRQ1,
+-D(12) KM_SOFTIRQ0,
+-D(13) KM_SOFTIRQ1,
+-D(14) KM_TYPE_NR
++D(7)  KM_PMD0,
++D(8)  KM_PMD1,
++D(9)  KM_PTE0,
++D(10) KM_PTE1,
++D(11) KM_PTE2,
++D(12) KM_IRQ0,
++D(13) KM_IRQ1,
++D(14) KM_SOFTIRQ0,
++D(15) KM_SOFTIRQ1,
++D(16) KM_TYPE_NR
+ };
+ #undef D
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-i386/local.h        2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,70 @@
++#ifndef _ARCH_I386_LOCAL_H
++#define _ARCH_I386_LOCAL_H
++
++#include <linux/percpu.h>
++
++typedef struct
++{
++      volatile unsigned long counter;
++} local_t;
++
++#define LOCAL_INIT(i) { (i) }
++
++#define local_read(v) ((v)->counter)
++#define local_set(v,i)        (((v)->counter) = (i))
++
++static __inline__ void local_inc(local_t *v)
++{
++      __asm__ __volatile__(
++              "incl %0"
++              :"=m" (v->counter)
++              :"m" (v->counter));
++}
++
++static __inline__ void local_dec(local_t *v)
++{
++      __asm__ __volatile__(
++              "decl %0"
++              :"=m" (v->counter)
++              :"m" (v->counter));
++}
++
++static __inline__ void local_add(unsigned long i, local_t *v)
++{
++      __asm__ __volatile__(
++              "addl %1,%0"
++              :"=m" (v->counter)
++              :"ir" (i), "m" (v->counter));
++}
++
++static __inline__ void local_sub(unsigned long i, local_t *v)
++{
++      __asm__ __volatile__(
++              "subl %1,%0"
++              :"=m" (v->counter)
++              :"ir" (i), "m" (v->counter));
++}
++
++/* On x86, these are no better than the atomic variants. */
++#define __local_inc(l)                local_inc(l)
++#define __local_dec(l)                local_dec(l)
++#define __local_add(i,l)      local_add((i),(l))
++#define __local_sub(i,l)      local_sub((i),(l))
++
++/* Use these for per-cpu local_t variables: on some archs they are
++ * much more efficient than these naive implementations.  Note they take
++ * a variable, not an address.
++ */
++#define cpu_local_read(v)     local_read(&__get_cpu_var(v))
++#define cpu_local_set(v, i)   local_set(&__get_cpu_var(v), (i))
++#define cpu_local_inc(v)      local_inc(&__get_cpu_var(v))
++#define cpu_local_dec(v)      local_dec(&__get_cpu_var(v))
++#define cpu_local_add(i, v)   local_add((i), &__get_cpu_var(v))
++#define cpu_local_sub(i, v)   local_sub((i), &__get_cpu_var(v))
++
++#define __cpu_local_inc(v)    cpu_local_inc(v)
++#define __cpu_local_dec(v)    cpu_local_dec(v)
++#define __cpu_local_add(i, v) cpu_local_add((i), (v))
++#define __cpu_local_sub(i, v) cpu_local_sub((i), (v))
++
++#endif /* _ARCH_I386_LOCAL_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-i386/lockmeter.h    2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,127 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ *
++ *  Modified by Ray Bryant (raybry@us.ibm.com)
++ *  Changes Copyright (C) 2000 IBM, Inc.
++ *  Added save of index in spinlock_t to improve efficiency
++ *  of "hold" time reporting for spinlocks.
++ *  Added support for hold time statistics for read and write
++ *  locks.
++ *  Moved machine dependent code here from include/lockmeter.h.
++ *
++ */
++
++#ifndef _I386_LOCKMETER_H
++#define _I386_LOCKMETER_H
++
++#include <asm/spinlock.h>
++#include <asm/rwlock.h>
++
++#include <linux/version.h>
++
++#ifdef __KERNEL__
++extern unsigned long cpu_khz;
++#define CPU_CYCLE_FREQUENCY   (cpu_khz * 1000)
++#else
++#define CPU_CYCLE_FREQUENCY   450000000
++#endif
++
++#define THIS_CPU_NUMBER               smp_processor_id()
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
++#define local_irq_save(x) \
++    __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")
++
++#define local_irq_restore(x) \
++    __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
++#endif        /* Linux version 2.2.x */
++
++/*
++ * macros to cache and retrieve an index value inside of a spin lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.  Not normally a problem!!
++ * we also assume that the hash table has less than 65535 entries.
++ */
++/*
++ * instrumented spinlock structure -- never used to allocate storage
++ * only used in macros below to overlay a spinlock_t
++ */
++typedef struct inst_spinlock_s {
++      /* remember, Intel is little endian */
++      unsigned short lock;
++      unsigned short index;
++} inst_spinlock_t;
++#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
++#define GET_INDEX(lock_ptr)        ((inst_spinlock_t *)(lock_ptr))->index
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++      volatile int lock;
++      unsigned short index;
++      unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return the number of readers for a rwlock_t
++ */
++#define RWLOCK_READERS(rwlock_ptr)   rwlock_readers(rwlock_ptr)
++
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++      int tmp = (int) rwlock_ptr->lock;
++      /* read and write lock attempts may cause the lock value to temporarily */
++      /* be negative.  Until it is >= 0 we know nothing (i. e. can't tell if  */
++      /* is -1 because it was write locked and somebody tried to read lock it */
++      /* or if it is -1 because it was read locked and somebody tried to write*/
++      /* lock it. ........................................................... */
++      do {
++              tmp = (int) rwlock_ptr->lock;
++      } while (tmp < 0);
++      if (tmp == 0) return(0);
++      else return(RW_LOCK_BIAS-tmp);
++}
++
++/*
++ * return true if rwlock is write locked
++ * (note that other lock attempts can cause the lock value to be negative)
++ */
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock <= 0)
++#define IABS(x) ((x) > 0 ? (x) : -(x))
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((IABS((rwlock_ptr)->lock) % RW_LOCK_BIAS) != 0)
++
++/* this is a lot of typing just to get gcc to emit "rdtsc" */
++static inline long long get_cycles64 (void)
++{
++#ifndef CONFIG_X86_TSC
++      #error this code requires CONFIG_X86_TSC
++#else
++      union longlong_u {
++              long long intlong;
++              struct intint_s {
++                      uint32_t eax;
++                      uint32_t edx;
++              } intint;
++      } longlong;
++
++      rdtsc(longlong.intint.eax,longlong.intint.edx);
++      return longlong.intlong;
++#endif
++}
++
++#endif /* _I386_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-i386/mach-bigsmp/mach_apic.h 2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-bigsmp/mach_apic.h        2003-07-19 17:04:07.000000000 -0700
+@@ -20,7 +20,7 @@ static inline int apic_id_registered(voi
+ }
+ #define APIC_DFR_VALUE        (APIC_DFR_CLUSTER)
+-static inline unsigned long target_cpus(void)
++static inline cpumask_t target_cpus(void)
+ { 
+       return cpu_online_map;
+ }
+@@ -29,14 +29,15 @@ static inline unsigned long target_cpus(
+ #define INT_DELIVERY_MODE dest_LowestPrio
+ #define INT_DEST_MODE 1     /* logical delivery broadcast to all procs */
+-#define APIC_BROADCAST_ID     (0x0f)
+-static inline unsigned long check_apicid_used(unsigned long bitmap, int apicid) 
+-{ 
++#define APIC_BROADCAST_ID     (0xff)
++static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
++{
+       return 0;
+-} 
++}
++
+ static inline unsigned long check_apicid_present(int bit) 
+ {
+-      return (phys_cpu_present_map & (1 << bit));
++      return physid_isset(bit, phys_cpu_present_map);
+ }
+ #define apicid_cluster(apicid) (apicid & 0xF0)
+@@ -88,9 +89,9 @@ static inline int cpu_present_to_apicid(
+       return (int) bios_cpu_apicid[mps_cpu];
+ }
+-static inline unsigned long apicid_to_cpu_present(int phys_apicid)
++static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
+ {
+-      return (1ul << phys_apicid);
++      return physid_mask_of_physid(phys_apicid);
+ }
+ extern volatile u8 cpu_2_logical_apicid[];
+@@ -108,13 +109,13 @@ static inline int mpc_apic_id(struct mpc
+               (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
+               (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
+               m->mpc_apicver);
+-      return (m->mpc_apicid);
++      return m->mpc_apicid;
+ }
+-static inline ulong ioapic_phys_id_map(ulong phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+ {
+       /* For clustered we don't have a good way to do this yet - hack */
+-      return (0x0F);
++      return physids_promote(0xFUL);
+ }
+ #define WAKE_SECONDARY_VIA_INIT
+@@ -132,25 +133,25 @@ static inline int check_phys_apicid_pres
+       return (1);
+ }
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+       int num_bits_set;
+       int cpus_found = 0;
+       int cpu;
+       int apicid;     
+-      num_bits_set = hweight32(cpumask); 
++      num_bits_set = cpus_weight_const(cpumask);
+       /* Return id to all */
+-      if (num_bits_set == 32)
++      if (num_bits_set == NR_CPUS)
+               return (int) 0xFF;
+       /* 
+        * The cpus in the mask must all be on the apic cluster.  If are not 
+        * on the same apicid cluster return default value of TARGET_CPUS. 
+        */
+-      cpu = ffs(cpumask)-1;
++      cpu = first_cpu_const(cpumask);
+       apicid = cpu_to_logical_apicid(cpu);
+       while (cpus_found < num_bits_set) {
+-              if (cpumask & (1 << cpu)) {
++              if (cpu_isset_const(cpu, cpumask)) {
+                       int new_apicid = cpu_to_logical_apicid(cpu);
+                       if (apicid_cluster(apicid) != 
+                                       apicid_cluster(new_apicid)){
+--- linux-2.6.0-test1/include/asm-i386/mach-bigsmp/mach_ipi.h  2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-i386/mach-bigsmp/mach_ipi.h 2003-07-19 17:04:07.000000000 -0700
+@@ -1,18 +1,19 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+-inline void send_IPI_mask_sequence(int mask, int vector);
++inline void send_IPI_mask_sequence(cpumask_t mask, int vector);
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+       send_IPI_mask_sequence(mask, vector);
+ }
+ static inline void send_IPI_allbutself(int vector)
+ {
+-      unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
++      cpumask_t mask = cpu_online_map;
++      cpu_clear(smp_processor_id(), mask);
+-      if (mask)
++      if (!cpus_empty(mask))
+               send_IPI_mask(mask, vector);
+ }
+--- linux-2.6.0-test1/include/asm-i386/mach-default/mach_apic.h        2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-default/mach_apic.h       2003-07-19 17:04:07.000000000 -0700
+@@ -5,12 +5,12 @@
+ #define APIC_DFR_VALUE        (APIC_DFR_FLAT)
+-static inline unsigned long target_cpus(void)
++static inline cpumask_t target_cpus(void)
+ { 
+ #ifdef CONFIG_SMP
+       return cpu_online_map;
+ #else
+-      return 1; 
++      return cpumask_of_cpu(0);
+ #endif
+ } 
+ #define TARGET_CPUS (target_cpus())
+@@ -21,16 +21,20 @@ static inline unsigned long target_cpus(
+ #define INT_DELIVERY_MODE dest_LowestPrio
+ #define INT_DEST_MODE 1     /* logical delivery broadcast to all procs */
++/*
++ * this isn't really broadcast, just a (potentially inaccurate) upper
++ * bound for valid physical APIC id's
++ */
+ #define APIC_BROADCAST_ID      0x0F
+-static inline unsigned long check_apicid_used(unsigned long bitmap, int apicid) 
+-{ 
+-      return (bitmap & (1UL << apicid)); 
+-} 
++static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
++{
++      return physid_isset(apicid, bitmap);
++}
+-static inline unsigned long check_apicid_present(int bit) 
++static inline unsigned long check_apicid_present(int bit)
+ {
+-      return (phys_cpu_present_map & (1UL << bit));
++      return physid_isset(bit, phys_cpu_present_map);
+ }
+ /*
+@@ -50,7 +54,7 @@ static inline void init_apic_ldr(void)
+       apic_write_around(APIC_LDR, val);
+ }
+-static inline unsigned long ioapic_phys_id_map(unsigned long phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+ {
+       return phys_map;
+ }
+@@ -82,9 +86,9 @@ static inline int cpu_present_to_apicid(
+       return  mps_cpu;
+ }
+-static inline unsigned long apicid_to_cpu_present(int phys_apicid)
++static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
+ {
+-      return (1ul << phys_apicid);
++      return physid_mask_of_physid(phys_apicid);
+ }
+ static inline int mpc_apic_id(struct mpc_config_processor *m, 
+@@ -104,18 +108,17 @@ static inline void setup_portio_remap(vo
+ static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
+ {
+-      return test_bit(boot_cpu_physical_apicid, &phys_cpu_present_map);
++      return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map);
+ }
+ static inline int apic_id_registered(void)
+ {
+-      return (test_bit(GET_APIC_ID(apic_read(APIC_ID)), 
+-                                              &phys_cpu_present_map));
++      return physid_isset(GET_APIC_ID(apic_read(APIC_ID)), phys_cpu_present_map);
+ }
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+-      return cpumask;
++      return cpus_coerce_const(cpumask);
+ }
+ static inline void enable_apic_mode(void)
+--- linux-2.6.0-test1/include/asm-i386/mach-default/mach_ipi.h 2003-06-14 12:18:33.000000000 -0700
++++ 25/include/asm-i386/mach-default/mach_ipi.h        2003-07-19 17:04:07.000000000 -0700
+@@ -1,10 +1,10 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+-inline void send_IPI_mask_bitmask(int mask, int vector);
++inline void send_IPI_mask_bitmask(cpumask_t mask, int vector);
+ inline void __send_IPI_shortcut(unsigned int shortcut, int vector);
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+       send_IPI_mask_bitmask(mask, vector);
+ }
+--- linux-2.6.0-test1/include/asm-i386/mach-es7000/mach_apic.h 2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-es7000/mach_apic.h        2003-07-19 17:04:07.000000000 -0700
+@@ -11,12 +11,12 @@ static inline int apic_id_registered(voi
+               return (1);
+ }
+-static inline unsigned long target_cpus(void)
++static inline cpumask_t target_cpus(void)
+ { 
+ #if defined CONFIG_ES7000_CLUSTERED_APIC
+-      return (0xff);
++      return CPU_MASK_ALL;
+ #else
+-      return (bios_cpu_apicid[smp_processor_id()]);
++      return cpumask_of_cpu(bios_cpu_apicid[smp_processor_id()]);
+ #endif
+ }
+ #define TARGET_CPUS   (target_cpus())
+@@ -40,13 +40,13 @@ static inline unsigned long target_cpus(
+ #define APIC_BROADCAST_ID     (0xff)
+-static inline unsigned long check_apicid_used(unsigned long bitmap, int apicid) 
++static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
+ { 
+       return 0;
+ } 
+ static inline unsigned long check_apicid_present(int bit) 
+ {
+-      return (phys_cpu_present_map & (1 << bit));
++      return physid_isset(bit, phys_cpu_present_map);
+ }
+ #define apicid_cluster(apicid) (apicid & 0xF0)
+@@ -88,7 +88,7 @@ static inline void clustered_apic_check(
+       int apic = bios_cpu_apicid[smp_processor_id()];
+       printk("Enabling APIC mode:  %s.  Using %d I/O APICs, target cpus %lx\n",
+               (apic_version[apic] == 0x14) ? 
+-              "Physical Cluster" : "Logical Cluster", nr_ioapics, TARGET_CPUS);
++              "Physical Cluster" : "Logical Cluster", nr_ioapics, cpus_coerce(TARGET_CPUS));
+ }
+ static inline int multi_timer_check(int apic, int irq)
+@@ -110,10 +110,13 @@ static inline int cpu_present_to_apicid(
+               return (int) bios_cpu_apicid[mps_cpu];
+ }
+-static inline unsigned long apicid_to_cpu_present(int phys_apicid)
++static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
+ {
+-      static int cpu = 0;
+-      return (1ul << cpu++);
++      static int id = 0;
++      physid_mask_t mask;
++      mask = physid_mask_of_physid(id);
++      ++id;
++      return mask;
+ }
+ extern volatile u8 cpu_2_logical_apicid[];
+@@ -123,7 +126,7 @@ static inline int cpu_to_logical_apicid(
+        return (int)cpu_2_logical_apicid[cpu];
+ }
+-static inline int mpc_apic_id(struct mpc_config_processor *m, int quad)
++static inline int mpc_apic_id(struct mpc_config_processor *m, struct mpc_config_translation *unused)
+ {
+       printk("Processor #%d %ld:%ld APIC version %d\n",
+               m->mpc_apicid,
+@@ -133,10 +136,10 @@ static inline int mpc_apic_id(struct mpc
+       return (m->mpc_apicid);
+ }
+-static inline ulong ioapic_phys_id_map(ulong phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+ {
+       /* For clustered we don't have a good way to do this yet - hack */
+-      return (0xff);
++      return physids_promote(0xff);
+ }
+@@ -151,32 +154,30 @@ static inline int check_phys_apicid_pres
+       return (1);
+ }
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+       int num_bits_set;
+       int cpus_found = 0;
+       int cpu;
+       int apicid;     
+-      if (cpumask == TARGET_CPUS)
+-              return cpumask;
+-      num_bits_set = hweight32(cpumask); 
++      num_bits_set = cpus_weight_const(cpumask);
+       /* Return id to all */
+-      if (num_bits_set == 32)
+-              return TARGET_CPUS;
++      if (num_bits_set == NR_CPUS)
++              return 0xFF;
+       /* 
+        * The cpus in the mask must all be on the apic cluster.  If are not 
+        * on the same apicid cluster return default value of TARGET_CPUS. 
+        */
+-      cpu = ffs(cpumask)-1;
++      cpu = first_cpu_const(cpumask);
+       apicid = cpu_to_logical_apicid(cpu);
+       while (cpus_found < num_bits_set) {
+-              if (cpumask & (1 << cpu)) {
++              if (cpu_isset_const(cpu, cpumask)) {
+                       int new_apicid = cpu_to_logical_apicid(cpu);
+                       if (apicid_cluster(apicid) != 
+                                       apicid_cluster(new_apicid)){
+                               printk ("%s: Not a valid mask!\n",__FUNCTION__);
+-                              return TARGET_CPUS;
++                              return 0xFF;
+                       }
+                       apicid = new_apicid;
+                       cpus_found++;
+--- linux-2.6.0-test1/include/asm-i386/mach-es7000/mach_ipi.h  2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-es7000/mach_ipi.h 2003-07-19 17:04:07.000000000 -0700
+@@ -1,18 +1,19 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+-static inline void send_IPI_mask_sequence(int mask, int vector);
++static inline void send_IPI_mask_sequence(cpumask_t mask, int vector);
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+       send_IPI_mask_sequence(mask, vector);
+ }
+ static inline void send_IPI_allbutself(int vector)
+ {
+-      unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
+-
+-      if (mask)
++      cpumask_t mask = cpumask_of_cpu(smp_processor_id());
++      cpus_complement(mask);
++      cpus_and(mask, mask, cpu_online_map);
++      if (!cpus_empty(mask))
+               send_IPI_mask(mask, vector);
+ }
+--- linux-2.6.0-test1/include/asm-i386/mach-numaq/mach_apic.h  2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-numaq/mach_apic.h 2003-07-19 17:04:07.000000000 -0700
+@@ -6,7 +6,13 @@
+ #define APIC_DFR_VALUE        (APIC_DFR_CLUSTER)
+-#define TARGET_CPUS (~0UL)
++static inline cpumask_t target_cpus(void)
++{
++      cpumask_t tmp = CPU_MASK_ALL;
++      return tmp;
++}
++
++#define TARGET_CPUS (target_cpus())
+ #define NO_BALANCE_IRQ (1)
+ #define esr_disable (1)
+@@ -15,13 +21,13 @@
+ #define INT_DEST_MODE 0     /* physical delivery on LOCAL quad */
+  
+ #define APIC_BROADCAST_ID      0x0F
+-#define check_apicid_used(bitmap, apicid) ((bitmap) & (1 << (apicid)))
+-#define check_apicid_present(bit) (phys_cpu_present_map & (1 << bit))
++#define check_apicid_used(bitmap, apicid) physid_isset(apicid, bitmap)
++#define check_apicid_present(bit) physid_isset(bit, phys_cpu_present_map)
+ #define apicid_cluster(apicid) (apicid & 0xF0)
+ static inline int apic_id_registered(void)
+ {
+-      return (1);
++      return 1;
+ }
+ static inline void init_apic_ldr(void)
+@@ -41,13 +47,13 @@ static inline void clustered_apic_check(
+  */
+ static inline int multi_timer_check(int apic, int irq)
+ {
+-      return (apic != 0 && irq == 0);
++      return apic != 0 && irq == 0;
+ }
+-static inline ulong ioapic_phys_id_map(ulong phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+ {
+       /* We don't have a good way to do this yet - hack */
+-      return 0xf;
++      return physids_promote(0xFUL);
+ }
+ /* Mapping from cpu number to logical apicid */
+@@ -59,22 +65,25 @@ static inline int cpu_to_logical_apicid(
+ static inline int cpu_present_to_apicid(int mps_cpu)
+ {
+-      return ( ((mps_cpu/4)*16) + (1<<(mps_cpu%4)) );
++      return ((mps_cpu >> 2) << 4) | (1 << (mps_cpu & 0x3));
+ }
+ static inline int generate_logical_apicid(int quad, int phys_apicid)
+ {
+-      return ( (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1) );
++      return (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1);
+ }
+ static inline int apicid_to_node(int logical_apicid) 
+ {
+-      return (logical_apicid >> 4);
++      return logical_apicid >> 4;
+ }
+-static inline unsigned long apicid_to_cpu_present(int logical_apicid)
++static inline physid_mask_t apicid_to_cpu_present(int logical_apicid)
+ {
+-      return ( (logical_apicid&0xf) << (4*apicid_to_node(logical_apicid)) );
++      int node = apicid_to_node(logical_apicid);
++      int cpu = __ffs(logical_apicid & 0xf);
++
++      return physid_mask_of_physid(cpu + 4*node);
+ }
+ static inline int mpc_apic_id(struct mpc_config_processor *m, 
+@@ -115,7 +124,7 @@ static inline void enable_apic_mode(void
+  * We use physical apicids here, not logical, so just return the default
+  * physical broadcast to stop people from breaking us
+  */
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+       return (int) 0xF;
+ }
+--- linux-2.6.0-test1/include/asm-i386/mach-numaq/mach_ipi.h   2003-06-14 12:18:29.000000000 -0700
++++ 25/include/asm-i386/mach-numaq/mach_ipi.h  2003-07-19 17:04:07.000000000 -0700
+@@ -1,18 +1,19 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+-static inline void send_IPI_mask_sequence(int mask, int vector);
++static inline void send_IPI_mask_sequence(cpumask_t, int vector);
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+       send_IPI_mask_sequence(mask, vector);
+ }
+ static inline void send_IPI_allbutself(int vector)
+ {
+-      unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
++      cpumask_t mask = cpu_online_map;
++      cpu_clear(smp_processor_id(), mask);
+-      if (mask)
++      if (!cpus_empty(mask))
+               send_IPI_mask(mask, vector);
+ }
+--- linux-2.6.0-test1/include/asm-i386/mach-summit/mach_apic.h 2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-summit/mach_apic.h        2003-07-19 17:04:07.000000000 -0700
+@@ -18,17 +18,18 @@ static inline unsigned long xapic_phys_t
+ #define APIC_DFR_VALUE        (APIC_DFR_CLUSTER)
+-static inline unsigned long target_cpus(void)
++static inline cpumask_t target_cpus(void)
+ {
+-      return (~0UL);
++      cpumask_t tmp = CPU_MASK_ALL;
++      return tmp;
+ } 
+ #define TARGET_CPUS   (target_cpus())
+ #define INT_DELIVERY_MODE (dest_Fixed)
+ #define INT_DEST_MODE 1     /* logical delivery broadcast to all procs */
+-#define APIC_BROADCAST_ID     (0x0F)
+-static inline unsigned long check_apicid_used(unsigned long bitmap, int apicid) 
++#define APIC_BROADCAST_ID     (0xFF)
++static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
+ {
+       return 0;
+ } 
+@@ -72,7 +73,7 @@ static inline void clustered_apic_check(
+ static inline int apicid_to_node(int logical_apicid)
+ {
+-      return (logical_apicid >> 5);          /* 2 clusterids per CEC */
++      return logical_apicid >> 5;          /* 2 clusterids per CEC */
+ }
+ /* Mapping from cpu number to logical apicid */
+@@ -87,15 +88,15 @@ static inline int cpu_present_to_apicid(
+       return (int) bios_cpu_apicid[mps_cpu];
+ }
+-static inline ulong ioapic_phys_id_map(ulong phys_map)
++static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_id_map)
+ {
+       /* For clustered we don't have a good way to do this yet - hack */
+-      return 0x0F;
++      return physids_promote(0x0F);
+ }
+-static inline unsigned long apicid_to_cpu_present(int apicid)
++static inline physid_mask_t apicid_to_cpu_present(int apicid)
+ {
+-      return 1;
++      return physid_mask_of_physid(0);
+ }
+ static inline int mpc_apic_id(struct mpc_config_processor *m, 
+@@ -122,25 +123,25 @@ static inline void enable_apic_mode(void
+ {
+ }
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+       int num_bits_set;
+       int cpus_found = 0;
+       int cpu;
+       int apicid;     
+-      num_bits_set = hweight32(cpumask); 
++      num_bits_set = cpus_weight_const(cpumask);
+       /* Return id to all */
+-      if (num_bits_set == 32)
++      if (num_bits_set == NR_CPUS)
+               return (int) 0xFF;
+       /* 
+        * The cpus in the mask must all be on the apic cluster.  If are not 
+        * on the same apicid cluster return default value of TARGET_CPUS. 
+        */
+-      cpu = ffs(cpumask)-1;
++      cpu = first_cpu_const(cpumask);
+       apicid = cpu_to_logical_apicid(cpu);
+       while (cpus_found < num_bits_set) {
+-              if (cpumask & (1 << cpu)) {
++              if (cpu_isset_const(cpu, cpumask)) {
+                       int new_apicid = cpu_to_logical_apicid(cpu);
+                       if (apicid_cluster(apicid) != 
+                                       apicid_cluster(new_apicid)){
+--- linux-2.6.0-test1/include/asm-i386/mach-summit/mach_ipi.h  2003-06-14 12:17:59.000000000 -0700
++++ 25/include/asm-i386/mach-summit/mach_ipi.h 2003-07-19 17:04:07.000000000 -0700
+@@ -1,18 +1,19 @@
+ #ifndef __ASM_MACH_IPI_H
+ #define __ASM_MACH_IPI_H
+-inline void send_IPI_mask_sequence(int mask, int vector);
++inline void send_IPI_mask_sequence(cpumask_t mask, int vector);
+-static inline void send_IPI_mask(int mask, int vector)
++static inline void send_IPI_mask(cpumask_t mask, int vector)
+ {
+       send_IPI_mask_sequence(mask, vector);
+ }
+ static inline void send_IPI_allbutself(int vector)
+ {
+-      unsigned long mask = cpu_online_map & ~(1 << smp_processor_id());
++      cpumask_t mask = cpu_online_map;
++      cpu_clear(smp_processor_id(), mask);
+-      if (mask)
++      if (!cpus_empty(mask))
+               send_IPI_mask(mask, vector);
+ }
+--- linux-2.6.0-test1/include/asm-i386/mach-visws/mach_apic.h  2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mach-visws/mach_apic.h 2003-07-19 17:04:07.000000000 -0700
+@@ -12,17 +12,16 @@
+ #ifdef CONFIG_SMP
+  #define TARGET_CPUS cpu_online_map
+ #else
+- #define TARGET_CPUS 0x01
++ #define TARGET_CPUS cpumask_of_cpu(0)
+ #endif
+ #define APIC_BROADCAST_ID      0x0F
+-#define check_apicid_used(bitmap, apicid) (bitmap & (1 << apicid))
+-#define check_apicid_present(bit) (phys_cpu_present_map & (1 << bit))
++#define check_apicid_used(bitmap, apicid)     physid_isset(apicid, bitmap)
++#define check_apicid_present(bit)             physid_isset(bit, phys_cpu_present_map)
+ static inline int apic_id_registered(void)
+ {
+-      return (test_bit(GET_APIC_ID(apic_read(APIC_ID)), 
+-                                              &phys_cpu_present_map));
++      return physid_isset(GET_APIC_ID(apic_read(APIC_ID)), phys_cpu_present_map);
+ }
+ /*
+@@ -61,9 +60,9 @@ static inline int cpu_present_to_apicid(
+       return mps_cpu;
+ }
+-static inline unsigned long apicid_to_cpu_present(int apicid)
++static inline physid_mask_t apicid_to_cpu_present(int apicid)
+ {
+-      return (1ul << apicid);
++      return physid_mask_of_physid(apicid);
+ }
+ #define WAKE_SECONDARY_VIA_INIT
+@@ -78,11 +77,11 @@ static inline void enable_apic_mode(void
+ static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
+ {
+-      return test_bit(boot_cpu_physical_apicid, &phys_cpu_present_map);
++      return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map);
+ }
+-static inline unsigned int cpu_mask_to_apicid (unsigned long cpumask)
++static inline unsigned int cpu_mask_to_apicid(cpumask_const_t cpumask)
+ {
+-      return cpumask;
++      return cpus_coerce_const(cpumask);
+ }
+ #endif /* __ASM_MACH_APIC_H */
+--- linux-2.6.0-test1/include/asm-i386/mmu_context.h   2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-i386/mmu_context.h  2003-07-19 17:04:07.000000000 -0700
+@@ -31,12 +31,12 @@ static inline void switch_mm(struct mm_s
+       if (likely(prev != next)) {
+               /* stop flush ipis for the previous mm */
+-              clear_bit(cpu, &prev->cpu_vm_mask);
++              cpu_clear(cpu, prev->cpu_vm_mask);
+ #ifdef CONFIG_SMP
+               cpu_tlbstate[cpu].state = TLBSTATE_OK;
+               cpu_tlbstate[cpu].active_mm = next;
+ #endif
+-              set_bit(cpu, &next->cpu_vm_mask);
++              cpu_set(cpu, next->cpu_vm_mask);
+               /* Re-load page tables */
+               load_cr3(next->pgd);
+@@ -52,7 +52,7 @@ static inline void switch_mm(struct mm_s
+               cpu_tlbstate[cpu].state = TLBSTATE_OK;
+               BUG_ON(cpu_tlbstate[cpu].active_mm != next);
+-              if (!test_and_set_bit(cpu, &next->cpu_vm_mask)) {
++              if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) {
+                       /* We were in lazy tlb mode and leave_mm disabled 
+                        * tlb flush IPI delivery. We must reload %cr3.
+                        */
+--- linux-2.6.0-test1/include/asm-i386/mpspec.h        2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-i386/mpspec.h       2003-07-19 17:04:07.000000000 -0700
+@@ -1,6 +1,7 @@
+ #ifndef __ASM_MPSPEC_H
+ #define __ASM_MPSPEC_H
++#include <linux/cpumask.h>
+ #include <asm/mpspec_def.h>
+ #include <mach_mpspec.h>
+@@ -11,7 +12,6 @@ extern int quad_local_to_mp_bus_id [NR_C
+ extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES];
+ extern unsigned int boot_cpu_physical_apicid;
+-extern unsigned long phys_cpu_present_map;
+ extern int smp_found_config;
+ extern void find_smp_config (void);
+ extern void get_smp_config (void);
+@@ -41,5 +41,49 @@ extern void mp_config_ioapic_for_sci(int
+ extern void mp_parse_prt (void);
+ #endif /*CONFIG_ACPI_BOOT*/
++#define PHYSID_ARRAY_SIZE     BITS_TO_LONGS(MAX_APICS)
++
++struct physid_mask
++{
++      unsigned long mask[PHYSID_ARRAY_SIZE];
++};
++
++typedef struct physid_mask physid_mask_t;
++
++#define physid_set(physid, map)                       set_bit(physid, (map).mask)
++#define physid_clear(physid, map)             clear_bit(physid, (map).mask)
++#define physid_isset(physid, map)             test_bit(physid, (map).mask)
++#define physid_test_and_set(physid, map)      test_and_set_bit(physid, (map).mask)
++
++#define physids_and(dst, src1, src2)          bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
++#define physids_or(dst, src1, src2)           bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
++#define physids_clear(map)                    bitmap_clear((map).mask, MAX_APICS)
++#define physids_complement(map)                       bitmap_complement((map).mask, MAX_APICS)
++#define physids_empty(map)                    bitmap_empty((map).mask, MAX_APICS)
++#define physids_equal(map1, map2)             bitmap_equal((map1).mask, (map2).mask, MAX_APICS)
++#define physids_weight(map)                   bitmap_weight((map).mask, MAX_APICS)
++#define physids_shift_right(d, s, n)          bitmap_shift_right((d).mask, (s).mask, n, MAX_APICS)
++#define physids_shift_left(d, s, n)           bitmap_shift_left((d).mask, (s).mask, n, MAX_APICS)
++#define physids_coerce(map)                   ((map).mask[0])
++
++#define physids_promote(physids)                                              \
++      ({                                                                      \
++              physid_mask_t __physid_mask = PHYSID_MASK_NONE;                 \
++              __physid_mask.mask[0] = physids;                                \
++              __physid_mask;                                                  \
++      })
++
++#define physid_mask_of_physid(physid)                                         \
++      ({                                                                      \
++              physid_mask_t __physid_mask = PHYSID_MASK_NONE;                 \
++              physid_set(physid, __physid_mask);                              \
++              __physid_mask;                                                  \
++      })
++
++#define PHYSID_MASK_ALL               { {[0 ... PHYSID_ARRAY_SIZE-1] = ~0UL} }
++#define PHYSID_MASK_NONE      { {[0 ... PHYSID_ARRAY_SIZE-1] = 0UL} }
++
++extern physid_mask_t phys_cpu_present_map;
++
+ #endif
+--- linux-2.6.0-test1/include/asm-i386/numaq.h 2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-i386/numaq.h        2003-07-19 17:04:07.000000000 -0700
+@@ -28,7 +28,7 @@
+ #ifdef CONFIG_X86_NUMAQ
+-#define MAX_NUMNODES          8
++#define MAX_NUMNODES          16
+ extern void get_memcfg_numaq(void);
+ #define get_memcfg_numa() get_memcfg_numaq()
+@@ -159,7 +159,7 @@ struct sys_cfg_data {
+ static inline unsigned long *get_zholes_size(int nid)
+ {
+-      return 0;
++      return NULL;
+ }
+ #endif /* CONFIG_X86_NUMAQ */
+ #endif /* NUMAQ_H */
+--- linux-2.6.0-test1/include/asm-i386/pgalloc.h       2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-i386/pgalloc.h      2003-07-19 17:07:16.000000000 -0700
+@@ -45,7 +45,8 @@ static inline void pte_free(struct page 
+  * (In the PAE case we free the pmds as part of the pgd.)
+  */
+-#define pmd_alloc_one(mm, addr)               ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)               ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)        ({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(x)                   do { } while (0)
+ #define __pmd_free_tlb(tlb,x)         do { } while (0)
+ #define pgd_populate(mm, pmd, pte)    BUG()
+--- linux-2.6.0-test1/include/asm-i386/pgtable-2level.h        2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-i386/pgtable-2level.h       2003-07-19 17:07:16.000000000 -0700
+@@ -48,13 +48,15 @@ static inline int pgd_present(pgd_t pgd)
+ #define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
+ #define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)
+-#define pgd_page(pgd) \
+-((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define pgd_page(pgd)         pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT)
++
++#define pmd_offset_map(pgd, addr)             ({ (pmd_t *)(pgd); })
++#define pmd_offset_map_nested(pgd, addr)      pmd_offset_map(pgd, addr)
++#define pmd_offset_kernel(pgd, addr)          pmd_offset_map(pgd, addr)
++
++#define pmd_unmap(pmd)                                do { } while (0)
++#define pmd_unmap_nested(pmd)                 do { } while (0)
+-static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
+-{
+-      return (pmd_t *) dir;
+-}
+ #define ptep_get_and_clear(xp)        __pte(xchg(&(xp)->pte_low, 0))
+ #define pte_same(a, b)                ((a).pte_low == (b).pte_low)
+ #define pte_page(x)           pfn_to_page(pte_pfn(x))
+--- linux-2.6.0-test1/include/asm-i386/pgtable-3level.h        2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/pgtable-3level.h       2003-07-19 17:07:16.000000000 -0700
+@@ -64,12 +64,32 @@ static inline void set_pte(pte_t *ptep, 
+  */
+ static inline void pgd_clear (pgd_t * pgd) { }
+-#define pgd_page(pgd) \
+-((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++static inline unsigned long pgd_pfn(pgd_t pgd)
++{
++      return pgd_val(pgd) >> PAGE_SHIFT;
++}
++
++#define pgd_page(pgd)         pfn_to_page(pgd_pfn(pgd))
++
++#define pmd_offset_kernel(pgd, addr)                                  \
++      ((pmd_t *)__va(pgd_val(*(pgd)) & PAGE_MASK) + pmd_index(addr))
+ /* Find an entry in the second-level page table.. */
+-#define pmd_offset(dir, address) ((pmd_t *) pgd_page(*(dir)) + \
+-                      pmd_index(address))
++#ifdef CONFIG_HIGHPMD
++#define __pmd_offset(pgd, addr, type)                                 \
++      ((pmd_t *)kmap_atomic(pgd_page(*(pgd)), type) + pmd_index(addr))
++#define __pmd_unmap(pmd, type)                kunmap_atomic(pmd, type)
++#else
++#define __pmd_offset(pgd, addr, type)                                 \
++      ((pmd_t *)__va(pgd_val(*(pgd)) & PAGE_MASK) + pmd_index(addr))
++#define __pmd_unmap(pmd, type)                do { } while (0)
++#endif
++
++#define pmd_offset_map(pgd, addr)             __pmd_offset(pgd, addr, KM_PMD0)
++#define pmd_offset_map_nested(pgd, addr)      __pmd_offset(pgd, addr, KM_PMD1)
++
++#define pmd_unmap(pmd)                                __pmd_unmap(pmd, KM_PMD0);
++#define pmd_unmap_nested(pmd)                 __pmd_unmap(pmd, KM_PMD1);
+ static inline pte_t ptep_get_and_clear(pte_t *ptep)
+ {
+@@ -123,6 +143,4 @@ static inline pmd_t pfn_pmd(unsigned lon
+ #define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) })
+ #define PTE_FILE_MAX_BITS       32
+-extern struct kmem_cache_s *pae_pgd_cachep;
+-
+ #endif /* _I386_PGTABLE_3LEVEL_H */
+--- linux-2.6.0-test1/include/asm-i386/pgtable.h       2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/pgtable.h      2003-07-19 17:07:16.000000000 -0700
+@@ -21,15 +21,25 @@
+ #include <asm/bitops.h>
+ #endif
+-extern pgd_t swapper_pg_dir[1024];
+-extern void paging_init(void);
++#include <linux/slab.h>
++#include <linux/list.h>
++#include <linux/spinlock.h>
+ /*
+  * ZERO_PAGE is a global shared page that is always zero: used
+  * for zero-mapped memory areas etc..
+  */
+-extern unsigned long empty_zero_page[1024];
+ #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
++extern unsigned long empty_zero_page[1024];
++extern pgd_t swapper_pg_dir[1024];
++extern kmem_cache_t *pgd_cache;
++extern spinlock_t pgd_lock;
++extern struct list_head pgd_list;
++
++void pgd_ctor(void *, kmem_cache_t *, unsigned long);
++void pgd_dtor(void *, kmem_cache_t *, unsigned long);
++void pgtable_cache_init(void);
++void paging_init(void);
+ #endif /* !__ASSEMBLY__ */
+@@ -41,20 +51,8 @@ extern unsigned long empty_zero_page[102
+ #ifndef __ASSEMBLY__
+ #ifdef CONFIG_X86_PAE
+ # include <asm/pgtable-3level.h>
+-
+-/*
+- * Need to initialise the X86 PAE caches
+- */
+-extern void pgtable_cache_init(void);
+-
+ #else
+ # include <asm/pgtable-2level.h>
+-
+-/*
+- * No page table caches to initialise
+- */
+-#define pgtable_cache_init()  do { } while (0)
+-
+ #endif
+ #endif
+--- linux-2.6.0-test1/include/asm-i386/posix_types.h   2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/posix_types.h  2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned short        __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned short        __kernel_mode_t;
+ typedef unsigned short        __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-i386/rwlock.h        2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/rwlock.h       2003-07-19 17:04:49.000000000 -0700
+@@ -20,28 +20,52 @@
+ #define RW_LOCK_BIAS           0x01000000
+ #define RW_LOCK_BIAS_STR      "0x01000000"
+-#define __build_read_lock_ptr(rw, helper)   \
+-      asm volatile(LOCK "subl $1,(%0)\n\t" \
+-                   "js 2f\n" \
+-                   "1:\n" \
+-                   LOCK_SECTION_START("") \
+-                   "2:\tcall " helper "\n\t" \
+-                   "jmp 1b\n" \
+-                   LOCK_SECTION_END \
+-                   ::"a" (rw) : "memory")
+-
+-#define __build_read_lock_const(rw, helper)   \
+-      asm volatile(LOCK "subl $1,%0\n\t" \
+-                   "js 2f\n" \
+-                   "1:\n" \
+-                   LOCK_SECTION_START("") \
+-                   "2:\tpushl %%eax\n\t" \
+-                   "leal %0,%%eax\n\t" \
+-                   "call " helper "\n\t" \
+-                   "popl %%eax\n\t" \
+-                   "jmp 1b\n" \
+-                   LOCK_SECTION_END \
+-                   :"=m" (*(volatile int *)rw) : : "memory")
++#ifdef CONFIG_SPINLINE
++
++      #define __build_read_lock_ptr(rw, helper)   \
++              asm volatile(LOCK "subl $1,(%0)\n\t" \
++                           "jns 1f\n\t" \
++                           "call " helper "\n\t" \
++                           "1:\t" \
++                           ::"a" (rw) : "memory")
++
++      #define __build_read_lock_const(rw, helper)   \
++              asm volatile(LOCK "subl $1,%0\n\t" \
++                           "jns 1f\n\t" \
++                           "pushl %%eax\n\t" \
++                           "leal %0,%%eax\n\t" \
++                           "call " helper "\n\t" \
++                           "popl %%eax\n\t" \
++                           "1:\t" \
++                           :"=m" (*(volatile int *)rw) : : "memory")
++
++#else /* !CONFIG_SPINLINE */
++
++      #define __build_read_lock_ptr(rw, helper)   \
++              asm volatile(LOCK "subl $1,(%0)\n\t" \
++                           "js 2f\n" \
++                           "1:\n" \
++                           LOCK_SECTION_START("") \
++                           "2:\tcall " helper "\n\t" \
++                           "jmp 1b\n" \
++                           LOCK_SECTION_END \
++                           ::"a" (rw) : "memory")
++
++      #define __build_read_lock_const(rw, helper)   \
++              asm volatile(LOCK "subl $1,%0\n\t" \
++                           "js 2f\n" \
++                           "1:\n" \
++                           LOCK_SECTION_START("") \
++                           "2:\tpushl %%eax\n\t" \
++                           "leal %0,%%eax\n\t" \
++                           "call " helper "\n\t" \
++                           "popl %%eax\n\t" \
++                           "jmp 1b\n" \
++                           LOCK_SECTION_END \
++                           :"=m" (*(volatile int *)rw) : : "memory")
++
++#endif /* CONFIG_SPINLINE */
++
+ #define __build_read_lock(rw, helper) do { \
+                                               if (__builtin_constant_p(rw)) \
+@@ -50,28 +74,51 @@
+                                                       __build_read_lock_ptr(rw, helper); \
+                                       } while (0)
+-#define __build_write_lock_ptr(rw, helper) \
+-      asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
+-                   "jnz 2f\n" \
+-                   "1:\n" \
+-                   LOCK_SECTION_START("") \
+-                   "2:\tcall " helper "\n\t" \
+-                   "jmp 1b\n" \
+-                   LOCK_SECTION_END \
+-                   ::"a" (rw) : "memory")
+-
+-#define __build_write_lock_const(rw, helper) \
+-      asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
+-                   "jnz 2f\n" \
+-                   "1:\n" \
+-                   LOCK_SECTION_START("") \
+-                   "2:\tpushl %%eax\n\t" \
+-                   "leal %0,%%eax\n\t" \
+-                   "call " helper "\n\t" \
+-                   "popl %%eax\n\t" \
+-                   "jmp 1b\n" \
+-                   LOCK_SECTION_END \
+-                   :"=m" (*(volatile int *)rw) : : "memory")
++#ifdef CONFIG_SPINLINE
++
++      #define __build_write_lock_ptr(rw, helper) \
++              asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
++                           "jz 1f\n\t" \
++                           "call " helper "\n\t" \
++                           "1:\n" \
++                           ::"a" (rw) : "memory")
++
++      #define __build_write_lock_const(rw, helper) \
++              asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
++                           "jz 1f\n\t" \
++                           "pushl %%eax\n\t" \
++                           "leal %0,%%eax\n\t" \
++                           "call " helper "\n\t" \
++                           "popl %%eax\n\t" \
++                           "1:\n" \
++                           :"=m" (*(volatile int *)rw) : : "memory")
++
++#else /* !CONFIG_SPINLINE */
++
++      #define __build_write_lock_ptr(rw, helper) \
++              asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
++                           "jnz 2f\n" \
++                           "1:\n" \
++                           LOCK_SECTION_START("") \
++                           "2:\tcall " helper "\n\t" \
++                           "jmp 1b\n" \
++                           LOCK_SECTION_END \
++                           ::"a" (rw) : "memory")
++
++      #define __build_write_lock_const(rw, helper) \
++              asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
++                           "jnz 2f\n" \
++                           "1:\n" \
++                           LOCK_SECTION_START("") \
++                           "2:\tpushl %%eax\n\t" \
++                           "leal %0,%%eax\n\t" \
++                           "call " helper "\n\t" \
++                           "popl %%eax\n\t" \
++                           "jmp 1b\n" \
++                           LOCK_SECTION_END \
++                           :"=m" (*(volatile int *)rw) : : "memory")
++
++#endif /* CONFIG_SPINLINE */
+ #define __build_write_lock(rw, helper)        do { \
+                                               if (__builtin_constant_p(rw)) \
+--- linux-2.6.0-test1/include/asm-i386/smp.h   2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-i386/smp.h  2003-07-19 17:04:07.000000000 -0700
+@@ -8,6 +8,7 @@
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #endif
+ #ifdef CONFIG_X86_LOCAL_APIC
+@@ -31,9 +32,7 @@
+  */
+  
+ extern void smp_alloc_memory(void);
+-extern unsigned long phys_cpu_present_map;
+-extern unsigned long cpu_online_map;
+-extern volatile unsigned long smp_invalidate_needed;
++extern physid_mask_t phys_cpu_present_map;
+ extern int pic_mode;
+ extern int smp_num_siblings;
+ extern int cpu_sibling_map[];
+@@ -54,37 +53,19 @@ extern void zap_low_mappings (void);
+  */
+ #define smp_processor_id() (current_thread_info()->cpu)
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+-#define cpu_possible(cpu) (cpu_callout_map & (1<<(cpu)))
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-
+-#define for_each_cpu(cpu, mask) \
+-      for(mask = cpu_online_map; \
+-          cpu = __ffs(mask), mask != 0; \
+-          mask &= ~(1<<cpu))
+-
+-extern inline unsigned int num_online_cpus(void)
+-{
+-      return hweight32(cpu_online_map);
+-}
++#define cpu_possible(cpu) cpu_isset(cpu, cpu_callout_map)
+ /* We don't mark CPUs online until __cpu_up(), so we need another measure */
+ static inline int num_booting_cpus(void)
+ {
+-      return hweight32(cpu_callout_map);
++      return cpus_weight(cpu_callout_map);
+ }
+ extern void map_cpu_to_logical_apicid(void);
+ extern void unmap_cpu_to_logical_apicid(int cpu);
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-      if (mask & cpu_online_map)
+-              return __ffs(mask & cpu_online_map);
+-
+-      return NR_CPUS;
+-}
+ #ifdef CONFIG_X86_LOCAL_APIC
+ #ifdef APIC_DEFINITION
+--- linux-2.6.0-test1/include/asm-i386/spinlock.h      2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-i386/spinlock.h     2003-07-19 17:06:40.000000000 -0700
+@@ -43,18 +43,35 @@ typedef struct {
+ #define spin_is_locked(x)     (*(volatile signed char *)(&(x)->lock) <= 0)
+ #define spin_unlock_wait(x)   do { barrier(); } while(spin_is_locked(x))
+-#define spin_lock_string \
+-      "\n1:\t" \
+-      "lock ; decb %0\n\t" \
+-      "js 2f\n" \
+-      LOCK_SECTION_START("") \
+-      "2:\t" \
+-      "rep;nop\n\t" \
+-      "cmpb $0,%0\n\t" \
+-      "jle 2b\n\t" \
+-      "jmp 1b\n" \
+-      LOCK_SECTION_END
++#ifdef CONFIG_SPINLINE
++      #define spin_lock_string \
++              "\n1:\t" \
++              "lock ; decb %0\n\t" \
++              "js 2f\n" \
++              "jmp 3f\n" \
++              "2:\t" \
++              "rep;nop\n\t" \
++              "cmpb $0,%0\n\t" \
++              "jle 2b\n\t" \
++              "jmp 1b\n" \
++              "3:\t"
++
++#else /* !CONFIG_SPINLINE */
++
++      #define spin_lock_string \
++              "\n1:\t" \
++              "lock ; decb %0\n\t" \
++              "js 2f\n" \
++              LOCK_SECTION_START("") \
++              "2:\t" \
++              "rep;nop\n\t" \
++              "cmpb $0,%0\n\t" \
++              "jle 2b\n\t" \
++              "jmp 1b\n" \
++              LOCK_SECTION_END
++
++#endif /* CONFIG_SPINLINE */
+ /*
+  * This works. Despite all the confusion.
+  * (except on PPro SMP or if we are using OOSTORE)
+@@ -138,6 +155,11 @@ here:
+  */
+ typedef struct {
+       volatile unsigned int lock;
++#ifdef CONFIG_LOCKMETER
++      /* required for LOCKMETER since all bits in lock are used */
++      /* and we need this storage for CPU and lock INDEX        */
++      unsigned lockmeter_magic;
++#endif
+ #ifdef CONFIG_DEBUG_SPINLOCK
+       unsigned magic;
+ #endif
+@@ -145,11 +167,19 @@ typedef struct {
+ #define RWLOCK_MAGIC  0xdeaf1eed
++#ifdef CONFIG_LOCKMETER
++#ifdef CONFIG_DEBUG_SPINLOCK
++#define RWLOCK_MAGIC_INIT     , 0, RWLOCK_MAGIC
++#else
++#define RWLOCK_MAGIC_INIT     , 0
++#endif
++#else /* !CONFIG_LOCKMETER */
+ #ifdef CONFIG_DEBUG_SPINLOCK
+ #define RWLOCK_MAGIC_INIT     , RWLOCK_MAGIC
+ #else
+ #define RWLOCK_MAGIC_INIT     /* */
+ #endif
++#endif /* !CONFIG_LOCKMETER */
+ #define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
+@@ -196,4 +226,58 @@ static inline int _raw_write_trylock(rwl
+       return 0;
+ }
++#ifdef CONFIG_LOCKMETER
++static inline int _raw_read_trylock(rwlock_t *lock)
++{
++/* FIXME -- replace with assembler */
++      atomic_t *count = (atomic_t *)lock;
++      atomic_dec(count);
++      if (count->counter > 0)
++              return 1;
++      atomic_inc(count);
++      return 0;
++}
++#endif
++
++#if defined(CONFIG_LOCKMETER) && defined(CONFIG_HAVE_DEC_LOCK)
++extern void _metered_spin_lock  (spinlock_t *lock);
++extern void _metered_spin_unlock(spinlock_t *lock);
++
++/*
++ *  Matches what is in arch/i386/lib/dec_and_lock.c, except this one is
++ *  "static inline" so that the spin_lock(), if actually invoked, is charged
++ *  against the real caller, not against the catch-all atomic_dec_and_lock
++ */
++static inline int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
++{
++      int counter;
++      int newcount;
++
++repeat:
++      counter = atomic_read(atomic);
++      newcount = counter-1;
++
++      if (!newcount)
++              goto slow_path;
++
++      asm volatile("lock; cmpxchgl %1,%2"
++              :"=a" (newcount)
++              :"r" (newcount), "m" (atomic->counter), "0" (counter));
++
++      /* If the above failed, "eax" will have changed */
++      if (newcount != counter)
++              goto repeat;
++      return 0;
++
++slow_path:
++      _metered_spin_lock(lock);
++      if (atomic_dec_and_test(atomic))
++              return 1;
++      _metered_spin_unlock(lock);
++      return 0;
++}
++
++#define ATOMIC_DEC_AND_LOCK
++#endif
++
+ #endif /* __ASM_SPINLOCK_H */
+--- linux-2.6.0-test1/include/asm-i386/stat.h  2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-i386/stat.h 2003-07-19 17:06:16.000000000 -0700
+@@ -9,6 +9,7 @@ struct __old_kernel_stat {
+       unsigned short st_uid;
+       unsigned short st_gid;
+       unsigned short st_rdev;
++      unsigned short __pad_16bit;
+       unsigned long  st_size;
+       unsigned long  st_atime;
+       unsigned long  st_mtime;
+--- linux-2.6.0-test1/include/asm-i386/thread_info.h   2003-06-14 12:17:58.000000000 -0700
++++ 25/include/asm-i386/thread_info.h  2003-07-19 17:03:50.000000000 -0700
+@@ -87,8 +87,8 @@ static inline struct thread_info *curren
+ /* thread information allocation */
+ #define THREAD_SIZE (2*PAGE_SIZE)
+-#define alloc_thread_info(tsk) ((struct thread_info *) __get_free_pages(GFP_KERNEL,1))
+-#define free_thread_info(ti) free_pages((unsigned long) (ti), 1)
++#define alloc_thread_info(task) ((struct thread_info *)kmalloc(THREAD_SIZE, GFP_KERNEL))
++#define free_thread_info(info)        kfree(info)
+ #define get_thread_info(ti) get_task_struct((ti)->task)
+ #define put_thread_info(ti) put_task_struct((ti)->task)
+--- linux-2.6.0-test1/include/asm-i386/topology.h      2003-06-14 12:17:59.000000000 -0700
++++ 25/include/asm-i386/topology.h     2003-07-19 17:04:07.000000000 -0700
+@@ -31,9 +31,11 @@
+ #include <asm/mpspec.h>
++#include <linux/cpumask.h>
++
+ /* Mappings between logical cpu number and node number */
+-extern volatile unsigned long node_2_cpu_mask[];
+-extern volatile int cpu_2_node[];
++extern cpumask_t node_2_cpu_mask[];
++extern int cpu_2_node[];
+ /* Returns the number of the node containing CPU 'cpu' */
+ static inline int cpu_to_node(int cpu)
+@@ -49,7 +51,7 @@ static inline int cpu_to_node(int cpu)
+ #define parent_node(node) (node)
+ /* Returns a bitmask of CPUs on Node 'node'. */
+-static inline unsigned long node_to_cpumask(int node)
++static inline cpumask_t node_to_cpumask(int node)
+ {
+       return node_2_cpu_mask[node];
+ }
+@@ -57,14 +59,15 @@ static inline unsigned long node_to_cpum
+ /* Returns the number of the first CPU on Node 'node'. */
+ static inline int node_to_first_cpu(int node)
+ { 
+-      return __ffs(node_to_cpumask(node));
++      cpumask_t mask = node_to_cpumask(node);
++      return first_cpu(mask);
+ }
+ /* Returns the number of the first MemBlk on Node 'node' */
+ #define node_to_memblk(node) (node)
+ /* Returns the number of the node containing PCI bus 'bus' */
+-static inline unsigned long pcibus_to_cpumask(int bus)
++static inline cpumask_t pcibus_to_cpumask(int bus)
+ {
+       return node_to_cpumask(mp_bus_id_to_node[bus]);
+ }
+--- linux-2.6.0-test1/include/asm-i386/unistd.h        2003-07-13 21:44:35.000000000 -0700
++++ 25/include/asm-i386/unistd.h       2003-07-19 17:06:37.000000000 -0700
+@@ -277,8 +277,9 @@
+ #define __NR_fstatfs64                269
+ #define __NR_tgkill           270
+ #define __NR_utimes           271
++#define __NR_mknod64          272
+-#define NR_syscalls 272
++#define NR_syscalls 273
+ /* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
+--- linux-2.6.0-test1/include/asm-ia64/atomic.h        2003-06-14 12:17:59.000000000 -0700
++++ 25/include/asm-ia64/atomic.h       2003-07-19 17:03:50.000000000 -0700
+@@ -9,7 +9,7 @@
+  * "int" types were carefully placed so as to ensure proper operation
+  * of the macros.
+  *
+- * Copyright (C) 1998, 1999, 2002 Hewlett-Packard Co
++ * Copyright (C) 1998, 1999, 2002-2003 Hewlett-Packard Co
+  *    David Mosberger-Tang <davidm@hpl.hp.com>
+  */
+ #include <linux/types.h>
+@@ -21,11 +21,16 @@
+  * memory accesses are ordered.
+  */
+ typedef struct { volatile __s32 counter; } atomic_t;
++typedef struct { volatile __s64 counter; } atomic64_t;
+ #define ATOMIC_INIT(i)                ((atomic_t) { (i) })
++#define ATOMIC64_INIT(i)      ((atomic64_t) { (i) })
+ #define atomic_read(v)                ((v)->counter)
++#define atomic64_read(v)      ((v)->counter)
++
+ #define atomic_set(v,i)               (((v)->counter) = (i))
++#define atomic64_set(v,i)     (((v)->counter) = (i))
+ static __inline__ int
+ ia64_atomic_add (int i, atomic_t *v)
+@@ -37,7 +42,21 @@ ia64_atomic_add (int i, atomic_t *v)
+               CMPXCHG_BUGCHECK(v);
+               old = atomic_read(v);
+               new = old + i;
+-      } while (ia64_cmpxchg("acq", v, old, old + i, sizeof(atomic_t)) != old);
++      } while (ia64_cmpxchg("acq", v, old, new, sizeof(atomic_t)) != old);
++      return new;
++}
++
++static __inline__ int
++ia64_atomic64_add (int i, atomic64_t *v)
++{
++      __s64 old, new;
++      CMPXCHG_BUGCHECK_DECL
++
++      do {
++              CMPXCHG_BUGCHECK(v);
++              old = atomic_read(v);
++              new = old + i;
++      } while (ia64_cmpxchg("acq", v, old, new, sizeof(atomic_t)) != old);
+       return new;
+ }
+@@ -55,6 +74,20 @@ ia64_atomic_sub (int i, atomic_t *v)
+       return new;
+ }
++static __inline__ int
++ia64_atomic64_sub (int i, atomic64_t *v)
++{
++      __s64 old, new;
++      CMPXCHG_BUGCHECK_DECL
++
++      do {
++              CMPXCHG_BUGCHECK(v);
++              old = atomic_read(v);
++              new = old - i;
++      } while (ia64_cmpxchg("acq", v, old, new, sizeof(atomic_t)) != old);
++      return new;
++}
++
+ #define atomic_add_return(i,v)                                                \
+ ({                                                                    \
+       int __ia64_aar_i = (i);                                         \
+@@ -67,6 +100,18 @@ ia64_atomic_sub (int i, atomic_t *v)
+               : ia64_atomic_add(__ia64_aar_i, v);                     \
+ })
++#define atomic64_add_return(i,v)                                      \
++({                                                                    \
++      long __ia64_aar_i = (i);                                        \
++      (__builtin_constant_p(i)                                        \
++       && (   (__ia64_aar_i ==  1) || (__ia64_aar_i ==   4)           \
++           || (__ia64_aar_i ==  8) || (__ia64_aar_i ==  16)           \
++           || (__ia64_aar_i == -1) || (__ia64_aar_i ==  -4)           \
++           || (__ia64_aar_i == -8) || (__ia64_aar_i == -16)))         \
++              ? ia64_fetch_and_add(__ia64_aar_i, &(v)->counter)       \
++              : ia64_atomic64_add(__ia64_aar_i, v);                   \
++})
++
+ /*
+  * Atomically add I to V and return TRUE if the resulting value is
+  * negative.
+@@ -77,6 +122,12 @@ atomic_add_negative (int i, atomic_t *v)
+       return atomic_add_return(i, v) < 0;
+ }
++static __inline__ int
++atomic64_add_negative (int i, atomic64_t *v)
++{
++      return atomic64_add_return(i, v) < 0;
++}
++
+ #define atomic_sub_return(i,v)                                                \
+ ({                                                                    \
+       int __ia64_asr_i = (i);                                         \
+@@ -89,18 +140,40 @@ atomic_add_negative (int i, atomic_t *v)
+               : ia64_atomic_sub(__ia64_asr_i, v);                     \
+ })
++#define atomic64_sub_return(i,v)                                      \
++({                                                                    \
++      long __ia64_asr_i = (i);                                        \
++      (__builtin_constant_p(i)                                        \
++       && (   (__ia64_asr_i ==   1) || (__ia64_asr_i ==   4)          \
++           || (__ia64_asr_i ==   8) || (__ia64_asr_i ==  16)          \
++           || (__ia64_asr_i ==  -1) || (__ia64_asr_i ==  -4)          \
++           || (__ia64_asr_i ==  -8) || (__ia64_asr_i == -16)))        \
++              ? ia64_fetch_and_add(-__ia64_asr_i, &(v)->counter)      \
++              : ia64_atomic64_sub(__ia64_asr_i, v);                   \
++})
++
+ #define atomic_dec_return(v)          atomic_sub_return(1, (v))
+ #define atomic_inc_return(v)          atomic_add_return(1, (v))
++#define atomic64_dec_return(v)                atomic64_sub_return(1, (v))
++#define atomic64_inc_return(v)                atomic64_add_return(1, (v))
+ #define atomic_sub_and_test(i,v)      (atomic_sub_return((i), (v)) == 0)
+ #define atomic_dec_and_test(v)                (atomic_sub_return(1, (v)) == 0)
+ #define atomic_inc_and_test(v)                (atomic_add_return(1, (v)) != 0)
++#define atomic64_sub_and_test(i,v)    (atomic64_sub_return((i), (v)) == 0)
++#define atomic64_dec_and_test(v)      (atomic64_sub_return(1, (v)) == 0)
++#define atomic64_inc_and_test(v)      (atomic64_add_return(1, (v)) != 0)
+ #define atomic_add(i,v)                       atomic_add_return((i), (v))
+ #define atomic_sub(i,v)                       atomic_sub_return((i), (v))
+ #define atomic_inc(v)                 atomic_add(1, (v))
+ #define atomic_dec(v)                 atomic_sub(1, (v))
++#define atomic64_add(i,v)             atomic64_add_return((i), (v))
++#define atomic64_sub(i,v)             atomic64_sub_return((i), (v))
++#define atomic64_inc(v)                       atomic64_add(1, (v))
++#define atomic64_dec(v)                       atomic64_sub(1, (v))
++
+ /* Atomic operations are already serializing */
+ #define smp_mb__before_atomic_dec()   barrier()
+ #define smp_mb__after_atomic_dec()    barrier()
+--- linux-2.6.0-test1/include/asm-ia64/bitops.h        2003-06-14 12:18:33.000000000 -0700
++++ 25/include/asm-ia64/bitops.h       2003-07-19 17:04:07.000000000 -0700
+@@ -409,7 +409,7 @@ found_middle:
+  * Find next bit in a bitmap reasonably efficiently..
+  */
+ static inline int
+-find_next_bit (void *addr, unsigned long size, unsigned long offset)
++find_next_bit(const void *addr, unsigned long size, unsigned long offset)
+ {
+       unsigned long *p = ((unsigned long *) addr) + (offset >> 6);
+       unsigned long result = offset & ~63UL;
+--- linux-2.6.0-test1/include/asm-ia64/elf.h   2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/elf.h  2003-07-19 17:03:50.000000000 -0700
+@@ -199,11 +199,11 @@ extern int dump_task_fpu (struct task_st
+ #define GATE_EHDR     ((const struct elfhdr *) GATE_ADDR)
+-#define ARCH_DLINFO                                                   \
+-do {                                                                  \
+-      extern char __kernel_syscall_via_epc[];                         \
+-      NEW_AUX_ENT(AT_SYSINFO, __kernel_syscall_via_epc);              \
+-      NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR);        \
++#define ARCH_DLINFO                                                           \
++do {                                                                          \
++      extern char __kernel_syscall_via_epc[];                                 \
++      NEW_AUX_ENT(AT_SYSINFO, (unsigned long) __kernel_syscall_via_epc);      \
++      NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR);                \
+ } while (0)
+ /*
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-ia64/local.h        2003-07-19 17:03:50.000000000 -0700
+@@ -0,0 +1,50 @@
++#ifndef _ASM_IA64_LOCAL_H
++#define _ASM_IA64_LOCAL_H
++
++/*
++ * Copyright (C) 2003 Hewlett-Packard Co
++ *    David Mosberger-Tang <davidm@hpl.hp.com>
++ */
++
++#include <linux/percpu.h>
++
++typedef struct {
++      atomic64_t val;
++} local_t;
++
++#define LOCAL_INIT(i) ((local_t) { { (i) } })
++#define local_read(l) atomic64_read(&(l)->val)
++#define local_set(l, i)       atomic64_set(&(l)->val, i)
++#define local_inc(l)  atomic64_inc(&(l)->val)
++#define local_dec(l)  atomic64_dec(&(l)->val)
++#define local_add(l)  atomic64_add(&(l)->val)
++#define local_sub(l)  atomic64_sub(&(l)->val)
++
++/* Non-atomic variants, i.e., preemption disabled and won't be touched in interrupt, etc.  */
++
++#define __local_inc(l)                (++(l)->val.counter)
++#define __local_dec(l)                (--(l)->val.counter)
++#define __local_add(i,l)      ((l)->val.counter += (i))
++#define __local_sub(i,l)      ((l)->val.counter -= (i))
++
++/*
++ * Use these for per-cpu local_t variables.  Note they take a variable (eg. mystruct.foo),
++ * not an address.
++ */
++#define cpu_local_read(v)     local_read(&__ia64_per_cpu_var(v))
++#define cpu_local_set(v, i)   local_set(&__ia64_per_cpu_var(v), (i))
++#define cpu_local_inc(v)      local_inc(&__ia64_per_cpu_var(v))
++#define cpu_local_dec(v)      local_dec(&__ia64_per_cpu_var(v))
++#define cpu_local_add(i, v)   local_add((i), &__ia64_per_cpu_var(v))
++#define cpu_local_sub(i, v)   local_sub((i), &__ia64_per_cpu_var(v))
++
++/*
++ * Non-atomic increments, i.e., preemption disabled and won't be touched in interrupt,
++ * etc.
++ */
++#define __cpu_local_inc(v)    __local_inc(&__ia64_per_cpu_var(v))
++#define __cpu_local_dec(v)    __local_dec(&__ia64_per_cpu_var(v))
++#define __cpu_local_add(i, v) __local_add((i), &__ia64_per_cpu_var(v))
++#define __cpu_local_sub(i, v) __local_sub((i), &__ia64_per_cpu_var(v))
++
++#endif /* _ASM_IA64_LOCAL_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-ia64/lockmeter.h    2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,72 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ */
++
++#ifndef _IA64_LOCKMETER_H
++#define _IA64_LOCKMETER_H
++
++#ifdef local_cpu_data
++#define CPU_CYCLE_FREQUENCY   local_cpu_data->itc_freq
++#else
++#define CPU_CYCLE_FREQUENCY   my_cpu_data.itc_freq
++#endif
++#define get_cycles64()                get_cycles()
++
++#define THIS_CPU_NUMBER               smp_processor_id()
++
++/*
++ * macros to cache and retrieve an index value inside of a lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.
++ * we also assume that the hash table has less than 32767 entries.
++ */
++/*
++ * instrumented spinlock structure -- never used to allocate storage
++ * only used in macros below to overlay a spinlock_t
++ */
++typedef struct inst_spinlock_s {
++      /* remember, Intel is little endian */
++      volatile unsigned short lock;
++      volatile unsigned short index;
++} inst_spinlock_t;
++#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
++#define GET_INDEX(lock_ptr)        ((inst_spinlock_t *)(lock_ptr))->index
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++      volatile int read_counter:31;
++      volatile int write_lock:1;
++      volatile unsigned short index;
++      volatile unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return the number of readers for a rwlock_t
++ */
++#define RWLOCK_READERS(rwlock_ptr)    ((rwlock_ptr)->read_counter)
++
++/*
++ * return true if rwlock is write locked
++ * (note that other lock attempts can cause the lock value to be negative)
++ */
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->write_lock)
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((rwlock_ptr)->read_counter)
++
++#endif /* _IA64_LOCKMETER_H */
++
+--- linux-2.6.0-test1/include/asm-ia64/mmu_context.h   2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-ia64/mmu_context.h  2003-07-19 17:03:50.000000000 -0700
+@@ -86,9 +86,9 @@ delayed_tlb_flush (void)
+ {
+       extern void local_flush_tlb_all (void);
+-      if (unlikely(__get_cpu_var(ia64_need_tlb_flush))) {
++      if (unlikely(__ia64_per_cpu_var(ia64_need_tlb_flush))) {
+               local_flush_tlb_all();
+-              __get_cpu_var(ia64_need_tlb_flush) = 0;
++              __ia64_per_cpu_var(ia64_need_tlb_flush) = 0;
+       }
+ }
+--- linux-2.6.0-test1/include/asm-ia64/percpu.h        2003-06-14 12:18:29.000000000 -0700
++++ 25/include/asm-ia64/percpu.h       2003-07-19 17:03:50.000000000 -0700
+@@ -1,43 +1,73 @@
+ #ifndef _ASM_IA64_PERCPU_H
+ #define _ASM_IA64_PERCPU_H
+-#include <linux/config.h>
+-#include <linux/compiler.h>
+-
+ /*
+  * Copyright (C) 2002-2003 Hewlett-Packard Co
+  *    David Mosberger-Tang <davidm@hpl.hp.com>
+  */
++
+ #define PERCPU_ENOUGH_ROOM PERCPU_PAGE_SIZE
+ #ifdef __ASSEMBLY__
+-
+-#define THIS_CPU(var) (var##__per_cpu)  /* use this to mark accesses to per-CPU variables... */
+-
++# define THIS_CPU(var)        (per_cpu__##var)  /* use this to mark accesses to per-CPU variables... */
+ #else /* !__ASSEMBLY__ */
++#include <linux/config.h>
++
+ #include <linux/threads.h>
+-extern unsigned long __per_cpu_offset[NR_CPUS];
++#ifdef HAVE_MODEL_SMALL_ATTRIBUTE
++# define __SMALL_ADDR_AREA    __attribute__((__model__ (__small__)))
++#else
++# define __SMALL_ADDR_AREA
++#endif
+-#define DEFINE_PER_CPU(type, name) \
+-    __attribute__((__section__(".data.percpu"))) __typeof__(type) name##__per_cpu
+-#define DECLARE_PER_CPU(type, name) extern __typeof__(type) name##__per_cpu
++#define DECLARE_PER_CPU(type, name)                           \
++      extern __SMALL_ADDR_AREA __typeof__(type) per_cpu__##name
+-#define __get_cpu_var(var)    (var##__per_cpu)
++/* Separate out the type, so (int[3], foo) works. */
++#define DEFINE_PER_CPU(type, name)                            \
++      __attribute__((__section__(".data.percpu")))            \
++      __SMALL_ADDR_AREA __typeof__(type) per_cpu__##name
++
++/*
++ * Pretty much a literal copy of asm-generic/percpu.h, except that percpu_modcopy() is an
++ * external routine, to avoid include-hell.
++ */
+ #ifdef CONFIG_SMP
+-# define per_cpu(var, cpu)    (*RELOC_HIDE(&var##__per_cpu, __per_cpu_offset[cpu]))
++
++extern unsigned long __per_cpu_offset[NR_CPUS];
++
++/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */
++DECLARE_PER_CPU(unsigned long, local_per_cpu_offset);
++
++#define per_cpu(var, cpu)  (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
++#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset)))
+ extern void percpu_modcopy(void *pcpudst, const void *src, unsigned long size);
+-#else
+-# define per_cpu(var, cpu)    ((void)cpu, __get_cpu_var(var))
+-#endif
+-#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(var##__per_cpu)
+-#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(var##__per_cpu)
++#else /* ! SMP */
++
++#define per_cpu(var, cpu)                     ((void)cpu, per_cpu__##var)
++#define __get_cpu_var(var)                    per_cpu__##var
++
++#endif        /* SMP */
++
++#define EXPORT_PER_CPU_SYMBOL(var)            EXPORT_SYMBOL(per_cpu__##var)
++#define EXPORT_PER_CPU_SYMBOL_GPL(var)                EXPORT_SYMBOL_GPL(per_cpu__##var)
++
++/* ia64-specific part: */
+ extern void setup_per_cpu_areas (void);
++/*
++ * Be extremely careful when taking the address of this variable!  Due to virtual
++ * remapping, it is different from the canonical address returned by __get_cpu_var(var)!
++ * On the positive side, using __ia64_per_cpu_var() instead of __get_cpu_var() is slightly
++ * more efficient.
++ */
++#define __ia64_per_cpu_var(var)       (per_cpu__##var)
++
+ #endif /* !__ASSEMBLY__ */
+ #endif /* _ASM_IA64_PERCPU_H */
+--- linux-2.6.0-test1/include/asm-ia64/pgalloc.h       2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/pgalloc.h      2003-07-19 17:07:16.000000000 -0700
+@@ -71,9 +71,9 @@ pgd_free (pgd_t *pgd)
+ }
+ static inline void
+-pgd_populate (struct mm_struct *mm, pgd_t *pgd_entry, pmd_t *pmd)
++pgd_populate (struct mm_struct *mm, pgd_t *pgd_entry, struct page *pmd)
+ {
+-      pgd_val(*pgd_entry) = __pa(pmd);
++      pgd_val(*pgd_entry) = __pa(page_address(pmd));
+ }
+@@ -90,8 +90,8 @@ pmd_alloc_one_fast (struct mm_struct *mm
+       return (pmd_t *)ret;
+ }
+-static inline pmd_t*
+-pmd_alloc_one (struct mm_struct *mm, unsigned long addr)
++static inline pmd_t *
++pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+       pmd_t *pmd = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
+@@ -100,9 +100,16 @@ pmd_alloc_one (struct mm_struct *mm, uns
+       return pmd;
+ }
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      return pmd ? virt_to_page(pmd) : NULL;
++}
++
+ static inline void
+-pmd_free (pmd_t *pmd)
++pmd_free(struct page *page)
+ {
++      pmd_t *pmd = page_address(page);
+       *(unsigned long *)pmd = (unsigned long) pmd_quicklist;
+       pmd_quicklist = (unsigned long *) pmd;
+       ++pgtable_cache_size;
+--- linux-2.6.0-test1/include/asm-ia64/pgtable.h       2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/pgtable.h      2003-07-19 17:07:16.000000000 -0700
+@@ -257,7 +257,8 @@ ia64_phys_addr_valid (unsigned long addr
+ #define pgd_bad(pgd)                  (!ia64_phys_addr_valid(pgd_val(pgd)))
+ #define pgd_present(pgd)              (pgd_val(pgd) != 0UL)
+ #define pgd_clear(pgdp)                       (pgd_val(*(pgdp)) = 0UL)
+-#define pgd_page(pgd)                 ((unsigned long) __va(pgd_val(pgd) & _PFN_MASK))
++#define __pgd_page(pgd)                       ((unsigned long)__va(pgd_val(pgd) & _PFN_MASK))
++#define pgd_page(pgd)                 virt_to_page(__pgd_page(pgd))
+ /*
+  * The following have defined behavior only work if pte_present() is true.
+@@ -326,7 +327,13 @@ pgd_offset (struct mm_struct *mm, unsign
+ /* Find an entry in the second-level page table.. */
+ #define pmd_offset(dir,addr) \
+-      ((pmd_t *) pgd_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
++      ((pmd_t *)__pgd_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
++
++#define pmd_offset_kernel(pgd, addr)          pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)             pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)      pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                do { } while (0)
++#define pmd_unmap_nested(pmd)                 do { } while (0)
+ /*
+  * Find an entry in the third-level page table.  This looks more complicated than it
+--- linux-2.6.0-test1/include/asm-ia64/posix_types.h   2003-06-14 12:18:06.000000000 -0700
++++ 25/include/asm-ia64/posix_types.h  2003-07-19 17:06:39.000000000 -0700
+@@ -10,7 +10,9 @@
+  *    David Mosberger-Tang <davidm@hpl.hp.com>
+  */
+-typedef unsigned int  __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long __kernel_dev_t;
++#endif
+ typedef unsigned int  __kernel_ino_t;
+ typedef unsigned int  __kernel_mode_t;
+ typedef unsigned int  __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-ia64/processor.h     2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-ia64/processor.h    2003-07-19 17:03:50.000000000 -0700
+@@ -191,10 +191,12 @@ struct cpuinfo_ia64 {
+ DECLARE_PER_CPU(struct cpuinfo_ia64, cpu_info);
+ /*
+- * The "local" data pointer.  It points to the per-CPU data of the currently executing
++ * The "local" data variable.  It refers to the per-CPU data of the currently executing
+  * CPU, much like "current" points to the per-task data of the currently executing task.
++ * Do not use the address of local_cpu_data, since it will be different from
++ * cpu_data(smp_processor_id())!
+  */
+-#define local_cpu_data                (&__get_cpu_var(cpu_info))
++#define local_cpu_data                (&__ia64_per_cpu_var(cpu_info))
+ #define cpu_data(cpu)         (&per_cpu(cpu_info, cpu))
+ extern void identify_cpu (struct cpuinfo_ia64 *);
+--- linux-2.6.0-test1/include/asm-ia64/smp.h   2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/smp.h  2003-07-19 17:04:07.000000000 -0700
+@@ -16,6 +16,7 @@
+ #include <linux/init.h>
+ #include <linux/threads.h>
+ #include <linux/kernel.h>
++#include <linux/cpumask.h>
+ #include <asm/bitops.h>
+ #include <asm/io.h>
+@@ -37,8 +38,8 @@ extern struct smp_boot_data {
+ extern char no_int_routing __initdata;
+-extern unsigned long phys_cpu_present_map;
+-extern volatile unsigned long cpu_online_map;
++extern cpumask_t phys_cpu_present_map;
++extern cpumask_t cpu_online_map;
+ extern unsigned long ipi_base_addr;
+ extern unsigned char smp_int_redirect;
+@@ -47,22 +48,7 @@ extern volatile int ia64_cpu_to_sapicid[
+ extern unsigned long ap_wakeup_vector;
+-#define cpu_possible(cpu)     (phys_cpu_present_map & (1UL << (cpu)))
+-#define cpu_online(cpu)               (cpu_online_map & (1UL << (cpu)))
+-
+-static inline unsigned int
+-num_online_cpus (void)
+-{
+-      return hweight64(cpu_online_map);
+-}
+-
+-static inline unsigned int
+-any_online_cpu (unsigned int mask)
+-{
+-      if (mask & cpu_online_map)
+-              return __ffs(mask & cpu_online_map);
+-      return NR_CPUS;
+-}
++#define cpu_possible(cpu)     cpu_isset(cpu, phys_cpu_present_map)
+ /*
+  * Function to map hard smp processor id to logical id.  Slow, so don't use this in
+--- linux-2.6.0-test1/include/asm-ia64/spinlock.h      2003-06-26 22:07:25.000000000 -0700
++++ 25/include/asm-ia64/spinlock.h     2003-07-19 17:06:40.000000000 -0700
+@@ -120,8 +120,18 @@ _raw_spin_lock (spinlock_t *lock)
+ typedef struct {
+       volatile int read_counter       : 31;
+       volatile int write_lock         :  1;
++#ifdef CONFIG_LOCKMETER
++      /* required for LOCKMETER since all bits in lock are used */
++      /* and we need this storage for CPU and lock INDEX        */
++      unsigned lockmeter_magic;
++#endif
+ } rwlock_t;
++
++#ifdef CONFIG_LOCKMETER
++#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0 }
++#else
+ #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
++#endif
+ #define rwlock_init(x)                do { *(x) = RW_LOCK_UNLOCKED; } while(0)
+ #define rwlock_is_locked(x)   (*(volatile int *) (x) != 0)
+@@ -137,6 +147,48 @@ do {                                                                                      \
+       }                                                                               \
+ } while (0)
++#ifdef CONFIG_LOCKMETER
++/*
++ * HACK: This works, but still have a timing window that affects performance:
++ * we see that no one owns the Write lock, then someone * else grabs for Write
++ * lock before we do a read_lock().
++ * This means that on rare occasions our read_lock() will stall and spin-wait
++ * until we acquire for Read, instead of simply returning a trylock failure.
++ */
++static inline int _raw_read_trylock(rwlock_t *rw)
++{
++      if (rw->write_lock) {
++              return 0;
++      } else {
++              _raw_read_lock(rw);
++              return 1;
++      }
++}
++
++static inline int _raw_write_trylock(rwlock_t *rw)
++{
++      if (!(rw->write_lock)) {
++          /* isn't currently write-locked... that looks promising... */
++          if (test_and_set_bit(31, rw) == 0) {
++              /* now it is write-locked by me... */
++              if (rw->read_counter) {
++                  /* really read-locked, so release write-lock and fail */
++                  clear_bit(31, rw);
++              } else {
++                  /* we've the the write-lock, no read-lockers... success! */
++                  barrier();
++                  return 1;
++              }
++
++          }
++      }
++
++      /* falls through ... fails to write-lock */
++      barrier();
++      return 0;
++}
++#endif
++
+ #define _raw_read_unlock(rw)                                  \
+ do {                                                          \
+       rwlock_t *__read_lock_ptr = (rw);                       \
+@@ -181,4 +233,25 @@ do {                                                                              \
+       clear_bit(31, (x));                                                             \
+ })
++#ifdef CONFIG_LOCKMETER
++extern void _metered_spin_lock  (spinlock_t *lock);
++extern void _metered_spin_unlock(spinlock_t *lock);
++
++/*
++ *  Use a less efficient, and inline, atomic_dec_and_lock() if lockmetering
++ *  so we can see the callerPC of who is actually doing the spin_lock().
++ *  Otherwise, all we see is the generic rollup of all locks done by
++ *  atomic_dec_and_lock().
++ */
++static inline int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
++{
++      _metered_spin_lock(lock);
++      if (atomic_dec_and_test(atomic))
++              return 1;
++      _metered_spin_unlock(lock);
++      return 0;
++}
++#define ATOMIC_DEC_AND_LOCK
++#endif
++
+ #endif /*  _ASM_IA64_SPINLOCK_H */
+--- linux-2.6.0-test1/include/asm-ia64/system.h        2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ia64/system.h       2003-07-19 17:03:50.000000000 -0700
+@@ -20,9 +20,9 @@
+ #include <asm/percpu.h>
+ /* 0xa000000000000000 - 0xa000000000000000+PERCPU_PAGE_SIZE remain unmapped */
+-#define PERCPU_ADDR           (0xa000000000000000 + PERCPU_PAGE_SIZE)
+-#define GATE_ADDR             (0xa000000000000000 + 2*PERCPU_PAGE_SIZE)
++#define GATE_ADDR             (0xa000000000000000 + PERCPU_PAGE_SIZE)
+ #define KERNEL_START           0xa000000100000000
++#define PERCPU_ADDR           (-PERCPU_PAGE_SIZE)
+ #ifndef __ASSEMBLY__
+--- linux-2.6.0-test1/include/asm-ia64/tlb.h   2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-ia64/tlb.h  2003-07-19 17:03:50.000000000 -0700
+@@ -126,7 +126,7 @@ ia64_tlb_flush_mmu (struct mmu_gather *t
+ static inline struct mmu_gather *
+ tlb_gather_mmu (struct mm_struct *mm, unsigned int full_mm_flush)
+ {
+-      struct mmu_gather *tlb = &per_cpu(mmu_gathers, smp_processor_id());
++      struct mmu_gather *tlb = &__get_cpu_var(mmu_gathers);
+       tlb->mm = mm;
+       /*
+--- linux-2.6.0-test1/include/asm-m68k/motorola_pgalloc.h      2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-m68k/motorola_pgalloc.h     2003-07-19 17:07:16.000000000 -0700
+@@ -63,19 +63,28 @@ static inline void __pte_free_tlb(struct
+ }
+-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
++static inline pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
+ {
+       return get_pointer_table();
+ }
+-static inline int pmd_free(pmd_t *pmd)
++static inline struct page *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+-      return free_pointer_table(pmd);
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      if (pmd)
++              return virt_to_page(pmd);
++      else
++              return NULL;
+ }
+-static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd)
++static inline int pmd_free(struct page *pmd)
+ {
+-      return free_pointer_table(pmd);
++      return free_pointer_table(page_address(pmd));
++}
++
++static inline int __pmd_free_tlb(struct mmu_gather *tlb, struct page *pmd)
++{
++      return free_pointer_table(page_address(pmd));
+ }
+@@ -100,9 +109,9 @@ static inline void pmd_populate(struct m
+       pmd_set(pmd, page_address(page));
+ }
+-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
++static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, struct page *pmd)
+ {
+-      pgd_set(pgd, pmd);
++      pgd_set(pgd, page_address(pmd));
+ }
+ #endif /* _MOTOROLA_PGALLOC_H */
+--- linux-2.6.0-test1/include/asm-m68k/motorola_pgtable.h      2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-m68k/motorola_pgtable.h     2003-07-19 17:07:16.000000000 -0700
+@@ -115,6 +115,7 @@ extern inline void pgd_set(pgd_t * pgdp,
+ #define __pte_page(pte) ((unsigned long)__va(pte_val(pte) & PAGE_MASK))
+ #define __pmd_page(pmd) ((unsigned long)__va(pmd_val(pmd) & _TABLE_MASK))
+ #define __pgd_page(pgd) ((unsigned long)__va(pgd_val(pgd) & _TABLE_MASK))
++#define pgd_page(pgd) virt_to_page(__pgd_page(pgd))
+ #define pte_none(pte)         (!pte_val(pte))
+@@ -203,6 +204,12 @@ extern inline pmd_t * pmd_offset(pgd_t *
+       return (pmd_t *)__pgd_page(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PMD-1));
+ }
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
++
+ /* Find an entry in the third-level page table.. */ 
+ extern inline pte_t * pte_offset_kernel(pmd_t * pmdp, unsigned long address)
+ {
+--- linux-2.6.0-test1/include/asm-m68knommu/pgtable.h  2003-06-14 12:18:23.000000000 -0700
++++ 25/include/asm-m68knommu/pgtable.h 2003-07-19 17:07:16.000000000 -0700
+@@ -21,7 +21,12 @@ typedef pte_t *pte_addr_t;
+ #define pgd_bad(pgd)          (0)
+ #define pgd_clear(pgdp)
+ #define kern_addr_valid(addr) (1)
+-#define       pmd_offset(a, b)        ((void *)0)
++#define       pmd_offset(a, b)                ((void *)0)
++#define       pmd_offset_kernel(a, b)         pmd_offset(a, b)
++#define       pmd_offset_map(a, b)            pmd_offset(a, b)
++#define       pmd_offset_map_nested(a, b)     pmd_offset(a, b)
++#define pmd_unmap(pmd)                        do { } while (0)
++#define pmd_unmap_nested(pmd)         do { } while (0)
+ #define PAGE_NONE     __pgprot(0)
+ #define PAGE_SHARED   __pgprot(0)
+--- linux-2.6.0-test1/include/asm-m68k/posix_types.h   2003-06-14 12:17:58.000000000 -0700
++++ 25/include/asm-m68k/posix_types.h  2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned short        __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned short        __kernel_mode_t;
+ typedef unsigned short        __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-m68k/sun3_pgalloc.h  2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-m68k/sun3_pgalloc.h 2003-07-19 17:07:16.000000000 -0700
+@@ -18,7 +18,8 @@
+ extern const char bad_pmd_string[];
+-#define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,address)             ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm,address)      ({ BUG(); ((pmd_t *)2); })
+ static inline void pte_free_kernel(pte_t * pte)
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-mips64/lockmeter.h  2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,120 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ */
++
++#ifndef _ASM_LOCKMETER_H
++#define _ASM_LOCKMETER_H
++
++#include <linux/time.h>
++
++#define SPINLOCK_MAGIC_INIT   /* */
++
++#define CPU_CYCLE_FREQUENCY   get_cpu_cycle_frequency()
++
++#define THIS_CPU_NUMBER               smp_processor_id()
++
++static uint32_t cpu_cycle_frequency = 0;
++
++static uint32_t get_cpu_cycle_frequency(void)
++{
++    /* a total hack, slow and invasive, but ... it works */
++    int sec;
++    uint32_t start_cycles;
++    struct timeval tv;
++
++    if (cpu_cycle_frequency == 0) {   /* uninitialized */
++      do_gettimeofday(&tv);
++      sec = tv.tv_sec;        /* set up to catch the tv_sec rollover */
++      while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
++      sec = tv.tv_sec;        /* rolled over to a new sec value */
++      start_cycles = get_cycles();
++      while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
++      cpu_cycle_frequency = get_cycles() - start_cycles;
++    }
++
++    return cpu_cycle_frequency;
++}
++
++extern struct timeval xtime;
++extern long do_gettimeoffset(void);
++
++static uint64_t get_cycles64(void)
++{
++    static uint64_t last_get_cycles64 = 0;
++    uint64_t ret;
++    unsigned long sec;
++    unsigned long usec, usec_offset;
++
++again:
++    sec  = xtime.tv_sec;
++    usec = xtime.tv_usec;
++    usec_offset = do_gettimeoffset();
++    if ((xtime.tv_sec != sec)  ||
++      (xtime.tv_usec != usec)||
++      (usec_offset >= 20000))
++      goto again;
++
++    ret =  ((uint64_t)sec * cpu_cycle_frequency)
++      + ( ((uint64_t)(usec + usec_offset) * cpu_cycle_frequency) / 1000000 );
++
++    /* XXX why does time go backwards?  do_gettimeoffset?  general time adj? */
++    if (ret <= last_get_cycles64)
++      ret  = last_get_cycles64+1;
++    last_get_cycles64 = ret;
++
++    return ret;
++}
++
++/*
++ * macros to cache and retrieve an index value inside of a lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.
++ * we also assume that the hash table has less than 32767 entries.
++ * the high order bit is used for write locking a rw_lock
++ */
++#define INDEX_MASK   0x7FFF0000
++#define READERS_MASK 0x0000FFFF
++#define INDEX_SHIFT 16
++#define PUT_INDEX(lockp,index)   \
++        lockp->lock = (((lockp->lock) & ~INDEX_MASK) | (index) << INDEX_SHIFT)
++#define GET_INDEX(lockp) \
++        (((lockp->lock) & INDEX_MASK) >> INDEX_SHIFT)
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++      volatile int lock;
++      unsigned short index;
++      unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return the number of readers for a rwlock_t
++ */
++#define RWLOCK_READERS(rwlock_ptr)   rwlock_readers(rwlock_ptr)
++
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++      int tmp = (int) rwlock_ptr->lock;
++      return (tmp >= 0) ? tmp : 0;
++}
++
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock < 0)
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((rwlock_ptr)->lock > 0)
++
++#endif /* _ASM_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-mips64/pgalloc.h     2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips64/pgalloc.h    2003-07-19 17:07:16.000000000 -0700
+@@ -28,7 +28,7 @@ static inline void pmd_populate(struct m
+       set_pmd(pmd, __pmd((PAGE_OFFSET + page_to_pfn(pte)) << PAGE_SHIFT));
+ }
+-#define pgd_populate(mm, pgd, pmd)            set_pgd(pgd, __pgd(pmd))
++#define pgd_populate(mm, pgd, pmd)            set_pgd(pgd, __pgd(page_address(pmd)))
+ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
+ {
+@@ -88,7 +88,7 @@ static inline void pte_free(struct page 
+ #define __pte_free_tlb(tlb,pte)               tlb_remove_page((tlb),(pte))
+ #define __pmd_free_tlb(tlb,x)         do { } while (0)
+-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
++static inline pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+       pmd_t *pmd;
+@@ -98,9 +98,18 @@ static inline pmd_t *pmd_alloc_one(struc
+       return pmd;
+ }
+-static inline void pmd_free(pmd_t *pmd)
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
+ {
+-      free_pages((unsigned long)pmd, PMD_ORDER);
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      if (pmd)
++              return virt_to_page(pmd);
++      else
++              return NULL;
++}
++
++static inline void pmd_free(struct page *pmd)
++{
++      __free_pages(pmd, PMD_ORDER);
+ }
+ extern pte_t kptbl[(PAGE_SIZE << PGD_ORDER)/sizeof(pte_t)];
+--- linux-2.6.0-test1/include/asm-mips64/pgtable.h     2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips64/pgtable.h    2003-07-19 17:07:16.000000000 -0700
+@@ -155,11 +155,13 @@ extern pmd_t empty_bad_pmd_table[2*PAGE_
+ #define pmd_page(pmd)         (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT))
+ #define pmd_page_kernel(pmd)  pmd_val(pmd)
+-static inline unsigned long pgd_page(pgd_t pgd)
++static inline unsigned long __pgd_page(pgd_t pgd)
+ {
+       return pgd_val(pgd);
+ }
++#define pgd_page(pgd)         virt_to_page(__pgd_page(pgd))
++
+ static inline int pte_none(pte_t pte)
+ {
+       return !(pte_val(pte) & ~_PAGE_GLOBAL);
+@@ -397,10 +399,16 @@ static inline pte_t pte_modify(pte_t pte
+ /* Find an entry in the second-level page table.. */
+ static inline pmd_t *pmd_offset(pgd_t * dir, unsigned long address)
+ {
+-      return (pmd_t *) pgd_page(*dir) +
++      return (pmd_t *)__pgd_page(*dir) +
+              ((address >> PMD_SHIFT) & (PTRS_PER_PMD - 1));
+ }
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while(0)
++#define pmd_unmap_nested(pmd)                         do { } while(0)
++
+ /* Find an entry in the third-level page table.. */
+ #define __pte_offset(address)                                         \
+       (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+--- linux-2.6.0-test1/include/asm-mips64/posix_types.h 2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips64/posix_types.h        2003-07-19 17:06:39.000000000 -0700
+@@ -15,7 +15,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned int  __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned int  __kernel_mode_t;
+ typedef unsigned int  __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-mips64/smp.h 2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips64/smp.h        2003-07-19 17:04:07.000000000 -0700
+@@ -17,6 +17,7 @@
+ #include <linux/bitops.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <asm/atomic.h>
+ #define smp_processor_id()    (current_thread_info()->cpu)
+@@ -45,56 +46,17 @@ extern struct call_data_struct *call_dat
+ #define SMP_RESCHEDULE_YOURSELF       0x1     /* XXX braindead */
+ #define SMP_CALL_FUNCTION     0x2
+-#if (NR_CPUS <= _MIPS_SZLONG)
+-
+-typedef unsigned long   cpumask_t;
+-
+-#define CPUMASK_CLRALL(p)     (p) = 0
+-#define CPUMASK_SETB(p, bit)  (p) |= 1UL << (bit)
+-#define CPUMASK_CLRB(p, bit)  (p) &= ~(1UL << (bit))
+-#define CPUMASK_TSTB(p, bit)  ((p) & (1UL << (bit)))
+-
+-#elif (NR_CPUS <= 128)
+-
+-/*
+- * The foll should work till 128 cpus.
+- */
+-#define CPUMASK_SIZE          (NR_CPUS/_MIPS_SZLONG)
+-#define CPUMASK_INDEX(bit)    ((bit) >> 6)
+-#define CPUMASK_SHFT(bit)     ((bit) & 0x3f)
+-
+-typedef struct {
+-      unsigned long   _bits[CPUMASK_SIZE];
+-} cpumask_t;
+-
+-#define       CPUMASK_CLRALL(p)       (p)._bits[0] = 0, (p)._bits[1] = 0
+-#define CPUMASK_SETB(p, bit)  (p)._bits[CPUMASK_INDEX(bit)] |= \
+-                                      (1UL << CPUMASK_SHFT(bit))
+-#define CPUMASK_CLRB(p, bit)  (p)._bits[CPUMASK_INDEX(bit)] &= \
+-                                      ~(1UL << CPUMASK_SHFT(bit))
+-#define CPUMASK_TSTB(p, bit)  ((p)._bits[CPUMASK_INDEX(bit)] & \
+-                                      (1UL << CPUMASK_SHFT(bit)))
+-
+-#else
+-#error cpumask macros only defined for 128p kernels
+-#endif
+-
+ extern cpumask_t phys_cpu_present_map;
+ extern cpumask_t cpu_online_map;
+-#define cpu_possible(cpu) (phys_cpu_present_map & (1<<(cpu)))
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-
+-extern inline unsigned int num_online_cpus(void)
+-{
+-      return hweight32(cpu_online_map);
+-}
++#define cpu_possible(cpu) cpu_isset(cpu, phys_cpu_present_map)
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+ /* We don't mark CPUs online until __cpu_up(), so we need another measure */
+ static inline int num_booting_cpus(void)
+ {
+-      return hweight32(cpu_callout_map);
++      return cpus_weight(cpu_callout_map);
+ }
+ #endif /* CONFIG_SMP */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-mips/lockmeter.h    2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,126 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ *  Ported to mips32 for Asita Technologies
++ *   by D.J. Barrow ( dj.barrow@asitatechnologies.com )
++ */
++#ifndef _ASM_LOCKMETER_H
++#define _ASM_LOCKMETER_H
++
++/* do_gettimeoffset is a function pointer on mips */
++/* & it is not included by <linux/time.h> */
++#include <asm/time.h>
++#include <linux/time.h>
++#include <asm/div64.h>
++
++#define SPINLOCK_MAGIC_INIT   /* */
++
++#define CPU_CYCLE_FREQUENCY   get_cpu_cycle_frequency()
++
++#define THIS_CPU_NUMBER               smp_processor_id()
++
++static uint32_t cpu_cycle_frequency = 0;
++
++static uint32_t get_cpu_cycle_frequency(void)
++{
++    /* a total hack, slow and invasive, but ... it works */
++    int sec;
++    uint32_t start_cycles;
++    struct timeval tv;
++
++    if (cpu_cycle_frequency == 0) {   /* uninitialized */
++      do_gettimeofday(&tv);
++      sec = tv.tv_sec;        /* set up to catch the tv_sec rollover */
++      while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
++      sec = tv.tv_sec;        /* rolled over to a new sec value */
++      start_cycles = get_cycles();
++      while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
++      cpu_cycle_frequency = get_cycles() - start_cycles;
++    }
++
++    return cpu_cycle_frequency;
++}
++
++extern struct timeval xtime;
++
++static uint64_t get_cycles64(void)
++{
++    static uint64_t last_get_cycles64 = 0;
++    uint64_t ret;
++    unsigned long sec;
++    unsigned long usec, usec_offset;
++
++again:
++    sec  = xtime.tv_sec;
++    usec = xtime.tv_usec;
++    usec_offset = do_gettimeoffset();
++    if ((xtime.tv_sec != sec)  ||
++      (xtime.tv_usec != usec)||
++      (usec_offset >= 20000))
++      goto again;
++
++    ret = ((uint64_t)(usec + usec_offset) * cpu_cycle_frequency);
++    /* We can't do a normal 64 bit division on mips without libgcc.a */
++    do_div(ret,1000000);
++    ret +=  ((uint64_t)sec * cpu_cycle_frequency);
++
++    /* XXX why does time go backwards?  do_gettimeoffset?  general time adj? */
++    if (ret <= last_get_cycles64)
++      ret  = last_get_cycles64+1;
++    last_get_cycles64 = ret;
++
++    return ret;
++}
++
++/*
++ * macros to cache and retrieve an index value inside of a lock
++ * these macros assume that there are less than 65536 simultaneous
++ * (read mode) holders of a rwlock.
++ * we also assume that the hash table has less than 32767 entries.
++ * the high order bit is used for write locking a rw_lock
++ */
++#define INDEX_MASK   0x7FFF0000
++#define READERS_MASK 0x0000FFFF
++#define INDEX_SHIFT 16
++#define PUT_INDEX(lockp,index)   \
++        lockp->lock = (((lockp->lock) & ~INDEX_MASK) | (index) << INDEX_SHIFT)
++#define GET_INDEX(lockp) \
++        (((lockp->lock) & INDEX_MASK) >> INDEX_SHIFT)
++
++/*
++ * macros to cache and retrieve an index value in a read/write lock
++ * as well as the cpu where a reader busy period started
++ * we use the 2nd word (the debug word) for this, so require the
++ * debug word to be present
++ */
++/*
++ * instrumented rwlock structure -- never used to allocate storage
++ * only used in macros below to overlay a rwlock_t
++ */
++typedef struct inst_rwlock_s {
++      volatile int lock;
++      unsigned short index;
++      unsigned short cpu;
++} inst_rwlock_t;
++#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
++#define GET_RWINDEX(rwlock_ptr)        ((inst_rwlock_t *)(rwlock_ptr))->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
++#define GET_RW_CPU(rwlock_ptr)         ((inst_rwlock_t *)(rwlock_ptr))->cpu
++
++/*
++ * return the number of readers for a rwlock_t
++ */
++#define RWLOCK_READERS(rwlock_ptr)   rwlock_readers(rwlock_ptr)
++
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++      int tmp = (int) rwlock_ptr->lock;
++      return (tmp >= 0) ? tmp : 0;
++}
++
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock < 0)
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)  ((rwlock_ptr)->lock > 0)
++
++#endif /* _ASM_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-mips/pgalloc.h       2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/pgalloc.h      2003-07-19 17:07:16.000000000 -0700
+@@ -96,7 +96,8 @@ static inline void pte_free(struct page 
+  * allocating and freeing a pmd is trivial: the 1-entry pmd is
+  * inside the pgd, so has no extra memory associated with it.
+  */
+-#define pmd_alloc_one(mm, addr)               ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)               ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)        ({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(x)                   do { } while (0)
+ #define __pmd_free_tlb(tlb,x)         do { } while (0)
+--- linux-2.6.0-test1/include/asm-mips/pgtable.h       2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/pgtable.h      2003-07-19 17:07:16.000000000 -0700
+@@ -374,6 +374,12 @@ static inline pmd_t *pmd_offset(pgd_t *d
+       return (pmd_t *) dir;
+ }
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
++
+ /* Find an entry in the third-level page table.. */
+ #define __pte_offset(address)                                         \
+       (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+--- linux-2.6.0-test1/include/asm-mips/posix_types.h   2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/posix_types.h  2003-07-19 17:06:39.000000000 -0700
+@@ -14,7 +14,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned int  __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned int  __kernel_mode_t;
+ typedef unsigned long __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-mips/smp.h   2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/smp.h  2003-07-19 17:04:07.000000000 -0700
+@@ -17,6 +17,7 @@
+ #include <linux/bitops.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <asm/atomic.h>
+ #define smp_processor_id()    (current_thread_info()->cpu)
+@@ -45,56 +46,17 @@ extern struct call_data_struct *call_dat
+ #define SMP_RESCHEDULE_YOURSELF       0x1     /* XXX braindead */
+ #define SMP_CALL_FUNCTION     0x2
+-#if (NR_CPUS <= _MIPS_SZLONG)
+-
+-typedef unsigned long   cpumask_t;
+-
+-#define CPUMASK_CLRALL(p)     (p) = 0
+-#define CPUMASK_SETB(p, bit)  (p) |= 1UL << (bit)
+-#define CPUMASK_CLRB(p, bit)  (p) &= ~(1UL << (bit))
+-#define CPUMASK_TSTB(p, bit)  ((p) & (1UL << (bit)))
+-
+-#elif (NR_CPUS <= 128)
+-
+-/*
+- * The foll should work till 128 cpus.
+- */
+-#define CPUMASK_SIZE          (NR_CPUS/_MIPS_SZLONG)
+-#define CPUMASK_INDEX(bit)    ((bit) >> 6)
+-#define CPUMASK_SHFT(bit)     ((bit) & 0x3f)
+-
+-typedef struct {
+-      unsigned long   _bits[CPUMASK_SIZE];
+-} cpumask_t;
+-
+-#define       CPUMASK_CLRALL(p)       (p)._bits[0] = 0, (p)._bits[1] = 0
+-#define CPUMASK_SETB(p, bit)  (p)._bits[CPUMASK_INDEX(bit)] |= \
+-                                      (1UL << CPUMASK_SHFT(bit))
+-#define CPUMASK_CLRB(p, bit)  (p)._bits[CPUMASK_INDEX(bit)] &= \
+-                                      ~(1UL << CPUMASK_SHFT(bit))
+-#define CPUMASK_TSTB(p, bit)  ((p)._bits[CPUMASK_INDEX(bit)] & \
+-                                      (1UL << CPUMASK_SHFT(bit)))
+-
+-#else
+-#error cpumask macros only defined for 128p kernels
+-#endif
+-
+ extern cpumask_t phys_cpu_present_map;
+ extern cpumask_t cpu_online_map;
+-#define cpu_possible(cpu) (phys_cpu_present_map & (1<<(cpu)))
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-
+-extern inline unsigned int num_online_cpus(void)
+-{
+-      return hweight32(cpu_online_map);
+-}
++#define cpu_possible(cpu) cpu_isset(cpu, phys_cpu_present_map)
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+ /* We don't mark CPUs online until __cpu_up(), so we need another measure */
+ static inline int num_booting_cpus(void)
+ {
+-      return hweight32(cpu_callout_map);
++      return cpus_weight(cpu_callout_map);
+ }
+ #endif /* CONFIG_SMP */
+--- linux-2.6.0-test1/include/asm-mips/spinlock.h      2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-mips/spinlock.h     2003-07-19 17:06:40.000000000 -0700
+@@ -91,9 +91,18 @@ static inline unsigned int _raw_spin_try
+ typedef struct {
+       volatile unsigned int lock;
++#ifdef CONFIG_LOCKMETER
++      /* required for LOCKMETER since all bits in lock are used */
++      /* and we need this storage for CPU and lock INDEX        */
++      unsigned lockmeter_magic;
++#endif
+ } rwlock_t;
++#ifdef CONFIG_LOCKMETER
++#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
++#else
+ #define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
++#endif
+ #define rwlock_init(x)  do { *(x) = RW_LOCK_UNLOCKED; } while(0)
+--- linux-2.6.0-test1/include/asm-parisc/pgalloc.h     2003-06-14 12:18:35.000000000 -0700
++++ 25/include/asm-parisc/pgalloc.h    2003-07-19 17:07:16.000000000 -0700
+@@ -28,12 +28,12 @@ static inline void pgd_free(pgd_t *pgd)
+ /* Three Level Page Table Support for pmd's */
+-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
++static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, struct page *pmd)
+ {
+-      pgd_val(*pgd) = _PAGE_TABLE + __pa((unsigned long)pmd);
++      pgd_val(*pgd) = _PAGE_TABLE + __pa(page_address(pmd));
+ }
+-static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
++static inline pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+       pmd_t *pmd = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
+       if (pmd)
+@@ -41,9 +41,18 @@ static inline pmd_t *pmd_alloc_one(struc
+       return pmd;
+ }
+-static inline void pmd_free(pmd_t *pmd)
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
+ {
+-      free_page((unsigned long)pmd);
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      if (pmd)
++              return virt_to_page(pmd);
++      else
++              return NULL;
++}
++
++static inline void pmd_free(struct page *pmd)
++{
++      __free_page(pmd);
+ }
+ #else
+@@ -55,7 +64,8 @@ static inline void pmd_free(pmd_t *pmd)
+  * inside the pgd, so has no extra memory associated with it.
+  */
+-#define pmd_alloc_one(mm, addr)               ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)               ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)        pmd_alloc_one(mm, addr)
+ #define pmd_free(x)                   do { } while (0)
+ #define pgd_populate(mm, pmd, pte)    BUG()
+--- linux-2.6.0-test1/include/asm-parisc/pgtable.h     2003-07-13 21:44:35.000000000 -0700
++++ 25/include/asm-parisc/pgtable.h    2003-07-19 17:07:16.000000000 -0700
+@@ -242,7 +242,8 @@ extern unsigned long *empty_zero_page;
+ #ifdef __LP64__
+-#define pgd_page(pgd) ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define __pgd_page(pgd) ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define pgd_page(pgd) virt_to_page(__pgd_page(pgd))
+ /* For 64 bit we have three level tables */
+@@ -339,11 +340,17 @@ extern inline pte_t pte_modify(pte_t pte
+ #ifdef __LP64__
+ #define pmd_offset(dir,address) \
+-((pmd_t *) pgd_page(*(dir)) + (((address)>>PMD_SHIFT) & (PTRS_PER_PMD-1)))
++((pmd_t *)__pgd_page(*(dir)) + (((address)>>PMD_SHIFT) & (PTRS_PER_PMD-1)))
+ #else
+ #define pmd_offset(dir,addr) ((pmd_t *) dir)
+ #endif
++#define pmd_offset_kernel(pgd, addr)          pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)             pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)      pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                do { } while (0)
++#define pmd_unmap_nested(pmd)                 do { } while (0)
++
+ /* Find an entry in the third-level page table.. */ 
+ #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE-1))
+ #define pte_offset_kernel(pmd, address) \
+--- linux-2.6.0-test1/include/asm-parisc/posix_types.h 2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-parisc/posix_types.h        2003-07-19 17:06:39.000000000 -0700
+@@ -6,7 +6,9 @@
+  * be a little careful about namespace pollution etc.  Also, we cannot
+  * assume GCC is being used.
+  */
+-typedef unsigned int          __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long         __kernel_ino_t;
+ typedef unsigned short                __kernel_mode_t;
+ typedef unsigned short                __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-parisc/smp.h 2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-parisc/smp.h        2003-07-19 17:04:07.000000000 -0700
+@@ -14,9 +14,10 @@
+ #ifndef ASSEMBLY
+ #include <linux/bitops.h>
+ #include <linux/threads.h>    /* for NR_CPUS */
++#include <linux/cpumask.h>
+ typedef unsigned long address_t;
+-extern volatile unsigned long cpu_online_map;
++extern cpumask_t cpu_online_map;
+ /*
+@@ -51,22 +52,10 @@ extern void smp_send_reschedule(int cpu)
+ extern unsigned long cpu_present_mask;
+ #define smp_processor_id()    (current_thread_info()->cpu)
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+-#define cpu_possible(cpu)       (cpu_present_mask & (1<<(cpu)))
++#define cpu_possible(cpu)       cpu_isset(cpu, cpu_present_mask)
+-extern inline unsigned int num_online_cpus(void)
+-{
+-      return hweight32(cpu_online_map);
+-}
+-
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-      if (mask & cpu_online_map)
+-              return __ffs(mask & cpu_online_map);
+-
+-      return NR_CPUS;
+-}
+ #endif /* CONFIG_SMP */
+ #define NO_PROC_ID            0xFF            /* No processor magic marker */
+--- linux-2.6.0-test1/include/asm-ppc64/mmu_context.h  2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-ppc64/mmu_context.h 2003-07-19 17:04:07.000000000 -0700
+@@ -143,7 +143,7 @@ switch_mm(struct mm_struct *prev, struct
+         struct task_struct *tsk)
+ {
+       flush_stab(tsk, next);
+-      set_bit(smp_processor_id(), &next->cpu_vm_mask);
++      cpu_set(smp_processor_id(), next->cpu_vm_mask);
+ }
+ #define deactivate_mm(tsk,mm) do { } while (0)
+--- linux-2.6.0-test1/include/asm-ppc64/pgalloc.h      2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-ppc64/pgalloc.h     2003-07-19 17:07:16.000000000 -0700
+@@ -26,10 +26,10 @@ pgd_free(pgd_t *pgd)
+       free_page((unsigned long)pgd);
+ }
+-#define pgd_populate(MM, PGD, PMD)    pgd_set(PGD, PMD)
++#define pgd_populate(MM, PGD, PMD)    pgd_set(PGD, page_address(PMD))
+ static inline pmd_t *
+-pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+       pmd_t *pmd;
+@@ -39,10 +39,19 @@ pmd_alloc_one(struct mm_struct *mm, unsi
+       return pmd;
+ }
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      if (pmd)
++              return virt_to_page(pmd);
++      else
++              return NULL;
++}
++
+ static inline void
+-pmd_free(pmd_t *pmd)
++pmd_free(struct page *pmd)
+ {
+-      free_page((unsigned long)pmd);
++      __free_page(pmd);
+ }
+ #define __pmd_free_tlb(tlb, pmd)      pmd_free(pmd)
+--- linux-2.6.0-test1/include/asm-ppc64/pgtable.h      2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-ppc64/pgtable.h     2003-07-19 17:07:16.000000000 -0700
+@@ -190,7 +190,8 @@ extern unsigned long empty_zero_page[PAG
+ #define pgd_bad(pgd)          ((pgd_val(pgd)) == 0)
+ #define pgd_present(pgd)      (pgd_val(pgd) != 0UL)
+ #define pgd_clear(pgdp)               (pgd_val(*(pgdp)) = 0UL)
+-#define pgd_page(pgd)         (__bpn_to_ba(pgd_val(pgd))) 
++#define __pgd_page(pgd)               (__bpn_to_ba(pgd_val(pgd)))
++#define pgd_page(pgd)         virt_to_page(__pgd_page(pgd))
+ /* 
+  * Find an entry in a page-table-directory.  We combine the address region 
+@@ -203,12 +204,18 @@ extern unsigned long empty_zero_page[PAG
+ /* Find an entry in the second-level page table.. */
+ #define pmd_offset(dir,addr) \
+-  ((pmd_t *) pgd_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
++  ((pmd_t *)__pgd_page(*(dir)) + (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)))
+ /* Find an entry in the third-level page table.. */
+ #define pte_offset_kernel(dir,addr) \
+   ((pte_t *) pmd_page_kernel(*(dir)) + (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
++#define pmd_offset_kernel(pgd, addr)          pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)             pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)      pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                do { } while (0)
++#define pmd_unmap_nested(pmd)                 do { } while (0)
++
+ #define pte_offset_map(dir,addr)      pte_offset_kernel((dir), (addr))
+ #define pte_offset_map_nested(dir,addr)       pte_offset_kernel((dir), (addr))
+ #define pte_unmap(pte)                        do { } while(0)
+--- linux-2.6.0-test1/include/asm-ppc64/semaphore.h    2003-06-26 22:07:26.000000000 -0700
++++ 25/include/asm-ppc64/semaphore.h   2003-07-19 17:04:51.000000000 -0700
+@@ -22,6 +22,7 @@ struct semaphore {
+        * sleeping on `wait'.
+        */
+       atomic_t count;
++      int sleepers;
+       wait_queue_head_t wait;
+ #ifdef WAITQUEUE_DEBUG
+       long __magic;
+@@ -37,6 +38,7 @@ struct semaphore {
+ #define __SEMAPHORE_INITIALIZER(name, count) \
+       { ATOMIC_INIT(count), \
++        0, \
+         __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \
+         __SEM_DEBUG_INIT(name) }
+@@ -52,6 +54,7 @@ struct semaphore {
+ static inline void sema_init (struct semaphore *sem, int val)
+ {
+       atomic_set(&sem->count, val);
++      sem->sleepers = 0;
+       init_waitqueue_head(&sem->wait);
+ #ifdef WAITQUEUE_DEBUG
+       sem->__magic = (long)&sem->__magic;
+--- linux-2.6.0-test1/include/asm-ppc64/smp.h  2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-ppc64/smp.h 2003-07-19 17:04:07.000000000 -0700
+@@ -19,6 +19,7 @@
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/kernel.h>
+ #ifdef CONFIG_SMP
+@@ -27,31 +28,13 @@
+ #include <asm/paca.h>
+-extern unsigned long cpu_online_map;
+-
+ extern void smp_message_pass(int target, int msg, unsigned long data, int wait);
+ extern void smp_send_tlb_invalidate(int);
+ extern void smp_send_xmon_break(int cpu);
+ struct pt_regs;
+ extern void smp_message_recv(int, struct pt_regs *);
+-#define cpu_online(cpu)       test_bit((cpu), &cpu_online_map)
+-
+ #define cpu_possible(cpu)     paca[cpu].active
+-
+-static inline unsigned int num_online_cpus(void)
+-{
+-      return hweight64(cpu_online_map);
+-}
+-
+-static inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-      if (mask & cpu_online_map)
+-              return __ffs(mask & cpu_online_map);
+-
+-      return NR_CPUS;
+-}
+-
+ #define smp_processor_id() (get_paca()->xPacaIndex)
+ /* Since OpenPIC has only 4 IPIs, we use slightly different message numbers.
+--- linux-2.6.0-test1/include/asm-ppc64/tlb.h  2003-06-14 12:18:07.000000000 -0700
++++ 25/include/asm-ppc64/tlb.h 2003-07-19 17:04:07.000000000 -0700
+@@ -49,6 +49,7 @@ static inline void __tlb_remove_tlb_entr
+       struct ppc64_tlb_batch *batch = &ppc64_tlb_batch[cpu];
+       unsigned long i = batch->index;
+       pte_t pte;
++      cpumask_t local_cpumask = cpumask_of_cpu(cpu);
+       if (pte_val(*ptep) & _PAGE_HASHPTE) {
+               pte = __pte(pte_update(ptep, _PAGE_HPTEFLAGS, 0));
+@@ -61,7 +62,7 @@ static inline void __tlb_remove_tlb_entr
+                       if (i == PPC64_TLB_BATCH_NR) {
+                               int local = 0;
+-                              if (tlb->mm->cpu_vm_mask == (1UL << cpu))
++                              if (cpus_equal(tlb->mm->cpu_vm_mask, local_cpumask))
+                                       local = 1;
+                               flush_hash_range(tlb->mm->context, i, local);
+@@ -78,8 +79,9 @@ static inline void tlb_flush(struct mmu_
+       int cpu = smp_processor_id();
+       struct ppc64_tlb_batch *batch = &ppc64_tlb_batch[cpu];
+       int local = 0;
++      cpumask_t local_cpumask = cpumask_of_cpu(smp_processor_id());
+-      if (tlb->mm->cpu_vm_mask == (1UL << smp_processor_id()))
++      if (cpus_equal(tlb->mm->cpu_vm_mask, local_cpumask))
+               local = 1;
+       flush_hash_range(tlb->mm->context, batch->index, local);
+--- linux-2.6.0-test1/include/asm-ppc/hardirq.h        2003-07-02 14:53:17.000000000 -0700
++++ 25/include/asm-ppc/hardirq.h       2003-07-19 17:03:50.000000000 -0700
+@@ -14,8 +14,6 @@
+  */
+ typedef struct {
+       unsigned long __softirq_pending;        /* set_bit is used on this */
+-      unsigned int __syscall_count;
+-      struct task_struct * __ksoftirqd_task;
+       unsigned int __last_jiffy_stamp;
+ } ____cacheline_aligned irq_cpustat_t;
+--- linux-2.6.0-test1/include/asm-ppc/ipc.h    2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-ppc/ipc.h   2003-07-19 17:03:50.000000000 -0700
+@@ -14,6 +14,7 @@ struct ipc_kludge {
+ #define SEMOP          1
+ #define SEMGET                 2
+ #define SEMCTL                 3
++#define SEMTIMEDOP     4
+ #define MSGSND                11
+ #define MSGRCV                12
+ #define MSGGET                13
+--- linux-2.6.0-test1/include/asm-ppc/pci.h    2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ppc/pci.h   2003-07-19 17:03:50.000000000 -0700
+@@ -53,18 +53,12 @@ extern unsigned long phys_to_bus(unsigne
+ extern unsigned long pci_phys_to_bus(unsigned long pa, int busnr);
+ extern unsigned long pci_bus_to_phys(unsigned int ba, int busnr);
+     
+-/* Dynamic DMA Mapping stuff, stolen from i386
+- *    ++ajoshi
++/*
++ * Dynamic DMA Mapping stuff
++ * Originally stolen from i386 by ajoshi and updated by paulus
++ * Non-consistent cache support by Dan Malek
+  */
+-#include <linux/types.h>
+-#include <linux/slab.h>
+-#include <linux/string.h>
+-#include <asm/scatterlist.h>
+-#include <asm/io.h>
+-
+-struct pci_dev;
+-
+ /* The PCI address space does equal the physical memory
+  * address space.  The networking and block device layers use
+  * this boolean for bounce buffer decisions.
+@@ -101,8 +95,7 @@ extern void pci_free_consistent(struct p
+ static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr,
+                                       size_t size, int direction)
+ {
+-      if (direction == PCI_DMA_NONE)
+-              BUG();
++      BUG_ON(direction == PCI_DMA_NONE);
+       consistent_sync(ptr, size, direction);
+@@ -130,10 +123,11 @@ static inline void pci_unmap_single(stru
+  * to pci_map_single, but takes a struct page instead of a virtual address
+  */
+ static inline dma_addr_t pci_map_page(struct pci_dev *hwdev, struct page *page,
+-                                    unsigned long offset, size_t size, int direction)
++                                    unsigned long offset, size_t size,
++                                    int direction)
+ {
+-      if (direction == PCI_DMA_NONE)
+-              BUG();
++      BUG_ON(direction == PCI_DMA_NONE);
++      consistent_sync_page(page, offset, size, direction);
+       return (page - mem_map) * PAGE_SIZE + PCI_DRAM_OFFSET + offset;
+ }
+@@ -171,10 +165,11 @@ static inline int pci_map_sg(struct pci_
+       /*
+        * temporary 2.4 hack
+        */
+-      for (i = 0; i < nents; i++) {
+-              if (!sg[i].page)
+-                      BUG();
+-              sg[i].dma_address = page_to_bus(sg[i].page) + sg[i].offset;
++      for (i = 0; i < nents; i++, sg++) {
++              BUG_ON(!sg->page);
++              consistent_sync_page(sg->page, sg->offset,
++                                   sg->length, direction);
++              sg->dma_address = page_to_bus(sg->page) + sg->offset;
+       }
+       return nents;
+@@ -187,8 +182,7 @@ static inline int pci_map_sg(struct pci_
+ static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
+                               int nents, int direction)
+ {
+-      if (direction == PCI_DMA_NONE)
+-              BUG();
++      BUG_ON(direction == PCI_DMA_NONE);
+       /* nothing to do */
+ }
+@@ -205,8 +199,7 @@ static inline void pci_dma_sync_single(s
+                                      dma_addr_t dma_handle,
+                                      size_t size, int direction)
+ {
+-      if (direction == PCI_DMA_NONE)
+-              BUG();
++      BUG_ON(direction == PCI_DMA_NONE);
+       consistent_sync(bus_to_virt(dma_handle), size, direction);
+ }
+@@ -221,9 +214,13 @@ static inline void pci_dma_sync_sg(struc
+                                  struct scatterlist *sg,
+                                  int nelems, int direction)
+ {
+-      if (direction == PCI_DMA_NONE)
+-              BUG();
+-      /* nothing to do */
++      int i;
++
++      BUG_ON(direction == PCI_DMA_NONE);
++
++      for (i = 0; i < nelems; i++, sg++)
++              consistent_sync_page(sg->page, sg->offset,
++                                   sg->length, direction);
+ }
+ /* Return whether the given PCI device DMA address mask can
+--- linux-2.6.0-test1/include/asm-ppc/pgalloc.h        2003-06-14 12:17:55.000000000 -0700
++++ 25/include/asm-ppc/pgalloc.h       2003-07-19 17:07:16.000000000 -0700
+@@ -15,7 +15,8 @@ extern void pgd_free(pgd_t *pgd);
+  * We don't have any real pmd's, and this code never triggers because
+  * the pgd will always be present..
+  */
+-#define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,address)       ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm,addr)   ({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(x)                     do { } while (0)
+ #define __pmd_free_tlb(tlb,x)         do { } while (0)
+ #define pgd_populate(mm, pmd, pte)      BUG()
+--- linux-2.6.0-test1/include/asm-ppc/pgtable.h        2003-06-14 12:18:01.000000000 -0700
++++ 25/include/asm-ppc/pgtable.h       2003-07-19 17:07:16.000000000 -0700
+@@ -370,8 +370,9 @@ static inline int pgd_bad(pgd_t pgd)               { 
+ static inline int pgd_present(pgd_t pgd)      { return 1; }
+ #define pgd_clear(xp)                         do { } while (0)
+-#define pgd_page(pgd) \
++#define __pgd_page(pgd) \
+       ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define pgd_page(pgd) virt_to_page(__pgd_page(pgd))
+ /*
+  * The following only work if pte_present() is true.
+@@ -503,6 +504,12 @@ static inline pmd_t * pmd_offset(pgd_t *
+       return (pmd_t *) dir;
+ }
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
++
+ /* Find an entry in the third-level page table.. */
+ #define pte_index(address)            \
+       (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+--- linux-2.6.0-test1/include/asm-ppc/posix_types.h    2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-ppc/posix_types.h   2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned int  __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned int  __kernel_mode_t;
+ typedef unsigned short        __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-ppc/processor.h      2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-ppc/processor.h     2003-07-19 17:03:50.000000000 -0700
+@@ -705,6 +705,7 @@ struct thread_struct {
+       .ksp = INIT_SP, \
+       .fs = KERNEL_DS, \
+       .pgdir = swapper_pg_dir, \
++      .fpexc_mode = MSR_FE0 | MSR_FE1, \
+ }
+ /*
+--- linux-2.6.0-test1/include/asm-ppc/smp.h    2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-ppc/smp.h   2003-07-19 17:04:07.000000000 -0700
+@@ -14,6 +14,7 @@
+ #include <linux/kernel.h>
+ #include <linux/bitops.h>
+ #include <linux/errno.h>
++#include <linux/cpumask.h>
+ #ifdef CONFIG_SMP
+@@ -28,8 +29,8 @@ struct cpuinfo_PPC {
+ };
+ extern struct cpuinfo_PPC cpu_data[];
+-extern unsigned long cpu_online_map;
+-extern unsigned long cpu_possible_map;
++extern cpumask_t cpu_online_map;
++extern cpumask_t cpu_possible_map;
+ extern unsigned long smp_proc_in_lock[];
+ extern volatile unsigned long cpu_callin_map[];
+ extern int smp_tb_synchronized;
+@@ -45,21 +46,8 @@ extern void smp_local_timer_interrupt(st
+ #define smp_processor_id() (current_thread_info()->cpu)
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-#define cpu_possible(cpu) (cpu_possible_map & (1<<(cpu)))
+-
+-extern inline unsigned int num_online_cpus(void)
+-{
+-      return hweight32(cpu_online_map);
+-}
+-
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-      if (mask & cpu_online_map)
+-              return __ffs(mask & cpu_online_map);
+-
+-      return NR_CPUS;
+-}
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
++#define cpu_possible(cpu) cpu_isset(cpu, cpu_possible_map)
+ extern int __cpu_up(unsigned int cpu);
+--- linux-2.6.0-test1/include/asm-ppc/uaccess.h        2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-ppc/uaccess.h       2003-07-19 17:03:51.000000000 -0700
+@@ -16,10 +16,13 @@
+  * get_fs() == KERNEL_DS, checking is bypassed.
+  *
+  * For historical reasons, these macros are grossly misnamed.
++ *
++ * The fs/ds values are now the highest legal address in the "segment".
++ * This simplifies the checking in the routines below.
+  */
+-#define KERNEL_DS     ((mm_segment_t) { 0 })
+-#define USER_DS               ((mm_segment_t) { 1 })
++#define KERNEL_DS     ((mm_segment_t) { ~0UL })
++#define USER_DS               ((mm_segment_t) { TASK_SIZE - 1 })
+ #define get_ds()      (KERNEL_DS)
+ #define get_fs()      (current->thread.fs)
+@@ -27,14 +30,15 @@
+ #define segment_eq(a,b)       ((a).seg == (b).seg)
+-#define __kernel_ok (segment_eq(get_fs(), KERNEL_DS))
+-#define __user_ok(addr,size) (((size) <= TASK_SIZE)&&((addr) <= TASK_SIZE-(size)))
+-#define __access_ok(addr,size) (__kernel_ok || __user_ok((addr),(size)))
+-#define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size))
++#define __access_ok(addr,size)                                                    \
++      ((addr) <= current->thread.fs.seg                                   \
++       && ((size) == 0 || (size) - 1 <= current->thread.fs.seg - (addr)))
++
++#define access_ok(type, addr, size) __access_ok((unsigned long)(addr),(size))
+ extern inline int verify_area(int type, const void __user * addr, unsigned long size)
+ {
+-      return access_ok(type,addr,size) ? 0 : -EFAULT;
++      return access_ok(type, addr, size) ? 0 : -EFAULT;
+ }
+@@ -303,7 +307,7 @@ extern int __strnlen_user(const char __u
+  */
+ extern __inline__ int strnlen_user(const char __user *str, long len)
+ {
+-      unsigned long top = __kernel_ok? ~0UL: TASK_SIZE - 1;
++      unsigned long top = current->thread.fs.seg;
+       if ((unsigned long)str > top)
+               return 0;
+--- linux-2.6.0-test1/include/asm-ppc/unistd.h 2003-06-16 22:32:21.000000000 -0700
++++ 25/include/asm-ppc/unistd.h        2003-07-19 17:03:51.000000000 -0700
+@@ -253,177 +253,112 @@
+ #define __NR_clock_gettime    246
+ #define __NR_clock_getres     247
+ #define __NR_clock_nanosleep  248
++#define __NR_swapcontext      249
++#define __NR_tgkill           250
++#define __NR_utimes           251
++#define __NR_statfs64         252
++#define __NR_fstatfs64                253
+-#define __NR_syscalls         249
++#define __NR_syscalls         254
+ #define __NR(n)       #n
+-#define __syscall_return(type) \
+-      return (__sc_err & 0x10000000 ? errno = __sc_ret, __sc_ret = -1 : 0), \
+-             (type) __sc_ret
+-
+-#define __syscall_clobbers \
+-      "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
++/* On powerpc a system call basically clobbers the same registers like a
++ * function call, with the exception of LR (which is needed for the
++ * "sc; bnslr" sequence) and CR (where only CR0.SO is clobbered to signal
++ * an error return status).
++ */
+-#define _syscall0(type,name)                                          \
+-type name(void)                                                               \
+-{                                                                     \
++#define __syscall_nr(nr, type, name, args...)                         \
+       unsigned long __sc_ret, __sc_err;                               \
+       {                                                               \
+-              register unsigned long __sc_0 __asm__ ("r0");           \
+-              register unsigned long __sc_3 __asm__ ("r3");           \
+-                                                                      \
+-              __sc_0 = __NR_##name;                                   \
+-              __asm__ __volatile__                                    \
+-                      ("sc           \n\t"                            \
+-                       "mfcr %1      "                                \
+-                      : "=&r" (__sc_3), "=&r" (__sc_0)                \
+-                      : "0"   (__sc_3), "1"   (__sc_0)                \
+-                      : __syscall_clobbers);                          \
++              register unsigned long __sc_0  __asm__ ("r0");          \
++              register unsigned long __sc_3  __asm__ ("r3");          \
++              register unsigned long __sc_4  __asm__ ("r4");          \
++              register unsigned long __sc_5  __asm__ ("r5");          \
++              register unsigned long __sc_6  __asm__ ("r6");          \
++              register unsigned long __sc_7  __asm__ ("r7");          \
++                                                                      \
++              __sc_loadargs_##nr(name, args);                         \
++              __asm__ __volatile__                                    \
++                      ("sc           \n\t"                            \
++                       "mfcr %0      "                                \
++                      : "=&r" (__sc_0),                               \
++                        "=&r" (__sc_3),  "=&r" (__sc_4),              \
++                        "=&r" (__sc_5),  "=&r" (__sc_6),              \
++                        "=&r" (__sc_7)                                \
++                      : __sc_asm_input_##nr                           \
++                      : "cr0", "ctr", "memory",                       \
++                        "r8", "r9", "r10","r11", "r12");              \
+               __sc_ret = __sc_3;                                      \
+               __sc_err = __sc_0;                                      \
+       }                                                               \
+-      __syscall_return (type);                                        \
++      if (__sc_err & 0x10000000)                                      \
++      {                                                               \
++              errno = __sc_ret;                                       \
++              __sc_ret = -1;                                          \
++      }                                                               \
++      return (type) __sc_ret
++
++#define __sc_loadargs_0(name, dummy...)                                       \
++      __sc_0 = __NR_##name
++#define __sc_loadargs_1(name, arg1)                                   \
++      __sc_loadargs_0(name);                                          \
++      __sc_3 = (unsigned long) (arg1)
++#define __sc_loadargs_2(name, arg1, arg2)                             \
++      __sc_loadargs_1(name, arg1);                                    \
++      __sc_4 = (unsigned long) (arg2)
++#define __sc_loadargs_3(name, arg1, arg2, arg3)                               \
++      __sc_loadargs_2(name, arg1, arg2);                              \
++      __sc_5 = (unsigned long) (arg3)
++#define __sc_loadargs_4(name, arg1, arg2, arg3, arg4)                 \
++      __sc_loadargs_3(name, arg1, arg2, arg3);                        \
++      __sc_6 = (unsigned long) (arg4)
++#define __sc_loadargs_5(name, arg1, arg2, arg3, arg4, arg5)           \
++      __sc_loadargs_4(name, arg1, arg2, arg3, arg4);                  \
++      __sc_7 = (unsigned long) (arg5)
++
++#define __sc_asm_input_0 "0" (__sc_0)
++#define __sc_asm_input_1 __sc_asm_input_0, "1" (__sc_3)
++#define __sc_asm_input_2 __sc_asm_input_1, "2" (__sc_4)
++#define __sc_asm_input_3 __sc_asm_input_2, "3" (__sc_5)
++#define __sc_asm_input_4 __sc_asm_input_3, "4" (__sc_6)
++#define __sc_asm_input_5 __sc_asm_input_4, "5" (__sc_7)
++
++#define _syscall0(type,name)                                          \
++type name(void)                                                               \
++{                                                                     \
++      __syscall_nr(0, type, name);                                    \
+ }
+ #define _syscall1(type,name,type1,arg1)                                       \
+ type name(type1 arg1)                                                 \
+ {                                                                     \
+-      unsigned long __sc_ret, __sc_err;                               \
+-      {                                                               \
+-              register unsigned long __sc_0 __asm__ ("r0");           \
+-              register unsigned long __sc_3 __asm__ ("r3");           \
+-                                                                      \
+-              __sc_3 = (unsigned long) (arg1);                        \
+-              __sc_0 = __NR_##name;                                   \
+-              __asm__ __volatile__                                    \
+-                      ("sc           \n\t"                            \
+-                       "mfcr %1      "                                \
+-                      : "=&r" (__sc_3), "=&r" (__sc_0)                \
+-                      : "0"   (__sc_3), "1"   (__sc_0)                \
+-                      : __syscall_clobbers);                          \
+-              __sc_ret = __sc_3;                                      \
+-              __sc_err = __sc_0;                                      \
+-      }                                                               \
+-      __syscall_return (type);                                        \
++      __syscall_nr(1, type, name, arg1);                              \
+ }
+ #define _syscall2(type,name,type1,arg1,type2,arg2)                    \
+ type name(type1 arg1, type2 arg2)                                     \
+ {                                                                     \
+-      unsigned long __sc_ret, __sc_err;                               \
+-      {                                                               \
+-              register unsigned long __sc_0 __asm__ ("r0");           \
+-              register unsigned long __sc_3 __asm__ ("r3");           \
+-              register unsigned long __sc_4 __asm__ ("r4");           \
+-                                                                      \
+-              __sc_3 = (unsigned long) (arg1);                        \
+-              __sc_4 = (unsigned long) (arg2);                        \
+-              __sc_0 = __NR_##name;                                   \
+-              __asm__ __volatile__                                    \
+-                      ("sc           \n\t"                            \
+-                       "mfcr %1      "                                \
+-                      : "=&r" (__sc_3), "=&r" (__sc_0)                \
+-                      : "0"   (__sc_3), "1"   (__sc_0),               \
+-                        "r"   (__sc_4)                                \
+-                      : __syscall_clobbers);                          \
+-              __sc_ret = __sc_3;                                      \
+-              __sc_err = __sc_0;                                      \
+-      }                                                               \
+-      __syscall_return (type);                                        \
++      __syscall_nr(2, type, name, arg1, arg2);                        \
+ }
+ #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)         \
+ type name(type1 arg1, type2 arg2, type3 arg3)                         \
+ {                                                                     \
+-      unsigned long __sc_ret, __sc_err;                               \
+-      {                                                               \
+-              register unsigned long __sc_0 __asm__ ("r0");           \
+-              register unsigned long __sc_3 __asm__ ("r3");           \
+-              register unsigned long __sc_4 __asm__ ("r4");           \
+-              register unsigned long __sc_5 __asm__ ("r5");           \
+-                                                                      \
+-              __sc_3 = (unsigned long) (arg1);                        \
+-              __sc_4 = (unsigned long) (arg2);                        \
+-              __sc_5 = (unsigned long) (arg3);                        \
+-              __sc_0 = __NR_##name;                                   \
+-              __asm__ __volatile__                                    \
+-                      ("sc           \n\t"                            \
+-                       "mfcr %1      "                                \
+-                      : "=&r" (__sc_3), "=&r" (__sc_0)                \
+-                      : "0"   (__sc_3), "1"   (__sc_0),               \
+-                        "r"   (__sc_4),                               \
+-                        "r"   (__sc_5)                                \
+-                      : __syscall_clobbers);                          \
+-              __sc_ret = __sc_3;                                      \
+-              __sc_err = __sc_0;                                      \
+-      }                                                               \
+-      __syscall_return (type);                                        \
++      __syscall_nr(3, type, name, arg1, arg2, arg3);                  \
+ }
+ #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4)             \
+ {                                                                     \
+-      unsigned long __sc_ret, __sc_err;                               \
+-      {                                                               \
+-              register unsigned long __sc_0 __asm__ ("r0");           \
+-              register unsigned long __sc_3 __asm__ ("r3");           \
+-              register unsigned long __sc_4 __asm__ ("r4");           \
+-              register unsigned long __sc_5 __asm__ ("r5");           \
+-              register unsigned long __sc_6 __asm__ ("r6");           \
+-                                                                      \
+-              __sc_3 = (unsigned long) (arg1);                        \
+-              __sc_4 = (unsigned long) (arg2);                        \
+-              __sc_5 = (unsigned long) (arg3);                        \
+-              __sc_6 = (unsigned long) (arg4);                        \
+-              __sc_0 = __NR_##name;                                   \
+-              __asm__ __volatile__                                    \
+-                      ("sc           \n\t"                            \
+-                       "mfcr %1      "                                \
+-                      : "=&r" (__sc_3), "=&r" (__sc_0)                \
+-                      : "0"   (__sc_3), "1"   (__sc_0),               \
+-                        "r"   (__sc_4),                               \
+-                        "r"   (__sc_5),                               \
+-                        "r"   (__sc_6)                                \
+-                      : __syscall_clobbers);                          \
+-              __sc_ret = __sc_3;                                      \
+-              __sc_err = __sc_0;                                      \
+-      }                                                               \
+-      __syscall_return (type);                                        \
++      __syscall_nr(4, type, name, arg1, arg2, arg3, arg4);            \
+ }
+ #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
+ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
+ {                                                                     \
+-      unsigned long __sc_ret, __sc_err;                               \
+-      {                                                               \
+-              register unsigned long __sc_0 __asm__ ("r0");           \
+-              register unsigned long __sc_3 __asm__ ("r3");           \
+-              register unsigned long __sc_4 __asm__ ("r4");           \
+-              register unsigned long __sc_5 __asm__ ("r5");           \
+-              register unsigned long __sc_6 __asm__ ("r6");           \
+-              register unsigned long __sc_7 __asm__ ("r7");           \
+-                                                                      \
+-              __sc_3 = (unsigned long) (arg1);                        \
+-              __sc_4 = (unsigned long) (arg2);                        \
+-              __sc_5 = (unsigned long) (arg3);                        \
+-              __sc_6 = (unsigned long) (arg4);                        \
+-              __sc_7 = (unsigned long) (arg5);                        \
+-              __sc_0 = __NR_##name;                                   \
+-              __asm__ __volatile__                                    \
+-                      ("sc           \n\t"                            \
+-                       "mfcr %1      "                                \
+-                      : "=&r" (__sc_3), "=&r" (__sc_0)                \
+-                      : "0"   (__sc_3), "1"   (__sc_0),               \
+-                        "r"   (__sc_4),                               \
+-                        "r"   (__sc_5),                               \
+-                        "r"   (__sc_6),                               \
+-                        "r"   (__sc_7)                                \
+-                      : __syscall_clobbers);                          \
+-              __sc_ret = __sc_3;                                      \
+-              __sc_err = __sc_0;                                      \
+-      }                                                               \
+-      __syscall_return (type);                                        \
++      __syscall_nr(5, type, name, arg1, arg2, arg3, arg4, arg5);      \
+ }
+ #ifdef __KERNEL__
+--- linux-2.6.0-test1/include/asm-s390/bitops.h        2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-s390/bitops.h       2003-07-19 17:04:07.000000000 -0700
+@@ -505,7 +505,7 @@ static inline int __test_bit(unsigned lo
+       unsigned char ch;
+       addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
+-      ch = *(unsigned char *) addr;
++      ch = *(volatile unsigned char *) addr;
+       return (ch >> (nr & 7)) & 1;
+ }
+--- linux-2.6.0-test1/include/asm-s390/dma.h   2003-06-14 12:18:33.000000000 -0700
++++ 25/include/asm-s390/dma.h  2003-07-19 17:03:51.000000000 -0700
+@@ -2,8 +2,6 @@
+  *  include/asm-s390/dma.h
+  *
+  *  S390 version
+- *
+- *  This file exists so that an #include <dma.h> doesn't break anything.
+  */
+ #ifndef _ASM_DMA_H
+--- linux-2.6.0-test1/include/asm-s390/dma-mapping.h   2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-s390/dma-mapping.h  2003-07-19 17:03:51.000000000 -0700
+@@ -1 +1,11 @@
+-#include <asm-generic/dma-mapping.h>
++/*
++ *  include/asm-s390/dma-mapping.h
++ *
++ *  S390 version
++ *
++ *  This file exists so that #include <dma-mapping.h> doesn't break anything.
++ */
++
++#ifndef _ASM_DMA_MAPPING_H
++#define _ASM_DMA_MAPPING_H
++#endif /* _ASM_DMA_MAPPING_H */
+--- linux-2.6.0-test1/include/asm-s390/irq.h   2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-s390/irq.h  2003-07-19 17:03:51.000000000 -0700
+@@ -8,16 +8,13 @@
+  * the definition of irqs has changed in 2.5.46:
+  * NR_IRQS is no longer the number of i/o
+  * interrupts (65536), but rather the number
+- * of interrupt classes (6).
++ * of interrupt classes (2).
++ * Only external and i/o interrupts make much sense here (CH).
+  */
+ enum interruption_class {
+       EXTERNAL_INTERRUPT,
+       IO_INTERRUPT,
+-      MACHINE_CHECK_INTERRUPT,
+-      PROGRAM_INTERRUPT,
+-      RESTART_INTERRUPT,
+-      SUPERVISOR_CALL,
+       NR_IRQS,
+ };
+--- linux-2.6.0-test1/include/asm-s390/mmu_context.h   2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-s390/mmu_context.h  2003-07-19 17:04:07.000000000 -0700
+@@ -42,7 +42,7 @@ static inline void switch_mm(struct mm_s
+                              : : "m" (pgd) );
+ #endif /* __s390x__ */
+         }
+-      set_bit(smp_processor_id(), &next->cpu_vm_mask);
++      cpu_set(smp_processor_id(), next->cpu_vm_mask);
+ }
+ #define deactivate_mm(tsk,mm) do { } while (0)
+--- linux-2.6.0-test1/include/asm-s390/pgalloc.h       2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-s390/pgalloc.h      2003-07-19 17:07:16.000000000 -0700
+@@ -61,12 +61,13 @@ static inline void pgd_free(pgd_t *pgd)
+  * We use pmd cache only on s390x, so these are dummy routines. This
+  * code never triggers because the pgd will always be present.
+  */
+-#define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm,address)       ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm,addr)   ({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(x)                     do { } while (0)
+ #define __pmd_free_tlb(tlb,x)         do { } while (0)
+ #define pgd_populate(mm, pmd, pte)      BUG()
+ #else /* __s390x__ */
+-static inline pmd_t * pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr)
++static inline pmd_t * pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long vmaddr)
+ {
+       pmd_t *pmd;
+         int i;
+@@ -79,16 +80,25 @@ static inline pmd_t * pmd_alloc_one(stru
+       return pmd;
+ }
+-static inline void pmd_free (pmd_t *pmd)
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
+ {
+-      free_pages((unsigned long) pmd, 2);
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      if (pmd)
++              return virt_to_page(pmd);
++      else
++              return NULL;
++}
++
++static inline void pmd_free(struct page *pmd)
++{
++      __free_pages(pmd, 2);
+ }
+ #define __pmd_free_tlb(tlb,pmd) pmd_free(pmd)
+-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
++static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, struct page *pmd)
+ {
+-      pgd_val(*pgd) = _PGD_ENTRY | __pa(pmd);
++      pgd_val(*pgd) = _PGD_ENTRY | __pa(page_address(pmd));
+ }
+ #endif /* __s390x__ */
+--- linux-2.6.0-test1/include/asm-s390/pgtable.h       2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-s390/pgtable.h      2003-07-19 17:07:16.000000000 -0700
+@@ -613,6 +613,7 @@ static inline pte_t mk_pte_phys(unsigned
+ /* to find an entry in a page-table-directory */
+ #define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
+ #define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
++#define pgd_page(pgd) virt_to_page(pgd_page_kernel(pgd))
+ /* to find an entry in a kernel page-table-directory */
+ #define pgd_offset_k(address) pgd_offset(&init_mm, address)
+@@ -634,6 +635,12 @@ extern inline pmd_t * pmd_offset(pgd_t *
+ #endif /* __s390x__ */
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
++
+ /* Find an entry in the third-level page table.. */
+ #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE-1))
+ #define pte_offset_kernel(pmd, address) \
+--- linux-2.6.0-test1/include/asm-s390/posix_types.h   2003-06-14 12:17:55.000000000 -0700
++++ 25/include/asm-s390/posix_types.h  2003-07-19 17:06:39.000000000 -0700
+@@ -34,7 +34,9 @@ typedef long long       __kernel_loff_t;
+ #ifndef __s390x__
+-typedef unsigned short  __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long   __kernel_ino_t;
+ typedef unsigned short  __kernel_mode_t;
+ typedef unsigned short  __kernel_nlink_t;
+@@ -51,7 +53,9 @@ typedef unsigned short       __kernel_old_dev_
+ #else /* __s390x__ */
+-typedef unsigned int    __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned int    __kernel_ino_t;
+ typedef unsigned int    __kernel_mode_t;
+ typedef unsigned int    __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-s390/siginfo.h       2003-06-14 12:18:33.000000000 -0700
++++ 25/include/asm-s390/siginfo.h      2003-07-19 17:03:51.000000000 -0700
+@@ -10,6 +10,9 @@
+ #define _S390_SIGINFO_H
+ #define HAVE_ARCH_SI_CODES
++#ifdef __s390x__
++#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
++#endif
+ #include <asm-generic/siginfo.h>
+--- linux-2.6.0-test1/include/asm-s390/smp.h   2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-s390/smp.h  2003-07-19 17:04:07.000000000 -0700
+@@ -11,6 +11,7 @@
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/bitops.h>
+ #if defined(__KERNEL__) && defined(CONFIG_SMP) && !defined(__ASSEMBLY__)
+@@ -28,8 +29,8 @@ typedef struct
+       __u16      cpu;
+ } sigp_info;
+-extern volatile unsigned long cpu_online_map;
+-extern volatile unsigned long cpu_possible_map;
++extern cpumask_t cpu_online_map;
++extern cpumask_t cpu_possible_map;
+ #define NO_PROC_ID            0xFF            /* No processor magic marker */
+@@ -47,25 +48,8 @@ extern volatile unsigned long cpu_possib
+ #define smp_processor_id() (current_thread_info()->cpu)
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-#define cpu_possible(cpu) (cpu_possible_map & (1<<(cpu)))
+-
+-extern inline unsigned int num_online_cpus(void)
+-{
+-#ifndef __s390x__
+-      return hweight32(cpu_online_map);
+-#else /* __s390x__ */
+-      return hweight64(cpu_online_map);
+-#endif /* __s390x__ */
+-}
+-
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-      if (mask & cpu_online_map)
+-              return __ffs(mask & cpu_online_map);
+-
+-      return NR_CPUS;
+-}
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
++#define cpu_possible(cpu) cpu_isset(cpu, cpu_possible_map)
+ extern __inline__ __u16 hard_smp_processor_id(void)
+ {
+--- linux-2.6.0-test1/include/asm-s390/tlbflush.h      2003-06-14 12:18:49.000000000 -0700
++++ 25/include/asm-s390/tlbflush.h     2003-07-19 17:04:07.000000000 -0700
+@@ -98,13 +98,15 @@ static inline void global_flush_tlb(void
+ static inline void __flush_tlb_mm(struct mm_struct * mm)
+ {
++      cpumask_t local_cpumask;
+       preempt_disable();
+-      if (mm->cpu_vm_mask != (1UL << smp_processor_id())) {
++      local_cpumask = cpumask_of_cpu(smp_processor_id());
++      if (cpus_equal(mm->cpu_vm_mask, local_cpumask)) {
+               /* mm was active on more than one cpu. */
+               if (mm == current->active_mm &&
+                   atomic_read(&mm->mm_users) == 1)
+                       /* this cpu is the only one using the mm. */
+-                      mm->cpu_vm_mask = 1UL << smp_processor_id();
++                      mm->cpu_vm_mask = local_cpumask;
+               global_flush_tlb();
+       } else
+               local_flush_tlb();
+--- linux-2.6.0-test1/include/asm-sh/pgalloc.h 2003-07-02 14:53:18.000000000 -0700
++++ 25/include/asm-sh/pgalloc.h        2003-07-19 17:07:16.000000000 -0700
+@@ -94,7 +94,8 @@ static inline void pte_free(struct page 
+  * inside the pgd, so has no extra memory associated with it.
+  */
+-#define pmd_alloc_one(mm, addr)               ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one_kernel(mm, addr)        ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)               ({ BUG(); ((struct page *)2); })
+ #define pmd_free(x)                   do { } while (0)
+ #define __pmd_free_tlb(tlb,x)         do { } while (0)
+ #define pgd_populate(mm, pmd, pte)    BUG()
+--- linux-2.6.0-test1/include/asm-sh/pgtable-2level.h  2003-07-02 14:53:18.000000000 -0700
++++ 25/include/asm-sh/pgtable-2level.h 2003-07-19 17:07:16.000000000 -0700
+@@ -48,14 +48,21 @@ static inline void pgd_clear (pgd_t * pg
+ #define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
+ #define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)
+-#define pgd_page(pgd) \
++#define __pgd_page(pgd) \
+ ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
++#define pgd_page(pgd) virt_to_page(__pgd_page(pgd))
+ static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
+ {
+       return (pmd_t *) dir;
+ }
++#define pmd_offset_kernel(pgd, addr)          pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)             pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)      pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                do { } while (0)
++#define pmd_unmap_nested(pmd)                 do { } while (0)
++
+ #define pte_pfn(x)            ((unsigned long)(((x).pte >> PAGE_SHIFT)))
+ #define pfn_pte(pfn, prot)    __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
+ #define pfn_pmd(pfn, prot)    __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
+--- linux-2.6.0-test1/include/asm-sh/posix_types.h     2003-07-02 14:53:18.000000000 -0700
++++ 25/include/asm-sh/posix_types.h    2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
+-typedef unsigned short        __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned short        __kernel_mode_t;
+ typedef unsigned short        __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-sparc64/atomic.h     2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-sparc64/atomic.h    2003-07-19 17:03:51.000000000 -0700
+@@ -9,25 +9,46 @@
+ #define __ARCH_SPARC64_ATOMIC__
+ typedef struct { volatile int counter; } atomic_t;
+-#define ATOMIC_INIT(i)        { (i) }
++typedef struct { volatile long counter; } atomic64_t;
++
++#define ATOMIC_INIT(i)                { (i) }
++#define ATOMIC64_INIT(i)      { (i) }
+ #define atomic_read(v)                ((v)->counter)
++#define atomic64_read(v)      ((v)->counter)
++
+ #define atomic_set(v, i)      (((v)->counter) = i)
++#define atomic64_set(v, i)    (((v)->counter) = i)
+ extern int __atomic_add(int, atomic_t *);
++extern int __atomic64_add(int, atomic64_t *);
++
+ extern int __atomic_sub(int, atomic_t *);
++extern int __atomic64_sub(int, atomic64_t *);
+ #define atomic_add(i, v) ((void)__atomic_add(i, v))
++#define atomic64_add(i, v) ((void)__atomic64_add(i, v))
++
+ #define atomic_sub(i, v) ((void)__atomic_sub(i, v))
++#define atomic64_sub(i, v) ((void)__atomic64_sub(i, v))
+ #define atomic_dec_return(v) __atomic_sub(1, v)
++#define atomic64_dec_return(v) __atomic64_sub(1, v)
++
+ #define atomic_inc_return(v) __atomic_add(1, v)
++#define atomic64_inc_return(v) __atomic64_add(1, v)
+ #define atomic_sub_and_test(i, v) (__atomic_sub(i, v) == 0)
++#define atomic64_sub_and_test(i, v) (__atomic64_sub(i, v) == 0)
++
+ #define atomic_dec_and_test(v) (__atomic_sub(1, v) == 0)
++#define atomic64_dec_and_test(v) (__atomic64_sub(1, v) == 0)
+ #define atomic_inc(v) ((void)__atomic_add(1, v))
++#define atomic64_inc(v) ((void)__atomic64_add(1, v))
++
+ #define atomic_dec(v) ((void)__atomic_sub(1, v))
++#define atomic64_dec(v) ((void)__atomic64_sub(1, v))
+ /* Atomic operations are already serializing */
+ #define smp_mb__before_atomic_dec()   barrier()
+--- linux-2.6.0-test1/include/asm-sparc64/bitops.h     2003-06-14 12:17:58.000000000 -0700
++++ 25/include/asm-sparc64/bitops.h    2003-07-19 17:04:07.000000000 -0700
+@@ -156,6 +156,14 @@ static __inline__ int ffs(int x)
+ #ifdef ULTRA_HAS_POPULATION_COUNT
++static __inline__ unsigned int hweight64(unsigned long w)
++{
++      unsigned int res;
++
++      __asm__ ("popc %1,%0" : "=r" (res) : "r" (w));
++      return res;
++}
++
+ static __inline__ unsigned int hweight32(unsigned int w)
+ {
+       unsigned int res;
+@@ -182,6 +190,7 @@ static __inline__ unsigned int hweight8(
+ #else
++#define hweight64(x) generic_hweight64(x)
+ #define hweight32(x) generic_hweight32(x)
+ #define hweight16(x) generic_hweight16(x)
+ #define hweight8(x) generic_hweight8(x)
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-sparc64/local.h     2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,40 @@
++#ifndef _ARCH_SPARC64_LOCAL_H
++#define _ARCH_SPARC64_LOCAL_H
++
++#include <linux/percpu.h>
++#include <asm/atomic.h>
++
++typedef atomic64_t local_t;
++
++#define LOCAL_INIT(i) ATOMIC64_INIT(i)
++#define local_read(v) atomic64_read(v)
++#define local_set(v,i)        atomic64_set(v,i)
++
++#define local_inc(v)  atomic64_inc(v)
++#define local_dec(v)  atomic64_inc(v)
++#define local_add(i, v)       atomic64_add(i, v)
++#define local_sub(i, v)       atomic64_sub(i, v)
++
++#define __local_inc(v)                ((v)->counter++)
++#define __local_dec(v)                ((v)->counter++)
++#define __local_add(i,v)      ((v)->counter+=(i))
++#define __local_sub(i,v)      ((v)->counter-=(i))
++
++/* Use these for per-cpu local_t variables: on some archs they are
++ * much more efficient than these naive implementations.  Note they take
++ * a variable, not an address.
++ */
++#define cpu_local_read(v)     local_read(&__get_cpu_var(v))
++#define cpu_local_set(v, i)   local_set(&__get_cpu_var(v), (i))
++
++#define cpu_local_inc(v)      local_inc(&__get_cpu_var(v))
++#define cpu_local_dec(v)      local_dec(&__get_cpu_var(v))
++#define cpu_local_add(i, v)   local_add((i), &__get_cpu_var(v))
++#define cpu_local_sub(i, v)   local_sub((i), &__get_cpu_var(v))
++
++#define __cpu_local_inc(v)    __local_inc(&__get_cpu_var(v))
++#define __cpu_local_dec(v)    __local_dec(&__get_cpu_var(v))
++#define __cpu_local_add(i, v) __local_add((i), &__get_cpu_var(v))
++#define __cpu_local_sub(i, v) __local_sub((i), &__get_cpu_var(v))
++
++#endif /* _ARCH_SPARC64_LOCAL_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-sparc64/lockmeter.h 2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,47 @@
++/*
++ * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
++ */
++
++#ifndef _SPARC64_LOCKMETER_H
++#define _SPARC64_LOCKMETER_H
++
++#include <asm/spinlock.h>
++
++#include <linux/version.h>
++
++extern unsigned long cpu_hz;
++#define CPU_CYCLE_FREQUENCY   cpu_hz
++
++#define THIS_CPU_NUMBER               __cpu_number_map[smp_processor_id()]
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
++#define local_irq_save(x)     __save_and_cli(x)
++#define local_irq_restore(x)  __restore_flags(x)
++#endif /* Linux version 2.2.x */
++
++#define PUT_INDEX(lock_ptr,indexv)    (lock_ptr)->index = (indexv)
++#define GET_INDEX(lock_ptr)           (lock_ptr)->index
++
++#define PUT_RWINDEX(rwlock_ptr,indexv) (rwlock_ptr)->index = (indexv)
++#define GET_RWINDEX(rwlock_ptr)        (rwlock_ptr)->index
++#define PUT_RW_CPU(rwlock_ptr,cpuv)    (rwlock_ptr)->cpu = (cpuv)
++#define GET_RW_CPU(rwlock_ptr)         (rwlock_ptr)->cpu
++
++#define RWLOCK_READERS(rwlock_ptr)    rwlock_readers(rwlock_ptr)
++
++extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
++{
++      signed int tmp = rwlock_ptr->lock;
++
++      if (tmp > 0)
++              return tmp;
++      else
++              return 0;
++}
++
++#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr)    ((signed int)((rwlock_ptr)->lock) < 0)
++#define RWLOCK_IS_READ_LOCKED(rwlock_ptr)     ((signed int)((rwlock_ptr)->lock) > 0)
++
++#define get_cycles64()        get_cycles()
++
++#endif /* _SPARC64_LOCKMETER_H */
+--- linux-2.6.0-test1/include/asm-sparc64/mmu_context.h        2003-07-10 18:50:32.000000000 -0700
++++ 25/include/asm-sparc64/mmu_context.h       2003-07-19 17:04:07.000000000 -0700
+@@ -125,7 +125,7 @@ static inline void switch_mm(struct mm_s
+       }
+       {
+-              unsigned long vm_mask = (1UL << smp_processor_id());
++              int cpu = smp_processor_id();
+               /* Even if (mm == old_mm) we _must_ check
+                * the cpu_vm_mask.  If we do not we could
+@@ -133,8 +133,8 @@ static inline void switch_mm(struct mm_s
+                * smp_flush_tlb_{page,range,mm} on sparc64
+                * and lazy tlb switches work. -DaveM
+                */
+-              if (!ctx_valid || !(mm->cpu_vm_mask & vm_mask)) {
+-                      mm->cpu_vm_mask |= vm_mask;
++              if (!ctx_valid || !cpu_isset(cpu, mm->cpu_vm_mask)) {
++                      cpu_set(cpu, mm->cpu_vm_mask);
+                       __flush_tlb_mm(CTX_HWBITS(mm->context), SECONDARY_CONTEXT);
+               }
+       }
+@@ -148,14 +148,14 @@ extern void __flush_tlb_mm(unsigned long
+ /* Activate a new MM instance for the current task. */
+ static inline void activate_mm(struct mm_struct *active_mm, struct mm_struct *mm)
+ {
+-      unsigned long vm_mask;
++      int cpu;
+       spin_lock(&mm->page_table_lock);
+       if (!CTX_VALID(mm->context))
+               get_new_mmu_context(mm);
+-      vm_mask = (1UL << smp_processor_id());
+-      if (!(mm->cpu_vm_mask & vm_mask))
+-              mm->cpu_vm_mask |= vm_mask;
++      cpu = smp_processor_id();
++      if (!cpu_isset(cpu, mm->cpu_vm_mask))
++              cpu_set(cpu, mm->cpu_vm_mask);
+       spin_unlock(&mm->page_table_lock);
+       load_secondary_context(mm);
+--- linux-2.6.0-test1/include/asm-sparc64/pgalloc.h    2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-sparc64/pgalloc.h   2003-07-19 17:07:16.000000000 -0700
+@@ -132,7 +132,7 @@ static __inline__ void free_pgd_slow(pgd
+ #define DCACHE_COLOR(address)         0
+ #endif
+-#define pgd_populate(MM, PGD, PMD)    pgd_set(PGD, PMD)
++#define pgd_populate(MM, PGD, PMD)    pgd_set(PGD, page_address(PMD))
+ static __inline__ pmd_t *pmd_alloc_one_fast(struct mm_struct *mm, unsigned long address)
+ {
+@@ -153,7 +153,7 @@ static __inline__ pmd_t *pmd_alloc_one_f
+       return (pmd_t *)ret;
+ }
+-static __inline__ pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
++static __inline__ pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
+ {
+       pmd_t *pmd;
+@@ -166,6 +166,15 @@ static __inline__ pmd_t *pmd_alloc_one(s
+       return pmd;
+ }
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      if (pmd)
++              return virt_to_page(pmd);
++      else
++              return NULL;
++}
++
+ static __inline__ void free_pmd_fast(pmd_t *pmd)
+ {
+       unsigned long color = DCACHE_COLOR((unsigned long)pmd);
+@@ -222,7 +231,7 @@ static __inline__ void free_pte_slow(pte
+ #define pte_free_kernel(pte)  free_pte_fast(pte)
+ #define pte_free(pte)         free_pte_fast(page_address(pte))
+-#define pmd_free(pmd)         free_pmd_fast(pmd)
++#define pmd_free(pmd)         free_pmd_fast(page_address(pmd))
+ #define pgd_free(pgd)         free_pgd_fast(pgd)
+ #define pgd_alloc(mm)         get_pgd_fast()
+--- linux-2.6.0-test1/include/asm-sparc64/pgtable.h    2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-sparc64/pgtable.h   2003-07-19 17:07:16.000000000 -0700
+@@ -228,7 +228,8 @@ static inline pte_t pte_modify(pte_t ori
+       (pgd_val(*(pgdp)) = (__pa((unsigned long) (pmdp)) >> 11UL))
+ #define __pmd_page(pmd)                       ((unsigned long) __va((pmd_val(pmd)<<11UL)))
+ #define pmd_page(pmd)                         virt_to_page((void *)__pmd_page(pmd))
+-#define pgd_page(pgd)                 ((unsigned long) __va((pgd_val(pgd)<<11UL)))
++#define __pgd_page(pgd)                       ((unsigned long) __va((pgd_val(pgd)<<11UL)))
++#define pgd_page(pgd)                 virt_to_page(__pgd_page(pgd))
+ #define pte_none(pte)                         (!pte_val(pte))
+ #define pte_present(pte)              (pte_val(pte) & _PAGE_PRESENT)
+ #define pte_clear(pte)                        (pte_val(*(pte)) = 0UL)
+@@ -270,8 +271,13 @@ static inline pte_t pte_modify(pte_t ori
+ #define pgd_offset_k(address) pgd_offset(&init_mm, address)
+ /* Find an entry in the second-level page table.. */
+-#define pmd_offset(dir, address)      ((pmd_t *) pgd_page(*(dir)) + \
++#define pmd_offset(dir, address)      ((pmd_t *)__pgd_page(*(dir)) + \
+                                       ((address >> PMD_SHIFT) & (REAL_PTRS_PER_PMD-1)))
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
+ /* Find an entry in the third-level page table.. */
+ #define pte_index(dir, address)       ((pte_t *) __pmd_page(*(dir)) + \
+--- linux-2.6.0-test1/include/asm-sparc64/posix_types.h        2003-06-14 12:18:32.000000000 -0700
++++ 25/include/asm-sparc64/posix_types.h       2003-07-19 17:06:39.000000000 -0700
+@@ -16,7 +16,9 @@ typedef int                    __kernel_
+ typedef int                    __kernel_ipc_pid_t;
+ typedef unsigned int           __kernel_uid_t;
+ typedef unsigned int           __kernel_gid_t;
+-typedef unsigned int           __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long __kernel_dev_t;
++#endif
+ typedef unsigned long          __kernel_ino_t;
+ typedef unsigned int           __kernel_mode_t;
+ typedef unsigned short         __kernel_umode_t;
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-sparc64/sections.h  2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,7 @@
++#ifndef _SPARC64_SECTIONS_H
++#define _SPARC64_SECTIONS_H
++
++/* nothing to see, move along */
++#include <asm-generic/sections.h>
++
++#endif
+--- linux-2.6.0-test1/include/asm-sparc64/smp.h        2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-sparc64/smp.h       2003-07-19 17:04:07.000000000 -0700
+@@ -14,6 +14,7 @@
+ #ifndef __ASSEMBLY__
++#include <linux/cpumask.h>
+ #include <linux/cache.h>
+ /* PROM provided per-processor information we need
+@@ -68,25 +69,14 @@ extern cpuinfo_sparc cpu_data[NR_CPUS];
+ extern unsigned char boot_cpu_id;
+-extern unsigned long phys_cpu_present_map;
+-#define cpu_possible(cpu)     (phys_cpu_present_map & (1UL << (cpu)))
++extern cpumask_t phys_cpu_present_map;
++#define cpu_possible(cpu)     cpu_isset(cpu, phys_cpu_present_map)
+-extern unsigned long cpu_online_map;
+-#define cpu_online(cpu)               (cpu_online_map & (1UL << (cpu)))
+-
+-extern atomic_t sparc64_num_cpus_online;
+-#define num_online_cpus()     (atomic_read(&sparc64_num_cpus_online))
++#define cpu_online(cpu)               cpu_isset(cpu, cpu_online_map)
+ extern atomic_t sparc64_num_cpus_possible;
+ #define num_possible_cpus()   (atomic_read(&sparc64_num_cpus_possible))
+-static inline unsigned int any_online_cpu(unsigned long mask)
+-{
+-      if ((mask &= cpu_online_map) != 0UL)
+-              return __ffs(mask);
+-      return NR_CPUS;
+-}
+-
+ /*
+  *    General functions that each host system must provide.
+  */
+--- linux-2.6.0-test1/include/asm-sparc64/spinlock.h   2003-06-26 22:07:26.000000000 -0700
++++ 25/include/asm-sparc64/spinlock.h  2003-07-19 17:06:40.000000000 -0700
+@@ -30,15 +30,23 @@
+ #ifndef CONFIG_DEBUG_SPINLOCK
+-typedef unsigned char spinlock_t;
+-#define SPIN_LOCK_UNLOCKED    0
++typedef struct {
++      unsigned char lock;
++      unsigned int  index;
++} spinlock_t;
+-#define spin_lock_init(lock)  (*((unsigned char *)(lock)) = 0)
+-#define spin_is_locked(lock)  (*((volatile unsigned char *)(lock)) != 0)
++#ifdef CONFIG_LOCKMETER
++#define SPIN_LOCK_UNLOCKED    (spinlock_t) {0, 0}
++#else
++#define SPIN_LOCK_UNLOCKED    (spinlock_t) { 0 }
++#endif
+-#define spin_unlock_wait(lock)        \
++#define spin_lock_init(__lock)        do { *(__lock) = SPIN_LOCK_UNLOCKED; } while(0)
++#define spin_is_locked(__lock)        (*((volatile unsigned char *)(&((__lock)->lock))) != 0)
++
++#define spin_unlock_wait(__lock)      \
+ do {  membar("#LoadLoad");    \
+-} while(*((volatile unsigned char *)lock))
++} while(*((volatile unsigned char *)(&(((spinlock_t *)__lock)->lock))))
+ static __inline__ void _raw_spin_lock(spinlock_t *lock)
+ {
+@@ -109,8 +117,20 @@ extern int _spin_trylock (spinlock_t *lo
+ #ifndef CONFIG_DEBUG_SPINLOCK
+-typedef unsigned int rwlock_t;
+-#define RW_LOCK_UNLOCKED      0
++#ifdef CONFIG_LOCKMETER
++typedef struct {
++      unsigned int lock;
++      unsigned int index;
++      unsigned int cpu;
++} rwlock_t;
++#define RW_LOCK_UNLOCKED       (rwlock_t) { 0, 0, 0xff }
++#else
++typedef struct {
++      unsigned int lock;
++} rwlock_t;
++#define RW_LOCK_UNLOCKED        (rwlock_t) { 0 }
++#endif
++
+ #define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
+ #define rwlock_is_locked(x) (*(x) != RW_LOCK_UNLOCKED)
+--- linux-2.6.0-test1/include/asm-sparc/pgalloc.h      2003-06-14 12:17:57.000000000 -0700
++++ 25/include/asm-sparc/pgalloc.h     2003-07-19 17:07:16.000000000 -0700
+@@ -38,15 +38,24 @@ BTFIXUPDEF_CALL(void, free_pgd_fast, pgd
+ BTFIXUPDEF_CALL(void, pgd_set, pgd_t *, pmd_t *)
+ #define pgd_set(pgdp,pmdp) BTFIXUP_CALL(pgd_set)(pgdp,pmdp)
+-#define pgd_populate(MM, PGD, PMD)      pgd_set(PGD, PMD)
++#define pgd_populate(MM, PGD, PMD)      pgd_set(PGD, page_address(PMD))
+-BTFIXUPDEF_CALL(pmd_t *, pmd_alloc_one, struct mm_struct *, unsigned long)
+-#define pmd_alloc_one(mm, address)    BTFIXUP_CALL(pmd_alloc_one)(mm, address)
++BTFIXUPDEF_CALL(pmd_t *, __pmd_alloc_one, struct mm_struct *, unsigned long)
++#define pmd_alloc_one_kernel(mm, address) BTFIXUP_CALL(__pmd_alloc_one)(mm, address)
++
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      if (pmd)
++              return virt_to_page(pmd);
++      else
++              return NULL;
++}
+ BTFIXUPDEF_CALL(void, free_pmd_fast, pmd_t *)
+ #define free_pmd_fast(pmd)    BTFIXUP_CALL(free_pmd_fast)(pmd)
+-#define pmd_free(pmd)           free_pmd_fast(pmd)
++#define pmd_free(pmd)           free_pmd_fast(page_address(pmd))
+ #define __pmd_free_tlb(tlb, pmd) pmd_free(pmd)
+ BTFIXUPDEF_CALL(void, pmd_populate, pmd_t *, struct page *)
+--- linux-2.6.0-test1/include/asm-sparc/pgtable.h      2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-sparc/pgtable.h     2003-07-19 17:07:16.000000000 -0700
+@@ -202,10 +202,11 @@ extern unsigned long empty_zero_page;
+ /*
+  */
+ BTFIXUPDEF_CALL_CONST(struct page *, pmd_page, pmd_t)
+-BTFIXUPDEF_CALL_CONST(unsigned long, pgd_page, pgd_t)
++BTFIXUPDEF_CALL_CONST(unsigned long, __pgd_page, pgd_t)
+ #define pmd_page(pmd) BTFIXUP_CALL(pmd_page)(pmd)
+-#define pgd_page(pgd) BTFIXUP_CALL(pgd_page)(pgd)
++#define __pgd_page(pgd) BTFIXUP_CALL(__pgd_page)(pgd)
++#define pgd_page(pgd) virt_to_page(__pgd_page(pgd))
+ BTFIXUPDEF_SETHI(none_mask)
+ BTFIXUPDEF_CALL_CONST(int, pte_present, pte_t)
+@@ -352,6 +353,11 @@ extern __inline__ pte_t pte_modify(pte_t
+ /* Find an entry in the second-level page table.. */
+ BTFIXUPDEF_CALL(pmd_t *, pmd_offset, pgd_t *, unsigned long)
+ #define pmd_offset(dir,addr) BTFIXUP_CALL(pmd_offset)(dir,addr)
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
+ /* Find an entry in the third-level page table.. */ 
+ BTFIXUPDEF_CALL(pte_t *, pte_offset_kernel, pmd_t *, unsigned long)
+--- linux-2.6.0-test1/include/asm-sparc/posix_types.h  2003-06-14 12:18:06.000000000 -0700
++++ 25/include/asm-sparc/posix_types.h 2003-07-19 17:06:39.000000000 -0700
+@@ -17,7 +17,9 @@ typedef int                    __kernel_
+ typedef unsigned short         __kernel_ipc_pid_t;
+ typedef unsigned short         __kernel_uid_t;
+ typedef unsigned short         __kernel_gid_t;
+-typedef unsigned short         __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long          __kernel_ino_t;
+ typedef unsigned short         __kernel_mode_t;
+ typedef unsigned short         __kernel_umode_t;
+--- linux-2.6.0-test1/include/asm-sparc/smp.h  2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-sparc/smp.h 2003-07-19 17:04:07.000000000 -0700
+@@ -8,6 +8,7 @@
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <asm/head.h>
+ #include <asm/btfixup.h>
+--- linux-2.6.0-test1/include/asm-um/pgalloc.h 2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-um/pgalloc.h        2003-07-19 17:07:16.000000000 -0700
+@@ -42,7 +42,8 @@ static inline void pte_free(struct page 
+  * inside the pgd, so has no extra memory associated with it.
+  */
+-#define pmd_alloc_one(mm, addr)               ({ BUG(); ((pmd_t *)2); })
++#define pmd_alloc_one(mm, addr)               ({ BUG(); ((struct page *)2); })
++#define pmd_alloc_one_kernel(mm, addr)        ({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(x)                   do { } while (0)
+ #define __pmd_free_tlb(tlb,x)         do { } while (0)
+ #define pgd_populate(mm, pmd, pte)    BUG()
+--- linux-2.6.0-test1/include/asm-um/pgtable.h 2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-um/pgtable.h        2003-07-19 17:07:16.000000000 -0700
+@@ -374,6 +374,12 @@ static inline pmd_t * pmd_offset(pgd_t *
+       return (pmd_t *) dir;
+ }
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pgd, addr)                          do { } while (0)
++#define pmd_unmap_nested(pgd, addr)                   do { } while (0)
++
+ /* Find an entry in the third-level page table.. */ 
+ #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+ #define pte_offset_kernel(dir, address) \
+--- linux-2.6.0-test1/include/asm-um/smp.h     2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-um/smp.h    2003-07-19 17:04:07.000000000 -0700
+@@ -1,13 +1,14 @@
+ #ifndef __UM_SMP_H
+ #define __UM_SMP_H
+-extern unsigned long cpu_online_map;
+-
+ #ifdef CONFIG_SMP
+ #include "linux/config.h"
+ #include "linux/bitops.h"
+ #include "asm/current.h"
++#include "linux/cpumask.h"
++
++extern cpumask_t cpu_online_map;
+ #define smp_processor_id() (current->thread_info->cpu)
+ #define cpu_logical_map(n) (n)
+@@ -16,16 +17,11 @@ extern unsigned long cpu_online_map;
+ extern int hard_smp_processor_id(void);
+ #define NO_PROC_ID -1
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ extern int ncpus;
+ #define cpu_possible(cpu) (cpu < ncpus)
+-extern inline unsigned int num_online_cpus(void)
+-{
+-      return(hweight32(cpu_online_map));
+-}
+-
+ extern inline void smp_cpus_done(unsigned int maxcpus)
+ {
+ }
+--- linux-2.6.0-test1/include/asm-v850/anna.h  2003-06-14 12:18:06.000000000 -0700
++++ 25/include/asm-v850/anna.h 2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/anna.h -- Anna V850E2 evaluation cpu chip/board
+  *
+- *  Copyright (C) 2001,2002  NEC Corporation
+- *  Copyright (C) 2001,2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -14,8 +14,9 @@
+ #ifndef __V850_ANNA_H__
+ #define __V850_ANNA_H__
++#include <asm/v850e2.h>               /* Based on V850E2 core.  */
++
+-#define CPU_ARCH      "v850e2"
+ #define CPU_MODEL     "v850e2/anna"
+ #define CPU_MODEL_LONG        "NEC V850E2/Anna"
+ #define PLATFORM      "anna"
+@@ -48,30 +49,6 @@
+ /* Anna specific control registers.  */
+-#define ANNA_CSC_ADDR(n)              (0xFFFFF060 + (n) * 2)
+-#define ANNA_CSC(n)                   (*(volatile u16 *)ANNA_CSC_ADDR(n))
+-#define ANNA_BPC_ADDR                 0xFFFFF064
+-#define ANNA_BPC                      (*(volatile u16 *)ANNA_BPC_ADDR)
+-#define ANNA_BSC_ADDR                 0xFFFFF066
+-#define ANNA_BSC                      (*(volatile u16 *)ANNA_BSC_ADDR)
+-#define ANNA_BEC_ADDR                 0xFFFFF068
+-#define ANNA_BEC                      (*(volatile u16 *)ANNA_BEC_ADDR)
+-#define ANNA_BHC_ADDR                 0xFFFFF06A
+-#define ANNA_BHC                      (*(volatile u16 *)ANNA_BHC_ADDR)
+-#define ANNA_BCT_ADDR(n)              (0xFFFFF480 + (n) * 2)
+-#define ANNA_BCT(n)                   (*(volatile u16 *)ANNA_BCT_ADDR(n))
+-#define ANNA_DWC_ADDR(n)              (0xFFFFF484 + (n) * 2)
+-#define ANNA_DWC(n)                   (*(volatile u16 *)ANNA_DWC_ADDR(n))
+-#define ANNA_BCC_ADDR                 0xFFFFF488
+-#define ANNA_BCC                      (*(volatile u16 *)ANNA_BCC_ADDR)
+-#define ANNA_ASC_ADDR                 0xFFFFF48A
+-#define ANNA_ASC                      (*(volatile u16 *)ANNA_ASC_ADDR)
+-#define ANNA_LBS_ADDR                 0xFFFFF48E
+-#define ANNA_LBS                      (*(volatile u16 *)ANNA_LBS_ADDR)
+-#define ANNA_SCR3_ADDR                        0xFFFFF4AC
+-#define ANNA_SCR3                     (*(volatile u16 *)ANNA_SCR3_ADDR)
+-#define ANNA_RFS3_ADDR                        0xFFFFF4AE
+-#define ANNA_RFS3                     (*(volatile u16 *)ANNA_RFS3_ADDR)
+ #define ANNA_ILBEN_ADDR                       0xFFFFF7F2
+ #define ANNA_ILBEN                    (*(volatile u16 *)ANNA_ILBEN_ADDR)
+@@ -85,9 +62,6 @@
+ #define ANNA_PORT_PM(n)                       (*(volatile u8 *)ANNA_PORT_PM_ADDR(n))
+-/* NB85E-style interrupt system.  */
+-#include <asm/nb85e_intc.h>
+-
+ /* Hardware-specific interrupt numbers (in the kernel IRQ namespace).  */
+ #define IRQ_INTP(n)   (n)     /* Pnnn (pin) interrupts 0-15 */
+ #define IRQ_INTP_NUM  16
+@@ -116,12 +90,15 @@ extern void anna_init_irqs (void);
+ /* Anna UART details (basically the same as the V850E/MA1, but 2 channels).  */
+-#define NB85E_UART_NUM_CHANNELS               2
+-#define NB85E_UART_BASE_FREQ          (SYS_CLOCK_FREQ / 2)
+-#define NB85E_UART_CHIP_NAME          "V850E2/NA85E2A"
++#define V850E_UART_NUM_CHANNELS               2
++#define V850E_UART_BASE_FREQ          (SYS_CLOCK_FREQ / 2)
++#define V850E_UART_CHIP_NAME          "V850E2/NA85E2A"
++
++/* This is the UART channel that's actually connected on the board.  */
++#define V850E_UART_CONSOLE_CHANNEL    1
+ /* This is a function that gets called before configuring the UART.  */
+-#define NB85E_UART_PRE_CONFIGURE      anna_uart_pre_configure
++#define V850E_UART_PRE_CONFIGURE      anna_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void anna_uart_pre_configure (unsigned chan,
+                                    unsigned cflags, unsigned baud);
+@@ -130,9 +107,9 @@ extern void anna_uart_pre_configure (uns
+ /* This board supports RTS/CTS for the on-chip UART, but only for channel 1. */
+ /* CTS for UART channel 1 is pin P37 (bit 7 of port 3).  */
+-#define NB85E_UART_CTS(chan)  ((chan) == 1 ? !(ANNA_PORT_IO(3) & 0x80) : 1)
++#define V850E_UART_CTS(chan)  ((chan) == 1 ? !(ANNA_PORT_IO(3) & 0x80) : 1)
+ /* RTS for UART channel 1 is pin P07 (bit 7 of port 0).  */
+-#define NB85E_UART_SET_RTS(chan, val)                                       \
++#define V850E_UART_SET_RTS(chan, val)                                       \
+    do {                                                                             \
+          if (chan == 1) {                                                   \
+                  unsigned old = ANNA_PORT_IO(0);                            \
+@@ -145,16 +122,16 @@ extern void anna_uart_pre_configure (uns
+ /* Timer C details.  */
+-#define NB85E_TIMER_C_BASE_ADDR               0xFFFFF600
++#define V850E_TIMER_C_BASE_ADDR               0xFFFFF600
+ /* Timer D details (the Anna actually has 5 of these; should change later). */
+-#define NB85E_TIMER_D_BASE_ADDR               0xFFFFF540
+-#define NB85E_TIMER_D_TMD_BASE_ADDR   (NB85E_TIMER_D_BASE_ADDR + 0x0)
+-#define NB85E_TIMER_D_CMD_BASE_ADDR   (NB85E_TIMER_D_BASE_ADDR + 0x2)
+-#define NB85E_TIMER_D_TMCD_BASE_ADDR  (NB85E_TIMER_D_BASE_ADDR + 0x4)
++#define V850E_TIMER_D_BASE_ADDR               0xFFFFF540
++#define V850E_TIMER_D_TMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_CMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x2)
++#define V850E_TIMER_D_TMCD_BASE_ADDR  (V850E_TIMER_D_BASE_ADDR + 0x4)
+-#define NB85E_TIMER_D_BASE_FREQ               SYS_CLOCK_FREQ
+-#define NB85E_TIMER_D_TMCD_CS_MIN     1 /* min 2^1 divider */
++#define V850E_TIMER_D_BASE_FREQ               SYS_CLOCK_FREQ
++#define V850E_TIMER_D_TMCD_CS_MIN     1 /* min 2^1 divider */
+ /* For <asm/param.h> */
+--- linux-2.6.0-test1/include/asm-v850/as85ep1.h       2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-v850/as85ep1.h      2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/as85ep1.h -- AS85EP1 evaluation CPU chip/board
+  *
+- *  Copyright (C) 2001,2002  NEC Corporation
+- *  Copyright (C) 2001,2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -14,8 +14,9 @@
+ #ifndef __V850_AS85EP1_H__
+ #define __V850_AS85EP1_H__
++#include <asm/v850e.h>
++
+-#define CPU_ARCH      "v850e"
+ #define CPU_MODEL     "as85ep1"
+ #define CPU_MODEL_LONG        "NEC V850E/AS85EP1"
+ #define PLATFORM      "AS85EP1"
+@@ -86,9 +87,6 @@
+ #define AS85EP1_PORT_PMC(n)   (*(volatile u8 *)AS85EP1_PORT_PMC_ADDR(n))
+-/* NB85E-style interrupt system.  */
+-#include <asm/nb85e_intc.h>
+-
+ /* Hardware-specific interrupt numbers (in the kernel IRQ namespace).  */
+ #define IRQ_INTCCC(n) (0x0C + (n))
+ #define IRQ_INTCCC_NUM        8
+@@ -110,12 +108,12 @@ extern void as85ep1_init_irqs (void);
+ /* AS85EP1 UART details (basically the same as the V850E/MA1, but 2 channels).  */
+-#define NB85E_UART_NUM_CHANNELS               2
+-#define NB85E_UART_BASE_FREQ          (SYS_CLOCK_FREQ / 4)
+-#define NB85E_UART_CHIP_NAME          "V850E/NA85E"
++#define V850E_UART_NUM_CHANNELS               2
++#define V850E_UART_BASE_FREQ          (SYS_CLOCK_FREQ / 4)
++#define V850E_UART_CHIP_NAME          "V850E/NA85E"
+ /* This is a function that gets called before configuring the UART.  */
+-#define NB85E_UART_PRE_CONFIGURE      as85ep1_uart_pre_configure
++#define V850E_UART_PRE_CONFIGURE      as85ep1_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void as85ep1_uart_pre_configure (unsigned chan,
+                                       unsigned cflags, unsigned baud);
+@@ -124,9 +122,9 @@ extern void as85ep1_uart_pre_configure (
+ /* This board supports RTS/CTS for the on-chip UART, but only for channel 1. */
+ /* CTS for UART channel 1 is pin P54 (bit 4 of port 5).  */
+-#define NB85E_UART_CTS(chan)   ((chan) == 1 ? !(AS85EP1_PORT_IO(5) & 0x10) : 1)
++#define V850E_UART_CTS(chan)   ((chan) == 1 ? !(AS85EP1_PORT_IO(5) & 0x10) : 1)
+ /* RTS for UART channel 1 is pin P53 (bit 3 of port 5).  */
+-#define NB85E_UART_SET_RTS(chan, val)                                       \
++#define V850E_UART_SET_RTS(chan, val)                                       \
+    do {                                                                             \
+          if (chan == 1) {                                                   \
+                  unsigned old = AS85EP1_PORT_IO(5);                         \
+@@ -139,16 +137,16 @@ extern void as85ep1_uart_pre_configure (
+ /* Timer C details.  */
+-#define NB85E_TIMER_C_BASE_ADDR               0xFFFFF600
++#define V850E_TIMER_C_BASE_ADDR               0xFFFFF600
+ /* Timer D details (the AS85EP1 actually has 5 of these; should change later). */
+-#define NB85E_TIMER_D_BASE_ADDR               0xFFFFF540
+-#define NB85E_TIMER_D_TMD_BASE_ADDR   (NB85E_TIMER_D_BASE_ADDR + 0x0)
+-#define NB85E_TIMER_D_CMD_BASE_ADDR   (NB85E_TIMER_D_BASE_ADDR + 0x2)
+-#define NB85E_TIMER_D_TMCD_BASE_ADDR  (NB85E_TIMER_D_BASE_ADDR + 0x4)
++#define V850E_TIMER_D_BASE_ADDR               0xFFFFF540
++#define V850E_TIMER_D_TMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_CMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x2)
++#define V850E_TIMER_D_TMCD_BASE_ADDR  (V850E_TIMER_D_BASE_ADDR + 0x4)
+-#define NB85E_TIMER_D_BASE_FREQ               SYS_CLOCK_FREQ
+-#define NB85E_TIMER_D_TMCD_CS_MIN     2 /* min 2^2 divider */
++#define V850E_TIMER_D_BASE_FREQ               SYS_CLOCK_FREQ
++#define V850E_TIMER_D_TMCD_CS_MIN     2 /* min 2^2 divider */
+ /* For <asm/param.h> */
+--- linux-2.6.0-test1/include/asm-v850/asm.h   2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-v850/asm.h  2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/asm.h -- Macros for writing assembly code
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+--- linux-2.6.0-test1/include/asm-v850/cacheflush.h    2003-06-14 12:18:07.000000000 -0700
++++ 25/include/asm-v850/cacheflush.h   2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/cacheflush.h
+  *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -21,21 +21,40 @@
+ #include <asm/machdep.h>
+-#ifndef flush_cache_all
+-/* If there's no flush_cache_all macro defined by <asm/machdep.h>, then
+-   this processor has no cache, so just define these as nops.  */
+-
++/* The following are all used by the kernel in ways that only affect
++   systems with MMUs, so we don't need them.  */
+ #define flush_cache_all()                     ((void)0)
+ #define flush_cache_mm(mm)                    ((void)0)
+ #define flush_cache_range(vma, start, end)    ((void)0)
+ #define flush_cache_page(vma, vmaddr)         ((void)0)
+ #define flush_dcache_page(page)                       ((void)0)
++
++#ifdef CONFIG_NO_CACHE
++
++/* Some systems have no cache at all, in which case we don't need these
++   either.  */
+ #define flush_icache()                                ((void)0)
+ #define flush_icache_range(start, end)                ((void)0)
+ #define flush_icache_page(vma,pg)             ((void)0)
+ #define flush_icache_user_range(vma,pg,adr,len)       ((void)0)
+ #define flush_cache_sigtramp(vaddr)           ((void)0)
+-#endif /* !flush_cache_all */
++#else /* !CONFIG_NO_CACHE */
++
++struct page;
++struct mm_struct;
++struct vm_area_struct;
++
++/* Otherwise, somebody had better define them.  */
++extern void flush_icache (void);
++extern void flush_icache_range (unsigned long start, unsigned long end);
++extern void flush_icache_page (struct vm_area_struct *vma, struct page *page);
++extern void flush_icache_user_range (struct vm_area_struct *vma,
++                                   struct page *page,
++                                   unsigned long adr, int len);
++extern void flush_cache_sigtramp (unsigned long addr);
++
++#endif /* CONFIG_NO_CACHE */
++
+ #endif /* __V850_CACHEFLUSH_H__ */
+--- linux-2.6.0-test1/include/asm-v850/entry.h 2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-v850/entry.h        2003-07-19 17:03:51.000000000 -0700
+@@ -65,10 +65,10 @@
+ #define RESET_GUARD_ACTIVE    0xFAB4BEEF
+ #endif /* CONFIG_RESET_GUARD */
+-#ifdef CONFIG_V850E_MA1_HIGHRES_TIMER
++#ifdef CONFIG_V850E_HIGHRES_TIMER
+ #define HIGHRES_TIMER_SLOW_TICKS_ADDR (KERNEL_VAR_SPACE_ADDR + 32)
+ #define HIGHRES_TIMER_SLOW_TICKS     KERNEL_VAR (HIGHRES_TIMER_SLOW_TICKS_ADDR)
+-#endif /* CONFIG_V850E_MA1_HIGHRES_TIMER */
++#endif /* CONFIG_V850E_HIGHRES_TIMER */
+ #ifndef __ASSEMBLY__
+--- linux-2.6.0-test1/include/asm-v850/fpga85e2c.h     2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-v850/fpga85e2c.h    2003-07-19 17:03:51.000000000 -0700
+@@ -2,8 +2,8 @@
+  * include/asm-v850/fpga85e2c.h -- Machine-dependent defs for
+  *    FPGA implementation of V850E2/NA85E2C
+  *
+- *  Copyright (C) 2002  NEC Corporation
+- *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -15,11 +15,10 @@
+ #ifndef __V850_FPGA85E2C_H__
+ #define __V850_FPGA85E2C_H__
+-
++#include <asm/v850e2.h>
+ #include <asm/clinkage.h>
+-#define CPU_ARCH      "v850e2"
+ #define CPU_MODEL     "v850e2/fpga85e2c"
+ #define CPU_MODEL_LONG        "NEC V850E2/NA85E2C"
+ #define PLATFORM      "fpga85e2c"
+@@ -42,27 +41,6 @@
+ #define CSDEV_ADDR(n)         (0xFFE80110 + 2*(n))
+ #define CSDEV(n)              (*(volatile unsigned char *)CSDEV_ADDR (n))
+-/* The BSC register controls bus-sizing.  Each memory area CSn uses a pair
+-   of bits N*2 and N*2+1, where 00 means an 8-bit bus size, 01 16-bit, and
+-   10 32-bit.  */
+-#define BSC_ADDR              0xFFFFF066
+-#define BSC                   (*(volatile unsigned short *)BSC_ADDR)
+-
+-#define DWC_ADDR(n)           (0xFFFFF484 + 2*(n))
+-#define DWC(n)                        (*(volatile unsigned short *)DWC_ADDR (n))
+-
+-#define ASC_ADDR              0xFFFFF48A
+-#define ASC                   (*(volatile unsigned short *)ASC_ADDR)
+-
+-#define BTSC_ADDR             0xFFFFF070
+-#define BTSC                  (*(volatile unsigned short *)BTSC_ADDR)
+-
+-#define BHC_ADDR              0xFFFFF06A
+-#define BHC                   (*(volatile unsigned short *)BHC_ADDR)
+-
+-
+-/* NB85E-style interrupt system.  */
+-#include <asm/nb85e_intc.h>
+ /* Timer interrupts 0-3, interrupt at intervals from CLK/4096 to CLK/16384.  */
+ #define IRQ_RPU(n)            (60 + (n))
+--- linux-2.6.0-test1/include/asm-v850/highres_timer.h 2003-06-14 12:18:34.000000000 -0700
++++ 25/include/asm-v850/highres_timer.h        2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/highres_timer.h -- High resolution timing routines
+  *
+- *  Copyright (C) 2001  NEC Corporation
+- *  Copyright (C) 2001  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -25,7 +25,7 @@
+    counter overflows).  */
+ #define HIGHRES_TIMER_SLOW_TICK_RATE  25
+-/* Which timer in the nb85e `Timer D' we use.  */
++/* Which timer in the V850E `Timer D' we use.  */
+ #define HIGHRES_TIMER_TIMER_D_UNIT    3
+--- linux-2.6.0-test1/include/asm-v850/ma1.h   2003-06-14 12:18:24.000000000 -0700
++++ 25/include/asm-v850/ma1.h  2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/ma1.h -- V850E/MA1 cpu chip
+  *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -40,12 +40,11 @@
+ #define IRQ_INTST(n)  (0x27 + (n)*4) /* UART 0-2 transmission completion */
+ #define IRQ_INTST_NUM 3
+-/* For <asm/irq.h> */
+ #define NUM_CPU_IRQS  0x30
+ /* The MA1 has a UART with 3 channels.  */
+-#define NB85E_UART_NUM_CHANNELS       3
++#define V850E_UART_NUM_CHANNELS       3
+ #endif /* __V850_MA1_H__ */
+--- linux-2.6.0-test1/include/asm-v850/machdep.h       2003-06-14 12:18:07.000000000 -0700
++++ 25/include/asm-v850/machdep.h      2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/machdep.h -- Machine-dependent definitions
+  *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -20,6 +20,9 @@
+ #ifdef CONFIG_V850E_MA1
+ #include <asm/ma1.h>
+ #endif
++#ifdef CONFIG_V850E_ME2
++#include <asm/me2.h>
++#endif
+ #ifdef CONFIG_V850E_TEG
+ #include <asm/teg.h>
+ #endif
+@@ -36,6 +39,9 @@
+ #ifdef CONFIG_RTE_CB_MA1
+ #include <asm/rte_ma1_cb.h>
+ #endif
++#ifdef CONFIG_RTE_CB_ME2
++#include <asm/rte_me2_cb.h>
++#endif
+ #ifdef CONFIG_RTE_CB_NB85E
+ #include <asm/rte_nb85e_cb.h>
+ #endif
+@@ -45,6 +51,9 @@
+ #ifdef CONFIG_V850E2_SIM85E2C
+ #include <asm/sim85e2c.h>
+ #endif
++#ifdef CONFIG_V850E2_SIM85E2S
++#include <asm/sim85e2s.h>
++#endif
+ #ifdef CONFIG_V850E2_FPGA85E2C
+ #include <asm/fpga85e2c.h>
+ #endif
+--- linux-2.6.0-test1/include/asm-v850/ma.h    2003-06-14 12:17:58.000000000 -0700
++++ 25/include/asm-v850/ma.h   2003-07-19 17:03:51.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+  * include/asm-v850/ma.h -- V850E/MA series of cpu chips
+  *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+  * Public License.  See the file COPYING in the main directory of this
+@@ -14,9 +14,8 @@
+ #ifndef __V850_MA_H__
+ #define __V850_MA_H__
+-
+-/* The MA series uses the NB85E cpu core.  */
+-#include <asm/nb85e.h>
++/* The MA series uses the V850E cpu core.  */
++#include <asm/v850e.h>
+ /* For <asm/entry.h> */
+@@ -28,10 +27,10 @@
+ /* MA series UART details.  */
+-#define NB85E_UART_BASE_FREQ          CPU_CLOCK_FREQ
++#define V850E_UART_BASE_FREQ          CPU_CLOCK_FREQ
+ /* This is a function that gets called before configuring the UART.  */
+-#define NB85E_UART_PRE_CONFIGURE      ma_uart_pre_configure
++#define V850E_UART_PRE_CONFIGURE      ma_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void ma_uart_pre_configure (unsigned chan,
+                                  unsigned cflags, unsigned baud);
+@@ -39,16 +38,16 @@ extern void ma_uart_pre_configure (unsig
+ /* MA series timer C details.  */
+-#define NB85E_TIMER_C_BASE_ADDR               0xFFFFF600
++#define V850E_TIMER_C_BASE_ADDR               0xFFFFF600
+ /* MA series timer D details.  */
+-#define NB85E_TIMER_D_BASE_ADDR               0xFFFFF540
+-#define NB85E_TIMER_D_TMD_BASE_ADDR   (NB85E_TIMER_D_BASE_ADDR + 0x0)
+-#define NB85E_TIMER_D_CMD_BASE_ADDR   (NB85E_TIMER_D_BASE_ADDR + 0x2)
+-#define NB85E_TIMER_D_TMCD_BASE_ADDR  (NB85E_TIMER_D_BASE_ADDR + 0x4)
++#define V850E_TIMER_D_BASE_ADDR               0xFFFFF540
++#define V850E_TIMER_D_TMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_CMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x2)
++#define V850E_TIMER_D_TMCD_BASE_ADDR  (V850E_TIMER_D_BASE_ADDR + 0x4)
+-#define NB85E_TIMER_D_BASE_FREQ               CPU_CLOCK_FREQ
++#define V850E_TIMER_D_BASE_FREQ               CPU_CLOCK_FREQ
+ /* Port 0 */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/me2.h  2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,182 @@
++/*
++ * include/asm-v850/me2.h -- V850E/ME2 cpu chip
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_ME2_H__
++#define __V850_ME2_H__
++
++#include <asm/v850e.h>
++#include <asm/v850e_cache.h>
++
++
++#define CPU_MODEL     "v850e/me2"
++#define CPU_MODEL_LONG        "NEC V850E/ME2"
++
++
++/* Hardware-specific interrupt numbers (in the kernel IRQ namespace).  */
++#define IRQ_INTP(n)       (n) /* Pnnn (pin) interrupts */
++#define IRQ_INTP_NUM      31
++#define IRQ_INTCMD(n)     (0x31 + (n)) /* interval timer interrupts 0-3 */
++#define IRQ_INTCMD_NUM    4
++#define IRQ_INTDMA(n)     (0x41 + (n)) /* DMA interrupts 0-3 */
++#define IRQ_INTDMA_NUM    4
++#define IRQ_INTUBTIRE(n)  (0x49 + (n)*5)/* UARTB 0-1 reception error */
++#define IRQ_INTUBTIRE_NUM 2
++#define IRQ_INTUBTIR(n)   (0x4a + (n)*5) /* UARTB 0-1 reception complete */
++#define IRQ_INTUBTIR_NUM  2
++#define IRQ_INTUBTIT(n)   (0x4b + (n)*5) /* UARTB 0-1 transmission complete */
++#define IRQ_INTUBTIT_NUM  2
++#define IRQ_INTUBTIF(n)   (0x4c + (n)*5) /* UARTB 0-1 FIFO trans. complete */
++#define IRQ_INTUBTIF_NUM  2
++#define IRQ_INTUBTITO(n)  (0x4d + (n)*5) /* UARTB 0-1 reception timeout */
++#define IRQ_INTUBTITO_NUM 2
++
++/* For <asm/irq.h> */
++#define NUM_CPU_IRQS          0x59 /* V850E/ME2 */
++
++
++/* For <asm/entry.h> */
++/* We use on-chip RAM, for a few miscellaneous variables that must be
++   accessible using a load instruction relative to R0.  */
++#define R0_RAM_ADDR                   0xFFFFB000 /* V850E/ME2 */
++
++
++/* V850E/ME2 UARTB details.*/
++#define V850E_UART_NUM_CHANNELS               2
++#define V850E_UARTB_BASE_FREQ         (CPU_CLOCK_FREQ / 4)
++
++/* This is a function that gets called before configuring the UART.  */
++#define V850E_UART_PRE_CONFIGURE      me2_uart_pre_configure
++#ifndef __ASSEMBLY__
++extern void me2_uart_pre_configure (unsigned chan,
++                                  unsigned cflags, unsigned baud);
++#endif /* __ASSEMBLY__ */
++
++
++/* V850E/ME2 timer C details.  */
++#define V850E_TIMER_C_BASE_ADDR               0xFFFFF600
++
++
++/* V850E/ME2 timer D details.  */
++#define V850E_TIMER_D_BASE_ADDR               0xFFFFF540
++#define V850E_TIMER_D_TMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_CMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x2)
++#define V850E_TIMER_D_TMCD_BASE_ADDR  (V850E_TIMER_D_BASE_ADDR + 0x4)
++
++#define V850E_TIMER_D_BASE_FREQ               (CPU_CLOCK_FREQ / 2)
++
++
++/* Select iRAM mode.  */
++#define ME2_IRAMM_ADDR                        0xFFFFF80A
++#define ME2_IRAMM                     (*(volatile u8*)ME2_IRAMM_ADDR)
++
++
++/* Interrupt edge-detection configuration.  INTF(n) and INTR(n) are only
++   valid for n == 1, 2, or 5.  */
++#define ME2_INTF_ADDR(n)              (0xFFFFFC00 + (n) * 0x2)
++#define ME2_INTF(n)                   (*(volatile u8*)ME2_INTF_ADDR(n))
++#define ME2_INTR_ADDR(n)              (0xFFFFFC20 + (n) * 0x2)
++#define ME2_INTR(n)                   (*(volatile u8*)ME2_INTR_ADDR(n))
++#define ME2_INTFAL_ADDR                       0xFFFFFC10
++#define ME2_INTFAL                    (*(volatile u8*)ME2_INTFAL_ADDR)
++#define ME2_INTRAL_ADDR                       0xFFFFFC30
++#define ME2_INTRAL                    (*(volatile u8*)ME2_INTRAL_ADDR)
++#define ME2_INTFDH_ADDR                       0xFFFFFC16
++#define ME2_INTFDH                    (*(volatile u16*)ME2_INTFDH_ADDR)
++#define ME2_INTRDH_ADDR                       0xFFFFFC36
++#define ME2_INTRDH                    (*(volatile u16*)ME2_INTRDH_ADDR)
++#define ME2_SESC_ADDR(n)              (0xFFFFF609 + (n) * 0x10)
++#define ME2_SESC(n)                   (*(volatile u8*)ME2_SESC_ADDR(n))
++#define ME2_SESA10_ADDR                       0xFFFFF5AD
++#define ME2_SESA10                    (*(volatile u8*)ME2_SESA10_ADDR)
++#define ME2_SESA11_ADDR                       0xFFFFF5DD
++#define ME2_SESA11                    (*(volatile u8*)ME2_SESA11_ADDR)
++
++
++/* Port 1 */
++/* Direct I/O.  Bits 0-3 are pins P10-P13.  */
++#define ME2_PORT1_IO_ADDR             0xFFFFF402
++#define ME2_PORT1_IO                  (*(volatile u8 *)ME2_PORT1_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT1_PM_ADDR             0xFFFFF422
++#define ME2_PORT1_PM                  (*(volatile u8 *)ME2_PORT1_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT1_PMC_ADDR            0xFFFFF442
++#define ME2_PORT1_PMC                 (*(volatile u8 *)ME2_PORT1_PMC_ADDR)
++/* Port function control (for serial interfaces, 0 = CSI30, 1 = UARTB0 ).  */
++#define ME2_PORT1_PFC_ADDR            0xFFFFF462
++#define ME2_PORT1_PFC                 (*(volatile u8 *)ME2_PORT1_PFC_ADDR)
++
++/* Port 2 */
++/* Direct I/O.  Bits 0-3 are pins P20-P25.  */
++#define ME2_PORT2_IO_ADDR             0xFFFFF404
++#define ME2_PORT2_IO                  (*(volatile u8 *)ME2_PORT2_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT2_PM_ADDR             0xFFFFF424
++#define ME2_PORT2_PM                  (*(volatile u8 *)ME2_PORT2_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT2_PMC_ADDR            0xFFFFF444
++#define ME2_PORT2_PMC                 (*(volatile u8 *)ME2_PORT2_PMC_ADDR)
++/* Port function control (for serial interfaces, 0 = INTP2x, 1 = UARTB1 ).  */
++#define ME2_PORT2_PFC_ADDR            0xFFFFF464
++#define ME2_PORT2_PFC                 (*(volatile u8 *)ME2_PORT2_PFC_ADDR)
++
++/* Port 5 */
++/* Direct I/O.  Bits 0-5 are pins P50-P55.  */
++#define ME2_PORT5_IO_ADDR             0xFFFFF40A
++#define ME2_PORT5_IO                  (*(volatile u8 *)ME2_PORT5_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT5_PM_ADDR             0xFFFFF42A
++#define ME2_PORT5_PM                  (*(volatile u8 *)ME2_PORT5_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT5_PMC_ADDR            0xFFFFF44A
++#define ME2_PORT5_PMC                 (*(volatile u8 *)ME2_PORT5_PMC_ADDR)
++/* Port function control ().  */
++#define ME2_PORT5_PFC_ADDR            0xFFFFF46A
++#define ME2_PORT5_PFC                 (*(volatile u8 *)ME2_PORT5_PFC_ADDR)
++
++/* Port 6 */
++/* Direct I/O.  Bits 5-7 are pins P65-P67.  */
++#define ME2_PORT6_IO_ADDR             0xFFFFF40C
++#define ME2_PORT6_IO                  (*(volatile u8 *)ME2_PORT6_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT6_PM_ADDR             0xFFFFF42C
++#define ME2_PORT6_PM                  (*(volatile u8 *)ME2_PORT6_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT6_PMC_ADDR            0xFFFFF44C
++#define ME2_PORT6_PMC                 (*(volatile u8 *)ME2_PORT6_PMC_ADDR)
++/* Port function control ().  */
++#define ME2_PORT6_PFC_ADDR            0xFFFFF46C
++#define ME2_PORT6_PFC                 (*(volatile u8 *)ME2_PORT6_PFC_ADDR)
++
++/* Port 7 */
++/* Direct I/O.  Bits 2-7 are pins P72-P77.  */
++#define ME2_PORT7_IO_ADDR             0xFFFFF40E
++#define ME2_PORT7_IO                  (*(volatile u8 *)ME2_PORT7_IO_ADDR)
++/* Port mode (for direct I/O, 0 = output, 1 = input).  */
++#define ME2_PORT7_PM_ADDR             0xFFFFF42E
++#define ME2_PORT7_PM                  (*(volatile u8 *)ME2_PORT7_PM_ADDR)
++/* Port mode control (0 = direct I/O mode, 1 = alternative I/O mode).  */
++#define ME2_PORT7_PMC_ADDR            0xFFFFF44E
++#define ME2_PORT7_PMC                 (*(volatile u8 *)ME2_PORT7_PMC_ADDR)
++/* Port function control ().  */
++#define ME2_PORT7_PFC_ADDR            0xFFFFF46E
++#define ME2_PORT7_PFC                 (*(volatile u8 *)ME2_PORT7_PFC_ADDR)
++
++
++#ifndef __ASSEMBLY__
++/* Initialize V850E/ME2 chip interrupts.  */
++extern void me2_init_irqs (void);
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_ME2_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_cache.h   2003-06-14 12:18:21.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,78 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_cache_cache.h -- Cache control for NB85E_CACHE212 and
+- *    NB85E_CACHE213 cache memories
+- *
+- *  Copyright (C) 2001,03  NEC Electronics Corporation
+- *  Copyright (C) 2001,03  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#ifndef __V850_NB85E_CACHE_H__
+-#define __V850_NB85E_CACHE_H__
+-
+-#include <asm/types.h>
+-
+-
+-/* Cache control registers.  */
+-#define NB85E_CACHE_BHC_ADDR  0xFFFFF06A
+-#define NB85E_CACHE_BHC               (*(volatile u16 *)NB85E_CACHE_BHC_ADDR)
+-#define NB85E_CACHE_ICC_ADDR  0xFFFFF070
+-#define NB85E_CACHE_ICC               (*(volatile u16 *)NB85E_CACHE_ICC_ADDR)
+-#define NB85E_CACHE_ISI_ADDR  0xFFFFF072
+-#define NB85E_CACHE_ISI               (*(volatile u16 *)NB85E_CACHE_ISI_ADDR)
+-#define NB85E_CACHE_DCC_ADDR  0xFFFFF078
+-#define NB85E_CACHE_DCC               (*(volatile u16 *)NB85E_CACHE_DCC_ADDR)
+-
+-/* Size of a cache line in bytes.  */
+-#define NB85E_CACHE_LINE_SIZE 16
+-
+-/* For <asm/cache.h> */
+-#define L1_CACHE_BYTES                                NB85E_CACHE_LINE_SIZE
+-
+-
+-#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
+-
+-/* Set caching params via the BHC and DCC registers.  */
+-void nb85e_cache_enable (u16 bhc, u16 dcc);
+-
+-struct page;
+-struct mm_struct;
+-struct vm_area_struct;
+-
+-extern void nb85e_cache_flush_all (void);
+-extern void nb85e_cache_flush_mm (struct mm_struct *mm);
+-extern void nb85e_cache_flush_range (struct mm_struct *mm,
+-                                   unsigned long start,
+-                                   unsigned long end);
+-extern void nb85e_cache_flush_page (struct vm_area_struct *vma,
+-                                  unsigned long page_addr);
+-extern void nb85e_cache_flush_dcache_page (struct page *page);
+-extern void nb85e_cache_flush_icache (void);
+-extern void nb85e_cache_flush_icache_range (unsigned long start,
+-                                          unsigned long end);
+-extern void nb85e_cache_flush_icache_page (struct vm_area_struct *vma,
+-                                         struct page *page);
+-extern void nb85e_cache_flush_icache_user_range (struct vm_area_struct *vma,
+-                                               struct page *page,
+-                                               unsigned long adr, int len);
+-extern void nb85e_cache_flush_sigtramp (unsigned long addr);
+-
+-#define flush_cache_all               nb85e_cache_flush_all
+-#define flush_cache_mm                nb85e_cache_flush_mm
+-#define flush_cache_range     nb85e_cache_flush_range
+-#define flush_cache_page      nb85e_cache_flush_page
+-#define flush_dcache_page     nb85e_cache_flush_dcache_page
+-#define flush_icache          nb85e_cache_flush_icache
+-#define flush_icache_range    nb85e_cache_flush_icache_range
+-#define flush_icache_page     nb85e_cache_flush_icache_page
+-#define flush_icache_user_range       nb85e_cache_flush_icache_user_range
+-#define flush_cache_sigtramp  nb85e_cache_flush_sigtramp
+-
+-#endif /* __KERNEL__ && !__ASSEMBLY__ */
+-
+-#endif /* __V850_NB85E_CACHE_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e.h 2003-06-14 12:18:21.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,21 +0,0 @@
+-/*
+- * include/asm-v850/nb85e.h -- NB85E cpu core
+- *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#ifndef __V850_NB85E_H__
+-#define __V850_NB85E_H__
+-
+-#include <asm/nb85e_intc.h>
+-
+-#define CPU_ARCH "v850e"
+-
+-#endif /* __V850_NB85E_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_intc.h    2003-06-14 12:18:29.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,133 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_intc.h -- NB85E cpu core interrupt controller (INTC)
+- *
+- *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+- *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#ifndef __V850_NB85E_INTC_H__
+-#define __V850_NB85E_INTC_H__
+-
+-
+-/* There are 4 16-bit `Interrupt Mask Registers' located contiguously
+-   starting from this base.  Each interrupt uses a single bit to
+-   indicated enabled/disabled status.  */
+-#define NB85E_INTC_IMR_BASE_ADDR  0xFFFFF100
+-#define NB85E_INTC_IMR_ADDR(irq)  (NB85E_INTC_IMR_BASE_ADDR + ((irq) >> 3))
+-#define NB85E_INTC_IMR_BIT(irq)         ((irq) & 0x7)
+-
+-/* Each maskable interrupt has a single-byte control register at this
+-   address.  */
+-#define NB85E_INTC_IC_BASE_ADDR         0xFFFFF110
+-#define NB85E_INTC_IC_ADDR(irq)         (NB85E_INTC_IC_BASE_ADDR + ((irq) << 1))
+-#define NB85E_INTC_IC(irq)      (*(volatile u8 *)NB85E_INTC_IC_ADDR(irq))
+-/* Encode priority PR for storing in an interrupt control register.  */
+-#define NB85E_INTC_IC_PR(pr)    (pr)
+-/* Interrupt disable bit in an interrupt control register.  */
+-#define NB85E_INTC_IC_MK_BIT    6
+-#define NB85E_INTC_IC_MK        (1 << NB85E_INTC_IC_MK_BIT)
+-/* Interrupt pending flag in an interrupt control register.  */
+-#define NB85E_INTC_IC_IF_BIT    7
+-#define NB85E_INTC_IC_IF        (1 << NB85E_INTC_IC_IF_BIT)
+-
+-/* The ISPR (In-service priority register) contains one bit for each interrupt
+-   priority level, which is set to one when that level is currently being
+-   serviced (and thus blocking any interrupts of equal or lesser level).  */
+-#define NB85E_INTC_ISPR_ADDR    0xFFFFF1FA
+-#define NB85E_INTC_ISPR                 (*(volatile u8 *)NB85E_INTC_ISPR_ADDR)
+-
+-
+-#ifndef __ASSEMBLY__
+-
+-/* Enable interrupt handling for interrupt IRQ.  */
+-static inline void nb85e_intc_enable_irq (unsigned irq)
+-{
+-      __asm__ __volatile__ ("clr1 %0, [%1]"
+-                            :: "r" (NB85E_INTC_IMR_BIT (irq)),
+-                               "r" (NB85E_INTC_IMR_ADDR (irq))
+-                            : "memory");
+-}
+-
+-/* Disable interrupt handling for interrupt IRQ.  Note that any
+-   interrupts received while disabled will be delivered once the
+-   interrupt is enabled again, unless they are explicitly cleared using
+-   `nb85e_intc_clear_pending_irq'.  */
+-static inline void nb85e_intc_disable_irq (unsigned irq)
+-{
+-      __asm__ __volatile__ ("set1 %0, [%1]"
+-                            :: "r" (NB85E_INTC_IMR_BIT (irq)),
+-                               "r" (NB85E_INTC_IMR_ADDR (irq))
+-                            : "memory");
+-}
+-
+-/* Return true if interrupt handling for interrupt IRQ is enabled.  */
+-static inline int nb85e_intc_irq_enabled (unsigned irq)
+-{
+-      int rval;
+-      __asm__ __volatile__ ("tst1 %1, [%2]; setf z, %0"
+-                            : "=r" (rval)
+-                            : "r" (NB85E_INTC_IMR_BIT (irq)),
+-                              "r" (NB85E_INTC_IMR_ADDR (irq)));
+-      return rval;
+-}
+-
+-/* Disable irqs from 0 until LIMIT.  LIMIT must be a multiple of 8.  */
+-static inline void _nb85e_intc_disable_irqs (unsigned limit)
+-{
+-      unsigned long addr;
+-      for (addr = NB85E_INTC_IMR_BASE_ADDR; limit >= 8; addr++, limit -= 8)
+-              *(char *)addr = 0xFF;
+-}
+-
+-/* Disable all irqs.  This is purposely a macro, because NUM_MACH_IRQS
+-   will be only be defined later.  */
+-#define nb85e_intc_disable_irqs()   _nb85e_intc_disable_irqs (NUM_MACH_IRQS)
+-
+-/* Clear any pending interrupts for IRQ.  */
+-static inline void nb85e_intc_clear_pending_irq (unsigned irq)
+-{
+-      __asm__ __volatile__ ("clr1 %0, 0[%1]"
+-                            :: "i" (NB85E_INTC_IC_IF_BIT),
+-                               "r" (NB85E_INTC_IC_ADDR (irq))
+-                            : "memory");
+-}
+-
+-/* Return true if interrupt IRQ is pending (but disabled).  */
+-static inline int nb85e_intc_irq_pending (unsigned irq)
+-{
+-      int rval;
+-      __asm__ __volatile__ ("tst1 %1, 0[%2]; setf nz, %0"
+-                            : "=r" (rval)
+-                            : "i" (NB85E_INTC_IC_IF_BIT),
+-                              "r" (NB85E_INTC_IC_ADDR (irq)));
+-      return rval;
+-}
+-
+-
+-struct nb85e_intc_irq_init {
+-      const char *name;       /* name of interrupt type */
+-
+-      /* Range of kernel irq numbers for this type:
+-         BASE, BASE+INTERVAL, ..., BASE+INTERVAL*NUM  */
+-      unsigned base, num, interval;
+-
+-      unsigned priority;      /* interrupt priority to assign */
+-};
+-struct hw_interrupt_type;     /* fwd decl */
+-
+-/* Initialize HW_IRQ_TYPES for INTC-controlled irqs described in array
+-   INITS (which is terminated by an entry with the name field == 0).  */
+-extern void nb85e_intc_init_irq_types (struct nb85e_intc_irq_init *inits,
+-                                     struct hw_interrupt_type *hw_irq_types);
+-
+-
+-#endif /* !__ASSEMBLY__ */
+-
+-
+-#endif /* __V850_NB85E_INTC_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_timer_c.h 2003-06-14 12:17:58.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,48 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_timer_c.h -- `Timer C' component often used
+- *    with the NB85E cpu core
+- *
+- *  Copyright (C) 2001  NEC Corporation
+- *  Copyright (C) 2001  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-/* NOTE: this include file currently contains only enough to allow us to
+-   use timer C as an interrupt pass-through.  */
+-
+-#ifndef __V850_NB85E_TIMER_C_H__
+-#define __V850_NB85E_TIMER_C_H__
+-
+-#include <asm/types.h>
+-#include <asm/machdep.h>      /* Pick up chip-specific defs.  */
+-
+-
+-/* Timer C (16-bit interval timers).  */
+-
+-/* Control register 0 for timer C.  */
+-#define NB85E_TIMER_C_TMCC0_ADDR(n) (NB85E_TIMER_C_BASE_ADDR + 0x6 + 0x10 *(n))
+-#define NB85E_TIMER_C_TMCC0(n)          (*(volatile u8 *)NB85E_TIMER_C_TMCC0_ADDR(n))
+-#define NB85E_TIMER_C_TMCC0_CAE         0x01 /* clock action enable */
+-#define NB85E_TIMER_C_TMCC0_CE          0x02 /* count enable */
+-/* ... */
+-
+-/* Control register 1 for timer C.  */
+-#define NB85E_TIMER_C_TMCC1_ADDR(n) (NB85E_TIMER_C_BASE_ADDR + 0x8 + 0x10 *(n))
+-#define NB85E_TIMER_C_TMCC1(n)          (*(volatile u8 *)NB85E_TIMER_C_TMCC1_ADDR(n))
+-#define NB85E_TIMER_C_TMCC1_CMS0  0x01 /* capture/compare mode select (ccc0) */
+-#define NB85E_TIMER_C_TMCC1_CMS1  0x02 /* capture/compare mode select (ccc1) */
+-/* ... */
+-
+-/* Interrupt edge-sensitivity control for timer C.  */
+-#define NB85E_TIMER_C_SESC_ADDR(n) (NB85E_TIMER_C_BASE_ADDR + 0x9 + 0x10 *(n))
+-#define NB85E_TIMER_C_SESC(n)   (*(volatile u8 *)NB85E_TIMER_C_SESC_ADDR(n))
+-
+-/* ...etc... */
+-
+-
+-#endif /* __V850_NB85E_TIMER_C_H__  */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_timer_d.h 2003-06-14 12:18:06.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,62 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_timer_d.h -- `Timer D' component often used
+- *    with the NB85E cpu core
+- *
+- *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+- *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#ifndef __V850_NB85E_TIMER_D_H__
+-#define __V850_NB85E_TIMER_D_H__
+-
+-#include <asm/types.h>
+-#include <asm/machdep.h>      /* Pick up chip-specific defs.  */
+-
+-
+-/* Timer D (16-bit interval timers).  */
+-
+-/* Count registers for timer D.  */
+-#define NB85E_TIMER_D_TMD_ADDR(n) (NB85E_TIMER_D_TMD_BASE_ADDR + 0x10 * (n))
+-#define NB85E_TIMER_D_TMD(n)    (*(volatile u16 *)NB85E_TIMER_D_TMD_ADDR(n))
+-
+-/* Count compare registers for timer D.  */
+-#define NB85E_TIMER_D_CMD_ADDR(n) (NB85E_TIMER_D_CMD_BASE_ADDR + 0x10 * (n))
+-#define NB85E_TIMER_D_CMD(n)    (*(volatile u16 *)NB85E_TIMER_D_CMD_ADDR(n))
+-
+-/* Control registers for timer D.  */
+-#define NB85E_TIMER_D_TMCD_ADDR(n) (NB85E_TIMER_D_TMCD_BASE_ADDR + 0x10 * (n))
+-#define NB85E_TIMER_D_TMCD(n)    (*(volatile u8 *)NB85E_TIMER_D_TMCD_ADDR(n))
+-/* Control bits for timer D.  */
+-#define NB85E_TIMER_D_TMCD_CE            0x2 /* count enable */
+-#define NB85E_TIMER_D_TMCD_CAE           0x1 /* clock action enable */
+-/* Clock divider setting (log2).  */
+-#define NB85E_TIMER_D_TMCD_CS(divlog2) (((divlog2) - NB85E_TIMER_D_TMCD_CS_MIN) << 4)
+-/* Minimum clock divider setting (log2).  */
+-#ifndef NB85E_TIMER_D_TMCD_CS_MIN /* Can be overridden by mach-specific hdrs */
+-#define NB85E_TIMER_D_TMCD_CS_MIN  2 /* Default is correct for the v850e/ma1 */
+-#endif
+-/* Maximum clock divider setting (log2).  */
+-#define NB85E_TIMER_D_TMCD_CS_MAX  (NB85E_TIMER_D_TMCD_CS_MIN + 7)
+-
+-/* Return the clock-divider (log2) of timer D unit N.  */
+-#define NB85E_TIMER_D_DIVLOG2(n) \
+-  (((NB85E_TIMER_D_TMCD(n) >> 4) & 0x7) + NB85E_TIMER_D_TMCD_CS_MIN)
+-
+-
+-#ifndef __ASSEMBLY__
+-
+-/* Start interval timer TIMER (0-3).  The timer will issue the
+-   corresponding INTCMD interrupt RATE times per second.  This function
+-   does not enable the interrupt.  */
+-extern void nb85e_timer_d_configure (unsigned timer, unsigned rate);
+-
+-#endif /* !__ASSEMBLY__ */
+-
+-
+-#endif /* __V850_NB85E_TIMER_D_H__  */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_uart.h    2003-06-14 12:18:50.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,144 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_uart.h -- On-chip UART often used with the
+- *    NB85E cpu core
+- *
+- *  Copyright (C) 2001,02  NEC Corporation
+- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-/* There's not actually a single UART implementation used by nb85e
+-   derivatives, but rather a series of implementations that are all
+-   `close' to one another.  This file attempts to capture some
+-   commonality between them.  */
+-
+-#ifndef __V850_NB85E_UART_H__
+-#define __V850_NB85E_UART_H__
+-
+-#include <asm/types.h>
+-#include <asm/machdep.h>      /* Pick up chip-specific defs.  */
+-
+-
+-/* The base address of the UART control registers for channel N.
+-   The default is the address used on the V850E/MA1.  */
+-#ifndef NB85E_UART_BASE_ADDR
+-#define NB85E_UART_BASE_ADDR(n)               (0xFFFFFA00 + 0x10 * (n))
+-#endif 
+-
+-/* Addresses of specific UART control registers for channel N.
+-   The defaults are the addresses used on the V850E/MA1; if a platform
+-   wants to redefine any of these, it must redefine them all.  */
+-#ifndef NB85E_UART_ASIM_ADDR
+-#define NB85E_UART_ASIM_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x0)
+-#define NB85E_UART_RXB_ADDR(n)                (NB85E_UART_BASE_ADDR(n) + 0x2)
+-#define NB85E_UART_ASIS_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x3)
+-#define NB85E_UART_TXB_ADDR(n)                (NB85E_UART_BASE_ADDR(n) + 0x4)
+-#define NB85E_UART_ASIF_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x5)
+-#define NB85E_UART_CKSR_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x6)
+-#define NB85E_UART_BRGC_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x7)
+-#endif
+-
+-#ifndef NB85E_UART_CKSR_MAX_FREQ
+-#define NB85E_UART_CKSR_MAX_FREQ (25*1000*1000)
+-#endif
+-
+-/* UART config registers.  */
+-#define NB85E_UART_ASIM(n)    (*(volatile u8 *)NB85E_UART_ASIM_ADDR(n))
+-/* Control bits for config registers.  */
+-#define NB85E_UART_ASIM_CAE   0x80 /* clock enable */
+-#define NB85E_UART_ASIM_TXE   0x40 /* transmit enable */
+-#define NB85E_UART_ASIM_RXE   0x20 /* receive enable */
+-#define NB85E_UART_ASIM_PS_MASK       0x18 /* mask covering parity-select bits */
+-#define NB85E_UART_ASIM_PS_NONE       0x00 /* no parity */
+-#define NB85E_UART_ASIM_PS_ZERO       0x08 /* zero parity */
+-#define NB85E_UART_ASIM_PS_ODD        0x10 /* odd parity */
+-#define NB85E_UART_ASIM_PS_EVEN       0x18 /* even parity */
+-#define NB85E_UART_ASIM_CL_8  0x04 /* char len is 8 bits (otherwise, 7) */
+-#define NB85E_UART_ASIM_SL_2  0x02 /* 2 stop bits (otherwise, 1) */
+-#define NB85E_UART_ASIM_ISRM  0x01 /* generate INTSR interrupt on errors
+-                                      (otherwise, generate INTSER) */
+-
+-/* UART serial interface status registers.  */
+-#define NB85E_UART_ASIS(n)    (*(volatile u8 *)NB85E_UART_ASIS_ADDR(n))
+-/* Control bits for status registers.  */
+-#define NB85E_UART_ASIS_PE    0x04 /* parity error */
+-#define NB85E_UART_ASIS_FE    0x02 /* framing error */
+-#define NB85E_UART_ASIS_OVE   0x01 /* overrun error */
+-
+-/* UART serial interface transmission status registers.  */
+-#define NB85E_UART_ASIF(n)    (*(volatile u8 *)NB85E_UART_ASIF_ADDR(n))
+-#define NB85E_UART_ASIF_TXBF  0x02 /* transmit buffer flag (data in TXB) */
+-#define NB85E_UART_ASIF_TXSF  0x01 /* transmit shift flag (sending data) */
+-
+-/* UART receive buffer register.  */
+-#define NB85E_UART_RXB(n)     (*(volatile u8 *)NB85E_UART_RXB_ADDR(n))
+-
+-/* UART transmit buffer register.  */
+-#define NB85E_UART_TXB(n)     (*(volatile u8 *)NB85E_UART_TXB_ADDR(n))
+-
+-/* UART baud-rate generator control registers.  */
+-#define NB85E_UART_CKSR(n)    (*(volatile u8 *)NB85E_UART_CKSR_ADDR(n))
+-#define NB85E_UART_CKSR_MAX   11
+-#define NB85E_UART_BRGC(n)    (*(volatile u8 *)NB85E_UART_BRGC_ADDR(n))
+-
+-
+-/* This UART doesn't implement RTS/CTS by default, but some platforms
+-   implement them externally, so check to see if <asm/machdep.h> defined
+-   anything.  */
+-#ifdef NB85E_UART_CTS
+-#define nb85e_uart_cts(n)     NB85E_UART_CTS(n)
+-#else
+-#define nb85e_uart_cts(n)     (1)
+-#endif
+-
+-/* Do the same for RTS.  */
+-#ifdef NB85E_UART_SET_RTS
+-#define nb85e_uart_set_rts(n,v)       NB85E_UART_SET_RTS(n,v)
+-#else
+-#define nb85e_uart_set_rts(n,v)       ((void)0)
+-#endif
+-
+-/* Return true if all characters awaiting transmission on uart channel N
+-   have been transmitted.  */
+-#define nb85e_uart_xmit_done(n)                                                     \
+-   (! (NB85E_UART_ASIF(n) & NB85E_UART_ASIF_TXBF))
+-/* Wait for this to be true.  */
+-#define nb85e_uart_wait_for_xmit_done(n)                                    \
+-   do { } while (! nb85e_uart_xmit_done (n))
+-
+-/* Return true if uart channel N is ready to transmit a character.  */
+-#define nb85e_uart_xmit_ok(n)                                               \
+-   (nb85e_uart_xmit_done(n) && nb85e_uart_cts(n))
+-/* Wait for this to be true.  */
+-#define nb85e_uart_wait_for_xmit_ok(n)                                              \
+-   do { } while (! nb85e_uart_xmit_ok (n))
+-
+-/* Write character CH to uart channel N.  */
+-#define nb85e_uart_putc(n, ch)        (NB85E_UART_TXB(n) = (ch))
+-
+-
+-#define NB85E_UART_MINOR_BASE 64
+-
+-
+-#ifndef __ASSEMBLY__
+-
+-/* Setup a console using channel 0 of the builtin uart.  */
+-extern void nb85e_uart_cons_init (unsigned chan);
+-
+-/* Configure and turn on uart channel CHAN, using the termios `control
+-   modes' bits in CFLAGS, and a baud-rate of BAUD.  */
+-void nb85e_uart_configure (unsigned chan, unsigned cflags, unsigned baud);
+-
+-/* If the macro NB85E_UART_PRE_CONFIGURE is defined (presumably by a
+-   <asm/machdep.h>), it is called from nb85e_uart_pre_configure before
+-   anything else is done, with interrupts disabled.  */
+-
+-#endif /* !__ASSEMBLY__ */
+-
+-
+-#endif /* __V850_NB85E_UART_H__ */
+--- linux-2.6.0-test1/include/asm-v850/nb85e_utils.h   2003-06-14 12:18:20.000000000 -0700
++++ /dev/null  2002-08-30 16:31:37.000000000 -0700
+@@ -1,35 +0,0 @@
+-/*
+- * include/asm-v850/nb85e_utils.h -- Utility functions associated with
+- *    the NB85E cpu core
+- *
+- *  Copyright (C) 2001  NEC Corporation
+- *  Copyright (C) 2001  Miles Bader <miles@gnu.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General
+- * Public License.  See the file COPYING in the main directory of this
+- * archive for more details.
+- *
+- * Written by Miles Bader <miles@gnu.org>
+- */
+-
+-#ifndef __V850_NB85E_UTILS_H__
+-#define __V850_NB85E_UTILS_H__
+-
+-/* Calculate counter clock-divider and count values to attain the
+-   desired frequency RATE from the base frequency BASE_FREQ.  The
+-   counter is expected to have a clock-divider, which can divide the
+-   system cpu clock by a power of two value from MIN_DIVLOG2 to
+-   MAX_DIV_LOG2, and a word-size of COUNTER_SIZE bits (the counter
+-   counts up and resets whenever it's equal to the compare register,
+-   generating an interrupt or whatever when it does so).  The returned
+-   values are: *DIVLOG2 -- log2 of the desired clock divider and *COUNT
+-   -- the counter compare value to use.  Returns true if it was possible
+-   to find a reasonable value, otherwise false (and the other return
+-   values will be set to be as good as possible).  */
+-extern int calc_counter_params (unsigned long base_freq,
+-                              unsigned long rate,
+-                              unsigned min_divlog2, unsigned max_divlog2,
+-                              unsigned counter_size,
+-                              unsigned *divlog2, unsigned *count);
+-
+-#endif /* __V850_NB85E_UTILS_H__ */
+--- linux-2.6.0-test1/include/asm-v850/pgtable.h       2003-06-14 12:18:25.000000000 -0700
++++ 25/include/asm-v850/pgtable.h      2003-07-19 17:07:16.000000000 -0700
+@@ -13,6 +13,11 @@ typedef pte_t *pte_addr_t;
+ #define pgd_clear(pgdp)               ((void)0)
+ #define       pmd_offset(a, b)        ((void *)0)
++#define pmd_offset_kernel(pgd, addr)          pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)             pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)      pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                do { } while (0)
++#define pmd_unmap_nested(pmd)                 do { } while (0)
+ #define kern_addr_valid(addr) (1)
+--- linux-2.6.0-test1/include/asm-v850/posix_types.h   2003-06-14 12:18:52.000000000 -0700
++++ 25/include/asm-v850/posix_types.h  2003-07-19 17:06:39.000000000 -0700
+@@ -14,7 +14,9 @@
+ #ifndef __V850_POSIX_TYPES_H__
+ #define __V850_POSIX_TYPES_H__
+-typedef unsigned int  __kernel_dev_t;
++#ifdef __GNUC__
++typedef unsigned long long    __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned long long __kernel_ino64_t;
+ typedef unsigned int  __kernel_mode_t;
+--- linux-2.6.0-test1/include/asm-v850/processor.h     2003-06-14 12:18:04.000000000 -0700
++++ 25/include/asm-v850/processor.h    2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/processor.h
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+--- linux-2.6.0-test1/include/asm-v850/ptrace.h        2003-06-14 12:18:51.000000000 -0700
++++ 25/include/asm-v850/ptrace.h       2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/ptrace.h -- Access to CPU registers
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+--- linux-2.6.0-test1/include/asm-v850/rte_cb.h        2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-v850/rte_cb.h       2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/rte_cb.h -- Midas labs RTE-CB series of evaluation boards
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+@@ -20,42 +20,54 @@
+ #define MB_A_SRAM_SIZE                0x00200000 /* 2MB */
++#ifdef CONFIG_RTE_GBUS_INT
+ /* GBUS interrupt support.  */
+-#define GBUS_INT_BASE_IRQ     NUM_CPU_IRQS
+-#define GBUS_INT_BASE_ADDR    (GCS2_ADDR + 0x00006000)
+-#include <asm/gbus_int.h>
+-/* We define NUM_MACH_IRQS to include extra interrupts from the GBUS.  */
+-#define NUM_MACH_IRQS         (NUM_CPU_IRQS + IRQ_GBUS_INT_NUM)
++# include <asm/gbus_int.h>
++
++# define GBUS_INT_BASE_IRQ    NUM_RTE_CB_IRQS
++# define GBUS_INT_BASE_ADDR   (GCS2_ADDR + 0x00006000)
+ /* Some specific interrupts.  */
+-#define IRQ_MB_A_LAN          IRQ_GBUS_INT(10)
+-#define IRQ_MB_A_PCI1(n)      (IRQ_GBUS_INT(16) + (n))
+-#define IRQ_MB_A_PCI1_NUM     4
+-#define IRQ_MB_A_PCI2(n)      (IRQ_GBUS_INT(20) + (n))
+-#define IRQ_MB_A_PCI2_NUM     4
+-#define IRQ_MB_A_EXT(n)               (IRQ_GBUS_INT(24) + (n))
+-#define IRQ_MB_A_EXT_NUM      4
+-#define IRQ_MB_A_USB_OC(n)    (IRQ_GBUS_INT(28) + (n))
+-#define IRQ_MB_A_USB_OC_NUM   2
+-#define IRQ_MB_A_PCMCIA_OC    IRQ_GBUS_INT(30)
++# define IRQ_MB_A_LAN         IRQ_GBUS_INT(10)
++# define IRQ_MB_A_PCI1(n)     (IRQ_GBUS_INT(16) + (n))
++# define IRQ_MB_A_PCI1_NUM    4
++# define IRQ_MB_A_PCI2(n)     (IRQ_GBUS_INT(20) + (n))
++# define IRQ_MB_A_PCI2_NUM    4
++# define IRQ_MB_A_EXT(n)      (IRQ_GBUS_INT(24) + (n))
++# define IRQ_MB_A_EXT_NUM     4
++# define IRQ_MB_A_USB_OC(n)   (IRQ_GBUS_INT(28) + (n))
++# define IRQ_MB_A_USB_OC_NUM  2
++# define IRQ_MB_A_PCMCIA_OC   IRQ_GBUS_INT(30)
++
++/* We define NUM_MACH_IRQS to include extra interrupts from the GBUS.  */
++# define NUM_MACH_IRQS                (NUM_RTE_CB_IRQS + IRQ_GBUS_INT_NUM)
++#else /* !CONFIG_RTE_GBUS_INT */
++# define NUM_MACH_IRQS                NUM_RTE_CB_IRQS
++
++#endif /* CONFIG_RTE_GBUS_INT */
++
++
++#ifdef CONFIG_RTE_MB_A_PCI
+ /* Mother-A PCI bus support.  */
+-#include <asm/rte_mb_a_pci.h>
++
++# include <asm/rte_mb_a_pci.h>
+ /* These are the base addresses used for allocating device address
+    space.  512K of the motherboard SRAM is in the same space, so we have
+    to be careful not to let it be allocated.  */
+-#define PCIBIOS_MIN_MEM               (MB_A_PCI_MEM_ADDR + 0x80000)
+-#define PCIBIOS_MIN_IO                MB_A_PCI_IO_ADDR
++# define PCIBIOS_MIN_MEM      (MB_A_PCI_MEM_ADDR + 0x80000)
++# define PCIBIOS_MIN_IO               MB_A_PCI_IO_ADDR
+ /* As we don't really support PCI DMA to cpu memory, and use bounce-buffers
+    instead, perversely enough, this becomes always true! */
+-#define pci_dma_supported(dev, mask)          1
+-#define pci_dac_dma_supported(dev, mask)      0
+-#define pcibios_assign_all_busses()           1
++# define pci_dma_supported(dev, mask)         1
++# define pci_dac_dma_supported(dev, mask)     0
++# define pcibios_assign_all_busses()          1
++#endif /* CONFIG_RTE_MB_A_PCI */
+ /* For <asm/param.h> */
+--- linux-2.6.0-test1/include/asm-v850/rte_ma1_cb.h    2003-06-14 12:17:59.000000000 -0700
++++ 25/include/asm-v850/rte_ma1_cb.h   2003-07-19 17:03:51.000000000 -0700
+@@ -17,25 +17,6 @@
+ #include <asm/rte_cb.h>               /* Common defs for Midas RTE-CB boards.  */
+-/* CPU addresses of GBUS memory spaces.  */
+-#define GCS0_ADDR             0x05000000 /* GCS0 - Common SRAM (2MB) */
+-#define GCS0_SIZE             0x00200000 /*   2MB */
+-#define GCS1_ADDR             0x06000000 /* GCS1 - Flash ROM (8MB) */
+-#define GCS1_SIZE             0x00800000 /*   8MB */
+-#define GCS2_ADDR             0x07900000 /* GCS2 - I/O registers */
+-#define GCS2_SIZE             0x00400000 /*   4MB */
+-#define GCS5_ADDR             0x04000000 /* GCS5 - PCI bus space */
+-#define GCS5_SIZE             0x01000000 /*   16MB */
+-#define GCS6_ADDR             0x07980000 /* GCS6 - PCI control registers */
+-#define GCS6_SIZE             0x00000200 /*   512B */
+-
+-
+-/* The GBUS GINT0 - GINT4 interrupts are connected to the INTP000 - INTP011
+-   pins on the CPU.  These are shared among the GBUS interrupts.  */
+-#define IRQ_GINT(n)           IRQ_INTP(n)
+-#define IRQ_GINT_NUM          4
+-
+-
+ #define PLATFORM              "rte-v850e/ma1-cb"
+ #define PLATFORM_LONG         "Midas lab RTE-V850E/MA1-CB"
+@@ -53,10 +34,32 @@
+ #define SDRAM_SIZE            0x02000000 /* 32MB */
++/* CPU addresses of GBUS memory spaces.  */
++#define GCS0_ADDR             0x05000000 /* GCS0 - Common SRAM (2MB) */
++#define GCS0_SIZE             0x00200000 /*   2MB */
++#define GCS1_ADDR             0x06000000 /* GCS1 - Flash ROM (8MB) */
++#define GCS1_SIZE             0x00800000 /*   8MB */
++#define GCS2_ADDR             0x07900000 /* GCS2 - I/O registers */
++#define GCS2_SIZE             0x00400000 /*   4MB */
++#define GCS5_ADDR             0x04000000 /* GCS5 - PCI bus space */
++#define GCS5_SIZE             0x01000000 /*   16MB */
++#define GCS6_ADDR             0x07980000 /* GCS6 - PCI control registers */
++#define GCS6_SIZE             0x00000200 /*   512B */
++
++
+ /* For <asm/page.h> */
+ #define PAGE_OFFSET           SRAM_ADDR
++/* The GBUS GINT0 - GINT3 interrupts are connected to the INTP000 - INTP011
++   pins on the CPU.  These are shared among the GBUS interrupts.  */
++#define IRQ_GINT(n)           IRQ_INTP(n)
++#define IRQ_GINT_NUM          4
++
++/* Used by <asm/rte_cb.h> to derive NUM_MACH_IRQS.  */
++#define NUM_RTE_CB_IRQS               NUM_CPU_IRQS
++
++
+ #ifdef CONFIG_ROM_KERNEL
+ /* Kernel is in ROM, starting at address 0.  */
+@@ -98,8 +101,8 @@
+ /* Override the basic MA uart pre-initialization so that we can
+    initialize extra stuff.  */
+-#undef NB85E_UART_PRE_CONFIGURE       /* should be defined by <asm/ma.h> */
+-#define NB85E_UART_PRE_CONFIGURE      rte_ma1_cb_uart_pre_configure
++#undef V850E_UART_PRE_CONFIGURE       /* should be defined by <asm/ma.h> */
++#define V850E_UART_PRE_CONFIGURE      rte_ma1_cb_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void rte_ma1_cb_uart_pre_configure (unsigned chan,
+                                          unsigned cflags, unsigned baud);
+@@ -108,9 +111,9 @@ extern void rte_ma1_cb_uart_pre_configur
+ /* This board supports RTS/CTS for the on-chip UART, but only for channel 0. */
+ /* CTS for UART channel 0 is pin P43 (bit 3 of port 4).  */
+-#define NB85E_UART_CTS(chan)  ((chan) == 0 ? !(MA_PORT4_IO & 0x8) : 1)
++#define V850E_UART_CTS(chan)  ((chan) == 0 ? !(MA_PORT4_IO & 0x8) : 1)
+ /* RTS for UART channel 0 is pin P42 (bit 2 of port 4).  */
+-#define NB85E_UART_SET_RTS(chan, val)                                       \
++#define V850E_UART_SET_RTS(chan, val)                                       \
+    do {                                                                             \
+          if (chan == 0) {                                                   \
+                  unsigned old = MA_PORT4_IO;                                \
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/rte_me2_cb.h   2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,202 @@
++/*
++ * include/asm-v850/rte_me2_cb.h -- Midas labs RTE-V850E/ME2-CB board
++ *
++ *  Copyright (C) 2001,02,03  NEC Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_RTE_ME2_CB_H__
++#define __V850_RTE_ME2_CB_H__
++
++#include <asm/rte_cb.h>               /* Common defs for Midas RTE-CB boards.  */
++
++
++#define PLATFORM              "rte-v850e/me2-cb"
++#define PLATFORM_LONG         "Midas lab RTE-V850E/ME2-CB"
++
++#define CPU_CLOCK_FREQ                150000000 /* 150MHz */
++#define FIXED_BOGOMIPS                50
++
++/* 32MB of onbard SDRAM.  */
++#define SDRAM_ADDR            0x00800000
++#define SDRAM_SIZE            0x02000000 /* 32MB */
++
++
++/* CPU addresses of GBUS memory spaces.  */
++#define GCS0_ADDR             0x04000000 /* GCS0 - Common SRAM (2MB) */
++#define GCS0_SIZE             0x00800000 /*   8MB */
++#define GCS1_ADDR             0x04800000 /* GCS1 - Flash ROM (8MB) */
++#define GCS1_SIZE             0x00800000 /*   8MB */
++#define GCS2_ADDR             0x07000000 /* GCS2 - I/O registers */
++#define GCS2_SIZE             0x00800000 /*   8MB */
++#define GCS5_ADDR             0x08000000 /* GCS5 - PCI bus space */
++#define GCS5_SIZE             0x02000000 /*   32MB */
++#define GCS6_ADDR             0x07800000 /* GCS6 - PCI control registers */
++#define GCS6_SIZE             0x00800000 /*   8MB */
++
++
++/* For <asm/page.h> */
++#define PAGE_OFFSET           SDRAM_ADDR
++
++
++#ifdef CONFIG_ROM_KERNEL
++/* Kernel is in ROM, starting at address 0.  */
++
++#define INTV_BASE             0
++#define ROOT_FS_IMAGE_RW      0
++
++#else /* !CONFIG_ROM_KERNEL */
++/* Using RAM-kernel.  Assume some sort of boot-loader got us loaded at
++   address 0.  */
++
++#define INTV_BASE             0
++#define ROOT_FS_IMAGE_RW      1
++
++#endif /* CONFIG_ROM_KERNEL */
++
++
++/* Some misc. on-board devices.  */
++
++/* Seven-segment LED display (four digits).  */
++#define LED_ADDR(n)           (0x0FE02000 + (n))
++#define LED(n)                        (*(volatile unsigned char *)LED_ADDR(n))
++#define LED_NUM_DIGITS                4
++
++
++/* On-board PIC.  */
++
++#define CB_PIC_BASE_ADDR      0x0FE04000
++
++#define CB_PIC_INT0M_ADDR     (CB_PIC_BASE_ADDR + 0x00)
++#define CB_PIC_INT0M          (*(volatile u16 *)CB_PIC_INT0M_ADDR)
++#define CB_PIC_INT1M_ADDR     (CB_PIC_BASE_ADDR + 0x10)
++#define CB_PIC_INT1M          (*(volatile u16 *)CB_PIC_INT1M_ADDR)
++#define CB_PIC_INTR_ADDR      (CB_PIC_BASE_ADDR + 0x20)
++#define CB_PIC_INTR           (*(volatile u16 *)CB_PIC_INTR_ADDR)
++#define CB_PIC_INTEN_ADDR     (CB_PIC_BASE_ADDR + 0x30)
++#define CB_PIC_INTEN          (*(volatile u16 *)CB_PIC_INTEN_ADDR)
++
++#define CB_PIC_INT0EN         0x0001
++#define CB_PIC_INT1EN         0x0002
++#define CB_PIC_INT0SEL        0x0080
++
++/* The PIC interrupts themselves.  */
++#define CB_PIC_BASE_IRQ               NUM_CPU_IRQS
++#define IRQ_CB_PIC_NUM                10
++
++/* Some specific CB_PIC interrupts. */
++#define IRQ_CB_EXTTM0         (CB_PIC_BASE_IRQ + 0)
++#define IRQ_CB_EXTSIO         (CB_PIC_BASE_IRQ + 1)
++#define IRQ_CB_TOVER          (CB_PIC_BASE_IRQ + 2)
++#define IRQ_CB_GINT0          (CB_PIC_BASE_IRQ + 3)
++#define IRQ_CB_USB            (CB_PIC_BASE_IRQ + 4)
++#define IRQ_CB_LANC           (CB_PIC_BASE_IRQ + 5)
++#define IRQ_CB_USB_VBUS_ON    (CB_PIC_BASE_IRQ + 6)
++#define IRQ_CB_USB_VBUS_OFF   (CB_PIC_BASE_IRQ + 7)
++#define IRQ_CB_EXTTM1         (CB_PIC_BASE_IRQ + 8)
++#define IRQ_CB_EXTTM2         (CB_PIC_BASE_IRQ + 9)
++
++/* The GBUS GINT1 - GINT3 (note, not GINT0!) interrupts are connected to
++   the INTP65 - INTP67 pins on the CPU.  These are shared among the GBUS
++   interrupts.  */
++#define IRQ_GINT(n)           IRQ_INTP((n) + 9)  /* 0 is unused! */
++#define IRQ_GINT_NUM          4                  /* 0 is unused! */
++
++/* The shared interrupt line from the PIC is connected to CPU pin INTP23.  */
++#define IRQ_CB_PIC            IRQ_INTP(4) /* P23 */
++
++/* Used by <asm/rte_cb.h> to derive NUM_MACH_IRQS.  */
++#define NUM_RTE_CB_IRQS               (NUM_CPU_IRQS + IRQ_CB_PIC_NUM)
++
++
++#ifndef __ASSEMBLY__
++struct cb_pic_irq_init {
++      const char *name;       /* name of interrupt type */
++
++      /* Range of kernel irq numbers for this type:
++         BASE, BASE+INTERVAL, ..., BASE+INTERVAL*NUM  */
++      unsigned base, num, interval;
++
++      unsigned priority;      /* interrupt priority to assign */
++};
++struct hw_interrupt_type;     /* fwd decl */
++
++/* Enable interrupt handling for interrupt IRQ.  */
++extern void cb_pic_enable_irq (unsigned irq);
++/* Disable interrupt handling for interrupt IRQ.  Note that any interrupts
++   received while disabled will be delivered once the interrupt is enabled
++   again, unless they are explicitly cleared using `cb_pic_clear_pending_irq'.  */
++extern void cb_pic_disable_irq (unsigned irq);
++/* Initialize HW_IRQ_TYPES for PIC irqs described in array INITS (which is
++   terminated by an entry with the name field == 0).  */
++extern void cb_pic_init_irq_types (struct cb_pic_irq_init *inits,
++                                 struct hw_interrupt_type *hw_irq_types);
++/* Initialize PIC interrupts.  */
++extern void cb_pic_init_irqs (void);
++#endif /* __ASSEMBLY__ */
++
++
++/* TL16C550C on board UART see also asm/serial.h */
++#define CB_UART_BASE          0x0FE08000
++#define CB_UART_REG_GAP       0x10
++#define CB_UART_CLOCK         0x16000000
++
++/* CompactFlash setting see also asm/ide.h, asm/hdreg.h.  */
++#define CB_CF_BASE                    0x0FE0C000
++#define CB_CF_CCR_ADDR                (CB_CF_BASE+0x200)
++#define CB_CF_CCR                     (*(volatile u8 *)CB_CF_CCR_ADDR)
++#define CB_CF_REG0_ADDR               (CB_CF_BASE+0x1000)
++#define CB_CF_REG0                    (*(volatile u16 *)CB_CF_REG0_ADDR)
++#define CB_CF_STS0_ADDR               (CB_CF_BASE+0x1004)
++#define CB_CF_STS0                    (*(volatile u16 *)CB_CF_STS0_ADDR)
++#define CB_PCATA_BASE                 (CB_CF_BASE+0x800)
++#define CB_IDE_BASE                   (CB_CF_BASE+0x9F0)
++#define CB_IDE_CTRL                   (CB_CF_BASE+0xBF6)
++#define CB_IDE_REG_OFFS               0x1
++
++
++/* SMSC LAN91C111 setting */
++#if defined(CONFIG_SMC91111)
++#define CB_LANC_BASE          0x0FE10300
++#define CONFIG_SMC16BITONLY
++#define ETH0_ADDR             CB_LANC_BASE
++#define ETH0_IRQ              IRQ_CB_LANC
++#endif /* CONFIG_SMC16BITONLY */
++
++
++#undef V850E_UART_PRE_CONFIGURE
++#define V850E_UART_PRE_CONFIGURE      rte_me2_cb_uart_pre_configure
++#ifndef __ASSEMBLY__
++extern void rte_me2_cb_uart_pre_configure (unsigned chan,
++                                         unsigned cflags, unsigned baud);
++#endif /* __ASSEMBLY__ */
++
++/* This board supports RTS/CTS for the on-chip UART, but only for channel 0. */
++
++/* CTS for UART channel 0 is pin P22 (bit 2 of port 2).  */
++#define V850E_UART_CTS(chan)  ((chan) == 0 ? !(ME2_PORT2_IO & 0x4) : 1)
++/* RTS for UART channel 0 is pin P21 (bit 1 of port 2).  */
++#define V850E_UART_SET_RTS(chan, val)                                       \
++   do {                                                                             \
++         if (chan == 0) {                                                   \
++                 unsigned old = ME2_PORT2_IO;                               \
++                 if (val)                                                   \
++                         ME2_PORT2_IO = old & ~0x2;                         \
++                 else                                                       \
++                         ME2_PORT2_IO = old | 0x2;                          \
++         }                                                                  \
++   } while (0)
++
++
++#ifndef __ASSEMBLY__
++extern void rte_me2_cb_init_irqs (void);
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_RTE_ME2_CB_H__ */
+--- linux-2.6.0-test1/include/asm-v850/rte_nb85e_cb.h  2003-06-14 12:18:30.000000000 -0700
++++ 25/include/asm-v850/rte_nb85e_cb.h 2003-07-19 17:03:51.000000000 -0700
+@@ -17,6 +17,21 @@
+ #include <asm/rte_cb.h>               /* Common defs for Midas RTE-CB boards.  */
++#define PLATFORM              "rte-v850e/nb85e-cb"
++#define PLATFORM_LONG         "Midas lab RTE-V850E/NB85E-CB"
++
++#define CPU_CLOCK_FREQ                50000000 /* 50MHz */
++
++/* 1MB of onboard SRAM.  Note that the monitor ROM uses parts of this
++   for its own purposes, so care must be taken.  */
++#define SRAM_ADDR             0x03C00000
++#define SRAM_SIZE             0x00100000 /* 1MB */
++
++/* 16MB of onbard SDRAM.  */
++#define SDRAM_ADDR            0x01000000
++#define SDRAM_SIZE            0x01000000 /* 16MB */
++
++
+ /* CPU addresses of GBUS memory spaces.  */
+ #define GCS0_ADDR             0x00400000 /* GCS0 - Common SRAM (2MB) */
+ #define GCS0_SIZE             0x00400000 /*   4MB */
+@@ -39,20 +54,8 @@
+ #define IRQ_GINT(n)           (10 + (n))
+ #define IRQ_GINT_NUM          3
+-
+-#define PLATFORM      "rte-v850e/nb85e-cb"
+-#define PLATFORM_LONG "Midas lab RTE-V850E/NB85E-CB"
+-
+-#define CPU_CLOCK_FREQ        50000000 /* 50MHz */
+-
+-/* 1MB of onboard SRAM.  Note that the monitor ROM uses parts of this
+-   for its own purposes, so care must be taken.  */
+-#define SRAM_ADDR     0x03C00000
+-#define SRAM_SIZE     0x00100000 /* 1MB */
+-
+-/* 16MB of onbard SDRAM.  */
+-#define SDRAM_ADDR    0x01000000
+-#define SDRAM_SIZE    0x01000000 /* 16MB */
++/* Used by <asm/rte_cb.h> to derive NUM_MACH_IRQS.  */
++#define NUM_RTE_CB_IRQS               NUM_CPU_IRQS
+ #ifdef CONFIG_ROM_KERNEL
+@@ -86,8 +89,8 @@
+ /* Override the basic TEG UART pre-initialization so that we can
+    initialize extra stuff.  */
+-#undef NB85E_UART_PRE_CONFIGURE       /* should be defined by <asm/teg.h> */
+-#define NB85E_UART_PRE_CONFIGURE      rte_nb85e_cb_uart_pre_configure
++#undef V850E_UART_PRE_CONFIGURE       /* should be defined by <asm/teg.h> */
++#define V850E_UART_PRE_CONFIGURE      rte_nb85e_cb_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void rte_nb85e_cb_uart_pre_configure (unsigned chan,
+                                            unsigned cflags, unsigned baud);
+@@ -96,9 +99,9 @@ extern void rte_nb85e_cb_uart_pre_config
+ /* This board supports RTS/CTS for the on-chip UART. */
+ /* CTS is pin P00.  */
+-#define NB85E_UART_CTS(chan)  (! (TEG_PORT0_IO & 0x1))
++#define V850E_UART_CTS(chan)  (! (TEG_PORT0_IO & 0x1))
+ /* RTS is pin P02.  */
+-#define NB85E_UART_SET_RTS(chan, val)                                       \
++#define V850E_UART_SET_RTS(chan, val)                                       \
+    do {                                                                             \
+          unsigned old = TEG_PORT0_IO;                                       \
+          TEG_PORT0_IO = val ? (old & ~0x4) : (old | 0x4);                   \
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/serial.h       2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,58 @@
++/*
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copyright (C) 1999 by Ralf Baechle
++ * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
++ */ 
++#include <linux/config.h>
++
++#ifdef CONFIG_RTE_CB_ME2
++
++#include <asm/rte_me2_cb.h>
++
++#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
++
++#define irq_cannonicalize(x) (x)
++#define BASE_BAUD     250000  /* (16MHz / (16 * 38400)) * 9600 */
++#define RS_TABLE_SIZE 1
++#define SERIAL_PORT_DFNS \
++   { 0, BASE_BAUD, CB_UART_BASE, IRQ_CB_EXTSIO, STD_COM_FLAGS },
++
++/* Redefine UART register offsets.  */
++#undef UART_RX
++#undef UART_TX
++#undef UART_DLL
++#undef UART_TRG
++#undef UART_DLM
++#undef UART_IER
++#undef UART_FCTR
++#undef UART_IIR
++#undef UART_FCR
++#undef UART_EFR
++#undef UART_LCR
++#undef UART_MCR
++#undef UART_LSR
++#undef UART_MSR
++#undef UART_SCR
++#undef UART_EMSR
++
++#define UART_RX               (0 * CB_UART_REG_GAP)
++#define UART_TX               (0 * CB_UART_REG_GAP)
++#define UART_DLL      (0 * CB_UART_REG_GAP)
++#define UART_TRG      (0 * CB_UART_REG_GAP)
++#define UART_DLM      (1 * CB_UART_REG_GAP)
++#define UART_IER      (1 * CB_UART_REG_GAP)
++#define UART_FCTR     (1 * CB_UART_REG_GAP)
++#define UART_IIR      (2 * CB_UART_REG_GAP)
++#define UART_FCR      (2 * CB_UART_REG_GAP)
++#define UART_EFR      (2 * CB_UART_REG_GAP)
++#define UART_LCR      (3 * CB_UART_REG_GAP)
++#define UART_MCR      (4 * CB_UART_REG_GAP)
++#define UART_LSR      (5 * CB_UART_REG_GAP)
++#define UART_MSR      (6 * CB_UART_REG_GAP)
++#define UART_SCR      (7 * CB_UART_REG_GAP)
++#define UART_EMSR     (7 * CB_UART_REG_GAP)
++
++#endif /* CONFIG_RTE_CB_ME2 */
+--- linux-2.6.0-test1/include/asm-v850/sim85e2c.h      2003-06-14 12:18:01.000000000 -0700
++++ 25/include/asm-v850/sim85e2c.h     2003-07-19 17:03:51.000000000 -0700
+@@ -15,78 +15,12 @@
+ #ifndef __V850_SIM85E2C_H__
+ #define __V850_SIM85E2C_H__
++/* Use generic sim85e2 settings, other than the various names.  */
++#include <asm/sim85e2.h>
+-#define CPU_ARCH      "v850e2"
+ #define CPU_MODEL     "v850e2"
+ #define CPU_MODEL_LONG        "NEC V850E2"
+ #define PLATFORM      "sim85e2c"
+ #define PLATFORM_LONG "SIM85E2C V850E2 simulator"
+-
+-/* Various memory areas supported by the simulator.
+-   These should match the corresponding definitions in the linker script.  */
+-
+-/* `instruction RAM'; instruction fetches are much faster from IRAM than
+-   from DRAM.  */
+-#define IRAM_ADDR             0
+-#define IRAM_SIZE             0x00100000 /* 1MB */
+-/* `data RAM', below and contiguous with the I/O space.
+-   Data fetches are much faster from DRAM than from IRAM.  */
+-#define DRAM_ADDR             0xfff00000
+-#define DRAM_SIZE             0x000ff000 /* 1020KB */
+-/* `external ram'.  Unlike the above RAM areas, this memory is cached,
+-   so both instruction and data fetches should be (mostly) fast --
+-   however, currently only write-through caching is supported, so writes
+-   to ERAM will be slow.  */
+-#define ERAM_ADDR             0x00100000
+-#define ERAM_SIZE             0x07f00000 /* 127MB (max) */
+-
+-
+-/* CPU core control registers; these should be expanded and moved into
+-   separate header files when we support some other processors based on
+-   the same E2 core.  */
+-/* Bus Transaction Control Register */
+-#define NA85E2C_CACHE_BTSC_ADDR       0xfffff070
+-#define NA85E2C_CACHE_BTSC    (*(volatile unsigned short *)NA85E2C_CACHE_BTSC_ADDR)
+-#define NA85E2C_CACHE_BTSC_ICM        0x1 /* icache enable */
+-#define NA85E2C_CACHE_BTSC_DCM0       0x4 /* dcache enable, bit 0 */
+-#define NA85E2C_CACHE_BTSC_DCM1       0x8 /* dcache enable, bit 1 */
+-/* Cache Configuration Register */
+-#define NA85E2C_BUSM_BHC_ADDR 0xfffff06a
+-#define NA85E2C_BUSM_BHC      (*(volatile unsigned short *)NA85E2C_BUSM_BHC_ADDR)
+-
+-/* Simulator specific control registers.  */
+-/* NOTHAL controls whether the simulator will stop at a `halt' insn.  */
+-#define NOTHAL_ADDR           0xffffff22
+-#define NOTHAL                        (*(volatile unsigned char *)NOTHAL_ADDR)
+-/* The simulator will stop N cycles after N is written to SIMFIN.  */
+-#define SIMFIN_ADDR           0xffffff24
+-#define SIMFIN                        (*(volatile unsigned short *)SIMFIN_ADDR)
+-
+-
+-/* The simulator has an nb85e-style interrupt system.  */
+-#include <asm/nb85e_intc.h>
+-
+-/* For <asm/irq.h> */
+-#define NUM_CPU_IRQS          64
+-
+-
+-/* For <asm/page.h> */
+-#define PAGE_OFFSET           DRAM_ADDR
+-
+-
+-/* For <asm/entry.h> */
+-/* `R0 RAM', used for a few miscellaneous variables that must be accessible
+-   using a load instruction relative to R0.  The sim85e2c simulator
+-   actually puts 1020K of RAM from FFF00000 to FFFFF000, so we arbitarily
+-   choose a small portion at the end of that.  */
+-#define R0_RAM_ADDR           0xFFFFE000
+-
+-
+-/* For <asm/param.h> */
+-#ifndef HZ
+-#define HZ                    24      /* Minimum supported frequency.  */
+-#endif
+-
+-
+ #endif /* __V850_SIM85E2C_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/sim85e2.h      2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,79 @@
++/*
++ * include/asm-v850/sim85e2.h -- Machine-dependent defs for
++ *    V850E2 RTL simulator
++ *
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_SIM85E2_H__
++#define __V850_SIM85E2_H__
++
++
++#include <asm/v850e2.h>               /* Based on V850E2 core.  */
++
++
++/* Various memory areas supported by the simulator.
++   These should match the corresponding definitions in the linker script.  */
++
++/* `instruction RAM'; instruction fetches are much faster from IRAM than
++   from DRAM.  */
++#define IRAM_ADDR             0
++#define IRAM_SIZE             0x00100000 /* 1MB */
++/* `data RAM', below and contiguous with the I/O space.
++   Data fetches are much faster from DRAM than from IRAM.  */
++#define DRAM_ADDR             0xfff00000
++#define DRAM_SIZE             0x000ff000 /* 1020KB */
++/* `external ram'.  Unlike the above RAM areas, this memory is cached,
++   so both instruction and data fetches should be (mostly) fast --
++   however, currently only write-through caching is supported, so writes
++   to ERAM will be slow.  */
++#define ERAM_ADDR             0x00100000
++#define ERAM_SIZE             0x07f00000 /* 127MB (max) */
++/* Dynamic RAM; uses memory controller.  */
++#define SDRAM_ADDR            0x10000000
++#if 0
++#define SDRAM_SIZE            0x01000000 /* 16MB */
++#else
++#define SDRAM_SIZE            0x00200000 /* Only use 2MB for testing */
++#endif
++
++
++/* Simulator specific control registers.  */
++/* NOTHAL controls whether the simulator will stop at a `halt' insn.  */
++#define SIM85E2_NOTHAL_ADDR   0xffffff22
++#define SIM85E2_NOTHAL                (*(volatile u8 *)SIM85E2_NOTHAL_ADDR)
++/* The simulator will stop N cycles after N is written to SIMFIN.  */
++#define SIM85E2_SIMFIN_ADDR   0xffffff24
++#define SIM85E2_SIMFIN                (*(volatile u16 *)SIM85E2_SIMFIN_ADDR)
++
++
++/* For <asm/irq.h> */
++#define NUM_CPU_IRQS          64
++
++
++/* For <asm/page.h> */
++#define PAGE_OFFSET           SDRAM_ADDR
++
++
++/* For <asm/entry.h> */
++/* `R0 RAM', used for a few miscellaneous variables that must be accessible
++   using a load instruction relative to R0.  The sim85e2 simulator
++   actually puts 1020K of RAM from FFF00000 to FFFFF000, so we arbitarily
++   choose a small portion at the end of that.  */
++#define R0_RAM_ADDR           0xFFFFE000
++
++
++/* For <asm/param.h> */
++#ifndef HZ
++#define HZ                    24      /* Minimum supported frequency.  */
++#endif
++
++
++#endif /* __V850_SIM85E2_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/sim85e2s.h     2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,28 @@
++/*
++ * include/asm-v850/sim85e2s.h -- Machine-dependent defs for
++ *    V850E2 RTL simulator
++ *
++ *  Copyright (C) 2003  NEC Electronics Corporation
++ *  Copyright (C) 2003  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_SIM85E2S_H__
++#define __V850_SIM85E2S_H__
++
++#include <asm/sim85e2.h>      /* Use generic sim85e2 settings.  */
++#if 0
++#include <asm/v850e2_cache.h> /* + cache */
++#endif
++
++#define CPU_MODEL     "v850e2"
++#define CPU_MODEL_LONG        "NEC V850E2"
++#define PLATFORM      "sim85e2s"
++#define PLATFORM_LONG "SIM85E2S V850E2 simulator"
++
++#endif /* __V850_SIM85E2S_H__ */
+--- linux-2.6.0-test1/include/asm-v850/stat.h  2003-06-14 12:18:26.000000000 -0700
++++ 25/include/asm-v850/stat.h 2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/stat.h -- v850 stat structure
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+--- linux-2.6.0-test1/include/asm-v850/system.h        2003-06-14 12:18:29.000000000 -0700
++++ 25/include/asm-v850/system.h       2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  * include/asm-v850/system.h -- Low-level interrupt/thread ops
+  *
+- *  Copyright (C) 2001,02,03  NEC Corporation
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+  *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+  *
+  * This file is subject to the terms and conditions of the GNU General
+--- linux-2.6.0-test1/include/asm-v850/teg.h   2003-06-14 12:17:56.000000000 -0700
++++ 25/include/asm-v850/teg.h  2003-07-19 17:03:51.000000000 -0700
+@@ -15,9 +15,9 @@
+ #define __V850_TEG_H__
+-/* The TEG uses the NB85E cpu core.  */
+-#include <asm/nb85e.h>
+-#include <asm/nb85e_cache.h>
++/* The TEG uses the V850E cpu core.  */
++#include <asm/v850e.h>
++#include <asm/v850e_cache.h>
+ #define CPU_MODEL     "v850e/nb85e-teg"
+@@ -51,18 +51,18 @@
+ /* TEG UART details.  */
+-#define NB85E_UART_BASE_ADDR(n)               (0xFFFFF600 + 0x10 * (n))
+-#define NB85E_UART_ASIM_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x0)
+-#define NB85E_UART_ASIS_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x2)
+-#define NB85E_UART_ASIF_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x4)
+-#define NB85E_UART_CKSR_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x6)
+-#define NB85E_UART_BRGC_ADDR(n)               (NB85E_UART_BASE_ADDR(n) + 0x8)
+-#define NB85E_UART_TXB_ADDR(n)                (NB85E_UART_BASE_ADDR(n) + 0xA)
+-#define NB85E_UART_RXB_ADDR(n)                (NB85E_UART_BASE_ADDR(n) + 0xC)
+-#define NB85E_UART_NUM_CHANNELS               1
+-#define NB85E_UART_BASE_FREQ          CPU_CLOCK_FREQ
++#define V850E_UART_BASE_ADDR(n)               (0xFFFFF600 + 0x10 * (n))
++#define V850E_UART_ASIM_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x0)
++#define V850E_UART_ASIS_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x2)
++#define V850E_UART_ASIF_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x4)
++#define V850E_UART_CKSR_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x6)
++#define V850E_UART_BRGC_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x8)
++#define V850E_UART_TXB_ADDR(n)                (V850E_UART_BASE_ADDR(n) + 0xA)
++#define V850E_UART_RXB_ADDR(n)                (V850E_UART_BASE_ADDR(n) + 0xC)
++#define V850E_UART_NUM_CHANNELS               1
++#define V850E_UART_BASE_FREQ          CPU_CLOCK_FREQ
+ /* This is a function that gets called before configuring the UART.  */
+-#define NB85E_UART_PRE_CONFIGURE      teg_uart_pre_configure
++#define V850E_UART_PRE_CONFIGURE      teg_uart_pre_configure
+ #ifndef __ASSEMBLY__
+ extern void teg_uart_pre_configure (unsigned chan,
+                                   unsigned cflags, unsigned baud);
+@@ -70,15 +70,15 @@ extern void teg_uart_pre_configure (unsi
+ /* The TEG RTPU.  */
+-#define NB85E_RTPU_BASE_ADDR          0xFFFFF210
++#define V850E_RTPU_BASE_ADDR          0xFFFFF210
+ /* TEG series timer D details.  */
+-#define NB85E_TIMER_D_BASE_ADDR               0xFFFFF210
+-#define NB85E_TIMER_D_TMCD_BASE_ADDR  (NB85E_TIMER_D_BASE_ADDR + 0x0)
+-#define NB85E_TIMER_D_TMD_BASE_ADDR   (NB85E_TIMER_D_BASE_ADDR + 0x4)
+-#define NB85E_TIMER_D_CMD_BASE_ADDR   (NB85E_TIMER_D_BASE_ADDR + 0x8)
+-#define NB85E_TIMER_D_BASE_FREQ               CPU_CLOCK_FREQ
++#define V850E_TIMER_D_BASE_ADDR               0xFFFFF210
++#define V850E_TIMER_D_TMCD_BASE_ADDR  (V850E_TIMER_D_BASE_ADDR + 0x0)
++#define V850E_TIMER_D_TMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x4)
++#define V850E_TIMER_D_CMD_BASE_ADDR   (V850E_TIMER_D_BASE_ADDR + 0x8)
++#define V850E_TIMER_D_BASE_FREQ               CPU_CLOCK_FREQ
+ /* `Interrupt Source Select' control register.  */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e2_cache.h 2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,74 @@
++/*
++ * include/asm-v850/v850e2_cache_cache.h -- Cache control for V850E2
++ *    cache memories
++ *
++ *  Copyright (C) 2003  NEC Electronics Corporation
++ *  Copyright (C) 2003  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_V850E2_CACHE_H__
++#define __V850_V850E2_CACHE_H__
++
++#include <asm/types.h>
++
++
++/* Cache control registers.  */
++
++/* Bus Transaction Control */
++#define V850E2_CACHE_BTSC_ADDR        0xFFFFF070
++#define V850E2_CACHE_BTSC     (*(volatile u16 *)V850E2_CACHE_BTSC_ADDR)
++#define V850E2_CACHE_BTSC_ICM 0x0001 /* icache enable */
++#define V850E2_CACHE_BTSC_DCM0        0x0004 /* dcache enable, bit 0 */
++#define V850E2_CACHE_BTSC_DCM1        0x0008 /* dcache enable, bit 1 */
++#define V850E2_CACHE_BTSC_DCM_WT                    /* write-through */ \
++                      V850E2_CACHE_BTSC_DCM0
++#ifdef CONFIG_V850E2_V850E2S
++# define V850E2_CACHE_BTSC_DCM_WB_NO_ALLOC    /* write-back, non-alloc */ \
++                      V850E2_CACHE_BTSC_DCM1  
++# define V850E2_CACHE_BTSC_DCM_WB_ALLOC             /* write-back, non-alloc */ \
++                      (V850E2_CACHE_BTSC_DCM1 | V850E2_CACHE_BTSC_DCM0)
++# define V850E2_CACHE_BTSC_ISEQ       0x0010 /* icache `address sequence mode' */
++# define V850E2_CACHE_BTSC_DSEQ       0x0020 /* dcache `address sequence mode' */
++# define V850E2_CACHE_BTSC_IRFC       0x0030
++# define V850E2_CACHE_BTSC_ILCD       0x4000
++# define V850E2_CACHE_BTSC_VABE       0x8000
++#endif /* CONFIG_V850E2_V850E2S */
++
++/* Cache operation start address register (low-bits).  */
++#define V850E2_CACHE_CADL_ADDR        0xFFFFF074
++#define V850E2_CACHE_CADL     (*(volatile u16 *)V850E2_CACHE_CADL_ADDR)
++/* Cache operation start address register (high-bits).  */
++#define V850E2_CACHE_CADH_ADDR        0xFFFFF076
++#define V850E2_CACHE_CADH     (*(volatile u16 *)V850E2_CACHE_CADH_ADDR)
++/* Cache operation count register.  */
++#define V850E2_CACHE_CCNT_ADDR        0xFFFFF078
++#define V850E2_CACHE_CCNT     (*(volatile u16 *)V850E2_CACHE_CCNT_ADDR)
++/* Cache operation specification register.  */
++#define V850E2_CACHE_COPR_ADDR        0xFFFFF07A
++#define V850E2_CACHE_COPR     (*(volatile u16 *)V850E2_CACHE_COPR_ADDR)
++#define V850E2_CACHE_COPR_STRT        0x0001 /* start cache operation */
++#define V850E2_CACHE_COPR_LBSL        0x0100 /* 0 = icache, 1 = dcache */
++#define V850E2_CACHE_COPR_WSLE        0x0200 /* operate on cache way */
++#define V850E2_CACHE_COPR_WSL(way) ((way) * 0x0400) /* way select */
++#define V850E2_CACHE_COPR_CFC(op)  ((op)  * 0x1000) /* cache function code */
++
++
++/* Size of a cache line in bytes.  */
++#define V850E2_CACHE_LINE_SIZE_BITS   4
++#define V850E2_CACHE_LINE_SIZE                (1 << V850E2_CACHE_LINE_SIZE_BITS)
++
++/* The size of each cache `way' in lines.  */
++#define V850E2_CACHE_WAY_SIZE         256
++
++
++/* For <asm/cache.h> */
++#define L1_CACHE_BYTES                        V850E2_CACHE_LINE_SIZE
++
++
++#endif /* __V850_V850E2_CACHE_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e2.h       2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,69 @@
++/*
++ * include/asm-v850/v850e2.h -- Machine-dependent defs for V850E2 CPUs
++ *
++ *  Copyright (C) 2002,03  NEC Electronics Corporation
++ *  Copyright (C) 2002,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_V850E2_H__
++#define __V850_V850E2_H__
++
++#include <asm/v850e_intc.h>   /* v850e-style interrupt system.  */
++
++
++#define CPU_ARCH "v850e2"
++
++
++/* Control registers.  */
++
++/* Chip area select control */ 
++#define V850E2_CSC_ADDR(n)    (0xFFFFF060 + (n) * 2)
++#define V850E2_CSC(n)         (*(volatile u16 *)V850E2_CSC_ADDR(n))
++/* I/O area select control */
++#define V850E2_BPC_ADDR               0xFFFFF064
++#define V850E2_BPC            (*(volatile u16 *)V850E2_BPC_ADDR)
++/* Bus size configuration */
++#define V850E2_BSC_ADDR               0xFFFFF066
++#define V850E2_BSC            (*(volatile u16 *)V850E2_BSC_ADDR)
++/* Endian configuration */
++#define V850E2_BEC_ADDR               0xFFFFF068
++#define V850E2_BEC            (*(volatile u16 *)V850E2_BEC_ADDR)
++/* Cache configuration */
++#define V850E2_BHC_ADDR               0xFFFFF06A
++#define V850E2_BHC            (*(volatile u16 *)V850E2_BHC_ADDR)
++/* NPB strobe-wait configuration */
++#define V850E2_VSWC_ADDR      0xFFFFF06E
++#define V850E2_VSWC           (*(volatile u16 *)V850E2_VSWC_ADDR)
++/* Bus cycle type */
++#define V850E2_BCT_ADDR(n)    (0xFFFFF480 + (n) * 2)
++#define V850E2_BCT(n)         (*(volatile u16 *)V850E2_BCT_ADDR(n))
++/* Data wait control */
++#define V850E2_DWC_ADDR(n)    (0xFFFFF484 + (n) * 2)
++#define V850E2_DWC(n)         (*(volatile u16 *)V850E2_DWC_ADDR(n))
++/* Bus cycle control */
++#define V850E2_BCC_ADDR               0xFFFFF488
++#define V850E2_BCC            (*(volatile u16 *)V850E2_BCC_ADDR)
++/* Address wait control */
++#define V850E2_ASC_ADDR               0xFFFFF48A
++#define V850E2_ASC            (*(volatile u16 *)V850E2_ASC_ADDR)
++/* Local bus sizing control */
++#define V850E2_LBS_ADDR               0xFFFFF48E
++#define V850E2_LBS            (*(volatile u16 *)V850E2_LBS_ADDR)
++/* Line buffer control */
++#define V850E2_LBC_ADDR(n)    (0xFFFFF490 + (n) * 2)
++#define V850E2_LBC(n)         (*(volatile u16 *)V850E2_LBC_ADDR(n))
++/* SDRAM configuration */
++#define V850E2_SCR_ADDR(n)    (0xFFFFF4A0 + (n) * 4)
++#define V850E2_SCR(n)         (*(volatile u16 *)V850E2_SCR_ADDR(n))
++/* SDRAM refresh cycle control */
++#define V850E2_RFS_ADDR(n)    (0xFFFFF4A2 + (n) * 4)
++#define V850E2_RFS(n)         (*(volatile u16 *)V850E2_RFS_ADDR(n))
++
++
++#endif /* __V850_V850E2_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_cache.h  2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,48 @@
++/*
++ * include/asm-v850/v850e_cache.h -- Cache control for V850E cache memories
++ *
++ *  Copyright (C) 2001,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* This file implements cache control for the rather simple cache used on
++   some V850E CPUs, specifically the NB85E/TEG CPU-core and the V850E/ME2
++   CPU.  V850E2 processors have their own (better) cache
++   implementation.  */
++
++#ifndef __V850_V850E_CACHE_H__
++#define __V850_V850E_CACHE_H__
++
++#include <asm/types.h>
++
++
++/* Cache control registers.  */
++#define V850E_CACHE_BHC_ADDR  0xFFFFF06A
++#define V850E_CACHE_BHC               (*(volatile u16 *)V850E_CACHE_BHC_ADDR)
++#define V850E_CACHE_ICC_ADDR  0xFFFFF070
++#define V850E_CACHE_ICC               (*(volatile u16 *)V850E_CACHE_ICC_ADDR)
++#define V850E_CACHE_ISI_ADDR  0xFFFFF072
++#define V850E_CACHE_ISI               (*(volatile u16 *)V850E_CACHE_ISI_ADDR)
++#define V850E_CACHE_DCC_ADDR  0xFFFFF078
++#define V850E_CACHE_DCC               (*(volatile u16 *)V850E_CACHE_DCC_ADDR)
++
++/* Size of a cache line in bytes.  */
++#define V850E_CACHE_LINE_SIZE 16
++
++/* For <asm/cache.h> */
++#define L1_CACHE_BYTES                V850E_CACHE_LINE_SIZE
++
++
++#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
++/* Set caching params via the BHC, ICC, and DCC registers.  */
++void v850e_cache_enable (u16 bhc, u16 icc, u16 dcc);
++#endif /* __KERNEL__ && !__ASSEMBLY__ */
++
++
++#endif /* __V850_V850E_CACHE_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e.h        2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,21 @@
++/*
++ * include/asm-v850/v850e.h -- V850E CPU
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_V850E_H__
++#define __V850_V850E_H__
++
++#include <asm/v850e_intc.h>
++
++#define CPU_ARCH "v850e"
++
++#endif /* __V850_V850E_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_intc.h   2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,133 @@
++/*
++ * include/asm-v850/v850e_intc.h -- V850E CPU interrupt controller (INTC)
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_V850E_INTC_H__
++#define __V850_V850E_INTC_H__
++
++
++/* There are 4 16-bit `Interrupt Mask Registers' located contiguously
++   starting from this base.  Each interrupt uses a single bit to
++   indicated enabled/disabled status.  */
++#define V850E_INTC_IMR_BASE_ADDR  0xFFFFF100
++#define V850E_INTC_IMR_ADDR(irq)  (V850E_INTC_IMR_BASE_ADDR + ((irq) >> 3))
++#define V850E_INTC_IMR_BIT(irq)         ((irq) & 0x7)
++
++/* Each maskable interrupt has a single-byte control register at this
++   address.  */
++#define V850E_INTC_IC_BASE_ADDR         0xFFFFF110
++#define V850E_INTC_IC_ADDR(irq)         (V850E_INTC_IC_BASE_ADDR + ((irq) << 1))
++#define V850E_INTC_IC(irq)      (*(volatile u8 *)V850E_INTC_IC_ADDR(irq))
++/* Encode priority PR for storing in an interrupt control register.  */
++#define V850E_INTC_IC_PR(pr)    (pr)
++/* Interrupt disable bit in an interrupt control register.  */
++#define V850E_INTC_IC_MK_BIT    6
++#define V850E_INTC_IC_MK        (1 << V850E_INTC_IC_MK_BIT)
++/* Interrupt pending flag in an interrupt control register.  */
++#define V850E_INTC_IC_IF_BIT    7
++#define V850E_INTC_IC_IF        (1 << V850E_INTC_IC_IF_BIT)
++
++/* The ISPR (In-service priority register) contains one bit for each interrupt
++   priority level, which is set to one when that level is currently being
++   serviced (and thus blocking any interrupts of equal or lesser level).  */
++#define V850E_INTC_ISPR_ADDR    0xFFFFF1FA
++#define V850E_INTC_ISPR                 (*(volatile u8 *)V850E_INTC_ISPR_ADDR)
++
++
++#ifndef __ASSEMBLY__
++
++/* Enable interrupt handling for interrupt IRQ.  */
++static inline void v850e_intc_enable_irq (unsigned irq)
++{
++      __asm__ __volatile__ ("clr1 %0, [%1]"
++                            :: "r" (V850E_INTC_IMR_BIT (irq)),
++                               "r" (V850E_INTC_IMR_ADDR (irq))
++                            : "memory");
++}
++
++/* Disable interrupt handling for interrupt IRQ.  Note that any
++   interrupts received while disabled will be delivered once the
++   interrupt is enabled again, unless they are explicitly cleared using
++   `v850e_intc_clear_pending_irq'.  */
++static inline void v850e_intc_disable_irq (unsigned irq)
++{
++      __asm__ __volatile__ ("set1 %0, [%1]"
++                            :: "r" (V850E_INTC_IMR_BIT (irq)),
++                               "r" (V850E_INTC_IMR_ADDR (irq))
++                            : "memory");
++}
++
++/* Return true if interrupt handling for interrupt IRQ is enabled.  */
++static inline int v850e_intc_irq_enabled (unsigned irq)
++{
++      int rval;
++      __asm__ __volatile__ ("tst1 %1, [%2]; setf z, %0"
++                            : "=r" (rval)
++                            : "r" (V850E_INTC_IMR_BIT (irq)),
++                              "r" (V850E_INTC_IMR_ADDR (irq)));
++      return rval;
++}
++
++/* Disable irqs from 0 until LIMIT.  LIMIT must be a multiple of 8.  */
++static inline void _v850e_intc_disable_irqs (unsigned limit)
++{
++      unsigned long addr;
++      for (addr = V850E_INTC_IMR_BASE_ADDR; limit >= 8; addr++, limit -= 8)
++              *(char *)addr = 0xFF;
++}
++
++/* Disable all irqs.  This is purposely a macro, because NUM_MACH_IRQS
++   will be only be defined later.  */
++#define v850e_intc_disable_irqs()   _v850e_intc_disable_irqs (NUM_MACH_IRQS)
++
++/* Clear any pending interrupts for IRQ.  */
++static inline void v850e_intc_clear_pending_irq (unsigned irq)
++{
++      __asm__ __volatile__ ("clr1 %0, 0[%1]"
++                            :: "i" (V850E_INTC_IC_IF_BIT),
++                               "r" (V850E_INTC_IC_ADDR (irq))
++                            : "memory");
++}
++
++/* Return true if interrupt IRQ is pending (but disabled).  */
++static inline int v850e_intc_irq_pending (unsigned irq)
++{
++      int rval;
++      __asm__ __volatile__ ("tst1 %1, 0[%2]; setf nz, %0"
++                            : "=r" (rval)
++                            : "i" (V850E_INTC_IC_IF_BIT),
++                              "r" (V850E_INTC_IC_ADDR (irq)));
++      return rval;
++}
++
++
++struct v850e_intc_irq_init {
++      const char *name;       /* name of interrupt type */
++
++      /* Range of kernel irq numbers for this type:
++         BASE, BASE+INTERVAL, ..., BASE+INTERVAL*NUM  */
++      unsigned base, num, interval;
++
++      unsigned priority;      /* interrupt priority to assign */
++};
++struct hw_interrupt_type;     /* fwd decl */
++
++/* Initialize HW_IRQ_TYPES for INTC-controlled irqs described in array
++   INITS (which is terminated by an entry with the name field == 0).  */
++extern void v850e_intc_init_irq_types (struct v850e_intc_irq_init *inits,
++                                     struct hw_interrupt_type *hw_irq_types);
++
++
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_V850E_INTC_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_timer_c.h        2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,48 @@
++/*
++ * include/asm-v850/v850e_timer_c.h -- `Timer C' component often used
++ *    with the V850E cpu core
++ *
++ *  Copyright (C) 2001,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* NOTE: this include file currently contains only enough to allow us to
++   use timer C as an interrupt pass-through.  */
++
++#ifndef __V850_V850E_TIMER_C_H__
++#define __V850_V850E_TIMER_C_H__
++
++#include <asm/types.h>
++#include <asm/machdep.h>      /* Pick up chip-specific defs.  */
++
++
++/* Timer C (16-bit interval timers).  */
++
++/* Control register 0 for timer C.  */
++#define V850E_TIMER_C_TMCC0_ADDR(n) (V850E_TIMER_C_BASE_ADDR + 0x6 + 0x10 *(n))
++#define V850E_TIMER_C_TMCC0(n)          (*(volatile u8 *)V850E_TIMER_C_TMCC0_ADDR(n))
++#define V850E_TIMER_C_TMCC0_CAE         0x01 /* clock action enable */
++#define V850E_TIMER_C_TMCC0_CE          0x02 /* count enable */
++/* ... */
++
++/* Control register 1 for timer C.  */
++#define V850E_TIMER_C_TMCC1_ADDR(n) (V850E_TIMER_C_BASE_ADDR + 0x8 + 0x10 *(n))
++#define V850E_TIMER_C_TMCC1(n)          (*(volatile u8 *)V850E_TIMER_C_TMCC1_ADDR(n))
++#define V850E_TIMER_C_TMCC1_CMS0  0x01 /* capture/compare mode select (ccc0) */
++#define V850E_TIMER_C_TMCC1_CMS1  0x02 /* capture/compare mode select (ccc1) */
++/* ... */
++
++/* Interrupt edge-sensitivity control for timer C.  */
++#define V850E_TIMER_C_SESC_ADDR(n) (V850E_TIMER_C_BASE_ADDR + 0x9 + 0x10 *(n))
++#define V850E_TIMER_C_SESC(n)   (*(volatile u8 *)V850E_TIMER_C_SESC_ADDR(n))
++
++/* ...etc... */
++
++
++#endif /* __V850_V850E_TIMER_C_H__  */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_timer_d.h        2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,62 @@
++/*
++ * include/asm-v850/v850e_timer_d.h -- `Timer D' component often used
++ *    with the V850E cpu core
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_V850E_TIMER_D_H__
++#define __V850_V850E_TIMER_D_H__
++
++#include <asm/types.h>
++#include <asm/machdep.h>      /* Pick up chip-specific defs.  */
++
++
++/* Timer D (16-bit interval timers).  */
++
++/* Count registers for timer D.  */
++#define V850E_TIMER_D_TMD_ADDR(n) (V850E_TIMER_D_TMD_BASE_ADDR + 0x10 * (n))
++#define V850E_TIMER_D_TMD(n)    (*(volatile u16 *)V850E_TIMER_D_TMD_ADDR(n))
++
++/* Count compare registers for timer D.  */
++#define V850E_TIMER_D_CMD_ADDR(n) (V850E_TIMER_D_CMD_BASE_ADDR + 0x10 * (n))
++#define V850E_TIMER_D_CMD(n)    (*(volatile u16 *)V850E_TIMER_D_CMD_ADDR(n))
++
++/* Control registers for timer D.  */
++#define V850E_TIMER_D_TMCD_ADDR(n) (V850E_TIMER_D_TMCD_BASE_ADDR + 0x10 * (n))
++#define V850E_TIMER_D_TMCD(n)    (*(volatile u8 *)V850E_TIMER_D_TMCD_ADDR(n))
++/* Control bits for timer D.  */
++#define V850E_TIMER_D_TMCD_CE            0x2 /* count enable */
++#define V850E_TIMER_D_TMCD_CAE           0x1 /* clock action enable */
++/* Clock divider setting (log2).  */
++#define V850E_TIMER_D_TMCD_CS(divlog2) (((divlog2) - V850E_TIMER_D_TMCD_CS_MIN) << 4)
++/* Minimum clock divider setting (log2).  */
++#ifndef V850E_TIMER_D_TMCD_CS_MIN /* Can be overridden by mach-specific hdrs */
++#define V850E_TIMER_D_TMCD_CS_MIN  2 /* Default is correct for the v850e/ma1 */
++#endif
++/* Maximum clock divider setting (log2).  */
++#define V850E_TIMER_D_TMCD_CS_MAX  (V850E_TIMER_D_TMCD_CS_MIN + 7)
++
++/* Return the clock-divider (log2) of timer D unit N.  */
++#define V850E_TIMER_D_DIVLOG2(n) \
++  (((V850E_TIMER_D_TMCD(n) >> 4) & 0x7) + V850E_TIMER_D_TMCD_CS_MIN)
++
++
++#ifndef __ASSEMBLY__
++
++/* Start interval timer TIMER (0-3).  The timer will issue the
++   corresponding INTCMD interrupt RATE times per second.  This function
++   does not enable the interrupt.  */
++extern void v850e_timer_d_configure (unsigned timer, unsigned rate);
++
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_V850E_TIMER_D_H__  */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_uarta.h  2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,278 @@
++/*
++ * include/asm-v850/v850e_uarta.h -- original V850E on-chip UART
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* This is the original V850E UART implementation is called just `UART' in
++   the docs, but we name this header file <asm/v850e_uarta.h> because the
++   name <asm/v850e_uart.h> is used for the common driver that handles both
++   `UART' and `UARTB' implementations.  */
++
++#ifndef __V850_V850E_UARTA_H__
++#define __V850_V850E_UARTA_H__
++
++\f
++/* Raw hardware interface.  */
++
++/* The base address of the UART control registers for channel N.
++   The default is the address used on the V850E/MA1.  */
++#ifndef V850E_UART_BASE_ADDR
++#define V850E_UART_BASE_ADDR(n)               (0xFFFFFA00 + 0x10 * (n))
++#endif 
++
++/* Addresses of specific UART control registers for channel N.
++   The defaults are the addresses used on the V850E/MA1; if a platform
++   wants to redefine any of these, it must redefine them all.  */
++#ifndef V850E_UART_ASIM_ADDR
++#define V850E_UART_ASIM_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x0)
++#define V850E_UART_RXB_ADDR(n)                (V850E_UART_BASE_ADDR(n) + 0x2)
++#define V850E_UART_ASIS_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x3)
++#define V850E_UART_TXB_ADDR(n)                (V850E_UART_BASE_ADDR(n) + 0x4)
++#define V850E_UART_ASIF_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x5)
++#define V850E_UART_CKSR_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x6)
++#define V850E_UART_BRGC_ADDR(n)               (V850E_UART_BASE_ADDR(n) + 0x7)
++#endif
++
++/* UART config registers.  */
++#define V850E_UART_ASIM(n)    (*(volatile u8 *)V850E_UART_ASIM_ADDR(n))
++/* Control bits for config registers.  */
++#define V850E_UART_ASIM_CAE   0x80 /* clock enable */
++#define V850E_UART_ASIM_TXE   0x40 /* transmit enable */
++#define V850E_UART_ASIM_RXE   0x20 /* receive enable */
++#define V850E_UART_ASIM_PS_MASK       0x18 /* mask covering parity-select bits */
++#define V850E_UART_ASIM_PS_NONE       0x00 /* no parity */
++#define V850E_UART_ASIM_PS_ZERO       0x08 /* zero parity */
++#define V850E_UART_ASIM_PS_ODD        0x10 /* odd parity */
++#define V850E_UART_ASIM_PS_EVEN       0x18 /* even parity */
++#define V850E_UART_ASIM_CL_8  0x04 /* char len is 8 bits (otherwise, 7) */
++#define V850E_UART_ASIM_SL_2  0x02 /* 2 stop bits (otherwise, 1) */
++#define V850E_UART_ASIM_ISRM  0x01 /* generate INTSR interrupt on errors
++                                      (otherwise, generate INTSER) */
++
++/* UART serial interface status registers.  */
++#define V850E_UART_ASIS(n)    (*(volatile u8 *)V850E_UART_ASIS_ADDR(n))
++/* Control bits for status registers.  */
++#define V850E_UART_ASIS_PE    0x04 /* parity error */
++#define V850E_UART_ASIS_FE    0x02 /* framing error */
++#define V850E_UART_ASIS_OVE   0x01 /* overrun error */
++
++/* UART serial interface transmission status registers.  */
++#define V850E_UART_ASIF(n)    (*(volatile u8 *)V850E_UART_ASIF_ADDR(n))
++#define V850E_UART_ASIF_TXBF  0x02 /* transmit buffer flag (data in TXB) */
++#define V850E_UART_ASIF_TXSF  0x01 /* transmit shift flag (sending data) */
++
++/* UART receive buffer register.  */
++#define V850E_UART_RXB(n)     (*(volatile u8 *)V850E_UART_RXB_ADDR(n))
++
++/* UART transmit buffer register.  */
++#define V850E_UART_TXB(n)     (*(volatile u8 *)V850E_UART_TXB_ADDR(n))
++
++/* UART baud-rate generator control registers.  */
++#define V850E_UART_CKSR(n)    (*(volatile u8 *)V850E_UART_CKSR_ADDR(n))
++#define V850E_UART_CKSR_MAX   11
++#define V850E_UART_BRGC(n)    (*(volatile u8 *)V850E_UART_BRGC_ADDR(n))
++#define V850E_UART_BRGC_MIN   8
++
++
++#ifndef V850E_UART_CKSR_MAX_FREQ
++#define V850E_UART_CKSR_MAX_FREQ (25*1000*1000)
++#endif
++
++/* Calculate the minimum value for CKSR on this processor.  */
++static inline unsigned v850e_uart_cksr_min (void)
++{
++      int min = 0;
++      unsigned freq = V850E_UART_BASE_FREQ;
++      while (freq > V850E_UART_CKSR_MAX_FREQ) {
++              freq >>= 1;
++              min++;
++      }
++      return min;
++}
++
++\f
++/* Slightly abstract interface used by driver.  */
++
++
++/* Interrupts used by the UART.  */
++
++/* Received when the most recently transmitted character has been sent.  */
++#define V850E_UART_TX_IRQ(chan)               IRQ_INTST (chan)
++/* Received when a new character has been received.  */
++#define V850E_UART_RX_IRQ(chan)               IRQ_INTSR (chan)
++
++
++/* UART clock generator interface.  */
++
++/* This type encapsulates a particular uart frequency.  */
++typedef struct {
++      unsigned clk_divlog2;
++      unsigned brgen_count;
++} v850e_uart_speed_t;
++
++/* Calculate a uart speed from BAUD for this uart.  */
++static inline v850e_uart_speed_t v850e_uart_calc_speed (unsigned baud)
++{
++      v850e_uart_speed_t speed;
++
++      /* Calculate the log2 clock divider and baud-rate counter values
++         (note that the UART divides the resulting clock by 2, so
++         multiply BAUD by 2 here to compensate).  */
++      calc_counter_params (V850E_UART_BASE_FREQ, baud * 2,
++                           v850e_uart_cksr_min(),
++                           V850E_UART_CKSR_MAX, 8/*bits*/,
++                           &speed.clk_divlog2, &speed.brgen_count);
++
++      return speed;
++}
++
++/* Return the current speed of uart channel CHAN.  */
++static inline v850e_uart_speed_t v850e_uart_speed (unsigned chan)
++{
++      v850e_uart_speed_t speed;
++      speed.clk_divlog2 = V850E_UART_CKSR (chan);
++      speed.brgen_count = V850E_UART_BRGC (chan);
++      return speed;
++}
++
++/* Set the current speed of uart channel CHAN.  */
++static inline void v850e_uart_set_speed(unsigned chan,v850e_uart_speed_t speed)
++{
++      V850E_UART_CKSR (chan) = speed.clk_divlog2;
++      V850E_UART_BRGC (chan) = speed.brgen_count;
++}
++
++static inline int
++v850e_uart_speed_eq (v850e_uart_speed_t speed1, v850e_uart_speed_t speed2)
++{
++      return speed1.clk_divlog2 == speed2.clk_divlog2
++              && speed1.brgen_count == speed2.brgen_count;
++}
++
++/* Minimum baud rate possible.  */
++#define v850e_uart_min_baud() \
++   ((V850E_UART_BASE_FREQ >> V850E_UART_CKSR_MAX) / (2 * 255) + 1)
++
++/* Maximum baud rate possible.  The error is quite high at max, though.  */
++#define v850e_uart_max_baud() \
++   ((V850E_UART_BASE_FREQ >> v850e_uart_cksr_min()) / (2 *V850E_UART_BRGC_MIN))
++
++/* The `maximum' clock rate the uart can used, which is wanted (though not
++   really used in any useful way) by the serial framework.  */
++#define v850e_uart_max_clock() \
++   ((V850E_UART_BASE_FREQ >> v850e_uart_cksr_min()) / 2)
++
++
++/* UART configuration interface.  */
++
++/* Type of the uart config register; must be a scalar.  */
++typedef u16 v850e_uart_config_t;
++
++/* The uart hardware config register for channel CHAN.  */
++#define V850E_UART_CONFIG(chan)               V850E_UART_ASIM (chan)
++
++/* This config bit set if the uart is enabled.  */
++#define V850E_UART_CONFIG_ENABLED     V850E_UART_ASIM_CAE
++/* If the uart _isn't_ enabled, store this value to it to do so.  */
++#define V850E_UART_CONFIG_INIT                V850E_UART_ASIM_CAE
++/* Store this config value to disable the uart channel completely.  */
++#define V850E_UART_CONFIG_FINI                0
++
++/* Setting/clearing these bits enable/disable TX/RX, respectively (but
++   otherwise generally leave things running).  */
++#define V850E_UART_CONFIG_RX_ENABLE   V850E_UART_ASIM_RXE
++#define V850E_UART_CONFIG_TX_ENABLE   V850E_UART_ASIM_TXE
++
++/* These masks define which config bits affect TX/RX modes, respectively.  */
++#define V850E_UART_CONFIG_RX_BITS \
++  (V850E_UART_ASIM_PS_MASK | V850E_UART_ASIM_CL_8 | V850E_UART_ASIM_ISRM)
++#define V850E_UART_CONFIG_TX_BITS \
++  (V850E_UART_ASIM_PS_MASK | V850E_UART_ASIM_CL_8 | V850E_UART_ASIM_SL_2)
++
++static inline v850e_uart_config_t v850e_uart_calc_config (unsigned cflags)
++{
++      v850e_uart_config_t config = 0;
++
++      /* Figure out new configuration of control register.  */
++      if (cflags & CSTOPB)
++              /* Number of stop bits, 1 or 2.  */
++              config |= V850E_UART_ASIM_SL_2;
++      if ((cflags & CSIZE) == CS8)
++              /* Number of data bits, 7 or 8.  */
++              config |= V850E_UART_ASIM_CL_8;
++      if (! (cflags & PARENB))
++              /* No parity check/generation.  */
++              config |= V850E_UART_ASIM_PS_NONE;
++      else if (cflags & PARODD)
++              /* Odd parity check/generation.  */
++              config |= V850E_UART_ASIM_PS_ODD;
++      else
++              /* Even parity check/generation.  */
++              config |= V850E_UART_ASIM_PS_EVEN;
++      if (cflags & CREAD)
++              /* Reading enabled.  */
++              config |= V850E_UART_ASIM_RXE;
++
++      config |= V850E_UART_ASIM_CAE;
++      config |= V850E_UART_ASIM_TXE; /* Writing is always enabled.  */
++      config |= V850E_UART_ASIM_ISRM; /* Errors generate a read-irq.  */
++
++      return config;
++}
++
++/* This should delay as long as necessary for a recently written config
++   setting to settle, before we turn the uart back on.  */
++static inline void
++v850e_uart_config_delay (v850e_uart_config_t config, v850e_uart_speed_t speed)
++{
++      /* The UART may not be reset properly unless we wait at least 2
++         `basic-clocks' until turning on the TXE/RXE bits again.
++         A `basic clock' is the clock used by the baud-rate generator,
++         i.e., the cpu clock divided by the 2^new_clk_divlog2.
++         The loop takes 2 insns, so loop CYCLES / 2 times.  */
++      register unsigned count = 1 << speed.clk_divlog2;
++      while (--count != 0)
++              /* nothing */;
++}
++
++
++/* RX/TX interface.  */
++
++/* Return true if all characters awaiting transmission on uart channel N
++   have been transmitted.  */
++#define v850e_uart_xmit_done(n)                                                     \
++   (! (V850E_UART_ASIF(n) & V850E_UART_ASIF_TXBF))
++/* Wait for this to be true.  */
++#define v850e_uart_wait_for_xmit_done(n)                                    \
++   do { } while (! v850e_uart_xmit_done (n))
++
++/* Return true if uart channel N is ready to transmit a character.  */
++#define v850e_uart_xmit_ok(n)                                               \
++   (v850e_uart_xmit_done(n) && v850e_uart_cts(n))
++/* Wait for this to be true.  */
++#define v850e_uart_wait_for_xmit_ok(n)                                              \
++   do { } while (! v850e_uart_xmit_ok (n))
++
++/* Write character CH to uart channel CHAN.  */
++#define v850e_uart_putc(chan, ch)     (V850E_UART_TXB(chan) = (ch))
++
++/* Return latest character read on channel CHAN.  */
++#define v850e_uart_getc(chan)         V850E_UART_RXB (chan)
++
++/* Return bit-mask of uart error status.  */
++#define v850e_uart_err(chan)          V850E_UART_ASIS (chan)
++/* Various error bits set in the error result.  */
++#define V850E_UART_ERR_OVERRUN                V850E_UART_ASIS_OVE
++#define V850E_UART_ERR_FRAME          V850E_UART_ASIS_FE
++#define V850E_UART_ERR_PARITY         V850E_UART_ASIS_PE
++
++
++#endif /* __V850_V850E_UARTA_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_uartb.h  2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,262 @@
++/*
++ * include/asm-v850/v850e_uartb.h -- V850E on-chip `UARTB' UART
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* The V850E UARTB is basically a superset of the original V850E UART, but
++   even where it's the same, the names and details have changed a bit.
++   It's similar enough to use the same driver (v850e_uart.c), but the
++   details have been abstracted slightly to do so.  */
++
++#ifndef __V850_V850E_UARTB_H__
++#define __V850_V850E_UARTB_H__
++
++\f
++/* Raw hardware interface.  */
++
++#define V850E_UARTB_BASE_ADDR(n)      (0xFFFFFA00 + 0x10 * (n))
++
++/* Addresses of specific UART control registers for channel N.  */
++#define V850E_UARTB_CTL0_ADDR(n)      (V850E_UARTB_BASE_ADDR(n) + 0x0)
++#define V850E_UARTB_CTL2_ADDR(n)      (V850E_UARTB_BASE_ADDR(n) + 0x2)
++#define V850E_UARTB_STR_ADDR(n)               (V850E_UARTB_BASE_ADDR(n) + 0x4)
++#define V850E_UARTB_RX_ADDR(n)                (V850E_UARTB_BASE_ADDR(n) + 0x6)
++#define V850E_UARTB_RXAP_ADDR(n)      (V850E_UARTB_BASE_ADDR(n) + 0x6)
++#define V850E_UARTB_TX_ADDR(n)                (V850E_UARTB_BASE_ADDR(n) + 0x8)
++#define V850E_UARTB_FIC0_ADDR(n)      (V850E_UARTB_BASE_ADDR(n) + 0xA)
++#define V850E_UARTB_FIC1_ADDR(n)      (V850E_UARTB_BASE_ADDR(n) + 0xB)
++#define V850E_UARTB_FIC2_ADDR(n)      (V850E_UARTB_BASE_ADDR(n) + 0xC)
++#define V850E_UARTB_FIS0_ADDR(n)      (V850E_UARTB_BASE_ADDR(n) + 0xE)
++#define V850E_UARTB_FIS1_ADDR(n)      (V850E_UARTB_BASE_ADDR(n) + 0xF)
++
++/* UARTB control register 0 (general config).  */
++#define V850E_UARTB_CTL0(n)   (*(volatile u8 *)V850E_UARTB_CTL0_ADDR(n))
++/* Control bits for config registers.  */
++#define V850E_UARTB_CTL0_PWR          0x80    /* clock enable */
++#define V850E_UARTB_CTL0_TXE          0x40    /* transmit enable */
++#define V850E_UARTB_CTL0_RXE          0x20    /* receive enable */
++#define V850E_UARTB_CTL0_DIR          0x10    /*  */
++#define V850E_UARTB_CTL0_PS1          0x08    /* parity */
++#define V850E_UARTB_CTL0_PS0          0x04    /* parity */
++#define V850E_UARTB_CTL0_CL           0x02    /* char len 1:8bit, 0:7bit */
++#define V850E_UARTB_CTL0_SL           0x01    /* stop bit 1:2bit, 0:1bit */
++#define V850E_UARTB_CTL0_PS_MASK      0x0C    /* mask covering parity bits */
++#define V850E_UARTB_CTL0_PS_NONE      0x00    /* no parity */
++#define V850E_UARTB_CTL0_PS_ZERO      0x04    /* zero parity */
++#define V850E_UARTB_CTL0_PS_ODD               0x08    /* odd parity */
++#define V850E_UARTB_CTL0_PS_EVEN      0x0C    /* even parity */
++#define V850E_UARTB_CTL0_CL_8         0x02    /* char len 1:8bit, 0:7bit */
++#define V850E_UARTB_CTL0_SL_2         0x01    /* stop bit 1:2bit, 0:1bit */
++
++/* UARTB control register 2 (clock divider).  */
++#define V850E_UARTB_CTL2(n)   (*(volatile u16 *)V850E_UARTB_CTL2_ADDR(n))
++#define V850E_UARTB_CTL2_MIN  4
++#define V850E_UARTB_CTL2_MAX  0xFFFF
++
++/* UARTB serial interface status register.  */
++#define V850E_UARTB_STR(n)    (*(volatile u8 *)V850E_UARTB_STR_ADDR(n))
++/* Control bits for status registers.  */
++#define V850E_UARTB_STR_TSF   0x80    /* UBTX or FIFO exist data  */
++#define V850E_UARTB_STR_OVF   0x08    /* overflow error */
++#define V850E_UARTB_STR_PE    0x04    /* parity error */
++#define V850E_UARTB_STR_FE    0x02    /* framing error */
++#define V850E_UARTB_STR_OVE   0x01    /* overrun error */
++
++/* UARTB receive data register.  */
++#define V850E_UARTB_RX(n)     (*(volatile u8 *)V850E_UARTB_RX_ADDR(n))
++#define V850E_UARTB_RXAP(n)   (*(volatile u16 *)V850E_UARTB_RXAP_ADDR(n))
++/* Control bits for status registers.  */
++#define V850E_UARTB_RXAP_PEF  0x0200 /* parity error */
++#define V850E_UARTB_RXAP_FEF  0x0100 /* framing error */
++
++/* UARTB transmit data register.  */
++#define V850E_UARTB_TX(n)     (*(volatile u8 *)V850E_UARTB_TX_ADDR(n))
++
++/* UARTB FIFO control register 0.  */
++#define V850E_UARTB_FIC0(n)   (*(volatile u8 *)V850E_UARTB_FIC0_ADDR(n))
++
++/* UARTB FIFO control register 1.  */
++#define V850E_UARTB_FIC1(n)   (*(volatile u8 *)V850E_UARTB_FIC1_ADDR(n))
++
++/* UARTB FIFO control register 2.  */
++#define V850E_UARTB_FIC2(n)   (*(volatile u16 *)V850E_UARTB_FIC2_ADDR(n))
++
++/* UARTB FIFO status register 0.  */
++#define V850E_UARTB_FIS0(n)   (*(volatile u8 *)V850E_UARTB_FIS0_ADDR(n))
++
++/* UARTB FIFO status register 1.  */
++#define V850E_UARTB_FIS1(n)   (*(volatile u8 *)V850E_UARTB_FIS1_ADDR(n))
++
++\f
++/* Slightly abstract interface used by driver.  */
++
++
++/* Interrupts used by the UART.  */
++
++/* Received when the most recently transmitted character has been sent.  */
++#define V850E_UART_TX_IRQ(chan)               IRQ_INTUBTIT (chan)
++/* Received when a new character has been received.  */
++#define V850E_UART_RX_IRQ(chan)               IRQ_INTUBTIR (chan)
++
++/* Use by serial driver for information purposes.  */
++#define V850E_UART_BASE_ADDR(chan)    V850E_UARTB_BASE_ADDR(chan)
++
++
++/* UART clock generator interface.  */
++
++/* This type encapsulates a particular uart frequency.  */
++typedef u16 v850e_uart_speed_t;
++
++/* Calculate a uart speed from BAUD for this uart.  */
++static inline v850e_uart_speed_t v850e_uart_calc_speed (unsigned baud)
++{
++      v850e_uart_speed_t speed;
++
++      /*
++       * V850E/ME2 UARTB baud rate is determined by the value of UBCTL2
++       * fx = V850E_UARTB_BASE_FREQ = CPU_CLOCK_FREQ/4
++       * baud = fx / 2*speed   [ speed >= 4 ]
++       */
++      speed = V850E_UARTB_CTL2_MIN;
++      while (((V850E_UARTB_BASE_FREQ / 2) / speed ) > baud)
++              speed++;
++
++      return speed;
++}
++
++/* Return the current speed of uart channel CHAN.  */
++#define v850e_uart_speed(chan)                    V850E_UARTB_CTL2 (chan)
++
++/* Set the current speed of uart channel CHAN.  */
++#define v850e_uart_set_speed(chan, speed)   (V850E_UARTB_CTL2 (chan) = (speed))
++
++/* Return true if SPEED1 and SPEED2 are the same.  */
++#define v850e_uart_speed_eq(speed1, speed2) ((speed1) == (speed2))
++
++/* Minimum baud rate possible.  */
++#define v850e_uart_min_baud() \
++   ((V850E_UARTB_BASE_FREQ / 2) / V850E_UARTB_CTL2_MAX)
++
++/* Maximum baud rate possible.  The error is quite high at max, though.  */
++#define v850e_uart_max_baud() \
++   ((V850E_UARTB_BASE_FREQ / 2) / V850E_UARTB_CTL2_MIN)
++
++/* The `maximum' clock rate the uart can used, which is wanted (though not
++   really used in any useful way) by the serial framework.  */
++#define v850e_uart_max_clock() \
++   (V850E_UARTB_BASE_FREQ / 2)
++
++
++/* UART configuration interface.  */
++
++/* Type of the uart config register; must be a scalar.  */
++typedef u16 v850e_uart_config_t;
++
++/* The uart hardware config register for channel CHAN.  */
++#define V850E_UART_CONFIG(chan)               V850E_UARTB_CTL0 (chan)
++
++/* This config bit set if the uart is enabled.  */
++#define V850E_UART_CONFIG_ENABLED     V850E_UARTB_CTL0_PWR
++/* If the uart _isn't_ enabled, store this value to it to do so.  */
++#define V850E_UART_CONFIG_INIT                V850E_UARTB_CTL0_PWR
++/* Store this config value to disable the uart channel completely.  */
++#define V850E_UART_CONFIG_FINI                0
++
++/* Setting/clearing these bits enable/disable TX/RX, respectively (but
++   otherwise generally leave things running).  */
++#define V850E_UART_CONFIG_RX_ENABLE   V850E_UARTB_CTL0_RXE
++#define V850E_UART_CONFIG_TX_ENABLE   V850E_UARTB_CTL0_TXE
++
++/* These masks define which config bits affect TX/RX modes, respectively.  */
++#define V850E_UART_CONFIG_RX_BITS \
++  (V850E_UARTB_CTL0_PS_MASK | V850E_UARTB_CTL0_CL_8)
++#define V850E_UART_CONFIG_TX_BITS \
++  (V850E_UARTB_CTL0_PS_MASK | V850E_UARTB_CTL0_CL_8 | V850E_UARTB_CTL0_SL_2)
++
++static inline v850e_uart_config_t v850e_uart_calc_config (unsigned cflags)
++{
++      v850e_uart_config_t config = 0;
++
++      /* Figure out new configuration of control register.  */
++      if (cflags & CSTOPB)
++              /* Number of stop bits, 1 or 2.  */
++              config |= V850E_UARTB_CTL0_SL_2;
++      if ((cflags & CSIZE) == CS8)
++              /* Number of data bits, 7 or 8.  */
++              config |= V850E_UARTB_CTL0_CL_8;
++      if (! (cflags & PARENB))
++              /* No parity check/generation.  */
++              config |= V850E_UARTB_CTL0_PS_NONE;
++      else if (cflags & PARODD)
++              /* Odd parity check/generation.  */
++              config |= V850E_UARTB_CTL0_PS_ODD;
++      else
++              /* Even parity check/generation.  */
++              config |= V850E_UARTB_CTL0_PS_EVEN;
++      if (cflags & CREAD)
++              /* Reading enabled.  */
++              config |= V850E_UARTB_CTL0_RXE;
++
++      config |= V850E_UARTB_CTL0_PWR;
++      config |= V850E_UARTB_CTL0_TXE; /* Writing is always enabled.  */
++      config |= V850E_UARTB_CTL0_DIR; /* LSB first.  */
++
++      return config;
++}
++
++/* This should delay as long as necessary for a recently written config
++   setting to settle, before we turn the uart back on.  */
++static inline void
++v850e_uart_config_delay (v850e_uart_config_t config, v850e_uart_speed_t speed)
++{
++      /* The UART may not be reset properly unless we wait at least 2
++         `basic-clocks' until turning on the TXE/RXE bits again.
++         A `basic clock' is the clock used by the baud-rate generator,
++         i.e., the cpu clock divided by the 2^new_clk_divlog2.
++         The loop takes 2 insns, so loop CYCLES / 2 times.  */
++      register unsigned count = 1 << speed;
++      while (--count != 0)
++              /* nothing */;
++}
++
++
++/* RX/TX interface.  */
++
++/* Return true if all characters awaiting transmission on uart channel N
++   have been transmitted.  */
++#define v850e_uart_xmit_done(n)                                                     \
++   (! (V850E_UARTB_STR(n) & V850E_UARTB_STR_TSF))
++/* Wait for this to be true.  */
++#define v850e_uart_wait_for_xmit_done(n)                                    \
++   do { } while (! v850e_uart_xmit_done (n))
++
++/* Return true if uart channel N is ready to transmit a character.  */
++#define v850e_uart_xmit_ok(n)                                               \
++   (v850e_uart_xmit_done(n) && v850e_uart_cts(n))
++/* Wait for this to be true.  */
++#define v850e_uart_wait_for_xmit_ok(n)                                              \
++   do { } while (! v850e_uart_xmit_ok (n))
++
++/* Write character CH to uart channel CHAN.  */
++#define v850e_uart_putc(chan, ch)     (V850E_UARTB_TX(chan) = (ch))
++
++/* Return latest character read on channel CHAN.  */
++#define v850e_uart_getc(chan)         V850E_UARTB_RX (chan)
++
++/* Return bit-mask of uart error status.  */
++#define v850e_uart_err(chan)          V850E_UARTB_STR (chan)
++/* Various error bits set in the error result.  */
++#define V850E_UART_ERR_OVERRUN                V850E_UARTB_STR_OVE
++#define V850E_UART_ERR_FRAME          V850E_UARTB_STR_FE
++#define V850E_UART_ERR_PARITY         V850E_UARTB_STR_PE
++
++
++#endif /* __V850_V850E_UARTB_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_uart.h   2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,77 @@
++/*
++ * include/asm-v850/v850e_uart.h -- common V850E on-chip UART driver
++ *
++ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++/* There's not actually a single UART implementation used by V850E CPUs,
++   but rather a series of implementations that are all `close' to one
++   another.  This file corresponds to the single driver which handles all
++   of them.  */
++
++#ifndef __V850_V850E_UART_H__
++#define __V850_V850E_UART_H__
++
++#include <linux/config.h>
++#include <linux/termios.h>
++
++#include <asm/v850e_utils.h>
++#include <asm/types.h>
++#include <asm/machdep.h>      /* Pick up chip-specific defs.  */
++
++
++/* Include model-specific definitions.  */
++#ifdef CONFIG_V850E_UART
++# ifdef CONFIG_V850E_UARTB
++#  include <asm-v850/v850e_uartb.h>
++# else
++#  include <asm-v850/v850e_uarta.h> /* original V850E UART */
++# endif
++#endif
++
++
++/* Optional capabilities some hardware provides.  */
++
++/* This UART doesn't implement RTS/CTS by default, but some platforms
++   implement them externally, so check to see if <asm/machdep.h> defined
++   anything.  */
++#ifdef V850E_UART_CTS
++#define v850e_uart_cts(n)             V850E_UART_CTS(n)
++#else
++#define v850e_uart_cts(n)             (1)
++#endif
++
++/* Do the same for RTS.  */
++#ifdef V850E_UART_SET_RTS
++#define v850e_uart_set_rts(n,v)               V850E_UART_SET_RTS(n,v)
++#else
++#define v850e_uart_set_rts(n,v)               ((void)0)
++#endif
++
++
++/* This is the serial channel to use for the boot console (if desired).  */
++#ifndef V850E_UART_CONSOLE_CHANNEL
++# define V850E_UART_CONSOLE_CHANNEL 0
++#endif
++
++
++#ifndef __ASSEMBLY__
++
++/* Setup a console using channel 0 of the builtin uart.  */
++extern void v850e_uart_cons_init (unsigned chan);
++
++/* Configure and turn on uart channel CHAN, using the termios `control
++   modes' bits in CFLAGS, and a baud-rate of BAUD.  */
++void v850e_uart_configure (unsigned chan, unsigned cflags, unsigned baud);
++
++#endif /* !__ASSEMBLY__ */
++
++
++#endif /* __V850_V850E_UART_H__ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/asm-v850/v850e_utils.h  2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,35 @@
++/*
++ * include/asm-v850/v850e_utils.h -- Utility functions associated with
++ *    V850E CPUs
++ *
++ *  Copyright (C) 2001,03  NEC Electronics Corporation
++ *  Copyright (C) 2001,03  Miles Bader <miles@gnu.org>
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License.  See the file COPYING in the main directory of this
++ * archive for more details.
++ *
++ * Written by Miles Bader <miles@gnu.org>
++ */
++
++#ifndef __V850_V850E_UTILS_H__
++#define __V850_V850E_UTILS_H__
++
++/* Calculate counter clock-divider and count values to attain the
++   desired frequency RATE from the base frequency BASE_FREQ.  The
++   counter is expected to have a clock-divider, which can divide the
++   system cpu clock by a power of two value from MIN_DIVLOG2 to
++   MAX_DIV_LOG2, and a word-size of COUNTER_SIZE bits (the counter
++   counts up and resets whenever it's equal to the compare register,
++   generating an interrupt or whatever when it does so).  The returned
++   values are: *DIVLOG2 -- log2 of the desired clock divider and *COUNT
++   -- the counter compare value to use.  Returns true if it was possible
++   to find a reasonable value, otherwise false (and the other return
++   values will be set to be as good as possible).  */
++extern int calc_counter_params (unsigned long base_freq,
++                              unsigned long rate,
++                              unsigned min_divlog2, unsigned max_divlog2,
++                              unsigned counter_size,
++                              unsigned *divlog2, unsigned *count);
++
++#endif /* __V850_V850E_UTILS_H__ */
+--- linux-2.6.0-test1/include/asm-x86_64/bitops.h      2003-06-14 12:18:08.000000000 -0700
++++ 25/include/asm-x86_64/bitops.h     2003-07-19 17:04:07.000000000 -0700
+@@ -477,6 +477,7 @@ static __inline__ int ffs(int x)
+  * The Hamming Weight of a number is the total number of bits set in it.
+  */
++#define hweight64(x) generic_hweight64(x)
+ #define hweight32(x) generic_hweight32(x)
+ #define hweight16(x) generic_hweight16(x)
+ #define hweight8(x) generic_hweight8(x)
+--- linux-2.6.0-test1/include/asm-x86_64/mpspec.h      2003-06-14 12:18:09.000000000 -0700
++++ 25/include/asm-x86_64/mpspec.h     2003-07-19 17:04:07.000000000 -0700
+@@ -171,7 +171,7 @@ extern int quad_local_to_mp_bus_id [NR_C
+ extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES];
+ extern unsigned int boot_cpu_physical_apicid;
+-extern unsigned long phys_cpu_present_map;
++extern cpumask_t phys_cpu_present_map;
+ extern int smp_found_config;
+ extern void find_smp_config (void);
+ extern void get_smp_config (void);
+--- linux-2.6.0-test1/include/asm-x86_64/pgalloc.h     2003-06-14 12:18:22.000000000 -0700
++++ 25/include/asm-x86_64/pgalloc.h    2003-07-19 17:07:16.000000000 -0700
+@@ -10,7 +10,7 @@
+ #define pmd_populate_kernel(mm, pmd, pte) \
+               set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte)))
+ #define pgd_populate(mm, pgd, pmd) \
+-              set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pmd)))
++              set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(page_address(pmd))))
+ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte)
+ {
+@@ -22,18 +22,25 @@ extern __inline__ pmd_t *get_pmd(void)
+       return (pmd_t *)get_zeroed_page(GFP_KERNEL);
+ }
+-extern __inline__ void pmd_free(pmd_t *pmd)
++extern __inline__ void pmd_free(struct page *pmd)
+ {
+-      if ((unsigned long)pmd & (PAGE_SIZE-1)) 
+-              BUG(); 
+-      free_page((unsigned long)pmd);
++      __free_page(pmd);
+ }
+-static inline pmd_t *pmd_alloc_one (struct mm_struct *mm, unsigned long addr)
++static inline pmd_t *pmd_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
+ {
+       return (pmd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
+ }
++static inline struct page *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
++{
++      pmd_t *pmd = pmd_alloc_one_kernel(mm, addr);
++      if (pmd)
++              return virt_to_page(pmd);
++      else
++              return NULL;
++}
++
+ static inline pgd_t *pgd_alloc (struct mm_struct *mm)
+ {
+       return (pgd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
+--- linux-2.6.0-test1/include/asm-x86_64/pgtable.h     2003-07-02 14:53:18.000000000 -0700
++++ 25/include/asm-x86_64/pgtable.h    2003-07-19 17:07:16.000000000 -0700
+@@ -98,8 +98,9 @@ static inline void set_pml4(pml4_t *dst,
+       pml4_val(*dst) = pml4_val(val); 
+ }
+-#define pgd_page(pgd) \
++#define __pgd_page(pgd) \
+ ((unsigned long) __va(pgd_val(pgd) & PHYSICAL_PAGE_MASK))
++#define pgd_page(pgd)         virt_to_page(__pgd_page(pgd))
+ #define ptep_get_and_clear(xp)        __pte(xchg(&(xp)->pte, 0))
+ #define pte_same(a, b)                ((a).pte == (b).pte)
+@@ -332,8 +333,13 @@ static inline pgd_t *current_pgd_offset_
+ #define pmd_page(pmd)         (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
+ #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
+-#define pmd_offset(dir, address) ((pmd_t *) pgd_page(*(dir)) + \
++#define pmd_offset(dir, address) ((pmd_t *)__pgd_page(*(dir)) + \
+                       pmd_index(address))
++#define pmd_offset_kernel(pgd, addr)                  pmd_offset(pgd, addr)
++#define pmd_offset_map(pgd, addr)                     pmd_offset(pgd, addr)
++#define pmd_offset_map_nested(pgd, addr)              pmd_offset(pgd, addr)
++#define pmd_unmap(pmd)                                        do { } while (0)
++#define pmd_unmap_nested(pmd)                         do { } while (0)
+ #define pmd_none(x)   (!pmd_val(x))
+ #define pmd_present(x)        (pmd_val(x) & _PAGE_PRESENT)
+ #define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0)
+--- linux-2.6.0-test1/include/asm-x86_64/posix_types.h 2003-06-14 12:18:48.000000000 -0700
++++ 25/include/asm-x86_64/posix_types.h        2003-07-19 17:06:39.000000000 -0700
+@@ -7,7 +7,9 @@
+  * assume GCC is being used.
+  */
++#ifdef __GNUC__
+ typedef unsigned long __kernel_dev_t;
++#endif
+ typedef unsigned long __kernel_ino_t;
+ typedef unsigned int  __kernel_mode_t;
+ typedef unsigned long __kernel_nlink_t;
+--- linux-2.6.0-test1/include/asm-x86_64/smp.h 2003-06-22 12:04:45.000000000 -0700
++++ 25/include/asm-x86_64/smp.h        2003-07-19 17:04:07.000000000 -0700
+@@ -7,6 +7,7 @@
+ #ifndef __ASSEMBLY__
+ #include <linux/config.h>
+ #include <linux/threads.h>
++#include <linux/cpumask.h>
+ #include <linux/bitops.h>
+ extern int disable_apic;
+ #endif
+@@ -35,8 +36,8 @@ struct pt_regs;
+  */
+  
+ extern void smp_alloc_memory(void);
+-extern unsigned long phys_cpu_present_map;
+-extern unsigned long cpu_online_map;
++extern cpumask_t phys_cpu_present_map;
++extern cpumask_t cpu_online_map;
+ extern volatile unsigned long smp_invalidate_needed;
+ extern int pic_mode;
+ extern void smp_flush_tlb(void);
+@@ -56,35 +57,17 @@ void smp_stop_cpu(void);
+  * compresses data structures.
+  */
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+-#define cpu_possible(cpu) (cpu_callout_map & (1<<(cpu)))
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
+-
+-#define for_each_cpu(cpu, mask) \
+-      for(mask = cpu_online_map; \
+-          cpu = __ffs(mask), mask != 0; \
+-          mask &= ~(1UL<<cpu))
+-
+-extern inline unsigned int any_online_cpu(unsigned int mask)
+-{
+-      if (mask & cpu_online_map)
+-              return __ffs(mask & cpu_online_map);
+-
+-      return NR_CPUS; 
+-} 
+-
+-extern inline unsigned int num_online_cpus(void)
+-{ 
+-      return hweight32(cpu_online_map);
+-} 
++#define cpu_possible(cpu) cpu_isset(cpu, cpu_callout_map)
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ static inline int num_booting_cpus(void)
+ {
+-      return hweight32(cpu_callout_map);
++      return cpus_weight(cpu_callout_map);
+ }
+-extern volatile unsigned long cpu_callout_map;
++extern cpumask_t cpu_callout_map;
+ #define smp_processor_id() read_pda(cpunumber)
+@@ -104,7 +87,7 @@ extern inline int safe_smp_processor_id(
+               return hard_smp_processor_id();
+ } 
+-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
++#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+ #endif /* !ASSEMBLY */
+ #define NO_PROC_ID            0xFF            /* No processor magic marker */
+@@ -117,7 +100,6 @@ extern inline int safe_smp_processor_id(
+ #ifndef CONFIG_SMP
+ #define stack_smp_processor_id() 0
+ #define safe_smp_processor_id() 0
+-#define for_each_cpu(x) (x)=0;
+ #define cpu_logical_map(x) (x)
+ #else
+ #include <asm/thread_info.h>
+--- linux-2.6.0-test1/include/asm-x86_64/topology.h    2003-06-14 12:18:25.000000000 -0700
++++ 25/include/asm-x86_64/topology.h   2003-07-19 17:04:07.000000000 -0700
+@@ -8,13 +8,13 @@
+ /* Map the K8 CPU local memory controllers to a simple 1:1 CPU:NODE topology */
+ extern int fake_node;
+-extern unsigned long cpu_online_map;
++extern cpumask_t cpu_online_map;
+ #define cpu_to_node(cpu)              (fake_node ? 0 : (cpu))
+ #define memblk_to_node(memblk)        (fake_node ? 0 : (memblk))
+ #define parent_node(node)             (node)
+ #define node_to_first_cpu(node)       (fake_node ? 0 : (node))
+-#define node_to_cpu_mask(node)        (fake_node ? cpu_online_map : (1UL << (node)))
++#define node_to_cpu_mask(node)        (fake_node ? cpu_online_map : cpumask_of_cpu(node))
+ #define node_to_memblk(node)          (node)
+ #define NODE_BALANCE_RATE 30  /* CHECKME */ 
+--- linux-2.6.0-test1/include/linux/aio.h      2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/aio.h     2003-07-19 17:07:03.000000000 -0700
+@@ -54,7 +54,7 @@ struct kiocb {
+       struct file             *ki_filp;
+       struct kioctx           *ki_ctx;        /* may be NULL for sync ops */
+       int                     (*ki_cancel)(struct kiocb *, struct io_event *);
+-      long                    (*ki_retry)(struct kiocb *);
++      ssize_t                 (*ki_retry)(struct kiocb *);
+       struct list_head        ki_list;        /* the aio core uses this
+                                                * for cancellation */
+@@ -63,6 +63,16 @@ struct kiocb {
+       __u64                   ki_user_data;   /* user's data for completion */
+       loff_t                  ki_pos;
++      /* State that we remember to be able to restart/retry  */
++      unsigned short          ki_opcode;
++      size_t                  ki_nbytes;      /* copy of iocb->aio_nbytes */
++      char                    *ki_buf;        /* remaining iocb->aio_buf */
++      size_t                  ki_left;        /* remaining bytes */
++      wait_queue_t            ki_wait;
++      long                    ki_retried;     /* just for testing */
++      long                    ki_kicked;      /* just for testing */
++      long                    ki_queued;      /* just for testing */
++
+       char                    private[KIOCB_PRIVATE_SIZE];
+ };
+@@ -77,6 +87,8 @@ struct kiocb {
+               (x)->ki_ctx = &tsk->active_mm->default_kioctx;  \
+               (x)->ki_cancel = NULL;                  \
+               (x)->ki_user_obj = tsk;                 \
++              (x)->ki_user_data = 0;                  \
++              init_wait((&(x)->ki_wait));             \
+       } while (0)
+ #define AIO_RING_MAGIC                        0xa10a10a1
+@@ -159,6 +171,17 @@ int FASTCALL(io_submit_one(struct kioctx
+ #define get_ioctx(kioctx)     do { if (unlikely(atomic_read(&(kioctx)->users) <= 0)) BUG(); atomic_inc(&(kioctx)->users); } while (0)
+ #define put_ioctx(kioctx)     do { if (unlikely(atomic_dec_and_test(&(kioctx)->users))) __put_ioctx(kioctx); else if (unlikely(atomic_read(&(kioctx)->users) < 0)) BUG(); } while (0)
++#define in_aio() !is_sync_wait(current->io_wait)
++/* may be used for debugging */
++#define warn_if_async()       if (in_aio()) {\
++      printk(KERN_ERR "%s(%s:%d) called in async context!\n", \
++      __FUNCTION__, __FILE__, __LINE__); \
++      dump_stack(); \
++      }
++
++#define io_wait_to_kiocb(wait) container_of(wait, struct kiocb, ki_wait)
++#define is_retried_kiocb(iocb) ((iocb)->ki_retried > 1)
++
+ #include <linux/aio_abi.h>
+ static inline struct kiocb *list_kiocb(struct list_head *h)
+--- linux-2.6.0-test1/include/linux/atmdev.h   2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/atmdev.h  2003-07-19 17:03:51.000000000 -0700
+@@ -252,6 +252,7 @@ enum {
+       ATM_VF_SESSION,         /* VCC is p2mp session control descriptor */
+       ATM_VF_HASSAP,          /* SAP has been set */
+       ATM_VF_CLOSE,           /* asynchronous close - treat like VF_RELEASED*/
++      ATM_VF_WAITING,         /* waiting for reply from sigd */
+ };
+@@ -291,14 +292,11 @@ struct atm_vcc {
+       void            *dev_data;      /* per-device data */
+       void            *proto_data;    /* per-protocol data */
+       struct k_atm_aal_stats *stats;  /* pointer to AAL stats group */
+-      wait_queue_head_t sleep;        /* if socket is busy */
+       struct sock     *sk;            /* socket backpointer */
+       /* SVC part --- may move later ------------------------------------- */
+       short           itf;            /* interface number */
+       struct sockaddr_atmsvc local;
+       struct sockaddr_atmsvc remote;
+-      void (*callback)(struct atm_vcc *vcc);
+-      int             reply;          /* also used by ATMTCP */
+       /* Multipoint part ------------------------------------------------- */
+       struct atm_vcc  *session;       /* session VCC descriptor */
+       /* Other stuff ----------------------------------------------------- */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/bitmap.h  2003-07-19 17:04:13.000000000 -0700
+@@ -0,0 +1,159 @@
++#ifndef __LINUX_BITMAP_H
++#define __LINUX_BITMAP_H
++
++#ifndef __ASSEMBLY__
++
++#include <linux/config.h>
++#include <linux/compiler.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/bitops.h>
++#include <linux/string.h>
++
++static inline int bitmap_empty(const unsigned long *bitmap, int bits)
++{
++      int k, lim = bits/BITS_PER_LONG;
++      for (k = 0; k < lim; ++k)
++              if (bitmap[k])
++                      return 0;
++
++      if (bits % BITS_PER_LONG)
++              if (bitmap[k] & ((1UL << (bits % BITS_PER_LONG)) - 1))
++                      return 0;
++
++      return 1;
++}
++
++static inline int bitmap_full(const unsigned long *bitmap, int bits)
++{
++      int k, lim = bits/BITS_PER_LONG;
++      for (k = 0; k < lim; ++k)
++              if (~bitmap[k])
++                      return 0;
++
++      if (bits % BITS_PER_LONG)
++              if (~bitmap[k] & ((1UL << (bits % BITS_PER_LONG)) - 1))
++                      return 0;
++
++      return 1;
++}
++
++static inline int bitmap_equal(const unsigned long *bitmap1,
++                              unsigned long *bitmap2, int bits)
++{
++      int k, lim = bits/BITS_PER_LONG;;
++      for (k = 0; k < lim; ++k)
++              if (bitmap1[k] != bitmap2[k])
++                      return 0;
++
++      if (bits % BITS_PER_LONG)
++              if ((bitmap1[k] ^ bitmap2[k]) &
++                              ((1UL << (bits % BITS_PER_LONG)) - 1))
++                      return 0;
++
++      return 1;
++}
++
++static inline void bitmap_complement(unsigned long *bitmap, int bits)
++{
++      int k;
++
++      for (k = 0; k < BITS_TO_LONGS(bits); ++k)
++              bitmap[k] = ~bitmap[k];
++}
++
++static inline void bitmap_clear(unsigned long *bitmap, int bits)
++{
++      CLEAR_BITMAP((unsigned long *)bitmap, bits);
++}
++
++static inline void bitmap_fill(unsigned long *bitmap, int bits)
++{
++      memset(bitmap, 0xff, BITS_TO_LONGS(bits)*sizeof(unsigned long));
++}
++
++static inline void bitmap_copy(unsigned long *dst,
++                      const unsigned long *src, int bits)
++{
++      memcpy(dst, src, BITS_TO_LONGS(bits)*sizeof(unsigned long));
++}
++
++static inline void bitmap_shift_right(unsigned long *dst,
++                              const unsigned long *src, int shift, int bits)
++{
++      int k;
++      DECLARE_BITMAP(__shr_tmp, bits);
++
++      bitmap_clear(__shr_tmp, bits);
++      for (k = 0; k < bits - shift; ++k)
++              if (test_bit(k + shift, src))
++                      set_bit(k, __shr_tmp);
++      bitmap_copy(dst, __shr_tmp, bits);
++}
++
++static inline void bitmap_shift_left(unsigned long *dst,
++                              const unsigned long *src, int shift, int bits)
++{
++      int k;
++      DECLARE_BITMAP(__shl_tmp, bits);
++
++      bitmap_clear(__shl_tmp, bits);
++      for (k = bits; k >= shift; --k)
++              if (test_bit(k - shift, src))
++                      set_bit(k, __shl_tmp);
++      bitmap_copy(dst, __shl_tmp, bits);
++}
++
++static inline void bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
++                              const unsigned long *bitmap2, int bits)
++{
++      int k;
++      int nr = BITS_TO_LONGS(bits);
++
++      for (k = 0; k < nr; k++)
++              dst[k] = bitmap1[k] & bitmap2[k];
++}
++
++static inline void bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
++                              const unsigned long *bitmap2, int bits)
++{
++      int k;
++      int nr = BITS_TO_LONGS(bits);
++
++      for (k = 0; k < nr; k++)
++              dst[k] = bitmap1[k] | bitmap2[k];
++}
++
++#if BITS_PER_LONG == 32
++static inline int bitmap_weight(const unsigned long *bitmap, int bits)
++{
++      int k, w = 0, lim = bits/BITS_PER_LONG;
++
++      for (k = 0; k < lim; k++)
++              w += hweight32(bitmap[k]);
++
++      if (bits % BITS_PER_LONG)
++              w += hweight32(bitmap[k] &
++                              ((1UL << (bits % BITS_PER_LONG)) - 1));
++
++      return w;
++}
++#else
++static inline int bitmap_weight(const unsigned long *bitmap, int bits)
++{
++      int k, w = 0, lim = bits/BITS_PER_LONG;
++
++      for (k = 0; k < lim; k++)
++              w += hweight64(bitmap[k]);
++
++      if (bits % BITS_PER_LONG)
++              w += hweight64(bitmap[k] &
++                              ((1UL << (bits % BITS_PER_LONG)) - 1));
++
++      return w;
++}
++#endif
++
++#endif /* __ASSEMBLY__ */
++
++#endif /* __LINUX_BITMAP_H */
+--- linux-2.6.0-test1/include/linux/blkdev.h   2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/blkdev.h  2003-07-19 17:06:49.000000000 -0700
+@@ -44,9 +44,9 @@ struct as_io_context {
+       unsigned long ttime_samples;
+       unsigned long ttime_mean;
+       /* Layout pattern */
+-      long seek_samples;
++      unsigned int seek_samples;
+       sector_t last_request_pos;
+-      sector_t seek_total;
++      u64 seek_total;
+       sector_t seek_mean;
+ };
+@@ -491,6 +491,7 @@ extern void __blk_attempt_remerge(reques
+ extern struct request *blk_get_request(request_queue_t *, int, int);
+ extern void blk_put_request(struct request *);
+ extern void blk_insert_request(request_queue_t *, struct request *, int, void *);
++extern void blk_requeue_request(request_queue_t *, struct request *);
+ extern void blk_plug_device(request_queue_t *);
+ extern int blk_remove_plug(request_queue_t *);
+ extern void blk_recount_segments(request_queue_t *, struct bio *);
+@@ -549,6 +550,7 @@ extern void blk_queue_max_phys_segments(
+ extern void blk_queue_max_hw_segments(request_queue_t *, unsigned short);
+ extern void blk_queue_max_segment_size(request_queue_t *, unsigned int);
+ extern void blk_queue_hardsect_size(request_queue_t *, unsigned short);
++extern void blk_queue_stack_limits(request_queue_t *t, request_queue_t *b);
+ extern void blk_queue_segment_boundary(request_queue_t *, unsigned long);
+ extern void blk_queue_prep_rq(request_queue_t *, prep_rq_fn *pfn);
+ extern void blk_queue_merge_bvec(request_queue_t *, merge_bvec_fn *);
+@@ -574,6 +576,7 @@ extern void blk_queue_free_tags(request_
+ extern int blk_queue_resize_tags(request_queue_t *, int);
+ extern void blk_queue_invalidate_tags(request_queue_t *);
+ extern void blk_congestion_wait(int rw, long timeout);
++extern int blk_congestion_wait_wq(int rw, long timeout, wait_queue_t *wait);
+ extern void blk_rq_bio_prep(request_queue_t *, struct request *, struct bio *);
+ extern void blk_rq_prep_restart(struct request *);
+--- linux-2.6.0-test1/include/linux/blk.h      2003-06-14 12:18:30.000000000 -0700
++++ 25/include/linux/blk.h     2003-07-19 17:03:51.000000000 -0700
+@@ -1,2 +1,2 @@
+-/* this file is obsolete, please use <linux/blkdev.h> instead */
++#warning this file is obsolete, please use <linux/blkdev.h> instead
+ #include <linux/blkdev.h>
+--- linux-2.6.0-test1/include/linux/buffer_head.h      2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/buffer_head.h     2003-07-19 17:07:00.000000000 -0700
+@@ -158,6 +158,7 @@ void mark_buffer_async_write(struct buff
+ void invalidate_bdev(struct block_device *, int);
+ int sync_blockdev(struct block_device *bdev);
+ void __wait_on_buffer(struct buffer_head *);
++int __wait_on_buffer_wq(struct buffer_head *, wait_queue_t *wait);
+ wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
+ void wake_up_buffer(struct buffer_head *bh);
+ int fsync_bdev(struct block_device *);
+@@ -169,6 +170,8 @@ void __brelse(struct buffer_head *);
+ void __bforget(struct buffer_head *);
+ void __breadahead(struct block_device *, sector_t block, int size);
+ struct buffer_head *__bread(struct block_device *, sector_t block, int size);
++struct buffer_head *__bread_wq(struct block_device *, sector_t block,
++      int size, wait_queue_t *wait);
+ struct buffer_head *alloc_buffer_head(int gfp_flags);
+ void free_buffer_head(struct buffer_head * bh);
+ void FASTCALL(unlock_buffer(struct buffer_head *bh));
+@@ -203,11 +206,6 @@ int nobh_prepare_write(struct page*, uns
+ int nobh_commit_write(struct file *, struct page *, unsigned, unsigned);
+ int nobh_truncate_page(struct address_space *, loff_t);
+-#define OSYNC_METADATA        (1<<0)
+-#define OSYNC_DATA    (1<<1)
+-#define OSYNC_INODE   (1<<2)
+-int generic_osync_inode(struct inode *, int);
+-
+ /*
+  * inline definitions
+@@ -226,13 +224,13 @@ static inline void put_bh(struct buffer_
+ static inline void brelse(struct buffer_head *bh)
+ {
+-      if (bh)
++      if (bh && !IS_ERR(bh))
+               __brelse(bh);
+ }
+ static inline void bforget(struct buffer_head *bh)
+ {
+-      if (bh)
++      if (bh && !IS_ERR(bh))
+               __bforget(bh);
+ }
+@@ -249,7 +247,12 @@ sb_breadahead(struct super_block *sb, se
+ }
+ static inline struct buffer_head *
+-sb_getblk(struct super_block *sb, sector_t block)
++sb_bread_wq(struct super_block *sb, sector_t block, wait_queue_t *wait)
++{
++      return __bread_wq(sb->s_bdev, block, sb->s_blocksize, wait);
++}
++
++static inline struct buffer_head *sb_getblk(struct super_block *sb, sector_t block)
+ {
+       return __getblk(sb->s_bdev, block, sb->s_blocksize);
+ }
+@@ -273,16 +276,34 @@ map_bh(struct buffer_head *bh, struct su
+  * __wait_on_buffer() just to trip a debug check.  Because debug code in inline
+  * functions is bloaty.
+  */
+-static inline void wait_on_buffer(struct buffer_head *bh)
++
++static inline int wait_on_buffer_wq(struct buffer_head *bh, wait_queue_t *wait)
+ {
+       if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
+-              __wait_on_buffer(bh);
++              return __wait_on_buffer_wq(bh, wait);
++
++      return 0;
++}
++
++static inline void wait_on_buffer(struct buffer_head *bh)
++{
++      wait_on_buffer_wq(bh, NULL);
++}
++
++static inline int lock_buffer_wq(struct buffer_head *bh, wait_queue_t *wait)
++{
++      while (test_set_buffer_locked(bh)) {
++              int ret = __wait_on_buffer_wq(bh, wait);
++              if (ret)
++                      return ret;
++      }
++
++      return 0;
+ }
+ static inline void lock_buffer(struct buffer_head *bh)
+ {
+-      while (test_set_buffer_locked(bh))
+-              __wait_on_buffer(bh);
++      lock_buffer_wq(bh, NULL);
+ }
+ #endif /* _LINUX_BUFFER_HEAD_H */
+--- linux-2.6.0-test1/include/linux/compiler.h 2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/compiler.h        2003-07-19 17:04:50.000000000 -0700
+@@ -78,6 +78,6 @@
+    shouldn't recognize the original var, and make assumptions about it */
+ #define RELOC_HIDE(ptr, off)                                  \
+   ({ unsigned long __ptr;                                     \
+-    __asm__ ("" : "=g"(__ptr) : "0"(ptr));            \
++    __asm__ ("" : "=r"(__ptr) : "0"(ptr));            \
+     (typeof(ptr)) (__ptr + (off)); })
+ #endif /* __LINUX_COMPILER_H */
+--- linux-2.6.0-test1/include/linux/config.h   2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/config.h  2003-07-19 17:04:53.000000000 -0700
+@@ -2,5 +2,8 @@
+ #define _LINUX_CONFIG_H
+ #include <linux/autoconf.h>
++#if defined(__i386__) && !defined(IN_BOOTLOADER)
++#include <asm/kgdb.h>
++#endif
+ #endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/cpumask.h 2003-07-19 17:04:07.000000000 -0700
+@@ -0,0 +1,62 @@
++#ifndef __LINUX_CPUMASK_H
++#define __LINUX_CPUMASK_H
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/threads.h>
++#include <linux/types.h>
++#include <linux/bitmap.h>
++
++#define CPU_ARRAY_SIZE                BITS_TO_LONGS(NR_CPUS)
++
++struct cpumask
++{
++      unsigned long mask[CPU_ARRAY_SIZE];
++};
++
++typedef struct cpumask cpumask_t;
++
++#ifdef CONFIG_SMP
++#include <asm-generic/cpumask_array.h>
++#else
++#include <asm-generic/cpumask_up.h>
++#endif
++
++#if NR_CPUS <= 4*BITS_PER_LONG
++#include <asm-generic/cpumask_const_value.h>
++#else
++#include <asm-generic/cpumask_const_reference.h>
++#endif
++
++
++#ifdef CONFIG_SMP
++
++extern cpumask_t cpu_online_map;
++
++#define num_online_cpus()             cpus_weight(cpu_online_map)
++#define cpu_online(cpu)                       cpu_isset(cpu, cpu_online_map)
++#else
++#define       cpu_online_map                  cpumask_of_cpu(0)
++#define num_online_cpus()             1
++#define cpu_online(cpu)                       ({ BUG_ON((cpu) != 0); 1; })
++#endif
++
++static inline int next_online_cpu(int cpu, cpumask_t map)
++{
++      do
++              cpu = next_cpu_const(cpu, map);
++      while (cpu < NR_CPUS && !cpu_online(cpu));
++      return cpu;
++}
++
++#define for_each_cpu(cpu, map)                                                \
++      for (cpu = first_cpu_const(map);                                \
++              cpu < NR_CPUS;                                          \
++              cpu = next_cpu_const(cpu,map))
++
++#define for_each_online_cpu(cpu, map)                                 \
++      for (cpu = first_cpu_const(map);                                \
++              cpu < NR_CPUS;                                          \
++              cpu = next_online_cpu(cpu,map))
++
++#endif /* __LINUX_CPUMASK_H */
+--- linux-2.6.0-test1/include/linux/dm-ioctl.h 2003-06-14 12:17:56.000000000 -0700
++++ 25/include/linux/dm-ioctl.h        2003-07-19 17:03:51.000000000 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (C) 2001 Sistina Software (UK) Limited.
++ * Copyright (C) 2003 Sistina Software (UK) Limited.
+  *
+  * This file is released under the LGPL.
+  */
+@@ -7,143 +7,12 @@
+ #ifndef _LINUX_DM_IOCTL_H
+ #define _LINUX_DM_IOCTL_H
+-#include <linux/types.h>
++#include <linux/config.h>
+-#define DM_DIR "mapper"       /* Slashes not supported */
+-#define DM_MAX_TYPE_NAME 16
+-#define DM_NAME_LEN 128
+-#define DM_UUID_LEN 129
++#ifdef CONFIG_DM_IOCTL_V4
++#include "dm-ioctl-v4.h"
++#else
++#include "dm-ioctl-v1.h"
++#endif
+-/*
+- * Implements a traditional ioctl interface to the device mapper.
+- */
+-
+-/*
+- * All ioctl arguments consist of a single chunk of memory, with
+- * this structure at the start.  If a uuid is specified any
+- * lookup (eg. for a DM_INFO) will be done on that, *not* the
+- * name.
+- */
+-struct dm_ioctl {
+-      /*
+-       * The version number is made up of three parts:
+-       * major - no backward or forward compatibility,
+-       * minor - only backwards compatible,
+-       * patch - both backwards and forwards compatible.
+-       *
+-       * All clients of the ioctl interface should fill in the
+-       * version number of the interface that they were
+-       * compiled with.
+-       *
+-       * All recognised ioctl commands (ie. those that don't
+-       * return -ENOTTY) fill out this field, even if the
+-       * command failed.
+-       */
+-      uint32_t version[3];    /* in/out */
+-      uint32_t data_size;     /* total size of data passed in
+-                               * including this struct */
+-
+-      uint32_t data_start;    /* offset to start of data
+-                               * relative to start of this struct */
+-
+-      uint32_t target_count;  /* in/out */
+-      uint32_t open_count;    /* out */
+-      uint32_t flags;         /* in/out */
+-
+-      __kernel_dev_t dev;     /* in/out */
+-
+-      char name[DM_NAME_LEN]; /* device name */
+-      char uuid[DM_UUID_LEN]; /* unique identifier for
+-                               * the block device */
+-};
+-
+-/*
+- * Used to specify tables.  These structures appear after the
+- * dm_ioctl.
+- */
+-struct dm_target_spec {
+-      int32_t status;         /* used when reading from kernel only */
+-      uint64_t sector_start;
+-      uint32_t length;
+-
+-      /*
+-       * Offset in bytes (from the start of this struct) to
+-       * next target_spec.
+-       */
+-      uint32_t next;
+-
+-      char target_type[DM_MAX_TYPE_NAME];
+-
+-      /*
+-       * Parameter string starts immediately after this object.
+-       * Be careful to add padding after string to ensure correct
+-       * alignment of subsequent dm_target_spec.
+-       */
+-};
+-
+-/*
+- * Used to retrieve the target dependencies.
+- */
+-struct dm_target_deps {
+-      uint32_t count;
+-
+-      __kernel_dev_t dev[0];  /* out */
+-};
+-
+-/*
+- * If you change this make sure you make the corresponding change
+- * to dm-ioctl.c:lookup_ioctl()
+- */
+-enum {
+-      /* Top level cmds */
+-      DM_VERSION_CMD = 0,
+-      DM_REMOVE_ALL_CMD,
+-
+-      /* device level cmds */
+-      DM_DEV_CREATE_CMD,
+-      DM_DEV_REMOVE_CMD,
+-      DM_DEV_RELOAD_CMD,
+-      DM_DEV_RENAME_CMD,
+-      DM_DEV_SUSPEND_CMD,
+-      DM_DEV_DEPS_CMD,
+-      DM_DEV_STATUS_CMD,
+-
+-      /* target level cmds */
+-      DM_TARGET_STATUS_CMD,
+-      DM_TARGET_WAIT_CMD
+-};
+-
+-#define DM_IOCTL 0xfd
+-
+-#define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
+-#define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
+-
+-#define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
+-#define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
+-#define DM_DEV_RELOAD    _IOWR(DM_IOCTL, DM_DEV_RELOAD_CMD, struct dm_ioctl)
+-#define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
+-#define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
+-#define DM_DEV_DEPS      _IOWR(DM_IOCTL, DM_DEV_DEPS_CMD, struct dm_ioctl)
+-#define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
+-
+-#define DM_TARGET_STATUS _IOWR(DM_IOCTL, DM_TARGET_STATUS_CMD, struct dm_ioctl)
+-#define DM_TARGET_WAIT   _IOWR(DM_IOCTL, DM_TARGET_WAIT_CMD, struct dm_ioctl)
+-
+-#define DM_VERSION_MAJOR      1
+-#define DM_VERSION_MINOR      0
+-#define DM_VERSION_PATCHLEVEL 6
+-#define DM_VERSION_EXTRA      "-ioctl (2002-10-15)"
+-
+-/* Status bits */
+-#define DM_READONLY_FLAG      0x00000001
+-#define DM_SUSPEND_FLAG               0x00000002
+-#define DM_EXISTS_FLAG                0x00000004
+-#define DM_PERSISTENT_DEV_FLAG        0x00000008
+-
+-/*
+- * Flag passed into ioctl STATUS command to get table information
+- * rather than current status.
+- */
+-#define DM_STATUS_TABLE_FLAG  0x00000010
+-
+-#endif                                /* _LINUX_DM_IOCTL_H */
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/dm-ioctl-v1.h     2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,149 @@
++/*
++ * Copyright (C) 2001 Sistina Software (UK) Limited.
++ *
++ * This file is released under the LGPL.
++ */
++
++#ifndef _LINUX_DM_IOCTL_V1_H
++#define _LINUX_DM_IOCTL_V1_H
++
++#include <linux/types.h>
++
++#define DM_DIR "mapper"       /* Slashes not supported */
++#define DM_MAX_TYPE_NAME 16
++#define DM_NAME_LEN 128
++#define DM_UUID_LEN 129
++
++/*
++ * Implements a traditional ioctl interface to the device mapper.
++ */
++
++/*
++ * All ioctl arguments consist of a single chunk of memory, with
++ * this structure at the start.  If a uuid is specified any
++ * lookup (eg. for a DM_INFO) will be done on that, *not* the
++ * name.
++ */
++struct dm_ioctl {
++      /*
++       * The version number is made up of three parts:
++       * major - no backward or forward compatibility,
++       * minor - only backwards compatible,
++       * patch - both backwards and forwards compatible.
++       *
++       * All clients of the ioctl interface should fill in the
++       * version number of the interface that they were
++       * compiled with.
++       *
++       * All recognised ioctl commands (ie. those that don't
++       * return -ENOTTY) fill out this field, even if the
++       * command failed.
++       */
++      uint32_t version[3];    /* in/out */
++      uint32_t data_size;     /* total size of data passed in
++                               * including this struct */
++
++      uint32_t data_start;    /* offset to start of data
++                               * relative to start of this struct */
++
++      uint32_t target_count;  /* in/out */
++      uint32_t open_count;    /* out */
++      uint32_t flags;         /* in/out */
++
++      __kernel_dev_t dev;     /* in/out */
++
++      char name[DM_NAME_LEN]; /* device name */
++      char uuid[DM_UUID_LEN]; /* unique identifier for
++                               * the block device */
++};
++
++/*
++ * Used to specify tables.  These structures appear after the
++ * dm_ioctl.
++ */
++struct dm_target_spec {
++      int32_t status;         /* used when reading from kernel only */
++      uint64_t sector_start;
++      uint32_t length;
++
++      /*
++       * Offset in bytes (from the start of this struct) to
++       * next target_spec.
++       */
++      uint32_t next;
++
++      char target_type[DM_MAX_TYPE_NAME];
++
++      /*
++       * Parameter string starts immediately after this object.
++       * Be careful to add padding after string to ensure correct
++       * alignment of subsequent dm_target_spec.
++       */
++};
++
++/*
++ * Used to retrieve the target dependencies.
++ */
++struct dm_target_deps {
++      uint32_t count;
++
++      __kernel_dev_t dev[0];  /* out */
++};
++
++/*
++ * If you change this make sure you make the corresponding change
++ * to dm-ioctl.c:lookup_ioctl()
++ */
++enum {
++      /* Top level cmds */
++      DM_VERSION_CMD = 0,
++      DM_REMOVE_ALL_CMD,
++
++      /* device level cmds */
++      DM_DEV_CREATE_CMD,
++      DM_DEV_REMOVE_CMD,
++      DM_DEV_RELOAD_CMD,
++      DM_DEV_RENAME_CMD,
++      DM_DEV_SUSPEND_CMD,
++      DM_DEV_DEPS_CMD,
++      DM_DEV_STATUS_CMD,
++
++      /* target level cmds */
++      DM_TARGET_STATUS_CMD,
++      DM_TARGET_WAIT_CMD
++};
++
++#define DM_IOCTL 0xfd
++
++#define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
++#define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
++
++#define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
++#define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
++#define DM_DEV_RELOAD    _IOWR(DM_IOCTL, DM_DEV_RELOAD_CMD, struct dm_ioctl)
++#define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
++#define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
++#define DM_DEV_DEPS      _IOWR(DM_IOCTL, DM_DEV_DEPS_CMD, struct dm_ioctl)
++#define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
++
++#define DM_TARGET_STATUS _IOWR(DM_IOCTL, DM_TARGET_STATUS_CMD, struct dm_ioctl)
++#define DM_TARGET_WAIT   _IOWR(DM_IOCTL, DM_TARGET_WAIT_CMD, struct dm_ioctl)
++
++#define DM_VERSION_MAJOR      1
++#define DM_VERSION_MINOR      0
++#define DM_VERSION_PATCHLEVEL 6
++#define DM_VERSION_EXTRA      "-ioctl (2002-10-15)"
++
++/* Status bits */
++#define DM_READONLY_FLAG      0x00000001
++#define DM_SUSPEND_FLAG               0x00000002
++#define DM_EXISTS_FLAG                0x00000004
++#define DM_PERSISTENT_DEV_FLAG        0x00000008
++
++/*
++ * Flag passed into ioctl STATUS command to get table information
++ * rather than current status.
++ */
++#define DM_STATUS_TABLE_FLAG  0x00000010
++
++#endif                                /* _LINUX_DM_IOCTL_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/dm-ioctl-v4.h     2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,237 @@
++/*
++ * Copyright (C) 2001 - 2003 Sistina Software (UK) Limited.
++ *
++ * This file is released under the LGPL.
++ */
++
++#ifndef _LINUX_DM_IOCTL_V4_H
++#define _LINUX_DM_IOCTL_V4_H
++
++#include <linux/types.h>
++
++#define DM_DIR "mapper"               /* Slashes not supported */
++#define DM_MAX_TYPE_NAME 16
++#define DM_NAME_LEN 128
++#define DM_UUID_LEN 129
++
++/*
++ * A traditional ioctl interface for the device mapper.
++ *
++ * Each device can have two tables associated with it, an
++ * 'active' table which is the one currently used by io passing
++ * through the device, and an 'inactive' one which is a table
++ * that is being prepared as a replacement for the 'active' one.
++ *
++ * DM_VERSION:
++ * Just get the version information for the ioctl interface.
++ *
++ * DM_REMOVE_ALL:
++ * Remove all dm devices, destroy all tables.  Only really used
++ * for debug.
++ *
++ * DM_LIST_DEVICES:
++ * Get a list of all the dm device names.
++ *
++ * DM_DEV_CREATE:
++ * Create a new device, neither the 'active' or 'inactive' table
++ * slots will be filled.  The device will be in suspended state
++ * after creation, however any io to the device will get errored
++ * since it will be out-of-bounds.
++ *
++ * DM_DEV_REMOVE:
++ * Remove a device, destroy any tables.
++ *
++ * DM_DEV_RENAME:
++ * Rename a device.
++ *
++ * DM_SUSPEND:
++ * This performs both suspend and resume, depending which flag is
++ * passed in.
++ * Suspend: This command will not return until all pending io to
++ * the device has completed.  Further io will be deferred until
++ * the device is resumed.
++ * Resume: It is no longer an error to issue this command on an
++ * unsuspended device.  If a table is present in the 'inactive'
++ * slot, it will be moved to the active slot, then the old table
++ * from the active slot will be _destroyed_.  Finally the device
++ * is resumed.
++ *
++ * DM_DEV_STATUS:
++ * Retrieves the status for the table in the 'active' slot.
++ *
++ * DM_DEV_WAIT:
++ * Wait for a significant event to occur to the device.  This
++ * could either be caused by an event triggered by one of the
++ * targets of the table in the 'active' slot, or a table change.
++ *
++ * DM_TABLE_LOAD:
++ * Load a table into the 'inactive' slot for the device.  The
++ * device does _not_ need to be suspended prior to this command.
++ *
++ * DM_TABLE_CLEAR:
++ * Destroy any table in the 'inactive' slot (ie. abort).
++ *
++ * DM_TABLE_DEPS:
++ * Return a set of device dependencies for the 'active' table.
++ *
++ * DM_TABLE_STATUS:
++ * Return the targets status for the 'active' table.
++ */
++
++/*
++ * All ioctl arguments consist of a single chunk of memory, with
++ * this structure at the start.  If a uuid is specified any
++ * lookup (eg. for a DM_INFO) will be done on that, *not* the
++ * name.
++ */
++struct dm_ioctl {
++      /*
++       * The version number is made up of three parts:
++       * major - no backward or forward compatibility,
++       * minor - only backwards compatible,
++       * patch - both backwards and forwards compatible.
++       *
++       * All clients of the ioctl interface should fill in the
++       * version number of the interface that they were
++       * compiled with.
++       *
++       * All recognised ioctl commands (ie. those that don't
++       * return -ENOTTY) fill out this field, even if the
++       * command failed.
++       */
++      uint32_t version[3];    /* in/out */
++      uint32_t data_size;     /* total size of data passed in
++                               * including this struct */
++
++      uint32_t data_start;    /* offset to start of data
++                               * relative to start of this struct */
++
++      uint32_t target_count;  /* in/out */
++      int32_t open_count;     /* out */
++      uint32_t flags;         /* in/out */
++      uint32_t event_nr;              /* in/out */
++      uint32_t padding;
++
++      uint64_t dev;           /* in/out */
++
++      char name[DM_NAME_LEN]; /* device name */
++      char uuid[DM_UUID_LEN]; /* unique identifier for
++                               * the block device */
++};
++
++/*
++ * Used to specify tables.  These structures appear after the
++ * dm_ioctl.
++ */
++struct dm_target_spec {
++      uint64_t sector_start;
++      uint64_t length;
++      int32_t status;         /* used when reading from kernel only */
++
++      /*
++       * Offset in bytes (from the start of this struct) to
++       * next target_spec.
++       */
++      uint32_t next;
++
++      char target_type[DM_MAX_TYPE_NAME];
++
++      /*
++       * Parameter string starts immediately after this object.
++       * Be careful to add padding after string to ensure correct
++       * alignment of subsequent dm_target_spec.
++       */
++};
++
++/*
++ * Used to retrieve the target dependencies.
++ */
++struct dm_target_deps {
++      uint32_t count; /* Array size */
++      uint32_t padding;       /* unused */
++      uint64_t dev[0];        /* out */
++};
++
++/*
++ * Used to get a list of all dm devices.
++ */
++struct dm_name_list {
++      uint64_t dev;
++      uint32_t next;          /* offset to the next record from
++                                 the _start_ of this */
++      char name[0];
++};
++
++/*
++ * If you change this make sure you make the corresponding change
++ * to dm-ioctl.c:lookup_ioctl()
++ */
++enum {
++      /* Top level cmds */
++      DM_VERSION_CMD = 0,
++      DM_REMOVE_ALL_CMD,
++      DM_LIST_DEVICES_CMD,
++
++      /* device level cmds */
++      DM_DEV_CREATE_CMD,
++      DM_DEV_REMOVE_CMD,
++      DM_DEV_RENAME_CMD,
++      DM_DEV_SUSPEND_CMD,
++      DM_DEV_STATUS_CMD,
++      DM_DEV_WAIT_CMD,
++
++      /* Table level cmds */
++      DM_TABLE_LOAD_CMD,
++      DM_TABLE_CLEAR_CMD,
++      DM_TABLE_DEPS_CMD,
++      DM_TABLE_STATUS_CMD,
++};
++
++#define DM_IOCTL 0xfd
++
++#define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
++#define DM_REMOVE_ALL    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, struct dm_ioctl)
++#define DM_LIST_DEVICES  _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, struct dm_ioctl)
++
++#define DM_DEV_CREATE    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, struct dm_ioctl)
++#define DM_DEV_REMOVE    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, struct dm_ioctl)
++#define DM_DEV_RENAME    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, struct dm_ioctl)
++#define DM_DEV_SUSPEND   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, struct dm_ioctl)
++#define DM_DEV_STATUS    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, struct dm_ioctl)
++#define DM_DEV_WAIT      _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, struct dm_ioctl)
++
++#define DM_TABLE_LOAD    _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, struct dm_ioctl)
++#define DM_TABLE_CLEAR   _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, struct dm_ioctl)
++#define DM_TABLE_DEPS    _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, struct dm_ioctl)
++#define DM_TABLE_STATUS  _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl)
++
++#define DM_VERSION_MAJOR      4
++#define DM_VERSION_MINOR      0
++#define DM_VERSION_PATCHLEVEL 0
++#define DM_VERSION_EXTRA      "-ioctl (2003-06-04)"
++
++/* Status bits */
++#define DM_READONLY_FLAG      (1 << 0) /* In/Out */
++#define DM_SUSPEND_FLAG               (1 << 1) /* In/Out */
++#define DM_PERSISTENT_DEV_FLAG        (1 << 3) /* In */
++
++/*
++ * Flag passed into ioctl STATUS command to get table information
++ * rather than current status.
++ */
++#define DM_STATUS_TABLE_FLAG  (1 << 4) /* In */
++
++/*
++ * Flags that indicate whether a table is present in either of
++ * the two table slots that a device has.
++ */
++#define DM_ACTIVE_PRESENT_FLAG   (1 << 5) /* Out */
++#define DM_INACTIVE_PRESENT_FLAG (1 << 6) /* Out */
++
++/*
++ * Indicates that the buffer passed in wasn't big enough for the
++ * results.
++ */
++#define DM_BUFFER_FULL_FLAG   (1 << 8) /* Out */
++
++#endif                                /* _LINUX_DM_IOCTL_H */
+--- linux-2.6.0-test1/include/linux/elevator.h 2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/elevator.h        2003-07-19 17:03:51.000000000 -0700
+@@ -13,6 +13,7 @@ typedef struct request *(elevator_next_r
+ typedef void (elevator_add_req_fn) (request_queue_t *, struct request *, struct list_head *);
+ typedef int (elevator_queue_empty_fn) (request_queue_t *);
+ typedef void (elevator_remove_req_fn) (request_queue_t *, struct request *);
++typedef void (elevator_requeue_req_fn) (request_queue_t *, struct request *);
+ typedef struct request *(elevator_request_list_fn) (request_queue_t *, struct request *);
+ typedef struct list_head *(elevator_get_sort_head_fn) (request_queue_t *, struct request *);
+ typedef void (elevator_completed_req_fn) (request_queue_t *, struct request *);
+@@ -33,6 +34,7 @@ struct elevator_s
+       elevator_next_req_fn *elevator_next_req_fn;
+       elevator_add_req_fn *elevator_add_req_fn;
+       elevator_remove_req_fn *elevator_remove_req_fn;
++      elevator_requeue_req_fn *elevator_requeue_req_fn;
+       elevator_queue_empty_fn *elevator_queue_empty_fn;
+       elevator_completed_req_fn *elevator_completed_req_fn;
+@@ -64,6 +66,7 @@ extern void elv_merge_requests(request_q
+                              struct request *);
+ extern void elv_merged_request(request_queue_t *, struct request *);
+ extern void elv_remove_request(request_queue_t *, struct request *);
++extern void elv_requeue_request(request_queue_t *, struct request *);
+ extern int elv_queue_empty(request_queue_t *);
+ extern struct request *elv_next_request(struct request_queue *q);
+ extern struct request *elv_former_request(request_queue_t *, struct request *);
+--- linux-2.6.0-test1/include/linux/elfcore.h  2003-06-14 12:18:51.000000000 -0700
++++ 25/include/linux/elfcore.h 2003-07-19 17:03:51.000000000 -0700
+@@ -107,12 +107,12 @@ static inline int elf_core_copy_task_reg
+ extern int dump_fpu (struct pt_regs *, elf_fpregset_t *);
+-static inline int elf_core_copy_task_fpregs(struct task_struct *t, elf_fpregset_t *fpu)
++static inline int elf_core_copy_task_fpregs(struct task_struct *t, struct pt_regs *regs, elf_fpregset_t *fpu)
+ {
+ #ifdef ELF_CORE_COPY_FPREGS
+       return ELF_CORE_COPY_FPREGS(t, fpu);
+ #else
+-      return dump_fpu(NULL, fpu);
++      return dump_fpu(regs, fpu);
+ #endif
+ }
+--- linux-2.6.0-test1/include/linux/errno.h    2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/errno.h   2003-07-19 17:06:43.000000000 -0700
+@@ -22,6 +22,7 @@
+ #define EBADTYPE      527     /* Type not supported by server */
+ #define EJUKEBOX      528     /* Request initiated, but will not complete before timeout */
+ #define EIOCBQUEUED   529     /* iocb queued, will get completion event */
++#define EIOCBRETRY    530     /* iocb queued, will trigger a retry */
+ #endif
+--- linux-2.6.0-test1/include/linux/ext3_fs.h  2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/ext3_fs.h 2003-07-19 17:07:18.000000000 -0700
+@@ -721,7 +721,6 @@ extern int ext3_forget(handle_t *, int, 
+ extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
+ extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
+-extern int  ext3_get_inode_loc (struct inode *, struct ext3_iloc *);
+ extern void ext3_read_inode (struct inode *);
+ extern void ext3_write_inode (struct inode *, int);
+ extern int  ext3_setattr (struct dentry *, struct iattr *);
+--- linux-2.6.0-test1/include/linux/ext3_jbd.h 2003-06-22 12:04:45.000000000 -0700
++++ 25/include/linux/ext3_jbd.h        2003-07-19 17:03:51.000000000 -0700
+@@ -30,10 +30,11 @@
+ #define EXT3_SINGLEDATA_TRANS_BLOCKS  8U
+-/* Extended attributes may touch two data buffers, two bitmap buffers,
+- * and two group and summaries. */
++/* Extended attribute operations touch at most two data buffers,
++ * two bitmap buffers, and two group summaries, in addition to the inode
++ * and the superblock, which are already accounted for. */
+-#define EXT3_XATTR_TRANS_BLOCKS               8
++#define EXT3_XATTR_TRANS_BLOCKS               6U
+ /* Define the minimum size for a transaction which modifies data.  This
+  * needs to take into account the fact that we may end up modifying two
+--- linux-2.6.0-test1/include/linux/fb.h       2003-06-14 12:18:06.000000000 -0700
++++ 25/include/linux/fb.h      2003-07-19 17:04:55.000000000 -0700
+@@ -2,7 +2,6 @@
+ #define _LINUX_FB_H
+ #include <linux/tty.h>
+-#include <linux/workqueue.h>
+ #include <asm/types.h>
+ #include <asm/io.h>
+@@ -326,28 +325,38 @@ struct fb_cursor {
+       struct fb_image image;  /* Cursor image */
+ };
++#ifdef __KERNEL__
++
++#include <linux/fs.h>
++#include <linux/init.h>
++#include <linux/workqueue.h>
++#include <linux/devfs_fs_kernel.h>
++
++/*
++ * The purpose of this structure is to translate data
++ * from the hardwre independent format of fbdev to what 
++ * format the hardware needs.
++ */ 
++
+ #define FB_PIXMAP_DEFAULT 1     /* used internally by fbcon */
+ #define FB_PIXMAP_SYSTEM  2     /* memory is in system RAM  */
+ #define FB_PIXMAP_IO      4     /* memory is iomapped       */
+ #define FB_PIXMAP_SYNC    256   /* set if GPU can DMA       */
+ struct fb_pixmap {
+-        __u8  *addr;                      /* pointer to memory             */  
+-      __u32 size;                       /* size of buffer in bytes       */
+-      __u32 offset;                     /* current offset to buffer      */
+-      __u32 buf_align;                  /* byte alignment of each bitmap */
+-      __u32 scan_align;                 /* alignment per scanline        */
+-      __u32 flags;                      /* see FB_PIXMAP_*               */
+-                                        /* access methods                */
+-      void (*outbuf)(u8 *dst, u8 *addr, unsigned int size); 
+-      u8   (*inbuf) (u8 *addr);
+-      spinlock_t lock;                  /* spinlock                      */
++      u8  *addr;              /* pointer to memory                    */
++      u32 size;               /* size of buffer in bytes              */
++      u32 offset;             /* current offset to buffer             */
++      u32 buf_align;          /* byte alignment of each bitmap        */
++      u32 scan_align;         /* alignment per scanline               */
++      u32 access_align;       /* alignment per read/write             */
++      u32 flags;              /* see FB_PIXMAP_*                      */
++      spinlock_t lock;        /* spinlock                             */
+       atomic_t count;
++      /* access methods */
++      void (*outbuf)(u8 *addr, u8 *dst, unsigned int size); 
++      u8   (*inbuf) (u8 *addr);
+ };
+-#ifdef __KERNEL__
+-
+-#include <linux/fs.h>
+-#include <linux/init.h>
+ struct fb_info;
+ struct vm_area_struct;
+@@ -396,24 +405,24 @@ struct fb_ops {
+ };
+ struct fb_info {
+-   int node;
+-   int flags;
+-   int open;                            /* Has this been open already ? */
++      int node;
++      int flags;
+ #define FBINFO_FLAG_MODULE    1       /* Low-level driver is a module */
+-   struct fb_var_screeninfo var;        /* Current var */
+-   struct fb_fix_screeninfo fix;        /* Current fix */
+-   struct fb_monspecs monspecs;         /* Current Monitor specs */
+-   struct fb_cursor cursor;           /* Current cursor */    
+-   struct work_struct queue;          /* Framebuffer event queue */
+-   struct fb_pixmap pixmap;           /* Current pixmap */
+-   struct fb_cmap cmap;                 /* Current cmap */
+-   struct fb_ops *fbops;
+-   char *screen_base;                   /* Virtual address */
+-   struct vc_data *display_fg;                /* Console visible on this display */
+-   int currcon;                               /* Current VC. */       
+-   void *pseudo_palette;                /* Fake palette of 16 colors */ 
+-   /* From here on everything is device dependent */
+-   void *par; 
++      struct fb_var_screeninfo var;   /* Current var */
++      struct fb_fix_screeninfo fix;   /* Current fix */
++      struct fb_monspecs monspecs;    /* Current Monitor specs */
++      struct fb_cursor cursor;        /* Current cursor */    
++      struct work_struct queue;       /* Framebuffer event queue */
++      struct fb_pixmap pixmap;        /* Image HW mapper */
++      struct fb_pixmap sprite;        /* Cursor HW mapper */
++      struct fb_cmap cmap;            /* Current cmap */
++      struct fb_ops *fbops;
++      char *screen_base;              /* Virtual address */
++      struct vc_data *display_fg;     /* Console visible on this display */
++      void *pseudo_palette;           /* Fake palette of 16 colors */ 
++      int currcon;                    /* Current VC. */       
++      /* From here on everything is device dependent */
++      void *par;      
+ };
+ #ifdef MODULE
+@@ -481,12 +490,12 @@ extern int register_framebuffer(struct f
+ extern int unregister_framebuffer(struct fb_info *fb_info);
+ extern int fb_prepare_logo(struct fb_info *fb_info);
+ extern int fb_show_logo(struct fb_info *fb_info);
+-extern u32 fb_get_buffer_offset(struct fb_info *info, u32 size);
+-extern void move_buf_unaligned(struct fb_info *info, u8 *dst, u8 *src, u32 d_pitch,
+-                              u32 height, u32 mask, u32 shift_high, u32 shift_low,
++extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size);
++extern void move_buf_unaligned(struct fb_info *info, struct fb_pixmap *buf, u8 *dst, u8 *src,
++                              u32 d_pitch, u32 height, u32 mask, u32 shift_high, u32 shift_low,
+                               u32 mod, u32 idx);
+-extern void move_buf_aligned(struct fb_info *info, u8 *dst, u8 *src, u32 d_pitch,
+-                           u32 s_pitch, u32 height);
++extern void move_buf_aligned(struct fb_info *info, struct fb_pixmap *buf, u8 *dst, u8 *src, 
++                           u32 d_pitch, u32 s_pitch, u32 height);
+ extern struct fb_info *registered_fb[FB_MAX];
+ extern int num_registered_fb;
+--- linux-2.6.0-test1/include/linux/fs.h       2003-07-13 21:44:35.000000000 -0700
++++ 25/include/linux/fs.h      2003-07-19 17:07:03.000000000 -0700
+@@ -323,6 +323,7 @@ struct address_space {
+       struct list_head        i_mmap;         /* list of private mappings */
+       struct list_head        i_mmap_shared;  /* list of shared mappings */
+       struct semaphore        i_shared_sem;   /* protect both above lists */
++      atomic_t                truncate_count; /* Cover race condition with truncate */
+       unsigned long           dirtied_when;   /* jiffies of first page dirtying */
+       int                     gfp_mask;       /* how to allocate the pages */
+       struct backing_dev_info *backing_dev_info; /* device readahead, etc */
+@@ -729,6 +730,11 @@ extern int vfs_rename(struct inode *, st
+ #define DT_SOCK               12
+ #define DT_WHT                14
++#define OSYNC_METADATA        (1<<0)
++#define OSYNC_DATA    (1<<1)
++#define OSYNC_INODE   (1<<2)
++int generic_osync_inode(struct inode *, int);
++
+ /*
+  * This is the "filldir" function type, used by readdir() to let
+  * the kernel specify what kind of dirent layout it wants to have.
+--- linux-2.6.0-test1/include/linux/hfs_sysdep.h       2003-06-14 12:17:58.000000000 -0700
++++ 25/include/linux/hfs_sysdep.h      2003-07-19 17:03:51.000000000 -0700
+@@ -28,9 +28,6 @@
+ extern struct timezone sys_tz;
+-#undef offsetof
+-#define offsetof(TYPE, MEMB) ((size_t) &((TYPE *)0)->MEMB)
+-
+ /* Typedefs for integer types by size and signedness */
+ typedef __u8            hfs_u8;
+ typedef __u16           hfs_u16;
+--- linux-2.6.0-test1/include/linux/ide.h      2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/ide.h     2003-07-19 17:03:51.000000000 -0700
+@@ -1288,12 +1288,6 @@ extern ide_devices_t   *idescsi;
+ #endif
+ extern int noautodma;
+-/*
+- * We need blk.h, but we replace its end_request by our own version.
+- */
+-#define IDE_DRIVER            /* Toggle some magic bits in blk.h */
+-#include <linux/blk.h>
+-
+ extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs);
+ /*
+--- linux-2.6.0-test1/include/linux/init_task.h        2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/init_task.h       2003-07-19 17:06:43.000000000 -0700
+@@ -70,7 +70,7 @@
+       .prio           = MAX_PRIO-20,                                  \
+       .static_prio    = MAX_PRIO-20,                                  \
+       .policy         = SCHED_NORMAL,                                 \
+-      .cpus_allowed   = ~0UL,                                         \
++      .cpus_allowed   = CPU_MASK_ALL,                                 \
+       .mm             = NULL,                                         \
+       .active_mm      = &init_mm,                                     \
+       .run_list       = LIST_HEAD_INIT(tsk.run_list),                 \
+@@ -108,6 +108,7 @@
+       .proc_lock      = SPIN_LOCK_UNLOCKED,                           \
+       .switch_lock    = SPIN_LOCK_UNLOCKED,                           \
+       .journal_info   = NULL,                                         \
++      .io_wait        = NULL,                                         \
+ }
+--- linux-2.6.0-test1/include/linux/irq.h      2003-06-14 12:18:08.000000000 -0700
++++ 25/include/linux/irq.h     2003-07-19 17:04:07.000000000 -0700
+@@ -15,6 +15,7 @@
+ #include <linux/cache.h>
+ #include <linux/spinlock.h>
++#include <linux/cpumask.h>
+ #include <asm/irq.h>
+ #include <asm/ptrace.h>
+@@ -44,7 +45,7 @@ struct hw_interrupt_type {
+       void (*disable)(unsigned int irq);
+       void (*ack)(unsigned int irq);
+       void (*end)(unsigned int irq);
+-      void (*set_affinity)(unsigned int irq, unsigned long mask);
++      void (*set_affinity)(unsigned int irq, cpumask_t dest);
+ };
+ typedef struct hw_interrupt_type  hw_irq_controller;
+--- linux-2.6.0-test1/include/linux/kdev_t.h   2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/kdev_t.h  2003-07-19 17:06:39.000000000 -0700
+@@ -1,82 +1,14 @@
+ #ifndef _LINUX_KDEV_T_H
+ #define _LINUX_KDEV_T_H
+ #ifdef __KERNEL__
+-/*
+-As a preparation for the introduction of larger device numbers,
+-we introduce a type kdev_t to hold them. No information about
+-this type is known outside of this include file.
+-
+-Objects of type kdev_t designate a device. Outside of the kernel
+-the corresponding things are objects of type dev_t - usually an
+-integral type with the device major and minor in the high and low
+-bits, respectively. Conversion is done by
+-
+-extern kdev_t to_kdev_t(int);
+-
+-It is up to the various file systems to decide how objects of type
+-dev_t are stored on disk.
+-The only other point of contact between kernel and outside world
+-are the system calls stat and mknod, new versions of which will
+-eventually have to be used in libc.
+-
+-[Unfortunately, the floppy control ioctls fail to hide the internal
+-kernel structures, and the fd_device field of a struct floppy_drive_struct
+-is user-visible. So, it remains a dev_t for the moment, with some ugly
+-conversions in floppy.c.]
+-
+-Inside the kernel, we aim for a kdev_t type that is a pointer
+-to a structure with information about the device (like major,
+-minor, size, blocksize, sectorsize, name, read-only flag,
+-struct file_operations etc.).
+-
+-However, for the time being we let kdev_t be almost the same as dev_t:
+-
+-typedef struct { unsigned short major, minor; } kdev_t;
+-
+-Admissible operations on an object of type kdev_t:
+-- passing it along
+-- comparing it for equality with another such object
+-- storing it in inode->i_rdev or tty->device
+-- using its bit pattern as argument in a hash function
+-- finding its major and minor
+-- complaining about it
+-
+-An object of type kdev_t is created only by the function MKDEV(),
+-with the single exception of the constant 0 (no device).
+-
+-Right now the other information mentioned above is usually found
+-in static arrays indexed by major or major,minor.
+-
+-An obstacle to immediately using
+-    typedef struct { ... (* lots of information *) } *kdev_t
+-is the case of mknod used to create a block device that the
+-kernel doesn't know about at present (but first learns about
+-when some module is inserted).
+-
+-aeb - 950811
+-*/
++#include <linux/types.h>       /* for dev_t */
+-/*
+- * NOTE NOTE NOTE!
+- *
+- * The kernel-internal "kdev_t" will eventually have
+- * 20 bits for minor numbers, and 12 bits for majors.
+- *
+- * HOWEVER, the external representation is still 8+8
+- * bits, and there is no way to generate the extended
+- * "kdev_t" format yet. Which is just as well, since
+- * we still use "minor" as an index into various
+- * static arrays, and they are sized for a 8-bit index.
+- */
+ typedef struct {
+-      unsigned short value;
++      unsigned long long value;
+ } kdev_t;
+-#define KDEV_MINOR_BITS               8
+-#define KDEV_MAJOR_BITS               8
+-
+-#define __mkdev(major,minor)  (((major) << KDEV_MINOR_BITS) + (minor))
++#define __mkdev(major, minor) (((unsigned long long)(major) << 32) + (minor))
+ #define mk_kdev(major, minor) ((kdev_t) { __mkdev(major,minor) } )
+@@ -85,12 +17,12 @@ typedef struct {
+  * internal equality comparisons and for things
+  * like NFS filehandle conversion.
+  */
+-static inline unsigned int kdev_val(kdev_t dev)
++static inline unsigned long long kdev_val(kdev_t dev)
+ {
+       return dev.value;
+ }
+-static inline kdev_t val_to_kdev(unsigned int val)
++static inline kdev_t val_to_kdev(unsigned long long val)
+ {
+       kdev_t dev;
+       dev.value = val;
+@@ -107,37 +39,85 @@ static inline int kdev_same(kdev_t dev1,
+ #define kdev_none(d1) (!kdev_val(d1))
+-/* Mask off the high bits for now.. */
+-#define minor(dev)    ((dev).value & 0xff)
+-#define major(dev)    (((dev).value >> KDEV_MINOR_BITS) & 0xff)
++#define minor(dev)    (unsigned int)((dev).value & 0xffffffff)
++#define major(dev)    (unsigned int)((dev).value >> 32)
+ /* These are for user-level "dev_t" */
+-#define MINORBITS     8
+-#define MINORMASK     ((1U << MINORBITS) - 1)
++/* Going back and forth between dev and (ma,mi) is one-to-one
++   provided ma is nonzero or ma is zero and mi is 8-bit only.
++   Never use major 0 together with a minor larger than 255. */
++#if 0
++/* readable versions */
++static inline unsigned int
++MAJOR(dev_t dev) {
++        return (dev & ~0xffffffffULL) ? (dev >> 32) :
++                (dev & ~0xffff) ? (dev >> 16) : (dev >> 8);
++}
+-#define MAJOR(dev)    ((unsigned int) ((dev) >> MINORBITS))
+-#define MINOR(dev)    ((unsigned int) ((dev) & MINORMASK))
+-#define MKDEV(ma,mi)  (((ma) << MINORBITS) | (mi))
++static inline unsigned int
++MINOR(dev_t dev) {
++        return (dev & ~0xffffffffULL) ? (dev & 0xffffffff) :
++                (dev & ~0xffff) ? (dev & 0xffff) : (dev & 0xff);
++}
++
++static inline dev_t
++MKDEV(unsigned int major, unsigned int minor) {
++        unsigned int both = (major | minor);
++        return ((both & ~0xffff) ? (((dev_t) major) << 32) :
++                (both & ~0xff) ? (((dev_t) major) << 16) :
++                (((dev_t) major) << 8) ) | minor;
++}
++#else
++/* ugly macro versions */
++#define MAJOR(dev) ((unsigned int)({ dev_t __dev = dev; \
++   (__dev & ~0xffffffffULL) ? (__dev >> 32) : \
++   (__dev & ~0xffff) ? (__dev >> 16) : (__dev >> 8); }))
++#define MINOR(dev) ((unsigned int)({ dev_t __dev = dev; \
++   (__dev & ~0xffffffffULL) ? (__dev & 0xffffffff) : \
++   (__dev & ~0xffff) ? (__dev & 0xffff) : (__dev & 0xff); }))
++#define constant_MKDEV(ma, mi) \
++   ((((ma)|(mi)) & ~0xffff) ? ((ma) << 32) | (mi) : \
++    (((ma)|(mi)) & ~0xff) ? ((ma) << 16) | (mi) : ((ma) << 8) | (mi))
++#define MKDEV(major, minor) ({ \
++   unsigned int __ma = major, __mi = minor, __both = (__ma | __mi); \
++   ((sizeof(dev_t) > 4 && (__both & ~0xffff)) ? (((dev_t) __ma) << 32) : \
++    (__both & ~0xff) ? (((dev_t) __ma) << 16) : (((dev_t) __ma) << 8) \
++   ) | __mi; })
++#endif
+ /*
+  * Conversion functions
+  */
+-static inline int kdev_t_to_nr(kdev_t dev)
++static inline dev_t kdev_t_to_nr(kdev_t dev)
+ {
+-      return MKDEV(major(dev), minor(dev));
++      unsigned int ma = major(dev);
++      unsigned int mi = minor(dev);
++      return MKDEV(ma, mi);
+ }
+-static inline kdev_t to_kdev_t(int dev)
++static inline kdev_t to_kdev_t(dev_t dev)
+ {
+-      return mk_kdev(MAJOR(dev),MINOR(dev));
++      unsigned int ma = MAJOR(dev);
++      unsigned int mi = MINOR(dev);
++      return mk_kdev(ma, mi);
+ }
++#define print_dev_t(buffer, dev)                                      \
++      sprintf((buffer), "%u:%u\n", MAJOR(dev), MINOR(dev))
++
++#define format_dev_t(buffer, dev)                                     \
++      ({                                                              \
++              sprintf(buffer, "%u:%u", MAJOR(dev), MINOR(dev));       \
++              buffer;                                                 \
++      })
++
+ #else /* __KERNEL__ */
+ /*
+ Some programs want their definitions of MAJOR and MINOR and MKDEV
+ from the kernel sources. These must be the externally visible ones.
++Of course such programs should be updated.
+ */
+ #define MAJOR(dev)    ((dev)>>8)
+ #define MINOR(dev)    ((dev) & 0xff)
+--- linux-2.6.0-test1/include/linux/kernel_stat.h      2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/kernel_stat.h     2003-07-19 17:03:51.000000000 -0700
+@@ -23,9 +23,7 @@ struct cpu_usage_stat {
+ struct kernel_stat {
+       struct cpu_usage_stat   cpustat;
+-#if !defined(CONFIG_ARCH_S390)
+       unsigned int irqs[NR_IRQS];
+-#endif
+ };
+ DECLARE_PER_CPU(struct kernel_stat, kstat);
+@@ -36,7 +34,6 @@ DECLARE_PER_CPU(struct kernel_stat, ksta
+ extern unsigned long nr_context_switches(void);
+-#if !defined(CONFIG_ARCH_S390)
+ /*
+  * Number of interrupts per specific IRQ source, since bootup
+  */
+@@ -50,6 +47,5 @@ static inline int kstat_irqs(int irq)
+       return sum;
+ }
+-#endif
+ #endif /* _LINUX_KERNEL_STAT_H */
+--- linux-2.6.0-test1/include/linux/linux_logo.h       2003-06-14 12:18:05.000000000 -0700
++++ 25/include/linux/linux_logo.h      2003-07-19 17:04:55.000000000 -0700
+@@ -16,13 +16,11 @@
+ #include <linux/init.h>
+-
+ #define LINUX_LOGO_MONO               1       /* monochrome black/white */
+ #define LINUX_LOGO_VGA16      2       /* 16 colors VGA text palette */
+ #define LINUX_LOGO_CLUT224    3       /* 224 colors */
+ #define LINUX_LOGO_GRAY256    4       /* 256 levels grayscale */
+-
+ struct linux_logo {
+       int type;                       /* one of LINUX_LOGO_* */
+       unsigned int width;
+@@ -32,6 +30,6 @@ struct linux_logo {
+       const unsigned char *data;
+ };
+-extern const struct linux_logo *fb_find_logo(int depth);
++extern const struct linux_logo *find_logo(int depth);
+ #endif /* _LINUX_LINUX_LOGO_H */
+--- linux-2.6.0-test1/include/linux/list.h     2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/list.h    2003-07-19 17:06:35.000000000 -0700
+@@ -142,8 +142,11 @@ static inline void __list_del(struct lis
+  * Note: list_empty on entry does not return true after this, the entry is
+  * in an undefined state.
+  */
++#include <linux/kernel.h>     /* BUG_ON */
+ static inline void list_del(struct list_head *entry)
+ {
++      BUG_ON(entry->prev->next != entry);
++      BUG_ON(entry->next->prev != entry);
+       __list_del(entry->prev, entry->next);
+       entry->next = LIST_POISON1;
+       entry->prev = LIST_POISON2;
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/linux/lockmeter.h       2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,320 @@
++/*
++ *  Copyright (C) 1999-2002 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.h by Jack Steiner (steiner@sgi.com)
++ *
++ *  Modified by Ray Bryant (raybry@us.ibm.com) Feb-Apr 2000
++ *  Changes Copyright (C) 2000 IBM, Inc.
++ *  Added save of index in spinlock_t to improve efficiency
++ *  of "hold" time reporting for spinlocks
++ *  Added support for hold time statistics for read and write
++ *  locks.
++ *  Moved machine dependent code to include/asm/lockmeter.h.
++ *
++ */
++
++#ifndef _LINUX_LOCKMETER_H
++#define _LINUX_LOCKMETER_H
++
++
++/*---------------------------------------------------
++ *    architecture-independent lockmeter.h
++ *-------------------------------------------------*/
++
++/*
++ * raybry -- version 2: added efficient hold time statistics
++ *           requires lstat recompile, so flagged as new version
++ * raybry -- version 3: added global reader lock data
++ * hawkes -- version 4: removed some unnecessary fields to simplify mips64 port
++ */
++#define LSTAT_VERSION 5
++
++int   lstat_update(void*, void*, int);
++int   lstat_update_time(void*, void*, int, uint32_t);
++
++/*
++ * Currently, the mips64 and sparc64 kernels talk to a 32-bit lockstat, so we
++ * need to force compatibility in the inter-communication data structure.
++ */
++
++#if defined(CONFIG_MIPS32_COMPAT)
++#define TIME_T                uint32_t
++#elif defined(CONFIG_SPARC32_COMPAT)
++#define TIME_T                uint64_t
++#else
++#define TIME_T                time_t
++#endif
++
++#if defined(__KERNEL__) || (!defined(CONFIG_MIPS32_COMPAT) && !defined(CONFIG_SPARC32_COMPAT)) || (_MIPS_SZLONG==32)
++#define POINTER               void *
++#else
++#define       POINTER         int64_t
++#endif
++
++/*
++ * Values for the "action" parameter passed to lstat_update.
++ *    ZZZ - do we want a try-success status here???
++ */
++#define LSTAT_ACT_NO_WAIT     0
++#define LSTAT_ACT_SPIN                1
++#define LSTAT_ACT_REJECT      2
++#define LSTAT_ACT_WW_SPIN       3
++#define LSTAT_ACT_SLEPT               4 /* UNUSED */
++
++#define LSTAT_ACT_MAX_VALUES  4 /* NOTE: Increase to 5 if use ACT_SLEPT */
++
++/*
++ * Special values for the low 2 bits of an RA passed to
++ * lstat_update.
++ */
++/* we use these values to figure out what kind of lock data */
++/* is stored in the statistics table entry at index ....... */
++#define LSTAT_RA_SPIN           0  /* spin lock data */
++#define LSTAT_RA_READ           1  /* read lock statistics */
++#define LSTAT_RA_SEMA         2  /* RESERVED */
++#define LSTAT_RA_WRITE          3  /* write lock statistics*/
++
++#define LSTAT_RA(n)   \
++      ((void*)( ((unsigned long)__builtin_return_address(0) & ~3) | n) )
++
++/*
++ * Constants used for lock addresses in the lstat_directory
++ * to indicate special values of the lock address.
++ */
++#define       LSTAT_MULTI_LOCK_ADDRESS        NULL
++
++/*
++ * Maximum size of the lockstats tables. Increase this value
++ * if its not big enough. (Nothing bad happens if its not
++ * big enough although some locks will not be monitored.)
++ * We record overflows of this quantity in lstat_control.dir_overflows
++ *
++ * Note:  The max value here must fit into the field set
++ * and obtained by the macro's PUT_INDEX() and GET_INDEX().
++ * This value depends on how many bits are available in the
++ * lock word in the particular machine implementation we are on.
++ */
++#define LSTAT_MAX_STAT_INDEX          2000
++
++/*
++ * Size and mask for the hash table into the directory.
++ */
++#define LSTAT_HASH_TABLE_SIZE         4096            /* must be 2**N */
++#define LSTAT_HASH_TABLE_MASK         (LSTAT_HASH_TABLE_SIZE-1)
++
++#define DIRHASH(ra)      ((unsigned long)(ra)>>2 & LSTAT_HASH_TABLE_MASK)
++
++/*
++ *    This defines an entry in the lockstat directory. It contains
++ *    information about a lock being monitored.
++ *    A directory entry only contains the lock identification -
++ *    counts on usage of the lock are kept elsewhere in a per-cpu
++ *    data structure to minimize cache line pinging.
++ */
++typedef struct {
++      POINTER caller_ra;                /* RA of code that set lock */
++      POINTER lock_ptr;                 /* lock address */
++      ushort  next_stat_index;  /* Used to link multiple locks that have the same hash table value */
++} lstat_directory_entry_t;
++
++/*
++ *    A multi-dimensioned array used to contain counts for lock accesses.
++ *    The array is 3-dimensional:
++ *            - CPU number. Keep from thrashing cache lines between CPUs
++ *            - Directory entry index. Identifies the lock
++ *            - Action. Indicates what kind of contention occurred on an
++ *              access to the lock.
++ *
++ *    The index of an entry in the directory is the same as the 2nd index
++ *    of the entry in the counts array.
++ */
++/*
++ *  This table contains data for spin_locks, write locks, and read locks
++ *  Not all data is used for all cases.  In particular, the hold time
++ *  information is not stored here for read locks since that is a global
++ *  (e. g. cannot be separated out by return address) quantity.
++ *  See the lstat_read_lock_counts_t structure for the global read lock
++ *  hold time.
++ */
++typedef struct {
++      uint64_t    cum_wait_ticks;     /* sum of wait times               */
++                                      /* for write locks, sum of time a  */
++                                      /* writer is waiting for a reader  */
++      int64_t     cum_hold_ticks;     /* cumulative sum of holds         */
++                                      /* not used for read mode locks    */
++                                      /* must be signed. ............... */
++      uint32_t    max_wait_ticks;     /* max waiting time                */
++      uint32_t    max_hold_ticks;     /* max holding time                */
++      uint64_t    cum_wait_ww_ticks;  /* sum times writer waits on writer*/
++      uint32_t    max_wait_ww_ticks;  /* max wait time writer vs writer  */
++                                      /* prev 2 only used for write locks*/
++      uint32_t    acquire_time;       /* time lock acquired this CPU     */
++      uint32_t    count[LSTAT_ACT_MAX_VALUES];
++} lstat_lock_counts_t;
++
++typedef lstat_lock_counts_t   lstat_cpu_counts_t[LSTAT_MAX_STAT_INDEX];
++
++/*
++ * User request to:
++ *    - turn statistic collection on/off, or to reset
++ */
++#define LSTAT_OFF      0
++#define LSTAT_ON       1
++#define LSTAT_RESET      2
++#define LSTAT_RELEASE    3
++
++#define LSTAT_MAX_READ_LOCK_INDEX 1000
++typedef struct {
++      POINTER     lock_ptr;            /* address of lock for output stats */
++      uint32_t    read_lock_count;
++      int64_t     cum_hold_ticks;       /* sum of read lock hold times over */
++                                        /* all callers. ....................*/
++      uint32_t    write_index;          /* last write lock hash table index */
++      uint32_t    busy_periods;         /* count of busy periods ended this */
++      uint64_t    start_busy;           /* time this busy period started. ..*/
++      uint64_t    busy_ticks;           /* sum of busy periods this lock. ..*/
++      uint64_t    max_busy;             /* longest busy period for this lock*/
++      uint32_t    max_readers;          /* maximum number of readers ...... */
++#ifdef USER_MODE_TESTING
++      rwlock_t    entry_lock;           /* lock for this read lock entry... */
++                                        /* avoid having more than one rdr at*/
++                                        /* needed for user space testing... */
++                                        /* not needed for kernel 'cause it  */
++                                        /* is non-preemptive. ............. */
++#endif
++} lstat_read_lock_counts_t;
++typedef lstat_read_lock_counts_t      lstat_read_lock_cpu_counts_t[LSTAT_MAX_READ_LOCK_INDEX];
++
++#if defined(__KERNEL__) || defined(USER_MODE_TESTING)
++
++#ifndef USER_MODE_TESTING
++#include <asm/lockmeter.h>
++#else
++#include "asm_newlockmeter.h"
++#endif
++
++/*
++ * Size and mask for the hash table into the directory.
++ */
++#define LSTAT_HASH_TABLE_SIZE         4096            /* must be 2**N */
++#define LSTAT_HASH_TABLE_MASK         (LSTAT_HASH_TABLE_SIZE-1)
++
++#define DIRHASH(ra)      ((unsigned long)(ra)>>2 & LSTAT_HASH_TABLE_MASK)
++
++/*
++ * This version eliminates the per processor lock stack.  What we do is to
++ * store the index of the lock hash structure in unused bits in the lock
++ * itself.  Then on unlock we can find the statistics record without doing
++ * any additional hash or lock stack lookup.  This works for spin_locks.
++ * Hold time reporting is now basically as cheap as wait time reporting
++ * so we ignore the difference between LSTAT_ON_HOLD and LSTAT_ON_WAIT
++ * as in version 1.1.* of lockmeter.
++ *
++ * For rw_locks, we store the index of a global reader stats structure in
++ * the lock and the writer index is stored in the latter structure.
++ * For read mode locks we hash at the time of the lock to find an entry
++ * in the directory for reader wait time and the like.
++ * At unlock time for read mode locks, we update just the global structure
++ * so we don't need to know the reader directory index value at unlock time.
++ *
++ */
++
++/*
++ * Protocol to change lstat_control.state
++ *   This is complicated because we don't want the cum_hold_time for
++ * a rw_lock to be decremented in _read_lock_ without making sure it
++ * is incremented in _read_lock_ and vice versa.  So here is the
++ * way we change the state of lstat_control.state:
++ * I.  To Turn Statistics On
++ *     After allocating storage, set lstat_control.state non-zero.
++ * This works because we don't start updating statistics for in use
++ * locks until the reader lock count goes to zero.
++ * II. To Turn Statistics Off:
++ * (0)  Disable interrupts on this CPU
++ * (1)  Seize the lstat_control.directory_lock
++ * (2)  Obtain the current value of lstat_control.next_free_read_lock_index
++ * (3)  Store a zero in lstat_control.state.
++ * (4)  Release the lstat_control.directory_lock
++ * (5)  For each lock in the read lock list up to the saved value
++ *      (well, -1) of the next_free_read_lock_index, do the following:
++ *      (a)  Check validity of the stored lock address
++ *           by making sure that the word at the saved addr
++ *           has an index that matches this entry.  If not
++ *           valid, then skip this entry.
++ *      (b)  If there is a write lock already set on this lock,
++ *           skip to (d) below.
++ *      (c)  Set a non-metered write lock on the lock
++ *      (d)  set the cached INDEX in the lock to zero
++ *      (e)  Release the non-metered write lock.
++ * (6)  Re-enable interrupts
++ *
++ * These rules ensure that a read lock will not have its statistics
++ * partially updated even though the global lock recording state has
++ * changed.  See put_lockmeter_info() for implementation.
++ *
++ * The reason for (b) is that there may be write locks set on the
++ * syscall path to put_lockmeter_info() from user space.  If we do
++ * not do this check, then we can deadlock.  A similar problem would
++ * occur if the lock was read locked by the current CPU.  At the
++ * moment this does not appear to happen.
++ */
++
++/*
++ * Main control structure for lockstat. Used to turn statistics on/off
++ * and to maintain directory info.
++ */
++typedef struct {
++      int                             state;
++      spinlock_t              control_lock;           /* used to serialize turning statistics on/off   */
++      spinlock_t              directory_lock;         /* for serialize adding entries to directory     */
++      volatile int    next_free_dir_index;/* next free entry in the directory */
++      /* FIXME not all of these fields are used / needed .............. */
++                /* the following fields represent data since     */
++              /* first "lstat on" or most recent "lstat reset" */
++      TIME_T      first_started_time;     /* time when measurement first enabled */
++      TIME_T      started_time;           /* time when measurement last started  */
++      TIME_T      ending_time;            /* time when measurement last disabled */
++      uint64_t    started_cycles64;       /* cycles when measurement last started          */
++      uint64_t    ending_cycles64;        /* cycles when measurement last disabled         */
++      uint64_t    enabled_cycles64;       /* total cycles with measurement enabled         */
++      int         intervals;              /* number of measurement intervals recorded      */
++                                          /* i. e. number of times did lstat on;lstat off  */
++      lstat_directory_entry_t *dir;           /* directory */
++      int         dir_overflow;           /* count of times ran out of space in directory  */
++      int         rwlock_overflow;        /* count of times we couldn't allocate a rw block*/
++      ushort          *hashtab;                           /* hash table for quick dir scans */
++      lstat_cpu_counts_t      *counts[NR_CPUS];        /* Array of pointers to per-cpu stats */
++    int         next_free_read_lock_index;   /* next rwlock reader (global) stats block  */
++    lstat_read_lock_cpu_counts_t *read_lock_counts[NR_CPUS]; /* per cpu read lock stats  */
++} lstat_control_t;
++
++#endif        /* defined(__KERNEL__) || defined(USER_MODE_TESTING) */
++
++typedef struct {
++      short           lstat_version;          /* version of the data */
++      short           state;                  /* the current state is returned */
++      int             maxcpus;                /* Number of cpus present */
++      int             next_free_dir_index;    /* index of the next free directory entry */
++      TIME_T          first_started_time;     /* when measurement enabled for first time */
++      TIME_T          started_time;           /* time in secs since 1969 when stats last turned on  */
++      TIME_T          ending_time;            /* time in secs since 1969 when stats last turned off */
++      uint32_t        cycleval;               /* cycles per second */
++#ifdef notyet
++      void            *kernel_magic_addr;     /* address of kernel_magic */
++      void            *kernel_end_addr;       /* contents of kernel magic (points to "end") */
++#endif
++      int              next_free_read_lock_index; /* index of next (global) read lock stats struct */
++      uint64_t         started_cycles64;      /* cycles when measurement last started        */
++      uint64_t         ending_cycles64;       /* cycles when stats last turned off           */
++      uint64_t         enabled_cycles64;      /* total cycles with measurement enabled       */
++      int              intervals;             /* number of measurement intervals recorded      */
++                                              /* i.e. number of times we did lstat on;lstat off*/
++      int              dir_overflow;          /* number of times we wanted more space in directory */
++      int              rwlock_overflow;       /* # of times we wanted more space in read_locks_count */
++      struct new_utsname   uts;               /* info about machine where stats are measured */
++                                              /* -T option of lockstat allows data to be     */
++                                              /* moved to another machine. ................. */
++} lstat_user_request_t;
++
++#endif /* _LINUX_LOCKMETER_H */
+--- linux-2.6.0-test1/include/linux/loop.h     2003-07-13 21:44:35.000000000 -0700
++++ 25/include/linux/loop.h    2003-07-19 17:03:51.000000000 -0700
+@@ -15,7 +15,7 @@
+ #ifdef __KERNEL__
+ #include <linux/bio.h>
+-#include <linux/blk.h>
++#include <linux/blkdev.h>
+ #include <linux/spinlock.h>
+ /* Possible states of device */
+--- linux-2.6.0-test1/include/linux/mm.h       2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/mm.h      2003-07-19 17:07:16.000000000 -0700
+@@ -421,10 +421,14 @@ int copy_page_range(struct mm_struct *ds
+ int zeromap_page_range(struct vm_area_struct *vma, unsigned long from,
+                       unsigned long size, pgprot_t prot);
++extern void invalidate_mmap_range(struct address_space *mapping,
++                                loff_t const holebegin,
++                                loff_t const holelen);
+ extern int vmtruncate(struct inode * inode, loff_t offset);
+ extern pmd_t *FASTCALL(__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address));
++pmd_t *FASTCALL(__pmd_alloc_kernel(struct mm_struct *mm, pgd_t *pmd, unsigned long address));
+ extern pte_t *FASTCALL(pte_alloc_kernel(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
+-extern pte_t *FASTCALL(pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
++pte_t *FASTCALL(pte_alloc_map(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmd, unsigned long address));
+ extern int install_page(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, struct page *page, pgprot_t prot);
+ extern int handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, unsigned long address, int write_access);
+ extern int make_pages_present(unsigned long addr, unsigned long end);
+@@ -485,12 +489,11 @@ static inline int set_page_dirty(struct 
+  * inlining and the symmetry break with pte_alloc_map() that does all
+  * of this out-of-line.
+  */
+-static inline pmd_t *pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
+-{
+-      if (pgd_none(*pgd))
+-              return __pmd_alloc(mm, pgd, address);
+-      return pmd_offset(pgd, address);
+-}
++#define pmd_alloc_map(mm, pgd, addr)                          \
++      (pgd_none(*(pgd))? __pmd_alloc(mm,pgd,addr): pmd_offset_map(pgd,addr))
++
++#define pmd_alloc_kernel(mm, pgd, addr)                               \
++      (pgd_none(*(pgd))? __pmd_alloc_kernel(mm,pgd,addr): pmd_offset_kernel(pgd,addr))
+ extern void free_area_init(unsigned long * zones_size);
+ extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
+--- linux-2.6.0-test1/include/linux/module.h   2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/module.h  2003-07-19 17:03:51.000000000 -0700
+@@ -16,6 +16,7 @@
+ #include <linux/kmod.h>
+ #include <linux/elf.h>
+ #include <linux/stringify.h>
++#include <asm/local.h>
+ #include <asm/module.h>
+@@ -171,7 +172,7 @@ void *__symbol_get_gpl(const char *symbo
+ struct module_ref
+ {
+-      atomic_t count;
++      local_t count;
+ } ____cacheline_aligned;
+ enum module_state
+@@ -276,19 +277,17 @@ struct module *module_get_kallsym(unsign
+                                 char *type,
+                                 char namebuf[128]);
+ int is_exported(const char *name, const struct module *mod);
+-#ifdef CONFIG_MODULE_UNLOAD
++extern void __module_put_and_exit(struct module *mod, long code)
++      __attribute__((noreturn));
++#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code);
++
++#ifdef CONFIG_MODULE_UNLOAD
+ unsigned int module_refcount(struct module *mod);
+ void __symbol_put(const char *symbol);
+ #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x)
+ void symbol_put_addr(void *addr);
+-/* We only need protection against local interrupts. */
+-#ifndef __HAVE_ARCH_LOCAL_INC
+-#define local_inc(x) atomic_inc(x)
+-#define local_dec(x) atomic_dec(x)
+-#endif
+-
+ /* Sometimes we know we already have a refcount, and it's easier not
+    to handle the error case (which only happens with rmmod --wait). */
+ static inline void __module_get(struct module *module)
+@@ -445,6 +444,8 @@ static inline int unregister_module_noti
+       return 0;
+ }
++#define module_put_and_exit(code) do_exit(code)
++
+ #endif /* CONFIG_MODULES */
+ #ifdef MODULE
+--- linux-2.6.0-test1/include/linux/namespace.h        2003-06-14 12:18:22.000000000 -0700
++++ 25/include/linux/namespace.h       2003-07-19 17:03:51.000000000 -0700
+@@ -2,7 +2,7 @@
+ #define _NAMESPACE_H_
+ #ifdef __KERNEL__
+-#include <linux/dcache.h>
++#include <linux/mount.h>
+ #include <linux/sched.h>
+ struct namespace {
+@@ -14,17 +14,12 @@ struct namespace {
+ extern void umount_tree(struct vfsmount *);
+ extern int copy_namespace(int, struct task_struct *);
++void __put_namespace(struct namespace *namespace);
+ static inline void put_namespace(struct namespace *namespace)
+ {
+-      if (atomic_dec_and_test(&namespace->count)) {
+-              down_write(&namespace->sem);
+-              spin_lock(&dcache_lock);
+-              umount_tree(namespace->root);
+-              spin_unlock(&dcache_lock);
+-              up_write(&namespace->sem);
+-              kfree(namespace);
+-      }
++      if (atomic_dec_and_test(&namespace->count))
++              __put_namespace(namespace);
+ }
+ static inline void exit_namespace(struct task_struct *p)
+--- linux-2.6.0-test1/include/linux/netdevice.h        2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/netdevice.h       2003-07-19 17:03:51.000000000 -0700
+@@ -29,6 +29,7 @@
+ #include <linux/if_ether.h>
+ #include <linux/if_packet.h>
+ #include <linux/device.h>
++#include <linux/percpu.h>
+ #include <asm/atomic.h>
+ #include <asm/cache.h>
+@@ -544,10 +545,9 @@ struct softnet_data
+       struct sk_buff          *completion_queue;
+       struct net_device       backlog_dev;    /* Sorry. 8) */
+-} ____cacheline_aligned;
+-
++};
+-extern struct softnet_data softnet_data[NR_CPUS];
++DECLARE_PER_CPU(struct softnet_data,softnet_data);
+ #define HAVE_NETIF_QUEUE
+@@ -555,12 +555,12 @@ static inline void __netif_schedule(stru
+ {
+       if (!test_and_set_bit(__LINK_STATE_SCHED, &dev->state)) {
+               unsigned long flags;
+-              int cpu;
++              struct softnet_data *sd;
+               local_irq_save(flags);
+-              cpu = smp_processor_id();
+-              dev->next_sched = softnet_data[cpu].output_queue;
+-              softnet_data[cpu].output_queue = dev;
++              sd = &__get_cpu_var(softnet_data);
++              dev->next_sched = sd->output_queue;
++              sd->output_queue = dev;
+               raise_softirq_irqoff(NET_TX_SOFTIRQ);
+               local_irq_restore(flags);
+       }
+@@ -605,13 +605,13 @@ static inline int netif_running(const st
+ static inline void dev_kfree_skb_irq(struct sk_buff *skb)
+ {
+       if (atomic_dec_and_test(&skb->users)) {
+-              int cpu;
++              struct softnet_data *sd;
+               unsigned long flags;
+               local_irq_save(flags);
+-              cpu = smp_processor_id();
+-              skb->next = softnet_data[cpu].completion_queue;
+-              softnet_data[cpu].completion_queue = skb;
++              sd = &__get_cpu_var(softnet_data);
++              skb->next = sd->completion_queue;
++              sd->completion_queue = skb;
+               raise_softirq_irqoff(NET_TX_SOFTIRQ);
+               local_irq_restore(flags);
+       }
+@@ -769,12 +769,10 @@ static inline int netif_rx_schedule_prep
+ static inline void __netif_rx_schedule(struct net_device *dev)
+ {
+       unsigned long flags;
+-      int cpu;
+       local_irq_save(flags);
+-      cpu = smp_processor_id();
+       dev_hold(dev);
+-      list_add_tail(&dev->poll_list, &softnet_data[cpu].poll_list);
++      list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);
+       if (dev->quota < 0)
+               dev->quota += dev->weight;
+       else
+@@ -798,13 +796,11 @@ static inline int netif_rx_reschedule(st
+ {
+       if (netif_rx_schedule_prep(dev)) {
+               unsigned long flags;
+-              int cpu;
+               dev->quota += undo;
+               local_irq_save(flags);
+-              cpu = smp_processor_id();
+-              list_add_tail(&dev->poll_list, &softnet_data[cpu].poll_list);
++              list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);
+               __raise_softirq_irqoff(NET_RX_SOFTIRQ);
+               local_irq_restore(flags);
+               return 1;
+--- linux-2.6.0-test1/include/linux/nfs_fs.h   2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/nfs_fs.h  2003-07-19 17:07:05.000000000 -0700
+@@ -172,6 +172,7 @@ struct nfs_inode {
+ #define NFS_INO_ADVISE_RDPLUS   0x0002          /* advise readdirplus */
+ #define NFS_INO_REVALIDATING  0x0004          /* revalidating attrs */
+ #define NFS_INO_FLUSH         0x0008          /* inode is due for flushing */
++#define NFS_INO_FAKE_ROOT     0x0080          /* root inode placeholder */
+ static inline struct nfs_inode *NFS_I(struct inode *inode)
+ {
+@@ -207,6 +208,7 @@ do { \
+ #define NFS_FLAGS(inode)              (NFS_I(inode)->flags)
+ #define NFS_REVALIDATING(inode)               (NFS_FLAGS(inode) & NFS_INO_REVALIDATING)
+ #define NFS_STALE(inode)              (NFS_FLAGS(inode) & NFS_INO_STALE)
++#define NFS_FAKE_ROOT(inode)          (NFS_FLAGS(inode) & NFS_INO_FAKE_ROOT)
+ #define NFS_FILEID(inode)             (NFS_I(inode)->fileid)
+@@ -269,7 +271,7 @@ nfs_file_cred(struct file *file)
+ /*
+  * linux/fs/nfs/direct.c
+  */
+-extern int nfs_direct_IO(int, struct file *, const struct iovec *, loff_t,
++extern int nfs_direct_IO(int, struct kiocb *, const struct iovec *, loff_t,
+                       unsigned long);
+ /*
+--- linux-2.6.0-test1/include/linux/nfs_fs_sb.h        2003-06-14 12:18:52.000000000 -0700
++++ 25/include/linux/nfs_fs_sb.h       2003-07-19 17:03:51.000000000 -0700
+@@ -9,6 +9,7 @@
+  */
+ struct nfs_server {
+       struct rpc_clnt *       client;         /* RPC client handle */
++      struct rpc_clnt *       client_sys;     /* 2nd handle for FSINFO */
+       struct nfs_rpc_ops *    rpc_ops;        /* NFS protocol vector */
+       struct backing_dev_info backing_dev_info;
+       int                     flags;          /* various flags */
+--- linux-2.6.0-test1/include/linux/nfs_mount.h        2003-06-14 12:17:56.000000000 -0700
++++ 25/include/linux/nfs_mount.h       2003-07-19 17:03:51.000000000 -0700
+@@ -20,7 +20,7 @@
+  * mount-to-kernel version compatibility.  Some of these aren't used yet
+  * but here they are anyway.
+  */
+-#define NFS_MOUNT_VERSION     4
++#define NFS_MOUNT_VERSION     5
+ struct nfs_mount_data {
+       int             version;                /* 1 */
+@@ -40,7 +40,7 @@ struct nfs_mount_data {
+       int             namlen;                 /* 2 */
+       unsigned int    bsize;                  /* 3 */
+       struct nfs3_fh  root;                   /* 4 */
+-      int             pseudoflavor;           /* 4 */
++      int             pseudoflavor;           /* 5 */
+ };
+ /* bits in the flags field */
+@@ -57,7 +57,7 @@ struct nfs_mount_data {
+ #define NFS_MOUNT_NONLM               0x0200  /* 3 */
+ #define NFS_MOUNT_BROKEN_SUID 0x0400  /* 4 */
+ #define NFS_MOUNT_STRICTLOCK  0x1000  /* reserved for NFSv4 */
+-#define NFS_MOUNT_SECFLAVOUR  0x2000  /* reserved */
++#define NFS_MOUNT_SECFLAVOUR  0x2000  /* 5 */
+ #define NFS_MOUNT_FLAGMASK    0xFFFF
+ #endif
+--- linux-2.6.0-test1/include/linux/nfs_page.h 2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/nfs_page.h        2003-07-19 17:07:05.000000000 -0700
+@@ -46,7 +46,6 @@ extern       struct nfs_page *nfs_create_reque
+                                           unsigned int, unsigned int);
+ extern        void nfs_clear_request(struct nfs_page *req);
+ extern        void nfs_release_request(struct nfs_page *req);
+-extern        void nfs_release_list(struct list_head *list);
+ extern        void nfs_list_add_request(struct nfs_page *, struct list_head *);
+@@ -56,7 +55,6 @@ extern       int nfs_scan_list(struct list_hea
+ extern        int nfs_coalesce_requests(struct list_head *, struct list_head *,
+                                 unsigned int);
+ extern  int nfs_wait_on_request(struct nfs_page *);
+-extern        int nfs_wait_for_reads(struct list_head *);
+ extern        spinlock_t nfs_wreq_lock;
+--- linux-2.6.0-test1/include/linux/nfs_xdr.h  2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/nfs_xdr.h 2003-07-19 17:07:07.000000000 -0700
+@@ -591,6 +591,7 @@ struct nfs4_compound {
+ #endif /* CONFIG_NFS_V4 */
+ struct nfs_read_data {
++      int                     flags;
+       struct rpc_task         task;
+       struct inode            *inode;
+       struct rpc_cred         *cred;
+@@ -605,6 +606,7 @@ struct nfs_read_data {
+ };
+ struct nfs_write_data {
++      int                     flags;
+       struct rpc_task         task;
+       struct inode            *inode;
+       struct rpc_cred         *cred;
+@@ -634,16 +636,9 @@ struct nfs_rpc_ops {
+                           struct nfs_fh *, struct nfs_fattr *);
+       int     (*access)  (struct inode *, struct rpc_cred *, int);
+       int     (*readlink)(struct inode *, struct page *);
+-      int     (*read)    (struct inode *, struct rpc_cred *,
+-                          struct nfs_fattr *,
+-                          int, unsigned int, unsigned int,
+-                          struct page *, int *eofp);
+-      int     (*write)   (struct inode *, struct rpc_cred *,
+-                          struct nfs_fattr *,
+-                          int, unsigned int, unsigned int,
+-                          struct page *, struct nfs_writeverf *verfp);
+-      int     (*commit)  (struct inode *, struct nfs_fattr *,
+-                          unsigned long, unsigned int);
++      int     (*read)    (struct nfs_read_data *);
++      int     (*write)   (struct nfs_write_data *);
++      int     (*commit)  (struct nfs_write_data *);
+       int     (*create)  (struct inode *, struct qstr *, struct iattr *,
+                           int, struct nfs_fh *, struct nfs_fattr *);
+       int     (*remove)  (struct inode *, struct qstr *);
+--- linux-2.6.0-test1/include/linux/node.h     2003-06-14 12:18:34.000000000 -0700
++++ 25/include/linux/node.h    2003-07-19 17:04:07.000000000 -0700
+@@ -20,9 +20,10 @@
+ #define _LINUX_NODE_H_
+ #include <linux/sysdev.h>
++#include <linux/cpumask.h>
+ struct node {
+-      unsigned long cpumap;   /* Bitmap of CPUs on the Node */
++      cpumask_t cpumap;       /* Bitmap of CPUs on the Node */
+       struct sys_device       sysdev;
+ };
+--- linux-2.6.0-test1/include/linux/pagemap.h  2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/pagemap.h 2003-07-19 17:07:00.000000000 -0700
+@@ -130,17 +130,27 @@ static inline void ___add_to_page_cache(
+ extern void FASTCALL(__lock_page(struct page *page));
+ extern void FASTCALL(unlock_page(struct page *page));
+-static inline void lock_page(struct page *page)
++
++extern int FASTCALL(__lock_page_wq(struct page *page, wait_queue_t *wait));
++static inline int lock_page_wq(struct page *page, wait_queue_t *wait)
+ {
+       if (TestSetPageLocked(page))
+-              __lock_page(page);
++              return __lock_page_wq(page, wait);
++      else
++              return 0;
++}
++
++static inline void lock_page(struct page *page)
++{
++      lock_page_wq(page, NULL);
+ }
+       
+ /*
+  * This is exported only for wait_on_page_locked/wait_on_page_writeback.
+  * Never use this directly!
+  */
+-extern void FASTCALL(wait_on_page_bit(struct page *page, int bit_nr));
++extern int FASTCALL(wait_on_page_bit_wq(struct page *page, int bit_nr,
++      wait_queue_t *wait));
+ /* 
+  * Wait for a page to be unlocked.
+@@ -149,19 +159,33 @@ extern void FASTCALL(wait_on_page_bit(st
+  * ie with increased "page->count" so that the page won't
+  * go away during the wait..
+  */
+-static inline void wait_on_page_locked(struct page *page)
++static inline int wait_on_page_locked_wq(struct page *page, wait_queue_t *wait)
+ {
+       if (PageLocked(page))
+-              wait_on_page_bit(page, PG_locked);
++              return wait_on_page_bit_wq(page, PG_locked, wait);
++      return 0;
++}
++
++static inline void wait_on_page_locked(struct page *page)
++{
++      wait_on_page_locked_wq(page, NULL);
+ }
+ /* 
+  * Wait for a page to complete writeback
+  */
+-static inline void wait_on_page_writeback(struct page *page)
++
++static inline int wait_on_page_writeback_wq(struct page *page,
++                                              wait_queue_t *wait)
+ {
+       if (PageWriteback(page))
+-              wait_on_page_bit(page, PG_writeback);
++              return wait_on_page_bit_wq(page, PG_writeback, wait);
++      return 0;
++}
++
++static inline void wait_on_page_writeback(struct page *page)
++{
++      wait_on_page_writeback_wq(page, NULL);
+ }
+ extern void end_page_writeback(struct page *page);
+--- linux-2.6.0-test1/include/linux/pci.h      2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/pci.h     2003-07-19 17:03:51.000000000 -0700
+@@ -715,7 +715,6 @@ static inline int pci_dac_set_dma_mask(s
+ static inline int pci_assign_resource(struct pci_dev *dev, int i) { return -EBUSY;}
+ static inline int pci_register_driver(struct pci_driver *drv) { return 0;}
+ static inline void pci_unregister_driver(struct pci_driver *drv) { }
+-static inline int scsi_to_pci_dma_dir(unsigned char scsi_dir) { return scsi_dir; }
+ static inline int pci_find_capability (struct pci_dev *dev, int cap) {return 0; }
+ static inline const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev) { return NULL; }
+--- linux-2.6.0-test1/include/linux/raid/md_k.h        2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/raid/md_k.h       2003-07-19 17:06:39.000000000 -0700
+@@ -64,11 +64,7 @@ static inline int level_to_pers (int lev
+ typedef struct mddev_s mddev_t;
+ typedef struct mdk_rdev_s mdk_rdev_t;
+-#if (MINORBITS != 8)
+-#error MD does not handle bigger kdev yet
+-#endif
+-
+-#define MAX_MD_DEVS  (1<<MINORBITS)   /* Max number of md dev */
++#define MAX_MD_DEVS  256      /* Max number of md dev */
+ /*
+  * options passed in raidrun:
+--- linux-2.6.0-test1/include/linux/rcupdate.h 2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/rcupdate.h        2003-07-19 17:04:56.000000000 -0700
+@@ -40,6 +40,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/threads.h>
+ #include <linux/percpu.h>
++#include <linux/cpumask.h>
+ /**
+  * struct rcu_head - callback structure for use with RCU
+@@ -67,7 +68,7 @@ struct rcu_ctrlblk {
+       spinlock_t      mutex;          /* Guard this struct                  */
+       long            curbatch;       /* Current batch number.              */
+       long            maxbatch;       /* Max requested batch number.        */
+-      unsigned long   rcu_cpu_mask;   /* CPUs that need to switch in order  */
++      cpumask_t       rcu_cpu_mask;   /* CPUs that need to switch in order  */
+                                       /* for current batch to proceed.      */
+ };
+@@ -95,6 +96,8 @@ struct rcu_data {
+         long                  batch;           /* Batch # for current RCU batch */
+         struct list_head  nxtlist;
+         struct list_head  curlist;
++      long            nr_rcureqs;
++      long            nr_rcupdates;
+ };
+ DECLARE_PER_CPU(struct rcu_data, rcu_data);
+@@ -105,6 +108,8 @@ extern struct rcu_ctrlblk rcu_ctrlblk;
+ #define RCU_batch(cpu)                (per_cpu(rcu_data, (cpu)).batch)
+ #define RCU_nxtlist(cpu)      (per_cpu(rcu_data, (cpu)).nxtlist)
+ #define RCU_curlist(cpu)      (per_cpu(rcu_data, (cpu)).curlist)
++#define RCU_nr_rcureqs(cpu)   (per_cpu(rcu_data, (cpu)).nr_rcureqs)
++#define RCU_nr_rcupdates(cpu)         (per_cpu(rcu_data, (cpu)).nr_rcupdates)
+ #define RCU_QSCTR_INVALID     0
+@@ -114,7 +119,7 @@ static inline int rcu_pending(int cpu) 
+            rcu_batch_before(RCU_batch(cpu), rcu_ctrlblk.curbatch)) ||
+           (list_empty(&RCU_curlist(cpu)) &&
+                        !list_empty(&RCU_nxtlist(cpu))) ||
+-          test_bit(cpu, &rcu_ctrlblk.rcu_cpu_mask))
++          cpu_isset(cpu, rcu_ctrlblk.rcu_cpu_mask))
+               return 1;
+       else
+               return 0;
+--- linux-2.6.0-test1/include/linux/root_dev.h 2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/root_dev.h        2003-07-19 17:06:39.000000000 -0700
+@@ -1,18 +1,16 @@
+ #ifndef _ROOT_DEV_H_
+ #define _ROOT_DEV_H_
+-enum {
+-      Root_NFS = MKDEV(UNNAMED_MAJOR, 255),
+-      Root_RAM0 = MKDEV(RAMDISK_MAJOR, 0),
+-      Root_RAM1 = MKDEV(RAMDISK_MAJOR, 1),
+-      Root_FD0 = MKDEV(FLOPPY_MAJOR, 0),
+-      Root_HDA1 = MKDEV(IDE0_MAJOR, 1),
+-      Root_HDA2 = MKDEV(IDE0_MAJOR, 2),
+-      Root_SDA1 = MKDEV(SCSI_DISK0_MAJOR, 1),
+-      Root_SDA2 = MKDEV(SCSI_DISK0_MAJOR, 2),
+-      Root_HDC1 = MKDEV(IDE1_MAJOR, 1),
+-      Root_SR0 = MKDEV(SCSI_CDROM_MAJOR, 0),
+-};
++#define       Root_NFS        MKDEV(UNNAMED_MAJOR, 255)
++#define       Root_RAM0       MKDEV(RAMDISK_MAJOR, 0)
++#define       Root_RAM1       MKDEV(RAMDISK_MAJOR, 1)
++#define       Root_FD0        MKDEV(FLOPPY_MAJOR, 0)
++#define       Root_HDA1       MKDEV(IDE0_MAJOR, 1)
++#define       Root_HDA2       MKDEV(IDE0_MAJOR, 2)
++#define       Root_SDA1       MKDEV(SCSI_DISK0_MAJOR, 1)
++#define       Root_SDA2       MKDEV(SCSI_DISK0_MAJOR, 2)
++#define       Root_HDC1       MKDEV(IDE1_MAJOR, 1)
++#define       Root_SR0        MKDEV(SCSI_CDROM_MAJOR, 0)
+ extern dev_t ROOT_DEV;
+--- linux-2.6.0-test1/include/linux/sched.h    2003-07-10 18:50:32.000000000 -0700
++++ 25/include/linux/sched.h   2003-07-19 17:07:10.000000000 -0700
+@@ -12,6 +12,7 @@
+ #include <linux/jiffies.h>
+ #include <linux/rbtree.h>
+ #include <linux/thread_info.h>
++#include <linux/cpumask.h>
+ #include <asm/system.h>
+ #include <asm/semaphore.h>
+@@ -52,6 +53,7 @@ struct exec_domain;
+ #define CLONE_DETACHED                0x00400000      /* parent wants no child-exit signal */
+ #define CLONE_UNTRACED                0x00800000      /* set if the tracing process can't force CLONE_PTRACE on this clone */
+ #define CLONE_CHILD_SETTID    0x01000000      /* set the TID in the child */
++#define CLONE_STOPPED         0x02000000      /* Start in stopped state */
+ /*
+  * List of flags we want to share for kernel threads,
+@@ -149,6 +151,7 @@ extern void init_idle(task_t *idle, int 
+ extern void show_state(void);
+ extern void show_regs(struct pt_regs *);
++extern void show_trace_task(task_t *tsk);
+ /*
+  * TASK is a pointer to the task whose backtrace we want to see (or NULL for current
+@@ -202,7 +205,7 @@ struct mm_struct {
+       unsigned long arg_start, arg_end, env_start, env_end;
+       unsigned long rss, total_vm, locked_vm;
+       unsigned long def_flags;
+-      unsigned long cpu_vm_mask;
++      cpumask_t cpu_vm_mask;
+       unsigned long swap_address;
+       unsigned dumpable:1;
+@@ -338,10 +341,11 @@ struct task_struct {
+       prio_array_t *array;
+       unsigned long sleep_avg;
++      unsigned long avg_start;
+       unsigned long last_run;
+       unsigned long policy;
+-      unsigned long cpus_allowed;
++      cpumask_t cpus_allowed;
+       unsigned int time_slice, first_time_slice;
+       struct list_head tasks;
+@@ -456,12 +460,24 @@ struct task_struct {
+       unsigned long ptrace_message;
+       siginfo_t *last_siginfo; /* For ptrace use.  */
++      long debug;
++/*
++ * current io wait handle: wait queue entry to use for io waits
++ * If this thread is processing aio, this points at the waitqueue
++ * inside the currently handled kiocb. It may be NULL (i.e. default
++ * to a stack based synchronous wait) if its doing sync IO.
++ */
++      wait_queue_t *io_wait;
+ };
+ extern void __put_task_struct(struct task_struct *tsk);
+ #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0)
+-#define put_task_struct(tsk) \
+-do { if (atomic_dec_and_test(&(tsk)->usage)) __put_task_struct(tsk); } while(0)
++#define put_task_struct(tsk)                                  \
++      do {                                                    \
++              BUG_ON((tsk)->debug == 0x6b6b6b6b);             \
++              if (atomic_dec_and_test(&(tsk)->usage))         \
++                      __put_task_struct(tsk);                 \
++      } while (0)
+ /*
+  * Per process flags
+@@ -488,9 +504,9 @@ do { if (atomic_dec_and_test(&(tsk)->usa
+ #define PF_SYNCWRITE  0x00200000      /* I am doing a sync write */
+ #ifdef CONFIG_SMP
+-extern int set_cpus_allowed(task_t *p, unsigned long new_mask);
++extern int set_cpus_allowed(task_t *p, cpumask_t new_mask);
+ #else
+-static inline int set_cpus_allowed(task_t *p, unsigned long new_mask)
++static inline int set_cpus_allowed(task_t *p, cpumask_t new_mask)
+ {
+       return 0;
+ }
+@@ -636,6 +652,8 @@ static inline void mmdrop(struct mm_stru
+ /* mmput gets rid of the mappings and all user-space */
+ extern void mmput(struct mm_struct *);
++/* Grab a reference to the mm if its not already going away */
++extern struct mm_struct *mmgrab(struct mm_struct *);
+ /* Remove the current tasks stale references to the old mm_struct */
+ extern void mm_release(struct task_struct *, struct mm_struct *);
+@@ -743,7 +761,7 @@ static inline struct mm_struct * get_tas
+       task_lock(task);
+       mm = task->mm;
+       if (mm)
+-              atomic_inc(&mm->mm_users);
++              mm = mmgrab(mm);
+       task_unlock(task);
+       return mm;
+--- linux-2.6.0-test1/include/linux/serial_core.h      2003-06-14 12:17:58.000000000 -0700
++++ 25/include/linux/serial_core.h     2003-07-19 17:03:51.000000000 -0700
+@@ -57,7 +57,7 @@
+ #define PORT_SUNSAB   39
+ /* NEC v850.  */
+-#define PORT_NB85E_UART       40
++#define PORT_V850E_UART       40
+ /* NEC PC-9800 */
+ #define PORT_8251_PC98        41
+--- linux-2.6.0-test1/include/linux/smp.h      2003-06-14 12:18:22.000000000 -0700
++++ 25/include/linux/smp.h     2003-07-19 17:04:07.000000000 -0700
+@@ -102,9 +102,6 @@ void smp_prepare_boot_cpu(void);
+ #define smp_call_function(func,info,retry,wait)       ({ 0; })
+ #define on_each_cpu(func,info,retry,wait)     ({ func(info); 0; })
+ static inline void smp_send_reschedule(int cpu) { }
+-#define cpu_online_map                                1
+-#define cpu_online(cpu)                               ({ BUG_ON((cpu) != 0); 1; })
+-#define num_online_cpus()                     1
+ #define num_booting_cpus()                    1
+ #define cpu_possible(cpu)                     ({ BUG_ON((cpu) != 0); 1; })
+ #define smp_prepare_boot_cpu()                        do {} while (0)
+--- linux-2.6.0-test1/include/linux/spinlock.h 2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/spinlock.h        2003-07-19 17:06:40.000000000 -0700
+@@ -184,6 +184,17 @@ typedef struct {
+ #endif /* !SMP */
++#ifdef CONFIG_LOCKMETER
++extern void _metered_spin_lock   (spinlock_t *lock);
++extern void _metered_spin_unlock (spinlock_t *lock);
++extern int  _metered_spin_trylock(spinlock_t *lock);
++extern void _metered_read_lock    (rwlock_t *lock);
++extern void _metered_read_unlock  (rwlock_t *lock);
++extern void _metered_write_lock   (rwlock_t *lock);
++extern void _metered_write_unlock (rwlock_t *lock);
++extern int  _metered_write_trylock(rwlock_t *lock);
++#endif
++
+ /*
+  * Define the various spin_lock and rw_lock methods.  Note we define these
+  * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
+@@ -389,6 +400,141 @@ do { \
+                               _raw_spin_trylock(lock) ? 1 : \
+                               ({preempt_enable(); local_bh_enable(); 0;});})
++#ifdef CONFIG_LOCKMETER
++#undef spin_lock
++#undef spin_trylock
++#undef spin_unlock
++#undef spin_lock_irqsave
++#undef spin_lock_irq
++#undef spin_lock_bh
++#undef read_lock
++#undef read_unlock
++#undef write_lock
++#undef write_unlock
++#undef write_trylock
++#undef spin_unlock_bh
++#undef read_lock_irqsave
++#undef read_lock_irq
++#undef read_lock_bh
++#undef read_unlock_bh
++#undef write_lock_irqsave
++#undef write_lock_irq
++#undef write_lock_bh
++#undef write_unlock_bh
++
++#define spin_lock(lock) \
++do { \
++      preempt_disable(); \
++      _metered_spin_lock(lock); \
++} while(0)
++
++#define spin_trylock(lock)     ({preempt_disable(); _metered_spin_trylock(lock) ? \
++                              1 : ({preempt_enable(); 0;});})
++#define spin_unlock(lock) \
++do { \
++      _metered_spin_unlock(lock); \
++      preempt_enable(); \
++} while (0)
++
++#define spin_lock_irqsave(lock, flags) \
++do { \
++      local_irq_save(flags); \
++      preempt_disable(); \
++      _metered_spin_lock(lock); \
++} while (0)
++
++#define spin_lock_irq(lock) \
++do { \
++      local_irq_disable(); \
++      preempt_disable(); \
++      _metered_spin_lock(lock); \
++} while (0)
++
++#define spin_lock_bh(lock) \
++do { \
++      local_bh_disable(); \
++      preempt_disable(); \
++      _metered_spin_lock(lock); \
++} while (0)
++
++#define spin_unlock_bh(lock) \
++do { \
++      _metered_spin_unlock(lock); \
++      preempt_enable(); \
++      local_bh_enable(); \
++} while (0)
++
++
++#define read_lock(lock)                ({preempt_disable(); _metered_read_lock(lock);})
++#define read_unlock(lock)      ({_metered_read_unlock(lock); preempt_enable();})
++#define write_lock(lock)       ({preempt_disable(); _metered_write_lock(lock);})
++#define write_unlock(lock)     ({_metered_write_unlock(lock); preempt_enable();})
++#define write_trylock(lock)    ({preempt_disable();_metered_write_trylock(lock) ? \
++                              1 : ({preempt_enable(); 0;});})
++#define spin_unlock_no_resched(lock) \
++do { \
++      _metered_spin_unlock(lock); \
++      preempt_enable_no_resched(); \
++} while (0)
++
++#define read_lock_irqsave(lock, flags) \
++do { \
++      local_irq_save(flags); \
++      preempt_disable(); \
++      _metered_read_lock(lock); \
++} while (0)
++
++#define read_lock_irq(lock) \
++do { \
++      local_irq_disable(); \
++      preempt_disable(); \
++      _metered_read_lock(lock); \
++} while (0)
++
++#define read_lock_bh(lock) \
++do { \
++      local_bh_disable(); \
++      preempt_disable(); \
++      _metered_read_lock(lock); \
++} while (0)
++
++#define read_unlock_bh(lock) \
++do { \
++      _metered_read_unlock(lock); \
++      preempt_enable(); \
++      local_bh_enable(); \
++} while (0)
++
++#define write_lock_irqsave(lock, flags) \
++do { \
++      local_irq_save(flags); \
++      preempt_disable(); \
++      _metered_write_lock(lock); \
++} while (0)
++
++#define write_lock_irq(lock) \
++do { \
++      local_irq_disable(); \
++      preempt_disable(); \
++      _metered_write_lock(lock); \
++} while (0)
++
++#define write_lock_bh(lock) \
++do { \
++      local_bh_disable(); \
++      preempt_disable(); \
++      _metered_write_lock(lock); \
++} while (0)
++
++#define write_unlock_bh(lock) \
++do { \
++      _metered_write_unlock(lock); \
++      preempt_enable(); \
++      local_bh_enable(); \
++} while (0)
++
++#endif /* !CONFIG_LOCKMETER */
++
+ /* "lock on reference count zero" */
+ #ifndef ATOMIC_DEC_AND_LOCK
+ #include <asm/atomic.h>
+--- linux-2.6.0-test1/include/linux/times.h    2003-06-14 12:17:57.000000000 -0700
++++ 25/include/linux/times.h   2003-07-19 17:03:51.000000000 -0700
+@@ -11,6 +11,26 @@
+ # define jiffies_to_clock_t(x) ((clock_t) jiffies_64_to_clock_t((u64) x))
+ #endif
++static inline unsigned long clock_t_to_jiffies(unsigned long x)
++{
++#if (HZ % USER_HZ)==0
++      if (x >= ~0UL / (HZ / USER_HZ))
++              return ~0UL;
++      return x * (HZ / USER_HZ);
++#else
++      u64 jif;
++
++      /* Don't worry about loss of precision here .. */
++      if (x >= ~0UL / HZ * USER_HZ)
++              return ~0UL;
++
++      /* .. but do try to contain it here */
++      jif = x * (u64) HZ;
++      do_div(jif, USER_HZ);
++      return jif;
++#endif
++}
++
+ static inline u64 jiffies_64_to_clock_t(u64 x)
+ {
+ #if (HZ % USER_HZ)==0
+--- linux-2.6.0-test1/include/linux/topology.h 2003-06-14 12:18:25.000000000 -0700
++++ 25/include/linux/topology.h        2003-07-19 17:04:07.000000000 -0700
+@@ -27,6 +27,7 @@
+ #ifndef _LINUX_TOPOLOGY_H
+ #define _LINUX_TOPOLOGY_H
++#include <linux/cpumask.h>
+ #include <linux/bitops.h>
+ #include <linux/mmzone.h>
+ #include <linux/smp.h>
+@@ -34,7 +35,12 @@
+ #include <asm/topology.h>
+ #ifndef nr_cpus_node
+-#define nr_cpus_node(node)    (hweight_long(node_to_cpumask(node)))
++#define nr_cpus_node(node)                                                    \
++      ({                                                                      \
++              cpumask_t __tmp__;                                              \
++              __tmp__ = node_to_cpumask(node);                                \
++              cpus_weight(__tmp__);                                           \
++      })
+ #endif
+ static inline int __next_node_with_cpus(int node)
+--- linux-2.6.0-test1/include/linux/tty.h      2003-06-14 12:18:21.000000000 -0700
++++ 25/include/linux/tty.h     2003-07-19 17:03:51.000000000 -0700
+@@ -57,40 +57,40 @@
+  */
+ struct screen_info {
+-      unsigned char  orig_x;                  /* 0x00 */
+-      unsigned char  orig_y;                  /* 0x01 */
+-      unsigned short dontuse1;                /* 0x02 -- EXT_MEM_K sits here */
+-      unsigned short orig_video_page;         /* 0x04 */
+-      unsigned char  orig_video_mode;         /* 0x06 */
+-      unsigned char  orig_video_cols;         /* 0x07 */
+-      unsigned short unused2;                 /* 0x08 */
+-      unsigned short orig_video_ega_bx;       /* 0x0a */
+-      unsigned short unused3;                 /* 0x0c */
+-      unsigned char  orig_video_lines;        /* 0x0e */
+-      unsigned char  orig_video_isVGA;        /* 0x0f */
+-      unsigned short orig_video_points;       /* 0x10 */
++      u8  orig_x;             /* 0x00 */
++      u8  orig_y;             /* 0x01 */
++      u16 dontuse1;           /* 0x02 -- EXT_MEM_K sits here */
++      u16 orig_video_page;    /* 0x04 */
++      u8  orig_video_mode;    /* 0x06 */
++      u8  orig_video_cols;    /* 0x07 */
++      u16 unused2;            /* 0x08 */
++      u16 orig_video_ega_bx;  /* 0x0a */
++      u16 unused3;            /* 0x0c */
++      u8  orig_video_lines;   /* 0x0e */
++      u8  orig_video_isVGA;   /* 0x0f */
++      u16 orig_video_points;  /* 0x10 */
+       /* VESA graphic mode -- linear frame buffer */
+-      unsigned short lfb_width;               /* 0x12 */
+-      unsigned short lfb_height;              /* 0x14 */
+-      unsigned short lfb_depth;               /* 0x16 */
+-      unsigned long  lfb_base;                /* 0x18 */
+-      unsigned long  lfb_size;                /* 0x1c */
+-      unsigned short dontuse2, dontuse3;      /* 0x20 -- CL_MAGIC and CL_OFFSET here */
+-      unsigned short lfb_linelength;          /* 0x24 */
+-      unsigned char  red_size;                /* 0x26 */
+-      unsigned char  red_pos;                 /* 0x27 */
+-      unsigned char  green_size;              /* 0x28 */
+-      unsigned char  green_pos;               /* 0x29 */
+-      unsigned char  blue_size;               /* 0x2a */
+-      unsigned char  blue_pos;                /* 0x2b */
+-      unsigned char  rsvd_size;               /* 0x2c */
+-      unsigned char  rsvd_pos;                /* 0x2d */
+-      unsigned short vesapm_seg;              /* 0x2e */
+-      unsigned short vesapm_off;              /* 0x30 */
+-      unsigned short pages;                   /* 0x32 */
+-      unsigned short vesa_attributes;         /* 0x34 */
+-                                              /* 0x36 -- 0x3f reserved for future expansion */
++      u16 lfb_width;          /* 0x12 */
++      u16 lfb_height;         /* 0x14 */
++      u16 lfb_depth;          /* 0x16 */
++      u32 lfb_base;           /* 0x18 */
++      u32 lfb_size;           /* 0x1c */
++      u16 dontuse2, dontuse3; /* 0x20 -- CL_MAGIC and CL_OFFSET here */
++      u16 lfb_linelength;     /* 0x24 */
++      u8  red_size;           /* 0x26 */
++      u8  red_pos;            /* 0x27 */
++      u8  green_size;         /* 0x28 */
++      u8  green_pos;          /* 0x29 */
++      u8  blue_size;          /* 0x2a */
++      u8  blue_pos;           /* 0x2b */
++      u8  rsvd_size;          /* 0x2c */
++      u8  rsvd_pos;           /* 0x2d */
++      u16 vesapm_seg;         /* 0x2e */
++      u16 vesapm_off;         /* 0x30 */
++      u16 pages;              /* 0x32 */
++      u16 vesa_attributes;    /* 0x34 */
++                              /* 0x36 -- 0x3f reserved for future expansion */
+ };
+ extern struct screen_info screen_info;
+--- linux-2.6.0-test1/include/linux/usb.h      2003-07-02 14:53:18.000000000 -0700
++++ 25/include/linux/usb.h     2003-07-19 17:03:51.000000000 -0700
+@@ -80,7 +80,8 @@ struct usb_host_interface {
+  * @act_altsetting: index of current altsetting.  this number is always
+  *    less than num_altsetting.  after the device is configured, each
+  *    interface uses its default setting of zero.
+- * @max_altsetting:
++ * @max_altsetting: the max number of altsettings for this interface.
++ * @driver: the USB driver that is bound to this interface.
+  * @minor: the minor number assigned to this interface, if this
+  *    interface is bound to a driver that uses the USB major number.
+  *    If this interface does not use the USB major, this field should
+@@ -409,7 +410,11 @@ static inline int usb_make_path (struct 
+  *    do (or don't) show up otherwise in the filesystem.
+  * @id_table: USB drivers use ID table to support hotplugging.
+  *    Export this with MODULE_DEVICE_TABLE(usb,...).  This must be set
+- *    or your driver's probe function will never get called. 
++ *    or your driver's probe function will never get called.
++ * @driver: the driver model core driver structure.
++ * @serialize: a semaphore used to serialize access to this driver.  Used
++ *    in the probe and disconnect functions.  Only the USB core should use
++ *    this lock.
+  *
+  * USB drivers must provide a name, probe() and disconnect() methods,
+  * and an id_table.  Other driver fields are optional.
+@@ -575,6 +580,8 @@ typedef void (*usb_complete_t)(struct ur
+  *    it likes with the URB, including resubmitting or freeing it.
+  * @iso_frame_desc: Used to provide arrays of ISO transfer buffers and to 
+  *    collect the transfer status for each buffer.
++ * @timeout: If set to zero, the urb will never timeout.  Otherwise this is
++ *    the time in jiffies that this urb will timeout in.
+  *
+  * This structure identifies USB transfer requests.  URBs must be allocated by
+  * calling usb_alloc_urb() and freed with a call to usb_free_urb().
+@@ -677,10 +684,14 @@ typedef void (*usb_complete_t)(struct ur
+  */
+ struct urb
+ {
++      /* private, usb core and host controller only fields in the urb */
+       spinlock_t lock;                /* lock for the URB */
+       atomic_t count;                 /* reference count of the URB */
+       void *hcpriv;                   /* private data for host controller */
+       struct list_head urb_list;      /* list pointer to all active urbs */
++      int bandwidth;                  /* bandwidth for INT/ISO request */
++
++      /* public, documented fields in the urb that can be used by drivers */
+       struct usb_device *dev;         /* (in) pointer to associated device */
+       unsigned int pipe;              /* (in) pipe information */
+       int status;                     /* (return) non-ISO status */
+@@ -689,7 +700,6 @@ struct urb
+       dma_addr_t transfer_dma;        /* (in) dma addr for transfer_buffer */
+       int transfer_buffer_length;     /* (in) data buffer length */
+       int actual_length;              /* (return) actual transfer length */
+-      int bandwidth;                  /* bandwidth for INT/ISO request */
+       unsigned char *setup_packet;    /* (in) setup packet (control only) */
+       dma_addr_t setup_dma;           /* (in) dma addr for setup_packet */
+       int start_frame;                /* (modify) start frame (INT/ISO) */
+@@ -891,8 +901,10 @@ struct usb_sg_request {
+       int                     status;
+       size_t                  bytes;
+-      // members not documented above are private to usbcore,
+-      // and are not provided for driver access!
++      /* 
++       * members below are private to usbcore,
++       * and are not provided for driver access!
++       */
+       spinlock_t              lock;
+       struct usb_device       *dev;
+--- linux-2.6.0-test1/include/linux/wait.h     2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/wait.h    2003-07-19 17:06:43.000000000 -0700
+@@ -80,6 +80,15 @@ static inline int waitqueue_active(wait_
+       return !list_empty(&q->task_list);
+ }
++/*
++ * Used to distinguish between sync and async io wait context:
++ * sync i/o typically specifies a NULL wait queue entry or a wait
++ * queue entry bound to a task (current task) to wake up.
++ * aio specifies a wait queue entry with an async notification
++ * callback routine, not associated with any task.
++ */
++#define is_sync_wait(wait)    (!(wait) || ((wait)->task))
++
+ extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
+ extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));
+ extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
+--- linux-2.6.0-test1/include/linux/writeback.h        2003-06-26 22:07:26.000000000 -0700
++++ 25/include/linux/writeback.h       2003-07-19 17:06:57.000000000 -0700
+@@ -84,10 +84,12 @@ int dirty_writeback_centisecs_handler(st
+                                         void *, size_t *);
+ void page_writeback_init(void);
+-void balance_dirty_pages(struct address_space *mapping);
+-void balance_dirty_pages_ratelimited(struct address_space *mapping);
++int balance_dirty_pages(struct address_space *mapping);
++int balance_dirty_pages_ratelimited(struct address_space *mapping);
+ int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0);
+ int do_writepages(struct address_space *mapping, struct writeback_control *wbc);
++ssize_t sync_page_range(struct inode *inode, struct address_space *mapping,
++                      loff_t pos, size_t count);
+ /* pdflush.c */
+ extern int nr_pdflush_threads;        /* Global so it can be exported to sysctl
+--- linux-2.6.0-test1/include/media/saa7146.h  2003-07-02 14:53:18.000000000 -0700
++++ 25/include/media/saa7146.h 2003-07-19 17:03:51.000000000 -0700
+@@ -89,8 +89,6 @@ struct saa7146_extension
+ #define SAA7146_USE_I2C_IRQ   0x1
+       int     flags;
+       
+-      struct saa7146_ext_vv   *ext_vv_data;
+-      
+       /* pairs of subvendor and subdevice ids for
+          supported devices, last entry 0xffff, 0xfff */
+       struct module *module;
+@@ -134,6 +132,7 @@ struct saa7146_dev
+       /* extension handling */
+       struct saa7146_extension        *ext;           /* indicates if handled by extension */
+       void                            *ext_priv;      /* pointer for extension private use (most likely some private data) */
++      struct saa7146_ext_vv           *ext_vv_data;
+       /* per device video/vbi informations (if available) */
+       struct saa7146_vv       *vv_data;
+--- linux-2.6.0-test1/include/media/saa7146_vv.h       2003-07-02 14:53:18.000000000 -0700
++++ 25/include/media/saa7146_vv.h      2003-07-19 17:03:51.000000000 -0700
+@@ -10,12 +10,10 @@
+ #define BUFFER_TIMEOUT     (HZ/2)  /* 0.5 seconds */
+ #define WRITE_RPS0(x) do { \
+-      static int count = 0;   \
+       dev->d_rps0.cpu_addr[ count++ ] = cpu_to_le32(x); \
+       } while (0);
+ #define WRITE_RPS1(x) do { \
+-      static int count = 0;   \
+       dev->d_rps1.cpu_addr[ count++ ] = cpu_to_le32(x); \
+       } while (0);
+@@ -41,13 +39,13 @@ struct saa7146_standard
+       char          *name;
+       v4l2_std_id   id;
+-      int v_offset;
+-      int v_field;
+-      int v_calc;
++      int v_offset;   /* number of lines of vertical offset before processing */
++      int v_field;    /* number of lines in a field for HPS to process */
++      int v_calc;     /* number of vertical active lines */
+       
+-      int h_offset;
+-      int h_pixels;
+-      int h_calc;
++      int h_offset;   /* horizontal offset of processing window */
++      int h_pixels;   /* number of horizontal pixels to process */
++      int h_calc;     /* number of horizontal active pixels */
+       
+       int v_max_out;
+       int h_max_out;
+@@ -122,6 +120,7 @@ struct saa7146_vv
+       /* video capture */
+       struct saa7146_dmaqueue         video_q;
+       struct saa7146_fh               *streaming;
++      enum v4l2_field                 last_field;
+       /* common: fixme? shouldn't this be in saa7146_fh?
+          (this leads to a more complicated question: shall the driver
+@@ -166,7 +165,7 @@ struct saa7146_ext_vv
+       int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *);
+               
+       struct saa7146_extension_ioctls *ioctls;
+-      int (*ioctl)(struct saa7146_dev*, unsigned int cmd, void *arg);
++      int (*ioctl)(struct saa7146_fh*, unsigned int cmd, void *arg);
+ };
+ struct saa7146_use_ops  {
+@@ -188,7 +187,7 @@ int saa7146_buffer_queue(struct saa7146_
+ void saa7146_buffer_timeout(unsigned long data);
+ void saa7146_dma_free(struct saa7146_dev *dev,struct saa7146_buf *buf);
+-int saa7146_vv_init(struct saa7146_dev* dev);
++int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv);
+ int saa7146_vv_release(struct saa7146_dev* dev);
+@@ -201,6 +200,8 @@ void saa7146_set_gpio(struct saa7146_dev
+ /* from saa7146_video.c */
+ extern struct saa7146_use_ops saa7146_video_uops;
++int saa7146_start_preview(struct saa7146_fh *fh);
++int saa7146_stop_preview(struct saa7146_fh *fh);
+ /* from saa7146_vbi.c */
+ extern struct saa7146_use_ops saa7146_vbi_uops;
+@@ -215,35 +216,6 @@ extern struct saa7146_use_ops saa7146_vb
+ #define SAA7146_HPS_SYNC_PORT_A               0x00
+ #define SAA7146_HPS_SYNC_PORT_B               0x01
+-/* number of vertical active lines */
+-#define V_ACTIVE_LINES_PAL    576
+-#define V_ACTIVE_LINES_NTSC   480
+-#define V_ACTIVE_LINES_SECAM  576
+-
+-/* number of lines in a field for HPS to process */
+-#define V_FIELD_PAL   288
+-#define V_FIELD_NTSC  240
+-#define V_FIELD_SECAM 288
+-
+-/* number of lines of vertical offset before processing */
+-#define V_OFFSET_PAL  0x17
+-#define V_OFFSET_NTSC 0x16
+-#define V_OFFSET_SECAM        0x14
+-
+-/* number of horizontal pixels to process */
+-#define H_PIXELS_PAL  680
+-#define H_PIXELS_NTSC 708
+-#define H_PIXELS_SECAM        720
+-
+-/* horizontal offset of processing window */
+-#define H_OFFSET_PAL  0x14
+-#define H_OFFSET_NTSC 0x06
+-#define H_OFFSET_SECAM        0x14
+-
+-#define SAA7146_PAL_VALUES    V_OFFSET_PAL, V_FIELD_PAL, V_ACTIVE_LINES_PAL, H_OFFSET_PAL, H_PIXELS_PAL, H_PIXELS_PAL+1, V_ACTIVE_LINES_PAL, 768
+-#define SAA7146_NTSC_VALUES   V_OFFSET_NTSC, V_FIELD_NTSC, V_ACTIVE_LINES_NTSC, H_OFFSET_NTSC, H_PIXELS_NTSC, H_PIXELS_NTSC+1, V_ACTIVE_LINES_NTSC, 640
+-#define SAA7146_SECAM_VALUES  V_OFFSET_SECAM, V_FIELD_SECAM, V_ACTIVE_LINES_SECAM, H_OFFSET_SECAM, H_PIXELS_SECAM, H_PIXELS_SECAM+1, V_ACTIVE_LINES_SECAM, 768
+-
+ /* some memory sizes */
+ #define SAA7146_CLIPPING_MEM  (14*PAGE_SIZE)
+--- linux-2.6.0-test1/include/net/ip_vs.h      2003-07-13 21:44:35.000000000 -0700
++++ 25/include/net/ip_vs.h     2003-07-19 17:03:51.000000000 -0700
+@@ -887,7 +887,6 @@ extern int sysctl_ip_vs_cache_bypass;
+ extern int sysctl_ip_vs_expire_nodest_conn;
+ extern int sysctl_ip_vs_sync_threshold[2];
+ extern int sysctl_ip_vs_nat_icmp_send;
+-extern atomic_t ip_vs_dropentry;
+ extern struct ip_vs_stats ip_vs_stats;
+ extern struct ip_vs_service *
+@@ -902,7 +901,6 @@ extern struct ip_vs_dest *
+ ip_vs_lookup_real_service(__u16 protocol, __u32 daddr, __u16 dport);
+ extern int ip_vs_use_count_inc(void);
+ extern void ip_vs_use_count_dec(void);
+-extern void update_defense_level(void);
+ extern int ip_vs_control_init(void);
+ extern void ip_vs_control_cleanup(void);
+--- linux-2.6.0-test1/include/pcmcia/ss.h      2003-07-13 21:44:35.000000000 -0700
++++ 25/include/pcmcia/ss.h     2003-07-19 17:03:51.000000000 -0700
+@@ -51,6 +51,7 @@
+ #define SS_3VCARD     0x1000
+ #define SS_XVCARD     0x2000
+ #define SS_PENDING    0x4000
++#define SS_ZVCARD     0x8000
+ /* InquireSocket capabilities */
+ #define SS_CAP_PAGE_REGS      0x0001
+@@ -209,6 +210,10 @@ struct pcmcia_socket {
+       /* socket operations */
+       struct pccard_operations *      ops;
++      /* Zoom video behaviour is so chip specific its not worth adding
++         this to _ops */
++      void                            (*zoom_video)(struct pcmcia_socket *, int);
++                           
+       /* state thread */
+       struct semaphore                skt_sem;        /* protects socket h/w state */
+--- linux-2.6.0-test1/include/scsi/scsi_device.h       2003-07-02 14:53:18.000000000 -0700
++++ 25/include/scsi/scsi_device.h      2003-07-19 17:03:51.000000000 -0700
+@@ -11,8 +11,6 @@ struct scsi_mode_data;
+ struct scsi_device {
+-      struct class_device     sdev_classdev;
+-
+       struct list_head    siblings;   /* list of all devices on this host */
+       struct list_head    same_target_siblings; /* just the devices sharing same target id */
+       struct Scsi_Host *host;
+@@ -86,10 +84,11 @@ struct scsi_device {
+       unsigned int max_device_blocked; /* what device_blocked counts down from  */
+ #define SCSI_DEFAULT_DEVICE_BLOCKED   3
+-      struct device sdev_driverfs_dev;
++      struct device           sdev_gendev;
++      struct class_device     sdev_classdev;
+ };
+ #define       to_scsi_device(d)       \
+-      container_of(d, struct scsi_device, sdev_driverfs_dev)
++      container_of(d, struct scsi_device, sdev_gendev)
+ extern struct scsi_device *scsi_add_device(struct Scsi_Host *,
+               uint, uint, uint);
+--- linux-2.6.0-test1/include/scsi/scsi_host.h 2003-06-22 12:04:45.000000000 -0700
++++ 25/include/scsi/scsi_host.h        2003-07-19 17:03:51.000000000 -0700
+@@ -329,12 +329,12 @@ struct scsi_host_template {
+ #define SCSI_DEFAULT_HOST_BLOCKED     7
+       /*
+-       * Pointer to the sysfs class properties for this host
++       * Pointer to the sysfs class properties for this host, NULL terminated.
+        */
+       struct class_device_attribute **shost_attrs;
+       /*
+-       * Pointer to the SCSI device properties for this host
++       * Pointer to the SCSI device properties for this host, NULL terminated.
+        */
+       struct device_attribute **sdev_attrs;
+@@ -442,12 +442,6 @@ struct Scsi_Host {
+        */
+       unsigned int max_host_blocked;
+-      /* 
+-       * Support for sysfs
+-       */
+-      struct device host_gendev;
+-      struct class_device class_dev;
+-
+       /* legacy crap */
+       unsigned long base;
+       unsigned long io_port;
+@@ -455,6 +449,9 @@ struct Scsi_Host {
+       unsigned char dma_channel;
+       unsigned int  irq;
++      /* ldm bits */
++      struct device           shost_gendev;
++      struct class_device     shost_classdev;
+       /*
+        * List of hosts per template.
+@@ -474,12 +471,13 @@ struct Scsi_Host {
+               __attribute__ ((aligned (sizeof(unsigned long))));
+ };
+ #define               dev_to_shost(d)         \
+-      container_of(d, struct Scsi_Host, host_gendev)
++      container_of(d, struct Scsi_Host, shost_gendev)
+ #define               class_to_shost(d)       \
+-      container_of(d, struct Scsi_Host, class_dev)
++      container_of(d, struct Scsi_Host, shost_classdev)
+ extern struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *, int);
+ extern int scsi_add_host(struct Scsi_Host *, struct device *);
++extern void scsi_scan_host(struct Scsi_Host *);
+ extern int scsi_remove_host(struct Scsi_Host *);
+ extern void scsi_host_get(struct Scsi_Host *);
+ extern void scsi_host_put(struct Scsi_Host *t);
+@@ -495,16 +493,14 @@ static inline void scsi_assign_lock(stru
+ static inline void scsi_set_device(struct Scsi_Host *shost,
+                                    struct device *dev)
+ {
+-        shost->host_gendev.parent = dev;
++        shost->shost_gendev.parent = dev;
+ }
+ static inline struct device *scsi_get_device(struct Scsi_Host *shost)
+ {
+-        return shost->host_gendev.parent;
++        return shost->shost_gendev.parent;
+ }
+-extern void scsi_sysfs_release_attributes(struct scsi_host_template *);
+-
+ extern void scsi_unblock_requests(struct Scsi_Host *);
+ extern void scsi_block_requests(struct Scsi_Host *);
+--- linux-2.6.0-test1/include/scsi/scsi_request.h      2003-07-02 14:53:18.000000000 -0700
++++ 25/include/scsi/scsi_request.h     2003-07-19 17:03:51.000000000 -0700
+@@ -56,7 +56,7 @@ extern void scsi_do_req(struct scsi_requ
+                       int timeout, int retries);
+ struct scsi_mode_data {
+-      __u16   length;
++      __u32   length;
+       __u16   block_descriptor_length;
+       __u8    medium_type;
+       __u8    device_specific;
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/include/video/epson1355.h       2003-07-19 17:04:55.000000000 -0700
+@@ -0,0 +1,64 @@
++/*
++ * include/video/epson13xx.h -- Epson 13xx frame buffer
++ *
++ * Copyright (C) Hewlett-Packard Company.  All rights reserved.
++ *
++ * Written by Christopher Hoover <ch@hpl.hp.com>
++ *
++ */
++
++#ifndef _EPSON13XX_H_
++#define _EPSON13XX_H_
++
++#define REG_REVISION_CODE              0x00
++#define REG_MEMORY_CONFIG              0x01
++#define REG_PANEL_TYPE                 0x02
++#define REG_MOD_RATE                   0x03
++#define REG_HORZ_DISP_WIDTH            0x04
++#define REG_HORZ_NONDISP_PERIOD        0x05
++#define REG_HRTC_START_POSITION        0x06
++#define REG_HRTC_PULSE_WIDTH           0x07
++#define REG_VERT_DISP_HEIGHT0          0x08
++#define REG_VERT_DISP_HEIGHT1          0x09
++#define REG_VERT_NONDISP_PERIOD        0x0A
++#define REG_VRTC_START_POSITION        0x0B
++#define REG_VRTC_PULSE_WIDTH           0x0C
++#define REG_DISPLAY_MODE               0x0D
++#define REG_SCRN1_LINE_COMPARE0        0x0E
++#define REG_SCRN1_LINE_COMPARE1        0x0F
++#define REG_SCRN1_DISP_START_ADDR0     0x10
++#define REG_SCRN1_DISP_START_ADDR1     0x11
++#define REG_SCRN1_DISP_START_ADDR2     0x12
++#define REG_SCRN2_DISP_START_ADDR0     0x13
++#define REG_SCRN2_DISP_START_ADDR1     0x14
++#define REG_SCRN2_DISP_START_ADDR2     0x15
++#define REG_MEM_ADDR_OFFSET0           0x16
++#define REG_MEM_ADDR_OFFSET1           0x17
++#define REG_PIXEL_PANNING              0x18
++#define REG_CLOCK_CONFIG               0x19
++#define REG_POWER_SAVE_CONFIG          0x1A
++#define REG_MISC                       0x1B
++#define REG_MD_CONFIG_READBACK0        0x1C
++#define REG_MD_CONFIG_READBACK1        0x1D
++#define REG_GPIO_CONFIG0               0x1E
++#define REG_GPIO_CONFIG1               0x1F
++#define REG_GPIO_CONTROL0              0x20
++#define REG_GPIO_CONTROL1              0x21
++#define REG_PERF_ENHANCEMENT0          0x22
++#define REG_PERF_ENHANCEMENT1          0x23
++#define REG_LUT_ADDR                   0x24
++#define REG_RESERVED_1                 0x25
++#define REG_LUT_DATA                   0x26
++#define REG_INK_CURSOR_CONTROL         0x27
++#define REG_CURSOR_X_POSITION0         0x28
++#define REG_CURSOR_X_POSITION1         0x29
++#define REG_CURSOR_Y_POSITION0         0x2A
++#define REG_CURSOR_Y_POSITION1         0x2B
++#define REG_INK_CURSOR_COLOR0_0        0x2C
++#define REG_INK_CURSOR_COLOR0_1        0x2D
++#define REG_INK_CURSOR_COLOR1_0        0x2E
++#define REG_INK_CURSOR_COLOR1_1        0x2F
++#define REG_INK_CURSOR_START_ADDR      0x30
++#define REG_ALTERNATE_FRM              0x31
++
++#endif
+--- linux-2.6.0-test1/include/video/neomagic.h 2003-06-14 12:18:07.000000000 -0700
++++ 25/include/video/neomagic.h        2003-07-19 17:04:55.000000000 -0700
+@@ -75,45 +75,45 @@
+ struct xtimings {
+-  unsigned int pixclock;
+-  unsigned int HDisplay;
+-  unsigned int HSyncStart;
+-  unsigned int HSyncEnd;
+-  unsigned int HTotal;
+-  unsigned int VDisplay;
+-  unsigned int VSyncStart;
+-  unsigned int VSyncEnd;
+-  unsigned int VTotal;
+-  unsigned int sync;
+-  int        dblscan;
+-  int        interlaced;
++      unsigned int pixclock;
++      unsigned int HDisplay;
++      unsigned int HSyncStart;
++      unsigned int HSyncEnd;
++      unsigned int HTotal;
++      unsigned int VDisplay;
++      unsigned int VSyncStart;
++      unsigned int VSyncEnd;
++      unsigned int VTotal;
++      unsigned int sync;
++      int dblscan;
++      int interlaced;
+ };
+ /* --------------------------------------------------------------------- */
+ typedef volatile struct {
+-  __u32 bltStat;
+-  __u32 bltCntl;
+-  __u32 xpColor;
+-  __u32 fgColor;
+-  __u32 bgColor;
+-  __u32 pitch;
+-  __u32 clipLT;
+-  __u32 clipRB;
+-  __u32 srcBitOffset;
+-  __u32 srcStart;
+-  __u32 reserved0;
+-  __u32 dstStart;
+-  __u32 xyExt;
+-
+-  __u32 reserved1[19];
+-
+-  __u32 pageCntl;
+-  __u32 pageBase;
+-  __u32 postBase;
+-  __u32 postPtr;
+-  __u32 dataPtr;
++      __u32 bltStat;
++      __u32 bltCntl;
++      __u32 xpColor;
++      __u32 fgColor;
++      __u32 bgColor;
++      __u32 pitch;
++      __u32 clipLT;
++      __u32 clipRB;
++      __u32 srcBitOffset;
++      __u32 srcStart;
++      __u32 reserved0;
++      __u32 dstStart;
++      __u32 xyExt;
++
++      __u32 reserved1[19];
++
++      __u32 pageCntl;
++      __u32 pageBase;
++      __u32 postBase;
++      __u32 postPtr;
++      __u32 dataPtr;
+ } Neo2200;
+ #define NR_PALETTE    256
+@@ -124,142 +124,65 @@ typedef volatile struct {
+ #define NEO_EXT_GR_MAX 0xC7
+ struct neofb_par {
+-  
+-  unsigned char MiscOutReg;     /* Misc */
+-  unsigned char CRTC[25];       /* Crtc Controller */
+-  unsigned char Sequencer[5];   /* Video Sequencer */
+-  unsigned char Graphics[9];    /* Video Graphics */
+-  unsigned char Attribute[21];  /* Video Atribute */
+-
+-  unsigned char GeneralLockReg;
+-  unsigned char ExtCRTDispAddr;
+-  unsigned char ExtCRTOffset;
+-  unsigned char SysIfaceCntl1;
+-  unsigned char SysIfaceCntl2;
+-  unsigned char ExtColorModeSelect;
+-  unsigned char biosMode;
+-
+-  unsigned char PanelDispCntlReg1;
+-  unsigned char PanelDispCntlReg2;
+-  unsigned char PanelDispCntlReg3;
+-  unsigned char PanelVertCenterReg1;
+-  unsigned char PanelVertCenterReg2;
+-  unsigned char PanelVertCenterReg3;
+-  unsigned char PanelVertCenterReg4;
+-  unsigned char PanelVertCenterReg5;
+-  unsigned char PanelHorizCenterReg1;
+-  unsigned char PanelHorizCenterReg2;
+-  unsigned char PanelHorizCenterReg3;
+-  unsigned char PanelHorizCenterReg4;
+-  unsigned char PanelHorizCenterReg5;
+-
+-  int           ProgramVCLK;
+-  unsigned char VCLK3NumeratorLow;
+-  unsigned char VCLK3NumeratorHigh;
+-  unsigned char VCLK3Denominator;
+-  unsigned char VerticalExt;
++      struct vgastate state;
++      unsigned char MiscOutReg;       /* Misc */
++      unsigned char CRTC[25];         /* Crtc Controller */
++      unsigned char Sequencer[5];     /* Video Sequencer */
++      unsigned char Graphics[9];      /* Video Graphics */
++      unsigned char Attribute[21];    /* Video Atribute */
++
++      unsigned char GeneralLockReg;
++      unsigned char ExtCRTDispAddr;
++      unsigned char ExtCRTOffset;
++      unsigned char SysIfaceCntl1;
++      unsigned char SysIfaceCntl2;
++      unsigned char ExtColorModeSelect;
++      unsigned char biosMode;
++
++      unsigned char PanelDispCntlReg1;
++      unsigned char PanelDispCntlReg2;
++      unsigned char PanelDispCntlReg3;
++      unsigned char PanelVertCenterReg1;
++      unsigned char PanelVertCenterReg2;
++      unsigned char PanelVertCenterReg3;
++      unsigned char PanelVertCenterReg4;
++      unsigned char PanelVertCenterReg5;
++      unsigned char PanelHorizCenterReg1;
++      unsigned char PanelHorizCenterReg2;
++      unsigned char PanelHorizCenterReg3;
++      unsigned char PanelHorizCenterReg4;
++      unsigned char PanelHorizCenterReg5;
++
++      int ProgramVCLK;
++      unsigned char VCLK3NumeratorLow;
++      unsigned char VCLK3NumeratorHigh;
++      unsigned char VCLK3Denominator;
++      unsigned char VerticalExt;
+ #ifdef CONFIG_MTRR
+-  int    mtrr;
++      int mtrr;
+ #endif
+-  u8    *mmio_vbase;
++      u8 *mmio_vbase;
+-  Neo2200 *neo2200;
++      Neo2200 *neo2200;
+-  /* Panels size */
+-  int NeoPanelWidth;
+-  int NeoPanelHeight;
++      /* Panels size */
++      int NeoPanelWidth;
++      int NeoPanelHeight;
+-  int maxClock;
++      int maxClock;
+-  int pci_burst;
+-  int lcd_stretch;
+-  int internal_display;
+-  int external_display;
+-  int libretto;
++      int pci_burst;
++      int lcd_stretch;
++      int internal_display;
++      int external_display;
++      int libretto;
+ };
+ typedef struct {
+-    int x_res;
+-    int y_res;
+-    int mode;
++      int x_res;
++      int y_res;
++      int mode;
+ } biosMode;
+-/* vga IO functions */
+-static inline u8 VGArCR (u8 index)
+-{
+-  outb (index, 0x3d4);
+-  return inb (0x3d5);
+-}
+-
+-static inline void VGAwCR (u8 index, u8 val)
+-{
+-  outb (index, 0x3d4);
+-  outb (val, 0x3d5);
+-}
+-
+-static inline u8 VGArGR (u8 index)
+-{
+-  outb (index, 0x3ce);
+-  return inb (0x3cf);
+-}
+-
+-static inline void VGAwGR (u8 index, u8 val)
+-{
+-  outb (index, 0x3ce);
+-  outb (val, 0x3cf);
+-}
+-
+-static inline u8 VGArSEQ (u8 index)
+-{
+-  outb (index, 0x3c4);
+-  return inb (0x3c5);
+-}
+-
+-static inline void VGAwSEQ (u8 index, u8 val)
+-{
+-  outb (index, 0x3c4);
+-  outb (val, 0x3c5);
+-}
+-
+-
+-static int paletteEnabled = 0;
+-
+-static inline void VGAenablePalette (void)
+-{
+-  u8 tmp;
+-
+-  tmp = inb (0x3da);
+-  outb (0x00, 0x3c0);
+-  paletteEnabled = 1;
+-}
+-
+-static inline void VGAdisablePalette (void)
+-{
+-  u8 tmp;
+-
+-  tmp = inb (0x3da);
+-  outb (0x20, 0x3c0);
+-  paletteEnabled = 0;
+-}
+-
+-static inline void VGAwATTR (u8 index, u8 value)
+-{
+-  u8 tmp;
+-
+-  if (paletteEnabled)
+-    index &= ~0x20;
+-  else
+-    index |= 0x20;
+-
+-  tmp = inb (0x3da);
+-  outb (index, 0x3c0);
+-  outb (value, 0x3c0);
+-}
+-
+-static inline void VGAwMISC (u8 value)
+-{
+-  outb (value, 0x3c2);
+-}
+ #endif
+-
+--- linux-2.6.0-test1/include/video/sisfb.h    2003-06-14 12:18:08.000000000 -0700
++++ 25/include/video/sisfb.h   2003-07-19 17:04:55.000000000 -0700
+@@ -6,6 +6,53 @@
+ #include <asm/ioctl.h>
+ #include <asm/types.h>
++/* TW: vbflags */
++#define CRT2_DEFAULT            0x00000001
++#define CRT2_LCD                0x00000002  /* TW: Never change the order of the CRT2_XXX entries */
++#define CRT2_TV                 0x00000004  /*     (see SISCycleCRT2Type())                       */
++#define CRT2_VGA                0x00000008
++#define CRT2_ENABLE           (CRT2_LCD | CRT2_TV | CRT2_VGA)
++#define VB_DISPTYPE_DISP2     CRT2_ENABLE
++#define VB_DISPTYPE_CRT2      CRT2_ENABLE
++#define TV_NTSC                 0x00000010
++#define TV_PAL                  0x00000020
++#define TV_HIVISION             0x00000040
++#define TV_HIVISION_LV          0x00000080
++#define TV_TYPE                 (TV_NTSC | TV_PAL | TV_HIVISION | TV_HIVISION_LV)
++#define TV_AVIDEO               0x00000100
++#define TV_SVIDEO               0x00000200
++#define TV_SCART                0x00000400
++#define TV_INTERFACE            (TV_AVIDEO | TV_SVIDEO | TV_SCART | TV_CHSCART | TV_CHHDTV)
++#define VB_USELCDA            0x00000800
++#define TV_PALM                 0x00001000
++#define TV_PALN                 0x00002000
++#define TV_CHSCART              0x00008000
++#define TV_CHHDTV               0x00010000
++#define VGA2_CONNECTED          0x00040000
++#define VB_DISPTYPE_CRT1      0x00080000      /* CRT1 connected and used */
++#define VBDISPTYPE_DISP1      VB_DISPTYPE_CRT1
++#define VB_301                  0x00100000    /* Video bridge type */
++#define VB_301B                 0x00200000
++#define VB_302B                 0x00400000
++#define VB_30xBDH             0x00800000      /* 30xB DH version (w/o LCD support) */
++#define VB_LVDS                 0x01000000
++#define VB_CHRONTEL             0x02000000
++#define VB_301LV                0x04000000    
++#define VB_302LV                0x08000000    
++#define VB_TRUMPION           0x10000000     
++#define VB_VIDEOBRIDGE                (VB_301|VB_301B|VB_302B|VB_301LV|VB_302LV| \
++                               VB_LVDS|VB_CHRONTEL|VB_TRUMPION)
++#define VB_SISBRIDGE            (VB_301|VB_301B|VB_302B|VB_301LV|VB_302LV)
++#define VB_SINGLE_MODE          0x20000000     /* CRT1 or CRT2; determined by VB_DISPTYPE_CRTx */
++#define VB_DISPMODE_SINGLE    VB_SINGLE_MODE   
++#define VB_MIRROR_MODE                0x40000000       /* CRT1 + CRT2 identical (mirror mode) */
++#define VB_DISPMODE_MIRROR    VB_MIRROR_MODE   
++#define VB_DUALVIEW_MODE      0x80000000       /* CRT1 + CRT2 independent (dual head mode) */
++#define VB_DISPMODE_DUAL      VB_DUALVIEW_MODE 
++#define VB_DISPLAY_MODE         (VB_SINGLE_MODE | VB_MIRROR_MODE | VB_DUALVIEW_MODE) 
++
++
++/* entries for disp_state - deprecated as of 1.6.02 */
+ #define DISPTYPE_CRT1       0x00000008L
+ #define DISPTYPE_CRT2       0x00000004L
+ #define DISPTYPE_LCD        0x00000002L
+@@ -16,6 +63,7 @@
+ #define DISPMODE_MIRROR           0x00000010L
+ #define DISPMODE_DUALVIEW   0x00000040L
++/* Deprecated as of 1.6.02 - use vbflags instead */
+ #define HASVB_NONE            0x00
+ #define HASVB_301             0x01
+ #define HASVB_LVDS            0x02
+@@ -39,6 +87,7 @@ typedef enum _SIS_CHIP_TYPE {
+       SIS_650,
+       SIS_740,
+       SIS_330,
++      SIS_660,
+       MAX_SIS_CHIP
+ } SIS_CHIP_TYPE;
+@@ -83,13 +132,15 @@ struct ap_data {
+       struct mode_info minfo;
+       unsigned long iobase;
+       unsigned int  mem_size;
+-      unsigned long disp_state;       
++      unsigned long disp_state;  /* deprecated */     
+       SIS_CHIP_TYPE chip;
+       unsigned char hasVB;
+-      SIS_TV_TYPE TV_type;
+-      SIS_TV_PLUG TV_plug;
++      SIS_TV_TYPE TV_type;       /* deprecated */
++      SIS_TV_PLUG TV_plug;       /* deprecated */
+       unsigned long version;
+-      char reserved[256];
++      unsigned long vbflags;     /* replaces deprecated entries above */
++      unsigned long currentvbflags;
++      char reserved[248];
+ };
+ struct video_info {
+@@ -114,10 +165,10 @@ struct video_info {
+       int    video_linelength;
+       unsigned int refresh_rate;
+-      unsigned long disp_state;
+-      unsigned char hasVB;
+-      unsigned char TV_type;
+-      unsigned char TV_plug;
++      unsigned long disp_state;               /* DEPRECATED */
++      unsigned char hasVB;                    /* DEPRECATED */
++      unsigned char TV_type;                  /* DEPRECATED */
++      unsigned char TV_plug;                  /* DEPRECATED */
+       SIS_CHIP_TYPE chip;
+       unsigned char revision_id;
+@@ -136,8 +187,19 @@ struct video_info {
+       unsigned short subsysvendor;
+       unsigned short subsysdevice;
++      
++      unsigned long  vbflags;                 /* Replacing deprecated stuff from above */
++      unsigned long  currentvbflags;
++      
++      int    current_bpp;
++      int    current_width;
++      int    current_height;
++      int    current_htotal;
++      int    current_vtotal;
++      __u32  current_pixclock;
++      int    current_refresh_rate;
+-      char reserved[236];
++      char reserved[200];
+ };
+@@ -177,8 +239,11 @@ struct _SISFB_INFO {
+       unsigned char sisfb_lcdpdc;     /* PanelDelayCompensation */
+       
+       unsigned char sisfb_lcda;       /* Detected status of LCDA for low res/text modes */
++      
++      unsigned long sisfb_vbflags;
++      unsigned long sisfb_currentvbflags;
+-      char reserved[235];             /* for future use */
++      char reserved[227];             /* for future use */
+ };
+ #ifdef __KERNEL__
+--- linux-2.6.0-test1/init/do_mounts.h 2003-06-14 12:18:24.000000000 -0700
++++ 25/init/do_mounts.h        2003-07-19 17:03:51.000000000 -0700
+@@ -6,7 +6,7 @@
+ #include <linux/unistd.h>
+ #include <linux/slab.h>
+ #include <linux/mount.h>
+-#include <linux/blk.h>
++#include <linux/major.h>
+ #include <linux/root_dev.h>
+ asmlinkage long sys_unlink(const char *name);
+--- linux-2.6.0-test1/init/do_mounts_initrd.c  2003-06-14 12:17:57.000000000 -0700
++++ 25/init/do_mounts_initrd.c 2003-07-19 17:03:51.000000000 -0700
+@@ -5,6 +5,7 @@
+ #include <linux/ext2_fs.h>
+ #include <linux/romfs_fs.h>
+ #include <linux/initrd.h>
++#include <linux/sched.h>
+ #include "do_mounts.h"
+--- linux-2.6.0-test1/init/do_mounts_rd.c      2003-06-14 12:18:28.000000000 -0700
++++ 25/init/do_mounts_rd.c     2003-07-19 17:03:51.000000000 -0700
+@@ -5,6 +5,7 @@
+ #include <linux/ext2_fs.h>
+ #include <linux/romfs_fs.h>
+ #include <linux/initrd.h>
++#include <linux/string.h>
+ #include "do_mounts.h"
+--- linux-2.6.0-test1/init/main.c      2003-06-26 22:07:26.000000000 -0700
++++ 25/init/main.c     2003-07-19 17:03:51.000000000 -0700
+@@ -23,7 +23,6 @@
+ #include <linux/ioport.h>
+ #include <linux/init.h>
+ #include <linux/smp_lock.h>
+-#include <linux/blk.h>
+ #include <linux/initrd.h>
+ #include <linux/hdreg.h>
+ #include <linux/bootmem.h>
+--- linux-2.6.0-test1/kernel/compat.c  2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/compat.c 2003-07-19 17:03:51.000000000 -0700
+@@ -425,9 +425,11 @@ asmlinkage int compat_sys_sched_getaffin
+                                   &kernel_mask);
+       set_fs(old_fs);
+-      if (ret > 0)
++      if (ret > 0) {
++              ret = sizeof(compat_ulong_t);
+               if (put_user(kernel_mask, user_mask_ptr))
+                       return -EFAULT;
++      }
+       return ret;
+ }
+--- linux-2.6.0-test1/kernel/extable.c 2003-06-14 12:18:06.000000000 -0700
++++ 25/kernel/extable.c        2003-07-19 17:03:51.000000000 -0700
+@@ -17,10 +17,10 @@
+ */
+ #include <linux/module.h>
+ #include <asm/uaccess.h>
++#include <asm/sections.h>
+ extern const struct exception_table_entry __start___ex_table[];
+ extern const struct exception_table_entry __stop___ex_table[];
+-extern char _stext[], _etext[], _sinittext[], _einittext[];
+ /* Given an address, look for it in the exception tables. */
+ const struct exception_table_entry *search_exception_tables(unsigned long addr)
+--- linux-2.6.0-test1/kernel/fork.c    2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/fork.c   2003-07-19 17:06:43.000000000 -0700
+@@ -53,13 +53,6 @@ DEFINE_PER_CPU(unsigned long, process_co
+ rwlock_t tasklist_lock __cacheline_aligned = RW_LOCK_UNLOCKED;  /* outer */
+-/*
+- * A per-CPU task cache - this relies on the fact that
+- * the very last portion of sys_exit() is executed with
+- * preemption turned off.
+- */
+-static task_t *task_cache[NR_CPUS] __cacheline_aligned;
+-
+ int nr_processes(void)
+ {
+       int cpu;
+@@ -80,26 +73,8 @@ static kmem_cache_t *task_struct_cachep;
+ static void free_task(struct task_struct *tsk)
+ {
+-      /*
+-       * The task cache is effectively disabled right now.
+-       * Do we want it? The slab cache already has per-cpu
+-       * stuff, but the thread info (usually a order-1 page
+-       * allocation) doesn't.
+-       */
+-      if (tsk != current) {
+-              free_thread_info(tsk->thread_info);
+-              free_task_struct(tsk);
+-      } else {
+-              int cpu = get_cpu();
+-
+-              tsk = task_cache[cpu];
+-              if (tsk) {
+-                      free_thread_info(tsk->thread_info);
+-                      free_task_struct(tsk);
+-              }
+-              task_cache[cpu] = current;
+-              put_cpu();
+-      }
++      free_thread_info(tsk->thread_info);
++      free_task_struct(tsk);
+ }
+ void __put_task_struct(struct task_struct *tsk)
+@@ -146,7 +121,12 @@ void prepare_to_wait(wait_queue_head_t *
+ {
+       unsigned long flags;
+-      __set_current_state(state);
++      /*
++       * don't alter the task state if this is just going to
++       * queue an async wait queue callback
++       */
++      if (is_sync_wait(wait))
++              __set_current_state(state);
+       wait->flags &= ~WQ_FLAG_EXCLUSIVE;
+       spin_lock_irqsave(&q->lock, flags);
+       if (list_empty(&wait->task_list))
+@@ -159,7 +139,12 @@ prepare_to_wait_exclusive(wait_queue_hea
+ {
+       unsigned long flags;
+-      __set_current_state(state);
++      /*
++       * don't alter the task state if this is just going to
++       * queue an async wait queue callback
++       */
++      if (is_sync_wait(wait))
++              __set_current_state(state);
+       wait->flags |= WQ_FLAG_EXCLUSIVE;
+       spin_lock_irqsave(&q->lock, flags);
+       if (list_empty(&wait->task_list))
+@@ -220,25 +205,18 @@ static struct task_struct *dup_task_stru
+ {
+       struct task_struct *tsk;
+       struct thread_info *ti;
+-      int cpu = get_cpu();
+       prepare_to_copy(orig);
+-      tsk = task_cache[cpu];
+-      task_cache[cpu] = NULL;
+-      put_cpu();
+-      if (!tsk) {
+-              tsk = alloc_task_struct();
+-              if (!tsk)
+-                      return NULL;
+-
+-              ti = alloc_thread_info(tsk);
+-              if (!ti) {
+-                      free_task_struct(tsk);
+-                      return NULL;
+-              }
+-      } else
+-              ti = tsk->thread_info;
++      tsk = alloc_task_struct();
++      if (!tsk)
++              return NULL;
++
++      ti = alloc_thread_info(tsk);
++      if (!ti) {
++              free_task_struct(tsk);
++              return NULL;
++      }
+       *ti = *orig->thread_info;
+       *tsk = *orig;
+@@ -265,7 +243,7 @@ static inline int dup_mmap(struct mm_str
+       mm->free_area_cache = TASK_UNMAPPED_BASE;
+       mm->map_count = 0;
+       mm->rss = 0;
+-      mm->cpu_vm_mask = 0;
++      cpus_clear(mm->cpu_vm_mask);
+       pprev = &mm->mmap;
+       /*
+@@ -430,6 +408,23 @@ void mmput(struct mm_struct *mm)
+       }
+ }
++/*
++ * Checks if the use count of an mm is non-zero and if so
++ * returns a reference to it after bumping up the use count.
++ * If the use count is zero, it means this mm is going away,
++ * so return NULL.
++ */
++struct mm_struct *mmgrab(struct mm_struct *mm)
++{
++      spin_lock(&mmlist_lock);
++      if (!atomic_read(&mm->mm_users))
++              mm = NULL;
++      else
++              atomic_inc(&mm->mm_users);
++      spin_unlock(&mmlist_lock);
++      return mm;
++}
++
+ /* Please note the differences between mmput and mm_release.
+  * mmput is called whenever we stop holding onto a mm_struct,
+  * error success whatever.
+@@ -791,8 +786,10 @@ struct task_struct *copy_process(unsigne
+               goto fork_out;
+       retval = -EAGAIN;
+-      if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur) {
+-              if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE))
++      if (atomic_read(&p->user->processes) >=
++                      p->rlim[RLIMIT_NPROC].rlim_cur) {
++              if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
++                              p->user != &root_user)
+                       goto bad_fork_free;
+       }
+@@ -866,6 +863,7 @@ struct task_struct *copy_process(unsigne
+       p->start_time = get_jiffies_64();
+       p->security = NULL;
+       p->io_context = NULL;
++      p->io_wait = NULL;
+       retval = -ENOMEM;
+       if ((retval = security_task_alloc(p)))
+@@ -1106,7 +1104,7 @@ long do_fork(unsigned long clone_flags,
+                       init_completion(&vfork);
+               }
+-              if (p->ptrace & PT_PTRACED) {
++              if ((p->ptrace & PT_PTRACED) || (clone_flags & CLONE_STOPPED)) {
+                       /*
+                        * We'll start up with an immediate SIGSTOP.
+                        */
+@@ -1114,7 +1112,9 @@ long do_fork(unsigned long clone_flags,
+                       set_tsk_thread_flag(p, TIF_SIGPENDING);
+               }
+-              wake_up_forked_process(p);              /* do this last */
++              p->state = TASK_STOPPED;
++              if (!(clone_flags & CLONE_STOPPED))
++                      wake_up_forked_process(p);      /* do this last */
+               ++total_forks;
+               if (unlikely (trace)) {
+--- linux-2.6.0-test1/kernel/ksyms.c   2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/ksyms.c  2003-07-19 17:06:51.000000000 -0700
+@@ -120,12 +120,14 @@ EXPORT_SYMBOL(mem_map);
+ EXPORT_SYMBOL(max_mapnr);
+ #endif
+ EXPORT_SYMBOL(high_memory);
++EXPORT_SYMBOL_GPL(invalidate_mmap_range);
+ EXPORT_SYMBOL(vmtruncate);
+ EXPORT_SYMBOL(find_vma);
+ EXPORT_SYMBOL(get_unmapped_area);
+ EXPORT_SYMBOL(init_mm);
+ EXPORT_SYMBOL(blk_queue_bounce);
+ EXPORT_SYMBOL(blk_congestion_wait);
++EXPORT_SYMBOL(blk_congestion_wait_wq);
+ #ifdef CONFIG_HIGHMEM
+ EXPORT_SYMBOL(kmap_high);
+ EXPORT_SYMBOL(kunmap_high);
+@@ -219,6 +221,7 @@ EXPORT_SYMBOL(sync_dirty_buffer);
+ EXPORT_SYMBOL(submit_bh);
+ EXPORT_SYMBOL(unlock_buffer);
+ EXPORT_SYMBOL(__wait_on_buffer);
++EXPORT_SYMBOL(__wait_on_buffer_wq);
+ EXPORT_SYMBOL(blockdev_direct_IO);
+ EXPORT_SYMBOL(block_write_full_page);
+ EXPORT_SYMBOL(block_read_full_page);
+@@ -605,6 +608,19 @@ EXPORT_SYMBOL(next_thread);
+ EXPORT_SYMBOL(__per_cpu_offset);
+ #endif
++EXPORT_SYMBOL(set_fs_pwd);
++EXPORT_SYMBOL(set_fs_root);
++
++#if defined(CONFIG_LOCKMETER)
++EXPORT_SYMBOL(_metered_spin_lock);
++EXPORT_SYMBOL(_metered_spin_unlock);
++EXPORT_SYMBOL(_metered_spin_trylock);
++EXPORT_SYMBOL(_metered_read_lock);
++EXPORT_SYMBOL(_metered_read_unlock);
++EXPORT_SYMBOL(_metered_write_lock);
++EXPORT_SYMBOL(_metered_write_unlock);
++#endif
++
+ /* debug */
+ EXPORT_SYMBOL(dump_stack);
+ EXPORT_SYMBOL(ptrace_notify);
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/kernel/lockmeter.c      2003-07-19 17:06:40.000000000 -0700
+@@ -0,0 +1,1169 @@
++/*
++ *  Copyright (C) 1999,2000 Silicon Graphics, Inc.
++ *
++ *  Written by John Hawkes (hawkes@sgi.com)
++ *  Based on klstat.c by Jack Steiner (steiner@sgi.com)
++ *
++ *  Modified by Ray Bryant (raybry@us.ibm.com)
++ *  Changes Copyright (C) 2000 IBM, Inc.
++ *  Added save of index in spinlock_t to improve efficiency
++ *  of "hold" time reporting for spinlocks
++ *  Added support for hold time statistics for read and write
++ *  locks.
++ */
++
++#include <linux/config.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/slab.h>
++#include <linux/sched.h>
++#include <linux/smp.h>
++#include <linux/threads.h>
++#include <linux/version.h>
++#include <linux/vmalloc.h>
++#include <linux/spinlock.h>
++#include <linux/utsname.h>
++#include <asm/system.h>
++#include <asm/uaccess.h>
++
++#include <linux/lockmeter.h>
++
++#define ASSERT(cond)
++#define bzero(loc,size)               memset(loc,0,size)
++
++/*<---------------------------------------------------*/
++/*              lockmeter.c                           */
++/*>---------------------------------------------------*/
++
++static lstat_control_t lstat_control __cacheline_aligned =
++      { LSTAT_OFF, SPIN_LOCK_UNLOCKED, SPIN_LOCK_UNLOCKED,
++        19 * 0, NR_CPUS * 0, 0, NR_CPUS * 0 };
++
++static ushort lstat_make_dir_entry(void *, void *);
++
++/*
++ * lstat_lookup
++ *
++ * Given a RA, locate the directory entry for the lock.
++ */
++static ushort
++lstat_lookup(void *lock_ptr, void *caller_ra)
++{
++      ushort index;
++      lstat_directory_entry_t *dirp;
++
++      dirp = lstat_control.dir;
++
++      index = lstat_control.hashtab[DIRHASH(caller_ra)];
++      while (dirp[index].caller_ra != caller_ra) {
++              if (index == 0) {
++                      return lstat_make_dir_entry(lock_ptr, caller_ra);
++              }
++              index = dirp[index].next_stat_index;
++      }
++
++      if (dirp[index].lock_ptr != NULL && dirp[index].lock_ptr != lock_ptr) {
++              dirp[index].lock_ptr = NULL;
++      }
++
++      return index;
++}
++
++/*
++ * lstat_make_dir_entry
++ * Called to add a new lock to the lock directory.
++ */
++static ushort
++lstat_make_dir_entry(void *lock_ptr, void *caller_ra)
++{
++      lstat_directory_entry_t *dirp;
++      ushort index, hindex;
++      unsigned long flags;
++
++      /* lock the table without recursively reentering this metering code */
++      local_irq_save(flags);
++      _raw_spin_lock(&lstat_control.directory_lock);
++
++      hindex = DIRHASH(caller_ra);
++      index = lstat_control.hashtab[hindex];
++      dirp = lstat_control.dir;
++      while (index && dirp[index].caller_ra != caller_ra)
++              index = dirp[index].next_stat_index;
++
++      if (index == 0) {
++              if (lstat_control.next_free_dir_index < LSTAT_MAX_STAT_INDEX) {
++                      index = lstat_control.next_free_dir_index++;
++                      lstat_control.dir[index].caller_ra = caller_ra;
++                      lstat_control.dir[index].lock_ptr = lock_ptr;
++                      lstat_control.dir[index].next_stat_index =
++                              lstat_control.hashtab[hindex];
++                      lstat_control.hashtab[hindex] = index;
++              } else {
++                      lstat_control.dir_overflow++;
++              }
++      }
++      _raw_spin_unlock(&lstat_control.directory_lock);
++      local_irq_restore(flags);
++      return index;
++}
++
++int
++lstat_update(void *lock_ptr, void *caller_ra, int action)
++{
++      int index;
++      int cpu;
++
++      ASSERT(action < LSTAT_ACT_MAX_VALUES);
++
++      if (lstat_control.state == LSTAT_OFF)
++              return 0;
++
++      index = lstat_lookup(lock_ptr, caller_ra);
++      cpu = THIS_CPU_NUMBER;
++      (*lstat_control.counts[cpu])[index].count[action]++;
++      (*lstat_control.counts[cpu])[index].acquire_time = get_cycles();
++
++      return index;
++}
++
++int
++lstat_update_time(void *lock_ptr, void *caller_ra, int action, uint32_t ticks)
++{
++      ushort index;
++      int cpu;
++
++      ASSERT(action < LSTAT_ACT_MAX_VALUES);
++
++      if (lstat_control.state == LSTAT_OFF)
++              return 0;
++
++      index = lstat_lookup(lock_ptr, caller_ra);
++      cpu = THIS_CPU_NUMBER;
++      (*lstat_control.counts[cpu])[index].count[action]++;
++      (*lstat_control.counts[cpu])[index].cum_wait_ticks += (uint64_t) ticks;
++      if ((*lstat_control.counts[cpu])[index].max_wait_ticks < ticks)
++              (*lstat_control.counts[cpu])[index].max_wait_ticks = ticks;
++
++      (*lstat_control.counts[cpu])[index].acquire_time = get_cycles();
++
++      return index;
++}
++
++void
++_metered_spin_lock(spinlock_t * lock_ptr)
++{
++      if (lstat_control.state == LSTAT_OFF) {
++              _raw_spin_lock(lock_ptr);       /* do the real lock */
++              PUT_INDEX(lock_ptr, 0); /* clean index in case lockmetering  */
++              /* gets turned on before unlock */
++      } else {
++              void *this_pc = LSTAT_RA(LSTAT_RA_SPIN);
++              int index;
++
++              if (_raw_spin_trylock(lock_ptr)) {
++                      index = lstat_update(lock_ptr, this_pc,
++                                              LSTAT_ACT_NO_WAIT);
++              } else {
++                      uint32_t start_cycles = get_cycles();
++                      _raw_spin_lock(lock_ptr);       /* do the real lock */
++                      index = lstat_update_time(lock_ptr, this_pc,
++                              LSTAT_ACT_SPIN, get_cycles() - start_cycles);
++              }
++              /* save the index in the lock itself for use in spin unlock */
++              PUT_INDEX(lock_ptr, index);
++      }
++}
++
++int
++_metered_spin_trylock(spinlock_t * lock_ptr)
++{
++      if (lstat_control.state == LSTAT_OFF) {
++              return _raw_spin_trylock(lock_ptr);
++      } else {
++              int retval;
++              void *this_pc = LSTAT_RA(LSTAT_RA_SPIN);
++
++              if ((retval = _raw_spin_trylock(lock_ptr))) {
++                      int index = lstat_update(lock_ptr, this_pc,
++                                              LSTAT_ACT_NO_WAIT);
++                      /*
++                       * save the index in the lock itself for use in spin
++                       * unlock
++                       */
++                      PUT_INDEX(lock_ptr, index);
++              } else {
++                      lstat_update(lock_ptr, this_pc, LSTAT_ACT_REJECT);
++              }
++
++              return retval;
++      }
++}
++
++void
++_metered_spin_unlock(spinlock_t * lock_ptr)
++{
++      int index = -1;
++
++      if (lstat_control.state != LSTAT_OFF) {
++              index = GET_INDEX(lock_ptr);
++              /*
++               * If statistics were turned off when we set the lock,
++               * then the index can be zero.  If that is the case,
++               * then collect no stats on this call.
++               */
++              if (index > 0) {
++                      uint32_t hold_time;
++                      int cpu = THIS_CPU_NUMBER;
++                      hold_time = get_cycles() -
++                       (*lstat_control.counts[cpu])[index].acquire_time;
++                      (*lstat_control.counts[cpu])[index].cum_hold_ticks +=
++                              (uint64_t) hold_time;
++                      if ((*lstat_control.counts[cpu])[index].max_hold_ticks <
++                          hold_time)
++                              (*lstat_control.counts[cpu])[index].
++                                  max_hold_ticks = hold_time;
++              }
++      }
++
++      /* make sure we don't have a stale index value saved */
++      PUT_INDEX(lock_ptr, 0);
++      _raw_spin_unlock(lock_ptr);     /* do the real unlock */
++}
++
++/*
++ * allocate the next global read lock structure and store its index
++ * in the rwlock at "lock_ptr".
++ */
++uint32_t
++alloc_rwlock_struct(rwlock_t * rwlock_ptr)
++{
++      int index;
++      unsigned long flags;
++      int cpu = THIS_CPU_NUMBER;
++
++      /* If we've already overflowed, then do a quick exit */
++      if (lstat_control.next_free_read_lock_index >
++                      LSTAT_MAX_READ_LOCK_INDEX) {
++              lstat_control.rwlock_overflow++;
++              return 0;
++      }
++
++      local_irq_save(flags);
++      _raw_spin_lock(&lstat_control.directory_lock);
++
++      /* It is possible this changed while we were waiting for the directory_lock */
++      if (lstat_control.state == LSTAT_OFF) {
++              index = 0;
++              goto unlock;
++      }
++
++      /* It is possible someone else got here first and set the index */
++      if ((index = GET_RWINDEX(rwlock_ptr)) == 0) {
++              /*
++               * we can't turn on read stats for this lock while there are
++               * readers (this would mess up the running hold time sum at
++               * unlock time)
++               */
++              if (RWLOCK_READERS(rwlock_ptr) != 0) {
++                      index = 0;
++                      goto unlock;
++              }
++
++              /*
++               * if stats are turned on after being off, we may need to
++               * return an old index from when the statistics were on last
++               * time.
++               */
++              for (index = 1; index < lstat_control.next_free_read_lock_index;
++                              index++)
++                      if ((*lstat_control.read_lock_counts[cpu])[index].
++                                      lock_ptr == rwlock_ptr)
++                              goto put_index_and_unlock;
++
++              /* allocate the next global read lock structure */
++              if (lstat_control.next_free_read_lock_index >=
++                  LSTAT_MAX_READ_LOCK_INDEX) {
++                      lstat_control.rwlock_overflow++;
++                      index = 0;
++                      goto unlock;
++              }
++              index = lstat_control.next_free_read_lock_index++;
++
++              /*
++               * initialize the global read stats data structure for each
++               * cpu
++               */
++              for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++                      (*lstat_control.read_lock_counts[cpu])[index].lock_ptr =
++                              rwlock_ptr;
++              }
++put_index_and_unlock:
++              /* store the index for the read lock structure into the lock */
++              PUT_RWINDEX(rwlock_ptr, index);
++      }
++
++unlock:
++      _raw_spin_unlock(&lstat_control.directory_lock);
++      local_irq_restore(flags);
++      return index;
++}
++
++void
++_metered_read_lock(rwlock_t * rwlock_ptr)
++{
++      void *this_pc;
++      uint32_t start_cycles;
++      int index;
++      int cpu;
++      unsigned long flags;
++      int readers_before, readers_after;
++      uint64_t cycles64;
++
++      if (lstat_control.state == LSTAT_OFF) {
++              _raw_read_lock(rwlock_ptr);
++              /* clean index in case lockmetering turns on before an unlock */
++              PUT_RWINDEX(rwlock_ptr, 0);
++              return;
++      }
++
++      this_pc = LSTAT_RA(LSTAT_RA_READ);
++      cpu = THIS_CPU_NUMBER;
++      index = GET_RWINDEX(rwlock_ptr);
++
++      /* allocate the global stats entry for this lock, if needed */
++      if (index == 0)
++              index = alloc_rwlock_struct(rwlock_ptr);
++
++      readers_before = RWLOCK_READERS(rwlock_ptr);
++      if (_raw_read_trylock(rwlock_ptr)) {
++              /*
++               * We have decremented the lock to count a new reader,
++               * and have confirmed that no writer has it locked.
++               */
++              /* update statistics if enabled */
++              if (index > 0) {
++                      local_irq_save(flags);
++                      lstat_update((void *) rwlock_ptr, this_pc,
++                                      LSTAT_ACT_NO_WAIT);
++                      /* preserve value of TSC so cum_hold_ticks and start_busy use same value */
++                      cycles64 = get_cycles64();
++                      (*lstat_control.read_lock_counts[cpu])[index].
++                              cum_hold_ticks -= cycles64;
++
++                      /* record time and cpu of start of busy period */
++                      /* this is not perfect (some race conditions are possible) */
++                      if (readers_before == 0) {
++                              (*lstat_control.read_lock_counts[cpu])[index].
++                                      start_busy = cycles64;
++                              PUT_RW_CPU(rwlock_ptr, cpu);
++                      }
++                      readers_after = RWLOCK_READERS(rwlock_ptr);
++                      if (readers_after >
++                              (*lstat_control.read_lock_counts[cpu])[index].
++                                      max_readers)
++                              (*lstat_control.read_lock_counts[cpu])[index].
++                                      max_readers = readers_after;
++                      local_irq_restore(flags);
++              }
++
++              return;
++      }
++      /* If we get here, then we could not quickly grab the read lock */
++
++      start_cycles = get_cycles();    /* start counting the wait time */
++
++      /* Now spin until read_lock is successful */
++      _raw_read_lock(rwlock_ptr);
++
++      lstat_update_time((void *) rwlock_ptr, this_pc, LSTAT_ACT_SPIN,
++                        get_cycles() - start_cycles);
++
++      /* update statistics if they are enabled for this lock */
++      if (index > 0) {
++              local_irq_save(flags);
++              cycles64 = get_cycles64();
++              (*lstat_control.read_lock_counts[cpu])[index].cum_hold_ticks -=
++                              cycles64;
++
++              /* this is not perfect (some race conditions are possible) */
++              if (readers_before == 0) {
++                      (*lstat_control.read_lock_counts[cpu])[index].
++                              start_busy = cycles64;
++                      PUT_RW_CPU(rwlock_ptr, cpu);
++              }
++              readers_after = RWLOCK_READERS(rwlock_ptr);
++              if (readers_after >
++                  (*lstat_control.read_lock_counts[cpu])[index].max_readers)
++                      (*lstat_control.read_lock_counts[cpu])[index].
++                              max_readers = readers_after;
++              local_irq_restore(flags);
++      }
++}
++
++void
++_metered_read_unlock(rwlock_t * rwlock_ptr)
++{
++      int index;
++      int cpu;
++      unsigned long flags;
++      uint64_t busy_length;
++      uint64_t cycles64;
++
++      if (lstat_control.state == LSTAT_OFF) {
++              _raw_read_unlock(rwlock_ptr);
++              return;
++      }
++
++      index = GET_RWINDEX(rwlock_ptr);
++      cpu = THIS_CPU_NUMBER;
++
++      if (index > 0) {
++              local_irq_save(flags);
++              /*
++               * preserve value of TSC so cum_hold_ticks and busy_ticks are
++               * consistent.
++               */
++              cycles64 = get_cycles64();
++              (*lstat_control.read_lock_counts[cpu])[index].cum_hold_ticks +=
++                      cycles64;
++              (*lstat_control.read_lock_counts[cpu])[index].read_lock_count++;
++
++              /*
++               * once again, this is not perfect (some race conditions are
++               * possible)
++               */
++              if (RWLOCK_READERS(rwlock_ptr) == 1) {
++                      int cpu1 = GET_RW_CPU(rwlock_ptr);
++                      uint64_t last_start_busy =
++                              (*lstat_control.read_lock_counts[cpu1])[index].
++                                      start_busy;
++                      (*lstat_control.read_lock_counts[cpu])[index].
++                              busy_periods++;
++                      if (cycles64 > last_start_busy) {
++                              busy_length = cycles64 - last_start_busy;
++                              (*lstat_control.read_lock_counts[cpu])[index].
++                                      busy_ticks += busy_length;
++                              if (busy_length >
++                                      (*lstat_control.
++                                              read_lock_counts[cpu])[index].
++                                                      max_busy)
++                                      (*lstat_control.
++                                       read_lock_counts[cpu])[index].
++                                              max_busy = busy_length;
++                      }
++              }
++              local_irq_restore(flags);
++      }
++      _raw_read_unlock(rwlock_ptr);
++}
++
++void
++_metered_write_lock(rwlock_t * rwlock_ptr)
++{
++      uint32_t start_cycles;
++      void *this_pc;
++      uint32_t spin_ticks = 0; /* in anticipation of a potential wait */
++      int index;
++      int write_index = 0;
++      int cpu;
++      enum {
++              writer_writer_conflict,
++              writer_reader_conflict
++      } why_wait = writer_writer_conflict;
++
++      if (lstat_control.state == LSTAT_OFF) {
++              _raw_write_lock(rwlock_ptr);
++              /* clean index in case lockmetering turns on before an unlock */
++              PUT_RWINDEX(rwlock_ptr, 0);
++              return;
++      }
++
++      this_pc = LSTAT_RA(LSTAT_RA_WRITE);
++      cpu = THIS_CPU_NUMBER;
++      index = GET_RWINDEX(rwlock_ptr);
++
++      /* allocate the global stats entry for this lock, if needed */
++      if (index == 0) {
++              index = alloc_rwlock_struct(rwlock_ptr);
++      }
++
++      if (_raw_write_trylock(rwlock_ptr)) {
++              /* We acquired the lock on the first try */
++              write_index = lstat_update((void *) rwlock_ptr, this_pc,
++                                      LSTAT_ACT_NO_WAIT);
++              /* save the write_index for use in unlock if stats enabled */
++              if (index > 0)
++                      (*lstat_control.read_lock_counts[cpu])[index].
++                              write_index = write_index;
++              return;
++      }
++
++      /* If we get here, then we could not quickly grab the write lock */
++      start_cycles = get_cycles();    /* start counting the wait time */
++
++      why_wait = RWLOCK_READERS(rwlock_ptr) ?
++                      writer_reader_conflict : writer_writer_conflict;
++
++      /* Now set the lock and wait for conflicts to disappear */
++      _raw_write_lock(rwlock_ptr);
++
++      spin_ticks = get_cycles() - start_cycles;
++
++      /* update stats -- if enabled */
++      if (index > 0 && spin_ticks) {
++              if (why_wait == writer_reader_conflict) {
++                      /* waited due to a reader holding the lock */
++                      write_index = lstat_update_time((void *)rwlock_ptr,
++                                      this_pc, LSTAT_ACT_SPIN, spin_ticks);
++              } else {
++                      /*
++                       * waited due to another writer holding the lock
++                       */
++                      write_index = lstat_update_time((void *)rwlock_ptr,
++                              this_pc, LSTAT_ACT_WW_SPIN, spin_ticks);
++                      (*lstat_control.counts[cpu])[write_index].
++                              cum_wait_ww_ticks += spin_ticks;
++                      if (spin_ticks >
++                              (*lstat_control.counts[cpu])[write_index].
++                                      max_wait_ww_ticks) {
++                              (*lstat_control.counts[cpu])[write_index].
++                                      max_wait_ww_ticks = spin_ticks;
++                      }
++              }
++
++              /* save the directory index for use on write_unlock */
++              (*lstat_control.read_lock_counts[cpu])[index].
++                      write_index = write_index;
++      }
++}
++
++void
++_metered_write_unlock(rwlock_t * rwlock_ptr)
++{
++      int index;
++      int cpu;
++      int write_index;
++      uint32_t hold_time;
++
++      if (lstat_control.state == LSTAT_OFF) {
++              _raw_write_unlock(rwlock_ptr);
++              return;
++      }
++
++      cpu = THIS_CPU_NUMBER;
++      index = GET_RWINDEX(rwlock_ptr);
++
++      /* update statistics if stats enabled for this lock */
++      if (index > 0) {
++              write_index =
++                  (*lstat_control.read_lock_counts[cpu])[index].write_index;
++
++              hold_time = get_cycles() -
++                      (*lstat_control.counts[cpu])[write_index].acquire_time;
++              (*lstat_control.counts[cpu])[write_index].cum_hold_ticks +=
++                      (uint64_t) hold_time;
++              if ((*lstat_control.counts[cpu])[write_index].max_hold_ticks <
++                              hold_time)
++                      (*lstat_control.counts[cpu])[write_index].
++                              max_hold_ticks = hold_time;
++      }
++      _raw_write_unlock(rwlock_ptr);
++}
++
++int
++_metered_write_trylock(rwlock_t * rwlock_ptr)
++{
++      int retval;
++      void *this_pc = LSTAT_RA(LSTAT_RA_WRITE);
++
++      if ((retval = _raw_write_trylock(rwlock_ptr))) {
++              lstat_update(rwlock_ptr, this_pc, LSTAT_ACT_NO_WAIT);
++      } else {
++              lstat_update(rwlock_ptr, this_pc, LSTAT_ACT_REJECT);
++      }
++
++      return retval;
++}
++
++static void
++init_control_space(void)
++{
++      /* Set all control space pointers to null and indices to "empty" */
++      int cpu;
++
++      /*
++       * Access CPU_CYCLE_FREQUENCY at the outset, which in some
++       * architectures may trigger a runtime calculation that uses a
++       * spinlock.  Let's do this before lockmetering is turned on.
++       */
++      if (CPU_CYCLE_FREQUENCY == 0)
++              BUG();
++
++      lstat_control.hashtab = NULL;
++      lstat_control.dir = NULL;
++      for (cpu = 0; cpu < NR_CPUS; cpu++) {
++              lstat_control.counts[cpu] = NULL;
++              lstat_control.read_lock_counts[cpu] = NULL;
++      }
++}
++
++static int
++reset_lstat_data(void)
++{
++      int cpu, flags;
++
++      flags = 0;
++      lstat_control.next_free_dir_index = 1;  /* 0 is for overflows */
++      lstat_control.next_free_read_lock_index = 1;
++      lstat_control.dir_overflow = 0;
++      lstat_control.rwlock_overflow = 0;
++
++      lstat_control.started_cycles64 = 0;
++      lstat_control.ending_cycles64 = 0;
++      lstat_control.enabled_cycles64 = 0;
++      lstat_control.first_started_time = 0;
++      lstat_control.started_time = 0;
++      lstat_control.ending_time = 0;
++      lstat_control.intervals = 0;
++
++      /*
++       * paranoia -- in case someone does a "lockstat reset" before
++       * "lockstat on"
++       */
++      if (lstat_control.hashtab) {
++              bzero(lstat_control.hashtab,
++                      LSTAT_HASH_TABLE_SIZE * sizeof (short));
++              bzero(lstat_control.dir, LSTAT_MAX_STAT_INDEX *
++                              sizeof (lstat_directory_entry_t));
++
++              for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++                      bzero(lstat_control.counts[cpu],
++                              sizeof (lstat_cpu_counts_t));
++                      bzero(lstat_control.read_lock_counts[cpu],
++                              sizeof (lstat_read_lock_cpu_counts_t));
++              }
++      }
++#ifdef NOTDEF
++      _raw_spin_unlock(&lstat_control.directory_lock);
++      local_irq_restore(flags);
++#endif
++      return 1;
++}
++
++static void
++release_control_space(void)
++{
++      /*
++       * Called when either (1) allocation of kmem
++       * or (2) when user writes LSTAT_RELEASE to /pro/lockmeter.
++       * Assume that all pointers have been initialized to zero,
++       * i.e., nonzero pointers are valid addresses.
++       */
++      int cpu;
++
++      if (lstat_control.hashtab) {
++              kfree(lstat_control.hashtab);
++              lstat_control.hashtab = NULL;
++      }
++
++      if (lstat_control.dir) {
++              vfree(lstat_control.dir);
++              lstat_control.dir = NULL;
++      }
++
++      for (cpu = 0; cpu < NR_CPUS; cpu++) {
++              if (lstat_control.counts[cpu]) {
++                      vfree(lstat_control.counts[cpu]);
++                      lstat_control.counts[cpu] = NULL;
++              }
++              if (lstat_control.read_lock_counts[cpu]) {
++                      kfree(lstat_control.read_lock_counts[cpu]);
++                      lstat_control.read_lock_counts[cpu] = NULL;
++              }
++      }
++}
++
++int
++get_lockmeter_info_size(void)
++{
++      return sizeof (lstat_user_request_t)
++              + num_online_cpus() * sizeof (lstat_cpu_counts_t)
++              + num_online_cpus() * sizeof (lstat_read_lock_cpu_counts_t)
++              + (LSTAT_MAX_STAT_INDEX * sizeof (lstat_directory_entry_t));
++}
++
++ssize_t
++get_lockmeter_info(char *buffer, size_t max_len, loff_t * last_index)
++{
++      lstat_user_request_t req;
++      struct timeval tv;
++      ssize_t next_ret_bcount;
++      ssize_t actual_ret_bcount = 0;
++      int cpu;
++
++      *last_index = 0;        /* a one-shot read */
++
++      req.lstat_version = LSTAT_VERSION;
++      req.state = lstat_control.state;
++      req.maxcpus = num_online_cpus();
++      req.cycleval = CPU_CYCLE_FREQUENCY;
++#ifdef notyet
++      req.kernel_magic_addr = (void *) &_etext;
++      req.kernel_end_addr = (void *) &_etext;
++#endif
++      req.uts = system_utsname;
++      req.intervals = lstat_control.intervals;
++
++      req.first_started_time = lstat_control.first_started_time;
++      req.started_time = lstat_control.started_time;
++      req.started_cycles64 = lstat_control.started_cycles64;
++
++      req.next_free_dir_index = lstat_control.next_free_dir_index;
++      req.next_free_read_lock_index = lstat_control.next_free_read_lock_index;
++      req.dir_overflow = lstat_control.dir_overflow;
++      req.rwlock_overflow = lstat_control.rwlock_overflow;
++
++      if (lstat_control.state == LSTAT_OFF) {
++              if (req.intervals == 0) {
++                      /* mesasurement is off and no valid data present */
++                      next_ret_bcount = sizeof (lstat_user_request_t);
++                      req.enabled_cycles64 = 0;
++
++                      if ((actual_ret_bcount + next_ret_bcount) > max_len)
++                              return actual_ret_bcount;
++
++                      copy_to_user(buffer, (void *) &req, next_ret_bcount);
++                      actual_ret_bcount += next_ret_bcount;
++                      return actual_ret_bcount;
++              } else {
++                      /*
++                       * measurement is off but valid data present
++                       * fetch time info from lstat_control
++                       */
++                      req.ending_time = lstat_control.ending_time;
++                      req.ending_cycles64 = lstat_control.ending_cycles64;
++                      req.enabled_cycles64 = lstat_control.enabled_cycles64;
++              }
++      } else {
++              /*
++               * this must be a read while data active--use current time,
++               * etc
++               */
++              do_gettimeofday(&tv);
++              req.ending_time = tv.tv_sec;
++              req.ending_cycles64 = get_cycles64();
++              req.enabled_cycles64 = req.ending_cycles64 -
++                      req.started_cycles64 + lstat_control.enabled_cycles64;
++      }
++
++      next_ret_bcount = sizeof (lstat_user_request_t);
++      if ((actual_ret_bcount + next_ret_bcount) > max_len)
++              return actual_ret_bcount;
++
++      copy_to_user(buffer, (void *) &req, next_ret_bcount);
++      actual_ret_bcount += next_ret_bcount;
++
++      if (!lstat_control.counts[0])   /* not initialized? */
++              return actual_ret_bcount;
++
++      next_ret_bcount = sizeof (lstat_cpu_counts_t);
++      for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++              if ((actual_ret_bcount + next_ret_bcount) > max_len)
++                      return actual_ret_bcount;       /* leave early */
++              copy_to_user(buffer + actual_ret_bcount,
++                              lstat_control.counts[cpu], next_ret_bcount);
++              actual_ret_bcount += next_ret_bcount;
++      }
++
++      next_ret_bcount = LSTAT_MAX_STAT_INDEX *
++                      sizeof (lstat_directory_entry_t);
++      if (((actual_ret_bcount + next_ret_bcount) > max_len)
++                      || !lstat_control.dir)
++              return actual_ret_bcount;       /* leave early */
++
++      copy_to_user(buffer + actual_ret_bcount, lstat_control.dir,
++                      next_ret_bcount);
++      actual_ret_bcount += next_ret_bcount;
++
++      next_ret_bcount = sizeof (lstat_read_lock_cpu_counts_t);
++      for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++              if (actual_ret_bcount + next_ret_bcount > max_len)
++                      return actual_ret_bcount;
++              copy_to_user(buffer + actual_ret_bcount,
++                              lstat_control.read_lock_counts[cpu],
++                              next_ret_bcount);
++              actual_ret_bcount += next_ret_bcount;
++      }
++
++      return actual_ret_bcount;
++}
++
++/*
++ *  Writing to the /proc lockmeter node enables or disables metering.
++ *  based upon the first byte of the "written" data.
++ *  The following values are defined:
++ *  LSTAT_ON: 1st call: allocates storage, intializes and turns on measurement
++ *            subsequent calls just turn on measurement
++ *  LSTAT_OFF: turns off measurement
++ *  LSTAT_RESET: resets statistics
++ *  LSTAT_RELEASE: releases statistics storage
++ *
++ *  This allows one to accumulate statistics over several lockstat runs:
++ *
++ *  lockstat on
++ *  lockstat off
++ *  ...repeat above as desired...
++ *  lockstat get
++ *  ...now start a new set of measurements...
++ *  lockstat reset
++ *  lockstat on
++ *  ...
++ *
++ */
++ssize_t
++put_lockmeter_info(const char *buffer, size_t len)
++{
++      int error = 0;
++      int dirsize, countsize, read_lock_countsize, hashsize;
++      int cpu;
++      char put_char;
++      int i, read_lock_blocks;
++      unsigned long flags;
++      rwlock_t *lock_ptr;
++      struct timeval tv;
++
++      if (len <= 0)
++              return -EINVAL;
++
++      _raw_spin_lock(&lstat_control.control_lock);
++
++      get_user(put_char, buffer);
++      switch (put_char) {
++
++      case LSTAT_OFF:
++              if (lstat_control.state != LSTAT_OFF) {
++                      /*
++                       * To avoid seeing read lock hold times in an
++                       * inconsisent state, we have to follow this protocol
++                       * to turn off statistics
++                       */
++                      local_irq_save(flags);
++                      /*
++                       * getting this lock will stop any read lock block
++                       * allocations
++                       */
++                      _raw_spin_lock(&lstat_control.directory_lock);
++                      /*
++                       * keep any more read lock blocks from being
++                       * allocated
++                       */
++                      lstat_control.state = LSTAT_OFF;
++                      /* record how may read lock blocks there are */
++                      read_lock_blocks =
++                              lstat_control.next_free_read_lock_index;
++                      _raw_spin_unlock(&lstat_control.directory_lock);
++                      /* now go through the list of read locks */
++                      cpu = THIS_CPU_NUMBER;
++                      for (i = 1; i < read_lock_blocks; i++) {
++                              lock_ptr =
++                                  (*lstat_control.read_lock_counts[cpu])[i].
++                                  lock_ptr;
++                              /* is this saved lock address still valid? */
++                              if (GET_RWINDEX(lock_ptr) == i) {
++                                      /*
++                                       * lock address appears to still be
++                                       * valid because we only hold one lock
++                                       * at a time, this can't cause a
++                                       * deadlock unless this is a lock held
++                                       * as part of the current system call
++                                       * path. At the moment there
++                                       * are no READ mode locks held to get
++                                       * here from user space, so we solve
++                                       * this by skipping locks held in
++                                       * write mode.
++                                       */
++                                      if (RWLOCK_IS_WRITE_LOCKED(lock_ptr)) {
++                                              PUT_RWINDEX(lock_ptr, 0);
++                                              continue;
++                                      }
++                                      /*
++                                       * now we know there are no read
++                                       * holders of this lock! stop
++                                       * statistics collection for this
++                                       * lock
++                                       */
++                                      _raw_write_lock(lock_ptr);
++                                      PUT_RWINDEX(lock_ptr, 0);
++                                      _raw_write_unlock(lock_ptr);
++                              }
++                              /*
++                               * it may still be possible for the hold time
++                               * sum to be negative e.g. if a lock is
++                               * reallocated while "busy" we will have to fix
++                               * this up in the data reduction program.
++                               */
++                      }
++                      local_irq_restore(flags);
++                      lstat_control.intervals++;
++                      lstat_control.ending_cycles64 = get_cycles64();
++                      lstat_control.enabled_cycles64 +=
++                              lstat_control.ending_cycles64 -
++                              lstat_control.started_cycles64;
++                      do_gettimeofday(&tv);
++                      lstat_control.ending_time = tv.tv_sec;
++                      /*
++                       * don't deallocate the structures -- we may do a
++                       * lockstat on to add to the data that is already
++                       * there. Use LSTAT_RELEASE to release storage
++                       */
++              } else {
++                      error = -EBUSY; /* already OFF */
++              }
++              break;
++
++      case LSTAT_ON:
++              if (lstat_control.state == LSTAT_OFF) {
++#ifdef DEBUG_LOCKMETER
++                      printk("put_lockmeter_info(cpu=%d): LSTAT_ON\n",
++                              THIS_CPU_NUMBER);
++#endif
++                      lstat_control.next_free_dir_index = 1;  /* 0 is for overflows */
++
++                      dirsize = LSTAT_MAX_STAT_INDEX *
++                                      sizeof (lstat_directory_entry_t);
++                      hashsize =
++                              (1 + LSTAT_HASH_TABLE_SIZE) * sizeof (ushort);
++                      countsize = sizeof (lstat_cpu_counts_t);
++                      read_lock_countsize =
++                              sizeof (lstat_read_lock_cpu_counts_t);
++#ifdef DEBUG_LOCKMETER
++                      printk(" dirsize:%d", dirsize);
++                      printk(" hashsize:%d", hashsize);
++                      printk(" countsize:%d", countsize);
++                      printk(" read_lock_countsize:%d\n",
++                              read_lock_countsize);
++#endif
++#ifdef DEBUG_LOCKMETER
++                      {
++                              int secs;
++                              unsigned long cycles;
++                              uint64_t cycles64;
++
++                              do_gettimeofday(&tv);
++                              secs = tv.tv_sec;
++                              do {
++                                      do_gettimeofday(&tv);
++                              } while (secs == tv.tv_sec);
++                              cycles = get_cycles();
++                              cycles64 = get_cycles64();
++                              secs = tv.tv_sec;
++                              do {
++                                      do_gettimeofday(&tv);
++                              } while (secs == tv.tv_sec);
++                              cycles = get_cycles() - cycles;
++                              cycles64 = get_cycles64() - cycles;
++                              printk("lockmeter: cycleFrequency:%d "
++                                      "cycles:%d cycles64:%d\n",
++                                      CPU_CYCLE_FREQUENCY, cycles, cycles64);
++                      }
++#endif
++
++                      /*
++                       * if this is the first call, allocate storage and
++                       * initialize
++                       */
++                      if (!lstat_control.hashtab) {
++
++                              spin_lock_init(&lstat_control.directory_lock);
++
++                              /* guarantee all pointers at zero */
++                              init_control_space();
++
++                              lstat_control.hashtab =
++                                  kmalloc(hashsize, GFP_KERNEL);
++                              if (!lstat_control.hashtab) {
++                                      error = -ENOSPC;
++#ifdef DEBUG_LOCKMETER
++                                      printk("!!error kmalloc of hashtab\n");
++#endif
++                              }
++                              lstat_control.dir = vmalloc(dirsize);
++                              if (!lstat_control.dir) {
++                                      error = -ENOSPC;
++#ifdef DEBUG_LOCKMETER
++                                      printk("!!error kmalloc of dir\n");
++#endif
++                              }
++
++                              for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++                                      lstat_control.counts[cpu] =
++                                              vmalloc(countsize);
++                                      if (!lstat_control.counts[cpu]) {
++                                              error = -ENOSPC;
++#ifdef DEBUG_LOCKMETER
++                                              printk("!!error vmalloc of "
++                                                      "counts[%d]\n", cpu);
++#endif
++                                      }
++                                      lstat_control.read_lock_counts[cpu] =
++                                              (lstat_read_lock_cpu_counts_t *)
++                                              kmalloc(read_lock_countsize,
++                                                      GFP_KERNEL);
++                                      if (!lstat_control.
++                                                      read_lock_counts[cpu]) {
++                                              error = -ENOSPC;
++#ifdef DEBUG_LOCKMETER
++                                              printk("!!error kmalloc of "
++                                                "read_lock_counts[%d]\n",
++                                                      cpu);
++#endif
++                                      }
++                              }
++                      }
++
++                      if (error) {
++                              /*
++                               * One or more kmalloc failures -- free
++                               * everything
++                               */
++                              release_control_space();
++                      } else {
++
++                              if (!reset_lstat_data()) {
++                                      error = -EINVAL;
++                                      break;
++                              };
++
++                              /*
++                               * record starting and ending times and the
++                               * like
++                               */
++                              if (lstat_control.intervals == 0) {
++                                      do_gettimeofday(&tv);
++                                      lstat_control.first_started_time =
++                                              tv.tv_sec;
++                              }
++                              lstat_control.started_cycles64 = get_cycles64();
++                              do_gettimeofday(&tv);
++                              lstat_control.started_time = tv.tv_sec;
++
++                              lstat_control.state = LSTAT_ON;
++                      }
++              } else {
++                      error = -EBUSY; /* already ON */
++              }
++              break;
++
++      case LSTAT_RESET:
++              if (lstat_control.state == LSTAT_OFF) {
++                      if (!reset_lstat_data())
++                              error = -EINVAL;
++              } else {
++                      error = -EBUSY; /* still on; can't reset */
++              }
++              break;
++
++      case LSTAT_RELEASE:
++              if (lstat_control.state == LSTAT_OFF) {
++                      release_control_space();
++                      lstat_control.intervals = 0;
++                      lstat_control.enabled_cycles64 = 0;
++              } else {
++                      error = -EBUSY;
++              }
++              break;
++
++      default:
++              error = -EINVAL;
++      }                       /* switch */
++
++      _raw_spin_unlock(&lstat_control.control_lock);
++      return error ? error : len;
++}
++
++#ifdef USER_MODE_TESTING
++/* following used for user mode testing */
++void
++lockmeter_init()
++{
++      int dirsize, hashsize, countsize, read_lock_countsize, cpu;
++
++      printf("lstat_control is at %x size=%d\n", &lstat_control,
++              sizeof (lstat_control));
++      printf("sizeof(spinlock_t)=%d\n", sizeof (spinlock_t));
++      lstat_control.state = LSTAT_ON;
++
++      lstat_control.directory_lock = SPIN_LOCK_UNLOCKED;
++      lstat_control.next_free_dir_index = 1;  /* 0 is for overflows */
++      lstat_control.next_free_read_lock_index = 1;
++
++      dirsize = LSTAT_MAX_STAT_INDEX * sizeof (lstat_directory_entry_t);
++      hashsize = (1 + LSTAT_HASH_TABLE_SIZE) * sizeof (ushort);
++      countsize = sizeof (lstat_cpu_counts_t);
++      read_lock_countsize = sizeof (lstat_read_lock_cpu_counts_t);
++
++      lstat_control.hashtab = (ushort *) malloc(hashsize);
++
++      if (lstat_control.hashtab == 0) {
++              printf("malloc failure for at line %d in lockmeter.c\n",
++                      __LINE__);
++              exit(0);
++      }
++
++      lstat_control.dir = (lstat_directory_entry_t *) malloc(dirsize);
++
++      if (lstat_control.dir == 0) {
++              printf("malloc failure for at line %d in lockmeter.c\n", cpu,
++                      __LINE__);
++              exit(0);
++      }
++
++      for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++              int j, k;
++              j = (int) (lstat_control.counts[cpu] =
++                         (lstat_cpu_counts_t *) malloc(countsize));
++              k = (int) (lstat_control.read_lock_counts[cpu] =
++                         (lstat_read_lock_cpu_counts_t *)
++                         malloc(read_lock_countsize));
++              if (j * k == 0) {
++                      printf("malloc failure for cpu=%d at line %d in "
++                              "lockmeter.c\n", cpu, __LINE__);
++                      exit(0);
++              }
++      }
++
++      memset(lstat_control.hashtab, 0, hashsize);
++      memset(lstat_control.dir, 0, dirsize);
++
++      for (cpu = 0; cpu < num_online_cpus(); cpu++) {
++              memset(lstat_control.counts[cpu], 0, countsize);
++              memset(lstat_control.read_lock_counts[cpu], 0,
++                      read_lock_countsize);
++      }
++}
++
++asm("
++.align        4
++.globl        __write_lock_failed
++__write_lock_failed:
++      " LOCK "addl    $" RW_LOCK_BIAS_STR ",(%eax)
++1:    cmpl    $" RW_LOCK_BIAS_STR ",(%eax)
++      jne     1b
++
++      " LOCK "subl    $" RW_LOCK_BIAS_STR ",(%eax)
++      jnz     __write_lock_failed
++      ret
++
++
++.align        4
++.globl        __read_lock_failed
++__read_lock_failed:
++      lock ; incl     (%eax)
++1:    cmpl    $1,(%eax)
++      js      1b
++
++      lock ; decl     (%eax)
++      js      __read_lock_failed
++      ret
++");
++#endif
+--- linux-2.6.0-test1/kernel/Makefile  2003-06-26 22:07:26.000000000 -0700
++++ 25/kernel/Makefile 2003-07-19 17:06:40.000000000 -0700
+@@ -11,6 +11,7 @@ obj-y     = sched.o fork.o exec_domain.o
+ obj-$(CONFIG_FUTEX) += futex.o
+ obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
+ obj-$(CONFIG_SMP) += cpu.o
++obj-$(CONFIG_LOCKMETER) += lockmeter.o
+ obj-$(CONFIG_UID16) += uid16.o
+ obj-$(CONFIG_MODULES) += ksyms.o module.o
+ obj-$(CONFIG_KALLSYMS) += kallsyms.o
+--- linux-2.6.0-test1/kernel/module.c  2003-07-02 14:53:18.000000000 -0700
++++ 25/kernel/module.c 2003-07-19 17:04:07.000000000 -0700
+@@ -98,6 +98,17 @@ int init_module(void)
+ }
+ EXPORT_SYMBOL(init_module);
++/* A thread that wants to hold a reference to a module only while it
++ * is running can call ths to safely exit.
++ * nfsd and lockd use this.
++ */
++void __module_put_and_exit(struct module *mod, long code)
++{
++      module_put(mod);
++      do_exit(code);
++}
++EXPORT_SYMBOL(__module_put_and_exit);
++      
+ /* Find a module section: 0 means not found. */
+ static unsigned int find_sec(Elf_Ehdr *hdr,
+                            Elf_Shdr *sechdrs,
+@@ -374,9 +385,9 @@ static void module_unload_init(struct mo
+       INIT_LIST_HEAD(&mod->modules_which_use_me);
+       for (i = 0; i < NR_CPUS; i++)
+-              atomic_set(&mod->ref[i].count, 0);
++              local_set(&mod->ref[i].count, 0);
+       /* Hold reference count during initialization. */
+-      atomic_set(&mod->ref[smp_processor_id()].count, 1);
++      local_set(&mod->ref[smp_processor_id()].count, 1);
+       /* Backwards compatibility macros put refcount during init. */
+       mod->waiter = current;
+ }
+@@ -471,7 +482,7 @@ static int stopref(void *cpu)
+       struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+       setscheduler(current->pid, SCHED_FIFO, &param);
+ #endif
+-      set_cpus_allowed(current, 1UL << (unsigned long)cpu);
++      set_cpus_allowed(current, cpumask_of_cpu((int)(long)cpu));
+       /* Ack: we are alive */
+       atomic_inc(&stopref_thread_ack);
+@@ -524,7 +535,7 @@ static void stopref_set_state(enum stopr
+ static int stop_refcounts(void)
+ {
+       unsigned int i, cpu;
+-      unsigned long old_allowed;
++      cpumask_t old_allowed;
+       int ret = 0;
+       /* One thread per cpu.  We'll do our own. */
+@@ -532,7 +543,7 @@ static int stop_refcounts(void)
+       /* FIXME: racy with set_cpus_allowed. */
+       old_allowed = current->cpus_allowed;
+-      set_cpus_allowed(current, 1UL << (unsigned long)cpu);
++      set_cpus_allowed(current, cpumask_of_cpu(cpu));
+       atomic_set(&stopref_thread_ack, 0);
+       stopref_num_threads = 0;
+@@ -599,7 +610,7 @@ unsigned int module_refcount(struct modu
+       unsigned int i, total = 0;
+       for (i = 0; i < NR_CPUS; i++)
+-              total += atomic_read(&mod->ref[i].count);
++              total += local_read(&mod->ref[i].count);
+       return total;
+ }
+ EXPORT_SYMBOL(module_refcount);
+@@ -610,7 +621,10 @@ static void free_module(struct module *m
+ #ifdef CONFIG_MODULE_FORCE_UNLOAD
+ static inline int try_force(unsigned int flags)
+ {
+-      return (flags & O_TRUNC);
++      int ret = (flags & O_TRUNC);
++      if (ret)
++              tainted |= TAINT_FORCED_MODULE;
++      return ret;
+ }
+ #else
+ static inline int try_force(unsigned int flags)
+--- linux-2.6.0-test1/kernel/printk.c  2003-07-02 14:53:18.000000000 -0700
++++ 25/kernel/printk.c 2003-07-19 17:07:04.000000000 -0700
+@@ -399,9 +399,13 @@ asmlinkage int printk(const char *fmt, .
+       char *p;
+       static char printk_buf[1024];
+       static int log_level_unknown = 1;
++      static int printk_cpu = -1;
+-      if (oops_in_progress) {
+-              /* If a crash is occurring, make sure we can't deadlock */
++      if (oops_in_progress && printk_cpu == smp_processor_id()) {
++              /*
++               * If a crash is occurring during printk() on this CPU, make
++               * sure we can't deadlock
++               */
+               spin_lock_init(&logbuf_lock);
+               /* And make sure that we print immediately */
+               init_MUTEX(&console_sem);
+@@ -409,6 +413,7 @@ asmlinkage int printk(const char *fmt, .
+       /* This stops the holder of console_sem just where we want him */
+       spin_lock_irqsave(&logbuf_lock, flags);
++      printk_cpu = smp_processor_id();
+       /* Emit the output into the temporary buffer */
+       va_start(args, fmt);
+--- linux-2.6.0-test1/kernel/profile.c 2003-06-14 12:18:34.000000000 -0700
++++ 25/kernel/profile.c        2003-07-19 17:03:51.000000000 -0700
+@@ -8,8 +8,7 @@
+ #include <linux/bootmem.h>
+ #include <linux/notifier.h>
+ #include <linux/mm.h>
+-
+-extern char _stext, _etext;
++#include <asm/sections.h>
+ unsigned int * prof_buffer;
+ unsigned long prof_len;
+@@ -36,7 +35,7 @@ void __init profile_init(void)
+               return;
+  
+       /* only text is profiled */
+-      prof_len = (unsigned long) &_etext - (unsigned long) &_stext;
++      prof_len = _etext - _stext;
+       prof_len >>= prof_shift;
+               
+       size = prof_len * sizeof(unsigned int) + PAGE_SIZE - 1;
+--- linux-2.6.0-test1/kernel/rcupdate.c        2003-06-26 22:07:26.000000000 -0700
++++ 25/kernel/rcupdate.c       2003-07-19 17:04:56.000000000 -0700
+@@ -41,6 +41,7 @@
+ #include <linux/module.h>
+ #include <linux/completion.h>
+ #include <linux/percpu.h>
++#include <linux/seq_file.h>
+ #include <linux/notifier.h>
+ #include <linux/rcupdate.h>
+ #include <linux/cpu.h>
+@@ -48,7 +49,7 @@
+ /* Definition for rcupdate control block. */
+ struct rcu_ctrlblk rcu_ctrlblk = 
+       { .mutex = SPIN_LOCK_UNLOCKED, .curbatch = 1, 
+-        .maxbatch = 1, .rcu_cpu_mask = 0 };
++        .maxbatch = 1, .rcu_cpu_mask = CPU_MASK_NONE };
+ DEFINE_PER_CPU(struct rcu_data, rcu_data) = { 0L };
+ /* Fake initialization required by compiler */
+@@ -76,6 +77,7 @@ void call_rcu(struct rcu_head *head, voi
+       local_irq_save(flags);
+       cpu = smp_processor_id();
+       list_add_tail(&head->list, &RCU_nxtlist(cpu));
++      RCU_nr_rcureqs(cpu)++;
+       local_irq_restore(flags);
+ }
+@@ -83,7 +85,7 @@ void call_rcu(struct rcu_head *head, voi
+  * Invoke the completed RCU callbacks. They are expected to be in
+  * a per-cpu list.
+  */
+-static void rcu_do_batch(struct list_head *list)
++static void rcu_do_batch(int cpu, struct list_head *list)
+ {
+       struct list_head *entry;
+       struct rcu_head *head;
+@@ -93,6 +95,7 @@ static void rcu_do_batch(struct list_hea
+               list_del(entry);
+               head = list_entry(entry, struct rcu_head, list);
+               head->func(head->arg);
++              RCU_nr_rcupdates(cpu)++;
+       }
+ }
+@@ -107,7 +110,7 @@ static void rcu_start_batch(long newbatc
+               rcu_ctrlblk.maxbatch = newbatch;
+       }
+       if (rcu_batch_before(rcu_ctrlblk.maxbatch, rcu_ctrlblk.curbatch) ||
+-          (rcu_ctrlblk.rcu_cpu_mask != 0)) {
++          !cpus_empty(rcu_ctrlblk.rcu_cpu_mask)) {
+               return;
+       }
+       rcu_ctrlblk.rcu_cpu_mask = cpu_online_map;
+@@ -122,7 +125,7 @@ static void rcu_check_quiescent_state(vo
+ {
+       int cpu = smp_processor_id();
+-      if (!test_bit(cpu, &rcu_ctrlblk.rcu_cpu_mask))
++      if (!cpu_isset(cpu, rcu_ctrlblk.rcu_cpu_mask))
+               return;
+       /* 
+@@ -138,12 +141,12 @@ static void rcu_check_quiescent_state(vo
+               return;
+       spin_lock(&rcu_ctrlblk.mutex);
+-      if (!test_bit(cpu, &rcu_ctrlblk.rcu_cpu_mask))
++      if (!cpu_isset(cpu, rcu_ctrlblk.rcu_cpu_mask))
+               goto out_unlock;
+-      clear_bit(cpu, &rcu_ctrlblk.rcu_cpu_mask);
++      cpu_clear(cpu, rcu_ctrlblk.rcu_cpu_mask);
+       RCU_last_qsctr(cpu) = RCU_QSCTR_INVALID;
+-      if (rcu_ctrlblk.rcu_cpu_mask != 0)
++      if (!cpus_empty(rcu_ctrlblk.rcu_cpu_mask))
+               goto out_unlock;
+       rcu_ctrlblk.curbatch++;
+@@ -186,7 +189,7 @@ static void rcu_process_callbacks(unsign
+       }
+       rcu_check_quiescent_state();
+       if (!list_empty(&list))
+-              rcu_do_batch(&list);
++              rcu_do_batch(cpu, &list);
+ }
+ void rcu_check_callbacks(int cpu, int user)
+@@ -265,3 +268,44 @@ void synchronize_kernel(void)
+ EXPORT_SYMBOL(call_rcu);
+ EXPORT_SYMBOL(synchronize_kernel);
++
++#ifdef        CONFIG_PROC_FS
++
++static void *rcu_start(struct seq_file *m, loff_t *pos)
++{
++      static int cpu;
++      cpu = *pos;
++      return *pos < NR_CPUS ? &cpu : NULL;
++}
++
++static void *rcu_next(struct seq_file *m, void *v, loff_t *pos)
++{
++      ++*pos;
++      return rcu_start(m, pos);
++}
++
++static void rcu_stop(struct seq_file *m, void *v)
++{
++}
++
++static int show_rcu(struct seq_file *m, void *v)
++{
++      int cpu = *(int *)v;
++
++      if (!cpu_online(cpu))
++              return 0;
++      seq_printf(m, "CPU : %d\n", cpu);
++      seq_printf(m, "RCU requests : %ld\n", RCU_nr_rcureqs(cpu));
++      seq_printf(m, "RCU updates : %ld\n\n", RCU_nr_rcupdates(cpu));
++      return 0;
++}
++
++struct seq_operations rcu_op = {
++      .start  = rcu_start,
++      .next   = rcu_next,
++      .stop   = rcu_stop,
++      .show   = show_rcu,
++};
++
++#endif
++
+--- linux-2.6.0-test1/kernel/sched.c   2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/sched.c  2003-07-19 17:07:14.000000000 -0700
+@@ -68,14 +68,16 @@
+  */
+ #define MIN_TIMESLICE         ( 10 * HZ / 1000)
+ #define MAX_TIMESLICE         (200 * HZ / 1000)
+-#define CHILD_PENALTY         50
++#define CHILD_PENALTY         95
+ #define PARENT_PENALTY                100
+ #define EXIT_WEIGHT           3
+ #define PRIO_BONUS_RATIO      25
+ #define INTERACTIVE_DELTA     2
++#define MIN_SLEEP_AVG         (HZ)
+ #define MAX_SLEEP_AVG         (10*HZ)
+ #define STARVATION_LIMIT      (10*HZ)
+ #define NODE_THRESHOLD                125
++#define MAX_BONUS             (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100)
+ /*
+  * If a task is 'interactive' then we reinsert it in the active
+@@ -176,7 +178,7 @@ struct runqueue {
+ static DEFINE_PER_CPU(struct runqueue, runqueues);
+ #define cpu_rq(cpu)           (&per_cpu(runqueues, (cpu)))
+-#define this_rq()             (&__get_cpu_var(runqueues))
++#define this_rq()             (cpu_rq(smp_processor_id())) /* not __get_cpu_var(runqueues)! */
+ #define task_rq(p)            cpu_rq(task_cpu(p))
+ #define cpu_curr(cpu)         (cpu_rq(cpu)->curr)
+ #define rt_task(p)            ((p)->prio < MAX_RT_PRIO)
+@@ -297,6 +299,26 @@ static inline void enqueue_task(struct t
+       array->nr_active++;
+       p->array = array;
+ }
++/*
++ * normalise_sleep converts a task's sleep_avg to
++ * an appropriate proportion of MIN_SLEEP_AVG.
++ */
++static inline void normalise_sleep(task_t *p)
++{
++      unsigned long old_avg_time = jiffies - p->avg_start;
++
++      if (unlikely(old_avg_time < MIN_SLEEP_AVG))
++              return;
++
++      if (p->sleep_avg > MAX_SLEEP_AVG)
++              p->sleep_avg = MAX_SLEEP_AVG;
++
++      if (old_avg_time > MAX_SLEEP_AVG)
++              old_avg_time = MAX_SLEEP_AVG;
++
++      p->sleep_avg = p->sleep_avg * MIN_SLEEP_AVG / old_avg_time;
++      p->avg_start = jiffies - MIN_SLEEP_AVG;
++}
+ /*
+  * effective_prio - return the priority that is based on the static
+@@ -315,11 +337,28 @@ static inline void enqueue_task(struct t
+ static int effective_prio(task_t *p)
+ {
+       int bonus, prio;
++      unsigned long sleep_period;
+       if (rt_task(p))
+               return p->prio;
+-      bonus = MAX_USER_PRIO*PRIO_BONUS_RATIO*p->sleep_avg/MAX_SLEEP_AVG/100 -
++      sleep_period = jiffies - p->avg_start;
++
++      if (unlikely(!sleep_period))
++              return p->static_prio;
++
++      if (sleep_period > MAX_SLEEP_AVG)
++              sleep_period = MAX_SLEEP_AVG;
++
++      if (p->sleep_avg > sleep_period)
++              sleep_period = p->sleep_avg;
++
++      /*
++       * The bonus is determined according to the accumulated
++       * sleep avg over the duration the task has been running
++       * until it reaches MAX_SLEEP_AVG. -ck
++       */
++      bonus = MAX_USER_PRIO*PRIO_BONUS_RATIO*p->sleep_avg/sleep_period/100 -
+                       MAX_USER_PRIO*PRIO_BONUS_RATIO/100/2;
+       prio = p->static_prio - bonus;
+@@ -350,31 +389,47 @@ static inline void activate_task(task_t 
+       long sleep_time = jiffies - p->last_run - 1;
+       if (sleep_time > 0) {
+-              int sleep_avg;
+-
+               /*
+-               * This code gives a bonus to interactive tasks.
+-               *
+-               * The boost works by updating the 'average sleep time'
+-               * value here, based on ->last_run. The more time a task
+-               * spends sleeping, the higher the average gets - and the
+-               * higher the priority boost gets as well.
++               * User tasks that sleep a long time are categorised as idle and
++               * will get just under interactive status with a small runtime
++               * to allow them to become interactive or non-interactive rapidly
+                */
+-              sleep_avg = p->sleep_avg + sleep_time;
++              if (sleep_time > MIN_SLEEP_AVG && p->mm){
++                      p->avg_start = jiffies - MIN_SLEEP_AVG;
++                      p->sleep_avg = MIN_SLEEP_AVG * (MAX_BONUS - INTERACTIVE_DELTA - 2) /
++                              MAX_BONUS;
++              } else {
++                      unsigned long runtime = jiffies - p->avg_start;
+-              /*
+-               * 'Overflow' bonus ticks go to the waker as well, so the
+-               * ticks are not lost. This has the effect of further
+-               * boosting tasks that are related to maximum-interactive
+-               * tasks.
+-               */
+-              if (sleep_avg > MAX_SLEEP_AVG)
+-                      sleep_avg = MAX_SLEEP_AVG;
+-              if (p->sleep_avg != sleep_avg) {
+-                      p->sleep_avg = sleep_avg;
+-                      p->prio = effective_prio(p);
++                      if (runtime > MAX_SLEEP_AVG)
++                              runtime = MAX_SLEEP_AVG;
++
++                      /*
++                       * This code gives a bonus to interactive tasks.
++                       *
++                       * The boost works by updating the 'average sleep time'
++                       * value here, based on ->last_run. The more time a task
++                       * spends sleeping, the higher the average gets - and the
++                       * higher the priority boost gets as well.
++                       */
++                      p->sleep_avg += sleep_time;
++
++                      /*
++                       * Processes that sleep get pushed to a higher priority
++                       * each time they sleep
++                       */
++                      p->sleep_avg = (p->sleep_avg * MAX_BONUS / runtime + 1) * runtime / MAX_BONUS;
++
++                      if (p->sleep_avg > MAX_SLEEP_AVG)
++                              p->sleep_avg = MAX_SLEEP_AVG;
++              }
++
++              if (unlikely(p->avg_start > jiffies)){
++                      p->avg_start = jiffies;
++                      p->sleep_avg = 0;
+               }
+       }
++      p->prio = effective_prio(p);
+       __activate_task(p, rq);
+ }
+@@ -489,7 +544,7 @@ repeat_lock_task:
+                        */
+                       if (unlikely(sync && !task_running(rq, p) &&
+                               (task_cpu(p) != smp_processor_id()) &&
+-                              (p->cpus_allowed & (1UL << smp_processor_id())))) {
++                              cpu_isset(smp_processor_id(), p->cpus_allowed))) {
+                               set_task_cpu(p, smp_processor_id());
+                               task_rq_unlock(rq, &flags);
+@@ -551,6 +606,7 @@ void wake_up_forked_process(task_t * p)
+        * from forking tasks that are max-interactive.
+        */
+       current->sleep_avg = current->sleep_avg * PARENT_PENALTY / 100;
++      normalise_sleep(p);
+       p->sleep_avg = p->sleep_avg * CHILD_PENALTY / 100;
+       p->prio = effective_prio(p);
+       set_task_cpu(p, smp_processor_id());
+@@ -591,6 +647,8 @@ void sched_exit(task_t * p)
+        * If the child was a (relative-) CPU hog then decrease
+        * the sleep_avg of the parent as well.
+        */
++      normalise_sleep(p);
++      normalise_sleep(p->parent);
+       if (p->sleep_avg < p->parent->sleep_avg)
+               p->parent->sleep_avg = (p->parent->sleep_avg * EXIT_WEIGHT +
+                       p->sleep_avg) / (EXIT_WEIGHT + 1);
+@@ -758,13 +816,13 @@ static inline void double_rq_unlock(runq
+  */
+ static void sched_migrate_task(task_t *p, int dest_cpu)
+ {
+-      unsigned long old_mask;
++      cpumask_t old_mask;
+       old_mask = p->cpus_allowed;
+-      if (!(old_mask & (1UL << dest_cpu)))
++      if (!cpu_isset(dest_cpu, old_mask))
+               return;
+       /* force the process onto the specified CPU */
+-      set_cpus_allowed(p, 1UL << dest_cpu);
++      set_cpus_allowed(p, cpumask_of_cpu(dest_cpu));
+       /* restore the cpus allowed mask */
+       set_cpus_allowed(p, old_mask);
+@@ -777,7 +835,7 @@ static void sched_migrate_task(task_t *p
+ static int sched_best_cpu(struct task_struct *p)
+ {
+       int i, minload, load, best_cpu, node = 0;
+-      unsigned long cpumask;
++      cpumask_t cpumask;
+       best_cpu = task_cpu(p);
+       if (cpu_rq(best_cpu)->nr_running <= 2)
+@@ -801,7 +859,7 @@ static int sched_best_cpu(struct task_st
+       minload = 10000000;
+       cpumask = node_to_cpumask(node);
+       for (i = 0; i < NR_CPUS; ++i) {
+-              if (!(cpumask & (1UL << i)))
++              if (!cpu_isset(i, cpumask))
+                       continue;
+               if (cpu_rq(i)->nr_running < minload) {
+                       best_cpu = i;
+@@ -888,7 +946,7 @@ static inline unsigned int double_lock_b
+ /*
+  * find_busiest_queue - find the busiest runqueue among the cpus in cpumask.
+  */
+-static inline runqueue_t *find_busiest_queue(runqueue_t *this_rq, int this_cpu, int idle, int *imbalance, unsigned long cpumask)
++static inline runqueue_t *find_busiest_queue(runqueue_t *this_rq, int this_cpu, int idle, int *imbalance, cpumask_t cpumask)
+ {
+       int nr_running, load, max_load, i;
+       runqueue_t *busiest, *rq_src;
+@@ -923,7 +981,7 @@ static inline runqueue_t *find_busiest_q
+       busiest = NULL;
+       max_load = 1;
+       for (i = 0; i < NR_CPUS; i++) {
+-              if (!((1UL << i) & cpumask))
++              if (!cpu_isset(i, cpumask))
+                       continue;
+               rq_src = cpu_rq(i);
+@@ -942,10 +1000,10 @@ static inline runqueue_t *find_busiest_q
+       if (likely(!busiest))
+               goto out;
+-      *imbalance = (max_load - nr_running) / 2;
++      *imbalance = max_load - nr_running;
+       /* It needs an at least ~25% imbalance to trigger balancing. */
+-      if (!idle && (*imbalance < (max_load + 3)/4)) {
++      if (!idle && ((*imbalance)*4 < max_load)) {
+               busiest = NULL;
+               goto out;
+       }
+@@ -955,7 +1013,7 @@ static inline runqueue_t *find_busiest_q
+        * Make sure nothing changed since we checked the
+        * runqueue length.
+        */
+-      if (busiest->nr_running <= nr_running + 1) {
++      if (busiest->nr_running <= nr_running) {
+               spin_unlock(&busiest->lock);
+               busiest = NULL;
+       }
+@@ -995,7 +1053,7 @@ static inline void pull_task(runqueue_t 
+  * We call this with the current runqueue locked,
+  * irqs disabled.
+  */
+-static void load_balance(runqueue_t *this_rq, int idle, unsigned long cpumask)
++static void load_balance(runqueue_t *this_rq, int idle, cpumask_t cpumask)
+ {
+       int imbalance, idx, this_cpu = smp_processor_id();
+       runqueue_t *busiest;
+@@ -1008,6 +1066,12 @@ static void load_balance(runqueue_t *thi
+               goto out;
+       /*
++       * We only want to steal a number of tasks equal to 1/2 the imbalance,
++       * otherwise we'll just shift the imbalance to the new queue:
++       */
++      imbalance /= 2;
++
++      /*
+        * We first consider expired tasks. Those will likely not be
+        * executed in the near future, and they are most likely to
+        * be cache-cold, thus switching CPUs has the least effect
+@@ -1049,7 +1113,7 @@ skip_queue:
+ #define CAN_MIGRATE_TASK(p,rq,this_cpu)                                       \
+       ((!idle || (jiffies - (p)->last_run > cache_decay_ticks)) &&    \
+               !task_running(rq, p) &&                                 \
+-                      ((p)->cpus_allowed & (1UL << (this_cpu))))
++                      cpu_isset(this_cpu, (p)->cpus_allowed))
+       curr = curr->prev;
+@@ -1092,10 +1156,10 @@ out:
+ static void balance_node(runqueue_t *this_rq, int idle, int this_cpu)
+ {
+       int node = find_busiest_node(cpu_to_node(this_cpu));
+-      unsigned long cpumask, this_cpumask = 1UL << this_cpu;
+       if (node >= 0) {
+-              cpumask = node_to_cpumask(node) | this_cpumask;
++              cpumask_t cpumask = node_to_cpumask(node);
++              cpu_set(this_cpu, cpumask);
+               spin_lock(&this_rq->lock);
+               load_balance(this_rq, idle, cpumask);
+               spin_unlock(&this_rq->lock);
+@@ -1207,11 +1271,7 @@ void scheduler_tick(int user_ticks, int 
+       spin_lock(&rq->lock);
+       /*
+        * The task was running during this tick - update the
+-       * time slice counter and the sleep average. Note: we
+-       * do not update a thread's priority until it either
+-       * goes to sleep or uses up its timeslice. This makes
+-       * it possible for interactive tasks to use up their
+-       * timeslices at their highest priority levels.
++       * time slice counter and the sleep average.
+        */
+       if (p->sleep_avg)
+               p->sleep_avg--;
+@@ -1244,6 +1304,17 @@ void scheduler_tick(int user_ticks, int 
+                       enqueue_task(p, rq->expired);
+               } else
+                       enqueue_task(p, rq->active);
++      } else if (p->mm && !((task_timeslice(p) - p->time_slice) %
++               (MIN_TIMESLICE * (MAX_BONUS + 1 - p->sleep_avg * MAX_BONUS / MAX_SLEEP_AVG)))){
++              /*
++               * Running user tasks get requeued with their remaining timeslice
++               * after a period proportional to how cpu intensive they are to
++               * minimise the duration one interactive task can starve another
++               */
++              dequeue_task(p, rq->active);
++              set_tsk_need_resched(p);
++              p->prio = effective_prio(p);
++              enqueue_task(p, rq->active);
+       }
+ out_unlock:
+       spin_unlock(&rq->lock);
+@@ -1606,6 +1677,13 @@ out_unlock:
+       task_rq_unlock(rq, &flags);
+ }
++#if defined( CONFIG_KGDB) 
++struct task_struct * kgdb_get_idle(int this_cpu)
++{
++        return cpu_rq(this_cpu)->idle;
++}
++#endif
++
+ #ifndef __alpha__
+ /*
+@@ -1898,7 +1976,7 @@ out_unlock:
+ asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len,
+                                     unsigned long __user *user_mask_ptr)
+ {
+-      unsigned long new_mask;
++      cpumask_t new_mask;
+       int retval;
+       task_t *p;
+@@ -1946,7 +2024,7 @@ asmlinkage long sys_sched_getaffinity(pi
+                                     unsigned long __user *user_mask_ptr)
+ {
+       unsigned int real_len;
+-      unsigned long mask;
++      cpumask_t mask;
+       int retval;
+       task_t *p;
+@@ -1962,7 +2040,7 @@ asmlinkage long sys_sched_getaffinity(pi
+               goto out_unlock;
+       retval = 0;
+-      mask = p->cpus_allowed & cpu_online_map;
++      cpus_and(mask, p->cpus_allowed, cpu_online_map);
+ out_unlock:
+       read_unlock(&tasklist_lock);
+@@ -2080,7 +2158,7 @@ asmlinkage long sys_sched_get_priority_m
+ }
+ /**
+- * sys_sched_get_priority_mix - return minimum RT priority.
++ * sys_sched_get_priority_min - return minimum RT priority.
+  * @policy: scheduling class.
+  *
+  * this syscall returns the minimum rt_priority that can be used
+@@ -2159,17 +2237,16 @@ static inline struct task_struct *younge
+ static void show_task(task_t * p)
+ {
+-      unsigned long free = 0;
+       task_t *relative;
+-      int state;
+-      static const char * stat_nam[] = { "R", "S", "D", "T", "Z", "W" };
++      unsigned state;
++      static const char *stat_nam[] = { "R", "S", "D", "T", "Z", "W" };
+       printk("%-13.13s ", p->comm);
+       state = p->state ? __ffs(p->state) + 1 : 0;
+-      if (((unsigned) state) < sizeof(stat_nam)/sizeof(char *))
++      if (state < ARRAY_SIZE(stat_nam))
+               printk(stat_nam[state]);
+       else
+-              printk(" ");
++              printk("?");
+ #if (BITS_PER_LONG == 32)
+       if (p == current)
+               printk(" current  ");
+@@ -2181,13 +2258,7 @@ static void show_task(task_t * p)
+       else
+               printk(" %016lx ", thread_saved_pc(p));
+ #endif
+-      {
+-              unsigned long * n = (unsigned long *) (p->thread_info+1);
+-              while (!*n)
+-                      n++;
+-              free = (unsigned long) n - (unsigned long)(p+1);
+-      }
+-      printk("%5lu %5d %6d ", free, p->pid, p->parent->pid);
++      printk("%5d %6d ", p->pid, p->parent->pid);
+       if ((relative = eldest_child(p)))
+               printk("%5d ", relative->pid);
+       else
+@@ -2214,12 +2285,12 @@ void show_state(void)
+ #if (BITS_PER_LONG == 32)
+       printk("\n"
+-             "                         free                        sibling\n");
+-      printk("  task             PC    stack   pid father child younger older\n");
++             "                                               sibling\n");
++      printk("  task             PC      pid father child younger older\n");
+ #else
+       printk("\n"
+-             "                                 free                        sibling\n");
+-      printk("  task                 PC        stack   pid father child younger older\n");
++             "                                                       sibling\n");
++      printk("  task                 PC          pid father child younger older\n");
+ #endif
+       read_lock(&tasklist_lock);
+       do_each_thread(g, p) {
+@@ -2292,7 +2363,7 @@ typedef struct {
+  * task must not exit() & deallocate itself prematurely.  The
+  * call is not atomic; no spinlocks may be held.
+  */
+-int set_cpus_allowed(task_t *p, unsigned long new_mask)
++int set_cpus_allowed(task_t *p, cpumask_t new_mask)
+ {
+       unsigned long flags;
+       migration_req_t req;
+@@ -2307,7 +2378,7 @@ int set_cpus_allowed(task_t *p, unsigned
+        * Can the task run on the task's current CPU? If not then
+        * migrate the thread off to a proper CPU.
+        */
+-      if (new_mask & (1UL << task_cpu(p))) {
++      if (cpu_isset(task_cpu(p), new_mask)) {
+               task_rq_unlock(rq, &flags);
+               return 0;
+       }
+@@ -2377,7 +2448,7 @@ static int migration_thread(void * data)
+        * migration thread on this CPU, guaranteed (we're started
+        * serially).
+        */
+-      set_cpus_allowed(current, 1UL << cpu);
++      set_cpus_allowed(current, cpumask_of_cpu(cpu));
+       ret = setscheduler(0, SCHED_FIFO, &param);
+@@ -2541,7 +2612,7 @@ void __might_sleep(char *file, int line)
+               if (time_before(jiffies, prev_jiffy + HZ))
+                       return;
+               prev_jiffy = jiffies;
+-              printk(KERN_ERR "Debug: sleeping function called from illegal"
++              printk(KERN_ERR "Debug: sleeping function called from invalid"
+                               " context at %s:%d\n", file, line);
+               dump_stack();
+       }
+--- linux-2.6.0-test1/kernel/softirq.c 2003-07-10 18:50:32.000000000 -0700
++++ 25/kernel/softirq.c        2003-07-19 17:04:53.000000000 -0700
+@@ -59,11 +59,22 @@ static inline void wakeup_softirqd(void)
+               wake_up_process(tsk);
+ }
++/*
++ * We restart softirq processing MAX_SOFTIRQ_RESTART times,
++ * and we fall back to softirqd after that.
++ *
++ * This number has been established via experimentation.
++ * The two things to balance is latency against fairness -
++ * we want to handle softirqs as soon as possible, but they
++ * should not be able to lock up the box.
++ */
++#define MAX_SOFTIRQ_RESTART 10
++
+ asmlinkage void do_softirq(void)
+ {
++      int max_restart = MAX_SOFTIRQ_RESTART;
+       __u32 pending;
+       unsigned long flags;
+-      __u32 mask;
+       if (in_interrupt())
+               return;
+@@ -75,7 +86,6 @@ asmlinkage void do_softirq(void)
+       if (pending) {
+               struct softirq_action *h;
+-              mask = ~pending;
+               local_bh_disable();
+ restart:
+               /* Reset the pending bitmask before enabling irqs */
+@@ -95,10 +105,8 @@ restart:
+               local_irq_disable();
+               pending = local_softirq_pending();
+-              if (pending & mask) {
+-                      mask &= ~pending;
++              if (pending && --max_restart)
+                       goto restart;
+-              }
+               if (pending)
+                       wakeup_softirqd();
+               __local_bh_enable();
+@@ -322,9 +330,8 @@ static int ksoftirqd(void * __bind_cpu)
+       current->flags |= PF_IOTHREAD;
+       /* Migrate to the right CPU */
+-      set_cpus_allowed(current, 1UL << cpu);
+-      if (smp_processor_id() != cpu)
+-              BUG();
++      set_cpus_allowed(current, cpumask_of_cpu(cpu));
++      BUG_ON(smp_processor_id() != cpu);
+       __set_current_state(TASK_INTERRUPTIBLE);
+       mb();
+--- linux-2.6.0-test1/kernel/suspend.c 2003-07-10 18:50:32.000000000 -0700
++++ 25/kernel/suspend.c        2003-07-19 17:03:51.000000000 -0700
+@@ -52,7 +52,6 @@
+ #include <linux/genhd.h>
+ #include <linux/kernel.h>
+ #include <linux/major.h>
+-#include <linux/blk.h>
+ #include <linux/swap.h>
+ #include <linux/pm.h>
+ #include <linux/device.h>
+--- linux-2.6.0-test1/kernel/sys.c     2003-07-13 21:44:35.000000000 -0700
++++ 25/kernel/sys.c    2003-07-19 17:03:51.000000000 -0700
+@@ -601,6 +601,14 @@ static int set_user(uid_t new_ruid, int 
+       new_user = alloc_uid(new_ruid);
+       if (!new_user)
+               return -EAGAIN;
++
++      if (atomic_read(&new_user->processes) >=
++                              current->rlim[RLIMIT_NPROC].rlim_cur &&
++                      new_user != &root_user) {
++              free_uid(new_user);
++              return -EAGAIN;
++      }
++
+       switch_uid(new_user);
+       if(dumpclear)
+@@ -1159,6 +1167,7 @@ asmlinkage long sys_newuname(struct new_
+ asmlinkage long sys_sethostname(char __user *name, int len)
+ {
+       int errno;
++      char tmp[__NEW_UTS_LEN];
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+@@ -1166,7 +1175,8 @@ asmlinkage long sys_sethostname(char __u
+               return -EINVAL;
+       down_write(&uts_sem);
+       errno = -EFAULT;
+-      if (!copy_from_user(system_utsname.nodename, name, len)) {
++      if (!copy_from_user(tmp, name, len)) {
++              memcpy(system_utsname.nodename, tmp, len);
+               system_utsname.nodename[len] = 0;
+               errno = 0;
+       }
+@@ -1198,6 +1208,7 @@ asmlinkage long sys_gethostname(char __u
+ asmlinkage long sys_setdomainname(char __user *name, int len)
+ {
+       int errno;
++      char tmp[__NEW_UTS_LEN];
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+@@ -1206,9 +1217,10 @@ asmlinkage long sys_setdomainname(char _
+       down_write(&uts_sem);
+       errno = -EFAULT;
+-      if (!copy_from_user(system_utsname.domainname, name, len)) {
+-              errno = 0;
++      if (!copy_from_user(tmp, name, len)) {
++              memcpy(system_utsname.domainname, tmp, len);
+               system_utsname.domainname[len] = 0;
++              errno = 0;
+       }
+       up_write(&uts_sem);
+       return errno;
+--- linux-2.6.0-test1/kernel/time.c    2003-06-16 22:32:21.000000000 -0700
++++ 25/kernel/time.c   2003-07-19 17:03:51.000000000 -0700
+@@ -66,7 +66,7 @@ asmlinkage long sys_time(int * tloc)
+  * architectures that need it).
+  */
+  
+-asmlinkage long sys_stime(int * tptr)
++asmlinkage long sys_stime(time_t *tptr)
+ {
+       struct timespec tv;
+@@ -160,22 +160,25 @@ int do_sys_settimeofday(struct timespec 
+       return 0;
+ }
+-asmlinkage long sys_settimeofday(struct timeval __user *tv, struct timezone __user *tz)
++asmlinkage long sys_settimeofday(struct timeval __user *tv,
++                              struct timezone __user *tz)
+ {
+-      struct timespec new_tv;
++      struct timeval user_tv;
++      struct timespec new_ts;
+       struct timezone new_tz;
+       if (tv) {
+-              if (copy_from_user(&new_tv, tv, sizeof(*tv)))
++              if (copy_from_user(&user_tv, tv, sizeof(*tv)))
+                       return -EFAULT;
+-              new_tv.tv_nsec *= NSEC_PER_USEC;
++              new_ts.tv_sec = user_tv.tv_sec;
++              new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
+       }
+       if (tz) {
+               if (copy_from_user(&new_tz, tz, sizeof(*tz)))
+                       return -EFAULT;
+       }
+-      return do_sys_settimeofday(tv ? &new_tv : NULL, tz ? &new_tz : NULL);
++      return do_sys_settimeofday(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
+ }
+ long pps_offset;              /* pps time offset (us) */
+--- linux-2.6.0-test1/kernel/timer.c   2003-07-10 18:50:32.000000000 -0700
++++ 25/kernel/timer.c  2003-07-19 17:04:53.000000000 -0700
+@@ -160,7 +160,7 @@ static void internal_add_timer(tvec_base
+  */
+ void add_timer(struct timer_list *timer)
+ {
+-      tvec_base_t *base = &get_cpu_var(tvec_bases);
++      tvec_base_t *base = &per_cpu(tvec_bases, get_cpu());
+       unsigned long flags;
+   
+       BUG_ON(timer_pending(timer) || !timer->function);
+@@ -171,7 +171,7 @@ void add_timer(struct timer_list *timer)
+       internal_add_timer(base, timer);
+       timer->base = base;
+       spin_unlock_irqrestore(&base->lock, flags);
+-      put_cpu_var(tvec_bases);
++      put_cpu();
+ }
+ /***
+@@ -234,7 +234,7 @@ int mod_timer(struct timer_list *timer, 
+               return 1;
+       spin_lock_irqsave(&timer->lock, flags);
+-      new_base = &__get_cpu_var(tvec_bases);
++      new_base = &per_cpu(tvec_bases, smp_processor_id());
+ repeat:
+       old_base = timer->base;
+@@ -792,7 +792,7 @@ seqlock_t xtime_lock __cacheline_aligned
+  */
+ static void run_timer_softirq(struct softirq_action *h)
+ {
+-      tvec_base_t *base = &__get_cpu_var(tvec_bases);
++      tvec_base_t *base = &per_cpu(tvec_bases, smp_processor_id());
+       if (time_after_eq(jiffies, base->timer_jiffies))
+               __run_timers(base);
+--- linux-2.6.0-test1/kernel/workqueue.c       2003-07-02 14:53:18.000000000 -0700
++++ 25/kernel/workqueue.c      2003-07-19 17:04:07.000000000 -0700
+@@ -176,7 +176,7 @@ static int worker_thread(void *__startup
+       cwq->thread = current;
+       set_user_nice(current, -10);
+-      set_cpus_allowed(current, 1UL << cpu);
++      set_cpus_allowed(current, cpumask_of_cpu(cpu));
+       complete(&startup->done);
+--- linux-2.6.0-test1/MAINTAINERS      2003-07-13 21:44:34.000000000 -0700
++++ 25/MAINTAINERS     2003-07-19 17:04:55.000000000 -0700
+@@ -657,6 +657,11 @@ L:        emu10k1-devel@lists.sourceforge.net
+ W:    http://sourceforge.net/projects/emu10k1/
+ S:    Maintained
++EPSON 1355 FRAMEBUFFER DRIVER
++P:    Christopher Hoover
++M:    ch@murgatroid.com, ch@hpl.hp.com
++S:    Maintained
++
+ ETHEREXPRESS-16 NETWORK DRIVER
+ P:    Philip Blundell
+ M:    Philip.Blundell@pobox.com
+@@ -973,7 +978,7 @@ M: scott.feldman@intel.com
+ S:    Supported
+ INTERMEZZO FILE SYSTEM
+-P:    Chen Yang
++P:    Cluster File Systems    
+ M:    intermezzo-devel@lists.sf.net
+ W:    http://www.inter-mezzo.org/
+ L:    intermezzo-discuss@lists.sourceforge.net
+@@ -1076,6 +1081,12 @@ L:      kbuild-devel@lists.sourceforge.net
+ W:    http://kbuild.sourceforge.net
+ S:    Maintained 
++KGDB FOR I386 PLATFORM
++P:    George Anzinger
++M:    george@mvista.com
++L:    linux-net@vger.kernel.org
++S:    Supported
++
+ KERNEL NFSD
+ P:    Neil Brown
+ M:    neilb@cse.unsw.edu.au
+--- linux-2.6.0-test1/Makefile 2003-07-13 21:44:34.000000000 -0700
++++ 25/Makefile        2003-07-19 17:03:58.000000000 -0700
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 0
+-EXTRAVERSION = -test1
++EXTRAVERSION = -test1-mm2
+ # *DOCUMENTATION*
+ # To see a list of typical targets execute "make help"
+@@ -781,7 +781,8 @@ rpm:       clean spec
+       tar -cvz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/. ; \
+       rm $(KERNELPATH) ; \
+       cd $(TOPDIR) ; \
+-      $(CONFIG_SHELL) $(srctree)/scripts/mkversion > .version ; \
++      $(CONFIG_SHELL) $(srctree)/scripts/mkversion > .tmp_version ; \
++      mv -f .tmp_version .version; \
+       $(RPM) -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
+       rm $(TOPDIR)/../$(KERNELPATH).tar.gz
+--- linux-2.6.0-test1/mm/bootmem.c     2003-07-10 18:50:32.000000000 -0700
++++ 25/mm/bootmem.c    2003-07-19 17:03:51.000000000 -0700
+@@ -183,7 +183,7 @@ restart_scan:
+       for (i = preferred; i < eidx; i += incr) {
+               unsigned long j;
+               i = find_next_zero_bit(bdata->node_bootmem_map, eidx, i);
+-              i = (i + incr - 1) & -incr;
++              i = ALIGN(i, incr);
+               if (test_bit(i, bdata->node_bootmem_map))
+                       continue;
+               for (j = i + 1; j < i + areasize; ++j) {
+@@ -195,7 +195,7 @@ restart_scan:
+               start = i;
+               goto found;
+       fail_block:
+-              ;
++              i = ALIGN(j, incr);
+       }
+       if (preferred > offset) {
+--- linux-2.6.0-test1/mm/filemap.c     2003-07-13 21:44:35.000000000 -0700
++++ 25/mm/filemap.c    2003-07-19 17:07:03.000000000 -0700
+@@ -265,21 +265,42 @@ static wait_queue_head_t *page_waitqueue
+       return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)];
+ }
+-void wait_on_page_bit(struct page *page, int bit_nr)
++/*
++ * wait for the specified page bit to be cleared
++ * this could be a synchronous wait or could just queue an async
++ * notification callback depending on the wait queue entry parameter
++ *
++ * A NULL wait queue parameter defaults to sync behaviour
++ */
++int wait_on_page_bit_wq(struct page *page, int bit_nr, wait_queue_t *wait)
+ {
+       wait_queue_head_t *waitqueue = page_waitqueue(page);
+-      DEFINE_WAIT(wait);
++      DEFINE_WAIT(local_wait);
++
++      if (!wait)
++              wait = &local_wait; /* default to a sync wait entry */
+       do {
+-              prepare_to_wait(waitqueue, &wait, TASK_UNINTERRUPTIBLE);
++              prepare_to_wait(waitqueue, wait, TASK_UNINTERRUPTIBLE);
+               if (test_bit(bit_nr, &page->flags)) {
+                       sync_page(page);
++                      if (!is_sync_wait(wait)) {
++                              /*
++                               * if we've queued an async wait queue
++                               * callback do not block; just tell the
++                               * caller to return and retry later when
++                               * the callback is notified
++                               */
++                              return -EIOCBRETRY;
++                      }
+                       io_schedule();
+               }
+       } while (test_bit(bit_nr, &page->flags));
+-      finish_wait(waitqueue, &wait);
++      finish_wait(waitqueue, wait);
++
++      return 0;
+ }
+-EXPORT_SYMBOL(wait_on_page_bit);
++EXPORT_SYMBOL(wait_on_page_bit_wq);
+ /**
+  * unlock_page() - unlock a locked page
+@@ -289,7 +310,9 @@ EXPORT_SYMBOL(wait_on_page_bit);
+  * Unlocks the page and wakes up sleepers in ___wait_on_page_locked().
+  * Also wakes sleepers in wait_on_page_writeback() because the wakeup
+  * mechananism between PageLocked pages and PageWriteback pages is shared.
+- * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep.
++ * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep,
++ * or in case the wakeup notifies async wait queue entries, as in the case
++ * of aio, retries would be triggered and may re-queue their callbacks.
+  *
+  * The first mb is necessary to safely close the critical section opened by the
+  * TestSetPageLocked(), the second mb is necessary to enforce ordering between
+@@ -326,26 +349,51 @@ void end_page_writeback(struct page *pag
+ EXPORT_SYMBOL(end_page_writeback);
+ /*
+- * Get a lock on the page, assuming we need to sleep to get it.
++ * Get a lock on the page, assuming we need to either sleep to get it
++ * or to queue an async notification callback to try again when its
++ * available.
++ *
++ * A NULL wait queue parameter defaults to sync behaviour. Otherwise
++ * it specifies the wait queue entry to be used for async notification
++ * or waiting.
+  *
+  * Ugly: running sync_page() in state TASK_UNINTERRUPTIBLE is scary.  If some
+  * random driver's requestfn sets TASK_RUNNING, we could busywait.  However
+  * chances are that on the second loop, the block layer's plug list is empty,
+  * so sync_page() will then return in state TASK_UNINTERRUPTIBLE.
+  */
+-void __lock_page(struct page *page)
++int __lock_page_wq(struct page *page, wait_queue_t *wait)
+ {
+       wait_queue_head_t *wqh = page_waitqueue(page);
+-      DEFINE_WAIT(wait);
++      DEFINE_WAIT(local_wait);
++
++      if (!wait)
++              wait = &local_wait;
+       while (TestSetPageLocked(page)) {
+-              prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
++              prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
+               if (PageLocked(page)) {
+                       sync_page(page);
++                      if (!is_sync_wait(wait)) {
++                              /*
++                               * if we've queued an async wait queue
++                               * callback do not block; just tell the
++                               * caller to return and retry later when
++                               * the callback is notified
++                               */
++                              return -EIOCBRETRY;
++                      }
+                       io_schedule();
+               }
+       }
+-      finish_wait(wqh, &wait);
++      finish_wait(wqh, wait);
++      return 0;
++}
++EXPORT_SYMBOL(__lock_page_wq);
++
++void __lock_page(struct page *page)
++{
++      __lock_page_wq(page, NULL);
+ }
+ EXPORT_SYMBOL(__lock_page);
+@@ -395,8 +443,8 @@ struct page *find_trylock_page(struct ad
+  *
+  * Returns zero if the page was not present. find_lock_page() may sleep.
+  */
+-struct page *find_lock_page(struct address_space *mapping,
+-                              unsigned long offset)
++struct page *find_lock_page_wq(struct address_space *mapping,
++                              unsigned long offset, wait_queue_t *wait)
+ {
+       struct page *page;
+@@ -407,7 +455,10 @@ repeat:
+               page_cache_get(page);
+               if (TestSetPageLocked(page)) {
+                       spin_unlock(&mapping->page_lock);
+-                      lock_page(page);
++                      if (-EIOCBRETRY == lock_page_wq(page, wait)) {
++                              page_cache_release(page);
++                              return ERR_PTR(-EIOCBRETRY);
++                      }
+                       spin_lock(&mapping->page_lock);
+                       /* Has the page been truncated while we slept? */
+@@ -422,6 +473,12 @@ repeat:
+       return page;
+ }
++struct page *find_lock_page(struct address_space *mapping,
++                              unsigned long offset)
++{
++      return find_lock_page_wq(mapping, offset, NULL);
++}
++
+ /**
+  * find_or_create_page - locate or add a pagecache page
+  *
+@@ -544,21 +601,39 @@ void do_generic_mapping_read(struct addr
+                            read_actor_t actor)
+ {
+       struct inode *inode = mapping->host;
+-      unsigned long index, offset;
++      unsigned long index, offset, last, end_index;
+       struct page *cached_page;
++      loff_t isize = i_size_read(inode);
+       int error;
+       cached_page = NULL;
+       index = *ppos >> PAGE_CACHE_SHIFT;
+       offset = *ppos & ~PAGE_CACHE_MASK;
++      last = (*ppos + desc->count) >> PAGE_CACHE_SHIFT;
++      end_index = isize >> PAGE_CACHE_SHIFT;
++      if (last > end_index)
++              last = end_index;
++
++      /* Don't repeat the readahead if we are executing aio retries */
++      if (in_aio()) {
++              if (is_retried_kiocb(io_wait_to_kiocb(current->io_wait)))
++                      goto done_readahead;
++      }
++
++      /*
++       * Let the readahead logic know upfront about all
++       * the pages we'll need to satisfy this request
++       */
++      for (; index < last; index++)
++              page_cache_readahead(mapping, ra, filp, index);
++      index = *ppos >> PAGE_CACHE_SHIFT;
++
++done_readahead:
+       for (;;) {
+               struct page *page;
+-              unsigned long end_index, nr, ret;
+-              loff_t isize = i_size_read(inode);
++              unsigned long nr, ret;
+-              end_index = isize >> PAGE_CACHE_SHIFT;
+-                      
+               if (index > end_index)
+                       break;
+               nr = PAGE_CACHE_SIZE;
+@@ -569,7 +644,6 @@ void do_generic_mapping_read(struct addr
+               }
+               cond_resched();
+-              page_cache_readahead(mapping, ra, filp, index);
+               nr = nr - offset;
+ find_page:
+@@ -619,7 +693,12 @@ page_not_up_to_date:
+                       goto page_ok;
+               /* Get exclusive access to the page ... */
+-              lock_page(page);
++
++              if (lock_page_wq(page, current->io_wait)) {
++                      pr_debug("queued lock page \n");
++                      error = -EIOCBRETRY;
++                      goto sync_error;
++              }
+               /* Did it get unhashed before we got the lock? */
+               if (!page->mapping) {
+@@ -641,13 +720,23 @@ readpage:
+               if (!error) {
+                       if (PageUptodate(page))
+                               goto page_ok;
+-                      wait_on_page_locked(page);
++                      if (wait_on_page_locked_wq(page, current->io_wait)) {
++                              pr_debug("queued wait_on_page \n");
++                              error = -EIOCBRETRY;
++                              goto sync_error;
++                      }
++
+                       if (PageUptodate(page))
+                               goto page_ok;
+                       error = -EIO;
+               }
+-              /* UHHUH! A synchronous read error occurred. Report it */
++sync_error:
++              /* We don't have uptodate data in the page yet */
++              /* Could be due to an error or because we need to
++               * retry when we get an async i/o notification.
++               * Report the reason.
++               */
+               desc->error = error;
+               page_cache_release(page);
+               break;
+@@ -1385,7 +1474,9 @@ __grab_cache_page(struct address_space *
+       int err;
+       struct page *page;
+ repeat:
+-      page = find_lock_page(mapping, index);
++      page = find_lock_page_wq(mapping, index, current->io_wait);
++      if (IS_ERR(page))
++              return page;
+       if (!page) {
+               if (!*cached_page) {
+                       *cached_page = page_cache_alloc(mapping);
+@@ -1672,7 +1763,6 @@ generic_file_aio_write_nolock(struct kio
+       if (err)
+               goto out;
+-
+       if (count == 0)
+               goto out;
+@@ -1726,6 +1816,10 @@ generic_file_aio_write_nolock(struct kio
+               fault_in_pages_readable(buf, bytes);
+               page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
++              if (IS_ERR(page)) {
++                      status = PTR_ERR(page);
++                      break;
++              }
+               if (!page) {
+                       status = -ENOMEM;
+                       break;
+@@ -1776,7 +1870,11 @@ generic_file_aio_write_nolock(struct kio
+               page_cache_release(page);
+               if (status < 0)
+                       break;
+-              balance_dirty_pages_ratelimited(mapping);
++              status = balance_dirty_pages_ratelimited(mapping);
++              if (status < 0) {
++                      pr_debug("async balance_dirty_pages\n");
++                      break;
++              }
+               cond_resched();
+       } while (count);
+       *ppos = pos;
+@@ -1787,12 +1885,14 @@ generic_file_aio_write_nolock(struct kio
+       /*
+        * For now, when the user asks for O_SYNC, we'll actually give O_DSYNC
+        */
+-      if (status >= 0) {
+-              if ((file->f_flags & O_SYNC) || IS_SYNC(inode))
+-                      status = generic_osync_inode(inode,
+-                                      OSYNC_METADATA|OSYNC_DATA);
++      if (likely(status >= 0)) {
++              if (unlikely((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++                      if (!a_ops->writepage)
++                              status = generic_osync_inode(inode,
++                                              OSYNC_METADATA|OSYNC_DATA);
++              }
+       }
+-      
++
+ out_status:   
+       err = written ? written : status;
+ out:
+@@ -1819,18 +1919,43 @@ ssize_t generic_file_aio_write(struct ki
+                              size_t count, loff_t pos)
+ {
+       struct file *file = iocb->ki_filp;
+-      struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
+-      ssize_t err;
+-      struct iovec local_iov = { .iov_base = (void __user *)buf, .iov_len = count };
++      struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
++      struct inode *inode = mapping->host;
++      ssize_t ret;
++      struct iovec local_iov = { .iov_base = (void __user *)buf,
++                                      .iov_len = count };
+       BUG_ON(iocb->ki_pos != pos);
++      if (!buf && !is_sync_kiocb(iocb)) {
++              /* nothing to transfer, may just need to sync data */
++              ret = count;
++              goto osync;
++      }
++
+       down(&inode->i_sem);
+-      err = generic_file_aio_write_nolock(iocb, &local_iov, 1, 
++      ret = generic_file_aio_write_nolock(iocb, &local_iov, 1,
+                                               &iocb->ki_pos);
+       up(&inode->i_sem);
+-      return err;
++      /*
++       * Avoid doing a sync in parts for aio - its more efficient to
++       * call in again after all the data has been copied
++       */
++      if (!is_sync_kiocb(iocb))
++              return ret;
++
++osync:
++      if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++              ssize_t err;
++
++              err = sync_page_range(inode, mapping, pos, ret);
++              if (err < 0)
++                      ret = err;
++              else
++                      iocb->ki_pos = pos + err;
++      }
++      return ret;
+ }
+ EXPORT_SYMBOL(generic_file_aio_write);
+ EXPORT_SYMBOL(generic_file_aio_write_nolock);
+@@ -1838,15 +1963,24 @@ EXPORT_SYMBOL(generic_file_aio_write_nol
+ ssize_t generic_file_write(struct file *file, const char __user *buf,
+                          size_t count, loff_t *ppos)
+ {
+-      struct inode    *inode = file->f_dentry->d_inode->i_mapping->host;
+-      ssize_t         err;
+-      struct iovec local_iov = { .iov_base = (void __user *)buf, .iov_len = count };
++      struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
++      struct inode *inode = mapping->host;
++      ssize_t ret;
++      struct iovec local_iov = { .iov_base = (void __user *)buf,
++                                      .iov_len = count };
+       down(&inode->i_sem);
+-      err = generic_file_write_nolock(file, &local_iov, 1, ppos);
++      ret = generic_file_write_nolock(file, &local_iov, 1, ppos);
+       up(&inode->i_sem);
+-      return err;
++      if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++              ssize_t err;
++
++              err = sync_page_range(inode, mapping, *ppos - ret, ret);
++              if (err < 0)
++                      ret = err;
++      }
++      return ret;
+ }
+ ssize_t generic_file_readv(struct file *filp, const struct iovec *iov,
+@@ -1863,7 +1997,7 @@ ssize_t generic_file_readv(struct file *
+ }
+ ssize_t generic_file_writev(struct file *file, const struct iovec *iov,
+-                      unsigned long nr_segs, loff_t * ppos) 
++                      unsigned long nr_segs, loff_t *ppos)
+ {
+       struct inode *inode = file->f_dentry->d_inode;
+       ssize_t ret;
+@@ -1871,6 +2005,15 @@ ssize_t generic_file_writev(struct file 
+       down(&inode->i_sem);
+       ret = generic_file_write_nolock(file, iov, nr_segs, ppos);
+       up(&inode->i_sem);
++
++      if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
++              ssize_t err;
++
++              err = sync_page_range(inode, inode->i_mapping,
++                                      *ppos - ret, ret);
++              if (err < 0)
++                      ret = err;
++      }
+       return ret;
+ }
+--- linux-2.6.0-test1/mm/fremap.c      2003-06-14 12:17:56.000000000 -0700
++++ 25/mm/fremap.c     2003-07-19 17:07:16.000000000 -0700
+@@ -67,11 +67,11 @@ int install_page(struct mm_struct *mm, s
+       pgd = pgd_offset(mm, addr);
+       spin_lock(&mm->page_table_lock);
+-      pmd = pmd_alloc(mm, pgd, addr);
++      pmd = pmd_alloc_map(mm, pgd, addr);
+       if (!pmd)
+               goto err_unlock;
+-      pte = pte_alloc_map(mm, pmd, addr);
++      pte = pte_alloc_map(mm, pgd, &pmd, addr);
+       if (!pte)
+               goto err_unlock;
+@@ -82,6 +82,7 @@ int install_page(struct mm_struct *mm, s
+       set_pte(pte, mk_pte(page, prot));
+       pte_chain = page_add_rmap(page, pte, pte_chain);
+       pte_unmap(pte);
++      pmd_unmap(pmd);
+       if (flush)
+               flush_tlb_page(vma, addr);
+       update_mmu_cache(vma, addr, *pte);
+--- linux-2.6.0-test1/mm/memory.c      2003-07-13 21:44:35.000000000 -0700
++++ 25/mm/memory.c     2003-07-19 17:07:16.000000000 -0700
+@@ -104,6 +104,7 @@ static inline void free_one_pgd(struct m
+ {
+       int j;
+       pmd_t * pmd;
++      struct page *page;
+       if (pgd_none(*dir))
+               return;
+@@ -112,11 +113,13 @@ static inline void free_one_pgd(struct m
+               pgd_clear(dir);
+               return;
+       }
+-      pmd = pmd_offset(dir, 0);
++      page = pgd_page(*dir);
++      pmd = pmd_offset_map(dir, 0);
+       pgd_clear(dir);
+       for (j = 0; j < PTRS_PER_PMD ; j++)
+               free_one_pmd(tlb, pmd+j);
+-      pmd_free_tlb(tlb, pmd);
++      pmd_unmap(pmd);
++      pmd_free_tlb(tlb, page);
+ }
+ /*
+@@ -136,30 +139,38 @@ void clear_page_tables(struct mmu_gather
+       } while (--nr);
+ }
+-pte_t * pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
++/*
++ * error return happens with pmd unmapped
++ */
++pte_t *pte_alloc_map(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmd, unsigned long addr)
+ {
+-      if (!pmd_present(*pmd)) {
++      if (!pmd_present(**pmd)) {
+               struct page *new;
++              pmd_unmap(*pmd);
+               spin_unlock(&mm->page_table_lock);
+-              new = pte_alloc_one(mm, address);
++              new = pte_alloc_one(mm, addr);
+               spin_lock(&mm->page_table_lock);
+-              if (!new)
++              if (!new) {
++                      *pmd = NULL;
+                       return NULL;
++              }
++
++              *pmd = pmd_offset_map(pgd, addr);
+               /*
+                * Because we dropped the lock, we should re-check the
+                * entry, as somebody else could have populated it..
+                */
+-              if (pmd_present(*pmd)) {
++              if (pmd_present(**pmd)) {
+                       pte_free(new);
+                       goto out;
+               }
+-              pgtable_add_rmap(new, mm, address);
+-              pmd_populate(mm, pmd, new);
++              pgtable_add_rmap(new, mm, addr);
++              pmd_populate(mm, *pmd, new);
+       }
+ out:
+-      return pte_offset_map(pmd, address);
++      return pte_offset_map(*pmd, addr);
+ }
+ pte_t * pte_alloc_kernel(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
+@@ -199,7 +210,7 @@ out:
+  *         variable count and make things faster. -jj
+  *
+  * dst->page_table_lock is held on entry and exit,
+- * but may be dropped within pmd_alloc() and pte_alloc_map().
++ * but may be dropped within pmd_alloc_map() and pte_alloc_map().
+  */
+ int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
+                       struct vm_area_struct *vma)
+@@ -244,11 +255,10 @@ skip_copy_pmd_range:     address = (address 
+                       continue;
+               }
+-              src_pmd = pmd_offset(src_pgd, address);
+-              dst_pmd = pmd_alloc(dst, dst_pgd, address);
++              dst_pmd = pmd_alloc_map(dst, dst_pgd, address);
+               if (!dst_pmd)
+                       goto nomem;
+-
++              src_pmd = pmd_offset_map_nested(src_pgd, address);
+               do {
+                       pte_t * src_pte, * dst_pte;
+               
+@@ -261,15 +271,20 @@ skip_copy_pmd_range:     address = (address 
+                               pmd_clear(src_pmd);
+ skip_copy_pte_range:
+                               address = (address + PMD_SIZE) & PMD_MASK;
+-                              if (address >= end)
++                              if (address >= end) {
++                                      pmd_unmap(dst_pmd);
++                                      pmd_unmap_nested(src_pmd);
+                                       goto out;
++                              }
+                               goto cont_copy_pmd_range;
+                       }
+-                      dst_pte = pte_alloc_map(dst, dst_pmd, address);
++                      pmd_unmap_nested(src_pmd);
++                      dst_pte = pte_alloc_map(dst, dst_pgd, &dst_pmd, address);
+                       if (!dst_pte)
+                               goto nomem;
+                       spin_lock(&src->page_table_lock);       
++                      src_pmd = pmd_offset_map_nested(src_pgd, address);
+                       src_pte = pte_offset_map_nested(src_pmd, address);
+                       do {
+                               pte_t pte = *src_pte;
+@@ -336,6 +351,8 @@ skip_copy_pte_range:
+                                */
+                               pte_unmap_nested(src_pte);
+                               pte_unmap(dst_pte);
++                              pmd_unmap_nested(src_pmd);
++                              pmd_unmap(dst_pmd);
+                               spin_unlock(&src->page_table_lock);     
+                               spin_unlock(&dst->page_table_lock);     
+                               pte_chain = pte_chain_alloc(GFP_KERNEL);
+@@ -343,12 +360,16 @@ skip_copy_pte_range:
+                               if (!pte_chain)
+                                       goto nomem;
+                               spin_lock(&src->page_table_lock);
++                              dst_pmd = pmd_offset_map(dst_pgd, address);
++                              src_pmd = pmd_offset_map_nested(src_pgd, address);
+                               dst_pte = pte_offset_map(dst_pmd, address);
+                               src_pte = pte_offset_map_nested(src_pmd,
+                                                               address);
+ cont_copy_pte_range_noset:
+                               address += PAGE_SIZE;
+                               if (address >= end) {
++                                      pmd_unmap(dst_pmd);
++                                      pmd_unmap_nested(src_pmd);
+                                       pte_unmap_nested(src_pte);
+                                       pte_unmap(dst_pte);
+                                       goto out_unlock;
+@@ -364,6 +385,8 @@ cont_copy_pmd_range:
+                       src_pmd++;
+                       dst_pmd++;
+               } while ((unsigned long)src_pmd & PMD_TABLE_MASK);
++              pmd_unmap_nested(src_pmd-1);
++              pmd_unmap(dst_pmd-1);
+       }
+ out_unlock:
+       spin_unlock(&src->page_table_lock);
+@@ -439,7 +462,7 @@ zap_pmd_range(struct mmu_gather *tlb, pg
+               pgd_clear(dir);
+               return;
+       }
+-      pmd = pmd_offset(dir, address);
++      pmd = pmd_offset_map(dir, address);
+       end = address + size;
+       if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
+               end = ((address + PGDIR_SIZE) & PGDIR_MASK);
+@@ -448,6 +471,7 @@ zap_pmd_range(struct mmu_gather *tlb, pg
+               address = (address + PMD_SIZE) & PMD_MASK; 
+               pmd++;
+       } while (address < end);
++      pmd_unmap(pmd - 1);
+ }
+ void unmap_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
+@@ -629,20 +653,27 @@ follow_page(struct mm_struct *mm, unsign
+       if (pgd_none(*pgd) || pgd_bad(*pgd))
+               goto out;
+-      pmd = pmd_offset(pgd, address);
++      pmd = pmd_offset_map(pgd, address);
+       if (pmd_none(*pmd))
+-              goto out;
+-      if (pmd_huge(*pmd))
+-              return follow_huge_pmd(mm, address, pmd, write);
+-      if (pmd_bad(*pmd))
+-              goto out;
++              goto out_unmap;
++      if (pmd_bad(*pmd)) {
++              pmd_ERROR(*pmd);
++              pmd_clear(pmd);
++              goto out_unmap;
++      }
++      if (pmd_huge(*pmd)) {
++              struct page *page = follow_huge_pmd(mm, address, pmd, write);
++              pmd_unmap(pmd);
++              return page;
++      }
+       ptep = pte_offset_map(pmd, address);
+       if (!ptep)
+-              goto out;
++              goto out_unmap;
+       pte = *ptep;
+       pte_unmap(ptep);
++      pmd_unmap(pmd);
+       if (pte_present(pte)) {
+               if (!write || (pte_write(pte) && pte_dirty(pte))) {
+                       pfn = pte_pfn(pte);
+@@ -653,6 +684,9 @@ follow_page(struct mm_struct *mm, unsign
+ out:
+       return NULL;
++out_unmap:
++      pmd_unmap(pmd);
++      goto out;
+ }
+ /* 
+@@ -711,7 +745,7 @@ int get_user_pages(struct task_struct *t
+                       pgd = pgd_offset_k(pg);
+                       if (!pgd)
+                               return i ? : -EFAULT;
+-                      pmd = pmd_offset(pgd, pg);
++                      pmd = pmd_offset_kernel(pgd, pg);
+                       if (!pmd)
+                               return i ? : -EFAULT;
+                       pte = pte_offset_kernel(pmd, pg);
+@@ -803,8 +837,8 @@ static void zeromap_pte_range(pte_t * pt
+       } while (address && (address < end));
+ }
+-static inline int zeromap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address,
+-                                    unsigned long size, pgprot_t prot)
++static inline int zeromap_pmd_range(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmd,
++                      unsigned long address, unsigned long size, pgprot_t prot)
+ {
+       unsigned long end;
+@@ -813,13 +847,13 @@ static inline int zeromap_pmd_range(stru
+       if (end > PGDIR_SIZE)
+               end = PGDIR_SIZE;
+       do {
+-              pte_t * pte = pte_alloc_map(mm, pmd, address);
++              pte_t *pte = pte_alloc_map(mm, pgd, pmd, address);
+               if (!pte)
+                       return -ENOMEM;
+               zeromap_pte_range(pte, address, end - address, prot);
+               pte_unmap(pte);
+               address = (address + PMD_SIZE) & PMD_MASK;
+-              pmd++;
++              (*pmd)++;
+       } while (address && (address < end));
+       return 0;
+ }
+@@ -839,13 +873,14 @@ int zeromap_page_range(struct vm_area_st
+       spin_lock(&mm->page_table_lock);
+       do {
+-              pmd_t *pmd = pmd_alloc(mm, dir, address);
++              pmd_t *pmd = pmd_alloc_map(mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+-              error = zeromap_pmd_range(mm, pmd, address, end - address, prot);
++              error = zeromap_pmd_range(mm, dir, &pmd, address, end - address, prot);
+               if (error)
+                       break;
++              pmd_unmap(pmd - 1);
+               address = (address + PGDIR_SIZE) & PGDIR_MASK;
+               dir++;
+       } while (address && (address < end));
+@@ -880,8 +915,9 @@ static inline void remap_pte_range(pte_t
+       } while (address && (address < end));
+ }
+-static inline int remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address, unsigned long size,
+-      unsigned long phys_addr, pgprot_t prot)
++static inline int remap_pmd_range(struct mm_struct *mm, pgd_t *pgd, pmd_t **pmd,
++                              unsigned long address, unsigned long size,
++                              unsigned long phys_addr, pgprot_t prot)
+ {
+       unsigned long base, end;
+@@ -892,13 +928,13 @@ static inline int remap_pmd_range(struct
+               end = PGDIR_SIZE;
+       phys_addr -= address;
+       do {
+-              pte_t * pte = pte_alloc_map(mm, pmd, base + address);
++              pte_t *pte = pte_alloc_map(mm, pgd, pmd, base + address);
+               if (!pte)
+                       return -ENOMEM;
+               remap_pte_range(pte, base + address, end - address, address + phys_addr, prot);
+               pte_unmap(pte);
+               address = (address + PMD_SIZE) & PMD_MASK;
+-              pmd++;
++              (*pmd)++;
+       } while (address && (address < end));
+       return 0;
+ }
+@@ -920,13 +956,14 @@ int remap_page_range(struct vm_area_stru
+       spin_lock(&mm->page_table_lock);
+       do {
+-              pmd_t *pmd = pmd_alloc(mm, dir, from);
++              pmd_t *pmd = pmd_alloc_map(mm, dir, from);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+-              error = remap_pmd_range(mm, pmd, from, end - from, phys_addr + from, prot);
++              error = remap_pmd_range(mm, dir, &pmd, from, end - from, phys_addr + from, prot);
+               if (error)
+                       break;
++              pmd_unmap(pmd - 1);
+               from = (from + PGDIR_SIZE) & PGDIR_MASK;
+               dir++;
+       } while (from && (from < end));
+@@ -996,6 +1033,7 @@ static int do_wp_page(struct mm_struct *
+                * data, but for the moment just pretend this is OOM.
+                */
+               pte_unmap(page_table);
++              pmd_unmap(pmd);
+               printk(KERN_ERR "do_wp_page: bogus page at address %08lx\n",
+                               address);
+               goto oom;
+@@ -1010,11 +1048,13 @@ static int do_wp_page(struct mm_struct *
+                       establish_pte(vma, address, page_table,
+                               pte_mkyoung(pte_mkdirty(pte_mkwrite(pte))));
+                       pte_unmap(page_table);
++                      pmd_unmap(pmd);
+                       ret = VM_FAULT_MINOR;
+                       goto out;
+               }
+       }
+       pte_unmap(page_table);
++      pmd_unmap(pmd);
+       /*
+        * Ok, we need to copy. Oh, well..
+@@ -1034,6 +1074,7 @@ static int do_wp_page(struct mm_struct *
+        * Re-check the pte - we dropped the lock
+        */
+       spin_lock(&mm->page_table_lock);
++      pmd = pmd_offset_map(pgd_offset(mm, address), address);
+       page_table = pte_offset_map(pmd, address);
+       if (pte_same(*page_table, pte)) {
+               if (PageReserved(old_page))
+@@ -1047,6 +1088,7 @@ static int do_wp_page(struct mm_struct *
+               new_page = old_page;
+       }
+       pte_unmap(page_table);
++      pmd_unmap(pmd);
+       page_cache_release(new_page);
+       page_cache_release(old_page);
+       ret = VM_FAULT_MINOR;
+@@ -1062,35 +1104,77 @@ out:
+       return ret;
+ }
+-static void vmtruncate_list(struct list_head *head, unsigned long pgoff)
++/*
++ * Helper function for invalidate_mmap_range().
++ * Both hba and hlen are page numbers in PAGE_SIZE units.
++ * An hlen of zero blows away the entire portion file after hba.
++ */
++static void
++invalidate_mmap_range_list(struct list_head *head,
++                         unsigned long const hba,
++                         unsigned long const hlen)
+ {
+-      unsigned long start, end, len, diff;
+-      struct vm_area_struct *vma;
+       struct list_head *curr;
+-
++      unsigned long hea;      /* last page of hole. */
++      unsigned long vba;
++      unsigned long vea;      /* last page of corresponding uva hole. */
++      struct vm_area_struct *vp;
++      unsigned long zba;
++      unsigned long zea;
++
++      hea = hba + hlen - 1;   /* avoid overflow. */
++      if (hea < hba)
++              hea = ULONG_MAX;
+       list_for_each(curr, head) {
+-              vma = list_entry(curr, struct vm_area_struct, shared);
+-              start = vma->vm_start;
+-              end = vma->vm_end;
+-              len = end - start;
+-
+-              /* mapping wholly truncated? */
+-              if (vma->vm_pgoff >= pgoff) {
+-                      zap_page_range(vma, start, len);
+-                      continue;
+-              }
++              vp = list_entry(curr, struct vm_area_struct, shared);
++              vba = vp->vm_pgoff;
++              vea = vba + ((vp->vm_end - vp->vm_start) >> PAGE_SHIFT) - 1;
++              if (hea < vba || vea < hba)
++                      continue;       /* Mapping disjoint from hole. */
++              zba = (hba <= vba) ? vba : hba;
++              zea = (vea <= hea) ? vea : hea;
++              zap_page_range(vp,
++                             ((zba - vba) << PAGE_SHIFT) + vp->vm_start,
++                             (zea - zba + 1) << PAGE_SHIFT);
++      }
++}
+-              /* mapping wholly unaffected? */
+-              len = len >> PAGE_SHIFT;
+-              diff = pgoff - vma->vm_pgoff;
+-              if (diff >= len)
+-                      continue;
++/**
++ * invalidate_mmap_range - invalidate the portion of all mmaps
++ * in the specified address_space corresponding to the specified
++ * page range in the underlying file.
++ * @address_space: the address space containing mmaps to be invalidated.
++ * @holebegin: byte in first page to invalidate, relative to the start of
++ * the underlying file.  This will be rounded down to a PAGE_SIZE
++ * boundary.  Note that this is different from vmtruncate(), which
++ * must keep the partial page.  In contrast, we must get rid of
++ * partial pages.
++ * @holelen: size of prospective hole in bytes.  This will be rounded
++ * up to a PAGE_SIZE boundary.  A holelen of zero truncates to the
++ * end of the file.
++ */
++void invalidate_mmap_range(struct address_space *mapping,
++                    loff_t const holebegin, loff_t const holelen)
++{
++      unsigned long hba = holebegin >> PAGE_SHIFT;
++      unsigned long hlen = (holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
++
++      /* Check for overflow. */
++      if (sizeof(holelen) > sizeof(hlen)) {
++              long long holeend =
++                      (holebegin + holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
+-              /* Ok, partially affected.. */
+-              start += diff << PAGE_SHIFT;
+-              len = (len - diff) << PAGE_SHIFT;
+-              zap_page_range(vma, start, len);
++              if (holeend & ~(long long)ULONG_MAX)
++                      hlen = ULONG_MAX - hba + 1;
+       }
++      down(&mapping->i_shared_sem);
++      /* Protect against page fault */
++      atomic_inc(&mapping->truncate_count);
++      if (unlikely(!list_empty(&mapping->i_mmap)))
++              invalidate_mmap_range_list(&mapping->i_mmap, hba, hlen);
++      if (unlikely(!list_empty(&mapping->i_mmap_shared)))
++              invalidate_mmap_range_list(&mapping->i_mmap_shared, hba, hlen);
++      up(&mapping->i_shared_sem);
+ }
+ /*
+@@ -1103,20 +1187,13 @@ static void vmtruncate_list(struct list_
+  */
+ int vmtruncate(struct inode * inode, loff_t offset)
+ {
+-      unsigned long pgoff;
+       struct address_space *mapping = inode->i_mapping;
+       unsigned long limit;
+       if (inode->i_size < offset)
+               goto do_expand;
+       i_size_write(inode, offset);
+-      pgoff = (offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
+-      down(&mapping->i_shared_sem);
+-      if (unlikely(!list_empty(&mapping->i_mmap)))
+-              vmtruncate_list(&mapping->i_mmap, pgoff);
+-      if (unlikely(!list_empty(&mapping->i_mmap_shared)))
+-              vmtruncate_list(&mapping->i_mmap_shared, pgoff);
+-      up(&mapping->i_shared_sem);
++      invalidate_mmap_range(mapping, offset + PAGE_SIZE - 1, 0);
+       truncate_inode_pages(mapping, offset);
+       goto out_truncate;
+@@ -1180,6 +1257,7 @@ static int do_swap_page(struct mm_struct
+       struct pte_chain *pte_chain = NULL;
+       pte_unmap(page_table);
++      pmd_unmap(pmd);
+       spin_unlock(&mm->page_table_lock);
+       page = lookup_swap_cache(entry);
+       if (!page) {
+@@ -1191,12 +1269,14 @@ static int do_swap_page(struct mm_struct
+                        * we released the page table lock.
+                        */
+                       spin_lock(&mm->page_table_lock);
++                      pmd = pmd_offset_map(pgd_offset(mm, address), address);
+                       page_table = pte_offset_map(pmd, address);
+                       if (pte_same(*page_table, orig_pte))
+                               ret = VM_FAULT_OOM;
+                       else
+                               ret = VM_FAULT_MINOR;
+                       pte_unmap(page_table);
++                      pmd_unmap(pmd);
+                       spin_unlock(&mm->page_table_lock);
+                       goto out;
+               }
+@@ -1219,9 +1299,11 @@ static int do_swap_page(struct mm_struct
+        * released the page table lock.
+        */
+       spin_lock(&mm->page_table_lock);
++      pmd = pmd_offset_map(pgd_offset(mm, address), address);
+       page_table = pte_offset_map(pmd, address);
+       if (!pte_same(*page_table, orig_pte)) {
+               pte_unmap(page_table);
++              pmd_unmap(pmd);
+               spin_unlock(&mm->page_table_lock);
+               unlock_page(page);
+               page_cache_release(page);
+@@ -1247,6 +1329,7 @@ static int do_swap_page(struct mm_struct
+       /* No need to invalidate - it was non-present before */
+       update_mmu_cache(vma, address, pte);
++      pmd_unmap(pmd);
+       pte_unmap(page_table);
+       spin_unlock(&mm->page_table_lock);
+ out:
+@@ -1272,11 +1355,13 @@ do_anonymous_page(struct mm_struct *mm, 
+       pte_chain = pte_chain_alloc(GFP_ATOMIC);
+       if (!pte_chain) {
+               pte_unmap(page_table);
++              pmd_unmap(pmd);
+               spin_unlock(&mm->page_table_lock);
+               pte_chain = pte_chain_alloc(GFP_KERNEL);
+               if (!pte_chain)
+                       goto no_mem;
+               spin_lock(&mm->page_table_lock);
++              pmd = pmd_offset_map(pgd_offset(mm, addr), addr);
+               page_table = pte_offset_map(pmd, addr);
+       }
+               
+@@ -1287,6 +1372,7 @@ do_anonymous_page(struct mm_struct *mm, 
+       if (write_access) {
+               /* Allocate our own private page. */
+               pte_unmap(page_table);
++              pmd_unmap(pmd);
+               spin_unlock(&mm->page_table_lock);
+               page = alloc_page(GFP_HIGHUSER);
+@@ -1295,9 +1381,11 @@ do_anonymous_page(struct mm_struct *mm, 
+               clear_user_highpage(page, addr);
+               spin_lock(&mm->page_table_lock);
++              pmd = pmd_offset_map(pgd_offset(mm, addr), addr);
+               page_table = pte_offset_map(pmd, addr);
+               if (!pte_none(*page_table)) {
++                      pmd_unmap(pmd);
+                       pte_unmap(page_table);
+                       page_cache_release(page);
+                       spin_unlock(&mm->page_table_lock);
+@@ -1313,6 +1401,7 @@ do_anonymous_page(struct mm_struct *mm, 
+       set_pte(page_table, entry);
+       /* ignores ZERO_PAGE */
+       pte_chain = page_add_rmap(page, page_table, pte_chain);
++      pmd_unmap(pmd);
+       pte_unmap(page_table);
+       /* No need to invalidate - it was non-present before */
+@@ -1345,16 +1434,22 @@ do_no_page(struct mm_struct *mm, struct 
+       unsigned long address, int write_access, pte_t *page_table, pmd_t *pmd)
+ {
+       struct page * new_page;
++      struct address_space *mapping;
+       pte_t entry;
+       struct pte_chain *pte_chain;
++      int sequence;
+       int ret;
+       if (!vma->vm_ops || !vma->vm_ops->nopage)
+               return do_anonymous_page(mm, vma, page_table,
+                                       pmd, write_access, address);
+       pte_unmap(page_table);
+-      spin_unlock(&mm->page_table_lock);
++      pmd_unmap(pmd);
++      mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
++      sequence = atomic_read(&mapping->truncate_count);
++      spin_unlock(&mm->page_table_lock);
++retry:
+       new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
+       /* no page was available -- either SIGBUS or OOM */
+@@ -1383,6 +1478,18 @@ do_no_page(struct mm_struct *mm, struct 
+       }
+       spin_lock(&mm->page_table_lock);
++      /*
++       * For a file-backed vma, someone could have truncated or otherwise
++       * invalidated this page.  If invalidate_mmap_range got called,
++       * retry getting the page.
++       */
++      if (unlikely(sequence != atomic_read(&mapping->truncate_count))) {
++              sequence = atomic_read(&mapping->truncate_count);
++              spin_unlock(&mm->page_table_lock);
++              page_cache_release(new_page);
++              goto retry;
++      }
++      pmd = pmd_offset_map(pgd_offset(mm, address), address);
+       page_table = pte_offset_map(pmd, address);
+       /*
+@@ -1405,9 +1512,11 @@ do_no_page(struct mm_struct *mm, struct 
+               set_pte(page_table, entry);
+               pte_chain = page_add_rmap(new_page, page_table, pte_chain);
+               pte_unmap(page_table);
++              pmd_unmap(pmd);
+       } else {
+               /* One of our sibling threads was faster, back out. */
+               pte_unmap(page_table);
++              pmd_unmap(pmd);
+               page_cache_release(new_page);
+               spin_unlock(&mm->page_table_lock);
+               ret = VM_FAULT_MINOR;
+@@ -1451,6 +1560,7 @@ static int do_file_page(struct mm_struct
+       pgoff = pte_to_pgoff(*pte);
+       pte_unmap(pte);
++      pmd_unmap(pmd);
+       spin_unlock(&mm->page_table_lock);
+       err = vma->vm_ops->populate(vma, address & PAGE_MASK, PAGE_SIZE, vma->vm_page_prot, pgoff, 0);
+@@ -1511,6 +1621,7 @@ static inline int handle_pte_fault(struc
+       entry = pte_mkyoung(entry);
+       establish_pte(vma, address, pte, entry);
+       pte_unmap(pte);
++      pmd_unmap(pmd);
+       spin_unlock(&mm->page_table_lock);
+       return VM_FAULT_MINOR;
+ }
+@@ -1537,10 +1648,10 @@ int handle_mm_fault(struct mm_struct *mm
+        * and the SMP-safe atomic PTE updates.
+        */
+       spin_lock(&mm->page_table_lock);
+-      pmd = pmd_alloc(mm, pgd, address);
++      pmd = pmd_alloc_map(mm, pgd, address);
+       if (pmd) {
+-              pte_t * pte = pte_alloc_map(mm, pmd, address);
++              pte_t *pte = pte_alloc_map(mm, pgd, &pmd, address);
+               if (pte)
+                       return handle_pte_fault(mm, vma, address, write_access, pte, pmd);
+       }
+@@ -1559,10 +1670,33 @@ int handle_mm_fault(struct mm_struct *mm
+  */
+ pmd_t *__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
+ {
++      struct page *page;
++
++      spin_unlock(&mm->page_table_lock);
++      page = pmd_alloc_one(mm, address);
++      spin_lock(&mm->page_table_lock);
++      if (!page)
++              return NULL;
++
++      /*
++       * Because we dropped the lock, we should re-check the
++       * entry, as somebody else could have populated it..
++       */
++      if (pgd_present(*pgd)) {
++              pmd_free(page);
++              goto out;
++      }
++      pgd_populate(mm, pgd, page);
++out:
++      return pmd_offset_map(pgd, address);
++}
++
++pmd_t *__pmd_alloc_kernel(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
++{
+       pmd_t *new;
+       spin_unlock(&mm->page_table_lock);
+-      new = pmd_alloc_one(mm, address);
++      new = pmd_alloc_one_kernel(mm, address);
+       spin_lock(&mm->page_table_lock);
+       if (!new)
+               return NULL;
+@@ -1572,12 +1706,12 @@ pmd_t *__pmd_alloc(struct mm_struct *mm,
+        * entry, as somebody else could have populated it..
+        */
+       if (pgd_present(*pgd)) {
+-              pmd_free(new);
++              pmd_free(virt_to_page(new));
+               goto out;
+       }
+-      pgd_populate(mm, pgd, new);
++      pgd_populate(mm, pgd, virt_to_page(new));
+ out:
+-      return pmd_offset(pgd, address);
++      return pmd_offset_kernel(pgd, address);
+ }
+ int make_pages_present(unsigned long addr, unsigned long end)
+@@ -1609,7 +1743,7 @@ struct page * vmalloc_to_page(void * vma
+       pte_t *ptep, pte;
+   
+       if (!pgd_none(*pgd)) {
+-              pmd = pmd_offset(pgd, addr);
++              pmd = pmd_offset_map(pgd, addr);
+               if (!pmd_none(*pmd)) {
+                       preempt_disable();
+                       ptep = pte_offset_map(pmd, addr);
+@@ -1619,6 +1753,7 @@ struct page * vmalloc_to_page(void * vma
+                       pte_unmap(ptep);
+                       preempt_enable();
+               }
++              pmd_unmap(pmd);
+       }
+       return page;
+ }
+--- linux-2.6.0-test1/mm/mprotect.c    2003-07-10 18:50:32.000000000 -0700
++++ 25/mm/mprotect.c   2003-07-19 17:07:16.000000000 -0700
+@@ -73,7 +73,7 @@ change_pmd_range(pgd_t *pgd, unsigned lo
+               pgd_clear(pgd);
+               return;
+       }
+-      pmd = pmd_offset(pgd, address);
++      pmd = pmd_offset_map(pgd, address);
+       address &= ~PGDIR_MASK;
+       end = address + size;
+       if (end > PGDIR_SIZE)
+@@ -83,6 +83,7 @@ change_pmd_range(pgd_t *pgd, unsigned lo
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address && (address < end));
++      pmd_unmap(pmd - 1);
+ }
+ static void
+--- linux-2.6.0-test1/mm/mremap.c      2003-07-10 18:50:32.000000000 -0700
++++ 25/mm/mremap.c     2003-07-19 17:07:16.000000000 -0700
+@@ -38,7 +38,7 @@ static pte_t *get_one_pte_map_nested(str
+               goto end;
+       }
+-      pmd = pmd_offset(pgd, addr);
++      pmd = pmd_offset_map_nested(pgd, addr);
+       if (pmd_none(*pmd))
+               goto end;
+       if (pmd_bad(*pmd)) {
+@@ -53,6 +53,7 @@ static pte_t *get_one_pte_map_nested(str
+               pte = NULL;
+       }
+ end:
++      pmd_unmap_nested(pmd);
+       return pte;
+ }
+@@ -61,12 +62,15 @@ static inline int page_table_present(str
+ {
+       pgd_t *pgd;
+       pmd_t *pmd;
++      int ret;
+       pgd = pgd_offset(mm, addr);
+       if (pgd_none(*pgd))
+               return 0;
+-      pmd = pmd_offset(pgd, addr);
+-      return pmd_present(*pmd);
++      pmd = pmd_offset_map(pgd, addr);
++      ret = pmd_present(*pmd);
++      pmd_unmap(pmd);
++      return ret != 0;
+ }
+ #else
+ #define page_table_present(mm, addr)  (1)
+@@ -74,12 +78,15 @@ static inline int page_table_present(str
+ static inline pte_t *alloc_one_pte_map(struct mm_struct *mm, unsigned long addr)
+ {
++      pgd_t *pgd;
+       pmd_t *pmd;
+       pte_t *pte = NULL;
+-      pmd = pmd_alloc(mm, pgd_offset(mm, addr), addr);
++      pgd = pgd_offset(mm, addr);
++      pmd = pmd_alloc_map(mm, pgd, addr);
+       if (pmd)
+-              pte = pte_alloc_map(mm, pmd, addr);
++              pte = pte_alloc_map(mm, pgd, &pmd, addr);
++      pmd_unmap(pmd);
+       return pte;
+ }
+--- linux-2.6.0-test1/mm/msync.c       2003-06-14 12:18:07.000000000 -0700
++++ 25/mm/msync.c      2003-07-19 17:07:16.000000000 -0700
+@@ -82,7 +82,7 @@ static inline int filemap_sync_pmd_range
+               pgd_clear(pgd);
+               return 0;
+       }
+-      pmd = pmd_offset(pgd, address);
++      pmd = pmd_offset_map(pgd, address);
+       if ((address & PGDIR_MASK) != (end & PGDIR_MASK))
+               end = (address & PGDIR_MASK) + PGDIR_SIZE;
+       error = 0;
+@@ -91,6 +91,7 @@ static inline int filemap_sync_pmd_range
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address && (address < end));
++      pmd_unmap(pmd - 1);
+       return error;
+ }
+--- linux-2.6.0-test1/mm/page-writeback.c      2003-07-02 14:53:18.000000000 -0700
++++ 25/mm/page-writeback.c     2003-07-19 17:06:58.000000000 -0700
+@@ -28,6 +28,7 @@
+ #include <linux/smp.h>
+ #include <linux/sysctl.h>
+ #include <linux/cpu.h>
++#include <linux/pagevec.h>
+ /*
+  * The maximum number of pages to writeout in a single bdflush/kupdate
+@@ -144,7 +145,7 @@ get_dirty_limits(struct page_state *ps, 
+  * If we're over `background_thresh' then pdflush is woken to perform some
+  * writeout.
+  */
+-void balance_dirty_pages(struct address_space *mapping)
++int balance_dirty_pages(struct address_space *mapping)
+ {
+       struct page_state ps;
+       long nr_reclaimable;
+@@ -161,6 +162,7 @@ void balance_dirty_pages(struct address_
+                       .sync_mode      = WB_SYNC_NONE,
+                       .older_than_this = NULL,
+                       .nr_to_write    = write_chunk,
++                      .nonblocking    = !is_sync_wait(current->io_wait)
+               };
+               get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
+@@ -187,7 +189,11 @@ void balance_dirty_pages(struct address_
+                       if (pages_written >= write_chunk)
+                               break;          /* We've done our duty */
+               }
+-              blk_congestion_wait(WRITE, HZ/10);
++              if (-EIOCBRETRY == blk_congestion_wait_wq(WRITE, HZ/10,
++                      current->io_wait)) {
++                      pr_debug("async blk congestion wait\n");
++                      return -EIOCBRETRY;
++              }
+       }
+       if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
+@@ -195,6 +201,8 @@ void balance_dirty_pages(struct address_
+       if (!writeback_in_progress(bdi) && nr_reclaimable > background_thresh)
+               pdflush_operation(background_writeout, 0);
++
++      return 0;
+ }
+ /**
+@@ -210,7 +218,7 @@ void balance_dirty_pages(struct address_
+  * decrease the ratelimiting by a lot, to prevent individual processes from
+  * overshooting the limit by (ratelimit_pages) each.
+  */
+-void balance_dirty_pages_ratelimited(struct address_space *mapping)
++int balance_dirty_pages_ratelimited(struct address_space *mapping)
+ {
+       static DEFINE_PER_CPU(int, ratelimits) = 0;
+       long ratelimit;
+@@ -222,10 +230,10 @@ void balance_dirty_pages_ratelimited(str
+       if (get_cpu_var(ratelimits)++ >= ratelimit) {
+               __get_cpu_var(ratelimits) = 0;
+               put_cpu_var(ratelimits);
+-              balance_dirty_pages(mapping);
+-              return;
++              return balance_dirty_pages(mapping);
+       }
+       put_cpu_var(ratelimits);
++      return 0;
+ }
+ /*
+@@ -560,3 +568,107 @@ int test_clear_page_dirty(struct page *p
+       return 0;
+ }
+ EXPORT_SYMBOL(test_clear_page_dirty);
++
++
++static ssize_t operate_on_page_range(struct address_space *mapping,
++              loff_t pos, size_t count, int (*operator)(struct page *))
++{
++      pgoff_t first = pos >> PAGE_CACHE_SHIFT;
++      pgoff_t last = (pos + count - 1) >> PAGE_CACHE_SHIFT;   /* inclusive */
++      pgoff_t next = first;
++      struct pagevec pvec;
++      ssize_t ret = 0, bytes = 0;
++      int i;
++
++      if (count == 0)
++              return 0;
++
++      pagevec_init(&pvec, 0);
++      while (pagevec_lookup(&pvec, mapping, next,
++                              min((pgoff_t)PAGEVEC_SIZE, last - next + 1))) {
++              for (i = 0; i < pagevec_count(&pvec); i++) {
++                      struct page *page = pvec.pages[i];
++
++                      lock_page(page);        /* stabilise ->index */
++                      if (!page->mapping) {   /* truncated */
++                              unlock_page(page);
++                              next++;
++                              continue;
++                      }
++                      next = page->index + 1;
++                      ret = (*operator)(page);
++                      if (ret == -EIOCBRETRY)
++                              break;
++                      if (PageError(page)) {
++                              if (!ret)
++                                      ret = -EIO;
++                      }
++                      if (next > last)
++                              break;
++              }
++              pagevec_release(&pvec);
++              if ((next > last) || (ret == -EIOCBRETRY))
++                      break;
++      }
++      bytes = (next << PAGE_CACHE_SHIFT) - pos;
++      if (bytes > count)
++              bytes = count;
++      return (bytes && (!ret || (ret == -EIOCBRETRY))) ? bytes : ret;
++}
++
++static int page_waiter(struct page *page)
++{
++      unlock_page(page);
++      return wait_on_page_writeback_wq(page, current->io_wait);
++}
++
++static size_t
++wait_on_page_range(struct address_space *mapping, loff_t pos, size_t count)
++{
++      return operate_on_page_range(mapping, pos, count, page_waiter);
++}
++
++static int page_writer(struct page *page)
++{
++      struct writeback_control wbc = {
++              .sync_mode      = WB_SYNC_ALL,
++              .nr_to_write    = 1,
++      };
++
++      wait_on_page_writeback(page);
++      return page->mapping->a_ops->writepage(page, &wbc);
++}
++
++static ssize_t
++write_out_page_range(struct address_space *mapping, loff_t pos, size_t count)
++{
++      return operate_on_page_range(mapping, pos, count, page_writer);
++}
++
++/*
++ * Write and wait upon all the pages in the passed range.  This is a "data
++ * integrity" operation.  It waits upon in-flight writeout before starting and
++ * waiting upon new writeout.  If there was an IO error, return it.
++ *
++ * We need to re-take i_sem during the generic_osync_inode list walk because
++ * it is otherwise livelockable.
++ */
++ssize_t sync_page_range(struct inode *inode, struct address_space *mapping,
++                      loff_t pos, size_t count)
++{
++      int ret;
++
++      if (!mapping->a_ops->writepage)
++              return 0;
++      if (mapping->backing_dev_info->memory_backed)
++              return 0;
++      ret = write_out_page_range(mapping, pos, count);
++      if (ret >= 0) {
++              down(&inode->i_sem);
++              ret = generic_osync_inode(inode, OSYNC_METADATA);
++              up(&inode->i_sem);
++      }
++      if (ret >= 0)
++              ret = wait_on_page_range(mapping, pos, count);
++      return ret;
++}
+--- linux-2.6.0-test1/mm/slab.c        2003-07-10 18:50:32.000000000 -0700
++++ 25/mm/slab.c       2003-07-19 17:07:16.000000000 -0700
+@@ -1628,7 +1628,13 @@ static inline void *cache_free_debugchec
+       kfree_debugcheck(objp);
+       page = virt_to_page(objp);
+-      BUG_ON(GET_PAGE_CACHE(page) != cachep);
++      if (GET_PAGE_CACHE(page) != cachep) {
++              printk(KERN_ERR "mismatch in kmem_cache_free: expected cache %p, got %p\n",
++                              GET_PAGE_CACHE(page),cachep);
++              printk(KERN_ERR "%p is %s.\n", cachep, cachep->name);
++              printk(KERN_ERR "%p is %s.\n", GET_PAGE_CACHE(page), GET_PAGE_CACHE(page)->name);
++              WARN_ON(1);
++      }
+       slabp = GET_PAGE_SLAB(page);
+       if (cachep->flags & SLAB_STORE_USER) {
+@@ -2482,11 +2488,11 @@ static void *s_start(struct seq_file *m,
+               seq_puts(m, "slabinfo - version: 2.0\n");
+ #endif
+               seq_puts(m, "# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab>");
+-              seq_puts(m, " : tunables <batchcount> <limit <sharedfactor>");
++              seq_puts(m, " : tunables <batchcount> <limit> <sharedfactor>");
+               seq_puts(m, " : slabdata <active_slabs> <num_slabs> <sharedavail>");
+ #if STATS
+               seq_puts(m, " : globalstat <listallocs> <maxobjs> <grown> <reaped> <error> <maxfreeable> <freelimit>");
+-              seq_puts(m, " : cpustat <allochit <allocmiss <freehit <freemiss>");
++              seq_puts(m, " : cpustat <allochit> <allocmiss> <freehit <freemiss>");
+ #endif
+               seq_putc(m, '\n');
+       }
+@@ -2717,7 +2723,7 @@ void ptrinfo(unsigned long addr)
+                       printk("No pgd.\n");
+                       break;
+               }
+-              pmd = pmd_offset(pgd, addr);
++              pmd = pmd_offset_kernel(pgd, addr);
+               if (pmd_none(*pmd)) {
+                       printk("No pmd.\n");
+                       break;
+--- linux-2.6.0-test1/mm/swapfile.c    2003-07-13 21:44:35.000000000 -0700
++++ 25/mm/swapfile.c   2003-07-19 17:07:16.000000000 -0700
+@@ -448,7 +448,7 @@ static int unuse_pgd(struct vm_area_stru
+               pgd_clear(dir);
+               return 0;
+       }
+-      pmd = pmd_offset(dir, address);
++      pmd = pmd_offset_map(dir, address);
+       offset = address & PGDIR_MASK;
+       address &= ~PGDIR_MASK;
+       end = address + size;
+@@ -463,6 +463,7 @@ static int unuse_pgd(struct vm_area_stru
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address && (address < end));
++      pmd_unmap(pmd - 1);
+       return 0;
+ }
+--- linux-2.6.0-test1/mm/swap_state.c  2003-06-26 22:07:26.000000000 -0700
++++ 25/mm/swap_state.c 2003-07-19 17:07:03.000000000 -0700
+@@ -35,6 +35,7 @@ struct address_space swapper_space = {
+       .i_mmap         = LIST_HEAD_INIT(swapper_space.i_mmap),
+       .i_mmap_shared  = LIST_HEAD_INIT(swapper_space.i_mmap_shared),
+       .i_shared_sem   = __MUTEX_INITIALIZER(swapper_space.i_shared_sem),
++      .truncate_count  = ATOMIC_INIT(0),
+       .private_lock   = SPIN_LOCK_UNLOCKED,
+       .private_list   = LIST_HEAD_INIT(swapper_space.private_list),
+ };
+--- linux-2.6.0-test1/mm/vmalloc.c     2003-06-14 12:18:23.000000000 -0700
++++ 25/mm/vmalloc.c    2003-07-19 17:07:16.000000000 -0700
+@@ -70,7 +70,7 @@ static void unmap_area_pmd(pgd_t *dir, u
+               return;
+       }
+-      pmd = pmd_offset(dir, address);
++      pmd = pmd_offset_kernel(dir, address);
+       address &= ~PGDIR_MASK;
+       end = address + size;
+       if (end > PGDIR_SIZE)
+@@ -159,7 +159,7 @@ int map_vm_area(struct vm_struct *area, 
+       dir = pgd_offset_k(address);
+       spin_lock(&init_mm.page_table_lock);
+       do {
+-              pmd_t *pmd = pmd_alloc(&init_mm, dir, address);
++              pmd_t *pmd = pmd_alloc_kernel(&init_mm, dir, address);
+               if (!pmd) {
+                       err = -ENOMEM;
+                       break;
+--- linux-2.6.0-test1/mm/vmscan.c      2003-07-13 21:44:35.000000000 -0700
++++ 25/mm/vmscan.c     2003-07-19 17:06:15.000000000 -0700
+@@ -921,7 +921,7 @@ static int balance_pgdat(pg_data_t *pgda
+                       if (i < ZONE_HIGHMEM) {
+                               reclaim_state->reclaimed_slab = 0;
+                               shrink_slab(max_scan + nr_mapped, GFP_KERNEL);
+-                              to_free += reclaim_state->reclaimed_slab;
++                              to_free -= reclaim_state->reclaimed_slab;
+                       }
+                       if (zone->all_unreclaimable)
+                               continue;
+@@ -930,7 +930,8 @@ static int balance_pgdat(pg_data_t *pgda
+               }
+               if (all_zones_ok)
+                       break;
+-              blk_congestion_wait(WRITE, HZ/10);
++              if (to_free)
++                      blk_congestion_wait(WRITE, HZ/10);
+       }
+       return nr_pages - to_free;
+ }
+@@ -956,11 +957,11 @@ int kswapd(void *p)
+       struct reclaim_state reclaim_state = {
+               .reclaimed_slab = 0,
+       };
+-      unsigned long cpumask;
++      cpumask_t cpumask;
+       daemonize("kswapd%d", pgdat->node_id);
+       cpumask = node_to_cpumask(pgdat->node_id);
+-      if (cpumask)
++      if (!cpus_empty(cpumask))
+               set_cpus_allowed(tsk, cpumask);
+       current->reclaim_state = &reclaim_state;
+--- linux-2.6.0-test1/net/atm/br2684.c 2003-06-14 12:18:08.000000000 -0700
++++ 25/net/atm/br2684.c        2003-07-19 17:03:51.000000000 -0700
+@@ -16,9 +16,12 @@ Author: Marcell GAL, 2000, XDSL Ltd, Hun
+ #include <linux/ip.h>
+ #include <asm/uaccess.h>
+ #include <net/arp.h>
++#include <linux/atm.h>
++#include <linux/atmdev.h>
+ #include <linux/atmbr2684.h>
++#include "common.h"
+ #include "ipcommon.h"
+ /*
+@@ -768,8 +771,6 @@ static struct file_operations br2684_pro
+ extern struct proc_dir_entry *atm_proc_root;  /* from proc.c */
+-extern int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
+-
+ /* the following avoids some spurious warnings from the compiler */
+ #define UNUSED __attribute__((unused))
+@@ -779,14 +780,14 @@ static int __init UNUSED br2684_init(voi
+       if ((p = create_proc_entry("br2684", 0, atm_proc_root)) == NULL)
+               return -ENOMEM;
+       p->proc_fops = &br2684_proc_operations;
+-      br2684_ioctl_hook = br2684_ioctl;
++      br2684_ioctl_set(br2684_ioctl);
+       return 0;
+ }
+ static void __exit UNUSED br2684_exit(void)
+ {
+       struct br2684_dev *brdev;
+-      br2684_ioctl_hook = NULL;
++      br2684_ioctl_set(NULL);
+       remove_proc_entry("br2684", atm_proc_root);
+       while (!list_empty(&br2684_devs)) {
+               brdev = list_entry_brdev(br2684_devs.next);
+--- linux-2.6.0-test1/net/atm/clip.c   2003-07-10 18:50:32.000000000 -0700
++++ 25/net/atm/clip.c  2003-07-19 17:03:51.000000000 -0700
+@@ -67,7 +67,7 @@ static int to_atmarpd(enum atmarp_ctrl_t
+       ctrl->ip = ip;
+       atm_force_charge(atmarpd,skb->truesize);
+       skb_queue_tail(&atmarpd->sk->sk_receive_queue, skb);
+-      wake_up(&atmarpd->sleep);
++      atmarpd->sk->sk_data_ready(atmarpd->sk, skb->len);
+       return 0;
+ }
+--- linux-2.6.0-test1/net/atm/common.c 2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/common.c        2003-07-19 17:03:51.000000000 -0700
+@@ -129,14 +129,34 @@ EXPORT_SYMBOL(atm_clip_ops_set);
+ #endif
+ #if defined(CONFIG_PPPOATM) || defined(CONFIG_PPPOATM_MODULE)
+-int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
+-EXPORT_SYMBOL(pppoatm_ioctl_hook);
++static DECLARE_MUTEX(pppoatm_ioctl_mutex);
++
++static int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
++
++void pppoatm_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long))
++{
++      down(&pppoatm_ioctl_mutex);
++      pppoatm_ioctl_hook = hook;
++      up(&pppoatm_ioctl_mutex);
++}
++#ifdef CONFIG_PPPOATM_MODULE
++EXPORT_SYMBOL(pppoatm_ioctl_set);
++#endif
+ #endif
+ #if defined(CONFIG_ATM_BR2684) || defined(CONFIG_ATM_BR2684_MODULE)
+-int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
++static DECLARE_MUTEX(br2684_ioctl_mutex);
++
++static int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
++
++void br2684_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long))
++{
++      down(&br2684_ioctl_mutex);
++      br2684_ioctl_hook = hook;
++      up(&br2684_ioctl_mutex);
++}
+ #ifdef CONFIG_ATM_BR2684_MODULE
+-EXPORT_SYMBOL(br2684_ioctl_hook);
++EXPORT_SYMBOL(br2684_ioctl_set);
+ #endif
+ #endif
+@@ -215,6 +235,37 @@ static void vcc_sock_destruct(struct soc
+       kfree(sk->sk_protinfo);
+ }
++
++static void vcc_def_wakeup(struct sock *sk)
++{
++      read_lock(&sk->sk_callback_lock);
++      if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
++              wake_up(sk->sk_sleep);
++      read_unlock(&sk->sk_callback_lock);
++}
++
++static inline int vcc_writable(struct sock *sk)
++{
++      struct atm_vcc *vcc = atm_sk(sk);
++
++      return (vcc->qos.txtp.max_sdu +
++              atomic_read(&sk->sk_wmem_alloc)) <= sk->sk_sndbuf;
++}
++
++static void vcc_write_space(struct sock *sk)
++{       
++      read_lock(&sk->sk_callback_lock);
++
++      if (vcc_writable(sk)) {
++              if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
++                      wake_up_interruptible(sk->sk_sleep);
++
++              sk_wake_async(sk, 2, POLL_OUT);
++      }
++
++      read_unlock(&sk->sk_callback_lock);
++}
++
+  
+ int vcc_create(struct socket *sock, int protocol, int family)
+ {
+@@ -227,7 +278,9 @@ int vcc_create(struct socket *sock, int 
+       sk = sk_alloc(family, GFP_KERNEL, 1, NULL);
+       if (!sk)
+               return -ENOMEM;
+-      sock_init_data(NULL, sk);
++      sock_init_data(sock, sk);
++      sk->sk_state_change = vcc_def_wakeup;
++      sk->sk_write_space = vcc_write_space;
+       vcc = atm_sk(sk) = kmalloc(sizeof(*vcc), GFP_KERNEL);
+       if (!vcc) {
+@@ -238,7 +291,6 @@ int vcc_create(struct socket *sock, int 
+       memset(vcc, 0, sizeof(*vcc));
+       vcc->sk = sk;
+       vcc->dev = NULL;
+-      vcc->callback = NULL;
+       memset(&vcc->local,0,sizeof(struct sockaddr_atmsvc));
+       memset(&vcc->remote,0,sizeof(struct sockaddr_atmsvc));
+       vcc->qos.txtp.max_sdu = 1 << 16; /* for meta VCs */
+@@ -249,8 +301,6 @@ int vcc_create(struct socket *sock, int 
+       vcc->push_oam = NULL;
+       vcc->vpi = vcc->vci = 0; /* no VCI/VPI yet */
+       vcc->atm_options = vcc->aal_options = 0;
+-      init_waitqueue_head(&vcc->sleep);
+-      sk->sk_sleep = &vcc->sleep;
+       sk->sk_destruct = vcc_sock_destruct;
+       sock->sk = sk;
+       return 0;
+@@ -300,9 +350,9 @@ int vcc_release(struct socket *sock)
+ void vcc_release_async(struct atm_vcc *vcc, int reply)
+ {
+       set_bit(ATM_VF_CLOSE, &vcc->flags);
+-      vcc->reply = reply;
+       vcc->sk->sk_err = -reply;
+-      wake_up(&vcc->sleep);
++      clear_bit(ATM_VF_WAITING, &vcc->flags);
++      vcc->sk->sk_state_change(vcc->sk);
+ }
+@@ -475,7 +525,7 @@ int vcc_recvmsg(struct kiocb *iocb, stru
+       vcc = ATM_SD(sock);
+       if (test_bit(ATM_VF_RELEASED,&vcc->flags) ||
+           test_bit(ATM_VF_CLOSE,&vcc->flags))
+-              return vcc->reply;
++              return -sk->sk_err;
+       if (!test_bit(ATM_VF_READY, &vcc->flags))
+               return 0;
+@@ -532,7 +582,7 @@ int vcc_sendmsg(struct kiocb *iocb, stru
+       vcc = ATM_SD(sock);
+       if (test_bit(ATM_VF_RELEASED, &vcc->flags) ||
+           test_bit(ATM_VF_CLOSE, &vcc->flags)) {
+-              error = vcc->reply;
++              error = -sk->sk_err;
+               goto out;
+       }
+       if (!test_bit(ATM_VF_READY, &vcc->flags)) {
+@@ -549,7 +599,7 @@ int vcc_sendmsg(struct kiocb *iocb, stru
+       }
+       /* verify_area is done by net/socket.c */
+       eff = (size+3) & ~3; /* align to word boundary */
+-      prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++      prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+       error = 0;
+       while (!(skb = alloc_tx(vcc,eff))) {
+               if (m->msg_flags & MSG_DONTWAIT) {
+@@ -563,16 +613,16 @@ int vcc_sendmsg(struct kiocb *iocb, stru
+               }
+               if (test_bit(ATM_VF_RELEASED,&vcc->flags) ||
+                   test_bit(ATM_VF_CLOSE,&vcc->flags)) {
+-                      error = vcc->reply;
++                      error = -sk->sk_err;
+                       break;
+               }
+               if (!test_bit(ATM_VF_READY,&vcc->flags)) {
+                       error = -EPIPE;
+                       break;
+               }
+-              prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++              prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+       }
+-      finish_wait(&vcc->sleep, &wait);
++      finish_wait(sk->sk_sleep, &wait);
+       if (error)
+               goto out;
+       skb->dev = NULL; /* for paths shared with net_device interfaces */
+@@ -591,29 +641,38 @@ out:
+ }
+-unsigned int atm_poll(struct file *file,struct socket *sock,poll_table *wait)
++unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait)
+ {
++      struct sock *sk = sock->sk;
+       struct atm_vcc *vcc;
+       unsigned int mask;
+-      vcc = ATM_SD(sock);
+-      poll_wait(file,&vcc->sleep,wait);
++      poll_wait(file, sk->sk_sleep, wait);
+       mask = 0;
+-      if (skb_peek(&vcc->sk->sk_receive_queue))
+-              mask |= POLLIN | POLLRDNORM;
+-      if (test_bit(ATM_VF_RELEASED,&vcc->flags) ||
+-          test_bit(ATM_VF_CLOSE,&vcc->flags))
++
++      vcc = ATM_SD(sock);
++
++      /* exceptional events */
++      if (sk->sk_err)
++              mask = POLLERR;
++
++      if (test_bit(ATM_VF_RELEASED, &vcc->flags) ||
++          test_bit(ATM_VF_CLOSE, &vcc->flags))
+               mask |= POLLHUP;
+-      if (sock->state != SS_CONNECTING) {
+-              if (vcc->qos.txtp.traffic_class != ATM_NONE &&
+-                  vcc->qos.txtp.max_sdu +
+-                  atomic_read(&vcc->sk->sk_wmem_alloc) <= vcc->sk->sk_sndbuf)
+-                      mask |= POLLOUT | POLLWRNORM;
+-      }
+-      else if (vcc->reply != WAITING) {
+-                      mask |= POLLOUT | POLLWRNORM;
+-                      if (vcc->reply) mask |= POLLERR;
+-              }
++
++      /* readable? */
++      if (!skb_queue_empty(&sk->sk_receive_queue))
++              mask |= POLLIN | POLLRDNORM;
++
++      /* writable? */
++      if (sock->state == SS_CONNECTING &&
++          test_bit(ATM_VF_WAITING, &vcc->flags))
++              return mask;
++
++      if (vcc->qos.txtp.traffic_class != ATM_NONE &&
++          vcc_writable(vcc->sk))
++              mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
++
+       return mask;
+ }
+@@ -859,19 +918,22 @@ int vcc_ioctl(struct socket *sock, unsig
+               default:
+                       break;
+       }
++      error = -ENOIOCTLCMD;
+ #if defined(CONFIG_PPPOATM) || defined(CONFIG_PPPOATM_MODULE)
+-      if (pppoatm_ioctl_hook) {
++      down(&pppoatm_ioctl_mutex);
++      if (pppoatm_ioctl_hook)
+               error = pppoatm_ioctl_hook(vcc, cmd, arg);
+-              if (error != -ENOIOCTLCMD)
+-                      goto done;
+-      }
++      up(&pppoatm_ioctl_mutex);
++      if (error != -ENOIOCTLCMD)
++              goto done;
+ #endif
+ #if defined(CONFIG_ATM_BR2684) || defined(CONFIG_ATM_BR2684_MODULE)
+-      if (br2684_ioctl_hook) {
++      down(&br2684_ioctl_mutex);
++      if (br2684_ioctl_hook)
+               error = br2684_ioctl_hook(vcc, cmd, arg);
+-              if (error != -ENOIOCTLCMD)
+-                      goto done;
+-      }
++      up(&br2684_ioctl_mutex);
++      if (error != -ENOIOCTLCMD)
++              goto done;
+ #endif
+       error = atm_dev_ioctl(cmd, arg);
+--- linux-2.6.0-test1/net/atm/common.h 2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/common.h        2003-07-19 17:03:51.000000000 -0700
+@@ -17,7 +17,7 @@ int vcc_recvmsg(struct kiocb *iocb, stru
+               int size, int flags);
+ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
+               int total_len);
+-unsigned int atm_poll(struct file *file,struct socket *sock,poll_table *wait);
++unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait);
+ int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
+ int vcc_setsockopt(struct socket *sock, int level, int optname, char *optval,
+                  int optlen);
+@@ -26,6 +26,9 @@ int vcc_getsockopt(struct socket *sock, 
+ void atm_shutdown_dev(struct atm_dev *dev);
++void pppoatm_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long));
++void br2684_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long));
++
+ int atmpvc_init(void);
+ void atmpvc_exit(void);
+ int atmsvc_init(void);
+--- linux-2.6.0-test1/net/atm/lec.c    2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/lec.c   2003-07-19 17:03:51.000000000 -0700
+@@ -134,7 +134,7 @@ static void lec_handle_bridge(struct sk_
+                 priv = (struct lec_priv *)dev->priv;
+                 atm_force_charge(priv->lecd, skb2->truesize);
+                 skb_queue_tail(&priv->lecd->sk->sk_receive_queue, skb2);
+-                wake_up(&priv->lecd->sleep);
++                priv->lecd->sk->sk_data_ready(priv->lecd->sk, skb2->len);
+         }
+         return;
+@@ -513,7 +513,7 @@ lec_atm_send(struct atm_vcc *vcc, struct
+                         memcpy(skb2->data, mesg, sizeof(struct atmlec_msg));
+                         atm_force_charge(priv->lecd, skb2->truesize);
+                         skb_queue_tail(&priv->lecd->sk->sk_receive_queue, skb2);
+-                        wake_up(&priv->lecd->sleep);
++                        priv->lecd->sk->sk_data_ready(priv->lecd->sk, skb2->len);
+                 }
+                 if (f != NULL) br_fdb_put_hook(f);
+ #endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */
+@@ -598,13 +598,13 @@ send_to_lecd(struct lec_priv *priv, atml
+         atm_force_charge(priv->lecd, skb->truesize);
+       skb_queue_tail(&priv->lecd->sk->sk_receive_queue, skb);
+-        wake_up(&priv->lecd->sleep);
++        priv->lecd->sk->sk_data_ready(priv->lecd->sk, skb->len);
+         if (data != NULL) {
+                 DPRINTK("lec: about to send %d bytes of data\n", data->len);
+                 atm_force_charge(priv->lecd, data->truesize);
+                 skb_queue_tail(&priv->lecd->sk->sk_receive_queue, data);
+-                wake_up(&priv->lecd->sleep);
++                priv->lecd->sk->sk_data_ready(priv->lecd->sk, skb->len);
+         }
+         return 0;
+@@ -686,7 +686,7 @@ lec_push(struct atm_vcc *vcc, struct sk_
+         if (memcmp(skb->data, lec_ctrl_magic, 4) ==0) { /* Control frame, to daemon*/
+                 DPRINTK("%s: To daemon\n",dev->name);
+                 skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-                wake_up(&vcc->sleep);
++                vcc->sk->sk_data_ready(vcc->sk, skb->len);
+         } else { /* Data frame, queue to protocol handlers */
+                 unsigned char *dst;
+--- linux-2.6.0-test1/net/atm/mpc.c    2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/mpc.c   2003-07-19 17:03:51.000000000 -0700
+@@ -669,7 +669,7 @@ static void mpc_push(struct atm_vcc *vcc
+               dprintk("mpoa: (%s) mpc_push: control packet arrived\n", dev->name);
+               /* Pass control packets to daemon */
+               skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-              wake_up(&vcc->sleep);
++              vcc->sk->sk_data_ready(vcc->sk, skb->len);
+               return;
+       }
+@@ -947,7 +947,7 @@ int msg_to_mpoad(struct k_message *mesg,
+       memcpy(skb->data, mesg, sizeof(struct k_message));
+       atm_force_charge(mpc->mpoad_vcc, skb->truesize);
+       skb_queue_tail(&mpc->mpoad_vcc->sk->sk_receive_queue, skb);
+-      wake_up(&mpc->mpoad_vcc->sleep);
++      mpc->mpoad_vcc->sk->sk_data_ready(mpc->mpoad_vcc->sk, skb->len);
+       return 0;
+ }
+@@ -1226,7 +1226,7 @@ static void purge_egress_shortcut(struct
+       atm_force_charge(vcc, skb->truesize);
+       skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-      wake_up(&vcc->sleep);
++      vcc->sk->sk_data_ready(vcc->sk, skb->len);
+       dprintk("mpoa: purge_egress_shortcut: exiting:\n");
+       return;
+--- linux-2.6.0-test1/net/atm/pppoatm.c        2003-06-14 12:18:24.000000000 -0700
++++ 25/net/atm/pppoatm.c       2003-07-19 17:03:51.000000000 -0700
+@@ -44,6 +44,8 @@
+ #include <linux/ppp_channel.h>
+ #include <linux/atmppp.h>
++#include "common.h"
++
+ #if 0
+ #define DPRINTK(format, args...) \
+       printk(KERN_DEBUG "pppoatm: " format, ##args)
+@@ -344,17 +346,15 @@ static int pppoatm_ioctl(struct atm_vcc 
+ /* the following avoids some spurious warnings from the compiler */
+ #define UNUSED __attribute__((unused))
+-extern int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long);
+-
+ static int __init UNUSED pppoatm_init(void)
+ {
+-      pppoatm_ioctl_hook = pppoatm_ioctl;
++      pppoatm_ioctl_set(pppoatm_ioctl);
+       return 0;
+ }
+ static void __exit UNUSED pppoatm_exit(void)
+ {
+-      pppoatm_ioctl_hook = NULL;
++      pppoatm_ioctl_set(NULL);
+ }
+ module_init(pppoatm_init);
+--- linux-2.6.0-test1/net/atm/proc.c   2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/proc.c  2003-07-19 17:03:51.000000000 -0700
+@@ -224,7 +224,7 @@ static void vc_info(struct atm_vcc *vcc,
+                       here += sprintf(here, "%3d", vcc->sk->sk_family);
+       }
+       here += sprintf(here," %04lx  %5d %7d/%7d %7d/%7d\n",vcc->flags,
+-          vcc->reply,
++          vcc->sk->sk_err,
+           atomic_read(&vcc->sk->sk_wmem_alloc), vcc->sk->sk_sndbuf,
+           atomic_read(&vcc->sk->sk_rmem_alloc), vcc->sk->sk_rcvbuf);
+ }
+--- linux-2.6.0-test1/net/atm/pvc.c    2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/pvc.c   2003-07-19 17:03:51.000000000 -0700
+@@ -111,7 +111,7 @@ static struct proto_ops pvc_proto_ops = 
+       .socketpair =   sock_no_socketpair,
+       .accept =       sock_no_accept,
+       .getname =      pvc_getname,
+-      .poll =         atm_poll,
++      .poll =         vcc_poll,
+       .ioctl =        vcc_ioctl,
+       .listen =       sock_no_listen,
+       .shutdown =     pvc_shutdown,
+--- linux-2.6.0-test1/net/atm/raw.c    2003-06-14 12:18:34.000000000 -0700
++++ 25/net/atm/raw.c   2003-07-19 17:03:51.000000000 -0700
+@@ -29,7 +29,7 @@ void atm_push_raw(struct atm_vcc *vcc,st
+ {
+       if (skb) {
+               skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-              wake_up(&vcc->sleep);
++              vcc->sk->sk_data_ready(vcc->sk, skb->len);
+       }
+ }
+@@ -40,7 +40,7 @@ static void atm_pop_raw(struct atm_vcc *
+               skb->truesize);
+       atomic_sub(skb->truesize, &vcc->sk->sk_wmem_alloc);
+       dev_kfree_skb_any(skb);
+-      wake_up(&vcc->sleep);
++      vcc->sk->sk_write_space(vcc->sk);
+ }
+--- linux-2.6.0-test1/net/atm/signaling.c      2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/signaling.c     2003-07-19 17:03:51.000000000 -0700
+@@ -61,7 +61,7 @@ static void sigd_put_skb(struct sk_buff 
+ #endif
+       atm_force_charge(sigd,skb->truesize);
+       skb_queue_tail(&sigd->sk->sk_receive_queue,skb);
+-      wake_up(&sigd->sleep);
++      sigd->sk->sk_data_ready(sigd->sk, skb->len);
+ }
+@@ -103,7 +103,8 @@ static int sigd_send(struct atm_vcc *vcc
+       vcc = *(struct atm_vcc **) &msg->vcc;
+       switch (msg->type) {
+               case as_okay:
+-                      vcc->reply = msg->reply;
++                      vcc->sk->sk_err = -msg->reply;
++                      clear_bit(ATM_VF_WAITING, &vcc->flags);
+                       if (!*vcc->local.sas_addr.prv &&
+                           !*vcc->local.sas_addr.pub) {
+                               vcc->local.sas_family = AF_ATMSVC;
+@@ -123,8 +124,8 @@ static int sigd_send(struct atm_vcc *vcc
+               case as_error:
+                       clear_bit(ATM_VF_REGIS,&vcc->flags);
+                       clear_bit(ATM_VF_READY,&vcc->flags);
+-                      vcc->reply = msg->reply;
+                       vcc->sk->sk_err = -msg->reply;
++                      clear_bit(ATM_VF_WAITING, &vcc->flags);
+                       break;
+               case as_indicate:
+                       vcc = *(struct atm_vcc **) &msg->listen_vcc;
+@@ -137,19 +138,16 @@ static int sigd_send(struct atm_vcc *vcc
+                       }
+                       vcc->sk->sk_ack_backlog++;
+                       skb_queue_tail(&vcc->sk->sk_receive_queue, skb);
+-                      if (vcc->callback) {
+-                              DPRINTK("waking vcc->sleep 0x%p\n",
+-                                  &vcc->sleep);
+-                              vcc->callback(vcc);
+-                      }
++                      DPRINTK("waking vcc->sk->sk_sleep 0x%p\n", vcc->sk->sk_sleep);
++                      vcc->sk->sk_state_change(vcc->sk);
+ as_indicate_complete:
+                       release_sock(vcc->sk);
+                       return 0;
+               case as_close:
+                       set_bit(ATM_VF_RELEASED,&vcc->flags);
+                       clear_bit(ATM_VF_READY,&vcc->flags);
+-                      vcc->reply = msg->reply;
+                       vcc->sk->sk_err = -msg->reply;
++                      clear_bit(ATM_VF_WAITING, &vcc->flags);
+                       break;
+               case as_modify:
+                       modify_qos(vcc,msg);
+@@ -159,7 +157,7 @@ as_indicate_complete:
+                           (int) msg->type);
+                       return -EINVAL;
+       }
+-      if (vcc->callback) vcc->callback(vcc);
++      vcc->sk->sk_state_change(vcc->sk);
+       dev_kfree_skb(skb);
+       return 0;
+ }
+@@ -205,9 +203,9 @@ static void purge_vcc(struct atm_vcc *vc
+       if (vcc->sk->sk_family == PF_ATMSVC &&
+           !test_bit(ATM_VF_META,&vcc->flags)) {
+               set_bit(ATM_VF_RELEASED,&vcc->flags);
+-              vcc->reply = -EUNATCH;
+               vcc->sk->sk_err = EUNATCH;
+-              wake_up(&vcc->sleep);
++              clear_bit(ATM_VF_WAITING, &vcc->flags);
++              vcc->sk->sk_state_change(vcc->sk);
+       }
+ }
+--- linux-2.6.0-test1/net/atm/signaling.h      2003-06-14 12:17:56.000000000 -0700
++++ 25/net/atm/signaling.h     2003-07-19 17:03:51.000000000 -0700
+@@ -11,9 +11,6 @@
+ #include <linux/atmsvc.h>
+-#define WAITING 1 /* for reply: 0: no error, < 0: error, ... */
+-
+-
+ extern struct atm_vcc *sigd; /* needed in svc_release */
+--- linux-2.6.0-test1/net/atm/svc.c    2003-07-02 14:53:18.000000000 -0700
++++ 25/net/atm/svc.c   2003-07-19 17:03:51.000000000 -0700
+@@ -43,14 +43,6 @@ static int svc_create(struct socket *soc
+  */
+-void svc_callback(struct atm_vcc *vcc)
+-{
+-      wake_up(&vcc->sleep);
+-}
+-
+-
+-
+-
+ static int svc_shutdown(struct socket *sock,int how)
+ {
+       return 0;
+@@ -64,13 +56,13 @@ static void svc_disconnect(struct atm_vc
+       DPRINTK("svc_disconnect %p\n",vcc);
+       if (test_bit(ATM_VF_REGIS,&vcc->flags)) {
+-              prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++              prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+               sigd_enq(vcc,as_close,NULL,NULL,NULL);
+               while (!test_bit(ATM_VF_RELEASED,&vcc->flags) && sigd) {
+                       schedule();
+-                      prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++                      prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+               }
+-              finish_wait(&vcc->sleep, &wait);
++              finish_wait(vcc->sk->sk_sleep, &wait);
+       }
+       /* beware - socket is still in use by atmsigd until the last
+          as_indicate has been answered */
+@@ -145,22 +137,22 @@ static int svc_bind(struct socket *sock,
+               goto out;
+       }
+       vcc->local = *addr;
+-      vcc->reply = WAITING;
+-      prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++      set_bit(ATM_VF_WAITING, &vcc->flags);
++      prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+       sigd_enq(vcc,as_bind,NULL,NULL,&vcc->local);
+-      while (vcc->reply == WAITING && sigd) {
++      while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
+               schedule();
+-              prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++              prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+       }
+-      finish_wait(&vcc->sleep, &wait);
++      finish_wait(sk->sk_sleep, &wait);
+       clear_bit(ATM_VF_REGIS,&vcc->flags); /* doesn't count */
+       if (!sigd) {
+               error = -EUNATCH;
+               goto out;
+       }
+-        if (!vcc->reply)
++        if (!sk->sk_err)
+               set_bit(ATM_VF_BOUND,&vcc->flags);
+-      error = vcc->reply;
++      error = -sk->sk_err;
+ out:
+       release_sock(sk);
+       return error;
+@@ -191,13 +183,13 @@ static int svc_connect(struct socket *so
+               error = -EISCONN;
+               goto out;
+       case SS_CONNECTING:
+-              if (vcc->reply == WAITING) {
++              if (test_bit(ATM_VF_WAITING, &vcc->flags)) {
+                       error = -EALREADY;
+                       goto out;
+               }
+               sock->state = SS_UNCONNECTED;
+-              if (vcc->reply) {
+-                      error = vcc->reply;
++              if (sk->sk_err) {
++                      error = -sk->sk_err;
+                       goto out;
+               }
+               break;
+@@ -226,20 +218,20 @@ static int svc_connect(struct socket *so
+                       goto out;
+               }
+               vcc->remote = *addr;
+-              vcc->reply = WAITING;
+-              prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++              set_bit(ATM_VF_WAITING, &vcc->flags);
++              prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+               sigd_enq(vcc,as_connect,NULL,NULL,&vcc->remote);
+               if (flags & O_NONBLOCK) {
+-                      finish_wait(&vcc->sleep, &wait);
++                      finish_wait(sk->sk_sleep, &wait);
+                       sock->state = SS_CONNECTING;
+                       error = -EINPROGRESS;
+                       goto out;
+               }
+               error = 0;
+-              while (vcc->reply == WAITING && sigd) {
++              while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
+                       schedule();
+                       if (!signal_pending(current)) {
+-                              prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++                              prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+                               continue;
+                       }
+                       DPRINTK("*ABORT*\n");
+@@ -256,14 +248,14 @@ static int svc_connect(struct socket *so
+                        *   Kernel <--close--- Demon
+                        */
+                       sigd_enq(vcc,as_close,NULL,NULL,NULL);
+-                      while (vcc->reply == WAITING && sigd) {
+-                              prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++                      while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
++                              prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+                               schedule();
+                       }
+-                      if (!vcc->reply)
++                      if (!sk->sk_err)
+                               while (!test_bit(ATM_VF_RELEASED,&vcc->flags)
+                                   && sigd) {
+-                                      prepare_to_wait(&vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++                                      prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+                                       schedule();
+                               }
+                       clear_bit(ATM_VF_REGIS,&vcc->flags);
+@@ -273,15 +265,15 @@ static int svc_connect(struct socket *so
+                       error = -EINTR;
+                       break;
+               }
+-              finish_wait(&vcc->sleep, &wait);
++              finish_wait(sk->sk_sleep, &wait);
+               if (error)
+                       goto out;
+               if (!sigd) {
+                       error = -EUNATCH;
+                       goto out;
+               }
+-              if (vcc->reply) {
+-                      error = vcc->reply;
++              if (sk->sk_err) {
++                      error = -sk->sk_err;
+                       goto out;
+               }
+       }
+@@ -319,14 +311,14 @@ static int svc_listen(struct socket *soc
+               error = -EINVAL;
+               goto out;
+       }
+-      vcc->reply = WAITING;
+-      prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++      set_bit(ATM_VF_WAITING, &vcc->flags);
++      prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+       sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);
+-      while (vcc->reply == WAITING && sigd) {
++      while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
+               schedule();
+-              prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++              prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+       }
+-      finish_wait(&vcc->sleep, &wait);
++      finish_wait(sk->sk_sleep, &wait);
+       if (!sigd) {
+               error = -EUNATCH;
+               goto out;
+@@ -334,7 +326,7 @@ static int svc_listen(struct socket *soc
+       set_bit(ATM_VF_LISTEN,&vcc->flags);
+       vcc->sk->sk_max_ack_backlog = backlog > 0 ? backlog :
+                                                   ATM_BACKLOG_DEFAULT;
+-      error = vcc->reply;
++      error = -sk->sk_err;
+ out:
+       release_sock(sk);
+       return error;
+@@ -362,12 +354,12 @@ static int svc_accept(struct socket *soc
+       while (1) {
+               DEFINE_WAIT(wait);
+-              prepare_to_wait(&old_vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++              prepare_to_wait(old_vcc->sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+               while (!(skb = skb_dequeue(&old_vcc->sk->sk_receive_queue)) &&
+                      sigd) {
+                       if (test_bit(ATM_VF_RELEASED,&old_vcc->flags)) break;
+                       if (test_bit(ATM_VF_CLOSE,&old_vcc->flags)) {
+-                              error = old_vcc->reply;
++                              error = -sk->sk_err;
+                               break;
+                       }
+                       if (flags & O_NONBLOCK) {
+@@ -381,9 +373,9 @@ static int svc_accept(struct socket *soc
+                               error = -ERESTARTSYS;
+                               break;
+                       }
+-                      prepare_to_wait(&old_vcc->sleep, &wait, TASK_INTERRUPTIBLE);
++                      prepare_to_wait(old_vcc->sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
+               }
+-              finish_wait(&old_vcc->sleep, &wait);
++              finish_wait(old_vcc->sk->sk_sleep, &wait);
+               if (error)
+                       goto out;
+               if (!skb) {
+@@ -407,23 +399,24 @@ static int svc_accept(struct socket *soc
+                       goto out;
+               }
+               /* wait should be short, so we ignore the non-blocking flag */
+-              new_vcc->reply = WAITING;
+-              prepare_to_wait(&new_vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++              set_bit(ATM_VF_WAITING, &new_vcc->flags);
++              prepare_to_wait(new_vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+               sigd_enq(new_vcc,as_accept,old_vcc,NULL,NULL);
+-              while (new_vcc->reply == WAITING && sigd) {
++              while (test_bit(ATM_VF_WAITING, &new_vcc->flags) && sigd) {
+                       release_sock(sk);
+                       schedule();
+                       lock_sock(sk);
+-                      prepare_to_wait(&new_vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++                      prepare_to_wait(new_vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+               }
+-              finish_wait(&new_vcc->sleep, &wait);
++              finish_wait(new_vcc->sk->sk_sleep, &wait);
+               if (!sigd) {
+                       error = -EUNATCH;
+                       goto out;
+               }
+-              if (!new_vcc->reply) break;
+-              if (new_vcc->reply != -ERESTARTSYS) {
+-                      error = new_vcc->reply;
++              if (!new_vcc->sk->sk_err)
++                      break;
++              if (new_vcc->sk->sk_err != ERESTARTSYS) {
++                      error = -new_vcc->sk->sk_err;
+                       goto out;
+               }
+       }
+@@ -451,17 +444,17 @@ int svc_change_qos(struct atm_vcc *vcc,s
+ {
+       DEFINE_WAIT(wait);
+-      vcc->reply = WAITING;
+-      prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++      set_bit(ATM_VF_WAITING, &vcc->flags);
++      prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+       sigd_enq2(vcc,as_modify,NULL,NULL,&vcc->local,qos,0);
+-      while (vcc->reply == WAITING && !test_bit(ATM_VF_RELEASED,&vcc->flags)
+-          && sigd) {
++      while (test_bit(ATM_VF_WAITING, &vcc->flags) &&
++             !test_bit(ATM_VF_RELEASED, &vcc->flags) && sigd) {
+               schedule();
+-              prepare_to_wait(&vcc->sleep, &wait, TASK_UNINTERRUPTIBLE);
++              prepare_to_wait(vcc->sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+       }
+-      finish_wait(&vcc->sleep, &wait);
++      finish_wait(vcc->sk->sk_sleep, &wait);
+       if (!sigd) return -EUNATCH;
+-      return vcc->reply;
++      return -vcc->sk->sk_err;
+ }
+@@ -527,7 +520,7 @@ static struct proto_ops svc_proto_ops = 
+       .socketpair =   sock_no_socketpair,
+       .accept =       svc_accept,
+       .getname =      svc_getname,
+-      .poll =         atm_poll,
++      .poll =         vcc_poll,
+       .ioctl =        vcc_ioctl,
+       .listen =       svc_listen,
+       .shutdown =     svc_shutdown,
+@@ -547,7 +540,6 @@ static int svc_create(struct socket *soc
+       sock->ops = &svc_proto_ops;
+       error = vcc_create(sock, protocol, AF_ATMSVC);
+       if (error) return error;
+-      ATM_SD(sock)->callback = svc_callback;
+       ATM_SD(sock)->local.sas_family = AF_ATMSVC;
+       ATM_SD(sock)->remote.sas_family = AF_ATMSVC;
+       return 0;
+--- linux-2.6.0-test1/net/core/dev.c   2003-07-10 18:50:32.000000000 -0700
++++ 25/net/core/dev.c  2003-07-19 17:03:51.000000000 -0700
+@@ -178,7 +178,7 @@ static struct notifier_block *netdev_cha
+  *    Device drivers call our routines to queue packets here. We empty the
+  *    queue in the local softnet handler.
+  */
+-struct softnet_data softnet_data[NR_CPUS] __cacheline_aligned;
++DEFINE_PER_CPU(struct softnet_data, softnet_data) = { 0, };
+ #ifdef CONFIG_NET_FASTROUTE
+ int netdev_fastroute;
+@@ -1280,34 +1280,35 @@ static void get_sample_stats(int cpu)
+       unsigned long rd;
+       int rq;
+ #endif
+-      int blog = softnet_data[cpu].input_pkt_queue.qlen;
+-      int avg_blog = softnet_data[cpu].avg_blog;
++      struct softnet_data *sd = &per_cpu(softnet_data, cpu);
++      int blog = sd->input_pkt_queue.qlen;
++      int avg_blog = sd->avg_blog;
+       avg_blog = (avg_blog >> 1) + (blog >> 1);
+       if (avg_blog > mod_cong) {
+               /* Above moderate congestion levels. */
+-              softnet_data[cpu].cng_level = NET_RX_CN_HIGH;
++              sd->cng_level = NET_RX_CN_HIGH;
+ #ifdef RAND_LIE
+               rd = net_random();
+               rq = rd % netdev_max_backlog;
+               if (rq < avg_blog) /* unlucky bastard */
+-                      softnet_data[cpu].cng_level = NET_RX_DROP;
++                      sd->cng_level = NET_RX_DROP;
+ #endif
+       } else if (avg_blog > lo_cong) {
+-              softnet_data[cpu].cng_level = NET_RX_CN_MOD;
++              sd->cng_level = NET_RX_CN_MOD;
+ #ifdef RAND_LIE
+               rd = net_random();
+               rq = rd % netdev_max_backlog;
+                       if (rq < avg_blog) /* unlucky bastard */
+-                              softnet_data[cpu].cng_level = NET_RX_CN_HIGH;
++                              sd->cng_level = NET_RX_CN_HIGH;
+ #endif
+       } else if (avg_blog > no_cong)
+-              softnet_data[cpu].cng_level = NET_RX_CN_LOW;
++              sd->cng_level = NET_RX_CN_LOW;
+       else  /* no congestion */
+-              softnet_data[cpu].cng_level = NET_RX_SUCCESS;
++              sd->cng_level = NET_RX_SUCCESS;
+-      softnet_data[cpu].avg_blog = avg_blog;
++      sd->avg_blog = avg_blog;
+ }
+ #ifdef OFFLINE_SAMPLE
+@@ -1357,7 +1358,7 @@ int netif_rx(struct sk_buff *skb)
+        */
+       local_irq_save(flags);
+       this_cpu = smp_processor_id();
+-      queue = &softnet_data[this_cpu];
++      queue = &__get_cpu_var(softnet_data);
+       netdev_rx_stat[this_cpu].total++;
+       if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {
+@@ -1445,14 +1446,14 @@ static __inline__ void skb_bond(struct s
+ static void net_tx_action(struct softirq_action *h)
+ {
+-      int cpu = smp_processor_id();
++      struct softnet_data *sd = &__get_cpu_var(softnet_data);
+-      if (softnet_data[cpu].completion_queue) {
++      if (sd->completion_queue) {
+               struct sk_buff *clist;
+               local_irq_disable();
+-              clist = softnet_data[cpu].completion_queue;
+-              softnet_data[cpu].completion_queue = NULL;
++              clist = sd->completion_queue;
++              sd->completion_queue = NULL;
+               local_irq_enable();
+               while (clist) {
+@@ -1464,12 +1465,12 @@ static void net_tx_action(struct softirq
+               }
+       }
+-      if (softnet_data[cpu].output_queue) {
++      if (sd->output_queue) {
+               struct net_device *head;
+               local_irq_disable();
+-              head = softnet_data[cpu].output_queue;
+-              softnet_data[cpu].output_queue = NULL;
++              head = sd->output_queue;
++              sd->output_queue = NULL;
+               local_irq_enable();
+               while (head) {
+@@ -1611,8 +1612,7 @@ static int process_backlog(struct net_de
+ {
+       int work = 0;
+       int quota = min(backlog_dev->quota, *budget);
+-      int this_cpu = smp_processor_id();
+-      struct softnet_data *queue = &softnet_data[this_cpu];
++      struct softnet_data *queue = &__get_cpu_var(softnet_data);
+       unsigned long start_time = jiffies;
+       for (;;) {
+@@ -1673,7 +1673,7 @@ job_done:
+ static void net_rx_action(struct softirq_action *h)
+ {
+       int this_cpu = smp_processor_id();
+-      struct softnet_data *queue = &softnet_data[this_cpu];
++      struct softnet_data *queue = &__get_cpu_var(softnet_data);
+       unsigned long start_time = jiffies;
+       int budget = netdev_max_backlog;
+@@ -2979,7 +2979,7 @@ static int __init net_dev_init(void)
+       for (i = 0; i < NR_CPUS; i++) {
+               struct softnet_data *queue;
+-              queue = &softnet_data[i];
++              queue = &per_cpu(softnet_data, i);
+               skb_queue_head_init(&queue->input_pkt_queue);
+               queue->throttle = 0;
+               queue->cng_level = 0;
+--- linux-2.6.0-test1/net/ipv4/ip_gre.c        2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv4/ip_gre.c       2003-07-19 17:03:51.000000000 -0700
+@@ -816,6 +816,7 @@ static int ipgre_tunnel_xmit(struct sk_b
+                       skb_set_owner_w(new_skb, skb->sk);
+               dev_kfree_skb(skb);
+               skb = new_skb;
++              old_iph = skb->nh.iph;
+       }
+       skb->nh.raw = skb_push(skb, gre_hlen);
+--- linux-2.6.0-test1/net/ipv4/ipip.c  2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv4/ipip.c 2003-07-19 17:03:51.000000000 -0700
+@@ -616,6 +616,7 @@ static int ipip_tunnel_xmit(struct sk_bu
+                       skb_set_owner_w(new_skb, skb->sk);
+               dev_kfree_skb(skb);
+               skb = new_skb;
++              old_iph = skb->nh.iph;
+       }
+       skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
+--- linux-2.6.0-test1/net/ipv4/ipvs/ip_vs_conn.c       2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/ipvs/ip_vs_conn.c      2003-07-19 17:03:51.000000000 -0700
+@@ -507,9 +507,6 @@ static void ip_vs_conn_expire(unsigned l
+        *      refcnt==1 implies I'm the only one referrer
+        */
+       if (likely(atomic_read(&cp->refcnt) == 1)) {
+-              /* make sure that there is no timer on it now */
+-              del_timer_sync(&cp->timer);
+-
+               /* does anybody control me? */
+               if (cp->control)
+                       ip_vs_control_del(cp);
+@@ -517,7 +514,6 @@ static void ip_vs_conn_expire(unsigned l
+               if (unlikely(cp->app != NULL))
+                       ip_vs_unbind_app(cp);
+               ip_vs_unbind_dest(cp);
+-              //ip_vs_timeout_detach(cp);
+               if (cp->flags & IP_VS_CONN_F_NO_CPORT)
+                       atomic_dec(&ip_vs_conn_no_cport_cnt);
+               atomic_dec(&ip_vs_conn_count);
+--- linux-2.6.0-test1/net/ipv4/ipvs/ip_vs_ctl.c        2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/ipvs/ip_vs_ctl.c       2003-07-19 17:03:51.000000000 -0700
+@@ -93,7 +93,7 @@ int ip_vs_get_debug_level(void)
+ /*
+  *    update_defense_level is called from timer bh and from sysctl.
+  */
+-void update_defense_level(void)
++static void update_defense_level(void)
+ {
+       struct sysinfo i;
+       static int old_secure_tcp = 0;
+@@ -210,6 +210,22 @@ void update_defense_level(void)
+ }
++/*
++ *    Timer for checking the defense
++ */
++static struct timer_list defense_timer;
++#define DEFENSE_TIMER_PERIOD  1*HZ
++
++static void defense_timer_handler(unsigned long data)
++{
++      update_defense_level();
++      if (atomic_read(&ip_vs_dropentry))
++              ip_vs_random_dropentry();
++
++      mod_timer(&defense_timer, jiffies + DEFENSE_TIMER_PERIOD);
++}
++
++
+ int
+ ip_vs_use_count_inc(void)
+ {
+@@ -2187,6 +2203,12 @@ int ip_vs_control_init(void)
+       ip_vs_stats.lock = SPIN_LOCK_UNLOCKED;
+       ip_vs_new_estimator(&ip_vs_stats);
++      /* Hook the defense timer */
++      init_timer(&defense_timer);
++      defense_timer.function = defense_timer_handler;
++      defense_timer.expires = jiffies + DEFENSE_TIMER_PERIOD;
++      add_timer(&defense_timer);
++
+       LeaveFunction(2);
+       return 0;
+ }
+@@ -2196,6 +2218,7 @@ void ip_vs_control_cleanup(void)
+ {
+       EnterFunction(2);
+       ip_vs_trash_cleanup();
++      del_timer_sync(&defense_timer);
+       ip_vs_kill_estimator(&ip_vs_stats);
+       unregister_sysctl_table(ipv4_vs_table.sysctl_header);
+       proc_net_remove("ip_vs_stats");
+--- linux-2.6.0-test1/net/ipv4/ipvs/ip_vs_xmit.c       2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/ipvs/ip_vs_xmit.c      2003-07-19 17:03:51.000000000 -0700
+@@ -78,7 +78,6 @@ __ip_vs_get_out_rt(struct ip_vs_conn *cp
+                                               .daddr = dest->addr,
+                                               .saddr = 0,
+                                               .tos = rtos, } },
+-                              .proto = cp->protocol,
+                       };
+                       if (ip_route_output_key(&rt, &fl)) {
+@@ -102,7 +101,6 @@ __ip_vs_get_out_rt(struct ip_vs_conn *cp
+                                       .daddr = dest->addr,
+                                       .saddr = 0,
+                                       .tos = rtos, } },
+-                      .proto = cp->protocol,
+               };
+               if (ip_route_output_key(&rt, &fl)) {
+--- linux-2.6.0-test1/net/ipv4/ipvs/Kconfig    2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/ipvs/Kconfig   2003-07-19 17:03:51.000000000 -0700
+@@ -147,7 +147,7 @@ config     IP_VS_WLC
+         unsure, say N.
+ config        IP_VS_LBLC
+-      tristate "locality-based least-connection with replication scheduling"
++      tristate "locality-based least-connection scheduling"
+         depends on IP_VS
+       ---help---
+         The locality-based least-connection scheduling algorithm is for
+@@ -163,7 +163,7 @@ config     IP_VS_LBLC
+         unsure, say N.
+ config  IP_VS_LBLCR
+-      tristate "locality-based least-connection with replication schedulin"
++      tristate "locality-based least-connection with replication scheduling"
+         depends on IP_VS
+       ---help---
+         The locality-based least-connection with replication scheduling
+--- linux-2.6.0-test1/net/ipv4/tcp_input.c     2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv4/tcp_input.c    2003-07-19 17:03:51.000000000 -0700
+@@ -2373,7 +2373,7 @@ static void tcp_fin(struct sk_buff *skb,
+       tcp_schedule_ack(tp);
+       sk->sk_shutdown |= RCV_SHUTDOWN;
+-      sock_reset_flag(sk, SOCK_DONE);
++      sock_set_flag(sk, SOCK_DONE);
+       switch (sk->sk_state) {
+               case TCP_SYN_RECV:
+--- linux-2.6.0-test1/net/ipv6/addrconf.c      2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv6/addrconf.c     2003-07-19 17:03:51.000000000 -0700
+@@ -368,7 +368,8 @@ static struct inet6_dev * ipv6_add_dev(s
+                               dev, dev->name);
+                       ndev->cnf.use_tempaddr = -1;
+               } else {
+-                      __ipv6_regen_rndid(ndev);
++                      in6_dev_hold(ndev);
++                      ipv6_regen_rndid((unsigned long) ndev);
+               }
+ #endif
+@@ -1122,9 +1123,6 @@ static int __ipv6_regen_rndid(struct ine
+       sg[1].offset = ((long) eui64 & ~PAGE_MASK);
+       sg[1].length = 8;
+-      if (!del_timer(&idev->regen_timer))
+-              in6_dev_hold(idev);
+-
+       dev = idev->dev;
+       if (ipv6_generate_eui64(eui64, dev)) {
+@@ -1137,7 +1135,6 @@ regen:
+       spin_lock(&md5_tfm_lock);
+       if (unlikely(md5_tfm == NULL)) {
+               spin_unlock(&md5_tfm_lock);
+-              in6_dev_put(idev);
+               return -1;
+       }
+       crypto_digest_init(md5_tfm);
+@@ -1170,33 +1167,41 @@ regen:
+               if ((idev->rndid[2]|idev->rndid[3]|idev->rndid[4]|idev->rndid[5]|idev->rndid[6]|idev->rndid[7]) == 0x00)
+                       goto regen;
+       }
+-      
+-      idev->regen_timer.expires = jiffies +
+-                                      idev->cnf.temp_prefered_lft * HZ - 
+-                                      idev->cnf.regen_max_retry * idev->cnf.dad_transmits * idev->nd_parms->retrans_time - desync_factor;
+-      if (time_before(idev->regen_timer.expires, jiffies)) {
+-              idev->regen_timer.expires = 0;
+-              printk(KERN_WARNING
+-                      "__ipv6_regen_rndid(): too short regeneration interval; timer disabled for %s.\n",
+-                      idev->dev->name);
+-              in6_dev_put(idev);
+-              return -1;
+-      }
+-      add_timer(&idev->regen_timer);
+       return 0;
+ }
+ static void ipv6_regen_rndid(unsigned long data)
+ {
+       struct inet6_dev *idev = (struct inet6_dev *) data;
++      unsigned long expires;
+       read_lock_bh(&addrconf_lock);
+       write_lock_bh(&idev->lock);
+-      if (!idev->dead)
+-              __ipv6_regen_rndid(idev);
++
++      if (idev->dead)
++              goto out;
++
++      if (__ipv6_regen_rndid(idev) < 0)
++              goto out;
++      
++      expires = jiffies +
++              idev->cnf.temp_prefered_lft * HZ - 
++              idev->cnf.regen_max_retry * idev->cnf.dad_transmits * idev->nd_parms->retrans_time - desync_factor;
++      if (time_before(expires, jiffies)) {
++              printk(KERN_WARNING
++                      "ipv6_regen_rndid(): too short regeneration interval; timer disabled for %s.\n",
++                      idev->dev->name);
++              goto out;
++      }
++
++      if (!mod_timer(&idev->regen_timer, expires))
++              in6_dev_hold(idev);
++
++out:
+       write_unlock_bh(&idev->lock);
+       read_unlock_bh(&addrconf_lock);
++      in6_dev_put(idev);
+ }
+ static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr) {
+@@ -1928,6 +1933,27 @@ static int addrconf_ifdown(struct net_de
+       /* Step 3: clear address list */
+       write_lock_bh(&idev->lock);
++#ifdef CONFIG_IPV6_PRIVACY
++      if (how == 1 && del_timer(&idev->regen_timer))
++              in6_dev_put(idev);
++
++      /* clear tempaddr list */
++      while ((ifa = idev->tempaddr_list) != NULL) {
++              idev->tempaddr_list = ifa->tmp_next;
++              ifa->tmp_next = NULL;
++              ifa->dead = 1;
++              write_unlock_bh(&idev->lock);
++              spin_lock_bh(&ifa->lock);
++
++              if (ifa->ifpub) {
++                      in6_ifa_put(ifa->ifpub);
++                      ifa->ifpub = NULL;
++              }
++              spin_unlock_bh(&ifa->lock);
++              in6_ifa_put(ifa);
++              write_lock_bh(&idev->lock);
++      }
++#endif
+       while ((ifa = idev->addr_list) != NULL) {
+               idev->addr_list = ifa->if_next;
+               ifa->if_next = NULL;
+--- linux-2.6.0-test1/net/ipv6/ah6.c   2003-06-16 22:32:21.000000000 -0700
++++ 25/net/ipv6/ah6.c  2003-07-19 17:03:51.000000000 -0700
+@@ -19,7 +19,7 @@
+  *
+  *    Mitsuru KANDA @USAGI       : IPv6 Support 
+  *    Kazunori MIYAZAWA @USAGI   :
+- *    Kunihiro Ishiguro          :
++ *    Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *    
+  *    This file is derived from net/ipv4/ah.c.
+  */
+--- linux-2.6.0-test1/net/ipv6/esp6.c  2003-06-14 12:18:24.000000000 -0700
++++ 25/net/ipv6/esp6.c 2003-07-19 17:03:51.000000000 -0700
+@@ -19,7 +19,7 @@
+  *
+  *    Mitsuru KANDA @USAGI       : IPv6 Support 
+  *    Kazunori MIYAZAWA @USAGI   :
+- *    Kunihiro Ishiguro          :
++ *    Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *    
+  *    This file is derived from net/ipv4/esp.c
+  */
+--- linux-2.6.0-test1/net/ipv6/route.c 2003-07-13 21:44:35.000000000 -0700
++++ 25/net/ipv6/route.c        2003-07-19 17:03:51.000000000 -0700
+@@ -567,6 +567,11 @@ struct dst_entry *ndisc_dst_alloc(struct
+       if (unlikely(rt == NULL))
+               goto out;
++      if (dev)
++              dev_hold(dev);
++      if (neigh)
++              neigh_hold(neigh);
++
+       rt->rt6i_dev      = dev;
+       rt->rt6i_nexthop  = neigh;
+       rt->rt6i_expires  = 0;
+--- linux-2.6.0-test1/net/ipv6/sit.c   2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv6/sit.c  2003-07-19 17:03:51.000000000 -0700
+@@ -550,6 +550,7 @@ static int ipip6_tunnel_xmit(struct sk_b
+                       skb_set_owner_w(new_skb, skb->sk);
+               dev_kfree_skb(skb);
+               skb = new_skb;
++              iph6 = skb->nh.ipv6h;
+       }
+       skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
+--- linux-2.6.0-test1/net/ipv6/tcp_ipv6.c      2003-07-10 18:50:32.000000000 -0700
++++ 25/net/ipv6/tcp_ipv6.c     2003-07-19 17:03:51.000000000 -0700
+@@ -579,7 +579,7 @@ static int tcp_v6_connect(struct sock *s
+       addr_type = ipv6_addr_type(&usin->sin6_addr);
+-      if(addr_type & IPV6_ADDR_MULTICAST)
++      if (addr_type & (IPV6_ADDR_ANYCAST | IPV6_ADDR_MULTICAST))
+               return -ENETUNREACH;
+       if (addr_type&IPV6_ADDR_LINKLOCAL) {
+@@ -967,12 +967,14 @@ static void tcp_v6_send_reset(struct sk_
+       struct tcphdr *th = skb->h.th, *t1; 
+       struct sk_buff *buff;
+       struct flowi fl;
++      int daddr_type;
+       if (th->rst)
+               return;
+-      if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr))
+-              return; 
++      daddr_type = ipv6_addr_type(&skb->nh.ipv6h->daddr);
++      if (daddr_type & (IPV6_ADDR_ANYCAST | IPV6_ADDR_MULTICAST))
++              return;
+       /*
+        * We need to grab some memory, and put together an RST,
+@@ -1171,13 +1173,14 @@ static int tcp_v6_conn_request(struct so
+       struct tcp_opt tmptp, *tp = tcp_sk(sk);
+       struct open_request *req = NULL;
+       __u32 isn = TCP_SKB_CB(skb)->when;
++      int daddr_type;
+       if (skb->protocol == htons(ETH_P_IP))
+               return tcp_v4_conn_request(sk, skb);
+-      /* FIXME: do the same check for anycast */
+-      if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr))
+-              goto drop; 
++      daddr_type = ipv6_addr_type(&skb->nh.ipv6h->daddr);
++      if (daddr_type & (IPV6_ADDR_ANYCAST | IPV6_ADDR_MULTICAST))
++              goto drop;
+       /*
+        *      There are no SYN attacks on IPv6, yet...        
+--- linux-2.6.0-test1/net/ipv6/xfrm6_input.c   2003-07-02 14:53:18.000000000 -0700
++++ 25/net/ipv6/xfrm6_input.c  2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Authors:
+  *    Mitsuru KANDA @USAGI
+  *    Kazunori MIYAZAWA @USAGI
+- *    Kunihiro Ishiguro
++ *    Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *    YOSHIFUJI Hideaki @USAGI
+  *            IPv6 support
+  */
+--- linux-2.6.0-test1/net/ipv6/xfrm6_policy.c  2003-06-22 12:04:45.000000000 -0700
++++ 25/net/ipv6/xfrm6_policy.c 2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Authors:
+  *    Mitsuru KANDA @USAGI
+  *    Kazunori MIYAZAWA @USAGI
+- *    Kunihiro Ishiguro
++ *    Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *            IPv6 support
+  *    YOSHIFUJI Hideaki
+  *            Split up af-specific portion
+--- linux-2.6.0-test1/net/ipv6/xfrm6_state.c   2003-06-14 12:18:08.000000000 -0700
++++ 25/net/ipv6/xfrm6_state.c  2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Authors:
+  *    Mitsuru KANDA @USAGI
+  *    Kazunori MIYAZAWA @USAGI
+- *    Kunihiro Ishiguro
++ *    Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *            IPv6 support
+  *    YOSHIFUJI Hideaki @USAGI
+  *            Split up af-specific portion
+--- linux-2.6.0-test1/net/netsyms.c    2003-07-13 21:44:35.000000000 -0700
++++ 25/net/netsyms.c   2003-07-19 17:03:51.000000000 -0700
+@@ -685,7 +685,7 @@ EXPORT_SYMBOL(ip_route_me_harder);
+ EXPORT_SYMBOL(register_gifconf);
+-EXPORT_SYMBOL(softnet_data);
++EXPORT_PER_CPU_SYMBOL(softnet_data);
+ #ifdef CONFIG_NET_RADIO
+ #include <net/iw_handler.h>           /* Wireless Extensions driver API */
+--- linux-2.6.0-test1/net/sunrpc/auth_gss/auth_gss.c   2003-06-14 12:18:09.000000000 -0700
++++ 25/net/sunrpc/auth_gss/auth_gss.c  2003-07-19 17:03:51.000000000 -0700
+@@ -235,7 +235,7 @@ gss_parse_init_downcall(struct gss_api_m
+               goto err;
+       }
+       ctx->gc_proc = RPC_GSS_PROC_DATA;
+-      ctx->gc_seq = 0;
++      ctx->gc_seq = 1;        /* NetApp 6.4R1 doesn't accept seq. no. 0 */
+       spin_lock_init(&ctx->gc_seq_lock);
+       atomic_set(&ctx->count,1);
+--- linux-2.6.0-test1/net/sunrpc/clnt.c        2003-06-14 12:18:07.000000000 -0700
++++ 25/net/sunrpc/clnt.c       2003-07-19 17:07:18.000000000 -0700
+@@ -385,7 +385,8 @@ rpc_setbufsize(struct rpc_clnt *clnt, un
+       xprt->rcvsize = 0;
+       if (rcvsize)
+               xprt->rcvsize = rcvsize + RPC_SLACK_SPACE;
+-      xprt_sock_setbufsize(xprt);
++      if (xprt_connected(xprt))
++              xprt_sock_setbufsize(xprt);
+ }
+ /*
+@@ -743,14 +744,14 @@ call_timeout(struct rpc_task *task)
+       dprintk("RPC: %4d call_timeout (major)\n", task->tk_pid);
+       if (clnt->cl_softrtry) {
+-              if (clnt->cl_chatty && !task->tk_exit)
++              if (clnt->cl_chatty)
+                       printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
+                               clnt->cl_protname, clnt->cl_server);
+               rpc_exit(task, -EIO);
+               return;
+       }
+-      if (clnt->cl_chatty && !(task->tk_flags & RPC_CALL_MAJORSEEN) && rpc_ntimeo(&clnt->cl_rtt) > 7) {
++      if (clnt->cl_chatty && !(task->tk_flags & RPC_CALL_MAJORSEEN)) {
+               task->tk_flags |= RPC_CALL_MAJORSEEN;
+               printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
+                       clnt->cl_protname, clnt->cl_server);
+--- linux-2.6.0-test1/net/sunrpc/xprt.c        2003-06-14 12:18:25.000000000 -0700
++++ 25/net/sunrpc/xprt.c       2003-07-19 17:07:18.000000000 -0700
+@@ -436,6 +436,7 @@ xprt_connect(struct rpc_task *task)
+               goto out_write;
+       }
+       xprt_bind_socket(xprt, sock);
++      xprt_sock_setbufsize(xprt);
+       if (!xprt->stream)
+               goto out_write;
+@@ -1041,21 +1042,6 @@ out:
+ }
+ /*
+- * Exponential backoff for UDP retries
+- */
+-static inline int
+-xprt_expbackoff(struct rpc_task *task, struct rpc_rqst *req)
+-{
+-      int backoff;
+-
+-      req->rq_ntimeo++;
+-      backoff = min(rpc_ntimeo(&task->tk_client->cl_rtt), XPRT_MAX_BACKOFF);
+-      if (req->rq_ntimeo < (1 << backoff))
+-              return 1;
+-      return 0;
+-}
+-
+-/*
+  * RPC receive timeout handler.
+  */
+ static void
+@@ -1068,14 +1054,7 @@ xprt_timer(struct rpc_task *task)
+       if (req->rq_received)
+               goto out;
+-      if (!xprt->nocong) {
+-              if (xprt_expbackoff(task, req)) {
+-                      rpc_add_timer(task, xprt_timer);
+-                      goto out_unlock;
+-              }
+-              rpc_inc_timeo(&task->tk_client->cl_rtt);
+-              xprt_adjust_cwnd(req->rq_xprt, -ETIMEDOUT);
+-      }
++      xprt_adjust_cwnd(req->rq_xprt, -ETIMEDOUT);
+       req->rq_nresend++;
+       dprintk("RPC: %4d xprt_timer (%s request)\n",
+@@ -1085,7 +1064,6 @@ xprt_timer(struct rpc_task *task)
+ out:
+       task->tk_timeout = 0;
+       rpc_wake_up_task(task);
+-out_unlock:
+       spin_unlock(&xprt->sock_lock);
+ }
+@@ -1221,16 +1199,17 @@ xprt_transmit(struct rpc_task *task)
+       return;
+  out_receive:
+       dprintk("RPC: %4d xmit complete\n", task->tk_pid);
++      spin_lock_bh(&xprt->sock_lock);
+       /* Set the task's receive timeout value */
+       if (!xprt->nocong) {
+               task->tk_timeout = rpc_calc_rto(&clnt->cl_rtt,
+                               task->tk_msg.rpc_proc->p_timer);
+-              req->rq_ntimeo = 0;
++              task->tk_timeout <<= clnt->cl_timeout.to_retries
++                      - req->rq_timeout.to_retries;
+               if (task->tk_timeout > req->rq_timeout.to_maxval)
+                       task->tk_timeout = req->rq_timeout.to_maxval;
+       } else
+               task->tk_timeout = req->rq_timeout.to_current;
+-      spin_lock_bh(&xprt->sock_lock);
+       /* Don't race with disconnect */
+       if (!xprt_connected(xprt))
+               task->tk_status = -ENOTCONN;
+--- linux-2.6.0-test1/net/wanrouter/wanmain.c  2003-07-10 18:50:32.000000000 -0700
++++ 25/net/wanrouter/wanmain.c 2003-07-19 17:03:51.000000000 -0700
+@@ -668,7 +668,7 @@ static int wanrouter_device_stat(struct 
+ static int wanrouter_device_new_if(struct wan_device *wandev,
+                                  wanif_conf_t *u_conf)
+ {
+-      wanif_conf_t conf;
++      wanif_conf_t *cnf;
+       struct net_device *dev = NULL;
+ #ifdef CONFIG_WANPIPE_MULTPPP
+       struct ppp_device *pppdev=NULL;
+@@ -678,38 +678,47 @@ static int wanrouter_device_new_if(struc
+       if ((wandev->state == WAN_UNCONFIGURED) || (wandev->new_if == NULL))
+               return -ENODEV;
+-      if (copy_from_user(&conf, u_conf, sizeof(wanif_conf_t)))
+-              return -EFAULT;
+-
+-      if (conf.magic != ROUTER_MAGIC)
+-              return -EINVAL;
++      cnf = kmalloc(sizeof(wanif_conf_t), GFP_KERNEL);
++      if (!cnf)
++              return -ENOBUFS;
++
++      err = -EFAULT;
++      if (copy_from_user(cnf, u_conf, sizeof(wanif_conf_t)))
++              goto out;
++
++      err = -EINVAL;
++      if (cnf->magic != ROUTER_MAGIC)
++              goto out;
+-      if (conf.config_id == WANCONFIG_MPPP) {
++      if (cnf->config_id == WANCONFIG_MPPP) {
+ #ifdef CONFIG_WANPIPE_MULTPPP
+               pppdev = kmalloc(sizeof(struct ppp_device), GFP_KERNEL);
++              err = -ENOBUFS;
+               if (pppdev == NULL)
+-                      return -ENOBUFS;
++                      goto out;
+               memset(pppdev, 0, sizeof(struct ppp_device));
+               pppdev->dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
+               if (pppdev->dev == NULL) {
+                       kfree(pppdev);
+-                      return -ENOBUFS;
++                      err = -ENOBUFS;
++                      goto out;
+               }
+               memset(pppdev->dev, 0, sizeof(struct net_device));
+-              err = wandev->new_if(wandev,
+-                                   (struct net_device *)pppdev, &conf);
++              err = wandev->new_if(wandev, (struct net_device *)pppdev, cnf);
+               dev = pppdev->dev;
+ #else
+               printk(KERN_INFO "%s: Wanpipe Mulit-Port PPP support has not been compiled in!\n",
+                               wandev->name);
+-              return -EPROTONOSUPPORT;
++              err = -EPROTONOSUPPORT;
++              goto out;
+ #endif
+       } else {
+               dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
++              err = -ENOBUFS;
+               if (dev == NULL)
+-                      return -ENOBUFS;
++                      goto out;
+               memset(dev, 0, sizeof(struct net_device));
+-              err = wandev->new_if(wandev, dev, &conf);
++              err = wandev->new_if(wandev, dev, cnf);
+       }
+       if (!err) {
+@@ -748,7 +757,8 @@ static int wanrouter_device_new_if(struc
+                               ++wandev->ndev;
+                               unlock_adapter_irq(&wandev->lock, &smp_flags);
+-                              return 0;       /* done !!! */
++                              err = 0;        /* done !!! */
++                              goto out;
+                       }
+               }
+               if (wandev->del_if)
+@@ -761,18 +771,19 @@ static int wanrouter_device_new_if(struc
+               dev->priv = NULL;
+       }
+-
+ #ifdef CONFIG_WANPIPE_MULTPPP
+-      if (conf.config_id == WANCONFIG_MPPP)
++      if (cnf->config_id == WANCONFIG_MPPP)
+               kfree(pppdev);
+       else
+               kfree(dev);
+ #else
+       /* Sync PPP is disabled */
+-      if (conf.config_id != WANCONFIG_MPPP)
++      if (cnf->config_id != WANCONFIG_MPPP)
+               kfree(dev);
+ #endif
++out:
++      kfree(cnf);
+       return err;
+ }
+--- linux-2.6.0-test1/net/xfrm/xfrm_policy.c   2003-07-13 21:44:35.000000000 -0700
++++ 25/net/xfrm/xfrm_policy.c  2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Changes:
+  *    Mitsuru KANDA @USAGI
+  *    Kazunori MIYAZAWA @USAGI
+- *    Kunihiro Ishiguro
++ *    Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *            IPv6 support
+  *    Kazunori MIYAZAWA @USAGI
+  *    YOSHIFUJI Hideaki
+--- linux-2.6.0-test1/net/xfrm/xfrm_state.c    2003-07-10 18:50:32.000000000 -0700
++++ 25/net/xfrm/xfrm_state.c   2003-07-19 17:03:51.000000000 -0700
+@@ -4,7 +4,7 @@
+  * Changes:
+  *    Mitsuru KANDA @USAGI
+  *    Kazunori MIYAZAWA @USAGI
+- *    Kunihiro Ishiguro
++ *    Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *            IPv6 support
+  *    YOSHIFUJI Hideaki @USAGI
+  *            Split up af-specific functions
+--- linux-2.6.0-test1/net/xfrm/xfrm_user.c     2003-07-10 18:50:32.000000000 -0700
++++ 25/net/xfrm/xfrm_user.c    2003-07-19 17:03:51.000000000 -0700
+@@ -5,7 +5,7 @@
+  * Changes:
+  *    Mitsuru KANDA @USAGI
+  *    Kazunori MIYAZAWA @USAGI
+- *    Kunihiro Ishiguro
++ *    Kunihiro Ishiguro <kunihiro@ipinfusion.com>
+  *            IPv6 support
+  *    
+  */
+--- linux-2.6.0-test1/scripts/ver_linux        2003-07-10 18:50:32.000000000 -0700
++++ 25/scripts/ver_linux       2003-07-19 17:03:51.000000000 -0700
+@@ -54,11 +54,14 @@ pppd --version 2>&1| grep version | awk 
+ isdnctrl 2>&1 | grep version | awk \
+ 'NR==1{print "isdn4k-utils          ", $NF}'
++showmount --version 2>&1 | grep nfs-utils | awk \
++'NR==1{print "nfs-utils             ", $NF}'
++
+ ls -l `ldd /bin/sh | awk '/libc/{print $3}'` | sed \
+ -e 's/\.so$//' | awk -F'[.-]'   '{print "Linux C Library        " \
+ $(NF-2)"."$(NF-1)"."$NF}'
+-ldd -v > /dev/null 2>&1 && ldd -v || ldd --version |head -1 | awk \
++ldd -v > /dev/null 2>&1 && ldd -v || ldd --version |head -n 1 | awk \
+ 'NR==1{print "Dynamic linker (ldd)  ", $NF}'
+ ls -l /usr/lib/lib{g,stdc}++.so  2>/dev/null | awk -F. \
+--- linux-2.6.0-test1/security/Kconfig 2003-06-14 12:18:25.000000000 -0700
++++ 25/security/Kconfig        2003-07-19 17:04:47.000000000 -0700
+@@ -44,5 +44,7 @@ config SECURITY_ROOTPLUG
+         
+         If you are unsure how to answer this question, answer N.
++source security/selinux/Kconfig
++
+ endmenu
+--- linux-2.6.0-test1/security/Makefile        2003-06-14 12:18:28.000000000 -0700
++++ 25/security/Makefile       2003-07-19 17:04:47.000000000 -0700
+@@ -2,6 +2,8 @@
+ # Makefile for the kernel security code
+ #
++subdir-$(CONFIG_SECURITY_SELINUX)     += selinux
++
+ # if we don't select a security model, use the default capabilities
+ ifneq ($(CONFIG_SECURITY),y)
+ obj-y         += capability.o
+@@ -9,5 +11,9 @@ endif
+ # Object file lists
+ obj-$(CONFIG_SECURITY)                        += security.o dummy.o
++# Must precede capability.o in order to stack properly.
++ifeq ($(CONFIG_SECURITY_SELINUX),y)
++      obj-$(CONFIG_SECURITY_SELINUX)  += selinux/built-in.o
++endif
+ obj-$(CONFIG_SECURITY_CAPABILITIES)   += capability.o
+ obj-$(CONFIG_SECURITY_ROOTPLUG)               += root_plug.o
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/avc.c  2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,1115 @@
++/*
++ * Implementation of the kernel access vector cache (AVC).
++ *
++ * Authors:  Stephen Smalley, <sds@epoch.ncsc.mil>
++ *           James Morris <jmorris@redhat.com>
++ *
++ * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
++ *
++ *    This program is free software; you can redistribute it and/or modify
++ *    it under the terms of the GNU General Public License version 2,
++ *      as published by the Free Software Foundation.
++ */
++#include <linux/types.h>
++#include <linux/stddef.h>
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/fs.h>
++#include <linux/dcache.h>
++#include <linux/skbuff.h>
++#include <net/sock.h>
++#include <linux/un.h>
++#include <net/af_unix.h>
++#include <linux/ip.h>
++#include <linux/udp.h>
++#include <linux/tcp.h>
++#include "avc.h"
++#include "avc_ss.h"
++#include "class_to_string.h"
++#include "common_perm_to_string.h"
++#include "av_inherit.h"
++#include "av_perm_to_string.h"
++#include "objsec.h"
++
++#define AVC_CACHE_SLOTS               512
++#define AVC_CACHE_MAXNODES    410
++
++struct avc_entry {
++      u32                     ssid;
++      u32                     tsid;
++      u16                     tclass;
++      struct av_decision      avd;
++      int                     used;   /* used recently */
++};
++
++struct avc_node {
++      struct avc_entry        ae;
++      struct avc_node         *next;
++};
++
++struct avc_cache {
++      struct avc_node *slots[AVC_CACHE_SLOTS];
++      u32             lru_hint;       /* LRU hint for reclaim scan */
++      u32             active_nodes;
++      u32             latest_notif;   /* latest revocation notification */
++};
++
++struct avc_callback_node {
++      int (*callback) (u32 event, u32 ssid, u32 tsid,
++                       u16 tclass, u32 perms,
++                       u32 *out_retained);
++      u32 events;
++      u32 ssid;
++      u32 tsid;
++      u16 tclass;
++      u32 perms;
++      struct avc_callback_node *next;
++};
++
++static spinlock_t avc_lock = SPIN_LOCK_UNLOCKED;
++static spinlock_t avc_log_lock = SPIN_LOCK_UNLOCKED;
++static struct avc_node *avc_node_freelist = NULL;
++static struct avc_cache avc_cache;
++static char *avc_audit_buffer = NULL;
++static unsigned avc_cache_stats[AVC_NSTATS];
++static struct avc_callback_node *avc_callbacks = NULL;
++static unsigned int avc_log_level = 4; /* default:  KERN_WARNING */
++static char avc_level_string[4] = "< >";
++
++static inline int avc_hash(u32 ssid, u32 tsid, u16 tclass)
++{
++      return (ssid ^ (tsid<<2) ^ (tclass<<4)) & (AVC_CACHE_SLOTS - 1);
++}
++
++/**
++ * avc_dump_av - Display an access vector in human-readable form.
++ * @tclass: target security class
++ * @av: access vector
++ */
++void avc_dump_av(u16 tclass, u32 av)
++{
++      char **common_pts = 0;
++      u32 common_base = 0;
++      int i, i2, perm;
++
++      if (av == 0) {
++              printk(" null");
++              return;
++      }
++
++      for (i = 0; i < ARRAY_SIZE(av_inherit); i++) {
++              if (av_inherit[i].tclass == tclass) {
++                      common_pts = av_inherit[i].common_pts;
++                      common_base = av_inherit[i].common_base;
++                      break;
++              }
++      }
++
++      printk(" {");
++      i = 0;
++      perm = 1;
++      while (perm < common_base) {
++              if (perm & av)
++                      printk(" %s", common_pts[i]);
++              i++;
++              perm <<= 1;
++      }
++
++      while (i < sizeof(av) * 8) {
++              if (perm & av) {
++                      for (i2 = 0; i2 < ARRAY_SIZE(av_perm_to_string); i2++) {
++                              if ((av_perm_to_string[i2].tclass == tclass) &&
++                                  (av_perm_to_string[i2].value == perm))
++                                      break;
++                      }
++                      if (i2 < ARRAY_SIZE(av_perm_to_string))
++                              printk(" %s", av_perm_to_string[i2].name);
++              }
++              i++;
++              perm <<= 1;
++      }
++
++      printk(" }");
++}
++
++/**
++ * avc_dump_query - Display a SID pair and a class in human-readable form.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ */
++void avc_dump_query(u32 ssid, u32 tsid, u16 tclass)
++{
++      int rc;
++      char *scontext;
++      u32 scontext_len;
++
++      rc = security_sid_to_context(ssid, &scontext, &scontext_len);
++      if (rc)
++              printk("ssid=%d", ssid);
++      else {
++              printk("scontext=%s", scontext);
++              kfree(scontext);
++      }
++
++      rc = security_sid_to_context(tsid, &scontext, &scontext_len);
++      if (rc)
++              printk(" tsid=%d", tsid);
++      else {
++              printk(" tcontext=%s", scontext);
++              kfree(scontext);
++      }
++      printk(" tclass=%s", class_to_string[tclass]);
++}
++
++/**
++ * avc_init - Initialize the AVC.
++ *
++ * Initialize the access vector cache.
++ */
++void avc_init(void)
++{
++      struct avc_node *new;
++      int i;
++
++      for (i = 0; i < AVC_NSTATS; i++)
++              avc_cache_stats[i] = 0;
++
++      for (i = 0; i < AVC_CACHE_SLOTS; i++)
++              avc_cache.slots[i] = 0;
++      avc_cache.lru_hint = 0;
++      avc_cache.active_nodes = 0;
++      avc_cache.latest_notif = 0;
++
++      for (i = 0; i < AVC_CACHE_MAXNODES; i++) {
++              new = kmalloc(sizeof(*new), GFP_ATOMIC);
++              if (!new) {
++                      printk(KERN_WARNING "avc:  only able to allocate "
++                             "%d entries\n", i);
++                      break;
++              }
++              memset(new, 0, sizeof(*new));
++              new->next = avc_node_freelist;
++              avc_node_freelist = new;
++      }
++
++      avc_audit_buffer = (char *)__get_free_page(GFP_ATOMIC);
++      if (!avc_audit_buffer)
++              panic("AVC:  unable to allocate audit buffer\n");
++
++      avc_level_string[1] = '0' + avc_log_level;
++}
++
++#if 0
++static void avc_hash_eval(char *tag)
++{
++      int i, chain_len, max_chain_len, slots_used;
++      struct avc_node *node;
++      unsigned long flags;
++
++      spin_lock_irqsave(&avc_lock,flags);
++
++      slots_used = 0;
++      max_chain_len = 0;
++      for (i = 0; i < AVC_CACHE_SLOTS; i++) {
++              node = avc_cache.slots[i];
++              if (node) {
++                      slots_used++;
++                      chain_len = 0;
++                      while (node) {
++                              chain_len++;
++                              node = node->next;
++                      }
++                      if (chain_len > max_chain_len)
++                              max_chain_len = chain_len;
++              }
++      }
++
++      spin_unlock_irqrestore(&avc_lock,flags);
++
++      printk(KERN_INFO "\n");
++      printk(KERN_INFO "%s avc:  %d entries and %d/%d buckets used, longest "
++             "chain length %d\n", tag, avc_cache.active_nodes, slots_used,
++             AVC_CACHE_SLOTS, max_chain_len);
++}
++#else
++static inline void avc_hash_eval(char *tag)
++{ }
++#endif
++
++static inline struct avc_node *avc_reclaim_node(void)
++{
++      struct avc_node *prev, *cur;
++      int hvalue, try;
++
++      hvalue = avc_cache.lru_hint;
++      for (try = 0; try < 2; try++) {
++              do {
++                      prev = NULL;
++                      cur = avc_cache.slots[hvalue];
++                      while (cur) {
++                              if (!cur->ae.used)
++                                      goto found;
++
++                              cur->ae.used = 0;
++
++                              prev = cur;
++                              cur = cur->next;
++                      }
++                      hvalue = (hvalue + 1) & (AVC_CACHE_SLOTS - 1);
++              } while (hvalue != avc_cache.lru_hint);
++      }
++
++      panic("avc_reclaim_node");
++
++found:
++      avc_cache.lru_hint = hvalue;
++
++      if (prev == NULL)
++              avc_cache.slots[hvalue] = cur->next;
++      else
++              prev->next = cur->next;
++
++      return cur;
++}
++
++static inline struct avc_node *avc_claim_node(u32 ssid,
++                                              u32 tsid, u16 tclass)
++{
++      struct avc_node *new;
++      int hvalue;
++
++      hvalue = avc_hash(ssid, tsid, tclass);
++      if (avc_node_freelist) {
++              new = avc_node_freelist;
++              avc_node_freelist = avc_node_freelist->next;
++              avc_cache.active_nodes++;
++      } else {
++              new = avc_reclaim_node();
++              if (!new)
++                      goto out;
++      }
++
++      new->ae.used = 1;
++      new->ae.ssid = ssid;
++      new->ae.tsid = tsid;
++      new->ae.tclass = tclass;
++      new->next = avc_cache.slots[hvalue];
++      avc_cache.slots[hvalue] = new;
++
++out:
++      return new;
++}
++
++static inline struct avc_node *avc_search_node(u32 ssid, u32 tsid,
++                                               u16 tclass, int *probes)
++{
++      struct avc_node *cur;
++      int hvalue;
++      int tprobes = 1;
++
++      hvalue = avc_hash(ssid, tsid, tclass);
++      cur = avc_cache.slots[hvalue];
++      while (cur != NULL &&
++             (ssid != cur->ae.ssid ||
++              tclass != cur->ae.tclass ||
++              tsid != cur->ae.tsid)) {
++              tprobes++;
++              cur = cur->next;
++      }
++
++      if (cur == NULL) {
++              /* cache miss */
++              goto out;
++      }
++
++      /* cache hit */
++      if (probes)
++              *probes = tprobes;
++
++      cur->ae.used = 1;
++
++out:
++      return cur;
++}
++
++/**
++ * avc_lookup - Look up an AVC entry.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions, interpreted based on @tclass
++ * @aeref:  AVC entry reference
++ *
++ * Look up an AVC entry that is valid for the
++ * @requested permissions between the SID pair
++ * (@ssid, @tsid), interpreting the permissions
++ * based on @tclass.  If a valid AVC entry exists,
++ * then this function updates @aeref to refer to the
++ * entry and returns %0. Otherwise, this function
++ * returns -%ENOENT.
++ */
++int avc_lookup(u32 ssid, u32 tsid, u16 tclass,
++               u32 requested, struct avc_entry_ref *aeref)
++{
++      struct avc_node *node;
++      int probes, rc = 0;
++
++      avc_cache_stats_incr(AVC_CAV_LOOKUPS);
++      node = avc_search_node(ssid, tsid, tclass,&probes);
++
++      if (node && ((node->ae.avd.decided & requested) == requested)) {
++              avc_cache_stats_incr(AVC_CAV_HITS);
++              avc_cache_stats_add(AVC_CAV_PROBES,probes);
++              aeref->ae = &node->ae;
++              goto out;
++      }
++
++      avc_cache_stats_incr(AVC_CAV_MISSES);
++      rc = -ENOENT;
++out:
++      return rc;
++}
++
++/**
++ * avc_insert - Insert an AVC entry.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @ae: AVC entry
++ * @aeref:  AVC entry reference
++ *
++ * Insert an AVC entry for the SID pair
++ * (@ssid, @tsid) and class @tclass.
++ * The access vectors and the sequence number are
++ * normally provided by the security server in
++ * response to a security_compute_av() call.  If the
++ * sequence number @ae->avd.seqno is not less than the latest
++ * revocation notification, then the function copies
++ * the access vectors into a cache entry, updates
++ * @aeref to refer to the entry, and returns %0.
++ * Otherwise, this function returns -%EAGAIN.
++ */
++int avc_insert(u32 ssid, u32 tsid, u16 tclass,
++               struct avc_entry *ae, struct avc_entry_ref *aeref)
++{
++      struct avc_node *node;
++      int rc = 0;
++
++      if (ae->avd.seqno < avc_cache.latest_notif) {
++              printk(KERN_WARNING "avc:  seqno %d < latest_notif %d\n",
++                     ae->avd.seqno, avc_cache.latest_notif);
++              rc = -EAGAIN;
++              goto out;
++      }
++
++      node = avc_claim_node(ssid, tsid, tclass);
++      if (!node) {
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      node->ae.avd.allowed = ae->avd.allowed;
++      node->ae.avd.decided = ae->avd.decided;
++      node->ae.avd.auditallow = ae->avd.auditallow;
++      node->ae.avd.auditdeny = ae->avd.auditdeny;
++      node->ae.avd.seqno = ae->avd.seqno;
++      aeref->ae = &node->ae;
++out:
++      return rc;
++}
++
++static inline void avc_print_ipv4_addr(u32 addr, u16 port, char *name1, char *name2)
++{
++      if (addr)
++              printk(" %s=%d.%d.%d.%d", name1, NIPQUAD(addr));
++      if (port)
++              printk(" %s=%d", name2, ntohs(port));
++}
++
++/*
++ * Copied from net/core/utils.c:net_ratelimit and modified for
++ * use by the AVC audit facility.
++ */
++#define AVC_MSG_COST  5*HZ
++#define AVC_MSG_BURST 10*5*HZ
++
++/*
++ * This enforces a rate limit: not more than one kernel message
++ * every 5secs to make a denial-of-service attack impossible.
++ */
++static int avc_ratelimit(void)
++{
++      static spinlock_t ratelimit_lock = SPIN_LOCK_UNLOCKED;
++      static unsigned long toks = 10*5*HZ;
++      static unsigned long last_msg;
++      static int missed, rc = 0;
++      unsigned long flags;
++      unsigned long now = jiffies;
++
++      spin_lock_irqsave(&ratelimit_lock, flags);
++      toks += now - last_msg;
++      last_msg = now;
++      if (toks > AVC_MSG_BURST)
++              toks = AVC_MSG_BURST;
++      if (toks >= AVC_MSG_COST) {
++              int lost = missed;
++              missed = 0;
++              toks -= AVC_MSG_COST;
++              spin_unlock_irqrestore(&ratelimit_lock, flags);
++              if (lost)
++                      printk(KERN_WARNING "AVC: %d messages suppressed.\n",
++                             lost);
++              rc = 1;
++              goto out;
++      }
++      missed++;
++      spin_unlock_irqrestore(&ratelimit_lock, flags);
++out:
++      return rc;
++}
++
++static inline int check_avc_ratelimit(void)
++{
++      if (selinux_enforcing)
++              return avc_ratelimit();
++      else {
++              /* If permissive, then never suppress messages. */
++              return 1;
++      }
++}
++
++/**
++ * avc_audit - Audit the granting or denial of permissions.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions
++ * @avd: access vector decisions
++ * @result: result from avc_has_perm_noaudit
++ * @a:  auxiliary audit data
++ *
++ * Audit the granting or denial of permissions in accordance
++ * with the policy.  This function is typically called by
++ * avc_has_perm() after a permission check, but can also be
++ * called directly by callers who use avc_has_perm_noaudit()
++ * in order to separate the permission check from the auditing.
++ * For example, this separation is useful when the permission check must
++ * be performed under a lock, to allow the lock to be released
++ * before calling the auditing code.
++ */
++void avc_audit(u32 ssid, u32 tsid,
++               u16 tclass, u32 requested,
++               struct av_decision *avd, int result, struct avc_audit_data *a)
++{
++      struct task_struct *tsk = current;
++      struct inode *inode = NULL;
++      char *p;
++      u32 denied, audited;
++
++      denied = requested & ~avd->allowed;
++      if (denied) {
++              audited = denied;
++              if (!(audited & avd->auditdeny))
++                      return;
++      } else if (result) {
++              audited = denied = requested;
++        } else {
++              audited = requested;
++              if (!(audited & avd->auditallow))
++                      return;
++      }
++
++      if (!check_avc_ratelimit())
++              return;
++
++      /* prevent overlapping printks */
++      spin_lock_irq(&avc_log_lock);
++
++      printk("%s\n", avc_level_string);
++      printk("%savc:  %s ", avc_level_string, denied ? "denied" : "granted");
++      avc_dump_av(tclass,audited);
++      printk(" for ");
++      if (a && a->tsk)
++              tsk = a->tsk;
++      if (tsk && tsk->pid) {
++              struct mm_struct *mm;
++              struct vm_area_struct *vma;
++              printk(" pid=%d", tsk->pid);
++              if (tsk == current)
++                      mm = current->mm;
++              else
++                      mm = get_task_mm(tsk);
++              if (mm) {
++                      if (down_read_trylock(&mm->mmap_sem)) {
++                              vma = mm->mmap;
++                              while (vma) {
++                                      if ((vma->vm_flags & VM_EXECUTABLE) &&
++                                          vma->vm_file) {
++                                              p = d_path(vma->vm_file->f_dentry,
++                                                         vma->vm_file->f_vfsmnt,
++                                                         avc_audit_buffer,
++                                                         PAGE_SIZE);
++                                              printk(" exe=%s", p);
++                                              break;
++                                      }
++                                      vma = vma->vm_next;
++                              }
++                              up_read(&mm->mmap_sem);
++                      }
++                      if (tsk != current)
++                              mmput(mm);
++              } else {
++                      printk(" comm=%s", tsk->comm);
++              }
++      }
++      if (a) {
++              switch (a->type) {
++              case AVC_AUDIT_DATA_IPC:
++                      printk(" key=%d", a->u.ipc_id);
++                      break;
++              case AVC_AUDIT_DATA_CAP:
++                      printk(" capability=%d", a->u.cap);
++                      break;
++              case AVC_AUDIT_DATA_FS:
++                      if (a->u.fs.dentry) {
++                              if (a->u.fs.mnt) {
++                                      p = d_path(a->u.fs.dentry,
++                                                 a->u.fs.mnt,
++                                                 avc_audit_buffer,
++                                                 PAGE_SIZE);
++                                      if (p)
++                                              printk(" path=%s", p);
++                              }
++                              inode = a->u.fs.dentry->d_inode;
++                      } else if (a->u.fs.inode) {
++                              inode = a->u.fs.inode;
++                      }
++                      if (inode)
++                              printk(" dev=%s ino=%ld",
++                                     inode->i_sb->s_id, inode->i_ino);
++                      break;
++              case AVC_AUDIT_DATA_NET:
++                      if (a->u.net.sk) {
++                              struct sock *sk = a->u.net.sk;
++                              struct unix_sock *u;
++                              struct inet_opt *inet;
++
++                              switch (sk->sk_family) {
++                              case AF_INET:
++                                      inet = inet_sk(sk);
++                                      avc_print_ipv4_addr(inet->rcv_saddr,
++                                                          inet->sport,
++                                                          "laddr", "lport");
++                                      avc_print_ipv4_addr(inet->daddr,
++                                                          inet->dport,
++                                                          "faddr", "fport");
++                                      break;
++                              case AF_UNIX:
++                                      u = unix_sk(sk);
++                                      if (u->dentry) {
++                                              p = d_path(u->dentry,
++                                                         u->mnt,
++                                                         avc_audit_buffer,
++                                                         PAGE_SIZE);
++                                              printk(" path=%s", p);
++                                      } else if (u->addr) {
++                                              p = avc_audit_buffer;
++                                              memcpy(p,
++                                                     u->addr->name->sun_path,
++                                                     u->addr->len-sizeof(short));
++                                              if (*p == 0) {
++                                                      *p = '@';
++                                                      p += u->addr->len-sizeof(short);
++                                                      *p = 0;
++                                              }
++                                              printk(" path=%s",
++                                                     avc_audit_buffer);
++                                      }
++                                      break;
++                              }
++                      }
++                      if (a->u.net.daddr) {
++                              printk(" daddr=%d.%d.%d.%d",
++                                     NIPQUAD(a->u.net.daddr));
++                              if (a->u.net.port)
++                                      printk(" dest=%d", a->u.net.port);
++                      } else if (a->u.net.port)
++                              printk(" port=%d", a->u.net.port);
++                      if (a->u.net.skb) {
++                              struct sk_buff *skb = a->u.net.skb;
++
++                              if ((skb->protocol == htons(ETH_P_IP)) &&
++                                   skb->nh.iph) {
++                                      u16 source = 0, dest = 0;
++                                      u8  protocol = skb->nh.iph->protocol;
++
++
++                                      if (protocol == IPPROTO_TCP &&
++                                          skb->h.th) {
++                                              source = skb->h.th->source;
++                                              dest = skb->h.th->dest;
++                                      }
++                                      if (protocol == IPPROTO_UDP &&
++                                          skb->h.uh) {
++                                              source = skb->h.uh->source;
++                                              dest = skb->h.uh->dest;
++                                      }
++
++                                      avc_print_ipv4_addr(skb->nh.iph->saddr,
++                                                          source,
++                                                          "saddr", "source");
++                                      avc_print_ipv4_addr(skb->nh.iph->daddr,
++                                                          dest,
++                                                          "daddr", "dest");
++                              }
++                      }
++                      if (a->u.net.netif)
++                              printk(" netif=%s", a->u.net.netif);
++                      break;
++              }
++      }
++      printk(" ");
++      avc_dump_query(ssid, tsid, tclass);
++      printk("\n");
++
++      spin_unlock_irq(&avc_log_lock);
++}
++
++/**
++ * avc_add_callback - Register a callback for security events.
++ * @callback: callback function
++ * @events: security events
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions
++ *
++ * Register a callback function for events in the set @events
++ * related to the SID pair (@ssid, @tsid) and
++ * and the permissions @perms, interpreting
++ * @perms based on @tclass.  Returns %0 on success or
++ * -%ENOMEM if insufficient memory exists to add the callback.
++ */
++int avc_add_callback(int (*callback)(u32 event, u32 ssid, u32 tsid,
++                                     u16 tclass, u32 perms,
++                                     u32 *out_retained),
++                     u32 events, u32 ssid, u32 tsid,
++                     u16 tclass, u32 perms)
++{
++      struct avc_callback_node *c;
++      int rc = 0;
++
++      c = kmalloc(sizeof(*c), GFP_ATOMIC);
++      if (!c) {
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      c->callback = callback;
++      c->events = events;
++      c->ssid = ssid;
++      c->tsid = tsid;
++      c->perms = perms;
++      c->next = avc_callbacks;
++      avc_callbacks = c;
++out:
++      return rc;
++}
++
++static inline int avc_sidcmp(u32 x, u32 y)
++{
++      return (x == y || x == SECSID_WILD || y == SECSID_WILD);
++}
++
++static inline void avc_update_node(u32 event, struct avc_node *node, u32 perms)
++{
++      switch (event) {
++      case AVC_CALLBACK_GRANT:
++              node->ae.avd.allowed |= perms;
++              break;
++      case AVC_CALLBACK_TRY_REVOKE:
++      case AVC_CALLBACK_REVOKE:
++              node->ae.avd.allowed &= ~perms;
++              break;
++      case AVC_CALLBACK_AUDITALLOW_ENABLE:
++              node->ae.avd.auditallow |= perms;
++              break;
++      case AVC_CALLBACK_AUDITALLOW_DISABLE:
++              node->ae.avd.auditallow &= ~perms;
++              break;
++      case AVC_CALLBACK_AUDITDENY_ENABLE:
++              node->ae.avd.auditdeny |= perms;
++              break;
++      case AVC_CALLBACK_AUDITDENY_DISABLE:
++              node->ae.avd.auditdeny &= ~perms;
++              break;
++      }
++}
++
++static int avc_update_cache(u32 event, u32 ssid, u32 tsid,
++                            u16 tclass, u32 perms)
++{
++      struct avc_node *node;
++      int i;
++      unsigned long flags;
++
++      spin_lock_irqsave(&avc_lock,flags);
++
++      if (ssid == SECSID_WILD || tsid == SECSID_WILD) {
++              /* apply to all matching nodes */
++              for (i = 0; i < AVC_CACHE_SLOTS; i++) {
++                      for (node = avc_cache.slots[i]; node;
++                           node = node->next) {
++                              if (avc_sidcmp(ssid, node->ae.ssid) &&
++                                  avc_sidcmp(tsid, node->ae.tsid) &&
++                                  tclass == node->ae.tclass) {
++                                      avc_update_node(event,node,perms);
++                              }
++                      }
++              }
++      } else {
++              /* apply to one node */
++              node = avc_search_node(ssid, tsid, tclass, 0);
++              if (node) {
++                      avc_update_node(event,node,perms);
++              }
++      }
++
++      spin_unlock_irqrestore(&avc_lock,flags);
++
++      return 0;
++}
++
++static int avc_control(u32 event, u32 ssid, u32 tsid,
++                       u16 tclass, u32 perms,
++                       u32 seqno, u32 *out_retained)
++{
++      struct avc_callback_node *c;
++      u32 tretained = 0, cretained = 0;
++      int rc = 0;
++      unsigned long flags;
++
++      /*
++       * try_revoke only removes permissions from the cache
++       * state if they are not retained by the object manager.
++       * Hence, try_revoke must wait until after the callbacks have
++       * been invoked to update the cache state.
++       */
++      if (event != AVC_CALLBACK_TRY_REVOKE)
++              avc_update_cache(event,ssid,tsid,tclass,perms);
++
++      for (c = avc_callbacks; c; c = c->next)
++      {
++              if ((c->events & event) &&
++                  avc_sidcmp(c->ssid, ssid) &&
++                  avc_sidcmp(c->tsid, tsid) &&
++                  c->tclass == tclass &&
++                  (c->perms & perms)) {
++                      cretained = 0;
++                      rc = c->callback(event, ssid, tsid, tclass,
++                                       (c->perms & perms),
++                                       &cretained);
++                      if (rc)
++                              goto out;
++                      tretained |= cretained;
++              }
++      }
++
++      if (event == AVC_CALLBACK_TRY_REVOKE) {
++              /* revoke any unretained permissions */
++              perms &= ~tretained;
++              avc_update_cache(event,ssid,tsid,tclass,perms);
++              *out_retained = tretained;
++      }
++
++      spin_lock_irqsave(&avc_lock,flags);
++      if (seqno > avc_cache.latest_notif)
++              avc_cache.latest_notif = seqno;
++      spin_unlock_irqrestore(&avc_lock,flags);
++
++out:
++      return rc;
++}
++
++/**
++ * avc_ss_grant - Grant previously denied permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ */
++int avc_ss_grant(u32 ssid, u32 tsid, u16 tclass,
++                 u32 perms, u32 seqno)
++{
++      return avc_control(AVC_CALLBACK_GRANT,
++                         ssid, tsid, tclass, perms, seqno, 0);
++}
++
++/**
++ * avc_ss_try_revoke - Try to revoke previously granted permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ * @out_retained: subset of @perms that are retained
++ *
++ * Try to revoke previously granted permissions, but
++ * only if they are not retained as migrated permissions.
++ * Return the subset of permissions that are retained via @out_retained.
++ */
++int avc_ss_try_revoke(u32 ssid, u32 tsid, u16 tclass,
++                      u32 perms, u32 seqno, u32 *out_retained)
++{
++      return avc_control(AVC_CALLBACK_TRY_REVOKE,
++                         ssid, tsid, tclass, perms, seqno, out_retained);
++}
++
++/**
++ * avc_ss_revoke - Revoke previously granted permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ *
++ * Revoke previously granted permissions, even if
++ * they are retained as migrated permissions.
++ */
++int avc_ss_revoke(u32 ssid, u32 tsid, u16 tclass,
++                  u32 perms, u32 seqno)
++{
++      return avc_control(AVC_CALLBACK_REVOKE,
++                         ssid, tsid, tclass, perms, seqno, 0);
++}
++
++/**
++ * avc_ss_reset - Flush the cache and revalidate migrated permissions.
++ * @seqno: policy sequence number
++ */
++int avc_ss_reset(u32 seqno)
++{
++      struct avc_callback_node *c;
++      int i, rc = 0;
++      struct avc_node *node, *tmp;
++      unsigned long flags;
++
++      avc_hash_eval("reset");
++
++      spin_lock_irqsave(&avc_lock,flags);
++
++      for (i = 0; i < AVC_CACHE_SLOTS; i++) {
++              node = avc_cache.slots[i];
++              while (node) {
++                      tmp = node;
++                      node = node->next;
++                      tmp->ae.ssid = tmp->ae.tsid = SECSID_NULL;
++                      tmp->ae.tclass = SECCLASS_NULL;
++                      tmp->ae.avd.allowed = tmp->ae.avd.decided = 0;
++                      tmp->ae.avd.auditallow = tmp->ae.avd.auditdeny = 0;
++                      tmp->ae.used = 0;
++                      tmp->next = avc_node_freelist;
++                      avc_node_freelist = tmp;
++                      avc_cache.active_nodes--;
++              }
++              avc_cache.slots[i] = 0;
++      }
++      avc_cache.lru_hint = 0;
++
++      spin_unlock_irqrestore(&avc_lock,flags);
++
++      for (i = 0; i < AVC_NSTATS; i++)
++              avc_cache_stats[i] = 0;
++
++      for (c = avc_callbacks; c; c = c->next) {
++              if (c->events & AVC_CALLBACK_RESET) {
++                      rc = c->callback(AVC_CALLBACK_RESET,
++                                       0, 0, 0, 0, 0);
++                      if (rc)
++                              goto out;
++              }
++      }
++
++      spin_lock_irqsave(&avc_lock,flags);
++      if (seqno > avc_cache.latest_notif)
++              avc_cache.latest_notif = seqno;
++      spin_unlock_irqrestore(&avc_lock,flags);
++out:
++      return rc;
++}
++
++/**
++ * avc_ss_set_auditallow - Enable or disable auditing of granted permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ * @enable: enable flag.
++ */
++int avc_ss_set_auditallow(u32 ssid, u32 tsid, u16 tclass,
++                          u32 perms, u32 seqno, u32 enable)
++{
++      if (enable)
++              return avc_control(AVC_CALLBACK_AUDITALLOW_ENABLE,
++                                 ssid, tsid, tclass, perms, seqno, 0);
++      else
++              return avc_control(AVC_CALLBACK_AUDITALLOW_DISABLE,
++                                 ssid, tsid, tclass, perms, seqno, 0);
++}
++
++/**
++ * avc_ss_set_auditdeny - Enable or disable auditing of denied permissions.
++ * @ssid: source security identifier or %SECSID_WILD
++ * @tsid: target security identifier or %SECSID_WILD
++ * @tclass: target security class
++ * @perms: permissions to grant
++ * @seqno: policy sequence number
++ * @enable: enable flag.
++ */
++int avc_ss_set_auditdeny(u32 ssid, u32 tsid, u16 tclass,
++                         u32 perms, u32 seqno, u32 enable)
++{
++      if (enable)
++              return avc_control(AVC_CALLBACK_AUDITDENY_ENABLE,
++                                 ssid, tsid, tclass, perms, seqno, 0);
++      else
++              return avc_control(AVC_CALLBACK_AUDITDENY_DISABLE,
++                                 ssid, tsid, tclass, perms, seqno, 0);
++}
++
++/**
++ * avc_has_perm_noaudit - Check permissions but perform no auditing.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions, interpreted based on @tclass
++ * @aeref:  AVC entry reference
++ * @avd: access vector decisions
++ *
++ * Check the AVC to determine whether the @requested permissions are granted
++ * for the SID pair (@ssid, @tsid), interpreting the permissions
++ * based on @tclass, and call the security server on a cache miss to obtain
++ * a new decision and add it to the cache.  Update @aeref to refer to an AVC
++ * entry with the resulting decisions, and return a copy of the decisions
++ * in @avd.  Return %0 if all @requested permissions are granted,
++ * -%EACCES if any permissions are denied, or another -errno upon
++ * other errors.  This function is typically called by avc_has_perm(),
++ * but may also be called directly to separate permission checking from
++ * auditing, e.g. in cases where a lock must be held for the check but
++ * should be released for the auditing.
++ */
++int avc_has_perm_noaudit(u32 ssid, u32 tsid,
++                         u16 tclass, u32 requested,
++                         struct avc_entry_ref *aeref, struct av_decision *avd)
++{
++      struct avc_entry *ae;
++      int rc = 0;
++      unsigned long flags;
++      struct avc_entry entry;
++      u32 denied;
++      struct avc_entry_ref ref;
++
++      if (!aeref) {
++              avc_entry_ref_init(&ref);
++              aeref = &ref;
++      }
++
++      spin_lock_irqsave(&avc_lock, flags);
++      avc_cache_stats_incr(AVC_ENTRY_LOOKUPS);
++      ae = aeref->ae;
++      if (ae) {
++              if (ae->ssid == ssid &&
++                  ae->tsid == tsid &&
++                  ae->tclass == tclass &&
++                  ((ae->avd.decided & requested) == requested)) {
++                      avc_cache_stats_incr(AVC_ENTRY_HITS);
++                      ae->used = 1;
++              } else {
++                      avc_cache_stats_incr(AVC_ENTRY_DISCARDS);
++                      ae = 0;
++              }
++      }
++
++      if (!ae) {
++              avc_cache_stats_incr(AVC_ENTRY_MISSES);
++              rc = avc_lookup(ssid, tsid, tclass, requested, aeref);
++              if (rc) {
++                      spin_unlock_irqrestore(&avc_lock,flags);
++                      rc = security_compute_av(ssid,tsid,tclass,requested,&entry.avd);
++                      if (rc)
++                              goto out;
++                      spin_lock_irqsave(&avc_lock, flags);
++                      rc = avc_insert(ssid,tsid,tclass,&entry,aeref);
++                      if (rc) {
++                              spin_unlock_irqrestore(&avc_lock,flags);
++                              goto out;
++                      }
++              }
++              ae = aeref->ae;
++      }
++
++      if (avd)
++              memcpy(avd, &ae->avd, sizeof(*avd));
++
++      denied = requested & ~(ae->avd.allowed);
++
++      if (!requested || denied) {
++              if (selinux_enforcing) {
++                      spin_unlock_irqrestore(&avc_lock,flags);
++                      rc = -EACCES;
++                      goto out;
++              } else {
++                      ae->avd.allowed |= requested;
++                      spin_unlock_irqrestore(&avc_lock,flags);
++                      goto out;
++              }
++      }
++
++      spin_unlock_irqrestore(&avc_lock,flags);
++out:
++      return rc;
++}
++
++/**
++ * avc_has_perm - Check permissions and perform any appropriate auditing.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions, interpreted based on @tclass
++ * @aeref:  AVC entry reference
++ * @auditdata: auxiliary audit data
++ *
++ * Check the AVC to determine whether the @requested permissions are granted
++ * for the SID pair (@ssid, @tsid), interpreting the permissions
++ * based on @tclass, and call the security server on a cache miss to obtain
++ * a new decision and add it to the cache.  Update @aeref to refer to an AVC
++ * entry with the resulting decisions.  Audit the granting or denial of
++ * permissions in accordance with the policy.  Return %0 if all @requested
++ * permissions are granted, -%EACCES if any permissions are denied, or
++ * another -errno upon other errors.
++ */
++int avc_has_perm(u32 ssid, u32 tsid, u16 tclass,
++                 u32 requested, struct avc_entry_ref *aeref,
++                 struct avc_audit_data *auditdata)
++{
++      struct av_decision avd;
++      int rc;
++
++      rc = avc_has_perm_noaudit(ssid, tsid, tclass, requested, aeref, &avd);
++      avc_audit(ssid, tsid, tclass, requested, &avd, rc, auditdata);
++      return rc;
++}
++
++static int __init avc_log_level_setup(char *str)
++{
++      avc_log_level = simple_strtol(str, NULL, 0);
++      if (avc_log_level > 7)
++              avc_log_level = 7;
++      return 1;
++}
++
++__setup("avc_log_level=", avc_log_level_setup);
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/hooks.c        2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,3405 @@
++/*
++ *  NSA Security-Enhanced Linux (SELinux) security module
++ *
++ *  This file contains the SELinux hook function implementations.
++ *
++ *  Authors:  Stephen Smalley, <sds@epoch.ncsc.mil>
++ *            Chris Vance, <cvance@nai.com>
++ *            Wayne Salamon, <wsalamon@nai.com>
++ *            James Morris <jmorris@redhat.com>
++ *
++ *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
++ *  Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
++ *
++ *    This program is free software; you can redistribute it and/or modify
++ *    it under the terms of the GNU General Public License version 2,
++ *      as published by the Free Software Foundation.
++ */
++
++#define XATTR_SECURITY_PREFIX "security."
++#define XATTR_SELINUX_SUFFIX "selinux"
++#define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
++
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/ptrace.h>
++#include <linux/errno.h>
++#include <linux/sched.h>
++#include <linux/security.h>
++#include <linux/xattr.h>
++#include <linux/capability.h>
++#include <linux/unistd.h>
++#include <linux/mm.h>
++#include <linux/mman.h>
++#include <linux/slab.h>
++#include <linux/pagemap.h>
++#include <linux/swap.h>
++#include <linux/smp_lock.h>
++#include <linux/spinlock.h>
++#include <linux/file.h>
++#include <linux/namei.h>
++#include <linux/mount.h>
++#include <linux/ext2_fs.h>
++#include <linux/proc_fs.h>
++#include <linux/kd.h>
++#include <net/icmp.h>
++#include <net/ip.h>           /* for sysctl_local_port_range[] */
++#include <net/tcp.h>          /* struct or_callable used in sock_rcv_skb */
++#include <asm/uaccess.h>
++#include <asm/semaphore.h>
++#include <asm/ioctls.h>
++#include <linux/bitops.h>
++#include <linux/interrupt.h>
++#include <linux/netdevice.h>  /* for network interface checks */
++#include <linux/netlink.h>
++#include <linux/tcp.h>
++#include <linux/quota.h>
++#include <linux/un.h>         /* for Unix socket types */
++#include <net/af_unix.h>      /* for Unix socket types */
++
++#include "avc.h"
++#include "objsec.h"
++
++#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
++int selinux_enforcing = 0;
++
++static int __init enforcing_setup(char *str)
++{
++      selinux_enforcing = simple_strtol(str,NULL,0);
++      return 1;
++}
++__setup("enforcing=", enforcing_setup);
++#endif
++
++/* Original (dummy) security module. */
++static struct security_operations *original_ops = NULL;
++
++/* Minimal support for a secondary security module,
++   just to allow the use of the dummy or capability modules.
++   The owlsm module can alternatively be used as a secondary
++   module as long as CONFIG_OWLSM_FD is not enabled. */
++static struct security_operations *secondary_ops = NULL;
++
++/* Lists of inode and superblock security structures initialized
++   before the policy was loaded. */
++static LIST_HEAD(inode_security_head);
++static spinlock_t inode_security_lock = SPIN_LOCK_UNLOCKED;
++
++static LIST_HEAD(superblock_security_head);
++static spinlock_t sb_security_lock = SPIN_LOCK_UNLOCKED;
++
++/* Allocate and free functions for each kind of security blob. */
++
++static int task_alloc_security(struct task_struct *task)
++{
++      struct task_security_struct *tsec;
++
++      tsec = kmalloc(sizeof(struct task_security_struct), GFP_KERNEL);
++      if (!tsec)
++              return -ENOMEM;
++
++      memset(tsec, 0, sizeof(struct task_security_struct));
++      tsec->magic = SELINUX_MAGIC;
++      tsec->task = task;
++      tsec->osid = tsec->sid = SECINITSID_UNLABELED;
++      task->security = tsec;
++
++      return 0;
++}
++
++static void task_free_security(struct task_struct *task)
++{
++      struct task_security_struct *tsec = task->security;
++
++      if (!tsec || tsec->magic != SELINUX_MAGIC)
++              return;
++
++      task->security = NULL;
++      kfree(tsec);
++}
++
++static int inode_alloc_security(struct inode *inode)
++{
++      struct task_security_struct *tsec = current->security;
++      struct inode_security_struct *isec;
++
++      isec = kmalloc(sizeof(struct inode_security_struct), GFP_KERNEL);
++      if (!isec)
++              return -ENOMEM;
++
++      memset(isec, 0, sizeof(struct inode_security_struct));
++      init_MUTEX(&isec->sem);
++      INIT_LIST_HEAD(&isec->list);
++      isec->magic = SELINUX_MAGIC;
++      isec->inode = inode;
++      isec->sid = SECINITSID_UNLABELED;
++      isec->sclass = SECCLASS_FILE;
++      if (tsec && tsec->magic == SELINUX_MAGIC)
++              isec->task_sid = tsec->sid;
++      else
++              isec->task_sid = SECINITSID_UNLABELED;
++      inode->i_security = isec;
++
++      return 0;
++}
++
++static void inode_free_security(struct inode *inode)
++{
++      struct inode_security_struct *isec = inode->i_security;
++
++      if (!isec || isec->magic != SELINUX_MAGIC)
++              return;
++
++      spin_lock(&inode_security_lock);
++      if (!list_empty(&isec->list))
++              list_del_init(&isec->list);
++      spin_unlock(&inode_security_lock);
++
++      inode->i_security = NULL;
++      kfree(isec);
++}
++
++static int file_alloc_security(struct file *file)
++{
++      struct task_security_struct *tsec = current->security;
++      struct file_security_struct *fsec;
++
++      fsec = kmalloc(sizeof(struct file_security_struct), GFP_ATOMIC);
++      if (!fsec)
++              return -ENOMEM;
++
++      memset(fsec, 0, sizeof(struct file_security_struct));
++      fsec->magic = SELINUX_MAGIC;
++      fsec->file = file;
++      if (tsec && tsec->magic == SELINUX_MAGIC) {
++              fsec->sid = tsec->sid;
++              fsec->fown_sid = tsec->sid;
++      } else {
++              fsec->sid = SECINITSID_UNLABELED;
++              fsec->fown_sid = SECINITSID_UNLABELED;
++      }
++      file->f_security = fsec;
++
++      return 0;
++}
++
++static void file_free_security(struct file *file)
++{
++      struct file_security_struct *fsec = file->f_security;
++
++      if (!fsec || fsec->magic != SELINUX_MAGIC)
++              return;
++
++      file->f_security = NULL;
++      kfree(fsec);
++}
++
++static int superblock_alloc_security(struct super_block *sb)
++{
++      struct superblock_security_struct *sbsec;
++
++      sbsec = kmalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
++      if (!sbsec)
++              return -ENOMEM;
++
++      memset(sbsec, 0, sizeof(struct superblock_security_struct));
++      init_MUTEX(&sbsec->sem);
++      INIT_LIST_HEAD(&sbsec->list);
++      sbsec->magic = SELINUX_MAGIC;
++      sbsec->sb = sb;
++      sbsec->sid = SECINITSID_UNLABELED;
++      sb->s_security = sbsec;
++
++      return 0;
++}
++
++static void superblock_free_security(struct super_block *sb)
++{
++      struct superblock_security_struct *sbsec = sb->s_security;
++
++      if (!sbsec || sbsec->magic != SELINUX_MAGIC)
++              return;
++
++      spin_lock(&sb_security_lock);
++      if (!list_empty(&sbsec->list))
++              list_del_init(&sbsec->list);
++      spin_unlock(&sb_security_lock);
++
++      sb->s_security = NULL;
++      kfree(sbsec);
++}
++
++/* The security server must be initialized before
++   any labeling or access decisions can be provided. */
++extern int ss_initialized;
++
++/* The file system's label must be initialized prior to use. */
++
++static char *labeling_behaviors[5] = {
++      "uses xattr",
++      "uses transition SIDs",
++      "uses task SIDs",
++      "uses genfs_contexts",
++      "not configured for labeling"
++};
++
++static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
++
++static inline int inode_doinit(struct inode *inode)
++{
++      return inode_doinit_with_dentry(inode, NULL);
++}
++
++static int superblock_doinit(struct super_block *sb)
++{
++      struct superblock_security_struct *sbsec = sb->s_security;
++      struct dentry *root = sb->s_root;
++      struct inode *inode = root->d_inode;
++      int rc = 0;
++
++      down(&sbsec->sem);
++      if (sbsec->initialized)
++              goto out;
++
++      if (!ss_initialized) {
++              /* Defer initialization until selinux_complete_init,
++                 after the initial policy is loaded and the security
++                 server is ready to handle calls. */
++              spin_lock(&sb_security_lock);
++              if (list_empty(&sbsec->list))
++                      list_add(&sbsec->list, &superblock_security_head);
++              spin_unlock(&sb_security_lock);
++              goto out;
++      }
++
++      /* Determine the labeling behavior to use for this filesystem type. */
++      rc = security_fs_use(sb->s_type->name, &sbsec->behavior, &sbsec->sid);
++      if (rc) {
++              printk(KERN_WARNING "%s:  security_fs_use(%s) returned %d\n",
++                     __FUNCTION__, sb->s_type->name, rc);
++              goto out;
++      }
++
++      if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
++              /* Make sure that the xattr handler exists and that no
++                 error other than -ENODATA is returned by getxattr on
++                 the root directory.  -ENODATA is ok, as this may be
++                 the first boot of the SELinux kernel before we have
++                 assigned xattr values to the filesystem. */
++              if (!inode->i_op->getxattr) {
++                      printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
++                             "xattr support\n", sb->s_id, sb->s_type->name);
++                      rc = -EOPNOTSUPP;
++                      goto out;
++              }
++              rc = inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
++              if (rc < 0 && rc != -ENODATA) {
++                      if (rc == -EOPNOTSUPP)
++                              printk(KERN_WARNING "SELinux: (dev %s, type "
++                                     "%s) has no security xattr handler\n",
++                                     sb->s_id, sb->s_type->name);
++                      else
++                              printk(KERN_WARNING "SELinux: (dev %s, type "
++                                     "%s) getxattr errno %d\n", sb->s_id,
++                                     sb->s_type->name, -rc);
++                      goto out;
++              }
++      }
++
++      if (strcmp(sb->s_type->name, "proc") == 0)
++              sbsec->proc = 1;
++
++      sbsec->initialized = 1;
++
++      printk(KERN_INFO "SELinux: initialized (dev %s, type %s), %s\n",
++             sb->s_id, sb->s_type->name,
++             labeling_behaviors[sbsec->behavior-1]);
++
++      /* Initialize the root inode. */
++      rc = inode_doinit_with_dentry(sb->s_root->d_inode, sb->s_root);
++out:
++      up(&sbsec->sem);
++      return rc;
++}
++
++static inline u16 inode_mode_to_security_class(umode_t mode)
++{
++      switch (mode & S_IFMT) {
++      case S_IFSOCK:
++              return SECCLASS_SOCK_FILE;
++      case S_IFLNK:
++              return SECCLASS_LNK_FILE;
++      case S_IFREG:
++              return SECCLASS_FILE;
++      case S_IFBLK:
++              return SECCLASS_BLK_FILE;
++      case S_IFDIR:
++              return SECCLASS_DIR;
++      case S_IFCHR:
++              return SECCLASS_CHR_FILE;
++      case S_IFIFO:
++              return SECCLASS_FIFO_FILE;
++
++      }
++
++      return SECCLASS_FILE;
++}
++
++static inline u16 socket_type_to_security_class(int family, int type)
++{
++      switch (family) {
++      case PF_UNIX:
++              switch (type) {
++              case SOCK_STREAM:
++                      return SECCLASS_UNIX_STREAM_SOCKET;
++              case SOCK_DGRAM:
++                      return SECCLASS_UNIX_DGRAM_SOCKET;
++              }
++      case PF_INET:
++      case PF_INET6:
++              switch (type) {
++              case SOCK_STREAM:
++                      return SECCLASS_TCP_SOCKET;
++              case SOCK_DGRAM:
++                      return SECCLASS_UDP_SOCKET;
++              case SOCK_RAW:
++                      return SECCLASS_RAWIP_SOCKET;
++              }
++      case PF_NETLINK:
++              return SECCLASS_NETLINK_SOCKET;
++      case PF_PACKET:
++              return SECCLASS_PACKET_SOCKET;
++      case PF_KEY:
++              return SECCLASS_KEY_SOCKET;
++      }
++
++      return SECCLASS_SOCKET;
++}
++
++#ifdef CONFIG_PROC_FS
++static int selinux_proc_get_sid(struct proc_dir_entry *de,
++                              u16 tclass,
++                              u32 *sid)
++{
++      int buflen, rc;
++      char *buffer, *path, *end;
++
++      buffer = (char*)__get_free_page(GFP_KERNEL);
++      if (!buffer)
++              return -ENOMEM;
++
++      buflen = PAGE_SIZE;
++      end = buffer+buflen;
++      *--end = '\0';
++      buflen--;
++      path = end-1;
++      *path = '/';
++      while (de && de != de->parent) {
++              buflen -= de->namelen + 1;
++              if (buflen < 0)
++                      break;
++              end -= de->namelen;
++              memcpy(end, de->name, de->namelen);
++              *--end = '/';
++              path = end;
++              de = de->parent;
++      }
++      rc = security_genfs_sid("proc", path, tclass, sid);
++      free_page((unsigned long)buffer);
++      return rc;
++}
++#else
++static int selinux_proc_get_sid(struct proc_dir_entry *de,
++                              u16 tclass,
++                              u32 *sid)
++{
++      return -EINVAL;
++}
++#endif
++
++/* The inode's security attributes must be initialized before first use. */
++static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
++{
++      struct superblock_security_struct *sbsec = NULL;
++      struct inode_security_struct *isec = inode->i_security;
++      u32 sid;
++      struct dentry *dentry;
++#define INITCONTEXTLEN 255
++      char *context = NULL;
++      unsigned len = 0;
++      int rc = 0;
++      int hold_sem = 0;
++
++      if (isec->initialized)
++              goto out;
++
++      down(&isec->sem);
++      hold_sem = 1;
++      if (isec->initialized)
++              goto out;
++
++      sbsec = inode->i_sb->s_security;
++      if (!sbsec || !sbsec->initialized) {
++              /* Defer initialization until selinux_complete_init,
++                 after the initial policy is loaded and the security
++                 server is ready to handle calls. */
++              spin_lock(&inode_security_lock);
++              if (list_empty(&isec->list))
++                      list_add(&isec->list, &inode_security_head);
++              spin_unlock(&inode_security_lock);
++              goto out;
++      }
++
++      switch (sbsec->behavior) {
++      case SECURITY_FS_USE_XATTR:
++              if (!inode->i_op->getxattr) {
++                      isec->sid = SECINITSID_FILE;
++                      break;
++              }
++
++              /* Need a dentry, since the xattr API requires one.
++                 Life would be simpler if we could just pass the inode. */
++              if (opt_dentry) {
++                      /* Called from d_instantiate or d_splice_alias. */
++                      dentry = dget(opt_dentry);
++              } else {
++                      /* Called from selinux_complete_init, try to find a dentry. */
++                      dentry = d_find_alias(inode);
++              }
++              if (!dentry) {
++                      printk(KERN_WARNING "%s:  no dentry for dev=%s "
++                             "ino=%ld\n", __FUNCTION__, inode->i_sb->s_id,
++                             inode->i_ino);
++                      goto out;
++              }
++
++              len = INITCONTEXTLEN;
++              context = kmalloc(len, GFP_KERNEL);
++              if (!context) {
++                      rc = -ENOMEM;
++                      dput(dentry);
++                      goto out;
++              }
++              rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
++                                         context, len);
++              if (rc == -ERANGE) {
++                      /* Need a larger buffer.  Query for the right size. */
++                      rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
++                                                 NULL, 0);
++                      if (rc < 0) {
++                              dput(dentry);
++                              goto out;
++                      }
++                      kfree(context);
++                      len = rc;
++                      context = kmalloc(len, GFP_KERNEL);
++                      if (!context) {
++                              rc = -ENOMEM;
++                              dput(dentry);
++                              goto out;
++                      }
++                      rc = inode->i_op->getxattr(dentry,
++                                                 XATTR_NAME_SELINUX,
++                                                 context, len);
++              }
++              dput(dentry);
++              if (rc < 0) {
++                      if (rc != -ENODATA) {
++                              printk(KERN_WARNING "%s:  getxattr returned "
++                                     "%d for dev=%s ino=%ld\n", __FUNCTION__,
++                                     -rc, inode->i_sb->s_id, inode->i_ino);
++                              kfree(context);
++                              goto out;
++                      }
++                      /* Map ENODATA to the default file SID */
++                      sid = SECINITSID_FILE;
++                      rc = 0;
++              } else {
++                      rc = security_context_to_sid(context, rc, &sid);
++                      if (rc) {
++                              printk(KERN_WARNING "%s:  context_to_sid(%s) "
++                                     "returned %d for dev=%s ino=%ld\n",
++                                     __FUNCTION__, context, -rc,
++                                     inode->i_sb->s_id, inode->i_ino);
++                              kfree(context);
++                              goto out;
++                      }
++              }
++              kfree(context);
++              isec->sid = sid;
++              break;
++      case SECURITY_FS_USE_TASK:
++              isec->sid = isec->task_sid;
++              break;
++      case SECURITY_FS_USE_TRANS:
++              /* Default to the fs SID. */
++              isec->sid = sbsec->sid;
++
++              /* Try to obtain a transition SID. */
++              isec->sclass = inode_mode_to_security_class(inode->i_mode);
++              rc = security_transition_sid(isec->task_sid,
++                                           sbsec->sid,
++                                           isec->sclass,
++                                           &sid);
++              if (rc)
++                      goto out;
++              isec->sid = sid;
++              break;
++      default:
++              /* Default to the fs SID. */
++              isec->sid = sbsec->sid;
++
++              if (sbsec->proc) {
++                      struct proc_inode *proci = PROC_I(inode);
++                      if (proci->pde) {
++                              isec->sclass = inode_mode_to_security_class(inode->i_mode);
++                              rc = selinux_proc_get_sid(proci->pde,
++                                                        isec->sclass,
++                                                        &sid);
++                              if (rc)
++                                      goto out;
++                              isec->sid = sid;
++                      }
++              }
++              break;
++      }
++
++      isec->initialized = 1;
++
++out:
++      if (inode->i_sock) {
++              struct socket *sock = SOCKET_I(inode);
++              if (sock->sk) {
++                      isec->sclass = socket_type_to_security_class(sock->sk->sk_family,
++                                                                   sock->sk->sk_type);
++              } else {
++                      isec->sclass = SECCLASS_SOCKET;
++              }
++      } else {
++              isec->sclass = inode_mode_to_security_class(inode->i_mode);
++      }
++
++      if (hold_sem)
++              up(&isec->sem);
++      return rc;
++}
++
++/* Convert a Linux signal to an access vector. */
++static inline u32 signal_to_av(int sig)
++{
++      u32 perm = 0;
++
++      switch (sig) {
++      case SIGCHLD:
++              /* Commonly granted from child to parent. */
++              perm = PROCESS__SIGCHLD;
++              break;
++      case SIGKILL:
++              /* Cannot be caught or ignored */
++              perm = PROCESS__SIGKILL;
++              break;
++      case SIGSTOP:
++              /* Cannot be caught or ignored */
++              perm = PROCESS__SIGSTOP;
++              break;
++      default:
++              /* All other signals. */
++              perm = PROCESS__SIGNAL;
++              break;
++      }
++
++      return perm;
++}
++
++/* Check permission betweeen a pair of tasks, e.g. signal checks,
++   fork check, ptrace check, etc. */
++int task_has_perm(struct task_struct *tsk1,
++                struct task_struct *tsk2,
++                u32 perms)
++{
++      struct task_security_struct *tsec1, *tsec2;
++
++      tsec1 = tsk1->security;
++      tsec2 = tsk2->security;
++      return avc_has_perm(tsec1->sid, tsec2->sid,
++                          SECCLASS_PROCESS, perms, &tsec2->avcr, NULL);
++}
++
++/* Check whether a task is allowed to use a capability. */
++int task_has_capability(struct task_struct *tsk,
++                      int cap)
++{
++      struct task_security_struct *tsec;
++      struct avc_audit_data ad;
++
++      tsec = tsk->security;
++
++      AVC_AUDIT_DATA_INIT(&ad,CAP);
++      ad.tsk = tsk;
++      ad.u.cap = cap;
++
++      return avc_has_perm(tsec->sid, tsec->sid,
++                          SECCLASS_CAPABILITY, CAP_TO_MASK(cap), NULL, &ad);
++}
++
++/* Check whether a task is allowed to use a system operation. */
++int task_has_system(struct task_struct *tsk,
++                  u32 perms)
++{
++      struct task_security_struct *tsec;
++
++      tsec = tsk->security;
++
++      return avc_has_perm(tsec->sid, SECINITSID_KERNEL,
++                          SECCLASS_SYSTEM, perms, NULL, NULL);
++}
++
++/* Check whether a task has a particular permission to an inode.
++   The 'aeref' parameter is optional and allows other AVC
++   entry references to be passed (e.g. the one in the struct file).
++   The 'adp' parameter is optional and allows other audit
++   data to be passed (e.g. the dentry). */
++int inode_has_perm(struct task_struct *tsk,
++                 struct inode *inode,
++                 u32 perms,
++                 struct avc_entry_ref *aeref,
++                 struct avc_audit_data *adp)
++{
++      struct task_security_struct *tsec;
++      struct inode_security_struct *isec;
++      struct avc_audit_data ad;
++
++      tsec = tsk->security;
++      isec = inode->i_security;
++
++      if (!adp) {
++              adp = &ad;
++              AVC_AUDIT_DATA_INIT(&ad, FS);
++              ad.u.fs.inode = inode;
++      }
++
++      return avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                          perms, aeref ? aeref : &isec->avcr, adp);
++}
++
++/* Same as inode_has_perm, but pass explicit audit data containing
++   the dentry to help the auditing code to more easily generate the
++   pathname if needed. */
++static inline int dentry_has_perm(struct task_struct *tsk,
++                                struct vfsmount *mnt,
++                                struct dentry *dentry,
++                                u32 av)
++{
++      struct inode *inode = dentry->d_inode;
++      struct avc_audit_data ad;
++      AVC_AUDIT_DATA_INIT(&ad,FS);
++      ad.u.fs.mnt = mnt;
++      ad.u.fs.dentry = dentry;
++      return inode_has_perm(tsk, inode, av, NULL, &ad);
++}
++
++/* Check whether a task can use an open file descriptor to
++   access an inode in a given way.  Check access to the
++   descriptor itself, and then use dentry_has_perm to
++   check a particular permission to the file.
++   Access to the descriptor is implicitly granted if it
++   has the same SID as the process.  If av is zero, then
++   access to the file is not checked, e.g. for cases
++   where only the descriptor is affected like seek. */
++static inline int file_has_perm(struct task_struct *tsk,
++                              struct file *file,
++                              u32 av)
++{
++      struct task_security_struct *tsec = tsk->security;
++      struct file_security_struct *fsec = file->f_security;
++      struct vfsmount *mnt = file->f_vfsmnt;
++      struct dentry *dentry = file->f_dentry;
++      struct inode *inode = dentry->d_inode;
++      struct avc_audit_data ad;
++      int rc;
++
++      AVC_AUDIT_DATA_INIT(&ad, FS);
++      ad.u.fs.mnt = mnt;
++      ad.u.fs.dentry = dentry;
++
++      if (tsec->sid != fsec->sid) {
++              rc = avc_has_perm(tsec->sid, fsec->sid,
++                                SECCLASS_FD,
++                                FD__USE,
++                                &fsec->avcr, &ad);
++              if (rc)
++                      return rc;
++      }
++
++      /* av is zero if only checking access to the descriptor. */
++      if (av)
++              return inode_has_perm(tsk, inode, av, &fsec->inode_avcr, &ad);
++
++      return 0;
++}
++
++/* Check whether a task can create a file. */
++static int may_create(struct inode *dir,
++                    struct dentry *dentry,
++                    u16 tclass)
++{
++      struct task_security_struct *tsec;
++      struct inode_security_struct *dsec;
++      struct superblock_security_struct *sbsec;
++      u32 newsid;
++      struct avc_audit_data ad;
++      int rc;
++
++      tsec = current->security;
++      dsec = dir->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad, FS);
++      ad.u.fs.dentry = dentry;
++
++      rc = avc_has_perm(tsec->sid, dsec->sid, SECCLASS_DIR,
++                        DIR__ADD_NAME | DIR__SEARCH,
++                        &dsec->avcr, &ad);
++      if (rc)
++              return rc;
++
++      if (tsec->create_sid) {
++              newsid = tsec->create_sid;
++      } else {
++              rc = security_transition_sid(tsec->sid, dsec->sid, tclass,
++                                           &newsid);
++              if (rc)
++                      return rc;
++      }
++
++      rc = avc_has_perm(tsec->sid, newsid, tclass, FILE__CREATE, NULL, &ad);
++      if (rc)
++              return rc;
++
++      sbsec = dir->i_sb->s_security;
++
++      return avc_has_perm(newsid, sbsec->sid,
++                          SECCLASS_FILESYSTEM,
++                          FILESYSTEM__ASSOCIATE, NULL, &ad);
++}
++
++#define MAY_LINK   0
++#define MAY_UNLINK 1
++#define MAY_RMDIR  2
++
++/* Check whether a task can link, unlink, or rmdir a file/directory. */
++static int may_link(struct inode *dir,
++                  struct dentry *dentry,
++                  int kind)
++
++{
++      struct task_security_struct *tsec;
++      struct inode_security_struct *dsec, *isec;
++      struct avc_audit_data ad;
++      u32 av;
++      int rc;
++
++      tsec = current->security;
++      dsec = dir->i_security;
++      isec = dentry->d_inode->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad, FS);
++      ad.u.fs.dentry = dentry;
++
++      av = DIR__SEARCH;
++      av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
++      rc = avc_has_perm(tsec->sid, dsec->sid, SECCLASS_DIR,
++                        av, &dsec->avcr, &ad);
++      if (rc)
++              return rc;
++
++      switch (kind) {
++      case MAY_LINK:
++              av = FILE__LINK;
++              break;
++      case MAY_UNLINK:
++              av = FILE__UNLINK;
++              break;
++      case MAY_RMDIR:
++              av = DIR__RMDIR;
++              break;
++      default:
++              printk(KERN_WARNING "may_link:  unrecognized kind %d\n", kind);
++              return 0;
++      }
++
++      rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                        av, &isec->avcr, &ad);
++      return rc;
++}
++
++static inline int may_rename(struct inode *old_dir,
++                           struct dentry *old_dentry,
++                           struct inode *new_dir,
++                           struct dentry *new_dentry)
++{
++      struct task_security_struct *tsec;
++      struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
++      struct avc_audit_data ad;
++      u32 av;
++      int old_is_dir, new_is_dir;
++      int rc;
++
++      tsec = current->security;
++      old_dsec = old_dir->i_security;
++      old_isec = old_dentry->d_inode->i_security;
++      old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
++      new_dsec = new_dir->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad, FS);
++
++      ad.u.fs.dentry = old_dentry;
++      rc = avc_has_perm(tsec->sid, old_dsec->sid, SECCLASS_DIR,
++                        DIR__REMOVE_NAME | DIR__SEARCH,
++                        &old_dsec->avcr, &ad);
++      if (rc)
++              return rc;
++      rc = avc_has_perm(tsec->sid, old_isec->sid,
++                        old_isec->sclass,
++                        FILE__RENAME,
++                        &old_isec->avcr, &ad);
++      if (rc)
++              return rc;
++      if (old_is_dir && new_dir != old_dir) {
++              rc = avc_has_perm(tsec->sid, old_isec->sid,
++                                old_isec->sclass,
++                                DIR__REPARENT,
++                                &old_isec->avcr, &ad);
++              if (rc)
++                      return rc;
++      }
++
++      ad.u.fs.dentry = new_dentry;
++      av = DIR__ADD_NAME | DIR__SEARCH;
++      if (new_dentry->d_inode)
++              av |= DIR__REMOVE_NAME;
++      rc = avc_has_perm(tsec->sid, new_dsec->sid, SECCLASS_DIR,
++                        av,&new_dsec->avcr, &ad);
++      if (rc)
++              return rc;
++      if (new_dentry->d_inode) {
++              new_isec = new_dentry->d_inode->i_security;
++              new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode);
++              rc = avc_has_perm(tsec->sid, new_isec->sid,
++                                new_isec->sclass,
++                                (new_is_dir ? DIR__RMDIR : FILE__UNLINK),
++                                &new_isec->avcr, &ad);
++              if (rc)
++                      return rc;
++      }
++
++      return 0;
++}
++
++/* Check whether a task can perform a filesystem operation. */
++int superblock_has_perm(struct task_struct *tsk,
++                      struct super_block *sb,
++                      u32 perms,
++                      struct avc_audit_data *ad)
++{
++      struct task_security_struct *tsec;
++      struct superblock_security_struct *sbsec;
++
++      tsec = tsk->security;
++      sbsec = sb->s_security;
++      return avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
++                          perms, NULL, ad);
++}
++
++/* Convert a Linux mode and permission mask to an access vector. */
++static inline u32 file_mask_to_av(int mode, int mask)
++{
++      u32 av = 0;
++
++      if ((mode & S_IFMT) != S_IFDIR) {
++              if (mask & MAY_EXEC)
++                      av |= FILE__EXECUTE;
++              if (mask & MAY_READ)
++                      av |= FILE__READ;
++
++              if (mask & MAY_APPEND)
++                      av |= FILE__APPEND;
++              else if (mask & MAY_WRITE)
++                      av |= FILE__WRITE;
++
++      } else {
++              if (mask & MAY_EXEC)
++                      av |= DIR__SEARCH;
++              if (mask & MAY_WRITE)
++                      av |= DIR__WRITE;
++              if (mask & MAY_READ)
++                      av |= DIR__READ;
++      }
++
++      return av;
++}
++
++/* Convert a Linux file to an access vector. */
++static inline u32 file_to_av(struct file *file)
++{
++      u32 av = 0;
++
++      if (file->f_mode & FMODE_READ)
++              av |= FILE__READ;
++      if (file->f_mode & FMODE_WRITE) {
++              if (file->f_flags & O_APPEND)
++                      av |= FILE__APPEND;
++              else
++                      av |= FILE__WRITE;
++      }
++
++      return av;
++}
++
++/* Set an inode's SID to a specified value. */
++int inode_security_set_sid(struct inode *inode, u32 sid)
++{
++      struct inode_security_struct *isec = inode->i_security;
++
++      down(&isec->sem);
++      isec->sclass = inode_mode_to_security_class(inode->i_mode);
++      isec->sid = sid;
++      isec->initialized = 1;
++      up(&isec->sem);
++      return 0;
++}
++
++/* Set the security attributes on a newly created file. */
++static int post_create(struct inode *dir,
++                     struct dentry *dentry)
++{
++
++      struct task_security_struct *tsec;
++      struct inode *inode;
++      struct inode_security_struct *dsec;
++      struct superblock_security_struct *sbsec;
++      u32 newsid;
++      char *context;
++      unsigned int len;
++      int rc;
++
++      tsec = current->security;
++      dsec = dir->i_security;
++
++      inode = dentry->d_inode;
++      if (!inode) {
++              /* Some file system types (e.g. NFS) may not instantiate
++                 a dentry for all create operations (e.g. symlink),
++                 so we have to check to see if the inode is non-NULL. */
++              printk(KERN_WARNING "post_create:  no inode, dir (dev=%s, "
++                     "ino=%ld)\n", dir->i_sb->s_id, dir->i_ino);
++              return 0;
++      }
++
++      if (tsec->create_sid) {
++              newsid = tsec->create_sid;
++      } else {
++              rc = security_transition_sid(tsec->sid, dsec->sid,
++                                           inode_mode_to_security_class(inode->i_mode),
++                                           &newsid);
++              if (rc) {
++                      printk(KERN_WARNING "post_create:  "
++                             "security_transition_sid failed, rc=%d (dev=%s "
++                             "ino=%ld)\n",
++                             -rc, inode->i_sb->s_id, inode->i_ino);
++                      return rc;
++              }
++      }
++
++      rc = inode_security_set_sid(inode, newsid);
++      if (rc) {
++              printk(KERN_WARNING "post_create:  inode_security_set_sid "
++                     "failed, rc=%d (dev=%s ino=%ld)\n",
++                     -rc, inode->i_sb->s_id, inode->i_ino);
++              return rc;
++      }
++
++      sbsec = dir->i_sb->s_security;
++      if (!sbsec)
++              return 0;
++
++      if (sbsec->behavior == SECURITY_FS_USE_XATTR &&
++          inode->i_op->setxattr) {
++              /* Use extended attributes. */
++              rc = security_sid_to_context(newsid, &context, &len);
++              if (rc) {
++                      printk(KERN_WARNING "post_create:  sid_to_context "
++                             "failed, rc=%d (dev=%s ino=%ld)\n",
++                             -rc, inode->i_sb->s_id, inode->i_ino);
++                      return rc;
++              }
++              down(&inode->i_sem);
++              rc = inode->i_op->setxattr(dentry,
++                                         XATTR_NAME_SELINUX,
++                                         context, len, 0);
++              up(&inode->i_sem);
++              kfree(context);
++              if (rc < 0) {
++                      printk(KERN_WARNING "post_create:  setxattr failed, "
++                             "rc=%d (dev=%s ino=%ld)\n",
++                             -rc, inode->i_sb->s_id, inode->i_ino);
++                      return rc;
++              }
++      }
++
++      return 0;
++}
++
++
++/* Hook functions begin here. */
++
++static int selinux_ptrace(struct task_struct *parent, struct task_struct *child)
++{
++      int rc;
++
++      rc = secondary_ops->ptrace(parent,child);
++      if (rc)
++              return rc;
++
++      return task_has_perm(parent, child, PROCESS__PTRACE);
++}
++
++static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
++                          kernel_cap_t *inheritable, kernel_cap_t *permitted)
++{
++      int error;
++
++      error = task_has_perm(current, target, PROCESS__GETCAP);
++      if (error)
++              return error;
++
++      return secondary_ops->capget(target, effective, inheritable, permitted);
++}
++
++static int selinux_capset_check(struct task_struct *target, kernel_cap_t *effective,
++                                kernel_cap_t *inheritable, kernel_cap_t *permitted)
++{
++      int error;
++
++      error = task_has_perm(current, target, PROCESS__SETCAP);
++      if (error)
++              return error;
++
++      return secondary_ops->capset_check(target, effective, inheritable, permitted);
++}
++
++static void selinux_capset_set(struct task_struct *target, kernel_cap_t *effective,
++                               kernel_cap_t *inheritable, kernel_cap_t *permitted)
++{
++      int error;
++
++      error = task_has_perm(current, target, PROCESS__SETCAP);
++      if (error)
++              return;
++
++      return secondary_ops->capset_set(target, effective, inheritable, permitted);
++}
++
++static int selinux_capable(struct task_struct *tsk, int cap)
++{
++      int rc;
++
++      rc = secondary_ops->capable(tsk, cap);
++      if (rc)
++              return rc;
++
++      return task_has_capability(tsk,cap);
++}
++
++static int selinux_sysctl(ctl_table *table, int op)
++{
++      int error = 0;
++      u32 av;
++      struct task_security_struct *tsec;
++      u32 tsid;
++      int rc;
++
++      tsec = current->security;
++
++      rc = selinux_proc_get_sid(table->de, (op == 001) ?
++                                SECCLASS_DIR : SECCLASS_FILE, &tsid);
++      if (rc) {
++              /* Default to the well-defined sysctl SID. */
++              tsid = SECINITSID_SYSCTL;
++      }
++
++      /* The op values are "defined" in sysctl.c, thereby creating
++       * a bad coupling between this module and sysctl.c */
++      if(op == 001) {
++              error = avc_has_perm(tsec->sid, tsid,
++                                   SECCLASS_DIR, DIR__SEARCH, NULL, NULL);
++      } else {
++              av = 0;
++              if (op & 004)
++                      av |= FILE__READ;
++              if (op & 002)
++                      av |= FILE__WRITE;
++              if (av)
++                      error = avc_has_perm(tsec->sid, tsid,
++                                           SECCLASS_FILE, av, NULL, NULL);
++        }
++
++      return error;
++}
++
++static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
++{
++      int rc = 0;
++
++      if (!sb)
++              return 0;
++
++      switch (cmds) {
++              case Q_SYNC:
++              case Q_QUOTAON:
++              case Q_QUOTAOFF:
++              case Q_SETINFO:
++              case Q_SETQUOTA:
++                      rc = superblock_has_perm(current,
++                                               sb,
++                                               FILESYSTEM__QUOTAMOD, NULL);
++                      break;
++              case Q_GETFMT:
++              case Q_GETINFO:
++              case Q_GETQUOTA:
++                      rc = superblock_has_perm(current,
++                                               sb,
++                                               FILESYSTEM__QUOTAGET, NULL);
++                      break;
++              default:
++                      rc = 0;  /* let the kernel handle invalid cmds */
++                      break;
++      }
++      return rc;
++}
++
++static int selinux_quota_on(struct file *f)
++{
++      return file_has_perm(current, f, FILE__QUOTAON);;
++}
++
++static int selinux_syslog(int type)
++{
++      int rc;
++
++      rc = secondary_ops->syslog(type);
++      if (rc)
++              return rc;
++
++      switch (type) {
++              case 3:         /* Read last kernel messages */
++                      rc = task_has_system(current, SYSTEM__SYSLOG_READ);
++                      break;
++              case 6:         /* Disable logging to console */
++              case 7:         /* Enable logging to console */
++              case 8:         /* Set level of messages printed to console */
++                      rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
++                      break;
++              case 0:         /* Close log */
++              case 1:         /* Open log */
++              case 2:         /* Read from log */
++              case 4:         /* Read/clear last kernel messages */
++              case 5:         /* Clear ring buffer */
++              default:
++                      rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
++                      break;
++      }
++      return rc;
++}
++
++/*
++ * Check that a process has enough memory to allocate a new virtual
++ * mapping. 0 means there is enough memory for the allocation to
++ * succeed and -ENOMEM implies there is not.
++ *
++ * We currently support three overcommit policies, which are set via the
++ * vm.overcommit_memory sysctl.  See Documentation/vm/overcommit-acounting
++ *
++ * Strict overcommit modes added 2002 Feb 26 by Alan Cox.
++ * Additional code 2002 Jul 20 by Robert Love.
++ */
++static int selinux_vm_enough_memory(long pages)
++{
++      unsigned long free, allowed;
++      int rc;
++      struct task_security_struct *tsec = current->security;
++
++      vm_acct_memory(pages);
++
++        /*
++       * Sometimes we want to use more memory than we have
++       */
++      if (sysctl_overcommit_memory == 1)
++              return 0;
++
++      if (sysctl_overcommit_memory == 0) {
++              free = get_page_cache_size();
++              free += nr_free_pages();
++              free += nr_swap_pages;
++
++              /*
++               * Any slabs which are created with the
++               * SLAB_RECLAIM_ACCOUNT flag claim to have contents
++               * which are reclaimable, under pressure.  The dentry
++               * cache and most inode caches should fall into this
++               */
++              free += atomic_read(&slab_reclaim_pages);
++
++              /*
++               * Leave the last 3% for privileged processes.
++               * Don't audit the check, as it is applied to all processes
++               * that allocate mappings.
++               */
++              rc = secondary_ops->capable(current, CAP_SYS_ADMIN);
++              if (!rc) {
++                      rc = avc_has_perm_noaudit(tsec->sid, tsec->sid,
++                                                SECCLASS_CAPABILITY,
++                                                CAP_TO_MASK(CAP_SYS_ADMIN),
++                                                NULL, NULL);
++              }
++              if (rc)
++                      free -= free / 32;
++
++              if (free > pages)
++                      return 0;
++              vm_unacct_memory(pages);
++              return -ENOMEM;
++      }
++
++      allowed = totalram_pages * sysctl_overcommit_ratio / 100;
++      allowed += total_swap_pages;
++
++      if (atomic_read(&vm_committed_space) < allowed)
++              return 0;
++
++      vm_unacct_memory(pages);
++
++      return -ENOMEM;
++}
++
++static int selinux_netlink_send(struct sk_buff *skb)
++{
++      if (capable(CAP_NET_ADMIN))
++              cap_raise (NETLINK_CB (skb).eff_cap, CAP_NET_ADMIN);
++      else
++              NETLINK_CB(skb).eff_cap = 0;
++      return 0;
++}
++
++static int selinux_netlink_recv(struct sk_buff *skb)
++{
++      if (!cap_raised(NETLINK_CB(skb).eff_cap, CAP_NET_ADMIN))
++              return -EPERM;
++      return 0;
++}
++
++/* binprm security operations */
++
++static int selinux_bprm_alloc_security(struct linux_binprm *bprm)
++{
++      int rc;
++
++      /* Make sure that the secondary module doesn't use the
++         bprm->security field, since we do not yet support chaining
++         of multiple security structures on the field.  Neither
++         the dummy nor the capability module use the field.  The owlsm
++         module uses the field if CONFIG_OWLSM_FD is enabled. */
++      rc = secondary_ops->bprm_alloc_security(bprm);
++      if (rc)
++              return rc;
++      if (bprm->security) {
++              printk(KERN_WARNING "%s: no support yet for chaining on the "
++                     "security field by secondary modules.\n", __FUNCTION__);
++              /* Release the secondary module's security object. */
++              secondary_ops->bprm_free_security(bprm);
++              /* Unregister the secondary module to prevent problems
++                 with subsequent binprm hooks. This will revert to the
++                 original (dummy) module for the secondary operations. */
++              rc = security_ops->unregister_security("unknown", secondary_ops);
++              if (rc)
++                      return rc;
++              printk(KERN_WARNING "%s: Unregistered the secondary security "
++                     "module.\n", __FUNCTION__);
++      }
++      bprm->security = NULL;
++      return 0;
++}
++
++static int selinux_bprm_set_security(struct linux_binprm *bprm)
++{
++      struct task_security_struct *tsec;
++      struct inode *inode = bprm->file->f_dentry->d_inode;
++      struct inode_security_struct *isec;
++      u32 newsid;
++      struct avc_audit_data ad;
++      int rc;
++
++      rc = secondary_ops->bprm_set_security(bprm);
++      if (rc)
++              return rc;
++
++      if (bprm->sh_bang || bprm->security)
++              /* The security field should already be set properly. */
++              return 0;
++
++      tsec = current->security;
++      isec = inode->i_security;
++
++      /* Default to the current task SID. */
++      bprm->security = (void *)tsec->sid;
++
++      /* Reset create SID on execve. */
++      tsec->create_sid = 0;
++
++      if (tsec->exec_sid) {
++              newsid = tsec->exec_sid;
++              /* Reset exec SID on execve. */
++              tsec->exec_sid = 0;
++      } else {
++              /* Check for a default transition on this program. */
++              rc = security_transition_sid(tsec->sid, isec->sid,
++                                           SECCLASS_PROCESS, &newsid);
++              if (rc)
++                      return rc;
++      }
++
++      AVC_AUDIT_DATA_INIT(&ad, FS);
++      ad.u.fs.mnt = bprm->file->f_vfsmnt;
++      ad.u.fs.dentry = bprm->file->f_dentry;
++
++      if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)
++              newsid = tsec->sid;
++
++        if (tsec->sid == newsid) {
++              rc = avc_has_perm(tsec->sid, isec->sid,
++                                SECCLASS_FILE, FILE__EXECUTE_NO_TRANS,
++                                &isec->avcr, &ad);
++              if (rc)
++                      return rc;
++      } else {
++              /* Check permissions for the transition. */
++              rc = avc_has_perm(tsec->sid, newsid,
++                                SECCLASS_PROCESS, PROCESS__TRANSITION,
++                                NULL,
++                                &ad);
++              if (rc)
++                      return rc;
++
++              rc = avc_has_perm(newsid, isec->sid,
++                                SECCLASS_FILE, FILE__ENTRYPOINT,
++                                &isec->avcr, &ad);
++              if (rc)
++                      return rc;
++
++              /* Set the security field to the new SID. */
++              bprm->security = (void*) newsid;
++      }
++
++      return 0;
++}
++
++static int selinux_bprm_check_security (struct linux_binprm *bprm)
++{
++      return 0;
++}
++
++
++static int selinux_bprm_secureexec (struct linux_binprm *bprm)
++{
++      struct task_security_struct *tsec = current->security;
++      int atsecure = 0;
++
++      if (tsec->osid != tsec->sid) {
++              /* Enable secure mode for SIDs transitions unless
++                 the noatsecure permission is granted between
++                 the two SIDs, i.e. ahp returns 0. */
++              atsecure = avc_has_perm(tsec->osid, tsec->sid,
++                                       SECCLASS_PROCESS,
++                                       PROCESS__NOATSECURE, NULL, NULL);
++      }
++
++      /* Note that we must include the legacy uid/gid test below
++         to retain it, as the new userland will simply use the
++         value passed by AT_SECURE to decide whether to enable
++         secure mode. */
++      return ( atsecure || current->euid != current->uid ||
++              current->egid != current->gid);
++}
++
++static void selinux_bprm_free_security(struct linux_binprm *bprm)
++{
++      /* Nothing to do - not dynamically allocated. */
++      return;
++}
++
++/* Derived from fs/exec.c:flush_old_files. */
++static inline void flush_unauthorized_files(struct files_struct * files)
++{
++      struct avc_audit_data ad;
++      struct file *file;
++      long j = -1;
++
++      AVC_AUDIT_DATA_INIT(&ad,FS);
++
++      spin_lock(&files->file_lock);
++      for (;;) {
++              unsigned long set, i;
++
++              j++;
++              i = j * __NFDBITS;
++              if (i >= files->max_fds || i >= files->max_fdset)
++                      break;
++              set = files->open_fds->fds_bits[j];
++              if (!set)
++                      continue;
++              spin_unlock(&files->file_lock);
++              for ( ; set ; i++,set >>= 1) {
++                      if (set & 1) {
++                              file = fget(i);
++                              if (!file)
++                                      continue;
++                              if (file_has_perm(current,
++                                                file,
++                                                file_to_av(file)))
++                                      sys_close(i);
++                              fput(file);
++                      }
++              }
++              spin_lock(&files->file_lock);
++
++      }
++      spin_unlock(&files->file_lock);
++}
++
++static void selinux_bprm_compute_creds(struct linux_binprm *bprm)
++{
++      struct task_security_struct *tsec, *psec;
++      u32 sid;
++      struct av_decision avd;
++      int rc;
++
++      secondary_ops->bprm_compute_creds(bprm);
++
++      tsec = current->security;
++
++      sid = (u32)bprm->security;
++      if (!sid)
++              sid = tsec->sid;
++
++      tsec->osid = tsec->sid;
++      if (tsec->sid != sid) {
++              /* Check for shared state.  If not ok, leave SID
++                 unchanged and kill. */
++              if ((atomic_read(&current->fs->count) > 1 ||
++                   atomic_read(&current->files->count) > 1 ||
++                   atomic_read(&current->sighand->count) > 1)) {
++                      rc = avc_has_perm(tsec->sid, sid,
++                                        SECCLASS_PROCESS, PROCESS__SHARE,
++                                        NULL, NULL);
++                      if (rc) {
++                              force_sig_specific(SIGKILL, current);
++                              return;
++                      }
++              }
++
++              /* Check for ptracing, and update the task SID if ok.
++                 Otherwise, leave SID unchanged and kill. */
++              task_lock(current);
++              if (current->ptrace & PT_PTRACED) {
++                      psec = current->parent->security;
++                      rc = avc_has_perm_noaudit(psec->sid, sid,
++                                        SECCLASS_PROCESS, PROCESS__PTRACE,
++                                        NULL, &avd);
++                      if (!rc)
++                              tsec->sid = sid;
++                      task_unlock(current);
++                      avc_audit(psec->sid, sid, SECCLASS_PROCESS,
++                                PROCESS__PTRACE, &avd, rc, NULL);
++                      if (rc) {
++                              force_sig_specific(SIGKILL, current);
++                              return;
++                      }
++              } else {
++                      tsec->sid = sid;
++                      task_unlock(current);
++              }
++
++              /* Close files for which the new task SID is not authorized. */
++              flush_unauthorized_files(current->files);
++
++              /* Wake up the parent if it is waiting so that it can
++                 recheck wait permission to the new task SID. */
++              wake_up_interruptible(&current->parent->wait_chldexit);
++      }
++}
++
++/* superblock security operations */
++
++static int selinux_sb_alloc_security(struct super_block *sb)
++{
++      return superblock_alloc_security(sb);
++}
++
++static void selinux_sb_free_security(struct super_block *sb)
++{
++      superblock_free_security(sb);
++}
++
++static int selinux_sb_kern_mount(struct super_block *sb)
++{
++      struct avc_audit_data ad;
++      int rc;
++
++      rc = superblock_doinit(sb);
++      if (rc)
++              return rc;
++
++      AVC_AUDIT_DATA_INIT(&ad,FS);
++      ad.u.fs.dentry = sb->s_root;
++      return superblock_has_perm(current, sb, FILESYSTEM__MOUNT, &ad);
++}
++
++static int selinux_sb_statfs(struct super_block *sb)
++{
++      struct avc_audit_data ad;
++
++      AVC_AUDIT_DATA_INIT(&ad,FS);
++      ad.u.fs.dentry = sb->s_root;
++      return superblock_has_perm(current, sb, FILESYSTEM__GETATTR, &ad);
++}
++
++static int selinux_mount(char * dev_name,
++                         struct nameidata *nd,
++                         char * type,
++                         unsigned long flags,
++                         void * data)
++{
++      if (flags & MS_REMOUNT)
++              return superblock_has_perm(current, nd->mnt->mnt_sb,
++                                         FILESYSTEM__REMOUNT, NULL);
++      else
++              return dentry_has_perm(current, nd->mnt, nd->dentry,
++                                     FILE__MOUNTON);
++}
++
++static int selinux_umount(struct vfsmount *mnt, int flags)
++{
++      return superblock_has_perm(current,mnt->mnt_sb,
++                                 FILESYSTEM__UNMOUNT,NULL);
++}
++
++/* inode security operations */
++
++static int selinux_inode_alloc_security(struct inode *inode)
++{
++      return inode_alloc_security(inode);
++}
++
++static void selinux_inode_free_security(struct inode *inode)
++{
++      inode_free_security(inode);
++}
++
++static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
++{
++      return may_create(dir, dentry, SECCLASS_FILE);
++}
++
++static void selinux_inode_post_create(struct inode *dir, struct dentry *dentry, int mask)
++{
++      post_create(dir, dentry);
++}
++
++static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
++{
++      int rc;
++
++      rc = secondary_ops->inode_link(old_dentry,dir,new_dentry);
++      if (rc)
++              return rc;
++      return may_link(dir, old_dentry, MAY_LINK);
++}
++
++static void selinux_inode_post_link(struct dentry *old_dentry, struct inode *inode, struct dentry *new_dentry)
++{
++      return;
++}
++
++static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
++{
++      return may_link(dir, dentry, MAY_UNLINK);
++}
++
++static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
++{
++      return may_create(dir, dentry, SECCLASS_LNK_FILE);
++}
++
++static void selinux_inode_post_symlink(struct inode *dir, struct dentry *dentry, const char *name)
++{
++      post_create(dir, dentry);
++}
++
++static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
++{
++      return may_create(dir, dentry, SECCLASS_DIR);
++}
++
++static void selinux_inode_post_mkdir(struct inode *dir, struct dentry *dentry, int mask)
++{
++      post_create(dir, dentry);
++}
++
++static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
++{
++      return may_link(dir, dentry, MAY_RMDIR);
++}
++
++static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
++{
++      return may_create(dir, dentry, inode_mode_to_security_class(mode));
++}
++
++static void selinux_inode_post_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
++{
++      post_create(dir, dentry);
++}
++
++static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
++                                struct inode *new_inode, struct dentry *new_dentry)
++{
++      return may_rename(old_inode, old_dentry, new_inode, new_dentry);
++}
++
++static void selinux_inode_post_rename(struct inode *old_inode, struct dentry *old_dentry,
++                                      struct inode *new_inode, struct dentry *new_dentry)
++{
++      return;
++}
++
++static int selinux_inode_readlink(struct dentry *dentry)
++{
++      return dentry_has_perm(current, NULL, dentry, FILE__READ);
++}
++
++static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
++{
++      int rc;
++
++      rc = secondary_ops->inode_follow_link(dentry,nameidata);
++      if (rc)
++              return rc;
++      return dentry_has_perm(current, NULL, dentry, FILE__READ);
++}
++
++static int selinux_inode_permission(struct inode *inode, int mask)
++{
++      if (!mask) {
++              /* No permission to check.  Existence test. */
++              return 0;
++      }
++
++      return inode_has_perm(current, inode,
++                             file_mask_to_av(inode->i_mode, mask), NULL, NULL);
++}
++
++static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
++{
++      if (iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
++                             ATTR_ATIME_SET | ATTR_MTIME_SET))
++              return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
++
++      return dentry_has_perm(current, NULL, dentry, FILE__WRITE);
++}
++
++static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
++{
++      return dentry_has_perm(current, mnt, dentry, FILE__GETATTR);
++}
++
++static int selinux_inode_setxattr(struct dentry *dentry, char *name, void *value, size_t size, int flags)
++{
++      struct task_security_struct *tsec = current->security;
++      struct inode *inode = dentry->d_inode;
++      struct inode_security_struct *isec = inode->i_security;
++      struct superblock_security_struct *sbsec;
++      struct avc_audit_data ad;
++      u32 newsid;
++      int rc = 0;
++
++      if (strcmp(name, XATTR_NAME_SELINUX)) {
++              if (!strncmp(name, XATTR_SECURITY_PREFIX,
++                           sizeof XATTR_SECURITY_PREFIX - 1) &&
++                  !capable(CAP_SYS_ADMIN)) {
++                      /* A different attribute in the security namespace.
++                         Restrict to administrator. */
++                      return -EPERM;
++              }
++
++              /* Not an attribute we recognize, so just check the
++                 ordinary setattr permission. */
++              return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
++      }
++
++      AVC_AUDIT_DATA_INIT(&ad,FS);
++      ad.u.fs.dentry = dentry;
++
++      rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                        FILE__RELABELFROM,
++                        &isec->avcr, &ad);
++      if (rc)
++              return rc;
++
++      rc = security_context_to_sid(value, size, &newsid);
++      if (rc)
++              return rc;
++
++      rc = avc_has_perm(tsec->sid, newsid, isec->sclass,
++                        FILE__RELABELTO, NULL, &ad);
++      if (rc)
++              return rc;
++
++      sbsec = inode->i_sb->s_security;
++      if (!sbsec)
++              return 0;
++
++      return avc_has_perm(newsid,
++                          sbsec->sid,
++                          SECCLASS_FILESYSTEM,
++                          FILESYSTEM__ASSOCIATE,
++                          NULL,
++                          &ad);
++}
++
++static void selinux_inode_post_setxattr(struct dentry *dentry, char *name,
++                                        void *value, size_t size, int flags)
++{
++      struct inode *inode = dentry->d_inode;
++      struct inode_security_struct *isec = inode->i_security;
++      u32 newsid;
++      int rc;
++
++      if (strcmp(name, XATTR_NAME_SELINUX)) {
++              /* Not an attribute we recognize, so nothing to do. */
++              return;
++      }
++
++      rc = security_context_to_sid(value, size, &newsid);
++      if (rc) {
++              printk(KERN_WARNING "%s:  unable to obtain SID for context "
++                     "%s, rc=%d\n", __FUNCTION__, (char*)value, -rc);
++              return;
++      }
++
++      isec->sid = newsid;
++      return;
++}
++
++static int selinux_inode_getxattr (struct dentry *dentry, char *name)
++{
++      return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
++}
++
++static int selinux_inode_listxattr (struct dentry *dentry)
++{
++      return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
++}
++
++static int selinux_inode_removexattr (struct dentry *dentry, char *name)
++{
++      if (strcmp(name, XATTR_NAME_SELINUX)) {
++              if (!strncmp(name, XATTR_SECURITY_PREFIX,
++                           sizeof XATTR_SECURITY_PREFIX - 1) &&
++                  !capable(CAP_SYS_ADMIN)) {
++                      /* A different attribute in the security namespace.
++                         Restrict to administrator. */
++                      return -EPERM;
++              }
++
++              /* Not an attribute we recognize, so just check the
++                 ordinary setattr permission. Might want a separate
++                 permission for removexattr. */
++              return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
++      }
++
++      /* No one is allowed to remove a SELinux security label.
++         You can change the label, but all data must be labeled. */
++      return -EACCES;
++}
++
++static int selinux_inode_getsecurity(struct dentry *dentry, const char *name, void *buffer, size_t size)
++{
++      struct inode *inode = dentry->d_inode;
++      struct inode_security_struct *isec = inode->i_security;
++      char *context;
++      unsigned len;
++      int rc;
++
++      /* Permission check handled by selinux_inode_getxattr hook.*/
++
++      if (strcmp(name, XATTR_SELINUX_SUFFIX))
++              return -EOPNOTSUPP;
++
++      rc = security_sid_to_context(isec->sid, &context, &len);
++      if (rc)
++              return rc;
++
++      if (!buffer || !size) {
++              kfree(context);
++              return len;
++      }
++      if (size < len) {
++              kfree(context);
++              return -ERANGE;
++      }
++      memcpy(buffer, context, len);
++      kfree(context);
++      return len;
++}
++
++static int selinux_inode_setsecurity(struct dentry *dentry, const char *name,
++                                     const void *value, size_t size, int flags)
++{
++      struct inode *inode = dentry->d_inode;
++      struct inode_security_struct *isec = inode->i_security;
++      u32 newsid;
++      int rc;
++
++      if (strcmp(name, XATTR_SELINUX_SUFFIX))
++              return -EOPNOTSUPP;
++
++      if (!value || !size)
++              return -EACCES;
++
++      rc = security_context_to_sid((void*)value, size, &newsid);
++      if (rc)
++              return rc;
++
++      isec->sid = newsid;
++      return 0;
++}
++
++static int selinux_inode_listsecurity(struct dentry *dentry, char *buffer)
++{
++      const int len = sizeof(XATTR_NAME_SELINUX);
++      if (buffer)
++              memcpy(buffer, XATTR_NAME_SELINUX, len);
++      return len;
++}
++
++/* file security operations */
++
++static int selinux_file_permission(struct file *file, int mask)
++{
++      struct inode *inode = file->f_dentry->d_inode;
++
++      if (!mask) {
++              /* No permission to check.  Existence test. */
++              return 0;
++      }
++
++      /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
++      if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
++              mask |= MAY_APPEND;
++
++      return file_has_perm(current, file,
++                           file_mask_to_av(inode->i_mode, mask));
++}
++
++static int selinux_file_alloc_security(struct file *file)
++{
++      return file_alloc_security(file);
++}
++
++static void selinux_file_free_security(struct file *file)
++{
++      file_free_security(file);
++}
++
++static int selinux_file_ioctl(struct file *file, unsigned int cmd,
++                            unsigned long arg)
++{
++      int error = 0;
++
++      switch (cmd) {
++              case FIONREAD:
++              /* fall through */
++              case FIBMAP:
++              /* fall through */
++              case FIGETBSZ:
++              /* fall through */
++              case EXT2_IOC_GETFLAGS:
++              /* fall through */
++              case EXT2_IOC_GETVERSION:
++                      error = file_has_perm(current, file, FILE__GETATTR);
++                      break;
++
++              case EXT2_IOC_SETFLAGS:
++              /* fall through */
++              case EXT2_IOC_SETVERSION:
++                      error = file_has_perm(current, file, FILE__SETATTR);
++                      break;
++
++              /* sys_ioctl() checks */
++              case FIONBIO:
++              /* fall through */
++              case FIOASYNC:
++                      error = file_has_perm(current, file, 0);
++                      break;
++
++              case KDSKBENT:
++              case KDSKBSENT:
++                      if (!capable(CAP_SYS_TTY_CONFIG))
++                              error = -EPERM;
++                      break;
++
++              /* default case assumes that the command will go
++               * to the file's ioctl() function.
++               */
++              default:
++                      error = file_has_perm(current, file, FILE__IOCTL);
++
++      }
++      return error;
++}
++
++static int selinux_file_mmap(struct file *file, unsigned long prot, unsigned long flags)
++{
++      u32 av;
++
++      if (file) {
++              /* read access is always possible with a mapping */
++              av = FILE__READ;
++
++              /* write access only matters if the mapping is shared */
++              if ((flags & MAP_TYPE) == MAP_SHARED && (prot & PROT_WRITE))
++                      av |= FILE__WRITE;
++
++              if (prot & PROT_EXEC)
++                      av |= FILE__EXECUTE;
++
++              return file_has_perm(current, file, av);
++      }
++      return 0;
++}
++
++static int selinux_file_mprotect(struct vm_area_struct *vma,
++                               unsigned long prot)
++{
++      return selinux_file_mmap(vma->vm_file, prot, vma->vm_flags);
++}
++
++static int selinux_file_lock(struct file *file, unsigned int cmd)
++{
++      return file_has_perm(current, file, FILE__LOCK);
++}
++
++static int selinux_file_fcntl(struct file *file, unsigned int cmd,
++                            unsigned long arg)
++{
++      int err = 0;
++
++      switch (cmd) {
++              case F_SETFL:
++                      if (!file->f_dentry || !file->f_dentry->d_inode) {
++                              err = -EINVAL;
++                              break;
++                      }
++
++                      if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
++                              err = file_has_perm(current, file,FILE__WRITE);
++                              break;
++                      }
++                      /* fall through */
++              case F_SETOWN:
++              case F_SETSIG:
++              case F_GETFL:
++              case F_GETOWN:
++              case F_GETSIG:
++                      /* Just check FD__USE permission */
++                      err = file_has_perm(current, file, 0);
++                      break;
++              case F_GETLK:
++              case F_SETLK:
++              case F_SETLKW:
++              case F_GETLK64:
++              case F_SETLK64:
++              case F_SETLKW64:
++                      if (!file->f_dentry || !file->f_dentry->d_inode) {
++                              err = -EINVAL;
++                              break;
++                      }
++                      err = file_has_perm(current, file, FILE__LOCK);
++                      break;
++      }
++
++      return err;
++}
++
++static int selinux_file_set_fowner(struct file *file)
++{
++      struct task_security_struct *tsec;
++      struct file_security_struct *fsec;
++
++      tsec = current->security;
++      fsec = file->f_security;
++      fsec->fown_sid = tsec->sid;
++
++      return 0;
++}
++
++static int selinux_file_send_sigiotask(struct task_struct *tsk,
++                                     struct fown_struct *fown,
++                                     int fd, int reason)
++{
++        struct file *file;
++      u32 perm;
++      struct task_security_struct *tsec;
++      struct file_security_struct *fsec;
++
++      /* struct fown_struct is never outside the context of a struct file */
++        file = (struct file *)((long)fown - offsetof(struct file,f_owner));
++
++      tsec = tsk->security;
++      fsec = file->f_security;
++
++      if (!fown->signum)
++              perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
++      else
++              perm = signal_to_av(fown->signum);
++
++      return avc_has_perm(fsec->fown_sid, tsec->sid,
++                          SECCLASS_PROCESS, perm, NULL, NULL);
++}
++
++static int selinux_file_receive(struct file *file)
++{
++      return file_has_perm(current, file, file_to_av(file));
++}
++
++/* task security operations */
++
++static int selinux_task_create(unsigned long clone_flags)
++{
++      return task_has_perm(current, current, PROCESS__FORK);
++}
++
++static int selinux_task_alloc_security(struct task_struct *tsk)
++{
++      struct task_security_struct *tsec1, *tsec2;
++      int rc;
++
++      tsec1 = current->security;
++
++      rc = task_alloc_security(tsk);
++      if (rc)
++              return rc;
++      tsec2 = tsk->security;
++
++      tsec2->osid = tsec1->osid;
++      tsec2->sid = tsec1->sid;
++
++      /* Retain the exec and create SIDs across fork */
++      tsec2->exec_sid = tsec1->exec_sid;
++      tsec2->create_sid = tsec1->create_sid;
++
++      return 0;
++}
++
++static void selinux_task_free_security(struct task_struct *tsk)
++{
++      task_free_security(tsk);
++}
++
++static int selinux_task_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
++{
++      /* Since setuid only affects the current process, and
++         since the SELinux controls are not based on the Linux
++         identity attributes, SELinux does not need to control
++         this operation.  However, SELinux does control the use
++         of the CAP_SETUID and CAP_SETGID capabilities using the
++         capable hook. */
++      return 0;
++}
++
++static int selinux_task_post_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
++{
++      return secondary_ops->task_post_setuid(id0,id1,id2,flags);
++}
++
++static int selinux_task_setgid(gid_t id0, gid_t id1, gid_t id2, int flags)
++{
++      /* See the comment for setuid above. */
++      return 0;
++}
++
++static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
++{
++      return task_has_perm(current, p, PROCESS__SETPGID);
++}
++
++static int selinux_task_getpgid(struct task_struct *p)
++{
++      return task_has_perm(current, p, PROCESS__GETPGID);
++}
++
++static int selinux_task_getsid(struct task_struct *p)
++{
++      return task_has_perm(current, p, PROCESS__GETSESSION);
++}
++
++static int selinux_task_setgroups(int gidsetsize, gid_t *grouplist)
++{
++      /* See the comment for setuid above. */
++      return 0;
++}
++
++static int selinux_task_setnice(struct task_struct *p, int nice)
++{
++      return task_has_perm(current,p, PROCESS__SETSCHED);
++}
++
++static int selinux_task_setrlimit(unsigned int resource, struct rlimit *new_rlim)
++{
++      /* SELinux does not currently provide a process
++         resource limit policy based on security contexts.
++         It does control the use of the CAP_SYS_RESOURCE capability
++         using the capable hook. */
++      return 0;
++}
++
++static int selinux_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp)
++{
++      struct task_security_struct *tsec1, *tsec2;
++
++      tsec1 = current->security;
++      tsec2 = p->security;
++
++      /* No auditing from the setscheduler hook, since the runqueue lock
++         is held and the system will deadlock if we try to log an audit
++         message. */
++      return avc_has_perm_noaudit(tsec1->sid, tsec2->sid,
++                                  SECCLASS_PROCESS, PROCESS__SETSCHED,
++                                  &tsec2->avcr, NULL);
++}
++
++static int selinux_task_getscheduler(struct task_struct *p)
++{
++      return task_has_perm(current, p, PROCESS__GETSCHED);
++}
++
++static int selinux_task_kill(struct task_struct *p, struct siginfo *info, int sig)
++{
++      u32 perm;
++
++      if (info && ((unsigned long)info == 1 ||
++                   (unsigned long)info == 2 || SI_FROMKERNEL(info)))
++              return 0;
++
++      if (!sig)
++              perm = PROCESS__SIGNULL; /* null signal; existence test */
++      else
++              perm = signal_to_av(sig);
++
++      return task_has_perm(current, p, perm);
++}
++
++static int selinux_task_prctl(int option,
++                            unsigned long arg2,
++                            unsigned long arg3,
++                            unsigned long arg4,
++                            unsigned long arg5)
++{
++      /* The current prctl operations do not appear to require
++         any SELinux controls since they merely observe or modify
++         the state of the current process. */
++      return 0;
++}
++
++static int selinux_task_wait(struct task_struct *p)
++{
++      u32 perm;
++
++      perm = signal_to_av(p->exit_signal);
++
++      return task_has_perm(p, current, perm);
++}
++
++static void selinux_task_reparent_to_init(struct task_struct *p)
++{
++      struct task_security_struct *tsec;
++
++      secondary_ops->task_reparent_to_init(p);
++
++      tsec = p->security;
++      tsec->osid = tsec->sid;
++      tsec->sid = SECINITSID_KERNEL;
++      return;
++}
++
++static void selinux_task_to_inode(struct task_struct *p,
++                                struct inode *inode)
++{
++      struct task_security_struct *tsec = p->security;
++      struct inode_security_struct *isec = inode->i_security;
++
++      isec->sid = tsec->sid;
++      isec->initialized = 1;
++      return;
++}
++
++#ifdef CONFIG_SECURITY_NETWORK
++
++/* socket security operations */
++static int socket_has_perm(struct task_struct *task, struct socket *sock,
++                         u32 perms)
++{
++      struct inode_security_struct *isec;
++      struct task_security_struct *tsec;
++      struct avc_audit_data ad;
++      int err;
++
++      tsec = task->security;
++      isec = SOCK_INODE(sock)->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad,NET);
++      ad.u.net.sk = sock->sk;
++      err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                         perms, &isec->avcr, &ad);
++
++      return err;
++}
++
++static int selinux_socket_create(int family, int type, int protocol)
++{
++      int err;
++      struct task_security_struct *tsec;
++
++      tsec = current->security;
++
++      err = avc_has_perm(tsec->sid, tsec->sid,
++                         socket_type_to_security_class(family, type),
++                         SOCKET__CREATE, NULL, NULL);
++
++      return err;
++}
++
++static void selinux_socket_post_create(struct socket *sock, int family, int type, int protocol)
++{
++      int err;
++      struct inode_security_struct *isec;
++      struct task_security_struct *tsec;
++
++      err = inode_doinit(SOCK_INODE(sock));
++      if (err < 0)
++              return;
++      isec = SOCK_INODE(sock)->i_security;
++
++      tsec = current->security;
++      isec->sclass = socket_type_to_security_class(family, type);
++      isec->sid = tsec->sid;
++
++      return;
++}
++
++/* Range of port numbers used to automatically bind.
++   Need to determine whether we should perform a name_bind
++   permission check between the socket and the port number. */
++#define ip_local_port_range_0 sysctl_local_port_range[0]
++#define ip_local_port_range_1 sysctl_local_port_range[1]
++
++static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
++{
++      int err;
++
++      err = socket_has_perm(current, sock, SOCKET__BIND);
++      if (err)
++              return err;
++
++      /*
++       * If PF_INET, check name_bind permission for the port.
++       */
++      if (sock->sk->sk_family == PF_INET) {
++              struct inode_security_struct *isec;
++              struct task_security_struct *tsec;
++              struct avc_audit_data ad;
++              struct sockaddr_in *addr = (struct sockaddr_in *)address;
++              unsigned short snum = ntohs(addr->sin_port);
++              struct sock *sk = sock->sk;
++              u32 sid;
++
++              tsec = current->security;
++              isec = SOCK_INODE(sock)->i_security;
++
++              if (snum&&(snum < max(PROT_SOCK,ip_local_port_range_0) ||
++                         snum > ip_local_port_range_1)) {
++                      err = security_port_sid(sk->sk_family, sk->sk_type,
++                                              sk->sk_protocol, snum, &sid);
++                      if (err)
++                              return err;
++                      AVC_AUDIT_DATA_INIT(&ad,NET);
++                      ad.u.net.port = snum;
++                      err = avc_has_perm(isec->sid, sid,
++                                         isec->sclass,
++                                         SOCKET__NAME_BIND, NULL, &ad);
++                      if (err)
++                              return err;
++              }
++      }
++
++      return 0;
++}
++
++static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
++{
++      int err;
++      struct sock *sk = sock->sk;
++      struct avc_audit_data ad;
++      struct task_security_struct *tsec;
++      struct inode_security_struct *isec;
++
++      isec = SOCK_INODE(sock)->i_security;
++
++      tsec = current->security;
++
++      AVC_AUDIT_DATA_INIT(&ad, NET);
++      ad.u.net.sk = sk;
++      err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                         SOCKET__CONNECT, &isec->avcr, &ad);
++      if (err)
++              return err;
++
++      return 0;
++}
++
++static int selinux_socket_listen(struct socket *sock, int backlog)
++{
++      int err;
++      struct task_security_struct *tsec;
++      struct inode_security_struct *isec;
++      struct avc_audit_data ad;
++
++      tsec = current->security;
++
++      isec = SOCK_INODE(sock)->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad, NET);
++      ad.u.net.sk = sock->sk;
++
++      err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                         SOCKET__LISTEN, &isec->avcr, &ad);
++      if (err)
++              return err;
++
++      return 0;
++}
++
++static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
++{
++      int err;
++      struct task_security_struct *tsec;
++      struct inode_security_struct *isec;
++      struct inode_security_struct *newisec;
++      struct avc_audit_data ad;
++
++      tsec = current->security;
++
++      isec = SOCK_INODE(sock)->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad, NET);
++      ad.u.net.sk = sock->sk;
++
++      err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                         SOCKET__ACCEPT, &isec->avcr, &ad);
++      if (err)
++              return err;
++
++      err = inode_doinit(SOCK_INODE(newsock));
++      if (err < 0)
++              return err;
++      newisec = SOCK_INODE(newsock)->i_security;
++
++      newisec->sclass = isec->sclass;
++      newisec->sid = isec->sid;
++
++      return 0;
++}
++
++static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
++                                int size)
++{
++      struct task_security_struct *tsec;
++      struct inode_security_struct *isec;
++      struct avc_audit_data ad;
++      struct sock *sk;
++      int err;
++
++      isec = SOCK_INODE(sock)->i_security;
++
++      tsec = current->security;
++
++      sk = sock->sk;
++
++      AVC_AUDIT_DATA_INIT(&ad, NET);
++      ad.u.net.sk = sk;
++      err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                         SOCKET__WRITE, &isec->avcr, &ad);
++      if (err)
++              return err;
++
++      return 0;
++}
++
++static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
++                                int size, int flags)
++{
++      struct inode_security_struct *isec;
++      struct task_security_struct *tsec;
++      struct avc_audit_data ad;
++      int err;
++
++      isec = SOCK_INODE(sock)->i_security;
++      tsec = current->security;
++
++      AVC_AUDIT_DATA_INIT(&ad,NET);
++      ad.u.net.sk = sock->sk;
++      err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                         SOCKET__READ, &isec->avcr, &ad);
++      if (err)
++              return err;
++
++      return 0;
++}
++
++static int selinux_socket_getsockname(struct socket *sock)
++{
++      struct inode_security_struct *isec;
++      struct task_security_struct *tsec;
++      struct avc_audit_data ad;
++      int err;
++
++      tsec = current->security;
++      isec = SOCK_INODE(sock)->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad,NET);
++      ad.u.net.sk = sock->sk;
++      err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                         SOCKET__GETATTR, &isec->avcr, &ad);
++      if (err)
++              return err;
++
++      return 0;
++}
++
++static int selinux_socket_getpeername(struct socket *sock)
++{
++      struct inode_security_struct *isec;
++      struct task_security_struct *tsec;
++      struct avc_audit_data ad;
++      int err;
++
++      tsec = current->security;
++      isec = SOCK_INODE(sock)->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad,NET);
++      ad.u.net.sk = sock->sk;
++      err = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
++                         SOCKET__GETATTR, &isec->avcr, &ad);
++      if (err)
++              return err;
++
++      return 0;
++}
++
++static int selinux_socket_setsockopt(struct socket *sock,int level,int optname)
++{
++      return socket_has_perm(current, sock, SOCKET__SETOPT);
++}
++
++static int selinux_socket_getsockopt(struct socket *sock, int level,
++                                   int optname)
++{
++      return socket_has_perm(current, sock, SOCKET__GETOPT);
++}
++
++static int selinux_socket_shutdown(struct socket *sock, int how)
++{
++      return socket_has_perm(current, sock, SOCKET__SHUTDOWN);
++}
++
++static int selinux_socket_unix_stream_connect(struct socket *sock,
++                                            struct socket *other,
++                                            struct sock *newsk)
++{
++      struct inode_security_struct *isec;
++      struct inode_security_struct *other_isec;
++      struct avc_audit_data ad;
++      int err;
++
++      isec = SOCK_INODE(sock)->i_security;
++      other_isec = SOCK_INODE(other)->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad,NET);
++      ad.u.net.sk = other->sk;
++
++      err = avc_has_perm(isec->sid, other_isec->sid,
++                         isec->sclass,
++                         UNIX_STREAM_SOCKET__CONNECTTO,
++                         &other_isec->avcr, &ad);
++      if (err)
++              return err;
++
++      return 0;
++}
++
++static int selinux_socket_unix_may_send(struct socket *sock,
++                                      struct socket *other)
++{
++      struct inode_security_struct *isec;
++      struct inode_security_struct *other_isec;
++      struct avc_audit_data ad;
++      int err;
++
++      isec = SOCK_INODE(sock)->i_security;
++      other_isec = SOCK_INODE(other)->i_security;
++
++      AVC_AUDIT_DATA_INIT(&ad,NET);
++      ad.u.net.sk = other->sk;
++
++      err = avc_has_perm(isec->sid, other_isec->sid,
++                         isec->sclass,
++                         SOCKET__SENDTO,
++                         &other_isec->avcr, &ad);
++      if (err)
++              return err;
++
++      return 0;
++}
++
++#endif
++
++static int ipc_alloc_security(struct task_struct *task,
++                            struct kern_ipc_perm *perm,
++                            u16 sclass)
++{
++      struct task_security_struct *tsec = task->security;
++      struct ipc_security_struct *isec;
++
++      isec = kmalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
++      if (!isec)
++              return -ENOMEM;
++
++      memset(isec, 0, sizeof(struct ipc_security_struct));
++      isec->magic = SELINUX_MAGIC;
++      isec->sclass = sclass;
++      isec->ipc_perm = perm;
++      if (tsec) {
++              isec->sid = tsec->sid;
++      } else {
++              isec->sid = SECINITSID_UNLABELED;
++      }
++      perm->security = isec;
++
++      return 0;
++}
++
++static void ipc_free_security(struct kern_ipc_perm *perm)
++{
++      struct ipc_security_struct *isec = perm->security;
++      if (!isec || isec->magic != SELINUX_MAGIC)
++              return;
++
++      perm->security = NULL;
++      kfree(isec);
++}
++
++static int msg_msg_alloc_security(struct msg_msg *msg)
++{
++      struct msg_security_struct *msec;
++
++      msec = kmalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
++      if (!msec)
++              return -ENOMEM;
++
++      memset(msec, 0, sizeof(struct msg_security_struct));
++      msec->magic = SELINUX_MAGIC;
++      msec->msg = msg;
++      msec->sid = SECINITSID_UNLABELED;
++      msg->security = msec;
++
++      return 0;
++}
++
++static void msg_msg_free_security(struct msg_msg *msg)
++{
++      struct msg_security_struct *msec = msg->security;
++      if (!msec || msec->magic != SELINUX_MAGIC)
++              return;
++
++      msg->security = NULL;
++      kfree(msec);
++}
++
++static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
++                      u16 sclass, u32 perms)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct avc_audit_data ad;
++
++      tsec = current->security;
++      isec = ipc_perms->security;
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = ipc_perms->key;
++
++      return avc_has_perm(tsec->sid, isec->sid, sclass,
++                          perms, &isec->avcr, &ad);
++}
++
++static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
++{
++      return msg_msg_alloc_security(msg);
++}
++
++static void selinux_msg_msg_free_security(struct msg_msg *msg)
++{
++      return msg_msg_free_security(msg);
++}
++
++/* message queue security operations */
++static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct avc_audit_data ad;
++      int rc;
++
++      rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
++      if (rc)
++              return rc;
++
++      tsec = current->security;
++      isec = msq->q_perm.security;
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = msq->q_perm.key;
++
++      rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
++                        MSGQ__CREATE, &isec->avcr, &ad);
++      if (rc) {
++              ipc_free_security(&msq->q_perm);
++              return rc;
++      }
++      return 0;
++}
++
++static void selinux_msg_queue_free_security(struct msg_queue *msq)
++{
++      ipc_free_security(&msq->q_perm);
++}
++
++static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct avc_audit_data ad;
++
++      tsec = current->security;
++      isec = msq->q_perm.security;
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = msq->q_perm.key;
++
++      return avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
++                          MSGQ__ASSOCIATE, &isec->avcr, &ad);
++}
++
++static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
++{
++      int err;
++      int perms;
++
++      switch(cmd) {
++      case IPC_INFO:
++      case MSG_INFO:
++              /* No specific object, just general system-wide information. */
++              return task_has_system(current, SYSTEM__IPC_INFO);
++      case IPC_STAT:
++      case MSG_STAT:
++              perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
++              break;
++      case IPC_SET:
++              perms = MSGQ__SETATTR;
++              break;
++      case IPC_RMID:
++              perms = MSGQ__DESTROY;
++              break;
++      default:
++              return 0;
++      }
++
++      err = ipc_has_perm(&msq->q_perm, SECCLASS_MSGQ, perms);
++      return err;
++}
++
++static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct msg_security_struct *msec;
++      struct avc_audit_data ad;
++      int rc;
++
++      tsec = current->security;
++      isec = msq->q_perm.security;
++      msec = msg->security;
++
++      /*
++       * First time through, need to assign label to the message
++       */
++      if (msec->sid == SECINITSID_UNLABELED) {
++              /*
++               * Compute new sid based on current process and
++               * message queue this message will be stored in
++               */
++              rc = security_transition_sid(tsec->sid,
++                                           isec->sid,
++                                           SECCLASS_MSG,
++                                           &msec->sid);
++              if (rc)
++                      return rc;
++      }
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = msq->q_perm.key;
++
++      /* Can this process write to the queue? */
++      rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_MSGQ,
++                        MSGQ__WRITE, &isec->avcr, &ad);
++      if (!rc)
++              /* Can this process send the message */
++              rc = avc_has_perm(tsec->sid, msec->sid,
++                                SECCLASS_MSG, MSG__SEND,
++                                &msec->avcr, &ad);
++      if (!rc)
++              /* Can the message be put in the queue? */
++              rc = avc_has_perm(msec->sid, isec->sid,
++                                SECCLASS_MSGQ, MSGQ__ENQUEUE,
++                                &isec->avcr, &ad);
++
++      return rc;
++}
++
++static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
++                                  struct task_struct *target,
++                                  long type, int mode)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct msg_security_struct *msec;
++      struct avc_audit_data ad;
++      int rc;
++
++      tsec = target->security;
++      isec = msq->q_perm.security;
++      msec = msg->security;
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = msq->q_perm.key;
++
++      rc = avc_has_perm(tsec->sid, isec->sid,
++                        SECCLASS_MSGQ, MSGQ__READ,
++                        &isec->avcr, &ad);
++      if (!rc)
++              rc = avc_has_perm(tsec->sid, msec->sid,
++                                SECCLASS_MSG, MSG__RECEIVE,
++                                &msec->avcr, &ad);
++      return rc;
++}
++
++/* Shared Memory security operations */
++static int selinux_shm_alloc_security(struct shmid_kernel *shp)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct avc_audit_data ad;
++      int rc;
++
++      rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
++      if (rc)
++              return rc;
++
++      tsec = current->security;
++      isec = shp->shm_perm.security;
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = shp->shm_perm.key;
++
++      rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_SHM,
++                        SHM__CREATE, &isec->avcr, &ad);
++      if (rc) {
++              ipc_free_security(&shp->shm_perm);
++              return rc;
++      }
++      return 0;
++}
++
++static void selinux_shm_free_security(struct shmid_kernel *shp)
++{
++      ipc_free_security(&shp->shm_perm);
++}
++
++static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct avc_audit_data ad;
++
++      tsec = current->security;
++      isec = shp->shm_perm.security;
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = shp->shm_perm.key;
++
++      return avc_has_perm(tsec->sid, isec->sid, SECCLASS_SHM,
++                          SHM__ASSOCIATE, &isec->avcr, &ad);
++}
++
++/* Note, at this point, shp is locked down */
++static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
++{
++      int perms;
++      int err;
++
++      switch(cmd) {
++      case IPC_INFO:
++      case SHM_INFO:
++              /* No specific object, just general system-wide information. */
++              return task_has_system(current, SYSTEM__IPC_INFO);
++      case IPC_STAT:
++      case SHM_STAT:
++              perms = SHM__GETATTR | SHM__ASSOCIATE;
++              break;
++      case IPC_SET:
++              perms = SHM__SETATTR;
++              break;
++      case SHM_LOCK:
++      case SHM_UNLOCK:
++              perms = SHM__LOCK;
++              break;
++      case IPC_RMID:
++              perms = SHM__DESTROY;
++              break;
++      default:
++              return 0;
++      }
++
++      err = ipc_has_perm(&shp->shm_perm, SECCLASS_SHM, perms);
++      return err;
++}
++
++static int selinux_shm_shmat(struct shmid_kernel *shp,
++                           char *shmaddr, int shmflg)
++{
++      u32 perms;
++
++      if (shmflg & SHM_RDONLY)
++              perms = SHM__READ;
++      else
++              perms = SHM__READ | SHM__WRITE;
++
++      return ipc_has_perm(&shp->shm_perm, SECCLASS_SHM, perms);
++}
++
++/* Semaphore security operations */
++static int selinux_sem_alloc_security(struct sem_array *sma)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct avc_audit_data ad;
++      int rc;
++
++      rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
++      if (rc)
++              return rc;
++
++      tsec = current->security;
++      isec = sma->sem_perm.security;
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = sma->sem_perm.key;
++
++      rc = avc_has_perm(tsec->sid, isec->sid, SECCLASS_SEM,
++                        SEM__CREATE, &isec->avcr, &ad);
++      if (rc) {
++              ipc_free_security(&sma->sem_perm);
++              return rc;
++      }
++      return 0;
++}
++
++static void selinux_sem_free_security(struct sem_array *sma)
++{
++      ipc_free_security(&sma->sem_perm);
++}
++
++static int selinux_sem_associate(struct sem_array *sma, int semflg)
++{
++      struct task_security_struct *tsec;
++      struct ipc_security_struct *isec;
++      struct avc_audit_data ad;
++
++      tsec = current->security;
++      isec = sma->sem_perm.security;
++
++      AVC_AUDIT_DATA_INIT(&ad, IPC);
++      ad.u.ipc_id = sma->sem_perm.key;
++
++      return avc_has_perm(tsec->sid, isec->sid, SECCLASS_SEM,
++                          SEM__ASSOCIATE, &isec->avcr, &ad);
++}
++
++/* Note, at this point, sma is locked down */
++static int selinux_sem_semctl(struct sem_array *sma, int cmd)
++{
++      int err;
++      u32 perms;
++
++      switch(cmd) {
++      case IPC_INFO:
++      case SEM_INFO:
++              /* No specific object, just general system-wide information. */
++              return task_has_system(current, SYSTEM__IPC_INFO);
++      case GETPID:
++      case GETNCNT:
++      case GETZCNT:
++              perms = SEM__GETATTR;
++              break;
++      case GETVAL:
++      case GETALL:
++              perms = SEM__READ;
++              break;
++      case SETVAL:
++      case SETALL:
++              perms = SEM__WRITE;
++              break;
++      case IPC_RMID:
++              perms = SEM__DESTROY;
++              break;
++      case IPC_SET:
++              perms = SEM__SETATTR;
++              break;
++      case IPC_STAT:
++      case SEM_STAT:
++              perms = SEM__GETATTR | SEM__ASSOCIATE;
++              break;
++      default:
++              return 0;
++      }
++
++      err = ipc_has_perm(&sma->sem_perm, SECCLASS_SEM, perms);
++      return err;
++}
++
++static int selinux_sem_semop(struct sem_array *sma,
++                           struct sembuf *sops, unsigned nsops, int alter)
++{
++      u32 perms;
++
++      if (alter)
++              perms = SEM__READ | SEM__WRITE;
++      else
++              perms = SEM__READ;
++
++      return ipc_has_perm(&sma->sem_perm, SECCLASS_SEM, perms);
++}
++
++static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
++{
++      struct ipc_security_struct *isec = ipcp->security;
++      u16 sclass = SECCLASS_IPC;
++      u32 av = 0;
++
++      if (isec && isec->magic == SELINUX_MAGIC)
++              sclass = isec->sclass;
++
++      av = 0;
++      if (flag & S_IRUGO)
++              av |= IPC__UNIX_READ;
++      if (flag & S_IWUGO)
++              av |= IPC__UNIX_WRITE;
++
++      if (av == 0)
++              return 0;
++
++      return ipc_has_perm(ipcp, sclass, av);
++}
++
++/* module stacking operations */
++int selinux_register_security (const char *name, struct security_operations *ops)
++{
++      if (secondary_ops != original_ops) {
++              printk(KERN_INFO "%s:  There is already a secondary security "
++                     "module registered.\n", __FUNCTION__);
++              return -EINVAL;
++      }
++
++      secondary_ops = ops;
++
++      printk(KERN_INFO "%s:  Registering secondary module %s\n",
++             __FUNCTION__,
++             name);
++
++      return 0;
++}
++
++int selinux_unregister_security (const char *name, struct security_operations *ops)
++{
++      if (ops != secondary_ops) {
++              printk (KERN_INFO "%s:  trying to unregister a security module "
++                      "that is not registered.\n", __FUNCTION__);
++              return -EINVAL;
++      }
++
++      secondary_ops = original_ops;
++
++      return 0;
++}
++
++static void selinux_d_instantiate (struct dentry *dentry, struct inode *inode)
++{
++      if (inode)
++              inode_doinit_with_dentry(inode, dentry);
++}
++
++static int selinux_getprocattr(struct task_struct *p,
++                             char *name, void *value, size_t size)
++{
++      struct task_security_struct *tsec;
++      u32 sid;
++      char *context;
++      size_t len;
++      int error;
++
++      if (current != p) {
++              error = task_has_perm(current, p, PROCESS__GETATTR);
++              if (error)
++                      return error;
++      }
++
++      if (!size)
++              return -ERANGE;
++
++      tsec = p->security;
++
++      if (!strcmp(name, "current"))
++              sid = tsec->sid;
++      else if (!strcmp(name, "prev"))
++              sid = tsec->osid;
++      else if (!strcmp(name, "exec"))
++              sid = tsec->exec_sid;
++      else if (!strcmp(name, "fscreate"))
++              sid = tsec->create_sid;
++      else
++              return -EINVAL;
++
++      if (!sid)
++              return 0;
++
++      error = security_sid_to_context(sid, &context, &len);
++      if (error)
++              return error;
++      if (len > size) {
++              kfree(context);
++              return -ERANGE;
++      }
++      memcpy(value, context, len);
++      kfree(context);
++      return len;
++}
++
++static int selinux_setprocattr(struct task_struct *p,
++                             char *name, void *value, size_t size)
++{
++      struct task_security_struct *tsec;
++      u32 sid = 0;
++      int error;
++
++      if (current != p || !strcmp(name, "current")) {
++              /* SELinux only allows a process to change its own
++                 security attributes, and it only allows the process
++                 current SID to change via exec. */
++              return -EACCES;
++      }
++
++      /*
++       * Basic control over ability to set these attributes at all.
++       * current == p, but we'll pass them separately in case the
++       * above restriction is ever removed.
++       */
++      if (!strcmp(name, "exec"))
++              error = task_has_perm(current, p, PROCESS__SETEXEC);
++      else if (!strcmp(name, "fscreate"))
++              error = task_has_perm(current, p, PROCESS__SETFSCREATE);
++      else
++              error = -EINVAL;
++      if (error)
++              return error;
++
++      /* Obtain a SID for the context, if one was specified. */
++      if (size) {
++              int error;
++              error = security_context_to_sid(value, size, &sid);
++              if (error)
++                      return error;
++      }
++
++      /* Permission checking based on the specified context is
++         performed during the actual operation (execve,
++         open/mkdir/...), when we know the full context of the
++         operation.  See selinux_bprm_set_security for the execve
++         checks and may_create for the file creation checks. The
++         operation will then fail if the context is not permitted. */
++      tsec = p->security;
++      if (!strcmp(name, "exec"))
++              tsec->exec_sid = sid;
++      else if (!strcmp(name, "fscreate"))
++              tsec->create_sid = sid;
++      else
++              return -EINVAL;
++
++      return size;
++}
++
++struct security_operations selinux_ops = {
++      .ptrace =                       selinux_ptrace,
++      .capget =                       selinux_capget,
++      .capset_check =                 selinux_capset_check,
++      .capset_set =                   selinux_capset_set,
++      .sysctl =                       selinux_sysctl,
++      .capable =                      selinux_capable,
++      .quotactl =                     selinux_quotactl,
++      .quota_on =                     selinux_quota_on,
++      .syslog =                       selinux_syslog,
++      .vm_enough_memory =             selinux_vm_enough_memory,
++
++      .netlink_send =                 selinux_netlink_send,
++        .netlink_recv =                       selinux_netlink_recv,
++
++      .bprm_alloc_security =          selinux_bprm_alloc_security,
++      .bprm_free_security =           selinux_bprm_free_security,
++      .bprm_compute_creds =           selinux_bprm_compute_creds,
++      .bprm_set_security =            selinux_bprm_set_security,
++      .bprm_check_security =          selinux_bprm_check_security,
++      .bprm_secureexec =              selinux_bprm_secureexec,
++
++      .sb_alloc_security =            selinux_sb_alloc_security,
++      .sb_free_security =             selinux_sb_free_security,
++      .sb_kern_mount =                selinux_sb_kern_mount,
++      .sb_statfs =                    selinux_sb_statfs,
++      .sb_mount =                     selinux_mount,
++      .sb_umount =                    selinux_umount,
++
++      .inode_alloc_security =         selinux_inode_alloc_security,
++      .inode_free_security =          selinux_inode_free_security,
++      .inode_create =                 selinux_inode_create,
++      .inode_post_create =            selinux_inode_post_create,
++      .inode_link =                   selinux_inode_link,
++      .inode_post_link =              selinux_inode_post_link,
++      .inode_unlink =                 selinux_inode_unlink,
++      .inode_symlink =                selinux_inode_symlink,
++      .inode_post_symlink =           selinux_inode_post_symlink,
++      .inode_mkdir =                  selinux_inode_mkdir,
++      .inode_post_mkdir =             selinux_inode_post_mkdir,
++      .inode_rmdir =                  selinux_inode_rmdir,
++      .inode_mknod =                  selinux_inode_mknod,
++      .inode_post_mknod =             selinux_inode_post_mknod,
++      .inode_rename =                 selinux_inode_rename,
++      .inode_post_rename =            selinux_inode_post_rename,
++      .inode_readlink =               selinux_inode_readlink,
++      .inode_follow_link =            selinux_inode_follow_link,
++      .inode_permission =             selinux_inode_permission,
++      .inode_setattr =                selinux_inode_setattr,
++      .inode_getattr =                selinux_inode_getattr,
++      .inode_setxattr =               selinux_inode_setxattr,
++      .inode_post_setxattr =          selinux_inode_post_setxattr,
++      .inode_getxattr =               selinux_inode_getxattr,
++      .inode_listxattr =              selinux_inode_listxattr,
++      .inode_removexattr =            selinux_inode_removexattr,
++      .inode_getsecurity =            selinux_inode_getsecurity,
++      .inode_setsecurity =            selinux_inode_setsecurity,
++      .inode_listsecurity =           selinux_inode_listsecurity,
++
++      .file_permission =              selinux_file_permission,
++      .file_alloc_security =          selinux_file_alloc_security,
++      .file_free_security =           selinux_file_free_security,
++      .file_ioctl =                   selinux_file_ioctl,
++      .file_mmap =                    selinux_file_mmap,
++      .file_mprotect =                selinux_file_mprotect,
++      .file_lock =                    selinux_file_lock,
++      .file_fcntl =                   selinux_file_fcntl,
++      .file_set_fowner =              selinux_file_set_fowner,
++      .file_send_sigiotask =          selinux_file_send_sigiotask,
++      .file_receive =                 selinux_file_receive,
++
++      .task_create =                  selinux_task_create,
++      .task_alloc_security =          selinux_task_alloc_security,
++      .task_free_security =           selinux_task_free_security,
++      .task_setuid =                  selinux_task_setuid,
++      .task_post_setuid =             selinux_task_post_setuid,
++      .task_setgid =                  selinux_task_setgid,
++      .task_setpgid =                 selinux_task_setpgid,
++      .task_getpgid =                 selinux_task_getpgid,
++      .task_getsid =                  selinux_task_getsid,
++      .task_setgroups =               selinux_task_setgroups,
++      .task_setnice =                 selinux_task_setnice,
++      .task_setrlimit =               selinux_task_setrlimit,
++      .task_setscheduler =            selinux_task_setscheduler,
++      .task_getscheduler =            selinux_task_getscheduler,
++      .task_kill =                    selinux_task_kill,
++      .task_wait =                    selinux_task_wait,
++      .task_prctl =                   selinux_task_prctl,
++      .task_reparent_to_init =        selinux_task_reparent_to_init,
++      .task_to_inode =                selinux_task_to_inode,
++
++      .ipc_permission =               selinux_ipc_permission,
++
++      .msg_msg_alloc_security =       selinux_msg_msg_alloc_security,
++      .msg_msg_free_security =        selinux_msg_msg_free_security,
++
++      .msg_queue_alloc_security =     selinux_msg_queue_alloc_security,
++      .msg_queue_free_security =      selinux_msg_queue_free_security,
++      .msg_queue_associate =          selinux_msg_queue_associate,
++      .msg_queue_msgctl =             selinux_msg_queue_msgctl,
++      .msg_queue_msgsnd =             selinux_msg_queue_msgsnd,
++      .msg_queue_msgrcv =             selinux_msg_queue_msgrcv,
++
++      .shm_alloc_security =           selinux_shm_alloc_security,
++      .shm_free_security =            selinux_shm_free_security,
++      .shm_associate =                selinux_shm_associate,
++      .shm_shmctl =                   selinux_shm_shmctl,
++      .shm_shmat =                    selinux_shm_shmat,
++
++      .sem_alloc_security =           selinux_sem_alloc_security,
++      .sem_free_security =            selinux_sem_free_security,
++      .sem_associate =                selinux_sem_associate,
++      .sem_semctl =                   selinux_sem_semctl,
++      .sem_semop =                    selinux_sem_semop,
++
++      .register_security =            selinux_register_security,
++      .unregister_security =          selinux_unregister_security,
++
++      .d_instantiate =                selinux_d_instantiate,
++
++      .getprocattr =                  selinux_getprocattr,
++      .setprocattr =                  selinux_setprocattr,
++
++#ifdef CONFIG_SECURITY_NETWORK
++        .unix_stream_connect =                selinux_socket_unix_stream_connect,
++      .unix_may_send =                selinux_socket_unix_may_send,
++
++      .socket_create =                selinux_socket_create,
++      .socket_post_create =           selinux_socket_post_create,
++      .socket_bind =                  selinux_socket_bind,
++      .socket_connect =               selinux_socket_connect,
++      .socket_listen =                selinux_socket_listen,
++      .socket_accept =                selinux_socket_accept,
++      .socket_sendmsg =               selinux_socket_sendmsg,
++      .socket_recvmsg =               selinux_socket_recvmsg,
++      .socket_getsockname =           selinux_socket_getsockname,
++      .socket_getpeername =           selinux_socket_getpeername,
++      .socket_getsockopt =            selinux_socket_getsockopt,
++      .socket_setsockopt =            selinux_socket_setsockopt,
++      .socket_shutdown =              selinux_socket_shutdown,
++#endif
++};
++
++__init int selinux_init(void)
++{
++      struct task_security_struct *tsec;
++
++      printk(KERN_INFO "SELinux:  Initializing.\n");
++
++      /* Set the security state for the initial task. */
++      if (task_alloc_security(current))
++              panic("SELinux:  Failed to initialize initial task.\n");
++      tsec = current->security;
++      tsec->osid = tsec->sid = SECINITSID_KERNEL;
++
++      avc_init();
++
++      original_ops = secondary_ops = security_ops;
++      if (!secondary_ops)
++              panic ("SELinux: No initial security operations\n");
++      if (register_security (&selinux_ops))
++              panic("SELinux: Unable to register with kernel.\n");
++
++      if (selinux_enforcing) {
++              printk(KERN_INFO "SELinux:  Starting in enforcing mode\n");
++      } else {
++              printk(KERN_INFO "SELinux:  Starting in permissive mode\n");
++      }
++      return 0;
++}
++
++void selinux_complete_init(void)
++{
++      printk(KERN_INFO "SELinux:  Completing initialization.\n");
++
++      /* Set up any superblocks initialized prior to the policy load. */
++      printk(KERN_INFO "SELinux:  Setting up existing superblocks.\n");
++      spin_lock(&sb_security_lock);
++next_sb:
++      if (!list_empty(&superblock_security_head)) {
++              struct superblock_security_struct *sbsec =
++                              list_entry(superblock_security_head.next,
++                                         struct superblock_security_struct,
++                                         list);
++              struct super_block *sb = sbsec->sb;
++              spin_lock(&sb_lock);
++              sb->s_count++;
++              spin_unlock(&sb_lock);
++              spin_unlock(&sb_security_lock);
++              down_read(&sb->s_umount);
++              if (sb->s_root)
++                      superblock_doinit(sb);
++              drop_super(sb);
++              spin_lock(&sb_security_lock);
++              list_del_init(&sbsec->list);
++              goto next_sb;
++      }
++      spin_unlock(&sb_security_lock);
++
++      /* Set up any inodes initialized prior to the policy load. */
++      printk(KERN_INFO "SELinux:  Setting up existing inodes.\n");
++      spin_lock(&inode_security_lock);
++next_inode:
++      if (!list_empty(&inode_security_head)) {
++              struct inode_security_struct *isec =
++                              list_entry(inode_security_head.next,
++                                         struct inode_security_struct, list);
++              struct inode *inode = isec->inode;
++              spin_unlock(&inode_security_lock);
++              inode = igrab(inode);
++              if (inode) {
++                      inode_doinit(inode);
++                      iput(inode);
++              }
++              spin_lock(&inode_security_lock);
++              list_del_init(&isec->list);
++              goto next_inode;
++      }
++      spin_unlock(&inode_security_lock);
++}
++
++/* SELinux requires early initialization in order to label
++   all processes and objects when they are created. */
++security_initcall(selinux_init);
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/avc.h  2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,159 @@
++/*
++ * Access vector cache interface for object managers.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SELINUX_AVC_H_
++#define _SELINUX_AVC_H_
++
++#include <linux/stddef.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/kdev_t.h>
++#include <linux/spinlock.h>
++#include <asm/system.h>
++#include "flask.h"
++#include "av_permissions.h"
++#include "security.h"
++
++#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
++extern int selinux_enforcing;
++#else
++#define selinux_enforcing 1
++#endif
++
++/*
++ * An entry in the AVC.
++ */
++struct avc_entry;
++
++/*
++ * A reference to an AVC entry.
++ */
++struct avc_entry_ref {
++      struct avc_entry *ae;
++};
++
++/* Initialize an AVC entry reference before first use. */
++static inline void avc_entry_ref_init(struct avc_entry_ref *h)
++{
++      h->ae = NULL;
++}
++
++struct task_struct;
++struct vfsmount;
++struct dentry;
++struct inode;
++struct sock;
++struct sk_buff;
++
++/* Auxiliary data to use in generating the audit record. */
++struct avc_audit_data {
++      char    type;
++#define AVC_AUDIT_DATA_FS   1
++#define AVC_AUDIT_DATA_NET  2
++#define AVC_AUDIT_DATA_CAP  3
++#define AVC_AUDIT_DATA_IPC  4
++      struct task_struct *tsk;
++      union   {
++              struct {
++                      struct vfsmount *mnt;
++                      struct dentry *dentry;
++                      struct inode *inode;
++              } fs;
++              struct {
++                      char *netif;
++                      struct sk_buff *skb;
++                      struct sock *sk;
++                      u16 port;
++                      u32 daddr;
++              } net;
++              int cap;
++              int ipc_id;
++      } u;
++};
++
++/* Initialize an AVC audit data structure. */
++#define AVC_AUDIT_DATA_INIT(_d,_t) \
++        { memset((_d), 0, sizeof(struct avc_audit_data)); (_d)->type = AVC_AUDIT_DATA_##_t; }
++
++/*
++ * AVC statistics
++ */
++#define AVC_ENTRY_LOOKUPS        0
++#define AVC_ENTRY_HITS                 1
++#define AVC_ENTRY_MISSES         2
++#define AVC_ENTRY_DISCARDS       3
++#define AVC_CAV_LOOKUPS          4
++#define AVC_CAV_HITS             5
++#define AVC_CAV_PROBES           6
++#define AVC_CAV_MISSES           7
++#define AVC_NSTATS               8
++extern unsigned avc_cache_stats[AVC_NSTATS];
++
++#ifdef AVC_CACHE_STATS
++static inline void avc_cache_stats_incr(int type)
++{
++      avc_cache_stats[type]++;
++}
++
++static inline void avc_cache_stats_add(int type, unsigned val)
++{
++      avc_cache_stats[type] += val;
++}
++#else
++static inline void avc_cache_stats_incr(int type)
++{ }
++
++static inline void avc_cache_stats_add(int type, unsigned val)
++{ }
++#endif
++
++/*
++ * AVC display support
++ */
++void avc_dump_av(u16 tclass, u32 av);
++void avc_dump_query(u32 ssid, u32 tsid, u16 tclass);
++void avc_dump_cache(char *tag);
++
++/*
++ * AVC operations
++ */
++
++void avc_init(void);
++
++int avc_lookup(u32 ssid, u32 tsid, u16 tclass,
++               u32 requested, struct avc_entry_ref *aeref);
++
++int avc_insert(u32 ssid, u32 tsid, u16 tclass,
++               struct avc_entry *ae, struct avc_entry_ref *out_aeref);
++
++void avc_audit(u32 ssid, u32 tsid,
++               u16 tclass, u32 requested,
++               struct av_decision *avd, int result, struct avc_audit_data *auditdata);
++
++int avc_has_perm_noaudit(u32 ssid, u32 tsid,
++                         u16 tclass, u32 requested,
++                         struct avc_entry_ref *aeref, struct av_decision *avd);
++
++int avc_has_perm(u32 ssid, u32 tsid,
++                 u16 tclass, u32 requested,
++                 struct avc_entry_ref *aeref, struct avc_audit_data *auditdata);
++
++#define AVC_CALLBACK_GRANT            1
++#define AVC_CALLBACK_TRY_REVOKE               2
++#define AVC_CALLBACK_REVOKE           4
++#define AVC_CALLBACK_RESET            8
++#define AVC_CALLBACK_AUDITALLOW_ENABLE        16
++#define AVC_CALLBACK_AUDITALLOW_DISABLE       32
++#define AVC_CALLBACK_AUDITDENY_ENABLE 64
++#define AVC_CALLBACK_AUDITDENY_DISABLE        128
++
++int avc_add_callback(int (*callback)(u32 event, u32 ssid, u32 tsid,
++                                     u16 tclass, u32 perms,
++                                   u32 *out_retained),
++                   u32 events, u32 ssid, u32 tsid,
++                   u16 tclass, u32 perms);
++
++#endif /* _SELINUX_AVC_H_ */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/avc_ss.h       2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,27 @@
++/*
++ * Access vector cache interface for the security server.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SELINUX_AVC_SS_H_
++#define _SELINUX_AVC_SS_H_
++
++#include "flask.h"
++
++int avc_ss_grant(u32 ssid, u32 tsid, u16 tclass, u32 perms, u32 seqno);
++
++int avc_ss_try_revoke(u32 ssid, u32 tsid, u16 tclass, u32 perms, u32 seqno,
++                    u32 *out_retained);
++
++int avc_ss_revoke(u32 ssid, u32 tsid, u16 tclass, u32 perms, u32 seqno);
++
++int avc_ss_reset(u32 seqno);
++
++int avc_ss_set_auditallow(u32 ssid, u32 tsid, u16 tclass, u32 perms,
++                        u32 seqno, u32 enable);
++
++int avc_ss_set_auditdeny(u32 ssid, u32 tsid, u16 tclass, u32 perms,
++                       u32 seqno, u32 enable);
++
++#endif /* _SELINUX_AVC_SS_H_ */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/av_inherit.h   2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,35 @@
++/* This file is automatically generated.  Do not edit. */
++/* FLASK */
++
++struct av_inherit
++{
++    u16 tclass;
++    char **common_pts;
++    u32 common_base;
++};
++
++static struct av_inherit av_inherit[] = {
++   { SECCLASS_DIR, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_LNK_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_CHR_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_BLK_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_SOCK_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_FIFO_FILE, common_file_perm_to_string, 0x00020000UL },
++   { SECCLASS_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_TCP_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_UDP_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_RAWIP_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_NETLINK_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_PACKET_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_KEY_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_UNIX_STREAM_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_UNIX_DGRAM_SOCKET, common_socket_perm_to_string, 0x00400000UL },
++   { SECCLASS_IPC, common_ipc_perm_to_string, 0x00000200UL },
++   { SECCLASS_SEM, common_ipc_perm_to_string, 0x00000200UL },
++   { SECCLASS_MSGQ, common_ipc_perm_to_string, 0x00000200UL },
++   { SECCLASS_SHM, common_ipc_perm_to_string, 0x00000200UL },
++};
++
++
++/* FLASK */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/av_permissions.h       2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,550 @@
++/* This file is automatically generated.  Do not edit. */
++/* FLASK */
++
++#define COMMON_FILE__IOCTL                               0x00000001UL
++#define COMMON_FILE__READ                                0x00000002UL
++#define COMMON_FILE__WRITE                               0x00000004UL
++#define COMMON_FILE__CREATE                              0x00000008UL
++#define COMMON_FILE__GETATTR                             0x00000010UL
++#define COMMON_FILE__SETATTR                             0x00000020UL
++#define COMMON_FILE__LOCK                                0x00000040UL
++#define COMMON_FILE__RELABELFROM                         0x00000080UL
++#define COMMON_FILE__RELABELTO                           0x00000100UL
++#define COMMON_FILE__APPEND                              0x00000200UL
++#define COMMON_FILE__UNLINK                              0x00000400UL
++#define COMMON_FILE__LINK                                0x00000800UL
++#define COMMON_FILE__RENAME                              0x00001000UL
++#define COMMON_FILE__EXECUTE                             0x00002000UL
++#define COMMON_FILE__SWAPON                              0x00004000UL
++#define COMMON_FILE__QUOTAON                             0x00008000UL
++#define COMMON_FILE__MOUNTON                             0x00010000UL
++
++#define COMMON_SOCKET__IOCTL                             0x00000001UL
++#define COMMON_SOCKET__READ                              0x00000002UL
++#define COMMON_SOCKET__WRITE                             0x00000004UL
++#define COMMON_SOCKET__CREATE                            0x00000008UL
++#define COMMON_SOCKET__GETATTR                           0x00000010UL
++#define COMMON_SOCKET__SETATTR                           0x00000020UL
++#define COMMON_SOCKET__LOCK                              0x00000040UL
++#define COMMON_SOCKET__RELABELFROM                       0x00000080UL
++#define COMMON_SOCKET__RELABELTO                         0x00000100UL
++#define COMMON_SOCKET__APPEND                            0x00000200UL
++#define COMMON_SOCKET__BIND                              0x00000400UL
++#define COMMON_SOCKET__CONNECT                           0x00000800UL
++#define COMMON_SOCKET__LISTEN                            0x00001000UL
++#define COMMON_SOCKET__ACCEPT                            0x00002000UL
++#define COMMON_SOCKET__GETOPT                            0x00004000UL
++#define COMMON_SOCKET__SETOPT                            0x00008000UL
++#define COMMON_SOCKET__SHUTDOWN                          0x00010000UL
++#define COMMON_SOCKET__RECVFROM                          0x00020000UL
++#define COMMON_SOCKET__SENDTO                            0x00040000UL
++#define COMMON_SOCKET__RECV_MSG                          0x00080000UL
++#define COMMON_SOCKET__SEND_MSG                          0x00100000UL
++#define COMMON_SOCKET__NAME_BIND                         0x00200000UL
++
++#define COMMON_IPC__CREATE                               0x00000001UL
++#define COMMON_IPC__DESTROY                              0x00000002UL
++#define COMMON_IPC__GETATTR                              0x00000004UL
++#define COMMON_IPC__SETATTR                              0x00000008UL
++#define COMMON_IPC__READ                                 0x00000010UL
++#define COMMON_IPC__WRITE                                0x00000020UL
++#define COMMON_IPC__ASSOCIATE                            0x00000040UL
++#define COMMON_IPC__UNIX_READ                            0x00000080UL
++#define COMMON_IPC__UNIX_WRITE                           0x00000100UL
++
++#define FILESYSTEM__MOUNT                         0x00000001UL
++#define FILESYSTEM__REMOUNT                       0x00000002UL
++#define FILESYSTEM__UNMOUNT                       0x00000004UL
++#define FILESYSTEM__GETATTR                       0x00000008UL
++#define FILESYSTEM__RELABELFROM                   0x00000010UL
++#define FILESYSTEM__RELABELTO                     0x00000020UL
++#define FILESYSTEM__TRANSITION                    0x00000040UL
++#define FILESYSTEM__ASSOCIATE                     0x00000080UL
++#define FILESYSTEM__QUOTAMOD                      0x00000100UL
++#define FILESYSTEM__QUOTAGET                      0x00000200UL
++
++#define DIR__EXECUTE                              0x00002000UL
++#define DIR__UNLINK                               0x00000400UL
++#define DIR__SETATTR                              0x00000020UL
++#define DIR__QUOTAON                              0x00008000UL
++#define DIR__RELABELFROM                          0x00000080UL
++#define DIR__LINK                                 0x00000800UL
++#define DIR__WRITE                                0x00000004UL
++#define DIR__IOCTL                                0x00000001UL
++#define DIR__RELABELTO                            0x00000100UL
++#define DIR__READ                                 0x00000002UL
++#define DIR__RENAME                               0x00001000UL
++#define DIR__APPEND                               0x00000200UL
++#define DIR__LOCK                                 0x00000040UL
++#define DIR__SWAPON                               0x00004000UL
++#define DIR__GETATTR                              0x00000010UL
++#define DIR__MOUNTON                              0x00010000UL
++#define DIR__CREATE                               0x00000008UL
++
++#define DIR__ADD_NAME                             0x00020000UL
++#define DIR__REMOVE_NAME                          0x00040000UL
++#define DIR__REPARENT                             0x00080000UL
++#define DIR__SEARCH                               0x00100000UL
++#define DIR__RMDIR                                0x00200000UL
++
++#define FILE__EXECUTE                             0x00002000UL
++#define FILE__UNLINK                              0x00000400UL
++#define FILE__SETATTR                             0x00000020UL
++#define FILE__QUOTAON                             0x00008000UL
++#define FILE__RELABELFROM                         0x00000080UL
++#define FILE__LINK                                0x00000800UL
++#define FILE__WRITE                               0x00000004UL
++#define FILE__IOCTL                               0x00000001UL
++#define FILE__RELABELTO                           0x00000100UL
++#define FILE__READ                                0x00000002UL
++#define FILE__RENAME                              0x00001000UL
++#define FILE__APPEND                              0x00000200UL
++#define FILE__LOCK                                0x00000040UL
++#define FILE__SWAPON                              0x00004000UL
++#define FILE__GETATTR                             0x00000010UL
++#define FILE__MOUNTON                             0x00010000UL
++#define FILE__CREATE                              0x00000008UL
++
++#define FILE__EXECUTE_NO_TRANS                    0x00020000UL
++#define FILE__ENTRYPOINT                          0x00040000UL
++
++#define LNK_FILE__EXECUTE                         0x00002000UL
++#define LNK_FILE__UNLINK                          0x00000400UL
++#define LNK_FILE__SETATTR                         0x00000020UL
++#define LNK_FILE__QUOTAON                         0x00008000UL
++#define LNK_FILE__RELABELFROM                     0x00000080UL
++#define LNK_FILE__LINK                            0x00000800UL
++#define LNK_FILE__WRITE                           0x00000004UL
++#define LNK_FILE__IOCTL                           0x00000001UL
++#define LNK_FILE__RELABELTO                       0x00000100UL
++#define LNK_FILE__READ                            0x00000002UL
++#define LNK_FILE__RENAME                          0x00001000UL
++#define LNK_FILE__APPEND                          0x00000200UL
++#define LNK_FILE__LOCK                            0x00000040UL
++#define LNK_FILE__SWAPON                          0x00004000UL
++#define LNK_FILE__GETATTR                         0x00000010UL
++#define LNK_FILE__MOUNTON                         0x00010000UL
++#define LNK_FILE__CREATE                          0x00000008UL
++
++#define CHR_FILE__EXECUTE                         0x00002000UL
++#define CHR_FILE__UNLINK                          0x00000400UL
++#define CHR_FILE__SETATTR                         0x00000020UL
++#define CHR_FILE__QUOTAON                         0x00008000UL
++#define CHR_FILE__RELABELFROM                     0x00000080UL
++#define CHR_FILE__LINK                            0x00000800UL
++#define CHR_FILE__WRITE                           0x00000004UL
++#define CHR_FILE__IOCTL                           0x00000001UL
++#define CHR_FILE__RELABELTO                       0x00000100UL
++#define CHR_FILE__READ                            0x00000002UL
++#define CHR_FILE__RENAME                          0x00001000UL
++#define CHR_FILE__APPEND                          0x00000200UL
++#define CHR_FILE__LOCK                            0x00000040UL
++#define CHR_FILE__SWAPON                          0x00004000UL
++#define CHR_FILE__GETATTR                         0x00000010UL
++#define CHR_FILE__MOUNTON                         0x00010000UL
++#define CHR_FILE__CREATE                          0x00000008UL
++
++#define BLK_FILE__EXECUTE                         0x00002000UL
++#define BLK_FILE__UNLINK                          0x00000400UL
++#define BLK_FILE__SETATTR                         0x00000020UL
++#define BLK_FILE__QUOTAON                         0x00008000UL
++#define BLK_FILE__RELABELFROM                     0x00000080UL
++#define BLK_FILE__LINK                            0x00000800UL
++#define BLK_FILE__WRITE                           0x00000004UL
++#define BLK_FILE__IOCTL                           0x00000001UL
++#define BLK_FILE__RELABELTO                       0x00000100UL
++#define BLK_FILE__READ                            0x00000002UL
++#define BLK_FILE__RENAME                          0x00001000UL
++#define BLK_FILE__APPEND                          0x00000200UL
++#define BLK_FILE__LOCK                            0x00000040UL
++#define BLK_FILE__SWAPON                          0x00004000UL
++#define BLK_FILE__GETATTR                         0x00000010UL
++#define BLK_FILE__MOUNTON                         0x00010000UL
++#define BLK_FILE__CREATE                          0x00000008UL
++
++#define SOCK_FILE__EXECUTE                        0x00002000UL
++#define SOCK_FILE__UNLINK                         0x00000400UL
++#define SOCK_FILE__SETATTR                        0x00000020UL
++#define SOCK_FILE__QUOTAON                        0x00008000UL
++#define SOCK_FILE__RELABELFROM                    0x00000080UL
++#define SOCK_FILE__LINK                           0x00000800UL
++#define SOCK_FILE__WRITE                          0x00000004UL
++#define SOCK_FILE__IOCTL                          0x00000001UL
++#define SOCK_FILE__RELABELTO                      0x00000100UL
++#define SOCK_FILE__READ                           0x00000002UL
++#define SOCK_FILE__RENAME                         0x00001000UL
++#define SOCK_FILE__APPEND                         0x00000200UL
++#define SOCK_FILE__LOCK                           0x00000040UL
++#define SOCK_FILE__SWAPON                         0x00004000UL
++#define SOCK_FILE__GETATTR                        0x00000010UL
++#define SOCK_FILE__MOUNTON                        0x00010000UL
++#define SOCK_FILE__CREATE                         0x00000008UL
++
++#define FIFO_FILE__EXECUTE                        0x00002000UL
++#define FIFO_FILE__UNLINK                         0x00000400UL
++#define FIFO_FILE__SETATTR                        0x00000020UL
++#define FIFO_FILE__QUOTAON                        0x00008000UL
++#define FIFO_FILE__RELABELFROM                    0x00000080UL
++#define FIFO_FILE__LINK                           0x00000800UL
++#define FIFO_FILE__WRITE                          0x00000004UL
++#define FIFO_FILE__IOCTL                          0x00000001UL
++#define FIFO_FILE__RELABELTO                      0x00000100UL
++#define FIFO_FILE__READ                           0x00000002UL
++#define FIFO_FILE__RENAME                         0x00001000UL
++#define FIFO_FILE__APPEND                         0x00000200UL
++#define FIFO_FILE__LOCK                           0x00000040UL
++#define FIFO_FILE__SWAPON                         0x00004000UL
++#define FIFO_FILE__GETATTR                        0x00000010UL
++#define FIFO_FILE__MOUNTON                        0x00010000UL
++#define FIFO_FILE__CREATE                         0x00000008UL
++
++#define FD__USE                                   0x00000001UL
++
++#define SOCKET__RELABELTO                         0x00000100UL
++#define SOCKET__RECV_MSG                          0x00080000UL
++#define SOCKET__RELABELFROM                       0x00000080UL
++#define SOCKET__SETOPT                            0x00008000UL
++#define SOCKET__APPEND                            0x00000200UL
++#define SOCKET__SETATTR                           0x00000020UL
++#define SOCKET__SENDTO                            0x00040000UL
++#define SOCKET__GETOPT                            0x00004000UL
++#define SOCKET__READ                              0x00000002UL
++#define SOCKET__SHUTDOWN                          0x00010000UL
++#define SOCKET__LISTEN                            0x00001000UL
++#define SOCKET__BIND                              0x00000400UL
++#define SOCKET__WRITE                             0x00000004UL
++#define SOCKET__ACCEPT                            0x00002000UL
++#define SOCKET__CONNECT                           0x00000800UL
++#define SOCKET__LOCK                              0x00000040UL
++#define SOCKET__IOCTL                             0x00000001UL
++#define SOCKET__CREATE                            0x00000008UL
++#define SOCKET__NAME_BIND                         0x00200000UL
++#define SOCKET__SEND_MSG                          0x00100000UL
++#define SOCKET__RECVFROM                          0x00020000UL
++#define SOCKET__GETATTR                           0x00000010UL
++
++#define TCP_SOCKET__RELABELTO                     0x00000100UL
++#define TCP_SOCKET__RECV_MSG                      0x00080000UL
++#define TCP_SOCKET__RELABELFROM                   0x00000080UL
++#define TCP_SOCKET__SETOPT                        0x00008000UL
++#define TCP_SOCKET__APPEND                        0x00000200UL
++#define TCP_SOCKET__SETATTR                       0x00000020UL
++#define TCP_SOCKET__SENDTO                        0x00040000UL
++#define TCP_SOCKET__GETOPT                        0x00004000UL
++#define TCP_SOCKET__READ                          0x00000002UL
++#define TCP_SOCKET__SHUTDOWN                      0x00010000UL
++#define TCP_SOCKET__LISTEN                        0x00001000UL
++#define TCP_SOCKET__BIND                          0x00000400UL
++#define TCP_SOCKET__WRITE                         0x00000004UL
++#define TCP_SOCKET__ACCEPT                        0x00002000UL
++#define TCP_SOCKET__CONNECT                       0x00000800UL
++#define TCP_SOCKET__LOCK                          0x00000040UL
++#define TCP_SOCKET__IOCTL                         0x00000001UL
++#define TCP_SOCKET__CREATE                        0x00000008UL
++#define TCP_SOCKET__NAME_BIND                     0x00200000UL
++#define TCP_SOCKET__SEND_MSG                      0x00100000UL
++#define TCP_SOCKET__RECVFROM                      0x00020000UL
++#define TCP_SOCKET__GETATTR                       0x00000010UL
++
++#define TCP_SOCKET__CONNECTTO                     0x00400000UL
++#define TCP_SOCKET__NEWCONN                       0x00800000UL
++#define TCP_SOCKET__ACCEPTFROM                    0x01000000UL
++
++#define UDP_SOCKET__RELABELTO                     0x00000100UL
++#define UDP_SOCKET__RECV_MSG                      0x00080000UL
++#define UDP_SOCKET__RELABELFROM                   0x00000080UL
++#define UDP_SOCKET__SETOPT                        0x00008000UL
++#define UDP_SOCKET__APPEND                        0x00000200UL
++#define UDP_SOCKET__SETATTR                       0x00000020UL
++#define UDP_SOCKET__SENDTO                        0x00040000UL
++#define UDP_SOCKET__GETOPT                        0x00004000UL
++#define UDP_SOCKET__READ                          0x00000002UL
++#define UDP_SOCKET__SHUTDOWN                      0x00010000UL
++#define UDP_SOCKET__LISTEN                        0x00001000UL
++#define UDP_SOCKET__BIND                          0x00000400UL
++#define UDP_SOCKET__WRITE                         0x00000004UL
++#define UDP_SOCKET__ACCEPT                        0x00002000UL
++#define UDP_SOCKET__CONNECT                       0x00000800UL
++#define UDP_SOCKET__LOCK                          0x00000040UL
++#define UDP_SOCKET__IOCTL                         0x00000001UL
++#define UDP_SOCKET__CREATE                        0x00000008UL
++#define UDP_SOCKET__NAME_BIND                     0x00200000UL
++#define UDP_SOCKET__SEND_MSG                      0x00100000UL
++#define UDP_SOCKET__RECVFROM                      0x00020000UL
++#define UDP_SOCKET__GETATTR                       0x00000010UL
++
++#define RAWIP_SOCKET__RELABELTO                   0x00000100UL
++#define RAWIP_SOCKET__RECV_MSG                    0x00080000UL
++#define RAWIP_SOCKET__RELABELFROM                 0x00000080UL
++#define RAWIP_SOCKET__SETOPT                      0x00008000UL
++#define RAWIP_SOCKET__APPEND                      0x00000200UL
++#define RAWIP_SOCKET__SETATTR                     0x00000020UL
++#define RAWIP_SOCKET__SENDTO                      0x00040000UL
++#define RAWIP_SOCKET__GETOPT                      0x00004000UL
++#define RAWIP_SOCKET__READ                        0x00000002UL
++#define RAWIP_SOCKET__SHUTDOWN                    0x00010000UL
++#define RAWIP_SOCKET__LISTEN                      0x00001000UL
++#define RAWIP_SOCKET__BIND                        0x00000400UL
++#define RAWIP_SOCKET__WRITE                       0x00000004UL
++#define RAWIP_SOCKET__ACCEPT                      0x00002000UL
++#define RAWIP_SOCKET__CONNECT                     0x00000800UL
++#define RAWIP_SOCKET__LOCK                        0x00000040UL
++#define RAWIP_SOCKET__IOCTL                       0x00000001UL
++#define RAWIP_SOCKET__CREATE                      0x00000008UL
++#define RAWIP_SOCKET__NAME_BIND                   0x00200000UL
++#define RAWIP_SOCKET__SEND_MSG                    0x00100000UL
++#define RAWIP_SOCKET__RECVFROM                    0x00020000UL
++#define RAWIP_SOCKET__GETATTR                     0x00000010UL
++
++#define NODE__TCP_RECV                            0x00000001UL
++#define NODE__TCP_SEND                            0x00000002UL
++#define NODE__UDP_RECV                            0x00000004UL
++#define NODE__UDP_SEND                            0x00000008UL
++#define NODE__RAWIP_RECV                          0x00000010UL
++#define NODE__RAWIP_SEND                          0x00000020UL
++#define NODE__ENFORCE_DEST                        0x00000040UL
++
++#define NETIF__TCP_RECV                           0x00000001UL
++#define NETIF__TCP_SEND                           0x00000002UL
++#define NETIF__UDP_RECV                           0x00000004UL
++#define NETIF__UDP_SEND                           0x00000008UL
++#define NETIF__RAWIP_RECV                         0x00000010UL
++#define NETIF__RAWIP_SEND                         0x00000020UL
++
++#define NETLINK_SOCKET__RELABELTO                 0x00000100UL
++#define NETLINK_SOCKET__RECV_MSG                  0x00080000UL
++#define NETLINK_SOCKET__RELABELFROM               0x00000080UL
++#define NETLINK_SOCKET__SETOPT                    0x00008000UL
++#define NETLINK_SOCKET__APPEND                    0x00000200UL
++#define NETLINK_SOCKET__SETATTR                   0x00000020UL
++#define NETLINK_SOCKET__SENDTO                    0x00040000UL
++#define NETLINK_SOCKET__GETOPT                    0x00004000UL
++#define NETLINK_SOCKET__READ                      0x00000002UL
++#define NETLINK_SOCKET__SHUTDOWN                  0x00010000UL
++#define NETLINK_SOCKET__LISTEN                    0x00001000UL
++#define NETLINK_SOCKET__BIND                      0x00000400UL
++#define NETLINK_SOCKET__WRITE                     0x00000004UL
++#define NETLINK_SOCKET__ACCEPT                    0x00002000UL
++#define NETLINK_SOCKET__CONNECT                   0x00000800UL
++#define NETLINK_SOCKET__LOCK                      0x00000040UL
++#define NETLINK_SOCKET__IOCTL                     0x00000001UL
++#define NETLINK_SOCKET__CREATE                    0x00000008UL
++#define NETLINK_SOCKET__NAME_BIND                 0x00200000UL
++#define NETLINK_SOCKET__SEND_MSG                  0x00100000UL
++#define NETLINK_SOCKET__RECVFROM                  0x00020000UL
++#define NETLINK_SOCKET__GETATTR                   0x00000010UL
++
++#define PACKET_SOCKET__RELABELTO                  0x00000100UL
++#define PACKET_SOCKET__RECV_MSG                   0x00080000UL
++#define PACKET_SOCKET__RELABELFROM                0x00000080UL
++#define PACKET_SOCKET__SETOPT                     0x00008000UL
++#define PACKET_SOCKET__APPEND                     0x00000200UL
++#define PACKET_SOCKET__SETATTR                    0x00000020UL
++#define PACKET_SOCKET__SENDTO                     0x00040000UL
++#define PACKET_SOCKET__GETOPT                     0x00004000UL
++#define PACKET_SOCKET__READ                       0x00000002UL
++#define PACKET_SOCKET__SHUTDOWN                   0x00010000UL
++#define PACKET_SOCKET__LISTEN                     0x00001000UL
++#define PACKET_SOCKET__BIND                       0x00000400UL
++#define PACKET_SOCKET__WRITE                      0x00000004UL
++#define PACKET_SOCKET__ACCEPT                     0x00002000UL
++#define PACKET_SOCKET__CONNECT                    0x00000800UL
++#define PACKET_SOCKET__LOCK                       0x00000040UL
++#define PACKET_SOCKET__IOCTL                      0x00000001UL
++#define PACKET_SOCKET__CREATE                     0x00000008UL
++#define PACKET_SOCKET__NAME_BIND                  0x00200000UL
++#define PACKET_SOCKET__SEND_MSG                   0x00100000UL
++#define PACKET_SOCKET__RECVFROM                   0x00020000UL
++#define PACKET_SOCKET__GETATTR                    0x00000010UL
++
++#define KEY_SOCKET__RELABELTO                     0x00000100UL
++#define KEY_SOCKET__RECV_MSG                      0x00080000UL
++#define KEY_SOCKET__RELABELFROM                   0x00000080UL
++#define KEY_SOCKET__SETOPT                        0x00008000UL
++#define KEY_SOCKET__APPEND                        0x00000200UL
++#define KEY_SOCKET__SETATTR                       0x00000020UL
++#define KEY_SOCKET__SENDTO                        0x00040000UL
++#define KEY_SOCKET__GETOPT                        0x00004000UL
++#define KEY_SOCKET__READ                          0x00000002UL
++#define KEY_SOCKET__SHUTDOWN                      0x00010000UL
++#define KEY_SOCKET__LISTEN                        0x00001000UL
++#define KEY_SOCKET__BIND                          0x00000400UL
++#define KEY_SOCKET__WRITE                         0x00000004UL
++#define KEY_SOCKET__ACCEPT                        0x00002000UL
++#define KEY_SOCKET__CONNECT                       0x00000800UL
++#define KEY_SOCKET__LOCK                          0x00000040UL
++#define KEY_SOCKET__IOCTL                         0x00000001UL
++#define KEY_SOCKET__CREATE                        0x00000008UL
++#define KEY_SOCKET__NAME_BIND                     0x00200000UL
++#define KEY_SOCKET__SEND_MSG                      0x00100000UL
++#define KEY_SOCKET__RECVFROM                      0x00020000UL
++#define KEY_SOCKET__GETATTR                       0x00000010UL
++
++#define UNIX_STREAM_SOCKET__RELABELTO             0x00000100UL
++#define UNIX_STREAM_SOCKET__RECV_MSG              0x00080000UL
++#define UNIX_STREAM_SOCKET__RELABELFROM           0x00000080UL
++#define UNIX_STREAM_SOCKET__SETOPT                0x00008000UL
++#define UNIX_STREAM_SOCKET__APPEND                0x00000200UL
++#define UNIX_STREAM_SOCKET__SETATTR               0x00000020UL
++#define UNIX_STREAM_SOCKET__SENDTO                0x00040000UL
++#define UNIX_STREAM_SOCKET__GETOPT                0x00004000UL
++#define UNIX_STREAM_SOCKET__READ                  0x00000002UL
++#define UNIX_STREAM_SOCKET__SHUTDOWN              0x00010000UL
++#define UNIX_STREAM_SOCKET__LISTEN                0x00001000UL
++#define UNIX_STREAM_SOCKET__BIND                  0x00000400UL
++#define UNIX_STREAM_SOCKET__WRITE                 0x00000004UL
++#define UNIX_STREAM_SOCKET__ACCEPT                0x00002000UL
++#define UNIX_STREAM_SOCKET__CONNECT               0x00000800UL
++#define UNIX_STREAM_SOCKET__LOCK                  0x00000040UL
++#define UNIX_STREAM_SOCKET__IOCTL                 0x00000001UL
++#define UNIX_STREAM_SOCKET__CREATE                0x00000008UL
++#define UNIX_STREAM_SOCKET__NAME_BIND             0x00200000UL
++#define UNIX_STREAM_SOCKET__SEND_MSG              0x00100000UL
++#define UNIX_STREAM_SOCKET__RECVFROM              0x00020000UL
++#define UNIX_STREAM_SOCKET__GETATTR               0x00000010UL
++
++#define UNIX_STREAM_SOCKET__CONNECTTO             0x00400000UL
++#define UNIX_STREAM_SOCKET__NEWCONN               0x00800000UL
++#define UNIX_STREAM_SOCKET__ACCEPTFROM            0x01000000UL
++
++#define UNIX_DGRAM_SOCKET__RELABELTO              0x00000100UL
++#define UNIX_DGRAM_SOCKET__RECV_MSG               0x00080000UL
++#define UNIX_DGRAM_SOCKET__RELABELFROM            0x00000080UL
++#define UNIX_DGRAM_SOCKET__SETOPT                 0x00008000UL
++#define UNIX_DGRAM_SOCKET__APPEND                 0x00000200UL
++#define UNIX_DGRAM_SOCKET__SETATTR                0x00000020UL
++#define UNIX_DGRAM_SOCKET__SENDTO                 0x00040000UL
++#define UNIX_DGRAM_SOCKET__GETOPT                 0x00004000UL
++#define UNIX_DGRAM_SOCKET__READ                   0x00000002UL
++#define UNIX_DGRAM_SOCKET__SHUTDOWN               0x00010000UL
++#define UNIX_DGRAM_SOCKET__LISTEN                 0x00001000UL
++#define UNIX_DGRAM_SOCKET__BIND                   0x00000400UL
++#define UNIX_DGRAM_SOCKET__WRITE                  0x00000004UL
++#define UNIX_DGRAM_SOCKET__ACCEPT                 0x00002000UL
++#define UNIX_DGRAM_SOCKET__CONNECT                0x00000800UL
++#define UNIX_DGRAM_SOCKET__LOCK                   0x00000040UL
++#define UNIX_DGRAM_SOCKET__IOCTL                  0x00000001UL
++#define UNIX_DGRAM_SOCKET__CREATE                 0x00000008UL
++#define UNIX_DGRAM_SOCKET__NAME_BIND              0x00200000UL
++#define UNIX_DGRAM_SOCKET__SEND_MSG               0x00100000UL
++#define UNIX_DGRAM_SOCKET__RECVFROM               0x00020000UL
++#define UNIX_DGRAM_SOCKET__GETATTR                0x00000010UL
++
++#define PROCESS__FORK                             0x00000001UL
++#define PROCESS__TRANSITION                       0x00000002UL
++#define PROCESS__SIGCHLD                          0x00000004UL
++#define PROCESS__SIGKILL                          0x00000008UL
++#define PROCESS__SIGSTOP                          0x00000010UL
++#define PROCESS__SIGNULL                          0x00000020UL
++#define PROCESS__SIGNAL                           0x00000040UL
++#define PROCESS__PTRACE                           0x00000080UL
++#define PROCESS__GETSCHED                         0x00000100UL
++#define PROCESS__SETSCHED                         0x00000200UL
++#define PROCESS__GETSESSION                       0x00000400UL
++#define PROCESS__GETPGID                          0x00000800UL
++#define PROCESS__SETPGID                          0x00001000UL
++#define PROCESS__GETCAP                           0x00002000UL
++#define PROCESS__SETCAP                           0x00004000UL
++#define PROCESS__SHARE                            0x00008000UL
++#define PROCESS__GETATTR                          0x00010000UL
++#define PROCESS__SETEXEC                          0x00020000UL
++#define PROCESS__SETFSCREATE                      0x00040000UL
++#define PROCESS__NOATSECURE                       0x00080000UL
++
++#define IPC__SETATTR                              0x00000008UL
++#define IPC__READ                                 0x00000010UL
++#define IPC__ASSOCIATE                            0x00000040UL
++#define IPC__DESTROY                              0x00000002UL
++#define IPC__UNIX_WRITE                           0x00000100UL
++#define IPC__CREATE                               0x00000001UL
++#define IPC__UNIX_READ                            0x00000080UL
++#define IPC__GETATTR                              0x00000004UL
++#define IPC__WRITE                                0x00000020UL
++
++#define SEM__SETATTR                              0x00000008UL
++#define SEM__READ                                 0x00000010UL
++#define SEM__ASSOCIATE                            0x00000040UL
++#define SEM__DESTROY                              0x00000002UL
++#define SEM__UNIX_WRITE                           0x00000100UL
++#define SEM__CREATE                               0x00000001UL
++#define SEM__UNIX_READ                            0x00000080UL
++#define SEM__GETATTR                              0x00000004UL
++#define SEM__WRITE                                0x00000020UL
++
++#define MSGQ__SETATTR                             0x00000008UL
++#define MSGQ__READ                                0x00000010UL
++#define MSGQ__ASSOCIATE                           0x00000040UL
++#define MSGQ__DESTROY                             0x00000002UL
++#define MSGQ__UNIX_WRITE                          0x00000100UL
++#define MSGQ__CREATE                              0x00000001UL
++#define MSGQ__UNIX_READ                           0x00000080UL
++#define MSGQ__GETATTR                             0x00000004UL
++#define MSGQ__WRITE                               0x00000020UL
++
++#define MSGQ__ENQUEUE                             0x00000200UL
++
++#define MSG__SEND                                 0x00000001UL
++#define MSG__RECEIVE                              0x00000002UL
++
++#define SHM__SETATTR                              0x00000008UL
++#define SHM__READ                                 0x00000010UL
++#define SHM__ASSOCIATE                            0x00000040UL
++#define SHM__DESTROY                              0x00000002UL
++#define SHM__UNIX_WRITE                           0x00000100UL
++#define SHM__CREATE                               0x00000001UL
++#define SHM__UNIX_READ                            0x00000080UL
++#define SHM__GETATTR                              0x00000004UL
++#define SHM__WRITE                                0x00000020UL
++
++#define SHM__LOCK                                 0x00000200UL
++
++#define SECURITY__COMPUTE_AV                      0x00000001UL
++#define SECURITY__COMPUTE_CREATE                  0x00000002UL
++#define SECURITY__COMPUTE_MEMBER                  0x00000004UL
++#define SECURITY__CHECK_CONTEXT                   0x00000008UL
++#define SECURITY__LOAD_POLICY                     0x00000010UL
++#define SECURITY__COMPUTE_RELABEL                 0x00000020UL
++#define SECURITY__COMPUTE_USER                    0x00000040UL
++#define SECURITY__SETENFORCE                      0x00000080UL
++
++#define SYSTEM__IPC_INFO                          0x00000001UL
++#define SYSTEM__SYSLOG_READ                       0x00000002UL
++#define SYSTEM__SYSLOG_MOD                        0x00000004UL
++#define SYSTEM__SYSLOG_CONSOLE                    0x00000008UL
++
++#define CAPABILITY__CHOWN                         0x00000001UL
++#define CAPABILITY__DAC_OVERRIDE                  0x00000002UL
++#define CAPABILITY__DAC_READ_SEARCH               0x00000004UL
++#define CAPABILITY__FOWNER                        0x00000008UL
++#define CAPABILITY__FSETID                        0x00000010UL
++#define CAPABILITY__KILL                          0x00000020UL
++#define CAPABILITY__SETGID                        0x00000040UL
++#define CAPABILITY__SETUID                        0x00000080UL
++#define CAPABILITY__SETPCAP                       0x00000100UL
++#define CAPABILITY__LINUX_IMMUTABLE               0x00000200UL
++#define CAPABILITY__NET_BIND_SERVICE              0x00000400UL
++#define CAPABILITY__NET_BROADCAST                 0x00000800UL
++#define CAPABILITY__NET_ADMIN                     0x00001000UL
++#define CAPABILITY__NET_RAW                       0x00002000UL
++#define CAPABILITY__IPC_LOCK                      0x00004000UL
++#define CAPABILITY__IPC_OWNER                     0x00008000UL
++#define CAPABILITY__SYS_MODULE                    0x00010000UL
++#define CAPABILITY__SYS_RAWIO                     0x00020000UL
++#define CAPABILITY__SYS_CHROOT                    0x00040000UL
++#define CAPABILITY__SYS_PTRACE                    0x00080000UL
++#define CAPABILITY__SYS_PACCT                     0x00100000UL
++#define CAPABILITY__SYS_ADMIN                     0x00200000UL
++#define CAPABILITY__SYS_BOOT                      0x00400000UL
++#define CAPABILITY__SYS_NICE                      0x00800000UL
++#define CAPABILITY__SYS_RESOURCE                  0x01000000UL
++#define CAPABILITY__SYS_TIME                      0x02000000UL
++#define CAPABILITY__SYS_TTY_CONFIG                0x04000000UL
++#define CAPABILITY__MKNOD                         0x08000000UL
++#define CAPABILITY__LEASE                         0x10000000UL
++
++#define PASSWD__PASSWD                            0x00000001UL
++#define PASSWD__CHFN                              0x00000002UL
++#define PASSWD__CHSH                              0x00000004UL
++
++
++/* FLASK */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/av_perm_to_string.h    2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,120 @@
++/* This file is automatically generated.  Do not edit. */
++/* FLASK */
++
++struct av_perm_to_string
++{
++    u16 tclass;
++    u32 value;
++    char *name;
++};
++
++static struct av_perm_to_string av_perm_to_string[] = {
++   { SECCLASS_FILESYSTEM, FILESYSTEM__MOUNT, "mount" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__REMOUNT, "remount" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__UNMOUNT, "unmount" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__GETATTR, "getattr" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__RELABELFROM, "relabelfrom" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__RELABELTO, "relabelto" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__TRANSITION, "transition" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__ASSOCIATE, "associate" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__QUOTAMOD, "quotamod" },
++   { SECCLASS_FILESYSTEM, FILESYSTEM__QUOTAGET, "quotaget" },
++   { SECCLASS_DIR, DIR__ADD_NAME, "add_name" },
++   { SECCLASS_DIR, DIR__REMOVE_NAME, "remove_name" },
++   { SECCLASS_DIR, DIR__REPARENT, "reparent" },
++   { SECCLASS_DIR, DIR__SEARCH, "search" },
++   { SECCLASS_DIR, DIR__RMDIR, "rmdir" },
++   { SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, "execute_no_trans" },
++   { SECCLASS_FILE, FILE__ENTRYPOINT, "entrypoint" },
++   { SECCLASS_FD, FD__USE, "use" },
++   { SECCLASS_TCP_SOCKET, TCP_SOCKET__CONNECTTO, "connectto" },
++   { SECCLASS_TCP_SOCKET, TCP_SOCKET__NEWCONN, "newconn" },
++   { SECCLASS_TCP_SOCKET, TCP_SOCKET__ACCEPTFROM, "acceptfrom" },
++   { SECCLASS_NODE, NODE__TCP_RECV, "tcp_recv" },
++   { SECCLASS_NODE, NODE__TCP_SEND, "tcp_send" },
++   { SECCLASS_NODE, NODE__UDP_RECV, "udp_recv" },
++   { SECCLASS_NODE, NODE__UDP_SEND, "udp_send" },
++   { SECCLASS_NODE, NODE__RAWIP_RECV, "rawip_recv" },
++   { SECCLASS_NODE, NODE__RAWIP_SEND, "rawip_send" },
++   { SECCLASS_NODE, NODE__ENFORCE_DEST, "enforce_dest" },
++   { SECCLASS_NETIF, NETIF__TCP_RECV, "tcp_recv" },
++   { SECCLASS_NETIF, NETIF__TCP_SEND, "tcp_send" },
++   { SECCLASS_NETIF, NETIF__UDP_RECV, "udp_recv" },
++   { SECCLASS_NETIF, NETIF__UDP_SEND, "udp_send" },
++   { SECCLASS_NETIF, NETIF__RAWIP_RECV, "rawip_recv" },
++   { SECCLASS_NETIF, NETIF__RAWIP_SEND, "rawip_send" },
++   { SECCLASS_UNIX_STREAM_SOCKET, UNIX_STREAM_SOCKET__CONNECTTO, "connectto" },
++   { SECCLASS_UNIX_STREAM_SOCKET, UNIX_STREAM_SOCKET__NEWCONN, "newconn" },
++   { SECCLASS_UNIX_STREAM_SOCKET, UNIX_STREAM_SOCKET__ACCEPTFROM, "acceptfrom" },
++   { SECCLASS_PROCESS, PROCESS__FORK, "fork" },
++   { SECCLASS_PROCESS, PROCESS__TRANSITION, "transition" },
++   { SECCLASS_PROCESS, PROCESS__SIGCHLD, "sigchld" },
++   { SECCLASS_PROCESS, PROCESS__SIGKILL, "sigkill" },
++   { SECCLASS_PROCESS, PROCESS__SIGSTOP, "sigstop" },
++   { SECCLASS_PROCESS, PROCESS__SIGNULL, "signull" },
++   { SECCLASS_PROCESS, PROCESS__SIGNAL, "signal" },
++   { SECCLASS_PROCESS, PROCESS__PTRACE, "ptrace" },
++   { SECCLASS_PROCESS, PROCESS__GETSCHED, "getsched" },
++   { SECCLASS_PROCESS, PROCESS__SETSCHED, "setsched" },
++   { SECCLASS_PROCESS, PROCESS__GETSESSION, "getsession" },
++   { SECCLASS_PROCESS, PROCESS__GETPGID, "getpgid" },
++   { SECCLASS_PROCESS, PROCESS__SETPGID, "setpgid" },
++   { SECCLASS_PROCESS, PROCESS__GETCAP, "getcap" },
++   { SECCLASS_PROCESS, PROCESS__SETCAP, "setcap" },
++   { SECCLASS_PROCESS, PROCESS__SHARE, "share" },
++   { SECCLASS_PROCESS, PROCESS__GETATTR, "getattr" },
++   { SECCLASS_PROCESS, PROCESS__SETEXEC, "setexec" },
++   { SECCLASS_PROCESS, PROCESS__SETFSCREATE, "setfscreate" },
++   { SECCLASS_PROCESS, PROCESS__NOATSECURE, "noatsecure" },
++   { SECCLASS_MSGQ, MSGQ__ENQUEUE, "enqueue" },
++   { SECCLASS_MSG, MSG__SEND, "send" },
++   { SECCLASS_MSG, MSG__RECEIVE, "receive" },
++   { SECCLASS_SHM, SHM__LOCK, "lock" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_AV, "compute_av" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_CREATE, "compute_create" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_MEMBER, "compute_member" },
++   { SECCLASS_SECURITY, SECURITY__CHECK_CONTEXT, "check_context" },
++   { SECCLASS_SECURITY, SECURITY__LOAD_POLICY, "load_policy" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_RELABEL, "compute_relabel" },
++   { SECCLASS_SECURITY, SECURITY__COMPUTE_USER, "compute_user" },
++   { SECCLASS_SECURITY, SECURITY__SETENFORCE, "setenforce" },
++   { SECCLASS_SYSTEM, SYSTEM__IPC_INFO, "ipc_info" },
++   { SECCLASS_SYSTEM, SYSTEM__SYSLOG_READ, "syslog_read" },
++   { SECCLASS_SYSTEM, SYSTEM__SYSLOG_MOD, "syslog_mod" },
++   { SECCLASS_SYSTEM, SYSTEM__SYSLOG_CONSOLE, "syslog_console" },
++   { SECCLASS_CAPABILITY, CAPABILITY__CHOWN, "chown" },
++   { SECCLASS_CAPABILITY, CAPABILITY__DAC_OVERRIDE, "dac_override" },
++   { SECCLASS_CAPABILITY, CAPABILITY__DAC_READ_SEARCH, "dac_read_search" },
++   { SECCLASS_CAPABILITY, CAPABILITY__FOWNER, "fowner" },
++   { SECCLASS_CAPABILITY, CAPABILITY__FSETID, "fsetid" },
++   { SECCLASS_CAPABILITY, CAPABILITY__KILL, "kill" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SETGID, "setgid" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SETUID, "setuid" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SETPCAP, "setpcap" },
++   { SECCLASS_CAPABILITY, CAPABILITY__LINUX_IMMUTABLE, "linux_immutable" },
++   { SECCLASS_CAPABILITY, CAPABILITY__NET_BIND_SERVICE, "net_bind_service" },
++   { SECCLASS_CAPABILITY, CAPABILITY__NET_BROADCAST, "net_broadcast" },
++   { SECCLASS_CAPABILITY, CAPABILITY__NET_ADMIN, "net_admin" },
++   { SECCLASS_CAPABILITY, CAPABILITY__NET_RAW, "net_raw" },
++   { SECCLASS_CAPABILITY, CAPABILITY__IPC_LOCK, "ipc_lock" },
++   { SECCLASS_CAPABILITY, CAPABILITY__IPC_OWNER, "ipc_owner" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_MODULE, "sys_module" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_RAWIO, "sys_rawio" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_CHROOT, "sys_chroot" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_PTRACE, "sys_ptrace" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_PACCT, "sys_pacct" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_ADMIN, "sys_admin" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_BOOT, "sys_boot" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_NICE, "sys_nice" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_RESOURCE, "sys_resource" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_TIME, "sys_time" },
++   { SECCLASS_CAPABILITY, CAPABILITY__SYS_TTY_CONFIG, "sys_tty_config" },
++   { SECCLASS_CAPABILITY, CAPABILITY__MKNOD, "mknod" },
++   { SECCLASS_CAPABILITY, CAPABILITY__LEASE, "lease" },
++   { SECCLASS_PASSWD, PASSWD__PASSWD, "passwd" },
++   { SECCLASS_PASSWD, PASSWD__CHFN, "chfn" },
++   { SECCLASS_PASSWD, PASSWD__CHSH, "chsh" },
++};
++
++
++/* FLASK */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/class_to_string.h      2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,39 @@
++/* This file is automatically generated.  Do not edit. */
++/*
++ * Security object class definitions
++ */
++static char *class_to_string[] =
++{
++    "null",
++    "security",
++    "process",
++    "system",
++    "capability",
++    "filesystem",
++    "file",
++    "dir",
++    "fd",
++    "lnk_file",
++    "chr_file",
++    "blk_file",
++    "sock_file",
++    "fifo_file",
++    "socket",
++    "tcp_socket",
++    "udp_socket",
++    "rawip_socket",
++    "node",
++    "netif",
++    "netlink_socket",
++    "packet_socket",
++    "key_socket",
++    "unix_stream_socket",
++    "unix_dgram_socket",
++    "sem",
++    "msg",
++    "msgq",
++    "shm",
++    "ipc",
++    "passwd",
++};
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/common_perm_to_string.h        2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,65 @@
++/* This file is automatically generated.  Do not edit. */
++/* FLASK */
++
++static char *common_file_perm_to_string[] =
++{
++    "ioctl",
++    "read",
++    "write",
++    "create",
++    "getattr",
++    "setattr",
++    "lock",
++    "relabelfrom",
++    "relabelto",
++    "append",
++    "unlink",
++    "link",
++    "rename",
++    "execute",
++    "swapon",
++    "quotaon",
++    "mounton",
++};
++
++static char *common_socket_perm_to_string[] =
++{
++    "ioctl",
++    "read",
++    "write",
++    "create",
++    "getattr",
++    "setattr",
++    "lock",
++    "relabelfrom",
++    "relabelto",
++    "append",
++    "bind",
++    "connect",
++    "listen",
++    "accept",
++    "getopt",
++    "setopt",
++    "shutdown",
++    "recvfrom",
++    "sendto",
++    "recv_msg",
++    "send_msg",
++    "name_bind",
++};
++
++static char *common_ipc_perm_to_string[] =
++{
++    "create",
++    "destroy",
++    "getattr",
++    "setattr",
++    "read",
++    "write",
++    "associate",
++    "unix_read",
++    "unix_write",
++};
++
++
++/* FLASK */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/flask.h        2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,71 @@
++/* This file is automatically generated.  Do not edit. */
++#ifndef _SELINUX_FLASK_H_
++#define _SELINUX_FLASK_H_
++
++/*
++ * Security object class definitions
++ */
++#define SECCLASS_SECURITY                                1
++#define SECCLASS_PROCESS                                 2
++#define SECCLASS_SYSTEM                                  3
++#define SECCLASS_CAPABILITY                              4
++#define SECCLASS_FILESYSTEM                              5
++#define SECCLASS_FILE                                    6
++#define SECCLASS_DIR                                     7
++#define SECCLASS_FD                                      8
++#define SECCLASS_LNK_FILE                                9
++#define SECCLASS_CHR_FILE                                10
++#define SECCLASS_BLK_FILE                                11
++#define SECCLASS_SOCK_FILE                               12
++#define SECCLASS_FIFO_FILE                               13
++#define SECCLASS_SOCKET                                  14
++#define SECCLASS_TCP_SOCKET                              15
++#define SECCLASS_UDP_SOCKET                              16
++#define SECCLASS_RAWIP_SOCKET                            17
++#define SECCLASS_NODE                                    18
++#define SECCLASS_NETIF                                   19
++#define SECCLASS_NETLINK_SOCKET                          20
++#define SECCLASS_PACKET_SOCKET                           21
++#define SECCLASS_KEY_SOCKET                              22
++#define SECCLASS_UNIX_STREAM_SOCKET                      23
++#define SECCLASS_UNIX_DGRAM_SOCKET                       24
++#define SECCLASS_SEM                                     25
++#define SECCLASS_MSG                                     26
++#define SECCLASS_MSGQ                                    27
++#define SECCLASS_SHM                                     28
++#define SECCLASS_IPC                                     29
++#define SECCLASS_PASSWD                                  30
++
++/*
++ * Security identifier indices for initial entities
++ */
++#define SECINITSID_KERNEL                               1
++#define SECINITSID_SECURITY                             2
++#define SECINITSID_UNLABELED                            3
++#define SECINITSID_FS                                   4
++#define SECINITSID_FILE                                 5
++#define SECINITSID_FILE_LABELS                          6
++#define SECINITSID_INIT                                 7
++#define SECINITSID_ANY_SOCKET                           8
++#define SECINITSID_PORT                                 9
++#define SECINITSID_NETIF                                10
++#define SECINITSID_NETMSG                               11
++#define SECINITSID_NODE                                 12
++#define SECINITSID_IGMP_PACKET                          13
++#define SECINITSID_ICMP_SOCKET                          14
++#define SECINITSID_TCP_SOCKET                           15
++#define SECINITSID_SYSCTL_MODPROBE                      16
++#define SECINITSID_SYSCTL                               17
++#define SECINITSID_SYSCTL_FS                            18
++#define SECINITSID_SYSCTL_KERNEL                        19
++#define SECINITSID_SYSCTL_NET                           20
++#define SECINITSID_SYSCTL_NET_UNIX                      21
++#define SECINITSID_SYSCTL_VM                            22
++#define SECINITSID_SYSCTL_DEV                           23
++#define SECINITSID_KMOD                                 24
++#define SECINITSID_POLICY                               25
++#define SECINITSID_SCMP_PACKET                          26
++
++#define SECINITSID_NUM                                  26
++
++#endif
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/initial_sid_to_string.h        2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,32 @@
++/* This file is automatically generated.  Do not edit. */
++static char *initial_sid_to_string[] =
++{
++    "null",
++    "kernel",
++    "security",
++    "unlabeled",
++    "fs",
++    "file",
++    "file_labels",
++    "init",
++    "any_socket",
++    "port",
++    "netif",
++    "netmsg",
++    "node",
++    "igmp_packet",
++    "icmp_socket",
++    "tcp_socket",
++    "sysctl_modprobe",
++    "sysctl",
++    "sysctl_fs",
++    "sysctl_kernel",
++    "sysctl_net",
++    "sysctl_net_unix",
++    "sysctl_vm",
++    "sysctl_dev",
++    "kmod",
++    "policy",
++    "scmp_packet",
++};
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/objsec.h       2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,88 @@
++/*
++ *  NSA Security-Enhanced Linux (SELinux) security module
++ *
++ *  This file contains the SELinux security data structures for kernel objects.
++ *
++ *  Author(s):  Stephen Smalley, <sds@epoch.ncsc.mil>
++ *              Chris Vance, <cvance@nai.com>
++ *              Wayne Salamon, <wsalamon@nai.com>
++ *              James Morris <jmorris@redhat.com>
++ *
++ *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
++ *  Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
++ *
++ *    This program is free software; you can redistribute it and/or modify
++ *    it under the terms of the GNU General Public License version 2,
++ *      as published by the Free Software Foundation.
++ */
++#ifndef _SELINUX_OBJSEC_H_
++#define _SELINUX_OBJSEC_H_
++
++#include <linux/list.h>
++#include <linux/sched.h>
++#include <linux/fs.h>
++#include <linux/in.h>
++#include "flask.h"
++#include "avc.h"
++
++struct task_security_struct {
++        unsigned long magic;           /* magic number for this module */
++      struct task_struct *task;      /* back pointer to task object */
++      u32 osid;            /* SID prior to last execve */
++      u32 sid;             /* current SID */
++      u32 exec_sid;        /* exec SID */
++      u32 create_sid;      /* fscreate SID */
++        struct avc_entry_ref avcr;     /* reference to process permissions */
++};
++
++struct inode_security_struct {
++      unsigned long magic;           /* magic number for this module */
++        struct inode *inode;           /* back pointer to inode object */
++      struct list_head list;         /* list of inode_security_struct */
++      u32 task_sid;        /* SID of creating task */
++      u32 sid;             /* SID of this object */
++      u16 sclass;       /* security class of this object */
++      struct avc_entry_ref avcr;     /* reference to object permissions */
++      unsigned char initialized;     /* initialization flag */
++      struct semaphore sem;
++      unsigned char inherit;         /* inherit SID from parent entry */
++};
++
++struct file_security_struct {
++      unsigned long magic;            /* magic number for this module */
++      struct file *file;              /* back pointer to file object */
++      u32 sid;              /* SID of open file description */
++      u32 fown_sid;         /* SID of file owner (for SIGIO) */
++      struct avc_entry_ref avcr;      /* reference to fd permissions */
++      struct avc_entry_ref inode_avcr;     /* reference to object permissions */
++};
++
++struct superblock_security_struct {
++      unsigned long magic;            /* magic number for this module */
++      struct super_block *sb;         /* back pointer to sb object */
++      struct list_head list;          /* list of superblock_security_struct */
++      u32 sid;              /* SID of file system */
++      unsigned int behavior;          /* labeling behavior */
++      unsigned char initialized;      /* initialization flag */
++      unsigned char proc;             /* proc fs */
++      struct semaphore sem;
++};
++
++struct msg_security_struct {
++        unsigned long magic;          /* magic number for this module */
++      struct msg_msg *msg;            /* back pointer */
++      u32 sid;              /* SID of message */
++        struct avc_entry_ref avcr;    /* reference to permissions */
++};
++
++struct ipc_security_struct {
++        unsigned long magic;          /* magic number for this module */
++      struct kern_ipc_perm *ipc_perm; /* back pointer */
++      u16 sclass;     /* security class of this object */
++      u32 sid;              /* SID of IPC resource */
++        struct avc_entry_ref avcr;    /* reference to permissions */
++};
++
++extern int inode_security_set_sid(struct inode *inode, u32 sid);
++
++#endif /* _SELINUX_OBJSEC_H_ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/include/security.h     2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,70 @@
++/*
++ * Security server interface.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SELINUX_SECURITY_H_
++#define _SELINUX_SECURITY_H_
++
++#include "flask.h"
++
++#define SECSID_NULL                   0x00000000 /* unspecified SID */
++#define SECSID_WILD                   0xffffffff /* wildcard SID */
++#define SECCLASS_NULL                 0x0000 /* no class */
++
++#define SELINUX_MAGIC 0xf97cff8c
++
++int security_load_policy(void * data, size_t len);
++
++struct av_decision {
++      u32 allowed;
++      u32 decided;
++      u32 auditallow;
++      u32 auditdeny;
++      u32 seqno;
++};
++
++int security_compute_av(u32 ssid, u32 tsid,
++      u16 tclass, u32 requested,
++      struct av_decision *avd);
++
++int security_transition_sid(u32 ssid, u32 tsid,
++      u16 tclass, u32 *out_sid);
++
++int security_member_sid(u32 ssid, u32 tsid,
++      u16 tclass, u32 *out_sid);
++
++int security_change_sid(u32 ssid, u32 tsid,
++      u16 tclass, u32 *out_sid);
++
++int security_sid_to_context(u32 sid, char **scontext,
++      u32 *scontext_len);
++
++int security_context_to_sid(char *scontext, u32 scontext_len,
++      u32 *out_sid);
++
++int security_get_user_sids(u32 callsid, char *username,
++                         u32 **sids, u32 *nel);
++
++int security_port_sid(u16 domain, u16 type, u8 protocol, u16 port,
++      u32 *out_sid);
++
++int security_netif_sid(char *name, u32 *if_sid,
++      u32 *msg_sid);
++
++int security_node_sid(u16 domain, void *addr, u32 addrlen,
++      u32 *out_sid);
++
++#define SECURITY_FS_USE_XATTR 1 /* use xattr */
++#define SECURITY_FS_USE_TRANS 2 /* use transition SIDs, e.g. devpts/tmpfs */
++#define SECURITY_FS_USE_TASK  3 /* use task SIDs, e.g. pipefs/sockfs */
++#define SECURITY_FS_USE_GENFS 4 /* use the genfs support */
++#define SECURITY_FS_USE_NONE  5 /* no labeling support */
++int security_fs_use(const char *fstype, unsigned int *behavior,
++      u32 *sid);
++
++int security_genfs_sid(const char *fstype, char *name, u16 sclass,
++      u32 *sid);
++
++#endif /* _SELINUX_SECURITY_H_ */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/Kconfig        2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,34 @@
++config SECURITY_SELINUX
++      bool "NSA SELinux Support"
++      depends on SECURITY
++      default n
++      help
++        This enables NSA Security-Enhanced Linux (SELinux).
++        You will also need a policy configuration and a labeled filesystem.
++        You can obtain the policy compiler (checkpolicy), the utility for
++        labeling filesystems (setfiles), and an example policy configuration
++        from http://www.nsa.gov/selinux.
++        If you are unsure how to answer this question, answer N.
++
++config SECURITY_SELINUX_DEVELOP
++      bool "NSA SELinux Development Support"
++      depends on SECURITY_SELINUX
++      default y
++      help
++        This enables the development support option of NSA SELinux,
++        which is useful for experimenting with SELinux and developing
++        policies.  If unsure, say Y.  With this option enabled, the
++        kernel will start in permissive mode (log everything, deny nothing)
++        unless you specify enforcing=1 on the kernel command line.  You
++        can interactively toggle the kernel between enforcing mode and
++        permissive mode (if permitted by the policy) via /selinux/enforce.
++
++config SECURITY_SELINUX_MLS
++      bool "NSA SELinux MLS policy (EXPERIMENTAL)"
++      depends on SECURITY_SELINUX && EXPERIMENTAL
++      default n
++      help
++        This enables the NSA SELinux Multi-Level Security (MLS) policy in
++        addition to the default RBAC/TE policy.  This policy is
++        experimental and has not been configured for use.  Unless you
++        specifically want to experiment with MLS, say N.
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/Makefile       2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,10 @@
++#
++# Makefile for building the SELinux module as part of the kernel tree.
++#
++
++obj-$(CONFIG_SECURITY_SELINUX) := selinux.o ss/
++
++selinux-objs := avc.o hooks.o selinuxfs.o
++
++EXTRA_CFLAGS += -Isecurity/selinux/include
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/selinuxfs.c    2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,593 @@
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/fs.h>
++#include <linux/init.h>
++#include <linux/string.h>
++#include <linux/security.h>
++#include <asm/uaccess.h>
++
++/* selinuxfs pseudo filesystem for exporting the security policy API.
++   Based on the proc code and the fs/nfsd/nfsctl.c code. */
++
++#include "flask.h"
++#include "avc.h"
++#include "avc_ss.h"
++#include "security.h"
++#include "objsec.h"
++
++/* Check whether a task is allowed to use a security operation. */
++int task_has_security(struct task_struct *tsk,
++                    u32 perms)
++{
++      struct task_security_struct *tsec;
++
++      tsec = tsk->security;
++
++      return avc_has_perm(tsec->sid, SECINITSID_SECURITY,
++                          SECCLASS_SECURITY, perms, NULL, NULL);
++}
++
++enum sel_inos {
++      SEL_ROOT_INO = 2,
++      SEL_LOAD,       /* load policy */
++      SEL_ENFORCE,    /* get or set enforcing status */
++      SEL_CONTEXT,    /* validate context */
++      SEL_ACCESS,     /* compute access decision */
++      SEL_CREATE,     /* compute create labeling decision */
++      SEL_RELABEL,    /* compute relabeling decision */
++      SEL_USER        /* compute reachable user contexts */
++};
++
++static ssize_t sel_read_enforce(struct file *filp, char *buf,
++                              size_t count, loff_t *ppos)
++{
++      char *page;
++      ssize_t length;
++      ssize_t end;
++
++      if (count < 0 || count > PAGE_SIZE)
++              return -EINVAL;
++      if (!(page = (char*)__get_free_page(GFP_KERNEL)))
++              return -ENOMEM;
++      memset(page, 0, PAGE_SIZE);
++
++      length = snprintf(page, PAGE_SIZE, "%d", selinux_enforcing);
++      if (length < 0) {
++              free_page((unsigned long)page);
++              return length;
++      }
++
++      if (*ppos >= length) {
++              free_page((unsigned long)page);
++              return 0;
++      }
++      if (count + *ppos > length)
++              count = length - *ppos;
++      end = count + *ppos;
++      if (copy_to_user(buf, (char *) page + *ppos, count)) {
++              count = -EFAULT;
++              goto out;
++      }
++      *ppos = end;
++out:
++      free_page((unsigned long)page);
++      return count;
++}
++
++#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
++static ssize_t sel_write_enforce(struct file * file, const char * buf,
++                               size_t count, loff_t *ppos)
++
++{
++      char *page;
++      ssize_t length;
++      int new_value;
++
++      if (count < 0 || count >= PAGE_SIZE)
++              return -ENOMEM;
++      if (*ppos != 0) {
++              /* No partial writes. */
++              return -EINVAL;
++      }
++      page = (char*)__get_free_page(GFP_KERNEL);
++      if (!page)
++              return -ENOMEM;
++      memset(page, 0, PAGE_SIZE);
++      length = -EFAULT;
++      if (copy_from_user(page, buf, count))
++              goto out;
++
++      length = -EINVAL;
++      if (sscanf(page, "%d", &new_value) != 1)
++              goto out;
++
++      if (new_value != selinux_enforcing) {
++              length = task_has_security(current, SECURITY__SETENFORCE);
++              if (length)
++                      goto out;
++              selinux_enforcing = new_value;
++              if (selinux_enforcing)
++                      avc_ss_reset(0);
++      }
++      length = count;
++out:
++      free_page((unsigned long) page);
++      return length;
++}
++#else
++#define sel_write_enforce NULL
++#endif
++
++static struct file_operations sel_enforce_ops = {
++      .read           = sel_read_enforce,
++      .write          = sel_write_enforce,
++};
++
++static ssize_t sel_write_load(struct file * file, const char * buf,
++                            size_t count, loff_t *ppos)
++
++{
++      ssize_t length;
++      void *data;
++
++      length = task_has_security(current, SECURITY__LOAD_POLICY);
++      if (length)
++              return length;
++
++      if (*ppos != 0) {
++              /* No partial writes. */
++              return -EINVAL;
++      }
++
++      if ((count < 0) || (count > 64 * 1024 * 1024) || (data = vmalloc(count)) == NULL)
++              return -ENOMEM;
++
++      length = -EFAULT;
++      if (copy_from_user(data, buf, count) != 0)
++              goto out;
++
++      length = security_load_policy(data, count);
++      if (length)
++              goto out;
++
++      length = count;
++out:
++      vfree(data);
++      return length;
++}
++
++static struct file_operations sel_load_ops = {
++      .write          = sel_write_load,
++};
++
++
++static ssize_t sel_write_context(struct file * file, const char * buf,
++                               size_t count, loff_t *ppos)
++
++{
++      char *page;
++      u32 sid;
++      ssize_t length;
++
++      length = task_has_security(current, SECURITY__CHECK_CONTEXT);
++      if (length)
++              return length;
++
++      if (count < 0 || count >= PAGE_SIZE)
++              return -ENOMEM;
++      if (*ppos != 0) {
++              /* No partial writes. */
++              return -EINVAL;
++      }
++      page = (char*)__get_free_page(GFP_KERNEL);
++      if (!page)
++              return -ENOMEM;
++      memset(page, 0, PAGE_SIZE);
++      length = -EFAULT;
++      if (copy_from_user(page, buf, count))
++              goto out;
++
++      length = security_context_to_sid(page, count, &sid);
++      if (length < 0)
++              goto out;
++
++      length = count;
++out:
++      free_page((unsigned long) page);
++      return length;
++}
++
++static struct file_operations sel_context_ops = {
++      .write          = sel_write_context,
++};
++
++
++/*
++ * Remaining nodes use transaction based IO methods like nfsd/nfsctl.c
++ */
++static ssize_t sel_write_access(struct file * file, char *buf, size_t size);
++static ssize_t sel_write_create(struct file * file, char *buf, size_t size);
++static ssize_t sel_write_relabel(struct file * file, char *buf, size_t size);
++static ssize_t sel_write_user(struct file * file, char *buf, size_t size);
++
++static ssize_t (*write_op[])(struct file *, char *, size_t) = {
++      [SEL_ACCESS] = sel_write_access,
++      [SEL_CREATE] = sel_write_create,
++      [SEL_RELABEL] = sel_write_relabel,
++      [SEL_USER] = sel_write_user,
++};
++
++/* an argresp is stored in an allocated page and holds the
++ * size of the argument or response, along with its content
++ */
++struct argresp {
++      ssize_t size;
++      char data[0];
++};
++
++#define PAYLOAD_SIZE (PAGE_SIZE - sizeof(struct argresp))
++
++/*
++ * transaction based IO methods.
++ * The file expects a single write which triggers the transaction, and then
++ * possibly a read which collects the result - which is stored in a
++ * file-local buffer.
++ */
++static ssize_t TA_write(struct file *file, const char *buf, size_t size, loff_t *pos)
++{
++      ino_t ino =  file->f_dentry->d_inode->i_ino;
++      struct argresp *ar;
++      ssize_t rv = 0;
++
++      if (ino >= sizeof(write_op)/sizeof(write_op[0]) || !write_op[ino])
++              return -EINVAL;
++      if (file->private_data)
++              return -EINVAL; /* only one write allowed per open */
++      if (size > PAYLOAD_SIZE - 1) /* allow one byte for null terminator */
++              return -EFBIG;
++
++      ar = kmalloc(PAGE_SIZE, GFP_KERNEL);
++      if (!ar)
++              return -ENOMEM;
++      memset(ar, 0, PAGE_SIZE); /* clear buffer, particularly last byte */
++      ar->size = 0;
++      down(&file->f_dentry->d_inode->i_sem);
++      if (file->private_data)
++              rv = -EINVAL;
++      else
++              file->private_data = ar;
++      up(&file->f_dentry->d_inode->i_sem);
++      if (rv) {
++              kfree(ar);
++              return rv;
++      }
++      if (copy_from_user(ar->data, buf, size))
++              return -EFAULT;
++
++      rv =  write_op[ino](file, ar->data, size);
++      if (rv>0) {
++              ar->size = rv;
++              rv = size;
++      }
++      return rv;
++}
++
++static ssize_t TA_read(struct file *file, char *buf, size_t size, loff_t *pos)
++{
++      struct argresp *ar;
++      ssize_t rv = 0;
++
++      if (file->private_data == NULL)
++              rv = TA_write(file, buf, 0, pos);
++      if (rv < 0)
++              return rv;
++
++      ar = file->private_data;
++      if (!ar)
++              return 0;
++      if (*pos >= ar->size)
++              return 0;
++      if (*pos + size > ar->size)
++              size = ar->size - *pos;
++      if (copy_to_user(buf, ar->data + *pos, size))
++              return -EFAULT;
++      *pos += size;
++      return size;
++}
++
++static int TA_open(struct inode *inode, struct file *file)
++{
++      file->private_data = NULL;
++      return 0;
++}
++
++static int TA_release(struct inode *inode, struct file *file)
++{
++      void *p = file->private_data;
++      file->private_data = NULL;
++      kfree(p);
++      return 0;
++}
++
++static struct file_operations transaction_ops = {
++      .write          = TA_write,
++      .read           = TA_read,
++      .open           = TA_open,
++      .release        = TA_release,
++};
++
++/*
++ * payload - write methods
++ * If the method has a response, the response should be put in buf,
++ * and the length returned.  Otherwise return 0 or and -error.
++ */
++
++static ssize_t sel_write_access(struct file * file, char *buf, size_t size)
++{
++      char *scon, *tcon;
++      u32 ssid, tsid;
++      u16 tclass;
++      u32 req;
++      struct av_decision avd;
++      ssize_t length;
++
++      length = task_has_security(current, SECURITY__COMPUTE_AV);
++      if (length)
++              return length;
++
++      length = -ENOMEM;
++      scon = kmalloc(size+1, GFP_KERNEL);
++      if (!scon)
++              return length;
++      memset(scon, 0, size+1);
++
++      tcon = kmalloc(size+1, GFP_KERNEL);
++      if (!tcon)
++              goto out;
++      memset(tcon, 0, size+1);
++
++      length = -EINVAL;
++      if (sscanf(buf, "%s %s %hu %x", scon, tcon, &tclass, &req) != 4)
++              goto out2;
++
++      length = security_context_to_sid(scon, strlen(scon)+1, &ssid);
++      if (length < 0)
++              goto out2;
++      length = security_context_to_sid(tcon, strlen(tcon)+1, &tsid);
++      if (length < 0)
++              goto out2;
++
++      length = security_compute_av(ssid, tsid, tclass, req, &avd);
++      if (length < 0)
++              goto out2;
++
++      length = snprintf(buf, PAYLOAD_SIZE, "%x %x %x %x %u",
++                        avd.allowed, avd.decided,
++                        avd.auditallow, avd.auditdeny,
++                        avd.seqno);
++out2:
++      kfree(tcon);
++out:
++      kfree(scon);
++      return length;
++}
++
++static ssize_t sel_write_create(struct file * file, char *buf, size_t size)
++{
++      char *scon, *tcon;
++      u32 ssid, tsid, newsid;
++      u16 tclass;
++      ssize_t length;
++      char *newcon;
++      u32 len;
++
++      length = task_has_security(current, SECURITY__COMPUTE_CREATE);
++      if (length)
++              return length;
++
++      length = -ENOMEM;
++      scon = kmalloc(size+1, GFP_KERNEL);
++      if (!scon)
++              return length;
++      memset(scon, 0, size+1);
++
++      tcon = kmalloc(size+1, GFP_KERNEL);
++      if (!tcon)
++              goto out;
++      memset(tcon, 0, size+1);
++
++      length = -EINVAL;
++      if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3)
++              goto out2;
++
++      length = security_context_to_sid(scon, strlen(scon)+1, &ssid);
++      if (length < 0)
++              goto out2;
++      length = security_context_to_sid(tcon, strlen(tcon)+1, &tsid);
++      if (length < 0)
++              goto out2;
++
++      length = security_transition_sid(ssid, tsid, tclass, &newsid);
++      if (length < 0)
++              goto out2;
++
++      length = security_sid_to_context(newsid, &newcon, &len);
++      if (length < 0)
++              goto out2;
++
++      if (len > PAYLOAD_SIZE) {
++              printk(KERN_ERR "%s:  context size (%u) exceeds payload "
++                     "max\n", __FUNCTION__, len);
++              length = -ERANGE;
++              goto out3;
++      }
++
++      memcpy(buf, newcon, len);
++      length = len;
++out3:
++      kfree(newcon);
++out2:
++      kfree(tcon);
++out:
++      kfree(scon);
++      return length;
++}
++
++static ssize_t sel_write_relabel(struct file * file, char *buf, size_t size)
++{
++      char *scon, *tcon;
++      u32 ssid, tsid, newsid;
++      u16 tclass;
++      ssize_t length;
++      char *newcon;
++      u32 len;
++
++      length = task_has_security(current, SECURITY__COMPUTE_RELABEL);
++      if (length)
++              return length;
++
++      length = -ENOMEM;
++      scon = kmalloc(size+1, GFP_KERNEL);
++      if (!scon)
++              return length;
++      memset(scon, 0, size+1);
++
++      tcon = kmalloc(size+1, GFP_KERNEL);
++      if (!tcon)
++              goto out;
++      memset(tcon, 0, size+1);
++
++      length = -EINVAL;
++      if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3)
++              goto out2;
++
++      length = security_context_to_sid(scon, strlen(scon)+1, &ssid);
++      if (length < 0)
++              goto out2;
++      length = security_context_to_sid(tcon, strlen(tcon)+1, &tsid);
++      if (length < 0)
++              goto out2;
++
++      length = security_change_sid(ssid, tsid, tclass, &newsid);
++      if (length < 0)
++              goto out2;
++
++      length = security_sid_to_context(newsid, &newcon, &len);
++      if (length < 0)
++              goto out2;
++
++      if (len > PAYLOAD_SIZE) {
++              length = -ERANGE;
++              goto out3;
++      }
++
++      memcpy(buf, newcon, len);
++      length = len;
++out3:
++      kfree(newcon);
++out2:
++      kfree(tcon);
++out:
++      kfree(scon);
++      return length;
++}
++
++static ssize_t sel_write_user(struct file * file, char *buf, size_t size)
++{
++      char *con, *user, *ptr;
++      u32 sid, *sids;
++      ssize_t length;
++      char *newcon;
++      int i, rc;
++      u32 len, nsids;
++
++      length = task_has_security(current, SECURITY__COMPUTE_USER);
++      if (length)
++              return length;
++
++      length = -ENOMEM;
++      con = kmalloc(size+1, GFP_KERNEL);
++      if (!con)
++              return length;
++      memset(con, 0, size+1);
++
++      user = kmalloc(size+1, GFP_KERNEL);
++      if (!user)
++              goto out;
++      memset(user, 0, size+1);
++
++      length = -EINVAL;
++      if (sscanf(buf, "%s %s", con, user) != 2)
++              goto out2;
++
++      length = security_context_to_sid(con, strlen(con)+1, &sid);
++      if (length < 0)
++              goto out2;
++
++      length = security_get_user_sids(sid, user, &sids, &nsids);
++      if (length < 0)
++              goto out2;
++
++      length = sprintf(buf, "%u", nsids) + 1;
++      ptr = buf + length;
++      for (i = 0; i < nsids; i++) {
++              rc = security_sid_to_context(sids[i], &newcon, &len);
++              if (rc) {
++                      length = rc;
++                      goto out3;
++              }
++              if ((length + len) >= PAYLOAD_SIZE) {
++                      kfree(newcon);
++                      length = -ERANGE;
++                      goto out3;
++              }
++              memcpy(ptr, newcon, len);
++              kfree(newcon);
++              ptr += len;
++              length += len;
++      }
++out3:
++      kfree(sids);
++out2:
++      kfree(user);
++out:
++      kfree(con);
++      return length;
++}
++
++
++static int sel_fill_super(struct super_block * sb, void * data, int silent)
++{
++      static struct tree_descr selinux_files[] = {
++              [SEL_LOAD] = {"load", &sel_load_ops, S_IRUSR|S_IWUSR},
++              [SEL_ENFORCE] = {"enforce", &sel_enforce_ops, S_IRUSR|S_IWUSR},
++              [SEL_CONTEXT] = {"context", &sel_context_ops, S_IRUGO|S_IWUGO},
++              [SEL_ACCESS] = {"access", &transaction_ops, S_IRUGO|S_IWUGO},
++              [SEL_CREATE] = {"create", &transaction_ops, S_IRUGO|S_IWUGO},
++              [SEL_RELABEL] = {"relabel", &transaction_ops, S_IRUGO|S_IWUGO},
++              [SEL_USER] = {"user", &transaction_ops, S_IRUGO|S_IWUGO},
++              /* last one */ {""}
++      };
++      return simple_fill_super(sb, SELINUX_MAGIC, selinux_files);
++}
++
++static struct super_block *sel_get_sb(struct file_system_type *fs_type,
++                                    int flags, const char *dev_name, void *data)
++{
++      return get_sb_single(fs_type, flags, data, sel_fill_super);
++}
++
++static struct file_system_type sel_fs_type = {
++      .name           = "selinuxfs",
++      .get_sb         = sel_get_sb,
++      .kill_sb        = kill_litter_super,
++};
++
++static int __init init_sel_fs(void)
++{
++      return register_filesystem(&sel_fs_type);
++}
++
++__initcall(init_sel_fs);
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/avtab.c     2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,264 @@
++/*
++ * Implementation of the access vector table type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "avtab.h"
++#include "policydb.h"
++
++#define AVTAB_HASH(keyp) \
++((keyp->target_class + \
++ (keyp->target_type << 2) + \
++ (keyp->source_type << 9)) & \
++ AVTAB_HASH_MASK)
++
++int avtab_insert(struct avtab *h, struct avtab_key *key, struct avtab_datum *datum)
++{
++      int hvalue;
++      struct avtab_node *prev, *cur, *newnode;
++
++      if (!h)
++              return -EINVAL;
++
++      hvalue = AVTAB_HASH(key);
++      for (prev = NULL, cur = h->htable[hvalue];
++           cur;
++           prev = cur, cur = cur->next) {
++              if (key->source_type == cur->key.source_type &&
++                  key->target_type == cur->key.target_type &&
++                  key->target_class == cur->key.target_class &&
++                  (datum->specified & cur->datum.specified))
++                      return -EEXIST;
++              if (key->source_type < cur->key.source_type)
++                      break;
++              if (key->source_type == cur->key.source_type &&
++                  key->target_type < cur->key.target_type)
++                      break;
++              if (key->source_type == cur->key.source_type &&
++                  key->target_type == cur->key.target_type &&
++                  key->target_class < cur->key.target_class)
++                      break;
++      }
++
++      newnode = kmalloc(sizeof(*newnode), GFP_KERNEL);
++      if (newnode == NULL)
++              return -ENOMEM;
++      memset(newnode, 0, sizeof(*newnode));
++      newnode->key = *key;
++      newnode->datum = *datum;
++      if (prev) {
++              newnode->next = prev->next;
++              prev->next = newnode;
++      } else {
++              newnode->next = h->htable[hvalue];
++              h->htable[hvalue] = newnode;
++      }
++
++      h->nel++;
++      return 0;
++}
++
++
++struct avtab_datum *avtab_search(struct avtab *h, struct avtab_key *key, int specified)
++{
++      int hvalue;
++      struct avtab_node *cur;
++
++      if (!h)
++              return NULL;
++
++      hvalue = AVTAB_HASH(key);
++      for (cur = h->htable[hvalue]; cur; cur = cur->next) {
++              if (key->source_type == cur->key.source_type &&
++                  key->target_type == cur->key.target_type &&
++                  key->target_class == cur->key.target_class &&
++                  (specified & cur->datum.specified))
++                      return &cur->datum;
++
++              if (key->source_type < cur->key.source_type)
++                      break;
++              if (key->source_type == cur->key.source_type &&
++                  key->target_type < cur->key.target_type)
++                      break;
++              if (key->source_type == cur->key.source_type &&
++                  key->target_type == cur->key.target_type &&
++                  key->target_class < cur->key.target_class)
++                      break;
++      }
++
++      return NULL;
++}
++
++void avtab_destroy(struct avtab *h)
++{
++      int i;
++      struct avtab_node *cur, *temp;
++
++      if (!h)
++              return;
++
++      for (i = 0; i < AVTAB_SIZE; i++) {
++              cur = h->htable[i];
++              while (cur != NULL) {
++                      temp = cur;
++                      cur = cur->next;
++                      kfree(temp);
++              }
++              h->htable[i] = NULL;
++      }
++      kfree(h->htable);
++}
++
++
++int avtab_map(struct avtab *h,
++            int (*apply) (struct avtab_key *k,
++                          struct avtab_datum *d,
++                          void *args),
++            void *args)
++{
++      int i, ret;
++      struct avtab_node *cur;
++
++      if (!h)
++              return 0;
++
++      for (i = 0; i < AVTAB_SIZE; i++) {
++              cur = h->htable[i];
++              while (cur != NULL) {
++                      ret = apply(&cur->key, &cur->datum, args);
++                      if (ret)
++                              return ret;
++                      cur = cur->next;
++              }
++      }
++      return 0;
++}
++
++int avtab_init(struct avtab *h)
++{
++      int i;
++
++      h->htable = kmalloc(sizeof(*(h->htable)) * AVTAB_SIZE, GFP_KERNEL);
++      if (!h->htable)
++              return -ENOMEM;
++      for (i = 0; i < AVTAB_SIZE; i++)
++              h->htable[i] = NULL;
++      h->nel = 0;
++      return 0;
++}
++
++void avtab_hash_eval(struct avtab *h, char *tag)
++{
++      int i, chain_len, slots_used, max_chain_len;
++      struct avtab_node *cur;
++
++      slots_used = 0;
++      max_chain_len = 0;
++      for (i = 0; i < AVTAB_SIZE; i++) {
++              cur = h->htable[i];
++              if (cur) {
++                      slots_used++;
++                      chain_len = 0;
++                      while (cur) {
++                              chain_len++;
++                              cur = cur->next;
++                      }
++
++                      if (chain_len > max_chain_len)
++                              max_chain_len = chain_len;
++              }
++      }
++
++      printk(KERN_INFO "%s:  %d entries and %d/%d buckets used, longest "
++             "chain length %d\n", tag, h->nel, slots_used, AVTAB_SIZE,
++             max_chain_len);
++}
++
++int avtab_read(struct avtab *a, void *fp, u32 config)
++{
++      int i, rc = -EINVAL;
++      struct avtab_key avkey;
++      struct avtab_datum avdatum;
++      u32 *buf;
++      u32 nel, items, items2;
++
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf) {
++              printk(KERN_ERR "security: avtab: truncated table\n");
++              goto bad;
++      }
++      nel = le32_to_cpu(buf[0]);
++      if (!nel) {
++              printk(KERN_ERR "security: avtab: table is empty\n");
++              goto bad;
++      }
++      for (i = 0; i < nel; i++) {
++              memset(&avkey, 0, sizeof(avkey));
++              memset(&avdatum, 0, sizeof(avdatum));
++
++              buf = next_entry(fp, sizeof(u32));
++              if (!buf) {
++                      printk(KERN_ERR "security: avtab: truncated entry\n");
++                      goto bad;
++              }
++              items2 = le32_to_cpu(buf[0]);
++              buf = next_entry(fp, sizeof(u32)*items2);
++              if (!buf) {
++                      printk(KERN_ERR "security: avtab: truncated entry\n");
++                      goto bad;
++              }
++              items = 0;
++              avkey.source_type = le32_to_cpu(buf[items++]);
++              avkey.target_type = le32_to_cpu(buf[items++]);
++              avkey.target_class = le32_to_cpu(buf[items++]);
++              avdatum.specified = le32_to_cpu(buf[items++]);
++              if (!(avdatum.specified & (AVTAB_AV | AVTAB_TYPE))) {
++                      printk(KERN_ERR "security: avtab: null entry\n");
++                      goto bad;
++              }
++              if ((avdatum.specified & AVTAB_AV) &&
++                  (avdatum.specified & AVTAB_TYPE)) {
++                      printk(KERN_ERR "security: avtab: entry has both "
++                             "access vectors and types\n");
++                      goto bad;
++              }
++              if (avdatum.specified & AVTAB_AV) {
++                      if (avdatum.specified & AVTAB_ALLOWED)
++                              avtab_allowed(&avdatum) = le32_to_cpu(buf[items++]);
++                      if (avdatum.specified & AVTAB_AUDITDENY)
++                              avtab_auditdeny(&avdatum) = le32_to_cpu(buf[items++]);
++                      if (avdatum.specified & AVTAB_AUDITALLOW)
++                              avtab_auditallow(&avdatum) = le32_to_cpu(buf[items++]);
++              } else {
++                      if (avdatum.specified & AVTAB_TRANSITION)
++                              avtab_transition(&avdatum) = le32_to_cpu(buf[items++]);
++                      if (avdatum.specified & AVTAB_CHANGE)
++                              avtab_change(&avdatum) = le32_to_cpu(buf[items++]);
++                      if (avdatum.specified & AVTAB_MEMBER)
++                              avtab_member(&avdatum) = le32_to_cpu(buf[items++]);
++              }
++              if (items != items2) {
++                      printk(KERN_ERR "security: avtab: entry only had %d "
++                             "items, expected %d\n", items2, items);
++                      goto bad;
++              }
++              rc = avtab_insert(a, &avkey, &avdatum);
++              if (rc) {
++                      if (rc == -ENOMEM)
++                              printk(KERN_ERR "security: avtab: out of memory\n");
++                      if (rc == -EEXIST)
++                              printk(KERN_ERR "security: avtab: duplicate entry\n");
++                      goto bad;
++              }
++      }
++
++      rc = 0;
++out:
++      return rc;
++
++bad:
++      avtab_destroy(a);
++      goto out;
++}
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/avtab.h     2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,68 @@
++/*
++ * An access vector table (avtab) is a hash table
++ * of access vectors and transition types indexed
++ * by a type pair and a class.  An access vector
++ * table is used to represent the type enforcement
++ * tables.
++ *
++ *  Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_AVTAB_H_
++#define _SS_AVTAB_H_
++
++struct avtab_key {
++      u32 source_type;        /* source type */
++      u32 target_type;        /* target type */
++      u32 target_class;       /* target object class */
++};
++
++struct avtab_datum {
++#define AVTAB_ALLOWED     1
++#define AVTAB_AUDITALLOW  2
++#define AVTAB_AUDITDENY   4
++#define AVTAB_AV         (AVTAB_ALLOWED | AVTAB_AUDITALLOW | AVTAB_AUDITDENY)
++#define AVTAB_TRANSITION 16
++#define AVTAB_MEMBER     32
++#define AVTAB_CHANGE     64
++#define AVTAB_TYPE       (AVTAB_TRANSITION | AVTAB_MEMBER | AVTAB_CHANGE)
++      u32 specified;  /* what fields are specified */
++      u32 data[3];    /* access vectors or types */
++#define avtab_allowed(x) (x)->data[0]
++#define avtab_auditdeny(x) (x)->data[1]
++#define avtab_auditallow(x) (x)->data[2]
++#define avtab_transition(x) (x)->data[0]
++#define avtab_change(x) (x)->data[1]
++#define avtab_member(x) (x)->data[2]
++};
++
++struct avtab_node {
++      struct avtab_key key;
++      struct avtab_datum datum;
++      struct avtab_node *next;
++};
++
++struct avtab {
++      struct avtab_node **htable;
++      u32 nel;        /* number of elements */
++};
++
++int avtab_init(struct avtab *);
++int avtab_insert(struct avtab *h, struct avtab_key *k, struct avtab_datum *d);
++struct avtab_datum *avtab_search(struct avtab *h, struct avtab_key *k, int specified);
++void avtab_destroy(struct avtab *h);
++int avtab_map(struct avtab *h,
++            int (*apply) (struct avtab_key *k,
++                          struct avtab_datum *d,
++                          void *args),
++            void *args);
++void avtab_hash_eval(struct avtab *h, char *tag);
++int avtab_read(struct avtab *a, void *fp, u32 config);
++
++#define AVTAB_HASH_BITS 15
++#define AVTAB_HASH_BUCKETS (1 << AVTAB_HASH_BITS)
++#define AVTAB_HASH_MASK (AVTAB_HASH_BUCKETS-1)
++
++#define AVTAB_SIZE AVTAB_HASH_BUCKETS
++
++#endif        /* _SS_AVTAB_H_ */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/constraint.h        2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,54 @@
++/*
++ * A constraint is a condition that must be satisfied in
++ * order for one or more permissions to be granted.
++ * Constraints are used to impose additional restrictions
++ * beyond the type-based rules in `te' or the role-based
++ * transition rules in `rbac'.  Constraints are typically
++ * used to prevent a process from transitioning to a new user
++ * identity or role unless it is in a privileged type.
++ * Constraints are likewise typically used to prevent a
++ * process from labeling an object with a different user
++ * identity.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_CONSTRAINT_H_
++#define _SS_CONSTRAINT_H_
++
++#include "ebitmap.h"
++
++#define CEXPR_MAXDEPTH 5
++
++struct constraint_expr {
++#define CEXPR_NOT             1 /* not expr */
++#define CEXPR_AND             2 /* expr and expr */
++#define CEXPR_OR              3 /* expr or expr */
++#define CEXPR_ATTR            4 /* attr op attr */
++#define CEXPR_NAMES           5 /* attr op names */
++      u32 expr_type;          /* expression type */
++
++#define CEXPR_USER 1          /* user */
++#define CEXPR_ROLE 2          /* role */
++#define CEXPR_TYPE 4          /* type */
++#define CEXPR_TARGET 8                /* target if set, source otherwise */
++      u32 attr;               /* attribute */
++
++#define CEXPR_EQ     1                /* == or eq */
++#define CEXPR_NEQ    2                /* != */
++#define CEXPR_DOM    3                /* dom */
++#define CEXPR_DOMBY  4                /* domby  */
++#define CEXPR_INCOMP 5                /* incomp */
++      u32 op;                 /* operator */
++
++      struct ebitmap names;   /* names */
++
++      struct constraint_expr *next;   /* next expression */
++};
++
++struct constraint_node {
++      u32 permissions;        /* constrained permissions */
++      struct constraint_expr *expr;   /* constraint on permissions */
++      struct constraint_node *next;   /* next constraint */
++};
++
++#endif        /* _SS_CONSTRAINT_H_ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/context.h   2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,117 @@
++/*
++ * A security context is a set of security attributes
++ * associated with each subject and object controlled
++ * by the security policy.  Security contexts are
++  * externally represented as variable-length strings
++ * that can be interpreted by a user or application
++ * with an understanding of the security policy.
++ * Internally, the security server uses a simple
++ * structure.  This structure is private to the
++ * security server and can be changed without affecting
++ * clients of the security server.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_CONTEXT_H_
++#define _SS_CONTEXT_H_
++
++#include "ebitmap.h"
++#include "mls_types.h"
++
++/*
++ * A security context consists of an authenticated user
++ * identity, a role, a type and a MLS range.
++ */
++struct context {
++      u32 user;
++      u32 role;
++      u32 type;
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++      struct mls_range range;
++#endif
++};
++
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++
++static inline void mls_context_init(struct context *c)
++{
++      memset(&c->range, 0, sizeof(c->range));
++}
++
++static inline int mls_context_cpy(struct context *dst, struct context *src)
++{
++      int rc;
++
++      dst->range.level[0].sens = src->range.level[0].sens;
++      rc = ebitmap_cpy(&dst->range.level[0].cat, &src->range.level[0].cat);
++      if (rc)
++              goto out;
++
++      dst->range.level[1].sens = src->range.level[1].sens;
++      rc = ebitmap_cpy(&dst->range.level[1].cat, &src->range.level[1].cat);
++      if (rc)
++              ebitmap_destroy(&dst->range.level[0].cat);
++out:
++      return rc;
++}
++
++static inline int mls_context_cmp(struct context *c1, struct context *c2)
++{
++      return ((c1->range.level[0].sens == c2->range.level[0].sens) &&
++              ebitmap_cmp(&c1->range.level[0].cat,&c2->range.level[0].cat) &&
++              (c1->range.level[1].sens == c2->range.level[1].sens) &&
++              ebitmap_cmp(&c1->range.level[1].cat,&c2->range.level[1].cat));
++}
++
++static inline void mls_context_destroy(struct context *c)
++{
++      ebitmap_destroy(&c->range.level[0].cat);
++      ebitmap_destroy(&c->range.level[1].cat);
++      mls_context_init(c);
++}
++
++#else
++
++static inline void mls_context_init(struct context *c)
++{ }
++
++static inline int mls_context_cpy(struct context *dst, struct context *src)
++{ return 0; }
++
++static inline int mls_context_cmp(struct context *c1, struct context *c2)
++{ return 1; }
++
++static inline void mls_context_destroy(struct context *c)
++{ }
++
++#endif
++
++static inline void context_init(struct context *c)
++{
++      memset(c, 0, sizeof(*c));
++}
++
++static inline int context_cpy(struct context *dst, struct context *src)
++{
++      dst->user = src->user;
++      dst->role = src->role;
++      dst->type = src->type;
++      return mls_context_cpy(dst, src);
++}
++
++static inline void context_destroy(struct context *c)
++{
++      c->user = c->role = c->type = 0;
++      mls_context_destroy(c);
++}
++
++static inline int context_cmp(struct context *c1, struct context *c2)
++{
++      return ((c1->user == c2->user) &&
++              (c1->role == c2->role) &&
++              (c1->type == c2->type) &&
++              mls_context_cmp(c1, c2));
++}
++
++#endif        /* _SS_CONTEXT_H_ */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/ebitmap.c   2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,332 @@
++/*
++ * Implementation of the extensible bitmap type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "ebitmap.h"
++#include "policydb.h"
++
++int ebitmap_or(struct ebitmap *dst, struct ebitmap *e1, struct ebitmap *e2)
++{
++      struct ebitmap_node *n1, *n2, *new, *prev;
++
++      ebitmap_init(dst);
++
++      n1 = e1->node;
++      n2 = e2->node;
++      prev = 0;
++      while (n1 || n2) {
++              new = kmalloc(sizeof(*new), GFP_ATOMIC);
++              if (!new) {
++                      ebitmap_destroy(dst);
++                      return -ENOMEM;
++              }
++              memset(new, 0, sizeof(*new));
++              if (n1 && n2 && n1->startbit == n2->startbit) {
++                      new->startbit = n1->startbit;
++                      new->map = n1->map | n2->map;
++                      n1 = n1->next;
++                      n2 = n2->next;
++              } else if (!n2 || (n1 && n1->startbit < n2->startbit)) {
++                      new->startbit = n1->startbit;
++                      new->map = n1->map;
++                      n1 = n1->next;
++              } else {
++                      new->startbit = n2->startbit;
++                      new->map = n2->map;
++                      n2 = n2->next;
++              }
++
++              new->next = 0;
++              if (prev)
++                      prev->next = new;
++              else
++                      dst->node = new;
++              prev = new;
++      }
++
++      dst->highbit = (e1->highbit > e2->highbit) ? e1->highbit : e2->highbit;
++      return 0;
++}
++
++int ebitmap_cmp(struct ebitmap *e1, struct ebitmap *e2)
++{
++      struct ebitmap_node *n1, *n2;
++
++      if (e1->highbit != e2->highbit)
++              return 0;
++
++      n1 = e1->node;
++      n2 = e2->node;
++      while (n1 && n2 &&
++             (n1->startbit == n2->startbit) &&
++             (n1->map == n2->map)) {
++              n1 = n1->next;
++              n2 = n2->next;
++      }
++
++      if (n1 || n2)
++              return 0;
++
++      return 1;
++}
++
++int ebitmap_cpy(struct ebitmap *dst, struct ebitmap *src)
++{
++      struct ebitmap_node *n, *new, *prev;
++
++      ebitmap_init(dst);
++      n = src->node;
++      prev = 0;
++      while (n) {
++              new = kmalloc(sizeof(*new), GFP_ATOMIC);
++              if (!new) {
++                      ebitmap_destroy(dst);
++                      return -ENOMEM;
++              }
++              memset(new, 0, sizeof(*new));
++              new->startbit = n->startbit;
++              new->map = n->map;
++              new->next = 0;
++              if (prev)
++                      prev->next = new;
++              else
++                      dst->node = new;
++              prev = new;
++              n = n->next;
++      }
++
++      dst->highbit = src->highbit;
++      return 0;
++}
++
++int ebitmap_contains(struct ebitmap *e1, struct ebitmap *e2)
++{
++      struct ebitmap_node *n1, *n2;
++
++      if (e1->highbit < e2->highbit)
++              return 0;
++
++      n1 = e1->node;
++      n2 = e2->node;
++      while (n1 && n2 && (n1->startbit <= n2->startbit)) {
++              if (n1->startbit < n2->startbit) {
++                      n1 = n1->next;
++                      continue;
++              }
++              if ((n1->map & n2->map) != n2->map)
++                      return 0;
++
++              n1 = n1->next;
++              n2 = n2->next;
++      }
++
++      if (n2)
++              return 0;
++
++      return 1;
++}
++
++int ebitmap_get_bit(struct ebitmap *e, unsigned long bit)
++{
++      struct ebitmap_node *n;
++
++      if (e->highbit < bit)
++              return 0;
++
++      n = e->node;
++      while (n && (n->startbit <= bit)) {
++              if ((n->startbit + MAPSIZE) > bit) {
++                      if (n->map & (MAPBIT << (bit - n->startbit)))
++                              return 1;
++                      else
++                              return 0;
++              }
++              n = n->next;
++      }
++
++      return 0;
++}
++
++int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value)
++{
++      struct ebitmap_node *n, *prev, *new;
++
++      prev = 0;
++      n = e->node;
++      while (n && n->startbit <= bit) {
++              if ((n->startbit + MAPSIZE) > bit) {
++                      if (value) {
++                              n->map |= (MAPBIT << (bit - n->startbit));
++                      } else {
++                              n->map &= ~(MAPBIT << (bit - n->startbit));
++                              if (!n->map) {
++                                      /* drop this node from the bitmap */
++
++                                      if (!n->next) {
++                                              /*
++                                               * this was the highest map
++                                               * within the bitmap
++                                               */
++                                              if (prev)
++                                                      e->highbit = prev->startbit + MAPSIZE;
++                                              else
++                                                      e->highbit = 0;
++                                      }
++                                      if (prev)
++                                              prev->next = n->next;
++                                      else
++                                              e->node = n->next;
++
++                                      kfree(n);
++                              }
++                      }
++                      return 0;
++              }
++              prev = n;
++              n = n->next;
++      }
++
++      if (!value)
++              return 0;
++
++      new = kmalloc(sizeof(*new), GFP_ATOMIC);
++      if (!new)
++              return -ENOMEM;
++      memset(new, 0, sizeof(*new));
++
++      new->startbit = bit & ~(MAPSIZE - 1);
++      new->map = (MAPBIT << (bit - new->startbit));
++
++      if (!n)
++              /* this node will be the highest map within the bitmap */
++              e->highbit = new->startbit + MAPSIZE;
++
++      if (prev) {
++              new->next = prev->next;
++              prev->next = new;
++      } else {
++              new->next = e->node;
++              e->node = new;
++      }
++
++      return 0;
++}
++
++void ebitmap_destroy(struct ebitmap *e)
++{
++      struct ebitmap_node *n, *temp;
++
++      if (!e)
++              return;
++
++      n = e->node;
++      while (n) {
++              temp = n;
++              n = n->next;
++              kfree(temp);
++      }
++
++      e->highbit = 0;
++      e->node = 0;
++      return;
++}
++
++int ebitmap_read(struct ebitmap *e, void *fp)
++{
++      int rc = -EINVAL;
++      struct ebitmap_node *n, *l;
++      u32 *buf, mapsize, count, i;
++      u64 map;
++
++      ebitmap_init(e);
++
++      buf = next_entry(fp, sizeof(u32)*3);
++      if (!buf)
++              goto out;
++
++      mapsize = le32_to_cpu(buf[0]);
++      e->highbit = le32_to_cpu(buf[1]);
++      count = le32_to_cpu(buf[2]);
++
++      if (mapsize != MAPSIZE) {
++              printk(KERN_ERR "security: ebitmap: map size %d does not "
++                     "match my size %d (high bit was %d)\n", mapsize,
++                     MAPSIZE, e->highbit);
++              goto out;
++      }
++      if (!e->highbit) {
++              e->node = NULL;
++              goto ok;
++      }
++      if (e->highbit & (MAPSIZE - 1)) {
++              printk(KERN_ERR "security: ebitmap: high bit (%d) is not a "
++                     "multiple of the map size (%d)\n", e->highbit, MAPSIZE);
++              goto bad;
++      }
++      l = NULL;
++      for (i = 0; i < count; i++) {
++              buf = next_entry(fp, sizeof(u32));
++              if (!buf) {
++                      printk(KERN_ERR "security: ebitmap: truncated map\n");
++                      goto bad;
++              }
++              n = kmalloc(sizeof(*n), GFP_KERNEL);
++              if (!n) {
++                      printk(KERN_ERR "security: ebitmap: out of memory\n");
++                      rc = -ENOMEM;
++                      goto bad;
++              }
++              memset(n, 0, sizeof(*n));
++
++              n->startbit = le32_to_cpu(buf[0]);
++
++              if (n->startbit & (MAPSIZE - 1)) {
++                      printk(KERN_ERR "security: ebitmap start bit (%d) is "
++                             "not a multiple of the map size (%d)\n",
++                             n->startbit, MAPSIZE);
++                      goto bad_free;
++              }
++              if (n->startbit > (e->highbit - MAPSIZE)) {
++                      printk(KERN_ERR "security: ebitmap start bit (%d) is "
++                             "beyond the end of the bitmap (%d)\n",
++                             n->startbit, (e->highbit - MAPSIZE));
++                      goto bad_free;
++              }
++              buf = next_entry(fp, sizeof(u64));
++              if (!buf) {
++                      printk(KERN_ERR "security: ebitmap: truncated map\n");
++                      goto bad_free;
++              }
++              memcpy(&map, buf, sizeof(u64));
++              n->map = le64_to_cpu(map);
++
++              if (!n->map) {
++                      printk(KERN_ERR "security: ebitmap: null map in "
++                             "ebitmap (startbit %d)\n", n->startbit);
++                      goto bad_free;
++              }
++              if (l) {
++                      if (n->startbit <= l->startbit) {
++                              printk(KERN_ERR "security: ebitmap: start "
++                                     "bit %d comes after start bit %d\n",
++                                     n->startbit, l->startbit);
++                              goto bad_free;
++                      }
++                      l->next = n;
++              } else
++                      e->node = n;
++
++              l = n;
++      }
++
++ok:
++      rc = 0;
++out:
++      return rc;
++bad_free:
++      kfree(n);
++bad:
++      ebitmap_destroy(e);
++      goto out;
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/ebitmap.h   2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,49 @@
++/*
++ * An extensible bitmap is a bitmap that supports an
++ * arbitrary number of bits.  Extensible bitmaps are
++ * used to represent sets of values, such as types,
++ * roles, categories, and classes.
++ *
++ * Each extensible bitmap is implemented as a linked
++ * list of bitmap nodes, where each bitmap node has
++ * an explicitly specified starting bit position within
++ * the total bitmap.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_EBITMAP_H_
++#define _SS_EBITMAP_H_
++
++#define MAPTYPE u64                   /* portion of bitmap in each node */
++#define MAPSIZE (sizeof(MAPTYPE) * 8) /* number of bits in node bitmap */
++#define MAPBIT  1ULL                  /* a bit in the node bitmap */
++
++struct ebitmap_node {
++      u32 startbit;           /* starting position in the total bitmap */
++      MAPTYPE map;            /* this node's portion of the bitmap */
++      struct ebitmap_node *next;
++};
++
++struct ebitmap {
++      struct ebitmap_node *node;      /* first node in the bitmap */
++      u32 highbit;    /* highest position in the total bitmap */
++};
++
++#define ebitmap_length(e) ((e)->highbit)
++#define ebitmap_startbit(e) ((e)->node ? (e)->node->startbit : 0)
++
++static inline void ebitmap_init(struct ebitmap *e)
++{
++      memset(e, 0, sizeof(*e));
++}
++
++int ebitmap_cmp(struct ebitmap *e1, struct ebitmap *e2);
++int ebitmap_or(struct ebitmap *dst, struct ebitmap *e1, struct ebitmap *e2);
++int ebitmap_cpy(struct ebitmap *dst, struct ebitmap *src);
++int ebitmap_contains(struct ebitmap *e1, struct ebitmap *e2);
++int ebitmap_get_bit(struct ebitmap *e, unsigned long bit);
++int ebitmap_set_bit(struct ebitmap *e, unsigned long bit, int value);
++void ebitmap_destroy(struct ebitmap *e);
++int ebitmap_read(struct ebitmap *e, void *fp);
++
++#endif        /* _SS_EBITMAP_H_ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/global.h    2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,17 @@
++#ifndef _SS_GLOBAL_H_
++#define _SS_GLOBAL_H_
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/string.h>
++#include <linux/ctype.h>
++#include <linux/in.h>
++#include <linux/spinlock.h>
++#include <asm/semaphore.h>
++
++#include "flask.h"
++#include "avc.h"
++#include "avc_ss.h"
++#include "security.h"
++
++#endif /* _SS_GLOBAL_H_ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/hashtab.c   2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,277 @@
++/*
++ * Implementation of the hash table type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "hashtab.h"
++
++struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, void *key),
++                               int (*keycmp)(struct hashtab *h, void *key1, void *key2),
++                               u32 size)
++{
++      struct hashtab *p;
++      u32 i;
++
++      p = kmalloc(sizeof(*p), GFP_KERNEL);
++      if (p == NULL)
++              return p;
++
++      memset(p, 0, sizeof(*p));
++      p->size = size;
++      p->nel = 0;
++      p->hash_value = hash_value;
++      p->keycmp = keycmp;
++      p->htable = kmalloc(sizeof(*(p->htable)) * size, GFP_KERNEL);
++      if (p->htable == NULL) {
++              kfree(p);
++              return NULL;
++      }
++
++      for (i = 0; i < size; i++)
++              p->htable[i] = NULL;
++
++      return p;
++}
++
++int hashtab_insert(struct hashtab *h, void *key, void *datum)
++{
++      u32 hvalue;
++      struct hashtab_node *prev, *cur, *newnode;
++
++      if (!h || h->nel == HASHTAB_MAX_NODES)
++              return -EINVAL;
++
++      hvalue = h->hash_value(h, key);
++      prev = NULL;
++      cur = h->htable[hvalue];
++      while (cur && h->keycmp(h, key, cur->key) > 0) {
++              prev = cur;
++              cur = cur->next;
++      }
++
++      if (cur && (h->keycmp(h, key, cur->key) == 0))
++              return -EEXIST;
++
++      newnode = kmalloc(sizeof(*newnode), GFP_KERNEL);
++      if (newnode == NULL)
++              return -ENOMEM;
++      memset(newnode, 0, sizeof(*newnode));
++      newnode->key = key;
++      newnode->datum = datum;
++      if (prev) {
++              newnode->next = prev->next;
++              prev->next = newnode;
++      } else {
++              newnode->next = h->htable[hvalue];
++              h->htable[hvalue] = newnode;
++      }
++
++      h->nel++;
++      return 0;
++}
++
++int hashtab_remove(struct hashtab *h, void *key,
++                 void (*destroy)(void *k, void *d, void *args),
++                 void *args)
++{
++      u32 hvalue;
++      struct hashtab_node *cur, *last;
++
++      if (!h)
++              return -EINVAL;
++
++      hvalue = h->hash_value(h, key);
++      last = NULL;
++      cur = h->htable[hvalue];
++      while (cur != NULL && h->keycmp(h, key, cur->key) > 0) {
++              last = cur;
++              cur = cur->next;
++      }
++
++      if (cur == NULL || (h->keycmp(h, key, cur->key) != 0))
++              return -ENOENT;
++
++      if (last == NULL)
++              h->htable[hvalue] = cur->next;
++      else
++              last->next = cur->next;
++
++      if (destroy)
++              destroy(cur->key, cur->datum, args);
++      kfree(cur);
++      h->nel--;
++      return 0;
++}
++
++int hashtab_replace(struct hashtab *h, void *key, void *datum,
++                  void (*destroy)(void *k, void *d, void *args),
++                  void *args)
++{
++      u32 hvalue;
++      struct hashtab_node *prev, *cur, *newnode;
++
++      if (!h)
++              return -EINVAL;
++
++      hvalue = h->hash_value(h, key);
++      prev = NULL;
++      cur = h->htable[hvalue];
++      while (cur != NULL && h->keycmp(h, key, cur->key) > 0) {
++              prev = cur;
++              cur = cur->next;
++      }
++
++      if (cur && (h->keycmp(h, key, cur->key) == 0)) {
++              if (destroy)
++                      destroy(cur->key, cur->datum, args);
++              cur->key = key;
++              cur->datum = datum;
++      } else {
++              newnode = kmalloc(sizeof(*newnode), GFP_KERNEL);
++              if (newnode == NULL)
++                      return -ENOMEM;
++              memset(newnode, 0, sizeof(*newnode));
++              newnode->key = key;
++              newnode->datum = datum;
++              if (prev) {
++                      newnode->next = prev->next;
++                      prev->next = newnode;
++              } else {
++                      newnode->next = h->htable[hvalue];
++                      h->htable[hvalue] = newnode;
++              }
++      }
++
++      return 0;
++}
++
++void *hashtab_search(struct hashtab *h, void *key)
++{
++      u32 hvalue;
++      struct hashtab_node *cur;
++
++      if (!h)
++              return NULL;
++
++      hvalue = h->hash_value(h, key);
++      cur = h->htable[hvalue];
++      while (cur != NULL && h->keycmp(h, key, cur->key) > 0)
++              cur = cur->next;
++
++      if (cur == NULL || (h->keycmp(h, key, cur->key) != 0))
++              return NULL;
++
++      return cur->datum;
++}
++
++void hashtab_destroy(struct hashtab *h)
++{
++      u32 i;
++      struct hashtab_node *cur, *temp;
++
++      if (!h)
++              return;
++
++      for (i = 0; i < h->size; i++) {
++              cur = h->htable[i];
++              while (cur != NULL) {
++                      temp = cur;
++                      cur = cur->next;
++                      kfree(temp);
++              }
++              h->htable[i] = NULL;
++      }
++
++      kfree(h->htable);
++      h->htable = NULL;
++
++      kfree(h);
++}
++
++int hashtab_map(struct hashtab *h,
++              int (*apply)(void *k, void *d, void *args),
++              void *args)
++{
++      u32 i;
++      int ret;
++      struct hashtab_node *cur;
++
++      if (!h)
++              return 0;
++
++      for (i = 0; i < h->size; i++) {
++              cur = h->htable[i];
++              while (cur != NULL) {
++                      ret = apply(cur->key, cur->datum, args);
++                      if (ret)
++                              return ret;
++                      cur = cur->next;
++              }
++      }
++      return 0;
++}
++
++
++void hashtab_map_remove_on_error(struct hashtab *h,
++                                 int (*apply)(void *k, void *d, void *args),
++                                 void (*destroy)(void *k, void *d, void *args),
++                                 void *args)
++{
++      u32 i;
++      int ret;
++      struct hashtab_node *last, *cur, *temp;
++
++      if (!h)
++              return;
++
++      for (i = 0; i < h->size; i++) {
++              last = NULL;
++              cur = h->htable[i];
++              while (cur != NULL) {
++                      ret = apply(cur->key, cur->datum, args);
++                      if (ret) {
++                              if (last)
++                                      last->next = cur->next;
++                              else
++                                      h->htable[i] = cur->next;
++
++                              temp = cur;
++                              cur = cur->next;
++                              if (destroy)
++                                      destroy(temp->key, temp->datum, args);
++                              kfree(temp);
++                              h->nel--;
++                      } else {
++                              last = cur;
++                              cur = cur->next;
++                      }
++              }
++      }
++      return;
++}
++
++void hashtab_stat(struct hashtab *h, struct hashtab_info *info)
++{
++      u32 i, chain_len, slots_used, max_chain_len;
++      struct hashtab_node *cur;
++
++      slots_used = 0;
++      max_chain_len = 0;
++      for (slots_used = max_chain_len = i = 0; i < h->size; i++) {
++              cur = h->htable[i];
++              if (cur) {
++                      slots_used++;
++                      chain_len = 0;
++                      while (cur) {
++                              chain_len++;
++                              cur = cur->next;
++                      }
++
++                      if (chain_len > max_chain_len)
++                              max_chain_len = chain_len;
++              }
++      }
++
++      info->slots_used = slots_used;
++      info->max_chain_len = max_chain_len;
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/hashtab.h   2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,125 @@
++/*
++ * A hash table (hashtab) maintains associations between
++ * key values and datum values.  The type of the key values
++ * and the type of the datum values is arbitrary.  The
++ * functions for hash computation and key comparison are
++ * provided by the creator of the table.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_HASHTAB_H_
++#define _SS_HASHTAB_H_
++
++#define HASHTAB_MAX_NODES     0xffffffff
++
++struct hashtab_node {
++      void *key;
++      void *datum;
++      struct hashtab_node *next;
++};
++
++struct hashtab {
++      struct hashtab_node **htable;   /* hash table */
++      u32 size;                       /* number of slots in hash table */
++      u32 nel;                        /* number of elements in hash table */
++      u32 (*hash_value)(struct hashtab *h, void *key);
++                                      /* hash function */
++      int (*keycmp)(struct hashtab *h, void *key1, void *key2);
++                                      /* key comparison function */
++};
++
++struct hashtab_info {
++      u32 slots_used;
++      u32 max_chain_len;
++};
++
++/*
++ * Creates a new hash table with the specified characteristics.
++ *
++ * Returns NULL if insufficent space is available or
++ * the new hash table otherwise.
++ */
++struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, void *key),
++                               int (*keycmp)(struct hashtab *h, void *key1, void *key2),
++                               u32 size);
++
++/*
++ * Inserts the specified (key, datum) pair into the specified hash table.
++ *
++ * Returns -ENOMEM on memory allocation error,
++ * -EEXIST if there is already an entry with the same key,
++ * -EINVAL for general errors or
++ * 0 otherwise.
++ */
++int hashtab_insert(struct hashtab *h, void *k, void *d);
++
++/*
++ * Removes the entry with the specified key from the hash table.
++ * Applies the specified destroy function to (key,datum,args) for
++ * the entry.
++ *
++ * Returns -ENOENT if no entry has the specified key,
++ * -EINVAL for general errors or
++ *0 otherwise.
++ */
++int hashtab_remove(struct hashtab *h, void *k,
++                 void (*destroy)(void *k, void *d, void *args),
++                 void *args);
++
++/*
++ * Insert or replace the specified (key, datum) pair in the specified
++ * hash table.  If an entry for the specified key already exists,
++ * then the specified destroy function is applied to (key,datum,args)
++ * for the entry prior to replacing the entry's contents.
++ *
++ * Returns -ENOMEM if insufficient space is available,
++ * -EINVAL for general errors or
++ * 0 otherwise.
++ */
++int hashtab_replace(struct hashtab *h, void *k, void *d,
++                  void (*destroy)(void *k, void *d, void *args),
++                  void *args);
++
++/*
++ * Searches for the entry with the specified key in the hash table.
++ *
++ * Returns NULL if no entry has the specified key or
++ * the datum of the entry otherwise.
++ */
++void *hashtab_search(struct hashtab *h, void *k);
++
++/*
++ * Destroys the specified hash table.
++ */
++void hashtab_destroy(struct hashtab *h);
++
++/*
++ * Applies the specified apply function to (key,datum,args)
++ * for each entry in the specified hash table.
++ *
++ * The order in which the function is applied to the entries
++ * is dependent upon the internal structure of the hash table.
++ *
++ * If apply returns a non-zero status, then hashtab_map will cease
++ * iterating through the hash table and will propagate the error
++ * return to its caller.
++ */
++int hashtab_map(struct hashtab *h,
++              int (*apply)(void *k, void *d, void *args),
++              void *args);
++
++/*
++ * Same as hashtab_map, except that if apply returns a non-zero status,
++ * then the (key,datum) pair will be removed from the hashtab and the
++ * destroy function will be applied to (key,datum,args).
++ */
++void hashtab_map_remove_on_error(struct hashtab *h,
++                                 int (*apply)(void *k, void *d, void *args),
++                                 void (*destroy)(void *k, void *d, void *args),
++                                 void *args);
++
++
++/* Fill info with some hash table statistics */
++void hashtab_stat(struct hashtab *h, struct hashtab_info *info);
++
++#endif        /* _SS_HASHTAB_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/Makefile    2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,14 @@
++#
++# Makefile for building the SELinux security server as part of the kernel tree.
++#
++
++EXTRA_CFLAGS += -Isecurity/selinux/include -include security/selinux/ss/global.h
++
++obj-y := ss.o
++
++ss-objs := ebitmap.o hashtab.o symtab.o sidtab.o avtab.o policydb.o services.o
++
++ifeq ($(CONFIG_SECURITY_SELINUX_MLS),y)
++ss-objs += mls.o
++endif
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/mls.c       2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,741 @@
++/*
++ * Implementation of the multi-level security (MLS) policy.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "mls.h"
++#include "policydb.h"
++#include "services.h"
++
++/*
++ * Remove any permissions from `allowed' that are
++ * denied by the MLS policy.
++ */
++void mls_compute_av(struct context *scontext,
++                  struct context *tcontext,
++                  struct class_datum *tclass,
++                  u32 *allowed)
++{
++      unsigned int rel[2];
++      int l;
++
++      for (l = 0; l < 2; l++)
++              rel[l] = mls_level_relation(scontext->range.level[l],
++                                          tcontext->range.level[l]);
++
++      if (rel[1] != MLS_RELATION_EQ) {
++              if (rel[1] != MLS_RELATION_DOM &&
++                  !ebitmap_get_bit(&policydb.trustedreaders, scontext->type - 1) &&
++                  !ebitmap_get_bit(&policydb.trustedobjects, tcontext->type - 1)) {
++                      /* read(s,t) = (s.high >= t.high) = False */
++                      *allowed = (*allowed) & ~(tclass->mlsperms.read);
++              }
++              if (rel[1] != MLS_RELATION_DOMBY &&
++                  !ebitmap_get_bit(&policydb.trustedreaders, tcontext->type - 1) &&
++                  !ebitmap_get_bit(&policydb.trustedobjects, scontext->type - 1)) {
++                      /* readby(s,t) = read(t,s) = False */
++                      *allowed = (*allowed) & ~(tclass->mlsperms.readby);
++              }
++      }
++      if (((rel[0] != MLS_RELATION_DOMBY && rel[0] != MLS_RELATION_EQ) ||
++          ((!mls_level_eq(tcontext->range.level[0],
++                          tcontext->range.level[1])) &&
++           (rel[1] != MLS_RELATION_DOM && rel[1] != MLS_RELATION_EQ))) &&
++          !ebitmap_get_bit(&policydb.trustedwriters, scontext->type - 1) &&
++          !ebitmap_get_bit(&policydb.trustedobjects, tcontext->type - 1)) {
++              /*
++               * write(s,t) = ((s.low <= t.low = t.high) or (s.low
++               * <= t.low <= t.high <= s.high)) = False
++               */
++              *allowed = (*allowed) & ~(tclass->mlsperms.write);
++      }
++
++      if (((rel[0] != MLS_RELATION_DOM && rel[0] != MLS_RELATION_EQ) ||
++          ((!mls_level_eq(scontext->range.level[0],
++                          scontext->range.level[1])) &&
++           (rel[1] != MLS_RELATION_DOMBY && rel[1] != MLS_RELATION_EQ))) &&
++          !ebitmap_get_bit(&policydb.trustedwriters, tcontext->type - 1) &&
++          !ebitmap_get_bit(&policydb.trustedobjects, scontext->type - 1)) {
++              /* writeby(s,t) = write(t,s) = False */
++              *allowed = (*allowed) & ~(tclass->mlsperms.writeby);
++      }
++}
++
++/*
++ * Return the length in bytes for the MLS fields of the
++ * security context string representation of `context'.
++ */
++int mls_compute_context_len(struct context * context)
++{
++      int i, l, len;
++
++
++      len = 0;
++      for (l = 0; l < 2; l++) {
++              len += strlen(policydb.p_sens_val_to_name[context->range.level[l].sens - 1]) + 1;
++
++              for (i = 1; i <= ebitmap_length(&context->range.level[l].cat); i++)
++                      if (ebitmap_get_bit(&context->range.level[l].cat, i - 1))
++                              len += strlen(policydb.p_cat_val_to_name[i - 1]) + 1;
++
++              if (mls_level_relation(context->range.level[0], context->range.level[1])
++                              == MLS_RELATION_EQ)
++                      break;
++      }
++
++      return len;
++}
++
++/*
++ * Write the security context string representation of
++ * the MLS fields of `context' into the string `*scontext'.
++ * Update `*scontext' to point to the end of the MLS fields.
++ */
++int mls_sid_to_context(struct context *context,
++                     char **scontext)
++{
++      char *scontextp;
++      int i, l;
++
++      scontextp = *scontext;
++
++      for (l = 0; l < 2; l++) {
++              strcpy(scontextp,
++                     policydb.p_sens_val_to_name[context->range.level[l].sens - 1]);
++              scontextp += strlen(policydb.p_sens_val_to_name[context->range.level[l].sens - 1]);
++              *scontextp = ':';
++              scontextp++;
++              for (i = 1; i <= ebitmap_length(&context->range.level[l].cat); i++)
++                      if (ebitmap_get_bit(&context->range.level[l].cat, i - 1)) {
++                              strcpy(scontextp, policydb.p_cat_val_to_name[i - 1]);
++                              scontextp += strlen(policydb.p_cat_val_to_name[i - 1]);
++                              *scontextp = ',';
++                              scontextp++;
++                      }
++              if (mls_level_relation(context->range.level[0], context->range.level[1])
++                              != MLS_RELATION_EQ) {
++                      scontextp--;
++                      sprintf(scontextp, "-");
++                      scontextp++;
++
++              } else {
++                      break;
++              }
++      }
++
++      *scontext = scontextp;
++      return 0;
++}
++
++/*
++ * Return 1 if the MLS fields in the security context
++ * structure `c' are valid.  Return 0 otherwise.
++ */
++int mls_context_isvalid(struct policydb *p, struct context *c)
++{
++      unsigned int relation;
++      struct level_datum *levdatum;
++      struct user_datum *usrdatum;
++      struct mls_range_list *rnode;
++      int i, l;
++
++      /*
++       * MLS range validity checks: high must dominate low, low level must
++       * be valid (category set <-> sensitivity check), and high level must
++       * be valid (category set <-> sensitivity check)
++       */
++      relation = mls_level_relation(c->range.level[1],
++                                    c->range.level[0]);
++      if (!(relation & (MLS_RELATION_DOM | MLS_RELATION_EQ)))
++              /* High does not dominate low. */
++              return 0;
++
++      for (l = 0; l < 2; l++) {
++              if (!c->range.level[l].sens || c->range.level[l].sens > p->p_levels.nprim)
++                      return 0;
++              levdatum = hashtab_search(p->p_levels.table,
++                      p->p_sens_val_to_name[c->range.level[l].sens - 1]);
++              if (!levdatum)
++                      return 0;
++
++              for (i = 1; i <= ebitmap_length(&c->range.level[l].cat); i++) {
++                      if (ebitmap_get_bit(&c->range.level[l].cat, i - 1)) {
++                              if (i > p->p_cats.nprim)
++                                      return 0;
++                              if (!ebitmap_get_bit(&levdatum->level->cat, i - 1))
++                                      /*
++                                       * Category may not be associated with
++                                       * sensitivity in low level.
++                                       */
++                                      return 0;
++                      }
++              }
++      }
++
++      if (c->role == OBJECT_R_VAL)
++              return 1;
++
++      /*
++       * User must be authorized for the MLS range.
++       */
++      if (!c->user || c->user > p->p_users.nprim)
++              return 0;
++      usrdatum = p->user_val_to_struct[c->user - 1];
++      for (rnode = usrdatum->ranges; rnode; rnode = rnode->next) {
++              if (mls_range_contains(rnode->range, c->range))
++                      break;
++      }
++      if (!rnode)
++              /* user may not be associated with range */
++              return 0;
++
++      return 1;
++}
++
++
++/*
++ * Set the MLS fields in the security context structure
++ * `context' based on the string representation in
++ * the string `*scontext'.  Update `*scontext' to
++ * point to the end of the string representation of
++ * the MLS fields.
++ *
++ * This function modifies the string in place, inserting
++ * NULL characters to terminate the MLS fields.
++ */
++int mls_context_to_sid(char oldc,
++                     char **scontext,
++                     struct context *context)
++{
++
++      char delim;
++      char *scontextp, *p;
++      struct level_datum *levdatum;
++      struct cat_datum *catdatum;
++      int l, rc = -EINVAL;
++
++      if (!oldc) {
++              /* No MLS component to the security context.  Try
++                 to use a default 'unclassified' value. */
++              levdatum = hashtab_search(policydb.p_levels.table,
++                                        "unclassified");
++              if (!levdatum)
++                      goto out;
++              context->range.level[0].sens = levdatum->level->sens;
++              context->range.level[1].sens = context->range.level[0].sens;
++              rc = 0;
++              goto out;
++      }
++
++      /* Extract low sensitivity. */
++      scontextp = p = *scontext;
++      while (*p && *p != ':' && *p != '-')
++              p++;
++
++      delim = *p;
++      if (delim != 0)
++              *p++ = 0;
++
++      for (l = 0; l < 2; l++) {
++              levdatum = hashtab_search(policydb.p_levels.table, scontextp);
++              if (!levdatum)
++                      goto out;
++
++              context->range.level[l].sens = levdatum->level->sens;
++
++              if (delim == ':') {
++                      /* Extract low category set. */
++                      while (1) {
++                              scontextp = p;
++                              while (*p && *p != ',' && *p != '-')
++                                      p++;
++                              delim = *p;
++                              if (delim != 0)
++                                      *p++ = 0;
++
++                              catdatum = hashtab_search(policydb.p_cats.table,
++                                                        scontextp);
++                              if (!catdatum)
++                                      goto out;
++
++                              rc = ebitmap_set_bit(&context->range.level[l].cat,
++                                                   catdatum->value - 1, 1);
++                              if (rc)
++                                      goto out;
++                              if (delim != ',')
++                                      break;
++                      }
++              }
++              if (delim == '-') {
++                      /* Extract high sensitivity. */
++                      scontextp = p;
++                      while (*p && *p != ':')
++                              p++;
++
++                      delim = *p;
++                      if (delim != 0)
++                              *p++ = 0;
++              } else
++                      break;
++      }
++
++      if (l == 0) {
++              context->range.level[1].sens = context->range.level[0].sens;
++              rc = ebitmap_cpy(&context->range.level[1].cat,
++                               &context->range.level[0].cat);
++              if (rc)
++                      goto out;
++      }
++      *scontext = p;
++      rc = 0;
++out:
++      return rc;
++}
++
++/*
++ * Copies the MLS range from `src' into `dst'.
++ */
++static inline int mls_copy_context(struct context *dst,
++                                 struct context *src)
++{
++      int l, rc = 0;
++
++      /* Copy the MLS range from the source context */
++      for (l = 0; l < 2; l++) {
++
++              dst->range.level[l].sens = src->range.level[l].sens;
++              rc = ebitmap_cpy(&dst->range.level[l].cat,
++                               &src->range.level[l].cat);
++              if (rc)
++                      break;
++      }
++
++      return rc;
++}
++
++/*
++ * Convert the MLS fields in the security context
++ * structure `c' from the values specified in the
++ * policy `oldp' to the values specified in the policy `newp'.
++ */
++int mls_convert_context(struct policydb *oldp,
++                      struct policydb *newp,
++                      struct context *c)
++{
++      struct level_datum *levdatum;
++      struct cat_datum *catdatum;
++      struct ebitmap bitmap;
++      int l, i;
++
++      for (l = 0; l < 2; l++) {
++              levdatum = hashtab_search(newp->p_levels.table,
++                      oldp->p_sens_val_to_name[c->range.level[l].sens - 1]);
++
++              if (!levdatum)
++                      return -EINVAL;
++              c->range.level[l].sens = levdatum->level->sens;
++
++              ebitmap_init(&bitmap);
++              for (i = 1; i <= ebitmap_length(&c->range.level[l].cat); i++) {
++                      if (ebitmap_get_bit(&c->range.level[l].cat, i - 1)) {
++                              int rc;
++
++                              catdatum = hashtab_search(newp->p_cats.table,
++                                              oldp->p_cat_val_to_name[i - 1]);
++                              if (!catdatum)
++                                      return -EINVAL;
++                              rc = ebitmap_set_bit(&bitmap, catdatum->value - 1, 1);
++                              if (rc)
++                                      return rc;
++                      }
++              }
++              ebitmap_destroy(&c->range.level[l].cat);
++              c->range.level[l].cat = bitmap;
++      }
++
++      return 0;
++}
++
++int mls_compute_sid(struct context *scontext,
++                  struct context *tcontext,
++                  u16 tclass,
++                  u32 specified,
++                  struct context *newcontext)
++{
++      switch (specified) {
++      case AVTAB_TRANSITION:
++      case AVTAB_CHANGE:
++              /* Use the process MLS attributes. */
++              return mls_copy_context(newcontext, scontext);
++      case AVTAB_MEMBER:
++              /* Only polyinstantiate the MLS attributes if
++                 the type is being polyinstantiated */
++              if (newcontext->type != tcontext->type) {
++                      /* Use the process MLS attributes. */
++                      return mls_copy_context(newcontext, scontext);
++              } else {
++                      /* Use the related object MLS attributes. */
++                      return mls_copy_context(newcontext, tcontext);
++              }
++      default:
++              return -EINVAL;
++      }
++      return -EINVAL;
++}
++
++void mls_user_destroy(struct user_datum *usrdatum)
++{
++      struct mls_range_list *rnode, *rtmp;
++      rnode = usrdatum->ranges;
++      while (rnode) {
++              rtmp = rnode;
++              rnode = rnode->next;
++              ebitmap_destroy(&rtmp->range.level[0].cat);
++              ebitmap_destroy(&rtmp->range.level[1].cat);
++              kfree(rtmp);
++      }
++}
++
++int mls_read_perm(struct perm_datum *perdatum, void *fp)
++{
++      u32 *buf;
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf)
++              return -EINVAL;
++      perdatum->base_perms = le32_to_cpu(buf[0]);
++      return 0;
++}
++
++/*
++ * Read a MLS level structure from a policydb binary
++ * representation file.
++ */
++struct mls_level *mls_read_level(void *fp)
++{
++      struct mls_level *l;
++      u32 *buf;
++
++      l = kmalloc(sizeof(*l), GFP_ATOMIC);
++      if (!l) {
++              printk(KERN_ERR "security: mls: out of memory\n");
++              return NULL;
++      }
++      memset(l, 0, sizeof(*l));
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf) {
++              printk(KERN_ERR "security: mls: truncated level\n");
++              goto bad;
++      }
++      l->sens = cpu_to_le32(buf[0]);
++
++      if (ebitmap_read(&l->cat, fp)) {
++              printk(KERN_ERR "security: mls:  error reading level "
++                     "categories\n");
++              goto bad;
++      }
++      return l;
++
++bad:
++      kfree(l);
++      return NULL;
++}
++
++
++/*
++ * Read a MLS range structure from a policydb binary
++ * representation file.
++ */
++static int mls_read_range_helper(struct mls_range *r, void *fp)
++{
++      u32 *buf;
++      int items, rc = -EINVAL;
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf)
++              goto out;
++
++      items = le32_to_cpu(buf[0]);
++      buf = next_entry(fp, sizeof(u32) * items);
++      if (!buf) {
++              printk(KERN_ERR "security: mls:  truncated range\n");
++              goto out;
++      }
++      r->level[0].sens = le32_to_cpu(buf[0]);
++      if (items > 1) {
++              r->level[1].sens = le32_to_cpu(buf[1]);
++      } else {
++              r->level[1].sens = r->level[0].sens;
++      }
++
++      rc = ebitmap_read(&r->level[0].cat, fp);
++      if (rc) {
++              printk(KERN_ERR "security: mls:  error reading low "
++                     "categories\n");
++              goto out;
++      }
++      if (items > 1) {
++              rc = ebitmap_read(&r->level[1].cat, fp);
++              if (rc) {
++                      printk(KERN_ERR "security: mls:  error reading high "
++                             "categories\n");
++                      goto bad_high;
++              }
++      } else {
++              rc = ebitmap_cpy(&r->level[1].cat, &r->level[0].cat);
++              if (rc) {
++                      printk(KERN_ERR "security: mls:  out of memory\n");
++                      goto bad_high;
++              }
++      }
++
++      rc = 0;
++out:
++      return rc;
++bad_high:
++      ebitmap_destroy(&r->level[0].cat);
++      goto out;
++}
++
++int mls_read_range(struct context *c, void *fp)
++{
++      return mls_read_range_helper(&c->range, fp);
++}
++
++
++/*
++ * Read a MLS perms structure from a policydb binary
++ * representation file.
++ */
++int mls_read_class(struct class_datum *cladatum, void *fp)
++{
++      struct mls_perms *p = &cladatum->mlsperms;
++      u32 *buf;
++
++      buf = next_entry(fp, sizeof(u32)*4);
++      if (!buf) {
++              printk(KERN_ERR "security: mls:  truncated mls permissions\n");
++              return -EINVAL;
++      }
++      p->read = le32_to_cpu(buf[0]);
++      p->readby = le32_to_cpu(buf[1]);
++      p->write = le32_to_cpu(buf[2]);
++      p->writeby = le32_to_cpu(buf[3]);
++      return 0;
++}
++
++int mls_read_user(struct user_datum *usrdatum, void *fp)
++{
++      struct mls_range_list *r, *l;
++      int rc = 0;
++      u32 nel, i;
++      u32 *buf;
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf) {
++              rc = -EINVAL;
++              goto out;
++      }
++      nel = le32_to_cpu(buf[0]);
++      l = NULL;
++      for (i = 0; i < nel; i++) {
++              r = kmalloc(sizeof(*r), GFP_ATOMIC);
++              if (!r) {
++                      rc = -ENOMEM;
++                      goto out;
++              }
++              memset(r, 0, sizeof(*r));
++
++              rc = mls_read_range_helper(&r->range, fp);
++              if (rc)
++                      goto out;
++
++              if (l)
++                      l->next = r;
++              else
++                      usrdatum->ranges = r;
++              l = r;
++      }
++out:
++      return rc;
++}
++
++int mls_read_nlevels(struct policydb *p, void *fp)
++{
++      u32 *buf;
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf)
++              return -EINVAL;
++      p->nlevels = le32_to_cpu(buf[0]);
++      return 0;
++}
++
++int mls_read_trusted(struct policydb *p, void *fp)
++{
++      int rc = 0;
++
++      rc = ebitmap_read(&p->trustedreaders, fp);
++      if (rc)
++              goto out;
++      rc = ebitmap_read(&p->trustedwriters, fp);
++      if (rc)
++              goto out;
++      rc = ebitmap_read(&p->trustedobjects, fp);
++out:
++      return rc;
++}
++
++int sens_index(void *key, void *datum, void *datap)
++{
++      struct policydb *p;
++      struct level_datum *levdatum;
++
++
++      levdatum = datum;
++      p = datap;
++
++      if (!levdatum->isalias)
++              p->p_sens_val_to_name[levdatum->level->sens - 1] = key;
++
++      return 0;
++}
++
++int cat_index(void *key, void *datum, void *datap)
++{
++      struct policydb *p;
++      struct cat_datum *catdatum;
++
++
++      catdatum = datum;
++      p = datap;
++
++
++      if (!catdatum->isalias)
++              p->p_cat_val_to_name[catdatum->value - 1] = key;
++
++      return 0;
++}
++
++int sens_destroy(void *key, void *datum, void *p)
++{
++      struct level_datum *levdatum;
++
++      kfree(key);
++      levdatum = datum;
++      if (!levdatum->isalias) {
++              ebitmap_destroy(&levdatum->level->cat);
++              kfree(levdatum->level);
++      }
++      kfree(datum);
++      return 0;
++}
++
++int cat_destroy(void *key, void *datum, void *p)
++{
++      kfree(key);
++      kfree(datum);
++      return 0;
++}
++
++int sens_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++      char *key = 0;
++      struct level_datum *levdatum;
++      int rc;
++      u32 *buf, len;
++
++      levdatum = kmalloc(sizeof(*levdatum), GFP_ATOMIC);
++      if (!levdatum) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      memset(levdatum, 0, sizeof(*levdatum));
++
++      buf = next_entry(fp, sizeof(u32)*2);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      len = le32_to_cpu(buf[0]);
++      levdatum->isalias = le32_to_cpu(buf[1]);
++
++      buf = next_entry(fp, len);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      key = kmalloc(len + 1,GFP_ATOMIC);
++      if (!key) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(key, buf, len);
++      key[len] = 0;
++
++      levdatum->level = mls_read_level(fp);
++      if (!levdatum->level) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      rc = hashtab_insert(h, key, levdatum);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++bad:
++      sens_destroy(key, levdatum, NULL);
++      goto out;
++}
++
++
++int cat_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++      char *key = 0;
++      struct cat_datum *catdatum;
++      int rc;
++      u32 *buf, len;
++
++      catdatum = kmalloc(sizeof(*catdatum), GFP_ATOMIC);
++      if (!catdatum) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      memset(catdatum, 0, sizeof(*catdatum));
++
++      buf = next_entry(fp, sizeof(u32)*3);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      len = le32_to_cpu(buf[0]);
++      catdatum->value = le32_to_cpu(buf[1]);
++      catdatum->isalias = le32_to_cpu(buf[2]);
++
++      buf = next_entry(fp, len);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      key = kmalloc(len + 1,GFP_ATOMIC);
++      if (!key) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(key, buf, len);
++      key[len] = 0;
++
++      rc = hashtab_insert(h, key, catdatum);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++
++bad:
++      cat_destroy(key, catdatum, NULL);
++      goto out;
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/mls.h       2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,99 @@
++/*
++ * Multi-level security (MLS) policy operations.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_MLS_H_
++#define _SS_MLS_H_
++
++#include "context.h"
++#include "policydb.h"
++
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++
++void mls_compute_av(struct context *scontext,
++                  struct context *tcontext,
++                  struct class_datum *tclass,
++                  u32 *allowed);
++
++int mls_compute_context_len(struct context *context);
++int mls_sid_to_context(struct context *context, char **scontext);
++int mls_context_isvalid(struct policydb *p, struct context *c);
++
++int mls_context_to_sid(char oldc,
++                     char **scontext,
++                     struct context *context);
++
++int mls_convert_context(struct policydb *oldp,
++                      struct policydb *newp,
++                      struct context *context);
++
++int mls_compute_sid(struct context *scontext,
++                  struct context *tcontext,
++                  u16 tclass,
++                  u32 specified,
++                  struct context *newcontext);
++
++int sens_index(void *key, void *datum, void *datap);
++int cat_index(void *key, void *datum, void *datap);
++int sens_destroy(void *key, void *datum, void *p);
++int cat_destroy(void *key, void *datum, void *p);
++int sens_read(struct policydb *p, struct hashtab *h, void *fp);
++int cat_read(struct policydb *p, struct hashtab *h, void *fp);
++
++#define mls_for_user_ranges(user, usercon) { \
++struct mls_range_list *__ranges; \
++for (__ranges = user->ranges; __ranges; __ranges = __ranges->next) { \
++usercon.range = __ranges->range;
++
++#define mls_end_user_ranges } }
++
++#define mls_symtab_names , "levels", "categories"
++#define mls_symtab_sizes , 16, 16
++#define mls_index_f ,sens_index, cat_index
++#define mls_destroy_f ,sens_destroy, cat_destroy
++#define mls_read_f ,sens_read, cat_read
++#define mls_write_f ,sens_write, cat_write
++#define mls_policydb_index_others(p) printk(", %d levels", p->nlevels);
++
++#define mls_set_config(config) config |= POLICYDB_CONFIG_MLS
++
++void mls_user_destroy(struct user_datum *usrdatum);
++int mls_read_range(struct context *c, void *fp);
++int mls_read_perm(struct perm_datum *perdatum, void *fp);
++int mls_read_class(struct class_datum *cladatum,  void *fp);
++int mls_read_user(struct user_datum *usrdatum, void *fp);
++int mls_read_nlevels(struct policydb *p, void *fp);
++int mls_read_trusted(struct policydb *p, void *fp);
++
++#else
++
++#define       mls_compute_av(scontext, tcontext, tclass_datum, allowed)
++#define mls_compute_context_len(context) 0
++#define       mls_sid_to_context(context, scontextpp)
++#define mls_context_isvalid(p, c) 1
++#define       mls_context_to_sid(oldc, context_str, context) 0
++#define mls_convert_context(oldp, newp, c) 0
++#define mls_compute_sid(scontext, tcontext, tclass, specified, newcontextp) 0
++#define mls_for_user_ranges(user, usercon)
++#define mls_end_user_ranges
++#define mls_symtab_names
++#define mls_symtab_sizes
++#define mls_index_f
++#define mls_destroy_f
++#define mls_read_f
++#define mls_write_f
++#define mls_policydb_index_others(p)
++#define mls_set_config(config)
++#define mls_user_destroy(usrdatum)
++#define mls_read_range(c, fp) 0
++#define mls_read_perm(p, fp) 0
++#define mls_read_class(c, fp) 0
++#define mls_read_user(u, fp) 0
++#define mls_read_nlevels(p, fp) 0
++#define mls_read_trusted(p, fp) 0
++
++#endif
++
++#endif        /* _SS_MLS_H */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/mls_types.h 2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,58 @@
++/*
++ * Type definitions for the multi-level security (MLS) policy.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_MLS_TYPES_H_
++#define _SS_MLS_TYPES_H_
++
++struct mls_level {
++      u32 sens;               /* sensitivity */
++      struct ebitmap cat;     /* category set */
++};
++
++struct mls_range {
++      struct mls_level level[2]; /* low == level[0], high == level[1] */
++};
++
++struct mls_range_list {
++      struct mls_range range;
++      struct mls_range_list *next;
++};
++
++#define MLS_RELATION_DOM      1 /* source dominates */
++#define MLS_RELATION_DOMBY    2 /* target dominates */
++#define MLS_RELATION_EQ               4 /* source and target are equivalent */
++#define MLS_RELATION_INCOMP   8 /* source and target are incomparable */
++
++#define mls_level_eq(l1,l2) \
++(((l1).sens == (l2).sens) && ebitmap_cmp(&(l1).cat,&(l2).cat))
++
++#define mls_level_relation(l1,l2) ( \
++(((l1).sens == (l2).sens) && ebitmap_cmp(&(l1).cat,&(l2).cat)) ? \
++                                  MLS_RELATION_EQ : \
++(((l1).sens >= (l2).sens) && ebitmap_contains(&(l1).cat, &(l2).cat)) ? \
++                                  MLS_RELATION_DOM : \
++(((l2).sens >= (l1).sens) && ebitmap_contains(&(l2).cat, &(l1).cat)) ? \
++                                  MLS_RELATION_DOMBY : \
++                                  MLS_RELATION_INCOMP )
++
++#define mls_range_contains(r1,r2) \
++((mls_level_relation((r1).level[0], (r2).level[0]) & \
++        (MLS_RELATION_EQ | MLS_RELATION_DOMBY)) && \
++       (mls_level_relation((r1).level[1], (r2).level[1]) & \
++        (MLS_RELATION_EQ | MLS_RELATION_DOM)))
++
++/*
++ * Every access vector permission is mapped to a set of MLS base
++ * permissions, based on the flow properties of the corresponding
++ * operation.
++ */
++struct mls_perms {
++      u32 read;     /* permissions that map to `read' */
++      u32 readby;   /* permissions that map to `readby' */
++      u32 write;    /* permissions that map to `write' */
++      u32 writeby;  /* permissions that map to `writeby' */
++};
++
++#endif        /* _SS_MLS_TYPES_H_ */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/policydb.c  2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,1429 @@
++/*
++ * Implementation of the policy database.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "policydb.h"
++#include "mls.h"
++
++#define _DEBUG_HASHES
++
++#ifdef DEBUG_HASHES
++static char *symtab_name[SYM_NUM] = {
++      "common prefixes",
++      "classes",
++      "roles",
++      "types",
++      "users"
++      mls_symtab_names
++};
++#endif
++
++static unsigned int symtab_sizes[SYM_NUM] = {
++      2,
++      32,
++      16,
++      512,
++      128
++      mls_symtab_sizes
++};
++
++/*
++ * Initialize the role table.
++ */
++int roles_init(struct policydb *p)
++{
++      char *key = 0;
++      int rc;
++      struct role_datum *role;
++
++      role = kmalloc(sizeof(*role), GFP_KERNEL);
++      if (!role) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      memset(role, 0, sizeof(*role));
++      role->value = ++p->p_roles.nprim;
++      if (role->value != OBJECT_R_VAL) {
++              rc = -EINVAL;
++              goto out_free_role;
++      }
++      key = kmalloc(strlen(OBJECT_R)+1,GFP_KERNEL);
++      if (!key) {
++              rc = -ENOMEM;
++              goto out_free_role;
++      }
++      strcpy(key, OBJECT_R);
++      rc = hashtab_insert(p->p_roles.table, key, role);
++      if (rc)
++              goto out_free_key;
++out:
++      return rc;
++
++out_free_key:
++      kfree(key);
++out_free_role:
++      kfree(role);
++      goto out;
++}
++
++/*
++ * Initialize a policy database structure.
++ */
++int policydb_init(struct policydb *p)
++{
++      int i, rc;
++
++      memset(p, 0, sizeof(*p));
++
++      for (i = 0; i < SYM_NUM; i++) {
++              rc = symtab_init(&p->symtab[i], symtab_sizes[i]);
++              if (rc)
++                      goto out_free_symtab;
++      }
++
++      rc = avtab_init(&p->te_avtab);
++      if (rc)
++              goto out_free_symtab;
++
++      rc = roles_init(p);
++      if (rc)
++              goto out_free_avtab;
++
++out:
++      return rc;
++
++out_free_avtab:
++      avtab_destroy(&p->te_avtab);
++
++out_free_symtab:
++      for (i = 0; i < SYM_NUM; i++)
++              hashtab_destroy(p->symtab[i].table);
++      goto out;
++}
++
++/*
++ * The following *_index functions are used to
++ * define the val_to_name and val_to_struct arrays
++ * in a policy database structure.  The val_to_name
++ * arrays are used when converting security context
++ * structures into string representations.  The
++ * val_to_struct arrays are used when the attributes
++ * of a class, role, or user are needed.
++ */
++
++static int common_index(void *key, void *datum, void *datap)
++{
++      struct policydb *p;
++      struct common_datum *comdatum;
++
++      comdatum = datum;
++      p = datap;
++      p->p_common_val_to_name[comdatum->value - 1] = key;
++      return 0;
++}
++
++static int class_index(void *key, void *datum, void *datap)
++{
++      struct policydb *p;
++      struct class_datum *cladatum;
++
++      cladatum = datum;
++      p = datap;
++      p->p_class_val_to_name[cladatum->value - 1] = key;
++      p->class_val_to_struct[cladatum->value - 1] = cladatum;
++      return 0;
++}
++
++static int role_index(void *key, void *datum, void *datap)
++{
++      struct policydb *p;
++      struct role_datum *role;
++
++      role = datum;
++      p = datap;
++      p->p_role_val_to_name[role->value - 1] = key;
++      p->role_val_to_struct[role->value - 1] = role;
++      return 0;
++}
++
++static int type_index(void *key, void *datum, void *datap)
++{
++      struct policydb *p;
++      struct type_datum *typdatum;
++
++      typdatum = datum;
++      p = datap;
++
++      if (typdatum->primary)
++              p->p_type_val_to_name[typdatum->value - 1] = key;
++
++      return 0;
++}
++
++static int user_index(void *key, void *datum, void *datap)
++{
++      struct policydb *p;
++      struct user_datum *usrdatum;
++
++      usrdatum = datum;
++      p = datap;
++      p->p_user_val_to_name[usrdatum->value - 1] = key;
++      p->user_val_to_struct[usrdatum->value - 1] = usrdatum;
++      return 0;
++}
++
++static int (*index_f[SYM_NUM]) (void *key, void *datum, void *datap) =
++{
++      common_index,
++      class_index,
++      role_index,
++      type_index,
++      user_index
++      mls_index_f
++};
++
++/*
++ * Define the common val_to_name array and the class
++ * val_to_name and val_to_struct arrays in a policy
++ * database structure.
++ *
++ * Caller must clean up upon failure.
++ */
++int policydb_index_classes(struct policydb *p)
++{
++      int rc;
++
++      p->p_common_val_to_name =
++              kmalloc(p->p_commons.nprim * sizeof(char *), GFP_KERNEL);
++      if (!p->p_common_val_to_name) {
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      rc = hashtab_map(p->p_commons.table, common_index, p);
++      if (rc)
++              goto out;
++
++      p->class_val_to_struct =
++              kmalloc(p->p_classes.nprim * sizeof(*(p->class_val_to_struct)), GFP_KERNEL);
++      if (!p->class_val_to_struct) {
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      p->p_class_val_to_name =
++              kmalloc(p->p_classes.nprim * sizeof(char *), GFP_KERNEL);
++      if (!p->p_class_val_to_name) {
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      rc = hashtab_map(p->p_classes.table, class_index, p);
++out:
++      return rc;
++}
++
++#ifdef DEBUG_HASHES
++static void symtab_hash_eval(struct symtab *s)
++{
++      int i;
++
++      for (i = 0; i < SYM_NUM; i++) {
++              struct hashtab *h = s[i].table;
++              struct hashtab_info info;
++
++              hashtab_stat(h, &info);
++              printk(KERN_INFO "%s:  %d entries and %d/%d buckets used, "
++                     "longest chain length %d\n", symtab_name[i], h->nel,
++                     info.slots_used, h->size, info.max_chain_len);
++      }
++}
++#endif
++
++/*
++ * Define the other val_to_name and val_to_struct arrays
++ * in a policy database structure.
++ *
++ * Caller must clean up on failure.
++ */
++int policydb_index_others(struct policydb *p)
++{
++      int i, rc = 0;
++
++      printk(KERN_INFO "security:  %d users, %d roles, %d types",
++             p->p_users.nprim, p->p_roles.nprim, p->p_types.nprim);
++      mls_policydb_index_others(p);
++      printk("\n");
++
++      printk(KERN_INFO "security:  %d classes, %d rules\n",
++             p->p_classes.nprim, p->te_avtab.nel);
++
++#ifdef DEBUG_HASHES
++      avtab_hash_eval(&p->te_avtab, "rules");
++      symtab_hash_eval(p->symtab);
++#endif
++
++      p->role_val_to_struct =
++              kmalloc(p->p_roles.nprim * sizeof(*(p->role_val_to_struct)),
++                      GFP_KERNEL);
++      if (!p->role_val_to_struct) {
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      p->user_val_to_struct =
++              kmalloc(p->p_users.nprim * sizeof(*(p->user_val_to_struct)),
++                      GFP_KERNEL);
++      if (!p->user_val_to_struct) {
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      for (i = SYM_ROLES; i < SYM_NUM; i++) {
++              p->sym_val_to_name[i] =
++                      kmalloc(p->symtab[i].nprim * sizeof(char *), GFP_KERNEL);
++              if (!p->sym_val_to_name[i]) {
++                      rc = -ENOMEM;
++                      goto out;
++              }
++              rc = hashtab_map(p->symtab[i].table, index_f[i], p);
++              if (rc)
++                      goto out;
++      }
++
++out:
++      return rc;
++}
++
++/*
++ * The following *_destroy functions are used to
++ * free any memory allocated for each kind of
++ * symbol data in the policy database.
++ */
++
++static int perm_destroy(void *key, void *datum, void *p)
++{
++      kfree(key);
++      kfree(datum);
++      return 0;
++}
++
++static int common_destroy(void *key, void *datum, void *p)
++{
++      struct common_datum *comdatum;
++
++      kfree(key);
++      comdatum = datum;
++      hashtab_map(comdatum->permissions.table, perm_destroy, 0);
++      hashtab_destroy(comdatum->permissions.table);
++      kfree(datum);
++      return 0;
++}
++
++static int class_destroy(void *key, void *datum, void *p)
++{
++      struct class_datum *cladatum;
++      struct constraint_node *constraint, *ctemp;
++      struct constraint_expr *e, *etmp;
++
++      kfree(key);
++      cladatum = datum;
++      hashtab_map(cladatum->permissions.table, perm_destroy, 0);
++      hashtab_destroy(cladatum->permissions.table);
++      constraint = cladatum->constraints;
++      while (constraint) {
++              e = constraint->expr;
++              while (e) {
++                      ebitmap_destroy(&e->names);
++                      etmp = e;
++                      e = e->next;
++                      kfree(etmp);
++              }
++              ctemp = constraint;
++              constraint = constraint->next;
++              kfree(ctemp);
++      }
++      kfree(cladatum->comkey);
++      kfree(datum);
++      return 0;
++}
++
++static int role_destroy(void *key, void *datum, void *p)
++{
++      struct role_datum *role;
++
++      kfree(key);
++      role = datum;
++      ebitmap_destroy(&role->dominates);
++      ebitmap_destroy(&role->types);
++      kfree(datum);
++      return 0;
++}
++
++static int type_destroy(void *key, void *datum, void *p)
++{
++      kfree(key);
++      kfree(datum);
++      return 0;
++}
++
++static int user_destroy(void *key, void *datum, void *p)
++{
++      struct user_datum *usrdatum;
++
++      kfree(key);
++      usrdatum = datum;
++      ebitmap_destroy(&usrdatum->roles);
++      mls_user_destroy(usrdatum);
++      kfree(datum);
++      return 0;
++}
++
++static int (*destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) =
++{
++      common_destroy,
++      class_destroy,
++      role_destroy,
++      type_destroy,
++      user_destroy
++      mls_destroy_f
++};
++
++/*
++ * Free any memory allocated by a policy database structure.
++ */
++void policydb_destroy(struct policydb *p)
++{
++      struct ocontext *c, *ctmp;
++      struct genfs *g, *gtmp;
++      int i;
++
++      for (i = 0; i < SYM_NUM; i++) {
++              hashtab_map(p->symtab[i].table, destroy_f[i], 0);
++              hashtab_destroy(p->symtab[i].table);
++      }
++
++      for (i = 0; i < SYM_NUM; i++) {
++              if (p->sym_val_to_name[i])
++                      kfree(p->sym_val_to_name[i]);
++      }
++
++      if (p->class_val_to_struct)
++              kfree(p->class_val_to_struct);
++      if (p->role_val_to_struct)
++              kfree(p->role_val_to_struct);
++      if (p->user_val_to_struct)
++              kfree(p->user_val_to_struct);
++
++      avtab_destroy(&p->te_avtab);
++
++      for (i = 0; i < OCON_NUM; i++) {
++              c = p->ocontexts[i];
++              while (c) {
++                      ctmp = c;
++                      c = c->next;
++                      context_destroy(&ctmp->context[0]);
++                      context_destroy(&ctmp->context[1]);
++                      if (i == OCON_ISID || i == OCON_FS ||
++                          i == OCON_NETIF || i == OCON_FSUSE)
++                              kfree(ctmp->u.name);
++                      kfree(ctmp);
++              }
++      }
++
++      g = p->genfs;
++      while (g) {
++              kfree(g->fstype);
++              c = g->head;
++              while (c) {
++                      ctmp = c;
++                      c = c->next;
++                      context_destroy(&ctmp->context[0]);
++                      kfree(ctmp->u.name);
++                      kfree(ctmp);
++              }
++              gtmp = g;
++              g = g->next;
++              kfree(gtmp);
++      }
++
++      return;
++}
++
++/*
++ * Load the initial SIDs specified in a policy database
++ * structure into a SID table.
++ */
++int policydb_load_isids(struct policydb *p, struct sidtab *s)
++{
++      struct ocontext *head, *c;
++      int rc;
++
++      rc = sidtab_init(s);
++      if (rc) {
++              printk(KERN_ERR "security:  out of memory on SID table init\n");
++              goto out;
++      }
++
++      head = p->ocontexts[OCON_ISID];
++      for (c = head; c; c = c->next) {
++              if (!c->context[0].user) {
++                      printk(KERN_ERR "security:  SID %s was never "
++                             "defined.\n", c->u.name);
++                      rc = -EINVAL;
++                      goto out;
++              }
++              if (sidtab_insert(s, c->sid[0], &c->context[0])) {
++                      printk(KERN_ERR "security:  unable to load initial "
++                             "SID %s.\n", c->u.name);
++                      rc = -EINVAL;
++                      goto out;
++              }
++      }
++out:
++      return rc;
++}
++
++/*
++ * Return 1 if the fields in the security context
++ * structure `c' are valid.  Return 0 otherwise.
++ */
++int policydb_context_isvalid(struct policydb *p, struct context *c)
++{
++      struct role_datum *role;
++      struct user_datum *usrdatum;
++
++      /*
++       * Role must be authorized for the type.
++       */
++      if (!c->role || c->role > p->p_roles.nprim)
++              return 0;
++
++      if (c->role != OBJECT_R_VAL) {
++              role = p->role_val_to_struct[c->role - 1];
++              if (!ebitmap_get_bit(&role->types,
++                                   c->type - 1))
++                      /* role may not be associated with type */
++                      return 0;
++
++              /*
++               * User must be authorized for the role.
++               */
++              if (!c->user || c->user > p->p_users.nprim)
++                      return 0;
++              usrdatum = p->user_val_to_struct[c->user - 1];
++              if (!usrdatum)
++                      return 0;
++
++              if (!ebitmap_get_bit(&usrdatum->roles,
++                                   c->role - 1))
++                      /* user may not be associated with role */
++                      return 0;
++      }
++
++      if (!mls_context_isvalid(p, c))
++              return 0;
++
++      return 1;
++}
++
++/*
++ * Read and validate a security context structure
++ * from a policydb binary representation file.
++ */
++static int context_read_and_validate(struct context *c,
++                                   struct policydb *p,
++                                   void *fp)
++{
++      u32 *buf;
++      int rc = 0;
++
++      buf = next_entry(fp, sizeof(u32)*3);
++      if (!buf) {
++              printk(KERN_ERR "security: context truncated\n");
++              rc = -EINVAL;
++              goto out;
++      }
++      c->user = le32_to_cpu(buf[0]);
++      c->role = le32_to_cpu(buf[1]);
++      c->type = le32_to_cpu(buf[2]);
++      if (mls_read_range(c, fp)) {
++              printk(KERN_ERR "security: error reading MLS range of "
++                     "context\n");
++              rc = -EINVAL;
++              goto out;
++      }
++
++      if (!policydb_context_isvalid(p, c)) {
++              printk(KERN_ERR "security:  invalid security context\n");
++              context_destroy(c);
++              rc = -EINVAL;
++      }
++out:
++      return rc;
++}
++
++/*
++ * The following *_read functions are used to
++ * read the symbol data from a policy database
++ * binary representation file.
++ */
++
++static int perm_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++      char *key = 0;
++      struct perm_datum *perdatum;
++      int rc;
++      u32 *buf, len;
++
++      perdatum = kmalloc(sizeof(*perdatum), GFP_KERNEL);
++      if (!perdatum) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      memset(perdatum, 0, sizeof(*perdatum));
++
++      buf = next_entry(fp, sizeof(u32)*2);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      len = le32_to_cpu(buf[0]);
++      perdatum->value = le32_to_cpu(buf[1]);
++      rc = mls_read_perm(perdatum, fp);
++      if (rc)
++              goto bad;
++
++      buf = next_entry(fp, len);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      key = kmalloc(len + 1,GFP_KERNEL);
++      if (!key) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(key, buf, len);
++      key[len] = 0;
++
++      rc = hashtab_insert(h, key, perdatum);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++bad:
++      perm_destroy(key, perdatum, NULL);
++      goto out;
++}
++
++static int common_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++      char *key = 0;
++      struct common_datum *comdatum;
++      u32 *buf, len, nel;
++      int i, rc;
++
++      comdatum = kmalloc(sizeof(*comdatum), GFP_KERNEL);
++      if (!comdatum) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      memset(comdatum, 0, sizeof(*comdatum));
++
++      buf = next_entry(fp, sizeof(u32)*4);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      len = le32_to_cpu(buf[0]);
++      comdatum->value = le32_to_cpu(buf[1]);
++
++      rc = symtab_init(&comdatum->permissions, PERM_SYMTAB_SIZE);
++      if (rc)
++              goto bad;
++      comdatum->permissions.nprim = le32_to_cpu(buf[2]);
++      nel = le32_to_cpu(buf[3]);
++
++      buf = next_entry(fp, len);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      key = kmalloc(len + 1,GFP_KERNEL);
++      if (!key) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(key, buf, len);
++      key[len] = 0;
++
++      for (i = 0; i < nel; i++) {
++              rc = perm_read(p, comdatum->permissions.table, fp);
++              if (rc)
++                      goto bad;
++      }
++
++      rc = hashtab_insert(h, key, comdatum);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++bad:
++      common_destroy(key, comdatum, NULL);
++      goto out;
++}
++
++static int class_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++      char *key = 0;
++      struct class_datum *cladatum;
++      struct constraint_node *c, *lc;
++      struct constraint_expr *e, *le;
++      u32 *buf, len, len2, ncons, nexpr, nel;
++      int i, j, depth, rc;
++
++      cladatum = kmalloc(sizeof(*cladatum), GFP_KERNEL);
++      if (!cladatum) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memset(cladatum, 0, sizeof(*cladatum));
++
++      buf = next_entry(fp, sizeof(u32)*6);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      len = le32_to_cpu(buf[0]);
++      len2 = le32_to_cpu(buf[1]);
++      cladatum->value = le32_to_cpu(buf[2]);
++
++      rc = symtab_init(&cladatum->permissions, PERM_SYMTAB_SIZE);
++      if (rc)
++              goto bad;
++      cladatum->permissions.nprim = le32_to_cpu(buf[3]);
++      nel = le32_to_cpu(buf[4]);
++
++      ncons = le32_to_cpu(buf[5]);
++
++      buf = next_entry(fp, len);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      key = kmalloc(len + 1,GFP_KERNEL);
++      if (!key) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(key, buf, len);
++      key[len] = 0;
++
++      if (len2) {
++              cladatum->comkey = kmalloc(len2 + 1,GFP_KERNEL);
++              if (!cladatum->comkey) {
++                      rc = -ENOMEM;
++                      goto bad;
++              }
++              buf = next_entry(fp, len2);
++              if (!buf) {
++                      rc = -EINVAL;
++                      goto bad;
++              }
++              memcpy(cladatum->comkey, buf, len2);
++              cladatum->comkey[len2] = 0;
++
++              cladatum->comdatum = hashtab_search(p->p_commons.table,
++                                                  cladatum->comkey);
++              if (!cladatum->comdatum) {
++                      printk(KERN_ERR "security:  unknown common %s\n",
++                             cladatum->comkey);
++                      rc = -EINVAL;
++                      goto bad;
++              }
++      }
++      for (i = 0; i < nel; i++) {
++              rc = perm_read(p, cladatum->permissions.table, fp);
++              if (rc)
++                      goto bad;
++      }
++
++      lc = NULL;
++      rc = -EINVAL;
++      for (i = 0; i < ncons; i++) {
++              c = kmalloc(sizeof(*c), GFP_KERNEL);
++              if (!c) {
++                      rc = -ENOMEM;
++                      goto bad;
++              }
++              memset(c, 0, sizeof(*c));
++              buf = next_entry(fp, sizeof(u32)*2);
++              if (!buf)
++                      goto bad;
++              c->permissions = le32_to_cpu(buf[0]);
++              nexpr = le32_to_cpu(buf[1]);
++              le = NULL;
++              depth = -1;
++              for (j = 0; j < nexpr; j++) {
++                      e = kmalloc(sizeof(*e), GFP_KERNEL);
++                      if (!e) {
++                              rc = -ENOMEM;
++                              goto bad;
++                      }
++                      memset(e, 0, sizeof(*e));
++                      buf = next_entry(fp, sizeof(u32)*3);
++                      if (!buf) {
++                              kfree(e);
++                              goto bad;
++                      }
++                      e->expr_type = le32_to_cpu(buf[0]);
++                      e->attr = le32_to_cpu(buf[1]);
++                      e->op = le32_to_cpu(buf[2]);
++
++                      switch (e->expr_type) {
++                      case CEXPR_NOT:
++                              if (depth < 0) {
++                                      kfree(e);
++                                      goto bad;
++                              }
++                              break;
++                      case CEXPR_AND:
++                      case CEXPR_OR:
++                              if (depth < 1) {
++                                      kfree(e);
++                                      goto bad;
++                              }
++                              depth--;
++                              break;
++                      case CEXPR_ATTR:
++                              if (depth == (CEXPR_MAXDEPTH-1)) {
++                                      kfree(e);
++                                      goto bad;
++                              }
++                              depth++;
++                              break;
++                      case CEXPR_NAMES:
++                              if (depth == (CEXPR_MAXDEPTH-1)) {
++                                      kfree(e);
++                                      goto bad;
++                              }
++                              depth++;
++                              if (ebitmap_read(&e->names, fp)) {
++                                      kfree(e);
++                                      goto bad;
++                              }
++                              break;
++                      default:
++                              kfree(e);
++                              goto bad;
++                              break;
++                      }
++                      if (le) {
++                              le->next = e;
++                      } else {
++                              c->expr = e;
++                      }
++                      le = e;
++              }
++              if (depth != 0)
++                      goto bad;
++              if (lc) {
++                      lc->next = c;
++              } else {
++                      cladatum->constraints = c;
++              }
++              lc = c;
++      }
++
++      rc = mls_read_class(cladatum, fp);
++      if (rc)
++              goto bad;
++
++      rc = hashtab_insert(h, key, cladatum);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++bad:
++      class_destroy(key, cladatum, NULL);
++      goto out;
++}
++
++static int role_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++      char *key = 0;
++      struct role_datum *role;
++      int rc;
++      u32 *buf, len;
++
++      role = kmalloc(sizeof(*role), GFP_KERNEL);
++      if (!role) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      memset(role, 0, sizeof(*role));
++
++      buf = next_entry(fp, sizeof(u32)*2);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      len = le32_to_cpu(buf[0]);
++      role->value = le32_to_cpu(buf[1]);
++
++      buf = next_entry(fp, len);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      key = kmalloc(len + 1,GFP_KERNEL);
++      if (!key) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(key, buf, len);
++      key[len] = 0;
++
++      rc = ebitmap_read(&role->dominates, fp);
++      if (rc)
++              goto bad;
++
++      rc = ebitmap_read(&role->types, fp);
++      if (rc)
++              goto bad;
++
++      if (strcmp(key, OBJECT_R) == 0) {
++              if (role->value != OBJECT_R_VAL) {
++                      printk(KERN_ERR "Role %s has wrong value %d\n",
++                             OBJECT_R, role->value);
++                      rc = -EINVAL;
++                      goto bad;
++              }
++              rc = 0;
++              goto bad;
++      }
++
++      rc = hashtab_insert(h, key, role);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++bad:
++      role_destroy(key, role, NULL);
++      goto out;
++}
++
++static int type_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++      char *key = 0;
++      struct type_datum *typdatum;
++      int rc;
++      u32 *buf, len;
++
++      typdatum = kmalloc(sizeof(*typdatum),GFP_KERNEL);
++      if (!typdatum) {
++              rc = -ENOMEM;
++              return rc;
++      }
++      memset(typdatum, 0, sizeof(*typdatum));
++
++      buf = next_entry(fp, sizeof(u32)*3);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      len = le32_to_cpu(buf[0]);
++      typdatum->value = le32_to_cpu(buf[1]);
++      typdatum->primary = le32_to_cpu(buf[2]);
++
++      buf = next_entry(fp, len);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      key = kmalloc(len + 1,GFP_KERNEL);
++      if (!key) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(key, buf, len);
++      key[len] = 0;
++
++      rc = hashtab_insert(h, key, typdatum);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++bad:
++      type_destroy(key, typdatum, NULL);
++      goto out;
++}
++
++static int user_read(struct policydb *p, struct hashtab *h, void *fp)
++{
++      char *key = 0;
++      struct user_datum *usrdatum;
++      int rc;
++      u32 *buf, len;
++
++
++      usrdatum = kmalloc(sizeof(*usrdatum), GFP_KERNEL);
++      if (!usrdatum) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      memset(usrdatum, 0, sizeof(*usrdatum));
++
++      buf = next_entry(fp, sizeof(u32)*2);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++
++      len = le32_to_cpu(buf[0]);
++      usrdatum->value = le32_to_cpu(buf[1]);
++
++      buf = next_entry(fp, len);
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      key = kmalloc(len + 1,GFP_KERNEL);
++      if (!key) {
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(key, buf, len);
++      key[len] = 0;
++
++      rc = ebitmap_read(&usrdatum->roles, fp);
++      if (rc)
++              goto bad;
++
++      rc = mls_read_user(usrdatum, fp);
++      if (rc)
++              goto bad;
++
++      rc = hashtab_insert(h, key, usrdatum);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++bad:
++      user_destroy(key, usrdatum, NULL);
++      goto out;
++}
++
++static int (*read_f[SYM_NUM]) (struct policydb *p, struct hashtab *h, void *fp) =
++{
++      common_read,
++      class_read,
++      role_read,
++      type_read,
++      user_read
++      mls_read_f
++};
++
++#define mls_config(x) \
++       ((x) & POLICYDB_CONFIG_MLS) ? "mls" : "no_mls"
++
++/*
++ * Read the configuration data from a policy database binary
++ * representation file into a policy database structure.
++ */
++int policydb_read(struct policydb *p, void *fp)
++{
++      struct role_allow *ra, *lra;
++      struct role_trans *tr, *ltr;
++      struct ocontext *l, *c, *newc;
++      struct genfs *genfs_p, *genfs, *newgenfs;
++      int i, j, rc;
++      u32 *buf, len, len2, config, nprim, nel, nel2;
++      char *policydb_str;
++
++      config = 0;
++      mls_set_config(config);
++
++      rc = policydb_init(p);
++      if (rc)
++              goto out;
++
++      rc = -EINVAL;
++      /* Read the magic number and string length. */
++      buf = next_entry(fp, sizeof(u32)* 2);
++      if (!buf)
++              goto bad;
++
++      for (i = 0; i < 2; i++)
++              buf[i] = le32_to_cpu(buf[i]);
++
++      if (buf[0] != POLICYDB_MAGIC) {
++              printk(KERN_ERR "security:  policydb magic number 0x%x does "
++                     "not match expected magic number 0x%x\n",
++                     buf[0], POLICYDB_MAGIC);
++              goto bad;
++      }
++
++      len = buf[1];
++      if (len != strlen(POLICYDB_STRING)) {
++              printk(KERN_ERR "security:  policydb string length %d does not "
++                     "match expected length %d\n",
++                     len, strlen(POLICYDB_STRING));
++              goto bad;
++      }
++      buf = next_entry(fp, len);
++      if (!buf) {
++              printk(KERN_ERR "security:  truncated policydb string identifier\n");
++              goto bad;
++      }
++      policydb_str = kmalloc(len + 1,GFP_KERNEL);
++      if (!policydb_str) {
++              printk(KERN_ERR "security:  unable to allocate memory for policydb "
++                     "string of length %d\n", len);
++              rc = -ENOMEM;
++              goto bad;
++      }
++      memcpy(policydb_str, buf, len);
++      policydb_str[len] = 0;
++      if (strcmp(policydb_str, POLICYDB_STRING)) {
++              printk(KERN_ERR "security:  policydb string %s does not match "
++                     "my string %s\n", policydb_str, POLICYDB_STRING);
++              kfree(policydb_str);
++              goto bad;
++      }
++      /* Done with policydb_str. */
++      kfree(policydb_str);
++      policydb_str = NULL;
++
++      /* Read the version, config, and table sizes. */
++      buf = next_entry(fp, sizeof(u32)*4);
++      if (!buf)
++              goto bad;
++      for (i = 0; i < 4; i++)
++              buf[i] = le32_to_cpu(buf[i]);
++
++      if (buf[0] != POLICYDB_VERSION) {
++              printk(KERN_ERR "security:  policydb version %d does not match "
++                     "my version %d\n", buf[0], POLICYDB_VERSION);
++              goto bad;
++      }
++      if (buf[1] != config) {
++              printk(KERN_ERR "security:  policydb configuration (%s) does "
++                     "not match my configuration (%s)\n",
++                     mls_config(buf[1]),
++                     mls_config(config));
++              goto bad;
++      }
++      if (buf[2] != SYM_NUM || buf[3] != OCON_NUM) {
++              printk(KERN_ERR "security:  policydb table sizes (%d,%d) do "
++                     "not match mine (%d,%d)\n",
++                     buf[2], buf[3], SYM_NUM, OCON_NUM);
++              goto bad;
++      }
++
++      rc = mls_read_nlevels(p, fp);
++      if (rc)
++              goto bad;
++
++      for (i = 0; i < SYM_NUM; i++) {
++              buf = next_entry(fp, sizeof(u32)*2);
++              if (!buf) {
++                      rc = -EINVAL;
++                      goto bad;
++              }
++              nprim = le32_to_cpu(buf[0]);
++              nel = le32_to_cpu(buf[1]);
++              for (j = 0; j < nel; j++) {
++                      rc = read_f[i](p, p->symtab[i].table, fp);
++                      if (rc)
++                              goto bad;
++              }
++
++              p->symtab[i].nprim = nprim;
++      }
++
++      rc = avtab_read(&p->te_avtab, fp, config);
++      if (rc)
++              goto bad;
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      nel = le32_to_cpu(buf[0]);
++      ltr = NULL;
++      for (i = 0; i < nel; i++) {
++              tr = kmalloc(sizeof(*tr), GFP_KERNEL);
++              if (!tr) {
++                      rc = -ENOMEM;
++                      goto bad;
++              }
++              memset(tr, 0, sizeof(*tr));
++              if (ltr) {
++                      ltr->next = tr;
++              } else {
++                      p->role_tr = tr;
++              }
++              buf = next_entry(fp, sizeof(u32)*3);
++              if (!buf) {
++                      rc = -EINVAL;
++                      goto bad;
++              }
++              tr->role = le32_to_cpu(buf[0]);
++              tr->type = le32_to_cpu(buf[1]);
++              tr->new_role = le32_to_cpu(buf[2]);
++              ltr = tr;
++      }
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      nel = le32_to_cpu(buf[0]);
++      lra = NULL;
++      for (i = 0; i < nel; i++) {
++              ra = kmalloc(sizeof(*ra), GFP_KERNEL);
++              if (!ra) {
++                      rc = -ENOMEM;
++                      goto bad;
++              }
++              memset(ra, 0, sizeof(*ra));
++              if (lra) {
++                      lra->next = ra;
++              } else {
++                      p->role_allow = ra;
++              }
++              buf = next_entry(fp, sizeof(u32)*2);
++              if (!buf) {
++                      rc = -EINVAL;
++                      goto bad;
++              }
++              ra->role = le32_to_cpu(buf[0]);
++              ra->new_role = le32_to_cpu(buf[1]);
++              lra = ra;
++      }
++
++      rc = policydb_index_classes(p);
++      if (rc)
++              goto bad;
++
++      rc = policydb_index_others(p);
++      if (rc)
++              goto bad;
++
++      for (i = 0; i < OCON_NUM; i++) {
++              buf = next_entry(fp, sizeof(u32));
++              if (!buf) {
++                      rc = -EINVAL;
++                      goto bad;
++              }
++              nel = le32_to_cpu(buf[0]);
++              l = NULL;
++              for (j = 0; j < nel; j++) {
++                      c = kmalloc(sizeof(*c), GFP_KERNEL);
++                      if (!c) {
++                              rc = -ENOMEM;
++                              goto bad;
++                      }
++                      memset(c, 0, sizeof(*c));
++                      if (l) {
++                              l->next = c;
++                      } else {
++                              p->ocontexts[i] = c;
++                      }
++                      l = c;
++                      rc = -EINVAL;
++                      switch (i) {
++                      case OCON_ISID:
++                              buf = next_entry(fp, sizeof(u32));
++                              if (!buf)
++                                      goto bad;
++                              c->sid[0] = le32_to_cpu(buf[0]);
++                              rc = context_read_and_validate(&c->context[0], p, fp);
++                              if (rc)
++                                      goto bad;
++                              break;
++                      case OCON_FS:
++                      case OCON_NETIF:
++                              buf = next_entry(fp, sizeof(u32));
++                              if (!buf)
++                                      goto bad;
++                              len = le32_to_cpu(buf[0]);
++                              buf = next_entry(fp, len);
++                              if (!buf)
++                                      goto bad;
++                              c->u.name = kmalloc(len + 1,GFP_KERNEL);
++                              if (!c->u.name) {
++                                      rc = -ENOMEM;
++                                      goto bad;
++                              }
++                              memcpy(c->u.name, buf, len);
++                              c->u.name[len] = 0;
++                              rc = context_read_and_validate(&c->context[0], p, fp);
++                              if (rc)
++                                      goto bad;
++                              rc = context_read_and_validate(&c->context[1], p, fp);
++                              if (rc)
++                                      goto bad;
++                              break;
++                      case OCON_PORT:
++                              buf = next_entry(fp, sizeof(u32)*3);
++                              if (!buf)
++                                      goto bad;
++                              c->u.port.protocol = le32_to_cpu(buf[0]);
++                              c->u.port.low_port = le32_to_cpu(buf[1]);
++                              c->u.port.high_port = le32_to_cpu(buf[2]);
++                              rc = context_read_and_validate(&c->context[0], p, fp);
++                              if (rc)
++                                      goto bad;
++                              break;
++                      case OCON_NODE:
++                              buf = next_entry(fp, sizeof(u32)* 2);
++                              if (!buf)
++                                      goto bad;
++                              c->u.node.addr = le32_to_cpu(buf[0]);
++                              c->u.node.mask = le32_to_cpu(buf[1]);
++                              rc = context_read_and_validate(&c->context[0], p, fp);
++                              if (rc)
++                                      goto bad;
++                              break;
++                      case OCON_FSUSE:
++                              buf = next_entry(fp, sizeof(u32)*2);
++                              if (!buf)
++                                      goto bad;
++                              c->v.behavior = le32_to_cpu(buf[0]);
++                              len = le32_to_cpu(buf[1]);
++                              buf = next_entry(fp, len);
++                              if (!buf)
++                                      goto bad;
++                              c->u.name = kmalloc(len + 1,GFP_KERNEL);
++                              if (!c->u.name) {
++                                      rc = -ENOMEM;
++                                      goto bad;
++                              }
++                              memcpy(c->u.name, buf, len);
++                              c->u.name[len] = 0;
++                              rc = context_read_and_validate(&c->context[0], p, fp);
++                              if (rc)
++                                      goto bad;
++                              break;
++                      }
++              }
++      }
++
++      buf = next_entry(fp, sizeof(u32));
++      if (!buf) {
++              rc = -EINVAL;
++              goto bad;
++      }
++      nel = le32_to_cpu(buf[0]);
++      genfs_p = NULL;
++      rc = -EINVAL;
++      for (i = 0; i < nel; i++) {
++              newgenfs = kmalloc(sizeof(*newgenfs), GFP_KERNEL);
++              if (!newgenfs) {
++                      rc = -ENOMEM;
++                      goto bad;
++              }
++              memset(newgenfs, 0, sizeof(*newgenfs));
++              buf = next_entry(fp, sizeof(u32));
++              if (!buf)
++                      goto bad;
++              len = le32_to_cpu(buf[0]);
++              buf = next_entry(fp, len);
++              if (!buf)
++                      goto bad;
++              newgenfs->fstype = kmalloc(len + 1,GFP_KERNEL);
++              if (!newgenfs->fstype) {
++                      rc = -ENOMEM;
++                      goto bad;
++              }
++              memcpy(newgenfs->fstype, buf, len);
++              newgenfs->fstype[len] = 0;
++              for (genfs_p = NULL, genfs = p->genfs; genfs;
++                   genfs_p = genfs, genfs = genfs->next) {
++                      if (strcmp(newgenfs->fstype, genfs->fstype) == 0) {
++                              printk(KERN_ERR "security:  dup genfs "
++                                     "fstype %s\n", newgenfs->fstype);
++                              goto bad;
++                      }
++                      if (strcmp(newgenfs->fstype, genfs->fstype) < 0)
++                              break;
++              }
++              newgenfs->next = genfs;
++              if (genfs_p)
++                      genfs_p->next = newgenfs;
++              else
++                      p->genfs = newgenfs;
++              buf = next_entry(fp, sizeof(u32));
++              if (!buf)
++                      goto bad;
++              nel2 = le32_to_cpu(buf[0]);
++              for (j = 0; j < nel2; j++) {
++                      newc = kmalloc(sizeof(*newc), GFP_KERNEL);
++                      if (!newc) {
++                              rc = -ENOMEM;
++                              goto bad;
++                      }
++                      memset(newc, 0, sizeof(*newc));
++                      buf = next_entry(fp, sizeof(u32));
++                      if (!buf)
++                              goto bad;
++                      len = le32_to_cpu(buf[0]);
++                      buf = next_entry(fp, len);
++                      if (!buf)
++                              goto bad;
++                      newc->u.name = kmalloc(len + 1,GFP_KERNEL);
++                      if (!newc->u.name) {
++                              rc = -ENOMEM;
++                              goto bad;
++                      }
++                      memcpy(newc->u.name, buf, len);
++                      newc->u.name[len] = 0;
++                      buf = next_entry(fp, sizeof(u32));
++                      if (!buf)
++                              goto bad;
++                      newc->v.sclass = le32_to_cpu(buf[0]);
++                      if (context_read_and_validate(&newc->context[0], p, fp))
++                              goto bad;
++                      for (l = NULL, c = newgenfs->head; c;
++                           l = c, c = c->next) {
++                              if (!strcmp(newc->u.name, c->u.name) &&
++                                  (!c->v.sclass || !newc->v.sclass ||
++                                   newc->v.sclass == c->v.sclass)) {
++                                      printk(KERN_ERR "security:  dup genfs "
++                                             "entry (%s,%s)\n",
++                                             newgenfs->fstype, c->u.name);
++                                      goto bad;
++                              }
++                              len = strlen(newc->u.name);
++                              len2 = strlen(c->u.name);
++                              if (len > len2)
++                                      break;
++                      }
++                      newc->next = c;
++                      if (l)
++                              l->next = newc;
++                      else
++                              newgenfs->head = newc;
++              }
++      }
++
++      rc = mls_read_trusted(p, fp);
++      if (rc)
++              goto bad;
++out:
++      return rc;
++bad:
++      policydb_destroy(p);
++      goto out;
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/policydb.h  2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,256 @@
++/*
++ * A policy database (policydb) specifies the
++ * configuration data for the security policy.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_POLICYDB_H_
++#define _SS_POLICYDB_H_
++
++#include "symtab.h"
++#include "avtab.h"
++#include "sidtab.h"
++#include "context.h"
++#include "constraint.h"
++
++/*
++ * A datum type is defined for each kind of symbol
++ * in the configuration data:  individual permissions,
++ * common prefixes for access vectors, classes,
++ * users, roles, types, sensitivities, categories, etc.
++ */
++
++/* Permission attributes */
++struct perm_datum {
++      u32 value;              /* permission bit + 1 */
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++#define MLS_BASE_READ    1    /* MLS base permission `read' */
++#define MLS_BASE_WRITE   2    /* MLS base permission `write' */
++#define MLS_BASE_READBY  4    /* MLS base permission `readby' */
++#define MLS_BASE_WRITEBY 8    /* MLS base permission `writeby' */
++      u32 base_perms;         /* MLS base permission mask */
++#endif
++};
++
++/* Attributes of a common prefix for access vectors */
++struct common_datum {
++      u32 value;                      /* internal common value */
++      struct symtab permissions;      /* common permissions */
++};
++
++/* Class attributes */
++struct class_datum {
++      u32 value;                      /* class value */
++      char *comkey;                   /* common name */
++      struct common_datum *comdatum;  /* common datum */
++      struct symtab permissions;      /* class-specific permission symbol table */
++      struct constraint_node *constraints;    /* constraints on class permissions */
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++      struct mls_perms mlsperms;      /* MLS base permission masks */
++#endif
++};
++
++/* Role attributes */
++struct role_datum {
++      u32 value;                      /* internal role value */
++      struct ebitmap dominates;       /* set of roles dominated by this role */
++      struct ebitmap types;           /* set of authorized types for role */
++};
++
++struct role_trans {
++      u32 role;               /* current role */
++      u32 type;               /* program executable type */
++      u32 new_role;           /* new role */
++      struct role_trans *next;
++};
++
++struct role_allow {
++      u32 role;               /* current role */
++      u32 new_role;           /* new role */
++      struct role_allow *next;
++};
++
++/* Type attributes */
++struct type_datum {
++      u32 value;              /* internal type value */
++      unsigned char primary;  /* primary name? */
++};
++
++/* User attributes */
++struct user_datum {
++      u32 value;                      /* internal user value */
++      struct ebitmap roles;           /* set of authorized roles for user */
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++      struct mls_range_list *ranges;  /* list of authorized MLS ranges for user */
++#endif
++};
++
++
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++/* Sensitivity attributes */
++struct level_datum {
++      struct mls_level *level;        /* sensitivity and associated categories */
++      unsigned char isalias;  /* is this sensitivity an alias for another? */
++};
++
++/* Category attributes */
++struct cat_datum {
++      u32 value;              /* internal category bit + 1 */
++      unsigned char isalias;  /* is this category an alias for another? */
++};
++#endif
++
++
++/*
++ * The configuration data includes security contexts for
++ * initial SIDs, unlabeled file systems, TCP and UDP port numbers,
++ * network interfaces, and nodes.  This structure stores the
++ * relevant data for one such entry.  Entries of the same kind
++ * (e.g. all initial SIDs) are linked together into a list.
++ */
++struct ocontext {
++      union {
++              char *name;     /* name of initial SID, fs, netif, fstype, path */
++              struct {
++                      u8 protocol;
++                      u16 low_port;
++                      u16 high_port;
++              } port;         /* TCP or UDP port information */
++              struct {
++                      u32 addr;
++                      u32 mask;
++              } node;         /* node information */
++      } u;
++      union {
++              u32 sclass;  /* security class for genfs */
++              u32 behavior;  /* labeling behavior for fs_use */
++      } v;
++      struct context context[2];      /* security context(s) */
++      u32 sid[2];     /* SID(s) */
++      struct ocontext *next;
++};
++
++struct genfs {
++      char *fstype;
++      struct ocontext *head;
++      struct genfs *next;
++};
++
++/* symbol table array indices */
++#define SYM_COMMONS 0
++#define SYM_CLASSES 1
++#define SYM_ROLES   2
++#define SYM_TYPES   3
++#define SYM_USERS   4
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++#define SYM_LEVELS  5
++#define SYM_CATS    6
++#define SYM_NUM     7
++#else
++#define SYM_NUM     5
++#endif
++
++/* object context array indices */
++#define OCON_ISID  0  /* initial SIDs */
++#define OCON_FS    1  /* unlabeled file systems */
++#define OCON_PORT  2  /* TCP and UDP port numbers */
++#define OCON_NETIF 3  /* network interfaces */
++#define OCON_NODE  4  /* nodes */
++#define OCON_FSUSE 5  /* fs_use */
++#define OCON_NUM   6
++
++/* The policy database */
++struct policydb {
++      /* symbol tables */
++      struct symtab symtab[SYM_NUM];
++#define p_commons symtab[SYM_COMMONS]
++#define p_classes symtab[SYM_CLASSES]
++#define p_roles symtab[SYM_ROLES]
++#define p_types symtab[SYM_TYPES]
++#define p_users symtab[SYM_USERS]
++#define p_levels symtab[SYM_LEVELS]
++#define p_cats symtab[SYM_CATS]
++
++      /* symbol names indexed by (value - 1) */
++      char **sym_val_to_name[SYM_NUM];
++#define p_common_val_to_name sym_val_to_name[SYM_COMMONS]
++#define p_class_val_to_name sym_val_to_name[SYM_CLASSES]
++#define p_role_val_to_name sym_val_to_name[SYM_ROLES]
++#define p_type_val_to_name sym_val_to_name[SYM_TYPES]
++#define p_user_val_to_name sym_val_to_name[SYM_USERS]
++#define p_sens_val_to_name sym_val_to_name[SYM_LEVELS]
++#define p_cat_val_to_name sym_val_to_name[SYM_CATS]
++
++      /* class, role, and user attributes indexed by (value - 1) */
++      struct class_datum **class_val_to_struct;
++      struct role_datum **role_val_to_struct;
++      struct user_datum **user_val_to_struct;
++
++      /* type enforcement access vectors and transitions */
++      struct avtab te_avtab;
++
++      /* role transitions */
++      struct role_trans *role_tr;
++
++      /* role allows */
++      struct role_allow *role_allow;
++
++      /* security contexts of initial SIDs, unlabeled file systems,
++         TCP or UDP port numbers, network interfaces and nodes */
++      struct ocontext *ocontexts[OCON_NUM];
++
++        /* security contexts for files in filesystems that cannot support
++         a persistent label mapping or use another
++         fixed labeling behavior. */
++      struct genfs *genfs;
++
++#ifdef CONFIG_SECURITY_SELINUX_MLS
++      /* number of legitimate MLS levels */
++      u32 nlevels;
++
++      struct ebitmap trustedreaders;
++      struct ebitmap trustedwriters;
++      struct ebitmap trustedobjects;
++#endif
++};
++
++extern int policydb_init(struct policydb *p);
++extern int policydb_index_classes(struct policydb *p);
++extern int policydb_index_others(struct policydb *p);
++extern int constraint_expr_destroy(struct constraint_expr *expr);
++extern void policydb_destroy(struct policydb *p);
++extern int policydb_load_isids(struct policydb *p, struct sidtab *s);
++extern int policydb_context_isvalid(struct policydb *p, struct context *c);
++extern int policydb_read(struct policydb *p, void *fp);
++
++#define PERM_SYMTAB_SIZE 32
++
++#define POLICYDB_VERSION 15
++#define POLICYDB_CONFIG_MLS    1
++
++#define OBJECT_R "object_r"
++#define OBJECT_R_VAL 1
++
++#define POLICYDB_MAGIC SELINUX_MAGIC
++#define POLICYDB_STRING "SE Linux"
++
++struct policy_file {
++      char *data;
++      size_t len;
++};
++
++static inline void *next_entry(struct policy_file *fp, size_t bytes)
++{
++      void *buf;
++
++      if (bytes > fp->len)
++              return NULL;
++
++      buf = fp->data;
++      fp->data += bytes;
++      fp->len -= bytes;
++      return buf;
++}
++
++#endif        /* _SS_POLICYDB_H_ */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/services.c  2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,1413 @@
++/*
++ * Implementation of the security services.
++ *
++ * Authors : Stephen Smalley, <sds@epoch.ncsc.mil>
++ *           James Morris <jmorris@redhat.com>
++ *
++ *  Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
++ *
++ *    This program is free software; you can redistribute it and/or modify
++ *    it under the terms of the GNU General Public License version 2,
++ *      as published by the Free Software Foundation.
++ */
++#include "context.h"
++#include "policydb.h"
++#include "sidtab.h"
++#include "services.h"
++#include "mls.h"
++
++static rwlock_t policy_rwlock = RW_LOCK_UNLOCKED;
++#define POLICY_RDLOCK read_lock(&policy_rwlock)
++#define POLICY_WRLOCK write_lock_irq(&policy_rwlock)
++#define POLICY_RDUNLOCK read_unlock(&policy_rwlock)
++#define POLICY_WRUNLOCK write_unlock_irq(&policy_rwlock)
++
++static DECLARE_MUTEX(load_sem);
++#define LOAD_LOCK down(&load_sem)
++#define LOAD_UNLOCK up(&load_sem)
++
++struct sidtab sidtab;
++struct policydb policydb;
++int ss_initialized = 0;
++
++/*
++ * The largest sequence number that has been used when
++ * providing an access decision to the access vector cache.
++ * The sequence number only changes when a policy change
++ * occurs.
++ */
++static u32 latest_granting = 0;
++
++/*
++ * Return the boolean value of a constraint expression
++ * when it is applied to the specified source and target
++ * security contexts.
++ */
++static int constraint_expr_eval(struct context *scontext,
++                              struct context *tcontext,
++                              struct constraint_expr *cexpr)
++{
++      u32 val1, val2;
++      struct context *c;
++      struct role_datum *r1, *r2;
++      struct constraint_expr *e;
++      int s[CEXPR_MAXDEPTH];
++      int sp = -1;
++
++      for (e = cexpr; e; e = e->next) {
++              switch (e->expr_type) {
++              case CEXPR_NOT:
++                      BUG_ON(sp < 0);
++                      s[sp] = !s[sp];
++                      break;
++              case CEXPR_AND:
++                      BUG_ON(sp < 1);
++                      sp--;
++                      s[sp] &= s[sp+1];
++                      break;
++              case CEXPR_OR:
++                      BUG_ON(sp < 1);
++                      sp--;
++                      s[sp] |= s[sp+1];
++                      break;
++              case CEXPR_ATTR:
++                      if (sp == (CEXPR_MAXDEPTH-1))
++                              return 0;
++                      switch (e->attr) {
++                      case CEXPR_USER:
++                              val1 = scontext->user;
++                              val2 = tcontext->user;
++                              break;
++                      case CEXPR_TYPE:
++                              val1 = scontext->type;
++                              val2 = tcontext->type;
++                              break;
++                      case CEXPR_ROLE:
++                              val1 = scontext->role;
++                              val2 = tcontext->role;
++                              r1 = policydb.role_val_to_struct[val1 - 1];
++                              r2 = policydb.role_val_to_struct[val2 - 1];
++                              switch (e->op) {
++                              case CEXPR_DOM:
++                                      s[++sp] = ebitmap_get_bit(&r1->dominates,
++                                                                val2 - 1);
++                                      continue;
++                              case CEXPR_DOMBY:
++                                      s[++sp] = ebitmap_get_bit(&r2->dominates,
++                                                                val1 - 1);
++                                      continue;
++                              case CEXPR_INCOMP:
++                                      s[++sp] = ( !ebitmap_get_bit(&r1->dominates,
++                                                                   val2 - 1) &&
++                                                  !ebitmap_get_bit(&r2->dominates,
++                                                                   val1 - 1) );
++                                      continue;
++                              default:
++                                      break;
++                              }
++                              break;
++                      default:
++                              BUG();
++                              return 0;
++                      }
++
++                      switch (e->op) {
++                      case CEXPR_EQ:
++                              s[++sp] = (val1 == val2);
++                              break;
++                      case CEXPR_NEQ:
++                              s[++sp] = (val1 != val2);
++                              break;
++                      default:
++                              BUG();
++                              return 0;
++                      }
++                      break;
++              case CEXPR_NAMES:
++                      if (sp == (CEXPR_MAXDEPTH-1))
++                              return 0;
++                      c = scontext;
++                      if (e->attr & CEXPR_TARGET)
++                              c = tcontext;
++                      if (e->attr & CEXPR_USER)
++                              val1 = c->user;
++                      else if (e->attr & CEXPR_ROLE)
++                              val1 = c->role;
++                      else if (e->attr & CEXPR_TYPE)
++                              val1 = c->type;
++                      else {
++                              BUG();
++                              return 0;
++                      }
++
++                      switch (e->op) {
++                      case CEXPR_EQ:
++                              s[++sp] = ebitmap_get_bit(&e->names, val1 - 1);
++                              break;
++                      case CEXPR_NEQ:
++                              s[++sp] = !ebitmap_get_bit(&e->names, val1 - 1);
++                              break;
++                      default:
++                              BUG();
++                              return 0;
++                      }
++                      break;
++              default:
++                      BUG();
++                      return 0;
++              }
++      }
++
++      BUG_ON(sp != 0);
++      return s[0];
++}
++
++/*
++ * Compute access vectors based on a context structure pair for
++ * the permissions in a particular class.
++ */
++static int context_struct_compute_av(struct context *scontext,
++                                   struct context *tcontext,
++                                   u16 tclass,
++                                   u32 requested,
++                                   struct av_decision *avd)
++{
++      struct constraint_node *constraint;
++      struct role_allow *ra;
++      struct avtab_key avkey;
++      struct avtab_datum *avdatum;
++      struct class_datum *tclass_datum;
++
++      if (!tclass || tclass > policydb.p_classes.nprim) {
++              printk(KERN_ERR "security_compute_av:  unrecognized class %d\n",
++                     tclass);
++              return -EINVAL;
++      }
++      tclass_datum = policydb.class_val_to_struct[tclass - 1];
++
++      /*
++       * Initialize the access vectors to the default values.
++       */
++      avd->allowed = 0;
++      avd->decided = 0xffffffff;
++      avd->auditallow = 0;
++      avd->auditdeny = 0xffffffff;
++      avd->seqno = latest_granting;
++
++      /*
++       * If a specific type enforcement rule was defined for
++       * this permission check, then use it.
++       */
++      avkey.source_type = scontext->type;
++      avkey.target_type = tcontext->type;
++      avkey.target_class = tclass;
++      avdatum = avtab_search(&policydb.te_avtab, &avkey, AVTAB_AV);
++      if (avdatum) {
++              if (avdatum->specified & AVTAB_ALLOWED)
++                      avd->allowed = avtab_allowed(avdatum);
++              if (avdatum->specified & AVTAB_AUDITDENY)
++                      avd->auditdeny = avtab_auditdeny(avdatum);
++              if (avdatum->specified & AVTAB_AUDITALLOW)
++                      avd->auditallow = avtab_auditallow(avdatum);
++      }
++
++      /*
++       * Remove any permissions prohibited by the MLS policy.
++       */
++      mls_compute_av(scontext, tcontext, tclass_datum, &avd->allowed);
++
++      /*
++       * Remove any permissions prohibited by a constraint.
++       */
++      constraint = tclass_datum->constraints;
++      while (constraint) {
++              if ((constraint->permissions & (avd->allowed)) &&
++                  !constraint_expr_eval(scontext, tcontext,
++                                        constraint->expr)) {
++                      avd->allowed = (avd->allowed) & ~(constraint->permissions);
++              }
++              constraint = constraint->next;
++      }
++
++      /*
++       * If checking process transition permission and the
++       * role is changing, then check the (current_role, new_role)
++       * pair.
++       */
++      if (tclass == SECCLASS_PROCESS &&
++          avd->allowed && PROCESS__TRANSITION &&
++          scontext->role != tcontext->role) {
++              for (ra = policydb.role_allow; ra; ra = ra->next) {
++                      if (scontext->role == ra->role &&
++                          tcontext->role == ra->new_role)
++                              break;
++              }
++              if (!ra)
++                      avd->allowed = (avd->allowed) & ~(PROCESS__TRANSITION);
++      }
++
++      return 0;
++}
++
++/**
++ * security_compute_av - Compute access vector decisions.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @requested: requested permissions
++ * @avd: access vector decisions
++ *
++ * Compute a set of access vector decisions based on the
++ * SID pair (@ssid, @tsid) for the permissions in @tclass.
++ * Return -%EINVAL if any of the parameters are invalid or %0
++ * if the access vector decisions were computed successfully.
++ */
++int security_compute_av(u32 ssid,
++                      u32 tsid,
++                      u16 tclass,
++                      u32 requested,
++                      struct av_decision *avd)
++{
++      struct context *scontext = 0, *tcontext = 0;
++      int rc = 0;
++
++      if (!ss_initialized) {
++              avd->allowed = requested;
++              avd->decided = requested;
++              avd->auditallow = 0;
++              avd->auditdeny = 0xffffffff;
++              avd->seqno = latest_granting;
++              return 0;
++      }
++
++      POLICY_RDLOCK;
++
++      scontext = sidtab_search(&sidtab, ssid);
++      if (!scontext) {
++              printk(KERN_ERR "security_compute_av:  unrecognized SID %d\n",
++                     ssid);
++              rc = -EINVAL;
++              goto out;
++      }
++      tcontext = sidtab_search(&sidtab, tsid);
++      if (!tcontext) {
++              printk(KERN_ERR "security_compute_av:  unrecognized SID %d\n",
++                     tsid);
++              rc = -EINVAL;
++              goto out;
++      }
++
++      rc = context_struct_compute_av(scontext, tcontext, tclass,
++                                     requested, avd);
++out:
++      POLICY_RDUNLOCK;
++      return rc;
++}
++
++/*
++ * Write the security context string representation of
++ * the context structure `context' into a dynamically
++ * allocated string of the correct size.  Set `*scontext'
++ * to point to this string and set `*scontext_len' to
++ * the length of the string.
++ */
++int context_struct_to_string(struct context *context, char **scontext, u32 *scontext_len)
++{
++      char *scontextp;
++
++      *scontext = 0;
++      *scontext_len = 0;
++
++      /* Compute the size of the context. */
++      *scontext_len += strlen(policydb.p_user_val_to_name[context->user - 1]) + 1;
++      *scontext_len += strlen(policydb.p_role_val_to_name[context->role - 1]) + 1;
++      *scontext_len += strlen(policydb.p_type_val_to_name[context->type - 1]) + 1;
++      *scontext_len += mls_compute_context_len(context);
++
++      /* Allocate space for the context; caller must free this space. */
++      scontextp = kmalloc(*scontext_len+1,GFP_ATOMIC);
++      if (!scontextp) {
++              return -ENOMEM;
++      }
++      *scontext = scontextp;
++
++      /*
++       * Copy the user name, role name and type name into the context.
++       */
++      sprintf(scontextp, "%s:%s:%s:",
++              policydb.p_user_val_to_name[context->user - 1],
++              policydb.p_role_val_to_name[context->role - 1],
++              policydb.p_type_val_to_name[context->type - 1]);
++      scontextp += strlen(policydb.p_user_val_to_name[context->user - 1]) +
++                   1 + strlen(policydb.p_role_val_to_name[context->role - 1]) +
++                   1 + strlen(policydb.p_type_val_to_name[context->type - 1]) + 1;
++
++      mls_sid_to_context(context, &scontextp);
++
++      scontextp--;
++      *scontextp = 0;
++
++      return 0;
++}
++
++#include "initial_sid_to_string.h"
++
++/**
++ * security_sid_to_context - Obtain a context for a given SID.
++ * @sid: security identifier, SID
++ * @scontext: security context
++ * @scontext_len: length in bytes
++ *
++ * Write the string representation of the context associated with @sid
++ * into a dynamically allocated string of the correct size.  Set @scontext
++ * to point to this string and set @scontext_len to the length of the string.
++ */
++int security_sid_to_context(u32 sid, char **scontext, u32 *scontext_len)
++{
++      struct context *context;
++      int rc = 0;
++
++      if (!ss_initialized) {
++              if (sid <= SECINITSID_NUM) {
++                      char *scontextp;
++
++                      *scontext_len = strlen(initial_sid_to_string[sid]) + 1;
++                      scontextp = kmalloc(*scontext_len,GFP_KERNEL);
++                      strcpy(scontextp, initial_sid_to_string[sid]);
++                      *scontext = scontextp;
++                      goto out;
++              }
++              printk(KERN_ERR "security_sid_to_context:  called before initial "
++                     "load_policy on unknown SID %d\n", sid);
++              rc = -EINVAL;
++              goto out;
++      }
++      POLICY_RDLOCK;
++      context = sidtab_search(&sidtab, sid);
++      if (!context) {
++              printk(KERN_ERR "security_sid_to_context:  unrecognized SID "
++                     "%d\n", sid);
++              rc = -EINVAL;
++              goto out_unlock;
++      }
++      rc = context_struct_to_string(context, scontext, scontext_len);
++out_unlock:
++      POLICY_RDUNLOCK;
++out:
++      return rc;
++
++}
++
++/**
++ * security_context_to_sid - Obtain a SID for a given security context.
++ * @scontext: security context
++ * @scontext_len: length in bytes
++ * @sid: security identifier, SID
++ *
++ * Obtains a SID associated with the security context that
++ * has the string representation specified by @scontext.
++ * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient
++ * memory is available, or 0 on success.
++ */
++int security_context_to_sid(char *scontext, u32 scontext_len, u32 *sid)
++{
++      char *scontext2;
++      struct context context;
++      struct role_datum *role;
++      struct type_datum *typdatum;
++      struct user_datum *usrdatum;
++      char *scontextp, *p, oldc;
++      int rc = 0;
++
++      if (!ss_initialized) {
++              int i;
++
++              for (i = 1; i < SECINITSID_NUM; i++) {
++                      if (!strcmp(initial_sid_to_string[i], scontext)) {
++                              *sid = i;
++                              goto out;
++                      }
++              }
++              printk(KERN_ERR "security_context_to_sid: called before "
++                     "initial load_policy on unknown context %s\n", scontext);
++              rc = -EINVAL;
++              goto out;
++      }
++      *sid = SECSID_NULL;
++
++      /* Copy the string so that we can modify the copy as we parse it.
++         The string should already by null terminated, but we append a
++         null suffix to the copy to avoid problems with the existing
++         attr package, which doesn't view the null terminator as part
++         of the attribute value. */
++      scontext2 = kmalloc(scontext_len+1,GFP_KERNEL);
++      if (!scontext2) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      memcpy(scontext2, scontext, scontext_len);
++      scontext2[scontext_len] = 0;
++
++      context_init(&context);
++      *sid = SECSID_NULL;
++
++      POLICY_RDLOCK;
++
++      /* Parse the security context. */
++
++      rc = -EINVAL;
++      scontextp = (char *) scontext2;
++
++      /* Extract the user. */
++      p = scontextp;
++      while (*p && *p != ':')
++              p++;
++
++      if (*p == 0)
++              goto out_unlock;
++
++      *p++ = 0;
++
++      usrdatum = hashtab_search(policydb.p_users.table, scontextp);
++      if (!usrdatum)
++              goto out_unlock;
++
++      context.user = usrdatum->value;
++
++      /* Extract role. */
++      scontextp = p;
++      while (*p && *p != ':')
++              p++;
++
++      if (*p == 0)
++              goto out_unlock;
++
++      *p++ = 0;
++
++      role = hashtab_search(policydb.p_roles.table, scontextp);
++      if (!role)
++              goto out_unlock;
++      context.role = role->value;
++
++      /* Extract type. */
++      scontextp = p;
++      while (*p && *p != ':')
++              p++;
++      oldc = *p;
++      *p++ = 0;
++
++      typdatum = hashtab_search(policydb.p_types.table, scontextp);
++      if (!typdatum)
++              goto out_unlock;
++
++      context.type = typdatum->value;
++
++      rc = mls_context_to_sid(oldc, &p, &context);
++      if (rc)
++              goto out_unlock;
++
++      /* Check the validity of the new context. */
++      if (!policydb_context_isvalid(&policydb, &context)) {
++              rc = -EINVAL;
++              goto out_unlock;
++      }
++      /* Obtain the new sid. */
++      rc = sidtab_context_to_sid(&sidtab, &context, sid);
++out_unlock:
++      POLICY_RDUNLOCK;
++      context_destroy(&context);
++      kfree(scontext2);
++out:
++      return rc;
++}
++
++static inline int compute_sid_handle_invalid_context(
++      struct context *scontext,
++      struct context *tcontext,
++      u16 tclass,
++      struct context *newcontext)
++{
++      int rc = 0;
++
++      if (selinux_enforcing) {
++              rc = -EACCES;
++      } else {
++              char *s, *t, *n;
++              u32 slen, tlen, nlen;
++
++              context_struct_to_string(scontext, &s, &slen);
++              context_struct_to_string(tcontext, &t, &tlen);
++              context_struct_to_string(newcontext, &n, &nlen);
++              printk(KERN_ERR "security_compute_sid:  invalid context %s", n);
++              printk(" for scontext=%s", s);
++              printk(" tcontext=%s", t);
++              printk(" tclass=%s\n", policydb.p_class_val_to_name[tclass-1]);
++              kfree(s);
++              kfree(t);
++              kfree(n);
++      }
++      return rc;
++}
++
++static int security_compute_sid(u32 ssid,
++                              u32 tsid,
++                              u16 tclass,
++                              u32 specified,
++                              u32 *out_sid)
++{
++      struct context *scontext = 0, *tcontext = 0, newcontext;
++      struct role_trans *roletr = 0;
++      struct avtab_key avkey;
++      struct avtab_datum *avdatum;
++      unsigned int type_change = 0;
++      int rc = 0;
++
++      if (!ss_initialized) {
++              switch (tclass) {
++              case SECCLASS_PROCESS:
++                      *out_sid = ssid;
++                      break;
++              default:
++                      *out_sid = tsid;
++                      break;
++              }
++              goto out;
++      }
++
++      POLICY_RDLOCK;
++
++      scontext = sidtab_search(&sidtab, ssid);
++      if (!scontext) {
++              printk(KERN_ERR "security_compute_sid:  unrecognized SID %d\n",
++                     ssid);
++              rc = -EINVAL;
++              goto out_unlock;
++      }
++      tcontext = sidtab_search(&sidtab, tsid);
++      if (!tcontext) {
++              printk(KERN_ERR "security_compute_sid:  unrecognized SID %d\n",
++                     tsid);
++              rc = -EINVAL;
++              goto out_unlock;
++      }
++
++      context_init(&newcontext);
++
++      /* Set the user identity. */
++      switch (specified) {
++      case AVTAB_TRANSITION:
++      case AVTAB_CHANGE:
++              /* Use the process user identity. */
++              newcontext.user = scontext->user;
++              break;
++      case AVTAB_MEMBER:
++              /* Use the related object owner. */
++              newcontext.user = tcontext->user;
++              break;
++      }
++
++      /* Set the role and type to default values. */
++      switch (tclass) {
++      case SECCLASS_PROCESS:
++              /* Use the current role and type of process. */
++              newcontext.role = scontext->role;
++              newcontext.type = scontext->type;
++              break;
++      default:
++              /* Use the well-defined object role. */
++              newcontext.role = OBJECT_R_VAL;
++              /* Use the type of the related object. */
++              newcontext.type = tcontext->type;
++      }
++
++      /* Look for a type transition/member/change rule. */
++      avkey.source_type = scontext->type;
++      avkey.target_type = tcontext->type;
++      avkey.target_class = tclass;
++      avdatum = avtab_search(&policydb.te_avtab, &avkey, AVTAB_TYPE);
++      type_change = (avdatum && (avdatum->specified & specified));
++      if (type_change) {
++              /* Use the type from the type transition/member/change rule. */
++              switch (specified) {
++              case AVTAB_TRANSITION:
++                      newcontext.type = avtab_transition(avdatum);
++                      break;
++              case AVTAB_MEMBER:
++                      newcontext.type = avtab_member(avdatum);
++                      break;
++              case AVTAB_CHANGE:
++                      newcontext.type = avtab_change(avdatum);
++                      break;
++              }
++      }
++
++      /* Check for class-specific changes. */
++      switch (tclass) {
++      case SECCLASS_PROCESS:
++              if (specified & AVTAB_TRANSITION) {
++                      /* Look for a role transition rule. */
++                      for (roletr = policydb.role_tr; roletr;
++                           roletr = roletr->next) {
++                              if (roletr->role == scontext->role &&
++                                  roletr->type == tcontext->type) {
++                                      /* Use the role transition rule. */
++                                      newcontext.role = roletr->new_role;
++                                      break;
++                              }
++                      }
++              }
++
++              if (!type_change && !roletr) {
++                      /* No change in process role or type. */
++                      *out_sid = ssid;
++                      goto out_unlock;
++
++              }
++              break;
++      default:
++              if (!type_change &&
++                  (newcontext.user == tcontext->user) &&
++                  mls_context_cmp(scontext, tcontext)) {
++                        /* No change in object type, owner,
++                         or MLS attributes. */
++                      *out_sid = tsid;
++                      goto out_unlock;
++              }
++              break;
++      }
++
++      /* Set the MLS attributes.
++         This is done last because it may allocate memory. */
++      rc = mls_compute_sid(scontext, tcontext, tclass, specified, &newcontext);
++      if (rc)
++              goto out_unlock;
++
++      /* Check the validity of the context. */
++      if (!policydb_context_isvalid(&policydb, &newcontext)) {
++              rc = compute_sid_handle_invalid_context(scontext,
++                                                      tcontext,
++                                                      tclass,
++                                                      &newcontext);
++              if (rc)
++                      goto out_unlock;
++      }
++      /* Obtain the sid for the context. */
++      rc = sidtab_context_to_sid(&sidtab, &newcontext, out_sid);
++out_unlock:
++      POLICY_RDUNLOCK;
++      context_destroy(&newcontext);
++out:
++      return rc;
++}
++
++/**
++ * security_transition_sid - Compute the SID for a new subject/object.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @out_sid: security identifier for new subject/object
++ *
++ * Compute a SID to use for labeling a new subject or object in the
++ * class @tclass based on a SID pair (@ssid, @tsid).
++ * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
++ * if insufficient memory is available, or %0 if the new SID was
++ * computed successfully.
++ */
++int security_transition_sid(u32 ssid,
++                          u32 tsid,
++                          u16 tclass,
++                          u32 *out_sid)
++{
++      return security_compute_sid(ssid, tsid, tclass, AVTAB_TRANSITION, out_sid);
++}
++
++/**
++ * security_member_sid - Compute the SID for member selection.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @out_sid: security identifier for selected member
++ *
++ * Compute a SID to use when selecting a member of a polyinstantiated
++ * object of class @tclass based on a SID pair (@ssid, @tsid).
++ * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
++ * if insufficient memory is available, or %0 if the SID was
++ * computed successfully.
++ */
++int security_member_sid(u32 ssid,
++                      u32 tsid,
++                      u16 tclass,
++                      u32 *out_sid)
++{
++      return security_compute_sid(ssid, tsid, tclass, AVTAB_MEMBER, out_sid);
++}
++
++/**
++ * security_change_sid - Compute the SID for object relabeling.
++ * @ssid: source security identifier
++ * @tsid: target security identifier
++ * @tclass: target security class
++ * @out_sid: security identifier for selected member
++ *
++ * Compute a SID to use for relabeling an object of class @tclass
++ * based on a SID pair (@ssid, @tsid).
++ * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
++ * if insufficient memory is available, or %0 if the SID was
++ * computed successfully.
++ */
++int security_change_sid(u32 ssid,
++                      u32 tsid,
++                      u16 tclass,
++                      u32 *out_sid)
++{
++      return security_compute_sid(ssid, tsid, tclass, AVTAB_CHANGE, out_sid);
++}
++
++/*
++ * Verify that each permission that is defined under the
++ * existing policy is still defined with the same value
++ * in the new policy.
++ */
++static int validate_perm(void *key, void *datum, void *p)
++{
++      struct hashtab *h;
++      struct perm_datum *perdatum, *perdatum2;
++      int rc = 0;
++
++
++      h = p;
++      perdatum = datum;
++
++      perdatum2 = hashtab_search(h, key);
++      if (!perdatum2) {
++              printk(KERN_ERR "security:  permission %s disappeared",
++                     (char *)key);
++              rc = -ENOENT;
++              goto out;
++      }
++      if (perdatum->value != perdatum2->value) {
++              printk(KERN_ERR "security:  the value of permission %s changed",
++                     (char *)key);
++              rc = -EINVAL;
++      }
++out:
++      return rc;
++}
++
++/*
++ * Verify that each class that is defined under the
++ * existing policy is still defined with the same
++ * attributes in the new policy.
++ */
++static int validate_class(void *key, void *datum, void *p)
++{
++      struct policydb *newp;
++      struct class_datum *cladatum, *cladatum2;
++      int rc;
++
++      newp = p;
++      cladatum = datum;
++
++      cladatum2 = hashtab_search(newp->p_classes.table, key);
++      if (!cladatum2) {
++              printk(KERN_ERR "security:  class %s disappeared\n",
++                     (char *)key);
++              rc = -ENOENT;
++              goto out;
++      }
++      if (cladatum->value != cladatum2->value) {
++              printk(KERN_ERR "security:  the value of class %s changed\n",
++                     (char *)key);
++              rc = -EINVAL;
++              goto out;
++      }
++      if ((cladatum->comdatum && !cladatum2->comdatum) ||
++          (!cladatum->comdatum && cladatum2->comdatum)) {
++              printk(KERN_ERR "security:  the inherits clause for the access "
++                     "vector definition for class %s changed\n", (char *)key);
++              rc = -EINVAL;
++              goto out;
++      }
++      if (cladatum->comdatum) {
++              rc = hashtab_map(cladatum->comdatum->permissions.table, validate_perm,
++                               cladatum2->comdatum->permissions.table);
++              if (rc) {
++                      printk(" in the access vector definition for class "
++                             "%s\n", (char *)key);
++                      goto out;
++              }
++      }
++      rc = hashtab_map(cladatum->permissions.table, validate_perm,
++                       cladatum2->permissions.table);
++      if (rc)
++              printk(" in access vector definition for class %s\n",
++                     (char *)key);
++out:
++      return rc;
++}
++
++/* Clone the SID into the new SID table. */
++static int clone_sid(u32 sid,
++                   struct context *context,
++                   void *arg)
++{
++      struct sidtab *s = arg;
++
++      return sidtab_insert(s, sid, context);
++}
++
++static inline int convert_context_handle_invalid_context(struct context *context)
++{
++      int rc = 0;
++
++      if (selinux_enforcing) {
++              rc = -EINVAL;
++      } else {
++              char *s;
++              u32 len;
++
++              context_struct_to_string(context, &s, &len);
++              printk(KERN_ERR "security:  context %s is invalid\n", s);
++              kfree(s);
++      }
++      return rc;
++}
++
++struct convert_context_args {
++      struct policydb *oldp;
++      struct policydb *newp;
++};
++
++/*
++ * Convert the values in the security context
++ * structure `c' from the values specified
++ * in the policy `p->oldp' to the values specified
++ * in the policy `p->newp'.  Verify that the
++ * context is valid under the new policy.
++ */
++static int convert_context(u32 key,
++                         struct context *c,
++                         void *p)
++{
++      struct convert_context_args *args;
++      struct context oldc;
++      struct role_datum *role;
++      struct type_datum *typdatum;
++      struct user_datum *usrdatum;
++      char *s;
++      u32 len;
++      int rc = -EINVAL;
++
++      args = p;
++
++      rc = context_cpy(&oldc, c);
++      if (rc)
++              goto out;
++
++      /* Convert the user. */
++      usrdatum = hashtab_search(args->newp->p_users.table,
++                                args->oldp->p_user_val_to_name[c->user - 1]);
++      if (!usrdatum) {
++              goto bad;
++      }
++      c->user = usrdatum->value;
++
++      /* Convert the role. */
++      role = hashtab_search(args->newp->p_roles.table,
++                            args->oldp->p_role_val_to_name[c->role - 1]);
++      if (!role) {
++              goto bad;
++      }
++      c->role = role->value;
++
++      /* Convert the type. */
++      typdatum = hashtab_search(args->newp->p_types.table,
++                                args->oldp->p_type_val_to_name[c->type - 1]);
++      if (!typdatum) {
++              goto bad;
++      }
++      c->type = typdatum->value;
++
++      rc = mls_convert_context(args->oldp, args->newp, c);
++      if (rc)
++              goto bad;
++
++      /* Check the validity of the new context. */
++      if (!policydb_context_isvalid(args->newp, c)) {
++              rc = convert_context_handle_invalid_context(&oldc);
++              if (rc)
++                      goto bad;
++      }
++
++      context_destroy(&oldc);
++out:
++      return rc;
++bad:
++      context_struct_to_string(&oldc, &s, &len);
++      context_destroy(&oldc);
++      printk(KERN_ERR "security:  invalidating context %s\n", s);
++      kfree(s);
++      goto out;
++}
++
++extern void selinux_complete_init(void);
++
++/**
++ * security_load_policy - Load a security policy configuration.
++ * @data: binary policy data
++ * @len: length of data in bytes
++ *
++ * Load a new set of security policy configuration data,
++ * validate it and convert the SID table as necessary.
++ * This function will flush the access vector cache after
++ * loading the new policy.
++ */
++int security_load_policy(void *data, size_t len)
++{
++      struct policydb oldpolicydb, newpolicydb;
++      struct sidtab oldsidtab, newsidtab;
++      struct convert_context_args args;
++      u32 seqno;
++      int rc = 0;
++      struct policy_file file = { data, len }, *fp = &file;
++
++      LOAD_LOCK;
++
++      if (!ss_initialized) {
++              if (policydb_read(&policydb, fp)) {
++                      LOAD_UNLOCK;
++                      return -EINVAL;
++              }
++              if (policydb_load_isids(&policydb, &sidtab)) {
++                      LOAD_UNLOCK;
++                      policydb_destroy(&policydb);
++                      return -EINVAL;
++              }
++              ss_initialized = 1;
++              LOAD_UNLOCK;
++              selinux_complete_init();
++              return 0;
++      }
++
++#if 0
++      sidtab_hash_eval(&sidtab, "sids");
++#endif
++
++      if (policydb_read(&newpolicydb, fp)) {
++              LOAD_UNLOCK;
++              return -EINVAL;
++      }
++
++      sidtab_init(&newsidtab);
++
++      /* Verify that the existing classes did not change. */
++      if (hashtab_map(policydb.p_classes.table, validate_class, &newpolicydb)) {
++              printk(KERN_ERR "security:  the definition of an existing "
++                     "class changed\n");
++              rc = -EINVAL;
++              goto err;
++      }
++
++      /* Clone the SID table. */
++      sidtab_shutdown(&sidtab);
++      if (sidtab_map(&sidtab, clone_sid, &newsidtab)) {
++              rc = -ENOMEM;
++              goto err;
++      }
++
++      /* Convert the internal representations of contexts
++         in the new SID table and remove invalid SIDs. */
++      args.oldp = &policydb;
++      args.newp = &newpolicydb;
++      sidtab_map_remove_on_error(&newsidtab, convert_context, &args);
++
++      /* Save the old policydb and SID table to free later. */
++      memcpy(&oldpolicydb, &policydb, sizeof policydb);
++      sidtab_set(&oldsidtab, &sidtab);
++
++      /* Install the new policydb and SID table. */
++      POLICY_WRLOCK;
++      memcpy(&policydb, &newpolicydb, sizeof policydb);
++      sidtab_set(&sidtab, &newsidtab);
++      seqno = ++latest_granting;
++      POLICY_WRUNLOCK;
++      LOAD_UNLOCK;
++
++      /* Free the old policydb and SID table. */
++      policydb_destroy(&oldpolicydb);
++      sidtab_destroy(&oldsidtab);
++
++      avc_ss_reset(seqno);
++
++      return 0;
++
++err:
++      LOAD_UNLOCK;
++      sidtab_destroy(&newsidtab);
++      policydb_destroy(&newpolicydb);
++      return rc;
++
++}
++
++/**
++ * security_port_sid - Obtain the SID for a port.
++ * @domain: communication domain aka address family
++ * @type: socket type
++ * @protocol: protocol number
++ * @port: port number
++ * @out_sid: security identifier
++ */
++int security_port_sid(u16 domain,
++                    u16 type,
++                    u8 protocol,
++                    u16 port,
++                    u32 *out_sid)
++{
++      struct ocontext *c;
++      int rc = 0;
++
++      POLICY_RDLOCK;
++
++      c = policydb.ocontexts[OCON_PORT];
++      while (c) {
++              if (c->u.port.protocol == protocol &&
++                  c->u.port.low_port <= port &&
++                  c->u.port.high_port >= port)
++                      break;
++              c = c->next;
++      }
++
++      if (c) {
++              if (!c->sid[0]) {
++                      rc = sidtab_context_to_sid(&sidtab,
++                                                 &c->context[0],
++                                                 &c->sid[0]);
++                      if (rc)
++                              goto out;
++              }
++              *out_sid = c->sid[0];
++      } else {
++              *out_sid = SECINITSID_PORT;
++      }
++
++out:
++      POLICY_RDUNLOCK;
++      return rc;
++}
++
++/**
++ * security_netif_sid - Obtain the SID for a network interface.
++ * @name: interface name
++ * @if_sid: interface SID
++ * @msg_sid: default SID for received packets
++ */
++int security_netif_sid(char *name,
++                     u32 *if_sid,
++                     u32 *msg_sid)
++{
++      int rc = 0;
++      struct ocontext *c;
++
++      POLICY_RDLOCK;
++
++      c = policydb.ocontexts[OCON_NETIF];
++      while (c) {
++              if (strcmp(name, c->u.name) == 0)
++                      break;
++              c = c->next;
++      }
++
++      if (c) {
++              if (!c->sid[0] || !c->sid[1]) {
++                      rc = sidtab_context_to_sid(&sidtab,
++                                                &c->context[0],
++                                                &c->sid[0]);
++                      if (rc)
++                              goto out;
++                      rc = sidtab_context_to_sid(&sidtab,
++                                                 &c->context[1],
++                                                 &c->sid[1]);
++                      if (rc)
++                              goto out;
++              }
++              *if_sid = c->sid[0];
++              *msg_sid = c->sid[1];
++      } else {
++              *if_sid = SECINITSID_NETIF;
++              *msg_sid = SECINITSID_NETMSG;
++      }
++
++out:
++      POLICY_RDUNLOCK;
++      return rc;
++}
++
++
++/**
++ * security_node_sid - Obtain the SID for a node (host).
++ * @domain: communication domain aka address family
++ * @addrp: address
++ * @addrlen: address length in bytes
++ * @out_sid: security identifier
++ */
++int security_node_sid(u16 domain,
++                    void *addrp,
++                    u32 addrlen,
++                    u32 *out_sid)
++{
++      int rc = 0;
++      u32 addr;
++      struct ocontext *c;
++
++      POLICY_RDLOCK;
++
++      if (domain != AF_INET || addrlen != sizeof(u32)) {
++              *out_sid = SECINITSID_NODE;
++              goto out;
++      }
++      addr = *((u32 *)addrp);
++
++      c = policydb.ocontexts[OCON_NODE];
++      while (c) {
++              if (c->u.node.addr == (addr & c->u.node.mask))
++                      break;
++              c = c->next;
++      }
++
++      if (c) {
++              if (!c->sid[0]) {
++                      rc = sidtab_context_to_sid(&sidtab,
++                                                 &c->context[0],
++                                                 &c->sid[0]);
++                      if (rc)
++                              goto out;
++              }
++              *out_sid = c->sid[0];
++      } else {
++              *out_sid = SECINITSID_NODE;
++      }
++
++out:
++      POLICY_RDUNLOCK;
++      return rc;
++}
++
++#define SIDS_NEL 25
++
++/**
++ * security_get_user_sids - Obtain reachable SIDs for a user.
++ * @fromsid: starting SID
++ * @username: username
++ * @sids: array of reachable SIDs for user
++ * @nel: number of elements in @sids
++ *
++ * Generate the set of SIDs for legal security contexts
++ * for a given user that can be reached by @fromsid.
++ * Set *@sids to point to a dynamically allocated
++ * array containing the set of SIDs.  Set *@nel to the
++ * number of elements in the array.
++ */
++
++int security_get_user_sids(u32 fromsid,
++                         char *username,
++                         u32 **sids,
++                         u32 *nel)
++{
++      struct context *fromcon, usercon;
++      u32 *mysids, *mysids2, sid;
++      u32 mynel = 0, maxnel = SIDS_NEL;
++      struct user_datum *user;
++      struct role_datum *role;
++      struct av_decision avd;
++      int rc = 0, i, j;
++
++      if (!ss_initialized) {
++              *sids = NULL;
++              *nel = 0;
++              goto out;
++      }
++
++      POLICY_RDLOCK;
++
++      fromcon = sidtab_search(&sidtab, fromsid);
++      if (!fromcon) {
++              rc = -EINVAL;
++              goto out_unlock;
++      }
++
++      user = hashtab_search(policydb.p_users.table, username);
++      if (!user) {
++              rc = -EINVAL;
++              goto out_unlock;
++      }
++      usercon.user = user->value;
++
++      mysids = kmalloc(maxnel*sizeof(*mysids), GFP_ATOMIC);
++      if (!mysids) {
++              rc = -ENOMEM;
++              goto out_unlock;
++      }
++      memset(mysids, 0, maxnel*sizeof(*mysids));
++
++      for (i = ebitmap_startbit(&user->roles); i < ebitmap_length(&user->roles); i++) {
++              if (!ebitmap_get_bit(&user->roles, i))
++                      continue;
++              role = policydb.role_val_to_struct[i];
++              usercon.role = i+1;
++              for (j = ebitmap_startbit(&role->types); j < ebitmap_length(&role->types); j++) {
++                      if (!ebitmap_get_bit(&role->types, j))
++                              continue;
++                      usercon.type = j+1;
++                      if (usercon.type == fromcon->type)
++                              continue;
++                      mls_for_user_ranges(user,usercon) {
++                              rc = context_struct_compute_av(fromcon, &usercon,
++                                                             SECCLASS_PROCESS,
++                                                             PROCESS__TRANSITION,
++                                                             &avd);
++                              if (rc ||  !(avd.allowed & PROCESS__TRANSITION))
++                                      continue;
++                              rc = sidtab_context_to_sid(&sidtab, &usercon, &sid);
++                              if (rc) {
++                                      kfree(mysids);
++                                      goto out_unlock;
++                              }
++                              if (mynel < maxnel) {
++                                      mysids[mynel++] = sid;
++                              } else {
++                                      maxnel += SIDS_NEL;
++                                      mysids2 = kmalloc(maxnel*sizeof(*mysids2), GFP_ATOMIC);
++                                      if (!mysids2) {
++                                              rc = -ENOMEM;
++                                              kfree(mysids);
++                                              goto out_unlock;
++                                      }
++                                      memset(mysids2, 0, maxnel*sizeof(*mysids2));
++                                      memcpy(mysids2, mysids, mynel * sizeof(*mysids2));
++                                      kfree(mysids);
++                                      mysids = mysids2;
++                                      mysids[mynel++] = sid;
++                              }
++                      }
++                      mls_end_user_ranges;
++              }
++      }
++
++      *sids = mysids;
++      *nel = mynel;
++
++out_unlock:
++      POLICY_RDUNLOCK;
++out:
++      return rc;
++}
++
++/**
++ * security_genfs_sid - Obtain a SID for a file in a filesystem
++ * @fstype: filesystem type
++ * @path: path from root of mount
++ * @sclass: file security class
++ * @sid: SID for path
++ *
++ * Obtain a SID to use for a file in a filesystem that
++ * cannot support xattr or use a fixed labeling behavior like
++ * transition SIDs or task SIDs.
++ */
++int security_genfs_sid(const char *fstype,
++                     char *path,
++                     u16 sclass,
++                     u32 *sid)
++{
++      int len;
++      struct genfs *genfs;
++      struct ocontext *c;
++      int rc = 0, cmp = 0;
++
++      POLICY_RDLOCK;
++
++      for (genfs = policydb.genfs; genfs; genfs = genfs->next) {
++              cmp = strcmp(fstype, genfs->fstype);
++              if (cmp <= 0)
++                      break;
++      }
++
++      if (!genfs || cmp) {
++              *sid = SECINITSID_UNLABELED;
++              rc = -ENOENT;
++              goto out;
++      }
++
++      for (c = genfs->head; c; c = c->next) {
++              len = strlen(c->u.name);
++              if ((!c->v.sclass || sclass == c->v.sclass) &&
++                  (strncmp(c->u.name, path, len) == 0))
++                      break;
++      }
++
++      if (!c) {
++              *sid = SECINITSID_UNLABELED;
++              rc = -ENOENT;
++              goto out;
++      }
++
++      if (!c->sid[0]) {
++              rc = sidtab_context_to_sid(&sidtab,
++                                         &c->context[0],
++                                         &c->sid[0]);
++              if (rc)
++                      goto out;
++      }
++
++      *sid = c->sid[0];
++out:
++      POLICY_RDUNLOCK;
++      return rc;
++}
++
++/**
++ * security_fs_use - Determine how to handle labeling for a filesystem.
++ * @fstype: filesystem type
++ * @behavior: labeling behavior
++ * @sid: SID for filesystem (superblock)
++ */
++int security_fs_use(
++      const char *fstype,
++      unsigned int *behavior,
++      u32 *sid)
++{
++      int rc = 0;
++      struct ocontext *c;
++
++      POLICY_RDLOCK;
++
++      c = policydb.ocontexts[OCON_FSUSE];
++      while (c) {
++              if (strcmp(fstype, c->u.name) == 0)
++                      break;
++              c = c->next;
++      }
++
++      if (c) {
++              *behavior = c->v.behavior;
++              if (!c->sid[0]) {
++                      rc = sidtab_context_to_sid(&sidtab,
++                                                 &c->context[0],
++                                                 &c->sid[0]);
++                      if (rc)
++                              goto out;
++              }
++              *sid = c->sid[0];
++      } else {
++              rc = security_genfs_sid(fstype, "/", SECCLASS_DIR, sid);
++              if (rc) {
++                      *behavior = SECURITY_FS_USE_NONE;
++                      rc = 0;
++              } else {
++                      *behavior = SECURITY_FS_USE_GENFS;
++              }
++      }
++
++out:
++      POLICY_RDUNLOCK;
++      return rc;
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/services.h  2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,21 @@
++/*
++ * Implementation of the security services.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_SERVICES_H_
++#define _SS_SERVICES_H_
++
++#include "policydb.h"
++#include "sidtab.h"
++
++/*
++ * The security server uses two global data structures
++ * when providing its services:  the SID table (sidtab)
++ * and the policy database (policydb).
++ */
++extern struct sidtab sidtab;
++extern struct policydb policydb;
++
++#endif        /* _SS_SERVICES_H_ */
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/sidtab.c    2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,329 @@
++/*
++ * Implementation of the SID table type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "sidtab.h"
++
++#define SIDTAB_HASH(sid) \
++(sid & SIDTAB_HASH_MASK)
++
++#define INIT_SIDTAB_LOCK(s) spin_lock_init(&s->lock)
++#define SIDTAB_LOCK(s) spin_lock_irq(&s->lock)
++#define SIDTAB_UNLOCK(s) spin_unlock_irq(&s->lock)
++
++int sidtab_init(struct sidtab *s)
++{
++      int i;
++
++      s->htable = kmalloc(sizeof(*(s->htable)) * SIDTAB_SIZE, GFP_ATOMIC);
++      if (!s->htable)
++              return -ENOMEM;
++      for (i = 0; i < SIDTAB_SIZE; i++)
++              s->htable[i] = NULL;
++      s->nel = 0;
++      s->next_sid = 1;
++      s->shutdown = 0;
++      INIT_SIDTAB_LOCK(s);
++      return 0;
++}
++
++int sidtab_insert(struct sidtab *s, u32 sid, struct context *context)
++{
++      int hvalue, rc = 0;
++      struct sidtab_node *prev, *cur, *newnode;
++
++      if (!s) {
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      hvalue = SIDTAB_HASH(sid);
++      prev = NULL;
++      cur = s->htable[hvalue];
++      while (cur != NULL && sid > cur->sid) {
++              prev = cur;
++              cur = cur->next;
++      }
++
++      if (cur && sid == cur->sid) {
++              rc = -EEXIST;
++              goto out;
++      }
++
++      newnode = kmalloc(sizeof(*newnode), GFP_ATOMIC);
++      if (newnode == NULL) {
++              rc = -ENOMEM;
++              goto out;
++      }
++      newnode->sid = sid;
++      if (context_cpy(&newnode->context, context)) {
++              kfree(newnode);
++              rc = -ENOMEM;
++              goto out;
++      }
++
++      if (prev) {
++              newnode->next = prev->next;
++              wmb();
++              prev->next = newnode;
++      } else {
++              newnode->next = s->htable[hvalue];
++              wmb();
++              s->htable[hvalue] = newnode;
++      }
++
++      s->nel++;
++      if (sid >= s->next_sid)
++              s->next_sid = sid + 1;
++out:
++      return rc;
++}
++
++int sidtab_remove(struct sidtab *s, u32 sid)
++{
++      int hvalue, rc = 0;
++      struct sidtab_node *cur, *last;
++
++      if (!s) {
++              rc = -ENOENT;
++              goto out;
++      }
++
++      hvalue = SIDTAB_HASH(sid);
++      last = NULL;
++      cur = s->htable[hvalue];
++      while (cur != NULL && sid > cur->sid) {
++              last = cur;
++              cur = cur->next;
++      }
++
++      if (cur == NULL || sid != cur->sid) {
++              rc = -ENOENT;
++              goto out;
++      }
++
++      if (last == NULL)
++              s->htable[hvalue] = cur->next;
++      else
++              last->next = cur->next;
++
++      context_destroy(&cur->context);
++
++      kfree(cur);
++      s->nel--;
++out:
++      return rc;
++}
++
++struct context *sidtab_search(struct sidtab *s, u32 sid)
++{
++      int hvalue;
++      struct sidtab_node *cur;
++
++      if (!s)
++              return NULL;
++
++      hvalue = SIDTAB_HASH(sid);
++      cur = s->htable[hvalue];
++      while (cur != NULL && sid > cur->sid)
++              cur = cur->next;
++
++      if (cur == NULL || sid != cur->sid) {
++              /* Remap invalid SIDs to the unlabeled SID. */
++              sid = SECINITSID_UNLABELED;
++              hvalue = SIDTAB_HASH(sid);
++              cur = s->htable[hvalue];
++              while (cur != NULL && sid > cur->sid)
++                      cur = cur->next;
++              if (!cur || sid != cur->sid)
++                      return NULL;
++      }
++
++      return &cur->context;
++}
++
++int sidtab_map(struct sidtab *s,
++             int (*apply) (u32 sid,
++                           struct context *context,
++                           void *args),
++             void *args)
++{
++      int i, rc = 0;
++      struct sidtab_node *cur;
++
++      if (!s)
++              goto out;
++
++      for (i = 0; i < SIDTAB_SIZE; i++) {
++              cur = s->htable[i];
++              while (cur != NULL) {
++                      rc = apply(cur->sid, &cur->context, args);
++                      if (rc)
++                              goto out;
++                      cur = cur->next;
++              }
++      }
++out:
++      return rc;
++}
++
++void sidtab_map_remove_on_error(struct sidtab *s,
++                              int (*apply) (u32 sid,
++                                            struct context *context,
++                                            void *args),
++                              void *args)
++{
++      int i, ret;
++      struct sidtab_node *last, *cur, *temp;
++
++      if (!s)
++              return;
++
++      for (i = 0; i < SIDTAB_SIZE; i++) {
++              last = NULL;
++              cur = s->htable[i];
++              while (cur != NULL) {
++                      ret = apply(cur->sid, &cur->context, args);
++                      if (ret) {
++                              if (last) {
++                                      last->next = cur->next;
++                              } else {
++                                      s->htable[i] = cur->next;
++                              }
++
++                              temp = cur;
++                              cur = cur->next;
++                              context_destroy(&temp->context);
++                              kfree(temp);
++                              s->nel--;
++                      } else {
++                              last = cur;
++                              cur = cur->next;
++                      }
++              }
++      }
++
++      return;
++}
++
++static inline u32 sidtab_search_context(struct sidtab *s,
++                                                struct context *context)
++{
++      int i;
++      struct sidtab_node *cur;
++
++      for (i = 0; i < SIDTAB_SIZE; i++) {
++              cur = s->htable[i];
++              while (cur != NULL) {
++                      if (context_cmp(&cur->context, context))
++                              return cur->sid;
++                      cur = cur->next;
++              }
++      }
++      return 0;
++}
++
++int sidtab_context_to_sid(struct sidtab *s,
++                        struct context *context,
++                        u32 *out_sid)
++{
++      u32 sid;
++      int ret = 0;
++
++      *out_sid = SECSID_NULL;
++
++      sid = sidtab_search_context(s, context);
++      if (!sid) {
++              SIDTAB_LOCK(s);
++              /* Rescan now that we hold the lock. */
++              sid = sidtab_search_context(s, context);
++              if (sid)
++                      goto unlock_out;
++              /* No SID exists for the context.  Allocate a new one. */
++              if (s->next_sid == UINT_MAX || s->shutdown) {
++                      ret = -ENOMEM;
++                      goto unlock_out;
++              }
++              sid = s->next_sid++;
++              ret = sidtab_insert(s, sid, context);
++              if (ret)
++                      s->next_sid--;
++unlock_out:
++              SIDTAB_UNLOCK(s);
++      }
++
++      if (ret)
++              return ret;
++
++      *out_sid = sid;
++      return 0;
++}
++
++void sidtab_hash_eval(struct sidtab *h, char *tag)
++{
++      int i, chain_len, slots_used, max_chain_len;
++      struct sidtab_node *cur;
++
++      slots_used = 0;
++      max_chain_len = 0;
++      for (i = 0; i < SIDTAB_SIZE; i++) {
++              cur = h->htable[i];
++              if (cur) {
++                      slots_used++;
++                      chain_len = 0;
++                      while (cur) {
++                              chain_len++;
++                              cur = cur->next;
++                      }
++
++                      if (chain_len > max_chain_len)
++                              max_chain_len = chain_len;
++              }
++      }
++
++      printk(KERN_INFO "%s:  %d entries and %d/%d buckets used, longest "
++             "chain length %d\n", tag, h->nel, slots_used, SIDTAB_SIZE,
++             max_chain_len);
++}
++
++void sidtab_destroy(struct sidtab *s)
++{
++      int i;
++      struct sidtab_node *cur, *temp;
++
++      if (!s)
++              return;
++
++      for (i = 0; i < SIDTAB_SIZE; i++) {
++              cur = s->htable[i];
++              while (cur != NULL) {
++                      temp = cur;
++                      cur = cur->next;
++                      context_destroy(&temp->context);
++                      kfree(temp);
++              }
++              s->htable[i] = NULL;
++      }
++      kfree(s->htable);
++      s->htable = NULL;
++      s->nel = 0;
++      s->next_sid = 1;
++}
++
++void sidtab_set(struct sidtab *dst, struct sidtab *src)
++{
++      SIDTAB_LOCK(src);
++      dst->htable = src->htable;
++      dst->nel = src->nel;
++      dst->next_sid = src->next_sid;
++      dst->shutdown = 0;
++      SIDTAB_UNLOCK(src);
++}
++
++void sidtab_shutdown(struct sidtab *s)
++{
++      SIDTAB_LOCK(s);
++      s->shutdown = 1;
++      SIDTAB_UNLOCK(s);
++}
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/sidtab.h    2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,59 @@
++/*
++ * A security identifier table (sidtab) is a hash table
++ * of security context structures indexed by SID value.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_SIDTAB_H_
++#define _SS_SIDTAB_H_
++
++#include "context.h"
++
++struct sidtab_node {
++      u32 sid;                /* security identifier */
++      struct context context; /* security context structure */
++      struct sidtab_node *next;
++};
++
++#define SIDTAB_HASH_BITS 7
++#define SIDTAB_HASH_BUCKETS (1 << SIDTAB_HASH_BITS)
++#define SIDTAB_HASH_MASK (SIDTAB_HASH_BUCKETS-1)
++
++#define SIDTAB_SIZE SIDTAB_HASH_BUCKETS
++
++struct sidtab {
++      struct sidtab_node **htable;
++      unsigned int nel;       /* number of elements */
++      unsigned int next_sid;  /* next SID to allocate */
++      unsigned char shutdown;
++      spinlock_t lock;
++};
++
++int sidtab_init(struct sidtab *s);
++int sidtab_insert(struct sidtab *s, u32 sid, struct context *context);
++struct context *sidtab_search(struct sidtab *s, u32 sid);
++
++int sidtab_map(struct sidtab *s,
++             int (*apply) (u32 sid,
++                           struct context *context,
++                           void *args),
++             void *args);
++
++void sidtab_map_remove_on_error(struct sidtab *s,
++                              int (*apply) (u32 sid,
++                                            struct context *context,
++                                            void *args),
++                              void *args);
++
++int sidtab_context_to_sid(struct sidtab *s,
++                        struct context *context,
++                        u32 *sid);
++
++void sidtab_hash_eval(struct sidtab *h, char *tag);
++void sidtab_destroy(struct sidtab *s);
++void sidtab_set(struct sidtab *dst, struct sidtab *src);
++void sidtab_shutdown(struct sidtab *s);
++
++#endif        /* _SS_SIDTAB_H_ */
++
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/symtab.c    2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,40 @@
++/*
++ * Implementation of the symbol table type.
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#include "symtab.h"
++
++static unsigned int symhash(struct hashtab *h, void *key)
++{
++      char *p, *keyp;
++      unsigned int size;
++      unsigned int val;
++
++      val = 0;
++      keyp = key;
++      size = strlen(keyp);
++      for (p = keyp; (p - keyp) < size; p++)
++              val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p);
++      return val & (h->size - 1);
++}
++
++static int symcmp(struct hashtab *h, void *key1, void *key2)
++{
++      char *keyp1, *keyp2;
++
++      keyp1 = key1;
++      keyp2 = key2;
++      return strcmp(keyp1, keyp2);
++}
++
++
++int symtab_init(struct symtab *s, unsigned int size)
++{
++      s->table = hashtab_create(symhash, symcmp, size);
++      if (!s->table)
++              return -1;
++      s->nprim = 0;
++      return 0;
++}
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/security/selinux/ss/symtab.h    2003-07-19 17:04:47.000000000 -0700
+@@ -0,0 +1,23 @@
++/*
++ * A symbol table (symtab) maintains associations between symbol
++ * strings and datum values.  The type of the datum values
++ * is arbitrary.  The symbol table type is implemented
++ * using the hash table type (hashtab).
++ *
++ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
++ */
++#ifndef _SS_SYMTAB_H_
++#define _SS_SYMTAB_H_
++
++#include "hashtab.h"
++
++struct symtab {
++      struct hashtab *table;  /* hash table (keyed on a string) */
++      u32 nprim;              /* number of primary names in table */
++};
++
++int symtab_init(struct symtab *s, unsigned int size);
++
++#endif        /* _SS_SYMTAB_H_ */
++
++
+--- linux-2.6.0-test1/sound/core/timer.c       2003-06-14 12:18:24.000000000 -0700
++++ 25/sound/core/timer.c      2003-07-19 17:06:14.000000000 -0700
+@@ -1688,10 +1688,11 @@ static ssize_t snd_timer_user_read(struc
+                               break;
+                       }
+               }
+-              spin_unlock_irq(&tu->qlock);
+               if (err < 0)
+                       break;
++              spin_unlock_irq(&tu->qlock);
++
+               if (tu->tread) {
+                       if (copy_to_user(buffer, &tu->tqueue[tu->qhead++], sizeof(snd_timer_tread_t))) {
+                               err = -EFAULT;
+@@ -1712,6 +1713,7 @@ static ssize_t snd_timer_user_read(struc
+               spin_lock_irq(&tu->qlock);
+               tu->qused--;
+       }
++      spin_unlock_irq(&tu->qlock);
+       return result > 0 ? result : err;
+ }
+--- linux-2.6.0-test1/sound/isa/cmi8330.c      2003-06-14 12:17:58.000000000 -0700
++++ 25/sound/isa/cmi8330.c     2003-07-19 17:03:51.000000000 -0700
+@@ -293,7 +293,7 @@ static int __devinit snd_cmi8330_pnp(int
+                                    const struct pnp_card_device_id *id)
+ {
+       struct pnp_dev *pdev;
+-      struct pnp_resource_table * cfg = kmalloc(GFP_ATOMIC, sizeof(struct pnp_resource_table));
++      struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_ATOMIC);
+       int err;
+       acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL);
+--- linux-2.6.0-test1/sound/isa/es18xx.c       2003-06-14 12:18:08.000000000 -0700
++++ 25/sound/isa/es18xx.c      2003-07-19 17:03:51.000000000 -0700
+@@ -1966,7 +1966,7 @@ static int __devinit snd_audiodrive_pnp(
+                                       const struct pnp_card_device_id *id)
+ {
+       struct pnp_dev *pdev;
+-      struct pnp_resource_table * cfg = kmalloc(GFP_ATOMIC, sizeof(struct pnp_resource_table));
++      struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_ATOMIC);
+       int err;
+       if (!cfg)
+--- linux-2.6.0-test1/sound/oss/ac97_plugin_ad1980.c   2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/ac97_plugin_ad1980.c  2003-07-19 17:03:51.000000000 -0700
+@@ -17,7 +17,7 @@
+    the provisions above, a recipient may use your version of this
+    file under either the OSL or the GPL.
+    
+-   Authors:   Arjan van de Ven <arjanv@redhat.com>
++   Authors:   Alan Cox <alan@redhat.com>
+    This is an example codec plugin. This one switches the connections
+    around to match the setups some vendors use with audio switched to
+--- linux-2.6.0-test1/sound/oss/ad1816.c       2003-06-14 12:18:33.000000000 -0700
++++ 25/sound/oss/ad1816.c      2003-07-19 17:03:51.000000000 -0700
+@@ -1,15 +1,15 @@
+ /*
+  *
+- * AD1816 lowlevel sound driver for Linux 2.2.0 and above
++ * AD1816 lowlevel sound driver for Linux 2.6.0 and above
+  *
+- * Copyright (C) 1998 by Thorsten Knabe <tek@rbg.informatik.tu-darmstadt.de>
++ * Copyright (C) 1998-2003 by Thorsten Knabe <linux@thorsten-knabe.de>
+  *
+  * Based on the CS4232/AD1848 driver Copyright (C) by Hannu Savolainen 1993-1996
+  *
+  *
+- * version: 1.3.1
+- * status: experimental
+- * date: 1999/4/18
++ * version: 1.5
++ * status: beta
++ * date: 2003/07/15
+  *
+  * Changes:
+  *    Oleg Drokin: Some cleanup of load/unload functions.     1998/11/24
+@@ -30,8 +30,17 @@
+  *    Christoph Hellwig: Added isapnp support                 2000/03/15
+  *
+  *    Arnaldo Carvalho de Melo: get rid of check_region       2001/10/07
++ *      
++ *      Thorsten Knabe: Compiling with CONFIG_PNP enabled
++ *    works again. It is now possible to use more than one 
++ *    AD1816 sound card. Sample rate now may be changed during
++ *    playback/capture. printk() uses log levels everywhere.
++ *    SMP fixes. DMA handling fixes.
++ *    Other minor code cleanup.                               2003/07/15
++ *
+  */
++
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+@@ -42,9 +51,6 @@
+ #include "sound_config.h"
+ #define DEBUGNOISE(x)
+-#define DEBUGINFO(x)
+-#define DEBUGLOG(x)
+-#define DEBUGWARN(x)
+ #define CHECK_FOR_POWER { int timeout=100; \
+   while (timeout > 0 && (inb(devc->base)&0x80)!= 0x80) {\
+@@ -63,21 +69,21 @@ typedef struct
+       int            dma_playback;
+         int            dma_capture;
+   
+-        int            speed;         /* open */
++      int            opened;         /* open */
++        int            speed; 
+       int            channels;
+       int            audio_format;
+-      unsigned char  format_bits;
+         int            audio_mode; 
+-      int            opened;
+   
+         int            recmask;        /* setup */
++      unsigned char  format_bits;
+       int            supported_devices;
+       int            supported_rec_devices;
+       unsigned short levels[SOUND_MIXER_NRDEVICES];
++                                      /* misc */
++      struct pnp_dev *pnpdev;  /* configured via pnp */
+         int            dev_no;   /* this is the # in audio_devs and NOT 
+                                   in ad1816_info */
+-      int            irq_ok;
+-      int            *osp;
+       spinlock_t      lock;  
+ } ad1816_info;
+@@ -85,12 +91,6 @@ static int nr_ad1816_devs;
+ static int ad1816_clockfreq = 33000;
+ static int options;
+-/* for backward mapping of irq to sound device */
+-
+-static volatile char irq2dev[17] = {-1, -1, -1, -1, -1, -1, -1, -1,
+-                                  -1, -1, -1, -1, -1, -1, -1, -1, -1};
+-
+-
+ /* supported audio formats */
+ static int  ad_format_mask =
+ AFMT_U8 | AFMT_S16_LE | AFMT_S16_BE | AFMT_MU_LAW | AFMT_A_LAW;
+@@ -105,33 +105,22 @@ static ad1816_info dev_info[MAX_AUDIO_DE
+ static int ad_read (ad1816_info * devc, int reg)
+ {
+-      unsigned long   flags;
+       int result;
+       
+       CHECK_FOR_POWER;
+-
+-      spin_lock_irqsave(&devc->lock,flags); /* make register access atomic */
+       outb ((unsigned char) (reg & 0x3f), devc->base+0);
+       result = inb(devc->base+2);
+       result+= inb(devc->base+3)<<8;
+-      spin_unlock_irqrestore(&devc->lock,flags);
+-      
+       return (result);
+ }
+ static void ad_write (ad1816_info * devc, int reg, int data)
+ {
+-      unsigned long flags;
+-      
+       CHECK_FOR_POWER;
+-      
+-      spin_lock_irqsave(&devc->lock,flags); /* make register access atomic */
+       outb ((unsigned char) (reg & 0xff), devc->base+0);
+       outb ((unsigned char) (data & 0xff),devc->base+2);
+       outb ((unsigned char) ((data>>8)&0xff),devc->base+3);
+-      spin_unlock_irqrestore(&devc->lock,flags);
+-
+ }
+ /* ------------------------------------------------------------------- */
+@@ -144,7 +133,7 @@ static void ad1816_halt_input (int dev)
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+       unsigned char buffer;
+       
+-      DEBUGINFO (printk("ad1816: halt_input called\n"));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: halt_input called\n"));
+       
+       spin_lock_irqsave(&devc->lock,flags); 
+       
+@@ -176,7 +165,7 @@ static void ad1816_halt_output (int dev)
+       
+       unsigned char buffer;
+-      DEBUGINFO (printk("ad1816: halt_output called!\n"));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: halt_output called!\n"));
+       spin_lock_irqsave(&devc->lock,flags); 
+       /* Mute pcm output */
+@@ -210,7 +199,7 @@ static void ad1816_output_block (int dev
+       unsigned long cnt;
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+       
+-      DEBUGINFO(printk("ad1816: output_block called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: output_block called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
+   
+       cnt = count/4 - 1;
+   
+@@ -231,7 +220,7 @@ static void ad1816_start_input (int dev,
+       unsigned long  cnt;
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+       
+-      DEBUGINFO(printk("ad1816: start_input called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: start_input called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
+       cnt = count/4 - 1;
+@@ -239,7 +228,6 @@ static void ad1816_start_input (int dev,
+       /* set transfer count */
+       ad_write (devc, 10, cnt & 0xffff); 
+-
+       devc->audio_mode |= PCM_ENABLE_INPUT;
+       spin_unlock_irqrestore(&devc->lock,flags);
+ }
+@@ -251,33 +239,19 @@ static int ad1816_prepare_for_input (int
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+       unsigned char fmt_bits;
+       
+-      DEBUGINFO (printk ("ad1816: prepare_for_input called: bsize=%d bcount=%d\n",bsize,bcount));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: prepare_for_input called: bsize=%d bcount=%d\n",bsize,bcount));
+       spin_lock_irqsave(&devc->lock,flags);
+-      
+       fmt_bits= (devc->format_bits&0x7)<<3;
+       
+       /* set mono/stereo mode */
+       if (devc->channels > 1) {
+               fmt_bits |=0x4;
+       }
+-
+       /* set Mono/Stereo in playback/capture register */
+       outb( (inb(devc->base+8) & ~0x3C)|fmt_bits, devc->base+8); 
+       outb( (inb(devc->base+9) & ~0x3C)|fmt_bits, devc->base+9);
+-  
+-      /* If compiled into kernel, AD1816_CLOCK is defined, so use it */
+-#ifdef AD1816_CLOCK 
+-      ad1816_clockfreq=AD1816_CLOCK;
+-#endif
+-
+-      /* capture/playback frequency correction for soundcards 
+-         with clock chips != 33MHz (allowed range 5 - 100 kHz) */
+-      if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
+-              ad1816_clockfreq=33000;
+-      }
+-      
+       freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
+       /* write playback/capture speeds */
+@@ -297,7 +271,7 @@ static int ad1816_prepare_for_output (in
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+       unsigned char fmt_bits;
+-      DEBUGINFO (printk ("ad1816: prepare_for_output called: bsize=%d bcount=%d\n",bsize,bcount));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: prepare_for_output called: bsize=%d bcount=%d\n",bsize,bcount));
+       spin_lock_irqsave(&devc->lock,flags);
+@@ -311,17 +285,6 @@ static int ad1816_prepare_for_output (in
+       outb( (inb(devc->base+8) & ~0x3C)|fmt_bits, devc->base+8); 
+       outb( (inb(devc->base+9) & ~0x3C)|fmt_bits, devc->base+9);
+   
+-#ifdef AD1816_CLOCK 
+-      ad1816_clockfreq=AD1816_CLOCK;
+-#endif
+-
+-      /* capture/playback frequency correction for soundcards 
+-         with clock chips != 33MHz (allowed range 5 - 100 kHz)*/
+-
+-      if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
+-              ad1816_clockfreq=33000;
+-      }
+-  
+       freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
+       
+       /* write playback/capture speeds */
+@@ -340,7 +303,7 @@ static void ad1816_trigger (int dev, int
+       unsigned long flags;
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+-      DEBUGINFO (printk("ad1816: trigger called! (devc=%d,devc->base=%d\n", devc, devc->base));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: trigger called! (devc=%d,devc->base=%d\n", devc, devc->base));
+       /* mode may have changed */
+@@ -388,10 +351,17 @@ static void ad1816_reset (int dev)
+ /* set playback speed */
+ static int ad1816_set_speed (int dev, int arg)
+ {
++      unsigned long flags;
++      unsigned int freq;
++      int ret;
++
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+       
++      spin_lock_irqsave(&devc->lock, flags);
+       if (arg == 0) {
+-              return devc->speed;
++              ret = devc->speed;
++              spin_unlock_irqrestore(&devc->lock, flags);
++              return ret;
+       }
+       /* range checking */
+       if (arg < 4000) {
+@@ -400,14 +370,23 @@ static int ad1816_set_speed (int dev, in
+       if (arg > 55000) {
+               arg = 55000;
+       }
+-
+       devc->speed = arg;
+-      return devc->speed;
++
++      /* change speed during playback */
++      freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
++      /* write playback/capture speeds */
++      ad_write (devc, 2, freq & 0xffff);      
++      ad_write (devc, 3, freq & 0xffff);      
++
++      ret = devc->speed;
++      spin_unlock_irqrestore(&devc->lock, flags);
++      return ret;
+ }
+ static unsigned int ad1816_set_bits (int dev, unsigned int arg)
+ {
++      unsigned long flags;
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+       
+       static struct format_tbl {
+@@ -428,10 +407,13 @@ static unsigned int ad1816_set_bits (int
+       int  i, n = sizeof (format2bits) / sizeof (struct format_tbl);
++      spin_lock_irqsave(&devc->lock, flags);
+       /* return current format */
+-      if (arg == 0)
+-              return devc->audio_format;
+-      
++      if (arg == 0) {
++              arg = devc->audio_format;
++              spin_unlock_irqrestore(&devc->lock, flags);
++              return arg;
++      }
+       devc->audio_format = arg;
+       /* search matching format bits */
+@@ -439,12 +421,15 @@ static unsigned int ad1816_set_bits (int
+               if (format2bits[i].format == arg) {
+                       devc->format_bits = format2bits[i].bits;
+                       devc->audio_format = arg;
++                      spin_unlock_irqrestore(&devc->lock, flags);
+                       return arg;
+               }
+       /* Still hanging here. Something must be terribly wrong */
+       devc->format_bits = 0;
+-      return devc->audio_format = AFMT_U8;
++      devc->audio_format = AFMT_U8;
++      spin_unlock_irqrestore(&devc->lock, flags);
++      return(AFMT_U8); 
+ }
+ static short ad1816_set_channels (int dev, short arg)
+@@ -486,9 +471,8 @@ static int ad1816_open (int dev, int mod
+       devc->speed = 8000;
+       devc->audio_format=AFMT_U8;
+       devc->channels=1;
+-
+-      ad1816_reset(devc->dev_no); /* halt all pending output */
+       spin_unlock_irqrestore(&devc->lock,flags);
++      ad1816_reset(devc->dev_no); /* halt all pending output */
+       return 0;
+ }
+@@ -497,17 +481,15 @@ static void ad1816_close (int dev) /* cl
+       unsigned long flags;
+       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
+-      spin_lock_irqsave(&devc->lock,flags);
+-
+       /* halt all pending output */
+       ad1816_reset(devc->dev_no); 
+-      
++
++      spin_lock_irqsave(&devc->lock,flags);
+       devc->opened = 0;
+       devc->audio_mode = 0;
+       devc->speed = 8000;
+       devc->audio_format=AFMT_U8;
+       devc->format_bits = 0;
+-
+       spin_unlock_irqrestore(&devc->lock,flags);
+ }
+@@ -543,25 +525,13 @@ static struct audio_driver ad1816_audio_
+ static irqreturn_t ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy)
+ {
+       unsigned char   status;
+-      ad1816_info     *devc;
+-      int             dev;
+-
++      ad1816_info     *devc = (ad1816_info *)dev_id;
+       
+       if (irq < 0 || irq > 15) {
+               printk(KERN_WARNING "ad1816: Got bogus interrupt %d\n", irq);
+               return IRQ_NONE;
+       }
+-      dev = irq2dev[irq];
+-      
+-      if (dev < 0 || dev >= num_audiodevs) {
+-              printk(KERN_WARNING "ad1816: IRQ2AD1816-mapping failed for "
+-                                  "irq %d device %d\n", irq,dev);
+-              return IRQ_NONE;
+-      }
+-
+-      devc = (ad1816_info *) audio_devs[dev]->devc;
+-      
+       spin_lock(&devc->lock);
+       /* read interrupt register */
+@@ -569,18 +539,19 @@ static irqreturn_t ad1816_interrupt (int
+       /* Clear all interrupt  */
+       outb (~status, devc->base+1);   
+-      DEBUGNOISE (printk("ad1816: Got interrupt subclass %d\n",status));
+-      
+-      devc->irq_ok=1;
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: Got interrupt subclass %d\n",status));
+-      if (status == 0)
+-              DEBUGWARN(printk ("ad1816: interrupt: Got interrupt, but no reason?\n"));
++      if (status == 0) {
++              DEBUGNOISE(printk(KERN_DEBUG "ad1816: interrupt: Got interrupt, but no source.\n"));
++              spin_unlock(&devc->lock);
++              return IRQ_NONE;
++      }
+       if (devc->opened && (devc->audio_mode & PCM_ENABLE_INPUT) && (status&64))
+-              DMAbuf_inputintr (dev);
++              DMAbuf_inputintr (devc->dev_no);
+       if (devc->opened && (devc->audio_mode & PCM_ENABLE_OUTPUT) && (status & 128))
+-              DMAbuf_outputintr (dev, 1);
++              DMAbuf_outputintr (devc->dev_no, 1);
+       spin_unlock(&devc->lock);
+       return IRQ_HANDLED;
+@@ -671,9 +642,11 @@ static unsigned short default_mixer_leve
+ static int
+ ad1816_set_recmask (ad1816_info * devc, int mask)
+ {
++      unsigned long   flags;
+       unsigned char   recdev;
+       int             i, n;
+       
++      spin_lock_irqsave(&devc->lock, flags);
+       mask &= devc->supported_rec_devices;
+       
+       n = 0;
+@@ -733,6 +706,7 @@ ad1816_set_recmask (ad1816_info * devc, 
+                 (ad_read (devc, 20) & 0x8f8f) | recdev | (recdev<<8));
+       devc->recmask = mask;
++      spin_unlock_irqrestore(&devc->lock, flags);
+       return mask;
+ }
+@@ -760,7 +734,7 @@ change_bits (int *regval, int dev, int c
+ static int
+ ad1816_mixer_get (ad1816_info * devc, int dev)
+ {
+-      DEBUGINFO(printk("ad1816: mixer_get called!\n"));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_get called!\n"));
+       
+       /* range check + supported mixer check */
+       if (dev < 0 || dev >= SOUND_MIXER_NRDEVICES )
+@@ -781,8 +755,9 @@ ad1816_mixer_set (ad1816_info * devc, in
+       int   regoffs;
+       int   val;
+       int   valmute;
++      unsigned long flags;
+-      DEBUGINFO(printk("ad1816: mixer_set called!\n"));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_set called!\n"));
+       
+       if (dev < 0 || dev >= SOUND_MIXER_NRDEVICES )
+               return -(EINVAL);
+@@ -813,6 +788,7 @@ ad1816_mixer_set (ad1816_info * devc, in
+       /* sanity check */
+       if (mix_devices[dev][LEFT_CHN].nbits == 0)
+               return -(EINVAL);
++      spin_lock_irqsave(&devc->lock, flags);
+       /* keep precise volume internal */
+       devc->levels[dev] = retvol;
+@@ -840,8 +816,10 @@ ad1816_mixer_set (ad1816_info * devc, in
+        */
+  
+       /* Was just a mono channel */
+-      if (mix_devices[dev][RIGHT_CHN].nbits == 0)
++      if (mix_devices[dev][RIGHT_CHN].nbits == 0) {
++              spin_unlock_irqrestore(&devc->lock, flags);
+               return retvol;          
++      }
+       regoffs = mix_devices[dev][RIGHT_CHN].regno;
+       val = ad_read (devc, regoffs);
+@@ -857,7 +835,7 @@ ad1816_mixer_set (ad1816_info * devc, in
+                       valmute &= ~0x80;
+       }
+       ad_write (devc, regoffs, valmute); /* mute */
+-      
++      spin_unlock_irqrestore(&devc->lock, flags);
+               return retvol;
+ }
+@@ -901,7 +879,7 @@ ad1816_mixer_ioctl (int dev, unsigned in
+       ad1816_info    *devc = mixer_devs[dev]->devc;
+       int val;
+   
+-      DEBUGINFO(printk("ad1816: mixer_ioctl called!\n"));
++      DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_ioctl called!\n"));
+   
+       /* Mixer ioctl */
+       if (((cmd >> 8) & 0xff) == 'M') { 
+@@ -980,83 +958,91 @@ static struct mixer_operations ad1816_mi
+ /* ------------------------------------------------------------------- */
+-/* stuff for card recognition, init and unloading */
++/* stuff for card recognition, init and unloading PNP ...*/
+-/* replace with probe routine */
+-static int __init probe_ad1816 ( struct address_info *hw_config )
++/* check if AD1816 present at specified hw_config and register device with OS 
++ * return 1 if initialization was successful, 0 otherwise
++ */
++static int __init ad1816_init_card (struct address_info *hw_config, 
++      struct pnp_dev *pnp)
+ {
+-      ad1816_info    *devc = &dev_info[nr_ad1816_devs];
+-      int io_base=hw_config->io_base;
+-      int *osp=hw_config->osp;
++      ad1816_info    *devc = NULL;
+       int tmp;
++      int oss_devno = -1;
+-      printk(KERN_INFO "ad1816: AD1816 sounddriver "
+-                       "Copyright (C) 1998 by Thorsten Knabe\n");
+-      printk(KERN_INFO "ad1816: io=0x%x, irq=%d, dma=%d, dma2=%d, "
+-                       "clockfreq=%d, options=%d isadmabug=%d\n",
++      printk(KERN_INFO "ad1816: initializing card: io=0x%x, irq=%d, dma=%d, "
++                       "dma2=%d, clockfreq=%d, options=%d isadmabug=%d "
++                       "%s\n",
+              hw_config->io_base,
+              hw_config->irq,
+              hw_config->dma,
+              hw_config->dma2,
+              ad1816_clockfreq,
+              options,
+-             isa_dma_bridge_buggy);
++             isa_dma_bridge_buggy,
++             pnp?"(PNP)":"");
+-      if (!request_region(io_base, 16, "AD1816 Sound")) {
+-              printk(KERN_WARNING "ad1816: I/O port 0x%03x not free\n",
+-                                  io_base);
+-              goto err;
+-      }
+-
+-      DEBUGLOG(printk ("ad1816: detect(%x)\n", io_base));
+-      
++      /* ad1816_info structure remaining ? */
+       if (nr_ad1816_devs >= MAX_AUDIO_DEV) {
+-              printk(KERN_WARNING "ad1816: detect error - step 0\n");
+-              goto out_release_region;
++              printk(KERN_WARNING "ad1816: no more ad1816_info structures "
++                      "left\n");
++              goto out;
+       }
+-      devc->base = io_base;
+-      devc->irq_ok = 0;
+-      devc->irq = 0;
++      devc = &dev_info[nr_ad1816_devs];
++      devc->base = hw_config->io_base;
++      devc->irq = hw_config->irq;
++      devc->dma_playback=hw_config->dma;
++      devc->dma_capture=hw_config->dma2;
+       devc->opened = 0;
+-      devc->osp = osp;
++      devc->pnpdev = pnp;
+       spin_lock_init(&devc->lock);
++      if (!request_region(devc->base, 16, "AD1816 Sound")) {
++              printk(KERN_WARNING "ad1816: I/O port 0x%03x not free\n",
++                                  devc->base);
++              goto out;
++      }
++
++      printk(KERN_INFO "ad1816: Examining AD1816 at address 0x%03x.\n", 
++              devc->base);
++      
++
++      /* tests for ad1816 */
+       /* base+0: bit 1 must be set but not 255 */
+       tmp=inb(devc->base);
+       if ( (tmp&0x80)==0 || tmp==255 ) {
+-              DEBUGLOG (printk ("ad1816: Chip is not an AD1816 or chip is not active (Test 0)\n"));
++              printk (KERN_INFO "ad1816: Chip is not an AD1816 or chip "
++                      "is not active (Test 0)\n");
+               goto out_release_region;
+       }
+-
+       /* writes to ireg 8 are copied to ireg 9 */
+       ad_write(devc,8,12345); 
+       if (ad_read(devc,9)!=12345) {
+-              DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 1)\n"));
++              printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 1)\n");
+               goto out_release_region;
+       }
+   
+       /* writes to ireg 8 are copied to ireg 9 */
+       ad_write(devc,8,54321); 
+       if (ad_read(devc,9)!=54321) {
+-              DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 2)\n"));
++              printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 2)\n");
+               goto out_release_region;
+       }
+-
+       /* writes to ireg 10 are copied to ireg 11 */
+       ad_write(devc,10,54321); 
+       if (ad_read(devc,11)!=54321) {
+-              DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 3)\n"));
++              printk (KERN_INFO "ad1816: Chip is not an AD1816 (Test 3)\n");
+               goto out_release_region;
+       }
+       /* writes to ireg 10 are copied to ireg 11 */
+       ad_write(devc,10,12345); 
+       if (ad_read(devc,11)!=12345) {
+-              DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 4)\n"));
++              printk (KERN_INFO "ad1816: Chip is not an AD1816 (Test 4)\n");
+               goto out_release_region;
+       }
+@@ -1064,35 +1050,12 @@ static int __init probe_ad1816 ( struct 
+       tmp=inb(devc->base+1);
+       outb(0xff,devc->base+1); 
+       if (inb(devc->base+1)!=tmp) {
+-              DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 5)\n"));
++              printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 5)\n");
+               goto out_release_region;
+       }
+-
+   
+-      DEBUGLOG (printk ("ad1816: detect() - Detected OK\n"));
+-      DEBUGLOG (printk ("ad1816: AD1816 Version: %d\n",ad_read(devc,45)));
+-
+-      /* detection was successful */
+-      return 1; 
+-out_release_region:
+-      release_region(io_base, 16);
+-      /* detection was NOT successful */
+-err:  return 0;
+-}
+-
+-
+-/* allocate resources from the kernel. If any allocation fails, free
+-   all allocated resources and exit attach.
+-  
+- */
+-
+-static void __init attach_ad1816 (struct address_info *hw_config)
+-{
+-      int             my_dev;
+-      char            dev_name[100];
+-      ad1816_info    *devc = &dev_info[nr_ad1816_devs];
+-
+-      devc->base = hw_config->io_base;        
++      printk(KERN_INFO "ad1816: AD1816 (version %d) successfully detected!\n",
++              ad_read(devc,45));
+       /* disable all interrupts */
+       ad_write(devc,1,0);     
+@@ -1101,62 +1064,54 @@ static void __init attach_ad1816 (struct
+       outb (0, devc->base+1); 
+       /* allocate irq */
+-      if (hw_config->irq < 0 || hw_config->irq > 15)
++      if (devc->irq < 0 || devc->irq > 15)
+               goto out_release_region;
+-      if (request_irq(hw_config->irq, ad1816_interrupt,0,
+-                      "SoundPort", hw_config->osp) < 0)       {
++      if (request_irq(devc->irq, ad1816_interrupt,0,
++                      "SoundPort", devc) < 0) {
+               printk(KERN_WARNING "ad1816: IRQ in use\n");
+               goto out_release_region;
+       }
+-      devc->irq=hw_config->irq;
+       /* DMA stuff */
+-      if (sound_alloc_dma (hw_config->dma, "Sound System")) {
++      if (sound_alloc_dma (devc->dma_playback, "Sound System")) {
+               printk(KERN_WARNING "ad1816: Can't allocate DMA%d\n",
+-                                  hw_config->dma);
++                                  devc->dma_playback);
+               goto out_free_irq;
+       }
+-      devc->dma_playback=hw_config->dma;
+       
+-      if ( hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma) {
+-              if (sound_alloc_dma(hw_config->dma2,
++      if ( devc->dma_capture >= 0 && 
++              devc->dma_capture != devc->dma_playback) {
++              if (sound_alloc_dma(devc->dma_capture,
+                                   "Sound System (capture)")) {
+                       printk(KERN_WARNING "ad1816: Can't allocate DMA%d\n",
+-                                          hw_config->dma2);
++                                          devc->dma_capture);
+                       goto out_free_dma;
+               }
+-              devc->dma_capture=hw_config->dma2;
+               devc->audio_mode=DMA_AUTOMODE|DMA_DUPLEX;
+       } else {
+-              devc->dma_capture=-1;
++              printk(KERN_WARNING "ad1816: Only one DMA channel "
++                      "available/configured. No duplex operation possible\n");
+               devc->audio_mode=DMA_AUTOMODE;
+       }
+-      sprintf (dev_name,"AD1816 audio driver");
+-  
+-      conf_printf2 (dev_name,
+-                    devc->base, devc->irq, hw_config->dma, hw_config->dma2);
++      conf_printf2 ("AD1816 audio driver",
++                    devc->base, devc->irq, devc->dma_playback, 
++                    devc->dma_capture);
+       /* register device */
+-      if ((my_dev = sound_install_audiodrv (AUDIO_DRIVER_VERSION,
+-                                            dev_name,
++      if ((oss_devno = sound_install_audiodrv (AUDIO_DRIVER_VERSION,
++                                            "AD1816 audio driver",
+                                             &ad1816_audio_driver,
+                                             sizeof (struct audio_driver),
+                                             devc->audio_mode,
+                                             ad_format_mask,
+                                             devc,
+-                                            hw_config->dma, 
+-                                            hw_config->dma2)) < 0) {
++                                            devc->dma_playback, 
++                                            devc->dma_capture)) < 0) {
+               printk(KERN_WARNING "ad1816: Can't install sound driver\n");
+               goto out_free_dma_2;
+       }
+-      /* fill rest of structure with reasonable default values */
+-      irq2dev[hw_config->irq] = devc->dev_no = my_dev;
+-      devc->opened = 0;
+-      devc->irq_ok = 0;
+-      devc->osp = hw_config->osp;  
+-      nr_ad1816_devs++;
+       ad_write(devc,32,0x80f0); /* sound system mode */
+       if (options&1) {
+@@ -1186,25 +1141,30 @@ static void __init attach_ad1816 (struct
+       ad1816_mixer_reset (devc); 
+   
+       /* register mixer */
+-      if ((audio_devs[my_dev]->mixer_dev=sound_install_mixer(
++      if ((audio_devs[oss_devno]->mixer_dev=sound_install_mixer(
+                                      MIXER_DRIVER_VERSION,
+-                                     dev_name,
++                                     "AD1816 audio driver",
+                                      &ad1816_mixer_operations,
+                                      sizeof (struct mixer_operations),
+-                                     devc)) >= 0) {
+-              audio_devs[my_dev]->min_fragment = 0;
++                                     devc)) < 0) {
++              printk(KERN_WARNING "Can't install mixer\n");
+       }
+-out:  return;
++      /* make ad1816_info active */
++      nr_ad1816_devs++;
++      printk(KERN_INFO "ad1816: card successfully installed!\n");
++      return 1;
++      /* error handling */
+ out_free_dma_2:
+-      if (devc->dma_capture >= 0)
+-              sound_free_dma(hw_config->dma2);
++      if (devc->dma_capture >= 0 && devc->dma_capture != devc->dma_playback)
++              sound_free_dma(devc->dma_capture);
+ out_free_dma:
+-      sound_free_dma(hw_config->dma);
++      sound_free_dma(devc->dma_playback);
+ out_free_irq:
+-      free_irq(hw_config->irq,hw_config->osp);
++      free_irq(devc->irq, devc);
+ out_release_region:
+-      release_region(hw_config->io_base, 16);
+-      goto out;
++      release_region(devc->base, 16);
++out:
++      return 0;
+ }
+ static void __exit unload_card(ad1816_info *devc)
+@@ -1212,7 +1172,7 @@ static void __exit unload_card(ad1816_in
+       int  mixer, dev = 0;
+       
+       if (devc != NULL) {
+-              DEBUGLOG (printk("ad1816: Unloading card at base=%x\n",devc->base));
++              printk("ad1816: Unloading card at address 0x%03x\n",devc->base);
+               
+               dev = devc->dev_no;
+               mixer = audio_devs[dev]->mixer_dev;
+@@ -1221,45 +1181,41 @@ static void __exit unload_card(ad1816_in
+               if(mixer>=0) {
+                       sound_unload_mixerdev(mixer);
+               }
++              /* unreg audiodev */
+               sound_unload_audiodev(dev);
+               
+               /* free dma channels */
+-              if (devc->dma_capture>=0) {
++              if (devc->dma_capture>=0 && 
++                      devc->dma_capture != devc->dma_playback) {
+                       sound_free_dma(devc->dma_capture);
+               }
+-
+-              /* card won't get added if resources could not be allocated
+-                 thus we need not ckeck if allocation was successful */
+               sound_free_dma (devc->dma_playback);
+-              free_irq(devc->irq, devc->osp);
++              /* free irq */
++              free_irq(devc->irq, devc);
++              /* free io */
+               release_region (devc->base, 16);
+-              
+-              DEBUGLOG (printk("ad1816: Unloading card at base=%x was successful\n",devc->base));
++#ifdef __ISAPNP__
++              if (devc->pnpdev) {
++                      pnp_disable_dev(devc->pnpdev);
++                      pnp_device_detach(devc->pnpdev);
++              }
++#endif
+               
+       } else
+               printk(KERN_WARNING "ad1816: no device/card specified\n");
+ }
+-static struct address_info cfg;
+-
+ static int __initdata io = -1;
+ static int __initdata irq = -1;
+ static int __initdata dma = -1;
+ static int __initdata dma2 = -1;
+ #ifdef __ISAPNP__
+-struct pci_dev        *ad1816_dev  = NULL;
+-
+-static int activated  = 1;
+-
++/* use isapnp for configuration */
+ static int isapnp     = 1;
+ static int isapnpjump = 0;
+-
+ MODULE_PARM(isapnp, "i");
+ MODULE_PARM(isapnpjump, "i");
+-
+-#else
+-static int isapnp = 0;
+ #endif
+ MODULE_PARM(io,"i");
+@@ -1270,51 +1226,6 @@ MODULE_PARM(ad1816_clockfreq,"i");
+ MODULE_PARM(options,"i");
+ #ifdef __ISAPNP__
+-
+-static struct pci_dev *activate_dev(char *devname, char *resname, struct pci_dev *dev)
+-{
+-      int err;
+-      
+-      if(dev->active) {
+-              activated = 0;
+-              return(dev);
+-      }
+-
+-      if((err = dev->activate(dev)) < 0) {
+-              printk(KERN_ERR "ad1816: %s %s config failed (out of resources?)[%d]\n",
+-                      devname, resname, err);
+-              dev->deactivate(dev);
+-              return(NULL);
+-      }
+-              
+-      return(dev);
+-}
+-
+-static struct pci_dev *ad1816_init_generic(struct pci_bus *bus, struct pci_dev *card,
+-      struct address_info *hw_config)
+-{
+-      if((ad1816_dev = isapnp_find_dev(bus, card->vendor, card->device, NULL))) {
+-              ad1816_dev->prepare(ad1816_dev);
+-              
+-              if((ad1816_dev = activate_dev("Analog Devices 1816(A)", "ad1816", ad1816_dev))) {
+-                      hw_config->io_base      = ad1816_dev->resource[2].start;
+-                      hw_config->irq          = ad1816_dev->irq_resource[0].start;
+-                      hw_config->dma          = ad1816_dev->dma_resource[0].start;
+-                      hw_config->dma2         = ad1816_dev->dma_resource[1].start;
+-              }
+-      }
+-      
+-      return(ad1816_dev);
+-}
+-
+-static struct ad1816_data {
+-      struct pci_dev * (*initfunc)(struct pci_bus*, struct pci_dev *, struct address_info *);
+-      char *name;
+-} ad1816_pnp_data[] __initdata = {
+-      { &ad1816_init_generic, "Analog Devices 1815" },
+-      { &ad1816_init_generic, "Analog Devices 1816A" }
+-};
+-
+ static struct {
+       unsigned short card_vendor, card_device;
+       unsigned short vendor;
+@@ -1323,107 +1234,101 @@ static struct {
+ } isapnp_ad1816_list[] __initdata = {
+       {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
+               ISAPNP_VENDOR('A','D','S'), ISAPNP_FUNCTION(0x7150), 
+-              &ad1816_pnp_data[0] },
++              0 },
+       {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
+               ISAPNP_VENDOR('A','D','S'), ISAPNP_FUNCTION(0x7180),
+-              &ad1816_pnp_data[1] },
++              0 },
+       {0}
+ };
+ MODULE_DEVICE_TABLE(isapnp, isapnp_ad1816_list);
+-static int __init ad1816_init_isapnp(struct address_info *hw_config,
+-      struct pci_bus *bus, struct pci_dev *card, int slot)
++
++void __init ad1816_config_pnp_card(struct pnp_card *card, unsigned short vendor,
++      unsigned short function)
+ {
+-      struct pci_dev *idev = NULL;
+-      
+-      /* You missed the init func? That's bad. */
+-      if(isapnp_ad1816_list[slot].data->initfunc) {
+-              char *busname = bus->name[0] ? bus->name : isapnp_ad1816_list[slot].data->name;
+-              
+-              printk(KERN_INFO "ad1816: %s detected\n", busname);
+-              
+-              /* Initialize this baby. */
+-              if((idev = isapnp_ad1816_list[slot].data->initfunc(bus, card, hw_config))) {
+-                      /* We got it. */
+-
+-                      printk(KERN_NOTICE "ad1816: ISAPnP reports '%s' at i/o %#x, irq %d, dma %d, %d\n",
+-                              busname,
+-                              hw_config->io_base, hw_config->irq, hw_config->dma,
+-                              hw_config->dma2);
+-                      return 1;
+-              } else
+-                      printk(KERN_INFO "ad1816: Failed to initialize %s\n", busname);
+-      } else
+-              printk(KERN_ERR "ad1816: Bad entry in ad1816.c PnP table\n");
+-      
+-      return 0;
++      struct address_info cfg;
++      struct pnp_dev *card_dev = pnp_find_dev(card, vendor, function, NULL);
++      if (!card_dev) return;
++      if (pnp_device_attach(card_dev) < 0) {
++              printk(KERN_WARNING "ad1816: Failed to attach PnP device\n");
++              return;
++      }
++      if (pnp_activate_dev(card_dev) < 0) {
++              printk(KERN_WARNING "ad1816: Failed to activate PnP device\n");
++              pnp_device_detach(card_dev);
++              return;
++      }
++      cfg.io_base = pnp_port_start(card_dev, 2);
++      cfg.irq = pnp_irq(card_dev, 0);
++      cfg.dma = pnp_irq(card_dev, 0);
++      cfg.dma2 = pnp_irq(card_dev, 1);
++      if (!ad1816_init_card(&cfg, card_dev)) {
++              pnp_disable_dev(card_dev);
++              pnp_device_detach(card_dev);
++      }
+ }
+-/*
+- * Actually this routine will detect and configure only the first card with successful
+- * initialization. isapnpjump could be used to jump to a specific entry.
+- * Please always add entries at the end of the array.
+- * Should this be fixed? - azummo
+- */
+-
+-int __init ad1816_probe_isapnp(struct address_info *hw_config)
++void __init ad1816_config_pnp_cards(void)
+ {
++      int nr_pnp_cfg;
+       int i;
+       
+       /* Count entries in isapnp_ad1816_list */
+-      for (i = 0; isapnp_ad1816_list[i].vendor != 0; i++)
+-              ;
++      for (nr_pnp_cfg = 0; isapnp_ad1816_list[nr_pnp_cfg].card_vendor != 0; 
++              nr_pnp_cfg++);
+       /* Check and adjust isapnpjump */
+-      if( isapnpjump < 0 || isapnpjump > ( i - 1 ) ) {
+-              printk(KERN_ERR "ad1816: Valid range for isapnpjump is 0-%d. Adjusted to 0.\n", i-1);
++      if( isapnpjump < 0 || isapnpjump >= nr_pnp_cfg) {
++              printk(KERN_WARNING 
++                      "ad1816: Valid range for isapnpjump is 0-%d. "
++                      "Adjusted to 0.\n", nr_pnp_cfg-1);
+               isapnpjump = 0;
+       }
+-
+-       for (i = isapnpjump; isapnp_ad1816_list[i].vendor != 0; i++) {
+-              struct pci_dev *card = NULL;
+-              
+-              while ((card = isapnp_find_dev(NULL, isapnp_ad1816_list[i].vendor,
+-                isapnp_ad1816_list[i].function, card)))
+-                      if(ad1816_init_isapnp(hw_config, card->bus, card, i))
+-                              return 0;
++      for (i = isapnpjump; isapnp_ad1816_list[i].card_vendor != 0; i++) {
++              struct pnp_card *card = NULL;
++              /* iterate over all pnp cards */                
++              while ((card = pnp_find_card(isapnp_ad1816_list[i].card_vendor,
++                              isapnp_ad1816_list[i].card_device, card))) 
++                      ad1816_config_pnp_card(card, 
++                              isapnp_ad1816_list[i].vendor,
++                              isapnp_ad1816_list[i].function);
+       }
+-
+-      return -ENODEV;
+ }
+ #endif
++/* module initialization */
+ static int __init init_ad1816(void)
+ {
+-
+-#ifdef __ISAPNP__
+-      if(isapnp && (ad1816_probe_isapnp(&cfg) < 0) ) {
+-              printk(KERN_NOTICE "ad1816: No ISAPnP cards found, trying standard ones...\n");
+-              isapnp = 0;
+-      }
++      printk(KERN_INFO "ad1816: AD1816 sounddriver "
++                       "Copyright (C) 1998-2003 by Thorsten Knabe and "
++                       "others\n");
++#ifdef AD1816_CLOCK 
++      /* set ad1816_clockfreq if set during compilation */
++      ad1816_clockfreq=AD1816_CLOCK;
+ #endif
+-
+-      if( isapnp == 0) {
+-              cfg.io_base     = io;
+-              cfg.irq         = irq;
+-              cfg.dma         = dma;
+-              cfg.dma2        = dma2;
+-      }
+-
+-      if (cfg.io_base == -1 || cfg.irq == -1 || cfg.dma == -1 || cfg.dma2 == -1) {
+-              printk(KERN_INFO "ad1816: dma, dma2, irq and io must be set.\n");
+-              return -EINVAL;
++      if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
++              ad1816_clockfreq=33000;
+       }
+-      if (probe_ad1816(&cfg) == 0) {
+-              return -ENODEV;
++#ifdef __ISAPNP__
++      /* configure PnP cards */
++      if(isapnp) ad1816_config_pnp_cards();
++#endif
++      /* configure card by module params */
++      if (io != -1 && irq != -1 && dma != -1) {
++              struct address_info cfg;
++              cfg.io_base = io;
++              cfg.irq = irq;
++              cfg.dma = dma;
++              cfg.dma2 = dma2;
++              ad1816_init_card(&cfg, NULL);
+       }
+-
+-      attach_ad1816(&cfg);
+-
++      if (nr_ad1816_devs <= 0)
++              return -ENODEV;
+       return 0;
+ }
++/* module cleanup */
+ static void __exit cleanup_ad1816 (void)
+ {
+       int          i;
+@@ -1435,18 +1340,14 @@ static void __exit cleanup_ad1816 (void)
+               unload_card(devc);
+       }     
+       nr_ad1816_devs=0;
+-
+-#ifdef __ISAPNP__
+-      if(activated)
+-              if(ad1816_dev)
+-                      ad1816_dev->deactivate(ad1816_dev);
+-#endif
++      printk(KERN_INFO "ad1816: driver unloaded!\n");
+ }
+ module_init(init_ad1816);
+ module_exit(cleanup_ad1816);
+ #ifndef MODULE
++/* kernel command line parameter evaluation */
+ static int __init setup_ad1816(char *str)
+ {
+       /* io, irq, dma, dma2 */
+@@ -1458,7 +1359,6 @@ static int __init setup_ad1816(char *str
+       irq     = ints[2];
+       dma     = ints[3];
+       dma2    = ints[4];
+-
+       return 1;
+ }
+--- linux-2.6.0-test1/sound/oss/ad1889.c       2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/ad1889.c      2003-07-19 17:03:51.000000000 -0700
+@@ -245,7 +245,6 @@ static ad1889_dev_t *ad1889_alloc_dev(st
+               dmabuf->ready = 0;
+               dmabuf->rate = 44100;
+       }
+-out:
+       return dev;
+ err_free_dmabuf:
+--- linux-2.6.0-test1/sound/oss/btaudio.c      2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/btaudio.c     2003-07-19 17:03:51.000000000 -0700
+@@ -328,8 +328,8 @@ static int btaudio_mixer_ioctl(struct in
+       if (cmd == SOUND_MIXER_INFO) {
+               mixer_info info;
+               memset(&info,0,sizeof(info));
+-                strncpy(info.id,"bt878",sizeof(info.id));
+-                strncpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
++                strlcpy(info.id,"bt878",sizeof(info.id));
++                strlcpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
+                 info.modify_counter = bta->mixcount;
+                 if (copy_to_user((void *)arg, &info, sizeof(info)))
+                         return -EFAULT;
+@@ -338,8 +338,8 @@ static int btaudio_mixer_ioctl(struct in
+       if (cmd == SOUND_OLD_MIXER_INFO) {
+               _old_mixer_info info;
+               memset(&info,0,sizeof(info));
+-                strncpy(info.id,"bt878",sizeof(info.id)-1);
+-                strncpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
++                strlcpy(info.id,"bt878",sizeof(info.id)-1);
++                strlcpy(info.name,"Brooktree Bt878 audio",sizeof(info.name));
+                 if (copy_to_user((void *)arg, &info, sizeof(info)))
+                         return -EFAULT;
+               return 0;
+--- linux-2.6.0-test1/sound/oss/dmasound/dmasound_core.c       2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/dmasound/dmasound_core.c      2003-07-19 17:03:51.000000000 -0700
+@@ -1660,13 +1660,13 @@ static int __init dmasound_setup(char *s
+ #ifdef HAS_RECORD
+         case 5:
+                 if ((ints[5] < 0) || (ints[5] > MAX_CATCH_RADIUS))
+-                        printk("dmasound_setup: illegal catch radius, using default = %d\n", catchRadius);
++                        printk("dmasound_setup: invalid catch radius, using default = %d\n", catchRadius);
+                 else
+                         catchRadius = ints[5];
+                 /* fall through */
+         case 4:
+                 if (ints[4] < MIN_BUFFERS)
+-                        printk("dmasound_setup: illegal number of read buffers, using default = %d\n",
++                        printk("dmasound_setup: invalid number of read buffers, using default = %d\n",
+                                  numReadBufs);
+                 else
+                         numReadBufs = ints[4];
+@@ -1675,21 +1675,21 @@ static int __init dmasound_setup(char *s
+               if ((size = ints[3]) < 256)  /* check for small buffer specs */
+                       size <<= 10 ;
+                 if (size < MIN_BUFSIZE || size > MAX_BUFSIZE)
+-                        printk("dmasound_setup: illegal read buffer size, using default = %d\n", readBufSize);
++                        printk("dmasound_setup: invalid read buffer size, using default = %d\n", readBufSize);
+                 else
+                         readBufSize = size;
+                 /* fall through */
+ #else
+       case 3:
+               if ((ints[3] < 0) || (ints[3] > MAX_CATCH_RADIUS))
+-                      printk("dmasound_setup: illegal catch radius, using default = %d\n", catchRadius);
++                      printk("dmasound_setup: invalid catch radius, using default = %d\n", catchRadius);
+               else
+                       catchRadius = ints[3];
+               /* fall through */
+ #endif
+       case 2:
+               if (ints[1] < MIN_BUFFERS)
+-                      printk("dmasound_setup: illegal number of buffers, using default = %d\n", numWriteBufs);
++                      printk("dmasound_setup: invalid number of buffers, using default = %d\n", numWriteBufs);
+               else
+                       numWriteBufs = ints[1];
+               /* fall through */
+@@ -1697,13 +1697,13 @@ static int __init dmasound_setup(char *s
+               if ((size = ints[2]) < 256) /* check for small buffer specs */
+                       size <<= 10 ;
+                 if (size < MIN_BUFSIZE || size > MAX_BUFSIZE)
+-                        printk("dmasound_setup: illegal write buffer size, using default = %d\n", writeBufSize);
++                        printk("dmasound_setup: invalid write buffer size, using default = %d\n", writeBufSize);
+                 else
+                         writeBufSize = size;
+       case 0:
+               break;
+       default:
+-              printk("dmasound_setup: illegal number of arguments\n");
++              printk("dmasound_setup: invalid number of arguments\n");
+               return 0;
+       }
+       return 1;
+--- linux-2.6.0-test1/sound/oss/emu10k1/8010.h 2003-06-14 12:17:56.000000000 -0700
++++ 25/sound/oss/emu10k1/8010.h        2003-07-19 17:03:51.000000000 -0700
+@@ -1,7 +1,7 @@
+ /*
+  **********************************************************************
+  *     8010.h
+- *     Copyright 1999, 2000 Creative Labs, Inc.
++ *     Copyright 1999-2001 Creative Labs, Inc.
+  *
+  **********************************************************************
+  *
+@@ -11,6 +11,8 @@
+  *     November 2, 1999     Alan Cox      Cleaned of 8bit chars, DOS
+  *                                        line endings
+  *     December 8, 1999     Jon Taylor            Added lots of new register info
++ *     May 16, 2001         Daniel Bertrand Added unofficial DBG register info
++ *     Oct-Nov 2001         D.B.            Added unofficial Audigy registers 
+  *
+  **********************************************************************
+  *
+@@ -39,6 +41,14 @@
+ #include <linux/types.h>
++// Driver version:
++#define MAJOR_VER 0
++#define MINOR_VER 20
++#define DRIVER_VERSION "0.20a"
++
++
++// Audigy specify registers are prefixed with 'A_'
++
+ /************************************************************************************************/
+ /* PCI function 0 registers, address = <val> + PCIBASE0                                               */
+ /************************************************************************************************/
+@@ -57,6 +67,11 @@
+ #define IPR                   0x08            /* Global interrupt pending register            */
+                                               /* Clear pending interrupts by writing a 1 to   */
+                                               /* the relevant bits and zero to the other bits */
++
++/* The next two interrupts are for the midi port on the Audigy Drive (A_MPU1)                 */
++#define A_IPR_MIDITRANSBUFEMPTY2      0x10000000      /* MIDI UART transmit buffer empty              */
++#define A_IPR_MIDIRECVBUFEMPTY2       0x08000000      /* MIDI UART receive buffer empty               */
++
+ #define IPR_SAMPLERATETRACKER 0x01000000      /* Sample rate tracker lock status change       */
+ #define IPR_FXDSP             0x00800000      /* Enable FX DSP interrupts                     */
+ #define IPR_FORCEINT          0x00400000      /* Force Sound Blaster interrupt                */
+@@ -81,6 +96,10 @@
+                                               /* IP is written with CL set, the bit in CLIPL  */
+                                               /* or CLIPH corresponding to the CIN value      */
+                                               /* written will be cleared.                     */
++#define A_IPR_MIDITRANSBUFEMPTY1      IPR_MIDITRANSBUFEMPTY   /* MIDI UART transmit buffer empty              */
++#define A_IPR_MIDIRECVBUFEMPTY1       IPR_MIDIRECVBUFEMPTY    /* MIDI UART receive buffer empty               */
++
++
+ #define INTE                  0x0c            /* Interrupt enable register                    */
+ #define INTE_VIRTUALSB_MASK   0xc0000000      /* Virtual Soundblaster I/O port capture        */
+@@ -108,6 +127,11 @@
+                                               /* behavior and possibly random segfaults and   */
+                                               /* lockups if enabled.                          */
++/* The next two interrupts are for the midi port on the Audigy Drive (A_MPU1)                 */
++#define A_INTE_MIDITXENABLE2  0x00020000      /* Enable MIDI transmit-buffer-empty interrupts */
++#define A_INTE_MIDIRXENABLE2  0x00010000      /* Enable MIDI receive-buffer-empty interrupts  */
++
++
+ #define INTE_SAMPLERATETRACKER        0x00002000      /* Enable sample rate tracker interrupts        */
+                                               /* NOTE: This bit must always be enabled        */
+ #define INTE_FXDSPENABLE      0x00001000      /* Enable FX DSP interrupts                     */
+@@ -124,6 +148,10 @@
+ #define INTE_MIDITXENABLE     0x00000002      /* Enable MIDI transmit-buffer-empty interrupts */
+ #define INTE_MIDIRXENABLE     0x00000001      /* Enable MIDI receive-buffer-empty interrupts  */
++/* The next two interrupts are for the midi port on the Audigy (A_MPU2)       */
++#define A_INTE_MIDITXENABLE1          INTE_MIDITXENABLE
++#define A_INTE_MIDIRXENABLE1  INTE_MIDIRXENABLE
++
+ #define WC                    0x10            /* Wall Clock register                          */
+ #define WC_SAMPLECOUNTER_MASK 0x03FFFFC0      /* Sample periods elapsed since reset           */
+ #define WC_SAMPLECOUNTER      0x14060010
+@@ -186,6 +214,8 @@
+                                               /* Should be set to 1 when the EMU10K1 is       */
+                                               /* completely initialized.                      */
++//For Audigy, MPU port move to 0x70-0x74 ptr register
++
+ #define MUDATA                        0x18            /* MPU401 data register (8 bits)                */
+ #define MUCMD                 0x19            /* MPU401 command register (8 bits)             */
+@@ -197,13 +227,16 @@
+ #define MUSTAT_IRDYN          0x80            /* 0 = MIDI data or command ACK                 */
+ #define MUSTAT_ORDYN          0x40            /* 0 = MUDATA can accept a command or data      */
+-#define TIMER                 0x1a            /* Timer terminal count register                */
++#define A_IOCFG                       0x18            /* GPIO on Audigy card (16bits)                 */
++#define A_GPINPUT_MASK                0xff00
++#define A_GPOUTPUT_MASK               0x00ff
++
++#define TIMER                 0x1a            /* Timer terminal count register (16-bit)       */
+                                               /* NOTE: After the rate is changed, a maximum   */
+                                               /* of 1024 sample periods should be allowed     */
+                                               /* before the new rate is guaranteed accurate.  */
+-#define TIMER_RATE_MASK               0x000003ff      /* Timer interrupt rate in sample periods       */
++#define TIMER_RATE_MASK               0x03ff          /* Timer interrupt rate in sample periods       */
+                                               /* 0 == 1024 periods, [1..4] are not useful     */
+-#define TIMER_RATE            0x0a00001a
+ #define AC97DATA              0x1c            /* AC97 register set data register (16 bit)     */
+@@ -386,6 +419,8 @@
+ #define TREMFRQ               0x1c            /* Tremolo amount and modulation LFO frequency register */
+ #define TREMFRQ_DEPTH         0x0000ff00      /* Tremolo depth                                        */
+                                               /* Signed 2's complement, with +/- 12dB extremes        */
++#define TREMFRQ_FREQUENCY     0x000000ff      /* Tremolo LFO frequency                                */
++                                              /* ??Hz steps, maximum of ?? Hz.                        */
+ #define FM2FRQ2               0x1d            /* Vibrato amount and vibrato LFO frequency register    */
+ #define FM2FRQ2_DEPTH         0x0000ff00      /* Vibrato LFO vibrato depth                            */
+@@ -426,7 +461,12 @@
+ #define ADCCR_LCHANENABLE     0x00000008      /* Enables left channel for writing to the host         */
+                                               /* NOTE: To guarantee phase coherency, both channels    */
+                                               /* must be disabled prior to enabling both channels.    */
++#define A_ADCCR_RCHANENABLE   0x00000020
++#define A_ADCCR_LCHANENABLE   0x00000010
++
++#define A_ADCCR_SAMPLERATE_MASK 0x0000000F      /* Audigy sample rate convertor output rate           */
+ #define ADCCR_SAMPLERATE_MASK 0x00000007      /* Sample rate convertor output rate                    */
++
+ #define ADCCR_SAMPLERATE_48   0x00000000      /* 48kHz sample rate                                    */
+ #define ADCCR_SAMPLERATE_44   0x00000001      /* 44.1kHz sample rate                                  */
+ #define ADCCR_SAMPLERATE_32   0x00000002      /* 32kHz sample rate                                    */
+@@ -436,10 +476,16 @@
+ #define ADCCR_SAMPLERATE_11   0x00000006      /* 11.025kHz sample rate                                */
+ #define ADCCR_SAMPLERATE_8    0x00000007      /* 8kHz sample rate                                     */
++#define A_ADCCR_SAMPLERATE_12 0x00000006      /* 12kHz sample rate                                    */
++#define A_ADCCR_SAMPLERATE_11 0x00000007      /* 11.025kHz sample rate                                */
++#define A_ADCCR_SAMPLERATE_8  0x00000008      /* 8kHz sample rate                                     */
++
+ #define FXWC                  0x43            /* FX output write channels register                    */
+                                               /* When set, each bit enables the writing of the        */
+-                                              /* corresponding FX output channel into host memory     */
+-
++                                              /* corresponding FX output channel (internal registers  */
++                                              /* 0x20-0x3f) into host memory. This mode of recording  */
++                                              /* is 16bit, 48KHz only. All 32 channels can be enabled */
++                                              /* simultaneously.                                      */
+ #define TCBS                  0x44            /* Tank cache buffer size register                      */
+ #define TCBS_MASK             0x00000007      /* Tank cache buffer size field                         */
+ #define TCBS_BUFFSIZE_16K     0x00000000
+@@ -519,6 +565,13 @@
+ #define REG53                 0x53            /* DO NOT PROGRAM THIS REGISTER!!! MAY DESTROY CHIP */
++#define A_DBG                  0x53
++#define A_DBG_SINGLE_STEP      0x00020000     /* Set to zero to start dsp */
++#define A_DBG_ZC               0x40000000     /* zero tram counter */
++#define A_DBG_STEP_ADDR                0x000003ff
++#define A_DBG_SATURATION_OCCURED 0x20000000
++#define A_DBG_SATURATION_ADDR  0x0ffc0000
++
+ #define SPCS0                 0x54            /* SPDIF output Channel Status 0 register       */
+ #define SPCS1                 0x55            /* SPDIF output Channel Status 1 register       */
+@@ -582,10 +635,19 @@
+ #define SRCS_RATELOCKED               0x01000000      /* Sample rate locked                           */
+ #define SRCS_ESTSAMPLERATE    0x0007ffff      /* Do not modify this field.                    */
++
++/* Note that these values can vary +/- by a small amount                                        */
++#define SRCS_SPDIFRATE_44     0x0003acd9
++#define SRCS_SPDIFRATE_48     0x00040000
++#define SRCS_SPDIFRATE_96     0x00080000
++
+ #define MICIDX                  0x63            /* Microphone recording buffer index register   */
+ #define MICIDX_MASK             0x0000ffff      /* 16-bit value                                 */
+ #define MICIDX_IDX            0x10000063
++#define A_ADCIDX              0x63
++#define A_ADCIDX_IDX          0x10000063
++
+ #define ADCIDX                        0x64            /* ADC recording buffer index register          */
+ #define ADCIDX_MASK           0x0000ffff      /* 16 bit index field                           */
+ #define ADCIDX_IDX            0x10000064
+@@ -594,9 +656,50 @@
+ #define FXIDX_MASK            0x0000ffff      /* 16-bit value                                 */
+ #define FXIDX_IDX             0x10000065
++/* This is the MPU port on the card (via the game port)                                               */
++#define A_MUDATA1             0x70
++#define A_MUCMD1              0x71
++#define A_MUSTAT1             A_MUCMD1
++
++/* This is the MPU port on the Audigy Drive                                                   */
++#define A_MUDATA2             0x72
++#define A_MUCMD2              0x73
++#define A_MUSTAT2             A_MUCMD2        
++
++/* The next two are the Audigy equivalent of FXWC                                             */
++/* the Audigy can record any output (16bit, 48kHz, up to 64 channel simultaneously)           */
++/* Each bit selects a channel for recording */
++#define A_FXWC1                       0x74            /* Selects 0x7f-0x60 for FX recording           */
++#define A_FXWC2                       0x75            /* Selects 0x9f-0x80 for FX recording           */
++
++#define A_SPDIF_SAMPLERATE    0x76            /* Set the sample rate of SPDIF output          */
++#define A_SPDIF_48000         0x00000080
++#define A_SPDIF_44100         0x00000000
++#define A_SPDIF_96000         0x00000040
++
++#define A_FXRT2                       0x7c
++#define A_FXRT_CHANNELE               0x0000003f      /* Effects send bus number for channel's effects send E */
++#define A_FXRT_CHANNELF               0x00003f00      /* Effects send bus number for channel's effects send F */
++#define A_FXRT_CHANNELG               0x003f0000      /* Effects send bus number for channel's effects send G */
++#define A_FXRT_CHANNELH               0x3f000000      /* Effects send bus number for channel's effects send H */
++
++#define A_SENDAMOUNTS         0x7d
++#define A_FXSENDAMOUNT_E_MASK 0xff000000
++#define A_FXSENDAMOUNT_F_MASK 0x00ff0000
++#define A_FXSENDAMOUNT_G_MASK 0x0000ff00
++#define A_FXSENDAMOUNT_H_MASK 0x000000ff
++
++/* The send amounts for this one are the same as used with the emu10k1 */
++#define A_FXRT1                       0x7e
++#define A_FXRT_CHANNELA               0x0000003f
++#define A_FXRT_CHANNELB               0x00003f00
++#define A_FXRT_CHANNELC               0x003f0000
++#define A_FXRT_CHANNELD               0x3f000000
++
++
+ /* Each FX general purpose register is 32 bits in length, all bits are used                   */
+ #define FXGPREGBASE           0x100           /* FX general purpose registers base            */
+-
++#define A_FXGPREGBASE         0x400           /* Audigy GPRs, 0x400 to 0x5ff                  */
+ /* Tank audio data is logarithmically compressed down to 16 bits before writing to TRAM and is        */
+ /* decompressed back to 20 bits on a read.  There are a total of 160 locations, the last 32   */
+ /* locations are for external TRAM.                                                           */
+@@ -621,4 +724,14 @@
+ #define HIWORD_RESULT_MASK    0x000ffc00      /* Instruction result                           */
+ #define HIWORD_OPA_MASK               0x000003ff      /* Instruction operand A                        */
++
++/* Audigy Soundcard have a different instruction format */
++#define AUDIGY_CODEBASE               0x600
++#define A_LOWORD_OPY_MASK     0x000007ff              
++#define A_LOWORD_OPX_MASK     0x007ff000
++#define A_HIWORD_OPCODE_MASK  0x0f000000
++#define A_HIWORD_RESULT_MASK  0x007ff000
++#define A_HIWORD_OPA_MASK     0x000007ff
++
++
+ #endif /* _8010_H */
+--- linux-2.6.0-test1/sound/oss/emu10k1/audio.c        2003-06-14 12:17:57.000000000 -0700
++++ 25/sound/oss/emu10k1/audio.c       2003-07-19 17:03:51.000000000 -0700
+@@ -158,8 +158,8 @@ static ssize_t emu10k1_audio_write(struc
+               spin_unlock_irqrestore(&woinst->lock, flags);
+               return -ENXIO;
+       }
+-
+-      if (woinst->format.passthrough) {
++      // This is for emu10k1 revs less than 7, we need to go through tram
++      if (woinst->format.passthrough == 1) {
+               int r;
+               
+               woinst->buffer.ossfragshift = PT_BLOCKSIZE_LOG2;
+@@ -350,8 +350,9 @@ static int emu10k1_audio_ioctl(struct in
+       case SNDCTL_DSP_GETCAPS:
+               DPF(2, "SNDCTL_DSP_GETCAPS:\n");
+-              return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP | DSP_CAP_COPROC, (int *) arg);
+-
++              return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
++                              DSP_CAP_TRIGGER | DSP_CAP_MMAP |
++                              DSP_CAP_COPROC| DSP_CAP_MULTI, (int *) arg);
+       case SNDCTL_DSP_SPEED:
+               DPF(2, "SNDCTL_DSP_SPEED:\n");
+@@ -528,8 +529,8 @@ static int emu10k1_audio_ioctl(struct in
+               else if (file->f_mode & FMODE_WRITE) {
+                       val = AFMT_S16_LE | AFMT_U8;
+                       if (emu10k1_find_control_gpr(&wave_dev->card->mgr,
+-                                                   wave_dev->card->pt.patch_name, 
+-                                                   wave_dev->card->pt.enable_gpr_name) >= 0)
++                                                   wave_dev->card->pt.patch_name, 
++                                                   wave_dev->card->pt.enable_gpr_name) >= 0)
+                               val |= AFMT_AC3;
+               }
+               return put_user(val, (int *) arg);
+@@ -789,7 +790,7 @@ static int emu10k1_audio_ioctl(struct in
+                               cinfo.blocks = 0;
+                       }
+-                      if(wiinst->mmapped)
++                      if (wiinst->mmapped)
+                               wiinst->buffer.bytestocopy %= wiinst->buffer.fragment_size;
+                       spin_unlock_irqrestore(&wiinst->lock, flags);
+@@ -811,15 +812,17 @@ static int emu10k1_audio_ioctl(struct in
+                       spin_lock_irqsave(&woinst->lock, flags);
+                       if (woinst->state & WAVE_STATE_OPEN || 
+-                          (woinst->format.passthrough && wave_dev->card->pt.state)) {
++                          ((woinst->format.passthrough == 1) && wave_dev->card->pt.state)) {
+                               int num_fragments;
+-                              if (woinst->format.passthrough) {
++
++                              if (woinst->format.passthrough == 1) {
+                                       emu10k1_pt_waveout_update(wave_dev);
+                                       cinfo.bytes = woinst->total_played;
+                               } else {
+                                       emu10k1_waveout_update(woinst);
+                                       cinfo.bytes = woinst->total_played;
+                               }
++
+                               cinfo.ptr = woinst->buffer.hw_pos;
+                               num_fragments = cinfo.bytes / woinst->buffer.fragment_size;
+                               cinfo.blocks = num_fragments - woinst->blocks;
+@@ -899,7 +902,7 @@ static int emu10k1_audio_ioctl(struct in
+               if (file->f_mode & FMODE_WRITE) {
+                       /* digital pass-through fragment count and size are fixed values */
+-                      if (woinst->state & WAVE_STATE_OPEN || woinst->format.passthrough)
++                      if (woinst->state & WAVE_STATE_OPEN || (woinst->format.passthrough == 1))
+                               return -EINVAL; /* too late to change */
+                       woinst->buffer.ossfragshift = val & 0xffff;
+@@ -936,19 +939,35 @@ static int emu10k1_audio_ioctl(struct in
+                               kfree (buf);
+                               return -EINVAL;
+                       }
++
++                      if (buf->command == CMD_WRITE) {
++                              
+ #ifdef DBGEMU
+-                      if ( (buf->offs < 0) || (buf->offs + buf->len > 0x800) || (buf->len > 1000)) {
++                              if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
+ #else
+-                      if ( ((buf->offs < 0x100 ) || (buf->offs + buf->len > 0x800) || (buf->len > 1000))
+-                           && !( ( buf->offs == DBG) && (buf->len ==1) )){
+-#endif        
+-                              kfree(buf);
+-                              return -EINVAL;
+-                      }
++                              if (((buf->offs < 0x100) || (buf->offs + buf->len > (wave_dev->card->is_audigy ? 0xe00 : 0x800)) || (buf->len > 1000)
++                              ) && !(
++                                      //any register allowed raw access to users goes here:
++                                      (buf->offs == DBG ||
++                                        buf->offs == A_DBG)
++                                      && (buf->len == 1))) {
++#endif                
++                                      kfree(buf);
++                                      return -EINVAL;
++                              }
++                      } else {
++                              if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
++                                      kfree(buf);
++                                      return -EINVAL;
++                              }
++                      }                       
++                              
++                      if (((unsigned)buf->flags) > 0x3f)
++                              buf->flags = 0;
+                       if (buf->command == CMD_READ) {
+                               for (i = 0; i < buf->len; i++)
+-                                      ((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, 0);
++                                      ((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, buf->flags);
+                               if (copy_to_user((copr_buffer *) arg, buf, sizeof(copr_buffer))) {
+                                       kfree(buf);
+@@ -956,7 +975,7 @@ static int emu10k1_audio_ioctl(struct in
+                               }
+                       } else {
+                               for (i = 0; i < buf->len; i++)
+-                                      sblive_writeptr(wave_dev->card, buf->offs + i, 0, ((u32 *) buf->data)[i]);
++                                      sblive_writeptr(wave_dev->card, buf->offs + i, buf->flags, ((u32 *) buf->data)[i]);
+                       }
+                       kfree (buf);
+@@ -1244,8 +1263,9 @@ static int emu10k1_audio_release(struct 
+               struct woinst *woinst = wave_dev->woinst;
+               spin_lock_irqsave(&woinst->lock, flags);
+-
+-              if (woinst->format.passthrough && card->pt.state != PT_STATE_INACTIVE) {
++              if(woinst->format.passthrough==2)
++                      card->pt.state=PT_STATE_PLAYING;
++              if (woinst->format.passthrough && card->pt.state != PT_STATE_INACTIVE){
+                       spin_lock(&card->pt.lock);
+                         emu10k1_pt_stop(card);
+                       spin_unlock(&card->pt.lock);
+--- linux-2.6.0-test1/sound/oss/emu10k1/cardmi.c       2003-06-14 12:18:22.000000000 -0700
++++ 25/sound/oss/emu10k1/cardmi.c      2003-07-19 17:03:51.000000000 -0700
+@@ -113,7 +113,7 @@ int emu10k1_mpuin_close(struct emu10k1_c
+       }
+       /* Disable RX interrupt */
+-      emu10k1_irq_disable(card, INTE_MIDIRXENABLE);
++      emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
+       emu10k1_mpu_release(card);
+@@ -189,7 +189,7 @@ int emu10k1_mpuin_start(struct emu10k1_c
+               card_mpuin->qhead = 0;
+               card_mpuin->qtail = 0;
+-              emu10k1_irq_enable(card, INTE_MIDIRXENABLE);
++              emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
+       }
+       return 0;
+@@ -207,7 +207,7 @@ int emu10k1_mpuin_stop(struct emu10k1_ca
+       DPF(2, "emu10k1_mpuin_stop()\n");
+-      emu10k1_irq_disable(card, INTE_MIDIRXENABLE);
++      emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
+       card_mpuin->status &= ~FLAGS_MIDM_STARTED;      /* clear */
+@@ -246,7 +246,7 @@ int emu10k1_mpuin_reset(struct emu10k1_c
+       DPF(2, "emu10k1_mpuin_reset()\n");
+-      emu10k1_irq_disable(card, INTE_MIDIRXENABLE);
++      emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
+       while (card_mpuin->firstmidiq) {
+               midiq = card_mpuin->firstmidiq;
+--- linux-2.6.0-test1/sound/oss/emu10k1/cardmo.c       2003-06-14 12:17:58.000000000 -0700
++++ 25/sound/oss/emu10k1/cardmo.c      2003-07-19 17:03:51.000000000 -0700
+@@ -72,7 +72,7 @@ int emu10k1_mpuout_close(struct emu10k1_
+       DPF(2, "emu10k1_mpuout_close()\n");
+-      emu10k1_irq_disable(card, INTE_MIDITXENABLE);
++      emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
+       spin_lock_irqsave(&card_mpuout->lock, flags);
+@@ -142,7 +142,7 @@ int emu10k1_mpuout_add_buffer(struct emu
+       card_mpuout->intr = 0;
+-      emu10k1_irq_enable(card, INTE_MIDITXENABLE);
++      emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
+       spin_unlock_irqrestore(&card_mpuout->lock, flags);
+@@ -206,7 +206,7 @@ void emu10k1_mpuout_bh(unsigned long ref
+       if ((card_mpuout->firstmidiq != NULL) || cByteSent) {
+               card_mpuout->intr = 0;
+-              emu10k1_irq_enable(card, INTE_MIDITXENABLE);
++              emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
+       }
+       spin_unlock_irqrestore(&card_mpuout->lock, flags);
+@@ -221,7 +221,7 @@ int emu10k1_mpuout_irqhandler(struct emu
+       DPF(4, "emu10k1_mpuout_irqhandler\n");
+       card_mpuout->intr = 1;
+-      emu10k1_irq_disable(card, INTE_MIDITXENABLE);
++      emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
+       tasklet_hi_schedule(&card_mpuout->tasklet);
+--- linux-2.6.0-test1/sound/oss/emu10k1/cardwo.c       2003-06-14 12:18:30.000000000 -0700
++++ 25/sound/oss/emu10k1/cardwo.c      2003-07-19 17:03:51.000000000 -0700
+@@ -85,25 +85,36 @@ static void query_format(struct emu10k1_
+               break;
+       }       
+       if (do_passthrough) {
+-              i = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.intr_gpr_name);
+-              j = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.enable_gpr_name);
+               /* currently only one waveout instance may use pass-through */
+-              if (i < 0 || j < 0 || woinst->state != WAVE_STATE_CLOSED || 
++              if (woinst->state != WAVE_STATE_CLOSED || 
+                   card->pt.state != PT_STATE_INACTIVE ||
+-                  (wave_fmt->samplingrate != 48000 && !is_ac3) ||
+                   (wave_fmt->samplingrate != 48000 && !is_ac3)) {
+                       DPF(2, "unable to set pass-through mode\n");
+-              } else {
+-                      wave_fmt->samplingrate = 48000;
+-                      wave_fmt->channels = 2;
+-                      wave_fmt->passthrough = 1;
+-                      card->pt.intr_gpr = i;
+-                      card->pt.enable_gpr = j;
+-                      card->pt.state = PT_STATE_INACTIVE;
+-                      card->pt.pos_gpr = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.pos_gpr_name);
+-                      DPD(2, "is_ac3 is %d\n", is_ac3);
+-                      card->pt.ac3data = is_ac3;
+-                      wave_fmt->bitsperchannel = 16;
++              } else if (USE_PT_METHOD1) {
++                      i = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.intr_gpr_name);
++                      j = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.enable_gpr_name);
++                      if (i < 0 || j < 0)
++                              DPF(2, "unable to set pass-through mode\n");
++                      else {
++                              wave_fmt->samplingrate = 48000;
++                              wave_fmt->channels = 2;
++                              card->pt.pos_gpr = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name,
++                                                                          card->pt.pos_gpr_name);
++                              wave_fmt->passthrough = 1;
++                              card->pt.intr_gpr = i;
++                              card->pt.enable_gpr = j;
++                              card->pt.state = PT_STATE_INACTIVE;
++                      
++                              DPD(2, "is_ac3 is %d\n", is_ac3);
++                              card->pt.ac3data = is_ac3;
++                              wave_fmt->bitsperchannel = 16;
++                      }
++              }else{
++                      DPF(2, "Using Passthrough Method 2\n");
++                      card->pt.enable_gpr = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name,
++                                                                     card->pt.enable_gpr_name);
++                      wave_fmt->passthrough = 2;
++                      wave_fmt->bitsperchannel = 16;
+               }
+       }
+@@ -149,33 +160,37 @@ static int get_voice(struct emu10k1_card
+       voice->endloop = voice->startloop + woinst->buffer.size / woinst->format.bytespervoicesample;
+       voice->start = voice->startloop;
+-      if (voice->flags & VOICE_FLAGS_STEREO) {
+-              voice->params[0].send_a = card->waveout.send_a[1];
+-              voice->params[0].send_b = card->waveout.send_b[1];
+-              voice->params[0].send_c = card->waveout.send_c[1];
+-              voice->params[0].send_d = card->waveout.send_d[1];
+-
+-              if (woinst->device)
+-                      voice->params[0].send_routing = 0x7654;
+-              else
+-                      voice->params[0].send_routing = card->waveout.send_routing[1];
+-
+-              voice->params[0].volume_target = 0xffff;
+-              voice->params[0].initial_fc = 0xff;
+-              voice->params[0].initial_attn = 0x00;
+-              voice->params[0].byampl_env_sustain = 0x7f;
+-              voice->params[0].byampl_env_decay = 0x7f;
+-
+-              voice->params[1].send_a = card->waveout.send_a[2];
+-              voice->params[1].send_b = card->waveout.send_b[2];
+-              voice->params[1].send_c = card->waveout.send_c[2];
+-              voice->params[1].send_d = card->waveout.send_d[2];
+-
+-              if (woinst->device)
+-                      voice->params[1].send_routing = 0x7654;
+-              else
+-                      voice->params[1].send_routing = card->waveout.send_routing[2];
++      
++      voice->params[0].volume_target = 0xffff;
++      voice->params[0].initial_fc = 0xff;
++      voice->params[0].initial_attn = 0x00;
++      voice->params[0].byampl_env_sustain = 0x7f;
++      voice->params[0].byampl_env_decay = 0x7f;
++      
++      if (voice->flags & VOICE_FLAGS_STEREO) {
++              if (woinst->format.passthrough == 2) {
++                      voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PT];
++                      voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PT];
++                      voice->params[0].send_dcba = 0xff;
++                      voice->params[1].send_dcba = 0xff00;
++                      voice->params[0].send_hgfe = voice->params[1].send_hgfe=0;
++              } else {
++                      voice->params[0].send_dcba = card->waveout.send_dcba[SEND_LEFT];
++                      voice->params[0].send_hgfe = card->waveout.send_hgfe[SEND_LEFT];
++                      voice->params[1].send_dcba = card->waveout.send_dcba[SEND_RIGHT];
++                      voice->params[1].send_hgfe = card->waveout.send_hgfe[SEND_RIGHT];
++
++                      if (woinst->device) {
++                              // /dev/dps1
++                              voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PCM1];
++                              voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PCM1];
++                      } else {
++                              voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PCM];
++                              voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PCM];
++                      }
++              }
++              
+               voice->params[1].volume_target = 0xffff;
+               voice->params[1].initial_fc = 0xff;
+               voice->params[1].initial_attn = 0x00;
+@@ -183,30 +198,28 @@ static int get_voice(struct emu10k1_card
+               voice->params[1].byampl_env_decay = 0x7f;
+       } else {
+               if (woinst->num_voices > 1) {
+-                      voice->params[0].send_a = 0xff;
+-                      voice->params[0].send_b = 0;
+-                      voice->params[0].send_c = 0;
+-                      voice->params[0].send_d = 0;
+-
+-                      voice->params[0].send_routing =
+-                       0xfff0 + card->mchannel_fx + voicenum;
++                      // Multichannel pcm
++                      voice->params[0].send_dcba=0xff;
++                      voice->params[0].send_hgfe=0;
++                      if (card->is_audigy) {
++                              voice->params[0].send_routing = 0x3f3f3f00 + card->mchannel_fx + voicenum;
++                              voice->params[0].send_routing2 = 0x3f3f3f3f;
++                      } else {
++                              voice->params[0].send_routing = 0xfff0 + card->mchannel_fx + voicenum;
++                      }
++                      
+               } else {
+-                      voice->params[0].send_a = card->waveout.send_a[0];
+-                      voice->params[0].send_b = card->waveout.send_b[0];
+-                      voice->params[0].send_c = card->waveout.send_c[0];
+-                      voice->params[0].send_d = card->waveout.send_d[0];
+-
+-                      if (woinst->device)
+-                              voice->params[0].send_routing = 0x7654;
+-                      else
+-                              voice->params[0].send_routing = card->waveout.send_routing[0];
+-              }       
+-
+-              voice->params[0].volume_target = 0xffff;
+-              voice->params[0].initial_fc = 0xff;
+-              voice->params[0].initial_attn = 0x00;
+-              voice->params[0].byampl_env_sustain = 0x7f;
+-              voice->params[0].byampl_env_decay = 0x7f;
++                      voice->params[0].send_dcba = card->waveout.send_dcba[SEND_MONO];
++                      voice->params[0].send_hgfe = card->waveout.send_hgfe[SEND_MONO];
++
++                      if (woinst->device) {
++                              voice->params[0].send_routing = card->waveout.send_routing[ROUTE_PCM1];
++                              voice->params[0].send_routing2 = card->waveout.send_routing2[ROUTE_PCM1];
++                      } else {
++                              voice->params[0].send_routing = card->waveout.send_routing[ROUTE_PCM];
++                              voice->params[0].send_routing2 = card->waveout.send_routing2[ROUTE_PCM];
++                      }
++              }
+       }
+       DPD(2, "voice: startloop=%#x, endloop=%#x\n", voice->startloop, voice->endloop);
+@@ -280,9 +293,16 @@ void emu10k1_waveout_start(struct emu10k
+ {
+       struct emu10k1_card *card = wave_dev->card;
+       struct woinst *woinst = wave_dev->woinst;
++      struct pt_data *pt = &card->pt;
+       DPF(2, "emu10k1_waveout_start()\n");
++      if (woinst->format.passthrough == 2) {
++              emu10k1_pt_setup(wave_dev);
++              sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + pt->enable_gpr, 0, 1);
++              pt->state = PT_STATE_PLAYING;
++      }
++
+       /* Actual start */
+       emu10k1_voices_start(woinst->voice, woinst->num_voices, woinst->total_played);
+--- linux-2.6.0-test1/sound/oss/emu10k1/efxmgr.c       2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/emu10k1/efxmgr.c      2003-07-19 17:03:51.000000000 -0700
+@@ -80,15 +80,20 @@ void emu10k1_set_control_gpr(struct emu1
+       if (addr < 0 || addr >= NUM_GPRS)
+               return;
+-      if (flag)
+-              val += sblive_readptr(card, GPR_BASE + addr, 0);
+-
+-      if (val > mgr->gpr[addr].max)
+-              val = mgr->gpr[addr].max;
+-      else if (val < mgr->gpr[addr].min)
+-              val = mgr->gpr[addr].min;
+-
+-      sblive_writeptr(card, GPR_BASE + addr, 0, val);
++      //fixme: once patch manager is up, remember to fix this for the audigy
++      if (card->is_audigy) {
++              sblive_writeptr(card, A_GPR_BASE + addr, 0, val);
++      } else {
++              if (flag)
++                      val += sblive_readptr(card, GPR_BASE + addr, 0);
++              if (val > mgr->gpr[addr].max)
++                      val = mgr->gpr[addr].max;
++              else if (val < mgr->gpr[addr].min)
++                      val = mgr->gpr[addr].min;
++              sblive_writeptr(card, GPR_BASE + addr, 0, val);
++      }
++      
++      
+ }
+ //TODO: make this configurable:
+--- linux-2.6.0-test1/sound/oss/emu10k1/efxmgr.h       2003-06-14 12:18:35.000000000 -0700
++++ 25/sound/oss/emu10k1/efxmgr.h      2003-07-19 17:03:51.000000000 -0700
+@@ -32,16 +32,30 @@
+ #ifndef _EFXMGR_H
+ #define _EFXMGR_H
+-#define WRITE_EFX(a, b, c) sblive_writeptr((a), MICROCODEBASE + (b), 0, (c))
++struct emu_efx_info_t{
++      int opcode_shift;
++      int high_operand_shift;
++      int instruction_start;
++      int gpr_base;
++      int output_base;
++};
++
++
++#define WRITE_EFX(a, b, c) sblive_writeptr((a), emu_efx_info[card->is_audigy].instruction_start + (b), 0, (c))
+ #define OP(op, z, w, x, y) \
+-      do { WRITE_EFX(card, (pc) * 2, ((x) << 10) | (y)); \
+-      WRITE_EFX(card, (pc) * 2 + 1, ((op) << 20) | ((z) << 10) | (w)); \
++      do { WRITE_EFX(card, (pc) * 2, ((x) << emu_efx_info[card->is_audigy].high_operand_shift) | (y)); \
++      WRITE_EFX(card, (pc) * 2 + 1, ((op) << emu_efx_info[card->is_audigy].opcode_shift ) | ((z) << emu_efx_info[card->is_audigy].high_operand_shift) | (w)); \
+       ++pc; } while (0)
+ #define NUM_INPUTS 0x20
+ #define NUM_OUTPUTS 0x20
+ #define NUM_GPRS 0x100
++
++#define A_NUM_INPUTS 0x60
++#define A_NUM_OUTPUTS 0x60  //fixme: this may or may not be true
++#define A_NUM_GPRS 0x200
++
+ #define GPR_NAME_SIZE   32
+ #define PATCH_NAME_SIZE 32
+@@ -98,6 +112,9 @@ enum {
+ #define GPR_BASE 0x100
+ #define OUTPUT_BASE 0x20
++#define A_GPR_BASE 0x400
++#define A_OUTPUT_BASE 0x60
++
+ #define MAX_PATCHES_PAGES 32
+ struct patch_manager {
+--- linux-2.6.0-test1/sound/oss/emu10k1/hwaccess.c     2003-06-14 12:18:06.000000000 -0700
++++ 25/sound/oss/emu10k1/hwaccess.c    2003-07-19 17:03:51.000000000 -0700
+@@ -160,6 +160,24 @@ void emu10k1_writefn0(struct emu10k1_car
+       return;
+ }
++void emu10k1_writefn0_2(struct emu10k1_card *card, u32 reg, u32 data, int size)
++{
++      unsigned long flags;
++
++      spin_lock_irqsave(&card->lock, flags);
++
++      if (size == 32)
++              outl(data, card->iobase + (reg & 0x1F));
++      else if (size == 16)
++              outw(data, card->iobase + (reg & 0x1F));
++      else
++              outb(data, card->iobase + (reg & 0x1F));
++
++      spin_unlock_irqrestore(&card->lock, flags);
++
++      return;
++}
++
+ u32 emu10k1_readfn0(struct emu10k1_card * card, u32 reg)
+ {
+       u32 val;
+@@ -200,12 +218,13 @@ void emu10k1_timer_set(struct emu10k1_ca
+ * write/read Emu10k1 pointer-offset register set, accessed through      *
+ *  the PTR and DATA registers                                           *
+ *************************************************************************/
++#define A_PTR_ADDRESS_MASK 0x0fff0000
+ void sblive_writeptr(struct emu10k1_card *card, u32 reg, u32 channel, u32 data)
+ {
+       u32 regptr;
+       unsigned long flags;
+-      regptr = ((reg << 16) & PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
++      regptr = ((reg << 16) & A_PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
+       if (reg & 0xff000000) {
+               u32 mask;
+@@ -242,7 +261,7 @@ void sblive_writeptr_tag(struct emu10k1_
+       spin_lock_irqsave(&card->lock, flags);
+       while ((reg = va_arg(args, u32)) != TAGLIST_END) {
+               u32 data = va_arg(args, u32);
+-              u32 regptr = (((reg << 16) & PTR_ADDRESS_MASK)
++              u32 regptr = (((reg << 16) & A_PTR_ADDRESS_MASK)
+                             | (channel & PTR_CHANNELNUM_MASK));
+               outl(regptr, card->iobase + PTR);
+               if (reg & 0xff000000) {
+@@ -267,7 +286,7 @@ u32 sblive_readptr(struct emu10k1_card *
+       u32 regptr, val;
+       unsigned long flags;
+-      regptr = ((reg << 16) & PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
++      regptr = ((reg << 16) & A_PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
+       if (reg & 0xff000000) {
+               u32 mask;
+@@ -389,7 +408,7 @@ void emu10k1_ac97_write(struct ac97_code
+       outb(reg, card->iobase + AC97ADDRESS);
+       outw(value, card->iobase + AC97DATA);
+-
++      outb( AC97_EXTENDED_ID, card->iobase + AC97ADDRESS); 
+       spin_unlock_irqrestore(&card->lock, flags);
+ }
+@@ -402,15 +421,23 @@ int emu10k1_mpu_write_data(struct emu10k
+       unsigned long flags;
+       int ret;
+-      spin_lock_irqsave(&card->lock, flags);
++      if (card->is_audigy) {
++              if ((sblive_readptr(card, A_MUSTAT,0) & MUSTAT_ORDYN) == 0) {
++                      sblive_writeptr(card, A_MUDATA, 0, data);
++                      ret = 0;
++              } else
++                      ret = -1;
++      } else {
++              spin_lock_irqsave(&card->lock, flags);
+-      if ((inb(card->iobase + MUSTAT) & MUSTAT_ORDYN) == 0) {
+-              outb(data, card->iobase + MUDATA);
+-              ret = 0;
+-      } else
+-              ret = -1;
++              if ((inb(card->iobase + MUSTAT) & MUSTAT_ORDYN) == 0) {
++                      outb(data, card->iobase + MUDATA);
++                      ret = 0;
++              } else
++                      ret = -1;
+-      spin_unlock_irqrestore(&card->lock, flags);
++              spin_unlock_irqrestore(&card->lock, flags);
++      }
+       return ret;
+ }
+@@ -420,15 +447,23 @@ int emu10k1_mpu_read_data(struct emu10k1
+       unsigned long flags;
+       int ret;
+-      spin_lock_irqsave(&card->lock, flags);
++      if (card->is_audigy) {
++              if ((sblive_readptr(card, A_MUSTAT,0) & MUSTAT_IRDYN) == 0) {
++                      *data = sblive_readptr(card, A_MUDATA,0);
++                      ret = 0;
++              } else
++                      ret = -1;
++      } else {
++              spin_lock_irqsave(&card->lock, flags);
+-      if ((inb(card->iobase + MUSTAT) & MUSTAT_IRDYN) == 0) {
+-              *data = inb(card->iobase + MUDATA);
+-              ret = 0;
+-      } else
+-              ret = -1;
++              if ((inb(card->iobase + MUSTAT) & MUSTAT_IRDYN) == 0) {
++                      *data = inb(card->iobase + MUDATA);
++                      ret = 0;
++              } else
++                      ret = -1;
+-      spin_unlock_irqrestore(&card->lock, flags);
++              spin_unlock_irqrestore(&card->lock, flags);
++      }
+       return ret;
+ }
+@@ -439,37 +474,54 @@ int emu10k1_mpu_reset(struct emu10k1_car
+       unsigned long flags;
+       DPF(2, "emu10k1_mpu_reset()\n");
++      if (card->is_audigy) {
++              if (card->mpuacqcount == 0) {
++                      sblive_writeptr(card, A_MUCMD, 0, MUCMD_RESET);
++                      sblive_wcwait(card, 8);
++                      sblive_writeptr(card, A_MUCMD, 0, MUCMD_RESET);
++                      sblive_wcwait(card, 8);
++                      sblive_writeptr(card, A_MUCMD, 0, MUCMD_ENTERUARTMODE);
++                      sblive_wcwait(card, 8);
++                      status = sblive_readptr(card, A_MUDATA, 0);
++                      if (status == 0xfe)
++                              return 0;
++                      else
++                              return -1;
++              }
+-      if (card->mpuacqcount == 0) {
+-              spin_lock_irqsave(&card->lock, flags);
+-              outb(MUCMD_RESET, card->iobase + MUCMD);
+-              spin_unlock_irqrestore(&card->lock, flags);
++              return 0;
++      } else {
++              if (card->mpuacqcount == 0) {
++                      spin_lock_irqsave(&card->lock, flags);
++                      outb(MUCMD_RESET, card->iobase + MUCMD);
++                      spin_unlock_irqrestore(&card->lock, flags);
+-              sblive_wcwait(card, 8);
++                      sblive_wcwait(card, 8);
+-              spin_lock_irqsave(&card->lock, flags);
+-              outb(MUCMD_RESET, card->iobase + MUCMD);
+-              spin_unlock_irqrestore(&card->lock, flags);
++                      spin_lock_irqsave(&card->lock, flags);
++                      outb(MUCMD_RESET, card->iobase + MUCMD);
++                      spin_unlock_irqrestore(&card->lock, flags);
+-              sblive_wcwait(card, 8);
++                      sblive_wcwait(card, 8);
+-              spin_lock_irqsave(&card->lock, flags);
+-              outb(MUCMD_ENTERUARTMODE, card->iobase + MUCMD);
+-              spin_unlock_irqrestore(&card->lock, flags);
++                      spin_lock_irqsave(&card->lock, flags);
++                      outb(MUCMD_ENTERUARTMODE, card->iobase + MUCMD);
++                      spin_unlock_irqrestore(&card->lock, flags);
+-              sblive_wcwait(card, 8);
++                      sblive_wcwait(card, 8);
+-              spin_lock_irqsave(&card->lock, flags);
+-              status = inb(card->iobase + MUDATA);
+-              spin_unlock_irqrestore(&card->lock, flags);
++                      spin_lock_irqsave(&card->lock, flags);
++                      status = inb(card->iobase + MUDATA);
++                      spin_unlock_irqrestore(&card->lock, flags);
+-              if (status == 0xfe)
+-                      return 0;
+-              else
+-                      return -1;
+-      }
++                      if (status == 0xfe)
++                              return 0;
++                      else
++                              return -1;
++              }
+-      return 0;
++              return 0;
++      }
+ }
+ int emu10k1_mpu_acquire(struct emu10k1_card *card)
+--- linux-2.6.0-test1/sound/oss/emu10k1/hwaccess.h     2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/emu10k1/hwaccess.h    2003-07-19 17:03:51.000000000 -0700
+@@ -79,13 +79,21 @@ struct memhandle
+ struct emu10k1_waveout
+ {
+-      u16 send_routing[3];
+-
+-      u8 send_a[3];
+-      u8 send_b[3];
+-      u8 send_c[3];
+-      u8 send_d[3];
++      u32 send_routing[3];
++      // audigy only:
++      u32 send_routing2[3];
++
++      u32 send_dcba[3];
++      // audigy only:
++      u32 send_hgfe[3];
+ };
++#define ROUTE_PCM 0
++#define ROUTE_PT 1
++#define ROUTE_PCM1 2
++
++#define SEND_MONO 0
++#define SEND_LEFT 1
++#define SEND_RIGHT 2
+ struct emu10k1_wavein
+ {
+@@ -129,7 +137,7 @@ struct mixer_private_ioctl {
+ #define CMD_AC97_BOOST                _IOW('D', 20, struct mixer_private_ioctl)
+ //up this number when breaking compatibility
+-#define PRIVATE3_VERSION 1
++#define PRIVATE3_VERSION 2
+ struct emu10k1_card 
+ {
+@@ -181,7 +189,7 @@ struct emu10k1_card 
+       u32         has_toslink;               // TOSLink detection
+       u8 chiprev;                    /* Chip revision                */
+-
++      u8 is_audigy;
+       u8 is_aps;
+       struct patch_manager mgr;
+@@ -211,6 +219,7 @@ extern struct list_head emu10k1_devs;
+ /* Hardware Abstraction Layer access functions */
+ void emu10k1_writefn0(struct emu10k1_card *, u32, u32);
++void emu10k1_writefn0_2(struct emu10k1_card *, u32, u32, int);
+ u32 emu10k1_readfn0(struct emu10k1_card *, u32);
+ void emu10k1_timer_set(struct emu10k1_card *, u16);
+--- linux-2.6.0-test1/sound/oss/emu10k1/irqmgr.h       2003-06-14 12:18:03.000000000 -0700
++++ 25/sound/oss/emu10k1/irqmgr.h      2003-07-19 17:03:51.000000000 -0700
+@@ -33,15 +33,15 @@
+ #define _IRQ_H
+ /* EMU Irq Types */
+-#define IRQTYPE_PCIBUSERROR         IPR_PCIERROR
+-#define IRQTYPE_MIXERBUTTON         (IPR_VOLINCR | IPR_VOLDECR | IPR_MUTE)
+-#define IRQTYPE_VOICE               (IPR_CHANNELLOOP | IPR_CHANNELNUMBERMASK)
+-#define IRQTYPE_RECORD              (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL | IPR_MICBUFFULL | IPR_MICBUFHALFFULL | IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)
+-#define IRQTYPE_MPUOUT              IPR_MIDITRANSBUFEMPTY
+-#define IRQTYPE_MPUIN               IPR_MIDIRECVBUFEMPTY
+-#define IRQTYPE_TIMER               IPR_INTERVALTIMER
+-#define IRQTYPE_SPDIF               (IPR_GPSPDIFSTATUSCHANGE | IPR_CDROMSTATUSCHANGE)
+-#define IRQTYPE_DSP                 IPR_FXDSP
++#define IRQTYPE_PCIBUSERROR   IPR_PCIERROR
++#define IRQTYPE_MIXERBUTTON   (IPR_VOLINCR | IPR_VOLDECR | IPR_MUTE)
++#define IRQTYPE_VOICE         (IPR_CHANNELLOOP | IPR_CHANNELNUMBERMASK)
++#define IRQTYPE_RECORD                (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL | IPR_MICBUFFULL | IPR_MICBUFHALFFULL | IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)
++#define IRQTYPE_MPUOUT                (IPR_MIDITRANSBUFEMPTY | A_IPR_MIDITRANSBUFEMPTY2) 
++#define IRQTYPE_MPUIN         (IPR_MIDIRECVBUFEMPTY | A_IPR_MIDIRECVBUFEMPTY2)
++#define IRQTYPE_TIMER         IPR_INTERVALTIMER
++#define IRQTYPE_SPDIF         (IPR_GPSPDIFSTATUSCHANGE | IPR_CDROMSTATUSCHANGE)
++#define IRQTYPE_DSP           IPR_FXDSP
+ void emu10k1_timer_irqhandler(struct emu10k1_card *);
+ void emu10k1_dsp_irqhandler(struct emu10k1_card *);
+--- linux-2.6.0-test1/sound/oss/emu10k1/main.c 2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/emu10k1/main.c        2003-07-19 17:03:51.000000000 -0700
+@@ -78,10 +78,11 @@
+  *          Cleaned up poll() functions (audio and midi). Don't start input.
+  *        Restrict DMA pages used to 512Mib range.
+  *        New AC97_BOOST mixer ioctl.
+- *     0.19 Real fix for kernel with highmem support (cast dma_handle to u32).
++ *    0.19a Added Support for Audigy Cards
++ *        Real fix for kernel with highmem support (cast dma_handle to u32).
+  *        Fix recording buffering parameters calculation.
+  *        Use unsigned long for variables in bit ops.
+- *     0.20 Fixed recording startup
++ *    0.20a Fixed recording startup
+  *        Fixed timer rate setting (it's a 16-bit register)
+  *********************************************************************/
+@@ -114,7 +115,6 @@
+ #define SNDCARD_EMU10K1 46
+ #endif
+  
+-#define DRIVER_VERSION "0.20"
+ /* the emu10k1 _seems_ to only supports 29 bit (512MiB) bit bus master */
+ #define EMU10K1_DMA_MASK                0x1fffffff    /* DMA buffer mask for pci_alloc_consist */
+@@ -126,20 +126,27 @@
+ #ifndef PCI_DEVICE_ID_CREATIVE_EMU10K1
+ #define PCI_DEVICE_ID_CREATIVE_EMU10K1 0x0002
+ #endif
++#ifndef PCI_DEVICE_ID_CREATIVE_AUDIGY
++#define PCI_DEVICE_ID_CREATIVE_AUDIGY 0x0004
++#endif
+ #define EMU_APS_SUBID 0x40011102
+  
+ enum {
+       EMU10K1 = 0,
++      AUDIGY,
+ };
+ static char *card_names[] __devinitdata = {
+       "EMU10K1",
++      "Audigy",
+ };
+ static struct pci_device_id emu10k1_pci_tbl[] = {
+       {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1,
+        PCI_ANY_ID, PCI_ANY_ID, 0, 0, EMU10K1},
++      {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_AUDIGY,
++       PCI_ANY_ID, PCI_ANY_ID, 0, 0, AUDIGY},
+       {0,}
+ };
+@@ -161,6 +168,67 @@ extern irqreturn_t emu10k1_interrupt(int
+ static int __devinit emu10k1_audio_init(struct emu10k1_card *card)
+ {
++      /* Assign default playback voice parameters */
++      if (card->is_audigy)
++              card->mchannel_fx = 0;
++      else
++              card->mchannel_fx = 8;
++
++
++      if (card->is_audigy) {
++              /* mono voice */
++              card->waveout.send_dcba[SEND_MONO] = 0xffffffff;
++              card->waveout.send_hgfe[SEND_MONO] = 0x0000ffff;
++      
++              /* stereo voice */
++              /* left */
++              card->waveout.send_dcba[SEND_LEFT] = 0x00ff00ff;
++              card->waveout.send_hgfe[SEND_LEFT] = 0x00007f7f;        
++              /* right */
++              card->waveout.send_dcba[SEND_RIGHT] = 0xff00ff00;
++              card->waveout.send_hgfe[SEND_RIGHT] = 0x00007f7f;
++
++              card->waveout.send_routing[ROUTE_PCM] = 0x03020100; // Regular pcm
++              card->waveout.send_routing2[ROUTE_PCM] = 0x07060504;
++
++              card->waveout.send_routing[ROUTE_PT] = 0x3f3f3d3c; // Passthrough
++              card->waveout.send_routing2[ROUTE_PT] = 0x3f3f3f3f;
++              
++              card->waveout.send_routing[ROUTE_PCM1] = 0x03020100; // Spare
++              card->waveout.send_routing2[ROUTE_PCM1] = 0x07060404;
++              
++      } else {
++              /* mono voice */
++              card->waveout.send_dcba[SEND_MONO] = 0x0000ffff;
++      
++              /* stereo voice */
++              /* left */
++              card->waveout.send_dcba[SEND_LEFT] = 0x000000ff;
++              /* right */
++              card->waveout.send_dcba[SEND_RIGHT] = 0x0000ff00;
++
++              card->waveout.send_routing[ROUTE_PCM] = 0x3210; // pcm
++              card->waveout.send_routing[ROUTE_PT] = 0x3210; // passthrough
++              card->waveout.send_routing[ROUTE_PCM1] = 0x7654; // /dev/dsp1
++      }
++
++      /* Assign default recording parameters */
++      /* FIXME */
++      if (card->is_aps)
++              card->wavein.recsrc = WAVERECORD_FX;
++      else
++              card->wavein.recsrc = WAVERECORD_AC97;
++
++      card->wavein.fxwc = 0x0003;
++      return 0;
++}
++
++static void emu10k1_audio_cleanup(struct emu10k1_card *card)
++{
++}
++
++static int __devinit emu10k1_register_devices(struct emu10k1_card *card)
++{
+       card->audio_dev = register_sound_dsp(&emu10k1_audio_fops, -1);
+       if (card->audio_dev < 0) {
+               printk(KERN_ERR "emu10k1: cannot register first audio device!\n");
+@@ -173,56 +241,167 @@ static int __devinit emu10k1_audio_init(
+               goto err_dev1;
+       }
+-      /* Assign default playback voice parameters */
+-      card->mchannel_fx = 8;
+-      /* mono voice */
+-      card->waveout.send_a[0] = 0xff;
+-      card->waveout.send_b[0] = 0xff;
+-      card->waveout.send_c[0] = 0x00;
+-      card->waveout.send_d[0] = 0x00;
+-      card->waveout.send_routing[0] = 0x3210;
+-
+-      /* stereo voice */
+-      /* left */
+-      card->waveout.send_a[1] = 0xff;
+-      card->waveout.send_b[1] = 0x00;
+-      card->waveout.send_c[1] = 0x00;
+-      card->waveout.send_d[1] = 0x00;
+-      card->waveout.send_routing[1] = 0x3210;
+-
+-      /* right */
+-      card->waveout.send_a[2] = 0x00;
+-      card->waveout.send_b[2] = 0xff;
+-      card->waveout.send_c[2] = 0x00;
+-      card->waveout.send_d[2] = 0x00;
+-      card->waveout.send_routing[2] = 0x3210;
++      card->ac97->dev_mixer = register_sound_mixer(&emu10k1_mixer_fops, -1);
++      if (card->ac97->dev_mixer < 0) {
++              printk(KERN_ERR "emu10k1: cannot register mixer device\n");
++              goto err_mixer;
++        }
+-      /* Assign default recording parameters */
+-      /* FIXME */
+-      if (card->is_aps)
+-              card->wavein.recsrc = WAVERECORD_FX;
+-      else
+-              card->wavein.recsrc = WAVERECORD_AC97;
++      card->midi_dev = register_sound_midi(&emu10k1_midi_fops, -1);
++      if (card->midi_dev < 0) {
++                printk(KERN_ERR "emu10k1: cannot register midi device!\n");
++              goto err_midi;
++        }
+-      card->wavein.fxwc = 0x0003;
++#ifdef EMU10K1_SEQUENCER
++      card->seq_dev = sound_alloc_mididev();
++      if (card->seq_dev == -1)
++              printk(KERN_WARNING "emu10k1: unable to register sequencer device!");
++      else {
++              std_midi_synth.midi_dev = card->seq_dev;
++              midi_devs[card->seq_dev] = 
++                      (struct midi_operations *)
++                      kmalloc(sizeof(struct midi_operations), GFP_KERNEL);
++
++              if (midi_devs[card->seq_dev] == NULL) {
++                      printk(KERN_ERR "emu10k1: unable to allocate memory!");
++                      sound_unload_mididev(card->seq_dev);
++                      card->seq_dev = -1;
++                      /* return without error */
++              } else {
++                      memcpy((char *)midi_devs[card->seq_dev], 
++                              (char *)&emu10k1_midi_operations, 
++                              sizeof(struct midi_operations));
++                      midi_devs[card->seq_dev]->devc = card;
++                      sequencer_init();
++                      card->seq_mididev = NULL;
++              }
++      }
++#endif
+       return 0;
++err_midi:
++      unregister_sound_mixer(card->ac97->dev_mixer);
++err_mixer:
++      unregister_sound_dsp(card->audio_dev);
+ err_dev1:
+       unregister_sound_dsp(card->audio_dev);
+ err_dev:
+       return -ENODEV;
+ }
+-static void __devinit emu10k1_audio_cleanup(struct emu10k1_card *card)
++static void emu10k1_unregister_devices(struct emu10k1_card *card)
+ {
++#ifdef EMU10K1_SEQUENCER
++      if (card->seq_dev > -1) {
++              kfree(midi_devs[card->seq_dev]);
++              midi_devs[card->seq_dev] = NULL;
++              sound_unload_mididev(card->seq_dev);
++              card->seq_dev = -1;
++      }
++#endif
++
++      unregister_sound_midi(card->midi_dev);
++      unregister_sound_mixer(card->ac97->dev_mixer);
+       unregister_sound_dsp(card->audio_dev1);
+       unregister_sound_dsp(card->audio_dev);
+ }
+-static int __devinit emu10k1_mixer_init(struct emu10k1_card *card)
++int emu10k1_info_proc (char *page, char **start, off_t off,
++                  int count, int *eof, void *data)
++{
++      struct emu10k1_card *card = data;
++      int len = 0;
++      
++      if (card == NULL)
++              return -ENODEV;
++
++      len += sprintf (page + len, "Driver Version : %s\n", DRIVER_VERSION);
++      len += sprintf (page + len, "Card type      : %s\n", card->is_aps ? "Aps" : (card->is_audigy ? "Audigy" : "Emu10k1"));
++      len += sprintf (page + len, "Revision       : %d\n", card->chiprev);
++      len += sprintf (page + len, "Model          : %#06x\n", card->model);
++      len += sprintf (page + len, "IO             : %#06lx-%#06lx\n", card->iobase, card->iobase + card->length - 1);
++      len += sprintf (page + len, "IRQ            : %d\n\n", card->irq);
++      
++      len += sprintf (page + len, "Registered /dev Entries:\n");
++      len += sprintf (page + len, "/dev/dsp%d\n", card->audio_dev / 16);
++      len += sprintf (page + len, "/dev/dsp%d\n", card->audio_dev1 / 16);
++      len += sprintf (page + len, "/dev/mixer%d\n", card->ac97->dev_mixer / 16);
++      len += sprintf (page + len, "/dev/midi%d\n", card->midi_dev / 16);
++
++#ifdef EMU10K1_SEQUENCER
++      len += sprintf (page + len, "/dev/sequencer\n");
++#endif
++
++      return len;
++}
++
++static int __devinit emu10k1_proc_init(struct emu10k1_card *card)
++{
++      char s[48];
++
++      if (!proc_mkdir ("driver/emu10k1", 0)) {
++              printk(KERN_ERR "emu10k1: unable to create proc directory driver/emu10k1\n");
++              goto err_out;
++      }
++
++      sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
++      if (!proc_mkdir (s, 0)) {
++              printk(KERN_ERR "emu10k1: unable to create proc directory %s\n", s);
++              goto err_emu10k1_proc;
++      }
++
++      sprintf(s, "driver/emu10k1/%s/info", card->pci_dev->slot_name);
++      if (!create_proc_read_entry (s, 0, 0, emu10k1_info_proc, card)) {
++              printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
++              goto err_dev_proc;
++      }
++
++      if (!card->is_aps) {
++              sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
++              if (!create_proc_read_entry (s, 0, 0, ac97_read_proc, card->ac97)) {
++                      printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
++                      goto err_proc_ac97;
++              }
++      }
++
++      return 0;
++
++err_proc_ac97:
++      sprintf(s, "driver/emu10k1/%s/info", card->pci_dev->slot_name);
++      remove_proc_entry(s, NULL);
++
++err_dev_proc:
++      sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
++      remove_proc_entry(s, NULL);
++
++err_emu10k1_proc:
++      remove_proc_entry("driver/emu10k1", NULL);
++
++err_out:
++      return -EIO;
++}
++
++static void emu10k1_proc_cleanup(struct emu10k1_card *card)
+ {
+-      char s[32];
++      char s[48];
++      if (!card->is_aps) {
++              sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
++              remove_proc_entry(s, NULL);
++      }
++
++      sprintf(s, "driver/emu10k1/%s/info", card->pci_dev->slot_name);
++      remove_proc_entry(s, NULL);
++
++      sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
++      remove_proc_entry(s, NULL);
++              
++      remove_proc_entry("driver/emu10k1", NULL);
++}
++
++static int __devinit emu10k1_mixer_init(struct emu10k1_card *card)
++{
+       struct ac97_codec *codec  = ac97_alloc_codec();
+       
+       if(codec == NULL)
+@@ -231,15 +410,6 @@ static int __devinit emu10k1_mixer_init(
+               return -EIO;
+       }
+       card->ac97 = codec;
+-      
+-#warning "Initialisation order race. Must register after usable"
+-
+-      card->ac97->dev_mixer = register_sound_mixer(&emu10k1_mixer_fops, -1);
+-      if (card->ac97->dev_mixer < 0) {
+-              printk(KERN_ERR "emu10k1: cannot register mixer device\n");
+-              goto err_codec;
+-        }
+-
+       card->ac97->private_data = card;
+       if (!card->is_aps) {
+@@ -261,23 +431,6 @@ static int __devinit emu10k1_mixer_init(
+               // Force 5bit:              
+               //card->ac97->bit_resolution=5;
+-              if (!proc_mkdir ("driver/emu10k1", 0)) {
+-                      printk(KERN_ERR "emu10k1: unable to create proc directory driver/emu10k1\n");
+-                      goto err_out;
+-              }
+-
+-              sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
+-              if (!proc_mkdir (s, 0)) {
+-                      printk(KERN_ERR "emu10k1: unable to create proc directory %s\n", s);
+-                      goto err_emu10k1_proc;
+-              }
+-      
+-              sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
+-              if (!create_proc_read_entry (s, 0, 0, ac97_read_proc, card->ac97)) {
+-                      printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
+-                      goto err_ac97_proc;
+-              }
+-
+               /* these will store the original values and never be modified */
+               card->ac97_supported_mixers = card->ac97->supported_mixers;
+               card->ac97_stereo_mixers = card->ac97->stereo_mixers;
+@@ -285,34 +438,13 @@ static int __devinit emu10k1_mixer_init(
+       return 0;
+- err_ac97_proc:
+-      sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
+-      remove_proc_entry(s, NULL);
+-
+- err_emu10k1_proc:
+-      remove_proc_entry("driver/emu10k1", NULL);
+  err_out:
+-      unregister_sound_mixer (card->ac97->dev_mixer);
+- err_codec:
+       ac97_release_codec(card->ac97);
+       return -EIO;
+ }
+-static void __devinit emu10k1_mixer_cleanup(struct emu10k1_card *card)
++static void emu10k1_mixer_cleanup(struct emu10k1_card *card)
+ {
+-      char s[32];
+-
+-      if (!card->is_aps) {
+-              sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
+-              remove_proc_entry(s, NULL);
+-
+-              sprintf(s, "driver/emu10k1/%s", card->pci_dev->slot_name);
+-              remove_proc_entry(s, NULL);
+-
+-              remove_proc_entry("driver/emu10k1", NULL);
+-      }
+-
+-      unregister_sound_mixer (card->ac97->dev_mixer);
+       ac97_release_codec(card->ac97);
+ }
+@@ -320,13 +452,6 @@ static int __devinit emu10k1_midi_init(s
+ {
+       int ret;
+-      card->midi_dev = register_sound_midi(&emu10k1_midi_fops, -1);
+-      if (card->midi_dev < 0) {
+-                printk(KERN_ERR "emu10k1: cannot register midi device!\n");
+-              return -ENODEV;
+-        }
+-
+-
+       card->mpuout = kmalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL);
+       if (card->mpuout == NULL) {
+               printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuout: out of memory\n");
+@@ -366,31 +491,6 @@ static int __devinit emu10k1_midi_init(s
+               goto err_out3;
+       }
+-#ifdef EMU10K1_SEQUENCER
+-      card->seq_dev = sound_alloc_mididev();
+-      if (card->seq_dev == -1)
+-                      printk(KERN_WARNING "emu10k1: unable to register sequencer device!");
+-      else {
+-                      std_midi_synth.midi_dev = card->seq_dev;
+-                      midi_devs[card->seq_dev] = 
+-                                      (struct midi_operations *)
+-                                      kmalloc(sizeof(struct midi_operations), GFP_KERNEL);
+-                      
+-                      if (midi_devs[card->seq_dev] == NULL) {
+-                              printk(KERN_ERR "emu10k1: unable to allocate memory!");
+-                              sound_unload_mididev(card->seq_dev);
+-                              card->seq_dev = -1;
+-                              return 0;
+-                      } else {
+-                              memcpy((char *)midi_devs[card->seq_dev], 
+-                                      (char *)&emu10k1_midi_operations, 
+-                                      sizeof(struct midi_operations));
+-                              midi_devs[card->seq_dev]->devc = card;
+-                              sequencer_init();
+-                      }
+-      }
+-      card->seq_mididev = 0;
+-#endif
+       return 0;
+ err_out3:
+@@ -398,28 +498,16 @@ err_out3:
+ err_out2:
+       kfree(card->mpuout);
+ err_out1:
+-      unregister_sound_midi(card->midi_dev);
+       return ret;
+ }
+-static void __devinit emu10k1_midi_cleanup(struct emu10k1_card *card)
++static void emu10k1_midi_cleanup(struct emu10k1_card *card)
+ {
+       tasklet_kill(&card->mpuout->tasklet);
+       kfree(card->mpuout);
+       tasklet_kill(&card->mpuin->tasklet);
+       kfree(card->mpuin);
+-
+-#ifdef EMU10K1_SEQUENCER
+-      if (card->seq_dev > -1) {
+-              kfree(midi_devs[card->seq_dev]);
+-              midi_devs[card->seq_dev] = NULL;
+-              sound_unload_mididev(card->seq_dev);
+-              card->seq_dev = -1;
+-      }
+-#endif
+-
+-      unregister_sound_midi(card->midi_dev);
+ }
+ static void __devinit voice_init(struct emu10k1_card *card)
+@@ -450,7 +538,7 @@ static void __devinit addxmgr_init(struc
+       card->emupagetable[1] = MAXPAGES - 1;
+ }
+-static void __devinit fx_cleanup(struct patch_manager *mgr)
++static void fx_cleanup(struct patch_manager *mgr)
+ {
+       int i;
+       for(i = 0; i < mgr->current_pages; i++)
+@@ -465,24 +553,25 @@ static int __devinit fx_init(struct emu1
+       s32 left, right;
+       int i;
+       u32 pc = 0;
+-      u32 patch_n;
++      u32 patch_n=0;
++      struct emu_efx_info_t emu_efx_info[2]=
++              {{ 20, 10, 0x400, 0x100, 0x20 },
++               { 24, 12, 0x600, 0x400, 0x60 },
++              }; 
++                      
+       for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
+               mgr->ctrl_gpr[i][0] = -1;
+               mgr->ctrl_gpr[i][1] = -1;
+       }
+-      for (i = 0; i < 512; i++)
+-              OP(6, 0x40, 0x40, 0x40, 0x40);
+-
+-      for (i = 0; i < 256; i++)
+-              sblive_writeptr_tag(card, 0,
+-                                  FXGPREGBASE + i, 0,
+-                                  TANKMEMADDRREGBASE + i, 0,
+-                                  TAGLIST_END);
+-      /* !! The number bellow must equal the number of patches, currently 11 !! */
+-      mgr->current_pages = (11 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
++      if (card->is_audigy)
++              mgr->current_pages = (2 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
++      else
++              /* !! The number below must equal the number of patches, currently 11 !! */
++              mgr->current_pages = (11 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
++      
+       for (i = 0; i < mgr->current_pages; i++) {
+               mgr->patch[i] = (void *)__get_free_page(GFP_KERNEL);
+               if (mgr->patch[i] == NULL) {
+@@ -493,215 +582,298 @@ static int __devinit fx_init(struct emu1
+               memset(mgr->patch[i], 0, PAGE_SIZE);
+       }
+-      pc = 0;
+-      patch_n = 0;
+-      //first free GPR = 0x11b
+-
+-      /* FX volume correction and Volume control*/
+-      INPUT_PATCH_START(patch, "Pcm L vol", 0x0, 0);
+-      GET_OUTPUT_GPR(patch, 0x100, 0x0);
+-      GET_CONTROL_GPR(patch, 0x106, "Vol", 0, 0x7fffffff);
+-      GET_DYNAMIC_GPR(patch, 0x112);
+-
+-      OP(4, 0x112, 0x40, PCM_IN_L, 0x44); //*4
+-      OP(0, 0x100, 0x040, 0x112, 0x106);  //*vol
+-      INPUT_PATCH_END(patch);
+-
+-
+-      INPUT_PATCH_START(patch, "Pcm R vol", 0x1, 0);
+-      GET_OUTPUT_GPR(patch, 0x101, 0x1);
+-      GET_CONTROL_GPR(patch, 0x107, "Vol", 0, 0x7fffffff);
+-      GET_DYNAMIC_GPR(patch, 0x112);
+-
+-      OP(4, 0x112, 0x40, PCM_IN_R, 0x44); 
+-      OP(0, 0x101, 0x040, 0x112, 0x107);
+-
+-      INPUT_PATCH_END(patch);
+-
+-
+-      // CD-Digital In Volume control
+-      INPUT_PATCH_START(patch, "CD-Digital Vol L", 0x12, 0);
+-      GET_OUTPUT_GPR(patch, 0x10c, 0x12);
+-      GET_CONTROL_GPR(patch, 0x10d, "Vol", 0, 0x7fffffff);
+-
+-      OP(0, 0x10c, 0x040, SPDIF_CD_L, 0x10d);
+-      INPUT_PATCH_END(patch);
+-
+-      INPUT_PATCH_START(patch, "CD-Digital Vol R", 0x13, 0);
+-      GET_OUTPUT_GPR(patch, 0x10e, 0x13);
+-      GET_CONTROL_GPR(patch, 0x10f, "Vol", 0, 0x7fffffff);
+-
+-      OP(0, 0x10e, 0x040, SPDIF_CD_R, 0x10f);
+-      INPUT_PATCH_END(patch);
+-
+-      //Volume Correction for Multi-channel Inputs
+-      INPUT_PATCH_START(patch, "Multi-Channel Gain", 0x08, 0);
+-      patch->input=patch->output=0x3F00;
+-
+-      GET_OUTPUT_GPR(patch, 0x113, MULTI_FRONT_L);
+-      GET_OUTPUT_GPR(patch, 0x114, MULTI_FRONT_R);
+-      GET_OUTPUT_GPR(patch, 0x115, MULTI_REAR_L);
+-      GET_OUTPUT_GPR(patch, 0x116, MULTI_REAR_R);
+-      GET_OUTPUT_GPR(patch, 0x117, MULTI_CENTER);
+-      GET_OUTPUT_GPR(patch, 0x118, MULTI_LFE);
+-
+-      OP(4, 0x113, 0x40, MULTI_FRONT_L, 0x44);
+-      OP(4, 0x114, 0x40, MULTI_FRONT_R, 0x44);
+-      OP(4, 0x115, 0x40, MULTI_REAR_L, 0x44);
+-      OP(4, 0x116, 0x40, MULTI_REAR_R, 0x44);
+-      OP(4, 0x117, 0x40, MULTI_CENTER, 0x44);
+-      OP(4, 0x118, 0x40, MULTI_LFE, 0x44);
+-      
+-      INPUT_PATCH_END(patch);
+-
+-
+-      //Routing patch start
+-      ROUTING_PATCH_START(rpatch, "Routing");
+-      GET_INPUT_GPR(rpatch, 0x100, 0x0);
+-      GET_INPUT_GPR(rpatch, 0x101, 0x1);
+-      GET_INPUT_GPR(rpatch, 0x10c, 0x12);
+-      GET_INPUT_GPR(rpatch, 0x10e, 0x13);
+-      GET_INPUT_GPR(rpatch, 0x113, MULTI_FRONT_L);
+-      GET_INPUT_GPR(rpatch, 0x114, MULTI_FRONT_R);
+-      GET_INPUT_GPR(rpatch, 0x115, MULTI_REAR_L);
+-      GET_INPUT_GPR(rpatch, 0x116, MULTI_REAR_R);
+-      GET_INPUT_GPR(rpatch, 0x117, MULTI_CENTER);
+-      GET_INPUT_GPR(rpatch, 0x118, MULTI_LFE);
+-
+-      GET_DYNAMIC_GPR(rpatch, 0x102);
+-      GET_DYNAMIC_GPR(rpatch, 0x103);
+-
+-      GET_OUTPUT_GPR(rpatch, 0x104, 0x8);
+-      GET_OUTPUT_GPR(rpatch, 0x105, 0x9);
+-      GET_OUTPUT_GPR(rpatch, 0x10a, 0x2);
+-      GET_OUTPUT_GPR(rpatch, 0x10b, 0x3);
+-
+-
+-      /* input buffer */
+-      OP(6, 0x102, AC97_IN_L, 0x40, 0x40);
+-      OP(6, 0x103, AC97_IN_R, 0x40, 0x40);
+-
+-
+-      /* Digital In + PCM + MULTI_FRONT-> AC97 out (front speakers)*/
+-      OP(6, AC97_FRONT_L, 0x100, 0x10c, 0x113);
+-
+-      CONNECT(MULTI_FRONT_L, AC97_FRONT_L);
+-      CONNECT(PCM_IN_L, AC97_FRONT_L);
+-      CONNECT(SPDIF_CD_L, AC97_FRONT_L);
+-
+-      OP(6, AC97_FRONT_R, 0x101, 0x10e, 0x114);
+-
+-      CONNECT(MULTI_FRONT_R, AC97_FRONT_R);
+-      CONNECT(PCM_IN_R, AC97_FRONT_R);
+-      CONNECT(SPDIF_CD_R, AC97_FRONT_R);
+-
+-      /* Digital In + PCM + AC97 In + PCM1 + MULTI_REAR --> Rear Channel */ 
+-      OP(6, 0x104, PCM1_IN_L, 0x100, 0x115);
+-      OP(6, 0x104, 0x104, 0x10c, 0x102);
+-
+-      CONNECT(MULTI_REAR_L, ANALOG_REAR_L);
+-      CONNECT(AC97_IN_L, ANALOG_REAR_L);
+-      CONNECT(PCM_IN_L, ANALOG_REAR_L);
+-      CONNECT(SPDIF_CD_L, ANALOG_REAR_L);
+-      CONNECT(PCM1_IN_L, ANALOG_REAR_L);
+-
+-      OP(6, 0x105, PCM1_IN_R, 0x101, 0x116);
+-      OP(6, 0x105, 0x105, 0x10e, 0x103);
+-
+-      CONNECT(MULTI_REAR_R, ANALOG_REAR_R);
+-      CONNECT(AC97_IN_R, ANALOG_REAR_R);
+-      CONNECT(PCM_IN_R, ANALOG_REAR_R);
+-      CONNECT(SPDIF_CD_R, ANALOG_REAR_R);
+-      CONNECT(PCM1_IN_R, ANALOG_REAR_R);
+-
+-      /* Digital In + PCM + AC97 In + MULTI_FRONT --> Digital out */
+-      OP(6, 0x10a, 0x100, 0x102, 0x10c);
+-      OP(6, 0x10a, 0x10a, 0x113, 0x40);
+-
+-      CONNECT(MULTI_FRONT_L, DIGITAL_OUT_L);
+-      CONNECT(PCM_IN_L, DIGITAL_OUT_L);
+-      CONNECT(AC97_IN_L, DIGITAL_OUT_L);
+-      CONNECT(SPDIF_CD_L, DIGITAL_OUT_L);
+-
+-      OP(6, 0x10b, 0x101, 0x103, 0x10e);
+-      OP(6, 0x10b, 0x10b, 0x114, 0x40);
+-
+-      CONNECT(MULTI_FRONT_R, DIGITAL_OUT_R);
+-      CONNECT(PCM_IN_R, DIGITAL_OUT_R);
+-      CONNECT(AC97_IN_R, DIGITAL_OUT_R);
+-      CONNECT(SPDIF_CD_R, DIGITAL_OUT_R);
+-
+-      /* AC97 In --> ADC Recording Buffer */
+-      OP(6, ADC_REC_L, 0x102, 0x40, 0x40);
+-
+-      CONNECT(AC97_IN_L, ADC_REC_L);
+-
+-      OP(6, ADC_REC_R, 0x103, 0x40, 0x40);
+-
+-      CONNECT(AC97_IN_R, ADC_REC_R);
++      if (card->is_audigy) {
++              for (i = 0; i < 1024; i++)
++                      OP(0xf, 0x0c0, 0x0c0, 0x0cf, 0x0c0);
++
++              for (i = 0; i < 512 ; i++)
++                      sblive_writeptr(card, A_GPR_BASE+i,0,0);
++
++              pc=0;
++
++              //Pcm input volume
++              OP(0, 0x402, 0x0c0, 0x406, 0x000);
++              OP(0, 0x403, 0x0c0, 0x407, 0x001);
++
++              //CD-Digital input Volume
++              OP(0, 0x404, 0x0c0, 0x40d, 0x42);
++              OP(0, 0x405, 0x0c0, 0x40f, 0x43);
++
++              // CD + PCM 
++              OP(6, 0x400, 0x0c0, 0x402, 0x404);
++              OP(6, 0x401, 0x0c0, 0x403, 0x405);
++              
++              // Front Output + Master Volume
++              OP(0, 0x68, 0x0c0, 0x408, 0x400);
++              OP(0, 0x69, 0x0c0, 0x409, 0x401);
++
++              // Add-in analog inputs for other speakers
++              OP(6, 0x400, 0x40, 0x400, 0xc0);
++              OP(6, 0x401, 0x41, 0x401, 0xc0);
++
++              // Digital Front + Master Volume
++              OP(0, 0x60, 0x0c0, 0x408, 0x400);
++              OP(0, 0x61, 0x0c0, 0x409, 0x401);
++
++              // Rear Output + Rear Volume
++              OP(0, 0x06e, 0x0c0, 0x419, 0x400);
++              OP(0, 0x06f, 0x0c0, 0x41a, 0x401);              
++
++              // Digital Rear Output + Rear Volume
++              OP(0, 0x066, 0x0c0, 0x419, 0x400);
++              OP(0, 0x067, 0x0c0, 0x41a, 0x401);              
++
++              // Audigy Drive, Headphone out
++              OP(6, 0x64, 0x0c0, 0x0c0, 0x400);
++              OP(6, 0x65, 0x0c0, 0x0c0, 0x401);
++
++              // ac97 Recording
++              OP(6, 0x76, 0x0c0, 0x0c0, 0x40);
++              OP(6, 0x77, 0x0c0, 0x0c0, 0x41);
++              
++              // Center = sub = Left/2 + Right/2
++              OP(0xe, 0x400, 0x401, 0xcd, 0x400);
++
++              // center/sub  Volume (master)
++              OP(0, 0x06a, 0x0c0, 0x408, 0x400);
++              OP(0, 0x06b, 0x0c0, 0x409, 0x400);
++
++              // Digital center/sub  Volume (master)
++              OP(0, 0x062, 0x0c0, 0x408, 0x400);
++              OP(0, 0x063, 0x0c0, 0x409, 0x400);
++
++              ROUTING_PATCH_START(rpatch, "Routing");
++              ROUTING_PATCH_END(rpatch);
++
++              /* delimiter patch */
++              patch = PATCH(mgr, patch_n);
++              patch->code_size = 0;
++      
++              sblive_writeptr(card, 0x53, 0, 0);
++      } else {
++              for (i = 0; i < 512 ; i++)
++                      OP(6, 0x40, 0x40, 0x40, 0x40);
++
++              for (i = 0; i < 256; i++)
++                      sblive_writeptr_tag(card, 0,
++                                          FXGPREGBASE + i, 0,
++                                          TANKMEMADDRREGBASE + i, 0,
++                                          TAGLIST_END);
+-      /* fx12:Analog-Center */
+-      OP(6, ANALOG_CENTER, 0x117, 0x40, 0x40);
+-      CONNECT(MULTI_CENTER, ANALOG_CENTER);
++              
++              pc = 0;
+-      /* fx11:Analog-LFE */
+-      OP(6, ANALOG_LFE, 0x118, 0x40, 0x40);
+-      CONNECT(MULTI_LFE, ANALOG_LFE);
++              //first free GPR = 0x11b
++      
++              
++              /* FX volume correction and Volume control*/
++              INPUT_PATCH_START(patch, "Pcm L vol", 0x0, 0);
++              GET_OUTPUT_GPR(patch, 0x100, 0x0);
++              GET_CONTROL_GPR(patch, 0x106, "Vol", 0, 0x7fffffff);
++              GET_DYNAMIC_GPR(patch, 0x112);
++
++              OP(4, 0x112, 0x40, PCM_IN_L, 0x44); //*4        
++              OP(0, 0x100, 0x040, 0x112, 0x106);  //*vol      
++              INPUT_PATCH_END(patch);
++
++
++              INPUT_PATCH_START(patch, "Pcm R vol", 0x1, 0);
++              GET_OUTPUT_GPR(patch, 0x101, 0x1);
++              GET_CONTROL_GPR(patch, 0x107, "Vol", 0, 0x7fffffff);
++              GET_DYNAMIC_GPR(patch, 0x112);
++
++              OP(4, 0x112, 0x40, PCM_IN_R, 0x44); 
++              OP(0, 0x101, 0x040, 0x112, 0x107);
++
++              INPUT_PATCH_END(patch);
++
++
++              // CD-Digital In Volume control 
++              INPUT_PATCH_START(patch, "CD-Digital Vol L", 0x12, 0);
++              GET_OUTPUT_GPR(patch, 0x10c, 0x12);
++              GET_CONTROL_GPR(patch, 0x10d, "Vol", 0, 0x7fffffff);
++
++              OP(0, 0x10c, 0x040, SPDIF_CD_L, 0x10d);
++              INPUT_PATCH_END(patch);
++
++              INPUT_PATCH_START(patch, "CD-Digital Vol R", 0x13, 0);
++              GET_OUTPUT_GPR(patch, 0x10e, 0x13);
++              GET_CONTROL_GPR(patch, 0x10f, "Vol", 0, 0x7fffffff);
++
++              OP(0, 0x10e, 0x040, SPDIF_CD_R, 0x10f);
++              INPUT_PATCH_END(patch);
++
++              //Volume Correction for Multi-channel Inputs    
++              INPUT_PATCH_START(patch, "Multi-Channel Gain", 0x08, 0);
++              patch->input=patch->output=0x3F00;
++
++              GET_OUTPUT_GPR(patch, 0x113, MULTI_FRONT_L);
++              GET_OUTPUT_GPR(patch, 0x114, MULTI_FRONT_R);
++              GET_OUTPUT_GPR(patch, 0x115, MULTI_REAR_L);
++              GET_OUTPUT_GPR(patch, 0x116, MULTI_REAR_R);
++              GET_OUTPUT_GPR(patch, 0x117, MULTI_CENTER);
++              GET_OUTPUT_GPR(patch, 0x118, MULTI_LFE);
++
++              OP(4, 0x113, 0x40, MULTI_FRONT_L, 0x44);
++              OP(4, 0x114, 0x40, MULTI_FRONT_R, 0x44);
++              OP(4, 0x115, 0x40, MULTI_REAR_L, 0x44);
++              OP(4, 0x116, 0x40, MULTI_REAR_R, 0x44);
++              OP(4, 0x117, 0x40, MULTI_CENTER, 0x44);
++              OP(4, 0x118, 0x40, MULTI_LFE, 0x44);
++      
++              INPUT_PATCH_END(patch);
+-      /* fx12:Digital-Center */
+-      OP(6, DIGITAL_CENTER, 0x117, 0x40, 0x40);
+-      CONNECT(MULTI_CENTER, DIGITAL_CENTER);
+-      /* fx11:Analog-LFE */
+-      OP(6, DIGITAL_LFE, 0x118, 0x40, 0x40);
+-      CONNECT(MULTI_LFE, DIGITAL_LFE);
++              //Routing patch start   
++              ROUTING_PATCH_START(rpatch, "Routing");
++              GET_INPUT_GPR(rpatch, 0x100, 0x0);
++              GET_INPUT_GPR(rpatch, 0x101, 0x1);
++              GET_INPUT_GPR(rpatch, 0x10c, 0x12);
++              GET_INPUT_GPR(rpatch, 0x10e, 0x13);
++              GET_INPUT_GPR(rpatch, 0x113, MULTI_FRONT_L);
++              GET_INPUT_GPR(rpatch, 0x114, MULTI_FRONT_R);
++              GET_INPUT_GPR(rpatch, 0x115, MULTI_REAR_L);
++              GET_INPUT_GPR(rpatch, 0x116, MULTI_REAR_R);
++              GET_INPUT_GPR(rpatch, 0x117, MULTI_CENTER);
++              GET_INPUT_GPR(rpatch, 0x118, MULTI_LFE);
++
++              GET_DYNAMIC_GPR(rpatch, 0x102);
++              GET_DYNAMIC_GPR(rpatch, 0x103);
++
++              GET_OUTPUT_GPR(rpatch, 0x104, 0x8);
++              GET_OUTPUT_GPR(rpatch, 0x105, 0x9);
++              GET_OUTPUT_GPR(rpatch, 0x10a, 0x2);
++              GET_OUTPUT_GPR(rpatch, 0x10b, 0x3);
++              
++              
++              /* input buffer */
++              OP(6, 0x102, AC97_IN_L, 0x40, 0x40);
++              OP(6, 0x103, AC97_IN_R, 0x40, 0x40);
++
++
++              /* Digital In + PCM + MULTI_FRONT-> AC97 out (front speakers)*/
++              OP(6, AC97_FRONT_L, 0x100, 0x10c, 0x113);
++
++              CONNECT(MULTI_FRONT_L, AC97_FRONT_L);
++              CONNECT(PCM_IN_L, AC97_FRONT_L);
++              CONNECT(SPDIF_CD_L, AC97_FRONT_L);
++
++              OP(6, AC97_FRONT_R, 0x101, 0x10e, 0x114);
++
++              CONNECT(MULTI_FRONT_R, AC97_FRONT_R);
++              CONNECT(PCM_IN_R, AC97_FRONT_R);
++              CONNECT(SPDIF_CD_R, AC97_FRONT_R);
++
++              /* Digital In + PCM + AC97 In + PCM1 + MULTI_REAR --> Rear Channel */ 
++              OP(6, 0x104, PCM1_IN_L, 0x100, 0x115);
++              OP(6, 0x104, 0x104, 0x10c, 0x102);
++
++              CONNECT(MULTI_REAR_L, ANALOG_REAR_L);
++              CONNECT(AC97_IN_L, ANALOG_REAR_L);
++              CONNECT(PCM_IN_L, ANALOG_REAR_L);
++              CONNECT(SPDIF_CD_L, ANALOG_REAR_L);
++              CONNECT(PCM1_IN_L, ANALOG_REAR_L);
++
++              OP(6, 0x105, PCM1_IN_R, 0x101, 0x116);
++              OP(6, 0x105, 0x105, 0x10e, 0x103);
++
++              CONNECT(MULTI_REAR_R, ANALOG_REAR_R);
++              CONNECT(AC97_IN_R, ANALOG_REAR_R);
++              CONNECT(PCM_IN_R, ANALOG_REAR_R);
++              CONNECT(SPDIF_CD_R, ANALOG_REAR_R);
++              CONNECT(PCM1_IN_R, ANALOG_REAR_R);
++
++              /* Digital In + PCM + AC97 In + MULTI_FRONT --> Digital out */
++              OP(6, 0x10b, 0x100, 0x102, 0x10c);
++              OP(6, 0x10b, 0x10b, 0x113, 0x40);
++
++              CONNECT(MULTI_FRONT_L, DIGITAL_OUT_L);
++              CONNECT(PCM_IN_L, DIGITAL_OUT_L);
++              CONNECT(AC97_IN_L, DIGITAL_OUT_L);
++              CONNECT(SPDIF_CD_L, DIGITAL_OUT_L);
++
++              OP(6, 0x10a, 0x101, 0x103, 0x10e);
++              OP(6, 0x10b, 0x10b, 0x114, 0x40);
++
++              CONNECT(MULTI_FRONT_R, DIGITAL_OUT_R);
++              CONNECT(PCM_IN_R, DIGITAL_OUT_R);
++              CONNECT(AC97_IN_R, DIGITAL_OUT_R);
++              CONNECT(SPDIF_CD_R, DIGITAL_OUT_R);
++
++              /* AC97 In --> ADC Recording Buffer */
++              OP(6, ADC_REC_L, 0x102, 0x40, 0x40);
++
++              CONNECT(AC97_IN_L, ADC_REC_L);
++
++              OP(6, ADC_REC_R, 0x103, 0x40, 0x40);
++
++              CONNECT(AC97_IN_R, ADC_REC_R);
++
++
++              /* fx12:Analog-Center */
++              OP(6, ANALOG_CENTER, 0x117, 0x40, 0x40);
++              CONNECT(MULTI_CENTER, ANALOG_CENTER);
++
++              /* fx11:Analog-LFE */
++              OP(6, ANALOG_LFE, 0x118, 0x40, 0x40);
++              CONNECT(MULTI_LFE, ANALOG_LFE);
++
++              /* fx12:Digital-Center */
++              OP(6, DIGITAL_CENTER, 0x117, 0x40, 0x40);
++              CONNECT(MULTI_CENTER, DIGITAL_CENTER);
++              
++              /* fx11:Analog-LFE */
++              OP(6, DIGITAL_LFE, 0x118, 0x40, 0x40);
++              CONNECT(MULTI_LFE, DIGITAL_LFE);
+       
+-      ROUTING_PATCH_END(rpatch);
++              ROUTING_PATCH_END(rpatch);
+-      // Rear volume control
+-      OUTPUT_PATCH_START(patch, "Vol Rear L", 0x8, 0);
+-      GET_INPUT_GPR(patch, 0x104, 0x8);
+-      GET_CONTROL_GPR(patch, 0x119, "Vol", 0, 0x7fffffff);
++              // Rear volume control  
++              OUTPUT_PATCH_START(patch, "Vol Rear L", 0x8, 0);
++              GET_INPUT_GPR(patch, 0x104, 0x8);
++              GET_CONTROL_GPR(patch, 0x119, "Vol", 0, 0x7fffffff);
+-      OP(0, ANALOG_REAR_L, 0x040, 0x104, 0x119);
+-      OUTPUT_PATCH_END(patch);
++              OP(0, ANALOG_REAR_L, 0x040, 0x104, 0x119);
++              OUTPUT_PATCH_END(patch);
++              OUTPUT_PATCH_START(patch, "Vol Rear R", 0x9, 0);
++              GET_INPUT_GPR(patch, 0x105, 0x9);
++              GET_CONTROL_GPR(patch, 0x11a, "Vol", 0, 0x7fffffff);
+-      OUTPUT_PATCH_START(patch, "Vol Rear R", 0x9, 0);
+-      GET_INPUT_GPR(patch, 0x105, 0x9);
+-      GET_CONTROL_GPR(patch, 0x11a, "Vol", 0, 0x7fffffff);
++              OP(0, ANALOG_REAR_R, 0x040, 0x105, 0x11a);
++              OUTPUT_PATCH_END(patch);
+-      OP(0, ANALOG_REAR_R, 0x040, 0x105, 0x11a);
+-      OUTPUT_PATCH_END(patch);
++              //Master volume control on front-digital        
++              OUTPUT_PATCH_START(patch, "Vol Master L", 0x2, 1);
++              GET_INPUT_GPR(patch, 0x10a, 0x2);
++              GET_CONTROL_GPR(patch, 0x108, "Vol", 0, 0x7fffffff);
+-      //Master volume control on front-digital
+-      OUTPUT_PATCH_START(patch, "Vol Master L", 0x2, 1);
+-      GET_INPUT_GPR(patch, 0x10a, 0x2);
+-      GET_CONTROL_GPR(patch, 0x108, "Vol", 0, 0x7fffffff);
++              OP(0, DIGITAL_OUT_L, 0x040, 0x10a, 0x108);
++              OUTPUT_PATCH_END(patch);
+-      OP(0, DIGITAL_OUT_L, 0x040, 0x10a, 0x108);
+-      OUTPUT_PATCH_END(patch);
++              OUTPUT_PATCH_START(patch, "Vol Master R", 0x3, 1);
++              GET_INPUT_GPR(patch, 0x10b, 0x3);
++              GET_CONTROL_GPR(patch, 0x109, "Vol", 0, 0x7fffffff);
+-      OUTPUT_PATCH_START(patch, "Vol Master R", 0x3, 1);
+-      GET_INPUT_GPR(patch, 0x10b, 0x3);
+-      GET_CONTROL_GPR(patch, 0x109, "Vol", 0, 0x7fffffff);
++              OP(0, DIGITAL_OUT_R, 0x040, 0x10b, 0x109);
++              OUTPUT_PATCH_END(patch);
+-      OP(0, DIGITAL_OUT_R, 0x040, 0x10b, 0x109);
+-      OUTPUT_PATCH_END(patch);
++              /* delimiter patch */
++              patch = PATCH(mgr, patch_n);
++              patch->code_size = 0;
+-      /* delimiter patch */
+-      patch = PATCH(mgr, patch_n);
+-      patch->code_size = 0;
+-
+-      sblive_writeptr(card, DBG, 0, 0);
++      
++              sblive_writeptr(card, DBG, 0, 0);
++      }
+       mgr->lock = SPIN_LOCK_UNLOCKED;
++      // Set up Volume controls, try to keep this the same for both Audigy and Live
+       //Master volume
+       mgr->ctrl_gpr[SOUND_MIXER_VOLUME][0] = 8;
+@@ -749,8 +921,16 @@ static int __devinit fx_init(struct emu1
+       emu10k1_set_volume_gpr(card, 0xd, left, VOL_5BIT);
+       emu10k1_set_volume_gpr(card, 0xf, right, VOL_5BIT);
+-      //hard wire the ac97's pcm, we'll do that in dsp code instead.
+-      emu10k1_ac97_write(card->ac97, 0x18, 0x0);
++
++      //hard wire the ac97's pcm, pcm volume is done above using dsp code.
++      if (card->is_audigy)
++              //for Audigy, we mute it and use the philips 6 channel DAC instead
++              emu10k1_ac97_write(card->ac97, 0x18, 0x8000);
++      else
++              //For the Live we hardwire it to full volume
++              emu10k1_ac97_write(card->ac97, 0x18, 0x0);
++
++      //remove it from the ac97_codec's control
+       card->ac97_supported_mixers &= ~SOUND_MASK_PCM;
+       card->ac97_stereo_mixers &= ~SOUND_MASK_PCM;
+@@ -789,6 +969,13 @@ static int __devinit hw_init(struct emu1
+                           SOLEH, 0,
+                           TAGLIST_END);
++      if (card->is_audigy) {
++              sblive_writeptr_tag(card,0,
++                                  0x5e,0xf00,
++                                  0x5f,0x3,
++                                  TAGLIST_END);
++      }
++
+       /* Init envelope engine */
+       for (nCh = 0; nCh < NUM_G; nCh++) {
+               sblive_writeptr_tag(card, nCh,
+@@ -824,6 +1011,21 @@ static int __devinit hw_init(struct emu1
+                                   ENVVAL, 0,
+                                     TAGLIST_END);
+               sblive_writeptr(card, CPF, nCh, 0);
++              /*
++                Audigy FXRT initialization
++                reversed eng'd, may not be accurate.
++               */
++              if (card->is_audigy) {
++                      sblive_writeptr_tag(card,nCh,
++                                          0x4c,0x0,
++                                          0x4d,0x0,
++                                          0x4e,0x0,
++                                          0x4f,0x0,
++                                          A_FXRT1, 0x3f3f3f3f,
++                                          A_FXRT2, 0x3f3f3f3f,
++                                          A_SENDAMOUNTS, 0,
++                                          TAGLIST_END);
++              }
+       }
+       
+@@ -858,6 +1060,25 @@ static int __devinit hw_init(struct emu1
+                           TAGLIST_END);
++      if (card->is_audigy && (card->chiprev == 4)) {
++              /* Hacks for Alice3 to work independent of haP16V driver */
++              u32 tmp;
++
++              //Setup SRCMulti_I2S SamplingRate
++              tmp = sblive_readptr(card, A_SPDIF_SAMPLERATE, 0);
++              tmp &= 0xfffff1ff;
++              tmp |= (0x2<<9);
++              sblive_writeptr(card, A_SPDIF_SAMPLERATE, 0, tmp);
++
++              /* Setup SRCSel (Enable Spdif,I2S SRCMulti) */
++              emu10k1_writefn0(card, 0x20, 0x600000);
++              emu10k1_writefn0(card, 0x24, 0x14);
++
++              /* Setup SRCMulti Input Audio Enable */
++              emu10k1_writefn0(card, 0x20, 0x6E0000);
++              emu10k1_writefn0(card, 0x24, 0xFF00FF00);
++      }
++
+       ret = fx_init(card);            /* initialize effects engine */
+       if (ret < 0)
+               return ret;
+@@ -905,16 +1126,30 @@ static int __devinit hw_init(struct emu1
+       /* Lock Tank Memory = 1 */
+       /* Lock Sound Memory = 0 */
+       /* Auto Mute = 1 */
+-
+-      if (card->model == 0x20 || card->model == 0xc400 ||
+-        (card->model == 0x21 && card->chiprev < 6))
+-              emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE);
+-      else
+-              emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE);
+-
++      if (card->is_audigy) {
++              if (card->chiprev == 4)
++                      emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AC3ENABLE_CDSPDIF | HCFG_AC3ENABLE_GPSPDIF | HCFG_AUTOMUTE | HCFG_JOYENABLE);
++              else
++                      emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AUTOMUTE | HCFG_JOYENABLE);
++      } else {
++              if (card->model == 0x20 || card->model == 0xc400 ||
++               (card->model == 0x21 && card->chiprev < 6))
++                      emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE);
++              else
++                      emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE);
++      }
+       /* Enable Vol_Ctrl irqs */
+       emu10k1_irq_enable(card, INTE_VOLINCRENABLE | INTE_VOLDECRENABLE | INTE_MUTEENABLE | INTE_FXDSPENABLE);
++      if (card->is_audigy && (card->chiprev == 4)) {
++              /* Unmute Analog now.  Set GPO6 to 1 for Apollo.
++               * This has to be done after init ALice3 I2SOut beyond 48KHz.
++               * So, sequence is important. */
++              u32 tmp = emu10k1_readfn0(card, A_IOCFG);
++              tmp |= 0x0040;
++              emu10k1_writefn0(card, A_IOCFG, tmp);
++      }
++      
+       /* FIXME: TOSLink detection */
+       card->has_toslink = 0;
+@@ -967,7 +1202,7 @@ static int __devinit emu10k1_init(struct
+       return 0;
+ }
+-static void __devinit emu10k1_cleanup(struct emu10k1_card *card)
++static void emu10k1_cleanup(struct emu10k1_card *card)
+ {
+       int ch;
+@@ -1012,6 +1247,8 @@ static void __devinit emu10k1_cleanup(st
+                           SOLEH, 0,
+                           TAGLIST_END);
++      if (card->is_audigy)
++              sblive_writeptr(card, 0, A_DBG,  A_DBG_SINGLE_STEP);
+       pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);
+       pci_free_consistent(card->pci_dev, card->silentpage.size, card->silentpage.addr, card->silentpage.dma_handle);
+@@ -1074,6 +1311,9 @@ static int __devinit emu10k1_probe(struc
+               card_names[pci_id->driver_data], card->chiprev, card->model, card->iobase,
+               card->iobase + card->length - 1, card->irq);
++      if (pci_id->device == PCI_DEVICE_ID_CREATIVE_AUDIGY)
++              card->is_audigy = 1;
++
+       pci_read_config_dword(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subsysvid);
+       card->is_aps = (subsysvid == EMU_APS_SUBID);
+@@ -1083,13 +1323,13 @@ static int __devinit emu10k1_probe(struc
+       init_waitqueue_head(&card->open_wait);
+       ret = emu10k1_audio_init(card);
+-      if(ret < 0) {
++      if (ret < 0) {
+                 printk(KERN_ERR "emu10k1: cannot initialize audio devices\n");
+                 goto err_audio;
+         }
+       ret = emu10k1_mixer_init(card);
+-      if(ret < 0) {
++      if (ret < 0) {
+               printk(KERN_ERR "emu10k1: cannot initialize AC97 codec\n");
+                 goto err_mixer;
+       }
+@@ -1109,10 +1349,28 @@ static int __devinit emu10k1_probe(struc
+       if (card->is_aps)
+               emu10k1_ecard_init(card);
++      ret = emu10k1_register_devices(card);
++      if (ret < 0)
++              goto err_register;
++
++      /* proc entries must be created after registering devices, as
++       * emu10k1_info_proc prints card->audio_dev &co. */
++      ret = emu10k1_proc_init(card);
++      if (ret < 0) {
++              printk(KERN_ERR "emu10k1: cannot initialize proc directory\n");
++                goto err_proc;
++      }
++      
+       list_add(&card->list, &emu10k1_devs);
+       return 0;
++err_proc:
++      emu10k1_unregister_devices(card);
++
++err_register:
++      emu10k1_cleanup(card);
++      
+ err_emu10k1_init:
+       emu10k1_midi_cleanup(card);
+@@ -1141,9 +1399,11 @@ static void __devexit emu10k1_remove(str
+       list_del(&card->list);
++      emu10k1_unregister_devices(card);
+       emu10k1_cleanup(card);
+       emu10k1_midi_cleanup(card);
+       emu10k1_mixer_cleanup(card);
++      emu10k1_proc_cleanup(card);
+       emu10k1_audio_cleanup(card);    
+       free_irq(card->irq, card);
+       release_region(card->iobase, card->length);
+--- linux-2.6.0-test1/sound/oss/emu10k1/midi.h 2003-06-14 12:18:00.000000000 -0700
++++ 25/sound/oss/emu10k1/midi.h        2003-07-19 17:03:51.000000000 -0700
+@@ -52,4 +52,27 @@ struct emu10k1_mididevice
+       struct list_head mid_hdrs;
+ };
++/* uncomment next line to use midi port on Audigy drive */
++//#define USE_AUDIGY_DRIVE_MIDI
++
++#ifdef USE_AUDIGY_DRIVE_MIDI
++#define A_MUDATA      A_MUDATA2
++#define A_MUCMD               A_MUCMD2
++#define A_MUSTAT      A_MUCMD2
++#define A_IPR_MIDITRANSBUFEMPTY       A_IPR_MIDITRANSBUFEMPTY2
++#define A_IPR_MIDIRECVBUFEMPTY        A_IPR_MIDIRECVBUFEMPTY2
++#define A_INTE_MIDITXENABLE   A_INTE_MIDITXENABLE2
++#define A_INTE_MIDIRXENABLE   A_INTE_MIDIRXENABLE2
++#else
++#define A_MUDATA      A_MUDATA1
++#define A_MUCMD               A_MUCMD1
++#define A_MUSTAT      A_MUCMD1
++#define A_IPR_MIDITRANSBUFEMPTY       A_IPR_MIDITRANSBUFEMPTY1
++#define A_IPR_MIDIRECVBUFEMPTY        A_IPR_MIDIRECVBUFEMPTY1
++#define A_INTE_MIDITXENABLE   A_INTE_MIDITXENABLE1
++#define A_INTE_MIDIRXENABLE   A_INTE_MIDIRXENABLE1
++#endif
++
++
+ #endif /* _MIDI_H */
++
+--- linux-2.6.0-test1/sound/oss/emu10k1/mixer.c        2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/emu10k1/mixer.c       2003-07-19 17:03:51.000000000 -0700
+@@ -136,7 +136,7 @@ static void set_bass(struct emu10k1_card
+       r = (r * 40 + 50) / 100;
+       for (i = 0; i < 5; i++)
+-              sblive_writeptr(card, GPR_BASE + card->mgr.ctrl_gpr[SOUND_MIXER_BASS][0] + i, 0, bass_table[l][i]);
++              sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + card->mgr.ctrl_gpr[SOUND_MIXER_BASS][0] + i, 0, bass_table[l][i]);
+ }
+ static void set_treble(struct emu10k1_card *card, int l, int r)
+@@ -147,7 +147,7 @@ static void set_treble(struct emu10k1_ca
+       r = (r * 40 + 50) / 100;
+       for (i = 0; i < 5; i++)
+-              sblive_writeptr(card, GPR_BASE + card->mgr.ctrl_gpr[SOUND_MIXER_TREBLE][0] + i , 0, treble_table[l][i]);
++              sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + card->mgr.ctrl_gpr[SOUND_MIXER_TREBLE][0] + i , 0, treble_table[l][i]);
+ }
+ const char volume_params[SOUND_MIXER_NRDEVICES]= {
+@@ -206,22 +206,25 @@ static int emu10k1_private_mixer(struct 
+               switch (ctl->cmd) {
+ #ifdef DBGEMU
+               case CMD_WRITEFN0:
+-                      emu10k1_writefn0(card, ctl->val[0], ctl->val[1]);
++                      emu10k1_writefn0_2(card, ctl->val[0], ctl->val[1], ctl->val[2]);
+                       break;
+-
++#endif
+               case CMD_WRITEPTR:
+-                      if (ctl->val[1] >= 0x40 || ctl->val[0] > 0xff) {
++#ifdef DBGEMU
++                      if (ctl->val[1] >= 0x40 || ctl->val[0] >= 0x1000) {
++#else
++                      if (ctl->val[1] >= 0x40 || ctl->val[0] >= 0x1000 || ((ctl->val[0] < 0x100 ) &&
++                  //Any register allowed raw access goes here:
++                                   (ctl->val[0] != A_SPDIF_SAMPLERATE) && (ctl->val[0] != A_DBG)
++                      )
++                              ) {
++#endif
+                               ret = -EINVAL;
+                               break;
+                       }
+-
+-                      if ((ctl->val[0] & 0x7ff) > 0x3f)
+-                              ctl->val[1] = 0x00;
+-
+                       sblive_writeptr(card, ctl->val[0], ctl->val[1], ctl->val[2]);
+-
+                       break;
+-#endif
++
+               case CMD_READFN0:
+                       ctl->val[2] = emu10k1_readfn0(card, ctl->val[0]);
+@@ -286,16 +289,13 @@ static int emu10k1_private_mixer(struct 
+               case CMD_GETVOICEPARAM:
+                       ctl->val[0] = card->waveout.send_routing[0];
+-                      ctl->val[1] = card->waveout.send_a[0] | card->waveout.send_b[0] << 8 |
+-                                    card->waveout.send_c[0] << 16 | card->waveout.send_d[0] << 24;
++                      ctl->val[1] = card->waveout.send_dcba[0];
+                       ctl->val[2] = card->waveout.send_routing[1];
+-                      ctl->val[3] = card->waveout.send_a[1] | card->waveout.send_b[1] << 8 |
+-                                    card->waveout.send_c[1] << 16 | card->waveout.send_d[1] << 24;
++                      ctl->val[3] = card->waveout.send_dcba[1];
+                       ctl->val[4] = card->waveout.send_routing[2];
+-                      ctl->val[5] = card->waveout.send_a[2] | card->waveout.send_b[2] << 8 |
+-                                   card->waveout.send_c[2] << 16 | card->waveout.send_d[2] << 24;
++                      ctl->val[5] = card->waveout.send_dcba[2];
+                       if (copy_to_user((void *) arg, ctl, sizeof(struct mixer_private_ioctl)))
+                               ret = -EFAULT;
+@@ -303,23 +303,14 @@ static int emu10k1_private_mixer(struct 
+                       break;
+               case CMD_SETVOICEPARAM:
+-                      card->waveout.send_routing[0] = ctl->val[0] & 0xffff;
+-                      card->waveout.send_a[0] = ctl->val[1] & 0xff;
+-                      card->waveout.send_b[0] = (ctl->val[1] >> 8) & 0xff;
+-                      card->waveout.send_c[0] = (ctl->val[1] >> 16) & 0xff;
+-                      card->waveout.send_d[0] = (ctl->val[1] >> 24) & 0xff;
+-
+-                      card->waveout.send_routing[1] = ctl->val[2] & 0xffff;
+-                      card->waveout.send_a[1] = ctl->val[3] & 0xff;
+-                      card->waveout.send_b[1] = (ctl->val[3] >> 8) & 0xff;
+-                      card->waveout.send_c[1] = (ctl->val[3] >> 16) & 0xff;
+-                      card->waveout.send_d[1] = (ctl->val[3] >> 24) & 0xff;
+-
+-                      card->waveout.send_routing[2] = ctl->val[4] & 0xffff;
+-                      card->waveout.send_a[2] = ctl->val[5] & 0xff;
+-                      card->waveout.send_b[2] = (ctl->val[5] >> 8) & 0xff;
+-                      card->waveout.send_c[2] = (ctl->val[5] >> 16) & 0xff;
+-                      card->waveout.send_d[2] = (ctl->val[5] >> 24) & 0xff;
++                      card->waveout.send_routing[0] = ctl->val[0];
++                      card->waveout.send_dcba[0] = ctl->val[1];
++
++                      card->waveout.send_routing[1] = ctl->val[2];
++                      card->waveout.send_dcba[1] = ctl->val[3];
++
++                      card->waveout.send_routing[2] = ctl->val[4];
++                      card->waveout.send_dcba[2] = ctl->val[5];
+                       break;
+               
+@@ -416,12 +407,16 @@ static int emu10k1_private_mixer(struct 
+                       break;
+               case CMD_SETGPOUT:
+-                      if (ctl->val[0] > 2 || ctl->val[1] > 1) {
++                      if ( ((ctl->val[0] > 2) && (!card->is_audigy))
++                           || (ctl->val[0] > 15) || ctl->val[1] > 1) {
+                               ret= -EINVAL;
+                               break;
+                       }
+-                      emu10k1_writefn0(card, (1 << 24) | (((ctl->val[0]) + 10) << 16) | HCFG, ctl->val[1]);
++                      if (card->is_audigy)
++                              emu10k1_writefn0(card, (1 << 24) | ((ctl->val[0]) << 16) | A_IOCFG, ctl->val[1]);
++                      else
++                              emu10k1_writefn0(card, (1 << 24) | (((ctl->val[0]) + 10) << 16) | HCFG, ctl->val[1]);
+                       break;
+               case CMD_GETGPR2OSS:
+@@ -493,13 +488,20 @@ static int emu10k1_private_mixer(struct 
+                       break;
+               case CMD_PRIVATE3_VERSION:
+-                      ctl->val[0]=PRIVATE3_VERSION;
++                      ctl->val[0] = PRIVATE3_VERSION; //private3 version
++                      ctl->val[1] = MAJOR_VER;        //major driver version
++                      ctl->val[2] = MINOR_VER;        //minor driver version
++                      ctl->val[3] = card->is_audigy;  //1=card is audigy
++
++                      if (card->is_audigy)
++                              ctl->val[4]=emu10k1_readfn0(card, 0x18);
++
+                       if (copy_to_user((void *) arg, ctl, sizeof(struct mixer_private_ioctl)))
+                               ret = -EFAULT;
+                       break;
+               case CMD_AC97_BOOST:
+-                      if(ctl->val[0])
++                      if (ctl->val[0])
+                               emu10k1_ac97_write(card->ac97, 0x18, 0x0);      
+                       else
+                               emu10k1_ac97_write(card->ac97, 0x18, 0x0808);
+@@ -556,7 +558,7 @@ static int emu10k1_private_mixer(struct 
+                               card->tankmem.size = size;
+-                              sblive_writeptr_tag(card, 0, TCB, (u32) card->tankmem.dma_handle, TCBS, size_reg, TAGLIST_END);
++                              sblive_writeptr_tag(card, 0, TCB, (u32) card->tankmem.dma_handle, TCBS,(u32) size_reg, TAGLIST_END);
+                               emu10k1_writefn0(card, HCFG_LOCKTANKCACHE, 0);
+                       }
+@@ -623,8 +625,13 @@ static int emu10k1_mixer_ioctl(struct in
+               if (cmd == SOUND_MIXER_INFO) {
+                       mixer_info info;
+-                      strncpy(info.id, card->ac97->name, sizeof(info.id));
+-                      strncpy(info.name, "Creative SBLive - Emu10k1", sizeof(info.name));
++                      strlcpy(info.id, card->ac97->name, sizeof(info.id));
++
++                      if (card->is_audigy)
++                              strlcpy(info.name, "Audigy - Emu10k1", sizeof(info.name));
++                      else
++                              strlcpy(info.name, "Creative SBLive - Emu10k1", sizeof(info.name));
++                              
+                       info.modify_counter = card->ac97->modcnt;
+                       if (copy_to_user((void *)arg, &info, sizeof(info)))
+--- linux-2.6.0-test1/sound/oss/emu10k1/passthrough.c  2003-06-14 12:18:09.000000000 -0700
++++ 25/sound/oss/emu10k1/passthrough.c 2003-07-19 17:03:51.000000000 -0700
+@@ -109,7 +109,7 @@ static int pt_putblock(struct emu10k1_wa
+       return 0;
+ }
+-static int pt_setup(struct emu10k1_wavedevice *wave_dev)
++int emu10k1_pt_setup(struct emu10k1_wavedevice *wave_dev)
+ {
+       u32 bits;
+       struct emu10k1_card *card = wave_dev->card;
+@@ -155,7 +155,7 @@ ssize_t emu10k1_pt_write(struct file *fi
+               pt->prepend_size = 0;
+               if (pt->buf == NULL)
+                       return -ENOMEM;
+-              pt_setup(wave_dev);
++              emu10k1_pt_setup(wave_dev);
+       }
+       if (pt->prepend_size) {
+               int needed = PT_BLOCKSIZE - pt->prepend_size;
+@@ -208,13 +208,14 @@ void emu10k1_pt_stop(struct emu10k1_card
+       if (pt->state != PT_STATE_INACTIVE) {
+               DPF(2, "digital pass-through stopped\n");
+-              sblive_writeptr(card, GPR_BASE + pt->enable_gpr, 0, 0);
++              sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + pt->enable_gpr, 0, 0);
+               for (i = 0; i < 3; i++) {
+                         if (pt->spcs_to_use & (1 << i))
+                               sblive_writeptr(card, SPCS0 + i, 0, pt->old_spcs[i]);
+               }
+               pt->state = PT_STATE_INACTIVE;
+-              kfree(pt->buf);
++              if(pt->buf)
++                      kfree(pt->buf);
+       }
+ }
+--- linux-2.6.0-test1/sound/oss/emu10k1/passthrough.h  2003-06-14 12:18:21.000000000 -0700
++++ 25/sound/oss/emu10k1/passthrough.h 2003-07-19 17:03:51.000000000 -0700
+@@ -63,7 +63,36 @@ struct pt_data
+       spinlock_t lock;
+ };
++/*
++  Passthrough can be done in two methods:
++
++  Method 1 : tram
++     In original emu10k1, we couldn't bypass the sample rate converters. Even at 48kHz
++     (the internal sample rate of the emu10k1) the samples would get messed up.
++     To over come this, samples are copied into the tram and a special dsp patch copies
++     the samples out and generates interrupts when a block has finnished playing.
++
++  Method 2 : Interpolator bypass
++
++     Creative fixed the sample rate convert problem in emu10k1 rev 7 and higher
++     (including the emu10k2 (audigy)). This allows us to use the regular, and much simpler
++     playback method. 
++
++
++  In both methods, dsp code is used to mux audio and passthrough. This ensures that the spdif
++  doesn't receive audio and pasthrough data at the same time. The spdif flag SPCS_NOTAUDIODATA
++  is set to tell 
++
++ */
++
++// emu10k1 revs greater than or equal to 7 can use method2
++
++#define USE_PT_METHOD2  (card->is_audigy)
++#define USE_PT_METHOD1        !USE_PT_METHOD2
++
+ ssize_t emu10k1_pt_write(struct file *file, const char *buf, size_t count);
++
++int emu10k1_pt_setup(struct emu10k1_wavedevice *wave_dev);
+ void emu10k1_pt_stop(struct emu10k1_card *card);
+ void emu10k1_pt_waveout_update(struct emu10k1_wavedevice *wave_dev);
+--- linux-2.6.0-test1/sound/oss/emu10k1/recmgr.c       2003-06-14 12:18:52.000000000 -0700
++++ 25/sound/oss/emu10k1/recmgr.c      2003-07-19 17:03:51.000000000 -0700
+@@ -74,7 +74,7 @@ void emu10k1_set_record_src(struct emu10
+               DPF(2, "recording source: AC97\n");
+               buffer->sizereg = ADCBS;
+               buffer->addrreg = ADCBA;
+-              buffer->idxreg = ADCIDX_IDX;
++              buffer->idxreg = card->is_audigy ? A_ADCIDX_IDX : ADCIDX_IDX;
+               switch (wiinst->format.samplingrate) {
+               case 0xBB80:
+@@ -95,21 +95,27 @@ void emu10k1_set_record_src(struct emu10
+               case 0x3E80:
+                       buffer->adcctl = ADCCR_SAMPLERATE_16;
+                       break;
++              // FIXME: audigy supports 12kHz recording
++              /*
++              case ????:
++                      buffer->adcctl = A_ADCCR_SAMPLERATE_12;
++                      break;
++              */
+               case 0x2B11:
+-                      buffer->adcctl = ADCCR_SAMPLERATE_11;
++                      buffer->adcctl = card->is_audigy ? A_ADCCR_SAMPLERATE_11 : ADCCR_SAMPLERATE_11;
+                       break;
+               case 0x1F40:
+-                      buffer->adcctl = ADCCR_SAMPLERATE_8;
++                      buffer->adcctl = card->is_audigy ? A_ADCCR_SAMPLERATE_8 : ADCCR_SAMPLERATE_8;
+                       break;
+               default:
+                       BUG();
+                       break;
+               }
+-              buffer->adcctl |= ADCCR_LCHANENABLE;
++              buffer->adcctl |= card->is_audigy ? A_ADCCR_LCHANENABLE : ADCCR_LCHANENABLE;
+               if (wiinst->format.channels == 2)
+-                      buffer->adcctl |= ADCCR_RCHANENABLE;
++                      buffer->adcctl |= card->is_audigy ? A_ADCCR_RCHANENABLE : ADCCR_RCHANENABLE;
+               break;
+--- linux-2.6.0-test1/sound/oss/emu10k1/voicemgr.c     2003-06-14 12:18:23.000000000 -0700
++++ 25/sound/oss/emu10k1/voicemgr.c    2003-07-19 17:03:51.000000000 -0700
+@@ -32,6 +32,34 @@
+ #include "voicemgr.h"
+ #include "8010.h"
++#define PITCH_48000 0x00004000
++#define PITCH_96000 0x00008000
++#define PITCH_85000 0x00007155
++#define PITCH_80726 0x00006ba2
++#define PITCH_67882 0x00005a82
++#define PITCH_57081 0x00004c1c
++
++u32 emu10k1_select_interprom(struct emu10k1_card *card, struct emu_voice *voice)
++{
++      if(voice->pitch_target==PITCH_48000)
++              return CCCA_INTERPROM_0;
++      else if(voice->pitch_target<PITCH_48000)
++              return CCCA_INTERPROM_1;
++      else  if(voice->pitch_target>=PITCH_96000)
++              return CCCA_INTERPROM_0;
++      else  if(voice->pitch_target>=PITCH_85000)
++              return CCCA_INTERPROM_6;
++      else  if(voice->pitch_target>=PITCH_80726)
++              return CCCA_INTERPROM_5;
++      else  if(voice->pitch_target>=PITCH_67882)
++              return CCCA_INTERPROM_4;
++      else  if(voice->pitch_target>=PITCH_57081)
++              return CCCA_INTERPROM_3;
++      else  
++              return CCCA_INTERPROM_2;
++}
++
++
+ /**
+  * emu10k1_voice_alloc_buffer -
+  *
+@@ -216,17 +244,25 @@ void emu10k1_voice_playback_setup(struct
+       voice->start += start;
+       for (i = 0; i < (voice->flags & VOICE_FLAGS_STEREO ? 2 : 1); i++) {
+-              sblive_writeptr(card, FXRT, voice->num + i, voice->params[i].send_routing << 16);
++              if (card->is_audigy) {
++                      sblive_writeptr(card, A_FXRT1, voice->num + i, voice->params[i].send_routing);
++                      sblive_writeptr(card, A_FXRT2, voice->num + i, voice->params[i].send_routing2);
++                      sblive_writeptr(card,  A_SENDAMOUNTS, voice->num + i, voice->params[i].send_hgfe);
++              } else {
++                      sblive_writeptr(card, FXRT, voice->num + i, voice->params[i].send_routing << 16);
++              }
+               /* Stop CA */
+               /* Assumption that PT is already 0 so no harm overwriting */
+-              sblive_writeptr(card, PTRX, voice->num + i, (voice->params[i].send_a << 8) | voice->params[i].send_b);
++              sblive_writeptr(card, PTRX, voice->num + i, ((voice->params[i].send_dcba & 0xff) << 8)
++                              | ((voice->params[i].send_dcba & 0xff00) >> 8));
+               sblive_writeptr_tag(card, voice->num + i,
+                               /* CSL, ST, CA */
+-                                  DSL, voice->endloop | (voice->params[i].send_d << 24),
+-                                  PSST, voice->startloop | (voice->params[i].send_c << 24),
+-                                  CCCA, (voice->start) | CCCA_INTERPROM_0 | ((voice->flags & VOICE_FLAGS_16BIT) ? 0 : CCCA_8BITSELECT),
++                                  DSL, voice->endloop | (voice->params[i].send_dcba & 0xff000000),
++                                  PSST, voice->startloop | ((voice->params[i].send_dcba & 0x00ff0000) << 8),
++                                  CCCA, (voice->start) |  emu10k1_select_interprom(card,voice) |
++                                      ((voice->flags & VOICE_FLAGS_16BIT) ? 0 : CCCA_8BITSELECT),
+                                   /* Clear filter delay memory */
+                                   Z1, 0,
+                                   Z2, 0,
+--- linux-2.6.0-test1/sound/oss/emu10k1/voicemgr.h     2003-06-14 12:18:23.000000000 -0700
++++ 25/sound/oss/emu10k1/voicemgr.h    2003-07-19 17:03:51.000000000 -0700
+@@ -48,11 +48,13 @@ struct voice_param
+       /* FX bus amount send */
+       u32 send_routing;
++      // audigy only:
++      u32 send_routing2;
++
++      u32 send_dcba;
++      // audigy only:
++      u32 send_hgfe;
+-      u32 send_a;
+-      u32 send_b;
+-      u32 send_c;
+-      u32 send_d;
+       u32 initial_fc;
+       u32 fc_target;
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/sound/oss/hal2.c        2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,1498 @@
++/*
++ *  Driver for HAL2 sound processors
++ *  Copyright (c) 2001, 2002 Ladislav Michl <ladis@psi.cz>
++ *  
++ *  Based on Ulf Carlsson's code.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License version 2 as 
++ *  published by the Free Software Foundation.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ *  Supported devices:
++ *  /dev/dsp    standard dsp device, (mostly) OSS compatible
++ *  /dev/mixer        standard mixer device, (mostly) OSS compatible
++ *
++ *  BUGS:
++ *  + Driver currently supports indigo mode only.
++ *  + Recording doesn't work. I guess that it is caused by PBUS channel
++ *    misconfiguration, but until I get relevant info I'm unable to fix it.
++ */
++
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/poll.h>
++#include <linux/sound.h>
++#include <linux/soundcard.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
++#include <asm/sgi/sgint23.h>
++
++#include "hal2.h"
++
++#if 0
++#define DEBUG(args...)                printk(args)
++#else
++#define DEBUG(args...)
++#endif
++
++#if 0 
++#define DEBUG_MIX(args...)    printk(args)
++#else
++#define DEBUG_MIX(args...)
++#endif
++
++#define H2_INDIRECT_WAIT(regs)        while (regs->isr & H2_ISR_TSTATUS);
++
++#define H2_READ_ADDR(addr)    (addr | (1<<7))
++#define H2_WRITE_ADDR(addr)   (addr)
++
++static char *hal2str = "HAL2 audio";
++static int ibuffers = 32;
++static int obuffers = 32;
++
++/* I doubt anyone has a machine with two HAL2 cards. It's possible to
++ * have two HPC's, so it is probably possible to have two HAL2 cards.
++ * Try to deal with it, but note that it is not tested.
++ */
++#define MAXCARDS      2
++static hal2_card_t* hal2_card[MAXCARDS];
++
++static const struct {
++      unsigned char idx:4, avail:1;
++} mixtable[SOUND_MIXER_NRDEVICES] = {
++      [SOUND_MIXER_PCM] = { H2_MIX_OUTPUT_ATT, 1 },   /* voice */
++      [SOUND_MIXER_MIC] = { H2_MIX_INPUT_GAIN, 1 },   /* mic */
++};
++
++#define H2_SUPPORTED_FORMATS  (AFMT_S16_LE | AFMT_S16_BE)
++
++static inline void hal2_isr_write(hal2_card_t *hal2, u32 val)
++{
++      hal2->ctl_regs->isr = val;
++}
++
++static inline u32 hal2_isr_look(hal2_card_t *hal2)
++{
++      return hal2->ctl_regs->isr;
++}
++
++static inline u32 hal2_rev_look(hal2_card_t *hal2)
++{
++      return hal2->ctl_regs->rev;
++}
++
++#if 0
++static u16 hal2_i_look16(hal2_card_t *hal2, u32 addr)
++{
++      hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++      regs->iar = H2_READ_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++      return (regs->idr0 & 0xffff);
++}
++#endif
++
++static u32 hal2_i_look32(hal2_card_t *hal2, u32 addr)
++{
++      u32 ret;
++      hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++      regs->iar = H2_READ_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++      ret = regs->idr0 & 0xffff;
++      regs->iar = H2_READ_ADDR(addr | 0x1);
++      H2_INDIRECT_WAIT(regs);
++      ret |= (regs->idr0 & 0xffff) << 16;
++      return ret;
++}
++
++static void hal2_i_write16(hal2_card_t *hal2, u32 addr, u16 val)
++{
++      hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++      regs->idr0 = val;
++      regs->idr1 = 0;
++      regs->idr2 = 0;
++      regs->idr3 = 0;
++      regs->iar = H2_WRITE_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++}
++
++static void hal2_i_write32(hal2_card_t *hal2, u32 addr, u32 val)
++{
++      hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++      regs->idr0 = val & 0xffff;
++      regs->idr1 = val >> 16;
++      regs->idr2 = 0;
++      regs->idr3 = 0;
++      regs->iar = H2_WRITE_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++}
++
++static void hal2_i_setbit16(hal2_card_t *hal2, u32 addr, u16 bit)
++{
++      hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++      regs->iar = H2_READ_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++      regs->idr0 = regs->idr0 | bit;
++      regs->idr1 = 0;
++      regs->idr2 = 0;
++      regs->idr3 = 0;
++      regs->iar = H2_WRITE_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++}
++
++static void hal2_i_setbit32(hal2_card_t *hal2, u32 addr, u32 bit)
++{
++      u32 tmp;
++      hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++      regs->iar = H2_READ_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++      tmp = regs->idr0 | (regs->idr1 << 16) | bit;
++      regs->idr0 = tmp & 0xffff;
++      regs->idr1 = tmp >> 16;
++      regs->idr2 = 0;
++      regs->idr3 = 0;
++      regs->iar = H2_WRITE_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++}
++
++static void hal2_i_clearbit16(hal2_card_t *hal2, u32 addr, u16 bit)
++{
++      hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++      regs->iar = H2_READ_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++      regs->idr0 = regs->idr0 & ~bit;
++      regs->idr1 = 0;
++      regs->idr2 = 0;
++      regs->idr3 = 0;
++      regs->iar = H2_WRITE_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++}
++
++#if 0
++static void hal2_i_clearbit32(hal2_card_t *hal2, u32 addr, u32 bit)
++{
++      u32 tmp;
++      hal2_ctl_regs_t *regs = hal2->ctl_regs;
++
++      regs->iar = H2_READ_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++      tmp = (regs->idr0 | (regs->idr1 << 16)) & ~bit;
++      regs->idr0 = tmp & 0xffff;
++      regs->idr1 = tmp >> 16;
++      regs->idr2 = 0;
++      regs->idr3 = 0;
++      regs->iar = H2_WRITE_ADDR(addr);
++      H2_INDIRECT_WAIT(regs);
++}
++#endif
++
++#ifdef HAL2_DEBUG
++static void hal2_dump_regs(hal2_card_t *hal2)
++{
++      printk("isr: %08hx ", hal2_isr_look(hal2));
++      printk("rev: %08hx\n", hal2_rev_look(hal2));
++      printk("relay: %04hx\n", hal2_i_look16(hal2, H2I_RELAY_C));
++      printk("port en: %04hx ", hal2_i_look16(hal2, H2I_DMA_PORT_EN));
++      printk("dma end: %04hx ", hal2_i_look16(hal2, H2I_DMA_END));
++      printk("dma drv: %04hx\n", hal2_i_look16(hal2, H2I_DMA_DRV));
++      printk("syn ctl: %04hx ", hal2_i_look16(hal2, H2I_SYNTH_C));
++      printk("aesrx ctl: %04hx ", hal2_i_look16(hal2, H2I_AESRX_C));
++      printk("aestx ctl: %04hx ", hal2_i_look16(hal2, H2I_AESTX_C));
++      printk("dac ctl1: %04hx ", hal2_i_look16(hal2, H2I_ADC_C1));
++      printk("dac ctl2: %08lx ", hal2_i_look32(hal2, H2I_ADC_C2));
++      printk("adc ctl1: %04hx ", hal2_i_look16(hal2, H2I_DAC_C1));
++      printk("adc ctl2: %08lx ", hal2_i_look32(hal2, H2I_DAC_C2));
++      printk("syn map: %04hx\n", hal2_i_look16(hal2, H2I_SYNTH_MAP_C));
++      printk("bres1 ctl1: %04hx ", hal2_i_look16(hal2, H2I_BRES1_C1));
++      printk("bres1 ctl2: %04lx ", hal2_i_look32(hal2, H2I_BRES1_C2));
++      printk("bres2 ctl1: %04hx ", hal2_i_look16(hal2, H2I_BRES2_C1));
++      printk("bres2 ctl2: %04lx ", hal2_i_look32(hal2, H2I_BRES2_C2));
++      printk("bres3 ctl1: %04hx ", hal2_i_look16(hal2, H2I_BRES3_C1));
++      printk("bres3 ctl2: %04lx\n", hal2_i_look32(hal2, H2I_BRES3_C2));
++}
++#endif
++
++static hal2_card_t* hal2_dsp_find_card(int minor)
++{
++      int i;
++
++      for (i = 0; i < MAXCARDS; i++)
++              if (hal2_card[i] != NULL && hal2_card[i]->dev_dsp == minor)
++                      return hal2_card[i];
++      return NULL;
++}
++
++static hal2_card_t* hal2_mixer_find_card(int minor)
++{
++      int i;
++
++      for (i = 0; i < MAXCARDS; i++)
++              if (hal2_card[i] != NULL && hal2_card[i]->dev_mixer == minor)
++                      return hal2_card[i];
++      return NULL;
++}
++
++
++static void hal2_dac_interrupt(hal2_codec_t *dac)
++{
++      int running;
++
++      spin_lock(&dac->lock);
++      
++      /* if tail buffer contains zero samples DMA stream was already
++       * stopped */
++      running = dac->tail->info.cnt;
++      dac->tail->info.cnt = 0;
++      dac->tail->info.desc.cntinfo = HPCDMA_XIE | HPCDMA_EOX;
++      dma_cache_wback_inv((unsigned long) dac->tail,
++                          sizeof(struct hpc_dma_desc));
++      /* we just proccessed empty buffer, don't update tail pointer */
++      if (running)
++              dac->tail = dac->tail->info.next;
++
++      spin_unlock(&dac->lock);
++
++      wake_up(&dac->dma_wait);
++}
++
++static void hal2_adc_interrupt(hal2_codec_t *adc)
++{
++      int running;
++      
++      spin_lock(&adc->lock);
++
++      /* if head buffer contains nonzero samples DMA stream was already
++       * stopped */
++      running = !adc->head->info.cnt;
++      adc->head->info.cnt = H2_BUFFER_SIZE;
++      adc->head->info.desc.cntinfo = HPCDMA_XIE | HPCDMA_EOX;
++      dma_cache_wback_inv((unsigned long) adc->head,
++                          sizeof(struct hpc_dma_desc));
++      /* we just proccessed empty buffer, don't update head pointer */
++      if (running) {
++              dma_cache_inv((unsigned long) adc->head->data, H2_BUFFER_SIZE);
++              adc->head = adc->head->info.next;
++      }
++
++      spin_unlock(&adc->lock);
++
++      wake_up(&adc->dma_wait);
++}
++
++static irqreturn_t hal2_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++      hal2_card_t *hal2 = (hal2_card_t*)dev_id;
++
++      /* decide what caused this interrupt */
++      if (hal2->dac.pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_INT)
++              hal2_dac_interrupt(&hal2->dac);
++      if (hal2->adc.pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_INT)
++              hal2_adc_interrupt(&hal2->adc);
++      return IRQ_HANDLED;
++}
++
++static int hal2_compute_rate(hal2_codec_t *codec, unsigned int rate)
++{
++      unsigned short inc;
++      
++      /* We default to 44.1 kHz and if it isn't possible to fall back to
++       * 48.0 kHz with the needed adjustments of real_rate.
++       */
++
++      DEBUG("rate: %d\n", rate);
++      
++      /* Refer to CS4216 data sheet */
++      if (rate < 4000)
++              rate = 4000;
++      if (rate > 50000)
++              rate = 50000;
++
++      /* Note: This is NOT the way they set up the bresenham clock generators
++       * in the specification. I've tried to implement that method but it
++       * doesn't work. It's probably another silly bug in the spec.
++       *
++       * I accidently discovered this method while I was testing and it seems
++       * to work very well with all frequencies, and thee shall follow rule #1
++       * of programming :-)
++       */
++      
++      if (44100 % rate == 0) {
++              inc = 44100 / rate;
++              if (inc < 1) inc = 1;
++              codec->master = 44100;
++      } else {
++              inc = 48000 / rate;
++              if (inc < 1) inc = 1;
++              rate = 48000 / inc;
++              codec->master = 48000;
++      }
++      codec->inc = inc;
++      codec->mod = 1;
++      
++      DEBUG("real_rate: %d\n", rate);
++
++      return rate;
++}
++
++static void hal2_set_dac_rate(hal2_card_t *hal2)
++{
++      unsigned int master = hal2->dac.master;
++      int inc = hal2->dac.inc;
++      int mod = hal2->dac.mod;
++
++      DEBUG("master: %d inc: %d mod: %d\n", master, inc, mod);
++      
++      hal2_i_write16(hal2, H2I_BRES1_C1, (master == 44100) ? 1 : 0);
++      hal2_i_write32(hal2, H2I_BRES1_C2, ((0xffff & (mod - inc - 1)) << 16) | 1);
++}
++
++static void hal2_set_adc_rate(hal2_card_t *hal2)
++{
++      unsigned int master = hal2->adc.master;
++      int inc = hal2->adc.inc;
++      int mod = hal2->adc.mod;
++
++      DEBUG("master: %d inc: %d mod: %d\n", master, inc, mod);
++      
++      hal2_i_write16(hal2, H2I_BRES2_C1, (master == 44100) ? 1 : 0);
++      hal2_i_write32(hal2, H2I_BRES2_C2, ((0xffff & (mod - inc - 1)) << 16) | 1);
++}
++
++static void hal2_setup_dac(hal2_card_t *hal2)
++{
++      unsigned int fifobeg, fifoend, highwater, sample_size;
++      hal2_pbus_t *pbus = &hal2->dac.pbus;
++
++      DEBUG("hal2_setup_dac\n");
++      
++      /* Now we set up some PBUS information. The PBUS needs information about
++       * what portion of the fifo it will use. If it's receiving or
++       * transmitting, and finally whether the stream is little endian or big
++       * endian. The information is written later, on the start call.
++       */
++      sample_size = 2 * hal2->dac.voices;
++
++      /* Fifo should be set to hold exactly four samples. Highwater mark
++       * should be set to two samples. */
++      highwater = (sample_size * 2) >> 1;     /* halfwords */
++      fifobeg = 0;                            /* playback is first */
++      fifoend = (sample_size * 4) >> 3;       /* doublewords */
++      pbus->ctrl = HPC3_PDMACTRL_RT | HPC3_PDMACTRL_LD |
++                   (highwater << 8) | (fifobeg << 16) | (fifoend << 24);
++      /* We disable everything before we do anything at all */
++      pbus->pbus->pbdma_ctrl = HPC3_PDMACTRL_LD;
++      hal2_i_clearbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECTX);
++      hal2_i_clearbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr));
++      /* Setup the HAL2 for playback */
++      hal2_set_dac_rate(hal2);
++      /* We are using 1st Bresenham clock generator for playback */
++      hal2_i_write16(hal2, H2I_DAC_C1, (pbus->pbusnr << H2I_C1_DMA_SHIFT)
++                      | (1 << H2I_C1_CLKID_SHIFT)
++                      | (hal2->dac.voices << H2I_C1_DATAT_SHIFT));
++}
++
++static void hal2_setup_adc(hal2_card_t *hal2)
++{
++      unsigned int fifobeg, fifoend, highwater, sample_size;
++      hal2_pbus_t *pbus = &hal2->adc.pbus;
++
++      DEBUG("hal2_setup_adc\n");
++      
++      sample_size = 2 * hal2->adc.voices;
++
++      highwater = (sample_size * 2) >> 1;             /* halfwords */
++      fifobeg = (4 * 4) >> 3;                         /* record is second */
++      fifoend = (4 * 4 + sample_size * 4) >> 3;       /* doublewords */
++      pbus->ctrl = HPC3_PDMACTRL_RT | HPC3_PDMACTRL_RCV | HPC3_PDMACTRL_LD | 
++                   (highwater << 8) | (fifobeg << 16) | (fifoend << 24);
++      pbus->pbus->pbdma_ctrl = HPC3_PDMACTRL_LD;
++      hal2_i_clearbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECR);
++      hal2_i_clearbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr));
++      /* Setup the HAL2 for record */
++      hal2_set_adc_rate(hal2);
++      /* We are using 2nd Bresenham clock generator for record */
++      hal2_i_write16(hal2, H2I_ADC_C1, (pbus->pbusnr << H2I_C1_DMA_SHIFT)
++                      | (2 << H2I_C1_CLKID_SHIFT)
++                      | (hal2->adc.voices << H2I_C1_DATAT_SHIFT));
++}
++
++static void hal2_start_dac(hal2_card_t *hal2)
++{
++      hal2_pbus_t *pbus = &hal2->dac.pbus;
++
++      DEBUG("hal2_start_dac\n");
++      
++      pbus->pbus->pbdma_dptr = PHYSADDR(hal2->dac.tail);
++      pbus->pbus->pbdma_ctrl = pbus->ctrl | HPC3_PDMACTRL_ACT;
++
++      /* set endianess */
++      if (hal2->dac.format & AFMT_S16_LE)
++              hal2_i_setbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECTX);
++      else
++              hal2_i_clearbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECTX);
++      /* set DMA bus */
++      hal2_i_setbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr));
++      /* enable DAC */
++      hal2_i_setbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECTX);
++}
++
++static void hal2_start_adc(hal2_card_t *hal2)
++{
++      hal2_pbus_t *pbus = &hal2->adc.pbus;
++
++      DEBUG("hal2_start_adc\n");
++      
++      pbus->pbus->pbdma_dptr = PHYSADDR(hal2->adc.head);
++      pbus->pbus->pbdma_ctrl = pbus->ctrl | HPC3_PDMACTRL_ACT;
++      
++      /* set endianess */
++      if (hal2->adc.format & AFMT_S16_LE)
++              hal2_i_setbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECR);
++      else
++              hal2_i_clearbit16(hal2, H2I_DMA_END, H2I_DMA_END_CODECR);
++      /* set DMA bus */
++      hal2_i_setbit16(hal2, H2I_DMA_DRV, (1 << pbus->pbusnr));
++      /* enable ADC */
++      hal2_i_setbit16(hal2, H2I_DMA_PORT_EN, H2I_DMA_PORT_EN_CODECR);
++}
++
++static inline void hal2_stop_dac(hal2_card_t *hal2)
++{
++      DEBUG("hal2_stop_dac\n");
++      
++      hal2->dac.pbus.pbus->pbdma_ctrl = HPC3_PDMACTRL_LD;
++      /* The HAL2 itself may remain enabled safely */
++}
++
++static inline void hal2_stop_adc(hal2_card_t *hal2)
++{
++      DEBUG("hal2_stop_adc\n");
++      
++      hal2->adc.pbus.pbus->pbdma_ctrl = HPC3_PDMACTRL_LD;
++}
++
++#define hal2_alloc_dac_dmabuf(hal2)   hal2_alloc_dmabuf(hal2, 1)
++#define hal2_alloc_adc_dmabuf(hal2)   hal2_alloc_dmabuf(hal2, 0)
++static int hal2_alloc_dmabuf(hal2_card_t *hal2, int is_dac)
++{
++      int buffers, cntinfo;
++      hal2_buf_t *buf, *prev;
++      hal2_codec_t *codec;
++
++      if (is_dac) {
++              codec = &hal2->dac;
++              buffers = obuffers;
++              cntinfo = HPCDMA_XIE | HPCDMA_EOX;
++      } else {
++              codec = &hal2->adc;
++              buffers = ibuffers;
++              cntinfo = HPCDMA_XIE | H2_BUFFER_SIZE;
++      }
++      
++      DEBUG("allocating %d DMA buffers.\n", buffers);
++      
++      buf = (hal2_buf_t*) get_zeroed_page(GFP_KERNEL);
++      if (!buf)
++              return -ENOMEM;
++      codec->head = buf;
++      codec->tail = buf;
++      
++      while (--buffers) {
++              buf->info.desc.pbuf = PHYSADDR(&buf->data);
++              buf->info.desc.cntinfo = cntinfo;
++              buf->info.cnt = 0;
++              prev = buf;
++              buf = (hal2_buf_t*) get_zeroed_page(GFP_KERNEL);
++              if (!buf) {
++                      printk("HAL2: Not enough memory for DMA buffer.\n");
++                      buf = codec->head;
++                      while (buf) {
++                              prev = buf;
++                              free_page((unsigned long) buf);
++                              buf = prev->info.next;
++                      }
++                      return -ENOMEM;
++              }
++              prev->info.next = buf;
++              prev->info.desc.pnext = PHYSADDR(buf);
++              /* The PBUS can prolly not read this stuff when it's in
++               * the cache so we have to flush it back to main memory
++               */
++              dma_cache_wback_inv((unsigned long) prev, PAGE_SIZE);
++      }
++      buf->info.desc.pbuf = PHYSADDR(&buf->data);
++      buf->info.desc.cntinfo = cntinfo;
++      buf->info.cnt = 0;
++      buf->info.next = codec->head;
++      buf->info.desc.pnext = PHYSADDR(codec->head);
++      dma_cache_wback_inv((unsigned long) buf, PAGE_SIZE);
++      
++      return 0;
++}
++
++#define hal2_free_dac_dmabuf(hal2)    hal2_free_dmabuf(hal2, 1)
++#define hal2_free_adc_dmabuf(hal2)    hal2_free_dmabuf(hal2, 0)
++static void hal2_free_dmabuf(hal2_card_t *hal2, int is_dac)
++{
++      hal2_buf_t *buf, *next;
++      hal2_codec_t *codec = (is_dac) ? &hal2->dac : &hal2->adc;
++
++      if (!codec->head)
++              return;
++      
++      buf = codec->head->info.next;
++      codec->head->info.next = NULL;
++      while (buf) {
++              next = buf->info.next;
++              free_page((unsigned long) buf);
++              buf = next;
++      }
++      codec->head = codec->tail = NULL;
++}
++
++/* 
++ * Add 'count' bytes to 'buffer' from DMA ring buffers. Return number of
++ * bytes added or -EFAULT if copy_from_user failed.
++ */
++static int hal2_get_buffer(hal2_card_t *hal2, char *buffer, int count)
++{
++      unsigned long flags;
++      int size, ret = 0;
++      hal2_codec_t *adc = &hal2->adc;
++      
++      spin_lock_irqsave(&adc->lock, flags);
++      
++      DEBUG("getting %d bytes ", count);
++
++      /* enable DMA stream if there are no data */
++      if (!(adc->pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_ISACT) &&
++          adc->tail->info.cnt == 0)
++              hal2_start_adc(hal2);
++
++      DEBUG("... ");
++
++      while (adc->tail->info.cnt > 0 && count > 0) {
++              size = min(adc->tail->info.cnt, count);
++              spin_unlock_irqrestore(&adc->lock, flags);
++
++              if (copy_to_user(buffer, &adc->tail->data[H2_BUFFER_SIZE-size],
++                               size)) {
++                      ret = -EFAULT;
++                      goto out;
++              }
++
++              spin_lock_irqsave(&adc->lock, flags);
++              
++              adc->tail->info.cnt -= size;
++              /* buffer is empty, update tail pointer */
++              if (adc->tail->info.cnt == 0) {
++                      adc->tail->info.desc.cntinfo = HPCDMA_XIE |
++                                                     H2_BUFFER_SIZE;
++                      dma_cache_wback_inv((unsigned long) adc->tail,
++                                          sizeof(struct hpc_dma_desc));
++                      adc->tail = adc->tail->info.next;
++                      /* enable DMA stream again if needed */
++                      if (!(adc->pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_ISACT))
++                              hal2_start_adc(hal2);
++
++              }
++              buffer += size;
++              ret += size;
++              count -= size;
++
++              DEBUG("(%d) ", size);
++      }
++      spin_unlock_irqrestore(&adc->lock, flags);
++out:  
++      DEBUG("\n");
++      
++      return ret;
++} 
++
++/* 
++ * Add 'count' bytes from 'buffer' to DMA ring buffers. Return number of
++ * bytes added or -EFAULT if copy_from_user failed.
++ */
++static int hal2_add_buffer(hal2_card_t *hal2, char *buffer, int count)
++{
++      unsigned long flags;
++      int size, ret = 0;
++      hal2_codec_t *dac = &hal2->dac;
++      
++      spin_lock_irqsave(&dac->lock, flags);
++      
++      DEBUG("adding %d bytes ", count);
++
++      while (dac->head->info.cnt == 0 && count > 0) {
++              size = min((int)H2_BUFFER_SIZE, count);
++              spin_unlock_irqrestore(&dac->lock, flags);
++              
++              if (copy_from_user(dac->head->data, buffer, size)) {
++                      ret = -EFAULT;
++                      goto out;
++              }
++              spin_lock_irqsave(&dac->lock, flags);
++
++              dac->head->info.desc.cntinfo = size | HPCDMA_XIE;
++              dac->head->info.cnt = size;
++              dma_cache_wback_inv((unsigned long) dac->head, 
++                                  size + PAGE_SIZE - H2_BUFFER_SIZE);
++              buffer += size;
++              ret += size;
++              count -= size;
++              dac->head = dac->head->info.next;
++
++              DEBUG("(%d) ", size);
++      }
++      if (!(dac->pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_ISACT) && ret > 0)
++              hal2_start_dac(hal2);
++      
++      spin_unlock_irqrestore(&dac->lock, flags);
++out:  
++      DEBUG("\n");
++      
++      return ret;
++}
++
++#define hal2_reset_dac_pointer(hal2)  hal2_reset_pointer(hal2, 1)
++#define hal2_reset_adc_pointer(hal2)  hal2_reset_pointer(hal2, 0)
++static void hal2_reset_pointer(hal2_card_t *hal2, int is_dac)
++{
++      hal2_codec_t *codec = (is_dac) ? &hal2->dac : &hal2->adc;
++      
++      DEBUG("hal2_reset_pointer\n");
++
++      codec->tail = codec->head;
++      do {
++              codec->tail->info.desc.cntinfo = HPCDMA_XIE | (is_dac) ? 
++                                               HPCDMA_EOX : H2_BUFFER_SIZE;
++              codec->tail->info.cnt = 0;
++              dma_cache_wback_inv((unsigned long) codec->tail, 
++                                  sizeof(struct hpc_dma_desc));
++              codec->tail = codec->tail->info.next;
++      } while (codec->tail != codec->head);
++}
++
++static int hal2_sync_dac(hal2_card_t *hal2)
++{
++      DECLARE_WAITQUEUE(wait, current);
++      hal2_codec_t *dac = &hal2->dac;
++      int ret = 0;
++      signed long timeout = 1000 * H2_BUFFER_SIZE * 2 * dac->voices *
++                            HZ / dac->sample_rate / 900;
++
++      down(&dac->sem);
++      
++      while (dac->pbus.pbus->pbdma_ctrl & HPC3_PDMACTRL_ISACT) {
++              add_wait_queue(&dac->dma_wait, &wait);
++              set_current_state(TASK_INTERRUPTIBLE);
++              if (!schedule_timeout(timeout))
++                      /* We may get bogus timeout when system is 
++                       * heavily loaded */
++                      if (dac->tail->info.cnt) {
++                              printk("HAL2: timeout...\n");
++                              ret = -ETIME;
++                      }
++              if (signal_pending(current))
++                      ret = -ERESTARTSYS;
++              if (ret) {
++                      hal2_stop_dac(hal2);
++                      hal2_reset_dac_pointer(hal2);
++              }
++              remove_wait_queue(&dac->dma_wait, &wait);
++      }
++
++      up(&dac->sem);
++      
++      return ret;
++}
++
++static int hal2_write_mixer(hal2_card_t *hal2, int index, int vol)
++{
++      unsigned int l, r;
++
++      DEBUG_MIX("mixer %d write\n", index);
++      
++      if (index >= SOUND_MIXER_NRDEVICES || !mixtable[index].avail)
++              return -EINVAL;
++
++      r = (vol >> 8) & 0xff;
++      if (r > 100)
++              r = 100;
++      l = vol & 0xff;
++      if (l > 100)
++              l = 100;
++      
++      hal2->mixer.volume[mixtable[index].idx] = l | (r << 8);
++
++      switch (mixtable[index].idx) {
++      case H2_MIX_OUTPUT_ATT: {
++
++              DEBUG_MIX("output attenuator %d,%d\n", l, r);
++
++              if (r | l) {
++                      unsigned int tmp = hal2_i_look32(hal2, H2I_DAC_C2); 
++              
++                      tmp &= ~(H2I_C2_L_ATT_M | H2I_C2_R_ATT_M | H2I_C2_MUTE);
++
++                      /* Attenuator has five bits */
++                      l = (31 * (100 - l) / 99);
++                      r = (31 * (100 - r) / 99);
++                      
++                      DEBUG_MIX("left: %d, right %d\n", l, r);
++
++                      tmp |= (l << H2I_C2_L_ATT_SHIFT) & H2I_C2_L_ATT_M;
++                      tmp |= (r << H2I_C2_R_ATT_SHIFT) & H2I_C2_R_ATT_M;
++                      hal2_i_write32(hal2, H2I_DAC_C2, tmp);
++              } else 
++                      hal2_i_setbit32(hal2, H2I_DAC_C2, H2I_C2_MUTE);
++      }
++      case H2_MIX_INPUT_GAIN: {
++              /* TODO */
++      }
++      }
++      return 0;
++}
++
++static void hal2_init_mixer(hal2_card_t *hal2)
++{
++      int i;
++
++      for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
++              hal2_write_mixer(hal2, i, 100 | (100 << 8));
++              
++}
++
++static int hal2_mixer_ioctl(hal2_card_t *hal2, unsigned int cmd, 
++                          unsigned long arg)
++{
++      int val;
++
++        if (cmd == SOUND_MIXER_INFO) {
++              mixer_info info;
++              
++              strncpy(info.id, hal2str, sizeof(info.id));
++              strncpy(info.name, hal2str, sizeof(info.name));
++              info.modify_counter = hal2->mixer.modcnt;
++              if (copy_to_user((void *)arg, &info, sizeof(info)))
++                      return -EFAULT;
++              return 0;
++      }
++      if (cmd == SOUND_OLD_MIXER_INFO) {
++              _old_mixer_info info;
++              
++              strncpy(info.id, hal2str, sizeof(info.id));
++              strncpy(info.name, hal2str, sizeof(info.name));
++              if (copy_to_user((void *)arg, &info, sizeof(info)))
++                      return -EFAULT;
++              return 0;
++      }
++      if (cmd == OSS_GETVERSION)
++              return put_user(SOUND_VERSION, (int *)arg);
++
++      if (_IOC_TYPE(cmd) != 'M' || _IOC_SIZE(cmd) != sizeof(int))
++                return -EINVAL;
++
++        if (_IOC_DIR(cmd) == _IOC_READ) {
++                switch (_IOC_NR(cmd)) {
++              /* Give the current record source */
++              case SOUND_MIXER_RECSRC:
++                      val = 0;        /* FIXME */
++                      break;
++              /* Give the supported mixers, all of them support stereo */
++                case SOUND_MIXER_DEVMASK:
++                case SOUND_MIXER_STEREODEVS: {
++                      int i;
++                      
++                      for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
++                              if (mixtable[i].avail)
++                                      val |= 1 << i;
++                      break;
++                      }
++              /* Arg contains a bit for each supported recording source */
++                case SOUND_MIXER_RECMASK:
++                      val = 0;
++                      break;
++                case SOUND_MIXER_CAPS:
++                      val = 0;
++                      break;
++              /* Read a specific mixer */
++              default: {
++                      int i = _IOC_NR(cmd);
++                      
++                      if (i >= SOUND_MIXER_NRDEVICES || !mixtable[i].avail)
++                              return -EINVAL;
++                      val = hal2->mixer.volume[mixtable[i].idx];
++                      break;
++                      }
++              }
++              return put_user(val, (int *)arg);
++      }
++      
++        if (_IOC_DIR(cmd) != (_IOC_WRITE|_IOC_READ))
++              return -EINVAL;
++      
++      hal2->mixer.modcnt++;
++
++      if (get_user(val, (int *)arg))
++              return -EFAULT;
++
++      switch (_IOC_NR(cmd)) {
++      /* Arg contains a bit for each recording source */
++      case SOUND_MIXER_RECSRC:
++              return 0;       /* FIXME */
++      default:
++              return hal2_write_mixer(hal2, _IOC_NR(cmd), val);
++      }
++
++      return 0;
++}
++
++static int hal2_open_mixdev(struct inode *inode, struct file *file)
++{
++      hal2_card_t *hal2 = hal2_mixer_find_card(MINOR(inode->i_rdev));
++
++      if (hal2) {
++              file->private_data = hal2;
++              return 0;
++      }
++      return -ENODEV;
++}
++
++static int hal2_release_mixdev(struct inode *inode, struct file *file)
++{
++      return 0;
++}
++
++static int hal2_ioctl_mixdev(struct inode *inode, struct file *file,
++                           unsigned int cmd, unsigned long arg)
++{
++      return hal2_mixer_ioctl((hal2_card_t *)file->private_data, cmd, arg);
++}
++
++
++static int hal2_ioctl(struct inode *inode, struct file *file, 
++                    unsigned int cmd, unsigned long arg)
++{
++      int val;
++      hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++
++      switch (cmd) {
++      case OSS_GETVERSION:
++              return put_user(SOUND_VERSION, (int *)arg);
++              
++      case SNDCTL_DSP_SYNC:
++              if (file->f_mode & FMODE_WRITE)
++                      return hal2_sync_dac(hal2);
++              return 0;
++              
++      case SNDCTL_DSP_SETDUPLEX:
++              return 0;
++
++      case SNDCTL_DSP_GETCAPS:
++              return put_user(DSP_CAP_DUPLEX | DSP_CAP_MULTI, (int *)arg);
++              
++      case SNDCTL_DSP_RESET:
++              if (file->f_mode & FMODE_READ) {
++                      hal2_stop_adc(hal2);
++                      hal2_reset_adc_pointer(hal2);
++              }
++              if (file->f_mode & FMODE_WRITE) {
++                      hal2_stop_dac(hal2);
++                      hal2_reset_dac_pointer(hal2);
++              }
++              return 0;
++
++      case SNDCTL_DSP_SPEED:
++              if (get_user(val, (int *)arg))
++                      return -EFAULT;
++              if (file->f_mode & FMODE_READ) {
++                      hal2_stop_adc(hal2);
++                      val = hal2_compute_rate(&hal2->adc, val);
++                      hal2->adc.sample_rate = val;
++                      hal2_set_adc_rate(hal2);
++              }
++              if (file->f_mode & FMODE_WRITE) {
++                      hal2_stop_dac(hal2);
++                      val = hal2_compute_rate(&hal2->dac, val);
++                      hal2->dac.sample_rate = val;
++                      hal2_set_dac_rate(hal2);
++              }
++              return put_user(val, (int *)arg);
++              
++      case SNDCTL_DSP_STEREO:
++              if (get_user(val, (int *)arg))
++                      return -EFAULT;
++              if (file->f_mode & FMODE_READ) {
++                      hal2_stop_adc(hal2);
++                      hal2->adc.voices = (val) ? 2 : 1;
++                      hal2_setup_adc(hal2);
++              }
++              if (file->f_mode & FMODE_WRITE) {
++                      hal2_stop_dac(hal2);
++                      hal2->dac.voices = (val) ? 2 : 1;
++                      hal2_setup_dac(hal2);
++                }
++              return 0;
++
++      case SNDCTL_DSP_CHANNELS:
++              if (get_user(val, (int *)arg))
++                      return -EFAULT;
++              if (val != 0) {
++                      if (file->f_mode & FMODE_READ) {
++                              hal2_stop_adc(hal2);
++                              hal2->adc.voices = (val == 1) ? 1 : 2;
++                              hal2_setup_adc(hal2);
++                      }
++                      if (file->f_mode & FMODE_WRITE) {
++                              hal2_stop_dac(hal2);
++                              hal2->dac.voices = (val == 1) ? 1 : 2;
++                              hal2_setup_dac(hal2);
++                      }
++              }
++              val = -EINVAL;
++              if (file->f_mode & FMODE_READ)
++                      val = hal2->adc.voices;
++              if (file->f_mode & FMODE_WRITE)
++                      val = hal2->dac.voices;
++              return put_user(val, (int *)arg);
++              
++      case SNDCTL_DSP_GETFMTS: /* Returns a mask */
++                return put_user(H2_SUPPORTED_FORMATS, (int *)arg);
++              
++      case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
++              if (get_user(val, (int *)arg))
++                      return -EFAULT;
++              if (val != AFMT_QUERY) {
++                      if (!(val & H2_SUPPORTED_FORMATS))
++                              return -EINVAL;
++                      if (file->f_mode & FMODE_READ) {
++                              hal2_stop_adc(hal2);
++                              hal2->adc.format = val;
++                              hal2_setup_adc(hal2);
++                      }
++                      if (file->f_mode & FMODE_WRITE) {
++                              hal2_stop_dac(hal2);
++                              hal2->dac.format = val;
++                              hal2_setup_dac(hal2);
++                      }
++              } else {
++                      val = -EINVAL;
++                      if (file->f_mode & FMODE_READ)
++                              val = hal2->adc.format;
++                      if (file->f_mode & FMODE_WRITE)
++                              val = hal2->dac.format;
++              }
++              return put_user(val, (int *)arg);
++              
++      case SNDCTL_DSP_POST:
++              return 0;
++
++      case SNDCTL_DSP_GETOSPACE: {
++              unsigned long flags;
++              audio_buf_info info;
++              hal2_buf_t *buf;
++              hal2_codec_t *dac = &hal2->dac;
++              
++              if (!(file->f_mode & FMODE_WRITE))
++                      return -EINVAL;
++              
++              spin_lock_irqsave(&dac->lock, flags);
++              info.fragments = 0;
++              buf = dac->head;
++              while (buf->info.cnt == 0 && buf != dac->tail) {
++                      info.fragments++;
++                      buf = buf->info.next;
++              }
++              spin_unlock_irqrestore(&dac->lock, flags);
++              
++              info.fragstotal = obuffers;
++              info.fragsize = H2_BUFFER_SIZE;
++                info.bytes = info.fragsize * info.fragments;
++
++              return copy_to_user((void *)arg, &info, sizeof(info)) ? -EFAULT : 0;
++      }
++                         
++      case SNDCTL_DSP_GETISPACE: {
++              unsigned long flags;
++              audio_buf_info info;
++              hal2_buf_t *buf;
++              hal2_codec_t *adc = &hal2->adc;
++                      
++              if (!(file->f_mode & FMODE_READ))
++                      return -EINVAL;
++              
++              spin_lock_irqsave(&adc->lock, flags);
++              info.fragments = 0;
++              info.bytes = 0;
++              buf = adc->tail;
++              while (buf->info.cnt > 0 && buf != adc->head) {
++                      info.fragments++;
++                      info.bytes += buf->info.cnt;
++                      buf = buf->info.next;
++              }
++              spin_unlock_irqrestore(&adc->lock, flags);
++
++              info.fragstotal = ibuffers;
++              info.fragsize = H2_BUFFER_SIZE;
++              
++              return copy_to_user((void *)arg, &info, sizeof(info)) ? -EFAULT : 0;
++      }
++
++      case SNDCTL_DSP_NONBLOCK:
++              file->f_flags |= O_NONBLOCK;
++              return 0;
++              
++      case SNDCTL_DSP_GETBLKSIZE:
++              return put_user(H2_BUFFER_SIZE, (int *)arg);
++      
++      case SNDCTL_DSP_SETFRAGMENT:
++              return 0;
++
++      case SOUND_PCM_READ_RATE:
++              val = -EINVAL;
++              if (file->f_mode & FMODE_READ)
++                      val = hal2->adc.sample_rate;
++              if (file->f_mode & FMODE_WRITE)
++                      val = hal2->dac.sample_rate;
++              return put_user(val, (int *)arg);
++
++      case SOUND_PCM_READ_CHANNELS:
++              val = -EINVAL;
++              if (file->f_mode & FMODE_READ)
++                      val = hal2->adc.voices;
++              if (file->f_mode & FMODE_WRITE)
++                      val = hal2->dac.voices;
++              return put_user(val, (int *)arg);
++
++      case SOUND_PCM_READ_BITS:
++              val = 16;
++              return put_user(val, (int *)arg);
++      }
++      
++      return hal2_mixer_ioctl(hal2, cmd, arg);
++}
++
++static ssize_t hal2_read(struct file *file, char *buffer,
++                       size_t count, loff_t *ppos)
++{
++      ssize_t err;
++      hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++      hal2_codec_t *adc = &hal2->adc;
++
++      if (count == 0)
++              return 0;
++      if (ppos != &file->f_pos)
++              return -ESPIPE;
++      
++      down(&adc->sem);
++      
++      if (file->f_flags & O_NONBLOCK) {
++              err = hal2_get_buffer(hal2, buffer, count);
++              err = err == 0 ? -EAGAIN : err;
++      } else {
++              do {
++                      /* ~10% longer */
++                      signed long timeout = 1000 * H2_BUFFER_SIZE *
++                              2 * adc->voices * HZ / adc->sample_rate / 900;
++                      DECLARE_WAITQUEUE(wait, current);
++                      ssize_t cnt = 0;
++                      
++                      err = hal2_get_buffer(hal2, buffer, count);
++                      if (err > 0) {
++                              count -= err;
++                              cnt += err;
++                              buffer += err;
++                              err = cnt;
++                      }
++                      if (count > 0 && err >= 0) {
++                              add_wait_queue(&adc->dma_wait, &wait);
++                              set_current_state(TASK_INTERRUPTIBLE);
++                              /* Well, it is possible, that interrupt already
++                               * arrived. Hmm, shit happens, we have one more
++                               * buffer filled ;) */
++                              if (!schedule_timeout(timeout))
++                                      /* We may get bogus timeout when system
++                                       * is heavily loaded */
++                                      if (!adc->tail->info.cnt) {
++                                              printk("HAL2: timeout...\n");
++                                              hal2_stop_adc(hal2);
++                                              hal2_reset_adc_pointer(hal2);
++                                              err = -EAGAIN;
++                                      }
++                              if (signal_pending(current))
++                                      err = -ERESTARTSYS;
++                              remove_wait_queue(&adc->dma_wait, &wait);
++                      }
++              } while (count > 0 && err >= 0);
++      
++      }
++      
++      up(&adc->sem);
++      
++      return err;
++}
++
++static ssize_t hal2_write(struct file *file, const char *buffer,
++                        size_t count, loff_t *ppos)
++{
++      ssize_t err;
++      char *buf = (char*) buffer;
++      hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++      hal2_codec_t *dac = &hal2->dac;
++
++      if (count == 0)
++              return 0;
++      if (ppos != &file->f_pos)
++              return -ESPIPE;
++
++      down(&dac->sem);
++
++      if (file->f_flags & O_NONBLOCK) {
++              err = hal2_add_buffer(hal2, buf, count);
++              err = err == 0 ? -EAGAIN : err;
++      } else {
++              do {
++                      /* ~10% longer */
++                      signed long timeout = 1000 * H2_BUFFER_SIZE *
++                              2 * dac->voices * HZ / dac->sample_rate / 900;
++                      DECLARE_WAITQUEUE(wait, current);
++                      ssize_t cnt = 0;
++                      
++                      err = hal2_add_buffer(hal2, buf, count);
++                      if (err > 0) {
++                              count -= err;
++                              cnt += err;
++                              buf += err;
++                              err = cnt;
++                      }
++                      if (count > 0 && err >= 0) {
++                              add_wait_queue(&dac->dma_wait, &wait);
++                              set_current_state(TASK_INTERRUPTIBLE);
++                              /* Well, it is possible, that interrupt already
++                               * arrived. Hmm, shit happens, we have one more
++                               * buffer free ;) */
++                              if (!schedule_timeout(timeout))
++                                      /* We may get bogus timeout when system
++                                       * is heavily loaded */
++                                      if (dac->head->info.cnt) {
++                                              printk("HAL2: timeout...\n");
++                                              hal2_stop_dac(hal2);
++                                              hal2_reset_dac_pointer(hal2);
++                                              err = -EAGAIN;
++                                      }
++                              if (signal_pending(current))
++                                      err = -ERESTARTSYS;
++                              remove_wait_queue(&dac->dma_wait, &wait);
++                      }
++              } while (count > 0 && err >= 0);
++      }
++      
++      up(&dac->sem);
++
++      return err;
++}
++
++static unsigned int hal2_poll(struct file *file, struct poll_table_struct *wait)
++{
++      unsigned long flags;
++      unsigned int mask = 0;
++      hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++
++      if (file->f_mode & FMODE_READ) {
++              hal2_codec_t *adc = &hal2->adc;
++              
++              poll_wait(file, &hal2->adc.dma_wait, wait);
++              spin_lock_irqsave(&adc->lock, flags);
++              if (adc->tail->info.cnt > 0)
++                      mask |= POLLIN;
++              spin_unlock_irqrestore(&adc->lock, flags);
++      }
++      
++      if (file->f_mode & FMODE_WRITE) {
++              hal2_codec_t *dac = &hal2->dac;
++              
++              poll_wait(file, &dac->dma_wait, wait);
++              spin_lock_irqsave(&dac->lock, flags);
++              if (dac->head->info.cnt == 0)
++                      mask |= POLLOUT;
++              spin_unlock_irqrestore(&dac->lock, flags);
++      }
++      
++      return mask;
++}
++
++static int hal2_open(struct inode *inode, struct file *file)
++{
++      int err;
++      hal2_card_t *hal2 = hal2_dsp_find_card(MINOR(inode->i_rdev));
++
++      DEBUG("opening audio device.\n");
++
++      if (!hal2) {
++              printk("HAL2: Whee?! Open door and go away!\n");
++              return -ENODEV;
++      }
++      file->private_data = hal2;
++
++      if (file->f_mode & FMODE_READ) {
++              if (hal2->adc.usecount)
++                      return -EBUSY;
++              
++              /* OSS spec wanted us to use 8 bit, 8 kHz mono by default,
++               * but HAL2 can't do 8bit audio */
++              hal2->adc.format = AFMT_S16_BE;
++              hal2->adc.voices = 1;
++              hal2->adc.sample_rate = hal2_compute_rate(&hal2->adc, 8000);
++              hal2_set_adc_rate(hal2);
++
++              /* alloc DMA buffers */
++              err = hal2_alloc_adc_dmabuf(hal2);
++              if (err)
++                      return err;
++              hal2_setup_adc(hal2);
++
++              hal2->adc.usecount++;
++      }
++
++      if (file->f_mode & FMODE_WRITE) {
++              if (hal2->dac.usecount)
++                      return -EBUSY;
++
++              hal2->dac.format = AFMT_S16_BE;
++              hal2->dac.voices = 1;
++              hal2->dac.sample_rate = hal2_compute_rate(&hal2->dac, 8000);
++              hal2_set_dac_rate(hal2);
++
++              /* alloc DMA buffers */
++              err = hal2_alloc_dac_dmabuf(hal2);
++              if (err)
++                      return err;
++              hal2_setup_dac(hal2);
++              
++              hal2->dac.usecount++;
++      }
++      
++      return 0;
++}
++
++static int hal2_release(struct inode *inode, struct file *file)
++{
++      hal2_card_t *hal2 = (hal2_card_t *) file->private_data;
++
++      if (file->f_mode & FMODE_READ) {
++              hal2_stop_adc(hal2);
++              hal2_free_adc_dmabuf(hal2);
++              hal2->adc.usecount--;
++      }
++
++      if (file->f_mode & FMODE_WRITE) {
++              hal2_sync_dac(hal2);
++              hal2_free_dac_dmabuf(hal2);
++              hal2->dac.usecount--;
++      }
++
++      return 0;
++}
++
++static struct file_operations hal2_audio_fops = {
++      owner:          THIS_MODULE,
++      llseek:         no_llseek,
++      read:           hal2_read,
++      write:          hal2_write,
++      poll:           hal2_poll,
++      ioctl:          hal2_ioctl,
++      open:           hal2_open,
++      release:        hal2_release,
++};
++
++static struct file_operations hal2_mixer_fops = {
++      owner:          THIS_MODULE,
++      llseek:         no_llseek,
++      ioctl:          hal2_ioctl_mixdev,
++      open:           hal2_open_mixdev,
++      release:        hal2_release_mixdev,
++};
++
++static int hal2_request_irq(hal2_card_t *hal2, int irq)
++{
++      unsigned long flags;
++      int ret = 0;
++
++      save_and_cli(flags);
++      if (request_irq(irq, hal2_interrupt, SA_SHIRQ, hal2str, hal2)) {
++              printk(KERN_ERR "HAL2: Can't get irq %d\n", irq);
++              ret = -EAGAIN;
++      }
++      restore_flags(flags);
++      return ret;
++}
++
++static int hal2_alloc_resources(hal2_card_t *hal2, struct hpc3_regs *hpc3)
++{
++      hal2_pbus_t *pbus;
++
++      pbus = &hal2->dac.pbus;
++      pbus->pbusnr = 0;
++      pbus->pbus = &hpc3->pbdma[pbus->pbusnr];
++      /* The spec says that we should write 0x08248844 but that's WRONG. HAL2
++       * does 8 bit DMA, not 16 bit even if it generates 16 bit audio. */
++      hpc3->pbus_dmacfgs[pbus->pbusnr][0] = 0x08208844;       /* Magic :-) */
++
++      pbus = &hal2->adc.pbus;
++      pbus->pbusnr = 1;
++      pbus->pbus = &hpc3->pbdma[pbus->pbusnr];
++      hpc3->pbus_dmacfgs[pbus->pbusnr][0] = 0x08208844;       /* Magic :-) */
++
++      return hal2_request_irq(hal2, SGI_HPCDMA_IRQ);
++}
++
++static void hal2_init_codec(hal2_codec_t *codec)
++{
++      init_waitqueue_head(&codec->dma_wait);
++      init_MUTEX(&codec->sem);
++      spin_lock_init(&codec->lock);
++}
++
++static void hal2_free_resources(hal2_card_t *hal2)
++{
++      free_irq(SGI_HPCDMA_IRQ, hal2);
++}
++
++static int hal2_detect(hal2_card_t *hal2)
++{
++      unsigned short board, major, minor;
++      unsigned short rev;
++
++      /* reset HAL2 */
++      hal2_isr_write(hal2, 0);
++
++      /* release reset */
++      hal2_isr_write(hal2, H2_ISR_GLOBAL_RESET_N | H2_ISR_CODEC_RESET_N);
++
++      hal2_i_write16(hal2, H2I_RELAY_C, H2I_RELAY_C_STATE); 
++
++      if ((rev = hal2_rev_look(hal2)) & H2_REV_AUDIO_PRESENT) {
++              DEBUG("HAL2: no device detected, rev: 0x%04hx\n", rev);
++              return -ENODEV;
++      }
++
++      board = (rev & H2_REV_BOARD_M) >> 12;
++      major = (rev & H2_REV_MAJOR_CHIP_M) >> 4;
++      minor = (rev & H2_REV_MINOR_CHIP_M);
++
++      printk("SGI HAL2 Processor revision %i.%i.%i detected\n",
++             board, major, minor);
++
++      if (board != 4 || major != 1 || minor != 0) 
++              printk( "Other revision than 4.1.0 detected. "
++                      "Your card is probably unsupported\n");
++
++      return 0;
++}
++
++static int hal2_init_card(hal2_card_t **phal2, struct hpc3_regs *hpc3,
++                        unsigned long hpc3_base)
++{
++      int ret = 0;
++      hal2_card_t *hal2;
++      
++      hal2 = (hal2_card_t *) kmalloc(sizeof(hal2_card_t), GFP_KERNEL);
++      if (!hal2)
++              return -ENOMEM;
++      memset(hal2, 0, sizeof(hal2_card_t));
++
++      hal2->ctl_regs = (hal2_ctl_regs_t *) KSEG1ADDR(hpc3_base + H2_CTL_PIO);
++      hal2->aes_regs = (hal2_aes_regs_t *) KSEG1ADDR(hpc3_base + H2_AES_PIO);
++      hal2->vol_regs = (hal2_vol_regs_t *) KSEG1ADDR(hpc3_base + H2_VOL_PIO);
++      hal2->syn_regs = (hal2_syn_regs_t *) KSEG1ADDR(hpc3_base + H2_SYN_PIO);
++
++      if (hal2_detect(hal2) < 0) {
++              printk("HAL2 audio processor not found\n");
++              ret = -ENODEV;
++              goto fail1;
++      }
++
++      hal2_init_codec(&hal2->dac);
++      hal2_init_codec(&hal2->adc);
++
++      ret = hal2_alloc_resources(hal2, hpc3);
++      if (ret)
++              goto fail1;
++      
++      hal2_init_mixer(hal2);
++
++      hal2->dev_dsp = register_sound_dsp(&hal2_audio_fops, -1);
++      if (hal2->dev_dsp < 0) {
++              ret = hal2->dev_dsp;
++              goto fail2;
++      }
++
++      hal2->dev_mixer = register_sound_mixer(&hal2_mixer_fops, -1);
++      if (hal2->dev_mixer < 0) {
++              ret = hal2->dev_mixer;
++              goto fail3;
++      }
++      
++      *phal2 = hal2;
++      return 0;
++fail3:
++      unregister_sound_dsp(hal2->dev_dsp);
++fail2:
++      hal2_free_resources(hal2);
++fail1:
++      kfree(hal2);
++      
++      return ret;
++}
++
++/* 
++ * We are assuming only one HAL2 card. If you ever meet machine with more than
++ * one, tell immediately about it to someone. Preferably to me. --ladis
++ */
++static int __init init_hal2(void)
++{
++      int i;
++
++      for (i = 0; i < MAXCARDS; i++)
++              hal2_card[i] = NULL;
++
++      return hal2_init_card(&hal2_card[0], hpc3c0, HPC3_CHIP0_PBASE);
++}
++
++static void __exit exit_hal2(void)
++{
++      int i;
++      
++      for (i = 0; i < MAXCARDS; i++)
++              if (hal2_card[i]) {
++                      hal2_free_resources(hal2_card[i]);
++                      unregister_sound_dsp(hal2_card[i]->dev_dsp);
++                      unregister_sound_mixer(hal2_card[i]->dev_mixer);
++                      kfree(hal2_card[i]);
++      }
++}
++
++module_init(init_hal2);
++module_exit(exit_hal2);
++
++MODULE_DESCRIPTION("OSS compatible driver for SGI HAL2 audio");
++MODULE_AUTHOR("Ladislav Michl");
++MODULE_LICENSE("GPL");
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/sound/oss/hal2.h        2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,328 @@
++#ifndef __HAL2_H
++#define __HAL2_H
++
++/*
++ *  Driver for HAL2 sound processors
++ *  Copyright (c) 1999 Ulf Carlsson <ulfc@bun.falkenberg.se>
++ *  Copyright (c) 2001 Ladislav Michl <ladis@psi.cz>
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License version 2 as 
++ *  published by the Free Software Foundation.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#include <asm/addrspace.h>
++#include <asm/sgi/sgihpc.h>
++#include <linux/spinlock.h>
++#include <linux/types.h>
++
++#define H2_HAL2_BASE          0x58000
++#define H2_CTL_PIO            (H2_HAL2_BASE + 0 * 0x400)
++#define H2_AES_PIO            (H2_HAL2_BASE + 1 * 0x400)
++#define H2_VOL_PIO            (H2_HAL2_BASE + 2 * 0x400)
++#define H2_SYN_PIO            (H2_HAL2_BASE + 3 * 0x400)
++
++/* Indirect status register */
++
++#define H2_ISR_TSTATUS                0x01    /* RO: transaction status 1=busy */
++#define H2_ISR_USTATUS                0x02    /* RO: utime status bit 1=armed */
++#define H2_ISR_QUAD_MODE      0x04    /* codec mode 0=indigo 1=quad */
++#define H2_ISR_GLOBAL_RESET_N 0x08    /* chip global reset 0=reset */
++#define H2_ISR_CODEC_RESET_N  0x10    /* codec/synth reset 0=reset  */
++
++/* Revision register */
++
++#define H2_REV_AUDIO_PRESENT  0x8000  /* RO: audio present 0=present */
++#define H2_REV_BOARD_M                0x7000  /* RO: bits 14:12, board revision */
++#define H2_REV_MAJOR_CHIP_M   0x00F0  /* RO: bits 7:4, major chip revision */
++#define H2_REV_MINOR_CHIP_M   0x000F  /* RO: bits 3:0, minor chip revision */
++
++/* Indirect address register */
++
++/*
++ * Address of indirect internal register to be accessed. A write to this
++ * register initiates read or write access to the indirect registers in the
++ * HAL2. Note that there af four indirect data registers for write access to
++ * registers larger than 16 byte.
++ */
++
++#define H2_IAR_TYPE_M         0xF000  /* bits 15:12, type of functional */
++                                      /* block the register resides in */
++                                      /* 1=DMA Port */
++                                      /* 9=Global DMA Control */
++                                      /* 2=Bresenham */
++                                      /* 3=Unix Timer */
++#define H2_IAR_NUM_M          0x0F00  /* bits 11:8 instance of the */
++                                      /* blockin which the indirect */
++                                      /* register resides */
++                                      /* If IAR_TYPE_M=DMA Port: */
++                                      /* 1=Synth In */
++                                      /* 2=AES In */
++                                      /* 3=AES Out */
++                                      /* 4=DAC Out */
++                                      /* 5=ADC Out */
++                                      /* 6=Synth Control */
++                                      /* If IAR_TYPE_M=Global DMA Control: */
++                                      /* 1=Control */
++                                      /* If IAR_TYPE_M=Bresenham: */
++                                      /* 1=Bresenham Clock Gen 1 */
++                                      /* 2=Bresenham Clock Gen 2 */
++                                      /* 3=Bresenham Clock Gen 3 */
++                                      /* If IAR_TYPE_M=Unix Timer: */
++                                      /* 1=Unix Timer */
++#define H2_IAR_ACCESS_SELECT  0x0080  /* 1=read 0=write */
++#define H2_IAR_PARAM          0x000C  /* Parameter Select */
++#define H2_IAR_RB_INDEX_M     0x0003  /* Read Back Index */
++                                      /* 00:word0 */
++                                      /* 01:word1 */
++                                      /* 10:word2 */
++                                      /* 11:word3 */
++/*
++ * HAL2 internal addressing
++ *
++ * The HAL2 has "indirect registers" (idr) which are accessed by writing to the
++ * Indirect Data registers. Write the address to the Indirect Address register
++ * to transfer the data.
++ *
++ * We define the H2IR_* to the read address and H2IW_* to the write address and
++ * H2I_* to be fields in whatever register is referred to.
++ *
++ * When we write to indirect registers which are larger than one word (16 bit)
++ * we have to fill more than one indirect register before writing. When we read
++ * back however we have to read several times, each time with different Read
++ * Back Indexes (there are defs for doing this easily).
++ */
++
++/*
++ * Relay Control
++ */
++#define H2I_RELAY_C           0x9100
++#define H2I_RELAY_C_STATE     0x01            /* state of RELAY pin signal */
++
++/* DMA port enable */
++
++#define H2I_DMA_PORT_EN               0x9104
++#define H2I_DMA_PORT_EN_SY_IN 0x01            /* Synth_in DMA port */
++#define H2I_DMA_PORT_EN_AESRX 0x02            /* AES receiver DMA port */
++#define H2I_DMA_PORT_EN_AESTX 0x04            /* AES transmitter DMA port */
++#define H2I_DMA_PORT_EN_CODECTX       0x08            /* CODEC transmit DMA port */
++#define H2I_DMA_PORT_EN_CODECR        0x10            /* CODEC receive DMA port */
++
++#define H2I_DMA_END           0x9108          /* global dma endian select */
++#define H2I_DMA_END_SY_IN     0x01            /* Synth_in DMA port */
++#define H2I_DMA_END_AESRX     0x02            /* AES receiver DMA port */
++#define H2I_DMA_END_AESTX     0x04            /* AES transmitter DMA port */
++#define H2I_DMA_END_CODECTX   0x08            /* CODEC transmit DMA port */
++#define H2I_DMA_END_CODECR    0x10            /* CODEC receive DMA port */
++                                              /* 0=b_end 1=l_end */
++
++#define H2I_DMA_DRV           0x910C          /* global PBUS DMA enable */
++
++#define H2I_SYNTH_C           0x1104          /* Synth DMA control */
++
++#define H2I_AESRX_C           0x1204          /* AES RX dma control */
++
++#define H2I_C_TS_EN           0x20            /* Timestamp enable */
++#define H2I_C_TS_FRMT         0x40            /* Timestamp format */
++#define H2I_C_NAUDIO          0x80            /* Sign extend */
++
++/* AESRX CTL, 16 bit */
++
++#define H2I_AESTX_C           0x1304          /* AES TX DMA control */
++#define H2I_AESTX_C_CLKID_SHIFT       3               /* Bresenham Clock Gen 1-3 */
++#define H2I_AESTX_C_CLKID_M   0x18
++#define H2I_AESTX_C_DATAT_SHIFT       8               /* 1=mono 2=stereo (3=quad) */
++#define H2I_AESTX_C_DATAT_M   0x300
++
++/* CODEC registers */
++
++#define H2I_DAC_C1            0x1404          /* DAC DMA control, 16 bit */
++#define H2I_DAC_C2            0x1408          /* DAC DMA control, 32 bit */
++#define H2I_ADC_C1            0x1504          /* ADC DMA control, 16 bit */
++#define H2I_ADC_C2            0x1508          /* ADC DMA control, 32 bit */
++
++/* Bits in CTL1 register */
++
++#define H2I_C1_DMA_SHIFT      0               /* DMA channel */
++#define H2I_C1_DMA_M          0x7
++#define H2I_C1_CLKID_SHIFT    3               /* Bresenham Clock Gen 1-3 */
++#define H2I_C1_CLKID_M                0x18
++#define H2I_C1_DATAT_SHIFT    8               /* 1=mono 2=stereo (3=quad) */
++#define H2I_C1_DATAT_M                0x300
++
++/* Bits in CTL2 register */
++
++#define H2I_C2_R_GAIN_SHIFT   0               /* right a/d input gain */      
++#define H2I_C2_R_GAIN_M               0xf     
++#define H2I_C2_L_GAIN_SHIFT   4               /* left a/d input gain */
++#define H2I_C2_L_GAIN_M               0xf0
++#define H2I_C2_R_SEL          0x100           /* right input select */
++#define H2I_C2_L_SEL          0x200           /* left input select */
++#define H2I_C2_MUTE           0x400           /* mute */
++#define H2I_C2_DO1            0x00010000      /* digital output port bit 0 */
++#define H2I_C2_DO2            0x00020000      /* digital output port bit 1 */
++#define H2I_C2_R_ATT_SHIFT    18              /* right d/a output - */
++#define H2I_C2_R_ATT_M                0x007c0000      /* attenuation */
++#define H2I_C2_L_ATT_SHIFT    23              /* left d/a output - */
++#define H2I_C2_L_ATT_M                0x0f800000      /* attenuation */
++
++#define H2I_SYNTH_MAP_C               0x1104          /* synth dma handshake ctrl */
++
++/* Clock generator CTL 1, 16 bit */
++
++#define H2I_BRES1_C1          0x2104
++#define H2I_BRES2_C1          0x2204
++#define H2I_BRES3_C1          0x2304
++
++#define H2I_BRES_C1_SHIFT     0               /* 0=48.0 1=44.1 2=aes_rx */
++#define H2I_BRES_C1_M         0x03
++                              
++/* Clock generator CTL 2, 32 bit */
++
++#define H2I_BRES1_C2          0x2108
++#define H2I_BRES2_C2          0x2208
++#define H2I_BRES3_C2          0x2308
++
++#define H2I_BRES_C2_INC_SHIFT 0               /* increment value */
++#define H2I_BRES_C2_INC_M     0xffff
++#define H2I_BRES_C2_MOD_SHIFT 16              /* modcontrol value */
++#define H2I_BRES_C2_MOD_M     0xffff0000      /* modctrl=0xffff&(modinc-1) */
++
++/* Unix timer, 64 bit */
++
++#define H2I_UTIME             0x3104
++#define H2I_UTIME_0_LD                0xffff          /* microseconds, LSB's */
++#define H2I_UTIME_1_LD0               0x0f            /* microseconds, MSB's */
++#define H2I_UTIME_1_LD1               0xf0            /* tenths of microseconds */
++#define H2I_UTIME_2_LD                0xffff          /* seconds, LSB's */
++#define H2I_UTIME_3_LD                0xffff          /* seconds, MSB's */
++
++typedef volatile u32 hal2_reg_t;
++
++typedef struct stru_hal2_ctl_regs hal2_ctl_regs_t;
++struct stru_hal2_ctl_regs {
++      hal2_reg_t _unused0[4];
++      hal2_reg_t isr;                 /* 0x10 Status Register */
++      hal2_reg_t _unused1[3];
++      hal2_reg_t rev;                 /* 0x20 Revision Register */
++      hal2_reg_t _unused2[3];
++      hal2_reg_t iar;                 /* 0x30 Indirect Address Register */
++      hal2_reg_t _unused3[3];
++      hal2_reg_t idr0;                /* 0x40 Indirect Data Register 0 */
++      hal2_reg_t _unused4[3];
++      hal2_reg_t idr1;                /* 0x50 Indirect Data Register 1 */
++      hal2_reg_t _unused5[3];
++      hal2_reg_t idr2;                /* 0x60 Indirect Data Register 2 */
++      hal2_reg_t _unused6[3];
++      hal2_reg_t idr3;                /* 0x70 Indirect Data Register 3 */
++};
++
++typedef struct stru_hal2_aes_regs hal2_aes_regs_t;
++struct stru_hal2_aes_regs {
++      hal2_reg_t rx_stat[2];          /* Status registers */
++      hal2_reg_t rx_cr[2];            /* Control registers */
++      hal2_reg_t rx_ud[4];            /* User data window */
++      hal2_reg_t rx_st[24];           /* Channel status data */
++      
++      hal2_reg_t tx_stat[1];          /* Status register */
++      hal2_reg_t tx_cr[3];            /* Control registers */
++      hal2_reg_t tx_ud[4];            /* User data window */
++      hal2_reg_t tx_st[24];           /* Channel status data */
++};
++
++typedef struct stru_hal2_vol_regs hal2_vol_regs_t;
++struct stru_hal2_vol_regs {
++      hal2_reg_t right;               /* 0x00 Right volume */
++      hal2_reg_t left;                /* 0x04 Left volume */
++};
++
++typedef struct stru_hal2_syn_regs hal2_syn_regs_t;
++struct stru_hal2_syn_regs {
++      hal2_reg_t _unused0[2];
++      hal2_reg_t page;                /* DOC Page register */
++      hal2_reg_t regsel;              /* DOC Register selection */
++      hal2_reg_t dlow;                /* DOC Data low */
++      hal2_reg_t dhigh;               /* DOC Data high */
++      hal2_reg_t irq;                 /* IRQ Status */
++      hal2_reg_t dram;                /* DRAM Access */
++};
++
++/* HAL2 specific structures */
++
++typedef struct stru_hal2_pbus hal2_pbus_t;
++struct stru_hal2_pbus {
++      struct hpc3_pbus_dmacregs *pbus;
++      int pbusnr;
++      unsigned int ctrl;              /* Current state of pbus->pbdma_ctrl */
++};
++
++typedef struct stru_hal2_binfo hal2_binfo_t;
++typedef struct stru_hal2_buffer hal2_buf_t;
++struct stru_hal2_binfo {
++      volatile struct hpc_dma_desc desc;
++      hal2_buf_t *next;               /* pointer to next buffer */
++      int cnt;                        /* bytes in buffer */
++};
++#define H2_BUFFER_SIZE        (PAGE_SIZE - \
++              ((sizeof(hal2_binfo_t) - 1) / 8 + 1) * 8)
++struct stru_hal2_buffer {
++      hal2_binfo_t info;
++      char data[H2_BUFFER_SIZE] __attribute__((aligned(8)));
++};
++
++typedef struct stru_hal2_codec hal2_codec_t;
++struct stru_hal2_codec {
++      hal2_buf_t *head;
++      hal2_buf_t *tail; 
++      hal2_pbus_t pbus;
++      unsigned int format;            /* Audio data format */
++      int voices;                     /* mono/stereo */
++      unsigned int sample_rate;
++      unsigned int master;            /* Master frequency */
++      unsigned short mod;             /* MOD value */
++      unsigned short inc;             /* INC value */
++
++      wait_queue_head_t dma_wait;
++      spinlock_t lock;
++      struct semaphore sem;
++
++      int usecount;                   /* recording and playback are 
++                                       * independent */
++};
++
++#define H2_MIX_OUTPUT_ATT     0
++#define H2_MIX_INPUT_GAIN     1
++#define H2_MIXERS             2
++typedef struct stru_hal2_mixer hal2_mixer_t;
++struct stru_hal2_mixer {
++      int modcnt;
++      unsigned int volume[H2_MIXERS];
++};
++
++typedef struct stru_hal2_card hal2_card_t;
++struct stru_hal2_card {
++      int dev_dsp;                    /* audio device */
++      int dev_mixer;                  /* mixer device */
++      int dev_midi;                   /* midi device */
++      
++      hal2_ctl_regs_t *ctl_regs;      /* HAL2 ctl registers */
++      hal2_aes_regs_t *aes_regs;      /* HAL2 vol registers */
++      hal2_vol_regs_t *vol_regs;      /* HAL2 aes registers */
++      hal2_syn_regs_t *syn_regs;      /* HAL2 syn registers */
++
++      hal2_codec_t dac;
++      hal2_codec_t adc;
++      hal2_mixer_t mixer;
++};
++
++#endif                                /* __HAL2_H */
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/sound/oss/harmony.c     2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,1307 @@
++/*
++      drivers/sound/harmony.c 
++
++      This is a sound driver for ASP's and Lasi's Harmony sound chip
++      and is unlikely to be used for anything other than on a HP PA-RISC.
++
++      Harmony is found in HP 712s, 715/new and many other GSC based machines.
++      On older 715 machines you'll find the technically identical chip 
++      called 'Vivace'. Both Harmony and Vicace are supported by this driver.
++
++      Copyright 2000 (c) Linuxcare Canada, Alex deVries <alex@linuxcare.com>
++      Copyright 2000-2002 (c) Helge Deller <deller@gmx.de>
++      Copyright 2001 (c) Matthieu Delahaye <delahaym@esiee.fr>
++      Copyright 2001 (c) Jean-Christophe Vaugeois <vaugeoij@esiee.fr>
++
++                              
++TODO:
++      - fix SNDCTL_DSP_GETOSPACE and SNDCTL_DSP_GETISPACE ioctls to
++              return the real values
++      - add private ioctl for selecting line- or microphone input
++              (only one of them is available at the same time)
++      - add module parameters
++      - implement mmap functionality
++      - implement gain meter ?
++      - ...
++*/
++
++#include <linux/delay.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/ioport.h>
++#include <linux/types.h>
++#include <linux/mm.h>
++#include <linux/pci.h>
++
++#include <asm/gsc.h>
++#include <asm/io.h>
++#include <asm/pgalloc.h>
++
++#include "sound_config.h"
++
++
++#define PFX "harmony: "
++#define HARMONY_VERSION "V0.9a"
++
++#undef DEBUG
++#ifdef DEBUG
++# define DPRINTK printk 
++#else
++# define DPRINTK(x,...)
++#endif
++
++
++#define MAX_BUFS 10           /* maximum number of rotating buffers */
++#define HARMONY_BUF_SIZE 4096 /* needs to be a multiple of PAGE_SIZE (4096)! */
++
++#define CNTL_C                0x80000000
++#define       CNTL_ST         0x00000020
++#define CNTL_44100    0x00000015      /* HARMONY_SR_44KHZ */
++#define CNTL_8000     0x00000008      /* HARMONY_SR_8KHZ */
++
++#define GAINCTL_HE    0x08000000
++#define GAINCTL_LE    0x04000000
++#define GAINCTL_SE    0x02000000
++
++#define DSTATUS_PN    0x00000200
++#define DSTATUS_RN    0x00000002
++
++#define DSTATUS_IE    0x80000000
++
++#define HARMONY_DF_16BIT_LINEAR       0
++#define HARMONY_DF_8BIT_ULAW  1
++#define HARMONY_DF_8BIT_ALAW  2
++
++#define HARMONY_SS_MONO               0
++#define HARMONY_SS_STEREO     1
++
++#define HARMONY_SR_8KHZ               0x08
++#define HARMONY_SR_16KHZ      0x09
++#define HARMONY_SR_27KHZ      0x0A
++#define HARMONY_SR_32KHZ      0x0B
++#define HARMONY_SR_48KHZ      0x0E
++#define HARMONY_SR_9KHZ               0x0F
++#define HARMONY_SR_5KHZ               0x10
++#define HARMONY_SR_11KHZ      0x11
++#define HARMONY_SR_18KHZ      0x12
++#define HARMONY_SR_22KHZ      0x13
++#define HARMONY_SR_37KHZ      0x14
++#define HARMONY_SR_44KHZ      0x15
++#define HARMONY_SR_33KHZ      0x16
++#define HARMONY_SR_6KHZ               0x17
++
++/*
++ * Some magics numbers used to auto-detect file formats
++ */
++
++#define HARMONY_MAGIC_8B_ULAW 1
++#define HARMONY_MAGIC_8B_ALAW 27
++#define HARMONY_MAGIC_16B_LINEAR 3
++#define HARMONY_MAGIC_MONO    1
++#define HARMONY_MAGIC_STEREO  2
++
++/*
++ * Channels Positions in mixer register
++ */
++
++#define GAIN_HE_SHIFT   27
++#define GAIN_HE_MASK    ( 1 << GAIN_HE_SHIFT) 
++#define GAIN_LE_SHIFT   26
++#define GAIN_LE_MASK    ( 1 << GAIN_LE_SHIFT) 
++#define GAIN_SE_SHIFT   25
++#define GAIN_SE_MASK    ( 1 << GAIN_SE_SHIFT) 
++#define GAIN_IS_SHIFT   24
++#define GAIN_IS_MASK    ( 1 << GAIN_IS_SHIFT) 
++#define GAIN_MA_SHIFT   20
++#define GAIN_MA_MASK    ( 0x0f << GAIN_MA_SHIFT) 
++#define GAIN_LI_SHIFT   16
++#define GAIN_LI_MASK    ( 0x0f << GAIN_LI_SHIFT) 
++#define GAIN_RI_SHIFT   12
++#define GAIN_RI_MASK    ( 0x0f << GAIN_RI_SHIFT) 
++#define GAIN_LO_SHIFT   6
++#define GAIN_LO_MASK    ( 0x3f << GAIN_LO_SHIFT) 
++#define GAIN_RO_SHIFT   0
++#define GAIN_RO_MASK    ( 0x3f << GAIN_RO_SHIFT) 
++
++
++#define MAX_OUTPUT_LEVEL (GAIN_RO_MASK >> GAIN_RO_SHIFT)
++#define MAX_INPUT_LEVEL  (GAIN_RI_MASK >> GAIN_RI_SHIFT)
++#define MAX_VOLUME_LEVEL (GAIN_MA_MASK >> GAIN_MA_SHIFT)
++
++/*
++ * Channels Mask in mixer register
++ */
++
++#define GAIN_TOTAL_SILENCE 0x00F00FFF
++#define GAIN_DEFAULT       0x0FF00000
++
++
++struct harmony_hpa {
++      u8      unused000;
++      u8      id;
++      u8      teleshare_id;
++      u8      unused003;
++      u32     reset;
++      u32     cntl;
++      u32     gainctl;
++      u32     pnxtadd;
++      u32     pcuradd;
++      u32     rnxtadd;
++      u32     rcuradd;
++      u32     dstatus;
++      u32     ov;
++      u32     pio;
++      u32     unused02c;
++      u32     unused030[3];
++      u32     diag;
++};
++
++struct harmony_dev {
++      int irq;
++      struct harmony_hpa *hpa;
++      u32 current_gain;
++      u8 data_format;         /* HARMONY_DF_xx_BIT_xxx */
++      u8 sample_rate;         /* HARMONY_SR_xx_KHZ */
++      u8 stereo_select;       /* HARMONY_SS_MONO or HARMONY_SS_STEREO */
++      int format_initialized;
++      u32 dac_rate;           /* 8000 ... 48000 (Hz) */
++      int suspended_playing;
++      int suspended_recording;
++      
++      int blocked_playing;
++      int blocked_recording;
++      
++      wait_queue_head_t wq_play, wq_record;
++      int first_filled_play;  /* first buffer containing data (next to play) */
++      int nb_filled_play; 
++      int play_offset;
++      int first_filled_record;
++      int nb_filled_record;
++              
++      int audio_open, mixer_open;
++      int dsp_unit, mixer_unit;
++
++      struct pci_dev *fake_pci_dev; /* The fake pci_dev needed for 
++                                      pci_* functions under ccio. */
++};
++
++
++static struct harmony_dev harmony;
++
++
++/*
++ * Dynamic sound buffer allocation and DMA memory
++ */
++
++struct harmony_buffer {
++      unsigned char *addr;
++      dma_addr_t dma_handle;
++      int dma_consistent;     /* Zero if pci_alloc_consistent() fails */
++      int len;
++};
++
++/*
++ * Harmony memory buffers
++ */
++
++static struct harmony_buffer played_buf, recorded_buf, silent, graveyard;
++
++
++#define CHECK_WBACK_INV_OFFSET(b,offset,len) \
++        do { if (!b.dma_consistent) \
++              dma_cache_wback_inv((unsigned long)b.addr+offset,len); \
++      } while (0) 
++
++      
++static int __init harmony_alloc_buffer(struct harmony_buffer *b, 
++              int buffer_count)
++{
++      b->len = buffer_count * HARMONY_BUF_SIZE;
++      b->addr = pci_alloc_consistent(harmony.fake_pci_dev, 
++                        b->len, &b->dma_handle);
++      if (b->addr && b->dma_handle) {
++              b->dma_consistent = 1;
++              DPRINTK(KERN_INFO PFX "consistent memory: 0x%lx, played_buf: 0x%lx\n",
++                              (unsigned long)b->dma_handle, (unsigned long)b->addr);
++      } else {
++              b->dma_consistent = 0;
++              /* kmalloc()ed memory will HPMC on ccio machines ! */
++              b->addr = kmalloc(b->len, GFP_KERNEL);
++              if (!b->addr) {
++                      printk(KERN_ERR PFX "couldn't allocate memory\n");
++                      return -EBUSY;
++              }
++              b->dma_handle = __pa(b->addr);
++      }
++      return 0;
++}
++
++static void __exit harmony_free_buffer(struct harmony_buffer *b)
++{
++      if (!b->addr)
++              return;
++
++      if (b->dma_consistent)
++              pci_free_consistent(harmony.fake_pci_dev,
++                              b->len, b->addr, b->dma_handle);
++      else
++              kfree(b->addr);
++
++      memset(b, 0, sizeof(*b));
++}
++
++
++
++/*
++ * Low-Level sound-chip programming
++ */
++
++static void __inline__ harmony_wait_CNTL(void)
++{
++      /* Wait until we're out of control mode */
++      while (gsc_readl(&harmony.hpa->cntl) & CNTL_C)
++              /* wait */ ;
++}
++
++
++static void harmony_update_control(void) 
++{
++      u32 default_cntl;
++      
++      /* Set CNTL */
++      default_cntl = (CNTL_C |                /* The C bit */
++              (harmony.data_format << 6) |    /* Set the data format */
++              (harmony.stereo_select << 5) |  /* Stereo select */
++              (harmony.sample_rate));         /* Set sample rate */
++      harmony.format_initialized = 1;
++      
++      /* initialize CNTL */
++      gsc_writel(default_cntl, &harmony.hpa->cntl);
++}
++
++static void harmony_set_control(u8 data_format, u8 sample_rate, u8 stereo_select) 
++{
++      harmony.sample_rate = sample_rate;
++      harmony.data_format = data_format;
++      harmony.stereo_select = stereo_select;
++      harmony_update_control();
++}
++
++static void harmony_set_rate(u8 data_rate) 
++{
++      harmony.sample_rate = data_rate;
++      harmony_update_control();
++}
++
++static int harmony_detect_rate(int *freq)
++{
++      int newrate;
++      switch (*freq) {
++      case 8000:      newrate = HARMONY_SR_8KHZ;      break;
++      case 16000:     newrate = HARMONY_SR_16KHZ;     break; 
++      case 27428:     newrate = HARMONY_SR_27KHZ;     break; 
++      case 32000:     newrate = HARMONY_SR_32KHZ;     break; 
++      case 48000:     newrate = HARMONY_SR_48KHZ;     break; 
++      case 9600:      newrate = HARMONY_SR_9KHZ;      break; 
++      case 5125:      newrate = HARMONY_SR_5KHZ;      break; 
++      case 11025:     newrate = HARMONY_SR_11KHZ;     break; 
++      case 18900:     newrate = HARMONY_SR_18KHZ;     break; 
++      case 22050:     newrate = HARMONY_SR_22KHZ;     break; 
++      case 37800:     newrate = HARMONY_SR_37KHZ;     break; 
++      case 44100:     newrate = HARMONY_SR_44KHZ;     break; 
++      case 33075:     newrate = HARMONY_SR_33KHZ;     break; 
++      case 6615:      newrate = HARMONY_SR_6KHZ;      break; 
++      default:        newrate = HARMONY_SR_8KHZ; 
++                      *freq = 8000;                   break;
++      }
++      return newrate;
++}
++
++static void harmony_set_format(u8 data_format) 
++{
++      harmony.data_format = data_format;
++      harmony_update_control();
++}
++
++static void harmony_set_stereo(u8 stereo_select) 
++{
++      harmony.stereo_select = stereo_select;
++      harmony_update_control();
++}
++
++static void harmony_disable_interrupts(void) 
++{
++      harmony_wait_CNTL();
++      gsc_writel(0, &harmony.hpa->dstatus); 
++}
++
++static void harmony_enable_interrupts(void) 
++{
++      harmony_wait_CNTL();
++      gsc_writel(DSTATUS_IE, &harmony.hpa->dstatus); 
++}
++
++/*
++ * harmony_silence()
++ *
++ * This subroutine fills in a buffer starting at location start and
++ * silences for length bytes.  This references the current
++ * configuration of the audio format.
++ *
++ */
++
++static void harmony_silence(struct harmony_buffer *buffer, int start, int length) 
++{
++      u8 silence_char;
++
++      /* Despite what you hear, silence is different in
++         different audio formats.  */
++      switch (harmony.data_format) {
++              case HARMONY_DF_8BIT_ULAW:      silence_char = 0x55; break;
++              case HARMONY_DF_8BIT_ALAW:      silence_char = 0xff; break;
++              case HARMONY_DF_16BIT_LINEAR:   /* fall through */
++              default:                        silence_char = 0;
++      }
++
++      memset(buffer->addr+start, silence_char, length);
++}
++
++
++static int harmony_audio_open(struct inode *inode, struct file *file)
++{
++      if (harmony.audio_open) 
++              return -EBUSY;
++      
++      harmony.audio_open++;
++      harmony.suspended_playing = harmony.suspended_recording = 1;
++      harmony.blocked_playing   = harmony.blocked_recording   = 0;
++      harmony.first_filled_play = harmony.first_filled_record = 0;
++      harmony.nb_filled_play    = harmony.nb_filled_record    = 0;
++      harmony.play_offset = 0;
++      init_waitqueue_head(&harmony.wq_play);
++      init_waitqueue_head(&harmony.wq_record);
++      
++      /* Start off in a balanced mode. */
++      harmony_set_control(HARMONY_DF_8BIT_ULAW, HARMONY_SR_8KHZ, HARMONY_SS_MONO);
++      harmony_update_control();
++      harmony.format_initialized = 0;
++
++      /* Clear out all the buffers and flush to cache */
++      harmony_silence(&played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
++      CHECK_WBACK_INV_OFFSET(played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
++      
++      return 0;
++}
++
++/*
++ * Release (close) the audio device.
++ */
++
++static int harmony_audio_release(struct inode *inode, struct file *file)
++{
++      if (!harmony.audio_open) 
++              return -EBUSY;
++      
++      harmony.audio_open--;
++
++      return 0;
++}
++
++/*
++ * Read recorded data off the audio device.
++ */
++
++static ssize_t harmony_audio_read(struct file *file,
++                                char *buffer,
++                                size_t size_count,
++                                loff_t *ppos)
++{
++      int total_count = (int) size_count;
++      int count = 0;
++      int buf_to_read;
++
++      while (count<total_count) {
++              /* Wait until we're out of control mode */
++              harmony_wait_CNTL();
++              
++              /* Figure out which buffer to fill in */
++              if (harmony.nb_filled_record <= 2) {
++                      harmony.blocked_recording = 1;
++                      if (harmony.suspended_recording) {
++                              harmony.suspended_recording = 0;
++                              harmony_enable_interrupts();
++                      }
++                                                      
++                      interruptible_sleep_on(&harmony.wq_record);
++                      harmony.blocked_recording = 0;
++              }
++              
++              if (harmony.nb_filled_record < 2)
++                      return -EBUSY;
++              
++              buf_to_read = harmony.first_filled_record;
++
++              /* Copy the page to an aligned buffer */
++              if (copy_to_user(buffer+count, recorded_buf.addr +
++                               (HARMONY_BUF_SIZE*buf_to_read),
++                               HARMONY_BUF_SIZE)) {
++                      count = -EFAULT;
++                      break;
++              }
++              
++              harmony.nb_filled_record--;
++              harmony.first_filled_record++;
++              harmony.first_filled_record %= MAX_BUFS;
++                              
++              count += HARMONY_BUF_SIZE;
++      }
++      return count;
++}
++
++
++
++
++/*
++ * Here is the place where we try to recognize file format.
++ * Sun/NeXT .au files begin with the string .snd
++ * At offset 12 is specified the encoding.
++ * At offset 16 is specified speed rate
++ * At Offset 20 is specified the numbers of voices
++ */
++
++#define four_bytes_to_u32(start) (file_header[start] << 24)|\
++                                  (file_header[start+1] << 16)|\
++                                  (file_header[start+2] << 8)|\
++                                  (file_header[start+3]);
++
++#define test_rate(tested,real_value,harmony_value) if ((tested)<=(real_value))\
++                                                    
++
++static int harmony_format_auto_detect(const char *buffer, int block_size)
++{
++      u8 file_header[24];
++      u32 start_string;
++      int ret = 0;
++      
++      if (block_size>24) {
++              if (copy_from_user(file_header, buffer, sizeof(file_header)))
++                      ret = -EFAULT;
++                      
++              start_string = four_bytes_to_u32(0);
++              
++              if ((file_header[4]==0) && (start_string==0x2E736E64)) {
++                      u32 format;
++                      u32 nb_voices;
++                      u32 speed;
++                      
++                      format = four_bytes_to_u32(12);
++                      nb_voices = four_bytes_to_u32(20);
++                      speed = four_bytes_to_u32(16);
++                      
++                      switch (format) {
++                      case HARMONY_MAGIC_8B_ULAW:
++                              harmony.data_format = HARMONY_DF_8BIT_ULAW;
++                              break;
++                      case HARMONY_MAGIC_8B_ALAW:
++                              harmony.data_format = HARMONY_DF_8BIT_ALAW;
++                              break;
++                      case HARMONY_MAGIC_16B_LINEAR:
++                              harmony.data_format = HARMONY_DF_16BIT_LINEAR;
++                              break;
++                      default:
++                              harmony_set_control(HARMONY_DF_16BIT_LINEAR,
++                                              HARMONY_SR_44KHZ, HARMONY_SS_STEREO);
++                              goto out;
++                      }
++                      switch (nb_voices) {
++                      case HARMONY_MAGIC_MONO:
++                              harmony.stereo_select = HARMONY_SS_MONO;
++                              break;
++                      case HARMONY_MAGIC_STEREO:
++                              harmony.stereo_select = HARMONY_SS_STEREO;
++                              break;
++                      default:
++                              harmony.stereo_select = HARMONY_SS_MONO;
++                              break;
++                      }
++                      harmony_set_rate(harmony_detect_rate(&speed));
++                      harmony.dac_rate = speed;
++                      goto out;
++              }
++      }
++      harmony_set_control(HARMONY_DF_8BIT_ULAW, HARMONY_SR_8KHZ, HARMONY_SS_MONO);
++out:
++      return ret;
++}
++#undef four_bytes_to_u32
++
++
++static ssize_t harmony_audio_write(struct file *file,
++                                 const char *buffer,
++                                 size_t size_count,
++                                 loff_t *ppos)
++{
++      int total_count = (int) size_count;
++      int count = 0;
++      int frame_size;
++      int buf_to_fill;
++
++      if (!harmony.format_initialized) {
++              if (harmony_format_auto_detect(buffer, total_count))
++                      return -EFAULT;
++      }
++      
++      while (count<total_count) {
++              /* Wait until we're out of control mode */
++              harmony_wait_CNTL();
++
++              /* Figure out which buffer to fill in */
++              if (harmony.nb_filled_play+2 >= MAX_BUFS && !harmony.play_offset) {
++                      harmony.blocked_playing = 1;
++                      interruptible_sleep_on(&harmony.wq_play);
++                      harmony.blocked_playing = 0;
++              }
++              if (harmony.nb_filled_play+2 >= MAX_BUFS && !harmony.play_offset)
++                      return -EBUSY;
++              
++              
++              buf_to_fill = (harmony.first_filled_play+harmony.nb_filled_play); 
++              if (harmony.play_offset)
++                      buf_to_fill--;
++              buf_to_fill %= MAX_BUFS;
++
++              /* Figure out the size of the frame */
++              if ((total_count-count) > HARMONY_BUF_SIZE - harmony.play_offset) {
++                      frame_size = HARMONY_BUF_SIZE - harmony.play_offset;
++              } else {
++                      frame_size = total_count - count;
++                      /* Clear out the buffer, since there we'll only be 
++                         overlaying part of the old buffer with the new one */
++                      harmony_silence(&played_buf, 
++                              HARMONY_BUF_SIZE*buf_to_fill+frame_size+harmony.play_offset,
++                              HARMONY_BUF_SIZE-frame_size-harmony.play_offset);
++              }
++
++              /* Copy the page to an aligned buffer */
++              if (copy_from_user(played_buf.addr +(HARMONY_BUF_SIZE*buf_to_fill) + harmony.play_offset, 
++                                 buffer+count, frame_size))
++                      return -EFAULT;
++              CHECK_WBACK_INV_OFFSET(played_buf, (HARMONY_BUF_SIZE*buf_to_fill + harmony.play_offset), 
++                              frame_size);
++      
++              if (!harmony.play_offset)
++                      harmony.nb_filled_play++;
++              
++              count += frame_size;
++              harmony.play_offset += frame_size;
++              harmony.play_offset %= HARMONY_BUF_SIZE;
++              if (harmony.suspended_playing && (harmony.nb_filled_play>=4))
++                      harmony_enable_interrupts();
++      }
++      
++      return count;
++}
++
++static unsigned int harmony_audio_poll(struct file *file,
++                                     struct poll_table_struct *wait)
++{
++      unsigned int mask = 0;
++      
++      if (file->f_mode & FMODE_READ) {
++              if (!harmony.suspended_recording)
++                      poll_wait(file, &harmony.wq_record, wait);
++              if (harmony.nb_filled_record)
++                      mask |= POLLIN | POLLRDNORM;
++      }
++
++      if (file->f_mode & FMODE_WRITE) {
++              if (!harmony.suspended_playing)
++                      poll_wait(file, &harmony.wq_play, wait);
++              if (harmony.nb_filled_play)
++                      mask |= POLLOUT | POLLWRNORM;
++      }
++
++      return mask;
++}
++
++static int harmony_audio_ioctl(struct inode *inode,
++                                struct file *file,
++                              unsigned int cmd,
++                                unsigned long arg)
++{
++      int ival, new_format;
++      int frag_size, frag_buf;
++      struct audio_buf_info info;
++      
++      switch (cmd) {
++      case OSS_GETVERSION:
++              return put_user(SOUND_VERSION, (int *) arg);
++
++      case SNDCTL_DSP_GETCAPS:
++              ival = DSP_CAP_DUPLEX;
++              return put_user(ival, (int *) arg);
++
++      case SNDCTL_DSP_GETFMTS:
++              ival = (AFMT_S16_BE | AFMT_MU_LAW | AFMT_A_LAW ); 
++              return put_user(ival, (int *) arg);
++      
++      case SNDCTL_DSP_SETFMT:
++              if (get_user(ival, (int *) arg)) 
++                      return -EFAULT;
++              if (ival != AFMT_QUERY) {
++                      switch (ival) {
++                      case AFMT_MU_LAW:       new_format = HARMONY_DF_8BIT_ULAW; break;
++                      case AFMT_A_LAW:        new_format = HARMONY_DF_8BIT_ALAW; break;
++                      case AFMT_S16_LE:       /* fall through, but not really supported */
++                      case AFMT_S16_BE:       new_format = HARMONY_DF_16BIT_LINEAR;
++                                              ival = AFMT_S16_BE;
++                                              break; 
++                      default: {
++                              DPRINTK(KERN_WARNING PFX 
++                                      "unsupported sound format 0x%04x requested.\n",
++                                      ival);
++                              return -EINVAL;
++                      }
++                      }
++                      harmony_set_format(new_format);
++              } else {
++                      switch (harmony.data_format) {
++                      case HARMONY_DF_8BIT_ULAW:      ival = AFMT_MU_LAW; break;
++                      case HARMONY_DF_8BIT_ALAW:      ival = AFMT_A_LAW;  break;
++                      case HARMONY_DF_16BIT_LINEAR:   ival = AFMT_U16_BE; break;
++                      default: ival = 0;
++                      }
++              }
++              return put_user(ival, (int *) arg);
++
++      case SOUND_PCM_READ_RATE:
++              ival = harmony.dac_rate;
++              return put_user(ival, (int *) arg);
++
++      case SNDCTL_DSP_SPEED:
++              if (get_user(ival, (int *) arg))
++                      return -EFAULT;
++              harmony_set_rate(harmony_detect_rate(&ival));
++              harmony.dac_rate = ival;
++              return put_user(ival, (int*) arg);
++
++      case SNDCTL_DSP_STEREO:
++              if (get_user(ival, (int *) arg))
++                      return -EFAULT;
++              if (ival != 0 && ival != 1)
++                      return -EINVAL;
++              harmony_set_stereo(ival);
++              return put_user(ival, (int *) arg);
++
++      case SNDCTL_DSP_GETBLKSIZE:
++              ival = HARMONY_BUF_SIZE;
++              return put_user(ival, (int *) arg);
++              
++        case SNDCTL_DSP_NONBLOCK:
++                file->f_flags |= O_NONBLOCK;
++                return 0;
++
++        case SNDCTL_DSP_RESET:
++              if (!harmony.suspended_recording) {
++                      /* TODO: stop_recording() */
++              }
++              return 0;
++
++      case SNDCTL_DSP_SETFRAGMENT:
++              if (get_user(ival, (int *)arg))
++                      return -EFAULT;
++              frag_size = ival & 0xffff;
++              frag_buf = (ival>>16) & 0xffff;
++              /* TODO: We use hardcoded fragment sizes and numbers for now */
++              frag_size = 12;  /* 4096 == 2^12 */
++              frag_buf  = MAX_BUFS;
++              ival = (frag_buf << 16) + frag_size;
++              return put_user(ival, (int *) arg);
++              
++      case SNDCTL_DSP_GETOSPACE:
++              if (!(file->f_mode & FMODE_WRITE))
++                      return -EINVAL;
++              info.fragstotal = MAX_BUFS;
++                info.fragments = MAX_BUFS - harmony.nb_filled_play;
++              info.fragsize = HARMONY_BUF_SIZE;
++                info.bytes = info.fragments * info.fragsize;
++              return copy_to_user((void *)arg, &info, sizeof(info));
++
++      case SNDCTL_DSP_GETISPACE:
++              if (!(file->f_mode & FMODE_READ))
++                      return -EINVAL;
++              info.fragstotal = MAX_BUFS;
++                info.fragments = /*MAX_BUFS-*/ harmony.nb_filled_record;
++              info.fragsize = HARMONY_BUF_SIZE;
++                info.bytes = info.fragments * info.fragsize;
++              return copy_to_user((void *)arg, &info, sizeof(info));
++      
++      case SNDCTL_DSP_SYNC:
++              return 0;
++      }
++      
++      return -EINVAL;
++}
++
++
++/*
++ * harmony_interrupt()
++ *
++ * harmony interruption service routine
++ * 
++ */
++
++static irqreturn_t harmony_interrupt(int irq, void *dev, struct pt_regs *regs)
++{
++      u32 dstatus;
++      struct harmony_hpa *hpa;
++
++      /* Setup the hpa */
++      hpa = ((struct harmony_dev *)dev)->hpa;
++      harmony_wait_CNTL();
++
++      /* Read dstatus and pcuradd (the current address) */
++      dstatus = gsc_readl(&hpa->dstatus);
++      
++      /* Turn off interrupts */
++      harmony_disable_interrupts();
++      
++      /* Check if this is a request to get the next play buffer */
++      if (dstatus & DSTATUS_PN) {
++              if (!harmony.nb_filled_play) {
++                      harmony.suspended_playing = 1;
++                      gsc_writel((unsigned long)silent.dma_handle, &hpa->pnxtadd);
++                                              
++                      if (!harmony.suspended_recording)
++                              harmony_enable_interrupts();
++              } else {
++                      harmony.suspended_playing = 0;
++                      gsc_writel((unsigned long)played_buf.dma_handle + 
++                                      (HARMONY_BUF_SIZE*harmony.first_filled_play),
++                                      &hpa->pnxtadd);
++                      harmony.first_filled_play++;
++                      harmony.first_filled_play %= MAX_BUFS;
++                      harmony.nb_filled_play--;
++                      
++                      harmony_enable_interrupts();
++              }
++              
++              if (harmony.blocked_playing)
++                      wake_up_interruptible(&harmony.wq_play);
++      }
++      
++      /* Check if we're being asked to fill in a recording buffer */
++      if (dstatus & DSTATUS_RN) {
++              if((harmony.nb_filled_record+2>=MAX_BUFS) || harmony.suspended_recording)
++              {
++                      harmony.nb_filled_record = 0;
++                      harmony.first_filled_record = 0;
++                      harmony.suspended_recording = 1;
++                      gsc_writel((unsigned long)graveyard.dma_handle, &hpa->rnxtadd);
++                      if (!harmony.suspended_playing)
++                              harmony_enable_interrupts();
++              } else {
++                      int buf_to_fill;
++                      buf_to_fill = (harmony.first_filled_record+harmony.nb_filled_record) % MAX_BUFS;
++                      CHECK_WBACK_INV_OFFSET(recorded_buf, HARMONY_BUF_SIZE*buf_to_fill, HARMONY_BUF_SIZE);
++                      gsc_writel((unsigned long)recorded_buf.dma_handle +
++                                      HARMONY_BUF_SIZE*buf_to_fill,
++                                      &hpa->rnxtadd);
++                      harmony.nb_filled_record++;
++                      harmony_enable_interrupts();
++              }
++
++              if (harmony.blocked_recording && harmony.nb_filled_record>3)
++                      wake_up_interruptible(&harmony.wq_record);
++      }
++      return IRQ_HANDLED;
++}
++
++/*
++ * Sound playing functions
++ */
++
++static struct file_operations harmony_audio_fops = {
++      owner:  THIS_MODULE,
++      llseek: no_llseek,
++      read:   harmony_audio_read,
++      write:  harmony_audio_write,
++      poll:   harmony_audio_poll,
++      ioctl:  harmony_audio_ioctl,
++      open:   harmony_audio_open,
++      release:harmony_audio_release,
++};
++
++static int harmony_audio_init(void)
++{
++      /* Request that IRQ */
++      if (request_irq(harmony.irq, harmony_interrupt, 0 ,"harmony", &harmony)) {
++              printk(KERN_ERR PFX "Error requesting irq %d.\n", harmony.irq);
++              return -EFAULT;
++      }
++
++      harmony.dsp_unit = register_sound_dsp(&harmony_audio_fops, -1);
++      if (harmony.dsp_unit < 0) {
++              printk(KERN_ERR PFX "Error registering dsp\n");
++              free_irq(harmony.irq, &harmony);
++              return -EFAULT;
++      }
++      
++      /* Clear the buffers so you don't end up with crap in the buffers. */ 
++      harmony_silence(&played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
++
++      /* Make sure this makes it to cache */
++      CHECK_WBACK_INV_OFFSET(played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
++
++      /* Clear out the silent buffer and flush to cache */
++      harmony_silence(&silent, 0, HARMONY_BUF_SIZE);
++      CHECK_WBACK_INV_OFFSET(silent, 0, HARMONY_BUF_SIZE);
++      
++      harmony.audio_open = 0;
++      
++      return 0;
++}
++
++
++/*
++ * mixer functions 
++ */
++
++static void harmony_mixer_set_gain(void)
++{
++      harmony_wait_CNTL();
++      gsc_writel(harmony.current_gain, &harmony.hpa->gainctl);
++}
++
++/* 
++ *  Read gain of selected channel.
++ *  The OSS rate is from 0 (silent) to 100 -> need some conversions
++ *
++ *  The harmony gain are attenuation for output and monitor gain.
++ *                   is amplifaction for input gain
++ */
++#define to_harmony_level(level,max) ((level)*max/100)
++#define to_oss_level(level,max) ((level)*100/max)
++
++static int harmony_mixer_get_level(int channel)
++{
++      int left_level;
++      int right_level;
++
++      switch (channel) {
++              case SOUND_MIXER_OGAIN:
++                      left_level  = (harmony.current_gain & GAIN_LO_MASK) >> GAIN_LO_SHIFT;
++                      right_level = (harmony.current_gain & GAIN_RO_MASK) >> GAIN_RO_SHIFT;
++                      left_level  = to_oss_level(MAX_OUTPUT_LEVEL - left_level, MAX_OUTPUT_LEVEL);
++                      right_level = to_oss_level(MAX_OUTPUT_LEVEL - right_level, MAX_OUTPUT_LEVEL);
++                      return (right_level << 8)+left_level;
++                      
++              case SOUND_MIXER_IGAIN:
++                      left_level = (harmony.current_gain & GAIN_LI_MASK) >> GAIN_LI_SHIFT;
++                      right_level= (harmony.current_gain & GAIN_RI_MASK) >> GAIN_RI_SHIFT;
++                      left_level = to_oss_level(left_level, MAX_INPUT_LEVEL);
++                      right_level= to_oss_level(right_level, MAX_INPUT_LEVEL);
++                      return (right_level << 8)+left_level;
++                      
++              case SOUND_MIXER_VOLUME:
++                      left_level = (harmony.current_gain & GAIN_MA_MASK) >> GAIN_MA_SHIFT;
++                      left_level = to_oss_level(MAX_VOLUME_LEVEL-left_level, MAX_VOLUME_LEVEL);
++                      return left_level;
++      }
++      return -EINVAL;
++}
++
++
++
++/*
++ * Some conversions for the same reasons.
++ * We give back the new real value(s) due to
++ * the rescale.
++ */
++
++static int harmony_mixer_set_level(int channel, int value)
++{
++      int left_level;
++      int right_level;
++      int new_left_level;
++      int new_right_level;
++
++      right_level = (value & 0x0000ff00) >> 8;
++      left_level = value & 0x000000ff;
++  
++      switch (channel) {
++              case SOUND_MIXER_OGAIN:
++                      right_level = to_harmony_level(100-right_level, MAX_OUTPUT_LEVEL);
++                      left_level  = to_harmony_level(100-left_level, MAX_OUTPUT_LEVEL);
++                      new_right_level = to_oss_level(MAX_OUTPUT_LEVEL - right_level, MAX_OUTPUT_LEVEL);
++                      new_left_level  = to_oss_level(MAX_OUTPUT_LEVEL - left_level, MAX_OUTPUT_LEVEL);
++                      harmony.current_gain = (harmony.current_gain & ~(GAIN_LO_MASK | GAIN_RO_MASK)) 
++                                      | (left_level << GAIN_LO_SHIFT) | (right_level << GAIN_RO_SHIFT);
++                      harmony_mixer_set_gain();
++                      return (new_right_level << 8) + new_left_level;
++                      
++              case SOUND_MIXER_IGAIN:
++                      right_level = to_harmony_level(right_level, MAX_INPUT_LEVEL);
++                      left_level  = to_harmony_level(left_level, MAX_INPUT_LEVEL);
++                      new_right_level = to_oss_level(right_level, MAX_INPUT_LEVEL);
++                      new_left_level  = to_oss_level(left_level, MAX_INPUT_LEVEL);
++                      harmony.current_gain = (harmony.current_gain & ~(GAIN_LI_MASK | GAIN_RI_MASK))
++                                      | (left_level << GAIN_LI_SHIFT) | (right_level << GAIN_RI_SHIFT);
++                      harmony_mixer_set_gain();
++                      return (new_right_level << 8) + new_left_level;
++      
++              case SOUND_MIXER_VOLUME:
++                      left_level = to_harmony_level(100-left_level, MAX_VOLUME_LEVEL);
++                      new_left_level = to_oss_level(MAX_VOLUME_LEVEL-left_level, MAX_VOLUME_LEVEL);
++                      harmony.current_gain = (harmony.current_gain & ~GAIN_MA_MASK)| (left_level << GAIN_MA_SHIFT);
++                      harmony_mixer_set_gain();
++                      return new_left_level;
++      }
++
++      return -EINVAL;
++}
++
++#undef to_harmony_level
++#undef to_oss_level
++
++/* 
++ * Return the selected input device (mic or line)
++ */
++
++static int harmony_mixer_get_recmask(void) 
++{
++      int current_input_line;
++      
++      current_input_line = (harmony.current_gain & GAIN_IS_MASK) 
++                                  >> GAIN_IS_SHIFT;
++      if (current_input_line) 
++              return SOUND_MASK_MIC;
++
++      return SOUND_MASK_LINE;
++}
++
++/*
++ * Set the input (only one at time, arbitrary priority to line in)
++ */
++
++static int harmony_mixer_set_recmask(int recmask)
++{
++      int new_input_line;
++      int new_input_mask;
++
++      if ((recmask & SOUND_MASK_LINE)) {
++              new_input_line = 0;
++              new_input_mask = SOUND_MASK_LINE;
++      } else  {
++              new_input_line = 1;
++              new_input_mask = SOUND_MASK_MIC;
++      }
++      harmony.current_gain = ((harmony.current_gain & ~GAIN_IS_MASK) | 
++                              (new_input_line << GAIN_IS_SHIFT ));
++      harmony_mixer_set_gain();
++      return new_input_mask;
++}
++
++
++/* 
++ * give the active outlines
++ */
++
++static int harmony_mixer_get_outmask(void)
++{
++      int outmask = 0;
++      
++      if (harmony.current_gain & GAIN_HE_MASK) outmask |=SOUND_MASK_PHONEOUT;
++      if (harmony.current_gain & GAIN_LE_MASK) outmask |=SOUND_MASK_LINE;
++      if (harmony.current_gain & GAIN_SE_MASK) outmask |=SOUND_MASK_SPEAKER;
++      
++      return outmask;
++}
++
++
++static int harmony_mixer_set_outmask(int outmask)
++{
++      if (outmask & SOUND_MASK_PHONEOUT) 
++              harmony.current_gain |= GAIN_HE_MASK; 
++      else 
++              harmony.current_gain &= ~GAIN_HE_MASK;
++      
++      if (outmask & SOUND_MASK_LINE) 
++              harmony.current_gain |= GAIN_LE_MASK;
++      else 
++              harmony.current_gain &= ~GAIN_LE_MASK;
++      
++      if (outmask & SOUND_MASK_SPEAKER) 
++              harmony.current_gain |= GAIN_SE_MASK;
++      else 
++              harmony.current_gain &= ~GAIN_SE_MASK;
++      
++      harmony_mixer_set_gain();
++
++      return (outmask & (SOUND_MASK_PHONEOUT | SOUND_MASK_LINE | SOUND_MASK_SPEAKER));
++}
++
++/*
++ * This code is inspired from sb_mixer.c
++ */
++
++static int harmony_mixer_ioctl(struct inode * inode, struct file * file,
++              unsigned int cmd, unsigned long arg)
++{
++      int val;
++      int ret;
++
++      if (cmd == SOUND_MIXER_INFO) {
++              mixer_info info;
++              memset(&info, 0, sizeof(info));
++                strncpy(info.id, "harmony", sizeof(info.id)-1);
++                strncpy(info.name, "Harmony audio", sizeof(info.name)-1);
++                info.modify_counter = 1; /* ? */
++                if (copy_to_user((void *)arg, &info, sizeof(info)))
++                        return -EFAULT;
++              return 0;
++      }
++      
++      if (cmd == OSS_GETVERSION)
++              return put_user(SOUND_VERSION, (int *)arg);
++
++      /* read */
++      val = 0;
++      if (_SIOC_DIR(cmd) & _SIOC_WRITE)
++              if (get_user(val, (int *)arg))
++                      return -EFAULT;
++
++      switch (cmd) {
++      case MIXER_READ(SOUND_MIXER_CAPS):
++              ret = SOUND_CAP_EXCL_INPUT;
++              break;
++      case MIXER_READ(SOUND_MIXER_STEREODEVS):
++              ret = SOUND_MASK_IGAIN | SOUND_MASK_OGAIN;
++              break;
++              
++      case MIXER_READ(SOUND_MIXER_RECMASK):
++              ret = SOUND_MASK_MIC | SOUND_MASK_LINE;
++              break;
++      case MIXER_READ(SOUND_MIXER_DEVMASK):
++              ret = SOUND_MASK_OGAIN | SOUND_MASK_IGAIN |
++                      SOUND_MASK_VOLUME;
++              break;
++      case MIXER_READ(SOUND_MIXER_OUTMASK):
++              ret = SOUND_MASK_SPEAKER | SOUND_MASK_LINE |
++                      SOUND_MASK_PHONEOUT;
++              break;
++              
++      case MIXER_WRITE(SOUND_MIXER_RECSRC):
++              ret = harmony_mixer_set_recmask(val);
++              break;
++      case MIXER_READ(SOUND_MIXER_RECSRC):
++              ret = harmony_mixer_get_recmask();
++              break;
++            
++      case MIXER_WRITE(SOUND_MIXER_OUTSRC):
++              ret = harmony_mixer_set_outmask(val);
++              break;
++      case MIXER_READ(SOUND_MIXER_OUTSRC):
++              ret = harmony_mixer_get_outmask();
++              break;
++      
++      case MIXER_WRITE(SOUND_MIXER_OGAIN):
++      case MIXER_WRITE(SOUND_MIXER_IGAIN):
++      case MIXER_WRITE(SOUND_MIXER_VOLUME):
++              ret = harmony_mixer_set_level(cmd & 0xff, val);
++              break;
++
++      case MIXER_READ(SOUND_MIXER_OGAIN):
++      case MIXER_READ(SOUND_MIXER_IGAIN):
++      case MIXER_READ(SOUND_MIXER_VOLUME):
++              ret = harmony_mixer_get_level(cmd & 0xff);
++              break;
++
++      default:
++              return -EINVAL;
++      }
++
++      if (put_user(ret, (int *)arg))
++              return -EFAULT;
++      return 0;
++}
++
++
++static int harmony_mixer_open(struct inode *inode, struct file *file)
++{
++      if (harmony.mixer_open) 
++              return -EBUSY;
++      harmony.mixer_open++;
++      return 0;
++}
++
++static int harmony_mixer_release(struct inode *inode, struct file *file)
++{
++      if (!harmony.mixer_open) 
++              return -EBUSY;
++      harmony.mixer_open--;
++      return 0;
++}
++
++static struct file_operations harmony_mixer_fops = {
++      owner:          THIS_MODULE,
++      llseek:         no_llseek,
++      open:           harmony_mixer_open,
++      release:        harmony_mixer_release,
++      ioctl:          harmony_mixer_ioctl,
++};
++
++
++/*
++ * Mute all the output and reset Harmony.
++ */
++
++static void __init harmony_mixer_reset(void)
++{
++      harmony.current_gain = GAIN_TOTAL_SILENCE;
++      harmony_mixer_set_gain();
++      harmony_wait_CNTL();
++      gsc_writel(1, &harmony.hpa->reset);
++      mdelay(50);             /* wait 50 ms */
++      gsc_writel(0, &harmony.hpa->reset);
++      harmony.current_gain = GAIN_DEFAULT;
++      harmony_mixer_set_gain();
++}
++
++static int __init harmony_mixer_init(void)
++{
++      /* Register the device file operations */
++      harmony.mixer_unit = register_sound_mixer(&harmony_mixer_fops, -1);
++      if (harmony.mixer_unit < 0) {
++              printk(KERN_WARNING PFX "Error Registering Mixer Driver\n");
++              return -EFAULT;
++      }
++  
++      harmony_mixer_reset();
++      harmony.mixer_open = 0;
++      
++      return 0;
++}
++
++
++
++/* 
++ * This is the callback that's called by the inventory hardware code 
++ * if it finds a match to the registered driver. 
++ */
++static int __init
++harmony_driver_callback(struct parisc_device *dev)
++{
++      u8      id;
++      u8      rev;
++      u32     cntl;
++      int     ret;
++
++      if (harmony.hpa) {
++              /* We only support one Harmony at this time */
++              printk(KERN_ERR PFX "driver already registered\n");
++              return -EBUSY;
++      }
++
++      /* Set the HPA of harmony */
++      harmony.hpa = (struct harmony_hpa *)dev->hpa;
++
++      harmony.irq = dev->irq;
++      if (!harmony.irq) {
++              printk(KERN_ERR PFX "no irq found\n");
++              return -ENODEV;
++      }
++
++      /* Grab the ID and revision from the device */
++      id = gsc_readb(&harmony.hpa->id);
++      if ((id | 1) != 0x15) {
++              printk(KERN_WARNING PFX "wrong harmony id 0x%02x\n", id);
++              return -EBUSY;
++      }
++      cntl = gsc_readl(&harmony.hpa->cntl);
++      rev = (cntl>>20) & 0xff;
++
++      printk(KERN_INFO "Lasi Harmony Audio driver " HARMONY_VERSION ", "
++                      "h/w id %i, rev. %i at 0x%lx, IRQ %i\n",
++                      id, rev, dev->hpa, harmony.irq);
++      
++      /* Make sure the control bit isn't set, although I don't think it 
++         ever is. */
++      if (cntl & CNTL_C) {
++              printk(KERN_WARNING PFX "CNTL busy\n");
++              harmony.hpa = 0;
++              return -EBUSY;
++      }
++
++      /* a fake pci_dev is needed for pci_* functions under ccio */
++      harmony.fake_pci_dev = ccio_get_fake(dev);
++      
++      /* Initialize the memory buffers */
++      if (harmony_alloc_buffer(&played_buf, MAX_BUFS) || 
++          harmony_alloc_buffer(&recorded_buf, MAX_BUFS) ||
++          harmony_alloc_buffer(&graveyard, 1) ||
++          harmony_alloc_buffer(&silent, 1)) {
++              ret = -EBUSY;
++              goto out_err;
++      }
++
++      /* Initialize /dev/mixer and /dev/audio  */
++      if ((ret=harmony_mixer_init())) 
++              goto out_err;
++      if ((ret=harmony_audio_init())) 
++              goto out_err;
++
++      return 0;
++
++out_err:
++      harmony.hpa = 0;
++      harmony_free_buffer(&played_buf);
++      harmony_free_buffer(&recorded_buf);
++      harmony_free_buffer(&graveyard);
++      harmony_free_buffer(&silent);
++      return ret;
++}
++
++
++static struct parisc_device_id harmony_tbl[] = {
++ /* { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007A }, Bushmaster/Flounder */
++ { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007B }, /* 712/715 Audio */
++ { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007E }, /* Pace Audio */
++ { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007F }, /* Outfield / Coral II */
++ { 0, }
++};
++
++MODULE_DEVICE_TABLE(parisc, harmony_tbl);
++
++static struct parisc_driver harmony_driver = {
++      name:           "Lasi Harmony",
++      id_table:       harmony_tbl,
++      probe:          harmony_driver_callback,
++};
++
++static int __init init_harmony(void)
++{
++      return register_parisc_driver(&harmony_driver);
++}
++
++static void __exit cleanup_harmony(void)
++{
++      free_irq(harmony.irq, &harmony);
++      unregister_sound_mixer(harmony.mixer_unit);
++      unregister_sound_dsp(harmony.dsp_unit);
++      harmony_free_buffer(&played_buf);
++      harmony_free_buffer(&recorded_buf);
++      harmony_free_buffer(&graveyard);
++      harmony_free_buffer(&silent);
++      unregister_parisc_driver(&harmony_driver);
++}
++
++EXPORT_NO_SYMBOLS;
++
++MODULE_AUTHOR("Alex DeVries <alex@linuxcare.com>");
++MODULE_DESCRIPTION("Harmony sound driver");
++MODULE_LICENSE("GPL");
++
++module_init(init_harmony);
++module_exit(cleanup_harmony);
++
+--- /dev/null  2002-08-30 16:31:37.000000000 -0700
++++ 25/sound/oss/kahlua.c      2003-07-19 17:03:51.000000000 -0700
+@@ -0,0 +1,227 @@
++/*
++ *    Initialisation code for Cyrix/NatSemi VSA1 softaudio
++ *
++ *    (C) Copyright 2003 Red Hat Inc <alan@redhat.com>
++ *
++ * XpressAudio(tm) is used on the Cyrix MediaGX (now NatSemi Geode) systems.
++ * The older version (VSA1) provides fairly good soundblaster emulation
++ * although there are a couple of bugs: large DMA buffers break record,
++ * and the MPU event handling seems suspect. VSA2 allows the native driver
++ * to control the AC97 audio engine directly and requires a different driver.
++ *
++ * Thanks to National Semiconductor for providing the needed information
++ * on the XpressAudio(tm) internals.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2, or (at your option) any
++ * later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ *
++ * TO DO:
++ *    Investigate whether we can portably support Cognac (5520) in the
++ *    same manner.
++ */
++
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/pci.h>
++
++#include "sound_config.h"
++
++#include "sb.h"
++
++/*
++ *    Read a soundblaster compatible mixer register.
++ *    In this case we are actually reading an SMI trap
++ *    not real hardware.
++ */
++
++static u8 __devinit mixer_read(unsigned long io, u8 reg)
++{
++      outb(reg, io + 4);
++      udelay(20);
++      reg = inb(io + 5);
++      udelay(20);
++      return reg;
++}
++
++static int __devinit probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
++{
++      struct address_info *hw_config;
++      unsigned long base;
++      void *mem;
++      unsigned long io;
++      u16 map;
++      u8 irq, dma8, dma16;
++      int oldquiet;
++      extern int sb_be_quiet;
++              
++      base = pci_resource_start(pdev, 0);
++      if(base == 0UL)
++              return 1;
++      
++      mem = ioremap(base, 128);
++      if(mem == 0UL)
++              return 1;
++      map = readw(mem + 0x18);        /* Read the SMI enables */
++      iounmap(mem);
++      
++      /* Map bits
++              0:1     * 0x20 + 0x200 = sb base
++              2       sb enable
++              3       adlib enable
++              5       MPU enable 0x330
++              6       MPU enable 0x300
++              
++         The other bits may be used internally so must be masked */
++
++      io = 0x220 + 0x20 * (map & 3);     
++      
++      if(map & (1<<2))
++              printk(KERN_INFO "kahlua: XpressAudio at 0x%lx\n", io);
++      else
++              return 1;
++              
++      if(map & (1<<5))
++              printk(KERN_INFO "kahlua: MPU at 0x300\n");
++      else if(map & (1<<6))
++              printk(KERN_INFO "kahlua: MPU at 0x330\n");
++      
++      irq = mixer_read(io, 0x80) & 0x0F;
++      dma8 = mixer_read(io, 0x81);
++
++      // printk("IRQ=%x MAP=%x DMA=%x\n", irq, map, dma8);
++      
++      if(dma8 & 0x20)
++              dma16 = 5;
++      else if(dma8 & 0x40)
++              dma16 = 6;
++      else if(dma8 & 0x80)
++              dma16 = 7;
++      else
++      {
++              printk(KERN_ERR "kahlua: No 16bit DMA enabled.\n");
++              return 1;
++      }
++              
++      if(dma8 & 0x01)
++              dma8 = 0;
++      else if(dma8 & 0x02)
++              dma8 = 1;
++      else if(dma8 & 0x08)
++              dma8 = 3;
++      else
++      {
++              printk(KERN_ERR "kahlua: No 8bit DMA enabled.\n");
++              return 1;
++      }
++      
++      if(irq & 1)
++              irq = 9;
++      else if(irq & 2)
++              irq = 5;
++      else if(irq & 4)
++              irq = 7;
++      else if(irq & 8)
++              irq = 10;
++      else
++      {
++              printk(KERN_ERR "kahlua: SB IRQ not set.\n");
++              return 1;
++      }
++      
++      printk(KERN_INFO "kahlua: XpressAudio on IRQ %d, DMA %d, %d\n",
++              irq, dma8, dma16);
++      
++      hw_config = kmalloc(sizeof(struct address_info), GFP_KERNEL);
++      if(hw_config == NULL)
++      {
++              printk(KERN_ERR "kahlua: out of memory.\n");
++              return 1;
++      }
++      memset(hw_config, 0, sizeof(*hw_config));
++      
++      pci_set_drvdata(pdev, hw_config);
++      
++      hw_config->io_base = io;
++      hw_config->irq = irq;
++      hw_config->dma = dma8;
++      hw_config->dma2 = dma16;
++      hw_config->name = "Cyrix XpressAudio";
++      hw_config->driver_use_1 = SB_NO_MIDI | SB_PCI_IRQ;
++      
++      if(sb_dsp_detect(hw_config, 0, 0, NULL)==0)
++      {
++              printk(KERN_ERR "kahlua: audio not responding.\n");
++              goto err_out_free;
++      }
++
++      oldquiet = sb_be_quiet; 
++      sb_be_quiet = 1;
++      if(sb_dsp_init(hw_config, THIS_MODULE))
++      {
++              sb_be_quiet = oldquiet;
++              goto err_out_free;
++      }
++      sb_be_quiet = oldquiet;
++      
++      return 0;
++
++err_out_free:
++      pci_set_drvdata(pdev, NULL);
++      kfree(hw_config);
++      return 1;
++}
++
++static void __devexit remove_one(struct pci_dev *pdev)
++{
++      struct address_info *hw_config = pci_get_drvdata(pdev);
++      sb_dsp_unload(hw_config, 0);
++      pci_set_drvdata(pdev, NULL);
++      kfree(hw_config);
++}
++
++MODULE_AUTHOR("Alan Cox");
++MODULE_DESCRIPTION("Kahlua VSA1 PCI Audio");
++MODULE_LICENSE("GPL");
++
++/*
++ *    5530 only. The 5510/5520 decode is different.
++ */
++
++static struct pci_device_id id_tbl[] __devinitdata = {
++      { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
++      { }
++};
++
++MODULE_DEVICE_TABLE(pci, id_tbl);
++
++static struct pci_driver kahlua_driver = {
++      name:           "kahlua",
++      id_table:       id_tbl,
++      probe:          probe_one,
++      remove:         __devexit_p(remove_one),
++};
++
++
++static int __init kahlua_init_module(void)
++{
++      printk(KERN_INFO "Cyrix Kahlua VSA1 XpressAudio support (c) Copyright 2003 Red Hat Inc\n");
++      return pci_module_init(&kahlua_driver);
++}
++
++static void __devexit kahlua_cleanup_module(void)
++{
++      return pci_unregister_driver(&kahlua_driver);
++}
++
++
++module_init(kahlua_init_module);
++module_exit(kahlua_cleanup_module);
++
+--- linux-2.6.0-test1/sound/oss/Kconfig        2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/Kconfig       2003-07-19 17:03:51.000000000 -0700
+@@ -233,6 +233,10 @@ config SOUND_ICH
+         Support for integral audio in Intel's I/O Controller Hub (ICH)
+         chipset, as used on the 810/820/840 motherboards.
++config SOUND_HARMONY
++      tristate "PA Harmony audio driver"
++      depends on GSC_LASI && SOUND
++
+ config SOUND_RME96XX
+       tristate "RME Hammerfall (RME96XX) support (EXPERIMENTAL)"
+       depends on SOUND_PRIME!=n && SOUND && PCI && EXPERIMENTAL
+@@ -260,6 +264,10 @@ config SOUND_VWSND
+         <file:Documentation/sound/oss/vwsnd> for more info on this driver's
+         capabilities.
++config SOUND_HAL2
++      tristate "SGI HAL2 sound (EXPERIMENTAL)"
++      depends on SGI_IP22 && SOUND && EXPERIMENTAL
++
+ config SOUND_VRC5477
+       tristate "NEC Vrc5477 AC97 sound"
+       depends on SOUND_PRIME!=n && DDB5477 && SOUND
+@@ -1126,3 +1134,23 @@ config SOUND_TVMIXER
+         Support for audio mixer facilities on the BT848 TV frame-grabber
+         card.
++config SOUND_KAHLUA
++      tristate "XpressAudio Sound Blaster emulation"
++      depends on SOUND_SB
++
++config SOUND_ALI5455
++      tristate "ALi5455 audio support"
++      depends on SOUND_PRIME!=n && PCI
++
++config SOUND_FORTE
++      tristate "ForteMedia FM801 driver"
++      depends on SOUND_PRIME!=n && PCI
++
++config SOUND_RME96XX
++      tristate "RME Hammerfall (RME96XX) support"
++      depends on SOUND_PRIME!=n && PCI
++
++config SOUND_AD1980
++      tristate "AD1980 front/back switch plugin"
++      depends on SOUND_PRIME!=n
++
+--- linux-2.6.0-test1/sound/oss/Makefile       2003-07-13 21:44:35.000000000 -0700
++++ 25/sound/oss/Makefile      2003-07-19 17:03:51.000000000 -0700
+@@ -10,6 +10,7 @@ obj-$(CONFIG_SOUND_CS4232)   += cs4232.o a
+ # Please leave it as is, cause the link order is significant !
++obj-$(CONFIG_SOUND_HAL2)      += hal2.o
+ obj-$(CONFIG_SOUND_AEDSP16)   += aedsp16.o
+ obj-$(CONFIG_SOUND_PSS)               += pss.o ad1848.o mpu401.o
+ obj-$(CONFIG_SOUND_TRIX)      += trix.o ad1848.o sb_lib.o uart401.o
+@@ -21,6 +22,7 @@ obj-$(CONFIG_SOUND_MSS)              += ad1848.o
+ obj-$(CONFIG_SOUND_OPL3SA2)   += opl3sa2.o ad1848.o mpu401.o
+ obj-$(CONFIG_SOUND_PAS)               += pas2.o sb.o sb_lib.o uart401.o
+ obj-$(CONFIG_SOUND_SB)                += sb.o sb_lib.o uart401.o
++obj-$(CONFIG_SOUND_KAHLUA)    += kahlua.o
+ obj-$(CONFIG_SOUND_WAVEFRONT) += wavefront.o
+ obj-$(CONFIG_SOUND_MAUI)      += maui.o mpu401.o
+ obj-$(CONFIG_SOUND_MPU401)    += mpu401.o
+@@ -60,10 +62,16 @@ obj-$(CONFIG_SOUND_FUSION) += cs46xx.o a
+ obj-$(CONFIG_SOUND_MAESTRO)   += maestro.o
+ obj-$(CONFIG_SOUND_MAESTRO3)  += maestro3.o ac97_codec.o
+ obj-$(CONFIG_SOUND_TRIDENT)   += trident.o ac97_codec.o
++obj-$(CONFIG_SOUND_HARMONY)   += harmony.o
+ obj-$(CONFIG_SOUND_EMU10K1)   += ac97_codec.o
+ obj-$(CONFIG_SOUND_RME96XX)     += rme96xx.o
+ obj-$(CONFIG_SOUND_BT878)     += btaudio.o
++obj-$(CONFIG_SOUND_ALI5455)   += ali5455.o ac97_codec.o
+ obj-$(CONFIG_SOUND_IT8172)    += ite8172.o ac97_codec.o
++obj-$(CONFIG_SOUND_FORTE)     += forte.o
++
++obj-$(CONFIG_SOUND_AD1980)    += ac97_plugin_ad1980.o
++obj-$(CONFIG_SOUND_WM97XX)    += ac97_plugin_wm97xx.o
+ ifeq ($(CONFIG_MIDI_EMU10K1),y)
+   obj-$(CONFIG_SOUND_EMU10K1) += sound.o
+--- linux-2.6.0-test1/sound/pci/ice1712/ak4xxx.c       2003-06-14 12:17:55.000000000 -0700
++++ 25/sound/pci/ice1712/ak4xxx.c      2003-07-19 17:06:15.000000000 -0700
+@@ -116,8 +116,8 @@ static void snd_ice1712_akm4xxx_write(ak
+ /*
+  * initialize the akm4xxx_t record with the template
+  */
+-int __devinit snd_ice1712_akm4xxx_init(akm4xxx_t *ak, const akm4xxx_t *temp,
+-                                     const struct snd_ak4xxx_private *_priv, ice1712_t *ice)
++int snd_ice1712_akm4xxx_init(akm4xxx_t *ak, const akm4xxx_t *temp,
++                           const struct snd_ak4xxx_private *_priv, ice1712_t *ice)
+ {
+       struct snd_ak4xxx_private *priv;
+@@ -139,7 +139,7 @@ int __devinit snd_ice1712_akm4xxx_init(a
+       return 0;
+ }
+-void __devexit snd_ice1712_akm4xxx_free(ice1712_t *ice)
++void snd_ice1712_akm4xxx_free(ice1712_t *ice)
+ {
+       unsigned int akidx;
+       if (ice->akm == NULL)
+@@ -155,7 +155,7 @@ void __devexit snd_ice1712_akm4xxx_free(
+ /*
+  * build AK4xxx controls
+  */
+-int __devinit snd_ice1712_akm4xxx_build_controls(ice1712_t *ice)
++int snd_ice1712_akm4xxx_build_controls(ice1712_t *ice)
+ {
+       unsigned int akidx;
+       int err;
+--- linux-2.6.0-test1/sound/pci/intel8x0.c     2003-06-14 12:18:23.000000000 -0700
++++ 25/sound/pci/intel8x0.c    2003-07-19 17:04:58.000000000 -0700
+@@ -2062,10 +2062,8 @@ static void __devinit intel8x0_measure_a
+       t = stop_time.tv_sec - start_time.tv_sec;
+       t *= 1000000;
+-      if (stop_time.tv_usec < start_time.tv_usec)
+-              t -= start_time.tv_usec - stop_time.tv_usec;
+-      else
+-              t += stop_time.tv_usec - start_time.tv_usec;
++      t += stop_time.tv_usec - start_time.tv_usec;
++      printk(KERN_INFO "%s: measured %lu usecs\n", __FUNCTION__, t);
+       if (t == 0) {
+               snd_printk(KERN_ERR "?? calculation error..\n");
+               return;
+--- linux-2.6.0-test1/usr/Makefile     2003-07-10 18:50:32.000000000 -0700
++++ 25/usr/Makefile    2003-07-19 17:03:51.000000000 -0700
+@@ -3,7 +3,7 @@ obj-y := initramfs_data.o
+ host-progs  := gen_init_cpio
+-clean-files := initramfs_data.cpio.gz
++clean-files := initramfs_data.cpio.gz initramfs_data.S
+ $(src)/initramfs_data.S: $(obj)/initramfs_data.cpio.gz
+       echo "  .section .init.ramfs,\"a\"" > $(src)/initramfs_data.S
diff --git a/lustre/kernel_patches/patches/kexec-2.6.0-full.patch b/lustre/kernel_patches/patches/kexec-2.6.0-full.patch
new file mode 100644 (file)
index 0000000..7e2ee63
--- /dev/null
@@ -0,0 +1,1428 @@
+ MAINTAINERS                        |   11 
+ arch/i386/Kconfig                  |   17 +
+ arch/i386/defconfig                |    1 
+ arch/i386/kernel/Makefile          |    1 
+ arch/i386/kernel/apic.c            |   54 +++
+ arch/i386/kernel/dmi_scan.c        |   27 -
+ arch/i386/kernel/entry.S           |    1 
+ arch/i386/kernel/i8259.c           |   12 
+ arch/i386/kernel/io_apic.c         |    2 
+ arch/i386/kernel/machine_kexec.c   |  116 ++++++
+ arch/i386/kernel/reboot.c          |   44 --
+ arch/i386/kernel/relocate_kernel.S |  107 ++++++
+ arch/i386/kernel/smp.c             |   24 +
+ include/asm-i386/apic.h            |    3 
+ include/asm-i386/apicdef.h         |    1 
+ include/asm-i386/kexec.h           |   23 +
+ include/asm-i386/unistd.h          |    5 
+ include/linux/kexec.h              |   54 +++
+ include/linux/reboot.h             |    2 
+ kernel/Makefile                    |    1 
+ kernel/kexec.c                     |  629 +++++++++++++++++++++++++++++++++++++
+ kernel/sys.c                       |   23 +
+ 22 files changed, 1089 insertions(+), 69 deletions(-)
+
+--- linux-2.6.0-test1/MAINTAINERS~kexec-2.6.0-full     2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/MAINTAINERS        2003-07-22 00:54:04.000000000 -0600
+@@ -1095,6 +1095,17 @@ W:      http://nfs.sourceforge.net/
+ W:    http://www.cse.unsw.edu.au/~neilb/patches/linux-devel/
+ S:    Maintained
++KEXEC
++P:    Eric Biederman
++M:    ebiederm@xmission.com
++M:    ebiederman@lnxi.com
++W:    http://www.xmission.com/~ebiederm/files/kexec/
++P:    Andy Pfiffer
++M:    andyp@osdl.org
++W:    http://www.osdl.org/archive/andyp/bloom/Code/Linux/Kexec/
++L:    linux-kernel@vger.kernel.org
++S:    Maintained
++
+ LANMEDIA WAN CARD DRIVER
+ P:    Andrew Stanley-Jones
+ M:    asj@lanmedia.com
+--- linux-2.6.0-test1/arch/i386/Kconfig~kexec-2.6.0-full       2003-07-22 00:52:14.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/Kconfig  2003-07-22 00:54:04.000000000 -0600
+@@ -804,6 +804,23 @@ config BOOT_IOREMAP
+       depends on ((X86_SUMMIT || X86_GENERICARCH) && NUMA)
+       default y
++config KEXEC
++      bool "kexec system call (EXPERIMENTAL)"
++      depends on EXPERIMENTAL
++      help
++        kexec is a system call that implements the ability to  shutdown your
++        current kernel, and to start another kernel.  It is like a reboot
++        but it is indepedent of the system firmware.   And like a reboot
++        you can start any kernel with it not just Linux.  
++      
++        The name comes from the similiarity to the exec system call. 
++      
++        It is on an going process to be certain the hardware in a machine
++        is properly shutdown, so do not be surprised if this code does not
++        initially work for you.  It may help to enable device hotplugging
++        support.  As of this writing the exact hardware interface is
++        strongly in flux, so no good recommendation can be made.
++
+ endmenu
+--- linux-2.6.0-test1/arch/i386/defconfig~kexec-2.6.0-full     2003-07-13 21:35:57.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/defconfig        2003-07-22 00:54:04.000000000 -0600
+@@ -72,6 +72,7 @@ CONFIG_SMP=y
+ CONFIG_X86_LOCAL_APIC=y
+ CONFIG_X86_IO_APIC=y
+ CONFIG_NR_CPUS=32
++CONFIG_KEXEC=y
+ CONFIG_X86_MCE=y
+ # CONFIG_X86_MCE_NONFATAL is not set
+ CONFIG_X86_MCE_P4THERMAL=y
+--- linux-2.6.0-test1/arch/i386/kernel/Makefile~kexec-2.6.0-full       2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/Makefile  2003-07-22 00:54:04.000000000 -0600
+@@ -25,6 +25,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoli
+ obj-$(CONFIG_X86_MPPARSE)     += mpparse.o
+ obj-$(CONFIG_X86_LOCAL_APIC)  += apic.o nmi.o
+ obj-$(CONFIG_X86_IO_APIC)     += io_apic.o
++obj-$(CONFIG_KEXEC)           += machine_kexec.o relocate_kernel.o
+ obj-$(CONFIG_SOFTWARE_SUSPEND)        += suspend.o suspend_asm.o
+ obj-$(CONFIG_X86_NUMAQ)               += numaq.o
+ obj-$(CONFIG_X86_SUMMIT)      += summit.o
+--- linux-2.6.0-test1/arch/i386/kernel/apic.c~kexec-2.6.0-full 2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/apic.c    2003-07-22 00:54:04.000000000 -0600
+@@ -26,6 +26,7 @@
+ #include <linux/mc146818rtc.h>
+ #include <linux/kernel_stat.h>
+ #include <linux/sysdev.h>
++#include <linux/reboot.h>
+ #include <asm/atomic.h>
+ #include <asm/smp.h>
+@@ -175,6 +176,39 @@ void disconnect_bsp_APIC(void)
+               outb(0x70, 0x22);
+               outb(0x00, 0x23);
+       }
++#ifdef        CONFIG_KEXEC
++      else {
++              /* Go back to Virtual Wire compatibility mode */
++              unsigned long value;
++
++              /* For the spurious interrupt use vector F, and enable it */
++              value = apic_read(APIC_SPIV);
++              value &= ~APIC_VECTOR_MASK; 
++              value |= APIC_SPIV_APIC_ENABLED;
++              value |= 0xf;
++              apic_write_around(APIC_SPIV, value);
++
++              /* For LVT0 make it edge triggered, active high, external and enabled */
++              value = apic_read(APIC_LVT0);
++              value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING | 
++                      APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR | 
++                      APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
++              value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
++              value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXINT);
++              apic_write_around(APIC_LVT0, value);
++              
++              /* For LVT1 make it edge triggered, active high, nmi and enabled */
++              value = apic_read(APIC_LVT1);
++              value &= ~(
++                      APIC_MODE_MASK | APIC_SEND_PENDING | 
++                      APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR | 
++                      APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
++              value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
++              value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
++              apic_write_around(APIC_LVT1, value);
++      }
++#endif        /* CONFIG_KEXEC */
++
+ }
+ void disable_local_APIC(void)
+@@ -1115,6 +1149,26 @@ asmlinkage void smp_error_interrupt(void
+       irq_exit();
+ }
++void stop_apics(void)
++{
++      /* By resetting the APIC's we disable the nmi watchdog */
++#if CONFIG_SMP
++      /*
++       * Stop all CPUs and turn off local APICs and the IO-APIC, so
++       * other OSs see a clean IRQ state.
++       */
++      smp_send_stop();
++#else
++      disable_local_APIC();
++#endif
++#if defined(CONFIG_X86_IO_APIC)
++      if (smp_found_config) {
++              disable_IO_APIC();
++      }
++#endif
++      disconnect_bsp_APIC();
++}
++
+ /*
+  * This initializes the IO-APIC and APIC hardware if this is
+  * a UP kernel.
+--- linux-2.6.0-test1/arch/i386/kernel/dmi_scan.c~kexec-2.6.0-full     2003-07-13 21:32:44.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/dmi_scan.c        2003-07-22 00:54:04.000000000 -0600
+@@ -222,31 +222,6 @@ static __init int set_bios_reboot(struct
+       return 0;
+ }
+-/*
+- * Some machines require the "reboot=s"  commandline option, this quirk makes that automatic.
+- */
+-static __init int set_smp_reboot(struct dmi_blacklist *d)
+-{
+-#ifdef CONFIG_SMP
+-      extern int reboot_smp;
+-      if (reboot_smp == 0)
+-      {
+-              reboot_smp = 1;
+-              printk(KERN_INFO "%s series board detected. Selecting SMP-method for reboots.\n", d->ident);
+-      }
+-#endif
+-      return 0;
+-}
+-
+-/*
+- * Some machines require the "reboot=b,s"  commandline option, this quirk makes that automatic.
+- */
+-static __init int set_smp_bios_reboot(struct dmi_blacklist *d)
+-{
+-      set_smp_reboot(d);
+-      set_bios_reboot(d);
+-      return 0;
+-}
+ /*
+  * Some bioses have a broken protected mode poweroff and need to use realmode
+@@ -527,7 +502,7 @@ static __initdata struct dmi_blacklist d
+                       MATCH(DMI_BIOS_VERSION, "4.60 PGMA"),
+                       MATCH(DMI_BIOS_DATE, "134526184"), NO_MATCH
+                       } },
+-      { set_smp_bios_reboot, "Dell PowerEdge 1300", { /* Handle problems with rebooting on Dell 1300's */
++      { set_bios_reboot, "Dell PowerEdge 1300", {     /* Handle problems with rebooting on Dell 1300's */
+                       MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
+                       MATCH(DMI_PRODUCT_NAME, "PowerEdge 1300/"),
+                       NO_MATCH, NO_MATCH
+--- linux-2.6.0-test1/arch/i386/kernel/entry.S~kexec-2.6.0-full        2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/entry.S   2003-07-22 00:54:27.000000000 -0600
+@@ -905,5 +905,6 @@ ENTRY(sys_call_table)
+       .long sys_tgkill        /* 270 */
+       .long sys_utimes
+       .long sys_mknod64
++        .long sys_kexec_load
+ nr_syscalls=(.-sys_call_table)/4
+--- linux-2.6.0-test1/arch/i386/kernel/i8259.c~kexec-2.6.0-full        2003-07-13 21:38:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/i8259.c   2003-07-22 00:54:04.000000000 -0600
+@@ -244,9 +244,21 @@ static int i8259A_resume(struct sys_devi
+       return 0;
+ }
++static int i8259A_shutdown(struct sys_device *dev)
++{
++      /* Put the i8259A into a quiescent state that
++       * the kernel initialization code can get it
++       * out of.
++       */
++      outb(0xff, 0x21);       /* mask all of 8259A-1 */
++      outb(0xff, 0xA1);       /* mask all of 8259A-1 */
++      return 0;
++}
++
+ static struct sysdev_class i8259_sysdev_class = {
+       set_kset_name("i8259"),
+       .resume = i8259A_resume,
++      .shutdown = i8259A_shutdown,
+ };
+ static struct sys_device device_i8259A = {
+--- linux-2.6.0-test1/arch/i386/kernel/io_apic.c~kexec-2.6.0-full      2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/io_apic.c 2003-07-22 00:54:04.000000000 -0600
+@@ -1601,8 +1601,6 @@ void disable_IO_APIC(void)
+        * Clear the IO-APIC before rebooting:
+        */
+       clear_IO_APIC();
+-
+-      disconnect_bsp_APIC();
+ }
+ /*
+--- /dev/null  2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/arch/i386/kernel/machine_kexec.c   2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,116 @@
++#include <linux/config.h>
++#include <linux/mm.h>
++#include <linux/kexec.h>
++#include <linux/delay.h>
++#include <asm/pgtable.h>
++#include <asm/pgalloc.h>
++#include <asm/tlbflush.h>
++#include <asm/mmu_context.h>
++#include <asm/io.h>
++#include <asm/apic.h>
++
++
++/*
++ * machine_kexec
++ * =======================
++ */
++
++
++static void set_idt(void *newidt, __u16 limit)
++{
++      unsigned char curidt[6];
++
++      /* ia32 supports unaliged loads & stores */
++      (*(__u16 *)(curidt)) = limit;
++      (*(__u32 *)(curidt +2)) = (unsigned long)(newidt);
++
++      __asm__ __volatile__ (
++              "lidt %0\n" 
++              : "=m" (curidt)
++              );
++};
++
++
++static void set_gdt(void *newgdt, __u16 limit)
++{
++      unsigned char curgdt[6];
++
++      /* ia32 supports unaliged loads & stores */
++      (*(__u16 *)(curgdt)) = limit;
++      (*(__u32 *)(curgdt +2)) = (unsigned long)(newgdt);
++
++      __asm__ __volatile__ (
++              "lgdt %0\n" 
++              : "=m" (curgdt)
++              );
++};
++
++static void load_segments(void)
++{
++#define __STR(X) #X
++#define STR(X) __STR(X)
++
++      __asm__ __volatile__ (
++              "\tljmp $"STR(__KERNEL_CS)",$1f\n"
++              "\t1:\n"
++              "\tmovl $"STR(__KERNEL_DS)",%eax\n"
++              "\tmovl %eax,%ds\n"
++              "\tmovl %eax,%es\n"
++              "\tmovl %eax,%fs\n"
++              "\tmovl %eax,%gs\n"
++              "\tmovl %eax,%ss\n"
++              );
++#undef STR
++#undef __STR
++}
++
++typedef void (*relocate_new_kernel_t)(
++      unsigned long indirection_page, unsigned long reboot_code_buffer,
++      unsigned long start_address);
++
++const extern unsigned char relocate_new_kernel[];
++extern void relocate_new_kernel_end(void);
++const extern unsigned int relocate_new_kernel_size;
++extern void use_mm(struct mm_struct *mm);
++
++void machine_kexec(struct kimage *image)
++{
++      unsigned long indirection_page;
++      unsigned long reboot_code_buffer;
++      relocate_new_kernel_t rnk;
++
++      /* switch to an mm where the reboot_code_buffer is identity mapped */
++      use_mm(&init_mm);
++      stop_apics();
++
++      /* Interrupts aren't acceptable while we reboot */
++      local_irq_disable();
++      reboot_code_buffer = page_to_pfn(image->reboot_code_pages) << PAGE_SHIFT;
++      indirection_page = image->head & PAGE_MASK;
++
++      /* copy it out */
++      memcpy((void *)reboot_code_buffer, relocate_new_kernel, relocate_new_kernel_size);
++
++      /* The segment registers are funny things, they are
++       * automatically loaded from a table, in memory wherever you
++       * set them to a specific selector, but this table is never
++       * accessed again you set the segment to a different selector.
++       *
++       * The more common model is are caches where the behide
++       * the scenes work is done, but is also dropped at arbitrary
++       * times.
++       *
++       * I take advantage of this here by force loading the
++       * segments, before I zap the gdt with an invalid value.
++       */
++      load_segments();
++      /* The gdt & idt are now invalid.
++       * If you want to load them you must set up your own idt & gdt.
++       */
++      set_gdt(phys_to_virt(0),0);
++      set_idt(phys_to_virt(0),0);
++
++      /* now call it */
++      rnk = (relocate_new_kernel_t) reboot_code_buffer;
++      (*rnk)(indirection_page, reboot_code_buffer, image->start);
++}
+--- linux-2.6.0-test1/arch/i386/kernel/reboot.c~kexec-2.6.0-full       2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/reboot.c  2003-07-22 00:55:22.000000000 -0600
+@@ -8,6 +8,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/mc146818rtc.h>
+ #include <asm/uaccess.h>
++#include <asm/apic.h>
+ #include "mach_reboot.h"
+ /*
+@@ -20,8 +21,7 @@ static int reboot_mode;
+ int reboot_thru_bios;
+ #ifdef CONFIG_SMP
+-int reboot_smp = 0;
+-static int reboot_cpu = -1;
++int reboot_cpu = -1;    /* specifies the internal linux cpu id, not the apicid */
+ /* shamelessly grabbed from lib/vsprintf.c for readability */
+ #define is_digit(c)   ((c) >= '0' && (c) <= '9')
+ #endif
+@@ -43,7 +43,6 @@ static int __init reboot_setup(char *str
+                       break;
+ #ifdef CONFIG_SMP
+               case 's': /* "smp" reboot by executing reset on BSP or other CPU*/
+-                      reboot_smp = 1;
+                       if (is_digit(*(str+1))) {
+                               reboot_cpu = (int) (*(str+1) - '0');
+                               if (is_digit(*(str+2))) 
+@@ -215,42 +214,7 @@ void machine_real_restart(unsigned char 
+ void machine_restart(char * __unused)
+ {
+-#ifdef CONFIG_SMP
+-      int cpuid;
+-      
+-      cpuid = GET_APIC_ID(apic_read(APIC_ID));
+-
+-      if (reboot_smp) {
+-
+-              /* check to see if reboot_cpu is valid 
+-                 if its not, default to the BSP */
+-              if ((reboot_cpu == -1) ||  
+-                    (reboot_cpu > (NR_CPUS -1))  || 
+-                    !cpu_isset(cpuid, phys_cpu_present_map))
+-                      reboot_cpu = boot_cpu_physical_apicid;
+-
+-              reboot_smp = 0;  /* use this as a flag to only go through this once*/
+-              /* re-run this function on the other CPUs
+-                 it will fall though this section since we have 
+-                 cleared reboot_smp, and do the reboot if it is the
+-                 correct CPU, otherwise it halts. */
+-              if (reboot_cpu != cpuid)
+-                      smp_call_function((void *)machine_restart , NULL, 1, 0);
+-      }
+-
+-      /* if reboot_cpu is still -1, then we want a tradional reboot, 
+-         and if we are not running on the reboot_cpu,, halt */
+-      if ((reboot_cpu != -1) && (cpuid != reboot_cpu)) {
+-              for (;;)
+-              __asm__ __volatile__ ("hlt");
+-      }
+-      /*
+-       * Stop all CPUs and turn off local APICs and the IO-APIC, so
+-       * other OSs see a clean IRQ state.
+-       */
+-      smp_send_stop();
+-      disable_IO_APIC();
+-#endif
++        stop_apics();
+       if(!reboot_thru_bios) {
+               /* rebooting needs to touch the page at absolute addr 0 */
+@@ -268,10 +232,12 @@ void machine_restart(char * __unused)
+ void machine_halt(void)
+ {
++      stop_apics();
+ }
+ void machine_power_off(void)
+ {
++      stop_apics();
+       if (pm_power_off)
+               pm_power_off();
+ }
+--- /dev/null  2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/arch/i386/kernel/relocate_kernel.S 2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,107 @@
++#include <linux/config.h>
++#include <linux/linkage.h>
++
++      /* Must be relocatable PIC code callable as a C function, that once
++       * it starts can not use the previous processes stack.
++       *
++       */
++      .globl relocate_new_kernel
++relocate_new_kernel:
++      /* read the arguments and say goodbye to the stack */
++      movl  4(%esp), %ebx /* indirection_page */
++      movl  8(%esp), %ebp /* reboot_code_buffer */
++      movl  12(%esp), %edx /* start address */
++
++      /* zero out flags, and disable interrupts */
++      pushl $0
++      popfl
++
++      /* set a new stack at the bottom of our page... */
++      lea   4096(%ebp), %esp
++
++      /* store the parameters back on the stack */
++      pushl   %edx /* store the start address */
++
++      /* Set cr0 to a known state:
++       * 31 0 == Paging disabled
++       * 18 0 == Alignment check disabled
++       * 16 0 == Write protect disabled
++       * 3  0 == No task switch
++       * 2  0 == Don't do FP software emulation.
++       * 0  1 == Proctected mode enabled
++       */
++      movl    %cr0, %eax
++      andl    $~((1<<31)|(1<<18)|(1<<16)|(1<<3)|(1<<2)), %eax
++      orl     $(1<<0), %eax
++      movl    %eax, %cr0
++      
++      /* Set cr4 to a known state:
++       * Setting everything to zero seems safe.
++       */
++      movl    %cr4, %eax
++      andl    $0, %eax
++      movl    %eax, %cr4
++      
++      jmp 1f
++1:    
++
++      /* Flush the TLB (needed?) */
++      xorl    %eax, %eax
++      movl    %eax, %cr3
++
++      /* Do the copies */
++      cld
++0:    /* top, read another word for the indirection page */
++      movl    %ebx, %ecx
++      movl    (%ebx), %ecx
++      addl    $4, %ebx
++      testl   $0x1,   %ecx  /* is it a destination page */
++      jz      1f
++      movl    %ecx,   %edi
++      andl    $0xfffff000, %edi
++      jmp     0b
++1:
++      testl   $0x2,   %ecx  /* is it an indirection page */
++      jz      1f
++      movl    %ecx,   %ebx
++      andl    $0xfffff000, %ebx
++      jmp     0b
++1:
++      testl   $0x4,   %ecx /* is it the done indicator */
++      jz      1f
++      jmp     2f
++1:
++      testl   $0x8,   %ecx /* is it the source indicator */
++      jz      0b           /* Ignore it otherwise */
++      movl    %ecx,   %esi /* For every source page do a copy */
++      andl    $0xfffff000, %esi
++
++      movl    $1024, %ecx
++      rep ; movsl
++      jmp     0b
++
++2:
++
++      /* To be certain of avoiding problems with self modifying code
++       * I need to execute a serializing instruction here.
++       * So I flush the TLB, it's handy, and not processor dependent.
++       */
++      xorl    %eax, %eax
++      movl    %eax, %cr3
++      
++      /* set all of the registers to known values */
++      /* leave %esp alone */
++      
++      xorl    %eax, %eax
++      xorl    %ebx, %ebx
++      xorl    %ecx, %ecx
++      xorl    %edx, %edx
++      xorl    %esi, %esi
++      xorl    %edi, %edi
++      xorl    %ebp, %ebp
++      ret
++relocate_new_kernel_end:
++
++      .globl relocate_new_kernel_size
++relocate_new_kernel_size:     
++      .long relocate_new_kernel_end - relocate_new_kernel
+--- linux-2.6.0-test1/arch/i386/kernel/smp.c~kexec-2.6.0-full  2003-07-22 00:52:14.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/smp.c     2003-07-22 00:54:04.000000000 -0600
+@@ -587,6 +587,30 @@ void stop_this_cpu (void * dummy)
+ void smp_send_stop(void)
+ {
++      extern int reboot_cpu;
++      int reboot_cpu_id;
++
++      /* The boot cpu is always logical cpu 0 */
++      reboot_cpu_id = 0;
++
++      /* See if there has been give a command line override .
++       */
++      if ((reboot_cpu != -1) && !(reboot_cpu >= NR_CPUS) && 
++              test_bit(reboot_cpu, &cpu_online_map)) {
++              reboot_cpu_id = reboot_cpu;
++      }
++       
++      /* Make certain the the cpu I'm rebooting on is online */
++      if (!test_bit(reboot_cpu_id, &cpu_online_map)) {
++              reboot_cpu_id = smp_processor_id();
++      }
++
++      /* Make certain I only run on the appropriate processor */
++      set_cpus_allowed(current, 1 << reboot_cpu_id);
++
++      /* O.k. Now that I'm on the appropriate processor stop
++       * all of the others.
++       */
+       smp_call_function(stop_this_cpu, NULL, 1, 0);
+       local_irq_disable();
+--- linux-2.6.0-test1/include/asm-i386/apic.h~kexec-2.6.0-full 2003-07-13 21:38:53.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/apic.h    2003-07-22 00:54:04.000000000 -0600
+@@ -97,6 +97,9 @@ extern unsigned int nmi_watchdog;
+ #define NMI_LOCAL_APIC        2
+ #define NMI_INVALID   3
++extern void stop_apics(void);
++#else
++static inline void stop_apics(void) { }
+ #endif /* CONFIG_X86_LOCAL_APIC */
+ #endif /* __ASM_APIC_H */
+--- linux-2.6.0-test1/include/asm-i386/apicdef.h~kexec-2.6.0-full      2003-07-13 21:34:40.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/apicdef.h 2003-07-22 00:54:04.000000000 -0600
+@@ -86,6 +86,7 @@
+ #define                       APIC_LVT_REMOTE_IRR             (1<<14)
+ #define                       APIC_INPUT_POLARITY             (1<<13)
+ #define                       APIC_SEND_PENDING               (1<<12)
++#define                       APIC_MODE_MASK                  0x700
+ #define                       GET_APIC_DELIVERY_MODE(x)       (((x)>>8)&0x7)
+ #define                       SET_APIC_DELIVERY_MODE(x,y)     (((x)&~0x700)|((y)<<8))
+ #define                               APIC_MODE_FIXED         0x0
+--- /dev/null  2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/include/asm-i386/kexec.h   2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,23 @@
++#ifndef _I386_KEXEC_H
++#define _I386_KEXEC_H
++
++#include <asm/fixmap.h>
++
++/*
++ * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return.
++ * I.e. Maximum page that is mapped directly into kernel memory,
++ * and kmap is not required.
++ *
++ * Someone correct me if FIXADDR_START - PAGEOFFSET is not the correct
++ * calculation for the amount of memory directly mappable into the
++ * kernel memory space.
++ */
++
++/* Maximum physical address we can use pages from */
++#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
++/* Maximum address we can reach in physical address mode */
++#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
++
++#define KEXEC_REBOOT_CODE_SIZE        4096
++
++#endif /* _I386_KEXEC_H */
+--- linux-2.6.0-test1/include/asm-i386/unistd.h~kexec-2.6.0-full       2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/unistd.h  2003-07-22 00:55:57.000000000 -0600
+@@ -278,8 +278,9 @@
+ #define __NR_tgkill           270
+ #define __NR_utimes           271
+ #define __NR_mknod64          272
+-
+-#define NR_syscalls 273
++#define __NR_sys_kexec_load   273
++  
++#define NR_syscalls 274
+ /* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
+--- /dev/null  2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/include/linux/kexec.h      2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,54 @@
++#ifndef LINUX_KEXEC_H
++#define LINUX_KEXEC_H
++
++#if CONFIG_KEXEC
++#include <linux/types.h>
++#include <linux/list.h>
++#include <asm/kexec.h>
++
++/* 
++ * This structure is used to hold the arguments that are used when loading
++ * kernel binaries.
++ */
++
++typedef unsigned long kimage_entry_t;
++#define IND_DESTINATION  0x1
++#define IND_INDIRECTION  0x2
++#define IND_DONE         0x4
++#define IND_SOURCE       0x8
++
++#define KEXEC_SEGMENT_MAX 8
++struct kexec_segment {
++      void *buf;
++      size_t bufsz;
++      void *mem;
++      size_t memsz;
++};
++
++struct kimage {
++      kimage_entry_t head;
++      kimage_entry_t *entry;
++      kimage_entry_t *last_entry;
++
++      unsigned long destination;
++      unsigned long offset;
++
++      unsigned long start;
++      struct page *reboot_code_pages;
++
++      unsigned long nr_segments;
++      struct kexec_segment segment[KEXEC_SEGMENT_MAX+1];
++
++      struct list_head dest_pages;
++      struct list_head unuseable_pages;
++};
++
++
++/* kexec interface functions */
++extern void machine_kexec(struct kimage *image);
++extern asmlinkage long sys_kexec(unsigned long entry, long nr_segments, 
++      struct kexec_segment *segments);
++extern struct kimage *kexec_image;
++#endif
++#endif /* LINUX_KEXEC_H */
++
+--- linux-2.6.0-test1/include/linux/reboot.h~kexec-2.6.0-full  2003-07-13 21:39:35.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/reboot.h     2003-07-22 00:54:04.000000000 -0600
+@@ -22,6 +22,7 @@
+  * POWER_OFF   Stop OS and remove all power from system, if possible.
+  * RESTART2    Restart system using given command string.
+  * SW_SUSPEND  Suspend system using Software Suspend if compiled in
++ * KEXEC       Restart the system using a different kernel.
+  */
+ #define       LINUX_REBOOT_CMD_RESTART        0x01234567
+@@ -31,6 +32,7 @@
+ #define       LINUX_REBOOT_CMD_POWER_OFF      0x4321FEDC
+ #define       LINUX_REBOOT_CMD_RESTART2       0xA1B2C3D4
+ #define       LINUX_REBOOT_CMD_SW_SUSPEND     0xD000FCE2
++#define LINUX_REBOOT_CMD_KEXEC                0x45584543
+ #ifdef __KERNEL__
+--- linux-2.6.0-test1/kernel/Makefile~kexec-2.6.0-full 2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/Makefile    2003-07-22 00:54:04.000000000 -0600
+@@ -19,6 +19,7 @@ obj-$(CONFIG_PM) += pm.o
+ obj-$(CONFIG_CPU_FREQ) += cpufreq.o
+ obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
+ obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
++obj-$(CONFIG_KEXEC) += kexec.o
+ obj-$(CONFIG_COMPAT) += compat.o
+ ifneq ($(CONFIG_IA64),y)
+--- /dev/null  2003-01-30 03:24:37.000000000 -0700
++++ linux-2.6.0-test1-braam/kernel/kexec.c     2003-07-22 00:54:04.000000000 -0600
+@@ -0,0 +1,629 @@
++#include <linux/mm.h>
++#include <linux/file.h>
++#include <linux/slab.h>
++#include <linux/fs.h>
++#include <linux/version.h>
++#include <linux/compile.h>
++#include <linux/kexec.h>
++#include <linux/spinlock.h>
++#include <linux/list.h>
++#include <linux/highmem.h>
++#include <net/checksum.h>
++#include <asm/page.h>
++#include <asm/uaccess.h>
++#include <asm/io.h>
++#include <asm/system.h>
++
++/* When kexec transitions to the new kernel there is a one to one
++ * mapping between physical and virtual addresses.  On processors
++ * where you can disable the MMU this is trivial, and easy.  For
++ * others it is still a simple predictable page table to setup.
++ *
++ * In that environment kexec copies the new kernel to it's final
++ * resting place.  This means I can only support memory whose
++ * physical address can fit in an unsigned long.  In particular
++ * addresses where (pfn << PAGE_SHIFT) > ULONG_MAX cannot be handled.
++ * If the assembly stub has more restrictive requirements
++ * KEXEC_SOURCE_MEMORY_LIMIT and KEXEC_DEST_MEMORY_LIMIT can be
++ * defined more restrictively in <asm/kexec.h>.
++ *
++ * The code for the transition from the current kernel to the 
++ * the new kernel is placed in the reboot_code_buffer, whose size
++ * is given by KEXEC_REBOOT_CODE_SIZE.  In the best case only a single
++ * page of memory is necessary, but some architectures require more.
++ * Because this memory must be identity mapped in the transition from
++ * virtual to physical addresses it must live in the range
++ * 0 - TASK_SIZE, as only the user space mappings are arbitrarily
++ * modifyable.
++ *
++ * The assembly stub in the reboot code buffer is passed a linked list
++ * of descriptor pages detailing the source pages of the new kernel,
++ * and the destination addresses of those source pages.  As this data
++ * structure is not used in the context of the current OS, it must
++ * be self contained.
++ *
++ * The code has been made to work with highmem pages and will use a
++ * destination page in it's final resting place (if it happens 
++ * to allocate it).  The end product of this is that most of the
++ * physical address space, and most of ram can be used.
++ *
++ * Future directions include:
++ *  - allocating a page table with the reboot code buffer identity
++ *    mapped, to simplify machine_kexec and make kexec_on_panic, more
++ *    reliable.  
++ *  - allocating the pages for a page table for machines that cannot
++ *    disable their MMUs.  (Hammer, Alpha...)
++ */
++
++/* KIMAGE_NO_DEST is an impossible destination address..., for
++ * allocating pages whose destination address we do not care about.
++ */
++#define KIMAGE_NO_DEST (-1UL)
++
++static int kimage_is_destination_range(
++      struct kimage *image, unsigned long start, unsigned long end);
++static struct page *kimage_alloc_reboot_code_pages(struct kimage *image);
++static struct page *kimage_alloc_page(struct kimage *image, unsigned int gfp_mask, unsigned long dest);
++
++
++static int kimage_alloc(struct kimage **rimage, 
++      unsigned long nr_segments, struct kexec_segment *segments)
++{
++      int result;
++      struct kimage *image;
++      size_t segment_bytes;
++      struct page *reboot_pages;
++      unsigned long i;
++
++      /* Allocate a controlling structure */
++      result = -ENOMEM;
++      image = kmalloc(sizeof(*image), GFP_KERNEL);
++      if (!image) {
++              goto out;
++      }
++      memset(image, 0, sizeof(*image));
++      image->head = 0;
++      image->entry = &image->head;
++      image->last_entry = &image->head;
++
++      /* Initialize the list of destination pages */
++      INIT_LIST_HEAD(&image->dest_pages);
++
++      /* Initialize the list of unuseable pages */
++      INIT_LIST_HEAD(&image->unuseable_pages);
++
++      /* Read in the segments */
++      image->nr_segments = nr_segments;
++      segment_bytes = nr_segments * sizeof*segments;
++      result = copy_from_user(image->segment, segments, segment_bytes);
++      if (result) 
++              goto out;
++
++      /* Verify we have good destination addresses.  The caller is
++       * responsible for making certain we don't attempt to load
++       * the new image into invalid or reserved areas of RAM.  This
++       * just verifies it is an address we can use. 
++       */
++      result = -EADDRNOTAVAIL;
++      for(i = 0; i < nr_segments; i++) {
++              unsigned long mend;
++              mend = ((unsigned long)(image->segment[i].mem)) + 
++                      image->segment[i].memsz;
++              if (mend >= KEXEC_DESTINATION_MEMORY_LIMIT)
++                      goto out;
++      }
++
++      /* Find a location for the reboot code buffer, and add it
++       * the vector of segments so that it's pages will also be
++       * counted as destination pages.  
++       */
++      result = -ENOMEM;
++      reboot_pages = kimage_alloc_reboot_code_pages(image);
++      if (!reboot_pages) {
++              printk(KERN_ERR "Could not allocate reboot_code_buffer\n");
++              goto out;
++      }
++      image->reboot_code_pages = reboot_pages;
++      image->segment[nr_segments].buf = 0;
++      image->segment[nr_segments].bufsz = 0;
++      image->segment[nr_segments].mem = (void *)(page_to_pfn(reboot_pages) << PAGE_SHIFT);
++      image->segment[nr_segments].memsz = KEXEC_REBOOT_CODE_SIZE;
++      image->nr_segments++;
++
++      result = 0;
++ out:
++      if (result == 0) {
++              *rimage = image;
++      } else {
++              kfree(image);
++      }
++      return result;
++}
++
++static int kimage_is_destination_range(
++      struct kimage *image, unsigned long start, unsigned long end)
++{
++      unsigned long i;
++      for(i = 0; i < image->nr_segments; i++) {
++              unsigned long mstart, mend;
++              mstart = (unsigned long)image->segment[i].mem;
++              mend   = mstart + image->segment[i].memsz;
++              if ((end > mstart) && (start < mend)) {
++                      return 1;
++              }
++      }
++      return 0;
++}
++
++#ifdef CONFIG_MMU
++static int identity_map_pages(struct page *pages, int order)
++{
++      struct mm_struct *mm;
++      struct vm_area_struct *vma;
++      int error;
++      mm = &init_mm;
++      vma = 0;
++
++      down_write(&mm->mmap_sem);
++      error = -ENOMEM;
++      vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
++      if (!vma) {
++              goto out;
++      }
++
++      memset(vma, 0, sizeof(vma));
++      vma->vm_mm = mm;
++      vma->vm_start = page_to_pfn(pages) << PAGE_SHIFT;
++      vma->vm_end = vma->vm_start + (1 << (order + PAGE_SHIFT));
++      vma->vm_ops = 0;
++      vma->vm_flags = VM_SHARED \
++              | VM_READ | VM_WRITE | VM_EXEC \
++              | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC \
++              | VM_DONTCOPY | VM_RESERVED;
++      vma->vm_page_prot = protection_map[vma->vm_flags & 0xf];
++      vma->vm_file = NULL;
++      vma->vm_private_data = NULL;
++      INIT_LIST_HEAD(&vma->shared);
++      insert_vm_struct(mm, vma);
++      
++      error = remap_page_range(vma, vma->vm_start, vma->vm_start,
++              vma->vm_end - vma->vm_start, vma->vm_page_prot);
++      if (error) {
++              goto out;
++      }
++
++      error = 0;
++ out:
++      if (error && vma) {
++              kmem_cache_free(vm_area_cachep, vma);
++              vma = 0;
++      }
++      up_write(&mm->mmap_sem);
++
++      return error;
++}
++#else
++#define identity_map_pages(pages, order) 0
++#endif
++
++struct page *kimage_alloc_reboot_code_pages(struct kimage *image)
++{
++      /* The reboot code buffer is special.  It is the only set of
++       * pages that must be allocated in their final resting place,
++       * and the only set of pages whose final resting place we can
++       * pick. 
++       *
++       * At worst this runs in O(N) of the image size.
++       */
++      struct list_head extra_pages, *pos, *next;
++      struct page *pages;
++      unsigned long addr;
++      int order, count;
++      order = get_order(KEXEC_REBOOT_CODE_SIZE);
++      count = 1 << order;
++      INIT_LIST_HEAD(&extra_pages);
++      do {
++              int i;
++              pages = alloc_pages(GFP_HIGHUSER, order);
++              if (!pages)
++                      break;
++              for(i = 0; i < count; i++) {
++                      SetPageReserved(pages +i);
++              }
++              addr = page_to_pfn(pages) << PAGE_SHIFT;
++              if ((page_to_pfn(pages) >= (TASK_SIZE >> PAGE_SHIFT)) ||
++                      kimage_is_destination_range(image, addr, addr + KEXEC_REBOOT_CODE_SIZE)) {
++                      list_add(&pages->list, &extra_pages);
++                      pages = 0;
++              }
++      } while(!pages);
++      if (pages) {
++              int result;
++              result = identity_map_pages(pages, order);
++              if (result < 0) {
++                      list_add(&pages->list, &extra_pages);
++                      pages = 0;
++              }
++      }
++      /* If I could convert a multi page allocation into a buch of
++       * single page allocations I could add these pages to
++       * image->dest_pages.  For now it is simpler to just free the
++       * pages again.
++       */
++      list_for_each_safe(pos, next, &extra_pages) {
++              struct page *page;
++              int i;
++              page = list_entry(pos, struct page, list);
++              for(i = 0; i < count; i++) {
++                      ClearPageReserved(pages +i);
++              }
++              list_del(&extra_pages);
++              __free_pages(page, order);
++      }
++      return pages;
++}
++
++static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
++{
++      if (image->offset != 0) {
++              image->entry++;
++      }
++      if (image->entry == image->last_entry) {
++              kimage_entry_t *ind_page;
++              struct page *page;
++              page = kimage_alloc_page(image, GFP_KERNEL, KIMAGE_NO_DEST);
++              if (!page) {
++                      return -ENOMEM;
++              }
++              ind_page = page_address(page);
++              *image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
++              image->entry = ind_page;
++              image->last_entry = 
++                      ind_page + ((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
++      }
++      *image->entry = entry;
++      image->entry++;
++      image->offset = 0;
++      return 0;
++}
++
++static int kimage_set_destination(
++      struct kimage *image, unsigned long destination) 
++{
++      int result;
++      destination &= PAGE_MASK;
++      result = kimage_add_entry(image, destination | IND_DESTINATION);
++      if (result == 0) {
++              image->destination = destination;
++      }
++      return result;
++}
++
++
++static int kimage_add_page(struct kimage *image, unsigned long page)
++{
++      int result;
++      page &= PAGE_MASK;
++      result = kimage_add_entry(image, page | IND_SOURCE);
++      if (result == 0) {
++              image->destination += PAGE_SIZE;
++      }
++      return result;
++}
++
++
++static void kimage_free_extra_pages(struct kimage *image)
++{
++      /* Walk through and free any extra destination pages I may have */
++      struct list_head *pos, *next;
++      list_for_each_safe(pos, next, &image->dest_pages) {
++              struct page *page;
++              page = list_entry(pos, struct page, list);
++              list_del(&page->list);
++              ClearPageReserved(page);
++              __free_page(page);
++      }
++      /* Walk through and free any unuseable pages I have cached */
++      list_for_each_safe(pos, next, &image->unuseable_pages) {
++              struct page *page;
++              page = list_entry(pos, struct page, list);
++              list_del(&page->list);
++              ClearPageReserved(page);
++              __free_page(page);
++      }
++
++}
++static int kimage_terminate(struct kimage *image)
++{
++      int result;
++      result = kimage_add_entry(image, IND_DONE);
++      if (result == 0) {
++              /* Point at the terminating element */
++              image->entry--;
++              kimage_free_extra_pages(image);
++      }
++      return result;
++}
++
++#define for_each_kimage_entry(image, ptr, entry) \
++      for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
++              ptr = (entry & IND_INDIRECTION)? \
++                      phys_to_virt((entry & PAGE_MASK)): ptr +1)
++
++static void kimage_free(struct kimage *image)
++{
++      kimage_entry_t *ptr, entry;
++      kimage_entry_t ind = 0;
++      int i, count, order;
++      if (!image)
++              return;
++      kimage_free_extra_pages(image);
++      for_each_kimage_entry(image, ptr, entry) {
++              if (entry & IND_INDIRECTION) {
++                      /* Free the previous indirection page */
++                      if (ind & IND_INDIRECTION) {
++                              free_page((unsigned long)phys_to_virt(ind & PAGE_MASK));
++                      }
++                      /* Save this indirection page until we are
++                       * done with it.
++                       */
++                      ind = entry;
++              }
++              else if (entry & IND_SOURCE) {
++                      free_page((unsigned long)phys_to_virt(entry & PAGE_MASK));
++              }
++      }
++      order = get_order(KEXEC_REBOOT_CODE_SIZE);
++      count = 1 << order;
++      do_munmap(&init_mm, 
++              page_to_pfn(image->reboot_code_pages) << PAGE_SHIFT, 
++              count << PAGE_SHIFT);
++      for(i = 0; i < count; i++) {
++              ClearPageReserved(image->reboot_code_pages + i);
++      }
++      __free_pages(image->reboot_code_pages, order);
++      kfree(image);
++}
++
++static kimage_entry_t *kimage_dst_used(struct kimage *image, unsigned long page)
++{
++      kimage_entry_t *ptr, entry;
++      unsigned long destination = 0;
++      for_each_kimage_entry(image, ptr, entry) {
++              if (entry & IND_DESTINATION) {
++                      destination = entry & PAGE_MASK;
++              }
++              else if (entry & IND_SOURCE) {
++                      if (page == destination) {
++                              return ptr;
++                      }
++                      destination += PAGE_SIZE;
++              }
++      }
++      return 0;
++}
++
++static struct page *kimage_alloc_page(struct kimage *image, unsigned int gfp_mask, unsigned long destination)
++{
++      /* Here we implment safe guards to ensure that a source page
++       * is not copied to it's destination page before the data on
++       * the destination page is no longer useful.
++       *
++       * To do this we maintain the invariant that a source page is
++       * either it's own destination page, or it is not a
++       * destination page at all.  
++       *
++       * That is slightly stronger than required, but the proof
++       * that no problems will not occur is trivial, and the
++       * implemenation is simply to verify.
++       *
++       * When allocating all pages normally this algorithm will run
++       * in O(N) time, but in the worst case it will run in O(N^2)
++       * time.   If the runtime is a problem the data structures can
++       * be fixed.
++       */
++      struct page *page;
++      unsigned long addr;
++
++      /* Walk through the list of destination pages, and see if I
++       * have a match.
++       */
++      list_for_each_entry(page, &image->dest_pages, list) {
++              addr = page_to_pfn(page) << PAGE_SHIFT;
++              if (addr == destination) {
++                      list_del(&page->list);
++                      return page;
++              }
++      }
++      page = 0;
++      while(1) {
++              kimage_entry_t *old;
++              /* Allocate a page, if we run out of memory give up */
++              page = alloc_page(gfp_mask);
++              if (!page) {
++                      return 0;
++              }
++              SetPageReserved(page);
++              /* If the page cannot be used file it away */
++              if (page_to_pfn(page) > (KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
++                      list_add(&page->list, &image->unuseable_pages);
++                      continue;
++              }
++              addr = page_to_pfn(page) << PAGE_SHIFT;
++
++              /* If it is the destination page we want use it */
++              if (addr == destination)
++                      break;
++
++              /* If the page is not a destination page use it */
++              if (!kimage_is_destination_range(image, addr, addr + PAGE_SIZE))
++                      break;
++
++              /* I know that the page is someones destination page.
++               * See if there is already a source page for this
++               * destination page.  And if so swap the source pages.
++               */
++              old = kimage_dst_used(image, addr);
++              if (old) {
++                      /* If so move it */
++                      unsigned long old_addr;
++                      struct page *old_page;
++                      
++                      old_addr = *old & PAGE_MASK;
++                      old_page = pfn_to_page(old_addr >> PAGE_SHIFT);
++                      copy_highpage(page, old_page);
++                      *old = addr | (*old & ~PAGE_MASK);
++
++                      /* The old page I have found cannot be a
++                       * destination page, so return it.
++                       */
++                      addr = old_addr;
++                      page = old_page;
++                      break;
++              }
++              else {
++                      /* Place the page on the destination list I
++                       * will use it later.
++                       */
++                      list_add(&page->list, &image->dest_pages);
++              }
++      }
++      return page;
++}
++
++static int kimage_load_segment(struct kimage *image,
++      struct kexec_segment *segment)
++{     
++      unsigned long mstart;
++      int result;
++      unsigned long offset;
++      unsigned long offset_end;
++      unsigned char *buf;
++
++      result = 0;
++      buf = segment->buf;
++      mstart = (unsigned long)segment->mem;
++
++      offset_end = segment->memsz;
++
++      result = kimage_set_destination(image, mstart);
++      if (result < 0) {
++              goto out;
++      }
++      for(offset = 0;  offset < segment->memsz; offset += PAGE_SIZE) {
++              struct page *page;
++              char *ptr;
++              size_t size, leader;
++              page = kimage_alloc_page(image, GFP_HIGHUSER, mstart + offset);
++              if (page == 0) {
++                      result  = -ENOMEM;
++                      goto out;
++              }
++              result = kimage_add_page(image, page_to_pfn(page) << PAGE_SHIFT);
++              if (result < 0) {
++                      goto out;
++              }
++              ptr = kmap(page);
++              if (segment->bufsz < offset) {
++                      /* We are past the end zero the whole page */
++                      memset(ptr, 0, PAGE_SIZE);
++                      kunmap(page);
++                      continue;
++              }
++              size = PAGE_SIZE;
++              leader = 0;
++              if ((offset == 0)) {
++                      leader = mstart & ~PAGE_MASK;
++              }
++              if (leader) {
++                      /* We are on the first page zero the unused portion */
++                      memset(ptr, 0, leader);
++                      size -= leader;
++                      ptr += leader;
++              }
++              if (size > (segment->bufsz - offset)) {
++                      size = segment->bufsz - offset;
++              }
++              if (size < (PAGE_SIZE - leader)) {
++                      /* zero the trailing part of the page */
++                      memset(ptr + size, 0, (PAGE_SIZE - leader) - size);
++              }
++              result = copy_from_user(ptr, buf + offset, size);
++              kunmap(page);
++              if (result) {
++                      result = (result < 0)?result : -EIO;
++                      goto out;
++              }
++      }
++ out:
++      return result;
++}
++
++/*
++ * Exec Kernel system call: for obvious reasons only root may call it.
++ * 
++ * This call breaks up into three pieces.  
++ * - A generic part which loads the new kernel from the current
++ *   address space, and very carefully places the data in the
++ *   allocated pages.
++ *
++ * - A generic part that interacts with the kernel and tells all of
++ *   the devices to shut down.  Preventing on-going dmas, and placing
++ *   the devices in a consistent state so a later kernel can
++ *   reinitialize them.
++ *
++ * - A machine specific part that includes the syscall number
++ *   and the copies the image to it's final destination.  And
++ *   jumps into the image at entry.
++ *
++ * kexec does not sync, or unmount filesystems so if you need
++ * that to happen you need to do that yourself.
++ */
++struct kimage *kexec_image = 0;
++
++asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, 
++      struct kexec_segment *segments, unsigned long flags)
++{
++      struct kimage *image;
++      int result;
++              
++      /* We only trust the superuser with rebooting the system. */
++      if (!capable(CAP_SYS_ADMIN))
++              return -EPERM;
++
++      /* In case we need just a little bit of special behavior for
++       * reboot on panic 
++       */
++      if (flags != 0)
++              return -EINVAL;
++
++      if (nr_segments > KEXEC_SEGMENT_MAX)
++              return -EINVAL;
++      image = 0;
++
++      result = 0;
++      if (nr_segments > 0) {
++              unsigned long i;
++              result = kimage_alloc(&image, nr_segments, segments);
++              if (result) {
++                      goto out;
++              }
++              image->start = entry;
++              for(i = 0; i < nr_segments; i++) {
++                      result = kimage_load_segment(image, &segments[i]);
++                      if (result) {
++                              goto out;
++                      }
++              }
++              result = kimage_terminate(image);
++              if (result) {
++                      goto out;
++              }
++      }
++
++      image = xchg(&kexec_image, image);
++
++ out:
++      kimage_free(image);
++      return result;
++}
+--- linux-2.6.0-test1/kernel/sys.c~kexec-2.6.0-full    2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/sys.c       2003-07-22 00:54:04.000000000 -0600
+@@ -17,6 +17,7 @@
+ #include <linux/init.h>
+ #include <linux/highuid.h>
+ #include <linux/fs.h>
++#include <linux/kexec.h>
+ #include <linux/workqueue.h>
+ #include <linux/device.h>
+ #include <linux/times.h>
+@@ -208,6 +209,7 @@ cond_syscall(sys_acct)
+ cond_syscall(sys_lookup_dcookie)
+ cond_syscall(sys_swapon)
+ cond_syscall(sys_swapoff)
++cond_syscall(sys_kexec_load)
+ cond_syscall(sys_init_module)
+ cond_syscall(sys_delete_module)
+ cond_syscall(sys_socketpair)
+@@ -454,6 +456,27 @@ asmlinkage long sys_reboot(int magic1, i
+               machine_restart(buffer);
+               break;
++#ifdef CONFIG_KEXEC
++      case LINUX_REBOOT_CMD_KEXEC:
++      {
++              struct kimage *image;
++              if (arg) {
++                      unlock_kernel();
++                      return -EINVAL;
++              }
++              image = xchg(&kexec_image, 0);
++              if (!image) {
++                      unlock_kernel();
++                      return -EINVAL;
++              }
++              notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL);
++              system_running = 0;
++              device_shutdown();
++              printk(KERN_EMERG "Starting new kernel\n");
++              machine_kexec(image);
++              break;
++      }
++#endif
+ #ifdef CONFIG_SOFTWARE_SUSPEND
+       case LINUX_REBOOT_CMD_SW_SUSPEND:
+               if (!software_suspend_enabled) {
+
+_
diff --git a/lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch b/lustre/kernel_patches/patches/lkcd-kernel-changes-2.6.0-test1.patch
new file mode 100644 (file)
index 0000000..6b09ba1
--- /dev/null
@@ -0,0 +1,588 @@
+ arch/i386/Kconfig                           |   50 ++++++++++++++++++++++++++++
+ arch/i386/boot/Makefile                     |    1 
+ arch/i386/kernel/i386_ksyms.c               |   19 ++++++++++
+ arch/i386/kernel/nmi.c                      |    2 +
+ arch/i386/kernel/setup.c                    |    6 +++
+ arch/i386/kernel/smp.c                      |   16 +++++++-
+ arch/i386/kernel/traps.c                    |    2 +
+ arch/i386/mm/init.c                         |    6 +++
+ arch/s390/boot/Makefile                     |    2 -
+ arch/s390/boot/install.sh                   |   24 +++++++++----
+ drivers/Makefile                            |    1 
+ include/asm-i386/kmap_types.h               |    5 +-
+ include/asm-i386/mach-default/irq_vectors.h |    1 
+ include/asm-i386/smp.h                      |    1 
+ include/linux/major.h                       |    2 +
+ init/Makefile                               |    4 ++
+ init/main.c                                 |   10 +++++
+ init/version.c                              |    4 ++
+ kernel/ksyms.c                              |    8 ++++
+ kernel/panic.c                              |   17 +++++++++
+ kernel/sched.c                              |   22 ++++++++++++
+ lib/Kconfig                                 |   10 +++--
+ mm/page_alloc.c                             |    3 +
+ scripts/mkcompile_h                         |    4 +-
+ 24 files changed, 202 insertions(+), 18 deletions(-)
+
+--- linux-2.6.0-test1/drivers/Makefile~lkcd-kernel-changes-2.6.0-test1 2003-07-13 21:37:15.000000000 -0600
++++ linux-2.6.0-test1-braam/drivers/Makefile   2003-07-22 00:52:14.000000000 -0600
+@@ -49,3 +49,4 @@ obj-$(CONFIG_ISDN_BOOL)              += isdn/
+ obj-$(CONFIG_MCA)             += mca/
+ obj-$(CONFIG_EISA)            += eisa/
+ obj-$(CONFIG_CPU_FREQ)                += cpufreq/
++obj-$(CONFIG_CRASH_DUMP)      += dump/
+--- linux-2.6.0-test1/include/linux/major.h~lkcd-kernel-changes-2.6.0-test1    2003-07-13 21:31:58.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/major.h      2003-07-22 00:52:14.000000000 -0600
+@@ -157,6 +157,8 @@
+ #define OSST_MAJOR            206     /* OnStream-SCx0 SCSI tape */
++#define CRASH_DUMP_MAJOR      221     /* crash dump interface */
++
+ #define IBM_TTY3270_MAJOR     227
+ #define IBM_FS3270_MAJOR      228
+--- linux-2.6.0-test1/include/asm-i386/mach-default/irq_vectors.h~lkcd-kernel-changes-2.6.0-test1      2003-07-13 21:31:59.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/mach-default/irq_vectors.h        2003-07-22 00:52:14.000000000 -0600
+@@ -48,6 +48,7 @@
+ #define INVALIDATE_TLB_VECTOR 0xfd
+ #define RESCHEDULE_VECTOR     0xfc
+ #define CALL_FUNCTION_VECTOR  0xfb
++#define DUMP_VECTOR           0xfa
+ #define THERMAL_APIC_VECTOR   0xf0
+ /*
+--- linux-2.6.0-test1/include/asm-i386/kmap_types.h~lkcd-kernel-changes-2.6.0-test1    2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/kmap_types.h      2003-07-22 00:53:23.000000000 -0600
+@@ -1,4 +1,4 @@
+-#ifndef _ASM_KMAP_TYPES_H
++22#ifndef _ASM_KMAP_TYPES_H
+ #define _ASM_KMAP_TYPES_H
+ #include <linux/config.h>
+@@ -26,7 +26,8 @@ D(12)        KM_IRQ0,
+ D(13) KM_IRQ1,
+ D(14) KM_SOFTIRQ0,
+ D(15) KM_SOFTIRQ1,
+-D(16) KM_TYPE_NR
++D(16) KM_DUMP
++D(17) KM_TYPE_NR
+ };
+ #undef D
+--- linux-2.6.0-test1/include/asm-i386/smp.h~lkcd-kernel-changes-2.6.0-test1   2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/include/asm-i386/smp.h     2003-07-22 00:52:14.000000000 -0600
+@@ -38,6 +38,7 @@ extern int smp_num_siblings;
+ extern int cpu_sibling_map[];
+ extern void smp_flush_tlb(void);
++extern void dump_send_ipi(void);
+ extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs);
+ extern void smp_send_reschedule(int cpu);
+ extern void smp_invalidate_rcv(void);         /* Process an NMI */
+--- linux-2.6.0-test1/arch/i386/kernel/i386_ksyms.c~lkcd-kernel-changes-2.6.0-test1    2003-07-13 21:39:21.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/i386_ksyms.c      2003-07-22 00:52:14.000000000 -0600
+@@ -16,6 +16,7 @@
+ #include <linux/tty.h>
+ #include <linux/highmem.h>
+ #include <linux/time.h>
++#include <linux/nmi.h>
+ #include <asm/semaphore.h>
+ #include <asm/processor.h>
+@@ -33,6 +34,7 @@
+ #include <asm/tlbflush.h>
+ #include <asm/nmi.h>
+ #include <asm/edd.h>
++#include <asm/e820.h>
+ extern void dump_thread(struct pt_regs *, struct user *);
+ extern spinlock_t rtc_lock;
+@@ -209,3 +211,20 @@ EXPORT_SYMBOL(kmap_atomic_to_page);
+ EXPORT_SYMBOL(edd);
+ EXPORT_SYMBOL(eddnr);
+ #endif
++
++#ifdef CONFIG_CRASH_DUMP_MODULE
++#ifdef CONFIG_SMP
++extern irq_desc_t irq_desc[NR_IRQS];
++extern unsigned long irq_affinity[NR_IRQS];
++extern void stop_this_cpu(void *);
++EXPORT_SYMBOL(irq_desc);
++EXPORT_SYMBOL(irq_affinity);
++EXPORT_SYMBOL(stop_this_cpu);
++EXPORT_SYMBOL(dump_send_ipi);
++#endif
++extern int pfn_is_ram(unsigned long);
++EXPORT_SYMBOL(pfn_is_ram);
++#ifdef ARCH_HAS_NMI_WATCHDOG
++EXPORT_SYMBOL(touch_nmi_watchdog);
++#endif
++#endif
+--- linux-2.6.0-test1/arch/i386/kernel/nmi.c~lkcd-kernel-changes-2.6.0-test1   2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/nmi.c     2003-07-22 00:52:14.000000000 -0600
+@@ -24,6 +24,7 @@
+ #include <linux/kernel_stat.h>
+ #include <linux/module.h>
+ #include <linux/nmi.h>
++#include <linux/dump.h>
+ #include <linux/sysdev.h>
+ #include <asm/smp.h>
+@@ -449,6 +450,7 @@ void nmi_watchdog_tick (struct pt_regs *
+                       bust_spinlocks(1);
+                       printk("NMI Watchdog detected LOCKUP on CPU%d, eip %08lx, registers:\n", cpu, regs->eip);
+                       show_registers(regs);
++                      dump("NMI Watchdog detected LOCKUP", regs);
+                       printk("console shuts up ...\n");
+                       console_silent();
+                       spin_unlock(&nmi_print_lock);
+--- linux-2.6.0-test1/arch/i386/kernel/setup.c~lkcd-kernel-changes-2.6.0-test1 2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/setup.c   2003-07-22 00:52:14.000000000 -0600
+@@ -439,6 +439,7 @@ static void __init setup_memory_region(v
+       print_memory_map(who);
+ } /* setup_memory_region */
++unsigned long crashdump_addr = 0xdeadbeef;
+ static void __init parse_cmdline_early (char ** cmdline_p)
+ {
+@@ -532,6 +533,9 @@ static void __init parse_cmdline_early (
+               if (c == ' ' && !memcmp(from, "highmem=", 8))
+                       highmem_pages = memparse(from+8, &from) >> PAGE_SHIFT;
+       
++              if (c == ' ' && !memcmp(from, "crashdump=", 10))
++                      crashdump_addr = memparse(from+10, &from); 
++                      
+               c = *(from++);
+               if (!c)
+                       break;
+@@ -914,6 +918,8 @@ static int __init noreplacement_setup(ch
+ __setup("noreplacement", noreplacement_setup); 
++extern void crashdump_reserve(void);
++
+ void __init setup_arch(char **cmdline_p)
+ {
+       unsigned long max_low_pfn;
+--- linux-2.6.0-test1/arch/i386/kernel/smp.c~lkcd-kernel-changes-2.6.0-test1   2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/smp.c     2003-07-22 00:52:14.000000000 -0600
+@@ -19,6 +19,7 @@
+ #include <linux/mc146818rtc.h>
+ #include <linux/cache.h>
+ #include <linux/interrupt.h>
++#include <linux/dump.h>
+ #include <asm/mtrr.h>
+ #include <asm/pgalloc.h>
+@@ -144,6 +145,13 @@ inline void __send_IPI_shortcut(unsigned
+        */
+       cfg = __prepare_ICR(shortcut, vector);
++      if (vector == DUMP_VECTOR) {
++              /*
++               * Setup DUMP IPI to be delivered as an NMI
++               */
++              cfg = (cfg&~APIC_VECTOR_MASK)|APIC_DM_NMI;
++      }
++
+       /*
+        * Send the IPI. The write to APIC_ICR fires this off.
+        */
+@@ -467,6 +475,11 @@ void flush_tlb_all(void)
+       on_each_cpu(do_flush_tlb_all, 0, 1, 1);
+ }
++void dump_send_ipi(void)
++{
++      send_IPI_allbutself(DUMP_VECTOR);
++}
++
+ /*
+  * this function sends a 'reschedule' IPI to another CPU.
+  * it goes straight through and wastes no time serializing
+@@ -555,7 +568,7 @@ int smp_call_function (void (*func) (voi
+       return 0;
+ }
+-static void stop_this_cpu (void * dummy)
++void stop_this_cpu (void * dummy)
+ {
+       /*
+        * Remove this CPU:
+@@ -616,4 +629,3 @@ asmlinkage void smp_call_function_interr
+               atomic_inc(&call_data->finished);
+       }
+ }
+-
+--- linux-2.6.0-test1/arch/i386/kernel/traps.c~lkcd-kernel-changes-2.6.0-test1 2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/kernel/traps.c   2003-07-22 00:52:14.000000000 -0600
+@@ -25,6 +25,7 @@
+ #include <linux/highmem.h>
+ #include <linux/kallsyms.h>
+ #include <linux/ptrace.h>
++#include <linux/dump.h>
+ #ifdef CONFIG_EISA
+ #include <linux/ioport.h>
+@@ -322,6 +323,7 @@ void die(const char * str, struct pt_reg
+ #endif
+       CHK_REMOTE_DEBUG(0,SIGTRAP,err,regs,)
+       show_registers(regs);
++      dump((char *)str, regs);
+       bust_spinlocks(0);
+       spin_unlock_irq(&die_lock);
+       if (in_interrupt())
+--- linux-2.6.0-test1/arch/i386/mm/init.c~lkcd-kernel-changes-2.6.0-test1      2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/mm/init.c        2003-07-22 00:52:14.000000000 -0600
+@@ -186,6 +186,12 @@ static inline int page_is_ram(unsigned l
+       return 0;
+ }
++/* To enable modules to check if a page is in RAM */
++int pfn_is_ram(unsigned long pfn)
++{
++      return (page_is_ram(pfn));
++}
++
+ #ifdef CONFIG_HIGHMEM
+ pte_t *kmap_pte;
+ pgprot_t kmap_prot;
+--- linux-2.6.0-test1/arch/i386/boot/Makefile~lkcd-kernel-changes-2.6.0-test1  2003-07-13 21:33:11.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/boot/Makefile    2003-07-22 00:52:14.000000000 -0600
+@@ -101,3 +101,4 @@ zlilo: $(BOOTIMAGE)
+ install: $(BOOTIMAGE)
+       sh $(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
++      if [ -f init/kerntypes.o ]; then cp init/kerntypes.o $(INSTALL_PATH)/Kerntypes; fi
+--- linux-2.6.0-test1/arch/i386/Kconfig~lkcd-kernel-changes-2.6.0-test1        2003-07-22 00:46:03.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/i386/Kconfig  2003-07-22 00:52:14.000000000 -0600
+@@ -1297,6 +1297,56 @@ source "arch/i386/oprofile/Kconfig"
+ menu "Kernel hacking"
++config CRASH_DUMP
++      tristate "Crash dump support (EXPERIMENTAL)"
++      depends on EXPERIMENTAL
++      default n
++      ---help---
++        Say Y here to enable saving an image of system memory when a panic
++        or other error occurs. Dumps can also be forced with the SysRq+d
++        key if MAGIC_SYSRQ is enabled.
++
++config CRASH_DUMP_BLOCKDEV
++      tristate "Crash dump block device driver"
++      depends on CRASH_DUMP
++      help
++        Say Y to allow saving crash dumps directly to a disk device.
++
++config CRASH_DUMP_NETDEV
++      tristate "Crash dump network device driver"
++      depends on CRASH_DUMP
++      help
++        Say Y to allow saving crash dumps over a network device.
++
++config CRASH_DUMP_MEMDEV
++      bool "Crash dump staged memory driver"
++      depends on CRASH_DUMP
++      help
++        Say Y to allow intermediate saving crash dumps in spare 
++        memory pages which would then be written out to disk
++        later.
++
++config CRASH_DUMP_SOFTBOOT
++      bool "Save crash dump across a soft reboot"
++      depends on CRASH_DUMP_MEMDEV
++      help
++        Say Y to allow a crash dump to be preserved in memory
++        pages across a soft reboot and written out to disk
++        thereafter. For this to work, CRASH_DUMP must be 
++        configured as part of the kernel (not as a module).
++
++config CRASH_DUMP_COMPRESS_RLE
++      tristate "Crash dump RLE compression"
++      depends on CRASH_DUMP
++      help
++        Say Y to allow saving dumps with Run Length Encoding compression.
++
++config CRASH_DUMP_COMPRESS_GZIP
++      tristate "Crash dump GZIP compression"
++      depends on CRASH_DUMP
++      help
++        Say Y to allow saving dumps with Gnu Zip compression.
++
+ config DEBUG_KERNEL
+       bool "Kernel debugging"
+       help
+--- linux-2.6.0-test1/arch/s390/boot/Makefile~lkcd-kernel-changes-2.6.0-test1  2003-07-13 21:39:33.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/s390/boot/Makefile    2003-07-22 00:52:14.000000000 -0600
+@@ -16,4 +16,4 @@ $(obj)/image: vmlinux FORCE
+ install: $(CONFIGURE) $(obj)/image
+       sh -x $(obj)/install.sh $(KERNELRELEASE) $(obj)/image \
+-            System.map Kerntypes "$(INSTALL_PATH)"
++            System.map init/kerntypes.o "$(INSTALL_PATH)"
+--- linux-2.6.0-test1/arch/s390/boot/install.sh~lkcd-kernel-changes-2.6.0-test1        2003-07-13 21:35:17.000000000 -0600
++++ linux-2.6.0-test1-braam/arch/s390/boot/install.sh  2003-07-22 00:52:14.000000000 -0600
+@@ -16,7 +16,8 @@
+ #   $1 - kernel version
+ #   $2 - kernel image file
+ #   $3 - kernel map file
+-#   $4 - default install path (blank if root directory)
++#   $4 - kernel type file
++#   $5 - default install path (blank if root directory)
+ #
+ # User may have a custom install script
+@@ -26,13 +27,22 @@ if [ -x /sbin/installkernel ]; then exec
+ # Default install - same as make zlilo
+-if [ -f $4/vmlinuz ]; then
+-      mv $4/vmlinuz $4/vmlinuz.old
++if [ -f $5/vmlinuz ]; then
++      mv $5/vmlinuz $5/vmlinuz.old
+ fi
+-if [ -f $4/System.map ]; then
+-      mv $4/System.map $4/System.old
++if [ -f $5/System.map ]; then
++      mv $5/System.map $5/System.old
+ fi
+-cat $2 > $4/vmlinuz
+-cp $3 $4/System.map
++if [ -f $5/Kerntypes ]; then
++      mv $5/Kerntypes $5/Kerntypes.old
++fi
++
++cat $2 > $5/vmlinuz
++cp $3 $5/System.map
++
++# copy the kernel type file if it exists
++if [ -f $4 ]; then
++      cp $4 $5/Kerntypes
++fi
+--- linux-2.6.0-test1/scripts/mkcompile_h~lkcd-kernel-changes-2.6.0-test1      2003-07-13 21:39:36.000000000 -0600
++++ linux-2.6.0-test1-braam/scripts/mkcompile_h        2003-07-22 00:52:14.000000000 -0600
+@@ -33,7 +33,7 @@ UTS_VERSION="$UTS_VERSION `LANG=C date`"
+ UTS_LEN=64
+ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}\).*/\1/"
+-
++LINUX_COMPILE_VERSION_ID="__linux_compile_version_id__`hostname | tr -c '[0-9A-Za-z\n]' '__'`_`LANG=C date | tr -c '[0-9A-Za-z\n]' '_'`"
+ # Generate a temporary compile.h
+ ( echo /\* This file is auto generated, version $VERSION \*/
+@@ -55,6 +55,8 @@ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}
+   fi
+   echo \#define LINUX_COMPILER \"`$CC -v 2>&1 | tail -1`\"
++  echo \#define LINUX_COMPILE_VERSION_ID $LINUX_COMPILE_VERSION_ID
++  echo \#define LINUX_COMPILE_VERSION_ID_TYPE typedef char* "$LINUX_COMPILE_VERSION_ID""_t"
+ ) > .tmpcompile
+ # Only replace the real compile.h if the new one is different,
+--- linux-2.6.0-test1/kernel/ksyms.c~lkcd-kernel-changes-2.6.0-test1   2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/ksyms.c     2003-07-22 00:52:14.000000000 -0600
+@@ -60,6 +60,8 @@
+ #include <linux/backing-dev.h>
+ #include <linux/percpu_counter.h>
+ #include <asm/checksum.h>
++#include <linux/dump.h>
++#include <linux/bootmem.h>
+ #if defined(CONFIG_PROC_FS)
+ #include <linux/proc_fs.h>
+@@ -627,3 +629,9 @@ EXPORT_SYMBOL(ptrace_notify);
+ EXPORT_SYMBOL(console_printk);
+ EXPORT_SYMBOL(current_kernel_time);
++
++#ifdef CONFIG_CRASH_DUMP_MODULE
++EXPORT_SYMBOL(min_low_pfn);
++EXPORT_SYMBOL(dump_oncpu);
++EXPORT_SYMBOL(dump_function_ptr);
++#endif
+--- linux-2.6.0-test1/kernel/panic.c~lkcd-kernel-changes-2.6.0-test1   2003-07-13 21:38:38.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/panic.c     2003-07-22 00:52:14.000000000 -0600
+@@ -16,12 +16,16 @@
+ #include <linux/init.h>
+ #include <linux/sysrq.h>
+ #include <linux/interrupt.h>
++#ifdef CONFIG_KEXEC
++#include <linux/kexec.h>
++#endif
+ asmlinkage void sys_sync(void);       /* it's really int */
+ int panic_timeout;
+ int panic_on_oops;
+ int tainted;
++void (*dump_function_ptr)(const char *, const struct pt_regs *) = 0;
+ struct notifier_block *panic_notifier_list;
+@@ -54,6 +58,7 @@ NORET_TYPE void panic(const char * fmt, 
+       va_start(args, fmt);
+       vsnprintf(buf, sizeof(buf), fmt, args);
+       va_end(args);
++
+       printk(KERN_EMERG "Kernel panic: %s\n",buf);
+       if (in_interrupt())
+               printk(KERN_EMERG "In interrupt handler - not syncing\n");
+@@ -76,6 +81,18 @@ NORET_TYPE void panic(const char * fmt, 
+                * We can't use the "normal" timers since we just panicked..
+                */
+               printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout);
++#ifdef CONFIG_KEXEC
++{
++              struct kimage *image;
++              image = xchg(&kexec_image, 0);
++              if (image) {
++                      printk(KERN_EMERG "by starting a new kernel ..\n");
++                      mdelay(panic_timeout*1000);
++                      machine_kexec(image);
++              }
++}
++#endif
++
+               mdelay(panic_timeout*1000);
+               /*
+                *      Should we run the reboot notifier. For the moment Im
+--- linux-2.6.0-test1/kernel/sched.c~lkcd-kernel-changes-2.6.0-test1   2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/sched.c     2003-07-22 00:52:14.000000000 -0600
+@@ -41,6 +41,9 @@
+ #define cpu_to_node_mask(cpu) (cpu_online_map)
+ #endif
++/* used to soft spin in sched while dump is in progress */
++int dump_oncpu;
++
+ /*
+  * Convert user-nice values [ -20 ... 0 ... 19 ]
+  * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],
+@@ -1335,6 +1338,15 @@ asmlinkage void schedule(void)
+       struct list_head *queue;
+       int idx;
++      /*
++       * If crash dump is in progress, this other cpu's
++       * need to wait until it completes.
++       * NB: this code is optimized away for kernels without
++       * dumping enabled.
++       */
++      if (unlikely(dump_oncpu))
++              goto dump_scheduling_disabled;
++
+       /*
+        * Test if we are atomic.  Since do_exit() needs to call into
+        * schedule() atomically, we ignore that path for now.
+@@ -1422,6 +1434,16 @@ switch_tasks:
+       preempt_enable_no_resched();
+       if (test_thread_flag(TIF_NEED_RESCHED))
+               goto need_resched;
++
++      return;
++
++ dump_scheduling_disabled:
++      /* allow scheduling only if this is the dumping cpu */
++      if (dump_oncpu != smp_processor_id()+1) {
++              while (dump_oncpu)
++                      cpu_relax();
++      }
++      return;
+ }
+ #ifdef CONFIG_PREEMPT
+--- linux-2.6.0-test1/lib/Kconfig~lkcd-kernel-changes-2.6.0-test1      2003-07-13 21:34:43.000000000 -0600
++++ linux-2.6.0-test1-braam/lib/Kconfig        2003-07-22 00:52:14.000000000 -0600
+@@ -17,14 +17,16 @@ config CRC32
+ #
+ config ZLIB_INFLATE
+       tristate
+-      default y if CRAMFS=y || PPP_DEFLATE=y || JFFS2_FS=y || ZISOFS_FS=y || BINFMT_ZFLAT=y || CRYPTO_DEFLATE=y
+-      default m if CRAMFS=m || PPP_DEFLATE=m || JFFS2_FS=m || ZISOFS_FS=m || BINFMT_ZFLAT=m || CRYPTO_DEFLATE=m
++      default y if CRAMFS=y || PPP_DEFLATE=y || JFFS2_FS=y || ZISOFS_FS=y || BINFMT_ZFLAT=y || CRYPTO_DEFLATE=y || CRASH_DUMP_COMPRESS_GZIP=y
++      default m if CRAMFS=m || PPP_DEFLATE=m || JFFS2_FS=m || ZISOFS_FS=m || BINFMT_ZFLAT=m || CRYPTO_DEFLATE=m || CRASH_DUMP_COMPRESS_GZIP=m
+ config ZLIB_DEFLATE
+       tristate
+       default m if PPP_DEFLATE!=y && JFFS2_FS!=y && CRYPTO_DEFLATE!=y && \
+-              (PPP_DEFLATE=m || JFFS2_FS=m || CRYPTO_DEFLATE=m)
+-      default y if PPP_DEFLATE=y || JFFS2_FS=y || CRYPTO_DEFLATE=y
++              (PPP_DEFLATE=m || JFFS2_FS=m || CRYPTO_DEFLATE=m \
++                      || CRASH_DUMP_COMPRESS_GZIP=m )
++      default y if PPP_DEFLATE=y || JFFS2_FS=y || CRYPTO_DEFLATE=y \
++              || CRASH_DUMP_COMPRESS_GZIP=y
+ endmenu
+--- linux-2.6.0-test1/mm/page_alloc.c~lkcd-kernel-changes-2.6.0-test1  2003-07-13 21:30:01.000000000 -0600
++++ linux-2.6.0-test1-braam/mm/page_alloc.c    2003-07-22 00:52:14.000000000 -0600
+@@ -89,7 +89,8 @@ static void bad_page(const char *functio
+       page->mapping = NULL;
+ }
+-#ifndef CONFIG_HUGETLB_PAGE
++#if !defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_CRASH_DUMP) \
++      && !defined(CONFIG_CRASH_DUMP_MODULE)
+ #define prep_compound_page(page, order) do { } while (0)
+ #define destroy_compound_page(page, order) do { } while (0)
+ #else
+--- linux-2.6.0-test1/init/Makefile~lkcd-kernel-changes-2.6.0-test1    2003-07-13 21:33:12.000000000 -0600
++++ linux-2.6.0-test1-braam/init/Makefile      2003-07-22 00:52:14.000000000 -0600
+@@ -9,6 +9,9 @@ mounts-$(CONFIG_BLK_DEV_RAM)   += do_mount
+ mounts-$(CONFIG_BLK_DEV_INITRD)       += do_mounts_initrd.o
+ mounts-$(CONFIG_BLK_DEV_MD)   += do_mounts_md.o
++extra-$(CONFIG_CRASH_DUMP)    += kerntypes.o
++CFLAGS_kerntypes.o            := -gstabs
++
+ # files to be removed upon make clean
+ clean-files := ../include/linux/compile.h
+@@ -24,3 +27,4 @@ $(obj)/version.o: include/linux/compile.
+ include/linux/compile.h: FORCE
+       @echo '  CHK     $@'
+       @sh $(srctree)/scripts/mkcompile_h $@ "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CC) $(CFLAGS)"
++
+--- linux-2.6.0-test1/init/main.c~lkcd-kernel-changes-2.6.0-test1      2003-07-22 00:46:07.000000000 -0600
++++ linux-2.6.0-test1-braam/init/main.c        2003-07-22 00:52:14.000000000 -0600
+@@ -100,6 +100,16 @@ extern void ipc_init(void);
+ int system_running = 0;
+ /*
++ * The kernel_magic value represents the address of _end, which allows
++ * namelist tools to "match" each other respectively.  That way a tool
++ * that looks at /dev/mem can verify that it is using the right System.map
++ * file -- if kernel_magic doesn't equal the namelist value of _end,
++ * something's wrong.
++ */
++extern unsigned long _end;
++unsigned long *kernel_magic = &_end;
++
++/*
+  * Boot command-line arguments
+  */
+ #define MAX_INIT_ARGS 8
+--- linux-2.6.0-test1/init/version.c~lkcd-kernel-changes-2.6.0-test1   2003-07-13 21:34:03.000000000 -0600
++++ linux-2.6.0-test1-braam/init/version.c     2003-07-22 00:52:14.000000000 -0600
+@@ -10,6 +10,7 @@
+ #include <linux/uts.h>
+ #include <linux/utsname.h>
+ #include <linux/version.h>
++#include <linux/stringify.h>
+ #define version(a) Version_ ## a
+ #define version_string(a) version(a)
+@@ -28,3 +29,6 @@ struct new_utsname system_utsname = {
+ const char *linux_banner = 
+       "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
+       LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
++
++const char *LINUX_COMPILE_VERSION_ID = __stringify(LINUX_COMPILE_VERSION_ID);
++LINUX_COMPILE_VERSION_ID_TYPE;
+
+_
diff --git a/lustre/kernel_patches/patches/vfs_intent_2.6.0-test1.patch b/lustre/kernel_patches/patches/vfs_intent_2.6.0-test1.patch
new file mode 100644 (file)
index 0000000..96a0839
--- /dev/null
@@ -0,0 +1,764 @@
+ fs/exec.c              |   18 +++++++---
+ fs/namei.c             |   81 +++++++++++++++++++++++++++++++++++++++++++++----
+ fs/namespace.c         |    2 +
+ fs/open.c              |   64 +++++++++++++++++++++++++-------------
+ fs/stat.c              |   28 ++++++++++++----
+ fs/sysfs/inode.c       |    2 -
+ include/linux/dcache.h |    3 +
+ include/linux/fs.h     |    7 ++++
+ include/linux/namei.h  |   59 ++++++++++++++++++++++++++++++++---
+ kernel/ksyms.c         |    8 ++++
+ net/sunrpc/rpc_pipe.c  |    6 +--
+ net/unix/af_unix.c     |    2 -
+ 12 files changed, 228 insertions(+), 52 deletions(-)
+
+--- linux-2.6.0-test1/fs/sysfs/inode.c~vfs_intent_2.6.0-test1  2003-07-13 21:37:23.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/sysfs/inode.c   2003-07-16 17:32:36.000000000 -0600
+@@ -81,7 +81,7 @@ struct dentry * sysfs_get_dentry(struct 
+       qstr.name = name;
+       qstr.len = strlen(name);
+       qstr.hash = full_name_hash(name,qstr.len);
+-      return lookup_hash(&qstr,parent);
++      return lookup_hash(&qstr,parent, NULL);
+ }
+ void sysfs_hash_and_remove(struct dentry * dir, const char * name)
+--- linux-2.6.0-test1/fs/exec.c~vfs_intent_2.6.0-test1 2003-07-16 17:19:46.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/exec.c  2003-07-16 18:42:40.000000000 -0600
+@@ -116,8 +116,11 @@ asmlinkage long sys_uselib(const char __
+       struct file * file;
+       struct nameidata nd;
+       int error;
++        intent_init(&nd.intent, IT_OPEN);
++  
++      error = user_path_walk_it(library, &nd);
+-      nd.intent.open.flags = O_RDONLY;
++      nd.intent.intent.open.flags = O_RDONLY;
+       error = __user_walk(library, LOOKUP_FOLLOW|LOOKUP_OPEN, &nd);
+       if (error)
+               goto out;
+@@ -130,7 +133,7 @@ asmlinkage long sys_uselib(const char __
+       if (error)
+               goto exit;
+-      file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++      file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &nd.intent);
+       error = PTR_ERR(file);
+       if (IS_ERR(file))
+               goto out;
+@@ -457,8 +460,13 @@ static inline void free_arg_pages(struct
+ struct file *open_exec(const char *name)
+ {
+       struct nameidata nd;
+-      int err = path_lookup(name, LOOKUP_FOLLOW, &nd);
+-      struct file *file = ERR_PTR(err);
++      int err;
++      struct file *file;
++         
++        intent_init(&nd.intent, IT_OPEN);
++        nd.intent.intent.open.flags = O_RDONLY;
++        err = path_lookup(name, LOOKUP_FOLLOW, &nd);
++        file = ERR_PTR(err);
+       if (!err) {
+               struct inode *inode = nd.dentry->d_inode;
+@@ -470,7 +478,7 @@ struct file *open_exec(const char *name)
+                               err = -EACCES;
+                       file = ERR_PTR(err);
+                       if (!err) {
+-                              file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++                              file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &nd.intent);
+                               if (!IS_ERR(file)) {
+                                       err = deny_write_access(file);
+                                       if (err) {
+--- linux-2.6.0-test1/fs/namei.c~vfs_intent_2.6.0-test1        2003-07-16 17:19:46.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/namei.c 2003-07-16 18:37:11.000000000 -0600
+@@ -263,8 +263,19 @@ int deny_write_access(struct file * file
+       return 0;
+ }
++void intent_release(struct lookup_intent *it)
++{
++        if (!it) 
++                return;
++        if (it->it_magic != INTENT_MAGIC)
++                return;
++        if (it->it_op_release)
++                it->it_op_release(it);
++}
++
+ void path_release(struct nameidata *nd)
+ {
++        intent_release(&nd->intent);
+       dput(nd->dentry);
+       mntput(nd->mnt);
+ }
+@@ -554,6 +565,32 @@ fail:
+       return PTR_ERR(dentry);
+ }
++
++static int revalidate_special(struct nameidata *nd)
++{
++        struct dentry *dentry = nd->dentry;
++        int err, counter = 0;
++
++        if (!dentry->d_op || !dentry->d_op->d_revalidate)
++                return 0;
++ revalidate_again:
++        if (!dentry->d_op->d_revalidate(dentry, nd)) {
++                struct dentry *new;
++                if ((err = permission(dentry->d_parent->d_inode, MAY_EXEC,nd)))
++                        return err;
++                new = real_lookup(dentry->d_parent, &dentry->d_name, nd);
++                d_invalidate(dentry);
++                dput(dentry);
++                dentry = new;
++                counter++;
++                if (counter < 10)
++                        goto revalidate_again;
++                printk("excessive revalidate_it loops\n");
++                return -ESTALE;
++        }
++        return 0;
++}
++
+ /*
+  * Name resolution.
+  *
+@@ -654,7 +691,9 @@ int link_path_walk(const char * name, st
+               if (inode->i_op->follow_link) {
+                       mntget(next.mnt);
++                        nd->flags |= LOOKUP_LINK_NOTLAST;
+                       err = do_follow_link(next.dentry, nd);
++                        nd->flags &= ~LOOKUP_LINK_NOTLAST;
+                       dput(next.dentry);
+                       mntput(next.mnt);
+                       if (err)
+@@ -693,6 +732,11 @@ last_component:
+                               inode = nd->dentry->d_inode;
+                               /* fallthrough */
+                       case 1:
++                                nd->flags |= LOOKUP_LAST;
++                                err = revalidate_special(nd);
++                                nd->flags &= ~LOOKUP_LAST;
++                                if (err)
++                                        break;
+                               goto return_base;
+               }
+               if (nd->dentry->d_op && nd->dentry->d_op->d_hash) {
+@@ -700,7 +744,9 @@ last_component:
+                       if (err < 0)
+                               break;
+               }
++                nd->flags |= LOOKUP_LAST;
+               err = do_lookup(nd, &this, &next);
++                nd->flags &= ~LOOKUP_LAST;
+               if (err)
+                       break;
+               follow_mount(&next.mnt, &next.dentry);
+@@ -743,7 +789,7 @@ out_dput:
+               dput(next.dentry);
+               break;
+       }
+-      path_release(nd);
++        path_release(nd);
+ return_err:
+       return err;
+ }
+@@ -912,7 +958,7 @@ struct dentry * lookup_hash(struct qstr 
+ }
+ /* SMP-safe */
+-struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
++struct dentry * lookup_one_len_it(const char * name, struct dentry * base, int len, struct nameidata *nd)
+ {
+       unsigned long hash;
+       struct qstr this;
+@@ -932,11 +978,16 @@ struct dentry * lookup_one_len(const cha
+       }
+       this.hash = end_name_hash(hash);
+-      return lookup_hash(&this, base);
++      return __lookup_hash(&this, base, nd);
+ access:
+       return ERR_PTR(-EACCES);
+ }
++struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
++{
++        return lookup_one_len_it(name, base, len, NULL);
++}
++
+ /*
+  *    namei()
+  *
+@@ -948,10 +999,11 @@ access:
+  * that namei follows links, while lnamei does not.
+  * SMP-safe
+  */
+-int __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
++int __user_walk_it(const char __user *name, unsigned flags, struct nameidata *nd)
+ {
+       char *tmp = getname(name);
+       int err = PTR_ERR(tmp);
++ 
+       if (!IS_ERR(tmp)) {
+               err = path_lookup(tmp, flags, nd);
+@@ -960,6 +1012,12 @@ int __user_walk(const char __user *name,
+       return err;
+ }
++int __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
++{
++        intent_init(&nd->intent, IT_LOOKUP);
++        return __user_walk_it(name, flags, nd);
++}
++
+ /*
+  * It's inline, so penalty for filesystems that don't use sticky bit is
+  * minimal.
+@@ -1232,8 +1290,8 @@ int open_namei(const char * pathname, in
+               acc_mode |= MAY_APPEND;
+       /* Fill in the open() intent data */
+-      nd->intent.open.flags = flag;
+-      nd->intent.open.create_mode = mode;
++      nd->intent.intent.open.flags = flag;
++      nd->intent.intent.open.create_mode = mode;
+       /*
+        * The simplest case - just a plain lookup.
+@@ -1249,6 +1307,7 @@ int open_namei(const char * pathname, in
+       /*
+        * Create - we need to know the parent.
+        */
++        nd->intent.it_op |= IT_CREAT;
+       error = path_lookup(pathname, LOOKUP_PARENT|LOOKUP_OPEN|LOOKUP_CREATE, nd);
+       if (error)
+               return error;
+@@ -1265,7 +1324,9 @@ int open_namei(const char * pathname, in
+       dir = nd->dentry;
+       nd->flags &= ~LOOKUP_PARENT;
+       down(&dir->d_inode->i_sem);
++        nd->flags |= LOOKUP_LAST;
+       dentry = __lookup_hash(&nd->last, nd->dentry, nd);
++        nd->flags &= ~LOOKUP_LAST;
+ do_last:
+       error = PTR_ERR(dentry);
+@@ -1370,7 +1431,9 @@ do_link:
+       }
+       dir = nd->dentry;
+       down(&dir->d_inode->i_sem);
++        nd->flags |= LOOKUP_LAST;
+       dentry = __lookup_hash(&nd->last, nd->dentry, nd);
++        nd->flags &= ~LOOKUP_LAST;
+       putname(nd->last.name);
+       goto do_last;
+ }
+@@ -2143,7 +2206,9 @@ static inline int
+ __vfs_follow_link(struct nameidata *nd, const char *link)
+ {
+       int res = 0;
++        struct lookup_intent it = nd->intent;
+       char *name;
++
+       if (IS_ERR(link))
+               goto fail;
+@@ -2153,6 +2218,10 @@ __vfs_follow_link(struct nameidata *nd, 
+                       /* weird __emul_prefix() stuff did it */
+                       goto out;
+       }
++
++        intent_init(&nd->intent, it.it_op);
++        nd->intent.intent.open.flags = it.intent.open.flags;
++        nd->intent.intent.open.create_mode = it.intent.open.create_mode;
+       res = link_path_walk(link, nd);
+ out:
+       if (current->link_count || res || nd->last_type!=LAST_NORM)
+--- linux-2.6.0-test1/fs/namespace.c~vfs_intent_2.6.0-test1    2003-07-16 17:19:46.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/namespace.c     2003-07-16 18:44:38.000000000 -0600
+@@ -738,6 +738,7 @@ long do_mount(char * dev_name, char * di
+       int retval = 0;
+       int mnt_flags = 0;
++        intent_init(&nd.intent, IT_LOOKUP);
+       /* Discard magic */
+       if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
+               flags &= ~MS_MGC_MSK;
+@@ -947,6 +948,7 @@ void set_fs_pwd(struct fs_struct *fs, st
+               mntput(old_pwdmnt);
+       }
+ }
++EXPORT_SYMBOL(set_fs_pwd);
+ static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd)
+ {
+--- linux-2.6.0-test1/fs/open.c~vfs_intent_2.6.0-test1 2003-07-13 21:29:30.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/open.c  2003-07-16 18:39:48.000000000 -0600
+@@ -200,7 +200,7 @@ static inline long do_sys_truncate(const
+       struct nameidata nd;
+       struct inode * inode;
+       int error;
+-
++      intent_init(&nd.intent, IT_GETATTR);
+       error = -EINVAL;
+       if (length < 0) /* sorry, but loff_t says... */
+               goto out;
+@@ -443,6 +443,7 @@ asmlinkage long sys_access(const char __
+       int old_fsuid, old_fsgid;
+       kernel_cap_t old_cap;
+       int res;
++      intent_init(&nd.intent, IT_GETATTR);
+       if (mode & ~S_IRWXO)    /* where's F_OK, X_OK, W_OK, R_OK? */
+               return -EINVAL;
+@@ -474,6 +475,7 @@ asmlinkage long sys_access(const char __
+               if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
+                  && !special_file(nd.dentry->d_inode->i_mode))
+                       res = -EROFS;
++                              
+               path_release(&nd);
+       }
+@@ -488,6 +490,7 @@ asmlinkage long sys_chdir(const char __u
+ {
+       struct nameidata nd;
+       int error;
++      intent_init(&nd.intent, IT_GETATTR);
+       error = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &nd);
+       if (error)
+@@ -539,6 +542,7 @@ asmlinkage long sys_chroot(const char __
+ {
+       struct nameidata nd;
+       int error;
++      intent_init(&nd.intent, IT_GETATTR);
+       error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
+       if (error)
+@@ -611,7 +615,7 @@ asmlinkage long sys_chmod(const char __u
+       error = -EROFS;
+       if (IS_RDONLY(inode))
+               goto dput_and_out;
+-
++      
+       error = -EPERM;
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+               goto dput_and_out;
+@@ -719,25 +723,8 @@ asmlinkage long sys_fchown(unsigned int 
+  * for the internal routines (ie open_namei()/follow_link() etc). 00 is
+  * used by symlinks.
+  */
+-struct file *filp_open(const char * filename, int flags, int mode)
+-{
+-      int namei_flags, error;
+-      struct nameidata nd;
+-
+-      namei_flags = flags;
+-      if ((namei_flags+1) & O_ACCMODE)
+-              namei_flags++;
+-      if (namei_flags & O_TRUNC)
+-              namei_flags |= 2;
+-
+-      error = open_namei(filename, namei_flags, mode, &nd);
+-      if (!error)
+-              return dentry_open(nd.dentry, nd.mnt, flags);
+-
+-      return ERR_PTR(error);
+-}
+-
+-struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags, 
++                            struct lookup_intent *it)
+ {
+       struct file * f;
+       struct inode *inode;
+@@ -749,6 +736,7 @@ struct file *dentry_open(struct dentry *
+               goto cleanup_dentry;
+       f->f_flags = flags;
+       f->f_mode = (flags+1) & O_ACCMODE;
++        f->f_it = it;
+       inode = dentry->d_inode;
+       if (f->f_mode & FMODE_WRITE) {
+               error = get_write_access(inode);
+@@ -767,6 +755,7 @@ struct file *dentry_open(struct dentry *
+               error = f->f_op->open(inode,f);
+               if (error)
+                       goto cleanup_all;
++                intent_release(it);
+       }
+       f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
+@@ -778,7 +767,7 @@ struct file *dentry_open(struct dentry *
+                               f = ERR_PTR(-EINVAL);
+               }
+       }
+-
++        
+       return f;
+ cleanup_all:
+@@ -791,11 +780,42 @@ cleanup_all:
+ cleanup_file:
+       put_filp(f);
+ cleanup_dentry:
++        intent_release(it);
+       dput(dentry);
+       mntput(mnt);
+       return ERR_PTR(error);
+ }
++struct file *filp_open(const char * filename, int flags, int mode)
++{
++      int namei_flags, error;
++      struct file * temp_filp;
++        struct nameidata nd;
++      intent_init(&nd.intent, IT_OPEN);
++
++      namei_flags = flags;
++      if ((namei_flags+1) & O_ACCMODE)
++              namei_flags++;
++      if (namei_flags & O_TRUNC)
++              namei_flags |= 2;
++
++      error = open_namei(filename, namei_flags, mode, &nd);
++      if (!error) {
++              temp_filp = dentry_open_it(nd.dentry, nd.mnt, flags, &nd.intent);
++              return temp_filp;
++      }       
++      return ERR_PTR(error);
++}
++
++
++struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++{
++        struct lookup_intent it;
++      intent_init(&it, IT_LOOKUP);
++
++        return dentry_open_it(dentry, mnt, flags, &it);
++}
++
+ /*
+  * Find an empty file descriptor entry, and mark it busy.
+  */
+--- linux-2.6.0-test1/fs/stat.c~vfs_intent_2.6.0-test1 2003-07-13 21:31:21.000000000 -0600
++++ linux-2.6.0-test1-braam/fs/stat.c  2003-07-16 18:44:27.000000000 -0600
+@@ -33,7 +33,7 @@ void generic_fillattr(struct inode *inod
+       stat->blksize = inode->i_blksize;
+ }
+-int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++int vfs_getattr_it(struct vfsmount *mnt, struct dentry *dentry, struct lookup_intent *it, struct kstat *stat)
+ {
+       struct inode *inode = dentry->d_inode;
+       int retval;
+@@ -44,6 +44,8 @@ int vfs_getattr(struct vfsmount *mnt, st
+       if (inode->i_op->getattr)
+               return inode->i_op->getattr(mnt, dentry, stat);
++      if (inode->i_op->getattr_it)
++              return inode->i_op->getattr_it(mnt, dentry, it, stat);
+       generic_fillattr(inode, stat);
+       if (!stat->blksize) {
+@@ -56,15 +58,21 @@ int vfs_getattr(struct vfsmount *mnt, st
+       return 0;
+ }
++int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++{
++        return vfs_getattr_it(mnt, dentry, NULL, stat);
++}
++
+ int vfs_stat(char __user *name, struct kstat *stat)
+ {
+       struct nameidata nd;
+       int error;
++      intent_init(&nd.intent, IT_GETATTR);
+-      error = user_path_walk(name, &nd);
++      error = user_path_walk_it(name, &nd);
+       if (!error) {
+-              error = vfs_getattr(nd.mnt, nd.dentry, stat);
+-              path_release(&nd);
++              error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.intent, stat);
++                path_release(&nd);
+       }
+       return error;
+ }
+@@ -73,11 +81,12 @@ int vfs_lstat(char __user *name, struct 
+ {
+       struct nameidata nd;
+       int error;
++      intent_init(&nd.intent, IT_GETATTR);
+-      error = user_path_walk_link(name, &nd);
++      error = user_path_walk_link_it(name, &nd);
+       if (!error) {
+-              error = vfs_getattr(nd.mnt, nd.dentry, stat);
+-              path_release(&nd);
++              error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.intent, stat);
++                path_release(&nd);
+       }
+       return error;
+ }
+@@ -86,9 +95,12 @@ int vfs_fstat(unsigned int fd, struct ks
+ {
+       struct file *f = fget(fd);
+       int error = -EBADF;
++        struct nameidata nd;
++      intent_init(&nd.intent, IT_GETATTR);
+       if (f) {
+-              error = vfs_getattr(f->f_vfsmnt, f->f_dentry, stat);
++              error = vfs_getattr_it(f->f_vfsmnt, f->f_dentry, &nd.intent, stat);
++                intent_release(&nd.intent);
+               fput(f);
+       }
+       return error;
+--- linux-2.6.0-test1/include/linux/dcache.h~vfs_intent_2.6.0-test1    2003-07-13 21:39:22.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/dcache.h     2003-07-16 17:49:49.000000000 -0600
+@@ -4,6 +4,7 @@
+ #ifdef __KERNEL__
+ #include <asm/atomic.h>
++#include <linux/string.h>
+ #include <linux/list.h>
+ #include <linux/spinlock.h>
+ #include <linux/cache.h>
+@@ -35,6 +36,8 @@ struct qstr {
+       char name_str[0];
+ };
++#include <linux/namei.h>
++
+ struct dentry_stat_t {
+       int nr_dentry;
+       int nr_unused;
+--- linux-2.6.0-test1/include/linux/fs.h~vfs_intent_2.6.0-test1        2003-07-16 17:19:46.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/fs.h 2003-07-16 17:32:36.000000000 -0600
+@@ -237,6 +237,8 @@ typedef int (get_blocks_t)(struct inode 
+ #define ATTR_ATTR_FLAG        1024
+ #define ATTR_KILL_SUID        2048
+ #define ATTR_KILL_SGID        4096
++#define ATTR_RAW              8192    /* file system, not vfs will massage attrs */
++#define ATTR_FROM_OPEN        16384    /* called from open path, ie O_TRUNC */
+ /*
+  * This is the Inode Attributes structure, used for notify_change().  It
+@@ -511,6 +513,7 @@ struct file {
+       /* Used by fs/eventpoll.c to link all the hooks to this file */
+       struct list_head        f_ep_links;
+       spinlock_t              f_ep_lock;
++        struct lookup_intent    *f_it;
+ };
+ extern spinlock_t files_lock;
+ #define file_list_lock() spin_lock(&files_lock);
+@@ -816,7 +819,9 @@ struct inode_operations {
+       void (*truncate) (struct inode *);
+       int (*permission) (struct inode *, int, struct nameidata *);
+       int (*setattr) (struct dentry *, struct iattr *);
++      int (*setattr_raw) (struct inode *, struct iattr *);
+       int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
++      int (*getattr_it) (struct vfsmount *, struct dentry *, struct lookup_intent *, struct kstat *);
+       int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
+       ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
+       ssize_t (*listxattr) (struct dentry *, char *, size_t);
+@@ -1029,6 +1034,7 @@ extern int register_filesystem(struct fi
+ extern int unregister_filesystem(struct file_system_type *);
+ extern struct vfsmount *kern_mount(struct file_system_type *);
+ extern int may_umount(struct vfsmount *);
++struct vfsmount *do_kern_mount(const char *type, int flags, const char *name, void *data);
+ extern long do_mount(char *, char *, char *, unsigned long, void *);
+ extern int vfs_statfs(struct super_block *, struct kstatfs *);
+@@ -1096,6 +1102,7 @@ extern int do_truncate(struct dentry *, 
+ extern struct file *filp_open(const char *, int, int);
+ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
++extern struct file * dentry_open_it(struct dentry *, struct vfsmount *, int, struct lookup_intent *);
+ extern int filp_close(struct file *, fl_owner_t id);
+ extern char * getname(const char __user *);
+--- linux-2.6.0-test1/include/linux/namei.h~vfs_intent_2.6.0-test1     2003-07-13 21:32:39.000000000 -0600
++++ linux-2.6.0-test1-braam/include/linux/namei.h      2003-07-16 18:38:10.000000000 -0600
+@@ -2,25 +2,64 @@
+ #define _LINUX_NAMEI_H
+ #include <linux/linkage.h>
++#include <linux/string.h>
+ struct vfsmount;
++struct nameidata;
++
++/* intent opcodes */
++#define IT_OPEN     (1)
++#define IT_CREAT    (1<<1)
++#define IT_READDIR  (1<<2)
++#define IT_GETATTR  (1<<3)
++#define IT_LOOKUP   (1<<4)
++#define IT_UNLINK   (1<<5)
++#define IT_TRUNC    (1<<6)
++#define IT_GETXATTR (1<<7)
+ struct open_intent {
+       int     flags;
+       int     create_mode;
+ };
++struct lustre_intent_data {
++        int it_mode;
++        int it_flags;
++        int it_disposition;
++        int it_status;
++        struct iattr *it_iattr;
++        __u64 it_lock_handle[2];
++        int it_lock_mode;
++        void *it_data;
++};
++
++#define INTENT_MAGIC 0x19620323
++struct lookup_intent {
++        int it_magic;
++        void (*it_op_release)(struct lookup_intent *);
++        int it_op;
++      union {
++              struct open_intent open;
++      } intent;
++        union {
++                struct lustre_intent_data lustre;
++        } fsdata;
++};
++
++static inline void intent_init(struct lookup_intent *it, int op)
++{
++        memset(it, 0, sizeof(*it));
++        it->it_magic = INTENT_MAGIC;
++        it->it_op = op;
++}
++
+ struct nameidata {
+       struct dentry   *dentry;
+       struct vfsmount *mnt;
+       struct qstr     last;
+       unsigned int    flags;
+       int             last_type;
+-
+-      /* Intent data */
+-      union {
+-              struct open_intent open;
+-      } intent;
++        struct lookup_intent intent;
+ };
+ /*
+@@ -41,6 +80,9 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LA
+ #define LOOKUP_CONTINUE                4
+ #define LOOKUP_PARENT         16
+ #define LOOKUP_NOALT          32
++#define LOOKUP_LAST            (1<<6)
++#define LOOKUP_LINK_NOTLAST    (1<<7)
++
+ /*
+  * Intent data
+  */
+@@ -49,6 +91,12 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LA
+ #define LOOKUP_ACCESS         (0x0400)
+ extern int FASTCALL(__user_walk(const char __user *, unsigned, struct nameidata *));
++extern int FASTCALL(__user_walk_it(const char __user *name, unsigned flags, struct nameidata *nd));
++#define user_path_walk_it(name,nd) \
++      __user_walk_it(name, LOOKUP_FOLLOW, nd)
++#define user_path_walk_link_it(name,nd) \
++      __user_walk_it(name, 0, nd)
++extern void intent_release(struct lookup_intent *);
+ #define user_path_walk(name,nd) \
+       __user_walk(name, LOOKUP_FOLLOW, nd)
+ #define user_path_walk_link(name,nd) \
+@@ -60,7 +108,6 @@ extern void path_release(struct nameidat
+ extern struct dentry * lookup_one_len(const char *, struct dentry *, int);
+ extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
+-
+ extern int follow_down(struct vfsmount **, struct dentry **);
+ extern int follow_up(struct vfsmount **, struct dentry **);
+--- linux-2.6.0-test1/kernel/ksyms.c~vfs_intent_2.6.0-test1    2003-07-16 17:20:31.000000000 -0600
++++ linux-2.6.0-test1-braam/kernel/ksyms.c     2003-07-16 17:32:36.000000000 -0600
+@@ -383,6 +383,7 @@ EXPORT_SYMBOL(unregister_filesystem);
+ EXPORT_SYMBOL(kern_mount);
+ EXPORT_SYMBOL(__mntput);
+ EXPORT_SYMBOL(may_umount);
++EXPORT_SYMBOL(reparent_to_init);
+ /* executable format registration */
+ EXPORT_SYMBOL(register_binfmt);
+@@ -412,6 +413,12 @@ EXPORT_SYMBOL(del_timer);
+ EXPORT_SYMBOL(request_irq);
+ EXPORT_SYMBOL(free_irq);
++/* lustre */
++EXPORT_SYMBOL(do_kern_mount);
++EXPORT_SYMBOL(exit_files);
++//EXPORT_SYMBOL(kmem_cache_validate);
++
++
+ /* waitqueue handling */
+ EXPORT_SYMBOL(add_wait_queue);
+ EXPORT_SYMBOL(add_wait_queue_exclusive);
+@@ -559,6 +566,7 @@ EXPORT_SYMBOL(sys_tz);
+ EXPORT_SYMBOL(file_fsync);
+ EXPORT_SYMBOL(fsync_buffers_list);
+ EXPORT_SYMBOL(clear_inode);
++EXPORT_SYMBOL(__iget);
+ EXPORT_SYMBOL(init_special_inode);
+ EXPORT_SYMBOL(new_inode);
+ EXPORT_SYMBOL(__insert_inode_hash);
+--- linux-2.6.0-test1/net/unix/af_unix.c~vfs_intent_2.6.0-test1        2003-07-13 21:35:16.000000000 -0600
++++ linux-2.6.0-test1-braam/net/unix/af_unix.c 2003-07-16 17:32:36.000000000 -0600
+@@ -702,7 +702,7 @@ static int unix_bind(struct socket *sock
+               /*
+                * Do the final lookup.
+                */
+-              dentry = lookup_hash(&nd.last, nd.dentry);
++              dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+               err = PTR_ERR(dentry);
+               if (IS_ERR(dentry))
+                       goto out_mknod_unlock;
+--- linux-2.6.0-test1/net/sunrpc/rpc_pipe.c~vfs_intent_2.6.0-test1     2003-07-13 21:32:34.000000000 -0600
++++ linux-2.6.0-test1-braam/net/sunrpc/rpc_pipe.c      2003-07-16 17:32:36.000000000 -0600
+@@ -598,7 +598,7 @@ rpc_lookup_negative(char *path, struct n
+               return ERR_PTR(error);
+       dir = nd->dentry->d_inode;
+       down(&dir->i_sem);
+-      dentry = lookup_hash(&nd->last, nd->dentry);
++      dentry = lookup_hash(&nd->last, nd->dentry, NULL);
+       if (IS_ERR(dentry))
+               goto out_err;
+       if (dentry->d_inode) {
+@@ -660,7 +660,7 @@ rpc_rmdir(char *path)
+               return error;
+       dir = nd.dentry->d_inode;
+       down(&dir->i_sem);
+-      dentry = lookup_hash(&nd.last, nd.dentry);
++      dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+       if (IS_ERR(dentry)) {
+               error = PTR_ERR(dentry);
+               goto out_release;
+@@ -721,7 +721,7 @@ rpc_unlink(char *path)
+               return error;
+       dir = nd.dentry->d_inode;
+       down(&dir->i_sem);
+-      dentry = lookup_hash(&nd.last, nd.dentry);
++      dentry = lookup_hash(&nd.last, nd.dentry, NULL);
+       if (IS_ERR(dentry)) {
+               error = PTR_ERR(dentry);
+               goto out_release;
+
+_
diff --git a/lustre/kernel_patches/pc/2.6.0-test1-mm2.pc b/lustre/kernel_patches/pc/2.6.0-test1-mm2.pc
new file mode 100644 (file)
index 0000000..33e7179
--- /dev/null
@@ -0,0 +1,1202 @@
+arch/alpha/kernel/irq.c
+arch/alpha/kernel/smp.c
+arch/alpha/mm/init.c
+arch/alpha/mm/remap.c
+arch/arm26/kernel/setup.c
+arch/arm26/mm/init.c
+arch/arm26/mm/mm-memc.c
+arch/arm/mach-arc/mm.c
+arch/arm/mach-clps711x/autcpu12.c
+arch/arm/mm/consistent.c
+arch/arm/mm/ioremap.c
+arch/arm/mm/minicache.c
+arch/arm/mm/mm-armv.c
+arch/cris/mm/ioremap.c
+arch/h8300/kernel/setup.c
+arch/h8300/mm/init.c
+arch/i386/Kconfig
+arch/i386/kernel/apic.c
+arch/i386/kernel/apm.c
+arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
+arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
+arch/i386/kernel/cpu/cpufreq/speedstep-ich.c
+arch/i386/kernel/cpuid.c
+arch/i386/kernel/cpu/mtrr/cyrix.c
+arch/i386/kernel/cpu/mtrr/main.c
+arch/i386/kernel/cpu/proc.c
+arch/i386/kernel/entry.S
+arch/i386/kernel/io_apic.c
+arch/i386/kernel/irq.c
+arch/i386/kernel/kgdb_stub.c
+arch/i386/kernel/ldt.c
+arch/i386/kernel/Makefile
+arch/i386/kernel/mpparse.c
+arch/i386/kernel/msr.c
+arch/i386/kernel/nmi.c
+arch/i386/kernel/reboot.c
+arch/i386/kernel/setup.c
+arch/i386/kernel/smpboot.c
+arch/i386/kernel/smp.c
+arch/i386/kernel/traps.c
+arch/i386/kernel/vm86.c
+arch/i386/lib/dec_and_lock.c
+arch/i386/lib/kgdb_serial.c
+arch/i386/lib/Makefile
+arch/i386/mach-generic/bigsmp.c
+arch/i386/mach-generic/default.c
+arch/i386/mach-generic/probe.c
+arch/i386/mach-generic/summit.c
+arch/i386/mach-visws/mpparse.c
+arch/i386/mach-voyager/voyager_smp.c
+arch/i386/Makefile
+arch/i386/mm/fault.c
+arch/i386/mm/hugetlbpage.c
+arch/i386/mm/init.c
+arch/i386/mm/ioremap.c
+arch/i386/mm/pageattr.c
+arch/i386/mm/pgtable.c
+arch/i386/pci/legacy.c
+arch/i386/pci/visws.c
+arch/ia64/hp/sim/simscsi.c
+arch/ia64/ia32/ia32_ioctl.c
+arch/ia64/kernel/acpi.c
+arch/ia64/kernel/entry.S
+arch/ia64/kernel/fsys.S
+arch/ia64/kernel/ia64_ksyms.c
+arch/ia64/kernel/init_task.c
+arch/ia64/kernel/iosapic.c
+arch/ia64/kernel/irq.c
+arch/ia64/kernel/module.c
+arch/ia64/kernel/perfmon.c
+arch/ia64/kernel/ptrace.c
+arch/ia64/kernel/setup.c
+arch/ia64/kernel/smpboot.c
+arch/ia64/kernel/smp.c
+arch/ia64/kernel/time.c
+arch/ia64/Makefile
+arch/ia64/mm/hugetlbpage.c
+arch/ia64/mm/init.c
+arch/ia64/pci/pci.c
+arch/ia64/scripts/check-model.c
+arch/ia64/scripts/toolchain-flags
+arch/m68k/apollo/dn_ints.c
+arch/m68k/atari/stram.c
+arch/m68k/kernel/head.S
+arch/m68k/mm/init.c
+arch/m68k/mm/kmap.c
+arch/m68k/mm/motorola.c
+arch/m68k/mm/sun3mmu.c
+arch/m68knommu/kernel/setup.c
+arch/m68knommu/mm/init.c
+arch/m68k/q40/q40ints.c
+arch/m68k/sun3x/dvma.c
+arch/mips64/kernel/irq.c
+arch/mips64/kernel/proc.c
+arch/mips64/kernel/setup.c
+arch/mips64/kernel/smp.c
+arch/mips/kernel/irq.c
+arch/mips/kernel/proc.c
+arch/mips/kernel/smp.c
+arch/mips/mm/fault.c
+arch/mips/mm/init.c
+arch/mips/mm/ioremap.c
+arch/mips/momentum/ocelot_c/setup.c
+arch/mips/momentum/ocelot_g/setup.c
+arch/mips/ramdisk/Makefile
+arch/mips/sgi-ip27/ip27-init.c
+arch/mips/sibyte/cfe/setup.c
+arch/mips/sibyte/cfe/smp.c
+arch/mips/sibyte/sb1250/prom.c
+arch/mips/sibyte/sb1250/smp.c
+arch/mips/sibyte/swarm/setup.c
+arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_irq.c
+arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c
+arch/mips/vr41xx/tanbac-tb0229/setup.c
+arch/parisc/kernel/ioctl32.c
+arch/parisc/kernel/pci-dma.c
+arch/parisc/kernel/smp.c
+arch/parisc/mm/ioremap.c
+arch/ppc64/boot/Makefile
+arch/ppc64/Kconfig
+arch/ppc64/kernel/htab.c
+arch/ppc64/kernel/irq.c
+arch/ppc64/kernel/iSeries_irq.c
+arch/ppc64/kernel/open_pic.c
+arch/ppc64/kernel/open_pic.h
+arch/ppc64/kernel/pacaData.c
+arch/ppc64/kernel/prom.c
+arch/ppc64/kernel/rtasd.c
+arch/ppc64/kernel/semaphore.c
+arch/ppc64/kernel/setup.c
+arch/ppc64/kernel/smp.c
+arch/ppc64/kernel/xics.c
+arch/ppc64/kernel/XmPciLpEvent.c
+arch/ppc64/mm/init.c
+arch/ppc/kernel/irq.c
+arch/ppc/kernel/misc.S
+arch/ppc/kernel/setup.c
+arch/ppc/kernel/smp.c
+arch/ppc/kernel/syscalls.c
+arch/ppc/kernel/time.c
+arch/ppc/mm/mem_pieces.c
+arch/ppc/platforms/4xx/beech.c
+arch/ppc/platforms/4xx/sycamore.c
+arch/ppc/platforms/4xx/walnut.c
+arch/ppc/platforms/pmac_cpufreq.c
+arch/ppc/platforms/residual.c
+arch/s390/defconfig
+arch/s390/kernel/compat_ioctl.c
+arch/s390/kernel/compat_linux.c
+arch/s390/kernel/entry64.S
+arch/s390/kernel/entry.S
+arch/s390/kernel/s390_ext.c
+arch/s390/kernel/setup.c
+arch/s390/kernel/smp.c
+arch/s390/mm/init.c
+arch/s390/mm/ioremap.c
+arch/sh/mm/init.c
+arch/sh/mm/ioremap.c
+arch/sparc64/kernel/devices.c
+arch/sparc64/kernel/head.S
+arch/sparc64/kernel/irq.c
+arch/sparc64/kernel/pci.c
+arch/sparc64/kernel/setup.c
+arch/sparc64/kernel/smp.c
+arch/sparc64/kernel/sparc64_ksyms.c
+arch/sparc64/kernel/time.c
+arch/sparc64/kernel/us2e_cpufreq.c
+arch/sparc64/kernel/us3_cpufreq.c
+arch/sparc64/lib/atomic.S
+arch/sparc64/lib/rwlock.S
+arch/sparc64/mm/fault.c
+arch/sparc64/mm/generic.c
+arch/sparc64/mm/hugetlbpage.c
+arch/sparc64/mm/init.c
+arch/sparc64/prom/bootstr.c
+arch/sparc/kernel/process.c
+arch/sparc/kernel/setup.c
+arch/sparc/mm/generic.c
+arch/sparc/mm/srmmu.c
+arch/sparc/mm/sun4c.c
+arch/um/drivers/ubd_kern.c
+arch/um/kernel/irq.c
+arch/um/kernel/skas/process_kern.c
+arch/um/kernel/smp.c
+arch/um/kernel/tt/process_kern.c
+arch/um/kernel/um_arch.c
+arch/v850/Kconfig
+arch/v850/kernel/anna.c
+arch/v850/kernel/as85ep1.c
+arch/v850/kernel/fpga85e2c.c
+arch/v850/kernel/gbus_int.c
+arch/v850/kernel/head.S
+arch/v850/kernel/highres_timer.c
+arch/v850/kernel/intv.S
+arch/v850/kernel/ma.c
+arch/v850/kernel/Makefile
+arch/v850/kernel/me2.c
+arch/v850/kernel/nb85e_cache.c
+arch/v850/kernel/nb85e_intc.c
+arch/v850/kernel/nb85e_timer_d.c
+arch/v850/kernel/nb85e_utils.c
+arch/v850/kernel/rte_cb.c
+arch/v850/kernel/rte_ma1_cb.c
+arch/v850/kernel/rte_me2_cb.c
+arch/v850/kernel/rte_nb85e_cb.c
+arch/v850/kernel/sim85e2.c
+arch/v850/kernel/sim85e2c.c
+arch/v850/kernel/teg.c
+arch/v850/kernel/v850e2_cache.c
+arch/v850/kernel/v850e_cache.c
+arch/v850/kernel/v850e_intc.c
+arch/v850/kernel/v850e_timer_d.c
+arch/v850/kernel/v850e_utils.c
+arch/v850/rte_me2_cb.ld
+arch/v850/sim85e2c.ld
+arch/v850/sim85e2.ld
+arch/v850/vmlinux.lds.S
+arch/x86_64/boot/compressed/head.S
+arch/x86_64/boot/compressed/misc.c
+arch/x86_64/ia32/syscall32.c
+arch/x86_64/kernel/apic.c
+arch/x86_64/kernel/io_apic.c
+arch/x86_64/kernel/irq.c
+arch/x86_64/kernel/ldt.c
+arch/x86_64/kernel/mpparse.c
+arch/x86_64/kernel/msr.c
+arch/x86_64/kernel/reboot.c
+arch/x86_64/kernel/setup.c
+arch/x86_64/kernel/smpboot.c
+arch/x86_64/kernel/smp.c
+arch/x86_64/mm/init.c
+arch/x86_64/mm/ioremap.c
+arch/x86_64/mm/numa.c
+Documentation/fb/neofb.txt
+Documentation/filesystems/proc.txt
+Documentation/i386/kgdb/andthen
+Documentation/i386/kgdb/debug-nmi.txt
+Documentation/i386/kgdb/gdb-globals.txt
+Documentation/i386/kgdb/gdbinit
+Documentation/i386/kgdb/gdbinit.hw
+Documentation/i386/kgdb/gdbinit-modules
+Documentation/i386/kgdb/kgdb.txt
+Documentation/i386/kgdb/loadmodule.sh
+Documentation/magic-number.txt
+Documentation/networking/vortex.txt
+Documentation/pnp.txt
+drivers/acorn/block/fd1772.c
+drivers/acorn/block/mfmhd.c
+drivers/acpi/executer/exutils.c
+drivers/acpi/hardware/hwregs.c
+drivers/acpi/osl.c
+drivers/acpi/processor.c
+drivers/acpi/tables.c
+drivers/acpi/tables/tbconvrt.c
+drivers/acpi/tables/tbget.c
+drivers/acpi/tables/tbinstal.c
+drivers/acpi/tables/tbrsdt.c
+drivers/acpi/tables/tbxfroot.c
+drivers/acpi/thermal.c
+drivers/acpi/utilities/utglobal.c
+drivers/atm/atmtcp.c
+drivers/base/node.c
+drivers/block/acsi.c
+drivers/block/amiflop.c
+drivers/block/as-iosched.c
+drivers/block/ataflop.c
+drivers/block/cciss.c
+drivers/block/cciss_scsi.c
+drivers/block/cpqarray.c
+drivers/block/cryptoloop.c
+drivers/block/DAC960.c
+drivers/block/deadline-iosched.c
+drivers/block/elevator.c
+drivers/block/floppy98.c
+drivers/block/floppy.c
+drivers/block/genhd.c
+drivers/block/ioctl.c
+drivers/block/Kconfig
+drivers/block/ll_rw_blk.c
+drivers/block/nbd.c
+drivers/block/paride/pcd.c
+drivers/block/paride/pd.c
+drivers/block/paride/pf.c
+drivers/block/ps2esdi.c
+drivers/block/swim3.c
+drivers/block/swim_iop.c
+drivers/block/umem.c
+drivers/block/xd.c
+drivers/block/z2ram.c
+drivers/cdrom/aztcd.c
+drivers/cdrom/cdrom.c
+drivers/cdrom/cdu31a.c
+drivers/cdrom/cm206.c
+drivers/cdrom/gscd.c
+drivers/cdrom/mcd.c
+drivers/cdrom/mcdx.c
+drivers/cdrom/optcd.c
+drivers/cdrom/sbpcd.c
+drivers/cdrom/sjcd.c
+drivers/cdrom/sonycd535.c
+drivers/char/agp/i460-agp.c
+drivers/char/busmouse.c
+drivers/char/drm/drm_memory.h
+drivers/char/ftape/lowlevel/fdc-io.c
+drivers/char/ftape/lowlevel/ftape-calibr.c
+drivers/char/ftape/lowlevel/ftape-format.c
+drivers/char/ftape/zftape/zftape-init.c
+drivers/char/ip2.c
+drivers/char/ip2/i2lib.c
+drivers/char/ip2/i2os.h
+drivers/char/ip2main.c
+drivers/char/istallion.c
+drivers/char/keyboard.c
+drivers/char/moxa.c
+drivers/char/nwbutton.h
+drivers/char/pcxx.c
+drivers/char/stallion.c
+drivers/char/sysrq.c
+drivers/char/tty_io.c
+drivers/char/watchdog/acquirewdt.c
+drivers/char/watchdog/i810-tco.c
+drivers/char/watchdog/i810-tco.h
+drivers/char/watchdog/ib700wdt.c
+drivers/char/watchdog/indydog.c
+drivers/char/watchdog/machzwd.c
+drivers/char/watchdog/pcwd.c
+drivers/char/watchdog/sbc60xxwdt.c
+drivers/char/watchdog/sc520_wdt.c
+drivers/char/watchdog/shwdt.c
+drivers/char/watchdog/softdog.c
+drivers/char/watchdog/wdt977.c
+drivers/char/watchdog/wdt_pci.c
+drivers/fc4/fc.c
+drivers/fc4/fcp_impl.h
+drivers/i2c/i2c-dev.c
+drivers/ide/ide-disk.c
+drivers/ide/ide-dma.c
+drivers/ide/ide-io.c
+drivers/ide/Kconfig
+drivers/ide/legacy/hd98.c
+drivers/ide/legacy/hd.c
+drivers/ide/ppc/mpc8xx.c
+drivers/ieee1394/amdtp.c
+drivers/ieee1394/sbp2.c
+drivers/input/keyboard/sunkbd.c
+drivers/input/mouse/psmouse-base.c
+drivers/md/dm.c
+drivers/md/dm.h
+drivers/md/dm-ioctl.c
+drivers/md/dm-ioctl-v1.c
+drivers/md/dm-ioctl-v4.c
+drivers/md/dm-table.c
+drivers/md/Kconfig
+drivers/md/linear.c
+drivers/md/md.c
+drivers/md/multipath.c
+drivers/md/raid0.c
+drivers/md/raid1.c
+drivers/media/common/Makefile
+drivers/media/common/saa7146_core.c
+drivers/media/common/saa7146_fops.c
+drivers/media/common/saa7146_hlp.c
+drivers/media/common/saa7146_i2c.c
+drivers/media/common/saa7146_vbi.c
+drivers/media/common/saa7146_video.c
+drivers/media/common/saa7146_vv_ksyms.c
+drivers/media/dvb/b2c2/Kconfig
+drivers/media/dvb/b2c2/Makefile
+drivers/media/dvb/b2c2/skystar2.c
+drivers/media/dvb/dvb-core/dvb_demux.c
+drivers/media/dvb/dvb-core/dvbdev.c
+drivers/media/dvb/dvb-core/dvbdev.h
+drivers/media/dvb/dvb-core/dvb_frontend.c
+drivers/media/dvb/dvb-core/dvb_functions.c
+drivers/media/dvb/dvb-core/dvb_functions.h
+drivers/media/dvb/dvb-core/dvb_net.c
+drivers/media/dvb/dvb-core/dvb_net.h
+drivers/media/dvb/frontends/alps_bsrv2.c
+drivers/media/dvb/frontends/alps_tdlb7.c
+drivers/media/dvb/frontends/grundig_29504-401.c
+drivers/media/dvb/frontends/grundig_29504-491.c
+drivers/media/dvb/frontends/Kconfig
+drivers/media/dvb/frontends/Makefile
+drivers/media/dvb/frontends/mt312.c
+drivers/media/dvb/frontends/mt312.h
+drivers/media/dvb/frontends/nxt6000.c
+drivers/media/dvb/frontends/tda1004x.c
+drivers/media/dvb/frontends/ves1820.c
+drivers/media/dvb/Kconfig
+drivers/media/dvb/Makefile
+drivers/media/dvb/ttpci/av7110.c
+drivers/media/dvb/ttpci/av7110.h
+drivers/media/dvb/ttpci/budget-av.c
+drivers/media/dvb/ttpci/budget.c
+drivers/media/dvb/ttpci/budget-ci.c
+drivers/media/dvb/ttpci/budget-core.c
+drivers/media/dvb/ttpci/budget-patch.c
+drivers/media/dvb/ttpci/Makefile
+drivers/media/dvb/ttpci/ttpci-eeprom.c
+drivers/media/dvb/ttpci/ttpci-eeprom.h
+drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.h
+drivers/media/dvb/ttusb-budget/Kconfig
+drivers/media/dvb/ttusb-budget/Makefile
+drivers/media/dvb/ttusb-dec/dec2000_frontend.c
+drivers/media/dvb/ttusb-dec/fdump.c
+drivers/media/dvb/ttusb-dec/Kconfig
+drivers/media/dvb/ttusb-dec/Makefile
+drivers/media/dvb/ttusb-dec/ttusb_dec.c
+drivers/media/dvb/ttusb-dec/ttusb_dec.h
+drivers/media/video/dpc7146.c
+drivers/media/video/hexium_gemini.c
+drivers/media/video/hexium_gemini.h
+drivers/media/video/hexium.h
+drivers/media/video/hexium_orion.c
+drivers/media/video/hexium_orion.h
+drivers/media/video/Kconfig
+drivers/media/video/Makefile
+drivers/media/video/mxb.c
+drivers/media/video/pms.c
+drivers/message/fusion/mptctl.c
+drivers/message/fusion/mptscsih.c
+drivers/message/i2o/i2o_block.c
+drivers/message/i2o/i2o_scsi.c
+drivers/mtd/devices/blkmtd.c
+drivers/mtd/mtd_blkdevs.c
+drivers/net/3c59x.c
+drivers/net/eql.c
+drivers/net/fc/iph5526.c
+drivers/net/irda/vlsi_ir.c
+drivers/net/Kconfig
+drivers/net/ni65.c
+drivers/net/ni65.h
+drivers/net/pcmcia/Kconfig
+drivers/net/seeq8005.c
+drivers/net/wan/comx-hw-comx.c
+drivers/net/wan/sdladrv.c
+drivers/net/wan/sdlamain.c
+drivers/net/wan/syncppp.c
+drivers/net/wireless/airo.c
+drivers/net/wireless/ray_cs.c
+drivers/parisc/led.c
+drivers/parport/parport_pc.c
+drivers/pci/hotplug/acpiphp_glue.c
+drivers/pci/hotplug/acpiphp_pci.c
+drivers/pci/hotplug.c
+drivers/pci/hotplug/cpci_hotplug_core.c
+drivers/pci/hotplug/cpci_hotplug.h
+drivers/pci/hotplug/cpci_hotplug_pci.c
+drivers/pci/hotplug/Kconfig
+drivers/pci/Makefile
+drivers/pci/pci.c
+drivers/pci/pool.c
+drivers/pci/probe.c
+drivers/pci/quirks.c
+drivers/pci/remove.c
+drivers/pci/setup-bus.c
+drivers/pci/setup-res.c
+drivers/pcmcia/hd64465_ss.c
+drivers/pcmcia/ricoh.h
+drivers/pcmcia/ti113x.h
+drivers/pcmcia/yenta_socket.c
+drivers/pnp/isapnp/core.c
+drivers/s390/block/dasd.c
+drivers/s390/block/dasd_genhd.c
+drivers/s390/block/dasd_int.h
+drivers/s390/block/dasd_ioctl.c
+drivers/s390/block/xpram.c
+drivers/s390/char/sclp.c
+drivers/s390/char/tape_block.c
+drivers/s390/cio/chsc.c
+drivers/s390/cio/cio.c
+drivers/s390/cio/device.c
+drivers/s390/cio/device_fsm.c
+drivers/s390/cio/device.h
+drivers/s390/cio/qdio.c
+drivers/s390/net/qeth.c
+drivers/s390/net/qeth.h
+drivers/s390/net/qeth_mpc.h
+drivers/sbus/char/envctrl.c
+drivers/sbus/char/jsflash.c
+drivers/scsi/3w-xxxx.c
+drivers/scsi/53c700.c
+drivers/scsi/53c7xx.c
+drivers/scsi/a2091.c
+drivers/scsi/a3000.c
+drivers/scsi/aacraid/aachba.c
+drivers/scsi/aacraid/commctrl.c
+drivers/scsi/aacraid/comminit.c
+drivers/scsi/aacraid/commsup.c
+drivers/scsi/aacraid/dpcsup.c
+drivers/scsi/aacraid/linit.c
+drivers/scsi/aacraid/rx.c
+drivers/scsi/aacraid/sa.c
+drivers/scsi/advansys.c
+drivers/scsi/aha152x.c
+drivers/scsi/aha1542.c
+drivers/scsi/aha1542.h
+drivers/scsi/aha1740.c
+drivers/scsi/aic7xxx/aic79xx_osm.c
+drivers/scsi/aic7xxx/aic79xx_osm.h
+drivers/scsi/aic7xxx/aic7xxx_osm.c
+drivers/scsi/aic7xxx/aic7xxx_osm.h
+drivers/scsi/aic7xxx/aiclib.c
+drivers/scsi/aic7xxx_old.c
+drivers/scsi/AM53C974.c
+drivers/scsi/amiga7xx.c
+drivers/scsi/arm/acornscsi.c
+drivers/scsi/arm/arxescsi.c
+drivers/scsi/arm/cumana_1.c
+drivers/scsi/arm/cumana_2.c
+drivers/scsi/arm/ecoscsi.c
+drivers/scsi/arm/eesox.c
+drivers/scsi/arm/fas216.c
+drivers/scsi/arm/oak.c
+drivers/scsi/arm/powertec.c
+drivers/scsi/arm/queue.c
+drivers/scsi/atari_scsi.c
+drivers/scsi/atp870u.c
+drivers/scsi/blz1230.c
+drivers/scsi/blz2060.c
+drivers/scsi/BusLogic.c
+drivers/scsi/bvme6000.c
+drivers/scsi/constants.c
+drivers/scsi/cpqfcTScontrol.c
+drivers/scsi/cpqfcTSinit.c
+drivers/scsi/cpqfcTSworker.c
+drivers/scsi/cyberstorm.c
+drivers/scsi/cyberstormII.c
+drivers/scsi/dc395x.c
+drivers/scsi/dec_esp.c
+drivers/scsi/dmx3191d.c
+drivers/scsi/dpt_i2o.c
+drivers/scsi/dtc.c
+drivers/scsi/eata.c
+drivers/scsi/eata_pio.c
+drivers/scsi/esp.c
+drivers/scsi/fastlane.c
+drivers/scsi/fcal.c
+drivers/scsi/fd_mcs.c
+drivers/scsi/fdomain.c
+drivers/scsi/gdth.c
+drivers/scsi/g_NCR5380.c
+drivers/scsi/gvp11.c
+drivers/scsi/hosts.c
+drivers/scsi/i91uscsi.c
+drivers/scsi/ibmmca.c
+drivers/scsi/ide-scsi.c
+drivers/scsi/imm.c
+drivers/scsi/imm.h
+drivers/scsi/in2000.c
+drivers/scsi/ini9100u.c
+drivers/scsi/inia100.c
+drivers/scsi/ips.c
+drivers/scsi/ips.h
+drivers/scsi/isp/asm_1000.h
+drivers/scsi/isp/asm_1040.h
+drivers/scsi/isp/asm_1080.h
+drivers/scsi/isp/asm_12160.h
+drivers/scsi/isp/asm_2100.h
+drivers/scsi/isp/asm_2200.h
+drivers/scsi/isp/asm_2300.h
+drivers/scsi/isp/isp.c
+drivers/scsi/isp/isp_cb_ops.c
+drivers/scsi/isp/isp_inline.h
+drivers/scsi/isp/isp_ioctl.h
+drivers/scsi/isp/isp_linux.c
+drivers/scsi/isp/isp_linux.h
+drivers/scsi/isp/ispmbox.h
+drivers/scsi/isp/isp_pci.c
+drivers/scsi/isp/ispreg.h
+drivers/scsi/isp/isp_target.c
+drivers/scsi/isp/isp_target.h
+drivers/scsi/isp/isp_tpublic.h
+drivers/scsi/isp/ispvar.h
+drivers/scsi/isp/Makefile
+drivers/scsi/jazz_esp.c
+drivers/scsi/Kconfig
+drivers/scsi/lasi700.c
+drivers/scsi/mac53c94.c
+drivers/scsi/mac_esp.c
+drivers/scsi/mac_scsi.c
+drivers/scsi/Makefile
+drivers/scsi/mca_53c9x.c
+drivers/scsi/megaraid.c
+drivers/scsi/mesh.c
+drivers/scsi/mvme147.c
+drivers/scsi/mvme16x.c
+drivers/scsi/NCR53c406a.c
+drivers/scsi/ncr53c8xx.c
+drivers/scsi/NCR53C9x.c
+drivers/scsi/NCR_D700.c
+drivers/scsi/NCR_Q720.c
+drivers/scsi/nsp32.c
+drivers/scsi/oktagon_esp.c
+drivers/scsi/osst.c
+drivers/scsi/pas16.c
+drivers/scsi/pc980155.c
+drivers/scsi/pci2000.c
+drivers/scsi/pci2220i.c
+drivers/scsi/pcmcia/aha152x_stub.c
+drivers/scsi/pcmcia/fdomain_stub.c
+drivers/scsi/pcmcia/nsp_cs.c
+drivers/scsi/pcmcia/qlogic_stub.c
+drivers/scsi/pluto.c
+drivers/scsi/ppa.c
+drivers/scsi/ppa.h
+drivers/scsi/psi240i.c
+drivers/scsi/qla1280.c
+drivers/scsi/qlogicfas.c
+drivers/scsi/qlogicfc.c
+drivers/scsi/qlogicisp.c
+drivers/scsi/qlogicpti.c
+drivers/scsi/scsicam.c
+drivers/scsi/scsi_debug.c
+drivers/scsi/scsi.h
+drivers/scsi/scsi_ioctl.c
+drivers/scsi/scsi_lib.c
+drivers/scsi/scsi_module.c
+drivers/scsi/scsi_pc98.c
+drivers/scsi/scsi_priv.h
+drivers/scsi/scsi_proc.c
+drivers/scsi/scsi_scan.c
+drivers/scsi/scsi_syms.c
+drivers/scsi/scsi_sysfs.c
+drivers/scsi/sd.c
+drivers/scsi/seagate.c
+drivers/scsi/sg.c
+drivers/scsi/sgiwd93.c
+drivers/scsi/sim710.c
+drivers/scsi/sr.c
+drivers/scsi/sr_ioctl.c
+drivers/scsi/sr_vendor.c
+drivers/scsi/st.c
+drivers/scsi/sun3_scsi.c
+drivers/scsi/sun3_scsi_vme.c
+drivers/scsi/sun3x_esp.c
+drivers/scsi/sym53c416.c
+drivers/scsi/sym53c8xx_2/sym_glue.c
+drivers/scsi/sym53c8xx_2/sym_glue.h
+drivers/scsi/sym53c8xx_2/sym_hipd.c
+drivers/scsi/sym53c8xx.c
+drivers/scsi/t128.c
+drivers/scsi/tmscsim.c
+drivers/scsi/u14-34f.c
+drivers/scsi/ultrastor.c
+drivers/scsi/wd33c93.c
+drivers/scsi/wd7000.c
+drivers/scsi/zalon.c
+drivers/serial/8250.c
+drivers/serial/core.c
+drivers/serial/Kconfig
+drivers/serial/Makefile
+drivers/serial/nb85e_uart.c
+drivers/serial/sunsu.c
+drivers/serial/sunzilog.c
+drivers/serial/v850e_uart.c
+drivers/telephony/ixj.c
+drivers/telephony/Kconfig
+drivers/usb/class/bluetty.c
+drivers/usb/class/cdc-acm.c
+drivers/usb/class/usblp.c
+drivers/usb/core/file.c
+drivers/usb/core/hcd.c
+drivers/usb/core/hcd-pci.c
+drivers/usb/core/usb.c
+drivers/usb/gadget/ether.c
+drivers/usb/gadget/net2280.c
+drivers/usb/gadget/net2280.h
+drivers/usb/gadget/zero.c
+drivers/usb/host/ohci-hcd.c
+drivers/usb/host/ohci-q.c
+drivers/usb/host/uhci-hcd.c
+drivers/usb/image/hpusbscsi.c
+drivers/usb/image/microtek.c
+drivers/usb/image/scanner.c
+drivers/usb/image/scanner.h
+drivers/usb/media/dabusb.c
+drivers/usb/media/vicam.c
+drivers/usb/misc/usblcd.c
+drivers/usb/misc/usbtest.c
+drivers/usb/net/ax8817x.c
+drivers/usb/net/catc.c
+drivers/usb/net/kaweth.c
+drivers/usb/net/pegasus.c
+drivers/usb/net/rtl8150.c
+drivers/usb/net/usbnet.c
+drivers/usb/serial/ftdi_sio.c
+drivers/usb/serial/ftdi_sio.h
+drivers/usb/serial/ipaq.c
+drivers/usb/serial/ipaq.h
+drivers/usb/serial/usb-serial.c
+drivers/usb/serial/visor.c
+drivers/usb/storage/debug.h
+drivers/usb/storage/isd200.c
+drivers/usb/storage/jumpshot.c
+drivers/usb/storage/protocol.c
+drivers/usb/storage/protocol.h
+drivers/usb/storage/scsiglue.c
+drivers/usb/storage/scsiglue.h
+drivers/usb/storage/sddr09.c
+drivers/usb/storage/sddr55.c
+drivers/usb/storage/transport.h
+drivers/usb/storage/unusual_devs.h
+drivers/usb/storage/usb.c
+drivers/usb/storage/usb.h
+drivers/usb/usb-skeleton.c
+drivers/video/cfbimgblt.c
+drivers/video/chipsfb.c
+drivers/video/console/fbcon.c
+drivers/video/controlfb.c
+drivers/video/epson1355fb.c
+drivers/video/fbmem.c
+drivers/video/g364fb.c
+drivers/video/i2c.c
+drivers/video/i2c.h
+drivers/video/Kconfig
+drivers/video/logo/logo.c
+drivers/video/macfb.c
+drivers/video/Makefile
+drivers/video/neofb.c
+drivers/video/platinumfb.c
+drivers/video/pvr2fb.c
+drivers/video/sis/300vtbl.h
+drivers/video/sis/310vtbl.h
+drivers/video/sis/init301.c
+drivers/video/sis/init301.h
+drivers/video/sis/init.c
+drivers/video/sis/initdef.h
+drivers/video/sis/init.h
+drivers/video/sis/oem300.h
+drivers/video/sis/oem310.h
+drivers/video/sis/osdef.h
+drivers/video/sis/sis_accel.c
+drivers/video/sis/sis_accel.h
+drivers/video/sis/sis_main.c
+drivers/video/sis/sis_main.h
+drivers/video/sis/vgatypes.h
+drivers/video/sis/vstruct.h
+drivers/video/skeletonfb.c
+drivers/video/softcursor.c
+drivers/video/valkyriefb.c
+drivers/video/vesafb.c
+fs/aio.c
+fs/binfmt_elf.c
+fs/bio.c
+fs/buffer.c
+fs/cifs/CHANGES
+fs/cifs/cifsfs.c
+fs/cifs/cifsglob.h
+fs/cifs/connect.c
+fs/cifs/misc.c
+fs/cifs/TODO
+fs/cifs/transport.c
+fs/compat_ioctl.c
+fs/devfs/base.c
+fs/exec.c
+fs/ext2/inode.c
+fs/ext3/acl.c
+fs/ext3/balloc.c
+fs/ext3/inode.c
+fs/ext3/super.c
+fs/ext3/xattr.c
+fs/inode.c
+fs/intermezzo/sysctl.c
+fs/intermezzo/vfs.c
+fs/jbd/journal.c
+fs/jbd/transaction.c
+fs/jffs2/Makefile
+fs/Kconfig
+fs/lockd/clntlock.c
+fs/lockd/svc.c
+fs/namei.c
+fs/namespace.c
+fs/nfs/direct.c
+fs/nfsd/nfssvc.c
+fs/nfs/inode.c
+fs/nfs/nfs3proc.c
+fs/nfs/nfs3xdr.c
+fs/nfs/nfs4proc.c
+fs/nfs/pagelist.c
+fs/nfs/proc.c
+fs/nfs/read.c
+fs/nfs/write.c
+fs/partitions/check.c
+fs/partitions/efi.h
+fs/partitions/nec98.c
+fs/proc/array.c
+fs/proc/proc_misc.c
+fs/stat.c
+fs/umsdos/ioctl.c
+fs/vfat/namei.c
+include/acpi/acconfig.h
+include/acpi/platform/acenv.h
+include/asm-alpha/lockmeter.h
+include/asm-alpha/pgalloc.h
+include/asm-alpha/pgtable.h
+include/asm-alpha/posix_types.h
+include/asm-alpha/smp.h
+include/asm-alpha/spinlock.h
+include/asm-arm26/pgalloc.h
+include/asm-arm26/pgtable.h
+include/asm-arm26/posix_types.h
+include/asm-arm/pgalloc.h
+include/asm-arm/pgtable.h
+include/asm-arm/posix_types.h
+include/asm-cris/pgalloc.h
+include/asm-cris/pgtable.h
+include/asm-cris/posix_types.h
+include/asm-generic/cpumask_array.h
+include/asm-generic/cpumask_const_reference.h
+include/asm-generic/cpumask_const_value.h
+include/asm-generic/cpumask_up.h
+include/asm-generic/local.h
+include/asm-generic/percpu.h
+include/asm-generic/sections.h
+include/asm-h8300/pgtable.h
+include/asm-h8300/posix_types.h
+include/asm-i386/atomic.h
+include/asm-i386/bitops.h
+include/asm-i386/bugs.h
+include/asm-i386/genapic.h
+include/asm-i386/highmem.h
+include/asm-i386/hw_irq.h
+include/asm-i386/kgdb.h
+include/asm-i386/kgdb_local.h
+include/asm-i386/kmap_types.h
+include/asm-i386/local.h
+include/asm-i386/lockmeter.h
+include/asm-i386/mach-bigsmp/mach_apic.h
+include/asm-i386/mach-bigsmp/mach_ipi.h
+include/asm-i386/mach-default/mach_apic.h
+include/asm-i386/mach-default/mach_ipi.h
+include/asm-i386/mach-es7000/mach_apic.h
+include/asm-i386/mach-es7000/mach_ipi.h
+include/asm-i386/mach-numaq/mach_apic.h
+include/asm-i386/mach-numaq/mach_ipi.h
+include/asm-i386/mach-summit/mach_apic.h
+include/asm-i386/mach-summit/mach_ipi.h
+include/asm-i386/mach-visws/mach_apic.h
+include/asm-i386/mmu_context.h
+include/asm-i386/mpspec.h
+include/asm-i386/numaq.h
+include/asm-i386/pgalloc.h
+include/asm-i386/pgtable-2level.h
+include/asm-i386/pgtable-3level.h
+include/asm-i386/pgtable.h
+include/asm-i386/posix_types.h
+include/asm-i386/rwlock.h
+include/asm-i386/smp.h
+include/asm-i386/spinlock.h
+include/asm-i386/stat.h
+include/asm-i386/thread_info.h
+include/asm-i386/topology.h
+include/asm-i386/unistd.h
+include/asm-ia64/atomic.h
+include/asm-ia64/bitops.h
+include/asm-ia64/elf.h
+include/asm-ia64/local.h
+include/asm-ia64/lockmeter.h
+include/asm-ia64/mmu_context.h
+include/asm-ia64/percpu.h
+include/asm-ia64/pgalloc.h
+include/asm-ia64/pgtable.h
+include/asm-ia64/posix_types.h
+include/asm-ia64/processor.h
+include/asm-ia64/smp.h
+include/asm-ia64/spinlock.h
+include/asm-ia64/system.h
+include/asm-ia64/tlb.h
+include/asm-m68k/motorola_pgalloc.h
+include/asm-m68k/motorola_pgtable.h
+include/asm-m68knommu/pgtable.h
+include/asm-m68k/posix_types.h
+include/asm-m68k/sun3_pgalloc.h
+include/asm-mips64/lockmeter.h
+include/asm-mips64/pgalloc.h
+include/asm-mips64/pgtable.h
+include/asm-mips64/posix_types.h
+include/asm-mips64/smp.h
+include/asm-mips/lockmeter.h
+include/asm-mips/pgalloc.h
+include/asm-mips/pgtable.h
+include/asm-mips/posix_types.h
+include/asm-mips/smp.h
+include/asm-mips/spinlock.h
+include/asm-parisc/pgalloc.h
+include/asm-parisc/pgtable.h
+include/asm-parisc/posix_types.h
+include/asm-parisc/smp.h
+include/asm-ppc64/mmu_context.h
+include/asm-ppc64/pgalloc.h
+include/asm-ppc64/pgtable.h
+include/asm-ppc64/semaphore.h
+include/asm-ppc64/smp.h
+include/asm-ppc64/tlb.h
+include/asm-ppc/hardirq.h
+include/asm-ppc/ipc.h
+include/asm-ppc/pci.h
+include/asm-ppc/pgalloc.h
+include/asm-ppc/pgtable.h
+include/asm-ppc/posix_types.h
+include/asm-ppc/processor.h
+include/asm-ppc/smp.h
+include/asm-ppc/uaccess.h
+include/asm-ppc/unistd.h
+include/asm-s390/bitops.h
+include/asm-s390/dma.h
+include/asm-s390/dma-mapping.h
+include/asm-s390/irq.h
+include/asm-s390/mmu_context.h
+include/asm-s390/pgalloc.h
+include/asm-s390/pgtable.h
+include/asm-s390/posix_types.h
+include/asm-s390/siginfo.h
+include/asm-s390/smp.h
+include/asm-s390/tlbflush.h
+include/asm-sh/pgalloc.h
+include/asm-sh/pgtable-2level.h
+include/asm-sh/posix_types.h
+include/asm-sparc64/atomic.h
+include/asm-sparc64/bitops.h
+include/asm-sparc64/local.h
+include/asm-sparc64/lockmeter.h
+include/asm-sparc64/mmu_context.h
+include/asm-sparc64/pgalloc.h
+include/asm-sparc64/pgtable.h
+include/asm-sparc64/posix_types.h
+include/asm-sparc64/sections.h
+include/asm-sparc64/smp.h
+include/asm-sparc64/spinlock.h
+include/asm-sparc/pgalloc.h
+include/asm-sparc/pgtable.h
+include/asm-sparc/posix_types.h
+include/asm-sparc/smp.h
+include/asm-um/pgalloc.h
+include/asm-um/pgtable.h
+include/asm-um/smp.h
+include/asm-v850/anna.h
+include/asm-v850/as85ep1.h
+include/asm-v850/asm.h
+include/asm-v850/cacheflush.h
+include/asm-v850/entry.h
+include/asm-v850/fpga85e2c.h
+include/asm-v850/highres_timer.h
+include/asm-v850/ma1.h
+include/asm-v850/machdep.h
+include/asm-v850/ma.h
+include/asm-v850/me2.h
+include/asm-v850/nb85e_cache.h
+include/asm-v850/nb85e.h
+include/asm-v850/nb85e_intc.h
+include/asm-v850/nb85e_timer_c.h
+include/asm-v850/nb85e_timer_d.h
+include/asm-v850/nb85e_uart.h
+include/asm-v850/nb85e_utils.h
+include/asm-v850/pgtable.h
+include/asm-v850/posix_types.h
+include/asm-v850/processor.h
+include/asm-v850/ptrace.h
+include/asm-v850/rte_cb.h
+include/asm-v850/rte_ma1_cb.h
+include/asm-v850/rte_me2_cb.h
+include/asm-v850/rte_nb85e_cb.h
+include/asm-v850/serial.h
+include/asm-v850/sim85e2c.h
+include/asm-v850/sim85e2.h
+include/asm-v850/sim85e2s.h
+include/asm-v850/stat.h
+include/asm-v850/system.h
+include/asm-v850/teg.h
+include/asm-v850/v850e2_cache.h
+include/asm-v850/v850e2.h
+include/asm-v850/v850e_cache.h
+include/asm-v850/v850e.h
+include/asm-v850/v850e_intc.h
+include/asm-v850/v850e_timer_c.h
+include/asm-v850/v850e_timer_d.h
+include/asm-v850/v850e_uarta.h
+include/asm-v850/v850e_uartb.h
+include/asm-v850/v850e_uart.h
+include/asm-v850/v850e_utils.h
+include/asm-x86_64/bitops.h
+include/asm-x86_64/mpspec.h
+include/asm-x86_64/pgalloc.h
+include/asm-x86_64/pgtable.h
+include/asm-x86_64/posix_types.h
+include/asm-x86_64/smp.h
+include/asm-x86_64/topology.h
+include/linux/aio.h
+include/linux/atmdev.h
+include/linux/bitmap.h
+include/linux/blkdev.h
+include/linux/blk.h
+include/linux/buffer_head.h
+include/linux/compiler.h
+include/linux/config.h
+include/linux/cpumask.h
+include/linux/dm-ioctl.h
+include/linux/dm-ioctl-v1.h
+include/linux/dm-ioctl-v4.h
+include/linux/elevator.h
+include/linux/elfcore.h
+include/linux/errno.h
+include/linux/ext3_fs.h
+include/linux/ext3_jbd.h
+include/linux/fb.h
+include/linux/fs.h
+include/linux/hfs_sysdep.h
+include/linux/ide.h
+include/linux/init_task.h
+include/linux/irq.h
+include/linux/kdev_t.h
+include/linux/kernel_stat.h
+include/linux/linux_logo.h
+include/linux/list.h
+include/linux/lockmeter.h
+include/linux/loop.h
+include/linux/mm.h
+include/linux/module.h
+include/linux/namespace.h
+include/linux/netdevice.h
+include/linux/nfs_fs.h
+include/linux/nfs_fs_sb.h
+include/linux/nfs_mount.h
+include/linux/nfs_page.h
+include/linux/nfs_xdr.h
+include/linux/node.h
+include/linux/pagemap.h
+include/linux/pci.h
+include/linux/raid/md_k.h
+include/linux/rcupdate.h
+include/linux/root_dev.h
+include/linux/sched.h
+include/linux/serial_core.h
+include/linux/smp.h
+include/linux/spinlock.h
+include/linux/times.h
+include/linux/topology.h
+include/linux/tty.h
+include/linux/usb.h
+include/linux/wait.h
+include/linux/writeback.h
+include/media/saa7146.h
+include/media/saa7146_vv.h
+include/net/ip_vs.h
+include/pcmcia/ss.h
+include/scsi/scsi_device.h
+include/scsi/scsi_host.h
+include/scsi/scsi_request.h
+include/video/epson1355.h
+include/video/neomagic.h
+include/video/sisfb.h
+init/do_mounts.h
+init/do_mounts_initrd.c
+init/do_mounts_rd.c
+init/main.c
+kernel/compat.c
+kernel/extable.c
+kernel/fork.c
+kernel/ksyms.c
+kernel/lockmeter.c
+kernel/Makefile
+kernel/module.c
+kernel/printk.c
+kernel/profile.c
+kernel/rcupdate.c
+kernel/sched.c
+kernel/softirq.c
+kernel/suspend.c
+kernel/sys.c
+kernel/time.c
+kernel/timer.c
+kernel/workqueue.c
+MAINTAINERS
+Makefile
+mm/bootmem.c
+mm/filemap.c
+mm/fremap.c
+mm/memory.c
+mm/mprotect.c
+mm/mremap.c
+mm/msync.c
+mm/page-writeback.c
+mm/slab.c
+mm/swapfile.c
+mm/swap_state.c
+mm/vmalloc.c
+mm/vmscan.c
+net/atm/br2684.c
+net/atm/clip.c
+net/atm/common.c
+net/atm/common.h
+net/atm/lec.c
+net/atm/mpc.c
+net/atm/pppoatm.c
+net/atm/proc.c
+net/atm/pvc.c
+net/atm/raw.c
+net/atm/signaling.c
+net/atm/signaling.h
+net/atm/svc.c
+net/core/dev.c
+net/ipv4/ip_gre.c
+net/ipv4/ipip.c
+net/ipv4/ipvs/ip_vs_conn.c
+net/ipv4/ipvs/ip_vs_ctl.c
+net/ipv4/ipvs/ip_vs_xmit.c
+net/ipv4/ipvs/Kconfig
+net/ipv4/tcp_input.c
+net/ipv6/addrconf.c
+net/ipv6/ah6.c
+net/ipv6/esp6.c
+net/ipv6/route.c
+net/ipv6/sit.c
+net/ipv6/tcp_ipv6.c
+net/ipv6/xfrm6_input.c
+net/ipv6/xfrm6_policy.c
+net/ipv6/xfrm6_state.c
+net/netsyms.c
+net/sunrpc/auth_gss/auth_gss.c
+net/sunrpc/clnt.c
+net/sunrpc/xprt.c
+net/wanrouter/wanmain.c
+net/xfrm/xfrm_policy.c
+net/xfrm/xfrm_state.c
+net/xfrm/xfrm_user.c
+scripts/ver_linux
+security/Kconfig
+security/Makefile
+security/selinux/avc.c
+security/selinux/hooks.c
+security/selinux/include/avc.h
+security/selinux/include/avc_ss.h
+security/selinux/include/av_inherit.h
+security/selinux/include/av_permissions.h
+security/selinux/include/av_perm_to_string.h
+security/selinux/include/class_to_string.h
+security/selinux/include/common_perm_to_string.h
+security/selinux/include/flask.h
+security/selinux/include/initial_sid_to_string.h
+security/selinux/include/objsec.h
+security/selinux/include/security.h
+security/selinux/Kconfig
+security/selinux/Makefile
+security/selinux/selinuxfs.c
+security/selinux/ss/avtab.c
+security/selinux/ss/avtab.h
+security/selinux/ss/constraint.h
+security/selinux/ss/context.h
+security/selinux/ss/ebitmap.c
+security/selinux/ss/ebitmap.h
+security/selinux/ss/global.h
+security/selinux/ss/hashtab.c
+security/selinux/ss/hashtab.h
+security/selinux/ss/Makefile
+security/selinux/ss/mls.c
+security/selinux/ss/mls.h
+security/selinux/ss/mls_types.h
+security/selinux/ss/policydb.c
+security/selinux/ss/policydb.h
+security/selinux/ss/services.c
+security/selinux/ss/services.h
+security/selinux/ss/sidtab.c
+security/selinux/ss/sidtab.h
+security/selinux/ss/symtab.c
+security/selinux/ss/symtab.h
+sound/core/timer.c
+sound/isa/cmi8330.c
+sound/isa/es18xx.c
+sound/oss/ac97_plugin_ad1980.c
+sound/oss/ad1816.c
+sound/oss/ad1889.c
+sound/oss/btaudio.c
+sound/oss/dmasound/dmasound_core.c
+sound/oss/emu10k1/8010.h
+sound/oss/emu10k1/audio.c
+sound/oss/emu10k1/cardmi.c
+sound/oss/emu10k1/cardmo.c
+sound/oss/emu10k1/cardwo.c
+sound/oss/emu10k1/efxmgr.c
+sound/oss/emu10k1/efxmgr.h
+sound/oss/emu10k1/hwaccess.c
+sound/oss/emu10k1/hwaccess.h
+sound/oss/emu10k1/irqmgr.h
+sound/oss/emu10k1/main.c
+sound/oss/emu10k1/midi.h
+sound/oss/emu10k1/mixer.c
+sound/oss/emu10k1/passthrough.c
+sound/oss/emu10k1/passthrough.h
+sound/oss/emu10k1/recmgr.c
+sound/oss/emu10k1/voicemgr.c
+sound/oss/emu10k1/voicemgr.h
+sound/oss/hal2.c
+sound/oss/hal2.h
+sound/oss/harmony.c
+sound/oss/kahlua.c
+sound/oss/Kconfig
+sound/oss/Makefile
+sound/pci/ice1712/ak4xxx.c
+sound/pci/intel8x0.c
+usr/Makefile
diff --git a/lustre/kernel_patches/pc/kexec-2.6.0-full.pc b/lustre/kernel_patches/pc/kexec-2.6.0-full.pc
new file mode 100644 (file)
index 0000000..939f3d4
--- /dev/null
@@ -0,0 +1,23 @@
+MAINTAINERS
+arch/i386/Kconfig
+arch/i386/defconfig
+arch/i386/kernel/Makefile
+arch/i386/kernel/apic.c
+arch/i386/kernel/dmi_scan.c
+arch/i386/kernel/entry.S
+arch/i386/kernel/i8259.c
+arch/i386/kernel/io_apic.c
+arch/i386/kernel/machine_kexec.c
+arch/i386/kernel/reboot.c
+arch/i386/kernel/relocate_kernel.S
+arch/i386/kernel/smp.c
+fs/aio.c
+include/asm-i386/apic.h
+include/asm-i386/apicdef.h
+include/asm-i386/kexec.h
+include/asm-i386/unistd.h
+include/linux/kexec.h
+include/linux/reboot.h
+kernel/Makefile
+kernel/kexec.c
+kernel/sys.c
diff --git a/lustre/kernel_patches/pc/lkcd-kernel-changes-2.6.0-test1.pc b/lustre/kernel_patches/pc/lkcd-kernel-changes-2.6.0-test1.pc
new file mode 100644 (file)
index 0000000..722bb20
--- /dev/null
@@ -0,0 +1,25 @@
+drivers/Makefile
+include/linux/major.h
+include/linux/sysctl.h
+include/asm-i386/mach-default/irq_vectors.h
+include/asm-i386/kmap_types.h
+include/asm-i386/smp.h
+arch/i386/kernel/i386_ksyms.c
+arch/i386/kernel/nmi.c
+arch/i386/kernel/setup.c
+arch/i386/kernel/smp.c
+arch/i386/kernel/traps.c
+arch/i386/mm/init.c
+arch/i386/boot/Makefile
+arch/i386/Kconfig
+arch/s390/boot/Makefile
+arch/s390/boot/install.sh
+scripts/mkcompile_h
+kernel/ksyms.c
+kernel/panic.c
+kernel/sched.c
+lib/Kconfig
+mm/page_alloc.c
+init/Makefile
+init/main.c
+init/version.c
diff --git a/lustre/kernel_patches/pc/vfs_intent_2.6.0-test1.pc b/lustre/kernel_patches/pc/vfs_intent_2.6.0-test1.pc
new file mode 100644 (file)
index 0000000..24a4603
--- /dev/null
@@ -0,0 +1,14 @@
+fs/sysfs/inode.c
+fs/dcache.c
+fs/exec.c
+fs/xattr.c
+fs/namei.c
+fs/namespace.c
+fs/open.c
+fs/stat.c
+include/linux/dcache.h
+include/linux/fs.h
+include/linux/namei.h
+kernel/ksyms.c
+net/unix/af_unix.c
+net/sunrpc/rpc_pipe.c
diff --git a/lustre/kernel_patches/series/kgdb_2.6.0_test1 b/lustre/kernel_patches/series/kgdb_2.6.0_test1
new file mode 100644 (file)
index 0000000..dbafd56
--- /dev/null
@@ -0,0 +1,15 @@
+2.6.0-test1-mm2.patch
+lkcd-cvs-2.5.69.patch
+lkcd-kernel-changes-2.6.0-test1.patch
+kexec-2.6.0-full.patch
+dump_netdev.patch
+lustre_build.patch
+lustre_version.patch
+vfs_intent_2.6.0-test1.patch
+vfs_nointent_2.5.69_rev1.patch
+vfs_races_2.5.72_rev1.patch
+vfs_mntcwd_2.5.72_rev1.patch
+ext3-san-jdike-2.5.73.patch
+iopen-2.5.73.patch
+export-truncate-2.5.63.patch
+qla2xxx-v8.00.00b1-2.5.73.patch